Hi,
in this old (Jakub figured out it already existed in 2007!) ICE on
invalid, the problem happens in type_dependent_expression_p: the code
for unknown_type_node as TREE_TYPE of the expression doesn't handle
EXPR_PACK_EXPANSION as TREE_CODE.
It seems to me that we simply have to look inside the expression via
PACK_EXPANSION_PATTERN: in the testcase, for "bar<U> ..." as expression
the _PATTERN is a TEMPLATE_ID_EXPR which then is normally handled.
Tested x86_64-linux.
Thanks,
Paolo.
////////////////////
/cp
2013-10-06 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/56060
* pt.c (type_dependent_expression_p): Handle EXPR_PACK_EXPANSION.
/testsuite
2013-10-06 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/56060
* g++.dg/cpp0x/variadic144.C: New.
Index: cp/pt.c
===================================================================
--- cp/pt.c (revision 203219)
+++ cp/pt.c (working copy)
@@ -20405,6 +20405,8 @@ type_dependent_expression_p (tree expression)
if (BASELINK_P (expression))
expression = BASELINK_FUNCTIONS (expression);
+ else if (TREE_CODE (expression) == EXPR_PACK_EXPANSION)
+ expression = PACK_EXPANSION_PATTERN (expression);
if (TREE_CODE (expression) == TEMPLATE_ID_EXPR)
{
Index: testsuite/g++.dg/cpp0x/variadic144.C
===================================================================
--- testsuite/g++.dg/cpp0x/variadic144.C (revision 0)
+++ testsuite/g++.dg/cpp0x/variadic144.C (working copy)
@@ -0,0 +1,15 @@
+// PR c++/56060
+// { dg-do compile { target c++11 } }
+
+template<typename T> struct baz { };
+template<typename T> T bar();
+
+template<typename T, typename ... U>
+baz<decltype(bar<T>()(bar<U> ...))> // { dg-error "cannot be used" }
+foo();
+
+int main()
+{
+ foo<int>(); // { dg-error "no matching" }
+ return 0;
+}