pt.c (check_default_tmpl_args): Move test for missing default arguments here, from ...
authorMark Mitchell <mark@codesourcery.com>
Mon, 19 Jul 1999 19:28:19 +0000 (19:28 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Mon, 19 Jul 1999 19:28:19 +0000 (19:28 +0000)
* pt.c (check_default_tmpl_args): Move test for missing default
arguments here, from ...
(end_template_parm_list): Here.

From-SVN: r28180

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.old-deja/g++.pt/defarg11.C [new file with mode: 0644]

index b7f0458..f7cce48 100644 (file)
@@ -1,3 +1,9 @@
+1999-07-19  Mark Mitchell  <mark@codesourcery.com>
+
+       * pt.c (check_default_tmpl_args): Move test for missing default
+       arguments here, from ...
+       (end_template_parm_list): Here.
+
 1999-07-18  Mark Mitchell  <mark@codesourcery.com>
 
        * decl.c (lookup_nested_type): Remove.
index 6106852..bb48cc8 100644 (file)
@@ -1857,7 +1857,6 @@ end_template_parm_list (parms)
   int nparms;
   tree parm;
   tree saved_parmlist = make_tree_vec (list_length (parms));
-  int seen_def_arg_p = 0;
 
   current_template_parms
     = tree_cons (build_int_2 (0, processing_template_decl),
@@ -1866,25 +1865,7 @@ end_template_parm_list (parms)
   for (parm = parms, nparms = 0; 
        parm; 
        parm = TREE_CHAIN (parm), nparms++)
-    {
-      /* [temp.param]
-        
-        If a template-parameter has a default template-argument, all
-        subsequent template-parameters shall have a default
-        template-argument supplied.  */
-      if (TREE_PURPOSE (parm))
-       seen_def_arg_p = 1;
-      else if (seen_def_arg_p)
-       {
-         /* Issue the error message.  */
-         cp_error ("no default argument for `%D'", TREE_VALUE (parm));
-         /* For better subsequent error-recovery, we indicate that
-            there should have been a default argument.  */
-         TREE_PURPOSE (parm) = error_mark_node;
-       }
-
-      TREE_VEC_ELT (saved_parmlist, nparms) = parm;
-    }
+    TREE_VEC_ELT (saved_parmlist, nparms) = parm;
 
   --processing_template_parmlist;
 
@@ -2227,7 +2208,8 @@ check_default_tmpl_args (decl, parms, is_primary, is_partial)
      int is_partial;
 {
   const char *msg;
-  int   last_level_to_check;
+  int last_level_to_check;
+  tree parm_level;
 
   /* [temp.param] 
 
@@ -2251,6 +2233,33 @@ check_default_tmpl_args (decl, parms, is_primary, is_partial)
        that the class is complete.  */
     return;
 
+  /* [temp.param]
+        
+     If a template-parameter has a default template-argument, all
+     subsequent template-parameters shall have a default
+     template-argument supplied.  */
+  for (parm_level = parms; parm_level; parm_level = TREE_CHAIN (parm_level))
+    {
+      tree inner_parms = TREE_VALUE (parm_level);
+      int ntparms = TREE_VEC_LENGTH (inner_parms);
+      int seen_def_arg_p = 0; 
+      int i;
+
+      for (i = 0; i < ntparms; ++i) 
+       {
+         tree parm = TREE_VEC_ELT (inner_parms, i);
+         if (TREE_PURPOSE (parm))
+           seen_def_arg_p = 1;
+         else if (seen_def_arg_p)
+           {
+             cp_error ("no default argument for `%D'", TREE_VALUE (parm));
+             /* For better subsequent error-recovery, we indicate that
+                there should have been a default argument.  */
+             TREE_PURPOSE (parm) = error_mark_node;
+           }
+       }
+    }
+
   if (TREE_CODE (decl) != TYPE_DECL || is_partial || !is_primary)
     /* For an ordinary class template, default template arguments are
        allowed at the innermost level, e.g.:
@@ -2293,11 +2302,13 @@ check_default_tmpl_args (decl, parms, is_primary, is_partial)
     /* Check everything.  */
     last_level_to_check = 0;
 
-  for (; parms && TMPL_PARMS_DEPTH (parms) >= last_level_to_check; 
-       parms = TREE_CHAIN (parms))
+  for (parm_level = parms; 
+       parm_level && TMPL_PARMS_DEPTH (parm_level) >= last_level_to_check; 
+       parm_level = TREE_CHAIN (parm_level))
     {
-      tree inner_parms = TREE_VALUE (parms);
-      int i, ntparms;
+      tree inner_parms = TREE_VALUE (parm_level);
+      int i;
+      int ntparms;
 
       ntparms = TREE_VEC_LENGTH (inner_parms);
       for (i = 0; i < ntparms; ++i) 
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/defarg11.C b/gcc/testsuite/g++.old-deja/g++.pt/defarg11.C
new file mode 100644 (file)
index 0000000..7026b76
--- /dev/null
@@ -0,0 +1,5 @@
+// Build don't link:
+// Origin: Jason Merrill <jason@cygnus.com>
+
+template <class T, class U = int> struct A;
+template <class T = int, class U> struct A;