re PR c++/36407 (ICE with conversion and -fpermissive)
authorDodji Seketeli <dseketel@redhat.com>
Fri, 18 Jul 2008 20:40:42 +0000 (20:40 +0000)
committerDodji Seketeli <dodji@gcc.gnu.org>
Fri, 18 Jul 2008 20:40:42 +0000 (22:40 +0200)
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.

From-SVN: r137966

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

index 6daff1e9df5b7a166602e94ef1f900c3579bacac..2112b8fd8e68768f4c4e279c166702e702a706f3 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 368d95a677f23729d46697dded6bf7dc3765327d..3c54001e3bdbbd0e5d157a3822fd9ba357df736a 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 79793fd3999a2ad832a480a218f41afb8a70bcfa..38e498c57594cea15c247cf49f55499c96d7f0fb 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" }
+}
+