X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=compiler%2Frustc_passes%2Fsrc%2Fweak_lang_items.rs;h=363895d1cb3f7bd597128f39c43dd1a3f30beba0;hb=d2840d237c98531bcb15453ff1b40e401c5335e0;hp=6b73c95011940a1cc0c3883574ab46d33420d44e;hpb=ce6c1484f8963cee8b793f010ad84ef7e94d2b91;p=rust.git diff --git a/compiler/rustc_passes/src/weak_lang_items.rs b/compiler/rustc_passes/src/weak_lang_items.rs index 6b73c950119..363895d1cb3 100644 --- a/compiler/rustc_passes/src/weak_lang_items.rs +++ b/compiler/rustc_passes/src/weak_lang_items.rs @@ -2,20 +2,11 @@ use rustc_data_structures::fx::FxHashSet; use rustc_errors::struct_span_err; -use rustc_hir as hir; -use rustc_hir::intravisit::{self, Visitor}; use rustc_hir::lang_items::{self, LangItem}; use rustc_hir::weak_lang_items::WEAK_ITEMS_REFS; use rustc_middle::middle::lang_items::required; use rustc_middle::ty::TyCtxt; use rustc_session::config::CrateType; -use rustc_span::symbol::Symbol; -use rustc_span::Span; - -struct Context<'a, 'tcx> { - tcx: TyCtxt<'tcx>, - items: &'a mut lang_items::LanguageItems, -} /// Checks the crate for usage of weak lang items, returning a vector of all the /// language items required by this crate, but not defined yet. @@ -30,10 +21,28 @@ pub fn check_crate<'tcx>(tcx: TyCtxt<'tcx>, items: &mut lang_items::LanguageItem items.missing.push(LangItem::EhCatchTypeinfo); } - { - let mut cx = Context { tcx, items }; - tcx.hir().visit_all_item_likes(&mut cx.as_deep_visitor()); + let crate_items = tcx.hir_crate_items(()); + for id in crate_items.foreign_items() { + let attrs = tcx.hir().attrs(id.hir_id()); + let span = tcx.hir().span(id.hir_id()); + if let Some((lang_item, _)) = lang_items::extract(attrs) { + if let Some(&item) = WEAK_ITEMS_REFS.get(&lang_item) { + if items.require(item).is_err() { + items.missing.push(item); + } + } else { + struct_span_err!( + tcx.sess, + span, + E0264, + "unknown external lang item: `{}`", + lang_item + ) + .emit(); + } + } } + verify(tcx, items); } @@ -80,26 +89,3 @@ fn verify<'tcx>(tcx: TyCtxt<'tcx>, items: &lang_items::LanguageItems) { } } } - -impl<'a, 'tcx> Context<'a, 'tcx> { - fn register(&mut self, name: Symbol, span: Span) { - if let Some(&item) = WEAK_ITEMS_REFS.get(&name) { - if self.items.require(item).is_err() { - self.items.missing.push(item); - } - } else { - struct_span_err!(self.tcx.sess, span, E0264, "unknown external lang item: `{}`", name) - .emit(); - } - } -} - -impl<'a, 'tcx, 'v> Visitor<'v> for Context<'a, 'tcx> { - fn visit_foreign_item(&mut self, i: &hir::ForeignItem<'_>) { - let attrs = self.tcx.hir().attrs(i.hir_id()); - if let Some((lang_item, _)) = lang_items::extract(attrs) { - self.register(lang_item, i.span); - } - intravisit::walk_foreign_item(self, i) - } -}