Fix PR c++/60033
authorabutcher <abutcher@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 8 Mar 2014 09:33:12 +0000 (09:33 +0000)
committerabutcher <abutcher@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 8 Mar 2014 09:33:12 +0000 (09:33 +0000)
PR c++/60033
* pt.c (tsubst_copy): When retrieving a capture pack from a generic
lambda, remove the lambda's own template argument list prior to fetching
the specialization.

PR c++/60033
* g++.dg/cpp1y/pr60033.C: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@208427 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 07ac2b2..b48bb47 100644 (file)
@@ -1,5 +1,10 @@
 2014-03-08  Adam Butcher  <adam@jessamine.co.uk>
 
+       PR c++/60033
+       * pt.c (tsubst_copy): When retrieving a capture pack from a generic
+       lambda, remove the lambda's own template argument list prior to fetching
+       the specialization.
+
        PR c++/60393
        * parser.c (cp_parser_parameter_declaration_clause): Move generic
        function template unwinding on error into a more general location, ...
index d4d54b8..5afe0fd 100644 (file)
@@ -12565,14 +12565,22 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
        {
          /* Check for a local specialization set up by
             tsubst_pack_expansion.  */
-         tree r = retrieve_local_specialization (t);
-         if (r)
+         if (tree r = retrieve_local_specialization (t))
            {
              if (TREE_CODE (r) == ARGUMENT_PACK_SELECT)
                r = ARGUMENT_PACK_SELECT_ARG (r);
              return r;
            }
 
+         /* 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.  */
+         if (LAMBDA_FUNCTION_P (current_function_decl)
+             && (template_class_depth (DECL_CONTEXT (t))
+                 != TMPL_ARGS_DEPTH (args)))
+           args = strip_innermost_template_args (args, 1);
+
          /* Otherwise return the full NONTYPE_ARGUMENT_PACK that
             tsubst_decl put in the hash table.  */
          return retrieve_specialization (t, args, 0);
index 9a0b752..f29b5a4 100644 (file)
@@ -1,5 +1,8 @@
 2014-03-08  Adam Butcher  <adam@jessamine.co.uk>
 
+       PR c++/60033
+       * g++.dg/cpp1y/pr60033.C: New testcase.
+
        PR c++/60393
        * g++.dg/cpp1y/pr60393.C: New testcase.
 
diff --git a/gcc/testsuite/g++.dg/cpp1y/pr60033.C b/gcc/testsuite/g++.dg/cpp1y/pr60033.C
new file mode 100644 (file)
index 0000000..8194bec
--- /dev/null
@@ -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;
+}