On Tuesday, 4 June 2013 at 02:33:54 UTC, Kenji Hara wrote:
Personally I'd like to just use block-init everywhere. I personally find first-element-init rather unexpected, but maybe that's just me. I don't know when it would be useful. But regardless, we need to get this sorted
out.
It's a blocker for my CTFE work.


First-element-init is definitely a bug. I can argue that nobody wants the
strange behavior.

Good, it seems that everyone agrees. It's therefore a bug in todt.c, StructInitializer::todt()


void main()
{
   int [3][4] w = 7;
   assert( w[2][2] == 7); // Passes, it was block-initialized


Currently block-initialization for multi-dimensional static array is just
only allowed for variable declaration in statement scope.
I'm planning to fix bug 3849 and 7019, but changing this behavior might affect them. As my hope, I'd like to keep this as-is so I've not finished
thinking about it well.

Yeah, there's difficulties with things like:

int [3][4] = [7, 7, 7];

which could be a block initialization -- is this allowed or not?

Though I think we have already dealt with such issues for block assignment.

S s = { 8 }; // OK, struct static initializer. first-element-init


This is definitely a bug. Instead, block-init should occur.

Good.



   S r = S( 8 ); // OK, struct literal, block-init.
   T t;          // Default initialized, block-init


OK.


assert( s.x[2] == 8); // Fails; it was first-element-initialized


Also, definitely a bug.


assert( r.x[2] == 8); // Passes; all elements are 8. Block-init. assert( t.x[2] == 8); // Passes; all elements are 8. Block-init.


OK.


   U u = { 9 };  // Does not compile
// Error: cannot implicitly convert expression (9) of type int to
int[3LU][3LU]


For reasons I've already mentioned in `int [3][4] w = 7;`, I'd like to keep
this current behavior.

There is still one problem, bug 10198. This currently compiles, and does something stupid:
---
struct U {
   int [3][3] y;
}

U u = U(4);
---
What do you think should happen here?

Reply via email to