aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/backend/rust-compile-block.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/rust/backend/rust-compile-block.cc')
-rw-r--r--gcc/rust/backend/rust-compile-block.cc41
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;