mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
fix: break inside async closure has incorrect span for enclosing closure
This commit is contained in:
parent
a330e49593
commit
05b7b46e65
@ -1311,6 +1311,14 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||||||
CoroutineKind::AsyncGen { .. } => hir::CoroutineDesugaring::AsyncGen,
|
CoroutineKind::AsyncGen { .. } => hir::CoroutineDesugaring::AsyncGen,
|
||||||
};
|
};
|
||||||
let closure_id = coroutine_kind.closure_id();
|
let closure_id = coroutine_kind.closure_id();
|
||||||
|
|
||||||
|
let span = if let FnRetTy::Default(span) = decl.output
|
||||||
|
&& matches!(coroutine_source, rustc_hir::CoroutineSource::Closure)
|
||||||
|
{
|
||||||
|
body_span.with_lo(span.lo())
|
||||||
|
} else {
|
||||||
|
body_span
|
||||||
|
};
|
||||||
let coroutine_expr = self.make_desugared_coroutine_expr(
|
let coroutine_expr = self.make_desugared_coroutine_expr(
|
||||||
// The default capture mode here is by-ref. Later on during upvar analysis,
|
// The default capture mode here is by-ref. Later on during upvar analysis,
|
||||||
// we will force the captured arguments to by-move, but for async closures,
|
// we will force the captured arguments to by-move, but for async closures,
|
||||||
@ -1319,7 +1327,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||||||
CaptureBy::Ref,
|
CaptureBy::Ref,
|
||||||
closure_id,
|
closure_id,
|
||||||
None,
|
None,
|
||||||
body_span,
|
span,
|
||||||
desugaring_kind,
|
desugaring_kind,
|
||||||
coroutine_source,
|
coroutine_source,
|
||||||
mkbody,
|
mkbody,
|
||||||
|
@ -20,15 +20,16 @@ LL | fn needs_async_fn(_: impl async Fn()) {}
|
|||||||
| ^^^^^^^^^^ required by this bound in `needs_async_fn`
|
| ^^^^^^^^^^ required by this bound in `needs_async_fn`
|
||||||
|
|
||||||
error[E0596]: cannot borrow `x` as mutable, as it is a captured variable in a `Fn` closure
|
error[E0596]: cannot borrow `x` as mutable, as it is a captured variable in a `Fn` closure
|
||||||
--> $DIR/wrong-fn-kind.rs:9:29
|
--> $DIR/wrong-fn-kind.rs:9:20
|
||||||
|
|
|
|
||||||
LL | fn needs_async_fn(_: impl async Fn()) {}
|
LL | fn needs_async_fn(_: impl async Fn()) {}
|
||||||
| --------------- change this to accept `FnMut` instead of `Fn`
|
| --------------- change this to accept `FnMut` instead of `Fn`
|
||||||
...
|
...
|
||||||
LL | needs_async_fn(async || {
|
LL | needs_async_fn(async || {
|
||||||
| _____--------------_--------_^
|
| -------------- ^-------
|
||||||
| | | |
|
| | |
|
||||||
| | | in this closure
|
| _____|______________in this closure
|
||||||
|
| | |
|
||||||
| | expects `Fn` instead of `FnMut`
|
| | expects `Fn` instead of `FnMut`
|
||||||
LL | |
|
LL | |
|
||||||
LL | | x += 1;
|
LL | | x += 1;
|
||||||
|
@ -18,6 +18,7 @@ async gen fn async_gen_fn() {
|
|||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let _ = async { break; }; //~ ERROR `break` inside `async` block
|
let _ = async { break; }; //~ ERROR `break` inside `async` block
|
||||||
|
|
||||||
let _ = async || { break; }; //~ ERROR `break` inside `async` closure
|
let _ = async || { break; }; //~ ERROR `break` inside `async` closure
|
||||||
|
|
||||||
let _ = gen { break; }; //~ ERROR `break` inside `gen` block
|
let _ = gen { break; }; //~ ERROR `break` inside `gen` block
|
||||||
|
@ -38,16 +38,16 @@ LL | let _ = async { break; };
|
|||||||
| enclosing `async` block
|
| enclosing `async` block
|
||||||
|
|
||||||
error[E0267]: `break` inside `async` closure
|
error[E0267]: `break` inside `async` closure
|
||||||
--> $DIR/break-inside-coroutine-issue-124495.rs:21:24
|
--> $DIR/break-inside-coroutine-issue-124495.rs:22:24
|
||||||
|
|
|
|
||||||
LL | let _ = async || { break; };
|
LL | let _ = async || { break; };
|
||||||
| --^^^^^---
|
| -----------^^^^^---
|
||||||
| | |
|
| | |
|
||||||
| | cannot `break` inside `async` closure
|
| | cannot `break` inside `async` closure
|
||||||
| enclosing `async` closure
|
| enclosing `async` closure
|
||||||
|
|
||||||
error[E0267]: `break` inside `gen` block
|
error[E0267]: `break` inside `gen` block
|
||||||
--> $DIR/break-inside-coroutine-issue-124495.rs:23:19
|
--> $DIR/break-inside-coroutine-issue-124495.rs:24:19
|
||||||
|
|
|
|
||||||
LL | let _ = gen { break; };
|
LL | let _ = gen { break; };
|
||||||
| ------^^^^^---
|
| ------^^^^^---
|
||||||
@ -56,7 +56,7 @@ LL | let _ = gen { break; };
|
|||||||
| enclosing `gen` block
|
| enclosing `gen` block
|
||||||
|
|
||||||
error[E0267]: `break` inside `async gen` block
|
error[E0267]: `break` inside `async gen` block
|
||||||
--> $DIR/break-inside-coroutine-issue-124495.rs:25:25
|
--> $DIR/break-inside-coroutine-issue-124495.rs:26:25
|
||||||
|
|
|
|
||||||
LL | let _ = async gen { break; };
|
LL | let _ = async gen { break; };
|
||||||
| ------------^^^^^---
|
| ------------^^^^^---
|
||||||
|
Loading…
Reference in New Issue
Block a user