context = TYPE_CONTEXT (type);
- if ((CLASS_TYPE_P (type) && CLASSTYPE_USE_TEMPLATE (type))
- /* Consider non-class instantiations of alias templates as
- well. */
- || (TYPE_P (type)
- && TYPE_TEMPLATE_INFO (type)
- && DECL_LANG_SPECIFIC (TYPE_NAME (type))
- && DECL_USE_TEMPLATE (TYPE_NAME (type))))
+ if (TYPE_ALIAS_P (type))
+ {
+ if (TYPE_TEMPLATE_INFO (type)
+ && DECL_ALIAS_TEMPLATE_P (TYPE_TI_TEMPLATE (type)))
+ error ("specialization of alias template %qD",
+ TYPE_TI_TEMPLATE (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
specialization of a template class such as:
Make sure that `C<int>' and `C<T*>' are implicit instantiations. */
- if (CLASS_TYPE_P (type)
- && CLASSTYPE_IMPLICIT_INSTANTIATION (type)
+ if (CLASSTYPE_IMPLICIT_INSTANTIATION (type)
&& !COMPLETE_TYPE_P (type))
{
check_specialization_namespace (CLASSTYPE_TI_TEMPLATE (type));
return error_mark_node;
}
}
- else if (CLASS_TYPE_P (type)
- && CLASSTYPE_TEMPLATE_INSTANTIATION (type))
+ else if (CLASSTYPE_TEMPLATE_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)
&& !CLASSTYPE_USE_TEMPLATE (type)
template<class T, class U> struct A0 {};
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> struct Ptr<U*> {}; // { dg-error "partial specialization" }
+template<class U> struct Ptr<U*> {}; // { dg-error "specialization" }
struct A {
using A = int;//{ dg-error "nested|has|same name as|class|in which|declared" }