+2002-12-18 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+ PR c++/8442
+ * decl2.c (handle_class_head): Verify if the looked up name is a
+ type or template.
+ * pt.c (convert_template_argument): Fix type or template template
+ parameter decision logic.
+
2002-12-13 Joe Buck <jbuck@synopsys.com>
* parse.y (class_head_defn): Set CLASSTYPE_DECLARED_CLASS for
int *new_type_p;
{
tree decl = NULL_TREE;
+ tree type;
tree current = current_scope ();
bool xrefd_p = false;
xrefd_p = true;
}
- if (!TYPE_BINFO (TREE_TYPE (decl)))
+ type = TREE_TYPE (decl);
+
+ if (!TYPE_BINFO (type))
{
error ("`%T' is not a class or union type", decl);
return error_mark_node;
}
-
+
+ /* When `A' is a template class, using `class A' without template
+ argument is invalid unless
+ - we are inside the scope of the template class `A' or one of its
+ specialization.
+ - we are declaring the template class `A' itself. */
+ if (TREE_CODE (type) == RECORD_TYPE
+ && CLASSTYPE_IS_TEMPLATE (type)
+ && processing_template_decl <= template_class_depth (current)
+ && ! is_base_of_enclosing_class (type, current_class_type))
+ {
+ error ("template argument is required for `%T'", type);
+ return error_mark_node;
+ }
+
if (defn_p)
{
/* For a definition, we want to enter the containing scope
&& TREE_CODE (DECL_TEMPLATE_RESULT (arg)) == TYPE_DECL)
|| TREE_CODE (arg) == TEMPLATE_TEMPLATE_PARM
|| TREE_CODE (arg) == UNBOUND_CLASS_TEMPLATE);
- else if (CLASSTYPE_TEMPLATE_INFO (arg) && !CLASSTYPE_USE_TEMPLATE (arg)
- && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (arg)))
- {
- if (is_base_of_enclosing_class (arg, current_class_type))
- /* This is a template name used within the scope of the
- template. It could be the template, or it could be the
- instantiation. Choose whichever makes sense. */
- is_tmpl_type = requires_tmpl_type;
- else
- is_tmpl_type = 1;
- }
+ else if (CLASSTYPE_IS_TEMPLATE (arg)
+ && is_base_of_enclosing_class (arg, current_class_type))
+ /* This is a template name used within the scope of the
+ template. It could be the template, or it could be the
+ instantiation. Choose whichever makes sense. */
+ is_tmpl_type = requires_tmpl_type;
else
/* It is a non-template class, or a specialization of a template
class, or a non-template member of a template class. */
+2002-12-18 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+ PR c++/8442
+ * g++.dg/template/type2.C: New test.
+ * g++.dg/template/ttp3.C: Change expected error message.
+
2002-12-17 Jakub Jelinek <jakub@redhat.com>
* gcc.c-torture/execute/20021118-3.c: New test.
template <class T>
class List { };
- vector<class List> data; // { dg-error "type/value mismatch|expected a type|ISO C" "" }
+ vector<class List> data; // { dg-error "argument is required|ISO C" "" }
};
template <class T>
--- /dev/null
+// { dg-do compile }
+// Origin: Juan Carlos Arevalo-Baeza <jcab@JCABs-Rumblings.com>
+
+// PR c++/8442
+// Type template parameter incorrectly treated as template template
+// parameter.
+
+template <typename T> struct A {};
+
+template <typename T> struct B
+{
+ template <typename U> struct C {};
+ template <typename U> A<C<U> > foo(U);
+};
+
+B<void> b;