aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2013-06-26 22:35:39 -0400
committerJason Merrill <jason@gcc.gnu.org>2013-06-26 22:35:39 -0400
commit447cf5546fce5161b9dd532c2b27b3086b43a198 (patch)
treed1e89f09f1308526bc2f220bb5bba97fb6b40a74
parent412ec6cfb9785fc9c693be747fd29fac3fcf1f15 (diff)
downloadgcc-447cf5546fce5161b9dd532c2b27b3086b43a198.zip
gcc-447cf5546fce5161b9dd532c2b27b3086b43a198.tar.gz
gcc-447cf5546fce5161b9dd532c2b27b3086b43a198.tar.bz2
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
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/semantics.c1
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/vla9.C31
3 files changed, 38 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index bd82693..3be2f1e7 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2013-06-21 Jason Merrill <jason@redhat.com>
+
+ 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 0a460a4..4c76b80 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 0000000..ea5c4d8
--- /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<typename Callable>
+ struct Impl
+ {
+ Callable func;
+ Impl(Callable f) : func(f) { }
+ virtual void run() { func(); }
+ };
+
+template<typename Callable>
+void call(Callable f)
+ {
+ Impl<Callable>(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);
+}