Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make anonymous binders start at 0 #78545

Merged
merged 1 commit into from
Oct 30, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions compiler/rustc_middle/src/ty/fold.rs
Original file line number Diff line number Diff line change
Expand Up @@ -684,7 +684,7 @@ impl<'tcx> TyCtxt<'tcx> {
}

/// 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.
///
/// The chief purpose of this function is to canonicalize regions so that two
Expand All @@ -698,8 +698,9 @@ impl<'tcx> TyCtxt<'tcx> {
let mut counter = 0;
Binder::bind(
self.replace_late_bound_regions(sig, |_| {
let r = self.mk_region(ty::ReLateBound(ty::INNERMOST, ty::BrAnon(counter)));
counter += 1;
self.mk_region(ty::ReLateBound(ty::INNERMOST, ty::BrAnon(counter)))
r
})
.0,
)
Expand Down
16 changes: 3 additions & 13 deletions compiler/rustc_symbol_mangling/src/v0.rs
Original file line number Diff line number Diff line change
Expand Up @@ -200,15 +200,9 @@ impl SymbolMangler<'tcx> {

let lifetimes = regions
.into_iter()
.map(|br| {
match br {
ty::BrAnon(i) => {
// 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),
}
.map(|br| match br {
ty::BrAnon(i) => i,
_ => bug!("symbol_names: non-anonymized region `{:?}` in `{:?}`", br, value),
})
.max()
.map_or(0, |max| max + 1);
Expand Down Expand Up @@ -327,10 +321,6 @@ impl Printer<'tcx> for SymbolMangler<'tcx> {
// Late-bound lifetimes use indices starting at 1,
// see `BinderLevel` for more details.
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 depth = binder.lifetime_depths.start + i;

Expand Down
3 changes: 2 additions & 1 deletion compiler/rustc_typeck/src/check/generator_interior.rs
Original file line number Diff line number Diff line change
Expand Up @@ -186,8 +186,9 @@ pub fn resolve_interior<'a, 'tcx>(
// 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.
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;
fcx.tcx.mk_region(ty::ReLateBound(current_depth, ty::BrAnon(counter)))
r
});

cause.ty = folded;
Expand Down
4 changes: 2 additions & 2 deletions src/test/ui/closure-expected-type/expect-fn-supply-fn.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ LL | with_closure_expecting_fn_with_free_region(|x: fn(&'x u32), y| {});
|
= note: expected fn pointer `fn(&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
|
LL | with_closure_expecting_fn_with_free_region(|x: fn(&'x u32), y| {});
Expand All @@ -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) {
| ^^
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
|
LL | with_closure_expecting_fn_with_free_region(|x: fn(&'x u32), y| {});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ LL | closure_expecting_bound(|x: &'x u32| {
|
= note: expected reference `&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
|
LL | closure_expecting_bound(|x: &'x u32| {
Expand Down Expand Up @@ -37,7 +37,7 @@ note: the lifetime `'x` as defined on the function body at 9:30...
|
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
|
LL | closure_expecting_bound(|x: &'x u32| {
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/issues/issue-10291.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ error[E0312]: lifetime of reference outlives lifetime of borrowed content...
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
|
LL | drop::<Box<dyn for<'z> FnMut(&'z isize) -> &'z isize>>(Box::new(|z| {
Expand Down
4 changes: 2 additions & 2 deletions src/test/ui/issues/issue-52533-1.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@ LL | gimme(|x, y| y)
|
= note: expected 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
|
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
|
LL | gimme(|x, y| y)
Expand Down
4 changes: 2 additions & 2 deletions src/test/ui/issues/issue-52533.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ error[E0312]: lifetime of reference outlives lifetime of borrowed content...
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
|
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
|
LL | foo(|a, b| b)
Expand Down
6 changes: 3 additions & 3 deletions src/test/ui/regions/regions-nested-fns.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ error[E0495]: cannot infer an appropriate lifetime due to conflicting requiremen
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
|
LL | ignore::<Box<dyn for<'z> FnMut(&'z isize)>>(Box::new(|z| {
Expand All @@ -19,7 +19,7 @@ note: ...so that reference does not outlive borrowed content
|
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
|
LL | ignore::< Box<dyn for<'z> FnMut(&'z isize) -> &'z isize>>(Box::new(|z| {
Expand Down Expand Up @@ -48,7 +48,7 @@ error[E0312]: lifetime of reference outlives lifetime of borrowed content...
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
|
LL | ignore::< Box<dyn for<'z> FnMut(&'z isize) -> &'z isize>>(Box::new(|z| {
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/regions/regions-ret-borrowed-1.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ error[E0495]: cannot infer an appropriate lifetime due to conflicting requiremen
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
|
LL | with(|o| o)
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/regions/regions-ret-borrowed.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ error[E0495]: cannot infer an appropriate lifetime due to conflicting requiremen
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
|
LL | with(|o| o)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ error[E0312]: lifetime of reference outlives lifetime of borrowed content...
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
|
LL | doit(0, &|x, y| {
| ______________^
LL | | x.set(y);
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
|
LL | doit(0, &|x, y| {
Expand Down