[cfe-dev] Query regarding global value initialization standard

Karen Shaeffer shaeffer at neuralscape.com
Wed Sep 25 15:02:11 PDT 2013


On Wed, Sep 25, 2013 at 02:40:37PM -0700, Eli Friedman wrote:
> 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

Hi,
But isn't function f a constexpr? It doesn't modify anything and always
returns 1.

enjoy,
Karen
-- 
Karen Shaeffer                 Be aware: If you see an obstacle in your path,
Neuralscape Services           that obstacle is your path.        Zen proverb



More information about the cfe-dev mailing list