Hi,
this patch fixes ICE with the testcase in PR 87957 which is caused by
type variants now having only IDENTIFIER_NODE as TYPE_NAME.

I did not add the testcase yet becasue bit more fixing is needed.  The
code outputs incorrectly warning about subtype (it misses there is ODR
violation in it and sort of accidently only warns about alignment).
This is because processing types depends on the order they are added
into the odr table and we no longer do that in streaming order that goes
by SCCs.  I need to add recursion to look into subtypes first before
trying to output info about the type itself.

Bootstrapped/regtested x86_64-linux, comitted.

Honza

        PR ipa/87957
        * ipa-devirt.c (warn_odr): Look for main variant to get TYPE_DECL.
Index: ipa-devirt.c
===================================================================
--- ipa-devirt.c        (revision 266100)
+++ ipa-devirt.c        (working copy)
@@ -1000,11 +1000,11 @@ static void
 warn_odr (tree t1, tree t2, tree st1, tree st2,
          bool warn, bool *warned, const char *reason)
 {
-  tree decl2 = TYPE_NAME (t2);
+  tree decl2 = TYPE_NAME (TYPE_MAIN_VARIANT (t2));
   if (warned)
     *warned = false;
 
-  if (!warn || !TYPE_NAME(t1))
+  if (!warn || !TYPE_NAME(TYPE_MAIN_VARIANT (t1)))
     return;
 
   /* ODR warnings are output druing LTO streaming; we must apply location
@@ -1013,10 +1013,22 @@ warn_odr (tree t1, tree t2, tree st1, tr
     lto_location_cache::current_cache->apply_location_cache ();
 
   auto_diagnostic_group d;
-  if (!warning_at (DECL_SOURCE_LOCATION (TYPE_NAME (t1)), OPT_Wodr,
-                  "type %qT violates the C++ One Definition Rule",
-                  t1))
-    return;
+  if (t1 != TYPE_MAIN_VARIANT (t1)
+      && TYPE_NAME (t1) != DECL_NAME (TYPE_MAIN_VARIANT (t1)))
+    {
+      if (!warning_at (DECL_SOURCE_LOCATION (TYPE_NAME (TYPE_MAIN_VARIANT 
(t1))),
+                      OPT_Wodr, "type %qT (typedef of %qT) violates the "
+                      "C++ One Definition Rule",
+                      t1, TYPE_MAIN_VARIANT (t1)))
+       return;
+    }
+  else
+    {
+      if (!warning_at (DECL_SOURCE_LOCATION (TYPE_NAME (TYPE_MAIN_VARIANT 
(t1))),
+                      OPT_Wodr, "type %qT violates the C++ One Definition 
Rule",
+                      t1))
+       return;
+    }
   if (!st1 && !st2)
     ;
   /* For FIELD_DECL support also case where one of fields is

Reply via email to