From ed75f594a9afd438bd652136f7606d32a7f1a515 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 26 Feb 2018 21:45:56 -0500 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/tree.c | 2 ++ gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla2.C | 12 ++++++++++++ 3 files changed, 18 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e34611324c4..dd35f1bda52 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2018-02-26 Jason Merrill + 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 41d9002d8f9..9b9e36a1173 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 00000000000..d4de131fc23 --- /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" } + }(); +} -- 2.30.2