-
Notifications
You must be signed in to change notification settings - Fork 13.6k
Closed
Labels
A-coercionsArea: implicit and explicit `expr as Type` coercionsArea: implicit and explicit `expr as Type` coercionsC-bugCategory: This is a bug.Category: This is a bug.P-mediumMedium priorityMedium priorityT-typesRelevant to the types team, which will review and decide on the PR/issue.Relevant to the types team, which will review and decide on the PR/issue.regression-from-stable-to-nightlyPerformance or correctness regression from stable to nightly.Performance or correctness regression from stable to nightly.
Description
I tried this code:
fn higher_ranked(ctx: &mut ()) {}
fn main() {
fn as_unsafe<T>(_: unsafe fn(T)) {}
as_unsafe(higher_ranked);
}
I expected to see it work.
Instead, this happened:
error[E0308]: mismatched types
--> src/main.rs:5:15
|
5 | as_unsafe(higher_ranked);
| ^^^^^^^^^^^^^ one type is more general than the other
|
= note: expected fn pointer `unsafe fn(&mut ())`
found fn pointer `unsafe for<'a> fn(&'a mut ())`
This regressed in #129059. This only happens when coercing from safe to unsafe, not unsafe to unsafe or safe to safe. I probably forgot something about how we construct the adjustment from unsafe to safe fn.
nixpulvis
Metadata
Metadata
Assignees
Labels
A-coercionsArea: implicit and explicit `expr as Type` coercionsArea: implicit and explicit `expr as Type` coercionsC-bugCategory: This is a bug.Category: This is a bug.P-mediumMedium priorityMedium priorityT-typesRelevant to the types team, which will review and decide on the PR/issue.Relevant to the types team, which will review and decide on the PR/issue.regression-from-stable-to-nightlyPerformance or correctness regression from stable to nightly.Performance or correctness regression from stable to nightly.