aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2007-12-20 17:16:19 -0500
committerJason Merrill <jason@gcc.gnu.org>2007-12-20 17:16:19 -0500
commit4c12c8ea94136784569197991369ed98329719ae (patch)
tree97855a7b72d0f3ae8bf475d1291d62c8ad50b81b /gcc
parentef833d3dc2446fcb3b2f7c51ac1dd13f8a22f9c8 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/call.c9
-rw-r--r--gcc/testsuite/g++.dg/overload/arg5.C24
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);
+}