rust-lang / rust-lang/rust-analyzer

Wrong inferred `impl FnMut()`

Open
#16,003 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

C-bug
Dominant language
Rust
Stars
16.9k
Forks
2.2k
Avg merge
1d 12h
Merged PRs (30d)
72

Description

rust-analyzer version: 0.3.1748-standalone (237712fa3 2023-11-26)
rustc version: 1.74.0

rust-analyzer infers wrong type for closure, rustc says it only implements FnOnce, but RA shows impl FnMut

image

struct Int(i32);
impl Int {
    fn change(&mut self) {
        self.0 += 1;
    }
}
let mut int = Int(0);

// RA: impl FnMut()
let foo = move || {
    async move {
        int.change();
    };
};

fn is_it_fn_mut(_val: impl FnMut()) {}
is_it_fn_mut(foo); // rustc error

rustc error:
image

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reproducing the minimal closure example in the issue with the specified rust-analyzer and rustc versions, then compare the inferred impl FnMut() with rustc's FnOnce result. The issue is done when rust-analyzer reports the closure's inferred trait consistently with rustc for this case.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.