aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2022-06-01 10:53:37 +0100
committerPhilip Herron <philip.herron@embecosm.com>2022-06-01 10:53:37 +0100
commit92f9eb46ec0ef70c808db613da4312af09f736df (patch)
tree220d82606fbf3cc4b807898db7eac8af844a6155
parentf6589ca957b2a1d0bea6c43dd60e37b06cb04ab3 (diff)
downloadgcc-92f9eb46ec0ef70c808db613da4312af09f736df.zip
gcc-92f9eb46ec0ef70c808db613da4312af09f736df.tar.gz
gcc-92f9eb46ec0ef70c808db613da4312af09f736df.tar.bz2
Add hir lowering to ForLoopExpr this will eventually all become a simple HIR::LoopExpr
-rw-r--r--gcc/rust/hir/rust-ast-lower-block.h2
-rw-r--r--gcc/rust/hir/rust-ast-lower-expr.h5
-rw-r--r--gcc/rust/hir/rust-ast-lower.cc26
3 files changed, 33 insertions, 0 deletions
diff --git a/gcc/rust/hir/rust-ast-lower-block.h b/gcc/rust/hir/rust-ast-lower-block.h
index 5c328b5..b8f7175 100644
--- a/gcc/rust/hir/rust-ast-lower-block.h
+++ b/gcc/rust/hir/rust-ast-lower-block.h
@@ -225,6 +225,8 @@ public:
void visit (AST::WhileLoopExpr &expr) override;
+ void visit (AST::ForLoopExpr &expr) override;
+
void visit (AST::MatchExpr &expr) override;
private:
diff --git a/gcc/rust/hir/rust-ast-lower-expr.h b/gcc/rust/hir/rust-ast-lower-expr.h
index 5ae5386..a3f8d6e 100644
--- a/gcc/rust/hir/rust-ast-lower-expr.h
+++ b/gcc/rust/hir/rust-ast-lower-expr.h
@@ -579,6 +579,11 @@ public:
translated = ASTLoweringExprWithBlock::translate (&expr, &terminated);
}
+ void visit (AST::ForLoopExpr &expr) override
+ {
+ translated = ASTLoweringExprWithBlock::translate (&expr, &terminated);
+ }
+
void visit (AST::BreakExpr &expr) override
{
HIR::Lifetime break_label = lower_lifetime (expr.get_label ());
diff --git a/gcc/rust/hir/rust-ast-lower.cc b/gcc/rust/hir/rust-ast-lower.cc
index d8a0488..b3b0ee8 100644
--- a/gcc/rust/hir/rust-ast-lower.cc
+++ b/gcc/rust/hir/rust-ast-lower.cc
@@ -324,6 +324,32 @@ ASTLoweringExprWithBlock::visit (AST::WhileLoopExpr &expr)
}
void
+ASTLoweringExprWithBlock::visit (AST::ForLoopExpr &expr)
+{
+ HIR::BlockExpr *loop_block
+ = ASTLoweringBlock::translate (expr.get_loop_block ().get (), &terminated);
+ HIR::LoopLabel loop_label = lower_loop_label (expr.get_loop_label ());
+ HIR::Expr *iterator_expr
+ = ASTLoweringExpr::translate (expr.get_iterator_expr ().get (),
+ &terminated);
+ HIR::Pattern *loop_pattern
+ = ASTLoweringPattern::translate (expr.get_pattern ().get ());
+
+ auto crate_num = mappings->get_current_crate ();
+ Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
+ mappings->get_next_hir_id (crate_num),
+ UNKNOWN_LOCAL_DEFID);
+
+ translated
+ = new HIR::ForLoopExpr (mapping,
+ std::unique_ptr<HIR::Pattern> (loop_pattern),
+ std::unique_ptr<HIR::Expr> (iterator_expr),
+ std::unique_ptr<HIR::BlockExpr> (loop_block),
+ expr.get_locus (), std::move (loop_label),
+ expr.get_outer_attrs ());
+}
+
+void
ASTLoweringExprWithBlock::visit (AST::MatchExpr &expr)
{
HIR::Expr *branch_value