From: Paolo Carlini Date: Thu, 14 Aug 2014 17:00:45 +0000 (+0000) Subject: re PR c++/54377 (Consider default arguments in "wrong number of template arguments... X-Git-Tag: releases/gcc-5.1.0~5485 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a62dbaa42ff655c35be270f91fb5f6323ff53b35;p=thirdparty%2Fgcc.git re PR c++/54377 (Consider default arguments in "wrong number of template arguments" diagnostic) /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. From-SVN: r213973 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b5d748c72042..06b004bae35d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +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 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index be16ca8a0c91..0f391c251f1e 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 7a28779ea6ba..d56f36a86941 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 0204f6454f4f..cf59a55eea16 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 1e048ef2c54e..7e52e93e219a 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 000000000000..07ebd092a084 --- /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 c1ca5e8a2687..65c79bda78d2 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 4d98e754639a..121bea234683 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 98c2ef6c18ac..38ddaf6d4ee3 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 000000000000..b85181749c12 --- /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 0f45c8c832e6..102fc357549d 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