aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/backend
diff options
context:
space:
mode:
authorOwen Avery <powerboat9.gamer@gmail.com>2023-03-15 16:35:47 -0400
committerPhilip Herron <philip.herron@embecosm.com>2023-03-17 16:31:54 +0000
commit3d4b1871910e4d7b4ef171f3fdeab5ec0e78a167 (patch)
tree8f81adecf100bc4f6a4b9e5091c943b907eea0f1 /gcc/rust/backend
parentdd4038083ef08ce8e8456261389d4b26f5dd7ace (diff)
downloadgcc-3d4b1871910e4d7b4ef171f3fdeab5ec0e78a167.zip
gcc-3d4b1871910e4d7b4ef171f3fdeab5ec0e78a167.tar.gz
gcc-3d4b1871910e4d7b4ef171f3fdeab5ec0e78a167.tar.bz2
Unify HIR::IfExprConseqIf{,Let} into HIR::IfExprConseqElse
This should simplify 'if' expression handling to match future simplifications to 'if let' expression handling. gcc/rust/ChangeLog: * typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): Remove IfExprConseqIf visitor. * typecheck/rust-hir-type-check-expr.h (TypeCheckExpr::visit): Remove IfExprConseqIf{,Let} visitor. * backend/rust-compile-block.cc (CompileConditionalBlocks::visit): Remove IfExprConseqIf visitor. * backend/rust-compile-block.h (CompileConditionalBlocks::visit): Remove IfExprConseqIf{,Let} visitors. (CompileExprWithBlock::visit): Remove IfExprConseqIf{,Let} visitors, implement BlockExpr visitor. * backend/rust-compile-expr.cc (CompileExpr::visit): Remove IfExprConseqIf visitor. * backend/rust-compile-expr.h (CompileExpr::visit): Remove IfExprConseqIf{,Let} visitors. * checks/lints/rust-lint-marklive.h (MarkLive::visit): Remove IfExprConseqIf visitor. * checks/errors/rust-const-checker.cc (ConstChecker::visit): Remove IfExprConseqIf{,Let} visitors. * checks/errors/rust-const-checker.h (ConstChecker::visit): Remove IfExprConseqIf{,Let} visitors. * checks/errors/rust-unsafe-checker.cc (UnsafeChecker::visit): Remove IfExprConseqIf{,Let} visitors. * checks/errors/rust-unsafe-checker.h (UnsafeChecker::visit): Remove IfExprConseqIf{,Let} visitors. * checks/errors/privacy/rust-privacy-reporter.cc (PrivacyReporter::visit): Remove IfExprConseqIf{,Let} visitors. * checks/errors/privacy/rust-privacy-reporter.h (PrivacyReporter::visit): Remove IfExprConseqIf{,Let} visitors. * hir/tree/rust-hir-expr.h (class IfExprConseqElse): Make else_block ExprWithBlock. (class IfExprConseqIf): Remove. (class IfExprConseqIfLet): Remove. * hir/tree/rust-hir-full-decls.h (class IfExprConseqIf): Remove. (class IfExprConseqIfLet): Remove. * hir/tree/rust-hir.cc (IfExprConseqElse::as_string): Adjust output. (IfExprConseqIf::as_string): Remove. (IfExprConseqIfLet::as_string): Remove. (IfExprConseqIf::accept_vis): Remove. (IfExprConseqIfLet::accept_vis): Remove. * hir/tree/rust-hir-visitor.h (HIRFullVisitor::visit): Remove IfExprConseqIf{,Let} visitors. (HIRFullVisitorBase::visit): Remove IfExprConseqIf{,Let} visitors. (HIRExpressionVisitor::visit): Remove IfExprConseqIf{,Let} visitors. * hir/rust-hir-dump.cc (Dump::visit): Remove IfExprConseqIf{,Let} visitors. * hir/rust-hir-dump.h (Dump::visit): Remove IfExprConseqIf{,Let} visitors. * hir/rust-ast-lower.cc (ASTLoweringIfBlock::visit): Replace HIR::IfExprConseqIf with HIR::IfExprConseqElse. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
Diffstat (limited to 'gcc/rust/backend')
-rw-r--r--gcc/rust/backend/rust-compile-block.cc22
-rw-r--r--gcc/rust/backend/rust-compile-block.h8
-rw-r--r--gcc/rust/backend/rust-compile-expr.cc37
-rw-r--r--gcc/rust/backend/rust-compile-expr.h2
4 files changed, 6 insertions, 63 deletions
diff --git a/gcc/rust/backend/rust-compile-block.cc b/gcc/rust/backend/rust-compile-block.cc
index 83f2a37..74b6f9a 100644
--- a/gcc/rust/backend/rust-compile-block.cc
+++ b/gcc/rust/backend/rust-compile-block.cc
@@ -118,33 +118,19 @@ CompileConditionalBlocks::visit (HIR::IfExprConseqElse &expr)
tree fndecl = fnctx.fndecl;
tree condition_expr = CompileExpr::Compile (expr.get_if_condition (), ctx);
tree then_block = CompileBlock::compile (expr.get_if_block (), ctx, result);
- tree else_block = CompileBlock::compile (expr.get_else_block (), ctx, result);
-
- translated
- = ctx->get_backend ()->if_statement (fndecl, condition_expr, then_block,
- else_block, expr.get_locus ());
-}
-
-void
-CompileConditionalBlocks::visit (HIR::IfExprConseqIf &expr)
-{
- fncontext fnctx = ctx->peek_fn ();
- tree fndecl = fnctx.fndecl;
- tree condition_expr = CompileExpr::Compile (expr.get_if_condition (), ctx);
- tree then_block = CompileBlock::compile (expr.get_if_block (), ctx, result);
// else block
std::vector<Bvariable *> locals;
- Location start_location = expr.get_conseq_if_expr ()->get_locus ();
- Location end_location = expr.get_conseq_if_expr ()->get_locus (); // FIXME
+ Location start_location = expr.get_else_block ()->get_locus ();
+ Location end_location = expr.get_else_block ()->get_locus (); // FIXME
tree enclosing_scope = ctx->peek_enclosing_scope ();
tree else_block = ctx->get_backend ()->block (fndecl, enclosing_scope, locals,
start_location, end_location);
ctx->push_block (else_block);
tree else_stmt_decl
- = CompileConditionalBlocks::compile (expr.get_conseq_if_expr (), ctx,
- result);
+ = CompileExprWithBlock::compile (expr.get_else_block (), ctx, result);
+
ctx->add_statement (else_stmt_decl);
ctx->pop_block ();
diff --git a/gcc/rust/backend/rust-compile-block.h b/gcc/rust/backend/rust-compile-block.h
index 0ccf81f..666eb09 100644
--- a/gcc/rust/backend/rust-compile-block.h
+++ b/gcc/rust/backend/rust-compile-block.h
@@ -52,7 +52,6 @@ public:
void visit (HIR::IfExpr &expr) override;
void visit (HIR::IfExprConseqElse &expr) override;
- void visit (HIR::IfExprConseqIf &expr) override;
// Empty visit for unused Expression HIR nodes.
void visit (HIR::PathInExpression &) override {}
@@ -97,7 +96,6 @@ public:
void visit (HIR::WhileLoopExpr &) override {}
void visit (HIR::WhileLetLoopExpr &) override {}
void visit (HIR::ForLoopExpr &) override {}
- void visit (HIR::IfExprConseqIfLet &) override {}
void visit (HIR::IfLetExpr &) override {}
void visit (HIR::IfLetExprConseqElse &) override {}
void visit (HIR::IfLetExprConseqIf &) override {}
@@ -137,9 +135,9 @@ public:
translated = CompileConditionalBlocks::compile (&expr, ctx, result);
}
- void visit (HIR::IfExprConseqIf &expr) override
+ void visit (HIR::BlockExpr &expr) override
{
- translated = CompileConditionalBlocks::compile (&expr, ctx, result);
+ translated = CompileBlock::compile (&expr, ctx, result);
}
// Empty visit for unused Expression HIR nodes.
@@ -170,7 +168,6 @@ public:
void visit (HIR::CallExpr &) override {}
void visit (HIR::MethodCallExpr &) override {}
void visit (HIR::FieldAccessExpr &) override {}
- void visit (HIR::BlockExpr &) override {}
void visit (HIR::ContinueExpr &) override {}
void visit (HIR::BreakExpr &) override {}
void visit (HIR::RangeFromToExpr &) override {}
@@ -185,7 +182,6 @@ public:
void visit (HIR::WhileLoopExpr &) override {}
void visit (HIR::WhileLetLoopExpr &) override {}
void visit (HIR::ForLoopExpr &) override {}
- void visit (HIR::IfExprConseqIfLet &) override {}
void visit (HIR::IfLetExpr &) override {}
void visit (HIR::IfLetExprConseqElse &) override {}
void visit (HIR::IfLetExprConseqIf &) override {}
diff --git a/gcc/rust/backend/rust-compile-expr.cc b/gcc/rust/backend/rust-compile-expr.cc
index cf6802e..6a7b2eb 100644
--- a/gcc/rust/backend/rust-compile-expr.cc
+++ b/gcc/rust/backend/rust-compile-expr.cc
@@ -345,43 +345,6 @@ CompileExpr::visit (HIR::IfExprConseqElse &expr)
}
void
-CompileExpr::visit (HIR::IfExprConseqIf &expr)
-{
- TyTy::BaseType *if_type = nullptr;
- if (!ctx->get_tyctx ()->lookup_type (expr.get_mappings ().get_hirid (),
- &if_type))
- {
- rust_error_at (expr.get_locus (),
- "failed to lookup type of IfExprConseqElse");
- return;
- }
-
- Bvariable *tmp = NULL;
- bool needs_temp = !if_type->is_unit ();
- if (needs_temp)
- {
- fncontext fnctx = ctx->peek_fn ();
- tree enclosing_scope = ctx->peek_enclosing_scope ();
- tree block_type = TyTyResolveCompile::compile (ctx, if_type);
-
- bool is_address_taken = false;
- tree ret_var_stmt = nullptr;
- tmp = ctx->get_backend ()->temporary_variable (
- fnctx.fndecl, enclosing_scope, block_type, NULL, is_address_taken,
- expr.get_locus (), &ret_var_stmt);
- ctx->add_statement (ret_var_stmt);
- }
-
- auto stmt = CompileConditionalBlocks::compile (&expr, ctx, tmp);
- ctx->add_statement (stmt);
-
- if (tmp != NULL)
- {
- translated = ctx->get_backend ()->var_expression (tmp, expr.get_locus ());
- }
-}
-
-void
CompileExpr::visit (HIR::BlockExpr &expr)
{
TyTy::BaseType *block_tyty = nullptr;
diff --git a/gcc/rust/backend/rust-compile-expr.h b/gcc/rust/backend/rust-compile-expr.h
index 150a7a4..d23d1d1 100644
--- a/gcc/rust/backend/rust-compile-expr.h
+++ b/gcc/rust/backend/rust-compile-expr.h
@@ -45,7 +45,6 @@ public:
void visit (HIR::NegationExpr &expr) override;
void visit (HIR::TypeCastExpr &expr) override;
void visit (HIR::IfExpr &expr) override;
- void visit (HIR::IfExprConseqIf &expr) override;
void visit (HIR::IfExprConseqElse &expr) override;
void visit (HIR::BlockExpr &expr) override;
void visit (HIR::UnsafeBlockExpr &expr) override;
@@ -77,7 +76,6 @@ public:
// TODO
// these need to be sugared in the HIR to if statements and a match
void visit (HIR::WhileLetLoopExpr &) override {}
- void visit (HIR::IfExprConseqIfLet &) override {}
void visit (HIR::IfLetExpr &) override {}
void visit (HIR::IfLetExprConseqElse &) override {}
void visit (HIR::IfLetExprConseqIf &) override {}