From df39af7db0b1ee818dc03898ac4466633ae7ebbc Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 24 Aug 1999 21:23:56 +0000 Subject: [PATCH] call.c (build_conditional_expr): Fix typo. * call.c (build_conditional_expr): Fix typo. * typeck.c (build_modify_expr, COND_EXPR): Make sure we've got an lvalue before trying to mess with the sides. * error.c (dump_expr, CONVERT_EXPR): Handle (void) properly. From-SVN: r28826 --- gcc/cp/ChangeLog | 8 ++++++++ gcc/cp/call.c | 2 +- gcc/cp/error.c | 8 +++++++- gcc/cp/typeck.c | 22 ++++++++++++++++------ 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8ceb65995c0..9f13fc93047 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +1999-08-24 Jason Merrill + + * call.c (build_conditional_expr): Fix typo. + * typeck.c (build_modify_expr, COND_EXPR): Make sure we've got an + lvalue before trying to mess with the sides. + + * error.c (dump_expr, CONVERT_EXPR): Handle (void) properly. + Mon Aug 23 22:17:20 1999 Mumit Khan * g++spec.c (lang_specific_driver): Add room for NULL in arglist. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index f193a4b7b16..eed211f884a 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -2825,7 +2825,7 @@ build_conditional_expr (arg1, arg2, arg3) if ((TREE_CODE (arg2) == THROW_EXPR) ^ (TREE_CODE (arg3) == THROW_EXPR)) result_type = ((TREE_CODE (arg2) == THROW_EXPR) - ? arg2_type : arg3_type); + ? arg3_type : arg2_type); else if (arg2_void_p && arg3_void_p) result_type = void_type_node; else diff --git a/gcc/cp/error.c b/gcc/cp/error.c index b6598ff30a4..5b37717329c 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -1547,7 +1547,13 @@ dump_expr (t, nop) break; case CONVERT_EXPR: - dump_unary_op ("+", t, nop); + if (same_type_p (TREE_TYPE (t), void_type_node)) + { + OB_PUTS ("(void)"); + dump_expr (TREE_OPERAND (t, 0), 0); + } + else + dump_unary_op ("+", t, nop); break; case ADDR_EXPR: diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 8ebeed3fa45..cc476b208b4 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -5734,12 +5734,22 @@ build_modify_expr (lhs, modifycode, rhs) /* Produce (a ? (b = rhs) : (c = rhs)) except that the RHS goes through a save-expr so the code to compute it is only emitted once. */ - tree cond - = build_conditional_expr (TREE_OPERAND (lhs, 0), - build_modify_expr (cp_convert (TREE_TYPE (lhs), TREE_OPERAND (lhs, 1)), - modifycode, rhs), - build_modify_expr (cp_convert (TREE_TYPE (lhs), TREE_OPERAND (lhs, 2)), - modifycode, rhs)); + tree cond; + + /* Check this here to avoid odd errors when trying to convert + a throw to the type of the COND_EXPR. */ + if (!lvalue_or_else (lhs, "assignment")) + return error_mark_node; + + cond = build_conditional_expr + (TREE_OPERAND (lhs, 0), + build_modify_expr (cp_convert (TREE_TYPE (lhs), + TREE_OPERAND (lhs, 1)), + modifycode, rhs), + build_modify_expr (cp_convert (TREE_TYPE (lhs), + TREE_OPERAND (lhs, 2)), + modifycode, rhs)); + if (cond == error_mark_node) return cond; /* Make sure the code to compute the rhs comes out