diff mbox series

[C] Reset TYPE_TRANSPARENT_AGGR on all type variants when not supported

Message ID alpine.LSU.2.20.1902051414100.23386@zhemvz.fhfr.qr
State New
Headers show
Series [C] Reset TYPE_TRANSPARENT_AGGR on all type variants when not supported | expand

Commit Message

Richard Biener Feb. 5, 2019, 1:15 p.m. UTC
The following fixes an ICE in the type verifier for transparent_union
marked unions that we refuse to handle such.  
(gcc.dg/transparent-union-6.c)

Bootstrap & regtest running on x86_64-unknown-linux-gnu, OK?

Thanks,
Richard.

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.

Comments

Jakub Jelinek Feb. 5, 2019, 1:23 p.m. UTC | #1
On Tue, Feb 05, 2019 at 02:15:30PM +0100, Richard Biener wrote:
> 
> The following fixes an ICE in the type verifier for transparent_union
> marked unions that we refuse to handle such.  
> (gcc.dg/transparent-union-6.c)
> 
> Bootstrap & regtest running on x86_64-unknown-linux-gnu, OK?
> 
> Thanks,
> Richard.
> 
> 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.

Ok, thanks.

	Jakub
diff mbox series

Patch

Index: gcc/c/c-decl.c
===================================================================
--- gcc/c/c-decl.c	(revision 268530)
+++ gcc/c/c-decl.c	(working copy)
@@ -8394,6 +8394,16 @@  finish_struct (location_t loc, tree t, t
       }
   }
 
+  /* 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, t
     {
       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))