From 447cf5546fce5161b9dd532c2b27b3086b43a198 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 26 Jun 2013 22:35:39 -0400 Subject: [PATCH] re PR c++/57408 (lambda, Variable length arrays, thread, internal compiler error: in expand_expr_real_1, at expr.c:9327) PR c++/57408 * semantics.c (add_capture): Set type to error_mark_node after error. From-SVN: r200449 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/semantics.c | 1 + gcc/testsuite/g++.dg/cpp1y/vla9.C | 31 +++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp1y/vla9.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index bd82693722c..3be2f1e715d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2013-06-21 Jason Merrill + + PR c++/57408 + * semantics.c (add_capture): Set type to error_mark_node after + error. + 2013-06-25 Ed Smith-Rowland <3dw4rd@verizon.net> PR c++/57640 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 0a460a42544..4c76b80d0cd 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -9521,6 +9521,7 @@ add_capture (tree lambda, tree id, tree initializer, bool by_reference_p, && variably_modified_type_p (TREE_TYPE (type), NULL_TREE)) inform (input_location, "because the array element type %qT has " "variable size", TREE_TYPE (type)); + type = error_mark_node; } else if (by_reference_p) { diff --git a/gcc/testsuite/g++.dg/cpp1y/vla9.C b/gcc/testsuite/g++.dg/cpp1y/vla9.C new file mode 100644 index 00000000000..ea5c4d8eedb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/vla9.C @@ -0,0 +1,31 @@ +// PR c++/57408 +// { dg-options "-std=c++1y -pedantic-errors" } + +template + struct Impl + { + Callable func; + Impl(Callable f) : func(f) { } + virtual void run() { func(); } + }; + +template +void call(Callable f) + { + Impl(f).run(); + } + +extern "C" int printf(const char*, ...); + +int main(){ + int y = 2; + float fa[2][y]; // { dg-error "array of array of runtime bound" } + fa[0][0]=0.8; + fa[0][1]=1.8; + auto fx=[&](){ + for(int c=0; c<2; c++){ + printf("use me", fa[0][c]); // { dg-error "capture of variable-size type" } + } + }; + call(fx); +}