aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2004-12-17 15:58:04 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2004-12-17 15:58:04 +0000
commitb54a07e8d266a3f49d7cd7aa8e8318af506b4ab1 (patch)
treed2477afa8c43ada8dcb6e331553962ee89e51e4d
parent64d200483a9bb5597dd435c0206e052cf04a3b4c (diff)
downloadgcc-b54a07e8d266a3f49d7cd7aa8e8318af506b4ab1.zip
gcc-b54a07e8d266a3f49d7cd7aa8e8318af506b4ab1.tar.gz
gcc-b54a07e8d266a3f49d7cd7aa8e8318af506b4ab1.tar.bz2
re PR c++/17821 (Poor diagnostic for using . instead of ->)
cp: 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. testsuite: PR c++/17821 * g++.dg/lookup/conv-5.C: New. From-SVN: r92316
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/class.c12
-rw-r--r--gcc/cp/cp-tree.h9
-rw-r--r--gcc/cp/error.c24
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/lookup/conv-5.C15
6 files changed, 52 insertions, 22 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 96bb671..241e62a 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,12 @@
+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
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 9c0a271..688744c 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -857,7 +857,8 @@ add_method (tree type, tree method)
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;
@@ -868,8 +869,10 @@ add_method (tree type, tree method)
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)
@@ -901,7 +904,6 @@ add_method (tree type, tree method)
}
else
{
- bool conv_p = DECL_CONV_FN_P (method);
tree m;
insert_p = true;
@@ -1012,7 +1014,7 @@ add_method (tree type, tree method)
/* 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)
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index de3e1a6..54fade9 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -2192,10 +2192,11 @@ struct lang_decl GTY(())
/* 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. */
diff --git a/gcc/cp/error.c b/gcc/cp/error.c
index ffdade0..8599616 100644
--- a/gcc/cp/error.c
+++ b/gcc/cp/error.c
@@ -713,19 +713,17 @@ dump_decl (tree t, int flags)
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)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 56acc8e..82ae764 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+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.
diff --git a/gcc/testsuite/g++.dg/lookup/conv-5.C b/gcc/testsuite/g++.dg/lookup/conv-5.C
new file mode 100644
index 0000000..e238e90
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/conv-5.C
@@ -0,0 +1,15 @@
+// { 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;
+};
+