Rollup merge of #91055 - lcnr:type_of-closures, r=nikomatsakis
return the correct type for closures in `type_of` A bit unhappy about the way `typeck::check_crate` works rn. Would have preferred to not change `CollectItemTypesVisitor` in this way. r? ``@nikomatsakis``
This commit is contained in:
commit
cdc5c1381d
3 changed files with 9 additions and 13 deletions
|
@ -295,7 +295,9 @@ impl<'tcx> Visitor<'tcx> for CollectItemTypesVisitor<'tcx> {
|
||||||
if let hir::ExprKind::Closure(..) = expr.kind {
|
if let hir::ExprKind::Closure(..) = expr.kind {
|
||||||
let def_id = self.tcx.hir().local_def_id(expr.hir_id);
|
let def_id = self.tcx.hir().local_def_id(expr.hir_id);
|
||||||
self.tcx.ensure().generics_of(def_id);
|
self.tcx.ensure().generics_of(def_id);
|
||||||
self.tcx.ensure().type_of(def_id);
|
// We do not call `type_of` for closures here as that
|
||||||
|
// depends on typecheck and would therefore hide
|
||||||
|
// any further errors in case one typeck fails.
|
||||||
}
|
}
|
||||||
intravisit::walk_expr(self, expr);
|
intravisit::walk_expr(self, expr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -470,14 +470,7 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: DefId) -> Ty<'_> {
|
||||||
|
|
||||||
Node::Field(field) => icx.to_ty(field.ty),
|
Node::Field(field) => icx.to_ty(field.ty),
|
||||||
|
|
||||||
Node::Expr(&Expr { kind: ExprKind::Closure(.., gen), .. }) => {
|
Node::Expr(&Expr { kind: ExprKind::Closure(..), .. }) => tcx.typeck(def_id).node_type(hir_id),
|
||||||
let substs = InternalSubsts::identity_for_item(tcx, def_id.to_def_id());
|
|
||||||
if let Some(movability) = gen {
|
|
||||||
tcx.mk_generator(def_id.to_def_id(), substs, movability)
|
|
||||||
} else {
|
|
||||||
tcx.mk_closure(def_id.to_def_id(), substs)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Node::AnonConst(_) if let Some(param) = tcx.opt_const_param_of(def_id) => {
|
Node::AnonConst(_) if let Some(param) = tcx.opt_const_param_of(def_id) => {
|
||||||
// We defer to `type_of` of the corresponding parameter
|
// We defer to `type_of` of the corresponding parameter
|
||||||
|
|
|
@ -715,13 +715,14 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
|
||||||
|
|
||||||
debug!("walk_captures({:?})", closure_expr);
|
debug!("walk_captures({:?})", closure_expr);
|
||||||
|
|
||||||
let closure_def_id = self.tcx().hir().local_def_id(closure_expr.hir_id).to_def_id();
|
let tcx = self.tcx();
|
||||||
let upvars = self.tcx().upvars_mentioned(self.body_owner);
|
let closure_def_id = tcx.hir().local_def_id(closure_expr.hir_id).to_def_id();
|
||||||
|
let upvars = tcx.upvars_mentioned(self.body_owner);
|
||||||
|
|
||||||
// For purposes of this function, generator and closures are equivalent.
|
// For purposes of this function, generator and closures are equivalent.
|
||||||
let body_owner_is_closure = matches!(
|
let body_owner_is_closure = matches!(
|
||||||
self.tcx().type_of(self.body_owner.to_def_id()).kind(),
|
tcx.hir().body_owner_kind(tcx.hir().local_def_id_to_hir_id(self.body_owner)),
|
||||||
ty::Closure(..) | ty::Generator(..)
|
hir::BodyOwnerKind::Closure,
|
||||||
);
|
);
|
||||||
|
|
||||||
// If we have a nested closure, we want to include the fake reads present in the nested closure.
|
// If we have a nested closure, we want to include the fake reads present in the nested closure.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue