summaryrefslogtreecommitdiffstats
path: root/gcc/c-typeck.c
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2004-08-30 18:49:20 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2004-08-30 18:49:20 +0000
commit7da1265c4b739e985de5264663fcf2078ee7c582 (patch)
treeb64b1c02953ecd652d493aee5e592cde95eaf88b /gcc/c-typeck.c
parenta99b42ba10b068fb53518b3bc8ed3c7c4c47eb4a (diff)
downloadppe42-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.c44
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;
OpenPOWER on IntegriCloud