Closed
Description
Consider:
use std::collections::HashMap;
#[derive(Clone, Debug)]
struct Foo;
#[derive(Debug)]
struct Bar;
type H = HashMap<String, Vec<(Foo, Bar)>>;
fn wat(h: &H) -> H {
let h: H = h.clone();
h
}
fn main() {
let h = H::new();
println!("{:?}", wat(&h));
}
This reports:
--> src/main.rs:12:16
|
12 | let h: H = h.clone();
| ^^^^^^^^^ expected struct `std::collections::HashMap`, found reference
|
= note: expected type `std::collections::HashMap<std::string::String, std::vec::Vec<(Foo, Bar)>>`
found type `&std::collections::HashMap<std::string::String, std::vec::Vec<(Foo, Bar)>>`
error: aborting due to previous error
This is extremely misleading at best (I would expect it to effectively say that one or more types did not implement clone), and debatebly, miscompilation at worst.
I don't want to really argue about the latter, but opening this here so maybe the diagnostics could be improved since I don't think its controversial to say this is really, really misleading, and having programmed for about 3ish years now, I was caught off-guard by this and lost about 20 minutes unncessarily...