diff options
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/pt.c | 33 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.oliva/template6.C | 4 |
3 files changed, 36 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fdc4b70c348..090fc8620ad 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +1999-07-17 Mark Mitchell <mark@codesourcery.com> + + * pt.c (determine_specialization): Tighten error-checking. + (end_template_parm_list): Likewise. + 1999-07-14 Mark Mitchell <mark@codesourcery.com> * pt.c (check_default_tmpl_args): Handle friends defined in the diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 00e17be096b..6106852922e 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -974,9 +974,15 @@ determine_specialization (template_id, decl, targs_out, return error_mark_node; /* Check for baselinks. */ - if (TREE_CODE (fns) == TREE_LIST) + if (BASELINK_P (fns)) fns = TREE_VALUE (fns); + if (!is_overloaded_fn (fns)) + { + cp_error ("`%D' is not a function template", fn); + return error_mark_node; + } + for (; fns; fns = OVL_NEXT (fns)) { tree tmpl; @@ -1851,13 +1857,34 @@ 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), saved_parmlist, current_template_parms); - for (parm = parms, nparms = 0; parm; parm = TREE_CHAIN (parm), nparms++) - TREE_VEC_ELT (saved_parmlist, nparms) = parm; + 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; + } --processing_template_parmlist; diff --git a/gcc/testsuite/g++.old-deja/g++.oliva/template6.C b/gcc/testsuite/g++.old-deja/g++.oliva/template6.C index 3902d5d6b59..159f190462d 100644 --- a/gcc/testsuite/g++.old-deja/g++.oliva/template6.C +++ b/gcc/testsuite/g++.old-deja/g++.oliva/template6.C @@ -5,7 +5,5 @@ // by Alexandre Oliva <oliva@dcc.unicamp.br> // simplified from bug report by Meenaradchagan Vishnu <mvishnu@fore.com> -// crash test - XFAIL *-*-* - template <typename> struct foo {}; -template <> void foo(); +template <> void foo(); // ERROR - bad specialization |