While adding an ABI warning in the patch for bug 69277 I noticed that the ABI version printed by GCC 6.0 in some -Wabi diagnostics is incorrect: while 5.1.0 prints the versions of the ABI given by the -Wabi=X and -fabi-version=Y options (i.e., it mentions both X and Y), 6.0 prints the same version twice (just Y).
The attached patch fixes this and adds tests to verify that the referenced versions are as expected (it uses ABIs 2 and 3 but tests exercising the other ABI changes should be added as well). Martin
gcc/cp/ChangeLog: 2016-01-16 Martin Sebor <mse...@redhat.com> PR c++/69317 * mangle.c (mangle_decl): Reference the correct (saved) version of the ABI in -Wabi diagnostics. gcc/testsuite/ChangeLog: 2016-01-16 Martin Sebor <mse...@redhat.com> PR c++/69317 * g++.dg/abi/Wabi-2-2.C: New test. * g++.dg/abi/Wabi-2-3.C: New test. * g++.dg/abi/Wabi-3-2.C: New test. * g++.dg/abi/Wabi-3-3.C: New test. Index: gcc/cp/mangle.c =================================================================== --- gcc/cp/mangle.c (revision 232296) +++ gcc/cp/mangle.c (working copy) @@ -3657,13 +3669,13 @@ mangle_decl (const tree decl) warning_at (DECL_SOURCE_LOCATION (G.entity), OPT_Wabi, "the mangled name of %qD changed between " "-fabi-version=%d (%D) and -fabi-version=%d (%D)", - G.entity, warn_abi_version, id2, - flag_abi_version, id); + G.entity, save_ver, id2, + warn_abi_version, id); else warning_at (DECL_SOURCE_LOCATION (G.entity), OPT_Wabi, "the mangled name of %qD changes between " "-fabi-version=%d (%D) and -fabi-version=%d (%D)", - G.entity, flag_abi_version, id, + G.entity, save_ver, id, warn_abi_version, id2); } Index: gcc/testsuite/g++.dg/abi/Wabi-2-2.C =================================================================== --- gcc/testsuite/g++.dg/abi/Wabi-2-2.C (revision 0) +++ gcc/testsuite/g++.dg/abi/Wabi-2-2.C (working copy) @@ -0,0 +1,14 @@ +// Verify that no diagnostic is issued when the version specified +// via -Wabi= matches the version specified by -fabi-version=. + +// { dg-options "-Werror -Wabi=2 -fabi-version=2" } +// { dg-do compile } + +// The mangling of templates with a non-type template parameter +// of reference type changed in ABI version 3: +extern int N; +template <int &> struct S { }; + +// Expect no diagnostic. +void foo (S<N>) { } + Index: gcc/testsuite/g++.dg/abi/Wabi-2-3.C =================================================================== --- gcc/testsuite/g++.dg/abi/Wabi-2-3.C (revision 0) +++ gcc/testsuite/g++.dg/abi/Wabi-2-3.C (working copy) @@ -0,0 +1,16 @@ +// PR c++/69317 - [6 regression] wrong ABI version in -Wabi warnings +// Exercise that the correct ABI versions are referenced in the -Wabi +// diagnostic. See also the equivalent Wabi-3-2.C test. + +// { dg-options "-Wabi=2 -fabi-version=3" } +// { dg-do compile } + +// The mangling of templates with a non-type template parameter +// of reference type changed in ABI version 3: +extern int N; +template <int &> struct S { }; + +// Expect the diagnostic to reference the ABI version specified via +// -fabi-version=3 and the ABI version specified via -Wabi=2. +void foo (S<N>) { } // { dg-warning "the mangled name of .void foo\\(S<N>\\). changed between -fabi-version=3 \\(_Z3foo1SILZ1NEE\\) and -fabi-version=2 \\(_Z3foo1SIL_Z1NEE\\)" } + Index: gcc/testsuite/g++.dg/abi/Wabi-3-2.C =================================================================== --- gcc/testsuite/g++.dg/abi/Wabi-3-2.C (revision 0) +++ gcc/testsuite/g++.dg/abi/Wabi-3-2.C (working copy) @@ -0,0 +1,16 @@ +// PR c++/69317 - [6 regression] wrong ABI version in -Wabi warnings +// Exercise that the correct ABI versions are referenced in the -Wabi +// diagnostic. See also the equivalent Wabi-2-3.C test. + +// { dg-options "-Wabi=3 -fabi-version=2" } +// { dg-do compile } + +// The mangling of templates with a non-type template parameter +// of reference type changed in ABI version 3: +extern int N; +template <int &> struct S { }; + +// Expect the diagnostic to reference the ABI version specified via +// -fabi-version=2 and the ABI version specified via -Wabi=3. +void foo (S<N>) { } // { dg-warning "the mangled name of .void foo\\(S<N>\\). changed between -fabi-version=2 \\(_Z3foo1SIL_Z1NEE\\) and -fabi-version=3 \\(_Z3foo1SILZ1NEE\\)" } + Index: gcc/testsuite/g++.dg/abi/Wabi-3-3.C =================================================================== --- gcc/testsuite/g++.dg/abi/Wabi-3-3.C (revision 0) +++ gcc/testsuite/g++.dg/abi/Wabi-3-3.C (working copy) @@ -0,0 +1,14 @@ +// Verify that no diagnostic is issued when the version specified +// via -Wabi= matches the version specified by -fabi-version=. + +// { dg-options "-Werror -Wabi=3 -fabi-version=3" } +// { dg-do compile } + +// The mangling of templates with a non-type template parameter +// of reference type changed in ABI version 3: +extern int N; +template <int &> struct S { }; + +// Expect no diagnostic. +void foo (S<N>) { } +