From 98ae66be2c78504d85159510c1caf6e11b94dbed Mon Sep 17 00:00:00 2001 From: paolo Date: Thu, 14 Aug 2014 17:00:45 +0000 Subject: [PATCH] /cp 2014-08-14 Paolo Carlini PR c++/54377 * pt.c (coerce_template_parms): Improve error message vs default arguments. /testsuite 2014-08-14 Paolo Carlini PR c++/54377 * g++.dg/template/pr54377.C: New. * g++.dg/cpp0x/pr54377.C: Likewise. * g++.dg/cpp0x/alias-decl-2.C: Adjust. * g++.dg/cpp0x/pr51226.C: Likewise. * g++.dg/cpp0x/variadic2.C: Likewise. * g++.dg/parse/too-many-tmpl-args1.C: Likewise. * g++.dg/template/dtor3.C: Likewise. * g++.dg/template/qualttp4.C: Likewise. * g++.dg/template/spec28.C: Likewise. * g++.old-deja/g++.brendan/crash8.C: Likewise. * g++.old-deja/g++.pt/ttp7.C: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@213973 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/pt.c | 19 ++++++++++++------- gcc/testsuite/ChangeLog | 15 +++++++++++++++ gcc/testsuite/g++.dg/cpp0x/alias-decl-2.C | 2 +- gcc/testsuite/g++.dg/cpp0x/pr51226.C | 2 +- gcc/testsuite/g++.dg/cpp0x/pr54377.C | 7 +++++++ gcc/testsuite/g++.dg/cpp0x/variadic2.C | 4 ++-- gcc/testsuite/g++.dg/parse/too-many-tmpl-args1.C | 2 +- gcc/testsuite/g++.dg/template/dtor3.C | 2 +- gcc/testsuite/g++.dg/template/pr54377.C | 6 ++++++ gcc/testsuite/g++.dg/template/qualttp4.C | 2 +- gcc/testsuite/g++.dg/template/spec28.C | 2 +- gcc/testsuite/g++.old-deja/g++.brendan/crash8.C | 2 +- gcc/testsuite/g++.old-deja/g++.pt/ttp7.C | 2 +- 14 files changed, 56 insertions(+), 17 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/pr54377.C create mode 100644 gcc/testsuite/g++.dg/template/pr54377.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b5d748c..06b004b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2014-08-14 Paolo Carlini + PR c++/54377 + * pt.c (coerce_template_parms): Improve error message vs default + arguments. + +2014-08-14 Paolo Carlini + * parser.c (cp_parser_init_declarator): Remove redundant check of decl_specifiers->type. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index be16ca8..0f391c2 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -6861,19 +6861,24 @@ coerce_template_parms (tree parms, int variadic_args_p = 0; int post_variadic_parms = 0; + /* Likewise for parameters with default arguments. */ + int default_p = 0; + if (args == error_mark_node) return error_mark_node; nparms = TREE_VEC_LENGTH (parms); - /* Determine if there are any parameter packs. */ + /* Determine if there are any parameter packs or default arguments. */ for (parm_idx = 0; parm_idx < nparms; ++parm_idx) { - tree tparm = TREE_VALUE (TREE_VEC_ELT (parms, parm_idx)); + tree parm = TREE_VEC_ELT (parms, parm_idx); if (variadic_p) ++post_variadic_parms; - if (template_parameter_pack_p (tparm)) + if (template_parameter_pack_p (TREE_VALUE (parm))) ++variadic_p; + if (TREE_PURPOSE (parm)) + ++default_p; } inner_args = orig_inner_args = INNERMOST_TEMPLATE_ARGS (args); @@ -6902,18 +6907,18 @@ coerce_template_parms (tree parms, { if (complain & tf_error) { - if (variadic_p) + if (variadic_p || default_p) { - nparms -= variadic_p; + nparms -= variadic_p + default_p; error ("wrong number of template arguments " - "(%d, should be %d or more)", nargs, nparms); + "(%d, should be at least %d)", nargs, nparms); } else error ("wrong number of template arguments " "(%d, should be %d)", nargs, nparms); if (in_decl) - error ("provided for %q+D", in_decl); + inform (input_location, "provided for %q+D", in_decl); } return error_mark_node; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7a28779..d56f36a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,18 @@ +2014-08-14 Paolo Carlini + + PR c++/54377 + * g++.dg/template/pr54377.C: New. + * g++.dg/cpp0x/pr54377.C: Likewise. + * g++.dg/cpp0x/alias-decl-2.C: Adjust. + * g++.dg/cpp0x/pr51226.C: Likewise. + * g++.dg/cpp0x/variadic2.C: Likewise. + * g++.dg/parse/too-many-tmpl-args1.C: Likewise. + * g++.dg/template/dtor3.C: Likewise. + * g++.dg/template/qualttp4.C: Likewise. + * g++.dg/template/spec28.C: Likewise. + * g++.old-deja/g++.brendan/crash8.C: Likewise. + * g++.old-deja/g++.pt/ttp7.C: Likewise. + 2014-08-14 Tom de Vries PR rtl-optimization/62004 diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-2.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-2.C index 0204f64..cf59a55 100644 --- a/gcc/testsuite/g++.dg/cpp0x/alias-decl-2.C +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-2.C @@ -22,7 +22,7 @@ template using Vec = Vector >; template void g(Vector >); -template class TT> void h(TT); // { dg-error "provided for" } +template class TT> void h(TT); // { dg-message "provided for" } void bar() diff --git a/gcc/testsuite/g++.dg/cpp0x/pr51226.C b/gcc/testsuite/g++.dg/cpp0x/pr51226.C index 1e048ef..7e52e93 100644 --- a/gcc/testsuite/g++.dg/cpp0x/pr51226.C +++ b/gcc/testsuite/g++.dg/cpp0x/pr51226.C @@ -1,7 +1,7 @@ // PR c++/51226 // { dg-do compile { target c++11 } } -template struct A // { dg-error "provided" } +template struct A // { dg-message "provided" } { enum E : int; }; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr54377.C b/gcc/testsuite/g++.dg/cpp0x/pr54377.C new file mode 100644 index 0000000..07ebd092 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr54377.C @@ -0,0 +1,7 @@ +// PR c++/54377 +// { dg-do compile { target c++11 } } + +template +struct foo {}; // { dg-message "provided for" } + +foo f; // { dg-error "at least 2" } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic2.C b/gcc/testsuite/g++.dg/cpp0x/variadic2.C index c1ca5e8..65c79bd 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic2.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic2.C @@ -6,9 +6,9 @@ template // { dg-error "default argument" } class tuple3; template -struct two_or_more {}; // { dg-error "provided for" } +struct two_or_more {}; // { dg-message "provided for" } -typedef two_or_more bad; // { dg-error "2 or more" "2 or more" } +typedef two_or_more bad; // { dg-error "at least 2" "at least 2" } void f() { diff --git a/gcc/testsuite/g++.dg/parse/too-many-tmpl-args1.C b/gcc/testsuite/g++.dg/parse/too-many-tmpl-args1.C index 4d98e75..121bea2 100644 --- a/gcc/testsuite/g++.dg/parse/too-many-tmpl-args1.C +++ b/gcc/testsuite/g++.dg/parse/too-many-tmpl-args1.C @@ -2,7 +2,7 @@ // Origin: Wolfgang Bangerth // { dg-do compile } -template class A // { dg-error "" } +template class A // { dg-message "" } { struct B; template friend typename A::B foo(); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/template/dtor3.C b/gcc/testsuite/g++.dg/template/dtor3.C index 98c2ef6..38ddaf6 100644 --- a/gcc/testsuite/g++.dg/template/dtor3.C +++ b/gcc/testsuite/g++.dg/template/dtor3.C @@ -1,4 +1,4 @@ // PR c++/19762 -template struct A { ~A(){} }; // { dg-error "" } +template struct A { ~A(){} }; // { dg-message "provided for" } template A<>::~A(); // { dg-error "template|declaration" } diff --git a/gcc/testsuite/g++.dg/template/pr54377.C b/gcc/testsuite/g++.dg/template/pr54377.C new file mode 100644 index 0000000..b851817 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr54377.C @@ -0,0 +1,6 @@ +// PR c++/54377 + +template +struct foo {}; // { dg-message "provided for" } + +foo f; // { dg-error "at least 2" } diff --git a/gcc/testsuite/g++.dg/template/qualttp4.C b/gcc/testsuite/g++.dg/template/qualttp4.C index 0f45c8c..102fc35 100644 --- a/gcc/testsuite/g++.dg/template/qualttp4.C +++ b/gcc/testsuite/g++.dg/template/qualttp4.C @@ -7,7 +7,7 @@ struct A template struct B {}; }; -template