diff options
Diffstat (limited to 'gcc/c-common.c')
-rw-r--r-- | gcc/c-common.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/gcc/c-common.c b/gcc/c-common.c index 9af892a1bef..e2e57c58113 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -788,16 +788,22 @@ decl_attributes (node, attributes, prefix_attributes) error ("requested alignment is too large"); else if (is_type) { - if (decl) + /* If we have a TYPE_DECL, then copy the type, so that we + don't accidentally modify a builtin type. See pushdecl. */ + if (decl && TREE_TYPE (decl) != error_mark_node + && DECL_ORIGINAL_TYPE (decl) == NULL_TREE) { - DECL_ALIGN (decl) = (1 << i) * BITS_PER_UNIT; - DECL_USER_ALIGN (decl) = 1; - } - else - { - TYPE_ALIGN (type) = (1 << i) * BITS_PER_UNIT; - TYPE_USER_ALIGN (type) = 1; + tree tt = TREE_TYPE (decl); + DECL_ORIGINAL_TYPE (decl) = tt; + tt = build_type_copy (tt); + TYPE_NAME (tt) = decl; + TREE_USED (tt) = TREE_USED (decl); + TREE_TYPE (decl) = tt; + type = tt; } + + TYPE_ALIGN (type) = (1 << i) * BITS_PER_UNIT; + TYPE_USER_ALIGN (type) = 1; } else if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FIELD_DECL) |