+2004-12-17 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/17821
+ * class.c (add_method): Do not push conversion operators into a
+ binding level.
+
+ * cp-tree.h (CLASSTYPE_PRIMARY_TEMPLATE_TYPE): Reformat.
+ * error.c (dump_decl): <TYPE_DECL case> Remove extraneous braces.
+
2004-12-16 Nathan Sidwell <nathan@codesourcery.com>
PR c++/18905
int using;
unsigned slot;
tree overload;
- int template_conv_p;
+ bool template_conv_p = false;
+ bool conv_p;
VEC(tree) *method_vec;
bool complete_p;
bool insert_p = false;
complete_p = COMPLETE_TYPE_P (type);
using = (DECL_CONTEXT (method) != type);
- template_conv_p = (TREE_CODE (method) == TEMPLATE_DECL
- && DECL_TEMPLATE_CONV_FN_P (method));
+ conv_p = DECL_CONV_FN_P (method);
+ if (conv_p)
+ template_conv_p = (TREE_CODE (method) == TEMPLATE_DECL
+ && DECL_TEMPLATE_CONV_FN_P (method));
method_vec = CLASSTYPE_METHOD_VEC (type);
if (!method_vec)
}
else
{
- bool conv_p = DECL_CONV_FN_P (method);
tree m;
insert_p = true;
/* Add the new binding. */
overload = build_overload (method, current_fns);
- if (slot >= CLASSTYPE_FIRST_CONVERSION_SLOT && !complete_p)
+ if (!conv_p && slot >= CLASSTYPE_FIRST_CONVERSION_SLOT && !complete_p)
push_class_level_binding (DECL_NAME (method), overload);
if (insert_p)
/* For a template instantiation TYPE, returns the TYPE corresponding
to the primary template. Otherwise returns TYPE itself. */
-#define CLASSTYPE_PRIMARY_TEMPLATE_TYPE(TYPE) \
- ((CLASSTYPE_USE_TEMPLATE ((TYPE)) && !CLASSTYPE_TEMPLATE_SPECIALIZATION ((TYPE))) \
- ? TREE_TYPE (DECL_TEMPLATE_RESULT (DECL_PRIMARY_TEMPLATE \
- (CLASSTYPE_TI_TEMPLATE ((TYPE))))) \
+#define CLASSTYPE_PRIMARY_TEMPLATE_TYPE(TYPE) \
+ ((CLASSTYPE_USE_TEMPLATE ((TYPE)) \
+ && !CLASSTYPE_TEMPLATE_SPECIALIZATION ((TYPE))) \
+ ? TREE_TYPE (DECL_TEMPLATE_RESULT (DECL_PRIMARY_TEMPLATE \
+ (CLASSTYPE_TI_TEMPLATE ((TYPE))))) \
: (TYPE))
/* Like DECL_TI_TEMPLATE, but for an ENUMERAL_, RECORD_, or UNION_TYPE. */
switch (TREE_CODE (t))
{
case TYPE_DECL:
- {
- /* Don't say 'typedef class A' */
- if (DECL_ARTIFICIAL (t))
- {
- if ((flags & TFF_DECL_SPECIFIERS)
- && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
- /* Say `class T' not just `T'. */
- pp_cxx_identifier (cxx_pp, "class");
-
- dump_type (TREE_TYPE (t), flags);
- break;
- }
- }
+ /* Don't say 'typedef class A' */
+ if (DECL_ARTIFICIAL (t))
+ {
+ if ((flags & TFF_DECL_SPECIFIERS)
+ && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
+ /* Say `class T' not just `T'. */
+ pp_cxx_identifier (cxx_pp, "class");
+
+ dump_type (TREE_TYPE (t), flags);
+ break;
+ }
if (flags & TFF_DECL_SPECIFIERS)
pp_cxx_identifier (cxx_pp, "typedef");
dump_simple_decl (t, DECL_ORIGINAL_TYPE (t)
+2004-12-17 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/17821
+ * g++.dg/lookup/conv-5.C: New.
+
2004-12-16 Ziemowit Laski <zlaski@apple.com>
* objc.dg/stabs-1.m: New test.
--- /dev/null
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 17 Dec 2004 <nathan@codesourcery.com>
+
+// PR 17821. bogus error
+// Origin: Mikael Kilpel?inen <belz@kolumbus.fi>
+
+struct A {
+ template<typename T>
+ operator T() const;
+
+ operator float() const;
+};
+