/cp
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 14 Aug 2014 17:00:45 +0000 (17:00 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 14 Aug 2014 17:00:45 +0000 (17:00 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@213973 138bc75d-0d04-0410-961f-82ee72b054a4

14 files changed:
gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/alias-decl-2.C
gcc/testsuite/g++.dg/cpp0x/pr51226.C
gcc/testsuite/g++.dg/cpp0x/pr54377.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/variadic2.C
gcc/testsuite/g++.dg/parse/too-many-tmpl-args1.C
gcc/testsuite/g++.dg/template/dtor3.C
gcc/testsuite/g++.dg/template/pr54377.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/qualttp4.C
gcc/testsuite/g++.dg/template/spec28.C
gcc/testsuite/g++.old-deja/g++.brendan/crash8.C
gcc/testsuite/g++.old-deja/g++.pt/ttp7.C

index b5d748c..06b004b 100644 (file)
@@ -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.
 
index be16ca8..0f391c2 100644 (file)
@@ -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;
index 7a28779..d56f36a 100644 (file)
@@ -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
index 0204f64..cf59a55 100644 (file)
@@ -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()
index 1e048ef..7e52e93 100644 (file)
@@ -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 (file)
index 0000000..07ebd09
--- /dev/null
@@ -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" }
index c1ca5e8..65c79bd 100644 (file)
@@ -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()
 {
index 4d98e75..121bea2 100644 (file)
@@ -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 "" }
index 98c2ef6..38ddaf6 100644 (file)
@@ -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 (file)
index 0000000..b851817
--- /dev/null
@@ -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" }
index 0f45c8c..102fc35 100644 (file)
@@ -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" }
index f0bb22c..ef4b883 100644 (file)
@@ -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" }
index 4872083..14f11f6 100644 (file)
@@ -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" }
 {
 } ;
 
index 729452b..0a115c2 100644 (file)
@@ -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
 };