Rollup merge of #78545 - jackh726:anonymous, r=oli-obk

Make anonymous binders start at 0

A few changes to some test outputs, but these actually look *more* correct to me.
This commit is contained in:
Yuki Okushi 2020-10-30 18:00:56 +09:00 committed by GitHub
commit 05f80f03a9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 24 additions and 32 deletions

View file

@ -684,7 +684,7 @@ impl<'tcx> TyCtxt<'tcx> {
} }
/// Rewrite any late-bound regions so that they are anonymous. Region numbers are /// Rewrite any late-bound regions so that they are anonymous. Region numbers are
/// assigned starting at 1 and increasing monotonically in the order traversed /// assigned starting at 0 and increasing monotonically in the order traversed
/// by the fold operation. /// by the fold operation.
/// ///
/// The chief purpose of this function is to canonicalize regions so that two /// The chief purpose of this function is to canonicalize regions so that two
@ -698,8 +698,9 @@ impl<'tcx> TyCtxt<'tcx> {
let mut counter = 0; let mut counter = 0;
Binder::bind( Binder::bind(
self.replace_late_bound_regions(sig, |_| { self.replace_late_bound_regions(sig, |_| {
let r = self.mk_region(ty::ReLateBound(ty::INNERMOST, ty::BrAnon(counter)));
counter += 1; counter += 1;
self.mk_region(ty::ReLateBound(ty::INNERMOST, ty::BrAnon(counter))) r
}) })
.0, .0,
) )

View file

@ -200,15 +200,9 @@ impl SymbolMangler<'tcx> {
let lifetimes = regions let lifetimes = regions
.into_iter() .into_iter()
.map(|br| { .map(|br| match br {
match br { ty::BrAnon(i) => i,
ty::BrAnon(i) => { _ => bug!("symbol_names: non-anonymized region `{:?}` in `{:?}`", br, value),
// FIXME(eddyb) for some reason, `anonymize_late_bound_regions` starts at `1`.
assert_ne!(i, 0);
i - 1
}
_ => bug!("symbol_names: non-anonymized region `{:?}` in `{:?}`", br, value),
}
}) })
.max() .max()
.map_or(0, |max| max + 1); .map_or(0, |max| max + 1);
@ -327,10 +321,6 @@ impl Printer<'tcx> for SymbolMangler<'tcx> {
// Late-bound lifetimes use indices starting at 1, // Late-bound lifetimes use indices starting at 1,
// see `BinderLevel` for more details. // see `BinderLevel` for more details.
ty::ReLateBound(debruijn, ty::BrAnon(i)) => { ty::ReLateBound(debruijn, ty::BrAnon(i)) => {
// FIXME(eddyb) for some reason, `anonymize_late_bound_regions` starts at `1`.
assert_ne!(i, 0);
let i = i - 1;
let binder = &self.binders[self.binders.len() - 1 - debruijn.index()]; let binder = &self.binders[self.binders.len() - 1 - debruijn.index()];
let depth = binder.lifetime_depths.start + i; let depth = binder.lifetime_depths.start + i;

View file

@ -186,8 +186,9 @@ pub fn resolve_interior<'a, 'tcx>(
// which means that none of the regions inside relate to any other, even if // which means that none of the regions inside relate to any other, even if
// typeck had previously found constraints that would cause them to be related. // typeck had previously found constraints that would cause them to be related.
let folded = fcx.tcx.fold_regions(&erased, &mut false, |_, current_depth| { let folded = fcx.tcx.fold_regions(&erased, &mut false, |_, current_depth| {
let r = fcx.tcx.mk_region(ty::ReLateBound(current_depth, ty::BrAnon(counter)));
counter += 1; counter += 1;
fcx.tcx.mk_region(ty::ReLateBound(current_depth, ty::BrAnon(counter))) r
}); });
cause.ty = folded; cause.ty = folded;

View file

@ -6,7 +6,7 @@ LL | with_closure_expecting_fn_with_free_region(|x: fn(&'x u32), y| {});
| |
= note: expected fn pointer `fn(&u32)` = note: expected fn pointer `fn(&u32)`
found fn pointer `fn(&'x u32)` found fn pointer `fn(&'x u32)`
note: the anonymous lifetime #2 defined on the body at 16:48... note: the anonymous lifetime #1 defined on the body at 16:48...
--> $DIR/expect-fn-supply-fn.rs:16:48 --> $DIR/expect-fn-supply-fn.rs:16:48
| |
LL | with_closure_expecting_fn_with_free_region(|x: fn(&'x u32), y| {}); LL | with_closure_expecting_fn_with_free_region(|x: fn(&'x u32), y| {});
@ -30,7 +30,7 @@ note: the lifetime `'x` as defined on the function body at 13:36...
| |
LL | fn expect_free_supply_free_from_fn<'x>(x: &'x u32) { LL | fn expect_free_supply_free_from_fn<'x>(x: &'x u32) {
| ^^ | ^^
note: ...does not necessarily outlive the anonymous lifetime #2 defined on the body at 16:48 note: ...does not necessarily outlive the anonymous lifetime #1 defined on the body at 16:48
--> $DIR/expect-fn-supply-fn.rs:16:48 --> $DIR/expect-fn-supply-fn.rs:16:48
| |
LL | with_closure_expecting_fn_with_free_region(|x: fn(&'x u32), y| {}); LL | with_closure_expecting_fn_with_free_region(|x: fn(&'x u32), y| {});

View file

@ -6,7 +6,7 @@ LL | closure_expecting_bound(|x: &'x u32| {
| |
= note: expected reference `&u32` = note: expected reference `&u32`
found reference `&'x u32` found reference `&'x u32`
note: the anonymous lifetime #2 defined on the body at 14:29... note: the anonymous lifetime #1 defined on the body at 14:29...
--> $DIR/expect-region-supply-region-2.rs:14:29 --> $DIR/expect-region-supply-region-2.rs:14:29
| |
LL | closure_expecting_bound(|x: &'x u32| { LL | closure_expecting_bound(|x: &'x u32| {
@ -37,7 +37,7 @@ note: the lifetime `'x` as defined on the function body at 9:30...
| |
LL | fn expect_bound_supply_named<'x>() { LL | fn expect_bound_supply_named<'x>() {
| ^^ | ^^
note: ...does not necessarily outlive the anonymous lifetime #2 defined on the body at 14:29 note: ...does not necessarily outlive the anonymous lifetime #1 defined on the body at 14:29
--> $DIR/expect-region-supply-region-2.rs:14:29 --> $DIR/expect-region-supply-region-2.rs:14:29
| |
LL | closure_expecting_bound(|x: &'x u32| { LL | closure_expecting_bound(|x: &'x u32| {

View file

@ -4,7 +4,7 @@ error[E0312]: lifetime of reference outlives lifetime of borrowed content...
LL | x LL | x
| ^ | ^
| |
note: ...the reference is valid for the anonymous lifetime #2 defined on the body at 2:69... note: ...the reference is valid for the anonymous lifetime #1 defined on the body at 2:69...
--> $DIR/issue-10291.rs:2:69 --> $DIR/issue-10291.rs:2:69
| |
LL | drop::<Box<dyn for<'z> FnMut(&'z isize) -> &'z isize>>(Box::new(|z| { LL | drop::<Box<dyn for<'z> FnMut(&'z isize) -> &'z isize>>(Box::new(|z| {

View file

@ -6,12 +6,12 @@ LL | gimme(|x, y| y)
| |
= note: expected reference `&Foo<'_, '_, u32>` = note: expected reference `&Foo<'_, '_, u32>`
found reference `&Foo<'_, '_, u32>` found reference `&Foo<'_, '_, u32>`
note: the anonymous lifetime #4 defined on the body at 9:11... note: the anonymous lifetime #3 defined on the body at 9:11...
--> $DIR/issue-52533-1.rs:9:11 --> $DIR/issue-52533-1.rs:9:11
| |
LL | gimme(|x, y| y) LL | gimme(|x, y| y)
| ^^^^^^^^ | ^^^^^^^^
note: ...does not necessarily outlive the anonymous lifetime #3 defined on the body at 9:11 note: ...does not necessarily outlive the anonymous lifetime #2 defined on the body at 9:11
--> $DIR/issue-52533-1.rs:9:11 --> $DIR/issue-52533-1.rs:9:11
| |
LL | gimme(|x, y| y) LL | gimme(|x, y| y)

View file

@ -4,12 +4,12 @@ error[E0312]: lifetime of reference outlives lifetime of borrowed content...
LL | foo(|a, b| b) LL | foo(|a, b| b)
| ^ | ^
| |
note: ...the reference is valid for the anonymous lifetime #2 defined on the body at 5:9... note: ...the reference is valid for the anonymous lifetime #1 defined on the body at 5:9...
--> $DIR/issue-52533.rs:5:9 --> $DIR/issue-52533.rs:5:9
| |
LL | foo(|a, b| b) LL | foo(|a, b| b)
| ^^^^^^^^ | ^^^^^^^^
note: ...but the borrowed content is only valid for the anonymous lifetime #3 defined on the body at 5:9 note: ...but the borrowed content is only valid for the anonymous lifetime #2 defined on the body at 5:9
--> $DIR/issue-52533.rs:5:9 --> $DIR/issue-52533.rs:5:9
| |
LL | foo(|a, b| b) LL | foo(|a, b| b)

View file

@ -4,7 +4,7 @@ error[E0495]: cannot infer an appropriate lifetime due to conflicting requiremen
LL | let mut ay = &y; LL | let mut ay = &y;
| ^^ | ^^
| |
note: first, the lifetime cannot outlive the anonymous lifetime #2 defined on the body at 7:58... note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the body at 7:58...
--> $DIR/regions-nested-fns.rs:7:58 --> $DIR/regions-nested-fns.rs:7:58
| |
LL | ignore::<Box<dyn for<'z> FnMut(&'z isize)>>(Box::new(|z| { LL | ignore::<Box<dyn for<'z> FnMut(&'z isize)>>(Box::new(|z| {
@ -19,7 +19,7 @@ note: ...so that reference does not outlive borrowed content
| |
LL | ay = z; LL | ay = z;
| ^ | ^
note: but, the lifetime must be valid for the anonymous lifetime #2 defined on the body at 13:72... note: but, the lifetime must be valid for the anonymous lifetime #1 defined on the body at 13:72...
--> $DIR/regions-nested-fns.rs:13:72 --> $DIR/regions-nested-fns.rs:13:72
| |
LL | ignore::< Box<dyn for<'z> FnMut(&'z isize) -> &'z isize>>(Box::new(|z| { LL | ignore::< Box<dyn for<'z> FnMut(&'z isize) -> &'z isize>>(Box::new(|z| {
@ -48,7 +48,7 @@ error[E0312]: lifetime of reference outlives lifetime of borrowed content...
LL | if false { return x; } LL | if false { return x; }
| ^ | ^
| |
note: ...the reference is valid for the anonymous lifetime #2 defined on the body at 13:72... note: ...the reference is valid for the anonymous lifetime #1 defined on the body at 13:72...
--> $DIR/regions-nested-fns.rs:13:72 --> $DIR/regions-nested-fns.rs:13:72
| |
LL | ignore::< Box<dyn for<'z> FnMut(&'z isize) -> &'z isize>>(Box::new(|z| { LL | ignore::< Box<dyn for<'z> FnMut(&'z isize) -> &'z isize>>(Box::new(|z| {

View file

@ -4,7 +4,7 @@ error[E0495]: cannot infer an appropriate lifetime due to conflicting requiremen
LL | with(|o| o) LL | with(|o| o)
| ^ | ^
| |
note: first, the lifetime cannot outlive the anonymous lifetime #2 defined on the body at 10:10... note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the body at 10:10...
--> $DIR/regions-ret-borrowed-1.rs:10:10 --> $DIR/regions-ret-borrowed-1.rs:10:10
| |
LL | with(|o| o) LL | with(|o| o)

View file

@ -4,7 +4,7 @@ error[E0495]: cannot infer an appropriate lifetime due to conflicting requiremen
LL | with(|o| o) LL | with(|o| o)
| ^ | ^
| |
note: first, the lifetime cannot outlive the anonymous lifetime #2 defined on the body at 13:10... note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the body at 13:10...
--> $DIR/regions-ret-borrowed.rs:13:10 --> $DIR/regions-ret-borrowed.rs:13:10
| |
LL | with(|o| o) LL | with(|o| o)

View file

@ -4,7 +4,7 @@ error[E0312]: lifetime of reference outlives lifetime of borrowed content...
LL | x.set(y); LL | x.set(y);
| ^ | ^
| |
note: ...the reference is valid for the anonymous lifetime #3 defined on the body at 16:14... note: ...the reference is valid for the anonymous lifetime #2 defined on the body at 16:14...
--> $DIR/unboxed-closures-infer-argument-types-two-region-pointers.rs:16:14 --> $DIR/unboxed-closures-infer-argument-types-two-region-pointers.rs:16:14
| |
LL | doit(0, &|x, y| { LL | doit(0, &|x, y| {
@ -12,7 +12,7 @@ LL | doit(0, &|x, y| {
LL | | x.set(y); LL | | x.set(y);
LL | | }); LL | | });
| |_____^ | |_____^
note: ...but the borrowed content is only valid for the anonymous lifetime #4 defined on the body at 16:14 note: ...but the borrowed content is only valid for the anonymous lifetime #3 defined on the body at 16:14
--> $DIR/unboxed-closures-infer-argument-types-two-region-pointers.rs:16:14 --> $DIR/unboxed-closures-infer-argument-types-two-region-pointers.rs:16:14
| |
LL | doit(0, &|x, y| { LL | doit(0, &|x, y| {