From a2a5f18ea792acb01cf1ae24e94d9ad0daf3acca Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 11 Apr 2013 12:49:57 -0400 Subject: re PR c++/56901 (lambda with implicit capture by reference) PR c++/56901 * semantics.c (lambda_capture_field_type, lambda_proxy_type): Strip references before checking WILDCARD_TYPE_P. From-SVN: r197819 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/semantics.c | 8 +++----- gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto2.C | 16 ++++++++++++++++ 3 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e6670b2..e2cf1b4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2013-04-11 Jason Merrill + + PR c++/56901 + * semantics.c (lambda_capture_field_type, lambda_proxy_type): + Strip references before checking WILDCARD_TYPE_P. + 2013-04-11 Paolo Carlini * call.c (build_conditional_expr_1, build_over_call): Protect diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 3a558b0..0631833 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -9114,16 +9114,14 @@ lambda_function (tree lambda) tree lambda_capture_field_type (tree expr) { - tree type; - if (!TREE_TYPE (expr) || WILDCARD_TYPE_P (TREE_TYPE (expr))) + tree type = non_reference (unlowered_expr_type (expr)); + if (!type || WILDCARD_TYPE_P (type)) { type = cxx_make_type (DECLTYPE_TYPE); DECLTYPE_TYPE_EXPR (type) = expr; DECLTYPE_FOR_LAMBDA_CAPTURE (type) = true; SET_TYPE_STRUCTURAL_EQUALITY (type); } - else - type = non_reference (unlowered_expr_type (expr)); return type; } @@ -9324,7 +9322,7 @@ lambda_proxy_type (tree ref) if (REFERENCE_REF_P (ref)) ref = TREE_OPERAND (ref, 0); type = TREE_TYPE (ref); - if (type && !WILDCARD_TYPE_P (type)) + if (type && !WILDCARD_TYPE_P (non_reference (type))) return type; type = cxx_make_type (DECLTYPE_TYPE); DECLTYPE_TYPE_EXPR (type) = ref; diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto2.C new file mode 100644 index 0000000..05fadf5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto2.C @@ -0,0 +1,16 @@ +// PR c++/56901 +// { dg-require-effective-target c++11 } + +template +void foo_impl() +{ + int data; + auto L = [&](){ return data; }; + [&](){ L(); }(); + [&L](){ L(); }(); +} + +void foo() +{ + foo_impl(); +} -- cgit v1.1