about summary refs log tree commit diff
path: root/tests
diff options
context:
space:
mode:
authorsurechen <chenshuo17@huawei.com>2024-07-10 20:27:38 +0800
committersurechen <chenshuo17@huawei.com>2024-07-17 10:07:02 +0800
commit4821b84b92a2f2bbed06191cab5cc44693e0652b (patch)
tree483be9d7ec6ea382d08b576ec894498a312e5a48 /tests
parent7d356ebde329df5f38186efe3e7c5e8dabac7cb7 (diff)
downloadrust-4821b84b92a2f2bbed06191cab5cc44693e0652b.tar.gz
rust-4821b84b92a2f2bbed06191cab5cc44693e0652b.zip
If the moved value is a mut reference, it is used in a generic function and it's type is a generic param, it can be reborrowed to avoid moving.
for example:

```rust
struct Y(u32);
// x's type is '& mut Y' and it is used in `fn generic<T>(x: T) {}`.
fn generic<T>(x: T) {}
```

fixes #127285
Diffstat (limited to 'tests')
-rw-r--r--tests/ui/borrowck/moved-value-suggest-reborrow-issue-127285.fixed17
-rw-r--r--tests/ui/borrowck/moved-value-suggest-reborrow-issue-127285.rs17
-rw-r--r--tests/ui/borrowck/moved-value-suggest-reborrow-issue-127285.stderr18
-rw-r--r--tests/ui/borrowck/mut-borrow-in-loop-2.stderr15
4 files changed, 55 insertions, 12 deletions
diff --git a/tests/ui/borrowck/moved-value-suggest-reborrow-issue-127285.fixed b/tests/ui/borrowck/moved-value-suggest-reborrow-issue-127285.fixed
new file mode 100644
index 00000000000..cec52272fee
--- /dev/null
+++ b/tests/ui/borrowck/moved-value-suggest-reborrow-issue-127285.fixed
@@ -0,0 +1,17 @@
+//@ run-rustfix
+
+#![allow(dead_code)]
+
+struct X(u32);
+
+impl X {
+    fn f(&mut self) {
+        generic(&mut *self);
+        self.0 += 1;
+        //~^ ERROR: use of moved value: `self` [E0382]
+    }
+}
+
+fn generic<T>(_x: T) {}
+
+fn main() {}
diff --git a/tests/ui/borrowck/moved-value-suggest-reborrow-issue-127285.rs b/tests/ui/borrowck/moved-value-suggest-reborrow-issue-127285.rs
new file mode 100644
index 00000000000..dd015697fdc
--- /dev/null
+++ b/tests/ui/borrowck/moved-value-suggest-reborrow-issue-127285.rs
@@ -0,0 +1,17 @@
+//@ run-rustfix
+
+#![allow(dead_code)]
+
+struct X(u32);
+
+impl X {
+    fn f(&mut self) {
+        generic(self);
+        self.0 += 1;
+        //~^ ERROR: use of moved value: `self` [E0382]
+    }
+}
+
+fn generic<T>(_x: T) {}
+
+fn main() {}
diff --git a/tests/ui/borrowck/moved-value-suggest-reborrow-issue-127285.stderr b/tests/ui/borrowck/moved-value-suggest-reborrow-issue-127285.stderr
new file mode 100644
index 00000000000..3da8b6e9dff
--- /dev/null
+++ b/tests/ui/borrowck/moved-value-suggest-reborrow-issue-127285.stderr
@@ -0,0 +1,18 @@
+error[E0382]: use of moved value: `self`
+  --> $DIR/moved-value-suggest-reborrow-issue-127285.rs:10:9
+   |
+LL |     fn f(&mut self) {
+   |          --------- move occurs because `self` has type `&mut X`, which does not implement the `Copy` trait
+LL |         generic(self);
+   |                 ---- value moved here
+LL |         self.0 += 1;
+   |         ^^^^^^^^^^^ value used here after move
+   |
+help: consider creating a fresh reborrow of `self` here
+   |
+LL |         generic(&mut *self);
+   |                 ++++++
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0382`.
diff --git a/tests/ui/borrowck/mut-borrow-in-loop-2.stderr b/tests/ui/borrowck/mut-borrow-in-loop-2.stderr
index 7a569d1da41..4f32df1eb24 100644
--- a/tests/ui/borrowck/mut-borrow-in-loop-2.stderr
+++ b/tests/ui/borrowck/mut-borrow-in-loop-2.stderr
@@ -8,19 +8,10 @@ LL |     for _ in 0..3 {
 LL |         Other::handle(value);
    |                       ^^^^^ value moved here, in previous iteration of loop
    |
-note: consider changing this parameter type in function `handle` to borrow instead if owning the value isn't necessary
-  --> $DIR/mut-borrow-in-loop-2.rs:8:22
-   |
-LL |     fn handle(value: T) -> Self;
-   |        ------        ^ this parameter takes ownership of the value
-   |        |
-   |        in this function
-help: consider moving the expression out of the loop so it is only moved once
-   |
-LL ~     let mut value = Other::handle(value);
-LL ~     for _ in 0..3 {
-LL ~         value;
+help: consider creating a fresh reborrow of `value` here
    |
+LL |         Other::handle(&mut *value);
+   |                       ++++++
 help: consider creating a fresh reborrow of `value` here
    |
 LL |         Other::handle(&mut *value);