about summary refs log tree commit diff
diff options
context:
space:
mode:
authorvarkor <github@varkor.com>2019-03-25 21:28:39 +0000
committervarkor <github@varkor.com>2019-03-27 09:44:55 +0000
commit688cbad9b89fb79d651f62480bb65fdb5d2c6e02 (patch)
tree6553b341e8c1e8562c6665d8c2c43ecf3535724f
parent2d48ffa9c63255eafa25639142f3b5601d42ae05 (diff)
downloadrust-688cbad9b89fb79d651f62480bb65fdb5d2c6e02.tar.gz
rust-688cbad9b89fb79d651f62480bb65fdb5d2c6e02.zip
Lookup region variable origin instead of choosing one
-rw-r--r--src/librustc/infer/fudge.rs15
-rw-r--r--src/librustc/infer/region_constraints/mod.rs13
-rw-r--r--src/librustc_typeck/check/mod.rs5
3 files changed, 18 insertions, 15 deletions
diff --git a/src/librustc/infer/fudge.rs b/src/librustc/infer/fudge.rs
index 4c603cb5455..c19507c2f3c 100644
--- a/src/librustc/infer/fudge.rs
+++ b/src/librustc/infer/fudge.rs
@@ -50,13 +50,12 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
     /// unified.
     pub fn fudge_inference_if_ok<T, E, F>(
         &self,
-        origin: &RegionVariableOrigin,
         f: F,
     ) -> Result<T, E> where
         F: FnOnce() -> Result<T, E>,
         T: TypeFoldable<'tcx>,
     {
-        debug!("fudge_inference_if_ok(origin={:?})", origin);
+        debug!("fudge_inference_if_ok()");
 
         let (mut fudger, value) = self.probe(|snapshot| {
             match f() {
@@ -88,7 +87,6 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
                         int_vars,
                         float_vars,
                         region_vars,
-                        origin,
                     };
 
                     Ok((fudger, value))
@@ -120,8 +118,7 @@ pub struct InferenceFudger<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
     type_vars: FxHashMap<TyVid, TypeVariableOrigin>,
     int_vars: Range<IntVid>,
     float_vars: Range<FloatVid>,
-    region_vars: Range<RegionVid>,
-    origin: &'a RegionVariableOrigin,
+    region_vars: FxHashMap<RegionVid, RegionVariableOrigin>,
 }
 
 impl<'a, 'gcx, 'tcx> TypeFolder<'gcx, 'tcx> for InferenceFudger<'a, 'gcx, 'tcx> {
@@ -167,11 +164,11 @@ impl<'a, 'gcx, 'tcx> TypeFolder<'gcx, 'tcx> for InferenceFudger<'a, 'gcx, 'tcx>
     }
 
     fn fold_region(&mut self, r: ty::Region<'tcx>) -> ty::Region<'tcx> {
-        match *r {
-            ty::ReVar(vid) if self.region_vars.contains(&vid) => {
-                self.infcx.next_region_var(self.origin.clone())
+        if let ty::ReVar(vid) = r {
+            if let Some(&origin) = self.region_vars.get(&vid) {
+                return self.infcx.next_region_var(origin);
             }
-            _ => r,
         }
+        r
     }
 }
diff --git a/src/librustc/infer/region_constraints/mod.rs b/src/librustc/infer/region_constraints/mod.rs
index 51d8a0edc81..c3c4e724c69 100644
--- a/src/librustc/infer/region_constraints/mod.rs
+++ b/src/librustc/infer/region_constraints/mod.rs
@@ -16,7 +16,6 @@ use crate::ty::{Region, RegionVid};
 
 use std::collections::BTreeMap;
 use std::{cmp, fmt, mem, u32};
-use std::ops::Range;
 
 mod leak_check;
 
@@ -841,8 +840,16 @@ impl<'tcx> RegionConstraintCollector<'tcx> {
         }
     }
 
-    pub fn vars_since_snapshot(&self, mark: &RegionSnapshot) -> Range<RegionVid> {
-        self.unification_table.vars_since_snapshot(&mark.region_snapshot)
+    pub fn vars_since_snapshot(
+        &self,
+        mark: &RegionSnapshot,
+    ) -> FxHashMap<RegionVid, RegionVariableOrigin> {
+        let range = self.unification_table.vars_since_snapshot(&mark.region_snapshot);
+        (range.start.index()..range.end.index()).map(|index| {
+            let vid = ty::RegionVid::from(index);
+            let origin = self.var_infos[vid].origin.clone();
+            (vid, origin)
+        }).collect()
     }
 
     /// See [`RegionInference::region_constraints_added_in_snapshot`].
diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs
index 433f6685d1f..ec4fc2a3bfb 100644
--- a/src/librustc_typeck/check/mod.rs
+++ b/src/librustc_typeck/check/mod.rs
@@ -92,7 +92,7 @@ use rustc::hir::intravisit::{self, Visitor, NestedVisitorMap};
 use rustc::hir::itemlikevisit::ItemLikeVisitor;
 use crate::middle::lang_items;
 use crate::namespace::Namespace;
-use rustc::infer::{self, InferCtxt, InferOk, InferResult, RegionVariableOrigin};
+use rustc::infer::{self, InferCtxt, InferOk, InferResult};
 use rustc::infer::canonical::{Canonical, OriginalQueryValues, QueryResponse};
 use rustc_data_structures::indexed_vec::Idx;
 use rustc_data_structures::sync::Lrc;
@@ -3229,8 +3229,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
             Some(ret) => ret,
             None => return Vec::new()
         };
-        let origin = RegionVariableOrigin::Coercion(call_span);
-        let expect_args = self.fudge_inference_if_ok(&origin, || {
+        let expect_args = self.fudge_inference_if_ok(|| {
             // Attempt to apply a subtyping relationship between the formal
             // return type (likely containing type variables if the function
             // is polymorphic) and the expected return type.