Hi,

this is an ICE in LTO mode on code violating the ODR rule: get_odr_type checks 
that there is a sensible internal order between base, type and derived types 
but this can be easily messed up by incomplete types.  Hence the attached 
fixlet (no testcase because the -Wodr warnings have a totally random order).

Tested on x86-64/Linux, OK for the mainline?


2018-03-12  Eric Botcazou  <ebotca...@adacore.com>

        PR lto/84805
        * ipa-devirt.c (odr_subtypes_equivalent_p): Do not get the ODR type of
        incomplete types.

-- 
Eric Botcazou
Index: ipa-devirt.c
===================================================================
--- ipa-devirt.c	(revision 258411)
+++ ipa-devirt.c	(working copy)
@@ -656,7 +656,7 @@ set_type_binfo (tree type, tree binfo)
       gcc_assert (!TYPE_BINFO (type));
 }
 
-/* Compare T2 and T2 based on name or structure.  */
+/* Compare T1 and T2 based on name or structure.  */
 
 static bool
 odr_subtypes_equivalent_p (tree t1, tree t2,
@@ -678,7 +678,7 @@ odr_subtypes_equivalent_p (tree t1, tree
     return false;
 
   /* For ODR types be sure to compare their names.
-     To support -wno-odr-type-merging we allow one type to be non-ODR
+     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))
     {
@@ -690,6 +690,8 @@ odr_subtypes_equivalent_p (tree t1, tree
 	 therefore which call will report the ODR violation, if any.  */
 	 if (!odr_type_p (t1)
 	     || !odr_type_p (t2)
+	     || !COMPLETE_TYPE_P (t1)
+	     || !COMPLETE_TYPE_P (t2)
 	     || (!get_odr_type (t1, true)->odr_violated
 		 && !get_odr_type (t2, true)->odr_violated))
         return true;

Reply via email to