case_label_expr = build_case_label (lit, NULL_TREE, associated_case_label);
}
+void
+CompilePatternCaseLabelExpr::visit (HIR::AltPattern &pattern)
+{
+ const auto &alts = pattern.get_alts ();
+ for (auto &alt_pattern : alts)
+ {
+ CompilePatternCaseLabelExpr::Compile (alt_pattern.get (),
+ associated_case_label, ctx);
+ }
+}
+
static tree
compile_range_pattern_bound (HIR::RangePatternBound *bound,
Analysis::NodeMapping mappings, location_t locus,
void visit (HIR::TupleStructPattern &pattern) override;
void visit (HIR::WildcardPattern &pattern) override;
void visit (HIR::RangePattern &pattern) override;
-
- // unsupported
- void visit (HIR::AltPattern &pattern) override
- {
- rust_sorry_at (pattern.get_locus (),
- "alternate pattern case labels not supported");
- }
+ void visit (HIR::AltPattern &pattern) override;
// Empty visit for unused Pattern HIR nodes.
void visit (HIR::IdentifierPattern &) override {}
void visit (HIR::ReferencePattern &pattern) override;
void visit (HIR::IdentifierPattern &) override;
- // unsupported
- void visit (HIR::AltPattern &pattern) override
- {
- rust_sorry_at (pattern.get_locus (),
- "alternate pattern bindings not supported");
- }
-
// Empty visit for unused Pattern HIR nodes.
+ void visit (HIR::AltPattern &) override {}
void visit (HIR::LiteralPattern &) override {}
void visit (HIR::PathInExpression &) override {}
void visit (HIR::QualifiedPathInExpression &) override {}
void
TypeCheckPattern::visit (HIR::AltPattern &pattern)
{
- rust_sorry_at (pattern.get_locus (),
- "type checking alternate patterns not supported");
+ const auto &alts = pattern.get_alts ();
+
+ // lub - taken from TypeCheckExpr::visit(ArrayExpr)
+ std::vector<TyTy::BaseType *> types;
+ for (auto &alt_pattern : alts)
+ {
+ types.push_back (TypeCheckPattern::Resolve (alt_pattern.get (), parent));
+ }
+
+ TyTy::BaseType *alt_pattern_type
+ = TyTy::TyVar::get_implicit_infer_var (pattern.get_locus ()).get_tyty ();
+
+ for (auto &type : types)
+ {
+ alt_pattern_type
+ = unify_site (pattern.get_pattern_mappings ().get_hirid (),
+ TyTy::TyWithLocation (alt_pattern_type),
+ TyTy::TyWithLocation (type, type->get_locus ()),
+ pattern.get_locus ());
+ }
+
+ infered = alt_pattern_type;
}
TyTy::BaseType *
--- /dev/null
+pub fn main() {
+ match 12 {
+ 12 | 13 | 14 => {}
+ _ => {}
+ }
+}