Skip to content

Commit

Permalink
Coerce two FnDefs to fn pointers even if they are the same, if they…
Browse files Browse the repository at this point in the history
… are subtypes

That's because they can be the same function but still different substs, which mandates them to coerce to fn pointers in order to unify.
  • Loading branch information
ChayimFriedman2 committed Dec 7, 2024
1 parent 39fd171 commit a9e015f
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 1 deletion.
6 changes: 5 additions & 1 deletion crates/hir-ty/src/infer/coerce.rs
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,11 @@ impl CoerceMany {
// pointers to have a chance at getting a match. See
// https://github.com/rust-lang/rust/blob/7b805396bf46dce972692a6846ce2ad8481c5f85/src/librustc_typeck/check/coercion.rs#L877-L916
let sig = match (self.merged_ty().kind(Interner), expr_ty.kind(Interner)) {
(TyKind::FnDef(x, _), TyKind::FnDef(y, _)) if x == y => None,
(TyKind::FnDef(x, _), TyKind::FnDef(y, _))
if x == y && ctx.table.unify(&self.merged_ty(), &expr_ty) =>
{
None
}
(TyKind::Closure(x, _), TyKind::Closure(y, _)) if x == y => None,
(TyKind::FnDef(..) | TyKind::Closure(..), TyKind::FnDef(..) | TyKind::Closure(..)) => {
// FIXME: we're ignoring safety here. To be more correct, if we have one FnDef and one Closure,
Expand Down
16 changes: 16 additions & 0 deletions crates/hir-ty/src/tests/coercion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -942,3 +942,19 @@ fn main() {
"#,
)
}

#[test]
fn regression_18626() {
check_no_mismatches(
r#"
fn f() {
trait T {
fn f() {}
}
impl T for i32 {}
impl T for u32 {}
&[i32::f, u32::f] as &[fn()];
}
"#,
);
}

0 comments on commit a9e015f

Please sign in to comment.