Skip to content

Commit 14d1215

Browse files
Restrict some queries by def-kind more
1 parent e643f59 commit 14d1215

File tree

6 files changed

+43
-26
lines changed

6 files changed

+43
-26
lines changed

compiler/rustc_hir_analysis/src/collect.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
//! At present, however, we do run collection across all items in the
1515
//! crate as a kind of pass. This should eventually be factored away.
1616
17+
use std::assert_matches::assert_matches;
1718
use std::cell::Cell;
1819
use std::iter;
1920
use std::ops::Bound;
@@ -1344,7 +1345,8 @@ fn fn_sig(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<'_, ty::PolyFn
13441345
compute_sig_of_foreign_fn_decl(tcx, def_id, sig.decl, abi, sig.header.safety())
13451346
}
13461347

1347-
Ctor(data) | Variant(hir::Variant { data, .. }) if data.ctor().is_some() => {
1348+
Ctor(data) => {
1349+
assert_matches!(data.ctor(), Some(_));
13481350
let adt_def_id = tcx.hir_get_parent_item(hir_id).def_id.to_def_id();
13491351
let ty = tcx.type_of(adt_def_id).instantiate_identity();
13501352
let inputs = data.fields().iter().map(|f| tcx.type_of(f.def_id).instantiate_identity());

compiler/rustc_hir_analysis/src/variance/mod.rs

+7-3
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,13 @@ fn variances_of(tcx: TyCtxt<'_>, item_def_id: LocalDefId) -> &[ty::Variance] {
4444
return &[];
4545
}
4646

47-
match tcx.def_kind(item_def_id) {
47+
let kind = tcx.def_kind(item_def_id);
48+
match kind {
4849
DefKind::Fn
4950
| DefKind::AssocFn
5051
| DefKind::Enum
5152
| DefKind::Struct
5253
| DefKind::Union
53-
| DefKind::Variant
5454
| DefKind::Ctor(..) => {
5555
// These are inferred.
5656
let crate_map = tcx.crate_variances(());
@@ -89,7 +89,11 @@ fn variances_of(tcx: TyCtxt<'_>, item_def_id: LocalDefId) -> &[ty::Variance] {
8989
}
9090

9191
// Variance not relevant.
92-
span_bug!(tcx.def_span(item_def_id), "asked to compute variance for wrong kind of item");
92+
span_bug!(
93+
tcx.def_span(item_def_id),
94+
"asked to compute variance for {}",
95+
kind.descr(item_def_id.to_def_id())
96+
);
9397
}
9498

9599
#[derive(Debug, Copy, Clone)]

compiler/rustc_metadata/src/rmeta/encoder.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1099,7 +1099,6 @@ fn should_encode_variances<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, def_kind: Def
10991099
DefKind::Struct
11001100
| DefKind::Union
11011101
| DefKind::Enum
1102-
| DefKind::Variant
11031102
| DefKind::OpaqueTy
11041103
| DefKind::Fn
11051104
| DefKind::Ctor(..)
@@ -1109,6 +1108,7 @@ fn should_encode_variances<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, def_kind: Def
11091108
matches!(tcx.opt_rpitit_info(def_id), Some(ty::ImplTraitInTraitData::Trait { .. }))
11101109
}
11111110
DefKind::Mod
1111+
| DefKind::Variant
11121112
| DefKind::Field
11131113
| DefKind::AssocConst
11141114
| DefKind::TyParam

compiler/rustc_ty_utils/src/implied_bounds.rs

+19-12
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ use rustc_data_structures::fx::FxHashMap;
44
use rustc_hir as hir;
55
use rustc_hir::def::DefKind;
66
use rustc_hir::def_id::LocalDefId;
7-
use rustc_middle::bug;
87
use rustc_middle::query::Providers;
98
use rustc_middle::ty::{self, Ty, TyCtxt, fold_regions};
9+
use rustc_middle::{bug, span_bug};
1010
use rustc_span::Span;
1111

1212
pub(crate) fn provide(providers: &mut Providers) {
@@ -21,7 +21,8 @@ pub(crate) fn provide(providers: &mut Providers) {
2121
}
2222

2323
fn assumed_wf_types<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> &'tcx [(Ty<'tcx>, Span)] {
24-
match tcx.def_kind(def_id) {
24+
let kind = tcx.def_kind(def_id);
25+
match kind {
2526
DefKind::Fn => {
2627
let sig = tcx.fn_sig(def_id).instantiate_identity();
2728
let liberated_sig = tcx.liberate_late_bound_regions(def_id.to_def_id(), sig);
@@ -121,32 +122,38 @@ fn assumed_wf_types<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> &'tcx [(Ty<'
121122
}
122123
}
123124
DefKind::AssocConst | DefKind::AssocTy => tcx.assumed_wf_types(tcx.local_parent(def_id)),
124-
DefKind::OpaqueTy => bug!("implied bounds are not defined for opaques"),
125-
DefKind::Mod
125+
DefKind::Static { .. }
126+
| DefKind::Const
127+
| DefKind::AnonConst
128+
| DefKind::InlineConst
126129
| DefKind::Struct
127130
| DefKind::Union
128131
| DefKind::Enum
129-
| DefKind::Variant
130132
| DefKind::Trait
131-
| DefKind::TyAlias
132-
| DefKind::ForeignTy
133133
| DefKind::TraitAlias
134+
| DefKind::TyAlias => ty::List::empty(),
135+
DefKind::OpaqueTy
136+
| DefKind::Mod
137+
| DefKind::Variant
138+
| DefKind::ForeignTy
134139
| DefKind::TyParam
135-
| DefKind::Const
136140
| DefKind::ConstParam
137-
| DefKind::Static { .. }
138141
| DefKind::Ctor(_, _)
139142
| DefKind::Macro(_)
140143
| DefKind::ExternCrate
141144
| DefKind::Use
142145
| DefKind::ForeignMod
143-
| DefKind::AnonConst
144-
| DefKind::InlineConst
145146
| DefKind::Field
146147
| DefKind::LifetimeParam
147148
| DefKind::GlobalAsm
148149
| DefKind::Closure
149-
| DefKind::SyntheticCoroutineBody => ty::List::empty(),
150+
| DefKind::SyntheticCoroutineBody => {
151+
span_bug!(
152+
tcx.def_span(def_id),
153+
"`assumed_wf_types` not defined for {} `{def_id:?}`",
154+
kind.descr(def_id.to_def_id())
155+
);
156+
}
150157
}
151158
}
152159

compiler/rustc_ty_utils/src/opaque_types.rs

+12-8
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ use rustc_hir::def::DefKind;
33
use rustc_hir::def_id::LocalDefId;
44
use rustc_hir::intravisit;
55
use rustc_hir::intravisit::Visitor;
6-
use rustc_middle::bug;
76
use rustc_middle::query::Providers;
87
use rustc_middle::ty::util::{CheckRegions, NotUniqueParam};
98
use rustc_middle::ty::{self, Ty, TyCtxt, TypeSuperVisitable, TypeVisitable, TypeVisitor};
9+
use rustc_middle::{bug, span_bug};
1010
use rustc_span::Span;
1111
use tracing::{instrument, trace};
1212

@@ -320,9 +320,12 @@ fn opaque_types_defined_by<'tcx>(
320320
| DefKind::AnonConst => {
321321
collector.collect_taits_declared_in_body();
322322
}
323+
// Closures and coroutines are type checked with their parent
324+
DefKind::Closure | DefKind::InlineConst => {
325+
collector.opaques.extend(tcx.opaque_types_defined_by(tcx.local_parent(item)));
326+
}
327+
DefKind::AssocTy | DefKind::TyAlias | DefKind::GlobalAsm => {}
323328
DefKind::OpaqueTy
324-
| DefKind::TyAlias
325-
| DefKind::AssocTy
326329
| DefKind::Mod
327330
| DefKind::Struct
328331
| DefKind::Union
@@ -340,12 +343,13 @@ fn opaque_types_defined_by<'tcx>(
340343
| DefKind::ForeignMod
341344
| DefKind::Field
342345
| DefKind::LifetimeParam
343-
| DefKind::GlobalAsm
344346
| DefKind::Impl { .. }
345-
| DefKind::SyntheticCoroutineBody => {}
346-
// Closures and coroutines are type checked with their parent
347-
DefKind::Closure | DefKind::InlineConst => {
348-
collector.opaques.extend(tcx.opaque_types_defined_by(tcx.local_parent(item)));
347+
| DefKind::SyntheticCoroutineBody => {
348+
span_bug!(
349+
tcx.def_span(item),
350+
"`opaque_types_defined_by` not defined for {} `{item:?}`",
351+
kind.descr(item.to_def_id())
352+
);
349353
}
350354
}
351355
tcx.mk_local_def_ids(&collector.opaques)

compiler/rustc_ty_utils/src/sig_types.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ pub fn walk_types<'tcx, V: SpannedTypeVisitor<'tcx>>(
116116
"{kind:?} has not seen any uses of `walk_types` yet, ping oli-obk if you'd like any help"
117117
)
118118
}
119-
// These don't have any types.
119+
// These don't have any types, but are visited during privacy checking.
120120
| DefKind::ExternCrate
121121
| DefKind::ForeignMod
122122
| DefKind::ForeignTy

0 commit comments

Comments
 (0)