Currently, the spec describes ArrayMemberInitialization so:
ArrayMemberInitialization:
AssignExpression
AssignExpression : AssignExpression
However, considering the following:
struct test
{
int i;
}
static test[] tests = [
{1},
];
Compiles just fine, I believe the spec to be incorrect. Instead, it might be:
ArrayMemberInitialization:
AssignExpression
AssignExpression : AssignExpression
StructInitializer
AssignExpression : StructInitializer
ArrayInitializer
AssignExpression : ArrayInitializer
That said, this compiles too:
struct test
{
int[] i;
}
static test tests = {
[1, 2, 3]
};
So it might seem that StructMemberInitializer would need the reverse change, becoming:
StructMemberInitializer:
AssignExpression
Identifier : AssignExpression
ArrayInitializer
Identifier : ArrayInitializer
StructInitializer
Identifier : StructInitializer
Comment #1 by smjg — 2006-07-19T09:26:57Z
Indeed, ctod.html has an example of array initialisers nested within each other. So obviously, the documented ArrayMemberInitialization syntax is inaccurate.
Moreover, why not make it a little simpler:
ArrayMemberInitialization:
Initializer
AssignExpression : Initializer
StructMemberInitialization: // let's make the naming consistent
Initializer
Identifier : Initializer