diff options
author | Jason Merrill <jason@redhat.com> | 2013-07-09 13:56:43 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2013-07-09 13:56:43 -0400 |
commit | d9fac9dd59fa8f8d646c98d21f6c874f11e608b5 (patch) | |
tree | 1550a242e2ba58b3499836790955b38bc436b060 | |
parent | f9f91ddcf76a01b80f8b194f7402aedc40e8af79 (diff) | |
download | gcc-d9fac9dd59fa8f8d646c98d21f6c874f11e608b5.zip gcc-d9fac9dd59fa8f8d646c98d21f6c874f11e608b5.tar.gz gcc-d9fac9dd59fa8f8d646c98d21f6c874f11e608b5.tar.bz2 |
re PR c++/57526 (use of X before deduction of auto error for seemingly good code)
PR c++/57526
* semantics.c (lambda_capture_field_type): Build a DECLTYPE_TYPE
if the variable type uses 'auto'.
From-SVN: r200844
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto3.C | 24 |
3 files changed, 29 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 68c6a09..9770f5b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2013-07-09 Jason Merrill <jason@redhat.com> + PR c++/57526 + * semantics.c (lambda_capture_field_type): Build a DECLTYPE_TYPE + if the variable type uses 'auto'. + PR c++/57437 * typeck.c (check_return_expr): Lambda proxies aren't eligible for nrv or return by move. diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index e06ac61..fd6c819 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -9177,7 +9177,7 @@ lambda_capture_field_type (tree expr, bool explicit_init_p) } else type = non_reference (unlowered_expr_type (expr)); - if (!type || WILDCARD_TYPE_P (type)) + if (!type || WILDCARD_TYPE_P (type) || type_uses_auto (type)) { type = cxx_make_type (DECLTYPE_TYPE); DECLTYPE_TYPE_EXPR (type) = expr; diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto3.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto3.C new file mode 100644 index 0000000..013ed52 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto3.C @@ -0,0 +1,24 @@ +// PR c++/57526 +// { dg-require-effective-target c++11 } + +template<class T> +struct A +{ + void bar( ) { } + + void foo( ) + { + auto* this_ptr = this; + auto lc = [&]( ) + { + this_ptr->bar(); + }; + lc(); + } +}; + +int main() +{ + A<int> a; + a.foo(); +} |