diff options
author | nathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-06-05 12:53:52 +0000 |
---|---|---|
committer | nathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-06-05 12:53:52 +0000 |
commit | c682aadfbdce0184e90aca968b87729cf26c38f7 (patch) | |
tree | 8f692d3a97ff18f16f19e7b81c5e5b61d15efcfe /gcc/cp | |
parent | 026b7f6ff094c0483286fe2fd8f79bd5d4c884ae (diff) | |
download | gcc-c682aadfbdce0184e90aca968b87729cf26c38f7.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@42907 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/call.c | 16 |
2 files changed, 17 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 970f787b101..f4e08d603f3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2001-06-05 Nathan Sidwell <nathan@codesourcery.com> + * 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 <nathan@codesourcery.com> + * 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 5367cc55805..f2478ed5e6e 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) |