diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-08-30 18:49:20 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-08-30 18:49:20 +0000 |
commit | 7da1265c4b739e985de5264663fcf2078ee7c582 (patch) | |
tree | b64b1c02953ecd652d493aee5e592cde95eaf88b /gcc/c-typeck.c | |
parent | a99b42ba10b068fb53518b3bc8ed3c7c4c47eb4a (diff) | |
download | ppe42-gcc-7da1265c4b739e985de5264663fcf2078ee7c582.tar.gz ppe42-gcc-7da1265c4b739e985de5264663fcf2078ee7c582.zip |
* c-typeck.c (build_unary_op): Don't expand ADDR_EXPR of a
COMPONENT_REF to pointer arithmetic.
* varasm.c (initializer_constant_valid_p): Allow "&(*c).f", for
constant "c" as a valid constant initializer. Allow narrowing of
differences against the same base object, for any base object.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@86794 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/c-typeck.c')
-rw-r--r-- | gcc/c-typeck.c | 44 |
1 files changed, 12 insertions, 32 deletions
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index aa04ac0d24a..6e7bbfe7ef7 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -2514,44 +2514,24 @@ build_unary_op (enum tree_code code, tree xarg, int flag) TREE_READONLY (arg), TREE_THIS_VOLATILE (arg)); - argtype = build_pointer_type (argtype); - if (!c_mark_addressable (arg)) return error_mark_node; - { - tree addr; - - if (TREE_CODE (arg) == COMPONENT_REF) - { - tree field = TREE_OPERAND (arg, 1); - - addr = build_unary_op (ADDR_EXPR, TREE_OPERAND (arg, 0), flag); - - if (DECL_C_BIT_FIELD (field)) - { - error ("attempt to take address of bit-field structure member `%s'", - IDENTIFIER_POINTER (DECL_NAME (field))); - return error_mark_node; - } + if (TREE_CODE (arg) == COMPONENT_REF + && DECL_C_BIT_FIELD (TREE_OPERAND (arg, 1))) + { + error ("attempt to take address of bit-field structure member `%D'", + TREE_OPERAND (arg, 1)); + return error_mark_node; + } - addr = fold (build2 (PLUS_EXPR, argtype, - convert (argtype, addr), - convert (argtype, byte_position (field)))); - - /* If the folded PLUS_EXPR is not a constant address, wrap - it in an ADDR_EXPR. */ - if (!TREE_CONSTANT (addr)) - addr = build1 (ADDR_EXPR, argtype, arg); - } - else - addr = build1 (ADDR_EXPR, argtype, arg); + argtype = build_pointer_type (argtype); + val = build1 (ADDR_EXPR, argtype, arg); - if (TREE_CODE (arg) == COMPOUND_LITERAL_EXPR) - TREE_INVARIANT (addr) = TREE_CONSTANT (addr) = 1; + if (TREE_CODE (arg) == COMPOUND_LITERAL_EXPR) + TREE_INVARIANT (val) = TREE_CONSTANT (val) = 1; - return addr; - } + return val; default: break; |