* pt.c (maybe_process_partial_specialization): Handle aliases first.
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 11 Dec 2012 18:16:39 +0000 (18:16 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 11 Dec 2012 18:16:39 +0000 (18:16 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@194407 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp0x/alias-decl-1.C

index baa119d..02c0bfe 100644 (file)
@@ -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
index 1bc9e1b..f30a1e1 100644 (file)
@@ -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)
index d0eda5f..cbba90f 100644 (file)
@@ -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" }