summaryrefslogtreecommitdiff
path: root/gcc/c-common.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/c-common.c')
-rw-r--r--gcc/c-common.c22
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)