// be obvious to the user -- not to mention the naive notion
// of dependencies, which doesn't account for the locations of
// contraints at all. But it will do for now.
- for constraint in &self.constraints {
- if constraint.sub == fr2 && influenced_fr1[constraint.sup] {
- return constraint.span;
- }
- }
-
- bug!(
- "could not find any constraint to blame for {:?}: {:?}",
- fr1,
- fr2
- );
+ let relevant_constraint = self.constraints
+ .iter()
+ .filter_map(|constraint| {
+ if constraint.sub != fr2 {
+ None
+ } else {
+ influenced_fr1[constraint.sup]
+ .map(|distance| (distance, constraint.span))
+ }
+ })
+ .min() // constraining fr1 with fewer hops *ought* to be more obvious
+ .map(|(_dist, span)| span);
+
+ relevant_constraint.unwrap_or_else(|| {
+ bug!(
+ "could not find any constraint to blame for {:?}: {:?}",
+ fr1,
+ fr2
+ );
+ })
}
/// Finds all regions whose values `'a` may depend on in some way.
- /// Basically if there exists a constraint `'a: 'b @ P`, then `'b`
- /// and `dependencies('b)` will be in the final set.
+ /// For each region, returns either `None` (does not influence
+ /// `'a`) or `Some(d)` which indicates that it influences `'a`
+ /// with distinct `d` (minimum number of edges that must be
+ /// traversed).
///
/// Used during error reporting, extremely naive and inefficient.
- fn dependencies(&self, r0: RegionVid) -> IndexVec<RegionVid, bool> {
- let mut result_set = IndexVec::from_elem(false, &self.definitions);
+ fn dependencies(&self, r0: RegionVid) -> IndexVec<RegionVid, Option<usize>> {
+ let mut result_set = IndexVec::from_elem(None, &self.definitions);
let mut changed = true;
- result_set[r0] = true;
+ result_set[r0] = Some(0); // distance 0 from `r0`
while changed {
changed = false;
for constraint in &self.constraints {
- if result_set[constraint.sup] {
- if !result_set[constraint.sub] {
- result_set[constraint.sub] = true;
+ if let Some(n) = result_set[constraint.sup] {
+ let m = n + 1;
+ if result_set[constraint.sub]
+ .map(|distance| m < distance)
+ .unwrap_or(true)
+ {
+ result_set[constraint.sub] = Some(m);
changed = true;
}
}
value: &T,
) -> T
where
- T: TypeFoldable<'tcx>
+ T: TypeFoldable<'tcx>,
{
infcx.tcx.fold_regions(value, &mut false, |r, _depth| {
if let ty::ReClosureBound(vid) = r {
closure_mapping[*vid]
} else {
- bug!("subst_closure_mapping: encountered non-closure bound free region {:?}", r)
+ bug!(
+ "subst_closure_mapping: encountered non-closure bound free region {:?}",
+ r
+ )
}
})
}
fn bar<'a, 'b>() -> fn(&'a u32, &'b u32) -> &'a u32 {
let g: fn(_, _) -> _ = |_x, y| y;
+ //~^ ERROR free region `'b` does not outlive free region `'a`
g
//~^ WARNING not reporting region error due to -Znll
- //~| ERROR free region `'b` does not outlive free region `'a`
}
fn main() {}
// as part of checking the `ReifyFnPointer`.
let f: fn(_) -> _ = foo;
//~^ WARNING not reporting region error due to -Znll
+ //~| ERROR free region `'_#1r` does not outlive free region `'static`
f(x)
- //~^ ERROR free region `'_#1r` does not outlive free region `'static`
}
fn main() {}
// in `g`. These are related via the `UnsafeFnPointer` cast.
let g: unsafe fn(_) -> _ = f;
//~^ WARNING not reporting region error due to -Znll
+ //~| ERROR free region `'_#1r` does not outlive free region `'static`
unsafe { g(input) }
- //~^ ERROR free region `'_#1r` does not outlive free region `'static`
}
fn main() {}
// Only works if 'x: 'y:
let p = x.get();
//~^ WARN not reporting region error due to -Znll
+ //~| ERROR free region `'_#5r` does not outlive free region `'_#6r`
demand_y(x, y, p)
- //~^ ERROR free region `'_#5r` does not outlive free region `'_#6r`
},
);
}
| ^^^^^^^
error: free region `'_#5r` does not outlive free region `'_#6r`
- --> $DIR/propagate-approximated-fail-no-postdom.rs:57:25
+ --> $DIR/propagate-approximated-fail-no-postdom.rs:55:17
|
-57 | demand_y(x, y, p)
- | ^
+55 | let p = x.get();
+ | ^
note: No external requirements
--> $DIR/propagate-approximated-fail-no-postdom.rs:53:9
54 | | // Only works if 'x: 'y:
55 | | let p = x.get();
56 | | //~^ WARN not reporting region error due to -Znll
-57 | | demand_y(x, y, p)
-58 | | //~^ ERROR free region `'_#5r` does not outlive free region `'_#6r`
+57 | | //~| ERROR free region `'_#5r` does not outlive free region `'_#6r`
+58 | | demand_y(x, y, p)
59 | | },
| |_________^
|
= note: where '_#1r: '_#2r
error: free region `'_#1r` does not outlive free region `'_#2r`
- --> $DIR/propagate-approximated-ref.rs:53:38
+ --> $DIR/propagate-approximated-ref.rs:53:29
|
53 | establish_relationships(&cell_a, &cell_b, |_outlives1, _outlives2, x, y| {
- | ^^^^^^^
+ | ^^^^^^^
note: No external requirements
--> $DIR/propagate-approximated-ref.rs:52:1
| ^^^^^^^^^^^^^^^^^^^^^^^
error: free region `'_#6r` does not outlive free region `'_#4r`
- --> $DIR/propagate-approximated-to-empty.rs:41:21
+ --> $DIR/propagate-approximated-to-empty.rs:41:18
|
41 | demand_y(x, y, x.get())
- | ^
+ | ^
note: No external requirements
--> $DIR/propagate-approximated-to-empty.rs:39:47
= note: where '_#1r: '_#2r
error: free region `'_#1r` does not outlive free region `'_#2r`
- --> $DIR/propagate-approximated-val.rs:46:37
+ --> $DIR/propagate-approximated-val.rs:46:29
|
46 | establish_relationships(cell_a, cell_b, |outlives1, outlives2, x, y| {
- | ^^^^^^
+ | ^^^^^^
note: No external requirements
--> $DIR/propagate-approximated-val.rs:45:1
T: Trait<'a>,
{
establish_relationships(value, |value| {
+ //~^ ERROR failed type test
+
// This function call requires that
//
// (a) T: Trait<'a>
require(value);
//~^ WARNING not reporting region error due to -Znll
- //~| ERROR failed type test
});
}
warning: not reporting region error due to -Znll
- --> $DIR/propagate-from-trait-match.rs:53:9
+ --> $DIR/propagate-from-trait-match.rs:55:9
|
-53 | require(value);
+55 | require(value);
| ^^^^^^^
note: External requirements
|
42 | establish_relationships(value, |value| {
| ____________________________________^
-43 | | // This function call requires that
-44 | | //
-45 | | // (a) T: Trait<'a>
+43 | | //~^ ERROR failed type test
+44 | |
+45 | | // This function call requires that
... |
-55 | | //~| ERROR failed type test
-56 | | });
+56 | | //~^ WARNING not reporting region error due to -Znll
+57 | | });
| |_____^
|
= note: defining type: DefId(0/1:16 ~ propagate_from_trait_match[317d]::supply[0]::{{closure}}[0]) with closure substs [
= note: number of external vids: 2
= note: where T: '_#1r
-error: failed type test: TypeTest { generic_kind: T/#1, lower_bound: '_#3r, point: bb0[3], span: $DIR/propagate-from-trait-match.rs:42:36: 56:6, test: IsOutlivedByAnyRegionIn(['_#2r]) }
+error: failed type test: TypeTest { generic_kind: T/#1, lower_bound: '_#3r, point: bb0[3], span: $DIR/propagate-from-trait-match.rs:42:36: 57:6, test: IsOutlivedByAnyRegionIn(['_#2r]) }
--> $DIR/propagate-from-trait-match.rs:42:36
|
42 | establish_relationships(value, |value| {
| ____________________________________^
-43 | | // This function call requires that
-44 | | //
-45 | | // (a) T: Trait<'a>
+43 | | //~^ ERROR failed type test
+44 | |
+45 | | // This function call requires that
... |
-55 | | //~| ERROR failed type test
-56 | | });
+56 | | //~^ WARNING not reporting region error due to -Znll
+57 | | });
| |_____^
note: No external requirements
40 | | T: Trait<'a>,
41 | | {
... |
-56 | | });
-57 | | }
+57 | | });
+58 | | }
| |_^
|
= note: defining type: DefId(0/0:6 ~ propagate_from_trait_match[317d]::supply[0]) with substs [