diff options
author | lrh2000 <lrh2000@pku.edu.cn> | 2021-04-24 14:53:14 +0800 |
---|---|---|
committer | lrh2000 <lrh2000@pku.edu.cn> | 2021-04-25 23:51:33 +0800 |
commit | e57b6895defde89d686620fa865e8edac637c0c5 (patch) | |
tree | 16a2d2653fcde3c638d02ccb13492c2a341ff762 | |
parent | 041003da86f895ba5b00ae4a683996131d0441bf (diff) | |
download | gcc-e57b6895defde89d686620fa865e8edac637c0c5.zip gcc-e57b6895defde89d686620fa865e8edac637c0c5.tar.gz gcc-e57b6895defde89d686620fa865e8edac637c0c5.tar.bz2 |
Clean up the compilation of block expressions
-rw-r--r-- | gcc/rust/backend/rust-compile.cc | 69 | ||||
-rw-r--r-- | gcc/testsuite/rust.test/execute/block_expr1.rs | 8 | ||||
-rw-r--r-- | gcc/testsuite/rust.test/execute/func1.rs | 5 |
3 files changed, 36 insertions, 46 deletions
diff --git a/gcc/rust/backend/rust-compile.cc b/gcc/rust/backend/rust-compile.cc index 9375dd0..4893541 100644 --- a/gcc/rust/backend/rust-compile.cc +++ b/gcc/rust/backend/rust-compile.cc @@ -234,32 +234,19 @@ CompileBlock::visit (HIR::BlockExpr &expr) for (auto &s : expr.get_statements ()) { auto compiled_expr = CompileStmt::Compile (s.get (), ctx); - if (compiled_expr == nullptr) - continue; - - if (result == nullptr) + if (compiled_expr != nullptr) { - Bstatement *final_stmt + Bstatement *compiled_stmt = ctx->get_backend ()->expression_statement (fnctx.fndecl, compiled_expr); - ctx->add_statement (final_stmt); - } - else - { - Bexpression *result_reference - = ctx->get_backend ()->var_expression (result, - s->get_locus_slow ()); - - Bstatement *assignment = ctx->get_backend ()->assignment_statement ( - fnctx.fndecl, result_reference, compiled_expr, expr.get_locus ()); - ctx->add_statement (assignment); + ctx->add_statement (compiled_stmt); } } if (expr.has_expr ()) { - // the previous passes will ensure this is a valid return - // dead code elimination should remove any bad trailing expressions + // the previous passes will ensure this is a valid return or + // a valid trailing expression Bexpression *compiled_expr = CompileExpr::Compile (expr.expr.get (), ctx); if (compiled_expr != nullptr) { @@ -390,14 +377,29 @@ HIRCompileBase::compile_function_body ( auto compiled_expr = CompileStmt::Compile (s.get (), ctx); if (compiled_expr != nullptr) { + Bstatement *compiled_stmt + = ctx->get_backend ()->expression_statement (fndecl, compiled_expr); + ctx->add_statement (compiled_stmt); + } + } + + if (function_body->has_expr ()) + { + // the previous passes will ensure this is a valid return + // or a valid trailing expression + Bexpression *compiled_expr + = CompileExpr::Compile (function_body->expr.get (), ctx); + + if (compiled_expr != nullptr) + { if (has_return_type) { std::vector<Bexpression *> retstmts; retstmts.push_back (compiled_expr); - auto ret - = ctx->get_backend ()->return_statement (fndecl, retstmts, - s->get_locus_slow ()); + auto ret = ctx->get_backend ()->return_statement ( + fndecl, retstmts, + function_body->get_final_expr ()->get_locus_slow ()); ctx->add_statement (ret); } else @@ -409,31 +411,6 @@ HIRCompileBase::compile_function_body ( } } } - - if (function_body->has_expr ()) - { - // the previous passes will ensure this is a valid return - // dead code elimination should remove any bad trailing expressions - Bexpression *compiled_expr - = CompileExpr::Compile (function_body->expr.get (), ctx); - - if (has_return_type && compiled_expr) - { - std::vector<Bexpression *> retstmts; - retstmts.push_back (compiled_expr); - - auto ret = ctx->get_backend ()->return_statement ( - fndecl, retstmts, - function_body->get_final_expr ()->get_locus_slow ()); - ctx->add_statement (ret); - } - else if (compiled_expr) - { - Bstatement *final_stmt - = ctx->get_backend ()->expression_statement (fndecl, compiled_expr); - ctx->add_statement (final_stmt); - } - } } } // namespace Compile diff --git a/gcc/testsuite/rust.test/execute/block_expr1.rs b/gcc/testsuite/rust.test/execute/block_expr1.rs new file mode 100644 index 0000000..d561f8c --- /dev/null +++ b/gcc/testsuite/rust.test/execute/block_expr1.rs @@ -0,0 +1,8 @@ +fn main() -> i32 { + let ret = { + 1; + 2; + 0 + }; + ret +} diff --git a/gcc/testsuite/rust.test/execute/func1.rs b/gcc/testsuite/rust.test/execute/func1.rs new file mode 100644 index 0000000..0a093d8 --- /dev/null +++ b/gcc/testsuite/rust.test/execute/func1.rs @@ -0,0 +1,5 @@ +fn main() -> i32 { + 1; + 2; + 0 +} |