diff options
Diffstat (limited to 'gcc/rust/backend/rust-compile-block.cc')
-rw-r--r-- | gcc/rust/backend/rust-compile-block.cc | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/gcc/rust/backend/rust-compile-block.cc b/gcc/rust/backend/rust-compile-block.cc index 470ece2..5591d95 100644 --- a/gcc/rust/backend/rust-compile-block.cc +++ b/gcc/rust/backend/rust-compile-block.cc @@ -71,28 +71,33 @@ CompileBlock::visit (HIR::BlockExpr &expr) if (expr.has_expr ()) { - // the previous passes will ensure this is a valid return or - // a valid trailing expression tree compiled_expr = CompileExpr::Compile (expr.expr.get (), ctx); - if (compiled_expr != nullptr) + if (result != nullptr) { - if (result == nullptr) - { - ctx->add_statement (compiled_expr); - } - else - { - tree result_reference = ctx->get_backend ()->var_expression ( - result, expr.get_final_expr ()->get_locus ()); - - tree assignment - = ctx->get_backend ()->assignment_statement (result_reference, - compiled_expr, - expr.get_locus ()); - ctx->add_statement (assignment); - } + Location locus = expr.get_final_expr ()->get_locus (); + tree result_reference + = ctx->get_backend ()->var_expression (result, locus); + + tree assignment + = ctx->get_backend ()->assignment_statement (result_reference, + compiled_expr, + expr.get_locus ()); + ctx->add_statement (assignment); } } + else if (result != nullptr) + { + Location locus = expr.get_locus (); + tree compiled_expr = unit_expression (ctx, expr.get_locus ()); + tree result_reference + = ctx->get_backend ()->var_expression (result, locus); + + tree assignment + = ctx->get_backend ()->assignment_statement (result_reference, + compiled_expr, + expr.get_locus ()); + ctx->add_statement (assignment); + } ctx->pop_block (); translated = new_block; |