diff mbox

[PR,c++/80091] GCC 6 ICE with generic lambda

Message ID eb9bd70a-5d08-7e07-5f6f-83fec36419c2@acm.org
State New
Headers show

Commit Message

Nathan Sidwell March 21, 2017, 5:55 p.m. UTC
This patch fixes a gcc 6.  In gcc 6 we see an IDENTIFIER for functions 
(some) member fns that really resolve at parse time.  We resolve them to 
the same thing at instantiation time, so users don't see a problem. 
Current GCC is cleaned up, so we see the actual decls when we need to. 
(and if we do defer to instantiation time we can't then find a member 
fn, which could change what we thought at parse time).

This fix is applied to gcc 6, and causes this capture when we see a raw 
identifier in this case.

trunk requires no such patch, but I'll put the testcase there.

nathan
diff mbox

Patch

2017-03-20  Nathan Sidwell  <nathan@acm.org>

	PR c++/80091
	* lambda.c (maybe_generic_this_capture): Capture when fn
	is an identifier node.

Index: cp/lambda.c
===================================================================
--- cp/lambda.c	(revision 246279)
+++ cp/lambda.c	(working copy)
@@ -809,8 +809,9 @@  maybe_generic_this_capture (tree object,
 	  {
 	    tree fn = OVL_CURRENT (fns);
 
-	    if ((!id_expr || TREE_CODE (fn) == TEMPLATE_DECL)
-		&& DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
+	    if (identifier_p (fns)
+		|| ((!id_expr || TREE_CODE (fn) == TEMPLATE_DECL)
+		    && DECL_NONSTATIC_MEMBER_FUNCTION_P (fn)))
 	      {
 		/* Found a non-static member.  Capture this.  */
 		lambda_expr_this_capture (lam, true);
Index: testsuite/g++.dg/cpp0x/pr80091.C
===================================================================
--- testsuite/g++.dg/cpp0x/pr80091.C	(nonexistent)
+++ testsuite/g++.dg/cpp0x/pr80091.C	(working copy)
@@ -0,0 +1,12 @@ 
+// { dg-do compile { target c++11 } }
+
+// PR 80091 ICE with member fn call from lambda in template
+
+struct A {
+  void m_fn1();
+};
+template <int> struct B : A {
+  void m_fn2() {
+    [&] { m_fn1(); };
+  }
+};