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?
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
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;
}