Skip to content

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

Closed
@compiler-errors

Description

@compiler-errors

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.

Metadata

Metadata

Labels

A-coercionsArea: implicit and explicit `expr as Type` coercionsC-bugCategory: This is a bug.P-mediumMedium priorityT-typesRelevant 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.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions