@@ -12,11 +12,11 @@ use rustc_lint::{LateContext, LateLintPass};
1212use rustc_middle:: hir:: map:: associated_body;
1313use rustc_middle:: hir:: nested_filter:: OnlyBodies ;
1414use rustc_middle:: mir:: FakeReadCause ;
15- use rustc_middle:: ty:: { self , Ty , UpvarId , UpvarPath } ;
15+ use rustc_middle:: ty:: { self , Ty , TyCtxt , UpvarId , UpvarPath } ;
1616use rustc_session:: { declare_tool_lint, impl_lint_pass} ;
17- use rustc_span:: def_id:: LocalDefId ;
17+ use rustc_span:: def_id:: { LocalDefId , CRATE_DEF_ID } ;
1818use rustc_span:: symbol:: kw;
19- use rustc_span:: Span ;
19+ use rustc_span:: { sym , Span } ;
2020use rustc_target:: spec:: abi:: Abi ;
2121
2222declare_clippy_lint ! {
@@ -93,6 +93,16 @@ fn should_skip<'tcx>(
9393 is_from_proc_macro ( cx, & input)
9494}
9595
96+ fn inherits_cfg ( tcx : TyCtxt < ' _ > , def_id : LocalDefId ) -> bool {
97+ if def_id == CRATE_DEF_ID {
98+ false
99+ } else if tcx. has_attr ( def_id, sym:: cfg) {
100+ true
101+ } else {
102+ inherits_cfg ( tcx, tcx. parent_module_from_def_id ( def_id) )
103+ }
104+ }
105+
96106impl < ' tcx > LateLintPass < ' tcx > for NeedlessPassByRefMut < ' tcx > {
97107 fn check_fn (
98108 & mut self ,
@@ -192,10 +202,12 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessPassByRefMut<'tcx> {
192202 let show_semver_warning =
193203 self . avoid_breaking_exported_api && cx. effective_visibilities . is_exported ( * fn_def_id) ;
194204
205+ let mut is_cfged = None ;
195206 for input in unused {
196207 // If the argument is never used mutably, we emit the warning.
197208 let sp = input. span ;
198209 if let rustc_hir:: TyKind :: Ref ( _, inner_ty) = input. kind {
210+ let is_cfged = is_cfged. get_or_insert_with ( || inherits_cfg ( cx. tcx , * fn_def_id) ) ;
199211 span_lint_hir_and_then (
200212 cx,
201213 NEEDLESS_PASS_BY_REF_MUT ,
@@ -212,6 +224,9 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessPassByRefMut<'tcx> {
212224 if show_semver_warning {
213225 diag. warn ( "changing this function will impact semver compatibility" ) ;
214226 }
227+ if * is_cfged {
228+ diag. note ( "this is cfg-gated and may require further changes" ) ;
229+ }
215230 } ,
216231 ) ;
217232 }
0 commit comments