OSDN Git Service

2008-07-18 Dodji Seketeli <dseketel@redhat.com>
authordodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 Jul 2008 20:40:42 +0000 (20:40 +0000)
committerdodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 Jul 2008 20:40:42 +0000 (20:40 +0000)
PR c++/36407
* call.c (convert_like_real): Don't take the error code path
  when a rvalue or base conversion has the bad_p field set.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@137966 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/conversion/op5.C [new file with mode: 0644]

index 6daff1e..2112b8f 100644 (file)
@@ -1,3 +1,9 @@
+2008-07-18  Dodji Seketeli  <dseketel@redhat.com>
+
+       PR c++/36407
+       * call.c (convert_like_real): Don't take the error code path
+         when a rvalue or base conversion has the bad_p field set.
+
 2008-07-18  Kris Van Hees  <kris.van.hees@oracle.com>
 
        * rtti.c (emit_support_tinfos): Add char16_type_node and
index 368d95a..3c54001 100644 (file)
@@ -4510,7 +4510,9 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
   if (convs->bad_p
       && convs->kind != ck_user
       && convs->kind != ck_ambig
-      && convs->kind != ck_ref_bind)
+      && convs->kind != ck_ref_bind
+      && convs->kind != ck_rvalue
+      && convs->kind != ck_base)
     {
       conversion *t = convs;
       for (; t; t = convs->u.next)
index 79793fd..38e498c 100644 (file)
@@ -1,3 +1,8 @@
+2008-07-18  Dodji Seketeli  <dseketel@redhat.com>
+
+       PR c++/36407
+       * g++.dg/conversion/op5.C: New testcase.
+
 2008-07-18  Kris Van Hees  <kris.van.hees@oracle.com>
 
        Tests for char16_t and char32_t support.
diff --git a/gcc/testsuite/g++.dg/conversion/op5.C b/gcc/testsuite/g++.dg/conversion/op5.C
new file mode 100644 (file)
index 0000000..69ef996
--- /dev/null
@@ -0,0 +1,20 @@
+// Contributed by Dodji Seketeli <dseketel@redhat.com>
+// Origin: PR c++/36407 
+// { dg-do compile }
+
+struct A
+{
+  A (const A&);
+};
+
+struct B
+{
+  operator A&();
+};
+
+void
+foo (const B& b)
+{
+  const A a = b; // { dg-error "conversion from 'const B' to non-scalar type 'const A' requested" }
+}
+