Skip to content

redundant_locals errors about moving into a future #12225

@remexre

Description

@remexre

Summary

redundant_locals seems to not allow rebinding a variable under the same name inside an async block to move it into the future

Lint Name

redundant_locals

Reproducer

I tried this code: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=22d86f4fc958069bc1f1a94855a63060

fn main() {
    let do_not_move = String::new();
    let things_to_move = vec!["a".to_string(), "b".to_string()];
    let futures = things_to_move.into_iter().map(|move_me| async {
        let move_me = move_me;
        foo(&do_not_move, &move_me)
    });
}

fn foo(a: &str, b: &str) {}

I saw this happen:

error: redundant redefinition of a binding `move_me`
 --> src/main.rs:5:9
  |
5 |         let move_me = move_me;
  |         ^^^^^^^^^^^^^^^^^^^^^^
  |
help: `move_me` is initially defined here
 --> src/main.rs:4:51
  |
4 |     let futures = things_to_move.into_iter().map(|move_me| async {
  |                                                   ^^^^^^^
  = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_locals
  = note: `#[deny(clippy::redundant_locals)]` on by default

I expected to see this happen: no error

Version

Reproduces in playground; Rust 1.75.0, Clippy 0.1.75 (2023-12-21 82e1608)

Additional Labels

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-bugCategory: Clippy is not doing the correct thingI-false-positiveIssue: The lint was triggered on code it shouldn't have

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions