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