From 5ced939e817428c45e51f8caa16db26a7d7168c6 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 10 May 2013 10:17:30 -0400 Subject: [PATCH] re PR c++/55149 (capturing VLA in lambda) PR c++/55149 * semantics.c (add_capture): Error rather than abort on copy capture of VLA. * typeck.c (maybe_warn_about_returning_address_of_local): Don't warn about capture proxy. From-SVN: r198776 --- gcc/cp/ChangeLog | 8 ++++++++ gcc/cp/semantics.c | 5 ++++- gcc/cp/typeck.c | 1 + gcc/testsuite/g++.dg/cpp1y/vla5.C | 8 ++++++++ 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp1y/vla5.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8eefe328602..ad7235a6e75 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2013-05-10 Jason Merrill + + PR c++/55149 + * semantics.c (add_capture): Error rather than abort on copy + capture of VLA. + * typeck.c (maybe_warn_about_returning_address_of_local): Don't + warn about capture proxy. + 2013-05-09 Jason Merrill * decl.c (cp_finish_decl): Only check VLA bound in C++1y mode. diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 3e1a0bf281d..d0db10a03b7 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -9463,9 +9463,12 @@ add_capture (tree lambda, tree id, tree initializer, bool by_reference_p, type = lambda_capture_field_type (initializer, explicit_init_p); if (array_of_runtime_bound_p (type)) { + if (!by_reference_p) + error ("array of runtime bound cannot be captured by copy, " + "only by reference"); + /* For a VLA, we capture the address of the first element and the maximum index, and then reconstruct the VLA for the proxy. */ - gcc_assert (by_reference_p); tree elt = cp_build_array_ref (input_location, initializer, integer_zero_node, tf_warning_or_error); tree ctype = vla_capture_type (type); diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index df5fc4a880a..b8ea5551353 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -8140,6 +8140,7 @@ maybe_warn_about_returning_address_of_local (tree retval) if (DECL_P (whats_returned) && DECL_NAME (whats_returned) && DECL_FUNCTION_SCOPE_P (whats_returned) + && !is_capture_proxy (whats_returned) && !(TREE_STATIC (whats_returned) || TREE_PUBLIC (whats_returned))) { diff --git a/gcc/testsuite/g++.dg/cpp1y/vla5.C b/gcc/testsuite/g++.dg/cpp1y/vla5.C new file mode 100644 index 00000000000..1f6da290487 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/vla5.C @@ -0,0 +1,8 @@ +// PR c++/55149 +// { dg-options -std=c++1y } + +void test(int n) { + int r[n]; + [&r]() { return r + 0; }; + [r]() { return r + 0; }; // { dg-error "captured by copy" } +} -- 2.30.2