Add feature gate tests for generator_clone

This commit is contained in:
Andrew Cann 2022-03-21 13:57:10 +08:00 committed by Charles Lew
parent 22f4bbb20f
commit fa6dbcf20d
4 changed files with 284 additions and 0 deletions

View 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) {}

View 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`.

View 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) {}

View 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`.