Skip to content

Commit 7c27ec7

Browse files
committed
rustc: Add some simple region checking (no region vars yet)
Amazingly, this causes no test cases to fail!
1 parent 3e385a8 commit 7c27ec7

File tree

2 files changed

+39
-57
lines changed

2 files changed

+39
-57
lines changed

src/rustc/middle/infer.rs

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -294,9 +294,41 @@ impl unify_methods for infer_ctxt {
294294
iter2(as, bs) {|a,b| self.tys(a,b) }
295295
}
296296

297-
fn regions(_a: ty::region, _b: ty::region) -> ures {
298-
// FIXME: pcwalton!
299-
self.uok()
297+
fn regions(a: ty::region, b: ty::region) -> ures {
298+
alt (a, b) {
299+
(ty::re_var(_), _) | (_, ty::re_var(_)) {
300+
self.uok() // FIXME: We need region variables!
301+
}
302+
(ty::re_inferred, _) | (_, ty::re_inferred) {
303+
fail "tried to unify inferred regions"
304+
}
305+
(ty::re_param(_), ty::re_param(_)) |
306+
(ty::re_self, ty::re_self) {
307+
if a == b {
308+
self.uok()
309+
} else {
310+
self.uerr(ty::terr_regions_differ(false, a, b))
311+
}
312+
}
313+
(ty::re_param(_), ty::re_block(_)) |
314+
(ty::re_self, ty::re_block(_)) {
315+
self.uok()
316+
}
317+
(ty::re_block(_), ty::re_param(_)) |
318+
(ty::re_block(_), ty::re_self) {
319+
self.uerr(ty::terr_regions_differ(false, a, b))
320+
}
321+
(ty::re_block(superblock), ty::re_block(subblock)) {
322+
// The region corresponding to an outer block is a subtype of the
323+
// region corresponding to an inner block.
324+
let rm = self.tcx.region_map;
325+
if region::scope_contains(rm, subblock, superblock) {
326+
self.uok()
327+
} else {
328+
self.uerr(ty::terr_regions_differ(false, a, b))
329+
}
330+
}
331+
}
300332
}
301333

302334
fn mts(a: ty::mt, b: ty::mt) -> ures {
@@ -650,4 +682,4 @@ impl resolve_methods for infer_ctxt {
650682
some(var_id) { ret self.rerr(var_id); }
651683
}
652684
}
653-
}
685+
}

src/rustc/middle/ty.rs

Lines changed: 3 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1682,59 +1682,9 @@ mod unify {
16821682
}
16831683

16841684
fn unify_regions<T:copy>(
1685-
cx: @uctxt, e_region: region, a_region: region,
1686-
nxt: fn(region) -> ures<T>) -> ures<T> {
1687-
let sub = a_region, super = e_region;
1688-
1689-
// FIXME: Should have a way of unifying regions that relies on bounds,
1690-
// not on unification.
1691-
alt (super, sub) {
1692-
(ty::re_var(superkey), ty::re_var(subkey)) {
1693-
ret union_region_sets(cx, subkey, superkey,
1694-
{|| nxt(sub) });
1695-
}
1696-
(ty::re_var(superkey), _) {
1697-
ret record_region_binding(cx, superkey, sub, nxt);
1698-
}
1699-
(_, ty::re_var(subkey)) {
1700-
ret record_region_binding(cx, subkey, super, nxt);
1701-
}
1702-
_ { /* fall through */ }
1703-
}
1704-
1705-
alt (super, sub) {
1706-
(ty::re_var(_), _) | (_, ty::re_var(_)) {
1707-
fail "should have been handled above";
1708-
}
1709-
(ty::re_inferred, _) | (_, ty::re_inferred) {
1710-
fail "tried to unify inferred regions";
1711-
}
1712-
(ty::re_param(_), ty::re_param(_)) |
1713-
(ty::re_self, ty::re_self) {
1714-
ret if super == sub {
1715-
nxt(ty::re_self)
1716-
} else {
1717-
err(terr_regions_differ(false, super, sub))
1718-
};
1719-
}
1720-
(ty::re_param(_), ty::re_block(_)) |
1721-
(ty::re_self, ty::re_block(_)) {
1722-
ret nxt(super);
1723-
}
1724-
(ty::re_block(_), ty::re_param(_)) |
1725-
(ty::re_block(_), ty::re_self) {
1726-
ret err(terr_regions_differ(false, super, sub));
1727-
}
1728-
(ty::re_block(superblock), ty::re_block(subblock)) {
1729-
// Outer regions are subtypes of inner regions. (This is
1730-
// somewhat surprising!)
1731-
let rm = cx.tcx.region_map;
1732-
if region::scope_contains(rm, subblock, superblock) {
1733-
ret nxt(super);
1734-
}
1735-
ret err(terr_regions_differ(false, sub, super));
1736-
}
1737-
}
1685+
_cx: @uctxt, _e_region: region, _a_region: region,
1686+
_nxt: fn(region) -> ures<T>) -> ures<T> {
1687+
fail; // unused
17381688
}
17391689
}
17401690

0 commit comments

Comments
 (0)