- Notifications
You must be signed in to change notification settings - Fork 14k
Open
Labels
A-diagnosticsArea: Messages for errors, warnings, and lintsArea: Messages for errors, warnings, and lintsD-confusingDiagnostics: Confusing error or lint that should be reworked.Diagnostics: Confusing error or lint that should be reworked.T-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
Code
struct A; fn f1<'a>(_: &'a A) {} // Case 1 fn f2<'a>(_: &'a A) {} // Case 1 // fn f1(_: A) {} // Case 2 // fn f2(_: A) {} // Case 2 fn main() { let mut map = vec![]; map.push(f1); map.push(f2); }Current output
error[E0308]: mismatched types --> foo.rs:9:14 | 8 | map.push(f1); | --- -- this argument has type `for<'a> fn(&'a A) {f1}`... | | | ... which causes `map` to have type `Vec<for<'a> fn(&'a A) {f1}>` 9 | map.push(f2); | ---- ^^ expected fn item, found a different fn item | | | arguments to this method are incorrect | = note: expected fn item `for<'a> fn(&'a A) {f1}` found fn item `for<'a> fn(&'a A) {f2}` note: method defined here --> /rustc/425a9c0a0e365c0b8c6cfd00c2ded83a73bed9a0/library/alloc/src/vec/mod.rs:2571:12 error: aborting due to 1 previous error For more information about this error, try `rustc --explain E0308`.Desired output
error[E0308]: mismatched types --> foo.rs:9:14 | 8 | map.push(f1); | --- -- this argument has type `for<'a> fn(&'a A) {f1}`... | | | ... which causes `map` to have type `Vec<for<'a> fn(&'a A) {f1}>` 9 | map.push(f2); | ---- ^^ expected fn item, found a different fn item | | | arguments to this method are incorrect | = note: expected fn item `for<'a> fn(&'a A) {f1}` found fn item `for<'a> fn(&'a A) {f2}` = note: different fn items have unique types, even if their signatures are the same note: method defined here --> /rustc/425a9c0a0e365c0b8c6cfd00c2ded83a73bed9a0/library/alloc/src/vec/mod.rs:2571:12 error: aborting due to 1 previous error For more information about this error, try `rustc --explain E0308`.Rationale and extra context
It's not immediately obviously why the seemingly identical types
= note: expected fn item `for<'a> fn(&'a A) {f1}` found fn item `for<'a> fn(&'a A) {f2}` would still lead to a type mismatch. When there are no lifetimes, i.e. with case 2, the helpful
= note: different fn items have unique types, even if their signatures are the same note is shown.
Other cases
Rust Version
rustc 1.91.0-nightly (425a9c0a0 2025-08-17) binary: rustc commit-hash: 425a9c0a0e365c0b8c6cfd00c2ded83a73bed9a0 commit-date: 2025-08-17 host: aarch64-apple-darwin release: 1.91.0-nightly LLVM version: 21.1.0Anything else?
cf. discussions in https://users.rust-lang.org/t/hashmap-of-string-fn/25071/8
Metadata
Metadata
Assignees
Labels
A-diagnosticsArea: Messages for errors, warnings, and lintsArea: Messages for errors, warnings, and lintsD-confusingDiagnostics: Confusing error or lint that should be reworked.Diagnostics: Confusing error or lint that should be reworked.T-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.