From bea09693c9fcd220569bc8c9bbeb0862eaf8daac Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Tue, 5 Jun 2001 12:53:52 +0000 Subject: [PATCH] call.c (build_user_type_conversion_1): Set ICS_USER_FLAG and ICS_BAD_FLAG on created conversion. cp: * call.c (build_user_type_conversion_1): Set ICS_USER_FLAG and ICS_BAD_FLAG on created conversion. (compare_ics): Break out rank. testsuite: * g++.old-deja/g++.other/conv7.C: New test. From-SVN: r42907 --- gcc/cp/ChangeLog | 6 ++++ gcc/cp/call.c | 16 ++++++---- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/g++.old-deja/g++.other/conv7.C | 45 ++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.old-deja/g++.other/conv7.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 970f787..f4e08d6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2001-06-05 Nathan Sidwell + * call.c (build_user_type_conversion_1): Set ICS_USER_FLAG and + ICS_BAD_FLAG on created conversion. + (compare_ics): Break out rank. + +2001-06-05 Nathan Sidwell + * decl.c (xref_tag): Remove extraneous %s on dependent name lookup warning. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 5367cc5..f2478ed 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -2521,9 +2521,10 @@ build_user_type_conversion_1 (totype, expr, flags) (DECL_CONSTRUCTOR_P (cand->fn) ? totype : non_reference (TREE_TYPE (TREE_TYPE (cand->fn)))), expr, build_ptr_wrapper (cand)); - ICS_USER_FLAG (cand->second_conv) = 1; + + ICS_USER_FLAG (cand->second_conv) = ICS_USER_FLAG (*p) = 1; if (cand->viable == -1) - ICS_BAD_FLAG (cand->second_conv) = 1; + ICS_BAD_FLAG (cand->second_conv) = ICS_BAD_FLAG (*p) = 1; return cand; } @@ -4799,6 +4800,7 @@ compare_ics (ics1, ics2) tree deref_from_type2 = NULL_TREE; tree deref_to_type1 = NULL_TREE; tree deref_to_type2 = NULL_TREE; + int rank1, rank2; /* REF_BINDING is non-zero if the result of the conversion sequence is a reference type. In that case TARGET_TYPE is the @@ -4828,13 +4830,17 @@ compare_ics (ics1, ics2) --a user-defined conversion sequence (_over.ics.user_) is a better conversion sequence than an ellipsis conversion sequence (_over.ics.ellipsis_). */ - if (ICS_RANK (ics1) > ICS_RANK (ics2)) + rank1 = ICS_RANK (ics1); + rank2 = ICS_RANK (ics2); + + if (rank1 > rank2) return -1; - else if (ICS_RANK (ics1) < ICS_RANK (ics2)) + else if (rank1 < rank2) return 1; - if (ICS_RANK (ics1) == BAD_RANK) + if (rank1 == BAD_RANK) { + /* XXX Isn't this an extension? */ /* Both ICS are bad. We try to make a decision based on what would have happenned if they'd been good. */ if (ICS_USER_FLAG (ics1) > ICS_USER_FLAG (ics2) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 14ca76f..0732fb3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2001-06-05 Nathan Sidwell + + * g++.old-deja/g++.other/conv7.C: New test. + 2001-06-05 Joseph S. Myers * gcc.c-torture/compile/20010605-2.c: New test. diff --git a/gcc/testsuite/g++.old-deja/g++.other/conv7.C b/gcc/testsuite/g++.old-deja/g++.other/conv7.C new file mode 100644 index 0000000..0a7e76d --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/conv7.C @@ -0,0 +1,45 @@ +// Build don't link: +// +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 5 May 2001 + +// Bug 2726. We ICE'd trying to say something about possibly confusing +// conversion overload resolution. + +class foo +{ +}; + +template +class bar +{ +public: + operator const T&() const ; + operator T&() ; + +}; + + +template +class iterator_template +{ +public: + iterator_template(); + Ref operator*() const; + +}; + +struct IdlDeclarator +{ +}; + +typedef bar< IdlDeclarator > IdlDeclarator_bar; +int +yyparse() + +{ + + iterator_template declIter; + const IdlDeclarator& declarator = *declIter; // WARNING - choosing + return 1; +} -- 2.7.4