mirror of git://gcc.gnu.org/git/gcc.git
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>
|
2012-08-23 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
* decl.c (compute_array_index_type): Use type_dependent_expression_p.
|
* 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;
|
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
|
declared. Check that the namespace in which the specialization is
|
||||||
occurring is permissible. Returns false iff it is invalid to
|
occurring is permissible. Returns false iff it is invalid to
|
||||||
specialize TMPL in the current namespace. */
|
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 (clone)
|
||||||
= DECL_SOURCE_LOCATION (fn);
|
= DECL_SOURCE_LOCATION (fn);
|
||||||
}
|
}
|
||||||
check_specialization_namespace (fn);
|
check_specialization_namespace (tmpl);
|
||||||
|
|
||||||
return fn;
|
return fn;
|
||||||
}
|
}
|
||||||
|
|
@ -1804,6 +1804,16 @@ determine_specialization (tree template_id,
|
||||||
if (template_id == error_mark_node || decl == error_mark_node)
|
if (template_id == error_mark_node || decl == error_mark_node)
|
||||||
return 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);
|
fns = TREE_OPERAND (template_id, 0);
|
||||||
explicit_targs = TREE_OPERAND (template_id, 1);
|
explicit_targs = TREE_OPERAND (template_id, 1);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
namespace N {
|
namespace N {
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct S {
|
struct S {
|
||||||
void f() {}
|
void f() {} // { dg-error "definition" }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace K {
|
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