]> git.lizzy.rs Git - rust.git/commitdiff
Lookup region variable origin instead of choosing one
authorvarkor <github@varkor.com>
Mon, 25 Mar 2019 21:28:39 +0000 (21:28 +0000)
committervarkor <github@varkor.com>
Wed, 27 Mar 2019 09:44:55 +0000 (09:44 +0000)
src/librustc/infer/fudge.rs
src/librustc/infer/region_constraints/mod.rs
src/librustc_typeck/check/mod.rs

index 4c603cb54559d47193dc149c326935efdfa546eb..c19507c2f3c3eb87a5aef36ee16f8eb35b29fd80 100644 (file)
@@ -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 @@ pub fn fudge_inference_if_ok<T, E, F>(
                         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 @@ fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'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
     }
 }
index 51d8a0edc81d3fcca4250f7b9234b843758cadf7..c3c4e724c695648b08c98bb9c002cc8c05429f16 100644 (file)
@@ -16,7 +16,6 @@
 
 use std::collections::BTreeMap;
 use std::{cmp, fmt, mem, u32};
-use std::ops::Range;
 
 mod leak_check;
 
@@ -841,8 +840,16 @@ pub fn universe(&self, region: Region<'tcx>) -> ty::UniverseIndex {
         }
     }
 
-    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`].
index 433f6685d1ff1d43e77242cc503a84930394f1b0..ec4fc2a3bfb88d6a329141f960d29d1285688648 100644 (file)
@@ -92,7 +92,7 @@
 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 @@ fn expected_inputs_for_expected_output(&self,
             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.