| // Issue #108894 |
| |
| use std::marker::PhantomData; |
| |
| #[derive(Clone, Copy)] //~ NOTE: derived `Clone` adds implicit bounds on type parameters |
| pub struct TypedAddress<T>{ |
| //~^ NOTE: if all bounds were met, you could clone the value |
| //~| NOTE: introduces an implicit `T: Clone` bound |
| inner: u64, |
| phantom: PhantomData<T>, |
| } |
| |
| pub trait Memory { |
| fn write_value<T>(&self, offset: TypedAddress<T>, value: &T); |
| fn return_value<T>(&self, offset: TypedAddress<T>) -> T; |
| //~^ NOTE: consider changing this parameter type in method `return_value` to borrow instead if owning the value isn't necessary |
| //~| NOTE: in this method |
| //~| NOTE: this parameter takes ownership of the value |
| fn update_value<T, F>(&self, offset: TypedAddress<T>, update: F) |
| //~^ NOTE: move occurs because `offset` has type `TypedAddress<T>`, which does not implement the `Copy` trait |
| where F: FnOnce(T) -> T //~ HELP: consider further restricting type parameter `T` |
| { |
| let old = self.return_value(offset); //~ NOTE: value moved here |
| //~^ NOTE: you could clone this value |
| let new = update(old); |
| self.write_value(offset, &new); //~ ERROR: use of moved value: `offset` |
| //~^ NOTE: value used here after move |
| //~| HELP: consider manually implementing `Clone` to avoid undesired bounds |
| } |
| } |
| |
| fn main() {} |