re PR c++/47289 ([C++0x] ICE in tsubst_pack_expansion (triggered by decltype))
authorJason Merrill <jason@redhat.com>
Fri, 14 Jan 2011 21:26:47 +0000 (16:26 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 14 Jan 2011 21:26:47 +0000 (16:26 -0500)
PR c++/47289
* pt.c (coerce_template_parms): Fix error recovery.

From-SVN: r168822

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/variadic105.C [new file with mode: 0644]

index 428ec29b107a53bffd6b454a0cf6d8cc16ba1da7..22f5bf095b38204997baac2f2d9e614ca89ef0bf 100644 (file)
@@ -1,5 +1,8 @@
 2011-01-14  Jason Merrill  <jason@redhat.com>
 
+       PR c++/47289
+       * pt.c (coerce_template_parms): Fix error recovery.
+
        PR c++/46903
        * typeck2.c (check_narrowing): Only check arithmetic types.
 
index 54c1a59a5eb4978e1fcd50a6852c8b1541519809..16bd2a0b88eed0cc41c96bbb0cc4e5b2a3181020 100644 (file)
@@ -6410,7 +6410,7 @@ coerce_template_parms (tree parms,
                    sorry ("cannot expand %<%T%> into a fixed-length "
                           "argument list", arg);
                }
-             return error_mark_node;
+             ++lost;
             }
         }
       else if (require_all_args)
@@ -6438,7 +6438,7 @@ coerce_template_parms (tree parms,
            reported) that we are trying to recover from, e.g., a class
            template with a parameter list such as
            template<typename..., typename>.  */
-        return error_mark_node;
+       ++lost;
       else
        arg = convert_template_argument (TREE_VALUE (parm),
                                         arg, new_args, complain, 
index b5cbdf5c02f909437e4e586db3d08b9eebaaa6ea..ae33ad55fa2f03c500af2cbd44a6d66c5463375c 100644 (file)
@@ -1,3 +1,7 @@
+2011-01-14  Jason Merrill  <jason@redhat.com>
+
+       * g++.dg/cpp0x/variadic105.C: New.
+
 2011-01-08  Dominique d'Humieres  <dominiq@lps.ens.fr>
            Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic105.C b/gcc/testsuite/g++.dg/cpp0x/variadic105.C
new file mode 100644 (file)
index 0000000..24d7e15
--- /dev/null
@@ -0,0 +1,24 @@
+// PR c++/47289
+// { dg-options -std=c++0x }
+// { dg-prune-output "note" }
+
+template <template <typename... __ARGS> class _F, typename... _ARGS>
+auto reverse (_ARGS... args) -> decltype(_F<_ARGS...>::call_function(args...)) {
+  return _F<_ARGS...>::call_function(args...);
+}
+
+template <typename _T>
+_T sum(_T x) { return x; }
+
+template <typename _T, typename... _ARGS>
+_T sum(_T x, _ARGS... args) { return x + sum(args...); }
+
+template <typename _T, typename... _ARGS>
+struct call_sum {
+  static _T call_function(_T x1, _ARGS... args) { return sum(x1, args...); }
+};
+
+int main() {
+  // This shouldn't be an error; this is bug 35722.
+  reverse<call_sum>(1,2);      // { dg-bogus "no match" "" { xfail *-*-* } }
+}