From 12f17957432fa03a8fe57c2b6063c662add45c2c Mon Sep 17 00:00:00 2001 From: 1000teslas <47207223+1000teslas@users.noreply.github.com> Date: Sun, 3 Jan 2021 03:53:50 +1100 Subject: [PATCH] Fix location of error message explanation --- .../diagnostics/conflict_errors.rs | 22 ++++++++++--------- .../issues/issue-78938-async-block.rs | 6 ++--- .../issues/issue-78938-async-block.stderr | 4 ++-- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/compiler/rustc_mir/src/borrow_check/diagnostics/conflict_errors.rs b/compiler/rustc_mir/src/borrow_check/diagnostics/conflict_errors.rs index 1dd102f4f34..43e9701aa25 100644 --- a/compiler/rustc_mir/src/borrow_check/diagnostics/conflict_errors.rs +++ b/compiler/rustc_mir/src/borrow_check/diagnostics/conflict_errors.rs @@ -1323,16 +1323,6 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { suggestion, 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 { ConstraintCategory::Return(_) | ConstraintCategory::OpaqueType => { @@ -1349,6 +1339,18 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { ), }; 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 } diff --git a/src/test/ui/async-await/issues/issue-78938-async-block.rs b/src/test/ui/async-await/issues/issue-78938-async-block.rs index e3d8eb73772..a16061fd979 100644 --- a/src/test/ui/async-await/issues/issue-78938-async-block.rs +++ b/src/test/ui/async-await/issues/issue-78938-async-block.rs @@ -16,7 +16,7 @@ fn game_loop(v: Arc>) {} fn spawn(future: F) -> JoinHandle where F: Future + Send + 'static, - F::Output: Send + 'static, + F::Output: Send + 'static, { loop {} } @@ -26,8 +26,8 @@ struct JoinHandle; impl Future for JoinHandle { type Output = (); fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - loop {} + loop {} } } -fn main() {} \ No newline at end of file +fn main() {} diff --git a/src/test/ui/async-await/issues/issue-78938-async-block.stderr b/src/test/ui/async-await/issues/issue-78938-async-block.stderr index 83cf1a5bc46..604c47b430f 100644 --- a/src/test/ui/async-await/issues/issue-78938-async-block.stderr +++ b/src/test/ui/async-await/issues/issue-78938-async-block.stderr @@ -8,8 +8,6 @@ LL | | game_loop(Arc::clone(&room_ref)) LL | | }); | |_____^ 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` --> $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 | | }); | |_____^ + = 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 | LL | let gameloop_handle = spawn(async move {