Skip to content

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

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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