diff --git a/src/rustc/middle/infer.rs b/src/rustc/middle/infer.rs index 6b42fe42c670..80d7411e15b2 100644 --- a/src/rustc/middle/infer.rs +++ b/src/rustc/middle/infer.rs @@ -175,11 +175,11 @@ impl of st for ty::t { } fn lub(infcx: infer_ctxt, b: ty::t) -> cres { - lub(infcx).c_tys(self, b) + lub(infcx).tys(self, b) } fn glb(infcx: infer_ctxt, b: ty::t) -> cres { - glb(infcx).c_tys(self, b) + glb(infcx).tys(self, b) } } @@ -189,11 +189,11 @@ impl of st for ty::region { } fn lub(infcx: infer_ctxt, b: ty::region) -> cres { - lub(infcx).c_regions(self, b) + lub(infcx).regions(self, b) } fn glb(infcx: infer_ctxt, b: ty::region) -> cres { - glb(infcx).c_regions(self, b) + glb(infcx).regions(self, b) } } @@ -489,7 +489,7 @@ impl unify_methods for infer_ctxt { } _ { - lub(self).c_regions(a, b).chain {|r| + lub(self).regions(a, b).chain {|r| if b == r { self.uok() } else { @@ -949,7 +949,7 @@ impl resolve_methods for infer_ctxt { // // The `c_X()` top-level items work for *both LUB and GLB*: any // operation which varies between LUB and GLB will be dynamically -// dispatched using a `self.c_Y()` operation. +// dispatched using a `self.Y()` operation. // // In principle, the subtyping relation computed above could be built // on the combine framework---this would result in less code but would @@ -966,38 +966,50 @@ iface combine { fn tag() -> str; fn bnd(b: bounds) -> option; fn with_bnd(b: bounds, v: V) -> bounds; - fn c_bot_ty(b: ty::t) -> cres; - fn c_ty_bot(b: ty::t) -> cres; - fn c_mts(a: ty::mt, b: ty::mt) -> cres; - fn c_contratys(t1: ty::t, t2: ty::t) -> cres; - fn c_tys(t1: ty::t, t2: ty::t) -> cres; - fn c_protos(p1: ast::proto, p2: ast::proto) -> cres; - fn c_ret_styles(r1: ret_style, r2: ret_style) -> cres; + + fn bot_ty(b: ty::t) -> cres; + fn ty_bot(b: ty::t) -> cres; + fn mts(a: ty::mt, b: ty::mt) -> cres; + fn contratys(a: ty::t, b: ty::t) -> cres; + fn tys(a: ty::t, b: ty::t) -> cres; + fn tps(as: [ty::t], bs: [ty::t]) -> cres<[ty::t]>; + fn fns(a: ty::fn_ty, b: ty::fn_ty) -> cres; + fn flds(a: ty::field, b: ty::field) -> cres; + fn modes(a: ast::mode, b: ast::mode) -> cres; + fn args(a: ty::arg, b: ty::arg) -> cres; + fn protos(p1: ast::proto, p2: ast::proto) -> cres; + fn ret_styles(r1: ret_style, r2: ret_style) -> cres; + fn tvars(a: ty::ty_vid, b: ty::ty_vid) -> cres; + fn tvar_ty(a: ty::ty_vid, b: ty::t) -> cres; + fn ty_tvar(a: ty::t, b: ty::ty_vid) -> cres; // Combining regions (along with some specific cases that are // different for LUB/GLB): - fn c_contraregions( + fn contraregions( a: ty::region, b: ty::region) -> cres; - fn c_regions( + fn regions( a: ty::region, b: ty::region) -> cres; - fn c_regions_static_r(r: ty::region) -> cres; - fn c_regions_r_static(r: ty::region) -> cres; - fn c_regions_scope_scope( + fn regions_static_r(r: ty::region) -> cres; + fn regions_r_static(r: ty::region) -> cres; + fn regions_scope_scope( a: ty::region, a_id: ast::node_id, b: ty::region, b_id: ast::node_id) -> cres; - fn c_regions_scope_free( + fn regions_scope_free( a: ty::region, a_id: ast::node_id, b: ty::region, b_id: ast::node_id, b_br: ty::bound_region) -> cres; - fn c_regions_free_scope( + fn regions_free_scope( a: ty::region, a_id: ast::node_id, a_br: ty::bound_region, b: ty::region, b_id: ast::node_id) -> cres; + fn rvars(a: ty::region_vid, b: ty::region_vid) -> cres; + fn rvar_r(a: ty::region_vid, b: ty::region) -> cres; + fn r_rvar(a: ty::region, b: ty::region_vid) -> cres; } enum lub = infer_ctxt; enum glb = infer_ctxt; -fn c_vars( +fn super_vars( self: C, vb: vals_and_bindings, a_t: T, a_vid: V, b_vid: V, c_ts: fn(T, T) -> cres) -> cres { @@ -1010,7 +1022,7 @@ fn c_vars( let {root: a_vid, bounds: a_bounds} = self.infcx().get(vb, a_vid); let {root: b_vid, bounds: b_bounds} = self.infcx().get(vb, b_vid); - #debug["%s.c_vars(%s=%s <: %s=%s)", + #debug["%s.vars(%s=%s <: %s=%s)", self.tag(), a_vid.to_str(), a_bounds.to_str(self.infcx()), b_vid.to_str(), b_bounds.to_str(self.infcx())]; @@ -1039,7 +1051,7 @@ fn c_vars( } } -fn c_var_t( +fn super_var_t( self: C, vb: vals_and_bindings, a_vid: V, b: T, c_ts: fn(T, T) -> cres) -> cres { @@ -1049,7 +1061,7 @@ fn c_var_t( // The comments in this function are written for LUB, but they // apply equally well to GLB if you inverse upper/lower/sub/super/etc. - #debug["%s.c_var_ty(%s=%s <: %s)", + #debug["%s.var_ty(%s=%s <: %s)", self.tag(), a_id.to_str(), a_bounds.to_str(self.infcx()), b.to_str(self.infcx())]; @@ -1073,36 +1085,20 @@ fn c_var_t( } } -fn c_tuptys(self: C, as: [ty::t], bs: [ty::t]) +fn super_tps( + self: C, as: [ty::t], bs: [ty::t]) -> cres<[ty::t]> { - if check vec::same_length(as, bs) { - map2(as, bs) {|a, b| self.c_tys(a, b) } - } else { - err(ty::terr_tuple_size(bs.len(), as.len())) - } -} - -fn c_tps(self: C, _did: ast::def_id, as: [ty::t], bs: [ty::t]) - -> cres<[ty::t]> { self.infcx().tps(as, bs).then {|| ok(as) } } -fn c_fieldvecs(self: C, as: [ty::field], bs: [ty::field]) - -> cres<[ty::field]> { +fn super_flds( + self: C, a: ty::field, b: ty::field) -> cres { - if check vec::same_length(as, bs) { - map2(as, bs) {|a,b| c_flds(self, a, b) } - } else { - err(ty::terr_record_size(bs.len(), as.len())) - } -} - -fn c_flds(self: C, a: ty::field, b: ty::field) -> cres { if a.ident == b.ident { - self.c_mts(a.mt, b.mt).chain {|mt| + self.mts(a.mt, b.mt).chain {|mt| ok({ident: a.ident, mt: mt}) } } else { @@ -1110,41 +1106,43 @@ fn c_flds(self: C, a: ty::field, b: ty::field) -> cres { } } -fn c_modes(self: C, a: ast::mode, b: ast::mode) +fn super_modes( + self: C, a: ast::mode, b: ast::mode) -> cres { let tcx = self.infcx().tcx; ty::unify_mode(tcx, a, b) } -fn c_args(self: C, a: ty::arg, b: ty::arg) +fn super_args( + self: C, a: ty::arg, b: ty::arg) -> cres { - c_modes(self, a.mode, b.mode).chain {|m| + self.modes(a.mode, b.mode).chain {|m| // Note: contravariant - self.c_contratys(b.ty, a.ty).chain {|t| + self.contratys(b.ty, a.ty).chain {|t| ok({mode: m, ty: t}) } } } -fn c_argvecs( - self: C, a_args: [ty::arg], b_args: [ty::arg]) -> cres<[ty::arg]> { - - if check vec::same_length(a_args, b_args) { - map2(a_args, b_args) {|a, b| c_args(self, a, b) } - } else { - err(ty::terr_arg_count) - } -} - -fn c_fns( +fn super_fns( self: C, a_f: ty::fn_ty, b_f: ty::fn_ty) -> cres { - self.c_protos(a_f.proto, b_f.proto).chain {|p| - self.c_ret_styles(a_f.ret_style, b_f.ret_style).chain {|rs| - c_argvecs(self, a_f.inputs, b_f.inputs).chain {|inputs| - self.c_tys(a_f.output, b_f.output).chain {|output| + fn argvecs( + self: C, a_args: [ty::arg], b_args: [ty::arg]) -> cres<[ty::arg]> { + + if check vec::same_length(a_args, b_args) { + map2(a_args, b_args) {|a, b| self.args(a, b) } + } else { + err(ty::terr_arg_count) + } + } + + self.protos(a_f.proto, b_f.proto).chain {|p| + self.ret_styles(a_f.ret_style, b_f.ret_style).chain {|rs| + argvecs(self, a_f.inputs, b_f.inputs).chain {|inputs| + self.tys(a_f.output, b_f.output).chain {|output| //FIXME self.infcx().constrvecs(a_f.constraints, //FIXME b_f.constraints).then {|| ok({proto: p, @@ -1159,12 +1157,12 @@ fn c_fns( } } -fn c_tys( +fn super_tys( self: C, a: ty::t, b: ty::t) -> cres { let tcx = self.infcx().tcx; - #debug("%s.c_tys(%s, %s)", + #debug("%s.tys(%s, %s)", self.tag(), ty_to_str(tcx, a), ty_to_str(tcx, b)); @@ -1174,25 +1172,24 @@ fn c_tys( indent {|| alt (ty::get(a).struct, ty::get(b).struct) { - (ty::ty_bot, _) { self.c_ty_bot(b) } - (_, ty::ty_bot) { self.c_bot_ty(b) } + (ty::ty_bot, _) { + self.ty_bot(b) + } + + (_, ty::ty_bot) { + self.bot_ty(b) + } (ty::ty_var(a_id), ty::ty_var(b_id)) { - c_vars(self, self.infcx().vb, - a, a_id, b_id, - {|x, y| self.c_tys(x, y) }) + self.tvars(a_id, b_id) } - // Note that the LUB/GLB operations are commutative: (ty::ty_var(v_id), _) { - c_var_t(self, self.infcx().vb, - v_id, b, - {|x, y| self.c_tys(x, y) }) + self.tvar_ty(v_id, b) } + (_, ty::ty_var(v_id)) { - c_var_t(self, self.infcx().vb, - v_id, a, - {|x, y| self.c_tys(x, y) }) + self.ty_tvar(a, v_id) } (ty::ty_nil, _) | @@ -1215,52 +1212,52 @@ fn c_tys( (ty::ty_enum(a_id, a_tps), ty::ty_enum(b_id, b_tps)) if a_id == b_id { - c_tps(self, a_id, a_tps, b_tps).chain {|tps| + self.tps(a_tps, b_tps).chain {|tps| ok(ty::mk_enum(tcx, a_id, tps)) } } (ty::ty_iface(a_id, a_tps), ty::ty_iface(b_id, b_tps)) if a_id == b_id { - c_tps(self, a_id, a_tps, b_tps).chain {|tps| + self.tps(a_tps, b_tps).chain {|tps| ok(ty::mk_iface(tcx, a_id, tps)) } } (ty::ty_class(a_id, a_tps), ty::ty_class(b_id, b_tps)) if a_id == b_id { - c_tps(self, a_id, a_tps, b_tps).chain {|tps| + self.tps(a_tps, b_tps).chain {|tps| ok(ty::mk_class(tcx, a_id, tps)) } } (ty::ty_box(a_mt), ty::ty_box(b_mt)) { - self.c_mts(a_mt, b_mt).chain {|mt| + self.mts(a_mt, b_mt).chain {|mt| ok(ty::mk_box(tcx, mt)) } } (ty::ty_uniq(a_mt), ty::ty_uniq(b_mt)) { - self.c_mts(a_mt, b_mt).chain {|mt| + self.mts(a_mt, b_mt).chain {|mt| ok(ty::mk_uniq(tcx, mt)) } } (ty::ty_vec(a_mt), ty::ty_vec(b_mt)) { - self.c_mts(a_mt, b_mt).chain {|mt| + self.mts(a_mt, b_mt).chain {|mt| ok(ty::mk_vec(tcx, mt)) } } (ty::ty_ptr(a_mt), ty::ty_ptr(b_mt)) { - self.c_mts(a_mt, b_mt).chain {|mt| + self.mts(a_mt, b_mt).chain {|mt| ok(ty::mk_ptr(tcx, mt)) } } (ty::ty_rptr(a_r, a_mt), ty::ty_rptr(b_r, b_mt)) { - self.c_contraregions(a_r, b_r).chain {|r| - self.c_mts(a_mt, b_mt).chain {|mt| + self.contraregions(a_r, b_r).chain {|r| + self.mts(a_mt, b_mt).chain {|mt| ok(ty::mk_rptr(tcx, r, mt)) } } @@ -1268,33 +1265,41 @@ fn c_tys( (ty::ty_res(a_id, a_t, a_tps), ty::ty_res(b_id, b_t, b_tps)) if a_id == b_id { - self.c_tys(a_t, b_t).chain {|t| - c_tps(self, a_id, a_tps, b_tps).chain {|tps| + self.tys(a_t, b_t).chain {|t| + self.tps(a_tps, b_tps).chain {|tps| ok(ty::mk_res(tcx, a_id, t, tps)) } } } - (ty::ty_rec(a_fields), ty::ty_rec(b_fields)) { - c_fieldvecs(self, a_fields, b_fields).chain {|fs| - ok(ty::mk_rec(tcx, fs)) + (ty::ty_rec(as), ty::ty_rec(bs)) { + if check vec::same_length(as, bs) { + map2(as, bs) {|a,b| self.flds(a, b) }.chain {|flds| + ok(ty::mk_rec(tcx, flds)) + } + } else { + err(ty::terr_record_size(bs.len(), as.len())) } } - (ty::ty_tup(a_tys), ty::ty_tup(b_tys)) { - c_tuptys(self, a_tys, b_tys).chain {|ts| - ok(ty::mk_tup(tcx, ts)) + (ty::ty_tup(as), ty::ty_tup(bs)) { + if check vec::same_length(as, bs) { + map2(as, bs) {|a, b| self.tys(a, b) }.chain {|ts| + ok(ty::mk_tup(tcx, ts)) + } + } else { + err(ty::terr_tuple_size(bs.len(), as.len())) } } (ty::ty_fn(a_fty), ty::ty_fn(b_fty)) { - c_fns(self, a_fty, b_fty).chain {|fty| + self.fns(a_fty, b_fty).chain {|fty| ok(ty::mk_fn(tcx, fty)) } } (ty::ty_constr(a_t, a_constrs), ty::ty_constr(b_t, b_constrs)) { - self.c_tys(a_t, b_t).chain {|t| + self.tys(a_t, b_t).chain {|t| self.infcx().constrvecs(a_constrs, b_constrs).then {|| ok(ty::mk_constr(tcx, t, a_constrs)) } @@ -1306,10 +1311,10 @@ fn c_tys( } } -fn c_regions( +fn super_regions( self: C, a: ty::region, b: ty::region) -> cres { - #debug["%s.c_regions(%?, %?)", + #debug["%s.regions(%?, %?)", self.tag(), a.to_str(self.infcx()), b.to_str(self.infcx())]; @@ -1317,36 +1322,35 @@ fn c_regions( indent {|| alt (a, b) { (ty::re_static, r) { - self.c_regions_static_r(r) + self.regions_static_r(r) } (r, ty::re_static) { - self.c_regions_r_static(r) + self.regions_r_static(r) } (ty::re_var(a_id), ty::re_var(b_id)) { - c_vars(self, self.infcx().rb, - a, a_id, b_id, - {|x, y| self.c_regions(x, y) }) + self.rvars(a_id, b_id) } - (ty::re_var(v_id), r) | - (r, ty::re_var(v_id)) { - c_var_t(self, self.infcx().rb, - v_id, r, - {|x, y| self.c_regions(x, y) }) + (ty::re_var(v_id), _) { + self.rvar_r(v_id, b) + } + + (_, ty::re_var(v_id)) { + self.r_rvar(a, v_id) } (ty::re_free(a_id, a_br), ty::re_scope(b_id)) { - self.c_regions_free_scope(a, a_id, a_br, b, b_id) + self.regions_free_scope(a, a_id, a_br, b, b_id) } (ty::re_scope(a_id), ty::re_free(b_id, b_br)) { - self.c_regions_scope_free(b, b_id, b, b_id, b_br) + self.regions_scope_free(b, b_id, b, b_id, b_br) } (ty::re_scope(a_id), ty::re_scope(b_id)) { - self.c_regions_scope_scope(a, a_id, b, b_id) + self.regions_scope_scope(a, a_id, b, b_id) } // For these types, we cannot define any additional relationship: @@ -1392,18 +1396,18 @@ impl of combine for lub { {ub: some(v) with b} } - fn c_bot_ty(b: ty::t) -> cres { + fn bot_ty(b: ty::t) -> cres { ok(b) } - fn c_ty_bot(b: ty::t) -> cres { - self.c_bot_ty(b) // LUB is commutative + fn ty_bot(b: ty::t) -> cres { + self.bot_ty(b) // LUB is commutative } - fn c_mts(a: ty::mt, b: ty::mt) -> cres { + fn mts(a: ty::mt, b: ty::mt) -> cres { let tcx = self.infcx().tcx; - #debug("%s.c_mts(%s, %s)", + #debug("%s.mts(%s, %s)", self.tag(), mt_to_str(tcx, a), mt_to_str(tcx, b)); @@ -1416,7 +1420,7 @@ impl of combine for lub { alt m { ast::m_imm | ast::m_const { - self.c_tys(a.ty, b.ty).chain {|t| + self.tys(a.ty, b.ty).chain {|t| ok({ty: t, mutbl: m}) } } @@ -1427,7 +1431,7 @@ impl of combine for lub { ok({ty: a.ty, mutbl: m}) } }.chain_err {|_e| - self.c_tys(a.ty, b.ty).chain {|t| + self.tys(a.ty, b.ty).chain {|t| ok({ty: t, mutbl: ast::m_const}) } } @@ -1435,15 +1439,11 @@ impl of combine for lub { } } - fn c_contratys(a: ty::t, b: ty::t) -> cres { - glb(self.infcx()).c_tys(a, b) + fn contratys(a: ty::t, b: ty::t) -> cres { + glb(self.infcx()).tys(a, b) } - fn c_tys(a: ty::t, b: ty::t) -> cres { - c_tys(self, a, b) - } - - fn c_protos(p1: ast::proto, p2: ast::proto) -> cres { + fn protos(p1: ast::proto, p2: ast::proto) -> cres { if p1 == ast::proto_bare { ok(p2) } else if p2 == ast::proto_bare { @@ -1455,7 +1455,7 @@ impl of combine for lub { } } - fn c_ret_styles(r1: ret_style, r2: ret_style) -> cres { + fn ret_styles(r1: ret_style, r2: ret_style) -> cres { alt (r1, r2) { (ast::return_val, _) | (_, ast::return_val) { @@ -1467,24 +1467,20 @@ impl of combine for lub { } } - fn c_regions(a: ty::region, b: ty::region) -> cres { - ret c_regions(self, a, b); + fn contraregions(a: ty::region, b: ty::region) -> cres { + ret glb(self.infcx()).regions(a, b); } - fn c_contraregions(a: ty::region, b: ty::region) -> cres { - ret glb(self.infcx()).c_regions(a, b); - } - - fn c_regions_static_r(_r: ty::region) -> cres { + fn regions_static_r(_r: ty::region) -> cres { // nothing lives longer than static ret ok(ty::re_static); } - fn c_regions_r_static(r: ty::region) -> cres { - self.c_regions_static_r(r) // LUB is commutative + fn regions_r_static(r: ty::region) -> cres { + self.regions_static_r(r) // LUB is commutative } - fn c_regions_free_scope( + fn regions_free_scope( a: ty::region, _a_id: ast::node_id, _a_br: ty::bound_region, _b: ty::region, _b_id: ast::node_id) -> cres { @@ -1493,16 +1489,16 @@ impl of combine for lub { ret ok(a); // NDM--not so for nested functions } - fn c_regions_scope_free( + fn regions_scope_free( a: ty::region, a_id: ast::node_id, b: ty::region, b_id: ast::node_id, b_br: ty::bound_region) -> cres { // LUB is commutative: - self.c_regions_free_scope(b, b_id, b_br, a, a_id) + self.regions_free_scope(b, b_id, b_br, a, a_id) } - fn c_regions_scope_scope(a: ty::region, a_id: ast::node_id, + fn regions_scope_scope(a: ty::region, a_id: ast::node_id, b: ty::region, b_id: ast::node_id) -> cres { @@ -1514,6 +1510,67 @@ impl of combine for lub { _ { err(ty::terr_regions_differ(b, a)) } } } + + fn tvars(a: ty::ty_vid, b: ty::ty_vid) -> cres { + super_vars(self, self.infcx().vb, + ty::mk_var(self.infcx().tcx, a), a, b, + {|x, y| self.tys(x, y) }) + } + + fn tvar_ty(a: ty::ty_vid, b: ty::t) -> cres { + super_var_t(self, self.infcx().vb, a, b, + {|x, y| self.tys(x, y) }) + } + + fn ty_tvar(a: ty::t, b: ty::ty_vid) -> cres { + self.tvar_ty(b, a) // commutative + } + + fn rvars(a: ty::region_vid, b: ty::region_vid) -> cres { + super_vars(self, self.infcx().rb, + ty::re_var(a), a, b, + {|x, y| self.regions(x, y) }) + } + + fn rvar_r(a: ty::region_vid, b: ty::region) -> cres { + super_var_t(self, self.infcx().rb, + a, b, + {|x, y| self.regions(x, y) }) + } + + fn r_rvar(a: ty::region, b: ty::region_vid) -> cres { + self.rvar_r(b, a) // commutative + } + + // Traits please: + + fn tys(a: ty::t, b: ty::t) -> cres { + super_tys(self, a, b) + } + + fn regions(a: ty::region, b: ty::region) -> cres { + super_regions(self, a, b) + } + + fn flds(a: ty::field, b: ty::field) -> cres { + super_flds(self, a, b) + } + + fn modes(a: ast::mode, b: ast::mode) -> cres { + super_modes(self, a, b) + } + + fn args(a: ty::arg, b: ty::arg) -> cres { + super_args(self, a, b) + } + + fn fns(a: ty::fn_ty, b: ty::fn_ty) -> cres { + super_fns(self, a, b) + } + + fn tps(as: [ty::t], bs: [ty::t]) -> cres<[ty::t]> { + super_tps(self, as, bs) + } } impl of combine for glb { @@ -1530,18 +1587,18 @@ impl of combine for glb { {lb: some(v) with b} } - fn c_bot_ty(_b: ty::t) -> cres { + fn bot_ty(_b: ty::t) -> cres { ok(ty::mk_bot(self.infcx().tcx)) } - fn c_ty_bot(b: ty::t) -> cres { - self.c_bot_ty(b) // GLB is commutative + fn ty_bot(b: ty::t) -> cres { + self.bot_ty(b) // GLB is commutative } - fn c_mts(a: ty::mt, b: ty::mt) -> cres { + fn mts(a: ty::mt, b: ty::mt) -> cres { let tcx = self.infcx().tcx; - #debug("%s.c_mts(%s, %s)", + #debug("%s.mts(%s, %s)", self.tag(), mt_to_str(tcx, a), mt_to_str(tcx, b)); @@ -1570,7 +1627,7 @@ impl of combine for glb { (ast::m_imm, ast::m_const) | (ast::m_const, ast::m_imm) | (ast::m_imm, ast::m_imm) { - self.c_tys(a.ty, b.ty).chain {|t| + self.tys(a.ty, b.ty).chain {|t| ok({ty: t, mutbl: ast::m_imm}) } } @@ -1578,7 +1635,7 @@ impl of combine for glb { // If both sides are const, then we can use GLB of both // sides and mutbl of only `m_const`. (ast::m_const, ast::m_const) { - self.c_tys(a.ty, b.ty).chain {|t| + self.tys(a.ty, b.ty).chain {|t| ok({ty: t, mutbl: ast::m_const}) } } @@ -1591,15 +1648,11 @@ impl of combine for glb { } } - fn c_contratys(a: ty::t, b: ty::t) -> cres { - lub(self.infcx()).c_tys(a, b) + fn contratys(a: ty::t, b: ty::t) -> cres { + lub(self.infcx()).tys(a, b) } - fn c_tys(a: ty::t, b: ty::t) -> cres { - c_tys(self, a, b) - } - - fn c_protos(p1: ast::proto, p2: ast::proto) -> cres { + fn protos(p1: ast::proto, p2: ast::proto) -> cres { if p1 == ast::proto_any { ok(p2) } else if p2 == ast::proto_any { @@ -1611,7 +1664,7 @@ impl of combine for glb { } } - fn c_ret_styles(r1: ret_style, r2: ret_style) -> cres { + fn ret_styles(r1: ret_style, r2: ret_style) -> cres { alt (r1, r2) { (ast::return_val, ast::return_val) { ok(ast::return_val) @@ -1623,24 +1676,24 @@ impl of combine for glb { } } - fn c_regions(a: ty::region, b: ty::region) -> cres { - ret c_regions(self, a, b); + fn regions(a: ty::region, b: ty::region) -> cres { + super_regions(self, a, b) } - fn c_contraregions(a: ty::region, b: ty::region) -> cres { - ret lub(self.infcx()).c_regions(a, b); + fn contraregions(a: ty::region, b: ty::region) -> cres { + lub(self.infcx()).regions(a, b) } - fn c_regions_static_r(r: ty::region) -> cres { + fn regions_static_r(r: ty::region) -> cres { // static lives longer than everything else ret ok(r); } - fn c_regions_r_static(r: ty::region) -> cres { - self.c_regions_static_r(r) // GLB is commutative + fn regions_r_static(r: ty::region) -> cres { + self.regions_static_r(r) // GLB is commutative } - fn c_regions_free_scope( + fn regions_free_scope( _a: ty::region, _a_id: ast::node_id, _a_br: ty::bound_region, b: ty::region, _b_id: ast::node_id) -> cres { @@ -1650,16 +1703,16 @@ impl of combine for glb { ret ok(b); // NDM--not so for nested functions } - fn c_regions_scope_free( + fn regions_scope_free( a: ty::region, a_id: ast::node_id, b: ty::region, b_id: ast::node_id, b_br: ty::bound_region) -> cres { // GLB is commutative: - self.c_regions_free_scope(b, b_id, b_br, a, a_id) + self.regions_free_scope(b, b_id, b_br, a, a_id) } - fn c_regions_scope_scope(a: ty::region, a_id: ast::node_id, + fn regions_scope_scope(a: ty::region, a_id: ast::node_id, b: ty::region, b_id: ast::node_id) -> cres { @@ -1673,4 +1726,61 @@ impl of combine for glb { _ { err(ty::terr_regions_differ(b, a)) } } } + + fn tvars(a: ty::ty_vid, b: ty::ty_vid) -> cres { + super_vars(self, self.infcx().vb, + ty::mk_var(self.infcx().tcx, a), a, b, + {|x, y| self.tys(x, y) }) + } + + fn tvar_ty(a: ty::ty_vid, b: ty::t) -> cres { + super_var_t(self, self.infcx().vb, a, b, + {|x, y| self.tys(x, y) }) + } + + fn ty_tvar(a: ty::t, b: ty::ty_vid) -> cres { + self.tvar_ty(b, a) // commutative + } + + fn rvars(a: ty::region_vid, b: ty::region_vid) -> cres { + super_vars(self, self.infcx().rb, + ty::re_var(a), a, b, + {|x, y| self.regions(x, y) }) + } + + fn rvar_r(a: ty::region_vid, b: ty::region) -> cres { + super_var_t(self, self.infcx().rb, + a, b, + {|x, y| self.regions(x, y) }) + } + + fn r_rvar(a: ty::region, b: ty::region_vid) -> cres { + self.rvar_r(b, a) // commutative + } + + // Traits please: + + fn tys(a: ty::t, b: ty::t) -> cres { + super_tys(self, a, b) + } + + fn flds(a: ty::field, b: ty::field) -> cres { + super_flds(self, a, b) + } + + fn modes(a: ast::mode, b: ast::mode) -> cres { + super_modes(self, a, b) + } + + fn args(a: ty::arg, b: ty::arg) -> cres { + super_args(self, a, b) + } + + fn fns(a: ty::fn_ty, b: ty::fn_ty) -> cres { + super_fns(self, a, b) + } + + fn tps(as: [ty::t], bs: [ty::t]) -> cres<[ty::t]> { + super_tps(self, as, bs) + } }