]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/48936 (sizeof template parm not considered constant expression)
authorJason Merrill <jason@redhat.com>
Mon, 9 May 2011 18:00:37 +0000 (14:00 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 9 May 2011 18:00:37 +0000 (14:00 -0400)
PR c++/48936
* decl2.c (mark_used): Instantiate constant variables even
in unevaluated context.

From-SVN: r173585

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/nontype23.C [new file with mode: 0644]

index ffc7e8c4c33ce5fe95d6fadb0452b3b5bb70faba..a85d3b1f5cbb03843f228e6c97f74351afe11b86 100644 (file)
@@ -1,3 +1,9 @@
+2011-05-09  Jason Merrill  <jason@redhat.com>
+
+       PR c++/48936
+       * decl2.c (mark_used): Instantiate constant variables even
+       in unevaluated context.
+
 2011-04-26  Jason Merrill  <jason@redhat.com>
 
        PR c++/42687
index 947256baf43c8a30ebd52cbc08940e5f3e4232cb..7bfe773701125b678098cb085cc4a203d1cbb4e5 100644 (file)
@@ -3801,8 +3801,6 @@ possibly_inlined_p (tree decl)
 void
 mark_used (tree decl)
 {
-  HOST_WIDE_INT saved_processing_template_decl = 0;
-
   /* If DECL is a BASELINK for a single function, then treat it just
      like the DECL for the function.  Otherwise, if the BASELINK is
      for an overloaded function, we don't know which function was
@@ -3825,9 +3823,6 @@ mark_used (tree decl)
       error ("used here");
       return;
     }
-  /* If we don't need a value, then we don't need to synthesize DECL.  */
-  if (skip_evaluation)
-    return;
 
   /* If within finish_function, defer the rest until that function
      finishes, otherwise it might recurse.  */
@@ -3841,9 +3836,10 @@ mark_used (tree decl)
      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 (TREE_CODE (decl) == VAR_DECL
-      && DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl)
-      && DECL_CLASS_SCOPE_P (decl))
+  if (DECL_INTEGRAL_CONSTANT_VAR_P (decl)
+      && !DECL_INITIAL (decl)
+      && DECL_LANG_SPECIFIC (decl)
+      && DECL_TEMPLATE_INSTANTIATION (decl))
     {
       /* Don't try to instantiate members of dependent types.  We
         cannot just use dependent_type_p here because this function
@@ -3853,12 +3849,14 @@ mark_used (tree decl)
       if (CLASSTYPE_TEMPLATE_INFO ((DECL_CONTEXT (decl)))
          && uses_template_parms (CLASSTYPE_TI_ARGS (DECL_CONTEXT (decl))))
        return;
-      /* Pretend that we are not in a template, even if we are, so
-        that the static data member initializer will be processed.  */
-      saved_processing_template_decl = processing_template_decl;
-      processing_template_decl = 0;
+      instantiate_decl (decl, /*defer_ok=*/false,
+                       /*expl_inst_class_mem_p=*/false);
     }
 
+  /* If we don't need a value, then we don't need to synthesize DECL.  */
+  if (skip_evaluation)
+    return;
+
   if (processing_template_decl)
     return;
 
@@ -3918,8 +3916,6 @@ mark_used (tree decl)
        need.  Therefore, we always try to defer instantiation.  */
     instantiate_decl (decl, /*defer_ok=*/true,
                      /*expl_inst_class_mem_p=*/false);
-
-  processing_template_decl = saved_processing_template_decl;
 }
 
 /* Given function PARM_DECL PARM, return its index in the function's list
index a3db91f31bfc5eca6eb1e820f094aec546203f34..e22b269a4a2043913e67350161ccc3622626a83c 100644 (file)
@@ -1,3 +1,7 @@
+2011-05-09  Jason Merrill  <jason@redhat.com>
+
+       * g++.dg/template/nontype23.C: New.
+
 2011-05-05  Jason Merrill  <jason@redhat.com>
 
        * g++.dg/init/new30.C: New.
diff --git a/gcc/testsuite/g++.dg/template/nontype23.C b/gcc/testsuite/g++.dg/template/nontype23.C
new file mode 100644 (file)
index 0000000..dfda4fe
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/48936
+
+template <bool C> int foo (void);
+template <class T> struct S
+{
+  static const unsigned int a = sizeof (T);
+  enum { c = sizeof (foo <(a == 0)> ()) };
+};
+S<int> x;