rust-clippy icon indicating copy to clipboard operation
rust-clippy copied to clipboard

False positivie (I think): blocks_in_conditions

Open BurnyLlama opened this issue 1 year ago • 3 comments

Summary

The project is using the rocket web framework, and I get the issue on a struct deriving FromForm.

This is the output I get for cargo clippy:

warning: unused manifest key: build
    Checking news-site v0.1.0 (/home/USER/Development/news-site)
error: in a `match` scrutinee, avoid complex blocks or closures with blocks; instead, move the block or closure higher and bind it with a `let`
  --> src/app/control_panel.rs:21:28
   |
21 |   struct PublishTextForm<'a> {
   |  ____________________________^
22 | |     #[field(name = "text-type")]
23 | |     text_type: TextType,
   | |_______________________^ help: try: `let res = TextType; match res`
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#blocks_in_conditions
note: the lint level is defined here
  --> src/main.rs:2:9
   |
2  | #![deny(warnings)]
   |         ^^^^^^^^
   = note: `#[deny(clippy::blocks_in_conditions)]` implied by `#[deny(warnings)]`

error: in a `match` scrutinee, avoid complex blocks or closures with blocks; instead, move the block or closure higher and bind it with a `let`
  --> src/app/control_panel.rs:21:28
   |
21 |   struct PublishTextForm<'a> {
   |  ____________________________^
22 | |     #[field(name = "text-type")]
23 | |     text_type: TextType,
24 | |     title: &'a str,
   | |____________^ help: try: `let res = &; match res`
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#blocks_in_conditions

error: in a `match` scrutinee, avoid complex blocks or closures with blocks; instead, move the block or closure higher and bind it with a `let`
  --> src/app/control_panel.rs:21:28
   |
21 |   struct PublishTextForm<'a> {
   |  ____________________________^
22 | |     #[field(name = "text-type")]
23 | |     text_type: TextType,
24 | |     title: &'a str,
25 | |     #[field(name = "leading-paragraph")]
26 | |     leading_paragraph: &'a str,
   | |________________________^ help: try: `let res = &; match res`
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#blocks_in_conditions

error: in a `match` scrutinee, avoid complex blocks or closures with blocks; instead, move the block or closure higher and bind it with a `let`
  --> src/app/control_panel.rs:21:28
   |
21 |   struct PublishTextForm<'a> {
   |  ____________________________^
22 | |     #[field(name = "text-type")]
23 | |     text_type: TextType,
24 | |     title: &'a str,
...  |
27 | |     #[field(name = "text-body")]
28 | |     text_body: &'a str,
   | |________________^ help: try: `let res = &; match res`
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#blocks_in_conditions

error: in a `match` scrutinee, avoid complex blocks or closures with blocks; instead, move the block or closure higher and bind it with a `let`
  --> src/app/control_panel.rs:21:28
   |
21 |   struct PublishTextForm<'a> {
   |  ____________________________^
22 | |     #[field(name = "text-type")]
23 | |     text_type: TextType,
24 | |     title: &'a str,
...  |
28 | |     text_body: &'a str,
29 | |     tags: &'a str,
   | |___________^ help: try: `let res = &; match res`
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#blocks_in_conditions

error: could not compile `news-site` (bin "news-site") due to 5 previous errors

Using clippy 0.1.77 (7cf61eb 2024-03-27)

Full code can be found here: https://github.com/LinneaStudenttidning/news-site

Lint Name

blocks_in_conditions

Reproducer

I tried this code:

#[derive(FromForm)]
struct PublishTextForm<'a> {
    #[field(name = "text-type")]
    text_type: TextType,
    title: &'a str,
    #[field(name = "leading-paragraph")]
    leading_paragraph: &'a str,
    #[field(name = "text-body")]
    text_body: &'a str,
    tags: &'a str,
}

I also tried to suppress the error like this:

#[allow(clippy::blocks_in_conditions)]
#[derive(FromForm)]
struct PublishTextForm<'a> {
    #[field(name = "text-type")]
    text_type: TextType,
    title: &'a str,
    #[field(name = "leading-paragraph")]
    leading_paragraph: &'a str,
    #[field(name = "text-body")]
    text_body: &'a str,
    tags: &'a str,
}

But that still fails! (With the same error...)

Then I saw the error mentioned above.

I expected to see this happen: Nothing, since the code does not directly reference a match statement. I guess there could be some "hidden" match statement behind for example the derive macro...

Version

rustc 1.77.1 (7cf61ebde 2024-03-27)
binary: rustc
commit-hash: 7cf61ebde7b22796c69757901dd346d0fe70bd97
commit-date: 2024-03-27
host: x86_64-unknown-linux-gnu
release: 1.77.1
LLVM version: 17.0.6

Additional Labels

No response

BurnyLlama avatar Apr 06 '24 22:04 BurnyLlama

I have the exact same problem. I wanted to add that the same bug exists in 1.76.0 but not in 1.75.0.

nemicha avatar Apr 09 '24 14:04 nemicha

Yeah, I upgraded my toolchain and the issues showed up. Should probably have said that before!

BurnyLlama avatar Apr 09 '24 19:04 BurnyLlama

I'm seeing this too with Rocket's FromForm derive. The warning shows up for me when Rust >= 1.76 but is not present in 1.75.

calteran avatar Apr 11 '24 10:04 calteran