public inbox for gcc-prs@sourceware.org help / color / mirror / Atom feed
From: "Giovanni Bajo" <giovannibajo@libero.it> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, Subject: Re: c++/10112: static data member is not correctly initialized Date: Tue, 18 Mar 2003 01:46:00 -0000 [thread overview] Message-ID: <20030318014600.22679.qmail@sources.redhat.com> (raw) [-- 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
next reply other threads:[~2003-03-18 1:46 UTC|newest] Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top 2003-03-18 1:46 Giovanni Bajo [this message] -- 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:56 Gabriel Dos Reis 2003-03-18 0:16 Wolfgang Bangerth
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20030318014600.22679.qmail@sources.redhat.com \ --to=giovannibajo@libero.it \ --cc=gcc-prs@gcc.gnu.org \ --cc=nobody@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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).