From: Jason Merrill Date: Fri, 4 Mar 2016 01:45:48 +0000 (-0500) Subject: pt.c (tsubst_copy_and_build): Get LAMBDA_EXPR_RETURN_TYPE from the instantiated closure. X-Git-Tag: basepoints/gcc-7~598 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a0a6a8c9662c1aeae0d1c2a63bc45a0a8242b43b;p=thirdparty%2Fgcc.git 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 --- 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(); +}