Closed
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.