Fix location of error message explanation

This commit is contained in:
1000teslas 2021-01-03 03:53:50 +11:00
parent 5ccef56456
commit 12f1795743
3 changed files with 17 additions and 15 deletions

View File

@ -1323,16 +1323,6 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
suggestion, suggestion,
Applicability::MachineApplicable, Applicability::MachineApplicable,
); );
if let Some(generator_kind) = use_span.generator_kind() {
if let GeneratorKind::Async(_) = generator_kind {
err.note(
"borrows cannot be held across a yield point, because the stack space of the current \
function is not preserved",
);
err.help("see https://rust-lang.github.io/async-book/03_async_await/01_chapter.html#awaiting-on-a-multithreaded-executor \
for more information");
}
}
let msg = match category { let msg = match category {
ConstraintCategory::Return(_) | ConstraintCategory::OpaqueType => { ConstraintCategory::Return(_) | ConstraintCategory::OpaqueType => {
@ -1349,6 +1339,18 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
), ),
}; };
err.span_note(constraint_span, &msg); err.span_note(constraint_span, &msg);
if let ConstraintCategory::CallArgument = category {
if let Some(generator_kind) = use_span.generator_kind() {
if let GeneratorKind::Async(_) = generator_kind {
err.note(
"borrows cannot be held across a yield point, because the stack \
space of the current function is not preserved",
);
err.help("see https://rust-lang.github.io/async-book/03_async_await/01_chapter.html#awaiting-on-a-multithreaded-executor \
for more information");
}
}
}
err err
} }

View File

@ -16,7 +16,7 @@ fn game_loop(v: Arc<Vec<usize>>) {}
fn spawn<F>(future: F) -> JoinHandle fn spawn<F>(future: F) -> JoinHandle
where where
F: Future + Send + 'static, F: Future + Send + 'static,
F::Output: Send + 'static, F::Output: Send + 'static,
{ {
loop {} loop {}
} }
@ -26,8 +26,8 @@ struct JoinHandle;
impl Future for JoinHandle { impl Future for JoinHandle {
type Output = (); type Output = ();
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
loop {} loop {}
} }
} }
fn main() {} fn main() {}

View File

@ -8,8 +8,6 @@ LL | | game_loop(Arc::clone(&room_ref))
LL | | }); LL | | });
| |_____^ may outlive borrowed value `room_ref` | |_____^ may outlive borrowed value `room_ref`
| |
= note: borrows cannot be held across a yield point, because the stack space of the current function is not preserved
= help: see https://rust-lang.github.io/async-book/03_async_await/01_chapter.html#awaiting-on-a-multithreaded-executor for more information
note: function requires argument type to outlive `'static` note: function requires argument type to outlive `'static`
--> $DIR/issue-78938-async-block.rs:8:33 --> $DIR/issue-78938-async-block.rs:8:33
| |
@ -18,6 +16,8 @@ LL | let gameloop_handle = spawn(async {
LL | | game_loop(Arc::clone(&room_ref)) LL | | game_loop(Arc::clone(&room_ref))
LL | | }); LL | | });
| |_____^ | |_____^
= note: borrows cannot be held across a yield point, because the stack space of the current function is not preserved
= help: see https://rust-lang.github.io/async-book/03_async_await/01_chapter.html#awaiting-on-a-multithreaded-executor for more information
help: to force the async block to take ownership of `room_ref` (and any other referenced variables), use the `move` keyword help: to force the async block to take ownership of `room_ref` (and any other referenced variables), use the `move` keyword
| |
LL | let gameloop_handle = spawn(async move { LL | let gameloop_handle = spawn(async move {