Lint for unused borrows as part of UNUSED_MUST_USE

This commit is contained in:
hi-rustin 2021-06-18 15:09:40 +08:00
parent 1a462831ad
commit 88abd7d81d
18 changed files with 113 additions and 35 deletions

View file

@ -154,6 +154,7 @@ fn check_stmt(&mut self, cx: &LateContext<'_>, s: &hir::Stmt<'_>) {
| hir::BinOpKind::Shl
| hir::BinOpKind::Shr => Some("bitwise operation"),
},
hir::ExprKind::AddrOf(..) => Some("borrow"),
hir::ExprKind::Unary(..) => Some("unary operation"),
_ => None,
};

View file

@ -54,7 +54,7 @@ pub fn hash_stable_generic_derive(mut s: synstructure::Structure<'_>) -> proc_ma
quote! {}
} else if let Some(project) = attrs.project {
quote! {
&#bi.#project.hash_stable(__hcx, __hasher);
(&#bi.#project).hash_stable(__hcx, __hasher);
}
} else {
quote! {
@ -96,7 +96,7 @@ pub fn hash_stable_derive(mut s: synstructure::Structure<'_>) -> proc_macro2::To
quote! {}
} else if let Some(project) = attrs.project {
quote! {
&#bi.#project.hash_stable(__hcx, __hasher);
(&#bi.#project).hash_stable(__hcx, __hasher);
}
} else {
quote! {

View file

@ -534,7 +534,7 @@ fn half_a_million_letter_x() -> String {
#[test]
#[should_panic]
fn test_slice_fail() {
&"中华Việt Nam"[0..2];
let _ = &"中华Việt Nam"[0..2];
}
panic_cases! {
@ -714,13 +714,13 @@ mod boundary {
#[test]
#[should_panic(expected = "byte index 1024 is out of bounds of `Lorem ipsum dolor sit amet")]
fn test_slice_fail_truncated_1() {
&LOREM_PARAGRAPH[..1024];
let _ = &LOREM_PARAGRAPH[..1024];
}
// check the truncation in the panic message
#[test]
#[should_panic(expected = "luctus, im`[...]")]
fn test_slice_fail_truncated_2() {
&LOREM_PARAGRAPH[..1024];
let _ = &LOREM_PARAGRAPH[..1024];
}
}
@ -735,7 +735,7 @@ fn test_str_slice_rangetoinclusive_ok() {
#[should_panic]
fn test_str_slice_rangetoinclusive_notok() {
let s = "abcαβγ";
&s[..=3];
let _ = &s[..=3];
}
#[test]
@ -751,7 +751,7 @@ fn test_str_slicemut_rangetoinclusive_ok() {
fn test_str_slicemut_rangetoinclusive_notok() {
let mut s = "abcαβγ".to_owned();
let s: &mut str = &mut s;
&mut s[..=3];
let _ = &mut s[..=3];
}
#[test]

View file

@ -542,35 +542,35 @@ fn test_index_out_of_bounds() {
#[should_panic]
fn test_slice_out_of_bounds_1() {
let x = vec![1, 2, 3, 4, 5];
&x[!0..];
let _ = &x[!0..];
}
#[test]
#[should_panic]
fn test_slice_out_of_bounds_2() {
let x = vec![1, 2, 3, 4, 5];
&x[..6];
let _ = &x[..6];
}
#[test]
#[should_panic]
fn test_slice_out_of_bounds_3() {
let x = vec![1, 2, 3, 4, 5];
&x[!0..4];
let _ = &x[!0..4];
}
#[test]
#[should_panic]
fn test_slice_out_of_bounds_4() {
let x = vec![1, 2, 3, 4, 5];
&x[1..6];
let _ = &x[1..6];
}
#[test]
#[should_panic]
fn test_slice_out_of_bounds_5() {
let x = vec![1, 2, 3, 4, 5];
&x[3..2];
let _ = &x[3..2];
}
#[test]

View file

@ -301,7 +301,7 @@ fn wtf8_slice() {
#[test]
#[should_panic]
fn wtf8_slice_not_code_point_boundary() {
&Wtf8::from_str("aé 💩")[2..4];
let _ = &Wtf8::from_str("aé 💩")[2..4];
}
#[test]
@ -312,7 +312,7 @@ fn wtf8_slice_from() {
#[test]
#[should_panic]
fn wtf8_slice_from_not_code_point_boundary() {
&Wtf8::from_str("aé 💩")[2..];
let _ = &Wtf8::from_str("aé 💩")[2..];
}
#[test]
@ -323,7 +323,7 @@ fn wtf8_slice_to() {
#[test]
#[should_panic]
fn wtf8_slice_to_not_code_point_boundary() {
&Wtf8::from_str("aé 💩")[5..];
let _ = &Wtf8::from_str("aé 💩")[5..];
}
#[test]

View file

@ -17,7 +17,7 @@ impl Drop for Foo {
fn foo() {
let x: &[_] = &[Foo, Foo];
&x[3..4];
let _ = &x[3..4];
}
fn main() {

View file

@ -21,7 +21,7 @@ fn bar() -> usize {
fn foo() {
let x: &[_] = &[Foo, Foo];
&x[3..bar()];
let _ = &x[3..bar()];
}
fn main() {

View file

@ -67,14 +67,14 @@ fn index_mut(&mut self, _index: RangeFull) -> &mut Foo {
fn main() {
let mut x = Foo;
&x[..];
&x[Foo..];
&x[..Foo];
&x[Foo..Foo];
&mut x[..];
&mut x[Foo..];
&mut x[..Foo];
&mut x[Foo..Foo];
let _ = &x[..];
let _ = &x[Foo..];
let _ = &x[..Foo];
let _ = &x[Foo..Foo];
let _ = &mut x[..];
let _ = &mut x[Foo..];
let _ = &mut x[..Foo];
let _ = &mut x[Foo..Foo];
unsafe {
assert_eq!(COUNT, 8);
}

View file

@ -6,9 +6,9 @@ fn promote<const N: i32>() {
// works:
//
// let n = N;
// &n;
// let _ = &n;
&N;
let _ = &N;
}
fn main() {

View file

@ -29,6 +29,6 @@ fn index<'a>(&'a self, idx: usize) -> &'a (dyn Debug + 'static) {
fn main() {
assert_eq!(&S[0], "hello");
&T[0];
let _ = &T[0];
// let x = &x as &Debug;
}

View file

@ -15,7 +15,7 @@ fn main() {
yield ();
4i32
};
&a;
let _ = &a;
};
}
}

View file

@ -6,7 +6,7 @@ LL | | // Tests that the generator transformation finds out that `a`
LL | | // during the yield expression. Type checking will also compute liveness
LL | | // and it should also find out that `a` is not live.
... |
LL | | &a;
LL | | let _ = &a;
LL | | };
| |__________^
|

View file

@ -11,7 +11,7 @@ fn main() {
yield;
true
};
&opt;
let _ = &opt;
}
};
}

View file

@ -1,5 +1,5 @@
// run-pass
fn main() {
&&[()][0];
let _ = &&[()][0];
println!("{:?}", &[(),()][1]);
}

View file

@ -9,7 +9,7 @@ trait FontTableTagConversions {
impl FontTableTagConversions for FontTableTag {
fn tag_to_string(self) {
&self;
let _ = &self;
}
}

View file

@ -2,7 +2,7 @@
fn main() {
// We shouldn't promote this
&(main as fn() == main as fn());
let _ = &(main as fn() == main as fn());
// Also check nested case
&(&(main as fn()) == &(main as fn()));
let _ = &(&(main as fn()) == &(main as fn()));
}

View file

@ -0,0 +1,33 @@
#![deny(unused_must_use)]
fn foo(_: i32) -> bool { todo!() }
fn bar() -> &'static i32 {
&42;
//~^ unused
&mut foo(42);
//~^ unused
&&42;
//~^ unused
&&mut 42;
//~^ unused
&mut &42;
//~^ unused
let _result = foo(4)
&& foo(2); // Misplaced semi-colon (perhaps due to reordering of lines)
&& foo(42);
//~^ unused
let _ = &42; // ok
&42 // ok
}
fn main() {
let _ = bar();
}

View file

@ -0,0 +1,44 @@
error: unused borrow that must be used
--> $DIR/unused-borrows.rs:6:5
|
LL | &42;
| ^^^
|
note: the lint level is defined here
--> $DIR/unused-borrows.rs:1:9
|
LL | #![deny(unused_must_use)]
| ^^^^^^^^^^^^^^^
error: unused borrow that must be used
--> $DIR/unused-borrows.rs:9:5
|
LL | &mut foo(42);
| ^^^^^^^^^^^^
error: unused borrow that must be used
--> $DIR/unused-borrows.rs:12:5
|
LL | &&42;
| ^^^^
error: unused borrow that must be used
--> $DIR/unused-borrows.rs:15:5
|
LL | &&mut 42;
| ^^^^^^^^
error: unused borrow that must be used
--> $DIR/unused-borrows.rs:18:5
|
LL | &mut &42;
| ^^^^^^^^
error: unused borrow that must be used
--> $DIR/unused-borrows.rs:23:5
|
LL | && foo(42);
| ^^^^^^^^^^
error: aborting due to 6 previous errors