9cee22c1a4
Fixes #69446 When we encounter a region error involving an `FnMut` closure, we display a specialized error message. However, we currently do not tell the user which upvar was captured. This makes it difficult to determine the cause of the error, especially when the closure is large. This commit records marks constraints involving closure upvars with `ConstraintCategory::ClosureUpvar`. When we decide to 'blame' a `ConstraintCategory::Return`, we additionall store the captured upvar if we found a `ConstraintCategory::ClosureUpvar` in the path. When generating an error message, we point to relevant spans if we have closure upvar information available. We further customize the message if an `async` closure is being returned, to make it clear that the captured variable is being returned indirectly.
20 lines
717 B
Plaintext
20 lines
717 B
Plaintext
error: captured variable cannot escape `FnMut` closure body
|
|
--> $DIR/issue-40510-3.rs:7:9
|
|
|
|
|
LL | let mut x: Vec<()> = Vec::new();
|
|
| ----- variable defined here
|
|
LL |
|
|
LL | || {
|
|
| - inferred to be a `FnMut` closure
|
|
LL | / || {
|
|
LL | | x.push(())
|
|
| | - variable captured here
|
|
LL | | }
|
|
| |_________^ returns a closure that contains a reference to a captured variable, which then escapes the closure body
|
|
|
|
|
= note: `FnMut` closures only have access to their captured variables while they are executing...
|
|
= note: ...therefore, they cannot allow references to captured variables to escape
|
|
|
|
error: aborting due to previous error
|
|
|