Commit 60b5de49 by Jason Merrill Committed by Jason Merrill

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
parent 013734b9
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.
......
......@@ -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);
......
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" }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment