mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-18 11:40:54 +08:00
re PR c/5482 (cyclone-0.2, ICE in emit_move_insn, at expr.c:2746)
PR c/5482: * c-common.c (c_expand_expr) [STMT_EXPR]: If last expression is not EXPR_STMT, but COMPOUND_STMT, recurse into it. * gcc.c-torture/execute/20020206-1.c: New test. From-SVN: r49549
This commit is contained in:
parent
5364626ac4
commit
d512928893
@ -1,3 +1,9 @@
|
||||
2002-02-06 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c/5482:
|
||||
* c-common.c (c_expand_expr) [STMT_EXPR]: If last expression is not
|
||||
EXPR_STMT, but COMPOUND_STMT, recurse into it.
|
||||
|
||||
2002-02-06 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* cfganal.c (keep_with_call_p): Source for fixed_reg dest must
|
||||
|
@ -3466,22 +3466,32 @@ c_expand_expr (exp, target, tmode, modifier)
|
||||
|
||||
/* If we want the result of this expression, find the last
|
||||
EXPR_STMT in the COMPOUND_STMT and mark it as addressable. */
|
||||
if (target != const0_rtx
|
||||
&& TREE_CODE (STMT_EXPR_STMT (exp)) == COMPOUND_STMT
|
||||
&& TREE_CODE (COMPOUND_BODY (STMT_EXPR_STMT (exp))) == SCOPE_STMT)
|
||||
if (target != const0_rtx)
|
||||
{
|
||||
tree expr = COMPOUND_BODY (STMT_EXPR_STMT (exp));
|
||||
tree last = TREE_CHAIN (expr);
|
||||
tree expr = STMT_EXPR_STMT (exp);
|
||||
tree last;
|
||||
|
||||
while (TREE_CHAIN (last))
|
||||
while (TREE_CODE (expr) == COMPOUND_STMT
|
||||
&& TREE_CODE (COMPOUND_BODY (expr)) == SCOPE_STMT)
|
||||
{
|
||||
expr = last;
|
||||
last = TREE_CHAIN (last);
|
||||
}
|
||||
expr = COMPOUND_BODY (expr);
|
||||
last = TREE_CHAIN (expr);
|
||||
|
||||
if (TREE_CODE (last) == SCOPE_STMT
|
||||
&& TREE_CODE (expr) == EXPR_STMT)
|
||||
TREE_ADDRESSABLE (expr) = 1;
|
||||
while (TREE_CHAIN (last))
|
||||
{
|
||||
expr = last;
|
||||
last = TREE_CHAIN (last);
|
||||
}
|
||||
|
||||
if (TREE_CODE (last) != SCOPE_STMT)
|
||||
abort ();
|
||||
|
||||
if (TREE_CODE (expr) == EXPR_STMT)
|
||||
{
|
||||
TREE_ADDRESSABLE (expr) = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
expand_stmt (STMT_EXPR_STMT (exp));
|
||||
|
@ -1,5 +1,7 @@
|
||||
2002-02-06 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* gcc.c-torture/execute/20020206-1.c: New test.
|
||||
|
||||
PR optimization/5429:
|
||||
* gcc.c-torture/compile/20020206-1.c: New test.
|
||||
|
||||
|
29
gcc/testsuite/gcc.c-torture/execute/20020206-1.c
Normal file
29
gcc/testsuite/gcc.c-torture/execute/20020206-1.c
Normal file
@ -0,0 +1,29 @@
|
||||
/* This testcase ICEd because c_expand_expr did not mark statement expression
|
||||
return value as one which shouldn't be ignored. */
|
||||
|
||||
struct A {
|
||||
unsigned int a, b, c;
|
||||
};
|
||||
|
||||
extern void abort (void);
|
||||
extern void exit (int);
|
||||
|
||||
struct A bar (void)
|
||||
{
|
||||
return (struct A) { 176, 52, 31 };
|
||||
}
|
||||
|
||||
void baz (struct A *a)
|
||||
{
|
||||
if (a->a != 176 || a->b != 52 || a->c != 31)
|
||||
abort ();
|
||||
}
|
||||
|
||||
int main ()
|
||||
{
|
||||
struct A d;
|
||||
|
||||
d = ({ { bar (); } });
|
||||
baz (&d);
|
||||
exit (0);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user