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.
/* 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
--- /dev/null
+// 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);
+}