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 <[email protected]>
+ 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