c++/10112: static data member is not correctly initialized
Giovanni Bajo
giovannibajo@libero.it
Tue Mar 18 01:46:00 GMT 2003
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
More information about the Gcc-prs
mailing list