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

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.

	* lambda.c (is_normal_capture_proxy): Check DECL_CAPTURED_VARIABLE.

From-SVN: r269094
This commit is contained in:
Jason Merrill 2019-02-21 21:47:33 -05:00 committed by Jason Merrill
parent c8b7e64d36
commit d36b4bf752
3 changed files with 17 additions and 14 deletions

View File

@ -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.

View File

@ -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

View File

@ -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);
}