diff options
author | Jason Merrill <jason@redhat.com> | 2007-12-20 17:16:19 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2007-12-20 17:16:19 -0500 |
commit | 4c12c8ea94136784569197991369ed98329719ae (patch) | |
tree | 97855a7b72d0f3ae8bf475d1291d62c8ad50b81b /gcc | |
parent | ef833d3dc2446fcb3b2f7c51ac1dd13f8a22f9c8 (diff) | |
download | gcc-4c12c8ea94136784569197991369ed98329719ae.zip gcc-4c12c8ea94136784569197991369ed98329719ae.tar.gz gcc-4c12c8ea94136784569197991369ed98329719ae.tar.bz2 |
re PR c++/34111 (new overload resolution error)
PR c++/34111
* call.c (standard_conversion): Derived-to-base is considered a
standard conversion.
From-SVN: r131107
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/call.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/overload/arg5.C | 24 |
3 files changed, 31 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 39eb736c5b..a67b941 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2007-12-20 Jason Merrill <jason@redhat.com> + + PR c++/34111 + * call.c (standard_conversion): Derived-to-base is considered a + standard conversion. + 2007-12-19 Jakub Jelinek <jakub@redhat.com> PR c++/34513 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index d240b85..f15550d 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -861,14 +861,7 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p, else if (fcode == VECTOR_TYPE && tcode == VECTOR_TYPE && vector_types_convertible_p (from, to, false)) return build_conv (ck_std, to, conv); - /* A derived-to-base conversion sequence is a user-defined conversion - because it involves a constructor call, even though it has the rank of - a standard conversion, so we don't consider it if we aren't allowing - user-defined conversions. But if we're binding directly to a - reference, it's only a pointer conversion. */ - else if ((!(flags & LOOKUP_NO_CONVERSION) - || (flags & LOOKUP_NO_TEMP_BIND)) - && IS_AGGR_TYPE (to) && IS_AGGR_TYPE (from) + else if (IS_AGGR_TYPE (to) && IS_AGGR_TYPE (from) && is_properly_derived_from (from, to)) { if (conv->kind == ck_rvalue) diff --git a/gcc/testsuite/g++.dg/overload/arg5.C b/gcc/testsuite/g++.dg/overload/arg5.C new file mode 100644 index 0000000..63c66d4 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/arg5.C @@ -0,0 +1,24 @@ +// PR c++/34111 + +class QChar +{ +}; +struct QString +{ + QString(QChar); +}; +struct QPainter +{ + void drawText (int x, int y, const QString &); +}; + + class KHEChar:public QChar + { + public:KHEChar (QChar C); + }; + +void +drawByte (QPainter * P, char, KHEChar B) +{ + P->drawText (0, 0, B); +} |