Skip to content

Commit 6289d0e

Browse files
committed
with_lifetime_binder is now lower_lifetime_binder and doesn't need a closure
1 parent 11e00f5 commit 6289d0e

File tree

2 files changed

+52
-55
lines changed

2 files changed

+52
-55
lines changed

compiler/rustc_ast_lowering/src/expr.rs

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -864,22 +864,21 @@ impl<'hir> LoweringContext<'_, 'hir> {
864864
(body_id, generator_option)
865865
});
866866

867-
self.with_lifetime_binder(closure_id, generic_params, |this, bound_generic_params| {
868-
// Lower outside new scope to preserve `is_in_loop_condition`.
869-
let fn_decl = this.lower_fn_decl(decl, None, FnDeclKind::Closure, None);
870-
871-
let c = self.arena.alloc(hir::Closure {
872-
binder: binder_clause,
873-
capture_clause,
874-
bound_generic_params,
875-
fn_decl,
876-
body: body_id,
877-
fn_decl_span: this.lower_span(fn_decl_span),
878-
movability: generator_option,
879-
});
867+
let bound_generic_params = self.lower_lifetime_binder(closure_id, generic_params);
868+
// Lower outside new scope to preserve `is_in_loop_condition`.
869+
let fn_decl = self.lower_fn_decl(decl, None, FnDeclKind::Closure, None);
870+
871+
let c = self.arena.alloc(hir::Closure {
872+
binder: binder_clause,
873+
capture_clause,
874+
bound_generic_params,
875+
fn_decl,
876+
body: body_id,
877+
fn_decl_span: self.lower_span(fn_decl_span),
878+
movability: generator_option,
879+
});
880880

881-
hir::ExprKind::Closure(c)
882-
})
881+
hir::ExprKind::Closure(c)
883882
}
884883

885884
fn generator_movability_for_fn(
@@ -991,23 +990,23 @@ impl<'hir> LoweringContext<'_, 'hir> {
991990
body_id
992991
});
993992

994-
self.with_lifetime_binder(closure_id, generic_params, |this, bound_generic_params| {
995-
// We need to lower the declaration outside the new scope, because we
996-
// have to conserve the state of being inside a loop condition for the
997-
// closure argument types.
998-
let fn_decl = this.lower_fn_decl(&outer_decl, None, FnDeclKind::Closure, None);
999-
1000-
let c = self.arena.alloc(hir::Closure {
1001-
binder: binder_clause,
1002-
capture_clause,
1003-
bound_generic_params,
1004-
fn_decl,
1005-
body,
1006-
fn_decl_span: this.lower_span(fn_decl_span),
1007-
movability: None,
1008-
});
1009-
hir::ExprKind::Closure(c)
1010-
})
993+
let bound_generic_params = self.lower_lifetime_binder(closure_id, generic_params);
994+
995+
// We need to lower the declaration outside the new scope, because we
996+
// have to conserve the state of being inside a loop condition for the
997+
// closure argument types.
998+
let fn_decl = self.lower_fn_decl(&outer_decl, None, FnDeclKind::Closure, None);
999+
1000+
let c = self.arena.alloc(hir::Closure {
1001+
binder: binder_clause,
1002+
capture_clause,
1003+
bound_generic_params,
1004+
fn_decl,
1005+
body,
1006+
fn_decl_span: self.lower_span(fn_decl_span),
1007+
movability: None,
1008+
});
1009+
hir::ExprKind::Closure(c)
10111010
}
10121011

10131012
/// Destructure the LHS of complex assignments.

compiler/rustc_ast_lowering/src/lib.rs

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -787,15 +787,18 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
787787
})
788788
}
789789

790-
/// Register a binder to be ignored for lifetime capture.
791-
#[tracing::instrument(level = "debug", skip(self, f))]
790+
/// Lowers a lifetime binder that defines `generic_params`, returning the corresponding HIR
791+
/// nodes. The returned list includes any "extra" lifetime parameters that were added by the
792+
/// name resolver owing to lifetime elision; this also populates the resolver's node-id->def-id
793+
/// map, so that later calls to `opt_node_id_to_def_id` that refer to these extra lifetime
794+
/// parameters will be successful.
795+
#[tracing::instrument(level = "debug", skip(self))]
792796
#[inline]
793-
fn with_lifetime_binder<T>(
797+
fn lower_lifetime_binder(
794798
&mut self,
795799
binder: NodeId,
796800
generic_params: &[GenericParam],
797-
f: impl FnOnce(&mut Self, &'hir [hir::GenericParam<'hir>]) -> T,
798-
) -> T {
801+
) -> &'hir [hir::GenericParam<'hir>] {
799802
let mut generic_params: Vec<_> = self.lower_generic_params_mut(generic_params).collect();
800803
let extra_lifetimes = self.resolver.take_extra_lifetime_params(binder);
801804
debug!(?extra_lifetimes);
@@ -805,7 +808,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
805808
let generic_params = self.arena.alloc_from_iter(generic_params);
806809
debug!(?generic_params);
807810

808-
f(self, generic_params)
811+
generic_params
809812
}
810813

811814
fn with_dyn_type_scope<T>(&mut self, in_scope: bool, f: impl FnOnce(&mut Self) -> T) -> T {
@@ -1226,15 +1229,14 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
12261229
hir::TyKind::Rptr(lifetime, self.lower_mt(mt, itctx))
12271230
}
12281231
TyKind::BareFn(ref f) => {
1229-
self.with_lifetime_binder(t.id, &f.generic_params, |this, generic_params| {
1230-
hir::TyKind::BareFn(this.arena.alloc(hir::BareFnTy {
1231-
generic_params,
1232-
unsafety: this.lower_unsafety(f.unsafety),
1233-
abi: this.lower_extern(f.ext),
1234-
decl: this.lower_fn_decl(&f.decl, None, FnDeclKind::Pointer, None),
1235-
param_names: this.lower_fn_params_to_names(&f.decl),
1236-
}))
1237-
})
1232+
let generic_params = self.lower_lifetime_binder(t.id, &f.generic_params);
1233+
hir::TyKind::BareFn(self.arena.alloc(hir::BareFnTy {
1234+
generic_params,
1235+
unsafety: self.lower_unsafety(f.unsafety),
1236+
abi: self.lower_extern(f.ext),
1237+
decl: self.lower_fn_decl(&f.decl, None, FnDeclKind::Pointer, None),
1238+
param_names: self.lower_fn_params_to_names(&f.decl),
1239+
}))
12381240
}
12391241
TyKind::Never => hir::TyKind::Never,
12401242
TyKind::Tup(ref tys) => hir::TyKind::Tup(
@@ -2069,14 +2071,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
20692071
p: &PolyTraitRef,
20702072
itctx: ImplTraitContext,
20712073
) -> hir::PolyTraitRef<'hir> {
2072-
self.with_lifetime_binder(
2073-
p.trait_ref.ref_id,
2074-
&p.bound_generic_params,
2075-
|this, bound_generic_params| {
2076-
let trait_ref = this.lower_trait_ref(&p.trait_ref, itctx);
2077-
hir::PolyTraitRef { bound_generic_params, trait_ref, span: this.lower_span(p.span) }
2078-
},
2079-
)
2074+
let bound_generic_params =
2075+
self.lower_lifetime_binder(p.trait_ref.ref_id, &p.bound_generic_params);
2076+
let trait_ref = self.lower_trait_ref(&p.trait_ref, itctx);
2077+
hir::PolyTraitRef { bound_generic_params, trait_ref, span: self.lower_span(p.span) }
20802078
}
20812079

20822080
fn lower_mt(&mut self, mt: &MutTy, itctx: ImplTraitContext) -> hir::MutTy<'hir> {

0 commit comments

Comments
 (0)