aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/backend/rust-compile-stmt.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/rust/backend/rust-compile-stmt.h')
-rw-r--r--gcc/rust/backend/rust-compile-stmt.h88
1 files changed, 6 insertions, 82 deletions
diff --git a/gcc/rust/backend/rust-compile-stmt.h b/gcc/rust/backend/rust-compile-stmt.h
index 9bb4b7b..a0ec8b2 100644
--- a/gcc/rust/backend/rust-compile-stmt.h
+++ b/gcc/rust/backend/rust-compile-stmt.h
@@ -20,94 +20,18 @@
#define RUST_COMPILE_STMT
#include "rust-compile-base.h"
-#include "rust-compile-expr.h"
namespace Rust {
namespace Compile {
-class CompileStmt : public HIRCompileBase, public HIR::HIRStmtVisitor
+class CompileStmt : private HIRCompileBase, protected HIR::HIRStmtVisitor
{
public:
- static tree Compile (HIR::Stmt *stmt, Context *ctx)
- {
- CompileStmt compiler (ctx);
- stmt->accept_vis (compiler);
- return compiler.translated;
- }
+ static tree Compile (HIR::Stmt *stmt, Context *ctx);
- void visit (HIR::ExprStmtWithBlock &stmt) override
- {
- translated = CompileExpr::Compile (stmt.get_expr (), ctx);
- }
-
- void visit (HIR::ExprStmtWithoutBlock &stmt) override
- {
- translated = CompileExpr::Compile (stmt.get_expr (), ctx);
- }
-
- void visit (HIR::LetStmt &stmt) override
- {
- // nothing to do
- if (!stmt.has_init_expr ())
- return;
-
- const HIR::Pattern &stmt_pattern = *stmt.get_pattern ();
- HirId stmt_id = stmt_pattern.get_pattern_mappings ().get_hirid ();
-
- TyTy::BaseType *ty = nullptr;
- if (!ctx->get_tyctx ()->lookup_type (stmt_id, &ty))
- {
- // FIXME this should be an assertion instead
- rust_fatal_error (stmt.get_locus (),
- "failed to lookup variable declaration type");
- return;
- }
-
- Bvariable *var = nullptr;
- if (!ctx->lookup_var_decl (stmt_id, &var))
- {
- // FIXME this should be an assertion instead and use error mark node
- rust_fatal_error (stmt.get_locus (),
- "failed to lookup compiled variable declaration");
- return;
- }
-
- tree init = CompileExpr::Compile (stmt.get_init_expr (), ctx);
- // FIXME use error_mark_node, check that CompileExpr returns error_mark_node
- // on failure and make this an assertion
- if (init == nullptr)
- return;
-
- TyTy::BaseType *actual = nullptr;
- bool ok = ctx->get_tyctx ()->lookup_type (
- stmt.get_init_expr ()->get_mappings ().get_hirid (), &actual);
- rust_assert (ok);
- tree stmt_type = TyTyResolveCompile::compile (ctx, ty);
-
- Location lvalue_locus = stmt.get_pattern ()->get_locus ();
- Location rvalue_locus = stmt.get_init_expr ()->get_locus ();
- TyTy::BaseType *expected = ty;
- init = coercion_site (stmt.get_mappings ().get_hirid (), init, actual,
- expected, lvalue_locus, rvalue_locus);
-
- auto fnctx = ctx->peek_fn ();
- if (ty->is_unit ())
- {
- ctx->add_statement (init);
-
- auto unit_type_init_expr
- = ctx->get_backend ()->constructor_expression (stmt_type, false, {},
- -1, rvalue_locus);
- auto s = ctx->get_backend ()->init_statement (fnctx.fndecl, var,
- unit_type_init_expr);
- ctx->add_statement (s);
- }
- else
- {
- auto s = ctx->get_backend ()->init_statement (fnctx.fndecl, var, init);
- ctx->add_statement (s);
- }
- }
+ void visit (HIR::ExprStmtWithBlock &stmt) override;
+ void visit (HIR::ExprStmtWithoutBlock &stmt) override;
+ void visit (HIR::LetStmt &stmt) override;
// Empty visit for unused Stmt HIR nodes.
void visit (HIR::TupleStruct &) override {}
@@ -134,7 +58,7 @@ public:
void visit (HIR::EmptyStmt &) override {}
private:
- CompileStmt (Context *ctx) : HIRCompileBase (ctx), translated (nullptr) {}
+ CompileStmt (Context *ctx);
tree translated;
};