diff options
| author | Andrew Cann <shum@canndrew.org> | 2022-03-21 13:57:10 +0800 |
|---|---|---|
| committer | Charles Lew <crlf0710@gmail.com> | 2022-09-11 14:04:16 +0800 |
| commit | fa6dbcf20da11e3af4d8d6494e58d1b5a60b39ab (patch) | |
| tree | 4d9154b9f289b077aaa8621e235333df356f50ca | |
| parent | 22f4bbb20f373b0c3d47788f58c95d60656918f2 (diff) | |
| download | rust-fa6dbcf20da11e3af4d8d6494e58d1b5a60b39ab.tar.gz rust-fa6dbcf20da11e3af4d8d6494e58d1b5a60b39ab.zip | |
Add feature gate tests for generator_clone
| -rw-r--r-- | src/test/ui/generator/clone-impl-static.rs | 17 | ||||
| -rw-r--r-- | src/test/ui/generator/clone-impl-static.stderr | 31 | ||||
| -rw-r--r-- | src/test/ui/generator/clone-impl.rs | 73 | ||||
| -rw-r--r-- | src/test/ui/generator/clone-impl.stderr | 163 |
4 files changed, 284 insertions, 0 deletions
diff --git a/src/test/ui/generator/clone-impl-static.rs b/src/test/ui/generator/clone-impl-static.rs new file mode 100644 index 00000000000..55ed0f281e0 --- /dev/null +++ b/src/test/ui/generator/clone-impl-static.rs @@ -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) {} diff --git a/src/test/ui/generator/clone-impl-static.stderr b/src/test/ui/generator/clone-impl-static.stderr new file mode 100644 index 00000000000..cc15c4afd77 --- /dev/null +++ b/src/test/ui/generator/clone-impl-static.stderr @@ -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`. diff --git a/src/test/ui/generator/clone-impl.rs b/src/test/ui/generator/clone-impl.rs new file mode 100644 index 00000000000..cbfd65a5309 --- /dev/null +++ b/src/test/ui/generator/clone-impl.rs @@ -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) {} diff --git a/src/test/ui/generator/clone-impl.stderr b/src/test/ui/generator/clone-impl.stderr new file mode 100644 index 00000000000..407927fb3bc --- /dev/null +++ b/src/test/ui/generator/clone-impl.stderr @@ -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`. |
