OSDN Git Service

PR c++/23691
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 8 Sep 2005 18:56:42 +0000 (18:56 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 8 Sep 2005 18:56:42 +0000 (18:56 +0000)
* 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
gcc/cp/decl2.c
gcc/testsuite/ChangeLog

index 89a9656..795b2a1 100644 (file)
@@ -1,3 +1,9 @@
+2005-09-08  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/23691
+       * decl2.c (mark_used): Instantiate static data members initialized
+       by constants, even in a template.
+
 2005-09-08  Andrew Pinski  <pinskia@physics.uc.edu>
 
        PR obj-c++/16816
index 87ef858..a6e82f0 100644 (file)
@@ -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"
index 9690bb5..4fa4a7d 100644 (file)
@@ -1,3 +1,8 @@
+2005-09-08  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/23691
+       * g++.dg/template/static16.C: New test.
+
 2005-09-08  Richard Sandiford  <richard@codesourcery.com>
 
        PR fortran/15326