Skip to content

Commit 68f7ed4

Browse files
committed
WfCheck opaques.
1 parent d6f247f commit 68f7ed4

File tree

3 files changed

+32
-13
lines changed

3 files changed

+32
-13
lines changed

compiler/rustc_hir_analysis/src/check/wfcheck.rs

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -185,22 +185,24 @@ where
185185
}
186186
}
187187

188-
fn check_well_formed(tcx: TyCtxt<'_>, def_id: hir::OwnerId) -> Result<(), ErrorGuaranteed> {
189-
let node = tcx.hir_owner_node(def_id);
188+
fn check_well_formed(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Result<(), ErrorGuaranteed> {
189+
let node = tcx.hir_node_by_def_id(def_id);
190190
let mut res = match node {
191-
hir::OwnerNode::Crate(_) => bug!("check_well_formed cannot be applied to the crate root"),
192-
hir::OwnerNode::Item(item) => check_item(tcx, item),
193-
hir::OwnerNode::TraitItem(item) => check_trait_item(tcx, item),
194-
hir::OwnerNode::ImplItem(item) => check_impl_item(tcx, item),
195-
hir::OwnerNode::ForeignItem(item) => check_foreign_item(tcx, item),
196-
hir::OwnerNode::Synthetic => unreachable!(),
191+
hir::Node::Crate(_) => bug!("check_well_formed cannot be applied to the crate root"),
192+
hir::Node::Item(item) => check_item(tcx, item),
193+
hir::Node::TraitItem(item) => check_trait_item(tcx, item),
194+
hir::Node::ImplItem(item) => check_impl_item(tcx, item),
195+
hir::Node::ForeignItem(item) => check_foreign_item(tcx, item),
196+
hir::Node::OpaqueTy(_) => Ok(crate::check::check::check_item_type(tcx, def_id)),
197+
_ => unreachable!(),
197198
};
198199

199200
if let Some(generics) = node.generics() {
200201
for param in generics.params {
201202
res = res.and(check_param_wf(tcx, param));
202203
}
203204
}
205+
204206
res
205207
}
206208

@@ -2172,10 +2174,14 @@ impl<'tcx> WfCheckingCtxt<'_, 'tcx> {
21722174

21732175
fn check_mod_type_wf(tcx: TyCtxt<'_>, module: LocalModDefId) -> Result<(), ErrorGuaranteed> {
21742176
let items = tcx.hir_module_items(module);
2175-
let mut res = items.par_items(|item| tcx.ensure().check_well_formed(item.owner_id));
2176-
res = res.and(items.par_impl_items(|item| tcx.ensure().check_well_formed(item.owner_id)));
2177-
res = res.and(items.par_trait_items(|item| tcx.ensure().check_well_formed(item.owner_id)));
2178-
res = res.and(items.par_foreign_items(|item| tcx.ensure().check_well_formed(item.owner_id)));
2177+
let mut res = items.par_items(|item| tcx.ensure().check_well_formed(item.owner_id.def_id));
2178+
res =
2179+
res.and(items.par_impl_items(|item| tcx.ensure().check_well_formed(item.owner_id.def_id)));
2180+
res =
2181+
res.and(items.par_trait_items(|item| tcx.ensure().check_well_formed(item.owner_id.def_id)));
2182+
res = res
2183+
.and(items.par_foreign_items(|item| tcx.ensure().check_well_formed(item.owner_id.def_id)));
2184+
res = res.and(items.par_opaques(|item| tcx.ensure().check_well_formed(item)));
21792185
if module == LocalModDefId::CRATE_DEF_ID {
21802186
super::entry::check_for_entry_fn(tcx);
21812187
}

compiler/rustc_hir_analysis/src/collect.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,19 @@ impl<'tcx> Visitor<'tcx> for CollectItemTypesVisitor<'tcx> {
328328
intravisit::walk_expr(self, expr);
329329
}
330330

331+
/// Don't call `type_of` on opaque types, since that depends on type checking function bodies.
332+
/// `check_item_type` ensures that it's called instead.
333+
fn visit_opaque_ty(&mut self, opaque: &'tcx hir::OpaqueTy<'tcx>) {
334+
let def_id = opaque.def_id;
335+
self.tcx.ensure().generics_of(def_id);
336+
self.tcx.ensure().predicates_of(def_id);
337+
self.tcx.ensure().explicit_item_bounds(def_id);
338+
self.tcx.ensure().explicit_item_super_predicates(def_id);
339+
self.tcx.ensure().item_bounds(def_id);
340+
self.tcx.ensure().item_super_predicates(def_id);
341+
intravisit::walk_opaque_ty(self, opaque);
342+
}
343+
331344
fn visit_trait_item(&mut self, trait_item: &'tcx hir::TraitItem<'tcx>) {
332345
lower_trait_item(self.tcx, trait_item.trait_item_id());
333346
intravisit::walk_trait_item(self, trait_item);

compiler/rustc_middle/src/query/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1552,7 +1552,7 @@ rustc_queries! {
15521552
feedable
15531553
}
15541554

1555-
query check_well_formed(key: hir::OwnerId) -> Result<(), ErrorGuaranteed> {
1555+
query check_well_formed(key: LocalDefId) -> Result<(), ErrorGuaranteed> {
15561556
desc { |tcx| "checking that `{}` is well-formed", tcx.def_path_str(key) }
15571557
ensure_forwards_result_if_red
15581558
}

0 commit comments

Comments
 (0)