diff mbox series

Fix PR lto/84805

Message ID 4113462.IWbXHliYRW@polaris
State New
Headers show
Series Fix PR lto/84805 | expand

Commit Message

Eric Botcazou March 12, 2018, 11:06 p.m. UTC
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  <ebotcazou@adacore.com>

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

Comments

Richard Biener March 13, 2018, 9:14 a.m. UTC | #1
On Tue, Mar 13, 2018 at 12:06 AM, Eric Botcazou <ebotcazou@adacore.com> wrote:
> 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?

Ok.

Richard.

>
> 2018-03-12  Eric Botcazou  <ebotcazou@adacore.com>
>
>         PR lto/84805
>         * ipa-devirt.c (odr_subtypes_equivalent_p): Do not get the ODR type of
>         incomplete types.
>
> --
> Eric Botcazou
diff mbox series

Patch

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;