From: Jason Merrill Date: Fri, 10 May 2013 14:17:30 +0000 (-0400) Subject: re PR c++/55149 (capturing VLA in lambda) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5ced939e817428c45e51f8caa16db26a7d7168c6;p=gcc.git 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 --- 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" } +}