diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/pt.c | 30 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/alias-decl-1.C | 4 |
3 files changed, 19 insertions, 19 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index baa119d..02c0bfe 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,7 @@ +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> PR c++/55619 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 1bc9e1b..f30a1e1 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -812,13 +812,17 @@ maybe_process_partial_specialization (tree type) 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: @@ -831,8 +835,7 @@ maybe_process_partial_specialization (tree type) 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)); @@ -845,16 +848,9 @@ maybe_process_partial_specialization (tree 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) diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-1.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-1.C index d0eda5f..cbba90f 100644 --- a/gcc/testsuite/g++.dg/cpp0x/alias-decl-1.C +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-1.C @@ -5,10 +5,10 @@ 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" } |