aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-02-26 21:45:56 -0500
committerJason Merrill <jason@gcc.gnu.org>2018-02-26 21:45:56 -0500
commited75f594a9afd438bd652136f7606d32a7f1a515 (patch)
tree11cdc74796bb533461df6bb048a36a46159ea60a /gcc
parenta2444ce97021c7a1e9afe05d014435c4c6933659 (diff)
downloadgcc-ed75f594a9afd438bd652136f7606d32a7f1a515.zip
gcc-ed75f594a9afd438bd652136f7606d32a7f1a515.tar.gz
gcc-ed75f594a9afd438bd652136f7606d32a7f1a515.tar.bz2
PR c++/84560 - ICE capturing multi-dimensional VLA.
* tree.c (array_of_runtime_bound_p): False if the element is variably-modified. From-SVN: r258023
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/tree.c2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla2.C12
3 files changed, 18 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e346113..dd35f1b 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2018-02-26 Jason Merrill <jason@redhat.com>
+ PR c++/84560 - ICE capturing multi-dimensional VLA.
+ * tree.c (array_of_runtime_bound_p): False if the element is
+ variably-modified.
+
PR c++/84441 - ICE with base initialized from ?:
* call.c (unsafe_copy_elision_p): Handle COND_EXPR.
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index 41d9002..9b9e36a 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -1043,6 +1043,8 @@ array_of_runtime_bound_p (tree t)
{
if (!t || TREE_CODE (t) != ARRAY_TYPE)
return false;
+ if (variably_modified_type_p (TREE_TYPE (t), NULL_TREE))
+ return false;
tree dom = TYPE_DOMAIN (t);
if (!dom)
return false;
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla2.C
new file mode 100644
index 0000000..d4de131
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla2.C
@@ -0,0 +1,12 @@
+// PR c++/84560
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+void f() {
+ int n = 1;
+ int m = 1;
+ int d[n][m];
+ [&]() {
+ return d[1]; // { dg-error "variabl" }
+ }();
+}