diff options
author | Andrew Pinski <pinskia@physics.uc.edu> | 2004-10-17 17:16:27 +0000 |
---|---|---|
committer | Andrew Pinski <pinskia@gcc.gnu.org> | 2004-10-17 10:16:27 -0700 |
commit | a2a877e2dccad1546217de219a750d9aab228036 (patch) | |
tree | 47983b969b359dc5bcf2833cd081e8cc52562e06 /gcc | |
parent | 974ede64c7e132be9878cce6f9e269feb319e7f8 (diff) | |
download | gcc-a2a877e2dccad1546217de219a750d9aab228036.zip gcc-a2a877e2dccad1546217de219a750d9aab228036.tar.gz gcc-a2a877e2dccad1546217de219a750d9aab228036.tar.bz2 |
c-typeck.c (default_function_array_conversion): Always create &a[0] for array types.
2004-10-17 Andrew Pinski <pinskia@physics.uc.edu>
* c-typeck.c (default_function_array_conversion): Always create
&a[0] for array types.
(build_unary_op): Do not fold &a[x] into a + x.
From-SVN: r89173
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c-typeck.c | 19 |
2 files changed, 9 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 91e9731..1b9cf8b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-10-17 Andrew Pinski <pinskia@physics.uc.edu> + + * c-typeck.c (default_function_array_conversion): Always create + &a[0] for array types. + (build_unary_op): Do not fold &a[x] into a + x. + 2004-10-17 Jakub Jelinek <jakub@redhat.com> * pointer-set.c (hash1): Use integer part of 2^64 / phi diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 9e4f0fb..87f585b 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -1263,21 +1263,9 @@ default_function_array_conversion (tree exp) ptrtype = build_pointer_type (restype); - if (TREE_CODE (exp) == VAR_DECL) - { - /* We are making an ADDR_EXPR of ptrtype. This is a valid - ADDR_EXPR because it's the best way of representing what - happens in C when we take the address of an array and place - it in a pointer to the element type. */ - adr = build1 (ADDR_EXPR, ptrtype, exp); - if (!c_mark_addressable (exp)) - return error_mark_node; - TREE_SIDE_EFFECTS (adr) = 0; /* Default would be, same as EXP. */ - return adr; - } /* This way is better for a COMPONENT_REF since it can simplify the offset for a component. */ - adr = build_unary_op (ADDR_EXPR, exp, 1); + adr = build_unary_op (ADDR_EXPR, build_array_ref (exp, integer_zero_node), 1); return convert (ptrtype, adr); } return exp; @@ -2631,13 +2619,12 @@ build_unary_op (enum tree_code code, tree xarg, int flag) return TREE_OPERAND (arg, 0); } - /* For &x[y], return x+y */ + /* For &x[y], just return &x[y] */ if (TREE_CODE (arg) == ARRAY_REF) { if (!c_mark_addressable (TREE_OPERAND (arg, 0))) return error_mark_node; - return build_binary_op (PLUS_EXPR, TREE_OPERAND (arg, 0), - TREE_OPERAND (arg, 1), 1); + return build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (arg)), arg); } /* Anything not already handled and not a true memory reference |