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.