diff options
author | Jason Merrill <jason@redhat.com> | 2012-08-24 14:57:50 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2012-08-24 14:57:50 -0400 |
commit | 60b5de49ef8049c7d6d48130cb501cc97794b6ad (patch) | |
tree | f3394b3c598b11bdffcbd2eae88e815c89b04f56 | |
parent | 013734b91bc257a1f03f2e94dca9efa1b94e39c9 (diff) | |
download | gcc-60b5de49ef8049c7d6d48130cb501cc97794b6ad.zip gcc-60b5de49ef8049c7d6d48130cb501cc97794b6ad.tar.gz gcc-60b5de49ef8049c7d6d48130cb501cc97794b6ad.tar.bz2 |
pt.c (register_specialization): Correct argument to check_specialization_namespace.
* pt.c (register_specialization): Correct argument to
check_specialization_namespace.
(determine_specialization): Don't consider members of
unspecialized types.
From-SVN: r190652
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/pt.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/spec25.C | 4 |
3 files changed, 21 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0c89111..9eb4b87 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2012-08-24 Jason Merrill <jason@redhat.com> + + * pt.c (register_specialization): Correct argument to + check_specialization_namespace. + (determine_specialization): Don't consider members of + unspecialized types. + 2012-08-23 Jason Merrill <jason@redhat.com> * decl.c (compute_array_index_type): Use type_dependent_expression_p. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index ad81bab..580a3d4 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -735,7 +735,7 @@ end_explicit_instantiation (void) processing_explicit_instantiation = false; } -/* An explicit specialization or partial specialization TMPL is being +/* An explicit specialization or partial specialization of TMPL is being declared. Check that the namespace in which the specialization is occurring is permissible. Returns false iff it is invalid to specialize TMPL in the current namespace. */ @@ -1407,7 +1407,7 @@ register_specialization (tree spec, tree tmpl, tree args, bool is_friend, DECL_SOURCE_LOCATION (clone) = DECL_SOURCE_LOCATION (fn); } - check_specialization_namespace (fn); + check_specialization_namespace (tmpl); return fn; } @@ -1804,6 +1804,16 @@ determine_specialization (tree template_id, if (template_id == error_mark_node || decl == error_mark_node) return error_mark_node; + /* We shouldn't be specializing a member template of an + unspecialized class template; we already gave an error in + check_specialization_scope, now avoid crashing. */ + if (template_count && DECL_CLASS_SCOPE_P (decl) + && template_class_depth (DECL_CONTEXT (decl)) > 0) + { + gcc_assert (errorcount); + return error_mark_node; + } + fns = TREE_OPERAND (template_id, 0); explicit_targs = TREE_OPERAND (template_id, 1); diff --git a/gcc/testsuite/g++.dg/template/spec25.C b/gcc/testsuite/g++.dg/template/spec25.C index 3f641fe..385d19a 100644 --- a/gcc/testsuite/g++.dg/template/spec25.C +++ b/gcc/testsuite/g++.dg/template/spec25.C @@ -1,10 +1,10 @@ namespace N { template <typename T> struct S { - void f() {} + void f() {} // { dg-error "definition" } }; } namespace K { - template <> void N::S<char>::f() {} // { dg-error "namespace|definition" } + template <> void N::S<char>::f() {} // { dg-error "different namespace" } } |