PR c++/89241 - ICE with __func__ in lambda in template.
authorJason Merrill <jason@redhat.com>
Mon, 11 Feb 2019 23:05:16 +0000 (18:05 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 11 Feb 2019 23:05:16 +0000 (18:05 -0500)
When we're instantiating a generic lambda, its enclosing context will
have already been instantiated, so we need to look for that as well.

* pt.c (enclosing_instantiation_of): Also check
instantiated_lambda_fn_p for the template context.

From-SVN: r268784

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp1y/lambda-generic-func1.C [new file with mode: 0644]

index 3d3bb2ace9abeca691243a1d102bfdf2ddd9707a..5fe18ccdab63f48313003db86407b3c944d8b279 100644 (file)
@@ -1,3 +1,9 @@
+2019-02-11  Jason Merrill  <jason@redhat.com>
+
+       PR c++/89241 - ICE with __func__ in lambda in template.
+       * pt.c (enclosing_instantiation_of): Also check
+       instantiated_lambda_fn_p for the template context.
+
 2019-02-11  Marek Polacek  <polacek@redhat.com>
 
        PR c++/89212 - ICE converting nullptr to pointer-to-member-function.
index 184cb851145ae759467284d1c2ebde55d7fa92ac..b96e3aa9cd564ca6348d119a120af4cc0cf6a350 100644 (file)
@@ -13355,7 +13355,8 @@ enclosing_instantiation_of (tree otctx)
   tree fn = current_function_decl;
   int lambda_count = 0;
 
-  for (; tctx && lambda_fn_in_template_p (tctx);
+  for (; tctx && (lambda_fn_in_template_p (tctx)
+                 || instantiated_lambda_fn_p (tctx));
        tctx = decl_function_context (tctx))
     ++lambda_count;
   for (; fn; fn = decl_function_context (fn))
diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-func1.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-func1.C
new file mode 100644 (file)
index 0000000..4a63855
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/89241
+// { dg-do compile { target c++14 } }
+
+template <typename al> void m(al p) {
+  p(1);
+}
+
+template <typename ax> void f() {
+  m([](auto) { __func__; });
+}
+
+template void f<int>();