aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/lambda.c
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-06-15 16:22:44 -0400
committerJason Merrill <jason@gcc.gnu.org>2018-06-15 16:22:44 -0400
commit582f844c6e30e59ac5641a04cfb7fdd1aff78c66 (patch)
treee8d7988ab646f3a4845371fd779e5edee4b9690b /gcc/cp/lambda.c
parent508f1cb51f5872f425a3d4eb3ab8bf5a76a692ac (diff)
downloadgcc-582f844c6e30e59ac5641a04cfb7fdd1aff78c66.zip
gcc-582f844c6e30e59ac5641a04cfb7fdd1aff78c66.tar.gz
gcc-582f844c6e30e59ac5641a04cfb7fdd1aff78c66.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: r261654
Diffstat (limited to 'gcc/cp/lambda.c')
-rw-r--r--gcc/cp/lambda.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c
index 231490f..3776d6b 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)
{