diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2014-08-14 17:00:45 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2014-08-14 17:00:45 +0000 |
commit | a62dbaa42ff655c35be270f91fb5f6323ff53b35 (patch) | |
tree | b38005767061ab9c8f7e9396cc851672bf018a4c /gcc | |
parent | 4875c29c86812d73c88b9bb16d5c2d5bc7259d4d (diff) | |
download | gcc-a62dbaa42ff655c35be270f91fb5f6323ff53b35.zip gcc-a62dbaa42ff655c35be270f91fb5f6323ff53b35.tar.gz gcc-a62dbaa42ff655c35be270f91fb5f6323ff53b35.tar.bz2 |
re PR c++/54377 (Consider default arguments in "wrong number of template arguments" diagnostic)
/cp
2014-08-14 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/54377
* pt.c (coerce_template_parms): Improve error message vs default
arguments.
/testsuite
2014-08-14 Paolo Carlini <paolo.carlini@oracle.com>
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 15 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/alias-decl-2.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/pr51226.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/pr54377.C | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/variadic2.C | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/too-many-tmpl-args1.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/dtor3.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/pr54377.C | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/qualttp4.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/spec28.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.brendan/crash8.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.pt/ttp7.C | 2 |
14 files changed, 56 insertions, 17 deletions
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 <paolo.carlini@oracle.com> + PR c++/54377 + * pt.c (coerce_template_parms): Improve error message vs default + arguments. + +2014-08-14 Paolo Carlini <paolo.carlini@oracle.com> + * 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 <paolo.carlini@oracle.com> + + 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 <tom@codesourcery.com> 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<class T> using Vec = Vector<T, Alloc<T> >; template<class T> void g(Vector<T, Alloc<T> >); -template<template<class T> class TT> void h(TT<int>); // { dg-error "provided for" } +template<template<class T> class TT> void h(TT<int>); // { 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<int> struct A // { dg-error "provided" } +template<int> 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 <typename, typename, typename = void, typename...> +struct foo {}; // { dg-message "provided for" } + +foo<int> 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<typename... = int> // { dg-error "default argument" } class tuple3; template<typename T1, typename T2, typename... Rest> -struct two_or_more {}; // { dg-error "provided for" } +struct two_or_more {}; // { dg-message "provided for" } -typedef two_or_more<int> bad; // { dg-error "2 or more" "2 or more" } +typedef two_or_more<int> 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 <bangerth@ticam.utexas.edu> // { dg-do compile } -template <typename T> class A // { dg-error "" } +template <typename T> class A // { dg-message "" } { struct B; template <typename U> friend typename A<U,void>::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<int> struct A { ~A(){} }; // { dg-error "" } +template<int> 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 <typename, typename, typename = void, typename = void> +struct foo {}; // { dg-message "provided for" } + +foo<int> 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 <class T> struct B {}; }; -template <template <class, class> class TT> // { dg-error "provided" } +template <template <class, class> class TT> // { dg-message "provided for" } struct X { TT<int> y; // { dg-error "number" } diff --git a/gcc/testsuite/g++.dg/template/spec28.C b/gcc/testsuite/g++.dg/template/spec28.C index f0bb22c..ef4b883 100644 --- a/gcc/testsuite/g++.dg/template/spec28.C +++ b/gcc/testsuite/g++.dg/template/spec28.C @@ -2,5 +2,5 @@ // Bad diagnostic // { dg-do compile } -template<typename> struct A {}; // { dg-error "provided" } +template<typename> struct A {}; // { dg-message "provided for" } template<> struct A<> {}; // { dg-error "wrong number" } diff --git a/gcc/testsuite/g++.old-deja/g++.brendan/crash8.C b/gcc/testsuite/g++.old-deja/g++.brendan/crash8.C index 4872083..14f11f6 100644 --- a/gcc/testsuite/g++.old-deja/g++.brendan/crash8.C +++ b/gcc/testsuite/g++.old-deja/g++.brendan/crash8.C @@ -1,7 +1,7 @@ // { dg-do compile } // GROUPS passed old-abort template<int a, int b> -class Elvis // { dg-error "class Elvis" } +class Elvis // { dg-message "class Elvis" } { } ; diff --git a/gcc/testsuite/g++.old-deja/g++.pt/ttp7.C b/gcc/testsuite/g++.old-deja/g++.pt/ttp7.C index 729452b..0a115c2 100644 --- a/gcc/testsuite/g++.old-deja/g++.pt/ttp7.C +++ b/gcc/testsuite/g++.old-deja/g++.pt/ttp7.C @@ -4,7 +4,7 @@ template<class E> class D { }; -template<template<class> class D,class E> class C // { dg-error "" } ref below +template<template<class> class D,class E> class C // { dg-message "" } ref below { D<int,int> d; // { dg-error "" } arg not match }; |