[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