Commit befd067c by Jason Merrill Committed by Jason Merrill

* pt.c (maybe_process_partial_specialization): Handle aliases first.

From-SVN: r194407
parent d0608e59
2012-12-11 Jason Merrill <jason@redhat.com>
* pt.c (maybe_process_partial_specialization): Handle aliases first.
2012-12-11 Jakub Jelinek <jakub@redhat.com> 2012-12-11 Jakub Jelinek <jakub@redhat.com>
PR c++/55619 PR c++/55619
......
...@@ -812,13 +812,17 @@ maybe_process_partial_specialization (tree type) ...@@ -812,13 +812,17 @@ maybe_process_partial_specialization (tree type)
context = TYPE_CONTEXT (type); context = TYPE_CONTEXT (type);
if ((CLASS_TYPE_P (type) && CLASSTYPE_USE_TEMPLATE (type)) if (TYPE_ALIAS_P (type))
/* Consider non-class instantiations of alias templates as {
well. */ if (TYPE_TEMPLATE_INFO (type)
|| (TYPE_P (type) && DECL_ALIAS_TEMPLATE_P (TYPE_TI_TEMPLATE (type)))
&& TYPE_TEMPLATE_INFO (type) error ("specialization of alias template %qD",
&& DECL_LANG_SPECIFIC (TYPE_NAME (type)) TYPE_TI_TEMPLATE (type));
&& DECL_USE_TEMPLATE (TYPE_NAME (type)))) else
error ("explicit specialization of non-template %qT", type);
return error_mark_node;
}
else if (CLASS_TYPE_P (type) && CLASSTYPE_USE_TEMPLATE (type))
{ {
/* This is for ordinary explicit specialization and partial /* This is for ordinary explicit specialization and partial
specialization of a template class such as: specialization of a template class such as:
...@@ -831,8 +835,7 @@ maybe_process_partial_specialization (tree type) ...@@ -831,8 +835,7 @@ maybe_process_partial_specialization (tree type)
Make sure that `C<int>' and `C<T*>' are implicit instantiations. */ Make sure that `C<int>' and `C<T*>' are implicit instantiations. */
if (CLASS_TYPE_P (type) if (CLASSTYPE_IMPLICIT_INSTANTIATION (type)
&& CLASSTYPE_IMPLICIT_INSTANTIATION (type)
&& !COMPLETE_TYPE_P (type)) && !COMPLETE_TYPE_P (type))
{ {
check_specialization_namespace (CLASSTYPE_TI_TEMPLATE (type)); check_specialization_namespace (CLASSTYPE_TI_TEMPLATE (type));
...@@ -845,16 +848,9 @@ maybe_process_partial_specialization (tree type) ...@@ -845,16 +848,9 @@ maybe_process_partial_specialization (tree type)
return error_mark_node; return error_mark_node;
} }
} }
else if (CLASS_TYPE_P (type) else if (CLASSTYPE_TEMPLATE_INSTANTIATION (type))
&& CLASSTYPE_TEMPLATE_INSTANTIATION (type))
error ("specialization of %qT after instantiation", type); error ("specialization of %qT after instantiation", type);
if (DECL_ALIAS_TEMPLATE_P (TYPE_TI_TEMPLATE (type)))
{
error ("partial specialization of alias template %qD",
TYPE_TI_TEMPLATE (type));
return error_mark_node;
}
} }
else if (CLASS_TYPE_P (type) else if (CLASS_TYPE_P (type)
&& !CLASSTYPE_USE_TEMPLATE (type) && !CLASSTYPE_USE_TEMPLATE (type)
......
...@@ -5,10 +5,10 @@ ...@@ -5,10 +5,10 @@
template<class T, class U> struct A0 {}; template<class T, class U> struct A0 {};
template<class T, class U> using AA0 = A0<T, U>; template<class T, class U> using AA0 = A0<T, U>;
template<class T> struct AA0<int, T> {}; // { dg-error "partial specialization" } template<class T> struct AA0<int, T> {}; // { dg-error "specialization" }
template <class U> using Ptr = U*; template <class U> using Ptr = U*;
template<class U> struct Ptr<U*> {}; // { dg-error "partial specialization" } template<class U> struct Ptr<U*> {}; // { dg-error "specialization" }
struct A { struct A {
using A = int;//{ dg-error "nested|has|same name as|class|in which|declared" } using A = int;//{ dg-error "nested|has|same name as|class|in which|declared" }
......
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