Add test for a.f(|this| a.g())
This commit is contained in:
parent
d7f9e81650
commit
4eac6fe21e
38
tests/ui/borrowck/issue-109271-pass-self-into-closure.rs
Normal file
38
tests/ui/borrowck/issue-109271-pass-self-into-closure.rs
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#![allow(unused)]
|
||||||
|
struct S;
|
||||||
|
|
||||||
|
impl S {
|
||||||
|
fn call(&mut self, f: impl FnOnce((), &mut Self)) {
|
||||||
|
// change state or something ...
|
||||||
|
f((), self);
|
||||||
|
// change state or something ...
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get(&self) {}
|
||||||
|
fn set(&mut self) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut v = S;
|
||||||
|
|
||||||
|
v.call(|(), this: &mut S| v.get());
|
||||||
|
//~^ error: cannot borrow `v` as mutable because it is also borrowed as immutable
|
||||||
|
v.call(|(), this: &mut S| v.set());
|
||||||
|
//~^ error: cannot borrow `v` as mutable more than once at a time
|
||||||
|
//~| error: cannot borrow `v` as mutable more than once at a time
|
||||||
|
|
||||||
|
v.call(|(), this: &mut S| {
|
||||||
|
//~^ error: cannot borrow `v` as mutable more than once at a time
|
||||||
|
//~| error: cannot borrow `v` as mutable more than once at a time
|
||||||
|
|
||||||
|
_ = v;
|
||||||
|
v.set();
|
||||||
|
v.get();
|
||||||
|
S::get(&v);
|
||||||
|
|
||||||
|
use std::ops::Add;
|
||||||
|
let v = 0u32;
|
||||||
|
_ = v + v;
|
||||||
|
_ = v.add(3);
|
||||||
|
});
|
||||||
|
}
|
75
tests/ui/borrowck/issue-109271-pass-self-into-closure.stderr
Normal file
75
tests/ui/borrowck/issue-109271-pass-self-into-closure.stderr
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
error[E0502]: cannot borrow `v` as mutable because it is also borrowed as immutable
|
||||||
|
--> $DIR/issue-109271-pass-self-into-closure.rs:18:5
|
||||||
|
|
|
||||||
|
LL | v.call(|(), this: &mut S| v.get());
|
||||||
|
| ^^----^------------------^-^^^^^^^
|
||||||
|
| | | | |
|
||||||
|
| | | | first borrow occurs due to use of `v` in closure
|
||||||
|
| | | immutable borrow occurs here
|
||||||
|
| | immutable borrow later used by call
|
||||||
|
| mutable borrow occurs here
|
||||||
|
|
||||||
|
error[E0499]: cannot borrow `v` as mutable more than once at a time
|
||||||
|
--> $DIR/issue-109271-pass-self-into-closure.rs:20:5
|
||||||
|
|
|
||||||
|
LL | v.call(|(), this: &mut S| v.set());
|
||||||
|
| ^^----^------------------^-^^^^^^^
|
||||||
|
| | | | |
|
||||||
|
| | | | first borrow occurs due to use of `v` in closure
|
||||||
|
| | | first mutable borrow occurs here
|
||||||
|
| | first borrow later used by call
|
||||||
|
| second mutable borrow occurs here
|
||||||
|
|
||||||
|
error[E0499]: cannot borrow `v` as mutable more than once at a time
|
||||||
|
--> $DIR/issue-109271-pass-self-into-closure.rs:20:12
|
||||||
|
|
|
||||||
|
LL | v.call(|(), this: &mut S| v.set());
|
||||||
|
| -------^^^^^^^^^^^^^^^^^^---------
|
||||||
|
| | | | |
|
||||||
|
| | | | second borrow occurs due to use of `v` in closure
|
||||||
|
| | | second mutable borrow occurs here
|
||||||
|
| | first borrow later used by call
|
||||||
|
| first mutable borrow occurs here
|
||||||
|
|
||||||
|
error[E0499]: cannot borrow `v` as mutable more than once at a time
|
||||||
|
--> $DIR/issue-109271-pass-self-into-closure.rs:24:5
|
||||||
|
|
|
||||||
|
LL | v.call(|(), this: &mut S| {
|
||||||
|
| ^ ---- ------------------ first mutable borrow occurs here
|
||||||
|
| | |
|
||||||
|
| _____| first borrow later used by call
|
||||||
|
| |
|
||||||
|
LL | |
|
||||||
|
LL | |
|
||||||
|
LL | |
|
||||||
|
LL | | _ = v;
|
||||||
|
LL | | v.set();
|
||||||
|
| | - first borrow occurs due to use of `v` in closure
|
||||||
|
... |
|
||||||
|
LL | | _ = v.add(3);
|
||||||
|
LL | | });
|
||||||
|
| |______^ second mutable borrow occurs here
|
||||||
|
|
||||||
|
error[E0499]: cannot borrow `v` as mutable more than once at a time
|
||||||
|
--> $DIR/issue-109271-pass-self-into-closure.rs:24:12
|
||||||
|
|
|
||||||
|
LL | v.call(|(), this: &mut S| {
|
||||||
|
| - ---- ^^^^^^^^^^^^^^^^^^ second mutable borrow occurs here
|
||||||
|
| | |
|
||||||
|
| _____| first borrow later used by call
|
||||||
|
| |
|
||||||
|
LL | |
|
||||||
|
LL | |
|
||||||
|
LL | |
|
||||||
|
LL | | _ = v;
|
||||||
|
LL | | v.set();
|
||||||
|
| | - second borrow occurs due to use of `v` in closure
|
||||||
|
... |
|
||||||
|
LL | | _ = v.add(3);
|
||||||
|
LL | | });
|
||||||
|
| |______- first mutable borrow occurs here
|
||||||
|
|
||||||
|
error: aborting due to 5 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0499, E0502.
|
||||||
|
For more information about an error, try `rustc --explain E0499`.
|
Loading…
x
Reference in New Issue
Block a user