aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/pt.c12
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/pr60033.C20
4 files changed, 38 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 07ac2b2..b48bb47d 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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, ...
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index d4d54b8..5afe0fd 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9a0b752..f29b5a4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..8194bec
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/pr60033.C
@@ -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;
+}