Commit db5ae31b by Jason Merrill

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
parent 3e555c7d
...@@ -3036,16 +3036,21 @@ build_conditional_expr (arg1, arg2, arg3) ...@@ -3036,16 +3036,21 @@ build_conditional_expr (arg1, arg2, arg3)
We need to force the lvalue-to-rvalue conversion here for class types, 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 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 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)) 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 else
arg2 = decay_conversion (arg2); arg2 = decay_conversion (arg2);
arg2_type = TREE_TYPE (arg2); arg2_type = TREE_TYPE (arg2);
if (IS_AGGR_TYPE (TREE_TYPE (arg3)) && real_lvalue_p (arg3)) 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 else
arg3 = decay_conversion (arg3); arg3 = decay_conversion (arg3);
arg3_type = TREE_TYPE (arg3); arg3_type = TREE_TYPE (arg3);
......
// 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment