re PR c/16566 (ICE with flexible arrays)

PR c/16566
	* c-typeck.c (build_component_ref): Don't special-case
	COMPOUND_EXPR.

testsuite:
	* gcc.c-torture/compile/pr16566-1.c,
	gcc.c-torture/compile/pr16566-2.c,
	gcc.c-torture/compile/pr16566-3.c: New tests.

From-SVN: r87892
This commit is contained in:
Joseph Myers 2004-09-22 23:51:58 +01:00 committed by Joseph Myers
parent 342fb42207
commit 588d195294
6 changed files with 53 additions and 20 deletions

View File

@ -1,3 +1,9 @@
2004-09-22 Joseph S. Myers <jsm@polyomino.org.uk>
PR c/16566
* c-typeck.c (build_component_ref): Don't special-case
COMPOUND_EXPR.
2004-09-22 Frank Ch. Eigler <fche@redhat.com>
* dominance.c (verify_dominators): Don't SEGV if recount_dominator

View File

@ -1452,26 +1452,6 @@ build_component_ref (tree datum, tree component)
if (!objc_is_public (datum, component))
return error_mark_node;
/* If DATUM is a COMPOUND_EXPR, move our reference inside it.
Ensure that the arguments are not lvalues; otherwise,
if the component is an array, it would wrongly decay to a pointer in
C89 mode.
We cannot do this with a COND_EXPR, because in a conditional expression
the default promotions are applied to both sides, and this would yield
the wrong type of the result; for example, if the components have
type "char". */
switch (TREE_CODE (datum))
{
case COMPOUND_EXPR:
{
tree value = build_component_ref (TREE_OPERAND (datum, 1), component);
return build2 (COMPOUND_EXPR, TREE_TYPE (value),
TREE_OPERAND (datum, 0), non_lvalue (value));
}
default:
break;
}
/* See if there is a field or component with name COMPONENT. */
if (code == RECORD_TYPE || code == UNION_TYPE)

View File

@ -1,3 +1,10 @@
2004-09-22 Joseph S. Myers <jsm@polyomino.org.uk>
PR c/16566
* gcc.c-torture/compile/pr16566-1.c,
gcc.c-torture/compile/pr16566-2.c,
gcc.c-torture/compile/pr16566-3.c: New tests.
2004-09-22 Kazu Hirata <kazu@cs.umass.edu>
PR tree-optimization/17512

View File

@ -0,0 +1,15 @@
/* ICE with flexible arrays in non-lvalue structures. Bug 16566
(comment #3). */
struct S;
struct C {
int i;
struct S *tab[];
};
struct S { struct C c; };
void foo (struct S *x) {
foo(((void)1, x->c).tab[0]);
}

View File

@ -0,0 +1,13 @@
/* ICE with flexible arrays in non-lvalue structures. Bug 16566
(comment #5). */
struct A
{
int i;
int x[];
};
int foo(struct A a)
{
return (a,a).x[0];
}

View File

@ -0,0 +1,12 @@
/* ICE with flexible arrays in non-lvalue structures. Bug 16566
(testcase from duplicate bug 16575). */
struct S;
struct C {
int i;
struct S *tab[];
};
struct S { struct C c; };
void foo (struct S *x) {
((void)1, x->c).tab[0] = 0;
}