mirror of
https://github.com/rust-lang/rust.git
synced 2024-12-18 11:34:11 +00:00
Add feature gate tests for generator_clone
This commit is contained in:
parent
22f4bbb20f
commit
fa6dbcf20d
17
src/test/ui/generator/clone-impl-static.rs
Normal file
17
src/test/ui/generator/clone-impl-static.rs
Normal file
@ -0,0 +1,17 @@
|
||||
// gate-test-generator_clone
|
||||
// Verifies that static generators cannot be cloned/copied.
|
||||
|
||||
#![feature(generators, generator_clone)]
|
||||
|
||||
fn main() {
|
||||
let gen = static move || {
|
||||
yield;
|
||||
};
|
||||
check_copy(&gen);
|
||||
//~^ ERROR Copy` is not satisfied
|
||||
check_clone(&gen);
|
||||
//~^ ERROR Clone` is not satisfied
|
||||
}
|
||||
|
||||
fn check_copy<T: Copy>(_x: &T) {}
|
||||
fn check_clone<T: Clone>(_x: &T) {}
|
31
src/test/ui/generator/clone-impl-static.stderr
Normal file
31
src/test/ui/generator/clone-impl-static.stderr
Normal file
@ -0,0 +1,31 @@
|
||||
error[E0277]: the trait bound `[static generator@$DIR/clone-impl-static.rs:7:15: 9:6]: Copy` is not satisfied
|
||||
--> $DIR/clone-impl-static.rs:10:16
|
||||
|
|
||||
LL | check_copy(&gen);
|
||||
| ---------- ^^^^ the trait `Copy` is not implemented for `[static generator@$DIR/clone-impl-static.rs:7:15: 9:6]`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
note: required by a bound in `check_copy`
|
||||
--> $DIR/clone-impl-static.rs:16:18
|
||||
|
|
||||
LL | fn check_copy<T: Copy>(_x: &T) {}
|
||||
| ^^^^ required by this bound in `check_copy`
|
||||
|
||||
error[E0277]: the trait bound `[static generator@$DIR/clone-impl-static.rs:7:15: 9:6]: Clone` is not satisfied
|
||||
--> $DIR/clone-impl-static.rs:12:17
|
||||
|
|
||||
LL | check_clone(&gen);
|
||||
| ----------- ^^^^ the trait `Clone` is not implemented for `[static generator@$DIR/clone-impl-static.rs:7:15: 9:6]`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
note: required by a bound in `check_clone`
|
||||
--> $DIR/clone-impl-static.rs:17:19
|
||||
|
|
||||
LL | fn check_clone<T: Clone>(_x: &T) {}
|
||||
| ^^^^^ required by this bound in `check_clone`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
73
src/test/ui/generator/clone-impl.rs
Normal file
73
src/test/ui/generator/clone-impl.rs
Normal file
@ -0,0 +1,73 @@
|
||||
// gate-test-generator_clone
|
||||
// Verifies that non-static generators can be cloned/copied if all their upvars and locals held
|
||||
// across awaits can be cloned/copied.
|
||||
|
||||
#![feature(generators, generator_clone)]
|
||||
|
||||
struct NonClone;
|
||||
|
||||
fn main() {
|
||||
let copyable: u32 = 123;
|
||||
let clonable_0: Vec<u32> = Vec::new();
|
||||
let clonable_1: Vec<u32> = Vec::new();
|
||||
let non_clonable: NonClone = NonClone;
|
||||
|
||||
let gen_copy_0 = move || {
|
||||
yield;
|
||||
drop(copyable);
|
||||
};
|
||||
check_copy(&gen_copy_0);
|
||||
check_clone(&gen_copy_0);
|
||||
let gen_copy_1 = move || {
|
||||
/*
|
||||
let v = vec!['a'];
|
||||
let n = NonClone;
|
||||
drop(v);
|
||||
drop(n);
|
||||
*/
|
||||
yield;
|
||||
let v = vec!['a'];
|
||||
let n = NonClone;
|
||||
drop(n);
|
||||
drop(copyable);
|
||||
};
|
||||
check_copy(&gen_copy_1);
|
||||
check_clone(&gen_copy_1);
|
||||
let gen_clone_0 = move || {
|
||||
let v = vec!['a'];
|
||||
yield;
|
||||
drop(v);
|
||||
drop(clonable_0);
|
||||
};
|
||||
check_copy(&gen_clone_0);
|
||||
//~^ ERROR the trait bound `Vec<u32>: Copy` is not satisfied
|
||||
//~| ERROR the trait bound `Vec<char>: Copy` is not satisfied
|
||||
check_clone(&gen_clone_0);
|
||||
let gen_clone_1 = move || {
|
||||
let v = vec!['a'];
|
||||
/*
|
||||
let n = NonClone;
|
||||
drop(n);
|
||||
*/
|
||||
yield;
|
||||
let n = NonClone;
|
||||
drop(n);
|
||||
drop(v);
|
||||
drop(clonable_1);
|
||||
};
|
||||
check_copy(&gen_clone_1);
|
||||
//~^ ERROR the trait bound `Vec<u32>: Copy` is not satisfied
|
||||
//~| ERROR the trait bound `Vec<char>: Copy` is not satisfied
|
||||
check_clone(&gen_clone_1);
|
||||
let gen_non_clone = move || {
|
||||
yield;
|
||||
drop(non_clonable);
|
||||
};
|
||||
check_copy(&gen_non_clone);
|
||||
//~^ ERROR the trait bound `NonClone: Copy` is not satisfied
|
||||
check_clone(&gen_non_clone);
|
||||
//~^ ERROR the trait bound `NonClone: Clone` is not satisfied
|
||||
}
|
||||
|
||||
fn check_copy<T: Copy>(_x: &T) {}
|
||||
fn check_clone<T: Clone>(_x: &T) {}
|
163
src/test/ui/generator/clone-impl.stderr
Normal file
163
src/test/ui/generator/clone-impl.stderr
Normal file
@ -0,0 +1,163 @@
|
||||
error[E0277]: the trait bound `Vec<u32>: Copy` is not satisfied in `[generator@$DIR/clone-impl.rs:36:23: 41:6]`
|
||||
--> $DIR/clone-impl.rs:42:5
|
||||
|
|
||||
LL | let gen_clone_0 = move || {
|
||||
| _______________________-
|
||||
LL | | let v = vec!['a'];
|
||||
LL | | yield;
|
||||
LL | | drop(v);
|
||||
LL | | drop(clonable_0);
|
||||
LL | | };
|
||||
| |_____- within this `[generator@$DIR/clone-impl.rs:36:23: 41:6]`
|
||||
LL | check_copy(&gen_clone_0);
|
||||
| ^^^^^^^^^^ within `[generator@$DIR/clone-impl.rs:36:23: 41:6]`, the trait `Copy` is not implemented for `Vec<u32>`
|
||||
|
|
||||
note: captured value does not implement `Copy`
|
||||
--> $DIR/clone-impl.rs:40:14
|
||||
|
|
||||
LL | drop(clonable_0);
|
||||
| ^^^^^^^^^^ has type `Vec<u32>` which does not implement `Copy`
|
||||
note: required by a bound in `check_copy`
|
||||
--> $DIR/clone-impl.rs:72:18
|
||||
|
|
||||
LL | fn check_copy<T: Copy>(_x: &T) {}
|
||||
| ^^^^ required by this bound in `check_copy`
|
||||
|
||||
error[E0277]: the trait bound `Vec<char>: Copy` is not satisfied in `[generator@$DIR/clone-impl.rs:36:23: 41:6]`
|
||||
--> $DIR/clone-impl.rs:42:5
|
||||
|
|
||||
LL | let gen_clone_0 = move || {
|
||||
| _______________________-
|
||||
LL | | let v = vec!['a'];
|
||||
LL | | yield;
|
||||
LL | | drop(v);
|
||||
LL | | drop(clonable_0);
|
||||
LL | | };
|
||||
| |_____- within this `[generator@$DIR/clone-impl.rs:36:23: 41:6]`
|
||||
LL | check_copy(&gen_clone_0);
|
||||
| ^^^^^^^^^^ within `[generator@$DIR/clone-impl.rs:36:23: 41:6]`, the trait `Copy` is not implemented for `Vec<char>`
|
||||
|
|
||||
note: generator does not implement `Copy` as this value is used across a yield
|
||||
--> $DIR/clone-impl.rs:38:9
|
||||
|
|
||||
LL | let v = vec!['a'];
|
||||
| - has type `Vec<char>` which does not implement `Copy`
|
||||
LL | yield;
|
||||
| ^^^^^ yield occurs here, with `v` maybe used later
|
||||
...
|
||||
LL | };
|
||||
| - `v` is later dropped here
|
||||
note: required by a bound in `check_copy`
|
||||
--> $DIR/clone-impl.rs:72:18
|
||||
|
|
||||
LL | fn check_copy<T: Copy>(_x: &T) {}
|
||||
| ^^^^ required by this bound in `check_copy`
|
||||
|
||||
error[E0277]: the trait bound `Vec<u32>: Copy` is not satisfied in `[generator@$DIR/clone-impl.rs:46:23: 57:6]`
|
||||
--> $DIR/clone-impl.rs:58:5
|
||||
|
|
||||
LL | let gen_clone_1 = move || {
|
||||
| _______________________-
|
||||
LL | | let v = vec!['a'];
|
||||
LL | | /*
|
||||
LL | | let n = NonClone;
|
||||
... |
|
||||
LL | | drop(clonable_1);
|
||||
LL | | };
|
||||
| |_____- within this `[generator@$DIR/clone-impl.rs:46:23: 57:6]`
|
||||
LL | check_copy(&gen_clone_1);
|
||||
| ^^^^^^^^^^ within `[generator@$DIR/clone-impl.rs:46:23: 57:6]`, the trait `Copy` is not implemented for `Vec<u32>`
|
||||
|
|
||||
note: captured value does not implement `Copy`
|
||||
--> $DIR/clone-impl.rs:56:14
|
||||
|
|
||||
LL | drop(clonable_1);
|
||||
| ^^^^^^^^^^ has type `Vec<u32>` which does not implement `Copy`
|
||||
note: required by a bound in `check_copy`
|
||||
--> $DIR/clone-impl.rs:72:18
|
||||
|
|
||||
LL | fn check_copy<T: Copy>(_x: &T) {}
|
||||
| ^^^^ required by this bound in `check_copy`
|
||||
|
||||
error[E0277]: the trait bound `Vec<char>: Copy` is not satisfied in `[generator@$DIR/clone-impl.rs:46:23: 57:6]`
|
||||
--> $DIR/clone-impl.rs:58:5
|
||||
|
|
||||
LL | let gen_clone_1 = move || {
|
||||
| _______________________-
|
||||
LL | | let v = vec!['a'];
|
||||
LL | | /*
|
||||
LL | | let n = NonClone;
|
||||
... |
|
||||
LL | | drop(clonable_1);
|
||||
LL | | };
|
||||
| |_____- within this `[generator@$DIR/clone-impl.rs:46:23: 57:6]`
|
||||
LL | check_copy(&gen_clone_1);
|
||||
| ^^^^^^^^^^ within `[generator@$DIR/clone-impl.rs:46:23: 57:6]`, the trait `Copy` is not implemented for `Vec<char>`
|
||||
|
|
||||
note: generator does not implement `Copy` as this value is used across a yield
|
||||
--> $DIR/clone-impl.rs:52:9
|
||||
|
|
||||
LL | let v = vec!['a'];
|
||||
| - has type `Vec<char>` which does not implement `Copy`
|
||||
...
|
||||
LL | yield;
|
||||
| ^^^^^ yield occurs here, with `v` maybe used later
|
||||
...
|
||||
LL | };
|
||||
| - `v` is later dropped here
|
||||
note: required by a bound in `check_copy`
|
||||
--> $DIR/clone-impl.rs:72:18
|
||||
|
|
||||
LL | fn check_copy<T: Copy>(_x: &T) {}
|
||||
| ^^^^ required by this bound in `check_copy`
|
||||
|
||||
error[E0277]: the trait bound `NonClone: Copy` is not satisfied in `[generator@$DIR/clone-impl.rs:62:25: 65:6]`
|
||||
--> $DIR/clone-impl.rs:66:5
|
||||
|
|
||||
LL | let gen_non_clone = move || {
|
||||
| _________________________-
|
||||
LL | | yield;
|
||||
LL | | drop(non_clonable);
|
||||
LL | | };
|
||||
| |_____- within this `[generator@$DIR/clone-impl.rs:62:25: 65:6]`
|
||||
LL | check_copy(&gen_non_clone);
|
||||
| ^^^^^^^^^^ within `[generator@$DIR/clone-impl.rs:62:25: 65:6]`, the trait `Copy` is not implemented for `NonClone`
|
||||
|
|
||||
note: captured value does not implement `Copy`
|
||||
--> $DIR/clone-impl.rs:64:14
|
||||
|
|
||||
LL | drop(non_clonable);
|
||||
| ^^^^^^^^^^^^ has type `NonClone` which does not implement `Copy`
|
||||
note: required by a bound in `check_copy`
|
||||
--> $DIR/clone-impl.rs:72:18
|
||||
|
|
||||
LL | fn check_copy<T: Copy>(_x: &T) {}
|
||||
| ^^^^ required by this bound in `check_copy`
|
||||
|
||||
error[E0277]: the trait bound `NonClone: Clone` is not satisfied in `[generator@$DIR/clone-impl.rs:62:25: 65:6]`
|
||||
--> $DIR/clone-impl.rs:68:5
|
||||
|
|
||||
LL | let gen_non_clone = move || {
|
||||
| _________________________-
|
||||
LL | | yield;
|
||||
LL | | drop(non_clonable);
|
||||
LL | | };
|
||||
| |_____- within this `[generator@$DIR/clone-impl.rs:62:25: 65:6]`
|
||||
...
|
||||
LL | check_clone(&gen_non_clone);
|
||||
| ^^^^^^^^^^^ within `[generator@$DIR/clone-impl.rs:62:25: 65:6]`, the trait `Clone` is not implemented for `NonClone`
|
||||
|
|
||||
note: captured value does not implement `Clone`
|
||||
--> $DIR/clone-impl.rs:64:14
|
||||
|
|
||||
LL | drop(non_clonable);
|
||||
| ^^^^^^^^^^^^ has type `NonClone` which does not implement `Clone`
|
||||
note: required by a bound in `check_clone`
|
||||
--> $DIR/clone-impl.rs:73:19
|
||||
|
|
||||
LL | fn check_clone<T: Clone>(_x: &T) {}
|
||||
| ^^^^^ required by this bound in `check_clone`
|
||||
|
||||
error: aborting due to 6 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
Loading…
Reference in New Issue
Block a user