aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/lambda.c16
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/lambda-init-vla1.C12
3 files changed, 17 insertions, 14 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 013bca5..a410446 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.
diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c
index 3b803ad..7032168 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 0000000..1fef7b4
--- /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);
+}