On Fri, Mar 2, 2018 at 9:49 AM, Eric Botcazou <ebotca...@adacore.com> wrote:
> Hi,
> this PR reports the failure of g++.dg/lto/pr83121 on multiple platforms.
> There are 2 differents issues and this message is about the missing warning on
> Aarch64 and SPARC.  On these platforms the LTO compiler issues:
> /home/ebotcazou/src/gcc/testsuite/g++.dg/lto/pr83121_0.C:6:8: warning: type
> 'struct Environment' violates the C++ One Definition Rule [-Wodr]
> /home/ebotcazou/src/gcc/testsuite/g++.dg/lto/pr83121_1.C:1:8: note: a type
> with different size is defined in another translation unit
> instead of the expected more verbose warning, as for example on x86.  The
> discrepancy between x86 and Aarch64/SPARC comes from:
>   /* For ODR types be sure to compare their names.
>      To support -wno-odr-type-merging we allow one type to be non-ODR
>      and other ODR even though it is a violation.  */
>   if (types_odr_comparable (t1, t2, true))
>     {
>       if (!types_same_for_odr (t1, t2, true))
>         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)
>         return true;
>     }
> The call to get_odr_type (t1, true) is supposed to yield the warning, but this
> depends on the order in which types t1 and t2 have been inserted in the table.
> In other words, get_odr_type (t1, true) works on x86 while on Aarch64/SPARC
> get_odr_type (t2, true) works instead.  Hence the propose fix.
> Tested on x86-64/Linux and SPARC64/Linux, OK for the mainline?

Ok with a comment explaining why we call both even though
types_same_for_odr holds true.


> 2018-03-02  Eric Botcazou  <ebotca...@adacore.com>
>         PR ipa/83983
>         * ipa-devirt.c (odr_subtypes_equivalent_p): Get the ODR type of both
>         arguments if they are comparable.
> --
> Eric Botcazou

Reply via email to