From db5ae31b195c729dffebe3f057a4d1f5aa43427a Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Sun, 22 Oct 2000 16:21:41 -0400 Subject: [PATCH] call.c (build_conditional_expr): Use ocp_convert to force rvalue conversion. * call.c (build_conditional_expr): Use ocp_convert to force rvalue conversion. From-SVN: r37009 --- gcc/cp/call.c | 11 ++++++++--- .../g++.old-deja/g++.other/volatile1.C | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.old-deja/g++.other/volatile1.C diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 5af56a47444..af79984a396 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -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 index 00000000000..c85a394eec7 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/volatile1.C @@ -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; +} -- 2.30.2