diff mbox series

[C++] PR c++/88394 - ICE with VLA init-capture.

Message ID 20190222024705.5665-1-jason@redhat.com
State New
Headers show
Series [C++] PR c++/88394 - ICE with VLA init-capture. | expand

Commit Message

Jason Merrill Feb. 22, 2019, 2:47 a.m. UTC
We mostly use is_normal_capture_proxy to decide whether or not to use
DECL_CAPTURED_VARIABLE; we could just check whether it's set.  VLA capture
is still mostly broken, but this fixes this ICE.

Tested x86_64-pc-linux-gnu, applying to trunk.

	* lambda.c (is_normal_capture_proxy): Check DECL_CAPTURED_VARIABLE.
---
 gcc/cp/lambda.c                               | 16 ++--------------
 gcc/testsuite/g++.dg/cpp1y/lambda-init-vla1.C | 12 ++++++++++++
 gcc/cp/ChangeLog                              |  3 +++
 3 files changed, 17 insertions(+), 14 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/cpp1y/lambda-init-vla1.C


base-commit: e2d4b8be24e405e8e789264c3c20767c2a7c7ab4
diff mbox series

Patch

diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c
index 3b803ad86a6..7032168fb7b 100644
--- a/gcc/cp/lambda.c
+++ b/gcc/cp/lambda.c
@@ -279,20 +279,8 @@  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)
-    return true;
-
-  if (TREE_CODE (val) == ADDR_EXPR)
-    val = TREE_OPERAND (val, 0);
-  gcc_assert (TREE_CODE (val) == COMPONENT_REF);
-  val = TREE_OPERAND (val, 1);
-  return DECL_NORMAL_CAPTURE_P (val);
+  return (DECL_LANG_SPECIFIC (decl)
+	  && DECL_CAPTURED_VARIABLE (decl));
 }
 
 /* Returns true iff DECL is a capture proxy for a normal capture
diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-init-vla1.C b/gcc/testsuite/g++.dg/cpp1y/lambda-init-vla1.C
new file mode 100644
index 00000000000..1fef7b4a7f9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/lambda-init-vla1.C
@@ -0,0 +1,12 @@ 
+// PR c++/88394
+// { dg-do compile { target c++14 } }
+// { dg-options "" }
+
+void crash_me(unsigned short sz)
+{
+  if (sz == 0) return;
+
+  short iov[sz];
+  auto fce = [&iv = iov](short value) { iv[0] = 0; };
+  fce(1);
+}
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 013bca59380..a41044683fe 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@ 
 2019-02-21  Jason Merrill  <jason@redhat.com>
 
+	PR c++/88394 - ICE with VLA init-capture.
+	* lambda.c (is_normal_capture_proxy): Check DECL_CAPTURED_VARIABLE.
+
 	PR c++/88869 - C++17 ICE with CTAD and explicit specialization.
 	* pt.c (do_class_deduction): Don't include explicit specialization
 	args in outer_args.