aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/lambda.c
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2019-02-01 23:21:06 -0500
committerJason Merrill <jason@gcc.gnu.org>2019-02-01 23:21:06 -0500
commit01826160a3b2ab2f0c68c13b47d3467cf9618fbb (patch)
treef43a172424c629efa3b5e3ec06700600994e6184 /gcc/cp/lambda.c
parentfde81c6f70a7bdae57e7d5a7bb0ecae760ac9b5d (diff)
downloadgcc-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.c6
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);