Skip to content

Commit 6f98a6c

Browse files
Simplify closure_env_ty and closure_env_param
1 parent 5876c8c commit 6f98a6c

File tree

4 files changed

+34
-48
lines changed

4 files changed

+34
-48
lines changed

compiler/rustc_borrowck/src/universal_regions.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,11 @@ impl<'cx, 'tcx> UniversalRegionsBuilder<'cx, 'tcx> {
668668
kind: ty::BrEnv,
669669
};
670670
let env_region = ty::Region::new_bound(tcx, ty::INNERMOST, br);
671-
let closure_ty = tcx.closure_env_ty(def_id, args, env_region).unwrap();
671+
let closure_ty = tcx.closure_env_ty(
672+
Ty::new_closure(tcx, def_id, args),
673+
args.as_closure().kind(),
674+
env_region,
675+
);
672676

673677
// The "inputs" of the closure in the
674678
// signature appear as a tuple. The MIR side

compiler/rustc_middle/src/ty/util.rs

+5-9
Original file line numberDiff line numberDiff line change
@@ -604,19 +604,15 @@ impl<'tcx> TyCtxt<'tcx> {
604604
/// wrapped in a binder.
605605
pub fn closure_env_ty(
606606
self,
607-
closure_def_id: DefId,
608-
closure_args: GenericArgsRef<'tcx>,
607+
closure_ty: Ty<'tcx>,
608+
closure_kind: ty::ClosureKind,
609609
env_region: ty::Region<'tcx>,
610-
) -> Option<Ty<'tcx>> {
611-
let closure_ty = Ty::new_closure(self, closure_def_id, closure_args);
612-
let closure_kind_ty = closure_args.as_closure().kind_ty();
613-
let closure_kind = closure_kind_ty.to_opt_closure_kind()?;
614-
let env_ty = match closure_kind {
610+
) -> Ty<'tcx> {
611+
match closure_kind {
615612
ty::ClosureKind::Fn => Ty::new_imm_ref(self, env_region, closure_ty),
616613
ty::ClosureKind::FnMut => Ty::new_mut_ref(self, env_region, closure_ty),
617614
ty::ClosureKind::FnOnce => closure_ty,
618-
};
619-
Some(env_ty)
615+
}
620616
}
621617

622618
/// Returns `true` if the node pointed to by `def_id` is a `static` item.

compiler/rustc_mir_build/src/thir/cx/mod.rs

+19-37
Original file line numberDiff line numberDiff line change
@@ -117,50 +117,32 @@ impl<'tcx> Cx<'tcx> {
117117
pat_from_hir(self.tcx, self.param_env, self.typeck_results(), p)
118118
}
119119

120-
fn closure_env_param(&self, owner_def: LocalDefId, owner_id: HirId) -> Option<Param<'tcx>> {
121-
match self.tcx.def_kind(owner_def) {
122-
DefKind::Closure if self.tcx.is_coroutine(owner_def.to_def_id()) => {
123-
let coroutine_ty = self.typeck_results.node_type(owner_id);
124-
let coroutine_param = Param {
125-
ty: coroutine_ty,
126-
pat: None,
127-
ty_span: None,
128-
self_kind: None,
129-
hir_id: None,
130-
};
131-
Some(coroutine_param)
120+
fn closure_env_param(&self, owner_def: LocalDefId, expr_id: HirId) -> Option<Param<'tcx>> {
121+
if self.tcx.def_kind(owner_def) != DefKind::Closure {
122+
return None;
123+
}
124+
125+
let closure_ty = self.typeck_results.node_type(expr_id);
126+
Some(match *closure_ty.kind() {
127+
ty::Coroutine(..) => {
128+
Param { ty: closure_ty, pat: None, ty_span: None, self_kind: None, hir_id: None }
132129
}
133-
DefKind::Closure => {
134-
let closure_ty = self.typeck_results.node_type(owner_id);
135-
136-
let ty::Closure(closure_def_id, closure_args) = *closure_ty.kind() else {
137-
bug!("closure expr does not have closure type: {:?}", closure_ty);
138-
};
139-
140-
let bound_vars =
141-
self.tcx.mk_bound_variable_kinds(&[ty::BoundVariableKind::Region(ty::BrEnv)]);
142-
let br = ty::BoundRegion {
143-
var: ty::BoundVar::from_usize(bound_vars.len() - 1),
144-
kind: ty::BrEnv,
145-
};
146-
let env_region = ty::Region::new_bound(self.tcx, ty::INNERMOST, br);
147-
let closure_env_ty =
148-
self.tcx.closure_env_ty(closure_def_id, closure_args, env_region).unwrap();
149-
let liberated_closure_env_ty = self.tcx.instantiate_bound_regions_with_erased(
150-
ty::Binder::bind_with_vars(closure_env_ty, bound_vars),
130+
ty::Closure(_, closure_args) => {
131+
let closure_env_ty = self.tcx.closure_env_ty(
132+
closure_ty,
133+
closure_args.as_closure().kind(),
134+
self.tcx.lifetimes.re_erased,
151135
);
152-
let env_param = Param {
153-
ty: liberated_closure_env_ty,
136+
Param {
137+
ty: closure_env_ty,
154138
pat: None,
155139
ty_span: None,
156140
self_kind: None,
157141
hir_id: None,
158-
};
159-
160-
Some(env_param)
142+
}
161143
}
162-
_ => None,
163-
}
144+
_ => bug!("unexpected closure type: {closure_ty}"),
145+
})
164146
}
165147

166148
fn explicit_params<'a>(

compiler/rustc_ty_utils/src/abi.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,11 @@ fn fn_sig_for_fn_abi<'tcx>(
8383
kind: ty::BoundRegionKind::BrEnv,
8484
};
8585
let env_region = ty::Region::new_bound(tcx, ty::INNERMOST, br);
86-
let env_ty = tcx.closure_env_ty(def_id, args, env_region).unwrap();
86+
let env_ty = tcx.closure_env_ty(
87+
Ty::new_closure(tcx, def_id, args),
88+
args.as_closure().kind(),
89+
env_region,
90+
);
8791

8892
let sig = sig.skip_binder();
8993
ty::Binder::bind_with_vars(

0 commit comments

Comments
 (0)