-
Notifications
You must be signed in to change notification settings - Fork 13.7k
Closed
Labels
A-diagnosticsArea: Messages for errors, warnings, and lintsArea: Messages for errors, warnings, and lintsT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.
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...
Metadata
Metadata
Assignees
Labels
A-diagnosticsArea: Messages for errors, warnings, and lintsArea: Messages for errors, warnings, and lintsT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.