Hi,
an ICE on invalid (per Daniel's analysis): when r is NULL_TREE the next
DECL_CONTEXT (r) can only crash. Plus a garbled error message because
pp_cxx_simple_type_specifier doesn't handle BOUND_TEMPLATE_TEMPLATE_PARM.
Tested x86_64-linux.
Thanks,
Paolo.
///////////////////////////
/cp
2012-05-11 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/53305
* pt.c (tsubst_copy: case PARM_DECL): Return error_mark_node if
tsubst_decl returns NULL_TREE.
* cxx-pretty-print.c (pp_cxx_simple_type_specifier): Handle
BOUND_TEMPLATE_TEMPLATE_PARM.
/testsuite
2012-05-11 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/53305
* g++.dg/cpp0x/variadic132.C: New.
Index: testsuite/g++.dg/cpp0x/variadic132.C
===================================================================
--- testsuite/g++.dg/cpp0x/variadic132.C (revision 0)
+++ testsuite/g++.dg/cpp0x/variadic132.C (revision 0)
@@ -0,0 +1,27 @@
+// PR c++/53305
+// { dg-do compile { target c++11 } }
+
+template<class... Ts> struct tuple { };
+
+struct funct
+{
+ template<class... argTs>
+ int operator()(argTs...);
+};
+
+template<class...> class test;
+
+template<template <class...> class tp,
+ class... arg1Ts, class... arg2Ts>
+class test<tp<arg1Ts...>, tp<arg2Ts...>>
+{
+ template<class func, class...arg3Ts>
+ auto test2(func fun, arg1Ts... arg1s, arg3Ts... arg3s)
+ -> decltype(fun(arg1s..., arg3s...));
+};
+
+int main()
+{
+ test<tuple<>, tuple<char,int>> t2;
+ t2.test2(funct(), 'a', 2); // { dg-error "no matching function" }
+}
Index: cp/cxx-pretty-print.c
===================================================================
--- cp/cxx-pretty-print.c (revision 187376)
+++ cp/cxx-pretty-print.c (working copy)
@@ -1261,6 +1261,7 @@ pp_cxx_simple_type_specifier (cxx_pretty_printer *
case TEMPLATE_TYPE_PARM:
case TEMPLATE_TEMPLATE_PARM:
case TEMPLATE_PARM_INDEX:
+ case BOUND_TEMPLATE_TEMPLATE_PARM:
pp_cxx_unqualified_id (pp, t);
break;
Index: cp/pt.c
===================================================================
--- cp/pt.c (revision 187376)
+++ cp/pt.c (working copy)
@@ -12084,6 +12084,8 @@ tsubst_copy (tree t, tree args, tsubst_flags_t com
not the following PARM_DECLs that are chained to T. */
c = copy_node (t);
r = tsubst_decl (c, args, complain);
+ if (!r)
+ return error_mark_node;
/* Give it the template pattern as its context; its true context
hasn't been instantiated yet and this is good enough for
mangling. */