diff options
author | Jason Merrill <jason@redhat.com> | 2013-05-10 10:17:30 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2013-05-10 10:17:30 -0400 |
commit | 5ced939e817428c45e51f8caa16db26a7d7168c6 (patch) | |
tree | 2ac5e103ad1302783fb5637466fda43a9c36c25d | |
parent | 29554d294af507fa469dbcbe3687007ea9fd0bc7 (diff) | |
download | gcc-5ced939e817428c45e51f8caa16db26a7d7168c6.zip gcc-5ced939e817428c45e51f8caa16db26a7d7168c6.tar.gz gcc-5ced939e817428c45e51f8caa16db26a7d7168c6.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 5 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/vla5.C | 8 |
4 files changed, 21 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8eefe32..ad7235a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2013-05-10 Jason Merrill <jason@redhat.com> + + 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 <jason@redhat.com> * 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 3e1a0bf..d0db10a 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 df5fc4a..b8ea555 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 0000000..1f6da29 --- /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" } +} |