@@ -29,6 +29,11 @@ pub(crate) enum Duplicate {
2929 CrateDepends ,
3030}
3131
32+ enum CollectWeak {
33+ Allowed ,
34+ Ignore ,
35+ }
36+
3237struct LanguageItemCollector < ' ast , ' tcx > {
3338 items : LanguageItems ,
3439 tcx : TyCtxt < ' tcx > ,
@@ -60,19 +65,24 @@ impl<'ast, 'tcx> LanguageItemCollector<'ast, 'tcx> {
6065 attrs : & ' ast [ ast:: Attribute ] ,
6166 item_span : Span ,
6267 generics : Option < & ' ast ast:: Generics > ,
68+ collect_weak : CollectWeak ,
6369 ) {
6470 if let Some ( ( name, attr_span) ) = extract_ast ( attrs) {
6571 match LangItem :: from_name ( name) {
6672 // Known lang item with attribute on correct target.
6773 Some ( lang_item) if actual_target == lang_item. target ( ) => {
68- self . collect_item_extended (
69- lang_item,
70- def_id,
71- item_span,
72- attr_span,
73- generics,
74- actual_target,
75- ) ;
74+ // Weak lang items are handled separately
75+ // Weak only lang items are always handled here
76+ if !lang_item. is_weak ( ) || matches ! ( collect_weak, CollectWeak :: Allowed ) {
77+ self . collect_item_extended (
78+ lang_item,
79+ def_id,
80+ item_span,
81+ attr_span,
82+ generics,
83+ actual_target,
84+ ) ;
85+ }
7686 }
7787 // Known lang item with attribute on incorrect target.
7888 Some ( lang_item) => {
@@ -299,20 +309,33 @@ impl<'ast, 'tcx> visit::Visitor<'ast> for LanguageItemCollector<'ast, 'tcx> {
299309 & i. attrs ,
300310 i. span ,
301311 i. opt_generics ( ) ,
312+ CollectWeak :: Allowed ,
302313 ) ;
303314
304315 let parent_item = self . parent_item . replace ( i) ;
305316 visit:: walk_item ( self , i) ;
306317 self . parent_item = parent_item;
307318 }
308319
320+ fn visit_foreign_item ( & mut self , i : & ' ast ast:: ForeignItem ) {
321+ self . check_for_lang (
322+ Target :: Fn ,
323+ self . resolver . owners [ & i. id ] . def_id ,
324+ & i. attrs ,
325+ i. span ,
326+ None ,
327+ CollectWeak :: Ignore ,
328+ ) ;
329+ }
330+
309331 fn visit_variant ( & mut self , variant : & ' ast ast:: Variant ) {
310332 self . check_for_lang (
311333 Target :: Variant ,
312334 self . resolver . owners [ & self . parent_item . unwrap ( ) . id ] . node_id_to_def_id [ & variant. id ] ,
313335 & variant. attrs ,
314336 variant. span ,
315337 None ,
338+ CollectWeak :: Allowed ,
316339 ) ;
317340 }
318341
@@ -346,7 +369,14 @@ impl<'ast, 'tcx> visit::Visitor<'ast> for LanguageItemCollector<'ast, 'tcx> {
346369 }
347370 } ;
348371
349- self . check_for_lang ( target, self . resolver . owners [ & i. id ] . def_id , & i. attrs , i. span , generics) ;
372+ self . check_for_lang (
373+ target,
374+ self . resolver . owners [ & i. id ] . def_id ,
375+ & i. attrs ,
376+ i. span ,
377+ generics,
378+ CollectWeak :: Allowed ,
379+ ) ;
350380
351381 visit:: walk_assoc_item ( self , i, ctxt) ;
352382 }
0 commit comments