ASTLoweringPattern::ASTLoweringPattern () : translated (nullptr) {}
HIR::Pattern *
-ASTLoweringPattern::translate (AST::Pattern *pattern)
+ASTLoweringPattern::translate (AST::Pattern *pattern, bool is_let_top_level)
{
ASTLoweringPattern resolver;
+ resolver.is_let_top_level = is_let_top_level;
pattern->accept_vis (resolver);
rust_assert (resolver.translated != nullptr);
translated
= new HIR::AltPattern (mapping, std::move (alts), pattern.get_locus ());
+
+ if (is_let_top_level)
+ rust_error_at (pattern.get_locus (),
+ "top level alternate patterns are not allowed for %<let%> "
+ "bindings - use an outer grouped pattern");
}
} // namespace HIR
using Rust::HIR::ASTLoweringBase::visit;
public:
- static HIR::Pattern *translate (AST::Pattern *pattern);
+ static HIR::Pattern *translate (AST::Pattern *pattern,
+ bool is_let_top_level = false);
void visit (AST::IdentifierPattern &pattern) override;
void visit (AST::PathInExpression &pattern) override;
ASTLoweringPattern ();
HIR::Pattern *translated;
+ bool is_let_top_level;
};
} // namespace HIR
ASTLoweringStmt::visit (AST::LetStmt &stmt)
{
HIR::Pattern *variables
- = ASTLoweringPattern::translate (stmt.get_pattern ().get ());
+ = ASTLoweringPattern::translate (stmt.get_pattern ().get (), true);
HIR::Type *type = stmt.has_type ()
? ASTLoweringType::translate (stmt.get_type ().get ())
: nullptr;