From ab5f26bba1270e16317188fe1070df05ab89bb00 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 26 Feb 2018 21:44:26 -0500 Subject: [PATCH] PR c++/84520 - ICE with generic lambda in NSDMI. * lambda.c (lambda_expr_this_capture): Don't look for fake NSDMI 'this' in a generic lambda instantiation. From-SVN: r258021 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/lambda.c | 5 ++++- gcc/testsuite/g++.dg/cpp1y/lambda-generic-nsdmi1.C | 8 ++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp1y/lambda-generic-nsdmi1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3a2a17d5720..fe5c7864f3a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2018-02-26 Jason Merrill + PR c++/84520 - ICE with generic lambda in NSDMI. + * lambda.c (lambda_expr_this_capture): Don't look for fake NSDMI + 'this' in a generic lambda instantiation. + PR c++/84559 - ICE with constexpr VLA. * constexpr.c (ensure_literal_type_for_constexpr_object): Check for constexpr variable with VLA type. diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c index 6a798266f12..3f77df037a2 100644 --- a/gcc/cp/lambda.c +++ b/gcc/cp/lambda.c @@ -758,11 +758,14 @@ lambda_expr_this_capture (tree lambda, bool add_capture_p) lambda_stack); if (LAMBDA_EXPR_EXTRA_SCOPE (tlambda) + && !COMPLETE_TYPE_P (LAMBDA_EXPR_CLOSURE (tlambda)) && TREE_CODE (LAMBDA_EXPR_EXTRA_SCOPE (tlambda)) == FIELD_DECL) { /* In an NSDMI, we don't have a function to look up the decl in, but the fake 'this' pointer that we're using for parsing is - in scope_chain. */ + in scope_chain. But if the closure is already complete, we're + in an instantiation of a generic lambda, and the fake 'this' + is gone. */ init = scope_chain->x_current_class_ptr; gcc_checking_assert (init && (TREE_TYPE (TREE_TYPE (init)) diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-nsdmi1.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-nsdmi1.C new file mode 100644 index 00000000000..89ce519d812 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-nsdmi1.C @@ -0,0 +1,8 @@ +// PR c++/84520 +// { dg-do compile { target c++14 } } + +struct A +{ + static void foo(int); + void (*f)(int) = [](auto i) { foo(i); }; +}; -- 2.30.2