diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2012-03-21 12:21:06 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2012-03-21 12:21:53 -0700 |
| commit | 68e364b54d8caad98d69679a8e4d1cee8d6607c5 (patch) | |
| tree | 7e1523ce9ead11248b3a6c91c4d74d30a853199d | |
| parent | 071dedde79137bbc24b19034df117810785f2301 (diff) | |
| download | rust-68e364b54d8caad98d69679a8e4d1cee8d6607c5.tar.gz rust-68e364b54d8caad98d69679a8e4d1cee8d6607c5.zip | |
rustc: Introduce re_params into the typechecker
This is the first step of the region refactoring I need to do in order to handle named regions properly.
| -rw-r--r-- | src/rustc/metadata/tyencode.rs | 4 | ||||
| -rw-r--r-- | src/rustc/middle/region.rs | 4 | ||||
| -rw-r--r-- | src/rustc/middle/regionck.rs | 2 | ||||
| -rw-r--r-- | src/rustc/middle/ty.rs | 26 | ||||
| -rw-r--r-- | src/rustc/middle/typeck.rs | 17 |
5 files changed, 36 insertions, 17 deletions
diff --git a/src/rustc/metadata/tyencode.rs b/src/rustc/metadata/tyencode.rs index 7e16129846c..2ce09c4bc69 100644 --- a/src/rustc/metadata/tyencode.rs +++ b/src/rustc/metadata/tyencode.rs @@ -106,7 +106,9 @@ fn enc_region(w: io::writer, cx: @ctxt, r: ty::region) { ty::re_self(did) { w.write_char('s'); w.write_str(cx.ds(did)); w.write_char('|'); } - ty::re_inferred { w.write_char('?'); } + ty::re_param(id) { + w.write_char('p'); w.write_uint(id); w.write_char('|'); + } } } fn enc_sty(w: io::writer, cx: @ctxt, st: ty::sty) { diff --git a/src/rustc/middle/region.rs b/src/rustc/middle/region.rs index e1b467ece01..73df743e849 100644 --- a/src/rustc/middle/region.rs +++ b/src/rustc/middle/region.rs @@ -80,7 +80,7 @@ fn region_to_scope(region_map: @region_map, region: ty::region) ty::re_caller(def_id) | ty::re_self(def_id) { def_id.node } ty::re_named(def_id) { region_map.region_name_to_fn.get(def_id) } ty::re_block(node_id) { node_id } - ty::re_inferred { fail "unresolved region in region_to_scope" } + ty::re_param(_) { fail "unresolved region in region_to_scope" } }; } @@ -109,7 +109,7 @@ fn get_inferred_region(cx: ctxt, sp: syntax::codemap::span) -> ty::region { ty::re_caller({crate: ast::local_crate, node: item_id}) } pa_block(block_id) { ty::re_block(block_id) } - pa_item(_) { ty::re_inferred } + pa_item(_) { ty::re_param(0u) } pa_crate { cx.sess.span_bug(sp, "inferred region at crate level?!"); } } } diff --git a/src/rustc/middle/regionck.rs b/src/rustc/middle/regionck.rs index 42d9a51dd47..26316422106 100644 --- a/src/rustc/middle/regionck.rs +++ b/src/rustc/middle/regionck.rs @@ -51,7 +51,7 @@ fn check_expr(expr: @ast::expr, cx: ctxt, visitor: visit::vt<ctxt>) { "escapes its block"); } } - ty::re_inferred { + ty::re_param(_) { cx.tcx.sess.span_bug(expr.span, "unresolved region"); } diff --git a/src/rustc/middle/ty.rs b/src/rustc/middle/ty.rs index 4a9f109e4e6..f7f647c89e3 100644 --- a/src/rustc/middle/ty.rs +++ b/src/rustc/middle/ty.rs @@ -89,7 +89,7 @@ export ty_uint, mk_uint, mk_mach_uint; export ty_uniq, mk_uniq, mk_imm_uniq, type_is_unique_box; export ty_var, mk_var; export ty_self, mk_self; -export region, re_named, re_caller, re_block, re_inferred; +export region, re_named, re_caller, re_block, re_param; export get, type_has_params, type_has_vars, type_has_rptrs, type_id; export same_type; export ty_var_id; @@ -242,7 +242,10 @@ enum region { re_caller(def_id), re_self(def_id), re_block(node_id), - re_inferred /* currently unresolved (for typedefs) */ + + // A region parameter. Currently used only for typedefs. + // TODO: Use this for caller and named regions as well. + re_param(uint) } // NB: If you change this, you'll probably want to change the corresponding @@ -1163,7 +1166,7 @@ fn hash_type_structure(st: sty) -> uint { re_caller(_) { 2u } re_self(_) { 3u } re_block(_) { 4u } - re_inferred { 5u } + re_param(_) { 5u } } } alt st { @@ -1928,12 +1931,17 @@ mod unify { } } - if sub == ty::re_inferred || super == ty::re_inferred { - ret if sub == super { - nxt(super) - } else { - err(terr_regions_differ(true, super, sub)) - }; + // FIXME: This is wrong. We should be keeping a set of region bindings + // around. + alt (sub, super) { + (ty::re_param(_), _) | (_, ty::re_param(_)) { + ret if sub == super { + nxt(super) + } else { + err(terr_regions_differ(true, super, sub)) + } + } + _ { /* fall through */ } } // Outer regions are subtypes of inner regions. (This is somewhat diff --git a/src/rustc/middle/typeck.rs b/src/rustc/middle/typeck.rs index 6b507793aa2..e55656d2b2f 100644 --- a/src/rustc/middle/typeck.rs +++ b/src/rustc/middle/typeck.rs @@ -256,7 +256,8 @@ fn ast_ty_to_ty(tcx: ty::ctxt, mode: mode, &&ast_ty: @ast::ty) -> ty::t { ty: ty::t) -> ty::t { ret ty::fold_ty(tcx, ty::fm_rptr({|r| alt r { - ty::re_inferred | ty::re_self(_) { + // FIXME: This is probably wrong for params. + ty::re_param(_) | ty::re_self(_) { tcx.region_map.ast_type_to_inferred_region.get(use_site) } _ { r } @@ -356,7 +357,11 @@ fn ast_ty_to_ty(tcx: ty::ctxt, mode: mode, &&ast_ty: @ast::ty) -> ty::t { let attir = tcx.region_map.ast_type_to_inferred_region; alt attir.find(ast_ty.id) { some(resolved_region) { resolved_region } - none { ty::re_inferred } + none { + // FIXME: Shouldn't be 0u and should instead be + // a fresh variable. + ty::re_param(0u) + } } } ast::re_named(_) | ast::re_self { @@ -1488,7 +1493,8 @@ fn instantiate_self_regions(tcx: ty::ctxt, region: ty::region, &&ty: ty::t) if ty::type_has_rptrs(ty) { ty::fold_ty(tcx, ty::fm_rptr({|r| alt r { - ty::re_inferred | ty::re_caller(_) | ty::re_self(_) { region } + // FIXME: Should not happen for re_param. + ty::re_param(_) | ty::re_caller(_) | ty::re_self(_) { region } _ { r } } }), ty) @@ -1502,7 +1508,10 @@ fn instantiate_self_regions(tcx: ty::ctxt, region: ty::region, &&ty: ty::t) // refer to inferred regions. fn universally_quantify_regions(tcx: ty::ctxt, ty: ty::t) -> ty::t { if ty::type_has_rptrs(ty) { - ty::fold_ty(tcx, ty::fm_rptr({|_r| ty::re_inferred}), ty) + ty::fold_ty(tcx, ty::fm_rptr({|_r| + // FIXME: Very wrong. Shouldn't be 0u. + ty::re_param(0u) + }), ty) } else { ty } |
