sizeof a VLA type is not a constant in C or the GNU C++ extension, so we need to capture the VLA even in unevaluated context. For PR60855 we stopped looking through a previous capture, but we also need to capture the first time the variable is mentioned.
Tested x86_64-pc-linux-gnu, applying to trunk. PR c++/86216 * semantics.c (process_outer_var_ref): Capture VLAs even in unevaluated context. --- gcc/cp/semantics.c | 11 +++++++++-- gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla5.C | 13 +++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla5.C diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index a489e2cf399..90f1e18e48a 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -3524,8 +3524,15 @@ tree process_outer_var_ref (tree decl, tsubst_flags_t complain, bool odr_use) { if (cp_unevaluated_operand) - /* It's not a use (3.2) if we're in an unevaluated context. */ - return decl; + { + tree type = TREE_TYPE (decl); + if (!dependent_type_p (type) + && variably_modified_type_p (type, NULL_TREE)) + /* VLAs are used even in unevaluated context. */; + else + /* It's not a use (3.2) if we're in an unevaluated context. */ + return decl; + } if (decl == error_mark_node) return decl; diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla5.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla5.C new file mode 100644 index 00000000000..f3390b2d09f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla5.C @@ -0,0 +1,13 @@ +// PR c++/86216 +// { dg-do compile { target c++11 } } +// { dg-additional-options -Wno-vla } + +template <typename T> void b(int n, T arg) { + int buffer[arg]; + int buffer2[arg][arg]; + [&] { + n = sizeof(buffer); + n = sizeof(buffer2); // { dg-bogus "sorry" "" { xfail *-*-* } } + }(); +} +int main() { b(2, 3); } base-commit: e98ebda074bf8fc5f630a93085af81f52437d851 -- 2.18.1