diff options
author | Jason Merrill <jason@redhat.com> | 2018-06-15 16:23:13 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2018-06-15 16:23:13 -0400 |
commit | 81e209fa51aba11027ed457d7f28e87a6f3d9151 (patch) | |
tree | d679e78c56194c12032e733fefb066e82e9581d3 /gcc/cp/lambda.c | |
parent | a0df74de13ca559f2085f758c377636b18355c1f (diff) | |
download | gcc-81e209fa51aba11027ed457d7f28e87a6f3d9151.zip gcc-81e209fa51aba11027ed457d7f28e87a6f3d9151.tar.gz gcc-81e209fa51aba11027ed457d7f28e87a6f3d9151.tar.bz2 |
PR c++/82882 - ICE with lambda in template default argument.
* lambda.c (record_null_lambda_scope): New.
* pt.c (tsubst_lambda_expr): Use it.
* name-lookup.c (do_pushtag): Don't give a lambda DECL_CONTEXT of a
function that isn't open.
From-SVN: r261658
Diffstat (limited to 'gcc/cp/lambda.c')
-rw-r--r-- | gcc/cp/lambda.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c index 9190b6e..4dbda5b 100644 --- a/gcc/cp/lambda.c +++ b/gcc/cp/lambda.c @@ -1380,6 +1380,24 @@ record_lambda_scope (tree lambda) LAMBDA_EXPR_DISCRIMINATOR (lambda) = lambda_count++; } +/* This lambda is an instantiation of a lambda in a template default argument + that got no LAMBDA_EXPR_EXTRA_SCOPE, so this shouldn't either. But we do + need to use and increment the global count to avoid collisions. */ + +void +record_null_lambda_scope (tree lambda) +{ + if (vec_safe_is_empty (lambda_scope_stack)) + record_lambda_scope (lambda); + else + { + tree_int *p = lambda_scope_stack->begin(); + LAMBDA_EXPR_EXTRA_SCOPE (lambda) = p->t; + LAMBDA_EXPR_DISCRIMINATOR (lambda) = p->i++; + } + gcc_assert (LAMBDA_EXPR_EXTRA_SCOPE (lambda) == NULL_TREE); +} + void finish_lambda_scope (void) { |