Commit f461f938 by Richard Biener Committed by Richard Biener

re PR tree-optimization/88606 (ICE: verify_type failed (error: type variant…

re PR tree-optimization/88606 (ICE: verify_type failed (error: type variant differs by TYPE_TRANSPARENT_AGGR))

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
parent 39bc6f87
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> 2019-01-30 Jakub Jelinek <jakub@redhat.com>
PR c/89061 PR c/89061
......
...@@ -8394,6 +8394,16 @@ finish_struct (location_t loc, tree t, tree fieldlist, tree attributes, ...@@ -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 /* Note: C_TYPE_INCOMPLETE_VARS overloads TYPE_VFIELD which is used
in dwarf2out via rest_of_decl_compilation below and means in dwarf2out via rest_of_decl_compilation below and means
something totally different. Since we will be clearing something totally different. Since we will be clearing
...@@ -8406,22 +8416,13 @@ finish_struct (location_t loc, tree t, tree fieldlist, tree attributes, ...@@ -8406,22 +8416,13 @@ finish_struct (location_t loc, tree t, tree fieldlist, tree attributes,
{ {
TYPE_FIELDS (x) = TYPE_FIELDS (t); TYPE_FIELDS (x) = TYPE_FIELDS (t);
TYPE_LANG_SPECIFIC (x) = TYPE_LANG_SPECIFIC (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_READONLY (x) = C_TYPE_FIELDS_READONLY (t);
C_TYPE_FIELDS_VOLATILE (x) = C_TYPE_FIELDS_VOLATILE (t); C_TYPE_FIELDS_VOLATILE (x) = C_TYPE_FIELDS_VOLATILE (t);
C_TYPE_VARIABLE_SIZE (x) = C_TYPE_VARIABLE_SIZE (t); C_TYPE_VARIABLE_SIZE (x) = C_TYPE_VARIABLE_SIZE (t);
C_TYPE_INCOMPLETE_VARS (x) = NULL_TREE; 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. /* Update type location to the one of the definition, instead of e.g.
a forward declaration. */ a forward declaration. */
if (TYPE_STUB_DECL (t)) if (TYPE_STUB_DECL (t))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment