about summary refs log tree commit diff
path: root/src/rustc
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2012-03-26 12:53:34 -0700
committerNiko Matsakis <niko@alum.mit.edu>2012-03-29 19:41:09 -0700
commit76d0a13ae5a82aaaa1eff409d873cca29bdcb88e (patch)
tree567ebc1c0f4717b59b16e015f6cf05d6720252c5 /src/rustc
parentf452973a7fa8dcd3c7846c3eb333f968748443f6 (diff)
resolve type variables with no constraints to bot
Diffstat (limited to 'src/rustc')
-rw-r--r--src/rustc/middle/infer.rs16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/rustc/middle/infer.rs b/src/rustc/middle/infer.rs
index efe01f2cbd8..f0e2bcf40fe 100644
--- a/src/rustc/middle/infer.rs
+++ b/src/rustc/middle/infer.rs
@@ -707,7 +707,7 @@ impl resolve_methods for infer_ctxt {
 
     fn resolve_var<T:copy to_str>(
         vb: vals_and_bindings<T>, bot_guard: fn(T)->bool,
-        vid: int) -> fres<T> {
+        vid: int, unbound: fn() -> fres<T>) -> fres<T> {
 
         let {root:_, bounds} = self.get(vb, vid as uint);
 
@@ -724,16 +724,24 @@ impl resolve_methods for infer_ctxt {
           { ub:_, lb:some(t) } if !bot_guard(t) { ok(t) }
           { ub:some(t), lb:_ } { ok(t) }
           { ub:_, lb:some(t) } { ok(t) }
-          { ub:none, lb:none } { self.rerr(vid) }
+          { ub:none, lb:none } { unbound() }
         }
     }
 
     fn resolve_ty_var(vid: int) -> fres<ty::t> {
-        ret self.resolve_var(self.vb, {|t| type_is_bot(t)}, vid);
+        ret self.resolve_var(
+            self.vb,
+            {|t| type_is_bot(t) },
+            vid,
+            {|| ok(ty::mk_bot(self.tcx)) });
     }
 
     fn resolve_region_var(rid: int) -> fres<ty::region> {
-        ret self.resolve_var(self.rb, {|_t| false}, rid);
+        ret self.resolve_var(
+            self.rb,
+            {|_t| false },
+            rid,
+            {|| err(rid) });
     }
 
     fn resolve_ty(typ: ty::t) -> fres<ty::t> {