1
- use clippy_utils:: { diagnostics:: span_lint, must_use_attr, nth_arg, return_ty} ;
1
+ use clippy_utils:: ty:: is_must_use_ty;
2
+ use clippy_utils:: { diagnostics:: span_lint, nth_arg, return_ty} ;
2
3
use rustc_hir:: def_id:: LocalDefId ;
3
4
use rustc_hir:: intravisit:: FnKind ;
4
5
use rustc_hir:: { Body , FnDecl , HirId , TraitItem , TraitItemKind } ;
@@ -50,16 +51,18 @@ fn check_method(cx: &LateContext<'tcx>, decl: &'tcx FnDecl<'tcx>, fn_def: LocalD
50
51
if decl. implicit_self. has_implicit_self( ) ;
51
52
// We only show this warning for public exported methods.
52
53
if cx. access_levels. is_exported( fn_def) ;
54
+ // We don't want to emit this lint if the `#[must_use]` attribute is already there.
55
+ if !cx. tcx. hir( ) . attrs( hir_id) . iter( ) . any( |attr| attr. has_name( sym:: must_use) ) ;
53
56
if cx. tcx. visibility( fn_def. to_def_id( ) ) . is_public( ) ;
54
- // No need to warn if the attribute is already present.
55
- if must_use_attr( cx. tcx. hir( ) . attrs( hir_id) ) . is_none( ) ;
56
57
let ret_ty = return_ty( cx, hir_id) ;
57
58
let self_arg = nth_arg( cx, hir_id, 0 ) ;
58
59
// If `Self` has the same type as the returned type, then we want to warn.
59
60
//
60
61
// For this check, we don't want to remove the reference on the returned type because if
61
62
// there is one, we shouldn't emit a warning!
62
63
if self_arg. peel_refs( ) == ret_ty;
64
+ // If `Self` is already marked as `#[must_use]`, no need for the attribute here.
65
+ if !is_must_use_ty( cx, ret_ty) ;
63
66
64
67
then {
65
68
span_lint(
@@ -86,8 +89,6 @@ impl<'tcx> LateLintPass<'tcx> for ReturnSelfNotMustUse {
86
89
// We are only interested in methods, not in functions or associated functions.
87
90
if matches!( kind, FnKind :: Method ( _, _, _) ) ;
88
91
if let Some ( fn_def) = cx. tcx. hir( ) . opt_local_def_id( hir_id) ;
89
- // We don't want to emit this lint if the `#[must_use]` attribute is already there.
90
- if !cx. tcx. hir( ) . attrs( hir_id) . iter( ) . any( |attr| attr. has_name( sym:: must_use) ) ;
91
92
if let Some ( impl_def) = cx. tcx. impl_of_method( fn_def. to_def_id( ) ) ;
92
93
// We don't want this method to be te implementation of a trait because the
93
94
// `#[must_use]` should be put on the trait definition directly.
0 commit comments