This will end up getting desugared into a LoopExpr with a MatchExpr body.
gcc/rust/ChangeLog:
* backend/rust-compile-block.h: remove HIR::ForLoopExpr
* backend/rust-compile-expr.h: likewise
* checks/errors/privacy/rust-privacy-reporter.cc (PrivacyReporter::visit): likewise
* checks/errors/privacy/rust-privacy-reporter.h: likewise
* checks/errors/rust-const-checker.cc (ConstChecker::visit): likewise
* checks/errors/rust-const-checker.h: likewise
* checks/errors/rust-unsafe-checker.cc (UnsafeChecker::visit): likewise
* checks/errors/rust-unsafe-checker.h: likewise
* checks/lints/rust-lint-marklive.h: likewise
* hir/rust-ast-lower.cc (ASTLoweringExprWithBlock::visit): likewise
* hir/rust-hir-dump.cc (Dump::visit): likewise
* hir/rust-hir-dump.h: likewise
* hir/tree/rust-hir-expr.h (class ForLoopExpr): likewise
* hir/tree/rust-hir-full-decls.h (class ForLoopExpr): likewise
* hir/tree/rust-hir-visitor.h: likewise
* hir/tree/rust-hir.cc (ForLoopExpr::as_string): likewise
(ForLoopExpr::accept_vis): likewise
* typecheck/rust-hir-type-check-expr.h: likewise
Signed-off-by: Philip Herron <herron.philip@googlemail.com>
void visit (HIR::LoopExpr &) override {}
void visit (HIR::WhileLoopExpr &) override {}
void visit (HIR::WhileLetLoopExpr &) override {}
- void visit (HIR::ForLoopExpr &) override {}
void visit (HIR::IfLetExpr &) override {}
void visit (HIR::IfLetExprConseqElse &) override {}
void visit (HIR::MatchExpr &) override {}
void visit (HIR::LoopExpr &) override {}
void visit (HIR::WhileLoopExpr &) override {}
void visit (HIR::WhileLetLoopExpr &) override {}
- void visit (HIR::ForLoopExpr &) override {}
void visit (HIR::IfLetExpr &) override {}
void visit (HIR::IfLetExprConseqElse &) override {}
void visit (HIR::MatchExpr &) override {}
// TODO
void visit (HIR::ErrorPropagationExpr &) override {}
void visit (HIR::RangeToInclExpr &) override {}
- void visit (HIR::ForLoopExpr &) override {}
// TODO
// these need to be sugared in the HIR to if statements and a match
expr.get_loop_block ()->accept_vis (*this);
}
-void
-PrivacyReporter::visit (HIR::ForLoopExpr &expr)
-{
- expr.get_iterator_expr ()->accept_vis (*this);
- expr.get_loop_block ()->accept_vis (*this);
-}
-
void
PrivacyReporter::visit (HIR::IfExpr &expr)
{
virtual void visit (HIR::LoopExpr &expr);
virtual void visit (HIR::WhileLoopExpr &expr);
virtual void visit (HIR::WhileLetLoopExpr &expr);
- virtual void visit (HIR::ForLoopExpr &expr);
virtual void visit (HIR::IfExpr &expr);
virtual void visit (HIR::IfExprConseqElse &expr);
virtual void visit (HIR::IfLetExpr &expr);
expr.get_loop_block ()->accept_vis (*this);
}
-void
-ConstChecker::visit (ForLoopExpr &expr)
-{
- expr.get_iterator_expr ()->accept_vis (*this);
- expr.get_loop_block ()->accept_vis (*this);
-}
-
void
ConstChecker::visit (IfExpr &expr)
{
virtual void visit (LoopExpr &expr) override;
virtual void visit (WhileLoopExpr &expr) override;
virtual void visit (WhileLetLoopExpr &expr) override;
- virtual void visit (ForLoopExpr &expr) override;
virtual void visit (IfExpr &expr) override;
virtual void visit (IfExprConseqElse &expr) override;
virtual void visit (IfLetExpr &expr) override;
expr.get_loop_block ()->accept_vis (*this);
}
-void
-UnsafeChecker::visit (ForLoopExpr &expr)
-{
- expr.get_iterator_expr ()->accept_vis (*this);
- expr.get_loop_block ()->accept_vis (*this);
-}
-
void
UnsafeChecker::visit (IfExpr &expr)
{
virtual void visit (LoopExpr &expr) override;
virtual void visit (WhileLoopExpr &expr) override;
virtual void visit (WhileLetLoopExpr &expr) override;
- virtual void visit (ForLoopExpr &expr) override;
virtual void visit (IfExpr &expr) override;
virtual void visit (IfExprConseqElse &expr) override;
virtual void visit (IfLetExpr &expr) override;
expr.get_cond ()->accept_vis (*this);
}
- void visit (HIR::ForLoopExpr &expr) override
- {
- expr.get_loop_block ()->accept_vis (*this);
- expr.get_iterator_expr ()->accept_vis (*this);
- }
-
void visit (HIR::ExprStmt &stmt) override
{
stmt.get_expr ()->accept_vis (*this);
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 ());
+ // TODO FIXME
+
+ // 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);
+
+ gcc_unreachable ();
}
void
end ("WhileLetLoopExpr");
}
-void
-Dump::visit (ForLoopExpr &e)
-{
- begin ("ForLoopExpr");
- do_baseloopexpr (e);
-
- visit_field ("pattern", e.get_pattern ());
-
- visit_field ("iterator_expr", *e.get_iterator_expr ());
-
- end ("ForLoopExpr");
-}
-
void
Dump::visit (IfExpr &e)
{
virtual void visit (LoopExpr &) override;
virtual void visit (WhileLoopExpr &) override;
virtual void visit (WhileLetLoopExpr &) override;
- virtual void visit (ForLoopExpr &) override;
virtual void visit (IfExpr &) override;
virtual void visit (IfExprConseqElse &) override;
virtual void visit (IfLetExpr &) override;
}
};
-// For loop expression HIR node (iterator loop)
-class ForLoopExpr : public BaseLoopExpr
-{
- std::unique_ptr<Pattern> pattern;
- std::unique_ptr<Expr> iterator_expr;
-
-public:
- std::string as_string () const override;
-
- // Constructor with loop label
- ForLoopExpr (Analysis::NodeMapping mappings,
- std::unique_ptr<Pattern> loop_pattern,
- std::unique_ptr<Expr> iterator_expr,
- std::unique_ptr<BlockExpr> loop_body, location_t locus,
- LoopLabel loop_label,
- AST::AttrVec outer_attribs = AST::AttrVec ())
- : BaseLoopExpr (std::move (mappings), std::move (loop_body), locus,
- std::move (loop_label), std::move (outer_attribs)),
- pattern (std::move (loop_pattern)),
- iterator_expr (std::move (iterator_expr))
- {}
-
- // Copy constructor with clone
- ForLoopExpr (ForLoopExpr const &other)
- : BaseLoopExpr (other), pattern (other.pattern->clone_pattern ()),
- iterator_expr (other.iterator_expr->clone_expr ())
- {}
-
- // Overloaded assignment operator to clone
- ForLoopExpr &operator= (ForLoopExpr const &other)
- {
- BaseLoopExpr::operator= (other);
- pattern = other.pattern->clone_pattern ();
- iterator_expr = other.iterator_expr->clone_expr ();
- /*loop_block = other.loop_block->clone_block_expr();
- loop_label = other.loop_label;
- outer_attrs = other.outer_attrs;*/
-
- return *this;
- }
-
- // move constructors
- ForLoopExpr (ForLoopExpr &&other) = default;
- ForLoopExpr &operator= (ForLoopExpr &&other) = default;
-
- void accept_vis (HIRFullVisitor &vis) override;
- void accept_vis (HIRExpressionVisitor &vis) override;
-
- std::unique_ptr<Expr> &get_iterator_expr () { return iterator_expr; }
- std::unique_ptr<Pattern> &get_pattern () { return pattern; };
-
-protected:
- /* Use covariance to implement clone function as returning this object rather
- * than base */
- ForLoopExpr *clone_expr_impl () const override
- {
- return new ForLoopExpr (*this);
- }
-
- /* Use covariance to implement clone function as returning this object rather
- * than base */
- ForLoopExpr *clone_expr_with_block_impl () const override
- {
- return new ForLoopExpr (*this);
- }
-};
-
// forward decl for IfExpr
class IfLetExpr;
class LoopExpr;
class WhileLoopExpr;
class WhileLetLoopExpr;
-class ForLoopExpr;
class IfExpr;
class IfExprConseqElse;
class IfLetExpr;
virtual void visit (LoopExpr &expr) = 0;
virtual void visit (WhileLoopExpr &expr) = 0;
virtual void visit (WhileLetLoopExpr &expr) = 0;
- virtual void visit (ForLoopExpr &expr) = 0;
virtual void visit (IfExpr &expr) = 0;
virtual void visit (IfExprConseqElse &expr) = 0;
virtual void visit (IfLetExpr &expr) = 0;
virtual void visit (LoopExpr &) override {}
virtual void visit (WhileLoopExpr &) override {}
virtual void visit (WhileLetLoopExpr &) override {}
- virtual void visit (ForLoopExpr &) override {}
virtual void visit (IfExpr &) override {}
virtual void visit (IfExprConseqElse &) override {}
virtual void visit (IfLetExpr &) override {}
virtual void visit (LoopExpr &expr) = 0;
virtual void visit (WhileLoopExpr &expr) = 0;
virtual void visit (WhileLetLoopExpr &expr) = 0;
- virtual void visit (ForLoopExpr &expr) = 0;
virtual void visit (IfExpr &expr) = 0;
virtual void visit (IfExprConseqElse &expr) = 0;
virtual void visit (IfLetExpr &expr) = 0;
return identifier.as_string () + " = " + type->as_string ();
}
-std::string
-ForLoopExpr::as_string () const
-{
- std::string str ("ForLoopExpr: ");
-
- str += "\n Label: ";
- if (!has_loop_label ())
- {
- str += "none";
- }
- else
- {
- str += loop_label.as_string ();
- }
-
- str += "\n Pattern: " + pattern->as_string ();
-
- str += "\n Iterator expr: " + iterator_expr->as_string ();
-
- str += "\n Loop block: " + loop_block->as_string ();
-
- return str;
-}
-
std::string
RangePattern::as_string () const
{
vis.visit (*this);
}
-void
-ForLoopExpr::accept_vis (HIRFullVisitor &vis)
-{
- vis.visit (*this);
-}
-
void
IfExpr::accept_vis (HIRFullVisitor &vis)
{
vis.visit (*this);
}
-void
-ForLoopExpr::accept_vis (HIRExpressionVisitor &vis)
-{
- vis.visit (*this);
-}
-
void
TypePath::accept_vis (HIRTypeVisitor &vis)
{
void visit (HIR::ErrorPropagationExpr &) override {}
void visit (HIR::RangeToInclExpr &) override {}
void visit (HIR::WhileLetLoopExpr &) override {}
- void visit (HIR::ForLoopExpr &) override {}
+
+ // lets not worry about async yet....
void visit (HIR::AwaitExpr &) override {}
void visit (HIR::AsyncBlockExpr &) override {}