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
This commit is contained in:
parent
8f7550cae8
commit
bea09693c9
@ -1,3 +1,9 @@
|
||||
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
|
||||
|
@ -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)
|
||||
|
@ -1,3 +1,7 @@
|
||||
2001-06-05 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
* g++.old-deja/g++.other/conv7.C: New test.
|
||||
|
||||
2001-06-05 Joseph S. Myers <jsm28@cam.ac.uk>
|
||||
|
||||
* gcc.c-torture/compile/20010605-2.c: New test.
|
||||
|
45
gcc/testsuite/g++.old-deja/g++.other/conv7.C
Normal file
45
gcc/testsuite/g++.old-deja/g++.other/conv7.C
Normal file
@ -0,0 +1,45 @@
|
||||
// Build don't link:
|
||||
//
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
// Contributed by Nathan Sidwell 5 May 2001 <nathan@codesourcery.com>
|
||||
|
||||
// Bug 2726. We ICE'd trying to say something about possibly confusing
|
||||
// conversion overload resolution.
|
||||
|
||||
class foo
|
||||
{
|
||||
};
|
||||
|
||||
template<class T>
|
||||
class bar
|
||||
{
|
||||
public:
|
||||
operator const T&() const ;
|
||||
operator T&() ;
|
||||
|
||||
};
|
||||
|
||||
|
||||
template<class T, class Ref, class NodePtr, class ListPtr>
|
||||
class iterator_template
|
||||
{
|
||||
public:
|
||||
iterator_template();
|
||||
Ref operator*() const;
|
||||
|
||||
};
|
||||
|
||||
struct IdlDeclarator
|
||||
{
|
||||
};
|
||||
|
||||
typedef bar< IdlDeclarator > IdlDeclarator_bar;
|
||||
int
|
||||
yyparse()
|
||||
|
||||
{
|
||||
|
||||
iterator_template<IdlDeclarator_bar,IdlDeclarator_bar&,foo*,foo*> declIter;
|
||||
const IdlDeclarator& declarator = *declIter; // WARNING - choosing
|
||||
return 1;
|
||||
}
|
Loading…
Reference in New Issue
Block a user