From e429bc3555e7c3cbbc3b03ee0dbf78b3b9a4c198 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 21 Feb 2014 09:01:20 -0500 Subject: [PATCH] re PR c++/60251 ([c++11] ICE capturing variable-length array) PR c++/60251 * lambda.c (is_normal_capture_proxy): Handle VLA capture. From-SVN: r207995 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/lambda.c | 4 ++++ gcc/testsuite/g++.dg/cpp1y/vla11.C | 8 ++++++++ 3 files changed, 15 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp1y/vla11.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index be248e1f400..e17576895ed 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2014-02-21 Jason Merrill + PR c++/60251 + * lambda.c (is_normal_capture_proxy): Handle VLA capture. + PR c++/60167 PR c++/60222 PR c++/58606 diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c index 8bb820d0c3b..ad993e9d392 100644 --- a/gcc/cp/lambda.c +++ b/gcc/cp/lambda.c @@ -250,6 +250,10 @@ is_normal_capture_proxy (tree decl) /* It's not a capture proxy. */ return false; + if (variably_modified_type_p (TREE_TYPE (decl), NULL_TREE)) + /* VLA capture. */ + return true; + /* It is a capture proxy, is it a normal capture? */ tree val = DECL_VALUE_EXPR (decl); if (val == error_mark_node) diff --git a/gcc/testsuite/g++.dg/cpp1y/vla11.C b/gcc/testsuite/g++.dg/cpp1y/vla11.C new file mode 100644 index 00000000000..c9cdadea7ec --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/vla11.C @@ -0,0 +1,8 @@ +// PR c++/60251 +// { dg-options "-std=c++1y -pedantic-errors" } + +void foo(int n) +{ + int x[n]; + [&x]() { decltype(x) y; }; // { dg-error "decltype of array of runtime bound" } +}