summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2018-02-27 04:22:24 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2018-02-27 04:22:24 +0000
commitdbb36fe3b94edefaf22dfe388fe7652b4e8ee841 (patch)
treec57db528b5da01c584de56c2dec482e2bead9354
parentb0a415a5d84afd92b258eff2ef4970b96e3d2eb6 (diff)
downloadgcc-dbb36fe3b94edefaf22dfe388fe7652b4e8ee841.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-6-branch@258027 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/lambda.c5
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/lambda-generic-nsdmi1.C8
3 files changed, 18 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 9f396c338ae..89dcffcba2e 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2018-02-26 Jason Merrill <jason@redhat.com>
+
+ 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.
+
2018-02-16 Jason Merrill <jason@redhat.com>
PR c++/84151 - unnecessary volatile load with static member.
diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c
index 91a5c1a0b08..ea15c26ae3e 100644
--- a/gcc/cp/lambda.c
+++ b/gcc/cp/lambda.c
@@ -665,11 +665,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); };
+};