diff options
Diffstat (limited to 'gcc/rust/backend/rust-compile-stmt.h')
-rw-r--r-- | gcc/rust/backend/rust-compile-stmt.h | 88 |
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; }; |