OSDN Git Service

PR c++/9537
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 5 May 2003 21:11:13 +0000 (21:11 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 5 May 2003 21:11:13 +0000 (21:11 +0000)
        * call.c (conditional_conversion): Build an RVALUE_CONV if
        we're just changing the cv-quals.
        (build_conditional_expr): Don't call convert to change
        cv-quals.

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

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

index 3567da7..40a4de1 100644 (file)
@@ -1,3 +1,11 @@
+2003-05-05  Jason Merrill  <jason@redhat.com>
+
+       PR c++/9537
+       * call.c (conditional_conversion): Build an RVALUE_CONV if
+       we're just changing the cv-quals.
+       (build_conditional_expr): Don't call convert to change
+       cv-quals.
+
 2003-05-05  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        PR c++/10496
index 2340d41..44683ff 100644 (file)
@@ -3187,7 +3187,10 @@ conditional_conversion (tree e1, tree e2)
      same cv-qualification as, or a greater cv-qualification than, the
      cv-qualification of T1.  If the conversion is applied, E1 is
      changed to an rvalue of type T2 that still refers to the original
-     source class object (or the appropriate subobject thereof).  */
+     source class object (or the appropriate subobject thereof).
+
+     FIXME we can't express an rvalue that refers to the original object;
+     we have to create a new one.  */
   if (CLASS_TYPE_P (t1) && CLASS_TYPE_P (t2)
       && same_or_base_type_p (TYPE_MAIN_VARIANT (t2), 
                              TYPE_MAIN_VARIANT (t1)))
@@ -3197,7 +3200,12 @@ conditional_conversion (tree e1, tree e2)
          conv = build1 (IDENTITY_CONV, t1, e1);
          if (!same_type_p (TYPE_MAIN_VARIANT (t1), 
                            TYPE_MAIN_VARIANT (t2)))
-           conv = build_conv (BASE_CONV, t2, conv);
+           {
+             conv = build_conv (BASE_CONV, t2, conv);
+             NEED_TEMPORARY_P (conv) = 1;
+           }
+         else
+           conv = build_conv (RVALUE_CONV, t2, conv);
          return conv;
        }
       else
@@ -3337,11 +3345,8 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3)
        {
          arg2 = convert_like (conv2, arg2);
          arg2 = convert_from_reference (arg2);
-         /* That may not quite have done the trick.  If the two types
-            are cv-qualified variants of one another, we will have
-            just used an IDENTITY_CONV.  */
          if (!same_type_p (TREE_TYPE (arg2), arg3_type))
-           arg2 = convert (arg3_type, arg2);
+           abort ();
          arg2_type = TREE_TYPE (arg2);
        }
       else if (conv3 && !ICS_BAD_FLAG (conv3))
@@ -3349,7 +3354,7 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3)
          arg3 = convert_like (conv3, arg3);
          arg3 = convert_from_reference (arg3);
          if (!same_type_p (TREE_TYPE (arg3), arg2_type))
-           arg3 = convert (arg2_type, arg3);
+           abort ();
          arg3_type = TREE_TYPE (arg3);
        }
     }
diff --git a/gcc/testsuite/g++.dg/conversion/cond3.C b/gcc/testsuite/g++.dg/conversion/cond3.C
new file mode 100644 (file)
index 0000000..da052d4
--- /dev/null
@@ -0,0 +1,20 @@
+// PR c++/9537
+
+class String
+{
+public:
+    String();
+    String( char *str );
+    operator char *();
+};
+
+const String operator+( String s1, String )
+{
+  return s1;
+}
+
+String valGlue(const String before)
+{
+    String ret;
+    return false ? ret : before + before;
+}