re PR tree-optimization/88606 (ICE: verify_type failed (error: type variant differs...
authorRichard Biener <rguenther@suse.de>
Tue, 5 Feb 2019 14:57:32 +0000 (14:57 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 5 Feb 2019 14:57:32 +0000 (14:57 +0000)
2019-02-05  Richard Biener  <rguenther@suse.de>

PR c/88606
* c-decl.c (finish_struct): Reset TYPE_TRANSPARENT_AGGR on
all type variants when not supported.

From-SVN: r268540

gcc/c/ChangeLog
gcc/c/c-decl.c

index b215758c86c08be6626e2727b134ecfb6bd160f6..1450d65601d7704f88df0aa3f81c40419b84a8dd 100644 (file)
@@ -1,3 +1,9 @@
+2019-02-05  Richard Biener  <rguenther@suse.de>
+
+       PR c/88606
+       * c-decl.c (finish_struct): Reset TYPE_TRANSPARENT_AGGR on
+       all type variants when not supported.
+
 2019-01-30  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/89061
index 5170e92b0ca283796d75fff36191c161a9457a9f..65aee4d3e0493449e00ef4818ef4b950d2f7959d 100644 (file)
@@ -8394,6 +8394,16 @@ finish_struct (location_t loc, tree t, tree fieldlist, tree attributes,
       }
   }
 
+  /* If this was supposed to be a transparent union, but we can't
+     make it one, warn and turn off the flag.  */
+  if (TREE_CODE (t) == UNION_TYPE
+      && TYPE_TRANSPARENT_AGGR (t)
+      && (!TYPE_FIELDS (t) || TYPE_MODE (t) != DECL_MODE (TYPE_FIELDS (t))))
+    {
+      TYPE_TRANSPARENT_AGGR (t) = 0;
+      warning_at (loc, 0, "union cannot be made transparent");
+    }
+
   /* Note: C_TYPE_INCOMPLETE_VARS overloads TYPE_VFIELD which is used
      in dwarf2out via rest_of_decl_compilation below and means
      something totally different.  Since we will be clearing
@@ -8406,22 +8416,13 @@ finish_struct (location_t loc, tree t, tree fieldlist, tree attributes,
     {
       TYPE_FIELDS (x) = TYPE_FIELDS (t);
       TYPE_LANG_SPECIFIC (x) = TYPE_LANG_SPECIFIC (t);
+      TYPE_TRANSPARENT_AGGR (x) = TYPE_TRANSPARENT_AGGR (t);
       C_TYPE_FIELDS_READONLY (x) = C_TYPE_FIELDS_READONLY (t);
       C_TYPE_FIELDS_VOLATILE (x) = C_TYPE_FIELDS_VOLATILE (t);
       C_TYPE_VARIABLE_SIZE (x) = C_TYPE_VARIABLE_SIZE (t);
       C_TYPE_INCOMPLETE_VARS (x) = NULL_TREE;
     }
 
-  /* If this was supposed to be a transparent union, but we can't
-     make it one, warn and turn off the flag.  */
-  if (TREE_CODE (t) == UNION_TYPE
-      && TYPE_TRANSPARENT_AGGR (t)
-      && (!TYPE_FIELDS (t) || TYPE_MODE (t) != DECL_MODE (TYPE_FIELDS (t))))
-    {
-      TYPE_TRANSPARENT_AGGR (t) = 0;
-      warning_at (loc, 0, "union cannot be made transparent");
-    }
-
   /* Update type location to the one of the definition, instead of e.g.
      a forward declaration.  */
   if (TYPE_STUB_DECL (t))