Skip to content

Commit

Permalink
Rollup merge of rust-lang#63699 - gilescope:async-move-diagnostic, r=…
Browse files Browse the repository at this point in the history
…estebank

Fix suggestion from incorrect `move async` to `async move`.

PR for rust-lang#61920. Happy with the test. There must be a better implementation though - possibly a MIR visitor to estabilsh a span that doesn't include the `async` keyword?
  • Loading branch information
Centril authored Aug 19, 2019
2 parents a2080a6 + ef3e66d commit 2c0f05a
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 1 deletion.
11 changes: 10 additions & 1 deletion src/librustc_mir/borrow_check/conflict_errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1190,7 +1190,16 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
);

let suggestion = match tcx.sess.source_map().span_to_snippet(args_span) {
Ok(string) => format!("move {}", string),
Ok(mut string) => {
if string.starts_with("async ") {
string.insert_str(6, "move ");
} else if string.starts_with("async|") {
string.insert_str(5, " move");
} else {
string.insert_str(0, "move ");
};
string
},
Err(_) => "move |<args>| <body>".to_string()
};

Expand Down
10 changes: 10 additions & 0 deletions src/test/ui/async-await/async-borrowck-escaping-closure-error.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// edition:2018
#![feature(async_closure,async_await)]
fn foo() -> Box<dyn std::future::Future<Output = u32>> {
let x = 0u32;
Box::new((async || x)())
//~^ ERROR E0373
}

fn main() {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
error[E0373]: closure may outlive the current function, but it borrows `x`, which is owned by the current function
--> $DIR/async-borrowck-escaping-closure-error.rs:5:15
|
LL | Box::new((async || x)())
| ^^^^^^^^ - `x` is borrowed here
| |
| may outlive borrowed value `x`
|
note: closure is returned here
--> $DIR/async-borrowck-escaping-closure-error.rs:5:5
|
LL | Box::new((async || x)())
| ^^^^^^^^^^^^^^^^^^^^^^^^
help: to force the closure to take ownership of `x` (and any other referenced variables), use the `move` keyword
|
LL | Box::new((async move || x)())
| ^^^^^^^^^^^^^

error: aborting due to previous error

For more information about this error, try `rustc --explain E0373`.

0 comments on commit 2c0f05a

Please sign in to comment.