PR c++/54416
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 11 Dec 2012 18:16:50 +0000 (18:16 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 11 Dec 2012 18:16:50 +0000 (18:16 +0000)
* pt.c (maybe_process_partial_specialization): Don't accept
definition of a specialization without the appropriate header.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@194408 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/template/crash105.C
gcc/testsuite/g++.dg/template/error48.C [new file with mode: 0644]

index 02c0bfe..2c3efe8 100644 (file)
@@ -1,5 +1,9 @@
 2012-12-11  Jason Merrill  <jason@redhat.com>
 
+       PR c++/54416
+       * pt.c (maybe_process_partial_specialization): Don't accept
+       definition of a specialization without the appropriate header.
+
        * pt.c (maybe_process_partial_specialization): Handle aliases first.
 
 2012-12-11  Jakub Jelinek  <jakub@redhat.com>
index f30a1e1..91450d8 100644 (file)
@@ -850,7 +850,13 @@ maybe_process_partial_specialization (tree type)
        }
       else if (CLASSTYPE_TEMPLATE_INSTANTIATION (type))
        error ("specialization of %qT after instantiation", type);
-
+      else if (errorcount && !processing_specialization
+               && CLASSTYPE_TEMPLATE_SPECIALIZATION (type)
+              && !uses_template_parms (CLASSTYPE_TI_ARGS (type)))
+       /* Trying to define a specialization either without a template<> header
+          or in an inappropriate place.  We've already given an error, so just
+          bail now so we don't actually define the specialization.  */
+       return error_mark_node;
     }
   else if (CLASS_TYPE_P (type)
           && !CLASSTYPE_USE_TEMPLATE (type)
index 649bf8b..8cfff6a 100644 (file)
@@ -10,5 +10,8 @@ template < typename > struct S < int >
 void
 f ()
 {
-  S < int >::f (); // { dg-error "cannot call" }
+  S < int >::f ();
 }
+
+// Don't be picky about error-recovery.
+// { dg-prune-output "." }
diff --git a/gcc/testsuite/g++.dg/template/error48.C b/gcc/testsuite/g++.dg/template/error48.C
new file mode 100644 (file)
index 0000000..483f7b5
--- /dev/null
@@ -0,0 +1,15 @@
+// PR c++/54416
+
+template < typename T > struct foo;
+template <> struct foo < int >;
+template < typename T > struct bar
+{
+  template <> struct foo < int > // { dg-error "non-namespace scope" }
+  {
+    void baz ();
+  };
+};
+void foo < int >::baz () { }
+
+// Don't be picky about error-recovery.
+// { dg-prune-output "." }