* 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
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>
}
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)
void
f ()
{
- S < int >::f (); // { dg-error "cannot call" }
+ S < int >::f ();
}
+
+// Don't be picky about error-recovery.
+// { dg-prune-output "." }
--- /dev/null
+// 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 "." }