80 lines
1.7 KiB
Rust
80 lines
1.7 KiB
Rust
use std::pin::Pin;
|
|
use std::rc::Rc;
|
|
use std::ops::Add;
|
|
|
|
struct Foo;
|
|
|
|
impl Add for Foo {
|
|
type Output = ();
|
|
fn add(self, _rhs: Self) -> () {}
|
|
}
|
|
|
|
impl Foo {
|
|
fn use_self(self) {}
|
|
fn use_box_self(self: Box<Self>) {}
|
|
fn use_pin_box_self(self: Pin<Box<Self>>) {}
|
|
fn use_rc_self(self: Rc<Self>) {}
|
|
fn use_mut_self(&mut self) -> &mut Self { self }
|
|
}
|
|
|
|
struct Container(Vec<bool>);
|
|
|
|
impl Container {
|
|
fn custom_into_iter(self) -> impl Iterator<Item = bool> {
|
|
self.0.into_iter()
|
|
}
|
|
}
|
|
|
|
fn move_out(val: Container) {
|
|
val.0.into_iter().next();
|
|
val.0; //~ ERROR use of moved
|
|
|
|
let foo = Foo;
|
|
foo.use_self();
|
|
foo; //~ ERROR use of moved
|
|
|
|
let second_foo = Foo;
|
|
second_foo.use_self();
|
|
second_foo; //~ ERROR use of moved
|
|
|
|
let boxed_foo = Box::new(Foo);
|
|
boxed_foo.use_box_self();
|
|
boxed_foo; //~ ERROR use of moved
|
|
|
|
let pin_box_foo = Box::pin(Foo);
|
|
pin_box_foo.use_pin_box_self();
|
|
pin_box_foo; //~ ERROR use of moved
|
|
|
|
let mut mut_foo = Foo;
|
|
let ret = mut_foo.use_mut_self();
|
|
mut_foo; //~ ERROR cannot move out
|
|
ret;
|
|
|
|
let rc_foo = Rc::new(Foo);
|
|
rc_foo.use_rc_self();
|
|
rc_foo; //~ ERROR use of moved
|
|
|
|
let foo_add = Foo;
|
|
foo_add + Foo;
|
|
foo_add; //~ ERROR use of moved
|
|
|
|
let implicit_into_iter = vec![true];
|
|
for _val in implicit_into_iter {}
|
|
implicit_into_iter; //~ ERROR use of moved
|
|
|
|
let explicit_into_iter = vec![true];
|
|
for _val in explicit_into_iter.into_iter() {}
|
|
explicit_into_iter; //~ ERROR use of moved
|
|
|
|
let container = Container(vec![]);
|
|
for _val in container.custom_into_iter() {}
|
|
container; //~ ERROR use of moved
|
|
|
|
let foo2 = Foo;
|
|
loop {
|
|
foo2.use_self(); //~ ERROR use of moved
|
|
}
|
|
}
|
|
|
|
fn main() {}
|