diff --git a/src/comp/middle/ty.rs b/src/comp/middle/ty.rs index de589a10d9b..486ef17bb1c 100644 --- a/src/comp/middle/ty.rs +++ b/src/comp/middle/ty.rs @@ -1047,6 +1047,7 @@ fn type_has_pointers(&ctxt cx, &t ty) -> bool { if (type_has_pointers(cx, tup_ty)) { result = true; } } } + case (ty_res(?did, ?inner)) { result = type_has_pointers(cx, inner); } case (_) { result = true; } } @@ -1517,8 +1518,7 @@ fn equal_type_structures(&sty a, &sty b) -> bool { auto len = vec::len[mt](mts_a); if (len != vec::len[mt](mts_b)) { ret false; } auto i = 0u; - while (i < len) { - if (!equal_mt(mts_a.(i), mts_b.(i))) { ret false; } + while (i < len) { if (!equal_mt(mts_a.(i), mts_b.(i))) { ret false; } i += 1u; } ret true; @@ -1587,6 +1587,14 @@ fn equal_type_structures(&sty a, &sty b) -> bool { case (_) { ret false; } } } + case (ty_res(?id_a, ?inner_a)) { + alt (b) { + case (ty_res(?id_b, ?inner_b)) { + ret equal_def(id_a, id_b) && ret eq_ty(inner_a, inner_b); + } + case (_) { ret false; } + } + } case (ty_var(?v_a)) { alt (b) { case (ty_var(?v_b)) { ret v_a == v_b; } @@ -2375,6 +2383,24 @@ mod unify { case (_) { ret ures_err(terr_mismatch); } } } + case (ty::ty_res(?ex_id, ?ex_inner)) { + alt (struct(cx.tcx, actual)) { + case (ty::ty_res(?act_id, ?act_inner)) { + if (ex_id._0 != act_id._0 || ex_id._1 != act_id._1) { + ret ures_err(terr_mismatch); + } + auto result = unify_step(cx, ex_inner, act_inner); + alt (result) { + case (ures_ok(?res_inner)) { + ret ures_ok(mk_res(cx.tcx, act_id, + res_inner)); + } + case (_) { ret result; } + } + } + case (_) { ret ures_err(terr_mismatch); } + } + } case (ty::ty_chan(?expected_sub)) { alt (struct(cx.tcx, actual)) { case (ty::ty_chan(?actual_sub)) {