c++: Fix nullptr deref [pr97460[
authorNathan Sidwell <nathan@acm.org>
Fri, 16 Oct 2020 17:22:16 +0000 (10:22 -0700)
committerNathan Sidwell <nathan@acm.org>
Fri, 16 Oct 2020 17:22:16 +0000 (10:22 -0700)
My changes to friend handling meant that there are now cases where a
friend doesn't get a lang-specific object.  So we need to check there
is one before looking inside it.

PR c++/97460
gcc/cp/
* pt.c (push_template_decl): Check DECL_LANG_SPECIFIC in friend
case.
gcc/testsuite/
* g++.dg/template/pr97460.C: New.

gcc/cp/pt.c
gcc/testsuite/g++.dg/template/pr97460.C [new file with mode: 0644]

index 2a9a8fafaca59d1adfa487c55b462d050e2147fa..dc664ec37983a89ee8be47429725b0577d6607b3 100644 (file)
@@ -5877,7 +5877,8 @@ push_template_decl (tree decl, bool is_friend)
       || TREE_CODE (ctx) == FUNCTION_DECL
       || (CLASS_TYPE_P (ctx) && TYPE_BEING_DEFINED (ctx))
       || (TREE_CODE (decl) == TYPE_DECL && LAMBDA_TYPE_P (TREE_TYPE (decl)))
-      || (is_friend && !DECL_TEMPLATE_INFO (decl)))
+      || (is_friend && !(DECL_LANG_SPECIFIC (decl)
+                        && DECL_TEMPLATE_INFO (decl))))
     {
       if (DECL_LANG_SPECIFIC (decl)
          && DECL_TEMPLATE_INFO (decl)
diff --git a/gcc/testsuite/g++.dg/template/pr97460.C b/gcc/testsuite/g++.dg/template/pr97460.C
new file mode 100644 (file)
index 0000000..6dea489
--- /dev/null
@@ -0,0 +1,9 @@
+// PR 97460
+// ICE, null dereference
+
+class io_context {
+  template <int> class basic_executor_type;
+};
+template <int> class io_context::basic_executor_type {
+  template <int> friend class basic_executor_type;
+};