re PR c++/48657 (could not convert template argument ‘VectorDimension’ to ‘unsigned...
authorJason Merrill <jason@redhat.com>
Wed, 20 Apr 2011 19:39:02 +0000 (15:39 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 20 Apr 2011 19:39:02 +0000 (15:39 -0400)
PR c++/48657
* decl.c (cp_finish_decl): Simplify template handling.

From-SVN: r172790

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

index e854651..ed98719 100644 (file)
@@ -1,3 +1,8 @@
+2011-04-20  Jason Merrill  <jason@redhat.com>
+
+       PR c++/48657
+       * decl.c (cp_finish_decl): Simplify template handling.
+
 2011-04-20  Jim Meyering  <meyering@redhat.com>
 
        * tree.c (cxx_printable_name_internal): Remove useless if-before-free.
index 6309648..cf4a40e 100644 (file)
@@ -5750,7 +5750,6 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
   const char *asmspec = NULL;
   int was_readonly = 0;
   bool var_definition_p = false;
-  int saved_processing_template_decl;
   tree auto_node;
 
   if (decl == error_mark_node)
@@ -5772,7 +5771,6 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
 
   /* Assume no cleanup is required.  */
   cleanup = NULL_TREE;
-  saved_processing_template_decl = processing_template_decl;
 
   /* If a name was specified, get the string.  */
   if (global_scope_p (current_binding_level))
@@ -5878,39 +5876,24 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
         template is instantiated.  But, if DECL is a variable constant
         then it can be used in future constant expressions, so its value
         must be available. */
-      if (!(init
-           && DECL_CLASS_SCOPE_P (decl)
-           /* We just set TREE_CONSTANT appropriately; see above.  */
-           && TREE_CONSTANT (decl)
-           && !type_dependent_p
-           /* FIXME non-value-dependent constant expression  */
-           && !value_dependent_init_p (init)))
-       {
-         if (init)
-           DECL_INITIAL (decl) = init;
-         if (TREE_CODE (decl) == VAR_DECL
-             && !DECL_PRETTY_FUNCTION_P (decl)
-             && !type_dependent_p)
-           maybe_deduce_size_from_array_init (decl, init);
-         goto finish_end;
+      if (init
+         && init_const_expr_p
+         && !type_dependent_p
+         && decl_maybe_constant_var_p (decl)
+         && !value_dependent_init_p (init))
+       {
+         tree init_code = check_initializer (decl, init, flags, &cleanup);
+         if (init_code == NULL_TREE)
+           init = NULL_TREE;
        }
+      else if (TREE_CODE (decl) == VAR_DECL
+              && !DECL_PRETTY_FUNCTION_P (decl)
+              && !type_dependent_p)
+       maybe_deduce_size_from_array_init (decl, init);
 
-      if (TREE_CODE (init) == TREE_LIST)
-       {
-         /* If the parenthesized-initializer form was used (e.g.,
-            "int A<N>::i(X)"), then INIT will be a TREE_LIST of initializer
-            arguments.  (There is generally only one.)  We convert them
-            individually.  */
-         tree list = init;
-         for (; list; list = TREE_CHAIN (list))
-           {
-             tree elt = TREE_VALUE (list);
-             TREE_VALUE (list) = fold_non_dependent_expr (elt);
-           }
-       }
-      else
-       init = fold_non_dependent_expr (init);
-      processing_template_decl = 0;
+      if (init)
+       DECL_INITIAL (decl) = init;
+      return;
     }
 
   /* Take care of TYPE_DECLs up front.  */
@@ -5933,7 +5916,7 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
 
       rest_of_decl_compilation (decl, DECL_FILE_SCOPE_P (decl),
                                at_eof);
-      goto finish_end;
+      return;
     }
 
   /* A reference will be modified here, as it is initialized.  */
@@ -6057,8 +6040,7 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
       else if (TREE_CODE (type) == ARRAY_TYPE)
        layout_type (type);
 
-      if (!processing_template_decl
-         && TREE_STATIC (decl)
+      if (TREE_STATIC (decl)
          && !at_function_scope_p ()
          && current_function_decl == NULL)
        /* So decl is a global variable or a static member of a
@@ -6078,9 +6060,8 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
 
   /* Let the middle end know about variables and functions -- but not
      static data members in uninstantiated class templates.  */
-  if (!saved_processing_template_decl
-      && (TREE_CODE (decl) == VAR_DECL 
-         || TREE_CODE (decl) == FUNCTION_DECL))
+  if (TREE_CODE (decl) == VAR_DECL
+      || TREE_CODE (decl) == FUNCTION_DECL)
     {
       if (TREE_CODE (decl) == VAR_DECL)
        {
@@ -6167,9 +6148,6 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
   if (cleanup)
     push_cleanup (decl, cleanup, false);
 
- finish_end:
-  processing_template_decl = saved_processing_template_decl;
-
   if (was_readonly)
     TREE_READONLY (decl) = 1;
 }
index dfa5c8c..c16c9bf 100644 (file)
@@ -1,3 +1,7 @@
+2011-04-20  Jason Merrill  <jason@redhat.com>
+
+       * g++.dg/template/const4.C: New.
+
 2011-04-20  Easwaran Raman  <eraman@google.com>
 
        * gcc.dg/stack-layout-1.c: New test.
diff --git a/gcc/testsuite/g++.dg/template/const4.C b/gcc/testsuite/g++.dg/template/const4.C
new file mode 100644 (file)
index 0000000..6552ec6
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/48657
+
+template<unsigned> struct A { typedef int T; };
+
+template<unsigned> void f()
+{
+  const unsigned D = 4;
+  A<D>::T t;
+}