about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2011-06-28 16:54:47 +0200
committerMarijn Haverbeke <marijnh@gmail.com>2011-06-28 18:00:05 +0200
commite2cb97a2fcf542192ff9776dd6a6e2b3c7bc64b2 (patch)
treeb6f5ca6f451ddc20cae6b6adb5bf2adc4dc086c7 /src/comp
parentd730bb730a9bda5e2ed50bed1993352c497f7c94 (diff)
downloadrust-e2cb97a2fcf542192ff9776dd6a6e2b3c7bc64b2.tar.gz
rust-e2cb97a2fcf542192ff9776dd6a6e2b3c7bc64b2.zip
Add some missing cases for ty_res in ty.rs
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/ty.rs30
1 files changed, 28 insertions, 2 deletions
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)) {