This testcase manages to find a way to look up the partial instantiation of B for the default argument of C before we've created the partial instantiation of B as part of the normal instantiation of the members of A. Which we can deal with, but we were getting confused because the partial instantiation was stored with a RECORD_TYPE specialization rather than TEMPLATE_DECL.
Tested x86_64-pc-linux-gnu, applying to trunk. * pt.c (tsubst_template_decl): Handle getting a type from retrieve_specialization. --- gcc/cp/pt.c | 8 +++++++- gcc/testsuite/g++.dg/template/memtmpl6.C | 13 +++++++++++++ gcc/cp/ChangeLog | 4 ++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/template/memtmpl6.C diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 2b92b608f5d..9cb29d22ca3 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -13266,7 +13266,13 @@ tsubst_template_decl (tree t, tree args, tsubst_flags_t complain, hash = hash_tmpl_and_args (t, full_args); spec = retrieve_specialization (t, full_args, hash); if (spec != NULL_TREE) - return spec; + { + if (TYPE_P (spec)) + /* Type partial instantiations are stored as the type by + lookup_template_class_1, not here as the template. */ + spec = CLASSTYPE_TI_TEMPLATE (spec); + return spec; + } } /* Make a new template decl. It will be similar to the diff --git a/gcc/testsuite/g++.dg/template/memtmpl6.C b/gcc/testsuite/g++.dg/template/memtmpl6.C new file mode 100644 index 00000000000..9ce35abfc4e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memtmpl6.C @@ -0,0 +1,13 @@ +// PR c++/81866 + +template<class> +struct A { + template<class> struct C; + template<class> struct B; + template<class T = B<int> > struct C {}; +}; + +int main() { + A<int>::C<> ac; + return 0; +} diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 91d14311f18..888b431e099 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2019-04-03 Jason Merrill <ja...@redhat.com> + PR c++/81866 - ICE with member template and default targ. + * pt.c (tsubst_template_decl): Handle getting a type from + retrieve_specialization. + PR c++/86586 - -fcompare-debug=-Wsign-compare. * typeck.c (cp_build_binary_op): Don't fold for -Wsign-compare. base-commit: b3902d2e4fe4c7c1b04a92ae1e0a4959d7df1574 -- 2.20.1