@@ -13,7 +13,6 @@ use rustc_data_structures::unord::{ExtendUnord, UnordMap, UnordSet};
1313use rustc_feature:: { ACCEPTED_LANG_FEATURES , EnabledLangFeature , EnabledLibFeature } ;
1414use rustc_hir:: def:: { DefKind , Res } ;
1515use rustc_hir:: def_id:: { CRATE_DEF_ID , LOCAL_CRATE , LocalDefId , LocalModDefId } ;
16- use rustc_hir:: hir_id:: CRATE_HIR_ID ;
1716use rustc_hir:: intravisit:: { self , Visitor , VisitorExt } ;
1817use rustc_hir:: { self as hir, AmbigArg , FieldDef , Item , ItemKind , TraitRef , Ty , TyKind , Variant } ;
1918use rustc_middle:: hir:: nested_filter;
@@ -410,7 +409,7 @@ struct MissingStabilityAnnotations<'tcx> {
410409
411410impl < ' tcx > MissingStabilityAnnotations < ' tcx > {
412411 #[ instrument( level = "trace" , skip( self ) ) ]
413- fn check_compatible_stability ( & self , def_id : LocalDefId , item_sp : Span ) {
412+ fn check_compatible_stability ( & self , def_id : LocalDefId ) {
414413 if !self . tcx . features ( ) . staged_api ( ) {
415414 return ;
416415 }
@@ -440,6 +439,7 @@ impl<'tcx> MissingStabilityAnnotations<'tcx> {
440439 || ( kind == AnnotationKind :: Container && stab. level . is_stable ( ) && depr. is_some ( ) )
441440 {
442441 if let Some ( span) = find_attr_span ! ( Stability ) {
442+ let item_sp = self . tcx . def_span ( def_id) ;
443443 self . tcx . dcx ( ) . emit_err ( errors:: UselessStability { span, item_sp } ) ;
444444 }
445445 }
@@ -451,6 +451,7 @@ impl<'tcx> MissingStabilityAnnotations<'tcx> {
451451 && let attrs:: StabilityLevel :: Stable { since : stab_since, .. } = stab. level
452452 && let Some ( span) = find_attr_span ! ( Stability )
453453 {
454+ let item_sp = self . tcx . def_span ( def_id) ;
454455 match stab_since {
455456 StableSince :: Current => {
456457 self . tcx
@@ -477,6 +478,7 @@ impl<'tcx> MissingStabilityAnnotations<'tcx> {
477478 && ACCEPTED_LANG_FEATURES . iter ( ) . find ( |f| f. name == feature) . is_some ( )
478479 && let Some ( span) = find_attr_span ! ( Stability )
479480 {
481+ let item_sp = self . tcx . def_span ( def_id) ;
480482 self . tcx
481483 . dcx ( )
482484 . emit_err ( errors:: UnstableAttrForAlreadyStableFeature { span, item_sp } ) ;
@@ -513,6 +515,7 @@ impl<'tcx> MissingStabilityAnnotations<'tcx> {
513515 && let Some ( const_span) = find_attr_span ! ( ConstStability )
514516 && ACCEPTED_LANG_FEATURES . iter ( ) . find ( |f| f. name == feature) . is_some ( )
515517 {
518+ let item_sp = self . tcx . def_span ( def_id) ;
516519 self . tcx . dcx ( ) . emit_err ( errors:: UnstableAttrForAlreadyStableFeature {
517520 span : const_span,
518521 item_sp,
@@ -529,19 +532,20 @@ impl<'tcx> MissingStabilityAnnotations<'tcx> {
529532 }
530533
531534 #[ instrument( level = "debug" , skip( self ) ) ]
532- fn check_missing_stability ( & self , def_id : LocalDefId , span : Span ) {
535+ fn check_missing_stability ( & self , def_id : LocalDefId ) {
533536 let stab = self . tcx . lookup_stability ( def_id) ;
534537 self . tcx . ensure_ok ( ) . lookup_const_stability ( def_id) ;
535538 if !self . tcx . sess . is_test_crate ( )
536539 && stab. is_none ( )
537540 && self . effective_visibilities . is_reachable ( def_id)
538541 {
539542 let descr = self . tcx . def_descr ( def_id. to_def_id ( ) ) ;
543+ let span = self . tcx . def_span ( def_id) ;
540544 self . tcx . dcx ( ) . emit_err ( errors:: MissingStabilityAttr { span, descr } ) ;
541545 }
542546 }
543547
544- fn check_missing_const_stability ( & self , def_id : LocalDefId , span : Span ) {
548+ fn check_missing_const_stability ( & self , def_id : LocalDefId ) {
545549 let is_const = self . tcx . is_const_fn ( def_id. to_def_id ( ) )
546550 || ( self . tcx . def_kind ( def_id. to_def_id ( ) ) == DefKind :: Trait
547551 && self . tcx . is_const_trait ( def_id. to_def_id ( ) ) ) ;
@@ -551,6 +555,7 @@ impl<'tcx> MissingStabilityAnnotations<'tcx> {
551555 && self . effective_visibilities . is_reachable ( def_id)
552556 && self . tcx . lookup_const_stability ( def_id) . is_none ( )
553557 {
558+ let span = self . tcx . def_span ( def_id) ;
554559 let descr = self . tcx . def_descr ( def_id. to_def_id ( ) ) ;
555560 self . tcx . dcx ( ) . emit_err ( errors:: MissingConstStabAttr { span, descr } ) ;
556561 }
@@ -565,7 +570,7 @@ impl<'tcx> Visitor<'tcx> for MissingStabilityAnnotations<'tcx> {
565570 }
566571
567572 fn visit_item ( & mut self , i : & ' tcx Item < ' tcx > ) {
568- self . check_compatible_stability ( i. owner_id . def_id , i . span ) ;
573+ self . check_compatible_stability ( i. owner_id . def_id ) ;
569574
570575 // Inherent impls and foreign modules serve only as containers for other items,
571576 // they don't have their own stability. They still can be annotated as unstable
@@ -576,54 +581,54 @@ impl<'tcx> Visitor<'tcx> for MissingStabilityAnnotations<'tcx> {
576581 hir:: ItemKind :: Impl ( hir:: Impl { of_trait: None , .. } )
577582 | hir:: ItemKind :: ForeignMod { .. }
578583 ) {
579- self . check_missing_stability ( i. owner_id . def_id , i . span ) ;
584+ self . check_missing_stability ( i. owner_id . def_id ) ;
580585 }
581586
582587 // Ensure stable `const fn` have a const stability attribute.
583- self . check_missing_const_stability ( i. owner_id . def_id , i . span ) ;
588+ self . check_missing_const_stability ( i. owner_id . def_id ) ;
584589
585590 intravisit:: walk_item ( self , i)
586591 }
587592
588593 fn visit_trait_item ( & mut self , ti : & ' tcx hir:: TraitItem < ' tcx > ) {
589- self . check_compatible_stability ( ti. owner_id . def_id , ti . span ) ;
590- self . check_missing_stability ( ti. owner_id . def_id , ti . span ) ;
594+ self . check_compatible_stability ( ti. owner_id . def_id ) ;
595+ self . check_missing_stability ( ti. owner_id . def_id ) ;
591596 intravisit:: walk_trait_item ( self , ti) ;
592597 }
593598
594599 fn visit_impl_item ( & mut self , ii : & ' tcx hir:: ImplItem < ' tcx > ) {
595- self . check_compatible_stability ( ii. owner_id . def_id , ii . span ) ;
600+ self . check_compatible_stability ( ii. owner_id . def_id ) ;
596601 let impl_def_id = self . tcx . hir_get_parent_item ( ii. hir_id ( ) ) ;
597602 if self . tcx . impl_trait_ref ( impl_def_id) . is_none ( ) {
598- self . check_missing_stability ( ii. owner_id . def_id , ii . span ) ;
599- self . check_missing_const_stability ( ii. owner_id . def_id , ii . span ) ;
603+ self . check_missing_stability ( ii. owner_id . def_id ) ;
604+ self . check_missing_const_stability ( ii. owner_id . def_id ) ;
600605 }
601606 intravisit:: walk_impl_item ( self , ii) ;
602607 }
603608
604609 fn visit_variant ( & mut self , var : & ' tcx Variant < ' tcx > ) {
605- self . check_compatible_stability ( var. def_id , var . span ) ;
606- self . check_missing_stability ( var. def_id , var . span ) ;
610+ self . check_compatible_stability ( var. def_id ) ;
611+ self . check_missing_stability ( var. def_id ) ;
607612 if let Some ( ctor_def_id) = var. data . ctor_def_id ( ) {
608- self . check_missing_stability ( ctor_def_id, var . span ) ;
613+ self . check_missing_stability ( ctor_def_id) ;
609614 }
610615 intravisit:: walk_variant ( self , var) ;
611616 }
612617
613618 fn visit_field_def ( & mut self , s : & ' tcx FieldDef < ' tcx > ) {
614- self . check_compatible_stability ( s. def_id , s . span ) ;
615- self . check_missing_stability ( s. def_id , s . span ) ;
619+ self . check_compatible_stability ( s. def_id ) ;
620+ self . check_missing_stability ( s. def_id ) ;
616621 intravisit:: walk_field_def ( self , s) ;
617622 }
618623
619624 fn visit_foreign_item ( & mut self , i : & ' tcx hir:: ForeignItem < ' tcx > ) {
620- self . check_compatible_stability ( i. owner_id . def_id , i . span ) ;
621- self . check_missing_stability ( i. owner_id . def_id , i . span ) ;
625+ self . check_compatible_stability ( i. owner_id . def_id ) ;
626+ self . check_missing_stability ( i. owner_id . def_id ) ;
622627 intravisit:: walk_foreign_item ( self , i) ;
623628 }
624629
625630 fn visit_generic_param ( & mut self , p : & ' tcx hir:: GenericParam < ' tcx > ) {
626- self . check_compatible_stability ( p. def_id , p . span ) ;
631+ self . check_compatible_stability ( p. def_id ) ;
627632 // Note that we don't need to `check_missing_stability` for default generic parameters,
628633 // as we assume that any default generic parameters without attributes are automatically
629634 // stable (assuming they have not inherited instability from their parent).
@@ -642,6 +647,21 @@ fn stability_implications(tcx: TyCtxt<'_>, LocalCrate: LocalCrate) -> UnordMap<S
642647/// features and possibly prints errors.
643648fn check_mod_unstable_api_usage ( tcx : TyCtxt < ' _ > , module_def_id : LocalModDefId ) {
644649 tcx. hir_visit_item_likes_in_module ( module_def_id, & mut Checker { tcx } ) ;
650+
651+ let is_staged_api =
652+ tcx. sess . opts . unstable_opts . force_unstable_if_unmarked || tcx. features ( ) . staged_api ( ) ;
653+ if is_staged_api {
654+ let effective_visibilities = & tcx. effective_visibilities ( ( ) ) ;
655+ let mut missing = MissingStabilityAnnotations { tcx, effective_visibilities } ;
656+ if module_def_id. is_top_level_module ( ) {
657+ missing. check_missing_stability ( CRATE_DEF_ID ) ;
658+ }
659+ tcx. hir_visit_item_likes_in_module ( module_def_id, & mut missing) ;
660+ }
661+
662+ if module_def_id. is_top_level_module ( ) {
663+ check_unused_or_stable_features ( tcx)
664+ }
645665}
646666
647667pub ( crate ) fn provide ( providers : & mut Providers ) {
@@ -992,16 +1012,9 @@ impl<'tcx> Visitor<'tcx> for CheckTraitImplStable<'tcx> {
9921012/// Given the list of enabled features that were not language features (i.e., that
9931013/// were expected to be library features), and the list of features used from
9941014/// libraries, identify activated features that don't exist and error about them.
1015+ // This is `pub` for rustdoc. rustc should call it through `check_mod_unstable_api_usage`.
9951016pub fn check_unused_or_stable_features ( tcx : TyCtxt < ' _ > ) {
996- let is_staged_api =
997- tcx. sess . opts . unstable_opts . force_unstable_if_unmarked || tcx. features ( ) . staged_api ( ) ;
998- if is_staged_api {
999- let effective_visibilities = & tcx. effective_visibilities ( ( ) ) ;
1000- let mut missing = MissingStabilityAnnotations { tcx, effective_visibilities } ;
1001- missing. check_missing_stability ( CRATE_DEF_ID , tcx. hir_span ( CRATE_HIR_ID ) ) ;
1002- tcx. hir_walk_toplevel_module ( & mut missing) ;
1003- tcx. hir_visit_all_item_likes_in_crate ( & mut missing) ;
1004- }
1017+ let _prof_timer = tcx. sess . timer ( "unused_lib_feature_checking" ) ;
10051018
10061019 let enabled_lang_features = tcx. features ( ) . enabled_lang_features ( ) ;
10071020 let mut lang_features = UnordSet :: default ( ) ;
0 commit comments