From 20d6556070b6952b34cb92622fd61f051216bc37 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Fri, 29 Aug 2003 23:51:17 +0000 Subject: [PATCH] re PR c++/11928 (c++ typedef handling) PR c++/11928 * search.c (add_conversions): Avoid adding two conversion operators for the same type. PR c++/11928 * g++.dg/inherit/conv1.C: New test. From-SVN: r70934 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/search.c | 23 +++++++++++++++++++++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/inherit/conv1.C | 23 +++++++++++++++++++++++ 4 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/inherit/conv1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 503a3b86e5b..fc18cc116f8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2003-08-29 Mark Mitchell + + PR c++/11928 + * search.c (add_conversions): Avoid adding two conversion + operators for the same type. + 2003-08-29 Richard Henderson Jason Merrill diff --git a/gcc/cp/search.c b/gcc/cp/search.c index 29e6172c325..3751c006d13 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -2323,8 +2323,27 @@ add_conversions (tree binfo, void *data) /* Make sure we don't already have this conversion. */ if (! IDENTIFIER_MARKED (name)) { - *conversions = tree_cons (binfo, tmp, *conversions); - IDENTIFIER_MARKED (name) = 1; + tree t; + + /* Make sure that we do not already have a conversion + operator for this type. Merely checking the NAME is not + enough because two conversion operators to the same type + may not have the same NAME. */ + for (t = *conversions; t; t = TREE_CHAIN (t)) + { + tree fn; + for (fn = TREE_VALUE (t); fn; fn = OVL_NEXT (fn)) + if (same_type_p (TREE_TYPE (name), + DECL_CONV_FN_TYPE (OVL_CURRENT (fn)))) + break; + if (fn) + break; + } + if (!t) + { + *conversions = tree_cons (binfo, tmp, *conversions); + IDENTIFIER_MARKED (name) = 1; + } } } return NULL_TREE; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7b983d8e743..c057ea2644a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-08-29 Mark Mitchell + + PR c++/11928 + * g++.dg/inherit/conv1.C: New test. + 2003-08-29 Mark Mitchell PR c++/6196 diff --git a/gcc/testsuite/g++.dg/inherit/conv1.C b/gcc/testsuite/g++.dg/inherit/conv1.C new file mode 100644 index 00000000000..e16c489a235 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/conv1.C @@ -0,0 +1,23 @@ +typedef struct _A A; +typedef struct _A B; + +void some_function(B *b); + +class AClass { + +public: + operator A*() { return 0;} + +}; + +class BClass :public AClass { + +public: + operator B*() { return 0;} + +}; + +int main(int argc, char **argv) { + BClass b; + some_function(b); +}