diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2011-02-19 05:04:01 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2011-02-19 05:04:01 +0000 |
commit | 54ba93231b4a4d8ca3007949c9d68b6a09440c26 (patch) | |
tree | 04b255f43117544376b2c612af76c36bcaef99c6 /gcc | |
parent | 8b0210047962c7342d23a333703203690b76ba3d (diff) | |
download | gcc-54ba93231b4a4d8ca3007949c9d68b6a09440c26.zip gcc-54ba93231b4a4d8ca3007949c9d68b6a09440c26.tar.gz gcc-54ba93231b4a4d8ca3007949c9d68b6a09440c26.tar.bz2 |
Don't crash on constant right shift.
From-SVN: r170307
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/go/gofrontend/expressions.cc | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index ebe4f28..a073f9d 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -5859,13 +5859,21 @@ Binary_expression::do_get_tree(Translate_context* context) tree eval_saved = NULL_TREE; if (is_shift_op) { - if (!DECL_P(left)) - left = save_expr(left); - if (!DECL_P(right)) - right = save_expr(right); // Make sure the values are evaluated. - eval_saved = fold_build2_loc(this->location(), COMPOUND_EXPR, - void_type_node, left, right); + if (!DECL_P(left) && TREE_SIDE_EFFECTS(left)) + { + left = save_expr(left); + eval_saved = left; + } + if (!DECL_P(right) && TREE_SIDE_EFFECTS(right)) + { + right = save_expr(right); + if (eval_saved == NULL_TREE) + eval_saved = right; + else + eval_saved = fold_build2_loc(this->location(), COMPOUND_EXPR, + void_type_node, eval_saved, right); + } } tree ret = fold_build2_loc(this->location(), @@ -5914,8 +5922,9 @@ Binary_expression::do_get_tree(Translate_context* context) ret = fold_build3_loc(this->location(), COND_EXPR, TREE_TYPE(left), compare, ret, overflow_result); - ret = fold_build2_loc(this->location(), COMPOUND_EXPR, - TREE_TYPE(ret), eval_saved, ret); + if (eval_saved != NULL_TREE) + ret = fold_build2_loc(this->location(), COMPOUND_EXPR, + TREE_TYPE(ret), eval_saved, ret); } return ret; |