diff options
author | Jason Merrill <jason@redhat.com> | 2014-02-21 16:41:16 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2014-02-21 16:41:16 -0500 |
commit | 2671a8ef23b605b623897d1f3e73a5493ed847e2 (patch) | |
tree | 5ec7430392945a3b504f81d5e420aa3e22f231f4 | |
parent | a810ee82077cd312a1d9a9ddecaca0017db91c87 (diff) | |
download | gcc-2671a8ef23b605b623897d1f3e73a5493ed847e2.zip gcc-2671a8ef23b605b623897d1f3e73a5493ed847e2.tar.gz gcc-2671a8ef23b605b623897d1f3e73a5493ed847e2.tar.bz2 |
re PR c++/60241 (internal compiler error: in finish_member_declaration, at cp/semantics.c:2617)
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.
From-SVN: r208024
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/memclass5.C | 26 |
3 files changed, 41 insertions, 7 deletions
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 <jason@redhat.com> + 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<class T> 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 <typename T> +struct x +{ + template <typename U> + struct y + { + typedef T result2; + }; + + typedef y<int> zy; +}; + +template<> +template<class T> +struct x<int>::y +{ + typedef double result2; +}; + +int main() +{ + x<int>::zy::result2 xxx; + x<int>::y<int>::result2 xxx2; +} |