Can't cast higher-ranked safe fn to (not higher-ranked) unsafe fn ptr

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.