From 1f481a8eeebc864b3aef966b2e6c747df3232b3e Mon Sep 17 00:00:00 2001 From: mmitchel Date: Thu, 8 Sep 2005 18:56:42 +0000 Subject: [PATCH] PR c++/23691 * decl2.c (mark_used): Instantiate static data members initialized by constants, even in a template. PR c++/23691 * g++.dg/template/static16.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@104041 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl2.c | 30 +++++++++++++++++++++++++++++- gcc/testsuite/ChangeLog | 5 +++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 89a9656..795b2a1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2005-09-08 Mark Mitchell + + PR c++/23691 + * decl2.c (mark_used): Instantiate static data members initialized + by constants, even in a template. + 2005-09-08 Andrew Pinski PR obj-c++/16816 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 87ef858..a6e82f0 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -3217,12 +3217,38 @@ check_default_args (tree x) } } +/* Mark DECL as "used" in the program. If DECL is a specialization or + implicitly declared class member, generate the actual definition. */ + void mark_used (tree decl) { + HOST_WIDE_INT saved_processing_template_decl = 0; + TREE_USED (decl) = 1; - if (processing_template_decl || skip_evaluation) + /* If we don't need a value, then we don't need to synthesize DECL. */ + if (skip_evaluation) return; + /* Normally, we can wait until instantiation-time to synthesize + DECL. However, if DECL is a static data member initialized with + a constant, we need the value right now because a reference to + such a data member is not value-dependent. */ + if (processing_template_decl) + { + if (TREE_CODE (decl) == VAR_DECL + && DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl) + && DECL_CLASS_SCOPE_P (decl) + && !dependent_type_p (DECL_CONTEXT (decl))) + { + /* Pretend that we are not in a template so that the + initializer for the static data member will be full + simplified. */ + saved_processing_template_decl = processing_template_decl; + processing_template_decl = 0; + } + else + return; + } if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl) && !TREE_ASM_WRITTEN (decl)) @@ -3282,6 +3308,8 @@ mark_used (tree decl) need. */ instantiate_decl (decl, /*defer_ok=*/true, /*expl_inst_class_mem_p=*/false); + + processing_template_decl = saved_processing_template_decl; } #include "gt-cp-decl2.h" diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9690bb5..4fa4a7d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-09-08 Mark Mitchell + + PR c++/23691 + * g++.dg/template/static16.C: New test. + 2005-09-08 Richard Sandiford PR fortran/15326 -- 2.7.4