panic_in_result_fn: Extend to also check usages of [debug_]assert* macros
Also, the macro-finding logic has been moved to the util module, for use by future lints.
This commit is contained in:
parent
aaed9d9926
commit
e58c7dd168
7 changed files with 285 additions and 50 deletions
|
|
@ -1,4 +1,4 @@
|
|||
error: used `unimplemented!()`, `unreachable!()`, `todo!()` or `panic!()` in a function that returns `Result`
|
||||
error: used `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertion in a function that returns `Result`
|
||||
--> $DIR/panic_in_result_fn.rs:7:5
|
||||
|
|
||||
LL | / fn result_with_panic() -> Result<bool, String> // should emit lint
|
||||
|
|
@ -8,7 +8,7 @@ LL | | }
|
|||
| |_____^
|
||||
|
|
||||
= note: `-D clippy::panic-in-result-fn` implied by `-D warnings`
|
||||
= help: `unimplemented!()`, `unreachable!()`, `todo!()` or `panic!()` should not be used in a function that returns `Result` as `Result` is expected to return an error instead of crashing
|
||||
= help: `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertions should not be used in a function that returns `Result` as `Result` is expected to return an error instead of crashing
|
||||
note: return Err() instead of panicking
|
||||
--> $DIR/panic_in_result_fn.rs:9:9
|
||||
|
|
||||
|
|
@ -16,7 +16,7 @@ LL | panic!("error");
|
|||
| ^^^^^^^^^^^^^^^^
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: used `unimplemented!()`, `unreachable!()`, `todo!()` or `panic!()` in a function that returns `Result`
|
||||
error: used `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertion in a function that returns `Result`
|
||||
--> $DIR/panic_in_result_fn.rs:12:5
|
||||
|
|
||||
LL | / fn result_with_unimplemented() -> Result<bool, String> // should emit lint
|
||||
|
|
@ -25,7 +25,7 @@ LL | | unimplemented!();
|
|||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: `unimplemented!()`, `unreachable!()`, `todo!()` or `panic!()` should not be used in a function that returns `Result` as `Result` is expected to return an error instead of crashing
|
||||
= help: `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertions should not be used in a function that returns `Result` as `Result` is expected to return an error instead of crashing
|
||||
note: return Err() instead of panicking
|
||||
--> $DIR/panic_in_result_fn.rs:14:9
|
||||
|
|
||||
|
|
@ -33,7 +33,7 @@ LL | unimplemented!();
|
|||
| ^^^^^^^^^^^^^^^^^
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: used `unimplemented!()`, `unreachable!()`, `todo!()` or `panic!()` in a function that returns `Result`
|
||||
error: used `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertion in a function that returns `Result`
|
||||
--> $DIR/panic_in_result_fn.rs:17:5
|
||||
|
|
||||
LL | / fn result_with_unreachable() -> Result<bool, String> // should emit lint
|
||||
|
|
@ -42,7 +42,7 @@ LL | | unreachable!();
|
|||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: `unimplemented!()`, `unreachable!()`, `todo!()` or `panic!()` should not be used in a function that returns `Result` as `Result` is expected to return an error instead of crashing
|
||||
= help: `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertions should not be used in a function that returns `Result` as `Result` is expected to return an error instead of crashing
|
||||
note: return Err() instead of panicking
|
||||
--> $DIR/panic_in_result_fn.rs:19:9
|
||||
|
|
||||
|
|
@ -50,7 +50,7 @@ LL | unreachable!();
|
|||
| ^^^^^^^^^^^^^^^
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: used `unimplemented!()`, `unreachable!()`, `todo!()` or `panic!()` in a function that returns `Result`
|
||||
error: used `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertion in a function that returns `Result`
|
||||
--> $DIR/panic_in_result_fn.rs:22:5
|
||||
|
|
||||
LL | / fn result_with_todo() -> Result<bool, String> // should emit lint
|
||||
|
|
@ -59,7 +59,7 @@ LL | | todo!("Finish this");
|
|||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: `unimplemented!()`, `unreachable!()`, `todo!()` or `panic!()` should not be used in a function that returns `Result` as `Result` is expected to return an error instead of crashing
|
||||
= help: `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertions should not be used in a function that returns `Result` as `Result` is expected to return an error instead of crashing
|
||||
note: return Err() instead of panicking
|
||||
--> $DIR/panic_in_result_fn.rs:24:9
|
||||
|
|
||||
|
|
@ -67,7 +67,7 @@ LL | todo!("Finish this");
|
|||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: used `unimplemented!()`, `unreachable!()`, `todo!()` or `panic!()` in a function that returns `Result`
|
||||
error: used `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertion in a function that returns `Result`
|
||||
--> $DIR/panic_in_result_fn.rs:53:1
|
||||
|
|
||||
LL | / fn function_result_with_panic() -> Result<bool, String> // should emit lint
|
||||
|
|
@ -76,7 +76,7 @@ LL | | panic!("error");
|
|||
LL | | }
|
||||
| |_^
|
||||
|
|
||||
= help: `unimplemented!()`, `unreachable!()`, `todo!()` or `panic!()` should not be used in a function that returns `Result` as `Result` is expected to return an error instead of crashing
|
||||
= help: `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertions should not be used in a function that returns `Result` as `Result` is expected to return an error instead of crashing
|
||||
note: return Err() instead of panicking
|
||||
--> $DIR/panic_in_result_fn.rs:55:5
|
||||
|
|
||||
|
|
@ -84,7 +84,7 @@ LL | panic!("error");
|
|||
| ^^^^^^^^^^^^^^^^
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: used `unimplemented!()`, `unreachable!()`, `todo!()` or `panic!()` in a function that returns `Result`
|
||||
error: used `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertion in a function that returns `Result`
|
||||
--> $DIR/panic_in_result_fn.rs:68:1
|
||||
|
|
||||
LL | / fn main() -> Result<(), String> {
|
||||
|
|
@ -93,7 +93,7 @@ LL | | Ok(())
|
|||
LL | | }
|
||||
| |_^
|
||||
|
|
||||
= help: `unimplemented!()`, `unreachable!()`, `todo!()` or `panic!()` should not be used in a function that returns `Result` as `Result` is expected to return an error instead of crashing
|
||||
= help: `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertions should not be used in a function that returns `Result` as `Result` is expected to return an error instead of crashing
|
||||
note: return Err() instead of panicking
|
||||
--> $DIR/panic_in_result_fn.rs:69:5
|
||||
|
|
||||
|
|
|
|||
48
tests/ui/panic_in_result_fn_assertions.rs
Normal file
48
tests/ui/panic_in_result_fn_assertions.rs
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
#![warn(clippy::panic_in_result_fn)]
|
||||
#![allow(clippy::unnecessary_wraps)]
|
||||
|
||||
struct A;
|
||||
|
||||
impl A {
|
||||
fn result_with_assert_with_message(x: i32) -> Result<bool, String> // should emit lint
|
||||
{
|
||||
assert!(x == 5, "wrong argument");
|
||||
Ok(true)
|
||||
}
|
||||
|
||||
fn result_with_assert_eq(x: i32) -> Result<bool, String> // should emit lint
|
||||
{
|
||||
assert_eq!(x, 5);
|
||||
Ok(true)
|
||||
}
|
||||
|
||||
fn result_with_assert_ne(x: i32) -> Result<bool, String> // should emit lint
|
||||
{
|
||||
assert_ne!(x, 1);
|
||||
Ok(true)
|
||||
}
|
||||
|
||||
fn other_with_assert_with_message(x: i32) // should not emit lint
|
||||
{
|
||||
assert!(x == 5, "wrong argument");
|
||||
}
|
||||
|
||||
fn other_with_assert_eq(x: i32) // should not emit lint
|
||||
{
|
||||
assert_eq!(x, 5);
|
||||
}
|
||||
|
||||
fn other_with_assert_ne(x: i32) // should not emit lint
|
||||
{
|
||||
assert_ne!(x, 1);
|
||||
}
|
||||
|
||||
fn result_without_banned_functions() -> Result<bool, String> // should not emit lint
|
||||
{
|
||||
let assert = "assert!";
|
||||
println!("No {}", assert);
|
||||
Ok(true)
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
57
tests/ui/panic_in_result_fn_assertions.stderr
Normal file
57
tests/ui/panic_in_result_fn_assertions.stderr
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
error: used `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertion in a function that returns `Result`
|
||||
--> $DIR/panic_in_result_fn_assertions.rs:7:5
|
||||
|
|
||||
LL | / fn result_with_assert_with_message(x: i32) -> Result<bool, String> // should emit lint
|
||||
LL | | {
|
||||
LL | | assert!(x == 5, "wrong argument");
|
||||
LL | | Ok(true)
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= note: `-D clippy::panic-in-result-fn` implied by `-D warnings`
|
||||
= help: `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertions should not be used in a function that returns `Result` as `Result` is expected to return an error instead of crashing
|
||||
note: return Err() instead of panicking
|
||||
--> $DIR/panic_in_result_fn_assertions.rs:9:9
|
||||
|
|
||||
LL | assert!(x == 5, "wrong argument");
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: used `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertion in a function that returns `Result`
|
||||
--> $DIR/panic_in_result_fn_assertions.rs:13:5
|
||||
|
|
||||
LL | / fn result_with_assert_eq(x: i32) -> Result<bool, String> // should emit lint
|
||||
LL | | {
|
||||
LL | | assert_eq!(x, 5);
|
||||
LL | | Ok(true)
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertions should not be used in a function that returns `Result` as `Result` is expected to return an error instead of crashing
|
||||
note: return Err() instead of panicking
|
||||
--> $DIR/panic_in_result_fn_assertions.rs:15:9
|
||||
|
|
||||
LL | assert_eq!(x, 5);
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: used `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertion in a function that returns `Result`
|
||||
--> $DIR/panic_in_result_fn_assertions.rs:19:5
|
||||
|
|
||||
LL | / fn result_with_assert_ne(x: i32) -> Result<bool, String> // should emit lint
|
||||
LL | | {
|
||||
LL | | assert_ne!(x, 1);
|
||||
LL | | Ok(true)
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertions should not be used in a function that returns `Result` as `Result` is expected to return an error instead of crashing
|
||||
note: return Err() instead of panicking
|
||||
--> $DIR/panic_in_result_fn_assertions.rs:21:9
|
||||
|
|
||||
LL | assert_ne!(x, 1);
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
48
tests/ui/panic_in_result_fn_debug_assertions.rs
Normal file
48
tests/ui/panic_in_result_fn_debug_assertions.rs
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
#![warn(clippy::panic_in_result_fn)]
|
||||
#![allow(clippy::unnecessary_wraps)]
|
||||
|
||||
struct A;
|
||||
|
||||
impl A {
|
||||
fn result_with_debug_assert_with_message(x: i32) -> Result<bool, String> // should emit lint
|
||||
{
|
||||
debug_assert!(x == 5, "wrong argument");
|
||||
Ok(true)
|
||||
}
|
||||
|
||||
fn result_with_debug_assert_eq(x: i32) -> Result<bool, String> // should emit lint
|
||||
{
|
||||
debug_assert_eq!(x, 5);
|
||||
Ok(true)
|
||||
}
|
||||
|
||||
fn result_with_debug_assert_ne(x: i32) -> Result<bool, String> // should emit lint
|
||||
{
|
||||
debug_assert_ne!(x, 1);
|
||||
Ok(true)
|
||||
}
|
||||
|
||||
fn other_with_debug_assert_with_message(x: i32) // should not emit lint
|
||||
{
|
||||
debug_assert!(x == 5, "wrong argument");
|
||||
}
|
||||
|
||||
fn other_with_debug_assert_eq(x: i32) // should not emit lint
|
||||
{
|
||||
debug_assert_eq!(x, 5);
|
||||
}
|
||||
|
||||
fn other_with_debug_assert_ne(x: i32) // should not emit lint
|
||||
{
|
||||
debug_assert_ne!(x, 1);
|
||||
}
|
||||
|
||||
fn result_without_banned_functions() -> Result<bool, String> // should not emit lint
|
||||
{
|
||||
let debug_assert = "debug_assert!";
|
||||
println!("No {}", debug_assert);
|
||||
Ok(true)
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
57
tests/ui/panic_in_result_fn_debug_assertions.stderr
Normal file
57
tests/ui/panic_in_result_fn_debug_assertions.stderr
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
error: used `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertion in a function that returns `Result`
|
||||
--> $DIR/panic_in_result_fn_debug_assertions.rs:7:5
|
||||
|
|
||||
LL | / fn result_with_debug_assert_with_message(x: i32) -> Result<bool, String> // should emit lint
|
||||
LL | | {
|
||||
LL | | debug_assert!(x == 5, "wrong argument");
|
||||
LL | | Ok(true)
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= note: `-D clippy::panic-in-result-fn` implied by `-D warnings`
|
||||
= help: `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertions should not be used in a function that returns `Result` as `Result` is expected to return an error instead of crashing
|
||||
note: return Err() instead of panicking
|
||||
--> $DIR/panic_in_result_fn_debug_assertions.rs:9:9
|
||||
|
|
||||
LL | debug_assert!(x == 5, "wrong argument");
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: used `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertion in a function that returns `Result`
|
||||
--> $DIR/panic_in_result_fn_debug_assertions.rs:13:5
|
||||
|
|
||||
LL | / fn result_with_debug_assert_eq(x: i32) -> Result<bool, String> // should emit lint
|
||||
LL | | {
|
||||
LL | | debug_assert_eq!(x, 5);
|
||||
LL | | Ok(true)
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertions should not be used in a function that returns `Result` as `Result` is expected to return an error instead of crashing
|
||||
note: return Err() instead of panicking
|
||||
--> $DIR/panic_in_result_fn_debug_assertions.rs:15:9
|
||||
|
|
||||
LL | debug_assert_eq!(x, 5);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: used `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertion in a function that returns `Result`
|
||||
--> $DIR/panic_in_result_fn_debug_assertions.rs:19:5
|
||||
|
|
||||
LL | / fn result_with_debug_assert_ne(x: i32) -> Result<bool, String> // should emit lint
|
||||
LL | | {
|
||||
LL | | debug_assert_ne!(x, 1);
|
||||
LL | | Ok(true)
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: `unimplemented!()`, `unreachable!()`, `todo!()`, `panic!()` or assertions should not be used in a function that returns `Result` as `Result` is expected to return an error instead of crashing
|
||||
note: return Err() instead of panicking
|
||||
--> $DIR/panic_in_result_fn_debug_assertions.rs:21:9
|
||||
|
|
||||
LL | debug_assert_ne!(x, 1);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue