[Bug c++/69317] New: [6 regression] wrong ABI version in -Wabi warnings

msebor at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Sat Jan 16 18:58:00 GMT 2016


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69317

            Bug ID: 69317
           Summary: [6 regression] wrong ABI version in -Wabi warnings
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

While adding an ABI warning in the patch for bug 69277 I noticed that the text
of the -Wabi diagnostics issued by GCC 6.0 has changed from that of 5.1.0 in an
unexpected way.  While 5.1.0 prints the versions of the ABI before and after
the the change, 6.0 seems to print the same version for both, sometimes zero,
sometimes not.  This doesn't seem correct so I'm marking this a regression.

The "both zero" example can be seen in the GCC output on the
g++.dg/abi/mangle3.C test shown below where 6.0 prints:

    warning: the mangled name of ‘...’ changes between -fabi-version=0 (...)
and -fabi-version=0 (...) [-Wabi]

$ (f=/home/msebor/scm/fsf/gcc-svn/gcc/testsuite/g++.dg/abi/mangle3.C; set -x &&
cat $f && ~/bin/gcc-5.1.0/bin/g++ -S -Wall -Wabi -fabi-version=2 $f &&
/home/msebor/build/gcc-trunk-svn/gcc/xg++
-B/home/msebor/build/gcc-trunk-svn/gcc -S -Wall -Wabi -fabi-version=2 $f)
+ cat /home/msebor/scm/fsf/gcc-svn/gcc/testsuite/g++.dg/abi/mangle3.C
// Test mangling of type casts
// { dg-options "-fabi-version=2 -Wabi" }
// { dg-do compile }

template<int i> class A {};
template<bool b> class B {};

template<int i> void f(A<i> &, B<bool(i)> &) {}
template<int i> void g(A<i> &, B<static_cast<bool>(i)> &) {} // { dg-warning
"mangle" }

int main()
{
  A<1> a;
  B<true> b;
  f(a, b);
  g(a, b);
}

// { dg-final { scan-assembler "\n_?_Z1fILi1EEvR1AIXT_EER1BIXcvbT_EE\[: \t\n\]"
} }
// { dg-final { scan-assembler "\n_?_Z1gILi1EEvR1AIXT_EER1BIXcvbT_EE\[: \t\n\]"
} }
+ /home/msebor/bin/gcc-5.1.0/bin/g++ -S -Wall -Wabi -fabi-version=2
/home/msebor/scm/fsf/gcc-svn/gcc/testsuite/g++.dg/abi/mangle3.C
/home/msebor/scm/fsf/gcc-svn/gcc/testsuite/g++.dg/abi/mangle3.C:9:22: warning:
the mangled name of ‘void g(A<i>&, B<static_cast<bool>(i)>&) [with int i = 1]’
changes between -fabi-version=2 (_Z1gILi1EEvR1AIXT_EER1BIXcvbT_EE) and
-fabi-version=0 (_Z1gILi1EEvR1AIXT_EER1BIXscbT_EE) [-Wabi]
 template<int i> void g(A<i> &, B<static_cast<bool>(i)> &) {} // { dg-warning
"mangle" }
                      ^
+ /home/msebor/build/gcc-trunk-svn/gcc/xg++
-B/home/msebor/build/gcc-trunk-svn/gcc -S -Wall -Wabi -fabi-version=2
/home/msebor/scm/fsf/gcc-svn/gcc/testsuite/g++.dg/abi/mangle3.C
/home/msebor/scm/fsf/gcc-svn/gcc/testsuite/g++.dg/abi/mangle3.C:9:22: warning:
the mangled name of ‘void g(A<i>&, B<static_cast<bool>(i)>&) [with int i = 1]’
changes between -fabi-version=0 (_Z1gILi1EEvR1AIXT_EER1BIXcvbT_EE) and
-fabi-version=0 (_Z1gILi1EEvR1AIXT_EER1BIXscbT_EE) [-Wabi]
 template<int i> void g(A<i> &, B<static_cast<bool>(i)> &) {} // { dg-warning
"mangle" }
                      ^

An example where the warning is similarly incorrect but where the ABI version
is non-zero is the following where 6.0 prints:

    warning: the mangled name of ‘...’ changed between -fabi-version=4 (...)
and -fabi-version=4 (...) [-Wabi]

$ (f=/home/msebor/scm/fsf/gcc-svn/gcc/testsuite/g++.dg/abi/mangle45.C; set -x
&& cat $f && ~/bin/gcc-5.1.0/bin/g++ -S -Wall -Wabi=4 -fabi-version=5
-std=c++11 $f && /home/msebor/build/gcc-trunk-svn/gcc/xg++
-B/home/msebor/build/gcc-trunk-svn/gcc -S -Wall -Wabi=4 -fabi-version=5
-std=c++11 $f)
+ cat /home/msebor/scm/fsf/gcc-svn/gcc/testsuite/g++.dg/abi/mangle45.C
// Testcase for mangling of parameters used other than in a trailing return
type
// { dg-do compile { target c++11 } }
// { dg-options "-fabi-version=5 -Wabi=4" }

template<class T> void f(T p, decltype(p)) { }       // L = 1 { dg-warning
"mangle" }
template<class T> void g(T p, decltype(p) (*)()) { } // L = 1 { dg-warning
"mangle" }
// G++ incorrectly rejects these currently.
// template<class T> void h(T p, auto (*)()->decltype(p));    // L = 1
// template<class T> void i(T p, auto (*)(T q)->decltype(q)); // L = 0
// template<class T> void j(T p, auto (*)(decltype(p))->T);   // L = 2
template<class T> void k(T p, int (*(*)(T* p))[sizeof(p)]) {} // L = 1 {
dg-warning "mangle" }

int garg();
int (*karg (int*))[sizeof(int)];
int main()
{
  // { dg-final { scan-assembler  "\n_?_Z1fIiEvT_DtfL0p_E\[: \t\n\]" } }
  f (1,0);
  // { dg-final { scan-assembler  "\n_?_Z1gIiEvT_PFDtfL0p_EvE\[: \t\n\]" } }
  g (1,garg);
  // h (1,0);
  // i (1,0);
  // j (1,0);
  // { dg-final { scan-assembler  "\n_?_Z1kIiEvT_PFPAszfL0p__iPS0_E\[: \t\n\]"
} }
  k (1,karg);
}
+ /home/msebor/bin/gcc-5.1.0/bin/g++ -S -Wall -Wabi=4 -fabi-version=5
-std=c++11 /home/msebor/scm/fsf/gcc-svn/gcc/testsuite/g++.dg/abi/mangle45.C
/home/msebor/scm/fsf/gcc-svn/gcc/testsuite/g++.dg/abi/mangle45.C:11:24:
warning: the mangled name of ‘void k(T, int (* (*)(T*))[sizeof (p)]) [with T =
int’ changed between -fabi-version=4 (_Z1kIiEvT_PFPAszfp__iPS0_E) and
-fabi-version=5 (_Z1kIiEvT_PFPAszfL0p__iPS0_E) [-Wabi]
 template<class T> void k(T p, int (*(*)(T* p))[sizeof(p)]) {} // L = 1 {
dg-warning "mangle" }
                        ^
/home/msebor/scm/fsf/gcc-svn/gcc/testsuite/g++.dg/abi/mangle45.C:6:24: warning:
the mangled name of ‘void g(T, decltype (p) (*)()) [with T = int; decltype (p)
= int]’ changed between -fabi-version=4 (_Z1gIiEvT_PFS0_vE) and -fabi-version=5
(_Z1gIiEvT_PFDtfL0p_EvE) [-Wabi]
 template<class T> void g(T p, decltype(p) (*)()) { } // L = 1 { dg-warning
"mangle" }
                        ^
/home/msebor/scm/fsf/gcc-svn/gcc/testsuite/g++.dg/abi/mangle45.C:5:24: warning:
the mangled name of ‘void f(T, decltype (p)) [with T = int; decltype (p) =
int]’ changed between -fabi-version=4 (_Z1fIiEvT_S0_) and -fabi-version=5
(_Z1fIiEvT_DtfL0p_E) [-Wabi]
 template<class T> void f(T p, decltype(p)) { }      // L = 1 { dg-warning
"mangle" }
                        ^
+ /home/msebor/build/gcc-trunk-svn/gcc/xg++
-B/home/msebor/build/gcc-trunk-svn/gcc -S -Wall -Wabi=4 -fabi-version=5
-std=c++11 /home/msebor/scm/fsf/gcc-svn/gcc/testsuite/g++.dg/abi/mangle45.C
/home/msebor/scm/fsf/gcc-svn/gcc/testsuite/g++.dg/abi/mangle45.C:11:24:
warning: the mangled name of ‘void k(T, int (* (*)(T*))[sizeof (p)]) [with T =
int’ changed between -fabi-version=4 (_Z1kIiEvT_PFPAszfp__iPS0_E) and
-fabi-version=4 (_Z1kIiEvT_PFPAszfL0p__iPS0_E) [-Wabi]
 template<class T> void k(T p, int (*(*)(T* p))[sizeof(p)]) {} // L = 1 {
dg-warning "mangle" }
                        ^

/home/msebor/scm/fsf/gcc-svn/gcc/testsuite/g++.dg/abi/mangle45.C:6:24: warning:
the mangled name of ‘void g(T, decltype (p) (*)()) [with T = int]’ changed
between -fabi-version=4 (_Z1gIiEvT_PFS0_vE) and -fabi-version=4
(_Z1gIiEvT_PFDtfL0p_EvE) [-Wabi]
 template<class T> void g(T p, decltype(p) (*)()) { } // L = 1 { dg-warning
"mangle" }
                        ^

/home/msebor/scm/fsf/gcc-svn/gcc/testsuite/g++.dg/abi/mangle45.C:5:24: warning:
the mangled name of ‘void f(T, decltype (p)) [with T = int]’ changed between
-fabi-version=4 (_Z1fIiEvT_S0_) and -fabi-version=4 (_Z1fIiEvT_DtfL0p_E)
[-Wabi]
 template<class T> void f(T p, decltype(p)) { }      // L = 1 { dg-warning
"mangle" }
                        ^


More information about the Gcc-bugs mailing list