diff options
| author | Maybe Waffle <waffle.lapkin@gmail.com> | 2022-02-25 23:38:00 +0300 |
|---|---|---|
| committer | Maybe Waffle <waffle.lapkin@gmail.com> | 2022-03-01 16:57:03 +0300 |
| commit | 879efa84516da086e7461d65fff6797c8ae1cff9 (patch) | |
| tree | 72622d256f81be09b8f71dbe644ab57e9d196ba8 | |
| parent | 400d343796065e57e78d92b4cf74c78bec38452a (diff) | |
| download | rust-879efa84516da086e7461d65fff6797c8ae1cff9.tar.gz rust-879efa84516da086e7461d65fff6797c8ae1cff9.zip | |
Add a test for Adt copy suggestions
| -rw-r--r-- | src/test/ui/moves/use_of_moved_value_copy_suggestions.rs | 65 | ||||
| -rw-r--r-- | src/test/ui/moves/use_of_moved_value_copy_suggestions.stderr | 151 |
2 files changed, 216 insertions, 0 deletions
diff --git a/src/test/ui/moves/use_of_moved_value_copy_suggestions.rs b/src/test/ui/moves/use_of_moved_value_copy_suggestions.rs new file mode 100644 index 00000000000..0930927c49d --- /dev/null +++ b/src/test/ui/moves/use_of_moved_value_copy_suggestions.rs @@ -0,0 +1,65 @@ +fn duplicate_t<T>(t: T) -> (T, T) { + (t, t) //~ use of moved value: `t` +} + +fn duplicate_opt<T>(t: Option<T>) -> (Option<T>, Option<T>) { + (t, t) //~ use of moved value: `t` +} + +fn duplicate_tup1<T>(t: (T,)) -> ((T,), (T,)) { + (t, t) //~ use of moved value: `t` +} + +fn duplicate_tup2<A, B>(t: (A, B)) -> ((A, B), (A, B)) { + (t, t) //~ use of moved value: `t` +} + +fn duplicate_custom<T>(t: S<T>) -> (S<T>, S<T>) { + (t, t) //~ use of moved value: `t` +} + +struct S<T>(T); +trait Trait {} +impl<T: Trait + Clone> Clone for S<T> { + fn clone(&self) -> Self { + Self(self.0.clone()) + } +} +impl<T: Trait + Copy> Copy for S<T> {} + +trait A {} +trait B {} + +// Test where bounds are added with different bound placements +fn duplicate_custom_1<T>(t: S<T>) -> (S<T>, S<T>) where { + (t, t) //~ use of moved value: `t` +} + +fn duplicate_custom_2<T>(t: S<T>) -> (S<T>, S<T>) +where + T: A, +{ + (t, t) //~ use of moved value: `t` +} + +fn duplicate_custom_3<T>(t: S<T>) -> (S<T>, S<T>) +where + T: A, + T: B, +{ + (t, t) //~ use of moved value: `t` +} + +fn duplicate_custom_4<T: A>(t: S<T>) -> (S<T>, S<T>) +where + T: B, +{ + (t, t) //~ use of moved value: `t` +} + +// `Rc` is not ever `Copy`, we should not suggest adding `T: Copy` constraint +fn duplicate_rc<T>(t: std::rc::Rc<T>) -> (std::rc::Rc<T>, std::rc::Rc<T>) { + (t, t) //~ use of moved value: `t` +} + +fn main() {} diff --git a/src/test/ui/moves/use_of_moved_value_copy_suggestions.stderr b/src/test/ui/moves/use_of_moved_value_copy_suggestions.stderr new file mode 100644 index 00000000000..c32ac2cd78a --- /dev/null +++ b/src/test/ui/moves/use_of_moved_value_copy_suggestions.stderr @@ -0,0 +1,151 @@ +error[E0382]: use of moved value: `t` + --> $DIR/use_of_moved_value_copy_suggestions.rs:2:9 + | +LL | fn duplicate_t<T>(t: T) -> (T, T) { + | - move occurs because `t` has type `T`, which does not implement the `Copy` trait +LL | (t, t) + | - ^ value used here after move + | | + | value moved here + | +help: consider restricting type parameter `T` + | +LL | fn duplicate_t<T: Copy>(t: T) -> (T, T) { + | ++++++ + +error[E0382]: use of moved value: `t` + --> $DIR/use_of_moved_value_copy_suggestions.rs:6:9 + | +LL | fn duplicate_opt<T>(t: Option<T>) -> (Option<T>, Option<T>) { + | - move occurs because `t` has type `Option<T>`, which does not implement the `Copy` trait +LL | (t, t) + | - ^ value used here after move + | | + | value moved here + | +help: consider restricting type parameter `T` + | +LL | fn duplicate_opt<T: Copy>(t: Option<T>) -> (Option<T>, Option<T>) { + | ++++++ + +error[E0382]: use of moved value: `t` + --> $DIR/use_of_moved_value_copy_suggestions.rs:10:9 + | +LL | fn duplicate_tup1<T>(t: (T,)) -> ((T,), (T,)) { + | - move occurs because `t` has type `(T,)`, which does not implement the `Copy` trait +LL | (t, t) + | - ^ value used here after move + | | + | value moved here + | +help: consider restricting type parameter `T` + | +LL | fn duplicate_tup1<T: Copy>(t: (T,)) -> ((T,), (T,)) { + | ++++++ + +error[E0382]: use of moved value: `t` + --> $DIR/use_of_moved_value_copy_suggestions.rs:14:9 + | +LL | fn duplicate_tup2<A, B>(t: (A, B)) -> ((A, B), (A, B)) { + | - move occurs because `t` has type `(A, B)`, which does not implement the `Copy` trait +LL | (t, t) + | - ^ value used here after move + | | + | value moved here + | +help: consider restricting type parameters + | +LL | fn duplicate_tup2<A: Copy, B: Copy>(t: (A, B)) -> ((A, B), (A, B)) { + | ++++++ ++++++ + +error[E0382]: use of moved value: `t` + --> $DIR/use_of_moved_value_copy_suggestions.rs:18:9 + | +LL | fn duplicate_custom<T>(t: S<T>) -> (S<T>, S<T>) { + | - move occurs because `t` has type `S<T>`, which does not implement the `Copy` trait +LL | (t, t) + | - ^ value used here after move + | | + | value moved here + | +help: consider restricting type parameter `T` + | +LL | fn duplicate_custom<T: Trait + Copy>(t: S<T>) -> (S<T>, S<T>) { + | ++++++++++++++ + +error[E0382]: use of moved value: `t` + --> $DIR/use_of_moved_value_copy_suggestions.rs:35:9 + | +LL | fn duplicate_custom_1<T>(t: S<T>) -> (S<T>, S<T>) where { + | - move occurs because `t` has type `S<T>`, which does not implement the `Copy` trait +LL | (t, t) + | - ^ value used here after move + | | + | value moved here + | +help: consider restricting type parameter `T` + | +LL | fn duplicate_custom_1<T: Trait + Copy>(t: S<T>) -> (S<T>, S<T>) where { + | ++++++++++++++ + +error[E0382]: use of moved value: `t` + --> $DIR/use_of_moved_value_copy_suggestions.rs:42:9 + | +LL | fn duplicate_custom_2<T>(t: S<T>) -> (S<T>, S<T>) + | - move occurs because `t` has type `S<T>`, which does not implement the `Copy` trait +... +LL | (t, t) + | - ^ value used here after move + | | + | value moved here + | +help: consider further restricting this bound + | +LL | T: A + Trait + Copy, + | ++++++++++++++ + +error[E0382]: use of moved value: `t` + --> $DIR/use_of_moved_value_copy_suggestions.rs:50:9 + | +LL | fn duplicate_custom_3<T>(t: S<T>) -> (S<T>, S<T>) + | - move occurs because `t` has type `S<T>`, which does not implement the `Copy` trait +... +LL | (t, t) + | - ^ value used here after move + | | + | value moved here + | +help: consider further restricting type parameter `T` + | +LL | T: B, T: Trait, T: Copy + | ~~~~~~~~~~~~~~~~~~~ + +error[E0382]: use of moved value: `t` + --> $DIR/use_of_moved_value_copy_suggestions.rs:57:9 + | +LL | fn duplicate_custom_4<T: A>(t: S<T>) -> (S<T>, S<T>) + | - move occurs because `t` has type `S<T>`, which does not implement the `Copy` trait +... +LL | (t, t) + | - ^ value used here after move + | | + | value moved here + | +help: consider further restricting this bound + | +LL | T: B + Trait + Copy, + | ++++++++++++++ + +error[E0382]: use of moved value: `t` + --> $DIR/use_of_moved_value_copy_suggestions.rs:62:9 + | +LL | fn duplicate_rc<T>(t: std::rc::Rc<T>) -> (std::rc::Rc<T>, std::rc::Rc<T>) { + | - move occurs because `t` has type `Rc<T>`, which does not implement the `Copy` trait +LL | (t, t) + | - ^ value used here after move + | | + | value moved here + +error: aborting due to 10 previous errors + +For more information about this error, try `rustc --explain E0382`. |
