[cfe-dev] Query regarding global value initialization standard

Eli Friedman eli.friedman at gmail.com
Wed Sep 25 14:40:37 PDT 2013


On Wed, Sep 25, 2013 at 4:49 AM, Karthik Bhat <blitz.opensource at gmail.com>wrote:

> Hi All,
> I was going through a gcc TC for C++11. The test case is as follows -
>
> // { dg-options -std=c++0x }
> // { dg-do run }
>
> extern "C" void abort ();
> extern int ar[2];
>
> int f()
> {
>   int k = 0;
>   if (ar[0] != 42 || ar[1] != 0)
>     abort();
>   return 1;
> }
>
> int i = f();
>
> int ar[2] = {42,i};
>
> int main()
> {
>   return 0;
> }
>
> During dynamic initialization of i in function f() the value of ar[0] is 0
> in case of clang were as in case of gcc it is 42.
>
> As per standard(section 3.6.2) all global values should initially be zero
> initialized followed by const initialized if possible before dynamic
> initialization takes place.
> Hence as per standard the const initialization of int ar[2] = {42,i};
> should fail as i is not a const here( which seems to be happening in
> clang). Hence ar[0],ar[1] is still zero initialized because of which during
> dynamic initialization in f() ar[0]  is 0 which seems to be the correct
> behavior.
>
> Can i conclude here that clang is behaving correctly and the tc is wrong?
> or am i missing something which this gcc tc wanted to capture?
>

As far as I can tell, your analysis is correct.

-Eli
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130925/851630f2/attachment.html>


More information about the cfe-dev mailing list