[PR90916] ICE in retrieve specialization
authorNathan Sidwell <nathans@fb.com>
Tue, 14 Jan 2020 19:12:40 +0000 (11:12 -0800)
committerNathan Sidwell <nathans@fb.com>
Tue, 14 Jan 2020 19:12:40 +0000 (11:12 -0800)
https://gcc.gnu.org/ml/gcc-patches/2020-01/msg00809.html
PR c++/90916
* pt.c (retrieve_specialization): Get the TI from the decl or the
classtype as appropriate.

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

index 004ce0fdcdf1eafae742552b52b21429e4bbcb30..3cc7c48b490f96a3727a48ffef4916abdaea266b 100644 (file)
@@ -1,3 +1,9 @@
+2020-01-14  Nathan Sidwell  <nathan@acm.org>
+
+       PR c++/90916
+       * pt.c (retrieve_specialization): Get the TI from the decl or the
+       classtype as appropriate.
+
 2020-01-14  David Malcolm  <dmalcolm@redhat.com>
 
        * cp-gimplify.c (source_location_table_entry_hash::empty_zero_p):
index fa82ecad233ffe904d4f9a3cd10d224250187778..4fdc74f9ca82fcf2ca39c82eff462af600ec6c20 100644 (file)
@@ -1252,11 +1252,16 @@ retrieve_specialization (tree tmpl, tree args, hashval_t hash)
       for (ovl_iterator iter (fns); iter; ++iter)
        {
          tree fn = *iter;
-         if (DECL_TEMPLATE_INFO (fn) && DECL_TI_TEMPLATE (fn) == tmpl
-             /* using-declarations can add base methods to the method vec,
-                and we don't want those here.  */
-             && DECL_CONTEXT (fn) == class_specialization)
-           return fn;
+         if (tree ti = (TREE_CODE (fn) == TYPE_DECL && !TYPE_DECL_ALIAS_P (fn)
+                        ? TYPE_TEMPLATE_INFO (TREE_TYPE (fn))
+                        : DECL_TEMPLATE_INFO (fn)))
+           if (TI_TEMPLATE (ti) == tmpl
+               /* using-declarations can bring in a different
+                  instantiation of tmpl as a member of a different
+                  instantiation of tmpl's class.  We don't want those
+                  here.  */
+               && DECL_CONTEXT (fn) == class_specialization)
+             return fn;
        }
       return NULL_TREE;
     }
diff --git a/gcc/testsuite/g++.dg/template/pr90916.C b/gcc/testsuite/g++.dg/template/pr90916.C
new file mode 100644 (file)
index 0000000..bdb7e7b
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/90916 ICE in retrieve_specialization
+
+template <typename> struct S
+{
+  struct A;
+  struct f A ();
+};
+template class S <int>;