tuple_field_index++,
pattern->get_locus ());
- ctx->insert_pattern_binding (
- pattern->get_mappings ().get_hirid (), binding);
+ CompilePatternBindings::Compile (*pattern, binding, ctx);
}
}
else
tuple_field_index++,
pattern->get_locus ());
- ctx->insert_pattern_binding (
- pattern->get_mappings ().get_hirid (), binding);
+ CompilePatternBindings::Compile (*pattern, binding, ctx);
}
}
}
void
CompilePatternBindings::visit (HIR::IdentifierPattern &pattern)
{
- ctx->insert_pattern_binding (pattern.get_mappings ().get_hirid (),
- match_scrutinee_expr);
+ if (!pattern.get_is_ref ())
+ {
+ ctx->insert_pattern_binding (pattern.get_mappings ().get_hirid (),
+ match_scrutinee_expr);
+ return;
+ }
+
+ tree ref = address_expression (match_scrutinee_expr,
+ EXPR_LOCATION (match_scrutinee_expr));
+ ctx->insert_pattern_binding (pattern.get_mappings ().get_hirid (), ref);
}
void
}
void
-TypeCheckPattern::visit (HIR::IdentifierPattern &)
+TypeCheckPattern::visit (HIR::IdentifierPattern &pattern)
{
- infered = parent;
+ if (!pattern.get_is_ref ())
+ {
+ infered = parent;
+ return;
+ }
+
+ infered = new TyTy::ReferenceType (pattern.get_mappings ().get_hirid (),
+ TyTy::TyVar (parent->get_ref ()),
+ pattern.is_mut () ? Mutability::Mut
+ : Mutability::Imm);
}
void
--- /dev/null
+extern "C" {
+ fn printf(s: *const i8, ...);
+}
+
+enum Option {
+ Some(i32),
+ None,
+}
+
+impl Option {
+ fn add(&mut self) {
+ match *self {
+ Option::Some(ref mut a) => *a += 1,
+ Option::None => {}
+ }
+ }
+}
+
+fn main() {
+ unsafe {
+ let mut a = Option::None;
+ a.add();
+ let _s = "%d\n\0";
+ let _s = _s as *const str;
+ let s = _s as *const i8;
+ printf(s, a);
+ }
+}