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
This commit is contained in:
parent
013734b91b
commit
60b5de49ef
@ -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.
|
||||
|
14
gcc/cp/pt.c
14
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);
|
||||
|
||||
|
@ -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" }
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user