OSDN Git Service

* call.c (build_conditional_expr): Use ocp_convert to force
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 22 Oct 2000 20:21:41 +0000 (20:21 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 22 Oct 2000 20:21:41 +0000 (20:21 +0000)
        rvalue conversion.

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

gcc/cp/call.c
gcc/testsuite/g++.old-deja/g++.other/volatile1.C [new file with mode: 0644]

index 5af56a4..af79984 100644 (file)
@@ -3036,16 +3036,21 @@ build_conditional_expr (arg1, arg2, arg3)
      We need to force the lvalue-to-rvalue conversion here for class types,
      so we get TARGET_EXPRs; trying to deal with a COND_EXPR of class rvalues
      that isn't wrapped with a TARGET_EXPR plays havoc with exception
-     regions.  */
+     regions.
+
+     We use ocp_convert rather than build_user_type_conversion because the
+     latter returns NULL_TREE on failure, while the former gives an error.  */
 
   if (IS_AGGR_TYPE (TREE_TYPE (arg2)) && real_lvalue_p (arg2))
-    arg2 = build_user_type_conversion (TREE_TYPE (arg2), arg2, LOOKUP_NORMAL);
+    arg2 = ocp_convert (TREE_TYPE (arg2), arg2,
+                       CONV_IMPLICIT|CONV_FORCE_TEMP, LOOKUP_NORMAL);
   else
     arg2 = decay_conversion (arg2);
   arg2_type = TREE_TYPE (arg2);
 
   if (IS_AGGR_TYPE (TREE_TYPE (arg3)) && real_lvalue_p (arg3))
-    arg3 = build_user_type_conversion (TREE_TYPE (arg3), arg3, LOOKUP_NORMAL);
+    arg3 = ocp_convert (TREE_TYPE (arg3), arg3,
+                       CONV_IMPLICIT|CONV_FORCE_TEMP, LOOKUP_NORMAL);
   else
     arg3 = decay_conversion (arg3);
   arg3_type = TREE_TYPE (arg3);
diff --git a/gcc/testsuite/g++.old-deja/g++.other/volatile1.C b/gcc/testsuite/g++.old-deja/g++.other/volatile1.C
new file mode 100644 (file)
index 0000000..c85a394
--- /dev/null
@@ -0,0 +1,19 @@
+// Test that failed lvalue-to-rvalue conversion of vf doesn't crash the
+// compiler.
+
+class f_class
+{ };                           // ERROR - candidates
+
+volatile f_class
+ret_v_f_class()
+{
+  f_class t;
+  return t;
+}
+
+int main(void)
+{
+  volatile f_class vf;
+  0 ? ret_v_f_class() : vf;    // ERROR - can't copy volatile lvalue
+  return 0;
+}