@@ -1031,6 +1031,17 @@ retrieve_specialization (tree tmpl, tree args, hashval_t hash)
gcc_assert (TREE_CODE (tmpl) == TEMPLATE_DECL
|| TREE_CODE (tmpl) == FIELD_DECL);
+ /* When retrieving a capture pack from a generic lambda, remove the lambda
+ call op's own template argument list from ARGS. Only the template
+ arguments active for the closure type should be used to retrieve the pack
+ specialization.
+ XXX: It may be that this situation can be avoided by manipulating the field
+ XXX: type earlier. */
+ if (TREE_CODE (tmpl) == FIELD_DECL
+ && LAMBDA_FUNCTION_P (current_function_decl)
+ && template_class_depth (DECL_CONTEXT (tmpl)) != TMPL_ARGS_DEPTH (args))
+ args = strip_innermost_template_args (args, 1);
+
/* There should be as many levels of arguments as there are
levels of parameters. */
gcc_assert (TMPL_ARGS_DEPTH (args)
new file mode 100644
@@ -0,0 +1,20 @@
+// PR c++/60033
+// { dg-options -std=c++1y }
+
+template <typename... T>
+auto f(T&&... ts)
+{
+ return sizeof...(ts);
+}
+
+template <typename... T>
+auto g(T&&... ts) {
+ return [&] (auto v) {
+ return f(ts...);
+ };
+}
+
+int main()
+{
+ return g(1,2,3,4)(5) == 4 ? 0 : 1;
+}