From: Nathan Sidwell Date: Tue, 14 Jan 2020 19:12:40 +0000 (-0800) Subject: [PR90916] ICE in retrieve specialization X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a5a3c2dcf73aa245b0eb6f6cf56c4d03ab6056da;p=gcc.git [PR90916] ICE in retrieve specialization 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. --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 004ce0fdcdf..3cc7c48b490 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2020-01-14 Nathan Sidwell + + PR c++/90916 + * pt.c (retrieve_specialization): Get the TI from the decl or the + classtype as appropriate. + 2020-01-14 David Malcolm * cp-gimplify.c (source_location_table_entry_hash::empty_zero_p): diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index fa82ecad233..4fdc74f9ca8 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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 index 00000000000..bdb7e7b58ef --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr90916.C @@ -0,0 +1,8 @@ +// PR c++/90916 ICE in retrieve_specialization + +template struct S +{ + struct A; + struct f A (); +}; +template class S ;