On Wed, Dec 21, 2016 at 12:29:37PM -0500, Aldy Hernandez wrote: > > > int array[10] = { array[3]=5, 0x111, 0x222, 0x333 }; > > > > > > (gdb) x/4x &array > > > 0x601040 <array>: 0x00000005 0x00000111 0x00000222 > > > 0x00000005 > > > > > > That is, the array[3]=5 overwrites the last 0x333. I would expect > > > that... > > > > That may be wrong. Using the 4431 draft, [8.5.4]/4 says 'Within the > > initializer-list of a braced-init-list, the initializer-clauses, > > including any that result from pack expansions (14.5.3), are evaluated > > in the order in which they appear.' > > It goes on to mention that there are sequence points, plus that the > > ordering holds regardless of the semantics of initialization. > > > > So by my reading, the effects of the above list are: > > a) assign 5 to array[3] > > b) assign 5 to array[0] -- consume the first initializer > > c) assign x111 to array[1] -- consume the second initializer > > d) assign 0x222 to array[2] -- consume the third initializer > > e) assign 0x333 to array[3] -- consume the fourth intializer, > > overwrite #a > > Hmmmm, I see. > > Since designated initializers in arrays are not supported in the C++ FE, > should we sorry() on array initializers using self-reference like above the > above? Surely it's better than ICEing. Or, would you prefer we implement > the above semantics in the draft for GCC7?
The side-effects are unrelated to designed initializers, only [3] = 5 is designed initializer, array[3] = 5 is not, it is just arbitrary expression evaluated at that point to compute the corresponding element. We do support designed initializers in C++, but only in a useless way (require that the designators appear in order without any gaps). Jakub