@@ -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,23 @@ 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+ if !lang_item. is_weak ( ) || matches ! ( collect_weak, CollectWeak :: Allowed ) {
76+ self . collect_item_extended (
77+ lang_item,
78+ def_id,
79+ item_span,
80+ attr_span,
81+ generics,
82+ actual_target,
83+ ) ;
84+ }
7685 }
7786 // Known lang item with attribute on incorrect target.
7887 Some ( lang_item) => {
@@ -299,20 +308,33 @@ impl<'ast, 'tcx> visit::Visitor<'ast> for LanguageItemCollector<'ast, 'tcx> {
299308 & i. attrs ,
300309 i. span ,
301310 i. opt_generics ( ) ,
311+ CollectWeak :: Allowed ,
302312 ) ;
303313
304314 let parent_item = self . parent_item . replace ( i) ;
305315 visit:: walk_item ( self , i) ;
306316 self . parent_item = parent_item;
307317 }
308318
319+ fn visit_foreign_item ( & mut self , i : & ' ast ast:: ForeignItem ) {
320+ self . check_for_lang (
321+ Target :: Fn ,
322+ self . resolver . node_id_to_def_id [ & i. id ] ,
323+ & i. attrs ,
324+ i. span ,
325+ None ,
326+ CollectWeak :: Ignore ,
327+ ) ;
328+ }
329+
309330 fn visit_variant ( & mut self , variant : & ' ast ast:: Variant ) {
310331 self . check_for_lang (
311332 Target :: Variant ,
312333 self . resolver . node_id_to_def_id [ & variant. id ] ,
313334 & variant. attrs ,
314335 variant. span ,
315336 None ,
337+ CollectWeak :: Allowed ,
316338 ) ;
317339 }
318340
@@ -352,6 +374,7 @@ impl<'ast, 'tcx> visit::Visitor<'ast> for LanguageItemCollector<'ast, 'tcx> {
352374 & i. attrs ,
353375 i. span ,
354376 generics,
377+ CollectWeak :: Allowed ,
355378 ) ;
356379
357380 visit:: walk_assoc_item ( self , i, ctxt) ;
0 commit comments