pt.c (check_explicit_specialization): Check the namespace after we choose a template.

* pt.c (check_explicit_specialization): Check the namespace after
	we choose a template.

From-SVN: r230271
This commit is contained in:
Jason Merrill 2015-11-12 15:37:46 -05:00 committed by Jason Merrill
parent 633ce97157
commit 84edfc8aef
3 changed files with 20 additions and 8 deletions

View File

@ -1,3 +1,8 @@
2015-11-12 Jason Merrill <jason@redhat.com>
* pt.c (check_explicit_specialization): Check the namespace after
we choose a template.
2015-11-11 Jason Merrill <jason@redhat.com>
* decl.c (duplicate_decls): When combining typedefs, remove the

View File

@ -2800,14 +2800,6 @@ check_explicit_specialization (tree declarator,
error ("%qD is not a template function", dname);
fns = error_mark_node;
}
else
{
tree fn = OVL_CURRENT (fns);
if (!is_associated_namespace (CP_DECL_CONTEXT (decl),
CP_DECL_CONTEXT (fn)))
error ("%qD is not declared in %qD",
decl, current_namespace);
}
}
declarator = lookup_template_function (fns, NULL_TREE);
@ -2941,6 +2933,14 @@ check_explicit_specialization (tree declarator,
return error_mark_node;
else
{
if (!ctype && !was_template_id
&& (specialization || member_specialization
|| explicit_instantiation)
&& !is_associated_namespace (CP_DECL_CONTEXT (decl),
CP_DECL_CONTEXT (tmpl)))
error ("%qD is not declared in %qD",
tmpl, current_namespace);
tree gen_tmpl = most_general_template (tmpl);
if (explicit_instantiation)

View File

@ -0,0 +1,7 @@
void f();
namespace A {
template <class T> void f(T) { }
using ::f;
template void f(int);
}