2012-09-07 Paolo Carlini <paolo.carlini@oracle.com>
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 7 Sep 2012 20:17:43 +0000 (20:17 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 7 Sep 2012 20:17:43 +0000 (20:17 +0000)
* pt.c (num_template_headers_for_class): Rework per the code
inline in cp_parser_check_declarator_template_parameters.
* parser.c (cp_parser_check_declarator_template_parameters):
Use num_template_headers_for_class.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@191082 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/cp/pt.c

index 4ffe1b4..0fea1a6 100644 (file)
@@ -1,3 +1,10 @@
+2012-09-07  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * pt.c (num_template_headers_for_class): Rework per the code
+       inline in cp_parser_check_declarator_template_parameters.
+       * parser.c (cp_parser_check_declarator_template_parameters):
+       Use num_template_headers_for_class.
+
 2012-09-06  Jason Merrill  <jason@redhat.com>
 
        PR c++/54341
index 60ba380..327ad0b 100644 (file)
@@ -20670,54 +20670,24 @@ cp_parser_check_declarator_template_parameters (cp_parser* parser,
                                                cp_declarator *declarator,
                                                location_t declarator_location)
 {
-  unsigned num_templates;
-
-  /* We haven't seen any classes that involve template parameters yet.  */
-  num_templates = 0;
-
   switch (declarator->kind)
     {
     case cdk_id:
-      if (declarator->u.id.qualifying_scope)
-       {
-         tree scope;
-
-         scope = declarator->u.id.qualifying_scope;
-
-         while (scope && CLASS_TYPE_P (scope))
-           {
-             /* You're supposed to have one `template <...>'
-                for every template class, but you don't need one
-                for a full specialization.  For example:
-
-                template <class T> struct S{};
-                template <> struct S<int> { void f(); };
-                void S<int>::f () {}
-
-                is correct; there shouldn't be a `template <>' for
-                the definition of `S<int>::f'.  */
-             if (!CLASSTYPE_TEMPLATE_INFO (scope))
-               /* If SCOPE does not have template information of any
-                  kind, then it is not a template, nor is it nested
-                  within a template.  */
-               break;
-             if (explicit_class_specialization_p (scope))
-               break;
-             if (PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (scope)))
-               ++num_templates;
-
-             scope = TYPE_CONTEXT (scope);
-           }
-       }
-      else if (TREE_CODE (declarator->u.id.unqualified_name)
-              == TEMPLATE_ID_EXPR)
-       /* If the DECLARATOR has the form `X<y>' then it uses one
-          additional level of template parameters.  */
-       ++num_templates;
+      {
+       unsigned num_templates = 0;
+       tree scope = declarator->u.id.qualifying_scope;
 
-      return cp_parser_check_template_parameters 
-       (parser, num_templates, declarator_location, declarator);
+       if (scope)
+         num_templates = num_template_headers_for_class (scope);
+       else if (TREE_CODE (declarator->u.id.unqualified_name)
+                == TEMPLATE_ID_EXPR)
+         /* If the DECLARATOR has the form `X<y>' then it uses one
+            additional level of template parameters.  */
+         ++num_templates;
 
+       return cp_parser_check_template_parameters 
+         (parser, num_templates, declarator_location, declarator);
+      }
 
     case cdk_function:
     case cdk_array:
index 6f6235c..cde83f2 100644 (file)
@@ -2214,9 +2214,9 @@ copy_default_args_to_explicit_spec (tree decl)
 int
 num_template_headers_for_class (tree ctype)
 {
-  int template_count = 0;
-  tree t = ctype;
-  while (t != NULL_TREE && CLASS_TYPE_P (t))
+  int num_templates = 0;
+
+  while (ctype && CLASS_TYPE_P (ctype))
     {
       /* You're supposed to have one `template <...>' for every
         template class, but you don't need one for a full
@@ -2228,21 +2228,20 @@ num_template_headers_for_class (tree ctype)
 
         is correct; there shouldn't be a `template <>' for the
         definition of `S<int>::f'.  */
-      if (CLASSTYPE_TEMPLATE_SPECIALIZATION (t)
-         && !any_dependent_template_arguments_p (CLASSTYPE_TI_ARGS (t)))
-       /* T is an explicit (not partial) specialization.  All
-          containing classes must therefore also be explicitly
-          specialized.  */
+      if (!CLASSTYPE_TEMPLATE_INFO (ctype))
+       /* If CTYPE does not have template information of any
+          kind,  then it is not a template, nor is it nested
+          within a template.  */
+       break;
+      if (explicit_class_specialization_p (ctype))
        break;
-      if ((CLASSTYPE_USE_TEMPLATE (t) || CLASSTYPE_IS_TEMPLATE (t))
-         && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)))
-       template_count += 1;
+      if (PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (ctype)))
+       ++num_templates;
 
-      t = TYPE_MAIN_DECL (t);
-      t = DECL_CONTEXT (t);
+      ctype = TYPE_CONTEXT (ctype);
     }
 
-  return template_count;
+  return num_templates;
 }
 
 /* Do a simple sanity check on the template headers that precede the