/// 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() {
int_vars,
float_vars,
region_vars,
- origin,
};
Ok((fudger, value))
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> {
}
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
}
}
use std::collections::BTreeMap;
use std::{cmp, fmt, mem, u32};
-use std::ops::Range;
mod leak_check;
}
}
- 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`].
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;
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.