mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-23 07:00:27 +08:00
re PR middle-end/23463 (va-arg-22.c execution fails)
2005-08-27 Andrew Pinski <pinskia@physics.uc.edu> PR middle-end/23463 * gimplify.c (gimplify_modify_expr_rhs): Remove check for zero sized types. (gimplify_modify_expr): Check for zero sized types and gimplify the rhs and lhs as statements. 2005-08-27 Andrew Pinski <pinskia@physics.uc.edu> PR middle-end/23463 * gcc.c-torture/execute/zero-struct-1.c: New test. From-SVN: r103571
This commit is contained in:
parent
147a8fb1ca
commit
412f898605
@ -1,3 +1,11 @@
|
||||
2005-08-27 Andrew Pinski <pinskia@physics.uc.edu>
|
||||
|
||||
PR middle-end/23463
|
||||
* gimplify.c (gimplify_modify_expr_rhs): Remove check for zero sized
|
||||
types.
|
||||
(gimplify_modify_expr): Check for zero sized types and gimplify the
|
||||
rhs and lhs as statements.
|
||||
|
||||
2005-08-27 John David Anglin <dave.anflin@nrc-cnrc.gc.ca>
|
||||
|
||||
PR libgcj/23508
|
||||
|
@ -2965,12 +2965,6 @@ gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p, tree *pre_p,
|
||||
tree *post_p, bool want_value)
|
||||
{
|
||||
enum gimplify_status ret = GS_OK;
|
||||
tree type = TREE_TYPE (*from_p);
|
||||
if (zero_sized_type (type))
|
||||
{
|
||||
*expr_p = NULL_TREE;
|
||||
return GS_ALL_DONE;
|
||||
}
|
||||
|
||||
while (ret != GS_UNHANDLED)
|
||||
switch (TREE_CODE (*from_p))
|
||||
@ -3164,6 +3158,18 @@ gimplify_modify_expr (tree *expr_p, tree *pre_p, tree *post_p, bool want_value)
|
||||
/* The distinction between MODIFY_EXPR and INIT_EXPR is no longer useful. */
|
||||
if (TREE_CODE (*expr_p) == INIT_EXPR)
|
||||
TREE_SET_CODE (*expr_p, MODIFY_EXPR);
|
||||
|
||||
/* For zero sized types only gimplify the left hand side and right hand side
|
||||
as statements and throw away the assignment. */
|
||||
if (zero_sized_type (TREE_TYPE (*from_p)))
|
||||
{
|
||||
gimplify_stmt (from_p);
|
||||
gimplify_stmt (to_p);
|
||||
append_to_statement_list (*from_p, pre_p);
|
||||
append_to_statement_list (*to_p, pre_p);
|
||||
*expr_p = NULL_TREE;
|
||||
return GS_ALL_DONE;
|
||||
}
|
||||
|
||||
/* See if any simplifications can be done based on what the RHS is. */
|
||||
ret = gimplify_modify_expr_rhs (expr_p, from_p, to_p, pre_p, post_p,
|
||||
|
@ -1,3 +1,8 @@
|
||||
2005-08-27 Andrew Pinski <pinskia@physics.uc.edu>
|
||||
|
||||
PR middle-end/23463
|
||||
* gcc.c-torture/execute/zero-struct-1.c: New test.
|
||||
|
||||
2005-08-27 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR target/23575
|
||||
|
23
gcc/testsuite/gcc.c-torture/execute/zero-struct-1.c
Normal file
23
gcc/testsuite/gcc.c-torture/execute/zero-struct-1.c
Normal file
@ -0,0 +1,23 @@
|
||||
struct g{};
|
||||
char y[3];
|
||||
char *f = &y[0];
|
||||
char *ff = &y[0];
|
||||
void h(void)
|
||||
{
|
||||
struct g t;
|
||||
*((struct g*)(f++)) = *((struct g*)(ff++));
|
||||
*((struct g*)(f++)) = (struct g){};
|
||||
t = *((struct g*)(ff++));
|
||||
}
|
||||
|
||||
void abort (void);
|
||||
|
||||
int main(void)
|
||||
{
|
||||
h();
|
||||
if (f != &y[2])
|
||||
abort();
|
||||
if (ff != &y[2])
|
||||
abort();
|
||||
return 0;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user