Skip to content

nll: incorrect unused_mut with move closure #51801

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
kazcw opened this issue Jun 26, 2018 · 2 comments · Fixed by #51964
Closed

nll: incorrect unused_mut with move closure #51801

kazcw opened this issue Jun 26, 2018 · 2 comments · Fixed by #51964
Labels
A-NLL Area: Non-lexical lifetimes (NLL) C-enhancement Category: An issue proposing an enhancement or a PR with one. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@kazcw
Copy link

kazcw commented Jun 26, 2018

With the nll feature enabled, a "variable does not need to be mutable" warning is emitted incorrectly when a variable is mutated from inside a move closure.

#![feature(nll)]

fn main() {
    let mut baz = 4; // "warning: variable does not need to be mutable"
    move || { baz = 6 };
}   
@kazcw kazcw changed the title feature(nll): incorrect unused_mut warning nll: incorrect unused_mut with move closure Jun 26, 2018
@leonardo-m
Copy link

Related to #50897 ?

@matthewjasper matthewjasper added A-NLL Area: Non-lexical lifetimes (NLL) WG-compiler-nll NLL-diagnostics Working towards the "diagnostic parity" goal labels Jun 26, 2018
@jkordish jkordish added C-enhancement Category: An issue proposing an enhancement or a PR with one. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Jun 26, 2018
@nikomatsakis
Copy link
Contributor

Tagging as NLL-deferred because #51918 has precedence

@nikomatsakis nikomatsakis removed the NLL-diagnostics Working towards the "diagnostic parity" goal label Jun 29, 2018
bors added a commit that referenced this issue Jul 5, 2018
…omatsakis

[NLL] Fix various unused mut errors

Closes #51801
Closes #50897
Closes #51830
Closes #51904
cc #51918 - keeping this one open in case there are any more issues

This PR contains multiple changes. List of changes with examples of what they fix:

* Change mir generation so that the parameter variable doesn't get a name when a `ref` pattern is used as an argument
```rust
fn f(ref y: i32) {} // doesn't trigger lint
```
* Change mir generation so that by-move closure captures don't get first moved into a temporary.
```rust
let mut x = 0; // doesn't trigger lint
move || {
    x = 1;
};
```
* Treat generator upvars the same as closure upvars
```rust
let mut x = 0; // This mut is now necessary and is not linted against.
move || {
    x = 1;
    yield;
};
```

r? @nikomatsakis
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-NLL Area: Non-lexical lifetimes (NLL) C-enhancement Category: An issue proposing an enhancement or a PR with one. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants