This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
C++ PATCH for c++/84925, ICE in enclosing_instantiation_of
- From: Marek Polacek <polacek at redhat dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>, Jason Merrill <jason at redhat dot com>
- Date: Mon, 19 Mar 2018 12:55:02 +0100
- Subject: C++ PATCH for c++/84925, ICE in enclosing_instantiation_of
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 <polacek@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