Skip to content

Commit

Permalink
Add a test for Adt copy suggestions
Browse files Browse the repository at this point in the history
  • Loading branch information
WaffleLapkin committed Mar 1, 2022
1 parent 400d343 commit 879efa8
Show file tree
Hide file tree
Showing 2 changed files with 216 additions and 0 deletions.
65 changes: 65 additions & 0 deletions src/test/ui/moves/use_of_moved_value_copy_suggestions.rs
Original file line number Diff line number Diff line change
@@ -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() {}
151 changes: 151 additions & 0 deletions src/test/ui/moves/use_of_moved_value_copy_suggestions.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit 879efa8

Please sign in to comment.