From f461f9385df6e1b0b538d4afc7739c2ab1e207d0 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 5 Feb 2019 14:57:32 +0000 Subject: [PATCH] re PR tree-optimization/88606 (ICE: verify_type failed (error: type variant differs by TYPE_TRANSPARENT_AGGR)) 2019-02-05 Richard Biener 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 | 6 ++++++ gcc/c/c-decl.c | 21 +++++++++++---------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index b215758c86c..1450d65601d 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,9 @@ +2019-02-05 Richard Biener + + PR c/88606 + * c-decl.c (finish_struct): Reset TYPE_TRANSPARENT_AGGR on + all type variants when not supported. + 2019-01-30 Jakub Jelinek PR c/89061 diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index 5170e92b0ca..65aee4d3e04 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -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)) -- 2.30.2