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" } ^