diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/pt.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/memtmpl6.C | 13 |
3 files changed, 24 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 91d1431..888b431 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2019-04-03 Jason Merrill <jason@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. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 2b92b60..9cb29d2 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 0000000..9ce35ab --- /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; +} |