Skip to content

Commit 3da72c7

Browse files
Auto merge of #146328 - zetanumbers:fix-141951, r=<try>
Skip typeck for items w/o their own typeck context
2 parents beeb8e3 + 7e826fb commit 3da72c7

File tree

3 files changed

+40
-5
lines changed

3 files changed

+40
-5
lines changed

compiler/rustc_hir/src/def.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,43 @@ impl DefKind {
440440
| DefKind::ExternCrate => false,
441441
}
442442
}
443+
444+
/// Returns `true` if `self` is a kind of definition that does not have its own
445+
/// type-checking context, i.e. closure, coroutine or inline const.
446+
#[inline]
447+
pub fn is_typeck_child(self) -> bool {
448+
match self {
449+
DefKind::Closure | DefKind::InlineConst | DefKind::SyntheticCoroutineBody => true,
450+
DefKind::Mod
451+
| DefKind::Struct
452+
| DefKind::Union
453+
| DefKind::Enum
454+
| DefKind::Variant
455+
| DefKind::Trait
456+
| DefKind::TyAlias
457+
| DefKind::ForeignTy
458+
| DefKind::TraitAlias
459+
| DefKind::AssocTy
460+
| DefKind::TyParam
461+
| DefKind::Fn
462+
| DefKind::Const
463+
| DefKind::ConstParam
464+
| DefKind::Static { .. }
465+
| DefKind::Ctor(_, _)
466+
| DefKind::AssocFn
467+
| DefKind::AssocConst
468+
| DefKind::Macro(_)
469+
| DefKind::ExternCrate
470+
| DefKind::Use
471+
| DefKind::ForeignMod
472+
| DefKind::AnonConst
473+
| DefKind::OpaqueTy
474+
| DefKind::Field
475+
| DefKind::LifetimeParam
476+
| DefKind::GlobalAsm
477+
| DefKind::Impl { .. } => false,
478+
}
479+
}
443480
}
444481

445482
/// The resolution of a path or export.

compiler/rustc_hir_analysis/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,8 @@ pub fn check_crate(tcx: TyCtxt<'_>) {
238238
_ => (),
239239
}
240240
// Skip `AnonConst`s because we feed their `type_of`.
241-
if !matches!(def_kind, DefKind::AnonConst) {
241+
// Also skip items for which typeck forwards to parent typeck.
242+
if !(matches!(def_kind, DefKind::AnonConst) || def_kind.is_typeck_child()) {
242243
tcx.ensure_ok().typeck(item_def_id);
243244
}
244245
// Ensure we generate the new `DefId` before finishing `check_crate`.

compiler/rustc_middle/src/ty/util.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -609,10 +609,7 @@ impl<'tcx> TyCtxt<'tcx> {
609609
/// Returns `true` if `def_id` refers to a definition that does not have its own
610610
/// type-checking context, i.e. closure, coroutine or inline const.
611611
pub fn is_typeck_child(self, def_id: DefId) -> bool {
612-
matches!(
613-
self.def_kind(def_id),
614-
DefKind::Closure | DefKind::InlineConst | DefKind::SyntheticCoroutineBody
615-
)
612+
self.def_kind(def_id).is_typeck_child()
616613
}
617614

618615
/// Returns `true` if `def_id` refers to a trait (i.e., `trait Foo { ... }`).

0 commit comments

Comments
 (0)