https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83983
amker at gcc dot gnu.org changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |amker at gcc dot gnu.org
--- Comment #8 from amker at gcc dot gnu.org ---
(In reply to Eric Botcazou from comment #6)
> > In other words, get_odr_type (t1, true) works on x86 and get_odr_type (t2,
> > true) works on ARM/SPARC, so maybe something like:
> >
> > Index: ipa-devirt.c
> > ===================================================================
> > --- ipa-devirt.c (revision 258068)
> > +++ ipa-devirt.c (working copy)
> > @@ -686,7 +686,10 @@ odr_subtypes_equivalent_p (tree t1, tree t2,
> > return false;
> > /* Limit recursion: If subtypes are ODR types and we know
> > that they are same, be happy. */
> > - if (!odr_type_p (t1) || !get_odr_type (t1, true)->odr_violated)
> > + if (!odr_type_p (t1)
> > + || !odr_type_p (t2)
> > + || (!get_odr_type (t1, true)->odr_violated
> > + && !get_odr_type (t2, true)->odr_violated))
> > return true;
> > }
> >
> > is the proper thing to do.
>
> This brings the missing warnings on SPARC (and presumably Aarch64 too) but
> gives the same order of warnings as on the HP-PA, so the test still formally
> fails.
>
> In other words, the test is not sufficiently robust as currently written.
Yes, now on AArch64, we have:
/.../build/src/gcc/gcc/testsuite/g++.dg/lto/pr83121_0.C:7:10: warning: type
'struct AsyncHooks' violates the C++ One Definition Rule [-Wodr]^M
/.../build/src/gcc/gcc/testsuite/g++.dg/lto/pr83121_1.C:2:10: note: a different
type is defined in another translation unit^M
/.../build/src/gcc/gcc/testsuite/g++.dg/lto/pr83121_0.C:8:21: note: the first
difference of corresponding definitions is field 'providers_'^M
/.../build/src/gcc/gcc/testsuite/g++.dg/lto/pr83121_1.C:3:21: note: a field of
same name but different type is defined in another translation unit^M
/.../build/src/gcc/gcc/testsuite/g++.dg/lto/pr83121_0.C:7:10: note: array types
have different bounds^M
/.../build/src/gcc/gcc/testsuite/g++.dg/lto/pr83121_0.C:6:8: warning: type
'struct Environment' violates the C++ One Definition Rule [-Wodr]^M
/.../build/src/gcc/gcc/testsuite/g++.dg/lto/pr83121_1.C:1:8: note: a different
type is defined in another translation unit^M
/.../build/src/gcc/gcc/testsuite/g++.dg/lto/pr83121_0.C:10:14: note: the first
difference of corresponding definitions is field 'async_hooks_'^M
/.../build/src/gcc/gcc/testsuite/g++.dg/lto/pr83121_1.C:5:14: note: a field of
same name but different type is defined in another translation unit^M
/.../build/src/gcc/gcc/testsuite/g++.dg/lto/pr83121_0.C:7:10: note: type
'struct AsyncHooks' itself violates the C++ One Definition Rule^M
/.../build/src/gcc/gcc/testsuite/g++.dg/lto/pr83121_1.C:2:10: note: the
incompatible type is defined here^M
FAIL: g++.dg/lto/pr83121 (test for LTO warnings, pr83121_0.C line 8)
FAIL: g++.dg/lto/pr83121 (test for LTO warnings, pr83121_1.C line 2)
FAIL: g++.dg/lto/pr83121 (test for LTO warnings, pr83121_1.C line 3)
FAIL: g++.dg/lto/pr83121 cp_lto_pr83121_0.o-cp_lto_pr83121_1.o link, -O0 -flto