diff --git a/compiler/rustc_ty_utils/src/opaque_types.rs b/compiler/rustc_ty_utils/src/opaque_types.rs index 7ddbafdb636..981919b7313 100644 --- a/compiler/rustc_ty_utils/src/opaque_types.rs +++ b/compiler/rustc_ty_utils/src/opaque_types.rs @@ -103,31 +103,26 @@ impl<'tcx> OpaqueTypeCollector<'tcx> { self.tcx.predicates_of(self.item).instantiate_identity(self.tcx).visit_with(self); // An item is allowed to constrain opaques declared within its own body (but not nested within // nested functions). - for id in self.find_taits_declared_in_body() { - self.opaques.extend(self.tcx.opaque_types_defined_by(id)) - } + self.collect_taits_declared_in_body(); } - #[instrument(level = "trace", skip(self), ret)] - fn find_taits_declared_in_body(&self) -> Vec { + #[instrument(level = "trace", skip(self))] + fn collect_taits_declared_in_body(&mut self) { let body = self.tcx.hir().body(self.tcx.hir().body_owned_by(self.item)).value; - struct TaitInBodyFinder<'tcx> { - /// Ids of type aliases found in the body - type_aliases: Vec, - tcx: TyCtxt<'tcx>, + struct TaitInBodyFinder<'a, 'tcx> { + collector: &'a mut OpaqueTypeCollector<'tcx>, } - impl<'v> intravisit::Visitor<'v> for TaitInBodyFinder<'_> { + impl<'v> intravisit::Visitor<'v> for TaitInBodyFinder<'_, '_> { #[instrument(level = "trace", skip(self))] fn visit_nested_item(&mut self, id: rustc_hir::ItemId) { let id = id.owner_id.def_id; - if let DefKind::TyAlias = self.tcx.def_kind(id) { - self.type_aliases.push(id); + if let DefKind::TyAlias = self.collector.tcx.def_kind(id) { + let items = self.collector.tcx.opaque_types_defined_by(id); + self.collector.opaques.extend(items); } } } - let mut visitor = TaitInBodyFinder { type_aliases: Default::default(), tcx: self.tcx }; - visitor.visit_expr(body); - visitor.type_aliases + TaitInBodyFinder { collector: self }.visit_expr(body); } }