From a65fd2d71bc27fe03217fa582f7a9e99ce60920d Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 7 May 2003 11:00:10 -0400 Subject: [PATCH] call.c (build_conditional_expr): Don't assume that the folded expression has result_type. * call.c (build_conditional_expr): Don't assume that the folded expression has result_type. From-SVN: r66561 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/call.c | 9 ++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 15ca7a65013..4955d64a83e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2003-05-07 Jason Merrill + + * call.c (build_conditional_expr): Don't assume that the folded + expression has result_type. + 2003-05-06 Kriang Lerdsuwanakij * typeck.c (build_unary_op): Deal with const qualifier in diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 44683ff5b83..5d7e3dfe963 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -3530,16 +3530,19 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3) valid_operands: result = fold (build (COND_EXPR, result_type, arg1, arg2, arg3)); + /* We can't use result_type below, as fold might have returned a + throw_expr. */ + /* Expand both sides into the same slot, hopefully the target of the ?: expression. We used to check for TARGET_EXPRs here, but now we sometimes wrap them in NOP_EXPRs so the test would fail. */ - if (!lvalue_p && IS_AGGR_TYPE (result_type)) - result = build_target_expr_with_type (result, result_type); + if (!lvalue_p && IS_AGGR_TYPE (TREE_TYPE (result))) + result = get_target_expr (result); /* If this expression is an rvalue, but might be mistaken for an lvalue, we must add a NON_LVALUE_EXPR. */ if (!lvalue_p && real_lvalue_p (result)) - result = build1 (NON_LVALUE_EXPR, result_type, result); + result = build1 (NON_LVALUE_EXPR, TREE_TYPE (result), result); return result; } -- 2.30.2