aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2018-11-07 13:25:35 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2018-11-07 12:25:35 +0000
commit6fe2da9fafe878a361e2d23821d590fd53ef99bd (patch)
treee41f801007654b326ab01c7be0297cea99e0033b /gcc/tree.c
parentf70b5dbfa111f03dd31a3e3bd2e3d01eecdc06c3 (diff)
downloadgcc-6fe2da9fafe878a361e2d23821d590fd53ef99bd.zip
gcc-6fe2da9fafe878a361e2d23821d590fd53ef99bd.tar.gz
gcc-6fe2da9fafe878a361e2d23821d590fd53ef99bd.tar.bz2
tree.c (fld_type_variant_equal_p): Skip TYPE_ALIGN check when building incomplete variant of complete type.
* tree.c (fld_type_variant_equal_p): Skip TYPE_ALIGN check when building incomplete variant of complete type. (fld_type_variant): Do not copy TYPE_ALIGN when building incomplete variant of complete type. From-SVN: r265872
Diffstat (limited to 'gcc/tree.c')
-rw-r--r--gcc/tree.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/gcc/tree.c b/gcc/tree.c
index 1436086..b1f4ecf 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -5106,12 +5106,15 @@ static bool
fld_type_variant_equal_p (tree t, tree v)
{
if (TYPE_QUALS (t) != TYPE_QUALS (v)
- || TYPE_ALIGN (t) != TYPE_ALIGN (v)
+ /* We want to match incomplete variants with complete types.
+ In this case we need to ignore alignment. */
+ || ((!RECORD_OR_UNION_TYPE_P (t) || COMPLETE_TYPE_P (v))
+ && TYPE_ALIGN (t) != TYPE_ALIGN (v))
|| fld_simplified_type_name (t) != fld_simplified_type_name (v)
|| !attribute_list_equal (TYPE_ATTRIBUTES (t),
TYPE_ATTRIBUTES (v)))
return false;
-
+
return true;
}
@@ -5134,7 +5137,10 @@ fld_type_variant (tree first, tree t, struct free_lang_data_d *fld)
TYPE_NAME (v) = TYPE_NAME (t);
TYPE_ATTRIBUTES (v) = TYPE_ATTRIBUTES (t);
TYPE_CANONICAL (v) = TYPE_CANONICAL (t);
- SET_TYPE_ALIGN (v, TYPE_ALIGN (t));
+ /* Variants of incomplete types should have alignment
+ set to BITS_PER_UNIT. Do not copy the actual alignment. */
+ if (!RECORD_OR_UNION_TYPE_P (v) || COMPLETE_TYPE_P (v))
+ SET_TYPE_ALIGN (v, TYPE_ALIGN (t));
gcc_checking_assert (fld_type_variant_equal_p (t,v));
add_tree_to_fld_list (v, fld);
return v;