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

Reply via email to