- Notifications
You must be signed in to change notification settings - Fork 14k
Closed
Labels
A-NLLArea: Non-lexical lifetimes (NLL)Area: Non-lexical lifetimes (NLL)NLL-completeWorking towards the "valid code works" goalWorking towards the "valid code works" goalT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.
Milestone
Description
In this example, the NLL checker incorrectly judges foo to be borrowed more than once:
#![feature(nll)] struct Foo { x: u32 } impl Foo { fn twiddle(&mut self) -> &mut Self { self } fn twaddle(&mut self) -> &mut Self { self } fn emit(&mut self) { self.x += 1; } } fn main() { let mut foo = Foo { x: 0 }; match 22 { 22 => &mut foo, 44 => foo.twiddle(), _ => foo.twaddle(), }.emit(); }I get this error:
error[E0499]: cannot borrow `foo` as mutable more than once at a time --> src/main.rs:17:5 | 17 | / match 22 { 18 | | 22 => &mut foo, 19 | | 44 => foo.twiddle(), | | --- first mutable borrow occurs here 20 | | _ => foo.twaddle(), 21 | | }.emit(); | |_____^ second mutable borrow occurs here This works without NLL. This was found while trying to bootstrap rustc with NLL enabled, where it manifests as:
error[E0499]: cannot borrow `diag_builder` as mutable more than once at a time --> src/librustc/lint/levels.rs:304:13 | 304 | / match forbid_src { 305 | | LintSource::Default => &mut diag_builder, 306 | | LintSource::Node(_, forbid_source_span) => { 307 | | diag_builder.span_label(forbid_source_span, ... | 311 | | diag_builder.note("`forbid` lint level was set on command line") | | ------------ first mutable borrow occurs here 312 | | } 313 | | }.emit(); | |_____________^ second mutable borrow occurs here Metadata
Metadata
Assignees
Labels
A-NLLArea: Non-lexical lifetimes (NLL)Area: Non-lexical lifetimes (NLL)NLL-completeWorking towards the "valid code works" goalWorking towards the "valid code works" goalT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.