From 60b5de49ef8049c7d6d48130cb501cc97794b6ad Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 24 Aug 2012 14:57:50 -0400 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/pt.c | 14 ++++++++++++-- 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 0c8911180aa..9eb4b87420c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2012-08-24 Jason Merrill + + * pt.c (register_specialization): Correct argument to + check_specialization_namespace. + (determine_specialization): Don't consider members of + unspecialized types. + 2012-08-23 Jason Merrill * decl.c (compute_array_index_type): Use type_dependent_expression_p. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index ad81bab3c83..580a3d4b099 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 3f641fe5a21..385d19ada0c 100644 --- a/gcc/testsuite/g++.dg/template/spec25.C +++ b/gcc/testsuite/g++.dg/template/spec25.C @@ -1,10 +1,10 @@ namespace N { template struct S { - void f() {} + void f() {} // { dg-error "definition" } }; } namespace K { - template <> void N::S::f() {} // { dg-error "namespace|definition" } + template <> void N::S::f() {} // { dg-error "different namespace" } }