Patchwork C++ PATCH for c++/47289 (ICE with pack expansion in decltype)

login
register
mail settings
Submitter Jason Merrill
Date Jan. 14, 2011, 9 p.m.
Message ID <4D30B969.6070804@redhat.com>
Download mbox | patch
Permalink /patch/79012/
State New
Headers show

Comments

Jason Merrill - Jan. 14, 2011, 9 p.m.
This ICE happened because we were failing to restore 
cp_unevaluated_operand on the error path in coerce_template_parms. 
Fixed by delaying the error return until we've done that.

Tested x86_64-pc-linux-gnu, applied to trunk.
commit c2c38f967275e2732f60ff5ae49c34be41a0ddb7
Author: Jason Merrill <jason@redhat.com>
Date:   Fri Jan 14 10:40:00 2011 -0500

    	PR c++/47289
    	* pt.c (coerce_template_parms): Fix error recovery.

Patch

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 54c1a59..16bd2a0 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -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, 
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic105.C b/gcc/testsuite/g++.dg/cpp0x/variadic105.C
new file mode 100644
index 0000000..24d7e15
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/variadic105.C
@@ -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 *-*-* } }
+}