diff options
| author | Michael Goulet <michael@errs.io> | 2022-10-27 16:22:06 +0000 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2022-10-27 16:26:55 +0000 |
| commit | 4e0c27bbfd263580c971aee1ef6960914e20a7ff (patch) | |
| tree | 383a8174260203b28e98d09b67b32191484122c6 /src/test/ui/borrowck | |
| parent | dce44faf5b11cc9dd4491d7ed9211455f81bbdf2 (diff) | |
| download | rust-4e0c27bbfd263580c971aee1ef6960914e20a7ff.tar.gz rust-4e0c27bbfd263580c971aee1ef6960914e20a7ff.zip | |
Erase regions from CallArgument, add test + bless
Diffstat (limited to 'src/test/ui/borrowck')
| -rw-r--r-- | src/test/ui/borrowck/issue-103624.rs | 31 | ||||
| -rw-r--r-- | src/test/ui/borrowck/issue-103624.stderr | 35 |
2 files changed, 66 insertions, 0 deletions
diff --git a/src/test/ui/borrowck/issue-103624.rs b/src/test/ui/borrowck/issue-103624.rs new file mode 100644 index 00000000000..f1fa95f9246 --- /dev/null +++ b/src/test/ui/borrowck/issue-103624.rs @@ -0,0 +1,31 @@ +// edition:2021 + +struct StructA { + b: StructB, +} + +async fn spawn_blocking<T>(f: impl (Fn() -> T) + Send + Sync + 'static) -> T { + todo!() +} + +impl StructA { + async fn foo(&self) { + let bar = self.b.bar().await; + spawn_blocking(move || { + //~^ ERROR borrowed data escapes outside of associated function + self.b; + //~^ ERROR cannot move out of `self.b`, as `self` is a captured variable in an `Fn` closure + }) + .await; + } +} + +struct StructB {} + +impl StructB { + async fn bar(&self) -> Option<u8> { + None + } +} + +fn main() {} diff --git a/src/test/ui/borrowck/issue-103624.stderr b/src/test/ui/borrowck/issue-103624.stderr new file mode 100644 index 00000000000..e6a35dd8801 --- /dev/null +++ b/src/test/ui/borrowck/issue-103624.stderr @@ -0,0 +1,35 @@ +error[E0507]: cannot move out of `self.b`, as `self` is a captured variable in an `Fn` closure + --> $DIR/issue-103624.rs:16:13 + | +LL | async fn foo(&self) { + | ----- captured outer variable +LL | let bar = self.b.bar().await; +LL | spawn_blocking(move || { + | ------- captured by this `Fn` closure +LL | +LL | self.b; + | ^^^^^^ move occurs because `self.b` has type `StructB`, which does not implement the `Copy` trait + +error[E0521]: borrowed data escapes outside of associated function + --> $DIR/issue-103624.rs:14:9 + | +LL | async fn foo(&self) { + | ----- + | | + | `self` is a reference that is only valid in the associated function body + | let's call the lifetime of this reference `'1` +LL | let bar = self.b.bar().await; +LL | / spawn_blocking(move || { +LL | | +LL | | self.b; +LL | | +LL | | }) + | | ^ + | | | + | |__________`self` escapes the associated function body here + | argument requires that `'1` must outlive `'static` + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0507, E0521. +For more information about an error, try `rustc --explain E0507`. |
