+2014-03-10 Jason Merrill <jason@redhat.com>
+
+ PR c++/53492
+ * parser.c (cp_parser_class_head): Also check PRIMARY_TEMPLATE_P
+ when deciding whether to call push_template_decl for a member class.
+ * pt.c (push_template_decl_real): Return after wrong levels error.
+
2014-03-08 Adam Butcher <adam@jessamine.co.uk>
PR c++/60033
pushed_scope = push_scope (nested_name_specifier);
/* Get the canonical version of this type. */
type = TYPE_MAIN_DECL (TREE_TYPE (type));
- if (PROCESSING_REAL_TEMPLATE_DECL_P ()
+ /* Call push_template_decl if it seems like we should be defining a
+ template either from the template headers or the type we're
+ defining, so that we diagnose both extra and missing headers. */
+ if ((PROCESSING_REAL_TEMPLATE_DECL_P ()
+ || (CLASSTYPE_TEMPLATE_INFO (TREE_TYPE (type))
+ && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE
+ (TREE_TYPE (type)))))
&& !CLASSTYPE_TEMPLATE_SPECIALIZATION (TREE_TYPE (type)))
{
type = push_template_decl (type);
{
error ("expected %d levels of template parms for %q#D, got %d",
i, decl, TMPL_ARGS_DEPTH (args));
+ DECL_INTERFACE_KNOWN (decl) = 1;
+ return error_mark_node;
}
else
for (current = decl; i > 0; --i, parms = TREE_CHAIN (parms))
--- /dev/null
+// PR c++/53492
+
+template<typename T> struct A
+{
+ template<typename U> struct B;
+};
+
+template <> template<class T> struct A<T>::B { }; // { dg-error "expected 2 levels" }
+
+A<int>::B<int> b; // { dg-error "" }