aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Pinski <pinskia@physics.uc.edu>2004-10-17 22:01:19 +0000
committerAndrew Pinski <pinskia@gcc.gnu.org>2004-10-17 15:01:19 -0700
commit7c672dfc01a1838168baf1a63d2ca0e303eb421c (patch)
tree5a372b260eab2bfd26de9d6e6aafa95c6719584e
parentac8245fadcd28769e9bc2b7153da1512a37035a4 (diff)
downloadgcc-7c672dfc01a1838168baf1a63d2ca0e303eb421c.zip
gcc-7c672dfc01a1838168baf1a63d2ca0e303eb421c.tar.gz
gcc-7c672dfc01a1838168baf1a63d2ca0e303eb421c.tar.bz2
revert: c-typeck.c (default_function_array_conversion): Always create &a[0] for array types.
2004-10-17 Andrew Pinski <pinskia@physics.uc.edu> Revert: 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: r89183
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/c-typeck.c19
2 files changed, 25 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9bbb498..f2d34c6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,14 @@
2004-10-17 Andrew Pinski <pinskia@physics.uc.edu>
+ Revert:
+ 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 Andrew Pinski <pinskia@physics.uc.edu>
+
PR middle-end/17925
* cfgexpand.c (expand_gimple_cond_expr): Emit line notes for next basic
block if there is a goto with a locus.
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c
index 87f585b..9e4f0fb 100644
--- a/gcc/c-typeck.c
+++ b/gcc/c-typeck.c
@@ -1263,9 +1263,21 @@ 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, build_array_ref (exp, integer_zero_node), 1);
+ adr = build_unary_op (ADDR_EXPR, exp, 1);
return convert (ptrtype, adr);
}
return exp;
@@ -2619,12 +2631,13 @@ build_unary_op (enum tree_code code, tree xarg, int flag)
return TREE_OPERAND (arg, 0);
}
- /* For &x[y], just return &x[y] */
+ /* For &x[y], return x+y */
if (TREE_CODE (arg) == ARRAY_REF)
{
if (!c_mark_addressable (TREE_OPERAND (arg, 0)))
return error_mark_node;
- return build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (arg)), arg);
+ return build_binary_op (PLUS_EXPR, TREE_OPERAND (arg, 0),
+ TREE_OPERAND (arg, 1), 1);
}
/* Anything not already handled and not a true memory reference