1
- use clippy_utils:: diagnostics:: span_lint_and_help;
2
- use clippy_utils:: ty:: peel_mid_ty_refs;
1
+ use clippy_utils:: { diagnostics:: span_lint_and_help, path_def_id, ty:: peel_mid_ty_refs} ;
3
2
use rustc_hir:: { Expr , ExprKind } ;
4
3
use rustc_lint:: { LateContext , LateLintPass } ;
5
4
use rustc_session:: { declare_lint_pass, declare_tool_lint} ;
@@ -13,9 +12,9 @@ declare_clippy_lint! {
13
12
///
14
13
/// ### Why is this bad?
15
14
///
16
- /// The result of calling `size_of_val()` with a reference to a reference
17
- /// as the argument will be the size of any generic reference-type, not
18
- /// the size of the value behind the reference.
15
+ /// Calling `size_of_val()` with a reference to a reference as the argument
16
+ /// yields the size of the reference-type, not the size of the value behind
17
+ /// the reference.
19
18
///
20
19
/// ### Example
21
20
/// ```rust
@@ -25,10 +24,10 @@ declare_clippy_lint! {
25
24
///
26
25
/// impl Foo {
27
26
/// fn size(&self) -> usize {
28
- /// // Note that `&self` as an argument is a `&&Foo`: Bacause `self`
29
- /// // is already a reference, `&self` is a double-reference,
30
- /// // and the return value of `size_of_val()` therefor is the
31
- /// // size of any generic reference-type.
27
+ /// // Note that `&self` as an argument is a `&&Foo`: Because `self`
28
+ /// // is already a reference, `&self` is a double-reference.
29
+ /// // The return value of `size_of_val()` therefor is the
30
+ /// // size of the reference-type, not the size of `self` .
32
31
/// std::mem::size_of_val(&self)
33
32
/// }
34
33
/// }
@@ -48,16 +47,15 @@ declare_clippy_lint! {
48
47
/// ```
49
48
#[ clippy:: version = "1.67.0" ]
50
49
pub SIZE_OF_REF ,
51
- correctness ,
50
+ suspicious ,
52
51
"Argument to `std::mem::size_of_val()` is a double-reference, which is almost certainly unintended"
53
52
}
54
53
declare_lint_pass ! ( SizeOfRef => [ SIZE_OF_REF ] ) ;
55
54
56
55
impl LateLintPass < ' _ > for SizeOfRef {
57
56
fn check_expr ( & mut self , cx : & LateContext < ' _ > , expr : & ' _ Expr < ' _ > ) {
58
57
if let ExprKind :: Call ( path, [ arg] ) = expr. kind
59
- && let ExprKind :: Path ( ref qpath) = path. kind
60
- && let Some ( def_id) = cx. qpath_res ( qpath, path. hir_id ) . opt_def_id ( )
58
+ && let Some ( def_id) = path_def_id ( cx, path)
61
59
&& cx. tcx . is_diagnostic_item ( sym:: mem_size_of_val, def_id)
62
60
&& let arg_ty = cx. typeck_results ( ) . expr_ty ( arg)
63
61
&& peel_mid_ty_refs ( arg_ty) . 1 > 1
0 commit comments