public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
* Re: c++/10112: static data member is not correctly initialized
@ 2003-03-18  1:56 Gabriel Dos Reis
  0 siblings, 0 replies; 5+ messages in thread
From: Gabriel Dos Reis @ 2003-03-18  1:56 UTC (permalink / raw)
  To: nobody; +Cc: gcc-prs

The following reply was made to PR c++/10112; it has been noted by GNATS.

From: Gabriel Dos Reis <gdr@integrable-solutions.net>
To: "Giovanni Bajo" <giovannibajo@libero.it>
Cc: "Wolfgang Bangerth" <bangerth@ticam.utexas.edu>, <gcc-gnats@gcc.gnu.org>,
   <gcc-bugs@gcc.gnu.org>, <o.kullmann@swansea.ac.uk>, <nathan@gcc.gnu.org>
Subject: Re: c++/10112: static data member is not correctly initialized
Date: 18 Mar 2003 02:46:40 +0100

 "Giovanni Bajo" <giovannibajo@libero.it> writes:
 
 [...]
 
 | Nathan, I agree that the order of instantiation is implementation defined,
 | but the initialization of the static data members should happen before any
 | template is instantiated.
 
 From which parts of the standard did read that?
 
 | =A714.7.1p8 decouples initialization of static data
 | members and instantiation of class templates, saying that <<implicit
 | instantiation of a class template does not cause any static data members =
 of
 | that class to be implicitly instantiated>>. In fact, <<static data members
 | are initialized [...] exactly like nonlocal objects>> (=A79.4.2p7), <<bef=
 ore
 | any other initialization takes place>> (=A73.6.2p1) (and of course only if
 | <<the static data member is itself used in a way that requires the
 | definition of the static data member to exist>> (=A714.7.1p1).
 
 I can't read that to imply the your first assertion quoted above.
 
 -- Gaby


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: c++/10112: static data member is not correctly initialized
@ 2003-03-18  2:46 Gabriel Dos Reis
  0 siblings, 0 replies; 5+ messages in thread
From: Gabriel Dos Reis @ 2003-03-18  2:46 UTC (permalink / raw)
  To: nobody; +Cc: gcc-prs

The following reply was made to PR c++/10112; it has been noted by GNATS.

From: Gabriel Dos Reis <gdr@integrable-solutions.net>
To: "Giovanni Bajo" <giovannibajo@libero.it>
Cc: "Wolfgang Bangerth" <bangerth@ticam.utexas.edu>, <gcc-gnats@gcc.gnu.org>,
   <gcc-bugs@gcc.gnu.org>, <o.kullmann@swansea.ac.uk>, <nathan@gcc.gnu.org>
Subject: Re: c++/10112: static data member is not correctly initialized
Date: 18 Mar 2003 03:34:23 +0100

 "Giovanni Bajo" <giovannibajo@libero.it> writes:
 
 | ----- Original Message -----
 | From: "Gabriel Dos Reis" <gdr@integrable-solutions.net>
 | To: "Giovanni Bajo" <giovannibajo@libero.it>
 | Cc: "Wolfgang Bangerth" <bangerth@ticam.utexas.edu>;
 | <gcc-gnats@gcc.gnu.org>; <gcc-bugs@gcc.gnu.org>; <o.kullmann@swansea.ac.u=
 k>;
 | <nathan@gcc.gnu.org>
 | Sent: Tuesday, March 18, 2003 2:46 AM
 | Subject: Re: c++/10112: static data member is not correctly initialized
 |=20
 |=20
 | >From which parts of the standard did read that?
 |=20
 | I was reading =A73.6.2p1 <<before any other initialization takes place>> =
 in
 | this way.
 
 That paragraph speaks about initialisation of objects.  It says
 nothing about the order of template instantiations and the order
 
 
 | Anyway, the bug is about the order of initialization between two static d=
 ata
 | members. Since instantiation of class templates does not affect
 | initialization of static data members (as per quoted paragraph), even if =
 you
 | instantiate the class templates before inizializing the data members, you
 | should respect the order of inizialization of the data members.
 
 Unless the instantiation of the class template uses the static data
 members.=20
 
 | It seems to me that GCC is initializing the static data members because t=
 he
 | templates are instantiated, but this violates =A714.7.1p8.
 
 What you're missing is  that your expression in the assertion
 introduces an indeterminism in the order of instantiation.  It is the
 instantiation of the static data members that defines them, not just
 their mere -template- definition.
 
 What is happening is not far from the following scenario:=20
 
    struct A {=20
       int p;
 =20
       A(int x) : p(x) { }
    };=20
 
    struct B {
       static A a;
       static int p1;
    };
 
     int B::p1 =3D a.p;
     A B::a(123);
 
   int main()
   {
     assert (B::a.p =3D=3D B::p1);
   }=20
 
 -- Gaby


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: c++/10112: static data member is not correctly initialized
@ 2003-03-18  2:06 Giovanni Bajo
  0 siblings, 0 replies; 5+ messages in thread
From: Giovanni Bajo @ 2003-03-18  2:06 UTC (permalink / raw)
  To: nobody; +Cc: gcc-prs

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 1501 bytes --]

The following reply was made to PR c++/10112; it has been noted by GNATS.

From: "Giovanni Bajo" <giovannibajo@libero.it>
To: "Gabriel Dos Reis" <gdr@integrable-solutions.net>
Cc: "Wolfgang Bangerth" <bangerth@ticam.utexas.edu>,
	<gcc-gnats@gcc.gnu.org>,
	<gcc-bugs@gcc.gnu.org>,
	<o.kullmann@swansea.ac.uk>,
	<nathan@gcc.gnu.org>
Subject: Re: c++/10112: static data member is not correctly initialized
Date: Tue, 18 Mar 2003 03:01:11 +0100

 ----- Original Message -----
 From: "Gabriel Dos Reis" <gdr@integrable-solutions.net>
 To: "Giovanni Bajo" <giovannibajo@libero.it>
 Cc: "Wolfgang Bangerth" <bangerth@ticam.utexas.edu>;
 <gcc-gnats@gcc.gnu.org>; <gcc-bugs@gcc.gnu.org>; <o.kullmann@swansea.ac.uk>;
 <nathan@gcc.gnu.org>
 Sent: Tuesday, March 18, 2003 2:46 AM
 Subject: Re: c++/10112: static data member is not correctly initialized
 
 
 >From which parts of the standard did read that?
 
 I was reading §3.6.2p1 <<before any other initialization takes place>> in
 this way.
 Anyway, the bug is about the order of initialization between two static data
 members. Since instantiation of class templates does not affect
 initialization of static data members (as per quoted paragraph), even if you
 instantiate the class templates before inizializing the data members, you
 should respect the order of inizialization of the data members.
 It seems to me that GCC is initializing the static data members because the
 templates are instantiated, but this violates §14.7.1p8.
 
 Giovanni Bajo
 


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: c++/10112: static data member is not correctly initialized
@ 2003-03-18  1:46 Giovanni Bajo
  0 siblings, 0 replies; 5+ messages in thread
From: Giovanni Bajo @ 2003-03-18  1:46 UTC (permalink / raw)
  To: nobody; +Cc: gcc-prs

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 3438 bytes --]

The following reply was made to PR c++/10112; it has been noted by GNATS.

From: "Giovanni Bajo" <giovannibajo@libero.it>
To: "Wolfgang Bangerth" <bangerth@ticam.utexas.edu>,
	<gcc-gnats@gcc.gnu.org>,
	<gcc-bugs@gcc.gnu.org>,
	<o.kullmann@swansea.ac.uk>,
	<nathan@gcc.gnu.org>
Cc:  
Subject: Re: c++/10112: static data member is not correctly initialized
Date: Tue, 18 Mar 2003 02:36:55 +0100

 ----- Original Message -----
 From: "Wolfgang Bangerth" <bangerth@ticam.utexas.edu>
 To: <giovannibajo@libero.it>; <gcc-gnats@gcc.gnu.org>;
 <gcc-bugs@gcc.gnu.org>; <o.kullmann@swansea.ac.uk>; <nathan@gcc.gnu.org>
 Sent: Tuesday, March 18, 2003 1:15 AM
 Subject: Re: c++/10112: static data member is not correctly initialized
 
 Wolfgang, objects of POD types are statically initiliazed if and only if the
 initiliazer is constant, and that's not the case of the above snippet. This
 is very clear in §3.6.2p1, which I quoted (it's the same paragraph that
 introduces the concept of "static initialization" and "dynamic
 initalization"). Since my quote was maybe confusing because stripped down to
 the minimum, I post the full paragraph:
 
 -------------------
 The storage for objects with static storage duration (3.7.1) shall be
 zeroinitialized (8.5) before any other
 initialization takes place. Zeroinitialization and initialization with a
 constant expression are collectively
 called static initialization; all other initialization is dynamic
 initialization. Objects of POD types (3.9) with
 static storage duration initialized with constant expressions (5.19) shall
 be initialized before any dynamic
 initialization takes place. Objects with static storage duration defined in
 namespace scope in the same
 translation unit and dynamically initialized shall be initialized in the
 order in which their definition appears
 in the translation unit.
 -------------------
 
 It seems clear to me that A::p1 cannot be statically initialized, and thus
 must follow the order of definition.
 
 Oliver, I think you are misreading the standard. If you de-legalise 14.7.1,
 it basically says that the compiler must generate code only for template
 (member) functions that are really used in the code. For completeness, it
 also says that static data members must be intialized only if they are
 really used, but it does not say in any way that initialization must be done
 WHEN the member is effectively used. In fact, all the initialization of
 static data members and non-local objects (like global static variables)
 must be done before main(), like §3.6.2 explains.
 
 Nathan, I agree that the order of instantiation is implementation defined,
 but the initialization of the static data members should happen before any
 template is instantiated. §14.7.1p8 decouples initialization of static data
 members and instantiation of class templates, saying that <<implicit
 instantiation of a class template does not cause any static data members of
 that class to be implicitly instantiated>>. In fact, <<static data members
 are initialized [...] exactly like nonlocal objects>> (§9.4.2p7), <<before
 any other initialization takes place>> (§3.6.2p1) (and of course only if
 <<the static data member is itself used in a way that requires the
 definition of the static data member to exist>> (§14.7.1p1).
 
 In the end, I believe that this is a bug in GCC, and other compilers (VC
 7.1, Comeau 4.3.0) seem to agree.
 
 Giovanni Bajo
 


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: c++/10112: static data member is not correctly initialized
@ 2003-03-18  0:16 Wolfgang Bangerth
  0 siblings, 0 replies; 5+ messages in thread
From: Wolfgang Bangerth @ 2003-03-18  0:16 UTC (permalink / raw)
  To: nobody; +Cc: gcc-prs

The following reply was made to PR c++/10112; it has been noted by GNATS.

From: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
To: giovannibajo@libero.it, <gcc-gnats@gcc.gnu.org>, <gcc-bugs@gcc.gnu.org>,
   <o.kullmann@swansea.ac.uk>, <nathan@gcc.gnu.org>
Cc:  
Subject: Re: c++/10112: static data member is not correctly initialized
Date: Mon, 17 Mar 2003 18:15:06 -0600 (CST)

 I think with this code, A::p1 is statically initialized (being a POD 
 type), while B::a is dynamically initialized (having a user-defined 
 constructor). I think I remember that the standard specifies that static 
 initializers always run before dynamic ones, irrespective of the order in 
 which they appear in the source file. In that case, this would not be a 
 bug.
 
 W.
 
 -------------------------------------------------------------------------
 Wolfgang Bangerth             email:            bangerth@ticam.utexas.edu
                               www: http://www.ticam.utexas.edu/~bangerth/
 
 


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2003-03-18  2:46 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-03-18  1:56 c++/10112: static data member is not correctly initialized Gabriel Dos Reis
  -- strict thread matches above, loose matches on Subject: below --
2003-03-18  2:46 Gabriel Dos Reis
2003-03-18  2:06 Giovanni Bajo
2003-03-18  1:46 Giovanni Bajo
2003-03-18  0:16 Wolfgang Bangerth

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).