rustc: pass ty::Region behind an interned 'tcx reference.
This commit is contained in:
parent
5222fa58a1
commit
dffd238f8b
@ -106,7 +106,8 @@ impl<'combine, 'infcx, 'gcx, 'tcx> TypeRelation<'infcx, 'gcx, 'tcx>
|
||||
}
|
||||
}
|
||||
|
||||
fn regions(&mut self, a: ty::Region, _: ty::Region) -> RelateResult<'tcx, ty::Region> {
|
||||
fn regions(&mut self, a: &'tcx ty::Region, _: &'tcx ty::Region)
|
||||
-> RelateResult<'tcx, &'tcx ty::Region> {
|
||||
Ok(a)
|
||||
}
|
||||
|
||||
|
@ -329,8 +329,8 @@ impl<'cx, 'gcx, 'tcx> ty::fold::TypeFolder<'gcx, 'tcx> for Generalizer<'cx, 'gcx
|
||||
}
|
||||
}
|
||||
|
||||
fn fold_region(&mut self, r: ty::Region) -> ty::Region {
|
||||
match r {
|
||||
fn fold_region(&mut self, r: &'tcx ty::Region) -> &'tcx ty::Region {
|
||||
match *r {
|
||||
// Never make variables for regions bound within the type itself,
|
||||
// nor for erased regions.
|
||||
ty::ReLateBound(..) |
|
||||
|
@ -79,7 +79,8 @@ impl<'combine, 'infcx, 'gcx, 'tcx> TypeRelation<'infcx, 'gcx, 'tcx>
|
||||
}
|
||||
}
|
||||
|
||||
fn regions(&mut self, a: ty::Region, b: ty::Region) -> RelateResult<'tcx, ty::Region> {
|
||||
fn regions(&mut self, a: &'tcx ty::Region, b: &'tcx ty::Region)
|
||||
-> RelateResult<'tcx, &'tcx ty::Region> {
|
||||
debug!("{}.regions({:?}, {:?})",
|
||||
self.tag(),
|
||||
a,
|
||||
|
@ -99,7 +99,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
pub fn note_and_explain_region(self,
|
||||
err: &mut DiagnosticBuilder,
|
||||
prefix: &str,
|
||||
region: ty::Region,
|
||||
region: &'tcx ty::Region,
|
||||
suffix: &str) {
|
||||
fn item_scope_tag(item: &hir::Item) -> &'static str {
|
||||
match item.node {
|
||||
@ -120,7 +120,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
Some(span))
|
||||
}
|
||||
|
||||
let (description, span) = match region {
|
||||
let (description, span) = match *region {
|
||||
ty::ReScope(scope) => {
|
||||
let new_string;
|
||||
let unknown_scope = || {
|
||||
@ -405,12 +405,12 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
}
|
||||
|
||||
fn free_regions_from_same_fn<'a, 'gcx, 'tcx>(tcx: TyCtxt<'a, 'gcx, 'tcx>,
|
||||
sub: Region,
|
||||
sup: Region)
|
||||
sub: &'tcx Region,
|
||||
sup: &'tcx Region)
|
||||
-> Option<FreeRegionsFromSameFn> {
|
||||
debug!("free_regions_from_same_fn(sub={:?}, sup={:?})", sub, sup);
|
||||
let (scope_id, fr1, fr2) = match (sub, sup) {
|
||||
(ReFree(fr1), ReFree(fr2)) => {
|
||||
(&ReFree(fr1), &ReFree(fr2)) => {
|
||||
if fr1.scope != fr2.scope {
|
||||
return None
|
||||
}
|
||||
@ -602,7 +602,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
fn report_generic_bound_failure(&self,
|
||||
origin: SubregionOrigin<'tcx>,
|
||||
bound_kind: GenericKind<'tcx>,
|
||||
sub: Region)
|
||||
sub: &'tcx Region)
|
||||
{
|
||||
// FIXME: it would be better to report the first error message
|
||||
// with the span of the parameter itself, rather than the span
|
||||
@ -616,7 +616,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
format!("the associated type `{}`", p),
|
||||
};
|
||||
|
||||
let mut err = match sub {
|
||||
let mut err = match *sub {
|
||||
ty::ReFree(ty::FreeRegion {bound_region: ty::BrNamed(..), ..}) => {
|
||||
// Does the required lifetime have a nice name we can print?
|
||||
let mut err = struct_span_err!(self.tcx.sess,
|
||||
@ -667,8 +667,8 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
|
||||
fn report_concrete_failure(&self,
|
||||
origin: SubregionOrigin<'tcx>,
|
||||
sub: Region,
|
||||
sup: Region)
|
||||
sub: &'tcx Region,
|
||||
sup: &'tcx Region)
|
||||
-> DiagnosticBuilder<'tcx> {
|
||||
match origin {
|
||||
infer::Subtype(trace) => {
|
||||
@ -939,9 +939,9 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
fn report_sub_sup_conflict(&self,
|
||||
var_origin: RegionVariableOrigin,
|
||||
sub_origin: SubregionOrigin<'tcx>,
|
||||
sub_region: Region,
|
||||
sub_region: &'tcx Region,
|
||||
sup_origin: SubregionOrigin<'tcx>,
|
||||
sup_region: Region) {
|
||||
sup_region: &'tcx Region) {
|
||||
let mut err = self.report_inference_failure(var_origin);
|
||||
|
||||
self.tcx.note_and_explain_region(&mut err,
|
||||
|
@ -83,8 +83,8 @@ impl<'a, 'gcx, 'tcx> TypeFolder<'gcx, 'tcx> for TypeFreshener<'a, 'gcx, 'tcx> {
|
||||
self.infcx.tcx
|
||||
}
|
||||
|
||||
fn fold_region(&mut self, r: ty::Region) -> ty::Region {
|
||||
match r {
|
||||
fn fold_region(&mut self, r: &'tcx ty::Region) -> &'tcx ty::Region {
|
||||
match *r {
|
||||
ty::ReEarlyBound(..) |
|
||||
ty::ReLateBound(..) => {
|
||||
// leave bound regions alone
|
||||
@ -99,7 +99,7 @@ impl<'a, 'gcx, 'tcx> TypeFolder<'gcx, 'tcx> for TypeFreshener<'a, 'gcx, 'tcx> {
|
||||
ty::ReEmpty |
|
||||
ty::ReErased => {
|
||||
// replace all free regions with 'erased
|
||||
ty::ReErased
|
||||
self.tcx().mk_region(ty::ReErased)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -57,7 +57,8 @@ impl<'combine, 'infcx, 'gcx, 'tcx> TypeRelation<'infcx, 'gcx, 'tcx>
|
||||
lattice::super_lattice_tys(self, a, b)
|
||||
}
|
||||
|
||||
fn regions(&mut self, a: ty::Region, b: ty::Region) -> RelateResult<'tcx, ty::Region> {
|
||||
fn regions(&mut self, a: &'tcx ty::Region, b: &'tcx ty::Region)
|
||||
-> RelateResult<'tcx, &'tcx ty::Region> {
|
||||
debug!("{}.regions({:?}, {:?})",
|
||||
self.tag(),
|
||||
a,
|
||||
|
@ -164,7 +164,7 @@ impl<'a, 'gcx, 'tcx> CombineFields<'a, 'gcx, 'tcx> {
|
||||
.map(|(&skol, &(br, ref regions))| {
|
||||
let representative =
|
||||
regions.iter()
|
||||
.filter(|r| !skol_resolution_map.contains_key(r))
|
||||
.filter(|&&r| !skol_resolution_map.contains_key(r))
|
||||
.cloned()
|
||||
.next()
|
||||
.unwrap_or_else(|| { // [1]
|
||||
@ -268,9 +268,9 @@ impl<'a, 'gcx, 'tcx> CombineFields<'a, 'gcx, 'tcx> {
|
||||
snapshot: &CombinedSnapshot,
|
||||
debruijn: ty::DebruijnIndex,
|
||||
new_vars: &[ty::RegionVid],
|
||||
a_map: &FnvHashMap<ty::BoundRegion, ty::Region>,
|
||||
r0: ty::Region)
|
||||
-> ty::Region {
|
||||
a_map: &FnvHashMap<ty::BoundRegion, &'tcx ty::Region>,
|
||||
r0: &'tcx ty::Region)
|
||||
-> &'tcx ty::Region {
|
||||
// Regions that pre-dated the LUB computation stay as they are.
|
||||
if !is_var_in_set(new_vars, r0) {
|
||||
assert!(!r0.is_bound());
|
||||
@ -301,7 +301,7 @@ impl<'a, 'gcx, 'tcx> CombineFields<'a, 'gcx, 'tcx> {
|
||||
debug!("generalize_region(r0={:?}): \
|
||||
replacing with {:?}, tainted={:?}",
|
||||
r0, *a_br, tainted);
|
||||
return ty::ReLateBound(debruijn, *a_br);
|
||||
return infcx.tcx.mk_region(ty::ReLateBound(debruijn, *a_br));
|
||||
}
|
||||
}
|
||||
|
||||
@ -364,10 +364,12 @@ impl<'a, 'gcx, 'tcx> CombineFields<'a, 'gcx, 'tcx> {
|
||||
snapshot: &CombinedSnapshot,
|
||||
debruijn: ty::DebruijnIndex,
|
||||
new_vars: &[ty::RegionVid],
|
||||
a_map: &FnvHashMap<ty::BoundRegion, ty::Region>,
|
||||
a_map: &FnvHashMap<ty::BoundRegion,
|
||||
&'tcx ty::Region>,
|
||||
a_vars: &[ty::RegionVid],
|
||||
b_vars: &[ty::RegionVid],
|
||||
r0: ty::Region) -> ty::Region {
|
||||
r0: &'tcx ty::Region)
|
||||
-> &'tcx ty::Region {
|
||||
if !is_var_in_set(new_vars, r0) {
|
||||
assert!(!r0.is_bound());
|
||||
return r0;
|
||||
@ -419,7 +421,7 @@ impl<'a, 'gcx, 'tcx> CombineFields<'a, 'gcx, 'tcx> {
|
||||
|
||||
if a_r.is_some() && b_r.is_some() && only_new_vars {
|
||||
// Related to exactly one bound variable from each fn:
|
||||
return rev_lookup(span, a_map, a_r.unwrap());
|
||||
return rev_lookup(infcx, span, a_map, a_r.unwrap());
|
||||
} else if a_r.is_none() && b_r.is_none() {
|
||||
// Not related to bound variables from either fn:
|
||||
assert!(!r0.is_bound());
|
||||
@ -430,13 +432,14 @@ impl<'a, 'gcx, 'tcx> CombineFields<'a, 'gcx, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
fn rev_lookup(span: Span,
|
||||
a_map: &FnvHashMap<ty::BoundRegion, ty::Region>,
|
||||
r: ty::Region) -> ty::Region
|
||||
fn rev_lookup<'a, 'gcx, 'tcx>(infcx: &InferCtxt<'a, 'gcx, 'tcx>,
|
||||
span: Span,
|
||||
a_map: &FnvHashMap<ty::BoundRegion, &'tcx ty::Region>,
|
||||
r: &'tcx ty::Region) -> &'tcx ty::Region
|
||||
{
|
||||
for (a_br, a_r) in a_map {
|
||||
if *a_r == r {
|
||||
return ty::ReLateBound(ty::DebruijnIndex::new(1), *a_br);
|
||||
return infcx.tcx.mk_region(ty::ReLateBound(ty::DebruijnIndex::new(1), *a_br));
|
||||
}
|
||||
}
|
||||
span_bug!(
|
||||
@ -445,19 +448,21 @@ impl<'a, 'gcx, 'tcx> CombineFields<'a, 'gcx, 'tcx> {
|
||||
r);
|
||||
}
|
||||
|
||||
fn fresh_bound_variable(infcx: &InferCtxt, debruijn: ty::DebruijnIndex) -> ty::Region {
|
||||
fn fresh_bound_variable<'a, 'gcx, 'tcx>(infcx: &InferCtxt<'a, 'gcx, 'tcx>,
|
||||
debruijn: ty::DebruijnIndex)
|
||||
-> &'tcx ty::Region {
|
||||
infcx.region_vars.new_bound(debruijn)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn var_ids<'a, 'gcx, 'tcx>(fields: &CombineFields<'a, 'gcx, 'tcx>,
|
||||
map: &FnvHashMap<ty::BoundRegion, ty::Region>)
|
||||
map: &FnvHashMap<ty::BoundRegion, &'tcx ty::Region>)
|
||||
-> Vec<ty::RegionVid> {
|
||||
map.iter()
|
||||
.map(|(_, r)| match *r {
|
||||
.map(|(_, &r)| match *r {
|
||||
ty::ReVar(r) => { r }
|
||||
r => {
|
||||
_ => {
|
||||
span_bug!(
|
||||
fields.trace.origin.span(),
|
||||
"found non-region-vid: {:?}",
|
||||
@ -467,8 +472,8 @@ fn var_ids<'a, 'gcx, 'tcx>(fields: &CombineFields<'a, 'gcx, 'tcx>,
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn is_var_in_set(new_vars: &[ty::RegionVid], r: ty::Region) -> bool {
|
||||
match r {
|
||||
fn is_var_in_set(new_vars: &[ty::RegionVid], r: &ty::Region) -> bool {
|
||||
match *r {
|
||||
ty::ReVar(ref v) => new_vars.iter().any(|x| x == v),
|
||||
_ => false
|
||||
}
|
||||
@ -479,13 +484,13 @@ fn fold_regions_in<'a, 'gcx, 'tcx, T, F>(tcx: TyCtxt<'a, 'gcx, 'tcx>,
|
||||
mut fldr: F)
|
||||
-> T
|
||||
where T: TypeFoldable<'tcx>,
|
||||
F: FnMut(ty::Region, ty::DebruijnIndex) -> ty::Region,
|
||||
F: FnMut(&'tcx ty::Region, ty::DebruijnIndex) -> &'tcx ty::Region,
|
||||
{
|
||||
tcx.fold_regions(unbound_value, &mut false, |region, current_depth| {
|
||||
// we should only be encountering "escaping" late-bound regions here,
|
||||
// because the ones at the current level should have been replaced
|
||||
// with fresh variables
|
||||
assert!(match region {
|
||||
assert!(match *region {
|
||||
ty::ReLateBound(..) => false,
|
||||
_ => true
|
||||
});
|
||||
@ -497,9 +502,9 @@ fn fold_regions_in<'a, 'gcx, 'tcx, T, F>(tcx: TyCtxt<'a, 'gcx, 'tcx>,
|
||||
impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
fn tainted_regions(&self,
|
||||
snapshot: &CombinedSnapshot,
|
||||
r: ty::Region,
|
||||
r: &'tcx ty::Region,
|
||||
directions: TaintDirections)
|
||||
-> FnvHashSet<ty::Region> {
|
||||
-> FnvHashSet<&'tcx ty::Region> {
|
||||
self.region_vars.tainted(&snapshot.region_vars_snapshot, r, directions)
|
||||
}
|
||||
|
||||
@ -596,7 +601,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
pub fn skolemize_late_bound_regions<T>(&self,
|
||||
binder: &ty::Binder<T>,
|
||||
snapshot: &CombinedSnapshot)
|
||||
-> (T, SkolemizationMap)
|
||||
-> (T, SkolemizationMap<'tcx>)
|
||||
where T : TypeFoldable<'tcx>
|
||||
{
|
||||
let (result, map) = self.tcx.replace_late_bound_regions(binder, |br| {
|
||||
@ -619,7 +624,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
pub fn leak_check(&self,
|
||||
overly_polymorphic: bool,
|
||||
span: Span,
|
||||
skol_map: &SkolemizationMap,
|
||||
skol_map: &SkolemizationMap<'tcx>,
|
||||
snapshot: &CombinedSnapshot)
|
||||
-> RelateResult<'tcx, ()>
|
||||
{
|
||||
@ -673,7 +678,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
for &tainted_region in &incoming_taints {
|
||||
// Each skolemized should only be relatable to itself
|
||||
// or new variables:
|
||||
match tainted_region {
|
||||
match *tainted_region {
|
||||
ty::ReVar(vid) => {
|
||||
if new_vars.contains(&vid) {
|
||||
warnings.extend(
|
||||
@ -742,7 +747,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
/// to the depth of the predicate, in this case 1, so that the final
|
||||
/// predicate is `for<'a> &'a int : Clone`.
|
||||
pub fn plug_leaks<T>(&self,
|
||||
skol_map: SkolemizationMap,
|
||||
skol_map: SkolemizationMap<'tcx>,
|
||||
snapshot: &CombinedSnapshot,
|
||||
value: &T) -> T
|
||||
where T : TypeFoldable<'tcx>
|
||||
@ -755,7 +760,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
// region back to the `ty::BoundRegion` that it originally
|
||||
// represented. Because `leak_check` passed, we know that
|
||||
// these taint sets are mutually disjoint.
|
||||
let inv_skol_map: FnvHashMap<ty::Region, ty::BoundRegion> =
|
||||
let inv_skol_map: FnvHashMap<&'tcx ty::Region, ty::BoundRegion> =
|
||||
skol_map
|
||||
.iter()
|
||||
.flat_map(|(&skol_br, &skol)| {
|
||||
@ -794,7 +799,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
// (which ought not to escape the snapshot, but we
|
||||
// don't check that) or itself
|
||||
assert!(
|
||||
match r {
|
||||
match *r {
|
||||
ty::ReVar(_) => true,
|
||||
ty::ReSkolemized(_, ref br1) => br == br1,
|
||||
_ => false,
|
||||
@ -802,7 +807,8 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
"leak-check would have us replace {:?} with {:?}",
|
||||
r, br);
|
||||
|
||||
ty::ReLateBound(ty::DebruijnIndex::new(current_depth - 1), br.clone())
|
||||
self.tcx.mk_region(ty::ReLateBound(
|
||||
ty::DebruijnIndex::new(current_depth - 1), br.clone()))
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -826,7 +832,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
///
|
||||
/// Note: popping also occurs implicitly as part of `leak_check`.
|
||||
pub fn pop_skolemized(&self,
|
||||
skol_map: SkolemizationMap,
|
||||
skol_map: SkolemizationMap<'tcx>,
|
||||
snapshot: &CombinedSnapshot)
|
||||
{
|
||||
debug!("pop_skolemized({:?})", skol_map);
|
||||
|
@ -57,7 +57,8 @@ impl<'combine, 'infcx, 'gcx, 'tcx> TypeRelation<'infcx, 'gcx, 'tcx>
|
||||
lattice::super_lattice_tys(self, a, b)
|
||||
}
|
||||
|
||||
fn regions(&mut self, a: ty::Region, b: ty::Region) -> RelateResult<'tcx, ty::Region> {
|
||||
fn regions(&mut self, a: &'tcx ty::Region, b: &'tcx ty::Region)
|
||||
-> RelateResult<'tcx, &'tcx ty::Region> {
|
||||
debug!("{}.regions({:?}, {:?})",
|
||||
self.tag(),
|
||||
a,
|
||||
|
@ -177,7 +177,7 @@ pub struct InferCtxt<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
|
||||
|
||||
/// A map returned by `skolemize_late_bound_regions()` indicating the skolemized
|
||||
/// region that each late-bound region was replaced with.
|
||||
pub type SkolemizationMap = FnvHashMap<ty::BoundRegion, ty::Region>;
|
||||
pub type SkolemizationMap<'tcx> = FnvHashMap<ty::BoundRegion, &'tcx ty::Region>;
|
||||
|
||||
/// Why did we require that the two types be related?
|
||||
///
|
||||
@ -1123,8 +1123,8 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
|
||||
pub fn sub_regions(&self,
|
||||
origin: SubregionOrigin<'tcx>,
|
||||
a: ty::Region,
|
||||
b: ty::Region) {
|
||||
a: &'tcx ty::Region,
|
||||
b: &'tcx ty::Region) {
|
||||
debug!("sub_regions({:?} <: {:?})", a, b);
|
||||
self.region_vars.make_subregion(origin, a, b);
|
||||
}
|
||||
@ -1147,7 +1147,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
|
||||
pub fn region_outlives_predicate(&self,
|
||||
span: Span,
|
||||
predicate: &ty::PolyRegionOutlivesPredicate)
|
||||
predicate: &ty::PolyRegionOutlivesPredicate<'tcx>)
|
||||
-> UnitResult<'tcx>
|
||||
{
|
||||
self.commit_if_ok(|snapshot| {
|
||||
@ -1190,8 +1190,9 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
.new_key(None)
|
||||
}
|
||||
|
||||
pub fn next_region_var(&self, origin: RegionVariableOrigin) -> ty::Region {
|
||||
ty::ReVar(self.region_vars.new_region_var(origin))
|
||||
pub fn next_region_var(&self, origin: RegionVariableOrigin)
|
||||
-> &'tcx ty::Region {
|
||||
self.tcx.mk_region(ty::ReVar(self.region_vars.new_region_var(origin)))
|
||||
}
|
||||
|
||||
/// Create a region inference variable for the given
|
||||
@ -1199,7 +1200,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
pub fn region_var_for_def(&self,
|
||||
span: Span,
|
||||
def: &ty::RegionParameterDef)
|
||||
-> ty::Region {
|
||||
-> &'tcx ty::Region {
|
||||
self.next_region_var(EarlyBoundRegion(span, def.name))
|
||||
}
|
||||
|
||||
@ -1245,7 +1246,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
})
|
||||
}
|
||||
|
||||
pub fn fresh_bound_region(&self, debruijn: ty::DebruijnIndex) -> ty::Region {
|
||||
pub fn fresh_bound_region(&self, debruijn: ty::DebruijnIndex) -> &'tcx ty::Region {
|
||||
self.region_vars.new_bound(debruijn)
|
||||
}
|
||||
|
||||
@ -1530,7 +1531,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
span: Span,
|
||||
lbrct: LateBoundRegionConversionTime,
|
||||
value: &ty::Binder<T>)
|
||||
-> (T, FnvHashMap<ty::BoundRegion,ty::Region>)
|
||||
-> (T, FnvHashMap<ty::BoundRegion, &'tcx ty::Region>)
|
||||
where T : TypeFoldable<'tcx>
|
||||
{
|
||||
self.tcx.replace_late_bound_regions(
|
||||
@ -1576,8 +1577,8 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
pub fn verify_generic_bound(&self,
|
||||
origin: SubregionOrigin<'tcx>,
|
||||
kind: GenericKind<'tcx>,
|
||||
a: ty::Region,
|
||||
bound: VerifyBound) {
|
||||
a: &'tcx ty::Region,
|
||||
bound: VerifyBound<'tcx>) {
|
||||
debug!("verify_generic_bound({:?}, {:?} <: {:?})",
|
||||
kind,
|
||||
a,
|
||||
@ -1666,7 +1667,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
self.tcx.region_maps.temporary_scope(rvalue_id)
|
||||
}
|
||||
|
||||
pub fn upvar_capture(&self, upvar_id: ty::UpvarId) -> Option<ty::UpvarCapture> {
|
||||
pub fn upvar_capture(&self, upvar_id: ty::UpvarId) -> Option<ty::UpvarCapture<'tcx>> {
|
||||
self.tables.borrow().upvar_capture_map.get(&upvar_id).cloned()
|
||||
}
|
||||
|
||||
|
@ -123,7 +123,7 @@ pub fn maybe_print_constraints_for<'a, 'gcx, 'tcx>(
|
||||
struct ConstraintGraph<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
|
||||
tcx: TyCtxt<'a, 'gcx, 'tcx>,
|
||||
graph_name: String,
|
||||
map: &'a FnvHashMap<Constraint, SubregionOrigin<'tcx>>,
|
||||
map: &'a FnvHashMap<Constraint<'tcx>, SubregionOrigin<'tcx>>,
|
||||
node_ids: FnvHashMap<Node, usize>,
|
||||
}
|
||||
|
||||
@ -135,8 +135,8 @@ enum Node {
|
||||
|
||||
// type Edge = Constraint;
|
||||
#[derive(Clone, PartialEq, Eq, Debug, Copy)]
|
||||
enum Edge {
|
||||
Constraint(Constraint),
|
||||
enum Edge<'tcx> {
|
||||
Constraint(Constraint<'tcx>),
|
||||
EnclScope(CodeExtent, CodeExtent),
|
||||
}
|
||||
|
||||
@ -177,7 +177,7 @@ impl<'a, 'gcx, 'tcx> ConstraintGraph<'a, 'gcx, 'tcx> {
|
||||
|
||||
impl<'a, 'gcx, 'tcx> dot::Labeller<'a> for ConstraintGraph<'a, 'gcx, 'tcx> {
|
||||
type Node = Node;
|
||||
type Edge = Edge;
|
||||
type Edge = Edge<'tcx>;
|
||||
fn graph_id(&self) -> dot::Id {
|
||||
dot::Id::new(&*self.graph_name).unwrap()
|
||||
}
|
||||
@ -214,11 +214,11 @@ fn constraint_to_nodes(c: &Constraint) -> (Node, Node) {
|
||||
Constraint::ConstrainVarSubVar(rv_1, rv_2) =>
|
||||
(Node::RegionVid(rv_1), Node::RegionVid(rv_2)),
|
||||
Constraint::ConstrainRegSubVar(r_1, rv_2) =>
|
||||
(Node::Region(r_1), Node::RegionVid(rv_2)),
|
||||
(Node::Region(*r_1), Node::RegionVid(rv_2)),
|
||||
Constraint::ConstrainVarSubReg(rv_1, r_2) =>
|
||||
(Node::RegionVid(rv_1), Node::Region(r_2)),
|
||||
(Node::RegionVid(rv_1), Node::Region(*r_2)),
|
||||
Constraint::ConstrainRegSubReg(r_1, r_2) =>
|
||||
(Node::Region(r_1), Node::Region(r_2)),
|
||||
(Node::Region(*r_1), Node::Region(*r_2)),
|
||||
}
|
||||
}
|
||||
|
||||
@ -234,7 +234,7 @@ fn edge_to_nodes(e: &Edge) -> (Node, Node) {
|
||||
|
||||
impl<'a, 'gcx, 'tcx> dot::GraphWalk<'a> for ConstraintGraph<'a, 'gcx, 'tcx> {
|
||||
type Node = Node;
|
||||
type Edge = Edge;
|
||||
type Edge = Edge<'tcx>;
|
||||
fn nodes(&self) -> dot::Nodes<Node> {
|
||||
let mut set = FnvHashSet();
|
||||
for node in self.node_ids.keys() {
|
||||
@ -243,26 +243,26 @@ impl<'a, 'gcx, 'tcx> dot::GraphWalk<'a> for ConstraintGraph<'a, 'gcx, 'tcx> {
|
||||
debug!("constraint graph has {} nodes", set.len());
|
||||
set.into_iter().collect()
|
||||
}
|
||||
fn edges(&self) -> dot::Edges<Edge> {
|
||||
fn edges(&self) -> dot::Edges<Edge<'tcx>> {
|
||||
debug!("constraint graph has {} edges", self.map.len());
|
||||
let mut v: Vec<_> = self.map.keys().map(|e| Edge::Constraint(*e)).collect();
|
||||
self.tcx.region_maps.each_encl_scope(|sub, sup| v.push(Edge::EnclScope(*sub, *sup)));
|
||||
debug!("region graph has {} edges", v.len());
|
||||
Cow::Owned(v)
|
||||
}
|
||||
fn source(&self, edge: &Edge) -> Node {
|
||||
fn source(&self, edge: &Edge<'tcx>) -> Node {
|
||||
let (n1, _) = edge_to_nodes(edge);
|
||||
debug!("edge {:?} has source {:?}", edge, n1);
|
||||
n1
|
||||
}
|
||||
fn target(&self, edge: &Edge) -> Node {
|
||||
fn target(&self, edge: &Edge<'tcx>) -> Node {
|
||||
let (_, n2) = edge_to_nodes(edge);
|
||||
debug!("edge {:?} has target {:?}", edge, n2);
|
||||
n2
|
||||
}
|
||||
}
|
||||
|
||||
pub type ConstraintMap<'tcx> = FnvHashMap<Constraint, SubregionOrigin<'tcx>>;
|
||||
pub type ConstraintMap<'tcx> = FnvHashMap<Constraint<'tcx>, SubregionOrigin<'tcx>>;
|
||||
|
||||
fn dump_region_constraints_to<'a, 'gcx, 'tcx>(tcx: TyCtxt<'a, 'gcx, 'tcx>,
|
||||
map: &ConstraintMap<'tcx>,
|
||||
|
@ -39,22 +39,22 @@ mod graphviz;
|
||||
|
||||
// A constraint that influences the inference process.
|
||||
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
|
||||
pub enum Constraint {
|
||||
pub enum Constraint<'tcx> {
|
||||
// One region variable is subregion of another
|
||||
ConstrainVarSubVar(RegionVid, RegionVid),
|
||||
|
||||
// Concrete region is subregion of region variable
|
||||
ConstrainRegSubVar(Region, RegionVid),
|
||||
ConstrainRegSubVar(&'tcx Region, RegionVid),
|
||||
|
||||
// Region variable is subregion of concrete region. This does not
|
||||
// directly affect inference, but instead is checked after
|
||||
// inference is complete.
|
||||
ConstrainVarSubReg(RegionVid, Region),
|
||||
ConstrainVarSubReg(RegionVid, &'tcx Region),
|
||||
|
||||
// A constraint where neither side is a variable. This does not
|
||||
// directly affect inference, but instead is checked after
|
||||
// inference is complete.
|
||||
ConstrainRegSubReg(Region, Region),
|
||||
ConstrainRegSubReg(&'tcx Region, &'tcx Region),
|
||||
}
|
||||
|
||||
// VerifyGenericBound(T, _, R, RS): The parameter type `T` (or
|
||||
@ -66,8 +66,8 @@ pub enum Constraint {
|
||||
pub struct Verify<'tcx> {
|
||||
kind: GenericKind<'tcx>,
|
||||
origin: SubregionOrigin<'tcx>,
|
||||
region: Region,
|
||||
bound: VerifyBound,
|
||||
region: &'tcx Region,
|
||||
bound: VerifyBound<'tcx>,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, PartialEq, Eq)]
|
||||
@ -80,36 +80,36 @@ pub enum GenericKind<'tcx> {
|
||||
// particular region (let's call it `'min`) meets some bound.
|
||||
// The bound is described the by the following grammar:
|
||||
#[derive(Debug)]
|
||||
pub enum VerifyBound {
|
||||
pub enum VerifyBound<'tcx> {
|
||||
// B = exists {R} --> some 'r in {R} must outlive 'min
|
||||
//
|
||||
// Put another way, the subject value is known to outlive all
|
||||
// regions in {R}, so if any of those outlives 'min, then the
|
||||
// bound is met.
|
||||
AnyRegion(Vec<Region>),
|
||||
AnyRegion(Vec<&'tcx Region>),
|
||||
|
||||
// B = forall {R} --> all 'r in {R} must outlive 'min
|
||||
//
|
||||
// Put another way, the subject value is known to outlive some
|
||||
// region in {R}, so if all of those outlives 'min, then the bound
|
||||
// is met.
|
||||
AllRegions(Vec<Region>),
|
||||
AllRegions(Vec<&'tcx Region>),
|
||||
|
||||
// B = exists {B} --> 'min must meet some bound b in {B}
|
||||
AnyBound(Vec<VerifyBound>),
|
||||
AnyBound(Vec<VerifyBound<'tcx>>),
|
||||
|
||||
// B = forall {B} --> 'min must meet all bounds b in {B}
|
||||
AllBounds(Vec<VerifyBound>),
|
||||
AllBounds(Vec<VerifyBound<'tcx>>),
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
|
||||
pub struct TwoRegions {
|
||||
a: Region,
|
||||
b: Region,
|
||||
pub struct TwoRegions<'tcx> {
|
||||
a: &'tcx Region,
|
||||
b: &'tcx Region,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, PartialEq)]
|
||||
pub enum UndoLogEntry {
|
||||
pub enum UndoLogEntry<'tcx> {
|
||||
/// Pushed when we start a snapshot.
|
||||
OpenSnapshot,
|
||||
|
||||
@ -122,7 +122,7 @@ pub enum UndoLogEntry {
|
||||
AddVar(RegionVid),
|
||||
|
||||
/// We added the given `constraint`
|
||||
AddConstraint(Constraint),
|
||||
AddConstraint(Constraint<'tcx>),
|
||||
|
||||
/// We added the given `verify`
|
||||
AddVerify(usize),
|
||||
@ -131,7 +131,7 @@ pub enum UndoLogEntry {
|
||||
AddGiven(ty::FreeRegion, ty::RegionVid),
|
||||
|
||||
/// We added a GLB/LUB "combinaton variable"
|
||||
AddCombination(CombineMapType, TwoRegions),
|
||||
AddCombination(CombineMapType, TwoRegions<'tcx>),
|
||||
|
||||
/// During skolemization, we sometimes purge entries from the undo
|
||||
/// log in a kind of minisnapshot (unlike other snapshots, this
|
||||
@ -153,13 +153,13 @@ pub enum RegionResolutionError<'tcx> {
|
||||
/// `ConcreteFailure(o, a, b)`:
|
||||
///
|
||||
/// `o` requires that `a <= b`, but this does not hold
|
||||
ConcreteFailure(SubregionOrigin<'tcx>, Region, Region),
|
||||
ConcreteFailure(SubregionOrigin<'tcx>, &'tcx Region, &'tcx Region),
|
||||
|
||||
/// `GenericBoundFailure(p, s, a)
|
||||
///
|
||||
/// The parameter/associated-type `p` must be known to outlive the lifetime
|
||||
/// `a` (but none of the known bounds are sufficient).
|
||||
GenericBoundFailure(SubregionOrigin<'tcx>, GenericKind<'tcx>, Region),
|
||||
GenericBoundFailure(SubregionOrigin<'tcx>, GenericKind<'tcx>, &'tcx Region),
|
||||
|
||||
/// `SubSupConflict(v, sub_origin, sub_r, sup_origin, sup_r)`:
|
||||
///
|
||||
@ -168,9 +168,9 @@ pub enum RegionResolutionError<'tcx> {
|
||||
/// `sub_r <= sup_r` does not hold.
|
||||
SubSupConflict(RegionVariableOrigin,
|
||||
SubregionOrigin<'tcx>,
|
||||
Region,
|
||||
&'tcx Region,
|
||||
SubregionOrigin<'tcx>,
|
||||
Region),
|
||||
&'tcx Region),
|
||||
|
||||
/// For subsets of `ConcreteFailure` and `SubSupConflict`, we can derive
|
||||
/// more specific errors message by suggesting to the user where they
|
||||
@ -182,7 +182,7 @@ pub enum RegionResolutionError<'tcx> {
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum ProcessedErrorOrigin<'tcx> {
|
||||
ConcreteFailure(SubregionOrigin<'tcx>, Region, Region),
|
||||
ConcreteFailure(SubregionOrigin<'tcx>, &'tcx Region, &'tcx Region),
|
||||
VariableFailure(RegionVariableOrigin),
|
||||
}
|
||||
|
||||
@ -213,7 +213,7 @@ impl SameRegions {
|
||||
}
|
||||
}
|
||||
|
||||
pub type CombineMap = FnvHashMap<TwoRegions, RegionVid>;
|
||||
pub type CombineMap<'tcx> = FnvHashMap<TwoRegions<'tcx>, RegionVid>;
|
||||
|
||||
pub struct RegionVarBindings<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
|
||||
tcx: TyCtxt<'a, 'gcx, 'tcx>,
|
||||
@ -222,7 +222,7 @@ pub struct RegionVarBindings<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
|
||||
// Constraints of the form `A <= B` introduced by the region
|
||||
// checker. Here at least one of `A` and `B` must be a region
|
||||
// variable.
|
||||
constraints: RefCell<FnvHashMap<Constraint, SubregionOrigin<'tcx>>>,
|
||||
constraints: RefCell<FnvHashMap<Constraint<'tcx>, SubregionOrigin<'tcx>>>,
|
||||
|
||||
// A "verify" is something that we need to verify after inference is
|
||||
// done, but which does not directly affect inference in any way.
|
||||
@ -250,8 +250,8 @@ pub struct RegionVarBindings<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
|
||||
// a bit of a hack but seems to work.
|
||||
givens: RefCell<FnvHashSet<(ty::FreeRegion, ty::RegionVid)>>,
|
||||
|
||||
lubs: RefCell<CombineMap>,
|
||||
glbs: RefCell<CombineMap>,
|
||||
lubs: RefCell<CombineMap<'tcx>>,
|
||||
glbs: RefCell<CombineMap<'tcx>>,
|
||||
skolemization_count: Cell<u32>,
|
||||
bound_count: Cell<u32>,
|
||||
|
||||
@ -264,12 +264,12 @@ pub struct RegionVarBindings<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
|
||||
// otherwise we end up adding entries for things like the lower
|
||||
// bound on a variable and so forth, which can never be rolled
|
||||
// back.
|
||||
undo_log: RefCell<Vec<UndoLogEntry>>,
|
||||
undo_log: RefCell<Vec<UndoLogEntry<'tcx>>>,
|
||||
unification_table: RefCell<UnificationTable<ty::RegionVid>>,
|
||||
|
||||
// This contains the results of inference. It begins as an empty
|
||||
// option and only acquires a value after inference is complete.
|
||||
values: RefCell<Option<Vec<VarValue>>>,
|
||||
values: RefCell<Option<Vec<VarValue<'tcx>>>>,
|
||||
}
|
||||
|
||||
pub struct RegionSnapshot {
|
||||
@ -303,14 +303,14 @@ impl TaintDirections {
|
||||
}
|
||||
}
|
||||
|
||||
struct TaintSet {
|
||||
struct TaintSet<'tcx> {
|
||||
directions: TaintDirections,
|
||||
regions: FnvHashSet<ty::Region>
|
||||
regions: FnvHashSet<&'tcx ty::Region>
|
||||
}
|
||||
|
||||
impl TaintSet {
|
||||
impl<'a, 'gcx, 'tcx> TaintSet<'tcx> {
|
||||
fn new(directions: TaintDirections,
|
||||
initial_region: ty::Region)
|
||||
initial_region: &'tcx ty::Region)
|
||||
-> Self {
|
||||
let mut regions = FnvHashSet();
|
||||
regions.insert(initial_region);
|
||||
@ -318,8 +318,9 @@ impl TaintSet {
|
||||
}
|
||||
|
||||
fn fixed_point(&mut self,
|
||||
undo_log: &[UndoLogEntry],
|
||||
verifys: &[Verify]) {
|
||||
tcx: TyCtxt<'a, 'gcx, 'tcx>,
|
||||
undo_log: &[UndoLogEntry<'tcx>],
|
||||
verifys: &[Verify<'tcx>]) {
|
||||
let mut prev_len = 0;
|
||||
while prev_len < self.len() {
|
||||
debug!("tainted: prev_len = {:?} new_len = {:?}",
|
||||
@ -330,19 +331,21 @@ impl TaintSet {
|
||||
for undo_entry in undo_log {
|
||||
match undo_entry {
|
||||
&AddConstraint(ConstrainVarSubVar(a, b)) => {
|
||||
self.add_edge(ReVar(a), ReVar(b));
|
||||
self.add_edge(tcx.mk_region(ReVar(a)),
|
||||
tcx.mk_region(ReVar(b)));
|
||||
}
|
||||
&AddConstraint(ConstrainRegSubVar(a, b)) => {
|
||||
self.add_edge(a, ReVar(b));
|
||||
self.add_edge(a, tcx.mk_region(ReVar(b)));
|
||||
}
|
||||
&AddConstraint(ConstrainVarSubReg(a, b)) => {
|
||||
self.add_edge(ReVar(a), b);
|
||||
self.add_edge(tcx.mk_region(ReVar(a)), b);
|
||||
}
|
||||
&AddConstraint(ConstrainRegSubReg(a, b)) => {
|
||||
self.add_edge(a, b);
|
||||
}
|
||||
&AddGiven(a, b) => {
|
||||
self.add_edge(ReFree(a), ReVar(b));
|
||||
self.add_edge(tcx.mk_region(ReFree(a)),
|
||||
tcx.mk_region(ReVar(b)));
|
||||
}
|
||||
&AddVerify(i) => {
|
||||
verifys[i].bound.for_each_region(&mut |b| {
|
||||
@ -359,7 +362,7 @@ impl TaintSet {
|
||||
}
|
||||
}
|
||||
|
||||
fn into_set(self) -> FnvHashSet<ty::Region> {
|
||||
fn into_set(self) -> FnvHashSet<&'tcx ty::Region> {
|
||||
self.regions
|
||||
}
|
||||
|
||||
@ -368,8 +371,8 @@ impl TaintSet {
|
||||
}
|
||||
|
||||
fn add_edge(&mut self,
|
||||
source: ty::Region,
|
||||
target: ty::Region) {
|
||||
source: &'tcx ty::Region,
|
||||
target: &'tcx ty::Region) {
|
||||
if self.directions.incoming {
|
||||
if self.regions.contains(&target) {
|
||||
self.regions.insert(source);
|
||||
@ -450,7 +453,7 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
.rollback_to(snapshot.region_snapshot);
|
||||
}
|
||||
|
||||
pub fn rollback_undo_entry(&self, undo_entry: UndoLogEntry) {
|
||||
pub fn rollback_undo_entry(&self, undo_entry: UndoLogEntry<'tcx>) {
|
||||
match undo_entry {
|
||||
OpenSnapshot => {
|
||||
panic!("Failure to observe stack discipline");
|
||||
@ -529,13 +532,14 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
/// The `snapshot` argument to this function is not really used;
|
||||
/// it's just there to make it explicit which snapshot bounds the
|
||||
/// skolemized region that results. It should always be the top-most snapshot.
|
||||
pub fn push_skolemized(&self, br: ty::BoundRegion, snapshot: &RegionSnapshot) -> Region {
|
||||
pub fn push_skolemized(&self, br: ty::BoundRegion, snapshot: &RegionSnapshot)
|
||||
-> &'tcx Region {
|
||||
assert!(self.in_snapshot());
|
||||
assert!(self.undo_log.borrow()[snapshot.length] == OpenSnapshot);
|
||||
|
||||
let sc = self.skolemization_count.get();
|
||||
self.skolemization_count.set(sc + 1);
|
||||
ReSkolemized(ty::SkolemizedRegionVid { index: sc }, br)
|
||||
self.tcx.mk_region(ReSkolemized(ty::SkolemizedRegionVid { index: sc }, br))
|
||||
}
|
||||
|
||||
/// Removes all the edges to/from the skolemized regions that are
|
||||
@ -543,7 +547,7 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
/// completes to remove all trace of the skolemized regions
|
||||
/// created in that time.
|
||||
pub fn pop_skolemized(&self,
|
||||
skols: &FnvHashSet<ty::Region>,
|
||||
skols: &FnvHashSet<&'tcx ty::Region>,
|
||||
snapshot: &RegionSnapshot) {
|
||||
debug!("pop_skolemized_regions(skols={:?})", skols);
|
||||
|
||||
@ -566,7 +570,7 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
skols.len());
|
||||
debug_assert! {
|
||||
skols.iter()
|
||||
.all(|k| match *k {
|
||||
.all(|&k| match *k {
|
||||
ty::ReSkolemized(index, _) =>
|
||||
index.index >= first_to_pop &&
|
||||
index.index < last_to_pop,
|
||||
@ -597,9 +601,9 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
self.skolemization_count.set(snapshot.skolemization_count);
|
||||
return;
|
||||
|
||||
fn kill_constraint(skols: &FnvHashSet<ty::Region>,
|
||||
undo_entry: &UndoLogEntry)
|
||||
-> bool {
|
||||
fn kill_constraint<'tcx>(skols: &FnvHashSet<&'tcx ty::Region>,
|
||||
undo_entry: &UndoLogEntry<'tcx>)
|
||||
-> bool {
|
||||
match undo_entry {
|
||||
&AddConstraint(ConstrainVarSubVar(_, _)) =>
|
||||
false,
|
||||
@ -626,7 +630,7 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
|
||||
}
|
||||
|
||||
pub fn new_bound(&self, debruijn: ty::DebruijnIndex) -> Region {
|
||||
pub fn new_bound(&self, debruijn: ty::DebruijnIndex) -> &'tcx Region {
|
||||
// Creates a fresh bound variable for use in GLB computations.
|
||||
// See discussion of GLB computation in the large comment at
|
||||
// the top of this file for more details.
|
||||
@ -652,14 +656,14 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
bug!("rollover in RegionInference new_bound()");
|
||||
}
|
||||
|
||||
ReLateBound(debruijn, BrFresh(sc))
|
||||
self.tcx.mk_region(ReLateBound(debruijn, BrFresh(sc)))
|
||||
}
|
||||
|
||||
fn values_are_none(&self) -> bool {
|
||||
self.values.borrow().is_none()
|
||||
}
|
||||
|
||||
fn add_constraint(&self, constraint: Constraint, origin: SubregionOrigin<'tcx>) {
|
||||
fn add_constraint(&self, constraint: Constraint<'tcx>, origin: SubregionOrigin<'tcx>) {
|
||||
// cannot add constraints once regions are resolved
|
||||
assert!(self.values_are_none());
|
||||
|
||||
@ -704,20 +708,26 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn make_eqregion(&self, origin: SubregionOrigin<'tcx>, sub: Region, sup: Region) {
|
||||
pub fn make_eqregion(&self,
|
||||
origin: SubregionOrigin<'tcx>,
|
||||
sub: &'tcx Region,
|
||||
sup: &'tcx Region) {
|
||||
if sub != sup {
|
||||
// Eventually, it would be nice to add direct support for
|
||||
// equating regions.
|
||||
self.make_subregion(origin.clone(), sub, sup);
|
||||
self.make_subregion(origin, sup, sub);
|
||||
|
||||
if let (ty::ReVar(sub), ty::ReVar(sup)) = (sub, sup) {
|
||||
if let (ty::ReVar(sub), ty::ReVar(sup)) = (*sub, *sup) {
|
||||
self.unification_table.borrow_mut().union(sub, sup);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn make_subregion(&self, origin: SubregionOrigin<'tcx>, sub: Region, sup: Region) {
|
||||
pub fn make_subregion(&self,
|
||||
origin: SubregionOrigin<'tcx>,
|
||||
sub: &'tcx Region,
|
||||
sup: &'tcx Region) {
|
||||
// cannot add constraints once regions are resolved
|
||||
assert!(self.values_are_none());
|
||||
|
||||
@ -727,26 +737,26 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
origin);
|
||||
|
||||
match (sub, sup) {
|
||||
(ReEarlyBound(..), _) |
|
||||
(ReLateBound(..), _) |
|
||||
(_, ReEarlyBound(..)) |
|
||||
(_, ReLateBound(..)) => {
|
||||
(&ReEarlyBound(..), _) |
|
||||
(&ReLateBound(..), _) |
|
||||
(_, &ReEarlyBound(..)) |
|
||||
(_, &ReLateBound(..)) => {
|
||||
span_bug!(origin.span(),
|
||||
"cannot relate bound region: {:?} <= {:?}",
|
||||
sub,
|
||||
sup);
|
||||
}
|
||||
(_, ReStatic) => {
|
||||
(_, &ReStatic) => {
|
||||
// all regions are subregions of static, so we can ignore this
|
||||
}
|
||||
(ReVar(sub_id), ReVar(sup_id)) => {
|
||||
(&ReVar(sub_id), &ReVar(sup_id)) => {
|
||||
self.add_constraint(ConstrainVarSubVar(sub_id, sup_id), origin);
|
||||
}
|
||||
(r, ReVar(sup_id)) => {
|
||||
self.add_constraint(ConstrainRegSubVar(r, sup_id), origin);
|
||||
(_, &ReVar(sup_id)) => {
|
||||
self.add_constraint(ConstrainRegSubVar(sub, sup_id), origin);
|
||||
}
|
||||
(ReVar(sub_id), r) => {
|
||||
self.add_constraint(ConstrainVarSubReg(sub_id, r), origin);
|
||||
(&ReVar(sub_id), _) => {
|
||||
self.add_constraint(ConstrainVarSubReg(sub_id, sup), origin);
|
||||
}
|
||||
_ => {
|
||||
self.add_constraint(ConstrainRegSubReg(sub, sup), origin);
|
||||
@ -758,8 +768,8 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
pub fn verify_generic_bound(&self,
|
||||
origin: SubregionOrigin<'tcx>,
|
||||
kind: GenericKind<'tcx>,
|
||||
sub: Region,
|
||||
bound: VerifyBound) {
|
||||
sub: &'tcx Region,
|
||||
bound: VerifyBound<'tcx>) {
|
||||
self.add_verify(Verify {
|
||||
kind: kind,
|
||||
origin: origin,
|
||||
@ -768,29 +778,43 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
});
|
||||
}
|
||||
|
||||
pub fn lub_regions(&self, origin: SubregionOrigin<'tcx>, a: Region, b: Region) -> Region {
|
||||
pub fn lub_regions(&self,
|
||||
origin: SubregionOrigin<'tcx>,
|
||||
a: &'tcx Region,
|
||||
b: &'tcx Region)
|
||||
-> &'tcx Region {
|
||||
// cannot add constraints once regions are resolved
|
||||
assert!(self.values_are_none());
|
||||
|
||||
debug!("RegionVarBindings: lub_regions({:?}, {:?})", a, b);
|
||||
if a == ty::ReStatic || b == ty::ReStatic {
|
||||
ReStatic // nothing lives longer than static
|
||||
} else if a == b {
|
||||
a // LUB(a,a) = a
|
||||
} else {
|
||||
self.combine_vars(Lub, a, b, origin.clone(), |this, old_r, new_r| {
|
||||
this.make_subregion(origin.clone(), old_r, new_r)
|
||||
})
|
||||
match (a, b) {
|
||||
(r @ &ReStatic, _) | (_, r @ &ReStatic) => {
|
||||
r // nothing lives longer than static
|
||||
}
|
||||
|
||||
_ if a == b => {
|
||||
a // LUB(a,a) = a
|
||||
}
|
||||
|
||||
_ => {
|
||||
self.combine_vars(Lub, a, b, origin.clone(), |this, old_r, new_r| {
|
||||
this.make_subregion(origin.clone(), old_r, new_r)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn glb_regions(&self, origin: SubregionOrigin<'tcx>, a: Region, b: Region) -> Region {
|
||||
pub fn glb_regions(&self,
|
||||
origin: SubregionOrigin<'tcx>,
|
||||
a: &'tcx Region,
|
||||
b: &'tcx Region)
|
||||
-> &'tcx Region {
|
||||
// cannot add constraints once regions are resolved
|
||||
assert!(self.values_are_none());
|
||||
|
||||
debug!("RegionVarBindings: glb_regions({:?}, {:?})", a, b);
|
||||
match (a, b) {
|
||||
(ReStatic, r) | (r, ReStatic) => {
|
||||
(&ReStatic, r) | (r, &ReStatic) => {
|
||||
r // static lives longer than everything else
|
||||
}
|
||||
|
||||
@ -806,7 +830,7 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn resolve_var(&self, rid: RegionVid) -> ty::Region {
|
||||
pub fn resolve_var(&self, rid: RegionVid) -> &'tcx ty::Region {
|
||||
match *self.values.borrow() {
|
||||
None => {
|
||||
span_bug!((*self.var_origins.borrow())[rid.index as usize].span(),
|
||||
@ -814,18 +838,19 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
been computed!")
|
||||
}
|
||||
Some(ref values) => {
|
||||
let r = lookup(values, rid);
|
||||
let r = lookup(self.tcx, values, rid);
|
||||
debug!("resolve_var({:?}) = {:?}", rid, r);
|
||||
r
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn opportunistic_resolve_var(&self, rid: RegionVid) -> ty::Region {
|
||||
ty::ReVar(self.unification_table.borrow_mut().find_value(rid).min_vid)
|
||||
pub fn opportunistic_resolve_var(&self, rid: RegionVid) -> &'tcx ty::Region {
|
||||
let vid = self.unification_table.borrow_mut().find_value(rid).min_vid;
|
||||
self.tcx.mk_region(ty::ReVar(vid))
|
||||
}
|
||||
|
||||
fn combine_map(&self, t: CombineMapType) -> &RefCell<CombineMap> {
|
||||
fn combine_map(&self, t: CombineMapType) -> &RefCell<CombineMap<'tcx>> {
|
||||
match t {
|
||||
Glb => &self.glbs,
|
||||
Lub => &self.lubs,
|
||||
@ -834,26 +859,26 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
|
||||
pub fn combine_vars<F>(&self,
|
||||
t: CombineMapType,
|
||||
a: Region,
|
||||
b: Region,
|
||||
a: &'tcx Region,
|
||||
b: &'tcx Region,
|
||||
origin: SubregionOrigin<'tcx>,
|
||||
mut relate: F)
|
||||
-> Region
|
||||
where F: FnMut(&RegionVarBindings<'a, 'gcx, 'tcx>, Region, Region)
|
||||
-> &'tcx Region
|
||||
where F: FnMut(&RegionVarBindings<'a, 'gcx, 'tcx>, &'tcx Region, &'tcx Region)
|
||||
{
|
||||
let vars = TwoRegions { a: a, b: b };
|
||||
if let Some(&c) = self.combine_map(t).borrow().get(&vars) {
|
||||
return ReVar(c);
|
||||
return self.tcx.mk_region(ReVar(c));
|
||||
}
|
||||
let c = self.new_region_var(MiscVariable(origin.span()));
|
||||
self.combine_map(t).borrow_mut().insert(vars, c);
|
||||
if self.in_snapshot() {
|
||||
self.undo_log.borrow_mut().push(AddCombination(t, vars));
|
||||
}
|
||||
relate(self, a, ReVar(c));
|
||||
relate(self, b, ReVar(c));
|
||||
relate(self, a, self.tcx.mk_region(ReVar(c)));
|
||||
relate(self, b, self.tcx.mk_region(ReVar(c)));
|
||||
debug!("combine_vars() c={:?}", c);
|
||||
ReVar(c)
|
||||
self.tcx.mk_region(ReVar(c))
|
||||
}
|
||||
|
||||
pub fn vars_created_since_snapshot(&self, mark: &RegionSnapshot) -> Vec<RegionVid> {
|
||||
@ -878,9 +903,9 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
/// related to other regions.
|
||||
pub fn tainted(&self,
|
||||
mark: &RegionSnapshot,
|
||||
r0: Region,
|
||||
r0: &'tcx Region,
|
||||
directions: TaintDirections)
|
||||
-> FnvHashSet<ty::Region> {
|
||||
-> FnvHashSet<&'tcx ty::Region> {
|
||||
debug!("tainted(mark={:?}, r0={:?}, directions={:?})",
|
||||
mark, r0, directions);
|
||||
|
||||
@ -888,7 +913,8 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
// edges and add any new regions we find to result_set. This
|
||||
// is not a terribly efficient implementation.
|
||||
let mut taint_set = TaintSet::new(directions, r0);
|
||||
taint_set.fixed_point(&self.undo_log.borrow()[mark.length..],
|
||||
taint_set.fixed_point(self.tcx,
|
||||
&self.undo_log.borrow()[mark.length..],
|
||||
&self.verifys.borrow());
|
||||
debug!("tainted: result={:?}", taint_set.regions);
|
||||
return taint_set.into_set();
|
||||
@ -910,26 +936,30 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
errors
|
||||
}
|
||||
|
||||
fn lub_concrete_regions(&self, free_regions: &FreeRegionMap, a: Region, b: Region) -> Region {
|
||||
fn lub_concrete_regions(&self,
|
||||
free_regions: &FreeRegionMap,
|
||||
a: &'tcx Region,
|
||||
b: &'tcx Region)
|
||||
-> &'tcx Region {
|
||||
match (a, b) {
|
||||
(ReLateBound(..), _) |
|
||||
(_, ReLateBound(..)) |
|
||||
(ReEarlyBound(..), _) |
|
||||
(_, ReEarlyBound(..)) |
|
||||
(ReErased, _) |
|
||||
(_, ReErased) => {
|
||||
(&ReLateBound(..), _) |
|
||||
(_, &ReLateBound(..)) |
|
||||
(&ReEarlyBound(..), _) |
|
||||
(_, &ReEarlyBound(..)) |
|
||||
(&ReErased, _) |
|
||||
(_, &ReErased) => {
|
||||
bug!("cannot relate region: LUB({:?}, {:?})", a, b);
|
||||
}
|
||||
|
||||
(ReStatic, _) | (_, ReStatic) => {
|
||||
ReStatic // nothing lives longer than static
|
||||
(r @ &ReStatic, _) | (_, r @ &ReStatic) => {
|
||||
r // nothing lives longer than static
|
||||
}
|
||||
|
||||
(ReEmpty, r) | (r, ReEmpty) => {
|
||||
(&ReEmpty, r) | (r, &ReEmpty) => {
|
||||
r // everything lives longer than empty
|
||||
}
|
||||
|
||||
(ReVar(v_id), _) | (_, ReVar(v_id)) => {
|
||||
(&ReVar(v_id), _) | (_, &ReVar(v_id)) => {
|
||||
span_bug!((*self.var_origins.borrow())[v_id.index as usize].span(),
|
||||
"lub_concrete_regions invoked with non-concrete \
|
||||
regions: {:?}, {:?}",
|
||||
@ -937,9 +967,8 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
b);
|
||||
}
|
||||
|
||||
(ReFree(ref fr), ReScope(s_id)) |
|
||||
(ReScope(s_id), ReFree(ref fr)) => {
|
||||
let f = ReFree(*fr);
|
||||
(&ReFree(fr), &ReScope(s_id)) |
|
||||
(&ReScope(s_id), &ReFree(fr)) => {
|
||||
// A "free" region can be interpreted as "some region
|
||||
// at least as big as the block fr.scope_id". So, we can
|
||||
// reasonably compare free regions and scopes:
|
||||
@ -949,33 +978,34 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
// if the free region's scope `fr.scope_id` is bigger than
|
||||
// the scope region `s_id`, then the LUB is the free
|
||||
// region itself:
|
||||
f
|
||||
self.tcx.mk_region(ReFree(fr))
|
||||
} else {
|
||||
// otherwise, we don't know what the free region is,
|
||||
// so we must conservatively say the LUB is static:
|
||||
ReStatic
|
||||
self.tcx.mk_region(ReStatic)
|
||||
}
|
||||
}
|
||||
|
||||
(ReScope(a_id), ReScope(b_id)) => {
|
||||
(&ReScope(a_id), &ReScope(b_id)) => {
|
||||
// The region corresponding to an outer block is a
|
||||
// subtype of the region corresponding to an inner
|
||||
// block.
|
||||
ReScope(self.tcx.region_maps.nearest_common_ancestor(a_id, b_id))
|
||||
self.tcx.mk_region(ReScope(
|
||||
self.tcx.region_maps.nearest_common_ancestor(a_id, b_id)))
|
||||
}
|
||||
|
||||
(ReFree(a_fr), ReFree(b_fr)) => {
|
||||
free_regions.lub_free_regions(a_fr, b_fr)
|
||||
(&ReFree(a_fr), &ReFree(b_fr)) => {
|
||||
self.tcx.mk_region(free_regions.lub_free_regions(a_fr, b_fr))
|
||||
}
|
||||
|
||||
// For these types, we cannot define any additional
|
||||
// relationship:
|
||||
(ReSkolemized(..), _) |
|
||||
(_, ReSkolemized(..)) => {
|
||||
(&ReSkolemized(..), _) |
|
||||
(_, &ReSkolemized(..)) => {
|
||||
if a == b {
|
||||
a
|
||||
} else {
|
||||
ReStatic
|
||||
self.tcx.mk_region(ReStatic)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -985,24 +1015,24 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
// ______________________________________________________________________
|
||||
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
pub enum VarValue {
|
||||
Value(Region),
|
||||
pub enum VarValue<'tcx> {
|
||||
Value(&'tcx Region),
|
||||
ErrorValue,
|
||||
}
|
||||
|
||||
struct RegionAndOrigin<'tcx> {
|
||||
region: Region,
|
||||
region: &'tcx Region,
|
||||
origin: SubregionOrigin<'tcx>,
|
||||
}
|
||||
|
||||
type RegionGraph = graph::Graph<(), Constraint>;
|
||||
type RegionGraph<'tcx> = graph::Graph<(), Constraint<'tcx>>;
|
||||
|
||||
impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
fn infer_variable_values(&self,
|
||||
free_regions: &FreeRegionMap,
|
||||
errors: &mut Vec<RegionResolutionError<'tcx>>,
|
||||
subject: ast::NodeId)
|
||||
-> Vec<VarValue> {
|
||||
-> Vec<VarValue<'tcx>> {
|
||||
let mut var_data = self.construct_var_data();
|
||||
|
||||
// Dorky hack to cause `dump_constraints` to only get called
|
||||
@ -1020,9 +1050,9 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
var_data
|
||||
}
|
||||
|
||||
fn construct_var_data(&self) -> Vec<VarValue> {
|
||||
fn construct_var_data(&self) -> Vec<VarValue<'tcx>> {
|
||||
(0..self.num_vars() as usize)
|
||||
.map(|_| Value(ty::ReEmpty))
|
||||
.map(|_| Value(self.tcx.mk_region(ty::ReEmpty)))
|
||||
.collect()
|
||||
}
|
||||
|
||||
@ -1059,7 +1089,7 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
fn expansion(&self, free_regions: &FreeRegionMap, var_values: &mut [VarValue]) {
|
||||
fn expansion(&self, free_regions: &FreeRegionMap, var_values: &mut [VarValue<'tcx>]) {
|
||||
self.iterate_until_fixed_point("Expansion", |constraint, origin| {
|
||||
debug!("expansion: constraint={:?} origin={:?}",
|
||||
constraint, origin);
|
||||
@ -1089,9 +1119,9 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
|
||||
fn expand_node(&self,
|
||||
free_regions: &FreeRegionMap,
|
||||
a_region: Region,
|
||||
a_region: &'tcx Region,
|
||||
b_vid: RegionVid,
|
||||
b_data: &mut VarValue)
|
||||
b_data: &mut VarValue<'tcx>)
|
||||
-> bool {
|
||||
debug!("expand_node({:?}, {:?} == {:?})",
|
||||
a_region,
|
||||
@ -1099,7 +1129,7 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
b_data);
|
||||
|
||||
// Check if this relationship is implied by a given.
|
||||
match a_region {
|
||||
match *a_region {
|
||||
ty::ReFree(fr) => {
|
||||
if self.givens.borrow().contains(&(fr, b_vid)) {
|
||||
debug!("given");
|
||||
@ -1136,7 +1166,7 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
/// and check that they are satisfied.
|
||||
fn collect_errors(&self,
|
||||
free_regions: &FreeRegionMap,
|
||||
var_data: &mut Vec<VarValue>,
|
||||
var_data: &mut Vec<VarValue<'tcx>>,
|
||||
errors: &mut Vec<RegionResolutionError<'tcx>>) {
|
||||
let constraints = self.constraints.borrow();
|
||||
for (constraint, origin) in constraints.iter() {
|
||||
@ -1192,7 +1222,7 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
|
||||
for verify in self.verifys.borrow().iter() {
|
||||
debug!("collect_errors: verify={:?}", verify);
|
||||
let sub = normalize(var_data, verify.region);
|
||||
let sub = normalize(self.tcx, var_data, verify.region);
|
||||
if verify.bound.is_met(self.tcx, free_regions, var_data, sub) {
|
||||
continue;
|
||||
}
|
||||
@ -1213,8 +1243,8 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
/// and create a `RegionResolutionError` for each of them.
|
||||
fn collect_var_errors(&self,
|
||||
free_regions: &FreeRegionMap,
|
||||
var_data: &[VarValue],
|
||||
graph: &RegionGraph,
|
||||
var_data: &[VarValue<'tcx>],
|
||||
graph: &RegionGraph<'tcx>,
|
||||
errors: &mut Vec<RegionResolutionError<'tcx>>) {
|
||||
debug!("collect_var_errors");
|
||||
|
||||
@ -1271,7 +1301,7 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
fn construct_graph(&self) -> RegionGraph {
|
||||
fn construct_graph(&self) -> RegionGraph<'tcx> {
|
||||
let num_vars = self.num_vars();
|
||||
|
||||
let constraints = self.constraints.borrow();
|
||||
@ -1315,7 +1345,7 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
|
||||
fn collect_error_for_expanding_node(&self,
|
||||
free_regions: &FreeRegionMap,
|
||||
graph: &RegionGraph,
|
||||
graph: &RegionGraph<'tcx>,
|
||||
dup_vec: &mut [u32],
|
||||
node_idx: RegionVid,
|
||||
errors: &mut Vec<RegionResolutionError<'tcx>>) {
|
||||
@ -1339,9 +1369,9 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
// the user will more likely get a specific suggestion.
|
||||
fn free_regions_first(a: &RegionAndOrigin, b: &RegionAndOrigin) -> Ordering {
|
||||
match (a.region, b.region) {
|
||||
(ReFree(..), ReFree(..)) => Equal,
|
||||
(ReFree(..), _) => Less,
|
||||
(_, ReFree(..)) => Greater,
|
||||
(&ReFree(..), &ReFree(..)) => Equal,
|
||||
(&ReFree(..), _) => Less,
|
||||
(_, &ReFree(..)) => Greater,
|
||||
(_, _) => Equal,
|
||||
}
|
||||
}
|
||||
@ -1378,7 +1408,7 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
}
|
||||
|
||||
fn collect_concrete_regions(&self,
|
||||
graph: &RegionGraph,
|
||||
graph: &RegionGraph<'tcx>,
|
||||
orig_node_idx: RegionVid,
|
||||
dir: Direction,
|
||||
dup_vec: &mut [u32])
|
||||
@ -1423,7 +1453,7 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
|
||||
fn process_edges<'a, 'gcx, 'tcx>(this: &RegionVarBindings<'a, 'gcx, 'tcx>,
|
||||
state: &mut WalkState<'tcx>,
|
||||
graph: &RegionGraph,
|
||||
graph: &RegionGraph<'tcx>,
|
||||
source_vid: RegionVid,
|
||||
dir: Direction) {
|
||||
debug!("process_edges(source_vid={:?}, dir={:?})", source_vid, dir);
|
||||
@ -1460,7 +1490,7 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
}
|
||||
|
||||
fn iterate_until_fixed_point<F>(&self, tag: &str, mut body: F)
|
||||
where F: FnMut(&Constraint, &SubregionOrigin<'tcx>) -> bool
|
||||
where F: FnMut(&Constraint<'tcx>, &SubregionOrigin<'tcx>) -> bool
|
||||
{
|
||||
let mut iteration = 0;
|
||||
let mut changed = true;
|
||||
@ -1481,17 +1511,23 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
|
||||
|
||||
}
|
||||
|
||||
fn normalize(values: &Vec<VarValue>, r: ty::Region) -> ty::Region {
|
||||
match r {
|
||||
ty::ReVar(rid) => lookup(values, rid),
|
||||
fn normalize<'a, 'gcx, 'tcx>(tcx: TyCtxt<'a, 'gcx, 'tcx>,
|
||||
values: &Vec<VarValue<'tcx>>,
|
||||
r: &'tcx ty::Region)
|
||||
-> &'tcx ty::Region {
|
||||
match *r {
|
||||
ty::ReVar(rid) => lookup(tcx, values, rid),
|
||||
_ => r,
|
||||
}
|
||||
}
|
||||
|
||||
fn lookup(values: &Vec<VarValue>, rid: ty::RegionVid) -> ty::Region {
|
||||
fn lookup<'a, 'gcx, 'tcx>(tcx: TyCtxt<'a, 'gcx, 'tcx>,
|
||||
values: &Vec<VarValue<'tcx>>,
|
||||
rid: ty::RegionVid)
|
||||
-> &'tcx ty::Region {
|
||||
match values[rid.index as usize] {
|
||||
Value(r) => r,
|
||||
ErrorValue => ReStatic, // Previously reported error.
|
||||
ErrorValue => tcx.mk_region(ReStatic), // Previously reported error.
|
||||
}
|
||||
}
|
||||
|
||||
@ -1535,8 +1571,8 @@ impl<'a, 'gcx, 'tcx> GenericKind<'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'gcx, 'tcx> VerifyBound {
|
||||
fn for_each_region(&self, f: &mut FnMut(ty::Region)) {
|
||||
impl<'a, 'gcx, 'tcx> VerifyBound<'tcx> {
|
||||
fn for_each_region(&self, f: &mut FnMut(&'tcx ty::Region)) {
|
||||
match self {
|
||||
&VerifyBound::AnyRegion(ref rs) |
|
||||
&VerifyBound::AllRegions(ref rs) => for &r in rs {
|
||||
@ -1552,7 +1588,7 @@ impl<'a, 'gcx, 'tcx> VerifyBound {
|
||||
|
||||
pub fn must_hold(&self) -> bool {
|
||||
match self {
|
||||
&VerifyBound::AnyRegion(ref bs) => bs.contains(&ty::ReStatic),
|
||||
&VerifyBound::AnyRegion(ref bs) => bs.contains(&&ty::ReStatic),
|
||||
&VerifyBound::AllRegions(ref bs) => bs.is_empty(),
|
||||
&VerifyBound::AnyBound(ref bs) => bs.iter().any(|b| b.must_hold()),
|
||||
&VerifyBound::AllBounds(ref bs) => bs.iter().all(|b| b.must_hold()),
|
||||
@ -1562,13 +1598,13 @@ impl<'a, 'gcx, 'tcx> VerifyBound {
|
||||
pub fn cannot_hold(&self) -> bool {
|
||||
match self {
|
||||
&VerifyBound::AnyRegion(ref bs) => bs.is_empty(),
|
||||
&VerifyBound::AllRegions(ref bs) => bs.contains(&ty::ReEmpty),
|
||||
&VerifyBound::AllRegions(ref bs) => bs.contains(&&ty::ReEmpty),
|
||||
&VerifyBound::AnyBound(ref bs) => bs.iter().all(|b| b.cannot_hold()),
|
||||
&VerifyBound::AllBounds(ref bs) => bs.iter().any(|b| b.cannot_hold()),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn or(self, vb: VerifyBound) -> VerifyBound {
|
||||
pub fn or(self, vb: VerifyBound<'tcx>) -> VerifyBound<'tcx> {
|
||||
if self.must_hold() || vb.cannot_hold() {
|
||||
self
|
||||
} else if self.cannot_hold() || vb.must_hold() {
|
||||
@ -1578,7 +1614,7 @@ impl<'a, 'gcx, 'tcx> VerifyBound {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn and(self, vb: VerifyBound) -> VerifyBound {
|
||||
pub fn and(self, vb: VerifyBound<'tcx>) -> VerifyBound<'tcx> {
|
||||
if self.must_hold() && vb.must_hold() {
|
||||
self
|
||||
} else if self.cannot_hold() && vb.cannot_hold() {
|
||||
@ -1590,18 +1626,18 @@ impl<'a, 'gcx, 'tcx> VerifyBound {
|
||||
|
||||
fn is_met(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>,
|
||||
free_regions: &FreeRegionMap,
|
||||
var_values: &Vec<VarValue>,
|
||||
min: ty::Region)
|
||||
var_values: &Vec<VarValue<'tcx>>,
|
||||
min: &'tcx ty::Region)
|
||||
-> bool {
|
||||
match self {
|
||||
&VerifyBound::AnyRegion(ref rs) =>
|
||||
rs.iter()
|
||||
.map(|&r| normalize(var_values, r))
|
||||
.map(|&r| normalize(tcx, var_values, r))
|
||||
.any(|r| free_regions.is_subregion_of(tcx, min, r)),
|
||||
|
||||
&VerifyBound::AllRegions(ref rs) =>
|
||||
rs.iter()
|
||||
.map(|&r| normalize(var_values, r))
|
||||
.map(|&r| normalize(tcx, var_values, r))
|
||||
.all(|r| free_regions.is_subregion_of(tcx, min, r)),
|
||||
|
||||
&VerifyBound::AnyBound(ref bs) =>
|
||||
|
@ -72,10 +72,10 @@ impl<'a, 'gcx, 'tcx> TypeFolder<'gcx, 'tcx> for OpportunisticTypeAndRegionResolv
|
||||
}
|
||||
}
|
||||
|
||||
fn fold_region(&mut self, r: ty::Region) -> ty::Region {
|
||||
match r {
|
||||
ty::ReVar(rid) => self.infcx.region_vars.opportunistic_resolve_var(rid),
|
||||
_ => r,
|
||||
fn fold_region(&mut self, r: &'tcx ty::Region) -> &'tcx ty::Region {
|
||||
match *r {
|
||||
ty::ReVar(rid) => self.infcx.region_vars.opportunistic_resolve_var(rid),
|
||||
_ => r,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -138,10 +138,10 @@ impl<'a, 'gcx, 'tcx> TypeFolder<'gcx, 'tcx> for FullTypeResolver<'a, 'gcx, 'tcx>
|
||||
}
|
||||
}
|
||||
|
||||
fn fold_region(&mut self, r: ty::Region) -> ty::Region {
|
||||
match r {
|
||||
ty::ReVar(rid) => self.infcx.region_vars.resolve_var(rid),
|
||||
_ => r,
|
||||
fn fold_region(&mut self, r: &'tcx ty::Region) -> &'tcx ty::Region {
|
||||
match *r {
|
||||
ty::ReVar(rid) => self.infcx.region_vars.resolve_var(rid),
|
||||
_ => r,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -107,7 +107,8 @@ impl<'combine, 'infcx, 'gcx, 'tcx> TypeRelation<'infcx, 'gcx, 'tcx>
|
||||
}
|
||||
}
|
||||
|
||||
fn regions(&mut self, a: ty::Region, b: ty::Region) -> RelateResult<'tcx, ty::Region> {
|
||||
fn regions(&mut self, a: &'tcx ty::Region, b: &'tcx ty::Region)
|
||||
-> RelateResult<'tcx, &'tcx ty::Region> {
|
||||
debug!("{}.regions({:?}, {:?}) self.cause={:?}",
|
||||
self.tag(), a, b, self.fields.cause);
|
||||
// FIXME -- we have more fine-grained information available
|
||||
|
@ -198,7 +198,6 @@ pub trait CrateStore<'tcx> {
|
||||
fn is_default_impl(&self, impl_did: DefId) -> bool;
|
||||
fn is_extern_item<'a>(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>, did: DefId) -> bool;
|
||||
fn is_foreign_item(&self, did: DefId) -> bool;
|
||||
fn is_static_method(&self, did: DefId) -> bool;
|
||||
fn is_statically_included_foreign_item(&self, id: ast::NodeId) -> bool;
|
||||
fn is_typedef(&self, did: DefId) -> bool;
|
||||
|
||||
@ -391,7 +390,6 @@ impl<'tcx> CrateStore<'tcx> for DummyCrateStore {
|
||||
fn is_extern_item<'a>(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>, did: DefId) -> bool
|
||||
{ bug!("is_extern_item") }
|
||||
fn is_foreign_item(&self, did: DefId) -> bool { bug!("is_foreign_item") }
|
||||
fn is_static_method(&self, did: DefId) -> bool { bug!("is_static_method") }
|
||||
fn is_statically_included_foreign_item(&self, id: ast::NodeId) -> bool { false }
|
||||
fn is_typedef(&self, did: DefId) -> bool { bug!("is_typedef") }
|
||||
|
||||
|
@ -76,7 +76,7 @@ pub trait Delegate<'tcx> {
|
||||
borrow_id: ast::NodeId,
|
||||
borrow_span: Span,
|
||||
cmt: mc::cmt<'tcx>,
|
||||
loan_region: ty::Region,
|
||||
loan_region: &'tcx ty::Region,
|
||||
bk: ty::BorrowKind,
|
||||
loan_cause: LoanCause);
|
||||
|
||||
@ -301,11 +301,11 @@ impl<'a, 'gcx, 'tcx> ExprUseVisitor<'a, 'gcx, 'tcx> {
|
||||
for arg in &decl.inputs {
|
||||
let arg_ty = return_if_err!(self.mc.infcx.node_ty(arg.pat.id));
|
||||
|
||||
let fn_body_scope = self.tcx().region_maps.node_extent(body.id);
|
||||
let fn_body_scope_r = self.tcx().node_scope_region(body.id);
|
||||
let arg_cmt = self.mc.cat_rvalue(
|
||||
arg.id,
|
||||
arg.pat.span,
|
||||
ty::ReScope(fn_body_scope), // Args live only as long as the fn body.
|
||||
fn_body_scope_r, // Args live only as long as the fn body.
|
||||
arg_ty);
|
||||
|
||||
self.walk_irrefutable_pat(arg_cmt, &arg.pat);
|
||||
@ -352,7 +352,7 @@ impl<'a, 'gcx, 'tcx> ExprUseVisitor<'a, 'gcx, 'tcx> {
|
||||
|
||||
fn borrow_expr(&mut self,
|
||||
expr: &hir::Expr,
|
||||
r: ty::Region,
|
||||
r: &'tcx ty::Region,
|
||||
bk: ty::BorrowKind,
|
||||
cause: LoanCause) {
|
||||
debug!("borrow_expr(expr={:?}, r={:?}, bk={:?})",
|
||||
@ -431,7 +431,8 @@ impl<'a, 'gcx, 'tcx> ExprUseVisitor<'a, 'gcx, 'tcx> {
|
||||
|
||||
hir::ExprMatch(ref discr, ref arms, _) => {
|
||||
let discr_cmt = return_if_err!(self.mc.cat_expr(&discr));
|
||||
self.borrow_expr(&discr, ty::ReEmpty, ty::ImmBorrow, MatchDiscriminant);
|
||||
let r = self.tcx().mk_region(ty::ReEmpty);
|
||||
self.borrow_expr(&discr, r, ty::ImmBorrow, MatchDiscriminant);
|
||||
|
||||
// treatment of the discriminant is handled while walking the arms.
|
||||
for arm in arms {
|
||||
@ -449,7 +450,7 @@ impl<'a, 'gcx, 'tcx> ExprUseVisitor<'a, 'gcx, 'tcx> {
|
||||
// make sure that the thing we are pointing out stays valid
|
||||
// for the lifetime `scope_r` of the resulting ptr:
|
||||
let expr_ty = return_if_err!(self.mc.infcx.node_ty(expr.id));
|
||||
if let ty::TyRef(&r, _) = expr_ty.sty {
|
||||
if let ty::TyRef(r, _) = expr_ty.sty {
|
||||
let bk = ty::BorrowKind::from_mutbl(m);
|
||||
self.borrow_expr(&base, r, bk, AddrOf);
|
||||
}
|
||||
@ -557,7 +558,6 @@ impl<'a, 'gcx, 'tcx> ExprUseVisitor<'a, 'gcx, 'tcx> {
|
||||
let callee_ty = return_if_err!(self.mc.infcx.expr_ty_adjusted(callee));
|
||||
debug!("walk_callee: callee={:?} callee_ty={:?}",
|
||||
callee, callee_ty);
|
||||
let call_scope = self.tcx().region_maps.node_extent(call.id);
|
||||
match callee_ty.sty {
|
||||
ty::TyFnDef(..) | ty::TyFnPtr(_) => {
|
||||
self.consume_expr(callee);
|
||||
@ -578,14 +578,16 @@ impl<'a, 'gcx, 'tcx> ExprUseVisitor<'a, 'gcx, 'tcx> {
|
||||
};
|
||||
match overloaded_call_type {
|
||||
FnMutOverloadedCall => {
|
||||
let call_scope_r = self.tcx().node_scope_region(call.id);
|
||||
self.borrow_expr(callee,
|
||||
ty::ReScope(call_scope),
|
||||
call_scope_r,
|
||||
ty::MutBorrow,
|
||||
ClosureInvocation);
|
||||
}
|
||||
FnOverloadedCall => {
|
||||
let call_scope_r = self.tcx().node_scope_region(call.id);
|
||||
self.borrow_expr(callee,
|
||||
ty::ReScope(call_scope),
|
||||
call_scope_r,
|
||||
ty::ImmBorrow,
|
||||
ClosureInvocation);
|
||||
}
|
||||
@ -761,7 +763,7 @@ impl<'a, 'gcx, 'tcx> ExprUseVisitor<'a, 'gcx, 'tcx> {
|
||||
};
|
||||
let bk = ty::BorrowKind::from_mutbl(m);
|
||||
self.delegate.borrow(expr.id, expr.span, cmt,
|
||||
*r, bk, AutoRef);
|
||||
r, bk, AutoRef);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -822,7 +824,7 @@ impl<'a, 'gcx, 'tcx> ExprUseVisitor<'a, 'gcx, 'tcx> {
|
||||
self.delegate.borrow(expr.id,
|
||||
expr.span,
|
||||
cmt_base,
|
||||
*r,
|
||||
r,
|
||||
ty::BorrowKind::from_mutbl(m),
|
||||
AutoRef);
|
||||
}
|
||||
@ -835,7 +837,7 @@ impl<'a, 'gcx, 'tcx> ExprUseVisitor<'a, 'gcx, 'tcx> {
|
||||
// Converting from a &T to *T (or &mut T to *mut T) is
|
||||
// treated as borrowing it for the enclosing temporary
|
||||
// scope.
|
||||
let r = ty::ReScope(self.tcx().region_maps.node_extent(expr.id));
|
||||
let r = self.tcx().node_scope_region(expr.id);
|
||||
|
||||
self.delegate.borrow(expr.id,
|
||||
expr.span,
|
||||
@ -890,7 +892,7 @@ impl<'a, 'gcx, 'tcx> ExprUseVisitor<'a, 'gcx, 'tcx> {
|
||||
// methods are implicitly autoref'd which sadly does not use
|
||||
// adjustments, so we must hardcode the borrow here.
|
||||
|
||||
let r = ty::ReScope(self.tcx().region_maps.node_extent(expr.id));
|
||||
let r = self.tcx().node_scope_region(expr.id);
|
||||
let bk = ty::ImmBorrow;
|
||||
|
||||
for &arg in &rhs {
|
||||
@ -979,7 +981,7 @@ impl<'a, 'gcx, 'tcx> ExprUseVisitor<'a, 'gcx, 'tcx> {
|
||||
// It is also a borrow or copy/move of the value being matched.
|
||||
match bmode {
|
||||
hir::BindByRef(m) => {
|
||||
if let ty::TyRef(&r, _) = pat_ty.sty {
|
||||
if let ty::TyRef(r, _) = pat_ty.sty {
|
||||
let bk = ty::BorrowKind::from_mutbl(m);
|
||||
delegate.borrow(pat.id, pat.span, cmt_pat, r, bk, RefBinding);
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ impl FreeRegionMap {
|
||||
for implied_bound in implied_bounds {
|
||||
debug!("implied bound: {:?}", implied_bound);
|
||||
match *implied_bound {
|
||||
ImpliedBound::RegionSubRegion(ty::ReFree(free_a), ty::ReFree(free_b)) => {
|
||||
ImpliedBound::RegionSubRegion(&ty::ReFree(free_a), &ty::ReFree(free_b)) => {
|
||||
self.relate_free_regions(free_a, free_b);
|
||||
}
|
||||
ImpliedBound::RegionSubRegion(..) |
|
||||
@ -65,9 +65,9 @@ impl FreeRegionMap {
|
||||
}
|
||||
ty::Predicate::RegionOutlives(ty::Binder(ty::OutlivesPredicate(r_a, r_b))) => {
|
||||
match (r_a, r_b) {
|
||||
(ty::ReStatic, ty::ReFree(_)) => {},
|
||||
(ty::ReFree(fr_a), ty::ReStatic) => self.relate_to_static(fr_a),
|
||||
(ty::ReFree(fr_a), ty::ReFree(fr_b)) => {
|
||||
(&ty::ReStatic, &ty::ReFree(_)) => {},
|
||||
(&ty::ReFree(fr_a), &ty::ReStatic) => self.relate_to_static(fr_a),
|
||||
(&ty::ReFree(fr_a), &ty::ReFree(fr_b)) => {
|
||||
// Record that `'a:'b`. Or, put another way, `'b <= 'a`.
|
||||
self.relate_free_regions(fr_b, fr_a);
|
||||
}
|
||||
@ -122,26 +122,26 @@ impl FreeRegionMap {
|
||||
/// inference* and sadly the logic is somewhat duplicated with the code in infer.rs.
|
||||
pub fn is_subregion_of(&self,
|
||||
tcx: TyCtxt,
|
||||
sub_region: ty::Region,
|
||||
super_region: ty::Region)
|
||||
sub_region: &ty::Region,
|
||||
super_region: &ty::Region)
|
||||
-> bool {
|
||||
let result = sub_region == super_region || {
|
||||
match (sub_region, super_region) {
|
||||
(ty::ReEmpty, _) |
|
||||
(_, ty::ReStatic) =>
|
||||
(&ty::ReEmpty, _) |
|
||||
(_, &ty::ReStatic) =>
|
||||
true,
|
||||
|
||||
(ty::ReScope(sub_scope), ty::ReScope(super_scope)) =>
|
||||
(&ty::ReScope(sub_scope), &ty::ReScope(super_scope)) =>
|
||||
tcx.region_maps.is_subscope_of(sub_scope, super_scope),
|
||||
|
||||
(ty::ReScope(sub_scope), ty::ReFree(fr)) =>
|
||||
(&ty::ReScope(sub_scope), &ty::ReFree(fr)) =>
|
||||
tcx.region_maps.is_subscope_of(sub_scope, fr.scope) ||
|
||||
self.is_static(fr),
|
||||
|
||||
(ty::ReFree(sub_fr), ty::ReFree(super_fr)) =>
|
||||
(&ty::ReFree(sub_fr), &ty::ReFree(super_fr)) =>
|
||||
self.sub_free_region(sub_fr, super_fr),
|
||||
|
||||
(ty::ReStatic, ty::ReFree(sup_fr)) =>
|
||||
(&ty::ReStatic, &ty::ReFree(sup_fr)) =>
|
||||
self.is_static(sup_fr),
|
||||
|
||||
_ =>
|
||||
|
@ -90,11 +90,11 @@ use std::rc::Rc;
|
||||
|
||||
#[derive(Clone, PartialEq)]
|
||||
pub enum Categorization<'tcx> {
|
||||
Rvalue(ty::Region), // temporary val, argument is its scope
|
||||
Rvalue(&'tcx ty::Region), // temporary val, argument is its scope
|
||||
StaticItem,
|
||||
Upvar(Upvar), // upvar referenced by closure env
|
||||
Local(ast::NodeId), // local variable
|
||||
Deref(cmt<'tcx>, usize, PointerKind), // deref of a ptr
|
||||
Deref(cmt<'tcx>, usize, PointerKind<'tcx>), // deref of a ptr
|
||||
Interior(cmt<'tcx>, InteriorKind), // something interior: field, tuple, etc
|
||||
Downcast(cmt<'tcx>, DefId), // selects a particular enum variant (*1)
|
||||
|
||||
@ -110,18 +110,18 @@ pub struct Upvar {
|
||||
|
||||
// different kinds of pointers:
|
||||
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
|
||||
pub enum PointerKind {
|
||||
pub enum PointerKind<'tcx> {
|
||||
/// `Box<T>`
|
||||
Unique,
|
||||
|
||||
/// `&T`
|
||||
BorrowedPtr(ty::BorrowKind, ty::Region),
|
||||
BorrowedPtr(ty::BorrowKind, &'tcx ty::Region),
|
||||
|
||||
/// `*T`
|
||||
UnsafePtr(hir::Mutability),
|
||||
|
||||
/// Implicit deref of the `&T` that results from an overloaded index `[]`.
|
||||
Implicit(ty::BorrowKind, ty::Region),
|
||||
Implicit(ty::BorrowKind, &'tcx ty::Region),
|
||||
}
|
||||
|
||||
// We use the term "interior" to mean "something reachable from the
|
||||
@ -198,8 +198,8 @@ pub type cmt<'tcx> = Rc<cmt_<'tcx>>;
|
||||
// We pun on *T to mean both actual deref of a ptr as well
|
||||
// as accessing of components:
|
||||
#[derive(Copy, Clone)]
|
||||
pub enum deref_kind {
|
||||
deref_ptr(PointerKind),
|
||||
pub enum deref_kind<'tcx> {
|
||||
deref_ptr(PointerKind<'tcx>),
|
||||
deref_interior(InteriorKind),
|
||||
}
|
||||
|
||||
@ -216,7 +216,7 @@ fn deref_kind(t: Ty, context: DerefKindContext) -> McResult<deref_kind> {
|
||||
|
||||
ty::TyRef(r, mt) => {
|
||||
let kind = ty::BorrowKind::from_mutbl(mt.mutbl);
|
||||
Ok(deref_ptr(BorrowedPtr(kind, *r)))
|
||||
Ok(deref_ptr(BorrowedPtr(kind, r)))
|
||||
}
|
||||
|
||||
ty::TyRawPtr(ref mt) => {
|
||||
@ -767,13 +767,13 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
|
||||
};
|
||||
|
||||
// Region of environment pointer
|
||||
let env_region = ty::ReFree(ty::FreeRegion {
|
||||
let env_region = self.tcx().mk_region(ty::ReFree(ty::FreeRegion {
|
||||
// The environment of a closure is guaranteed to
|
||||
// outlive any bindings introduced in the body of the
|
||||
// closure itself.
|
||||
scope: self.tcx().region_maps.item_extent(fn_body_id),
|
||||
bound_region: ty::BrEnv
|
||||
});
|
||||
}));
|
||||
|
||||
let env_ptr = BorrowedPtr(env_borrow_kind, env_region);
|
||||
|
||||
@ -817,11 +817,11 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
|
||||
|
||||
/// Returns the lifetime of a temporary created by expr with id `id`.
|
||||
/// This could be `'static` if `id` is part of a constant expression.
|
||||
pub fn temporary_scope(&self, id: ast::NodeId) -> ty::Region {
|
||||
match self.infcx.temporary_scope(id) {
|
||||
pub fn temporary_scope(&self, id: ast::NodeId) -> &'tcx ty::Region {
|
||||
self.tcx().mk_region(match self.infcx.temporary_scope(id) {
|
||||
Some(scope) => ty::ReScope(scope),
|
||||
None => ty::ReStatic
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
pub fn cat_rvalue_node(&self,
|
||||
@ -845,7 +845,7 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
|
||||
let re = if qualif.intersects(ConstQualif::NON_STATIC_BORROWS) {
|
||||
self.temporary_scope(id)
|
||||
} else {
|
||||
ty::ReStatic
|
||||
self.tcx().mk_region(ty::ReStatic)
|
||||
};
|
||||
let ret = self.cat_rvalue(id, span, re, expr_ty);
|
||||
debug!("cat_rvalue_node ret {:?}", ret);
|
||||
@ -855,7 +855,7 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
|
||||
pub fn cat_rvalue(&self,
|
||||
cmt_id: ast::NodeId,
|
||||
span: Span,
|
||||
temp_scope: ty::Region,
|
||||
temp_scope: &'tcx ty::Region,
|
||||
expr_ty: Ty<'tcx>) -> cmt<'tcx> {
|
||||
let ret = Rc::new(cmt_ {
|
||||
id:cmt_id,
|
||||
@ -1480,7 +1480,7 @@ pub fn ptr_sigil(ptr: PointerKind) -> &'static str {
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Debug for PointerKind {
|
||||
impl<'tcx> fmt::Debug for PointerKind<'tcx> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
match *self {
|
||||
Unique => write!(f, "Box"),
|
||||
|
@ -911,7 +911,7 @@ pub enum Rvalue<'tcx> {
|
||||
Repeat(Operand<'tcx>, TypedConstVal<'tcx>),
|
||||
|
||||
/// &x or &mut x
|
||||
Ref(Region, BorrowKind, Lvalue<'tcx>),
|
||||
Ref(&'tcx Region, BorrowKind, Lvalue<'tcx>),
|
||||
|
||||
/// length of a [X] or [X;n] value
|
||||
Len(Lvalue<'tcx>),
|
||||
|
@ -145,8 +145,7 @@ impl<'tcx> Rvalue<'tcx> {
|
||||
}
|
||||
&Rvalue::Ref(reg, bk, ref lv) => {
|
||||
let lv_ty = lv.ty(mir, tcx).to_ty(tcx);
|
||||
Some(tcx.mk_ref(
|
||||
tcx.mk_region(reg),
|
||||
Some(tcx.mk_ref(reg,
|
||||
ty::TypeAndMut {
|
||||
ty: lv_ty,
|
||||
mutbl: bk.to_mutbl_lossy()
|
||||
|
@ -724,7 +724,7 @@ make_mir_visitor!(Visitor,);
|
||||
make_mir_visitor!(MutVisitor,mut);
|
||||
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
pub enum LvalueContext {
|
||||
pub enum LvalueContext<'tcx> {
|
||||
// Appears as LHS of an assignment
|
||||
Store,
|
||||
|
||||
@ -738,7 +738,7 @@ pub enum LvalueContext {
|
||||
Inspect,
|
||||
|
||||
// Being borrowed
|
||||
Borrow { region: Region, kind: BorrowKind },
|
||||
Borrow { region: &'tcx Region, kind: BorrowKind },
|
||||
|
||||
// Being sliced -- this should be same as being borrowed, probably
|
||||
Slice { from_start: usize, from_end: usize },
|
||||
|
@ -93,7 +93,7 @@ pub struct FulfillmentContext<'tcx> {
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct RegionObligation<'tcx> {
|
||||
pub sub_region: ty::Region,
|
||||
pub sub_region: &'tcx ty::Region,
|
||||
pub sup_type: Ty<'tcx>,
|
||||
pub cause: ObligationCause<'tcx>,
|
||||
}
|
||||
@ -246,7 +246,7 @@ impl<'a, 'gcx, 'tcx> FulfillmentContext<'tcx> {
|
||||
|
||||
pub fn register_region_obligation(&mut self,
|
||||
t_a: Ty<'tcx>,
|
||||
r_b: ty::Region,
|
||||
r_b: &'tcx ty::Region,
|
||||
cause: ObligationCause<'tcx>)
|
||||
{
|
||||
register_region_obligation(t_a, r_b, cause, &mut self.region_obligations);
|
||||
@ -580,7 +580,8 @@ fn process_predicate<'a, 'gcx, 'tcx>(
|
||||
// Otherwise, we have something of the form
|
||||
// `for<'a> T: 'a where 'a not in T`, which we can treat as `T: 'static`.
|
||||
Some(t_a) => {
|
||||
register_region_obligation(t_a, ty::ReStatic,
|
||||
let r_static = selcx.tcx().mk_region(ty::ReStatic);
|
||||
register_region_obligation(t_a, r_static,
|
||||
obligation.cause.clone(),
|
||||
region_obligations);
|
||||
Ok(Some(vec![]))
|
||||
@ -690,7 +691,7 @@ fn coinductive_obligation<'a,'gcx,'tcx>(selcx: &SelectionContext<'a,'gcx,'tcx>,
|
||||
}
|
||||
|
||||
fn register_region_obligation<'tcx>(t_a: Ty<'tcx>,
|
||||
r_b: ty::Region,
|
||||
r_b: &'tcx ty::Region,
|
||||
cause: ObligationCause<'tcx>,
|
||||
region_obligations: &mut NodeMap<Vec<RegionObligation<'tcx>>>)
|
||||
{
|
||||
|
@ -1247,7 +1247,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> {
|
||||
obligation: &TraitObligation<'tcx>,
|
||||
trait_bound: ty::PolyTraitRef<'tcx>,
|
||||
skol_trait_ref: ty::TraitRef<'tcx>,
|
||||
skol_map: &infer::SkolemizationMap,
|
||||
skol_map: &infer::SkolemizationMap<'tcx>,
|
||||
snapshot: &infer::CombinedSnapshot)
|
||||
-> bool
|
||||
{
|
||||
@ -2264,7 +2264,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> {
|
||||
mut substs: Normalized<'tcx, &'tcx Substs<'tcx>>,
|
||||
cause: ObligationCause<'tcx>,
|
||||
recursion_depth: usize,
|
||||
skol_map: infer::SkolemizationMap,
|
||||
skol_map: infer::SkolemizationMap<'tcx>,
|
||||
snapshot: &infer::CombinedSnapshot)
|
||||
-> VtableImplData<'tcx, PredicateObligation<'tcx>>
|
||||
{
|
||||
@ -2662,7 +2662,8 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> {
|
||||
impl_def_id: DefId,
|
||||
obligation: &TraitObligation<'tcx>,
|
||||
snapshot: &infer::CombinedSnapshot)
|
||||
-> (Normalized<'tcx, &'tcx Substs<'tcx>>, infer::SkolemizationMap)
|
||||
-> (Normalized<'tcx, &'tcx Substs<'tcx>>,
|
||||
infer::SkolemizationMap<'tcx>)
|
||||
{
|
||||
match self.match_impl(impl_def_id, obligation, snapshot) {
|
||||
Ok((substs, skol_map)) => (substs, skol_map),
|
||||
@ -2679,7 +2680,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> {
|
||||
obligation: &TraitObligation<'tcx>,
|
||||
snapshot: &infer::CombinedSnapshot)
|
||||
-> Result<(Normalized<'tcx, &'tcx Substs<'tcx>>,
|
||||
infer::SkolemizationMap), ()>
|
||||
infer::SkolemizationMap<'tcx>), ()>
|
||||
{
|
||||
let impl_trait_ref = self.tcx().impl_trait_ref(impl_def_id).unwrap();
|
||||
|
||||
@ -2872,7 +2873,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> {
|
||||
recursion_depth: usize,
|
||||
def_id: DefId, // of impl or trait
|
||||
substs: &Substs<'tcx>, // for impl or trait
|
||||
skol_map: infer::SkolemizationMap,
|
||||
skol_map: infer::SkolemizationMap<'tcx>,
|
||||
snapshot: &infer::CombinedSnapshot)
|
||||
-> Vec<PredicateObligation<'tcx>>
|
||||
{
|
||||
|
@ -52,7 +52,8 @@ impl<'a, 'gcx, 'tcx> TypeRelation<'a, 'gcx, 'tcx> for Match<'a, 'gcx, 'tcx> {
|
||||
self.relate(a, b)
|
||||
}
|
||||
|
||||
fn regions(&mut self, a: ty::Region, b: ty::Region) -> RelateResult<'tcx, ty::Region> {
|
||||
fn regions(&mut self, a: &'tcx ty::Region, b: &'tcx ty::Region)
|
||||
-> RelateResult<'tcx, &'tcx ty::Region> {
|
||||
debug!("{}.regions({:?}, {:?})",
|
||||
self.tag(),
|
||||
a,
|
||||
|
@ -213,7 +213,7 @@ pub struct Tables<'tcx> {
|
||||
pub method_map: ty::MethodMap<'tcx>,
|
||||
|
||||
/// Borrows
|
||||
pub upvar_capture_map: ty::UpvarCaptureMap,
|
||||
pub upvar_capture_map: ty::UpvarCaptureMap<'tcx>,
|
||||
|
||||
/// Records the type of each closure. The def ID is the ID of the
|
||||
/// expression defining the closure.
|
||||
@ -1157,7 +1157,12 @@ impl_interners!('tcx,
|
||||
bare_fn: mk_bare_fn(BareFnTy<'tcx>, |fty: &BareFnTy| {
|
||||
keep_local(&fty.sig)
|
||||
}) -> BareFnTy<'tcx>,
|
||||
region: mk_region(Region, keep_local) -> Region
|
||||
region: mk_region(Region, |r| {
|
||||
match r {
|
||||
&ty::ReVar(_) | &ty::ReSkolemized(..) => true,
|
||||
_ => false
|
||||
}
|
||||
}) -> Region
|
||||
);
|
||||
|
||||
impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
|
@ -41,11 +41,11 @@ pub enum TypeError<'tcx> {
|
||||
FixedArraySize(ExpectedFound<usize>),
|
||||
TyParamSize(ExpectedFound<usize>),
|
||||
ArgCount,
|
||||
RegionsDoesNotOutlive(Region, Region),
|
||||
RegionsNotSame(Region, Region),
|
||||
RegionsNoOverlap(Region, Region),
|
||||
RegionsInsufficientlyPolymorphic(BoundRegion, Region),
|
||||
RegionsOverlyPolymorphic(BoundRegion, Region),
|
||||
RegionsDoesNotOutlive(&'tcx Region, &'tcx Region),
|
||||
RegionsNotSame(&'tcx Region, &'tcx Region),
|
||||
RegionsNoOverlap(&'tcx Region, &'tcx Region),
|
||||
RegionsInsufficientlyPolymorphic(BoundRegion, &'tcx Region),
|
||||
RegionsOverlyPolymorphic(BoundRegion, &'tcx Region),
|
||||
Sorts(ExpectedFound<Ty<'tcx>>),
|
||||
IntegerAsChar,
|
||||
IntMismatch(ExpectedFound<ty::IntVarValue>),
|
||||
@ -296,7 +296,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
self.note_and_explain_region(db, "concrete lifetime that was found is ",
|
||||
conc_region, "");
|
||||
}
|
||||
RegionsOverlyPolymorphic(_, ty::ReVar(_)) => {
|
||||
RegionsOverlyPolymorphic(_, &ty::ReVar(_)) => {
|
||||
// don't bother to print out the message below for
|
||||
// inference variables, it's not very illuminating.
|
||||
}
|
||||
|
@ -137,7 +137,7 @@ impl FlagComputation {
|
||||
}
|
||||
|
||||
&ty::TyRef(r, ref m) => {
|
||||
self.add_region(*r);
|
||||
self.add_region(r);
|
||||
self.add_ty(m.ty);
|
||||
}
|
||||
|
||||
@ -176,8 +176,8 @@ impl FlagComputation {
|
||||
self.add_bound_computation(&computation);
|
||||
}
|
||||
|
||||
fn add_region(&mut self, r: ty::Region) {
|
||||
match r {
|
||||
fn add_region(&mut self, r: &ty::Region) {
|
||||
match *r {
|
||||
ty::ReVar(..) => {
|
||||
self.add_flags(TypeFlags::HAS_RE_INFER);
|
||||
self.add_flags(TypeFlags::KEEP_IN_LOCAL_TCX);
|
||||
|
@ -169,7 +169,7 @@ pub trait TypeFolder<'gcx: 'tcx, 'tcx> : Sized {
|
||||
fty.super_fold_with(self)
|
||||
}
|
||||
|
||||
fn fold_region(&mut self, r: ty::Region) -> ty::Region {
|
||||
fn fold_region(&mut self, r: &'tcx ty::Region) -> &'tcx ty::Region {
|
||||
r.super_fold_with(self)
|
||||
}
|
||||
|
||||
@ -188,7 +188,7 @@ pub trait TypeVisitor<'tcx> : Sized {
|
||||
t.super_visit_with(self)
|
||||
}
|
||||
|
||||
fn visit_region(&mut self, r: ty::Region) -> bool {
|
||||
fn visit_region(&mut self, r: &'tcx ty::Region) -> bool {
|
||||
r.super_visit_with(self)
|
||||
}
|
||||
}
|
||||
@ -222,13 +222,15 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
/// whether any late-bound regions were skipped
|
||||
pub fn collect_regions<T>(self,
|
||||
value: &T,
|
||||
region_set: &mut FnvHashSet<ty::Region>)
|
||||
region_set: &mut FnvHashSet<&'tcx ty::Region>)
|
||||
-> bool
|
||||
where T : TypeFoldable<'tcx>
|
||||
{
|
||||
let mut have_bound_regions = false;
|
||||
self.fold_regions(value, &mut have_bound_regions,
|
||||
|r, d| { region_set.insert(r.from_depth(d)); r });
|
||||
self.fold_regions(value, &mut have_bound_regions, |r, d| {
|
||||
region_set.insert(self.mk_region(r.from_depth(d)));
|
||||
r
|
||||
});
|
||||
have_bound_regions
|
||||
}
|
||||
|
||||
@ -240,7 +242,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
skipped_regions: &mut bool,
|
||||
mut f: F)
|
||||
-> T
|
||||
where F : FnMut(ty::Region, u32) -> ty::Region,
|
||||
where F : FnMut(&'tcx ty::Region, u32) -> &'tcx ty::Region,
|
||||
T : TypeFoldable<'tcx>,
|
||||
{
|
||||
value.fold_with(&mut RegionFolder::new(self, skipped_regions, &mut f))
|
||||
@ -260,14 +262,14 @@ pub struct RegionFolder<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
|
||||
tcx: TyCtxt<'a, 'gcx, 'tcx>,
|
||||
skipped_regions: &'a mut bool,
|
||||
current_depth: u32,
|
||||
fld_r: &'a mut (FnMut(ty::Region, u32) -> ty::Region + 'a),
|
||||
fld_r: &'a mut (FnMut(&'tcx ty::Region, u32) -> &'tcx ty::Region + 'a),
|
||||
}
|
||||
|
||||
impl<'a, 'gcx, 'tcx> RegionFolder<'a, 'gcx, 'tcx> {
|
||||
pub fn new<F>(tcx: TyCtxt<'a, 'gcx, 'tcx>,
|
||||
skipped_regions: &'a mut bool,
|
||||
fld_r: &'a mut F) -> RegionFolder<'a, 'gcx, 'tcx>
|
||||
where F : FnMut(ty::Region, u32) -> ty::Region
|
||||
where F : FnMut(&'tcx ty::Region, u32) -> &'tcx ty::Region
|
||||
{
|
||||
RegionFolder {
|
||||
tcx: tcx,
|
||||
@ -288,8 +290,8 @@ impl<'a, 'gcx, 'tcx> TypeFolder<'gcx, 'tcx> for RegionFolder<'a, 'gcx, 'tcx> {
|
||||
t
|
||||
}
|
||||
|
||||
fn fold_region(&mut self, r: ty::Region) -> ty::Region {
|
||||
match r {
|
||||
fn fold_region(&mut self, r: &'tcx ty::Region) -> &'tcx ty::Region {
|
||||
match *r {
|
||||
ty::ReLateBound(debruijn, _) if debruijn.depth < self.current_depth => {
|
||||
debug!("RegionFolder.fold_region({:?}) skipped bound region (current depth={})",
|
||||
r, self.current_depth);
|
||||
@ -313,16 +315,16 @@ impl<'a, 'gcx, 'tcx> TypeFolder<'gcx, 'tcx> for RegionFolder<'a, 'gcx, 'tcx> {
|
||||
struct RegionReplacer<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
|
||||
tcx: TyCtxt<'a, 'gcx, 'tcx>,
|
||||
current_depth: u32,
|
||||
fld_r: &'a mut (FnMut(ty::BoundRegion) -> ty::Region + 'a),
|
||||
map: FnvHashMap<ty::BoundRegion, ty::Region>
|
||||
fld_r: &'a mut (FnMut(ty::BoundRegion) -> &'tcx ty::Region + 'a),
|
||||
map: FnvHashMap<ty::BoundRegion, &'tcx ty::Region>
|
||||
}
|
||||
|
||||
impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
pub fn replace_late_bound_regions<T,F>(self,
|
||||
value: &Binder<T>,
|
||||
mut f: F)
|
||||
-> (T, FnvHashMap<ty::BoundRegion, ty::Region>)
|
||||
where F : FnMut(ty::BoundRegion) -> ty::Region,
|
||||
-> (T, FnvHashMap<ty::BoundRegion, &'tcx ty::Region>)
|
||||
where F : FnMut(ty::BoundRegion) -> &'tcx ty::Region,
|
||||
T : TypeFoldable<'tcx>,
|
||||
{
|
||||
let mut replacer = RegionReplacer::new(self, &mut f);
|
||||
@ -340,7 +342,10 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
where T : TypeFoldable<'tcx>
|
||||
{
|
||||
self.replace_late_bound_regions(value, |br| {
|
||||
ty::ReFree(ty::FreeRegion{scope: all_outlive_scope, bound_region: br})
|
||||
self.mk_region(ty::ReFree(ty::FreeRegion {
|
||||
scope: all_outlive_scope,
|
||||
bound_region: br
|
||||
}))
|
||||
}).0
|
||||
}
|
||||
|
||||
@ -353,11 +358,11 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
let bound0_value = bound2_value.skip_binder().skip_binder();
|
||||
let value = self.fold_regions(bound0_value, &mut false,
|
||||
|region, current_depth| {
|
||||
match region {
|
||||
match *region {
|
||||
ty::ReLateBound(debruijn, br) if debruijn.depth >= current_depth => {
|
||||
// should be true if no escaping regions from bound2_value
|
||||
assert!(debruijn.depth - current_depth <= 1);
|
||||
ty::ReLateBound(ty::DebruijnIndex::new(current_depth), br)
|
||||
self.mk_region(ty::ReLateBound(ty::DebruijnIndex::new(current_depth), br))
|
||||
}
|
||||
_ => {
|
||||
region
|
||||
@ -411,7 +416,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
pub fn erase_late_bound_regions<T>(self, value: &Binder<T>) -> T
|
||||
where T : TypeFoldable<'tcx>
|
||||
{
|
||||
self.replace_late_bound_regions(value, |_| ty::ReErased).0
|
||||
self.replace_late_bound_regions(value, |_| self.mk_region(ty::ReErased)).0
|
||||
}
|
||||
|
||||
/// Rewrite any late-bound regions so that they are anonymous. Region numbers are
|
||||
@ -428,7 +433,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
let mut counter = 0;
|
||||
Binder(self.replace_late_bound_regions(sig, |_| {
|
||||
counter += 1;
|
||||
ty::ReLateBound(ty::DebruijnIndex::new(1), ty::BrAnon(counter))
|
||||
self.mk_region(ty::ReLateBound(ty::DebruijnIndex::new(1), ty::BrAnon(counter)))
|
||||
}).0)
|
||||
}
|
||||
}
|
||||
@ -436,7 +441,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
impl<'a, 'gcx, 'tcx> RegionReplacer<'a, 'gcx, 'tcx> {
|
||||
fn new<F>(tcx: TyCtxt<'a, 'gcx, 'tcx>, fld_r: &'a mut F)
|
||||
-> RegionReplacer<'a, 'gcx, 'tcx>
|
||||
where F : FnMut(ty::BoundRegion) -> ty::Region
|
||||
where F : FnMut(ty::BoundRegion) -> &'tcx ty::Region
|
||||
{
|
||||
RegionReplacer {
|
||||
tcx: tcx,
|
||||
@ -465,22 +470,22 @@ impl<'a, 'gcx, 'tcx> TypeFolder<'gcx, 'tcx> for RegionReplacer<'a, 'gcx, 'tcx> {
|
||||
t.super_fold_with(self)
|
||||
}
|
||||
|
||||
fn fold_region(&mut self, r: ty::Region) -> ty::Region {
|
||||
match r {
|
||||
fn fold_region(&mut self, r:&'tcx ty::Region) -> &'tcx ty::Region {
|
||||
match *r {
|
||||
ty::ReLateBound(debruijn, br) if debruijn.depth == self.current_depth => {
|
||||
let fld_r = &mut self.fld_r;
|
||||
let region = *self.map.entry(br).or_insert_with(|| fld_r(br));
|
||||
if let ty::ReLateBound(debruijn1, br) = region {
|
||||
if let ty::ReLateBound(debruijn1, br) = *region {
|
||||
// If the callback returns a late-bound region,
|
||||
// that region should always use depth 1. Then we
|
||||
// adjust it to the correct depth.
|
||||
assert_eq!(debruijn1.depth, 1);
|
||||
ty::ReLateBound(debruijn, br)
|
||||
self.tcx.mk_region(ty::ReLateBound(debruijn, br))
|
||||
} else {
|
||||
region
|
||||
}
|
||||
}
|
||||
r => r
|
||||
_ => r
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -528,7 +533,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
u.super_fold_with(self)
|
||||
}
|
||||
|
||||
fn fold_region(&mut self, r: ty::Region) -> ty::Region {
|
||||
fn fold_region(&mut self, r: &'tcx ty::Region) -> &'tcx ty::Region {
|
||||
// because late-bound regions affect subtyping, we can't
|
||||
// erase the bound/free distinction, but we can replace
|
||||
// all free regions with 'erased.
|
||||
@ -537,9 +542,9 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
// type system never "sees" those, they get substituted
|
||||
// away. In trans, they will always be erased to 'erased
|
||||
// whenever a substitution occurs.
|
||||
match r {
|
||||
match *r {
|
||||
ty::ReLateBound(..) => r,
|
||||
_ => ty::ReErased
|
||||
_ => self.tcx().mk_region(ty::ReErased)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -574,7 +579,7 @@ pub fn shift_regions<'a, 'gcx, 'tcx, T>(tcx: TyCtxt<'a, 'gcx, 'tcx>,
|
||||
value, amount);
|
||||
|
||||
value.fold_with(&mut RegionFolder::new(tcx, &mut false, &mut |region, _current_depth| {
|
||||
shift_region(region, amount)
|
||||
tcx.mk_region(shift_region(*region, amount))
|
||||
}))
|
||||
}
|
||||
|
||||
@ -616,7 +621,7 @@ impl<'tcx> TypeVisitor<'tcx> for HasEscapingRegionsVisitor {
|
||||
t.region_depth > self.depth
|
||||
}
|
||||
|
||||
fn visit_region(&mut self, r: ty::Region) -> bool {
|
||||
fn visit_region(&mut self, r: &'tcx ty::Region) -> bool {
|
||||
r.escapes_depth(self.depth)
|
||||
}
|
||||
}
|
||||
@ -630,17 +635,18 @@ impl<'tcx> TypeVisitor<'tcx> for HasTypeFlagsVisitor {
|
||||
t.flags.get().intersects(self.flags)
|
||||
}
|
||||
|
||||
fn visit_region(&mut self, r: ty::Region) -> bool {
|
||||
fn visit_region(&mut self, r: &'tcx ty::Region) -> bool {
|
||||
if self.flags.intersects(ty::TypeFlags::HAS_LOCAL_NAMES) {
|
||||
// does this represent a region that cannot be named
|
||||
// in a global way? used in fulfillment caching.
|
||||
match r {
|
||||
match *r {
|
||||
ty::ReStatic | ty::ReEmpty | ty::ReErased => {}
|
||||
_ => return true,
|
||||
}
|
||||
}
|
||||
if self.flags.intersects(ty::TypeFlags::HAS_RE_INFER) {
|
||||
match r {
|
||||
if self.flags.intersects(ty::TypeFlags::HAS_RE_INFER |
|
||||
ty::TypeFlags::KEEP_IN_LOCAL_TCX) {
|
||||
match *r {
|
||||
ty::ReVar(_) | ty::ReSkolemized(..) => { return true }
|
||||
_ => {}
|
||||
}
|
||||
@ -688,8 +694,8 @@ impl<'tcx> TypeVisitor<'tcx> for LateBoundRegionsCollector {
|
||||
t.super_visit_with(self)
|
||||
}
|
||||
|
||||
fn visit_region(&mut self, r: ty::Region) -> bool {
|
||||
match r {
|
||||
fn visit_region(&mut self, r: &'tcx ty::Region) -> bool {
|
||||
match *r {
|
||||
ty::ReLateBound(debruijn, br) if debruijn.depth == self.current_depth => {
|
||||
self.regions.insert(br);
|
||||
}
|
||||
|
@ -343,7 +343,7 @@ pub struct Method<'tcx> {
|
||||
pub generics: &'tcx Generics<'tcx>,
|
||||
pub predicates: GenericPredicates<'tcx>,
|
||||
pub fty: &'tcx BareFnTy<'tcx>,
|
||||
pub explicit_self: ExplicitSelfCategory,
|
||||
pub explicit_self: ExplicitSelfCategory<'tcx>,
|
||||
pub vis: Visibility,
|
||||
pub defaultness: hir::Defaultness,
|
||||
pub def_id: DefId,
|
||||
@ -355,7 +355,7 @@ impl<'tcx> Method<'tcx> {
|
||||
generics: &'tcx ty::Generics<'tcx>,
|
||||
predicates: GenericPredicates<'tcx>,
|
||||
fty: &'tcx BareFnTy<'tcx>,
|
||||
explicit_self: ExplicitSelfCategory,
|
||||
explicit_self: ExplicitSelfCategory<'tcx>,
|
||||
vis: Visibility,
|
||||
defaultness: hir::Defaultness,
|
||||
def_id: DefId,
|
||||
@ -658,28 +658,28 @@ pub enum BorrowKind {
|
||||
/// Information describing the capture of an upvar. This is computed
|
||||
/// during `typeck`, specifically by `regionck`.
|
||||
#[derive(PartialEq, Clone, Debug, Copy)]
|
||||
pub enum UpvarCapture {
|
||||
pub enum UpvarCapture<'tcx> {
|
||||
/// Upvar is captured by value. This is always true when the
|
||||
/// closure is labeled `move`, but can also be true in other cases
|
||||
/// depending on inference.
|
||||
ByValue,
|
||||
|
||||
/// Upvar is captured by reference.
|
||||
ByRef(UpvarBorrow),
|
||||
ByRef(UpvarBorrow<'tcx>),
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Clone, Copy)]
|
||||
pub struct UpvarBorrow {
|
||||
pub struct UpvarBorrow<'tcx> {
|
||||
/// The kind of borrow: by-ref upvars have access to shared
|
||||
/// immutable borrows, which are not part of the normal language
|
||||
/// syntax.
|
||||
pub kind: BorrowKind,
|
||||
|
||||
/// Region of the resulting reference.
|
||||
pub region: ty::Region,
|
||||
pub region: &'tcx ty::Region,
|
||||
}
|
||||
|
||||
pub type UpvarCaptureMap = FnvHashMap<UpvarId, UpvarCapture>;
|
||||
pub type UpvarCaptureMap<'tcx> = FnvHashMap<UpvarId, UpvarCapture<'tcx>>;
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct ClosureUpvar<'tcx> {
|
||||
@ -700,7 +700,7 @@ pub enum IntVarValue {
|
||||
/// this is `None`, then the default is inherited from the
|
||||
/// surrounding context. See RFC #599 for details.
|
||||
#[derive(Copy, Clone)]
|
||||
pub enum ObjectLifetimeDefault {
|
||||
pub enum ObjectLifetimeDefault<'tcx> {
|
||||
/// Require an explicit annotation. Occurs when multiple
|
||||
/// `T:'a` constraints are found.
|
||||
Ambiguous,
|
||||
@ -709,7 +709,7 @@ pub enum ObjectLifetimeDefault {
|
||||
BaseDefault,
|
||||
|
||||
/// Use the given region as the default.
|
||||
Specific(Region),
|
||||
Specific(&'tcx Region),
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
@ -719,18 +719,18 @@ pub struct TypeParameterDef<'tcx> {
|
||||
pub index: u32,
|
||||
pub default_def_id: DefId, // for use in error reporing about defaults
|
||||
pub default: Option<Ty<'tcx>>,
|
||||
pub object_lifetime_default: ObjectLifetimeDefault,
|
||||
pub object_lifetime_default: ObjectLifetimeDefault<'tcx>,
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct RegionParameterDef {
|
||||
pub struct RegionParameterDef<'tcx> {
|
||||
pub name: Name,
|
||||
pub def_id: DefId,
|
||||
pub index: u32,
|
||||
pub bounds: Vec<ty::Region>,
|
||||
pub bounds: Vec<&'tcx ty::Region>,
|
||||
}
|
||||
|
||||
impl RegionParameterDef {
|
||||
impl<'tcx> RegionParameterDef<'tcx> {
|
||||
pub fn to_early_bound_region(&self) -> ty::Region {
|
||||
ty::ReEarlyBound(ty::EarlyBoundRegion {
|
||||
index: self.index,
|
||||
@ -750,7 +750,7 @@ pub struct Generics<'tcx> {
|
||||
pub parent: Option<DefId>,
|
||||
pub parent_regions: u32,
|
||||
pub parent_types: u32,
|
||||
pub regions: Vec<RegionParameterDef>,
|
||||
pub regions: Vec<RegionParameterDef<'tcx>>,
|
||||
pub types: Vec<TypeParameterDef<'tcx>>,
|
||||
pub has_self: bool,
|
||||
}
|
||||
@ -812,7 +812,7 @@ pub enum Predicate<'tcx> {
|
||||
Equate(PolyEquatePredicate<'tcx>),
|
||||
|
||||
/// where 'a : 'b
|
||||
RegionOutlives(PolyRegionOutlivesPredicate),
|
||||
RegionOutlives(PolyRegionOutlivesPredicate<'tcx>),
|
||||
|
||||
/// where T : 'a
|
||||
TypeOutlives(PolyTypeOutlivesPredicate<'tcx>),
|
||||
@ -991,8 +991,9 @@ pub type PolyEquatePredicate<'tcx> = ty::Binder<EquatePredicate<'tcx>>;
|
||||
#[derive(Clone, PartialEq, Eq, Hash, Debug)]
|
||||
pub struct OutlivesPredicate<A,B>(pub A, pub B); // `A : B`
|
||||
pub type PolyOutlivesPredicate<A,B> = ty::Binder<OutlivesPredicate<A,B>>;
|
||||
pub type PolyRegionOutlivesPredicate = PolyOutlivesPredicate<ty::Region, ty::Region>;
|
||||
pub type PolyTypeOutlivesPredicate<'tcx> = PolyOutlivesPredicate<Ty<'tcx>, ty::Region>;
|
||||
pub type PolyRegionOutlivesPredicate<'tcx> = PolyOutlivesPredicate<&'tcx ty::Region,
|
||||
&'tcx ty::Region>;
|
||||
pub type PolyTypeOutlivesPredicate<'tcx> = PolyOutlivesPredicate<Ty<'tcx>, &'tcx ty::Region>;
|
||||
|
||||
/// This kind of predicate has no *direct* correspondent in the
|
||||
/// syntax, but it roughly corresponds to the syntactic forms:
|
||||
@ -1081,7 +1082,7 @@ impl<'tcx> ToPredicate<'tcx> for PolyEquatePredicate<'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> ToPredicate<'tcx> for PolyRegionOutlivesPredicate {
|
||||
impl<'tcx> ToPredicate<'tcx> for PolyRegionOutlivesPredicate<'tcx> {
|
||||
fn to_predicate(&self) -> Predicate<'tcx> {
|
||||
Predicate::RegionOutlives(self.clone())
|
||||
}
|
||||
@ -1237,7 +1238,7 @@ pub struct ParameterEnvironment<'tcx> {
|
||||
/// indicates it must outlive at least the function body (the user
|
||||
/// may specify stronger requirements). This field indicates the
|
||||
/// region of the callee.
|
||||
pub implicit_region_bound: ty::Region,
|
||||
pub implicit_region_bound: &'tcx ty::Region,
|
||||
|
||||
/// Obligations that the caller must satisfy. This is basically
|
||||
/// the set of bounds on the in-scope type parameters, translated
|
||||
@ -2825,7 +2826,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
ty::ParameterEnvironment {
|
||||
free_substs: Substs::empty(self),
|
||||
caller_bounds: Vec::new(),
|
||||
implicit_region_bound: ty::ReEmpty,
|
||||
implicit_region_bound: self.mk_region(ty::ReEmpty),
|
||||
free_id_outlive: free_id_outlive
|
||||
}
|
||||
}
|
||||
@ -2841,8 +2842,10 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
|
||||
let substs = Substs::for_item(self.global_tcx(), def_id, |def, _| {
|
||||
// map bound 'a => free 'a
|
||||
ReFree(FreeRegion { scope: free_id_outlive,
|
||||
bound_region: def.to_bound_region() })
|
||||
self.global_tcx().mk_region(ReFree(FreeRegion {
|
||||
scope: free_id_outlive,
|
||||
bound_region: def.to_bound_region()
|
||||
}))
|
||||
}, |def, _| {
|
||||
// map T => T
|
||||
self.global_tcx().mk_param_from_def(def)
|
||||
@ -2892,7 +2895,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
|
||||
let unnormalized_env = ty::ParameterEnvironment {
|
||||
free_substs: free_substs,
|
||||
implicit_region_bound: ty::ReScope(free_id_outlive),
|
||||
implicit_region_bound: tcx.mk_region(ty::ReScope(free_id_outlive)),
|
||||
caller_bounds: predicates,
|
||||
free_id_outlive: free_id_outlive,
|
||||
};
|
||||
@ -2901,6 +2904,10 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
traits::normalize_param_env_or_error(tcx, unnormalized_env, cause)
|
||||
}
|
||||
|
||||
pub fn node_scope_region(self, id: NodeId) -> &'tcx Region {
|
||||
self.mk_region(ty::ReScope(self.region_maps.node_extent(id)))
|
||||
}
|
||||
|
||||
pub fn is_method_call(self, expr_id: NodeId) -> bool {
|
||||
self.tables.borrow().method_map.contains_key(&MethodCall::expr(expr_id))
|
||||
}
|
||||
@ -2910,7 +2917,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
autoderefs))
|
||||
}
|
||||
|
||||
pub fn upvar_capture(self, upvar_id: ty::UpvarId) -> Option<ty::UpvarCapture> {
|
||||
pub fn upvar_capture(self, upvar_id: ty::UpvarId) -> Option<ty::UpvarCapture<'tcx>> {
|
||||
Some(self.tables.borrow().upvar_capture_map.get(&upvar_id).unwrap().clone())
|
||||
}
|
||||
|
||||
@ -2936,10 +2943,10 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
|
||||
/// The category of explicit self.
|
||||
#[derive(Clone, Copy, Eq, PartialEq, Debug)]
|
||||
pub enum ExplicitSelfCategory {
|
||||
pub enum ExplicitSelfCategory<'tcx> {
|
||||
Static,
|
||||
ByValue,
|
||||
ByReference(Region, hir::Mutability),
|
||||
ByReference(&'tcx Region, hir::Mutability),
|
||||
ByBox,
|
||||
}
|
||||
|
||||
|
@ -17,7 +17,7 @@ use ty::{self, Ty, TypeFoldable};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum Component<'tcx> {
|
||||
Region(ty::Region),
|
||||
Region(&'tcx ty::Region),
|
||||
Param(ty::ParamTy),
|
||||
UnresolvedInferenceVariable(ty::InferTy),
|
||||
|
||||
@ -210,7 +210,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
fn push_region_constraints<'tcx>(out: &mut Vec<Component<'tcx>>, regions: Vec<ty::Region>) {
|
||||
fn push_region_constraints<'tcx>(out: &mut Vec<Component<'tcx>>, regions: Vec<&'tcx ty::Region>) {
|
||||
for r in regions {
|
||||
if !r.is_bound() {
|
||||
out.push(Component::Region(r));
|
||||
|
@ -71,8 +71,8 @@ pub trait TypeRelation<'a, 'gcx: 'a+'tcx, 'tcx: 'a> : Sized {
|
||||
fn tys(&mut self, a: Ty<'tcx>, b: Ty<'tcx>)
|
||||
-> RelateResult<'tcx, Ty<'tcx>>;
|
||||
|
||||
fn regions(&mut self, a: ty::Region, b: ty::Region)
|
||||
-> RelateResult<'tcx, ty::Region>;
|
||||
fn regions(&mut self, a: &'tcx ty::Region, b: &'tcx ty::Region)
|
||||
-> RelateResult<'tcx, &'tcx ty::Region>;
|
||||
|
||||
fn binders<T>(&mut self, a: &ty::Binder<T>, b: &ty::Binder<T>)
|
||||
-> RelateResult<'tcx, ty::Binder<T>>
|
||||
@ -471,9 +471,9 @@ pub fn super_relate_tys<'a, 'gcx, 'tcx, R>(relation: &mut R,
|
||||
|
||||
(&ty::TyRef(a_r, ref a_mt), &ty::TyRef(b_r, ref b_mt)) =>
|
||||
{
|
||||
let r = relation.relate_with_variance(ty::Contravariant, a_r, b_r)?;
|
||||
let r = relation.relate_with_variance(ty::Contravariant, &a_r, &b_r)?;
|
||||
let mt = relation.relate(a_mt, b_mt)?;
|
||||
Ok(tcx.mk_ref(tcx.mk_region(r), mt))
|
||||
Ok(tcx.mk_ref(r, mt))
|
||||
}
|
||||
|
||||
(&ty::TyArray(a_t, sz_a), &ty::TyArray(b_t, sz_b)) =>
|
||||
@ -569,11 +569,11 @@ impl<'tcx> Relate<'tcx> for &'tcx Substs<'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Relate<'tcx> for ty::Region {
|
||||
impl<'tcx> Relate<'tcx> for &'tcx ty::Region {
|
||||
fn relate<'a, 'gcx, R>(relation: &mut R,
|
||||
a: &ty::Region,
|
||||
b: &ty::Region)
|
||||
-> RelateResult<'tcx, ty::Region>
|
||||
a: &&'tcx ty::Region,
|
||||
b: &&'tcx ty::Region)
|
||||
-> RelateResult<'tcx, &'tcx ty::Region>
|
||||
where R: TypeRelation<'a, 'gcx, 'tcx>, 'gcx: 'a+'tcx, 'tcx: 'a
|
||||
{
|
||||
relation.regions(*a, *b)
|
||||
|
@ -72,13 +72,6 @@ impl<'tcx, T: Lift<'tcx>> Lift<'tcx> for Vec<T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Lift<'tcx> for ty::Region {
|
||||
type Lifted = Self;
|
||||
fn lift_to_tcx(&self, _: TyCtxt) -> Option<ty::Region> {
|
||||
Some(*self)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'tcx> Lift<'tcx> for ty::TraitRef<'a> {
|
||||
type Lifted = ty::TraitRef<'tcx>;
|
||||
fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
|
||||
@ -315,13 +308,21 @@ impl<'a, 'tcx> Lift<'tcx> for ty::error::TypeError<'a> {
|
||||
FixedArraySize(x) => FixedArraySize(x),
|
||||
TyParamSize(x) => TyParamSize(x),
|
||||
ArgCount => ArgCount,
|
||||
RegionsDoesNotOutlive(a, b) => RegionsDoesNotOutlive(a, b),
|
||||
RegionsNotSame(a, b) => RegionsNotSame(a, b),
|
||||
RegionsNoOverlap(a, b) => RegionsNoOverlap(a, b),
|
||||
RegionsInsufficientlyPolymorphic(a, b) => {
|
||||
RegionsInsufficientlyPolymorphic(a, b)
|
||||
RegionsDoesNotOutlive(a, b) => {
|
||||
return tcx.lift(&(a, b)).map(|(a, b)| RegionsDoesNotOutlive(a, b))
|
||||
}
|
||||
RegionsNotSame(a, b) => {
|
||||
return tcx.lift(&(a, b)).map(|(a, b)| RegionsNotSame(a, b))
|
||||
}
|
||||
RegionsNoOverlap(a, b) => {
|
||||
return tcx.lift(&(a, b)).map(|(a, b)| RegionsNoOverlap(a, b))
|
||||
}
|
||||
RegionsInsufficientlyPolymorphic(a, b) => {
|
||||
return tcx.lift(&b).map(|b| RegionsInsufficientlyPolymorphic(a, b))
|
||||
}
|
||||
RegionsOverlyPolymorphic(a, b) => {
|
||||
return tcx.lift(&b).map(|b| RegionsOverlyPolymorphic(a, b))
|
||||
}
|
||||
RegionsOverlyPolymorphic(a, b) => RegionsOverlyPolymorphic(a, b),
|
||||
IntegerAsChar => IntegerAsChar,
|
||||
IntMismatch(x) => IntMismatch(x),
|
||||
FloatMismatch(x) => FloatMismatch(x),
|
||||
@ -654,7 +655,7 @@ impl<'tcx> TypeFoldable<'tcx> for ty::ImplHeader<'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> TypeFoldable<'tcx> for ty::Region {
|
||||
impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::Region {
|
||||
fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, _folder: &mut F) -> Self {
|
||||
*self
|
||||
}
|
||||
@ -672,25 +673,6 @@ impl<'tcx> TypeFoldable<'tcx> for ty::Region {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::Region {
|
||||
fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, _folder: &mut F) -> Self {
|
||||
*self
|
||||
}
|
||||
|
||||
fn fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
|
||||
let region = folder.fold_region(**self);
|
||||
folder.tcx().mk_region(region)
|
||||
}
|
||||
|
||||
fn super_visit_with<V: TypeVisitor<'tcx>>(&self, _visitor: &mut V) -> bool {
|
||||
false
|
||||
}
|
||||
|
||||
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
|
||||
visitor.visit_region(**self)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> TypeFoldable<'tcx> for ty::ClosureSubsts<'tcx> {
|
||||
fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
|
||||
ty::ClosureSubsts {
|
||||
@ -766,7 +748,7 @@ impl<'tcx> TypeFoldable<'tcx> for ty::TypeParameterDef<'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> TypeFoldable<'tcx> for ty::ObjectLifetimeDefault {
|
||||
impl<'tcx> TypeFoldable<'tcx> for ty::ObjectLifetimeDefault<'tcx> {
|
||||
fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
|
||||
match *self {
|
||||
ty::ObjectLifetimeDefault::Ambiguous =>
|
||||
@ -788,7 +770,7 @@ impl<'tcx> TypeFoldable<'tcx> for ty::ObjectLifetimeDefault {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> TypeFoldable<'tcx> for ty::RegionParameterDef {
|
||||
impl<'tcx> TypeFoldable<'tcx> for ty::RegionParameterDef<'tcx> {
|
||||
fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
|
||||
ty::RegionParameterDef {
|
||||
name: self.name,
|
||||
|
@ -294,7 +294,7 @@ impl<'tcx> Decodable for ClosureSubsts<'tcx> {
|
||||
#[derive(Clone, PartialEq, Eq, Hash)]
|
||||
pub struct TraitObject<'tcx> {
|
||||
pub principal: PolyExistentialTraitRef<'tcx>,
|
||||
pub region_bound: ty::Region,
|
||||
pub region_bound: &'tcx ty::Region,
|
||||
pub builtin_bounds: BuiltinBounds,
|
||||
pub projection_bounds: Vec<PolyExistentialProjection<'tcx>>,
|
||||
}
|
||||
@ -676,6 +676,15 @@ pub enum Region {
|
||||
ReErased,
|
||||
}
|
||||
|
||||
impl<'tcx> Decodable for &'tcx Region {
|
||||
fn decode<D: Decoder>(d: &mut D) -> Result<&'tcx Region, D::Error> {
|
||||
let r = Decodable::decode(d)?;
|
||||
cstore::tls::with_decoding_context(d, |dcx, _| {
|
||||
Ok(dcx.tcx().mk_region(r))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, PartialEq, Eq, Hash, RustcEncodable, RustcDecodable, Debug)]
|
||||
pub struct EarlyBoundRegion {
|
||||
pub index: u32,
|
||||
@ -1207,10 +1216,10 @@ impl<'a, 'gcx, 'tcx> TyS<'tcx> {
|
||||
/// Returns the regions directly referenced from this type (but
|
||||
/// not types reachable from this type via `walk_tys`). This
|
||||
/// ignores late-bound regions binders.
|
||||
pub fn regions(&self) -> Vec<ty::Region> {
|
||||
pub fn regions(&self) -> Vec<&'tcx ty::Region> {
|
||||
match self.sty {
|
||||
TyRef(region, _) => {
|
||||
vec![*region]
|
||||
vec![region]
|
||||
}
|
||||
TyTrait(ref obj) => {
|
||||
let mut v = vec![obj.region_bound];
|
||||
|
@ -62,7 +62,7 @@ impl<'a, 'gcx, 'tcx> Substs<'tcx> {
|
||||
mut mk_region: FR,
|
||||
mut mk_type: FT)
|
||||
-> &'tcx Substs<'tcx>
|
||||
where FR: FnMut(&ty::RegionParameterDef, &Substs<'tcx>) -> ty::Region,
|
||||
where FR: FnMut(&ty::RegionParameterDef, &Substs<'tcx>) -> &'tcx ty::Region,
|
||||
FT: FnMut(&ty::TypeParameterDef<'tcx>, &Substs<'tcx>) -> Ty<'tcx> {
|
||||
let defs = tcx.lookup_generics(def_id);
|
||||
let num_regions = defs.parent_regions as usize + defs.regions.len();
|
||||
@ -82,7 +82,7 @@ impl<'a, 'gcx, 'tcx> Substs<'tcx> {
|
||||
defs: &ty::Generics<'tcx>,
|
||||
mk_region: &mut FR,
|
||||
mk_type: &mut FT)
|
||||
where FR: FnMut(&ty::RegionParameterDef, &Substs<'tcx>) -> ty::Region,
|
||||
where FR: FnMut(&ty::RegionParameterDef, &Substs<'tcx>) -> &'tcx ty::Region,
|
||||
FT: FnMut(&ty::TypeParameterDef<'tcx>, &Substs<'tcx>) -> Ty<'tcx> {
|
||||
if let Some(def_id) = defs.parent {
|
||||
let parent_defs = tcx.lookup_generics(def_id);
|
||||
@ -122,7 +122,7 @@ impl<'a, 'gcx, 'tcx> Substs<'tcx> {
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn region_at(&self, i: usize) -> ty::Region {
|
||||
pub fn region_at(&self, i: usize) -> &'tcx ty::Region {
|
||||
self.regions[i]
|
||||
}
|
||||
|
||||
@ -132,7 +132,7 @@ impl<'a, 'gcx, 'tcx> Substs<'tcx> {
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn region_for_def(&self, def: &ty::RegionParameterDef) -> ty::Region {
|
||||
pub fn region_for_def(&self, def: &ty::RegionParameterDef) -> &'tcx ty::Region {
|
||||
self.region_at(def.index as usize)
|
||||
}
|
||||
|
||||
@ -255,13 +255,13 @@ impl<'a, 'gcx, 'tcx> TypeFolder<'gcx, 'tcx> for SubstFolder<'a, 'gcx, 'tcx> {
|
||||
t
|
||||
}
|
||||
|
||||
fn fold_region(&mut self, r: ty::Region) -> ty::Region {
|
||||
fn fold_region(&mut self, r: &'tcx ty::Region) -> &'tcx ty::Region {
|
||||
// Note: This routine only handles regions that are bound on
|
||||
// type declarations and other outer declarations, not those
|
||||
// bound in *fn types*. Region substitution of the bound
|
||||
// regions that appear in a function signature is done using
|
||||
// the specialized routine `ty::replace_late_regions()`.
|
||||
match r {
|
||||
match *r {
|
||||
ty::ReEarlyBound(data) => {
|
||||
match self.substs.regions.get(data.index as usize) {
|
||||
Some(&r) => {
|
||||
@ -394,8 +394,8 @@ impl<'a, 'gcx, 'tcx> SubstFolder<'a, 'gcx, 'tcx> {
|
||||
result
|
||||
}
|
||||
|
||||
fn shift_region_through_binders(&self, region: ty::Region) -> ty::Region {
|
||||
ty::fold::shift_region(region, self.region_binders_passed)
|
||||
fn shift_region_through_binders(&self, region: &'tcx ty::Region) -> &'tcx ty::Region {
|
||||
self.tcx().mk_region(ty::fold::shift_region(*region, self.region_binders_passed))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -306,7 +306,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||
pub fn required_region_bounds(self,
|
||||
erased_self_ty: Ty<'tcx>,
|
||||
predicates: Vec<ty::Predicate<'tcx>>)
|
||||
-> Vec<ty::Region> {
|
||||
-> Vec<&'tcx ty::Region> {
|
||||
debug!("required_region_bounds(erased_self_ty={:?}, predicates={:?})",
|
||||
erased_self_ty,
|
||||
predicates);
|
||||
@ -496,8 +496,8 @@ impl<'a, 'gcx, 'tcx> TypeVisitor<'tcx> for TypeIdHasher<'a, 'gcx, 'tcx> {
|
||||
ty.super_visit_with(self)
|
||||
}
|
||||
|
||||
fn visit_region(&mut self, r: ty::Region) -> bool {
|
||||
match r {
|
||||
fn visit_region(&mut self, r: &'tcx ty::Region) -> bool {
|
||||
match *r {
|
||||
ty::ReStatic | ty::ReErased => {
|
||||
self.hash::<u32>(0);
|
||||
}
|
||||
|
@ -115,9 +115,9 @@ pub fn predicate_obligations<'a, 'gcx, 'tcx>(infcx: &InferCtxt<'a, 'gcx, 'tcx>,
|
||||
/// For `&'a T` to be WF, `T: 'a` must hold. So we can assume `T: 'a`.
|
||||
#[derive(Debug)]
|
||||
pub enum ImpliedBound<'tcx> {
|
||||
RegionSubRegion(ty::Region, ty::Region),
|
||||
RegionSubParam(ty::Region, ty::ParamTy),
|
||||
RegionSubProjection(ty::Region, ty::ProjectionTy<'tcx>),
|
||||
RegionSubRegion(&'tcx ty::Region, &'tcx ty::Region),
|
||||
RegionSubParam(&'tcx ty::Region, ty::ParamTy),
|
||||
RegionSubProjection(&'tcx ty::Region, ty::ProjectionTy<'tcx>),
|
||||
}
|
||||
|
||||
/// Compute the implied bounds that a callee/impl can assume based on
|
||||
@ -196,7 +196,7 @@ pub fn implied_bounds<'a, 'gcx, 'tcx>(
|
||||
/// this down to determine what relationships would have to hold for
|
||||
/// `T: 'a` to hold. We get to assume that the caller has validated
|
||||
/// those relationships.
|
||||
fn implied_bounds_from_components<'tcx>(sub_region: ty::Region,
|
||||
fn implied_bounds_from_components<'tcx>(sub_region: &'tcx ty::Region,
|
||||
sup_components: Vec<Component<'tcx>>)
|
||||
-> Vec<ImpliedBound<'tcx>>
|
||||
{
|
||||
@ -363,7 +363,7 @@ impl<'a, 'gcx, 'tcx> WfPredicates<'a, 'gcx, 'tcx> {
|
||||
cause,
|
||||
ty::Predicate::TypeOutlives(
|
||||
ty::Binder(
|
||||
ty::OutlivesPredicate(mt.ty, *r)))));
|
||||
ty::OutlivesPredicate(mt.ty, r)))));
|
||||
}
|
||||
}
|
||||
|
||||
@ -534,7 +534,7 @@ pub fn object_region_bounds<'a, 'gcx, 'tcx>(
|
||||
tcx: TyCtxt<'a, 'gcx, 'tcx>,
|
||||
principal: ty::PolyExistentialTraitRef<'tcx>,
|
||||
others: ty::BuiltinBounds)
|
||||
-> Vec<ty::Region>
|
||||
-> Vec<&'tcx ty::Region>
|
||||
{
|
||||
// Since we don't actually *know* the self type for an object,
|
||||
// this "open(err)" serves as a kind of dummy standin -- basically
|
||||
|
@ -247,7 +247,7 @@ fn in_binder<'a, 'gcx, 'tcx, T, U>(f: &mut fmt::Formatter,
|
||||
|
||||
let new_value = tcx.replace_late_bound_regions(&value, |br| {
|
||||
let _ = start_or_continue(f, "for<", ", ");
|
||||
ty::ReLateBound(ty::DebruijnIndex::new(1), match br {
|
||||
let br = match br {
|
||||
ty::BrNamed(_, name, _) => {
|
||||
let _ = write!(f, "{}", name);
|
||||
br
|
||||
@ -261,7 +261,8 @@ fn in_binder<'a, 'gcx, 'tcx, T, U>(f: &mut fmt::Formatter,
|
||||
name,
|
||||
ty::Issue32330::WontChange)
|
||||
}
|
||||
})
|
||||
};
|
||||
tcx.mk_region(ty::ReLateBound(ty::DebruijnIndex::new(1), br))
|
||||
}).0;
|
||||
|
||||
start_or_continue(f, "", "> ")?;
|
||||
@ -351,7 +352,7 @@ impl<'tcx> fmt::Debug for ty::TypeParameterDef<'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Debug for ty::RegionParameterDef {
|
||||
impl<'tcx> fmt::Debug for ty::RegionParameterDef<'tcx> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
write!(f, "RegionParameterDef({}, {:?}, {}, {:?})",
|
||||
self.name,
|
||||
@ -598,7 +599,7 @@ impl<'tcx> fmt::Debug for ty::ParameterEnvironment<'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> fmt::Debug for ty::ObjectLifetimeDefault {
|
||||
impl<'tcx> fmt::Debug for ty::ObjectLifetimeDefault<'tcx> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
match *self {
|
||||
ty::ObjectLifetimeDefault::Ambiguous => write!(f, "Ambiguous"),
|
||||
@ -793,13 +794,14 @@ impl<'tcx> fmt::Display for ty::Binder<ty::ProjectionPredicate<'tcx>> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> fmt::Display for ty::Binder<ty::OutlivesPredicate<Ty<'tcx>, ty::Region>> {
|
||||
impl<'tcx> fmt::Display for ty::Binder<ty::OutlivesPredicate<Ty<'tcx>, &'tcx ty::Region>> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
ty::tls::with(|tcx| in_binder(f, tcx, self, tcx.lift(self)))
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Display for ty::Binder<ty::OutlivesPredicate<ty::Region, ty::Region>> {
|
||||
impl<'tcx> fmt::Display for ty::Binder<ty::OutlivesPredicate<&'tcx ty::Region,
|
||||
&'tcx ty::Region>> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
ty::tls::with(|tcx| in_binder(f, tcx, self, tcx.lift(self)))
|
||||
}
|
||||
@ -973,7 +975,7 @@ impl fmt::Debug for ty::UpvarId {
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Debug for ty::UpvarBorrow {
|
||||
impl<'tcx> fmt::Debug for ty::UpvarBorrow<'tcx> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
write!(f, "UpvarBorrow({:?}, {:?})",
|
||||
self.kind, self.region)
|
||||
@ -997,7 +999,7 @@ impl fmt::Display for ty::InferTy {
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Display for ty::ExplicitSelfCategory {
|
||||
impl<'tcx> fmt::Display for ty::ExplicitSelfCategory<'tcx> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
f.write_str(match *self {
|
||||
ty::ExplicitSelfCategory::Static => "static",
|
||||
|
@ -126,7 +126,7 @@ impl<'a, 'tcx> euv::Delegate<'tcx> for CheckLoanCtxt<'a, 'tcx> {
|
||||
borrow_id: ast::NodeId,
|
||||
borrow_span: Span,
|
||||
cmt: mc::cmt<'tcx>,
|
||||
loan_region: ty::Region,
|
||||
loan_region: &'tcx ty::Region,
|
||||
bk: ty::BorrowKind,
|
||||
loan_cause: euv::LoanCause)
|
||||
{
|
||||
|
@ -28,7 +28,7 @@ pub fn guarantee_lifetime<'a, 'tcx>(bccx: &BorrowckCtxt<'a, 'tcx>,
|
||||
span: Span,
|
||||
cause: euv::LoanCause,
|
||||
cmt: mc::cmt<'tcx>,
|
||||
loan_region: ty::Region,
|
||||
loan_region: &'tcx ty::Region,
|
||||
_: ty::BorrowKind)
|
||||
-> Result<(),()> {
|
||||
//! Reports error if `loan_region` is larger than S
|
||||
@ -56,7 +56,7 @@ struct GuaranteeLifetimeContext<'a, 'tcx: 'a> {
|
||||
|
||||
span: Span,
|
||||
cause: euv::LoanCause,
|
||||
loan_region: ty::Region,
|
||||
loan_region: &'tcx ty::Region,
|
||||
cmt_original: mc::cmt<'tcx>
|
||||
}
|
||||
|
||||
@ -92,7 +92,7 @@ impl<'a, 'tcx> GuaranteeLifetimeContext<'a, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
fn check_scope(&self, max_scope: ty::Region) -> R {
|
||||
fn check_scope(&self, max_scope: &'tcx ty::Region) -> R {
|
||||
//! Reports an error if `loan_region` is larger than `max_scope`
|
||||
|
||||
if !self.bccx.is_subregion_of(self.loan_region, max_scope) {
|
||||
@ -102,7 +102,7 @@ impl<'a, 'tcx> GuaranteeLifetimeContext<'a, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
fn scope(&self, cmt: &mc::cmt) -> ty::Region {
|
||||
fn scope(&self, cmt: &mc::cmt<'tcx>) -> &'tcx ty::Region {
|
||||
//! Returns the maximal region scope for the which the
|
||||
//! lvalue `cmt` is guaranteed to be valid without any
|
||||
//! rooting etc, and presuming `cmt` is not mutated.
|
||||
@ -112,16 +112,15 @@ impl<'a, 'tcx> GuaranteeLifetimeContext<'a, 'tcx> {
|
||||
temp_scope
|
||||
}
|
||||
Categorization::Upvar(..) => {
|
||||
ty::ReScope(self.item_scope)
|
||||
}
|
||||
Categorization::StaticItem => {
|
||||
ty::ReStatic
|
||||
self.bccx.tcx.mk_region(ty::ReScope(self.item_scope))
|
||||
}
|
||||
Categorization::Local(local_id) => {
|
||||
ty::ReScope(self.bccx.tcx.region_maps.var_scope(local_id))
|
||||
self.bccx.tcx.mk_region(ty::ReScope(
|
||||
self.bccx.tcx.region_maps.var_scope(local_id)))
|
||||
}
|
||||
Categorization::StaticItem |
|
||||
Categorization::Deref(_, _, mc::UnsafePtr(..)) => {
|
||||
ty::ReStatic
|
||||
self.bccx.tcx.mk_region(ty::ReStatic)
|
||||
}
|
||||
Categorization::Deref(_, _, mc::BorrowedPtr(_, r)) |
|
||||
Categorization::Deref(_, _, mc::Implicit(_, r)) => {
|
||||
@ -135,7 +134,7 @@ impl<'a, 'tcx> GuaranteeLifetimeContext<'a, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
fn report_error(&self, code: bckerr_code) {
|
||||
fn report_error(&self, code: bckerr_code<'tcx>) {
|
||||
self.bccx.report(BckError { cmt: self.cmt_original.clone(),
|
||||
span: self.span,
|
||||
cause: BorrowViolation(self.cause),
|
||||
|
@ -130,7 +130,7 @@ impl<'a, 'tcx> euv::Delegate<'tcx> for GatherLoanCtxt<'a, 'tcx> {
|
||||
borrow_id: ast::NodeId,
|
||||
borrow_span: Span,
|
||||
cmt: mc::cmt<'tcx>,
|
||||
loan_region: ty::Region,
|
||||
loan_region: &'tcx ty::Region,
|
||||
bk: ty::BorrowKind,
|
||||
loan_cause: euv::LoanCause)
|
||||
{
|
||||
@ -307,7 +307,7 @@ impl<'a, 'tcx> GatherLoanCtxt<'a, 'tcx> {
|
||||
borrow_span: Span,
|
||||
cmt: mc::cmt<'tcx>,
|
||||
req_kind: ty::BorrowKind,
|
||||
loan_region: ty::Region,
|
||||
loan_region: &'tcx ty::Region,
|
||||
cause: euv::LoanCause) {
|
||||
debug!("guarantee_valid(borrow_id={}, cmt={:?}, \
|
||||
req_mutbl={:?}, loan_region={:?})",
|
||||
@ -318,7 +318,7 @@ impl<'a, 'tcx> GatherLoanCtxt<'a, 'tcx> {
|
||||
|
||||
// a loan for the empty region can never be dereferenced, so
|
||||
// it is always safe
|
||||
if loan_region == ty::ReEmpty {
|
||||
if *loan_region == ty::ReEmpty {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -358,7 +358,7 @@ impl<'a, 'tcx> GatherLoanCtxt<'a, 'tcx> {
|
||||
}
|
||||
|
||||
RestrictionResult::SafeIf(loan_path, restricted_paths) => {
|
||||
let loan_scope = match loan_region {
|
||||
let loan_scope = match *loan_region {
|
||||
ty::ReScope(scope) => scope,
|
||||
|
||||
ty::ReFree(ref fr) => fr.scope,
|
||||
|
@ -31,7 +31,7 @@ pub fn compute_restrictions<'a, 'tcx>(bccx: &BorrowckCtxt<'a, 'tcx>,
|
||||
span: Span,
|
||||
cause: euv::LoanCause,
|
||||
cmt: mc::cmt<'tcx>,
|
||||
loan_region: ty::Region)
|
||||
loan_region: &'tcx ty::Region)
|
||||
-> RestrictionResult<'tcx> {
|
||||
let ctxt = RestrictionsContext {
|
||||
bccx: bccx,
|
||||
@ -49,7 +49,7 @@ pub fn compute_restrictions<'a, 'tcx>(bccx: &BorrowckCtxt<'a, 'tcx>,
|
||||
struct RestrictionsContext<'a, 'tcx: 'a> {
|
||||
bccx: &'a BorrowckCtxt<'a, 'tcx>,
|
||||
span: Span,
|
||||
loan_region: ty::Region,
|
||||
loan_region: &'tcx ty::Region,
|
||||
cause: euv::LoanCause,
|
||||
}
|
||||
|
||||
@ -157,7 +157,7 @@ impl<'a, 'tcx> RestrictionsContext<'a, 'tcx> {
|
||||
fn extend(&self,
|
||||
result: RestrictionResult<'tcx>,
|
||||
cmt: &mc::cmt<'tcx>,
|
||||
elem: LoanPathElem) -> RestrictionResult<'tcx> {
|
||||
elem: LoanPathElem<'tcx>) -> RestrictionResult<'tcx> {
|
||||
match result {
|
||||
RestrictionResult::Safe => RestrictionResult::Safe,
|
||||
RestrictionResult::SafeIf(base_lp, mut base_vec) => {
|
||||
|
@ -365,7 +365,7 @@ pub enum LoanPathKind<'tcx> {
|
||||
LpVar(ast::NodeId), // `x` in README.md
|
||||
LpUpvar(ty::UpvarId), // `x` captured by-value into closure
|
||||
LpDowncast(Rc<LoanPath<'tcx>>, DefId), // `x` downcast to particular enum variant
|
||||
LpExtend(Rc<LoanPath<'tcx>>, mc::MutabilityCategory, LoanPathElem)
|
||||
LpExtend(Rc<LoanPath<'tcx>>, mc::MutabilityCategory, LoanPathElem<'tcx>)
|
||||
}
|
||||
|
||||
impl<'tcx> LoanPath<'tcx> {
|
||||
@ -410,8 +410,8 @@ impl ToInteriorKind for mc::InteriorKind {
|
||||
// `enum E { X { foo: u32 }, Y { foo: u32 }}`
|
||||
// each `foo` is qualified by the definitition id of the variant (`X` or `Y`).
|
||||
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
|
||||
pub enum LoanPathElem {
|
||||
LpDeref(mc::PointerKind),
|
||||
pub enum LoanPathElem<'tcx> {
|
||||
LpDeref(mc::PointerKind<'tcx>),
|
||||
LpInterior(Option<DefId>, InteriorKind),
|
||||
}
|
||||
|
||||
@ -564,10 +564,11 @@ pub fn opt_loan_path<'tcx>(cmt: &mc::cmt<'tcx>) -> Option<Rc<LoanPath<'tcx>>> {
|
||||
|
||||
// Errors that can occur
|
||||
#[derive(PartialEq)]
|
||||
pub enum bckerr_code {
|
||||
pub enum bckerr_code<'tcx> {
|
||||
err_mutbl,
|
||||
err_out_of_scope(ty::Region, ty::Region, euv::LoanCause), // superscope, subscope, loan cause
|
||||
err_borrowed_pointer_too_short(ty::Region, ty::Region), // loan, ptr
|
||||
/// superscope, subscope, loan cause
|
||||
err_out_of_scope(&'tcx ty::Region, &'tcx ty::Region, euv::LoanCause),
|
||||
err_borrowed_pointer_too_short(&'tcx ty::Region, &'tcx ty::Region), // loan, ptr
|
||||
}
|
||||
|
||||
// Combination of an error code and the categorization of the expression
|
||||
@ -577,7 +578,7 @@ pub struct BckError<'tcx> {
|
||||
span: Span,
|
||||
cause: AliasableViolationKind,
|
||||
cmt: mc::cmt<'tcx>,
|
||||
code: bckerr_code
|
||||
code: bckerr_code<'tcx>
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq)]
|
||||
@ -605,7 +606,7 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> {
|
||||
self.free_region_map = old_free_region_map;
|
||||
}
|
||||
|
||||
pub fn is_subregion_of(&self, r_sub: ty::Region, r_sup: ty::Region)
|
||||
pub fn is_subregion_of(&self, r_sub: &'tcx ty::Region, r_sup: &'tcx ty::Region)
|
||||
-> bool
|
||||
{
|
||||
self.free_region_map.is_subregion_of(self.tcx, r_sub, r_sup)
|
||||
@ -614,9 +615,9 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> {
|
||||
pub fn report(&self, err: BckError<'tcx>) {
|
||||
// Catch and handle some particular cases.
|
||||
match (&err.code, &err.cause) {
|
||||
(&err_out_of_scope(ty::ReScope(_), ty::ReStatic, _),
|
||||
(&err_out_of_scope(&ty::ReScope(_), &ty::ReStatic, _),
|
||||
&BorrowViolation(euv::ClosureCapture(span))) |
|
||||
(&err_out_of_scope(ty::ReScope(_), ty::ReFree(..), _),
|
||||
(&err_out_of_scope(&ty::ReScope(_), &ty::ReFree(..), _),
|
||||
&BorrowViolation(euv::ClosureCapture(span))) => {
|
||||
return self.report_out_of_scope_escaping_closure_capture(&err, span);
|
||||
}
|
||||
@ -965,8 +966,8 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> {
|
||||
.emit();
|
||||
}
|
||||
|
||||
fn region_end_span(&self, region: ty::Region) -> Option<Span> {
|
||||
match region {
|
||||
fn region_end_span(&self, region: &'tcx ty::Region) -> Option<Span> {
|
||||
match *region {
|
||||
ty::ReScope(scope) => {
|
||||
match scope.span(&self.tcx.region_maps, &self.tcx.map) {
|
||||
Some(s) => {
|
||||
@ -1194,8 +1195,8 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
fn statement_scope_span(tcx: TyCtxt, region: ty::Region) -> Option<Span> {
|
||||
match region {
|
||||
fn statement_scope_span(tcx: TyCtxt, region: &ty::Region) -> Option<Span> {
|
||||
match *region {
|
||||
ty::ReScope(scope) => {
|
||||
match tcx.map.find(scope.node_id(&tcx.region_maps)) {
|
||||
Some(hir_map::NodeStmt(stmt)) => Some(stmt.span),
|
||||
|
@ -1172,7 +1172,7 @@ impl<'a, 'gcx, 'tcx> Delegate<'tcx> for MutationChecker<'a, 'gcx> {
|
||||
_: NodeId,
|
||||
span: Span,
|
||||
_: cmt,
|
||||
_: Region,
|
||||
_: &'tcx Region,
|
||||
kind: BorrowKind,
|
||||
_: LoanCause) {
|
||||
match kind {
|
||||
|
@ -283,25 +283,26 @@ impl<'a, 'gcx, 'tcx> Env<'a, 'gcx, 'tcx> {
|
||||
pub fn re_early_bound(&self,
|
||||
index: u32,
|
||||
name: &'static str)
|
||||
-> ty::Region {
|
||||
-> &'tcx ty::Region {
|
||||
let name = token::intern(name);
|
||||
ty::ReEarlyBound(ty::EarlyBoundRegion {
|
||||
self.infcx.tcx.mk_region(ty::ReEarlyBound(ty::EarlyBoundRegion {
|
||||
index: index,
|
||||
name: name,
|
||||
})
|
||||
}))
|
||||
}
|
||||
|
||||
pub fn re_late_bound_with_debruijn(&self, id: u32, debruijn: ty::DebruijnIndex) -> ty::Region {
|
||||
ty::ReLateBound(debruijn, ty::BrAnon(id))
|
||||
pub fn re_late_bound_with_debruijn(&self, id: u32, debruijn: ty::DebruijnIndex)
|
||||
-> &'tcx ty::Region {
|
||||
self.infcx.tcx.mk_region(ty::ReLateBound(debruijn, ty::BrAnon(id)))
|
||||
}
|
||||
|
||||
pub fn t_rptr(&self, r: ty::Region) -> Ty<'tcx> {
|
||||
self.infcx.tcx.mk_imm_ref(self.infcx.tcx.mk_region(r), self.tcx().types.isize)
|
||||
pub fn t_rptr(&self, r: &'tcx ty::Region) -> Ty<'tcx> {
|
||||
self.infcx.tcx.mk_imm_ref(r, self.tcx().types.isize)
|
||||
}
|
||||
|
||||
pub fn t_rptr_late_bound(&self, id: u32) -> Ty<'tcx> {
|
||||
let r = self.re_late_bound_with_debruijn(id, ty::DebruijnIndex::new(1));
|
||||
self.infcx.tcx.mk_imm_ref(self.infcx.tcx.mk_region(r), self.tcx().types.isize)
|
||||
self.infcx.tcx.mk_imm_ref(r, self.tcx().types.isize)
|
||||
}
|
||||
|
||||
pub fn t_rptr_late_bound_with_debruijn(&self,
|
||||
@ -309,7 +310,7 @@ impl<'a, 'gcx, 'tcx> Env<'a, 'gcx, 'tcx> {
|
||||
debruijn: ty::DebruijnIndex)
|
||||
-> Ty<'tcx> {
|
||||
let r = self.re_late_bound_with_debruijn(id, debruijn);
|
||||
self.infcx.tcx.mk_imm_ref(self.infcx.tcx.mk_region(r), self.tcx().types.isize)
|
||||
self.infcx.tcx.mk_imm_ref(r, self.tcx().types.isize)
|
||||
}
|
||||
|
||||
pub fn t_rptr_scope(&self, id: ast::NodeId) -> Ty<'tcx> {
|
||||
@ -317,16 +318,16 @@ impl<'a, 'gcx, 'tcx> Env<'a, 'gcx, 'tcx> {
|
||||
self.infcx.tcx.mk_imm_ref(self.infcx.tcx.mk_region(r), self.tcx().types.isize)
|
||||
}
|
||||
|
||||
pub fn re_free(&self, nid: ast::NodeId, id: u32) -> ty::Region {
|
||||
ty::ReFree(ty::FreeRegion {
|
||||
pub fn re_free(&self, nid: ast::NodeId, id: u32) -> &'tcx ty::Region {
|
||||
self.infcx.tcx.mk_region(ty::ReFree(ty::FreeRegion {
|
||||
scope: self.tcx().region_maps.item_extent(nid),
|
||||
bound_region: ty::BrAnon(id),
|
||||
})
|
||||
}))
|
||||
}
|
||||
|
||||
pub fn t_rptr_free(&self, nid: ast::NodeId, id: u32) -> Ty<'tcx> {
|
||||
let r = self.re_free(nid, id);
|
||||
self.infcx.tcx.mk_imm_ref(self.infcx.tcx.mk_region(r), self.tcx().types.isize)
|
||||
self.infcx.tcx.mk_imm_ref(r, self.tcx().types.isize)
|
||||
}
|
||||
|
||||
pub fn t_rptr_static(&self) -> Ty<'tcx> {
|
||||
|
@ -517,7 +517,7 @@ pub fn encode_cast_kind(ebml_w: &mut Encoder, kind: cast::CastKind) {
|
||||
// Encoding and decoding the side tables
|
||||
|
||||
trait rbml_writer_helpers<'tcx> {
|
||||
fn emit_region(&mut self, ecx: &e::EncodeContext, r: ty::Region);
|
||||
fn emit_region(&mut self, ecx: &e::EncodeContext, r: &'tcx ty::Region);
|
||||
fn emit_ty<'a>(&mut self, ecx: &e::EncodeContext<'a, 'tcx>, ty: Ty<'tcx>);
|
||||
fn emit_substs<'a>(&mut self, ecx: &e::EncodeContext<'a, 'tcx>,
|
||||
substs: &Substs<'tcx>);
|
||||
@ -531,7 +531,7 @@ trait rbml_writer_helpers<'tcx> {
|
||||
}
|
||||
|
||||
impl<'a, 'tcx> rbml_writer_helpers<'tcx> for Encoder<'a> {
|
||||
fn emit_region(&mut self, ecx: &e::EncodeContext, r: ty::Region) {
|
||||
fn emit_region(&mut self, ecx: &e::EncodeContext, r: &'tcx ty::Region) {
|
||||
self.emit_opaque(|this| Ok(tyencode::enc_region(&mut this.cursor,
|
||||
&ecx.ty_str_ctxt(),
|
||||
r)));
|
||||
@ -617,7 +617,7 @@ impl<'a, 'tcx> rbml_writer_helpers<'tcx> for Encoder<'a> {
|
||||
&adjustment::AutoPtr(r, m) => {
|
||||
this.emit_enum_variant("AutoPtr", 0, 2, |this| {
|
||||
this.emit_enum_variant_arg(0,
|
||||
|this| Ok(this.emit_region(ecx, *r)));
|
||||
|this| Ok(this.emit_region(ecx, r)));
|
||||
this.emit_enum_variant_arg(1, |this| m.encode(this))
|
||||
})
|
||||
}
|
||||
@ -824,7 +824,7 @@ trait rbml_decoder_decoder_helpers<'tcx> {
|
||||
f: F) -> R
|
||||
where F: for<'x> FnOnce(&mut tydecode::TyDecoder<'x, 'tcx>) -> R;
|
||||
|
||||
fn read_region(&mut self, dcx: &DecodeContext) -> ty::Region;
|
||||
fn read_region<'a, 'b>(&mut self, dcx: &DecodeContext<'a, 'b, 'tcx>) -> &'tcx ty::Region;
|
||||
fn read_ty<'a, 'b>(&mut self, dcx: &DecodeContext<'a, 'b, 'tcx>) -> Ty<'tcx>;
|
||||
fn read_tys<'a, 'b>(&mut self, dcx: &DecodeContext<'a, 'b, 'tcx>) -> Vec<Ty<'tcx>>;
|
||||
fn read_trait_ref<'a, 'b>(&mut self, dcx: &DecodeContext<'a, 'b, 'tcx>)
|
||||
@ -835,8 +835,8 @@ trait rbml_decoder_decoder_helpers<'tcx> {
|
||||
-> ty::Predicate<'tcx>;
|
||||
fn read_substs<'a, 'b>(&mut self, dcx: &DecodeContext<'a, 'b, 'tcx>)
|
||||
-> &'tcx Substs<'tcx>;
|
||||
fn read_upvar_capture(&mut self, dcx: &DecodeContext)
|
||||
-> ty::UpvarCapture;
|
||||
fn read_upvar_capture<'a, 'b>(&mut self, dcx: &DecodeContext<'a, 'b, 'tcx>)
|
||||
-> ty::UpvarCapture<'tcx>;
|
||||
fn read_auto_adjustment<'a, 'b>(&mut self, dcx: &DecodeContext<'a, 'b, 'tcx>)
|
||||
-> adjustment::AutoAdjustment<'tcx>;
|
||||
fn read_cast_kind<'a, 'b>(&mut self, dcx: &DecodeContext<'a, 'b, 'tcx>)
|
||||
@ -908,7 +908,7 @@ impl<'a, 'tcx> rbml_decoder_decoder_helpers<'tcx> for reader::Decoder<'a> {
|
||||
str
|
||||
}
|
||||
}
|
||||
fn read_region(&mut self, dcx: &DecodeContext) -> ty::Region {
|
||||
fn read_region<'b, 'c>(&mut self, dcx: &DecodeContext<'b, 'c, 'tcx>) -> &'tcx ty::Region {
|
||||
// Note: regions types embed local node ids. In principle, we
|
||||
// should translate these node ids into the new decode
|
||||
// context. However, we do not bother, because region types
|
||||
@ -948,7 +948,8 @@ impl<'a, 'tcx> rbml_decoder_decoder_helpers<'tcx> for reader::Decoder<'a> {
|
||||
.parse_substs())
|
||||
}).unwrap()
|
||||
}
|
||||
fn read_upvar_capture(&mut self, dcx: &DecodeContext) -> ty::UpvarCapture {
|
||||
fn read_upvar_capture<'b, 'c>(&mut self, dcx: &DecodeContext<'b, 'c, 'tcx>)
|
||||
-> ty::UpvarCapture<'tcx> {
|
||||
self.read_enum("UpvarCapture", |this| {
|
||||
let variants = ["ByValue", "ByRef"];
|
||||
this.read_enum_variant(&variants, |this, i| {
|
||||
@ -1032,7 +1033,7 @@ impl<'a, 'tcx> rbml_decoder_decoder_helpers<'tcx> for reader::Decoder<'a> {
|
||||
this.read_enum_variant(&variants, |this, i| {
|
||||
Ok(match i {
|
||||
0 => {
|
||||
let r: ty::Region =
|
||||
let r: &'tcx ty::Region =
|
||||
this.read_enum_variant_arg(0, |this| {
|
||||
Ok(this.read_region(dcx))
|
||||
}).unwrap();
|
||||
@ -1041,7 +1042,7 @@ impl<'a, 'tcx> rbml_decoder_decoder_helpers<'tcx> for reader::Decoder<'a> {
|
||||
Decodable::decode(this)
|
||||
}).unwrap();
|
||||
|
||||
adjustment::AutoPtr(dcx.tcx.mk_region(r), m)
|
||||
adjustment::AutoPtr(r, m)
|
||||
}
|
||||
1 => {
|
||||
let m: hir::Mutability =
|
||||
|
@ -291,13 +291,6 @@ impl<'tcx> CrateStore<'tcx> for cstore::CStore {
|
||||
decoder::is_foreign_item(&cdata, did.index)
|
||||
}
|
||||
|
||||
fn is_static_method(&self, def: DefId) -> bool
|
||||
{
|
||||
self.dep_graph.read(DepNode::MetaData(def));
|
||||
let cdata = self.get_crate_data(def.krate);
|
||||
decoder::is_static_method(&cdata, def.index)
|
||||
}
|
||||
|
||||
fn is_statically_included_foreign_item(&self, id: ast::NodeId) -> bool
|
||||
{
|
||||
self.do_is_statically_included_foreign_item(id)
|
||||
|
@ -859,7 +859,8 @@ pub fn maybe_get_item_mir<'a, 'tcx>(cdata: Cmd,
|
||||
}
|
||||
}
|
||||
|
||||
fn get_explicit_self(item: rbml::Doc) -> ty::ExplicitSelfCategory {
|
||||
fn get_explicit_self<'a, 'tcx>(item: rbml::Doc, tcx: TyCtxt<'a, 'tcx, 'tcx>)
|
||||
-> ty::ExplicitSelfCategory<'tcx> {
|
||||
fn get_mutability(ch: u8) -> hir::Mutability {
|
||||
match ch as char {
|
||||
'i' => hir::MutImmutable,
|
||||
@ -879,7 +880,7 @@ fn get_explicit_self(item: rbml::Doc) -> ty::ExplicitSelfCategory {
|
||||
// FIXME(#4846) expl. region
|
||||
'&' => {
|
||||
ty::ExplicitSelfCategory::ByReference(
|
||||
ty::ReEmpty,
|
||||
tcx.mk_region(ty::ReEmpty),
|
||||
get_mutability(string.as_bytes()[1]))
|
||||
}
|
||||
_ => bug!("unknown self type code: `{}`", explicit_self_kind as char)
|
||||
@ -905,16 +906,6 @@ pub fn get_trait_name(cdata: Cmd, id: DefIndex) -> ast::Name {
|
||||
item_name(doc)
|
||||
}
|
||||
|
||||
pub fn is_static_method(cdata: Cmd, id: DefIndex) -> bool {
|
||||
let doc = cdata.lookup_item(id);
|
||||
match item_sort(doc) {
|
||||
Some('r') | Some('p') => {
|
||||
get_explicit_self(doc) == ty::ExplicitSelfCategory::Static
|
||||
}
|
||||
_ => false
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_impl_or_trait_item<'a, 'tcx>(cdata: Cmd, id: DefIndex, tcx: TyCtxt<'a, 'tcx, 'tcx>)
|
||||
-> Option<ty::ImplOrTraitItem<'tcx>> {
|
||||
let item_doc = cdata.lookup_item(id);
|
||||
@ -959,7 +950,7 @@ pub fn get_impl_or_trait_item<'a, 'tcx>(cdata: Cmd, id: DefIndex, tcx: TyCtxt<'a
|
||||
"the type {:?} of the method {:?} is not a function?",
|
||||
ity, name)
|
||||
};
|
||||
let explicit_self = get_explicit_self(item_doc);
|
||||
let explicit_self = get_explicit_self(item_doc, tcx);
|
||||
|
||||
ty::MethodTraitItem(Rc::new(ty::Method::new(name,
|
||||
generics,
|
||||
|
@ -207,8 +207,8 @@ impl<'a,'tcx> TyDecoder<'a,'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn parse_region(&mut self) -> ty::Region {
|
||||
match self.next() {
|
||||
pub fn parse_region(&mut self) -> &'tcx ty::Region {
|
||||
self.tcx.mk_region(match self.next() {
|
||||
'b' => {
|
||||
assert_eq!(self.next(), '[');
|
||||
let id = ty::DebruijnIndex::new(self.parse_u32());
|
||||
@ -245,7 +245,7 @@ impl<'a,'tcx> TyDecoder<'a,'tcx> {
|
||||
'e' => ty::ReEmpty,
|
||||
'E' => ty::ReErased,
|
||||
_ => bug!("parse_region: bad input")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
fn parse_scope(&mut self) -> region::CodeExtent {
|
||||
@ -403,9 +403,7 @@ impl<'a,'tcx> TyDecoder<'a,'tcx> {
|
||||
'~' => return tcx.mk_box(self.parse_ty()),
|
||||
'*' => return tcx.mk_ptr(self.parse_mt()),
|
||||
'&' => {
|
||||
let r = self.parse_region();
|
||||
let mt = self.parse_mt();
|
||||
return tcx.mk_ref(tcx.mk_region(r), mt);
|
||||
return tcx.mk_ref(self.parse_region(), self.parse_mt());
|
||||
}
|
||||
'V' => {
|
||||
let t = self.parse_ty();
|
||||
@ -657,7 +655,7 @@ impl<'a,'tcx> TyDecoder<'a,'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
fn parse_region_param_def(&mut self) -> ty::RegionParameterDef {
|
||||
fn parse_region_param_def(&mut self) -> ty::RegionParameterDef<'tcx> {
|
||||
let name = self.parse_name(':');
|
||||
let def_id = self.parse_def();
|
||||
let index = self.parse_u32();
|
||||
@ -681,7 +679,7 @@ impl<'a,'tcx> TyDecoder<'a,'tcx> {
|
||||
}
|
||||
|
||||
|
||||
fn parse_object_lifetime_default(&mut self) -> ty::ObjectLifetimeDefault {
|
||||
fn parse_object_lifetime_default(&mut self) -> ty::ObjectLifetimeDefault<'tcx> {
|
||||
match self.next() {
|
||||
'a' => ty::ObjectLifetimeDefault::Ambiguous,
|
||||
'b' => ty::ObjectLifetimeDefault::BaseDefault,
|
||||
|
@ -133,7 +133,7 @@ pub fn enc_ty<'a, 'tcx>(w: &mut Cursor<Vec<u8>>, cx: &ctxt<'a, 'tcx>, t: Ty<'tcx
|
||||
ty::TyRawPtr(mt) => { write!(w, "*"); enc_mt(w, cx, mt); }
|
||||
ty::TyRef(r, mt) => {
|
||||
write!(w, "&");
|
||||
enc_region(w, cx, *r);
|
||||
enc_region(w, cx, r);
|
||||
enc_mt(w, cx, mt);
|
||||
}
|
||||
ty::TyArray(t, sz) => {
|
||||
@ -286,8 +286,8 @@ pub fn enc_generics<'a, 'tcx>(w: &mut Cursor<Vec<u8>>, cx: &ctxt<'a, 'tcx>,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn enc_region(w: &mut Cursor<Vec<u8>>, cx: &ctxt, r: ty::Region) {
|
||||
match r {
|
||||
pub fn enc_region(w: &mut Cursor<Vec<u8>>, cx: &ctxt, r: &ty::Region) {
|
||||
match *r {
|
||||
ty::ReLateBound(id, br) => {
|
||||
write!(w, "b[{}|", id.depth);
|
||||
enc_bound_region(w, cx, br);
|
||||
|
@ -278,7 +278,7 @@ struct Binding<'tcx> {
|
||||
var_id: NodeId,
|
||||
var_ty: Ty<'tcx>,
|
||||
mutability: Mutability,
|
||||
binding_mode: BindingMode,
|
||||
binding_mode: BindingMode<'tcx>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
|
@ -108,7 +108,7 @@ impl<'tcx> Mirror<'tcx> for &'tcx hir::Expr {
|
||||
region, ty::TypeAndMut { ty: expr.ty, mutbl: mutbl }),
|
||||
span: expr.span,
|
||||
kind: ExprKind::Borrow {
|
||||
region: *region,
|
||||
region: region,
|
||||
borrow_kind: to_borrow_kind(mutbl),
|
||||
arg: expr.to_ref()
|
||||
}
|
||||
@ -137,7 +137,7 @@ impl<'tcx> Mirror<'tcx> for &'tcx hir::Expr {
|
||||
ty: adjusted_ty,
|
||||
span: self.span,
|
||||
kind: ExprKind::Borrow {
|
||||
region: *r,
|
||||
region: r,
|
||||
borrow_kind: to_borrow_kind(m),
|
||||
arg: expr.to_ref(),
|
||||
},
|
||||
@ -154,7 +154,7 @@ impl<'tcx> Mirror<'tcx> for &'tcx hir::Expr {
|
||||
ty: cx.tcx.mk_ref(region, ty::TypeAndMut { ty: expr.ty, mutbl: m }),
|
||||
span: self.span,
|
||||
kind: ExprKind::Borrow {
|
||||
region: *region,
|
||||
region: region,
|
||||
borrow_kind: to_borrow_kind(m),
|
||||
arg: expr.to_ref(),
|
||||
},
|
||||
@ -310,7 +310,7 @@ fn make_mirror_unadjusted<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
|
||||
_ => span_bug!(expr.span, "type of & not region"),
|
||||
};
|
||||
ExprKind::Borrow {
|
||||
region: *region,
|
||||
region: region,
|
||||
borrow_kind: to_borrow_kind(mutbl),
|
||||
arg: expr.to_ref(),
|
||||
}
|
||||
@ -842,8 +842,7 @@ fn convert_var<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
|
||||
ExprKind::Deref {
|
||||
arg: Expr {
|
||||
temp_lifetime: temp_lifetime,
|
||||
ty: cx.tcx.mk_ref(
|
||||
cx.tcx.mk_region(borrow.region),
|
||||
ty: cx.tcx.mk_ref(borrow.region,
|
||||
ty::TypeAndMut {
|
||||
ty: var_ty,
|
||||
mutbl: borrow.kind.to_mutbl_lossy()
|
||||
@ -907,8 +906,7 @@ fn overloaded_operator<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
|
||||
}
|
||||
|
||||
PassArgs::ByRef => {
|
||||
let scope = cx.tcx.region_maps.node_extent(expr.id);
|
||||
let region = cx.tcx.mk_region(ty::ReScope(scope));
|
||||
let region = cx.tcx.node_scope_region(expr.id);
|
||||
let temp_lifetime = cx.tcx.region_maps.temporary_scope(expr.id);
|
||||
argrefs.extend(
|
||||
args.iter()
|
||||
@ -922,7 +920,7 @@ fn overloaded_operator<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
|
||||
temp_lifetime: temp_lifetime,
|
||||
ty: adjusted_ty,
|
||||
span: expr.span,
|
||||
kind: ExprKind::Borrow { region: *region,
|
||||
kind: ExprKind::Borrow { region: region,
|
||||
borrow_kind: BorrowKind::Shared,
|
||||
arg: arg.to_ref() }
|
||||
}.to_ref()
|
||||
|
@ -161,7 +161,7 @@ impl<'patcx, 'cx, 'gcx, 'tcx> PatCx<'patcx, 'cx, 'gcx, 'tcx> {
|
||||
let id = self.cx.tcx.expect_def(pat.id).var_id();
|
||||
let var_ty = self.cx.tcx.node_id_to_type(pat.id);
|
||||
let region = match var_ty.sty {
|
||||
ty::TyRef(&r, _) => Some(r),
|
||||
ty::TyRef(r, _) => Some(r),
|
||||
_ => None,
|
||||
};
|
||||
let (mutability, mode) = match bm {
|
||||
|
@ -193,7 +193,7 @@ pub enum ExprKind<'tcx> {
|
||||
id: DefId,
|
||||
},
|
||||
Borrow {
|
||||
region: Region,
|
||||
region: &'tcx Region,
|
||||
borrow_kind: BorrowKind,
|
||||
arg: ExprRef<'tcx>,
|
||||
},
|
||||
@ -284,7 +284,7 @@ pub enum PatternKind<'tcx> {
|
||||
Binding {
|
||||
mutability: Mutability,
|
||||
name: ast::Name,
|
||||
mode: BindingMode,
|
||||
mode: BindingMode<'tcx>,
|
||||
var: ast::NodeId,
|
||||
ty: Ty<'tcx>,
|
||||
subpattern: Option<Pattern<'tcx>>,
|
||||
@ -332,9 +332,9 @@ pub enum PatternKind<'tcx> {
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
pub enum BindingMode {
|
||||
pub enum BindingMode<'tcx> {
|
||||
ByValue,
|
||||
ByRef(Region, BorrowKind),
|
||||
ByRef(&'tcx Region, BorrowKind),
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
|
@ -683,7 +683,7 @@ impl<'a, 'gcx, 'tcx> euv::Delegate<'tcx> for CheckCrateVisitor<'a, 'gcx> {
|
||||
borrow_id: ast::NodeId,
|
||||
_borrow_span: Span,
|
||||
cmt: mc::cmt<'tcx>,
|
||||
_loan_region: ty::Region,
|
||||
_loan_region: &'tcx ty::Region,
|
||||
bk: ty::BorrowKind,
|
||||
loan_cause: euv::LoanCause) {
|
||||
// Kind of hacky, but we allow Unsafe coercions in constants.
|
||||
|
@ -88,7 +88,7 @@ impl<'a, 'gcx, 'tcx> euv::Delegate<'tcx> for RvalueContextDelegate<'a, 'gcx, 'tc
|
||||
_borrow_id: ast::NodeId,
|
||||
_borrow_span: Span,
|
||||
_cmt: mc::cmt,
|
||||
_loan_region: ty::Region,
|
||||
_loan_region: &'tcx ty::Region,
|
||||
_bk: ty::BorrowKind,
|
||||
_loan_cause: euv::LoanCause) {
|
||||
}
|
||||
|
@ -1235,7 +1235,7 @@ fn create_trans_items_for_default_impls<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||
// The substitutions we have are on the impl, so we grab
|
||||
// the method type from the impl to substitute into.
|
||||
let impl_substs = Substs::for_item(tcx, impl_def_id,
|
||||
|_, _| ty::ReErased,
|
||||
|_, _| tcx.mk_region(ty::ReErased),
|
||||
|_, _| tcx.types.err);
|
||||
let mth = meth::get_impl_method(tcx,
|
||||
callee_substs,
|
||||
|
@ -563,7 +563,9 @@ impl<'b, 'tcx> SharedCrateContext<'b, 'tcx> {
|
||||
/// Given the def-id of some item that has no type parameters, make
|
||||
/// a suitable "empty substs" for it.
|
||||
pub fn empty_substs_for_def_id(&self, item_def_id: DefId) -> &'tcx Substs<'tcx> {
|
||||
Substs::for_item(self.tcx(), item_def_id, |_, _| ty::ReErased, |_, _| {
|
||||
Substs::for_item(self.tcx(), item_def_id,
|
||||
|_, _| self.tcx().mk_region(ty::ReErased),
|
||||
|_, _| {
|
||||
bug!("empty_substs_for_def_id: {:?} has type parameters", item_def_id)
|
||||
})
|
||||
}
|
||||
|
@ -265,7 +265,7 @@ pub fn get_vtable_methods<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||
// the method may have some early-bound lifetimes, add
|
||||
// regions for those
|
||||
let method_substs = Substs::for_item(tcx, trait_method_def_id,
|
||||
|_, _| ty::ReErased,
|
||||
|_, _| tcx.mk_region(ty::ReErased),
|
||||
|_, _| tcx.types.err);
|
||||
|
||||
// The substitutions we have are on the impl, so we grab
|
||||
|
@ -178,8 +178,9 @@ type TraitAndProjections<'tcx> = (ty::PolyTraitRef<'tcx>, Vec<ty::PolyProjection
|
||||
/// This type must not appear anywhere in other converted types.
|
||||
const TRAIT_OBJECT_DUMMY_SELF: ty::TypeVariants<'static> = ty::TyInfer(ty::FreshTy(0));
|
||||
|
||||
pub fn ast_region_to_region(tcx: TyCtxt, lifetime: &hir::Lifetime)
|
||||
-> ty::Region {
|
||||
pub fn ast_region_to_region<'a, 'gcx, 'tcx>(tcx: TyCtxt<'a, 'gcx, 'tcx>,
|
||||
lifetime: &hir::Lifetime)
|
||||
-> &'tcx ty::Region {
|
||||
let r = match tcx.named_region_map.defs.get(&lifetime.id) {
|
||||
None => {
|
||||
// should have been recorded by the `resolve_lifetime` pass
|
||||
@ -238,7 +239,7 @@ pub fn ast_region_to_region(tcx: TyCtxt, lifetime: &hir::Lifetime)
|
||||
lifetime.id,
|
||||
r);
|
||||
|
||||
r
|
||||
tcx.mk_region(r)
|
||||
}
|
||||
|
||||
fn report_elision_failure(
|
||||
@ -313,14 +314,14 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
|
||||
pub fn opt_ast_region_to_region(&self,
|
||||
rscope: &RegionScope,
|
||||
default_span: Span,
|
||||
opt_lifetime: &Option<hir::Lifetime>) -> ty::Region
|
||||
opt_lifetime: &Option<hir::Lifetime>) -> &'tcx ty::Region
|
||||
{
|
||||
let r = match *opt_lifetime {
|
||||
Some(ref lifetime) => {
|
||||
ast_region_to_region(self.tcx(), lifetime)
|
||||
}
|
||||
|
||||
None => match rscope.anon_regions(default_span, 1) {
|
||||
None => self.tcx().mk_region(match rscope.anon_regions(default_span, 1) {
|
||||
Ok(rs) => rs[0],
|
||||
Err(params) => {
|
||||
let ampersand_span = Span { hi: default_span.lo, ..default_span};
|
||||
@ -335,7 +336,7 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
|
||||
err.emit();
|
||||
ty::ReStatic
|
||||
}
|
||||
}
|
||||
})
|
||||
};
|
||||
|
||||
debug!("opt_ast_region_to_region(opt_lifetime={:?}) yields {:?}",
|
||||
@ -366,7 +367,7 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
|
||||
.emit();
|
||||
|
||||
return Substs::for_item(tcx, def_id, |_, _| {
|
||||
ty::ReStatic
|
||||
tcx.mk_region(ty::ReStatic)
|
||||
}, |_, _| {
|
||||
tcx.types.err
|
||||
});
|
||||
@ -431,7 +432,7 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
|
||||
let expected_num_region_params = decl_generics.regions.len();
|
||||
let supplied_num_region_params = lifetimes.len();
|
||||
let regions = if expected_num_region_params == supplied_num_region_params {
|
||||
lifetimes.iter().map(|l| ast_region_to_region(tcx, l)).collect()
|
||||
lifetimes.iter().map(|l| *ast_region_to_region(tcx, l)).collect()
|
||||
} else {
|
||||
let anon_regions =
|
||||
rscope.anon_regions(span, expected_num_region_params);
|
||||
@ -472,7 +473,7 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
|
||||
|
||||
let mut output_assoc_binding = None;
|
||||
let substs = Substs::for_item(tcx, def_id, |def, _| {
|
||||
regions[def.index as usize]
|
||||
tcx.mk_region(regions[def.index as usize])
|
||||
}, |def, substs| {
|
||||
let i = def.index as usize;
|
||||
|
||||
@ -588,7 +589,7 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
|
||||
}
|
||||
|
||||
if lifetimes_for_params.iter().map(|e| e.lifetime_count).sum::<usize>() == 1 {
|
||||
Ok(possible_implied_output_region.unwrap())
|
||||
Ok(*possible_implied_output_region.unwrap())
|
||||
} else {
|
||||
Err(Some(lifetimes_for_params))
|
||||
}
|
||||
@ -1100,7 +1101,7 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
|
||||
let region_bound = match region_bound {
|
||||
Some(r) => r,
|
||||
None => {
|
||||
match rscope.object_lifetime_default(span) {
|
||||
tcx.mk_region(match rscope.object_lifetime_default(span) {
|
||||
Some(r) => r,
|
||||
None => {
|
||||
span_err!(self.tcx().sess, span, E0228,
|
||||
@ -1108,7 +1109,7 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
|
||||
from context; please supply an explicit bound");
|
||||
ty::ReStatic
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
};
|
||||
|
||||
@ -1643,7 +1644,7 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
|
||||
rscope,
|
||||
ty::ObjectLifetimeDefault::Specific(r));
|
||||
let t = self.ast_ty_to_ty(rscope1, &mt.ty);
|
||||
tcx.mk_ref(tcx.mk_region(r), ty::TypeAndMut {ty: t, mutbl: mt.mutbl})
|
||||
tcx.mk_ref(r, ty::TypeAndMut {ty: t, mutbl: mt.mutbl})
|
||||
}
|
||||
hir::TyNever => {
|
||||
tcx.types.never
|
||||
@ -1801,7 +1802,7 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
|
||||
sig: &hir::MethodSig,
|
||||
untransformed_self_ty: Ty<'tcx>,
|
||||
anon_scope: Option<AnonTypeScope>)
|
||||
-> (&'tcx ty::BareFnTy<'tcx>, ty::ExplicitSelfCategory) {
|
||||
-> (&'tcx ty::BareFnTy<'tcx>, ty::ExplicitSelfCategory<'tcx>) {
|
||||
self.ty_of_method_or_bare_fn(sig.unsafety,
|
||||
sig.abi,
|
||||
Some(untransformed_self_ty),
|
||||
@ -1826,7 +1827,7 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
|
||||
decl: &hir::FnDecl,
|
||||
arg_anon_scope: Option<AnonTypeScope>,
|
||||
ret_anon_scope: Option<AnonTypeScope>)
|
||||
-> (&'tcx ty::BareFnTy<'tcx>, ty::ExplicitSelfCategory)
|
||||
-> (&'tcx ty::BareFnTy<'tcx>, ty::ExplicitSelfCategory<'tcx>)
|
||||
{
|
||||
debug!("ty_of_method_or_bare_fn");
|
||||
|
||||
@ -1863,7 +1864,7 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
|
||||
// reference) in the arguments, then any anonymous regions in the output
|
||||
// have that lifetime.
|
||||
let implied_output_region = match explicit_self_category {
|
||||
ty::ExplicitSelfCategory::ByReference(region, _) => Ok(region),
|
||||
ty::ExplicitSelfCategory::ByReference(region, _) => Ok(*region),
|
||||
_ => self.find_implied_output_region(&arg_tys, arg_pats)
|
||||
};
|
||||
|
||||
@ -1890,7 +1891,7 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
|
||||
rscope: &RegionScope,
|
||||
untransformed_self_ty: Ty<'tcx>,
|
||||
explicit_self: &hir::ExplicitSelf)
|
||||
-> (Ty<'tcx>, ty::ExplicitSelfCategory)
|
||||
-> (Ty<'tcx>, ty::ExplicitSelfCategory<'tcx>)
|
||||
{
|
||||
return match explicit_self.node {
|
||||
SelfKind::Value(..) => {
|
||||
@ -1902,8 +1903,7 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
|
||||
rscope,
|
||||
explicit_self.span,
|
||||
lifetime);
|
||||
(self.tcx().mk_ref(
|
||||
self.tcx().mk_region(region),
|
||||
(self.tcx().mk_ref(region,
|
||||
ty::TypeAndMut {
|
||||
ty: untransformed_self_ty,
|
||||
mutbl: mutability
|
||||
@ -1957,7 +1957,7 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
|
||||
ty::ExplicitSelfCategory::ByValue
|
||||
} else {
|
||||
match explicit_type.sty {
|
||||
ty::TyRef(r, mt) => ty::ExplicitSelfCategory::ByReference(*r, mt.mutbl),
|
||||
ty::TyRef(r, mt) => ty::ExplicitSelfCategory::ByReference(r, mt.mutbl),
|
||||
ty::TyBox(_) => ty::ExplicitSelfCategory::ByBox,
|
||||
_ => ty::ExplicitSelfCategory::ByValue,
|
||||
}
|
||||
@ -2070,7 +2070,7 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
|
||||
explicit_region_bounds: &[&hir::Lifetime],
|
||||
principal_trait_ref: ty::PolyExistentialTraitRef<'tcx>,
|
||||
builtin_bounds: ty::BuiltinBounds)
|
||||
-> Option<ty::Region> // if None, use the default
|
||||
-> Option<&'tcx ty::Region> // if None, use the default
|
||||
{
|
||||
let tcx = self.tcx();
|
||||
|
||||
@ -2093,7 +2093,7 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
|
||||
|
||||
if let Err(ErrorReported) =
|
||||
self.ensure_super_predicates(span, principal_trait_ref.def_id()) {
|
||||
return Some(ty::ReStatic);
|
||||
return Some(tcx.mk_region(ty::ReStatic));
|
||||
}
|
||||
|
||||
// No explicit region bound specified. Therefore, examine trait
|
||||
@ -2109,8 +2109,8 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
|
||||
|
||||
// If any of the derived region bounds are 'static, that is always
|
||||
// the best choice.
|
||||
if derived_region_bounds.iter().any(|r| ty::ReStatic == *r) {
|
||||
return Some(ty::ReStatic);
|
||||
if derived_region_bounds.iter().any(|&r| ty::ReStatic == *r) {
|
||||
return Some(tcx.mk_region(ty::ReStatic));
|
||||
}
|
||||
|
||||
// Determine whether there is exactly one unique region in the set
|
||||
@ -2242,7 +2242,7 @@ fn report_lifetime_number_error(tcx: TyCtxt, span: Span, number: usize, expected
|
||||
// and return from functions in multiple places.
|
||||
#[derive(PartialEq, Eq, Clone, Debug)]
|
||||
pub struct Bounds<'tcx> {
|
||||
pub region_bounds: Vec<ty::Region>,
|
||||
pub region_bounds: Vec<&'tcx ty::Region>,
|
||||
pub builtin_bounds: ty::BuiltinBounds,
|
||||
pub trait_bounds: Vec<ty::PolyTraitRef<'tcx>>,
|
||||
pub projection_bounds: Vec<ty::PolyProjectionPredicate<'tcx>>,
|
||||
@ -2264,7 +2264,7 @@ impl<'a, 'gcx, 'tcx> Bounds<'tcx> {
|
||||
for ®ion_bound in &self.region_bounds {
|
||||
// account for the binder being introduced below; no need to shift `param_ty`
|
||||
// because, at present at least, it can only refer to early-bound regions
|
||||
let region_bound = ty::fold::shift_region(region_bound, 1);
|
||||
let region_bound = tcx.mk_region(ty::fold::shift_region(*region_bound, 1));
|
||||
vec.push(ty::Binder(ty::OutlivesPredicate(param_ty, region_bound)).to_predicate());
|
||||
}
|
||||
|
||||
|
@ -122,7 +122,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
|
||||
// and T is the expected type.
|
||||
let region_var = self.next_region_var(infer::PatternRegion(pat.span));
|
||||
let mt = ty::TypeAndMut { ty: expected, mutbl: mutbl };
|
||||
let region_ty = tcx.mk_ref(tcx.mk_region(region_var), mt);
|
||||
let region_ty = tcx.mk_ref(region_var, mt);
|
||||
|
||||
// `x` is assigned a value of type `&M T`, hence `&M T <: typeof(x)` is
|
||||
// required. However, we use equality, which is stronger. See (*) for
|
||||
@ -220,7 +220,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
|
||||
let inner_ty = self.next_ty_var();
|
||||
let mt = ty::TypeAndMut { ty: inner_ty, mutbl: mutbl };
|
||||
let region = self.next_region_var(infer::PatternRegion(pat.span));
|
||||
let rptr_ty = tcx.mk_ref(tcx.mk_region(region), mt);
|
||||
let rptr_ty = tcx.mk_ref(region, mt);
|
||||
self.demand_eqtype(pat.span, expected, rptr_ty);
|
||||
(rptr_ty, inner_ty)
|
||||
}
|
||||
|
@ -336,7 +336,7 @@ impl<'f, 'gcx, 'tcx> Coerce<'f, 'gcx, 'tcx> {
|
||||
if r_borrow_var.is_none() { // create var lazilly, at most once
|
||||
let coercion = Coercion(span);
|
||||
let r = self.next_region_var(coercion);
|
||||
r_borrow_var = Some(self.tcx.mk_region(r)); // [4] above
|
||||
r_borrow_var = Some(r); // [4] above
|
||||
}
|
||||
r_borrow_var.unwrap()
|
||||
};
|
||||
@ -436,8 +436,7 @@ impl<'f, 'gcx, 'tcx> Coerce<'f, 'gcx, 'tcx> {
|
||||
|
||||
let coercion = Coercion(self.origin.span());
|
||||
let r_borrow = self.next_region_var(coercion);
|
||||
let region = self.tcx.mk_region(r_borrow);
|
||||
(mt_a.ty, Some(AutoPtr(region, mt_b.mutbl)))
|
||||
(mt_a.ty, Some(AutoPtr(r_borrow, mt_b.mutbl)))
|
||||
}
|
||||
(&ty::TyRef(_, mt_a), &ty::TyRawPtr(mt_b)) => {
|
||||
coerce_mutbls(mt_a.mutbl, mt_b.mutbl)?;
|
||||
|
@ -412,7 +412,7 @@ fn iterate_over_potentially_unsafe_regions_in_type<'a, 'b, 'gcx, 'tcx>(
|
||||
ty);
|
||||
|
||||
cx.rcx.type_must_outlive(infer::SubregionOrigin::SafeDestructor(cx.span),
|
||||
ty, ty::ReScope(cx.parent_scope));
|
||||
ty, tcx.mk_region(ty::ReScope(cx.parent_scope)));
|
||||
|
||||
return Ok(());
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ fn equate_intrinsic_type<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
|
||||
let i_ty = tcx.lookup_item_type(def_id);
|
||||
|
||||
let substs = Substs::for_item(tcx, def_id,
|
||||
|_, _| ty::ReErased,
|
||||
|_, _| tcx.mk_region(ty::ReErased),
|
||||
|def, _| tcx.mk_param_from_def(def));
|
||||
|
||||
let fty = tcx.mk_fn_def(def_id, substs, tcx.mk_bare_fn(ty::BareFnTy {
|
||||
|
@ -145,7 +145,7 @@ impl<'a, 'gcx, 'tcx> ConfirmContext<'a, 'gcx, 'tcx> {
|
||||
{
|
||||
let (autoref, unsize) = if let Some(mutbl) = pick.autoref {
|
||||
let region = self.next_region_var(infer::Autoref(self.span));
|
||||
let autoref = AutoPtr(self.tcx.mk_region(region), mutbl);
|
||||
let autoref = AutoPtr(region, mutbl);
|
||||
(Some(autoref), pick.unsize.map(|target| {
|
||||
target.adjust_for_autoref(self.tcx, Some(autoref))
|
||||
}))
|
||||
|
@ -1242,7 +1242,7 @@ impl<'a, 'gcx, 'tcx> ProbeContext<'a, 'gcx, 'tcx> {
|
||||
} else {
|
||||
// In general, during probe we erase regions. See
|
||||
// `impl_self_ty()` for an explanation.
|
||||
ty::ReErased
|
||||
self.tcx.mk_region(ty::ReErased)
|
||||
}
|
||||
}, |def, cur_substs| {
|
||||
let i = def.index as usize;
|
||||
@ -1264,7 +1264,7 @@ impl<'a, 'gcx, 'tcx> ProbeContext<'a, 'gcx, 'tcx> {
|
||||
let impl_ty = self.tcx.lookup_item_type(impl_def_id).ty;
|
||||
|
||||
let substs = Substs::for_item(self.tcx, impl_def_id,
|
||||
|_, _| ty::ReErased,
|
||||
|_, _| self.tcx.mk_region(ty::ReErased),
|
||||
|_, _| self.next_ty_var());
|
||||
|
||||
(impl_ty, substs)
|
||||
|
@ -1422,13 +1422,13 @@ impl<'a, 'gcx, 'tcx> RegionScope for FnCtxt<'a, 'gcx, 'tcx> {
|
||||
// (and anyway, within a fn body the right region may not even
|
||||
// be something the user can write explicitly, since it might
|
||||
// be some expression).
|
||||
self.next_region_var(infer::MiscVariable(span))
|
||||
*self.next_region_var(infer::MiscVariable(span))
|
||||
}
|
||||
|
||||
fn anon_regions(&self, span: Span, count: usize)
|
||||
-> Result<Vec<ty::Region>, Option<Vec<ElisionFailureInfo>>> {
|
||||
Ok((0..count).map(|_| {
|
||||
self.next_region_var(infer::MiscVariable(span))
|
||||
*self.next_region_var(infer::MiscVariable(span))
|
||||
}).collect())
|
||||
}
|
||||
}
|
||||
@ -1862,7 +1862,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
|
||||
/// outlive the region `r`.
|
||||
pub fn register_region_obligation(&self,
|
||||
ty: Ty<'tcx>,
|
||||
region: ty::Region,
|
||||
region: &'tcx ty::Region,
|
||||
cause: traits::ObligationCause<'tcx>)
|
||||
{
|
||||
let mut fulfillment_cx = self.fulfillment_cx.borrow_mut();
|
||||
@ -1893,7 +1893,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
|
||||
//
|
||||
// FIXME(#27579) all uses of this should be migrated to register_wf_obligation eventually
|
||||
let cause = traits::ObligationCause::new(span, self.body_id, code);
|
||||
self.register_region_obligation(ty, ty::ReEmpty, cause);
|
||||
self.register_region_obligation(ty, self.tcx.mk_region(ty::ReEmpty), cause);
|
||||
}
|
||||
|
||||
/// Registers obligations that all types appearing in `substs` are well-formed.
|
||||
@ -3454,7 +3454,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
|
||||
// value whose address was taken can actually be made to live
|
||||
// as long as it needs to live.
|
||||
let region = self.next_region_var(infer::AddrOfRegion(expr.span));
|
||||
tcx.mk_ref(tcx.mk_region(region), tm)
|
||||
tcx.mk_ref(region, tm)
|
||||
};
|
||||
self.write_ty(id, oprnd_t);
|
||||
}
|
||||
|
@ -169,7 +169,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
|
||||
pub struct RegionCtxt<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
|
||||
pub fcx: &'a FnCtxt<'a, 'gcx, 'tcx>,
|
||||
|
||||
region_bound_pairs: Vec<(ty::Region, GenericKind<'tcx>)>,
|
||||
region_bound_pairs: Vec<(&'tcx ty::Region, GenericKind<'tcx>)>,
|
||||
|
||||
free_region_map: FreeRegionMap,
|
||||
|
||||
@ -324,9 +324,10 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
let call_site_scope = self.call_site_scope.unwrap();
|
||||
debug!("visit_fn_body body.id {} call_site_scope: {:?}",
|
||||
body.id, call_site_scope);
|
||||
let call_site_region = self.tcx.mk_region(ty::ReScope(call_site_scope));
|
||||
self.type_of_node_must_outlive(infer::CallReturn(span),
|
||||
body.id,
|
||||
ty::ReScope(call_site_scope));
|
||||
call_site_region);
|
||||
|
||||
self.region_bound_pairs.truncate(old_region_bounds_pairs_len);
|
||||
|
||||
@ -407,8 +408,8 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
for implication in implied_bounds {
|
||||
debug!("implication: {:?}", implication);
|
||||
match implication {
|
||||
ImpliedBound::RegionSubRegion(ty::ReFree(free_a),
|
||||
ty::ReVar(vid_b)) => {
|
||||
ImpliedBound::RegionSubRegion(&ty::ReFree(free_a),
|
||||
&ty::ReVar(vid_b)) => {
|
||||
self.add_given(free_a, vid_b);
|
||||
}
|
||||
ImpliedBound::RegionSubParam(r_a, param_b) => {
|
||||
@ -476,9 +477,10 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
// variable's type enclose at least the variable's scope.
|
||||
|
||||
let var_scope = tcx.region_maps.var_scope(id);
|
||||
let var_region = self.tcx.mk_region(ty::ReScope(var_scope));
|
||||
|
||||
let origin = infer::BindingTypeIsNotValidAtDecl(span);
|
||||
self.type_of_node_must_outlive(origin, id, ty::ReScope(var_scope));
|
||||
self.type_of_node_must_outlive(origin, id, var_region);
|
||||
|
||||
let typ = self.resolve_node_type(id);
|
||||
dropck::check_safety_of_destructor_if_necessary(self, typ, span, var_scope);
|
||||
@ -525,7 +527,7 @@ impl<'a, 'gcx, 'tcx, 'v> Visitor<'v> for RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
// scope of that expression. This also guarantees basic WF.
|
||||
let expr_ty = self.resolve_node_type(expr.id);
|
||||
// the region corresponding to this expression
|
||||
let expr_region = ty::ReScope(self.tcx.region_maps.node_extent(expr.id));
|
||||
let expr_region = self.tcx.node_scope_region(expr.id);
|
||||
self.type_must_outlive(infer::ExprTypeIsNotInScope(expr_ty, expr.span),
|
||||
expr_ty, expr_region);
|
||||
|
||||
@ -713,7 +715,7 @@ impl<'a, 'gcx, 'tcx, 'v> Visitor<'v> for RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
None => self.resolve_node_type(base.id)
|
||||
};
|
||||
if let ty::TyRef(r_ptr, _) = base_ty.sty {
|
||||
self.mk_subregion_due_to_dereference(expr.span, expr_region, *r_ptr);
|
||||
self.mk_subregion_due_to_dereference(expr.span, expr_region, r_ptr);
|
||||
}
|
||||
|
||||
intravisit::walk_expr(self, expr);
|
||||
@ -780,9 +782,10 @@ impl<'a, 'gcx, 'tcx, 'v> Visitor<'v> for RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
let call_site_scope = self.call_site_scope;
|
||||
debug!("visit_expr ExprRet ret_expr.id {} call_site_scope: {:?}",
|
||||
ret_expr.id, call_site_scope);
|
||||
let call_site_region = self.tcx.mk_region(ty::ReScope(call_site_scope.unwrap()));
|
||||
self.type_of_node_must_outlive(infer::CallReturn(ret_expr.span),
|
||||
ret_expr.id,
|
||||
ty::ReScope(call_site_scope.unwrap()));
|
||||
call_site_region);
|
||||
intravisit::walk_expr(self, expr);
|
||||
}
|
||||
|
||||
@ -819,7 +822,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
/*From:*/ (&ty::TyRef(from_r, ref from_mt),
|
||||
/*To: */ &ty::TyRef(to_r, ref to_mt)) => {
|
||||
// Target cannot outlive source, naturally.
|
||||
self.sub_regions(infer::Reborrow(cast_expr.span), *to_r, *from_r);
|
||||
self.sub_regions(infer::Reborrow(cast_expr.span), to_r, from_r);
|
||||
self.walk_cast(cast_expr, from_mt.ty, to_mt.ty);
|
||||
}
|
||||
|
||||
@ -889,7 +892,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
//
|
||||
// FIXME(#6268) to support nested method calls, should be callee_id
|
||||
let callee_scope = self.tcx.region_maps.node_extent(call_expr.id);
|
||||
let callee_region = ty::ReScope(callee_scope);
|
||||
let callee_region = self.tcx.mk_region(ty::ReScope(callee_scope));
|
||||
|
||||
debug!("callee_region={:?}", callee_region);
|
||||
|
||||
@ -933,8 +936,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
derefs,
|
||||
derefd_ty);
|
||||
|
||||
let s_deref_expr = self.tcx.region_maps.node_extent(deref_expr.id);
|
||||
let r_deref_expr = ty::ReScope(s_deref_expr);
|
||||
let r_deref_expr = self.tcx.node_scope_region(deref_expr.id);
|
||||
for i in 0..derefs {
|
||||
let method_call = MethodCall::autoderef(deref_expr.id, i as u32);
|
||||
debug!("constrain_autoderefs: method_call={:?} (of {:?} total)", method_call, derefs);
|
||||
@ -989,7 +991,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
|
||||
if let ty::TyRef(r_ptr, _) = derefd_ty.sty {
|
||||
self.mk_subregion_due_to_dereference(deref_expr.span,
|
||||
r_deref_expr, *r_ptr);
|
||||
r_deref_expr, r_ptr);
|
||||
}
|
||||
|
||||
match derefd_ty.builtin_deref(true, ty::NoPreference) {
|
||||
@ -1003,8 +1005,8 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
|
||||
pub fn mk_subregion_due_to_dereference(&mut self,
|
||||
deref_span: Span,
|
||||
minimum_lifetime: ty::Region,
|
||||
maximum_lifetime: ty::Region) {
|
||||
minimum_lifetime: &'tcx ty::Region,
|
||||
maximum_lifetime: &'tcx ty::Region) {
|
||||
self.sub_regions(infer::DerefPointer(deref_span),
|
||||
minimum_lifetime, maximum_lifetime)
|
||||
}
|
||||
@ -1014,7 +1016,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
span: Span) {
|
||||
match cmt.cat {
|
||||
Categorization::Rvalue(region) => {
|
||||
match region {
|
||||
match *region {
|
||||
ty::ReScope(rvalue_scope) => {
|
||||
let typ = self.resolve_type(cmt.ty);
|
||||
dropck::check_safety_of_destructor_if_necessary(self,
|
||||
@ -1023,7 +1025,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
rvalue_scope);
|
||||
}
|
||||
ty::ReStatic => {}
|
||||
region => {
|
||||
_ => {
|
||||
span_bug!(span,
|
||||
"unexpected rvalue region in rvalue \
|
||||
destructor safety checking: `{:?}`",
|
||||
@ -1049,7 +1051,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
match mt.ty.sty {
|
||||
ty::TySlice(_) | ty::TyStr => {
|
||||
self.sub_regions(infer::IndexSlice(index_expr.span),
|
||||
r_index_expr, *r_ptr);
|
||||
self.tcx.mk_region(r_index_expr), r_ptr);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
@ -1061,7 +1063,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
fn type_of_node_must_outlive(&mut self,
|
||||
origin: infer::SubregionOrigin<'tcx>,
|
||||
id: ast::NodeId,
|
||||
minimum_lifetime: ty::Region)
|
||||
minimum_lifetime: &'tcx ty::Region)
|
||||
{
|
||||
let tcx = self.tcx;
|
||||
|
||||
@ -1132,7 +1134,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
let mc = mc::MemCategorizationContext::new(self);
|
||||
for arg in args {
|
||||
let arg_ty = self.node_ty(arg.id);
|
||||
let re_scope = ty::ReScope(body_scope);
|
||||
let re_scope = self.tcx.mk_region(ty::ReScope(body_scope));
|
||||
let arg_cmt = mc.cat_rvalue(arg.id, arg.ty.span, re_scope, arg_ty);
|
||||
debug!("arg_ty={:?} arg_cmt={:?} arg={:?}",
|
||||
arg_ty,
|
||||
@ -1168,7 +1170,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
fn link_autoref(&self,
|
||||
expr: &hir::Expr,
|
||||
autoderefs: usize,
|
||||
autoref: &adjustment::AutoRef)
|
||||
autoref: &adjustment::AutoRef<'tcx>)
|
||||
{
|
||||
debug!("link_autoref(autoref={:?})", autoref);
|
||||
let mc = mc::MemCategorizationContext::new(self);
|
||||
@ -1182,8 +1184,8 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
}
|
||||
|
||||
adjustment::AutoUnsafe(m) => {
|
||||
let r = ty::ReScope(self.tcx.region_maps.node_extent(expr.id));
|
||||
self.link_region(expr.span, &r, ty::BorrowKind::from_mutbl(m), expr_cmt);
|
||||
let r = self.tcx.node_scope_region(expr.id);
|
||||
self.link_region(expr.span, r, ty::BorrowKind::from_mutbl(m), expr_cmt);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1197,8 +1199,8 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
expr, callee_scope);
|
||||
let mc = mc::MemCategorizationContext::new(self);
|
||||
let expr_cmt = ignore_err!(mc.cat_expr(expr));
|
||||
let borrow_region = ty::ReScope(callee_scope);
|
||||
self.link_region(expr.span, &borrow_region, ty::ImmBorrow, expr_cmt);
|
||||
let borrow_region = self.tcx.mk_region(ty::ReScope(callee_scope));
|
||||
self.link_region(expr.span, borrow_region, ty::ImmBorrow, expr_cmt);
|
||||
}
|
||||
|
||||
/// Like `link_region()`, except that the region is extracted from the type of `id`,
|
||||
@ -1212,9 +1214,9 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
id, mutbl, cmt_borrowed);
|
||||
|
||||
let rptr_ty = self.resolve_node_type(id);
|
||||
if let ty::TyRef(&r, _) = rptr_ty.sty {
|
||||
if let ty::TyRef(r, _) = rptr_ty.sty {
|
||||
debug!("rptr_ty={}", rptr_ty);
|
||||
self.link_region(span, &r, ty::BorrowKind::from_mutbl(mutbl),
|
||||
self.link_region(span, r, ty::BorrowKind::from_mutbl(mutbl),
|
||||
cmt_borrowed);
|
||||
}
|
||||
}
|
||||
@ -1225,14 +1227,14 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
/// between regions, as explained in `link_reborrowed_region()`.
|
||||
fn link_region(&self,
|
||||
span: Span,
|
||||
borrow_region: &ty::Region,
|
||||
borrow_region: &'tcx ty::Region,
|
||||
borrow_kind: ty::BorrowKind,
|
||||
borrow_cmt: mc::cmt<'tcx>) {
|
||||
let mut borrow_cmt = borrow_cmt;
|
||||
let mut borrow_kind = borrow_kind;
|
||||
|
||||
let origin = infer::DataBorrowed(borrow_cmt.ty, span);
|
||||
self.type_must_outlive(origin, borrow_cmt.ty, *borrow_region);
|
||||
self.type_must_outlive(origin, borrow_cmt.ty, borrow_region);
|
||||
|
||||
loop {
|
||||
debug!("link_region(borrow_region={:?}, borrow_kind={:?}, borrow_cmt={:?})",
|
||||
@ -1322,10 +1324,10 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
/// recurse and process `ref_cmt` (see case 2 above).
|
||||
fn link_reborrowed_region(&self,
|
||||
span: Span,
|
||||
borrow_region: &ty::Region,
|
||||
borrow_region: &'tcx ty::Region,
|
||||
borrow_kind: ty::BorrowKind,
|
||||
ref_cmt: mc::cmt<'tcx>,
|
||||
ref_region: ty::Region,
|
||||
ref_region: &'tcx ty::Region,
|
||||
mut ref_kind: ty::BorrowKind,
|
||||
note: mc::Note)
|
||||
-> Option<(mc::cmt<'tcx>, ty::BorrowKind)>
|
||||
@ -1364,7 +1366,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
debug!("link_reborrowed_region: {:?} <= {:?}",
|
||||
borrow_region,
|
||||
ref_region);
|
||||
self.sub_regions(cause, *borrow_region, ref_region);
|
||||
self.sub_regions(cause, borrow_region, ref_region);
|
||||
|
||||
// If we end up needing to recurse and establish a region link
|
||||
// with `ref_cmt`, calculate what borrow kind we will end up
|
||||
@ -1436,7 +1438,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
origin: infer::ParameterOrigin,
|
||||
substs: &Substs<'tcx>,
|
||||
expr_span: Span,
|
||||
expr_region: ty::Region) {
|
||||
expr_region: &'tcx ty::Region) {
|
||||
debug!("substs_wf_in_scope(substs={:?}, \
|
||||
expr_region={:?}, \
|
||||
origin={:?}, \
|
||||
@ -1461,7 +1463,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
pub fn type_must_outlive(&self,
|
||||
origin: infer::SubregionOrigin<'tcx>,
|
||||
ty: Ty<'tcx>,
|
||||
region: ty::Region)
|
||||
region: &'tcx ty::Region)
|
||||
{
|
||||
let ty = self.resolve_type(ty);
|
||||
|
||||
@ -1479,7 +1481,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
fn components_must_outlive(&self,
|
||||
origin: infer::SubregionOrigin<'tcx>,
|
||||
components: Vec<ty::outlives::Component<'tcx>>,
|
||||
region: ty::Region)
|
||||
region: &'tcx ty::Region)
|
||||
{
|
||||
for component in components {
|
||||
let origin = origin.clone();
|
||||
@ -1510,7 +1512,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
|
||||
fn param_ty_must_outlive(&self,
|
||||
origin: infer::SubregionOrigin<'tcx>,
|
||||
region: ty::Region,
|
||||
region: &'tcx ty::Region,
|
||||
param_ty: ty::ParamTy) {
|
||||
debug!("param_ty_must_outlive(region={:?}, param_ty={:?}, origin={:?})",
|
||||
region, param_ty, origin);
|
||||
@ -1522,7 +1524,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
|
||||
fn projection_must_outlive(&self,
|
||||
origin: infer::SubregionOrigin<'tcx>,
|
||||
region: ty::Region,
|
||||
region: &'tcx ty::Region,
|
||||
projection_ty: ty::ProjectionTy<'tcx>)
|
||||
{
|
||||
debug!("projection_must_outlive(region={:?}, projection_ty={:?}, origin={:?})",
|
||||
@ -1552,7 +1554,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
|
||||
// If we know that the projection outlives 'static, then we're
|
||||
// done here.
|
||||
if env_bounds.contains(&ty::ReStatic) {
|
||||
if env_bounds.contains(&&ty::ReStatic) {
|
||||
debug!("projection_must_outlive: 'static as declared bound");
|
||||
return;
|
||||
}
|
||||
@ -1597,7 +1599,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
if !env_bounds.is_empty() && env_bounds[1..].iter().all(|b| *b == env_bounds[0]) {
|
||||
let unique_bound = env_bounds[0];
|
||||
debug!("projection_must_outlive: unique declared bound = {:?}", unique_bound);
|
||||
if projection_ty.trait_ref.substs.regions().any(|r| env_bounds.contains(r)) {
|
||||
if projection_ty.trait_ref.substs.regions().any(|r| env_bounds.contains(&r)) {
|
||||
debug!("projection_must_outlive: unique declared bound appears in trait ref");
|
||||
self.sub_regions(origin.clone(), region, unique_bound);
|
||||
return;
|
||||
@ -1614,7 +1616,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
self.verify_generic_bound(origin, generic.clone(), region, verify_bound);
|
||||
}
|
||||
|
||||
fn type_bound(&self, span: Span, ty: Ty<'tcx>) -> VerifyBound {
|
||||
fn type_bound(&self, span: Span, ty: Ty<'tcx>) -> VerifyBound<'tcx> {
|
||||
match ty.sty {
|
||||
ty::TyParam(p) => {
|
||||
self.param_bound(p)
|
||||
@ -1629,7 +1631,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
fn param_bound(&self, param_ty: ty::ParamTy) -> VerifyBound {
|
||||
fn param_bound(&self, param_ty: ty::ParamTy) -> VerifyBound<'tcx> {
|
||||
let param_env = &self.parameter_environment;
|
||||
|
||||
debug!("param_bound(param_ty={:?})",
|
||||
@ -1647,7 +1649,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
fn projection_declared_bounds(&self,
|
||||
span: Span,
|
||||
projection_ty: ty::ProjectionTy<'tcx>)
|
||||
-> Vec<ty::Region>
|
||||
-> Vec<&'tcx ty::Region>
|
||||
{
|
||||
// First assemble bounds from where clauses and traits.
|
||||
|
||||
@ -1662,9 +1664,9 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
|
||||
fn projection_bound(&self,
|
||||
span: Span,
|
||||
declared_bounds: Vec<ty::Region>,
|
||||
declared_bounds: Vec<&'tcx ty::Region>,
|
||||
projection_ty: ty::ProjectionTy<'tcx>)
|
||||
-> VerifyBound {
|
||||
-> VerifyBound<'tcx> {
|
||||
debug!("projection_bound(declared_bounds={:?}, projection_ty={:?})",
|
||||
declared_bounds, projection_ty);
|
||||
|
||||
@ -1676,7 +1678,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
VerifyBound::AnyRegion(declared_bounds).or(recursive_bound)
|
||||
}
|
||||
|
||||
fn recursive_type_bound(&self, span: Span, ty: Ty<'tcx>) -> VerifyBound {
|
||||
fn recursive_type_bound(&self, span: Span, ty: Ty<'tcx>) -> VerifyBound<'tcx> {
|
||||
let mut bounds = vec![];
|
||||
|
||||
for subty in ty.walk_shallow() {
|
||||
@ -1698,7 +1700,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
}
|
||||
|
||||
fn declared_generic_bounds_from_env(&self, generic: GenericKind<'tcx>)
|
||||
-> Vec<ty::Region>
|
||||
-> Vec<&'tcx ty::Region>
|
||||
{
|
||||
let param_env = &self.parameter_environment;
|
||||
|
||||
@ -1732,7 +1734,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
|
||||
fn declared_projection_bounds_from_trait(&self,
|
||||
span: Span,
|
||||
projection_ty: ty::ProjectionTy<'tcx>)
|
||||
-> Vec<ty::Region>
|
||||
-> Vec<&'tcx ty::Region>
|
||||
{
|
||||
debug!("projection_bounds(projection_ty={:?})",
|
||||
projection_ty);
|
||||
|
@ -252,7 +252,7 @@ impl<'a, 'gcx, 'tcx> AdjustBorrowKind<'a, 'gcx, 'tcx> {
|
||||
match capture {
|
||||
ty::UpvarCapture::ByValue => freevar_ty,
|
||||
ty::UpvarCapture::ByRef(borrow) =>
|
||||
tcx.mk_ref(tcx.mk_region(borrow.region),
|
||||
tcx.mk_ref(borrow.region,
|
||||
ty::TypeAndMut {
|
||||
ty: freevar_ty,
|
||||
mutbl: borrow.kind.to_mutbl_lossy(),
|
||||
@ -536,7 +536,7 @@ impl<'a, 'gcx, 'tcx> euv::Delegate<'tcx> for AdjustBorrowKind<'a, 'gcx, 'tcx> {
|
||||
borrow_id: ast::NodeId,
|
||||
_borrow_span: Span,
|
||||
cmt: mc::cmt<'tcx>,
|
||||
_loan_region: ty::Region,
|
||||
_loan_region: &'tcx ty::Region,
|
||||
bk: ty::BorrowKind,
|
||||
_loan_cause: euv::LoanCause)
|
||||
{
|
||||
|
@ -416,7 +416,7 @@ impl<'ccx, 'gcx> CheckTypeWellFormedVisitor<'ccx, 'gcx> {
|
||||
ty::ExplicitSelfCategory::Static => return,
|
||||
ty::ExplicitSelfCategory::ByValue => self_ty,
|
||||
ty::ExplicitSelfCategory::ByReference(region, mutability) => {
|
||||
fcx.tcx.mk_ref(fcx.tcx.mk_region(region), ty::TypeAndMut {
|
||||
fcx.tcx.mk_ref(region, ty::TypeAndMut {
|
||||
ty: self_ty,
|
||||
mutbl: mutability
|
||||
})
|
||||
|
@ -87,7 +87,7 @@ struct WritebackCx<'cx, 'gcx: 'cx+'tcx, 'tcx: 'cx> {
|
||||
// early-bound versions of them, visible from the
|
||||
// outside of the function. This is needed by, and
|
||||
// only populated if there are any `impl Trait`.
|
||||
free_to_bound_regions: DefIdMap<ty::Region>
|
||||
free_to_bound_regions: DefIdMap<&'gcx ty::Region>
|
||||
}
|
||||
|
||||
impl<'cx, 'gcx, 'tcx> WritebackCx<'cx, 'gcx, 'tcx> {
|
||||
@ -102,16 +102,17 @@ impl<'cx, 'gcx, 'tcx> WritebackCx<'cx, 'gcx, 'tcx> {
|
||||
return wbcx;
|
||||
}
|
||||
|
||||
let gcx = fcx.tcx.global_tcx();
|
||||
let free_substs = fcx.parameter_environment.free_substs;
|
||||
for (i, r) in free_substs.regions().enumerate() {
|
||||
match *r {
|
||||
ty::ReFree(ty::FreeRegion {
|
||||
bound_region: ty::BoundRegion::BrNamed(def_id, name, _), ..
|
||||
}) => {
|
||||
let bound_region = ty::ReEarlyBound(ty::EarlyBoundRegion {
|
||||
let bound_region = gcx.mk_region(ty::ReEarlyBound(ty::EarlyBoundRegion {
|
||||
index: i as u32,
|
||||
name: name,
|
||||
});
|
||||
}));
|
||||
wbcx.free_to_bound_regions.insert(def_id, bound_region);
|
||||
}
|
||||
_ => {
|
||||
@ -311,9 +312,9 @@ impl<'cx, 'gcx, 'tcx> WritebackCx<'cx, 'gcx, 'tcx> {
|
||||
// Convert the type from the function into a type valid outside
|
||||
// the function, by replacing free regions with early-bound ones.
|
||||
let outside_ty = gcx.fold_regions(&inside_ty, &mut false, |r, _| {
|
||||
match r {
|
||||
match *r {
|
||||
// 'static is valid everywhere.
|
||||
ty::ReStatic => ty::ReStatic,
|
||||
ty::ReStatic => gcx.mk_region(ty::ReStatic),
|
||||
|
||||
// Free regions that come from early-bound regions are valid.
|
||||
ty::ReFree(ty::FreeRegion {
|
||||
@ -331,7 +332,7 @@ impl<'cx, 'gcx, 'tcx> WritebackCx<'cx, 'gcx, 'tcx> {
|
||||
span_err!(self.tcx().sess, span, E0564,
|
||||
"only named lifetimes are allowed in `impl Trait`, \
|
||||
but `{}` was found in the type `{}`", r, inside_ty);
|
||||
ty::ReStatic
|
||||
gcx.mk_region(ty::ReStatic)
|
||||
}
|
||||
|
||||
ty::ReVar(_) |
|
||||
@ -626,12 +627,12 @@ impl<'cx, 'gcx, 'tcx> TypeFolder<'gcx, 'tcx> for Resolver<'cx, 'gcx, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
fn fold_region(&mut self, r: ty::Region) -> ty::Region {
|
||||
fn fold_region(&mut self, r: &'tcx ty::Region) -> &'tcx ty::Region {
|
||||
match self.infcx.fully_resolve(&r) {
|
||||
Ok(r) => r,
|
||||
Err(e) => {
|
||||
self.report_error(e);
|
||||
ty::ReStatic
|
||||
self.tcx.mk_region(ty::ReStatic)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -413,7 +413,7 @@ impl<'a, 'gcx, 'tcx> CoherenceChecker<'a, 'gcx, 'tcx> {
|
||||
(&ty::TyBox(a), &ty::TyBox(b)) => (a, b, unsize_trait, None),
|
||||
|
||||
(&ty::TyRef(r_a, mt_a), &ty::TyRef(r_b, mt_b)) => {
|
||||
infcx.sub_regions(infer::RelateObjectBound(span), *r_b, *r_a);
|
||||
infcx.sub_regions(infer::RelateObjectBound(span), r_b, r_a);
|
||||
check_mutbl(mt_a, mt_b, &|ty| tcx.mk_imm_ref(r_b, ty))
|
||||
}
|
||||
|
||||
|
@ -1919,7 +1919,7 @@ fn compute_object_lifetime_default<'a,'tcx>(ccx: &CrateCtxt<'a,'tcx>,
|
||||
param_id: ast::NodeId,
|
||||
param_bounds: &[hir::TyParamBound],
|
||||
where_clause: &hir::WhereClause)
|
||||
-> ty::ObjectLifetimeDefault
|
||||
-> ty::ObjectLifetimeDefault<'tcx>
|
||||
{
|
||||
let inline_bounds = from_bounds(ccx, param_bounds);
|
||||
let where_bounds = from_predicates(ccx, param_id, &where_clause.predicates);
|
||||
@ -1937,7 +1937,7 @@ fn compute_object_lifetime_default<'a,'tcx>(ccx: &CrateCtxt<'a,'tcx>,
|
||||
|
||||
fn from_bounds<'a,'tcx>(ccx: &CrateCtxt<'a,'tcx>,
|
||||
bounds: &[hir::TyParamBound])
|
||||
-> Vec<ty::Region>
|
||||
-> Vec<&'tcx ty::Region>
|
||||
{
|
||||
bounds.iter()
|
||||
.filter_map(|bound| {
|
||||
@ -1954,7 +1954,7 @@ fn compute_object_lifetime_default<'a,'tcx>(ccx: &CrateCtxt<'a,'tcx>,
|
||||
fn from_predicates<'a,'tcx>(ccx: &CrateCtxt<'a,'tcx>,
|
||||
param_id: ast::NodeId,
|
||||
predicates: &[hir::WherePredicate])
|
||||
-> Vec<ty::Region>
|
||||
-> Vec<&'tcx ty::Region>
|
||||
{
|
||||
predicates.iter()
|
||||
.flat_map(|predicate| {
|
||||
@ -2126,7 +2126,7 @@ pub fn mk_item_substs<'gcx: 'tcx, 'tcx>(astconv: &AstConv<'gcx, 'tcx>,
|
||||
}
|
||||
|
||||
Substs::for_item(tcx, def_id,
|
||||
|def, _| def.to_early_bound_region(),
|
||||
|def, _| tcx.mk_region(def.to_early_bound_region()),
|
||||
|def, _| tcx.mk_param_from_def(def))
|
||||
}
|
||||
|
||||
|
@ -58,8 +58,8 @@ impl<'tcx> TypeVisitor<'tcx> for ParameterCollector {
|
||||
t.super_visit_with(self)
|
||||
}
|
||||
|
||||
fn visit_region(&mut self, r: ty::Region) -> bool {
|
||||
match r {
|
||||
fn visit_region(&mut self, r: &'tcx ty::Region) -> bool {
|
||||
match *r {
|
||||
ty::ReEarlyBound(data) => {
|
||||
self.parameters.push(Parameter::Region(data));
|
||||
}
|
||||
|
@ -257,12 +257,12 @@ impl RegionScope for BindingRscope {
|
||||
/// A scope which overrides the default object lifetime but has no other effect.
|
||||
pub struct ObjectLifetimeDefaultRscope<'r> {
|
||||
base_scope: &'r (RegionScope+'r),
|
||||
default: ty::ObjectLifetimeDefault,
|
||||
default: ty::ObjectLifetimeDefault<'r>,
|
||||
}
|
||||
|
||||
impl<'r> ObjectLifetimeDefaultRscope<'r> {
|
||||
pub fn new(base_scope: &'r (RegionScope+'r),
|
||||
default: ty::ObjectLifetimeDefault)
|
||||
default: ty::ObjectLifetimeDefault<'r>)
|
||||
-> ObjectLifetimeDefaultRscope<'r>
|
||||
{
|
||||
ObjectLifetimeDefaultRscope {
|
||||
@ -283,7 +283,7 @@ impl<'r> RegionScope for ObjectLifetimeDefaultRscope<'r> {
|
||||
Some(self.base_object_lifetime_default(span)),
|
||||
|
||||
ty::ObjectLifetimeDefault::Specific(r) =>
|
||||
Some(r),
|
||||
Some(*r),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -483,9 +483,9 @@ impl<'a, 'tcx> ConstraintContext<'a, 'tcx> {
|
||||
/// context with ambient variance `variance`
|
||||
fn add_constraints_from_region(&mut self,
|
||||
generics: &ty::Generics<'tcx>,
|
||||
region: ty::Region,
|
||||
region: &'tcx ty::Region,
|
||||
variance: VarianceTermPtr<'a>) {
|
||||
match region {
|
||||
match *region {
|
||||
ty::ReEarlyBound(ref data) => {
|
||||
assert_eq!(generics.parent, None);
|
||||
assert!((data.index as usize) < generics.regions.len());
|
||||
|
@ -821,7 +821,7 @@ impl Clean<Lifetime> for hir::LifetimeDef {
|
||||
}
|
||||
}
|
||||
|
||||
impl Clean<Lifetime> for ty::RegionParameterDef {
|
||||
impl<'tcx> Clean<Lifetime> for ty::RegionParameterDef<'tcx> {
|
||||
fn clean(&self, _: &DocContext) -> Lifetime {
|
||||
Lifetime(self.name.to_string())
|
||||
}
|
||||
@ -913,7 +913,7 @@ impl<'tcx> Clean<WherePredicate> for ty::EquatePredicate<'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
impl Clean<WherePredicate> for ty::OutlivesPredicate<ty::Region, ty::Region> {
|
||||
impl<'tcx> Clean<WherePredicate> for ty::OutlivesPredicate<&'tcx ty::Region, &'tcx ty::Region> {
|
||||
fn clean(&self, cx: &DocContext) -> WherePredicate {
|
||||
let ty::OutlivesPredicate(ref a, ref b) = *self;
|
||||
WherePredicate::RegionPredicate {
|
||||
@ -923,7 +923,7 @@ impl Clean<WherePredicate> for ty::OutlivesPredicate<ty::Region, ty::Region> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Clean<WherePredicate> for ty::OutlivesPredicate<ty::Ty<'tcx>, ty::Region> {
|
||||
impl<'tcx> Clean<WherePredicate> for ty::OutlivesPredicate<ty::Ty<'tcx>, &'tcx ty::Region> {
|
||||
fn clean(&self, cx: &DocContext) -> WherePredicate {
|
||||
let ty::OutlivesPredicate(ref ty, ref lt) = *self;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user