re PR ipa/87957 (ICE tree check: expected tree that contains ‘decl minimal’ structure...
authorJan Hubicka <hubicka@ucw.cz>
Sat, 17 Nov 2018 11:35:01 +0000 (12:35 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sat, 17 Nov 2018 11:35:01 +0000 (11:35 +0000)
PR ipa/87957
* ipa-devirt.c (warn_odr): Look for main variant to get TYPE_DECL.

From-SVN: r266235

gcc/ChangeLog
gcc/ipa-devirt.c

index 2fed746854239549d2a92b95185d00b1a7313fa8..a6097fde67c29099fd0fa16567fdd9974f7f8bf5 100644 (file)
@@ -1,3 +1,8 @@
+2018-11-16  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR ipa/87957
+       * ipa-devirt.c (warn_odr): Look for main variant to get TYPE_DECL.
+
 2018-11-16  Sandra Loosemore  <sandra@codesourcery.com>
 
        * doc/invoke.texi (Option Summary): Fix whitespace and line
index 4676bdbdf93806a30cb28472fe050df312a5373d..db8d34c4027403246793e790f9de1b91d0893d25 100644 (file)
@@ -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, tree st2,
     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