[PR c++/78572] handle array self references in intializers

Nathan Sidwell nathan@acm.org
Tue Dec 20 20:30:00 GMT 2016


On 12/20/2016 01:52 PM, 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

nathan
-- 
Nathan Sidwell



More information about the Gcc-patches mailing list