mirror of
https://github.com/rust-lang/rust.git
synced 2025-10-27 11:05:06 +00:00
When encountering a case where `let x: T = (val: &T).clone();` and
`T: !Clone`, already mention that the reference is being cloned. We now
also suggest `#[derive(Clone)]` not only on `T` but also on type
parameters to satisfy blanket implementations.
```
error[E0308]: mismatched types
--> $DIR/assignment-of-clone-call-on-ref-due-to-missing-bound.rs:17:39
|
LL | let mut x: HashSet<Day> = v.clone();
| ------------ ^^^^^^^^^ expected `HashSet<Day>`, found `&HashSet<Day>`
| |
| expected due to this
|
= note: expected struct `HashSet<Day>`
found reference `&HashSet<Day>`
note: `HashSet<Day>` does not implement `Clone`, so `&HashSet<Day>` was cloned instead
--> $DIR/assignment-of-clone-call-on-ref-due-to-missing-bound.rs:17:39
|
LL | let mut x: HashSet<Day> = v.clone();
| ^
= help: `Clone` is not implemented because the trait bound `Day: Clone` is not satisfied
help: consider annotating `Day` with `#[derive(Clone)]`
|
LL + #[derive(Clone)]
LL | enum Day {
|
```
Case taken from # #41825.
31 lines
574 B
Rust
31 lines
574 B
Rust
// run-rustfix
|
|
#![allow(unused_variables, dead_code)]
|
|
use std::collections::BTreeMap;
|
|
use std::collections::HashSet;
|
|
|
|
#[derive(Debug,Eq,PartialEq,Hash)]
|
|
#[derive(Clone)]
|
|
enum Day {
|
|
Mon,
|
|
}
|
|
|
|
struct Class {
|
|
days: BTreeMap<u32, HashSet<Day>>
|
|
}
|
|
|
|
impl Class {
|
|
fn do_stuff(&self) {
|
|
for (_, v) in &self.days {
|
|
let mut x: HashSet<Day> = v.clone(); //~ ERROR
|
|
let y: Vec<Day> = x.drain().collect();
|
|
println!("{:?}", x);
|
|
}
|
|
}
|
|
}
|
|
|
|
fn fail() {
|
|
let c = Class { days: BTreeMap::new() };
|
|
c.do_stuff();
|
|
}
|
|
fn main() {}
|