From 6648782a965113f5fe9fe897649da38da15d3684 Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 21 Feb 2014 21:41:16 +0000 Subject: [PATCH] PR c++/60241 * pt.c (lookup_template_class_1): Update DECL_TEMPLATE_INSTANTIATIONS of the partial instantiation, not the most general template. (maybe_process_partial_specialization): Reassign everything on that list. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@208024 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/pt.c | 16 +++++++++------- gcc/testsuite/g++.dg/template/memclass5.C | 26 ++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/memclass5.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9fd8391..01a2569 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2014-02-21 Jason Merrill + PR c++/60241 + * pt.c (lookup_template_class_1): Update DECL_TEMPLATE_INSTANTIATIONS + of the partial instantiation, not the most general template. + (maybe_process_partial_specialization): Reassign everything on + that list. + PR c++/60216 * pt.c (register_specialization): Copy DECL_DELETED_FN to clones. (check_explicit_specialization): Don't clone. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index a394441..91a8840 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -914,11 +914,13 @@ maybe_process_partial_specialization (tree type) t; t = TREE_CHAIN (t)) { tree inst = TREE_VALUE (t); - if (CLASSTYPE_TEMPLATE_SPECIALIZATION (inst)) + if (CLASSTYPE_TEMPLATE_SPECIALIZATION (inst) + || !COMPLETE_OR_OPEN_TYPE_P (inst)) { /* We already have a full specialization of this partial - instantiation. Reassign it to the new member - specialization template. */ + instantiation, or a full specialization has been + looked up but not instantiated. Reassign it to the + new member specialization template. */ spec_entry elt; spec_entry *entry; void **slot; @@ -937,7 +939,7 @@ maybe_process_partial_specialization (tree type) *entry = elt; *slot = entry; } - else if (COMPLETE_OR_OPEN_TYPE_P (inst)) + else /* But if we've had an implicit instantiation, that's a problem ([temp.expl.spec]/6). */ error ("specialization %qT after instantiation %qT", @@ -7596,7 +7598,7 @@ lookup_template_class_1 (tree d1, tree arglist, tree in_decl, tree context, } /* Let's consider the explicit specialization of a member - of a class template specialization that is implicitely instantiated, + of a class template specialization that is implicitly instantiated, e.g.: template struct S @@ -7694,9 +7696,9 @@ lookup_template_class_1 (tree d1, tree arglist, tree in_decl, tree context, /* Note this use of the partial instantiation so we can check it later in maybe_process_partial_specialization. */ - DECL_TEMPLATE_INSTANTIATIONS (templ) + DECL_TEMPLATE_INSTANTIATIONS (found) = tree_cons (arglist, t, - DECL_TEMPLATE_INSTANTIATIONS (templ)); + DECL_TEMPLATE_INSTANTIATIONS (found)); if (TREE_CODE (template_type) == ENUMERAL_TYPE && !is_dependent_type && !DECL_ALIAS_TEMPLATE_P (gen_tmpl)) diff --git a/gcc/testsuite/g++.dg/template/memclass5.C b/gcc/testsuite/g++.dg/template/memclass5.C new file mode 100644 index 0000000..eb32f13 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memclass5.C @@ -0,0 +1,26 @@ +// PR c++/60241 + +template +struct x +{ + template + struct y + { + typedef T result2; + }; + + typedef y zy; +}; + +template<> +template +struct x::y +{ + typedef double result2; +}; + +int main() +{ + x::zy::result2 xxx; + x::y::result2 xxx2; +} -- 2.7.4