diff options
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/c-common.c | 22 |
2 files changed, 19 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2b15780..40f8f0b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2000-08-24 Jim Wilson <wilson@cygnus.com> + + * c-common.c (decl_attributes, case A_ALIGN): Revert last change. + Copy type in a TYPE_DECL, just like pushdecl does. + 2000-08-24 Richard Henderson <rth@cygnus.com> * toplev.c (main): Enable flag_reorder_blocks at -O2. diff --git a/gcc/c-common.c b/gcc/c-common.c index 9af892a..e2e57c5 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) |