mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-04 19:29:07 +00:00
Tests around moving parts of structs and tuples across await points
This commit is contained in:
parent
4be0675589
commit
ef0f49054f
@ -0,0 +1,20 @@
|
|||||||
|
// build-pass
|
||||||
|
// edition:2018
|
||||||
|
// compile-flags: --crate-type lib
|
||||||
|
|
||||||
|
#![feature(async_await)]
|
||||||
|
|
||||||
|
struct Small {
|
||||||
|
x: Vec<usize>,
|
||||||
|
y: Vec<usize>,
|
||||||
|
}
|
||||||
|
|
||||||
|
// You are allowed to move out part of a struct to an async fn, you still
|
||||||
|
// have access to remaining parts after awaiting
|
||||||
|
async fn move_part_await_return_rest_struct() -> Vec<usize> {
|
||||||
|
let s = Small { x: vec![31], y: vec![19, 1441] };
|
||||||
|
needs_vec(s.x).await;
|
||||||
|
s.y
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn needs_vec(_vec: Vec<usize>) {}
|
14
src/test/ui/async-await/move-part-await-return-rest-tuple.rs
Normal file
14
src/test/ui/async-await/move-part-await-return-rest-tuple.rs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
// build-pass
|
||||||
|
// edition:2018
|
||||||
|
// compile-flags: --crate-type lib
|
||||||
|
|
||||||
|
#![feature(async_await)]
|
||||||
|
|
||||||
|
async fn move_part_await_return_rest_tuple() -> Vec<usize> {
|
||||||
|
let x = (vec![3], vec![4, 4]);
|
||||||
|
drop(x.1);
|
||||||
|
echo(x.0[0]).await;
|
||||||
|
x.0
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn echo(x: usize) -> usize { x }
|
19
src/test/ui/async-await/no-move-across-await-struct.rs
Normal file
19
src/test/ui/async-await/no-move-across-await-struct.rs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
// compile-fail
|
||||||
|
// edition:2018
|
||||||
|
// compile-flags: --crate-type lib
|
||||||
|
|
||||||
|
#![feature(async_await)]
|
||||||
|
|
||||||
|
async fn no_move_across_await_struct() -> Vec<usize> {
|
||||||
|
let s = Small { x: vec![31], y: vec![19, 1441] };
|
||||||
|
needs_vec(s.x).await;
|
||||||
|
s.x
|
||||||
|
//~^ ERROR use of moved value: `s.x`
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Small {
|
||||||
|
x: Vec<usize>,
|
||||||
|
y: Vec<usize>,
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn needs_vec(_vec: Vec<usize>) {}
|
13
src/test/ui/async-await/no-move-across-await-struct.stderr
Normal file
13
src/test/ui/async-await/no-move-across-await-struct.stderr
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
error[E0382]: use of moved value: `s.x`
|
||||||
|
--> $DIR/no-move-across-await-struct.rs:10:5
|
||||||
|
|
|
||||||
|
LL | needs_vec(s.x).await;
|
||||||
|
| --- value moved here
|
||||||
|
LL | s.x
|
||||||
|
| ^^^ value used here after move
|
||||||
|
|
|
||||||
|
= note: move occurs because `s.x` has type `std::vec::Vec<usize>`, which does not implement the `Copy` trait
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0382`.
|
15
src/test/ui/async-await/no-move-across-await-tuple.rs
Normal file
15
src/test/ui/async-await/no-move-across-await-tuple.rs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// compile-fail
|
||||||
|
// edition:2018
|
||||||
|
// compile-flags: --crate-type lib
|
||||||
|
|
||||||
|
#![feature(async_await)]
|
||||||
|
|
||||||
|
async fn no_move_across_await_tuple() -> Vec<usize> {
|
||||||
|
let x = (vec![3], vec![4, 4]);
|
||||||
|
drop(x.1);
|
||||||
|
nothing().await;
|
||||||
|
x.1
|
||||||
|
//~^ ERROR use of moved value: `x.1`
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn nothing() {}
|
14
src/test/ui/async-await/no-move-across-await-tuple.stderr
Normal file
14
src/test/ui/async-await/no-move-across-await-tuple.stderr
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
error[E0382]: use of moved value: `x.1`
|
||||||
|
--> $DIR/no-move-across-await-tuple.rs:11:5
|
||||||
|
|
|
||||||
|
LL | drop(x.1);
|
||||||
|
| --- value moved here
|
||||||
|
LL | nothing().await;
|
||||||
|
LL | x.1
|
||||||
|
| ^^^ value used here after move
|
||||||
|
|
|
||||||
|
= note: move occurs because `x.1` has type `std::vec::Vec<usize>`, which does not implement the `Copy` trait
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0382`.
|
Loading…
Reference in New Issue
Block a user