On Sat, 6 May 2006, Mike Stump wrote:
> I'll entertain pointers to VLA/VM and [*] bugs for C, please send me pointers
> to reports in bugzilla.
>
> Thanks.
>
> I know about http://gcc.gnu.org/PR25802
Bugs 19771, 7948, 18740 (in general, look at the bugs on which bug 16989
depends). The question of when exactly an array size expression is
evaluated requires careful thought and design to ensure it is always done
at the right time, the other issues should be easier to resolve.
> I also would like to know what people think the standard (c99) says about:
>
> void foo4(int o[*][4]) { }
> void foo5(int o[4][*]) { }
Invalid.
> void foo6(int (*o)(int p[*])) { }
Valid.
Function prototype scope is defined in 6.2.1#4.
More examples:
void foo(int a, int b[*][*], int c[static sizeof(*b)]);
is valid code, though what size is relevant for the [static] is more
obscure. sizeof a [*] array returns an indeterminate nonconstant value of
type size_t, which can be used in expressions just like other values of
type size_t.
void foo(int x[sizeof(int (*)[*])]);
should probably be considered invalid, as should
void foo(int [*]);
([*] being used in a type that's not a declaration). (I'm not aware of
anything to contradict Nick Maclaren's interpretation
<http://groups.google.com/group/comp.std.c/msg/b01f49f6c9c0039a> here.)
The example I gave in WG14 reflector message 10731 ought probably to be
invalid or at least undefined behavior at runtime - the latter is probably
the best interpretation for now, since I haven't written or submitted a DR
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.
Which functions should be called when in the evaluation of the above
expression? Or, should such constructs be disallowed and how would we
define what the invalid constructs are?
(Much the same issue arises with compound literals of VM type as does
with
casts to VM type.)
See also my DRs 311, 312, 313 (which deal with rather simpler cases).
There's also a pre-DR I haven't submitted to WG14,
<http://www.srcf.ucam.org/~jsm28/gcc/pre-dr-14.txt>.
--
Joseph S. Myers http://www.srcf.ucam.org/~jsm28/gcc/
[EMAIL PROTECTED] (personal mail)
[EMAIL PROTECTED] (CodeSourcery mail)
[EMAIL PROTECTED] (Bugzilla assignments and CCs)