From: Mark Mitchell Date: Mon, 19 Jul 1999 19:28:19 +0000 (+0000) Subject: pt.c (check_default_tmpl_args): Move test for missing default arguments here, from ... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=66191c20ee094395d51eaa90465bfb4b4d23eb8c;p=gcc.git pt.c (check_default_tmpl_args): Move test for missing default arguments here, from ... * pt.c (check_default_tmpl_args): Move test for missing default arguments here, from ... (end_template_parm_list): Here. From-SVN: r28180 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b7f0458c245..f7cce486e6d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +1999-07-19 Mark Mitchell + + * pt.c (check_default_tmpl_args): Move test for missing default + arguments here, from ... + (end_template_parm_list): Here. + 1999-07-18 Mark Mitchell * decl.c (lookup_nested_type): Remove. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 6106852922e..bb48cc83203 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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 index 00000000000..7026b765567 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/defarg11.C @@ -0,0 +1,5 @@ +// Build don't link: +// Origin: Jason Merrill + +template struct A; +template struct A;