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:
parent
c8b7e64d36
commit
d36b4bf752
@ -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.
|
||||
|
@ -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
|
||||
|
12
gcc/testsuite/g++.dg/cpp1y/lambda-init-vla1.C
Normal file
12
gcc/testsuite/g++.dg/cpp1y/lambda-init-vla1.C
Normal 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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user