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
This commit is contained in:
Andrew Pinski 2004-10-17 22:01:19 +00:00 committed by Andrew Pinski
parent ac8245fadc
commit 7c672dfc01
2 changed files with 25 additions and 3 deletions

View File

@ -1,3 +1,12 @@
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

View File

@ -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