Seems like with this testcase we end up in a scenario where, when counting the
lambda count in enclosing_instantiation_of, we arrive at decl_function_context
being null, so checking DECL_TEMPLATE_INFO then crashes.  It appears that just
the following does the right thing, but I'm not too sure about this function.

Bootstrapped/regtested on x86_64-linux, ok for trunk?

2018-03-19  Marek Polacek  <pola...@redhat.com>

        PR c++/84925
        * pt.c (enclosing_instantiation_of): Check if fn is null.

        * g++.dg/cpp1z/lambda-__func__.C: New test.

diff --git gcc/cp/pt.c gcc/cp/pt.c
index 745c9acd6ee..066cb627a70 100644
--- gcc/cp/pt.c
+++ gcc/cp/pt.c
@@ -12898,7 +12898,7 @@ enclosing_instantiation_of (tree otctx)
       for (; flambda_count < lambda_count && fn && LAMBDA_FUNCTION_P (fn);
           fn = decl_function_context (fn))
        ++flambda_count;
-      if (DECL_TEMPLATE_INFO (fn)
+      if ((fn && DECL_TEMPLATE_INFO (fn))
          ? most_general_template (fn) != most_general_template (tctx)
          : fn != tctx)
        continue;
diff --git gcc/testsuite/g++.dg/cpp1z/lambda-__func__.C 
gcc/testsuite/g++.dg/cpp1z/lambda-__func__.C
index e69de29bb2d..d5d1c1cb7b6 100644
--- gcc/testsuite/g++.dg/cpp1z/lambda-__func__.C
+++ gcc/testsuite/g++.dg/cpp1z/lambda-__func__.C
@@ -0,0 +1,13 @@
+// PR c++/84925
+// { dg-options "-std=c++17" }
+
+template <typename>
+struct A {
+  static const int value = 0;
+  static auto constexpr fn = [] { return __func__; };
+};
+
+template <typename type>
+int x = A<type>::value;
+
+auto s = x<int>;

        Marek

Reply via email to