From a0a6a8c9662c1aeae0d1c2a63bc45a0a8242b43b Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 3 Mar 2016 20:45:48 -0500 Subject: [PATCH] pt.c (tsubst_copy_and_build): Get LAMBDA_EXPR_RETURN_TYPE from the instantiated closure. * pt.c (tsubst_copy_and_build) [LAMBDA_EXPR]: Get LAMBDA_EXPR_RETURN_TYPE from the instantiated closure. From-SVN: r233955 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/pt.c | 5 +++-- .../g++.dg/cpp1y/lambda-generic-trailing1.C | 12 ++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1y/lambda-generic-trailing1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e68382c3440c..2785135c8c71 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2016-03-03 Jason Merrill + * pt.c (tsubst_copy_and_build) [LAMBDA_EXPR]: Get + LAMBDA_EXPR_RETURN_TYPE from the instantiated closure. + PR c++/67164 * pt.c (copy_template_args): New. (tsubst_pack_expansion): Use it. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index c5b92013830b..e8cd7367f563 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -17103,8 +17103,6 @@ tsubst_copy_and_build (tree t, else gcc_unreachable (); LAMBDA_EXPR_EXTRA_SCOPE (r) = scope; - LAMBDA_EXPR_RETURN_TYPE (r) - = tsubst (LAMBDA_EXPR_RETURN_TYPE (t), args, complain, in_decl); gcc_assert (LAMBDA_EXPR_THIS_CAPTURE (t) == NULL_TREE && LAMBDA_EXPR_PENDING_PROXIES (t) == NULL); @@ -17115,6 +17113,9 @@ tsubst_copy_and_build (tree t, declaration of the op() for later calls to lambda_function. */ complete_type (type); + if (tree fn = lambda_function (type)) + LAMBDA_EXPR_RETURN_TYPE (r) = TREE_TYPE (TREE_TYPE (fn)); + LAMBDA_EXPR_THIS_CAPTURE (r) = NULL_TREE; insert_pending_capture_proxies (); diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-trailing1.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-trailing1.C new file mode 100644 index 000000000000..96755b11fd8e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-trailing1.C @@ -0,0 +1,12 @@ +// { dg-do compile { target c++14 } } + +template +void f() +{ + auto lam = [](auto a)->decltype(++a) { return a; }; +} + +int main() +{ + f(); +} -- 2.47.2