aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2002-12-03 12:29:43 -0500
committerJason Merrill <jason@gcc.gnu.org>2002-12-03 12:29:43 -0500
commitc203334d6d4d5e2563d90deb06f7c59bf150f00c (patch)
tree4f406195d5e2c49cc0303b48ce06164ff997cd7b /gcc
parent491a97772254870ad1de34528857e94f76e00a10 (diff)
downloadgcc-c203334d6d4d5e2563d90deb06f7c59bf150f00c.zip
gcc-c203334d6d4d5e2563d90deb06f7c59bf150f00c.tar.gz
gcc-c203334d6d4d5e2563d90deb06f7c59bf150f00c.tar.bz2
call.c (build_user_type_conversion_1): Don't set ICS_BAD_FLAG on an ambiguous conversion.
* call.c (build_user_type_conversion_1): Don't set ICS_BAD_FLAG on an ambiguous conversion. From-SVN: r59775
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/call.c3
-rw-r--r--gcc/testsuite/g++.dg/overload/ambig1.C23
-rw-r--r--gcc/testsuite/g++.old-deja/g++.benjamin/15799.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.bugs/900514_03.C6
-rw-r--r--gcc/testsuite/g++.old-deja/g++.mike/net2.C2
6 files changed, 36 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 2399b18..611557b 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2002-12-03 Jason Merrill <jason@redhat.com>
+
+ * call.c (build_user_type_conversion_1): Don't set ICS_BAD_FLAG on
+ an ambiguous conversion.
+
2002-12-03 Mark Mitchell <mark@codesourcery.com>
PR c++/8688
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index a7f9a91..1678ed2 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -2620,7 +2620,8 @@ build_user_type_conversion_1 (totype, expr, flags)
cand = candidates; /* any one will do */
cand->second_conv = build1 (AMBIG_CONV, totype, expr);
ICS_USER_FLAG (cand->second_conv) = 1;
- ICS_BAD_FLAG (cand->second_conv) = 1;
+ /* Don't set ICS_BAD_FLAG; an ambiguous conversion is no worse than
+ another user-defined conversion. */
return cand;
}
diff --git a/gcc/testsuite/g++.dg/overload/ambig1.C b/gcc/testsuite/g++.dg/overload/ambig1.C
new file mode 100644
index 0000000..2adc78c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/overload/ambig1.C
@@ -0,0 +1,23 @@
+// [over.best.ics]: For the purpose of ranking implicit conversion
+// sequences as described in _over.ics.rank_, the ambiguous conversion
+// sequence is treated as a user-defined sequence that is indistinguishable
+// from any other user- defined conversion sequence.
+
+struct A
+{
+ A(long);
+ A(char);
+};
+
+struct B
+{
+ B(int);
+};
+
+void f(A); // { dg-error "" "candidate" }
+void f(B); // { dg-error "" "candidate" }
+
+int main()
+{
+ f (42); // { dg-error "ambiguous" "ambiguous" }
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.benjamin/15799.C b/gcc/testsuite/g++.old-deja/g++.benjamin/15799.C
index 5309daf..01a06b0 100644
--- a/gcc/testsuite/g++.old-deja/g++.benjamin/15799.C
+++ b/gcc/testsuite/g++.old-deja/g++.benjamin/15799.C
@@ -15,7 +15,7 @@ typedef unsigned long uint_32;
class sanjose {
public:
sanjose();
- sanjose(const sanjose&);
+ sanjose(const sanjose&); // ERROR - candidate
sanjose(int_8 value); // ERROR - // ERROR -
sanjose(uint_32 value); // ERROR - // ERROR -
};
diff --git a/gcc/testsuite/g++.old-deja/g++.bugs/900514_03.C b/gcc/testsuite/g++.old-deja/g++.bugs/900514_03.C
index 7c4089a..370a460 100644
--- a/gcc/testsuite/g++.old-deja/g++.bugs/900514_03.C
+++ b/gcc/testsuite/g++.old-deja/g++.bugs/900514_03.C
@@ -7,13 +7,15 @@
// the explicit cast syntax disambiguates the constructor as one which
// invokes the type conversion operator rather than the conversion.
+// NO, IT DOESN'T. It's still ambiguous. --jason 2002-12-03
+
// cfront 2.0 passes this test.
// keywords: user-defined type conversion operator, constructor
struct t_0_st_0;
-struct t_0_st_1 { // ERROR -
+struct t_0_st_1 {
int member;
t_0_st_1 (t_0_st_0&);// ERROR -
@@ -80,7 +82,7 @@ void t_1_local_init ()
struct t_2_st_0;
-struct t_2_st_1 { // ERROR - candidate
+struct t_2_st_1 {
int member;
t_2_st_1 (t_2_st_0); // ERROR - candidate
diff --git a/gcc/testsuite/g++.old-deja/g++.mike/net2.C b/gcc/testsuite/g++.old-deja/g++.mike/net2.C
index ffc14ef..e525130 100644
--- a/gcc/testsuite/g++.old-deja/g++.mike/net2.C
+++ b/gcc/testsuite/g++.old-deja/g++.mike/net2.C
@@ -3,7 +3,7 @@
class B;
-class A {
+class A { // ERROR - copy ctor candidate
private:
A(B *); // ERROR -
public: