diff options
author | Jason Merrill <jason@redhat.com> | 2019-02-01 23:21:06 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2019-02-01 23:21:06 -0500 |
commit | 01826160a3b2ab2f0c68c13b47d3467cf9618fbb (patch) | |
tree | f43a172424c629efa3b5e3ec06700600994e6184 /gcc/cp/lambda.c | |
parent | fde81c6f70a7bdae57e7d5a7bb0ecae760ac9b5d (diff) | |
download | gcc-01826160a3b2ab2f0c68c13b47d3467cf9618fbb.zip gcc-01826160a3b2ab2f0c68c13b47d3467cf9618fbb.tar.gz gcc-01826160a3b2ab2f0c68c13b47d3467cf9618fbb.tar.bz2 |
PR c++/88761 - ICE with reference capture of constant.
Here, we capture nf, then the use of the proxy decays to a constant during
semantic processing of +nf. Since we saw some decay from proxy to constant,
we walk through the lambda body to see which proxies are still used, but we
weren't walking into subtrees of DECL_EXPR at all, so we missed the use of
&nf in the initializer of y, and removed the capture. But then at
instantiation time we try to use nf, don't have a proxy anymore, and ICE.
* lambda.c (mark_const_cap_r): Do walk subtrees of DECL_EXPR for
non-proxy decls.
From-SVN: r268471
Diffstat (limited to 'gcc/cp/lambda.c')
-rw-r--r-- | gcc/cp/lambda.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c index 4b7a358..c31b06e 100644 --- a/gcc/cp/lambda.c +++ b/gcc/cp/lambda.c @@ -1488,8 +1488,10 @@ mark_const_cap_r (tree *t, int *walk_subtrees, void *data) { tree decl = DECL_EXPR_DECL (*t); if (is_constant_capture_proxy (decl)) - var = DECL_CAPTURED_VARIABLE (decl); - *walk_subtrees = 0; + { + var = DECL_CAPTURED_VARIABLE (decl); + *walk_subtrees = 0; + } } else if (is_constant_capture_proxy (*t)) var = DECL_CAPTURED_VARIABLE (*t); |