* pt.c (maybe_process_partial_specialization): Handle aliases first.
authorJason Merrill <jason@redhat.com>
Tue, 11 Dec 2012 18:16:39 +0000 (13:16 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 11 Dec 2012 18:16:39 +0000 (13:16 -0500)
From-SVN: r194407

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

index baa119dbca991467ad82b3b1cee23fc020d6fb09..02c0bfe20b2f709ef2800557c1d99401830bb665 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 1bc9e1bef14507b80323f5426b695071e8a2c7e7..f30a1e170ebf3fd8b0e730270df0700172145303 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 d0eda5ff1b9b7d25cd7ce8b5bc5e0b24a9cce044..cbba90fa1336ff32604c94df6e35fbf790c1b375 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" }