From b9445edd9a0bf06e1a06be55afb3b53f1bdeaa49 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Mon, 4 Aug 2003 11:30:06 +0000 Subject: [PATCH] re PR c++/11713 (declaration conflicts) PR c++/11713 * search.c (setup_class_bindings): Handle conversion operators specially. PR c++/11713 * g++.dg/overload/operator1.C: New test. From-SVN: r70136 --- gcc/cp/search.c | 14 ++++++++++ gcc/testsuite/g++.dg/overload/operator1.C | 34 +++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 gcc/testsuite/g++.dg/overload/operator1.C diff --git a/gcc/cp/search.c b/gcc/cp/search.c index 3f8e2daf8a8..c6463751926 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -2123,6 +2123,20 @@ setup_class_bindings (tree name, int type_binding_p) if (BASELINK_P (value_binding)) /* NAME is some overloaded functions. */ value_binding = BASELINK_FUNCTIONS (value_binding); + /* Two conversion operators that convert to the same type + may have different names. (See + mangle_conv_op_name_for_type.) To avoid recording the + same conversion operator declaration more than once we + must check to see that the same operator was not already + found under another name. */ + if (IDENTIFIER_TYPENAME_P (name) + && is_overloaded_fn (value_binding)) + { + tree fns; + for (fns = value_binding; fns; fns = OVL_NEXT (fns)) + if (IDENTIFIER_CLASS_VALUE (DECL_NAME (OVL_CURRENT (fns)))) + return; + } pushdecl_class_level (value_binding); } } diff --git a/gcc/testsuite/g++.dg/overload/operator1.C b/gcc/testsuite/g++.dg/overload/operator1.C new file mode 100644 index 00000000000..f4d1f53f14e --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/operator1.C @@ -0,0 +1,34 @@ +typedef struct _GdkDrawable GdkDrawable; +typedef struct _GdkDrawable GdkBitmap; +typedef struct _GdkDrawable GdkPixmap; + +class Drawable +{ +public: + operator GdkDrawable* () const; +}; + + +class Pixmap : public Drawable +{ +public: + operator GdkPixmap* () const; + +}; + + +class Bitmap : public Pixmap +{ +public: + operator GdkBitmap* () const; + +}; + +class Event +{ +}; + +Bitmap::operator GdkBitmap* () const +{ + return 0; +} -- 2.30.2