Joseph S. Myers wrote:- > for that case. To quote my message: > > Consider the code > > int a, b, c, d, e, f; > void *p1(void), *p2(void), *p3(void); > int c1(void), c2(void); > int d1(void), d2(void), d3(void); > int z1(void), z2(void), z3(void); > > int > h(void) > { > int r = (c1() > ? (z1(), (int (*(*(*)[d1()])[])[])p1()) > : (c2() > ? (z2(), (int (*(*(*)[])[d2()])[])p2()) > : (z3(), (int (*(*(*)[])[])[d3()])p3()) > ) > )[a][b][c][d][e][f]; > return r; > } > > The outer conditional expression has a type which may informally be > described as "pointer to arrays [d1()] of pointers to arrays [d2()] of > pointers to arrays [d3()] of ints", by the composite type rules applied > to > conditional expressions. But when the expression is executed, all > three > dimensions are needed to evaluate the [a][b][c][d][e][f] array > reference, > but only one of the dimensions appears in an expression which should be > evaluated according to the rules for evaluation of conditional > expressions. Furthermore, the return value of d2() may depend on the > prior calls to c2() and z2() in that part of the conditional > expression, > so if c1() returns nonzero it might not suffice simply to evaluate d2() > and d3() as well as d1(); c2(), z2() and z3() would also need to be > evaluated.
My front end, and Comeau's oneline compiler, both give a similar message: "/tmp/foo.c", line 10: error: expression must point to a complete type int r = (c1() ^ which seems reasonable based on my understanding of composite types of VLA types: that either satisfies the requirements of, and therefore can be taken to be, the composite type. Neil.