Skip to content

The check_abi function in typeck is not called for ABIs in trait declarations or type aliases #86232

Open
@nagisa

Description

@nagisa

Consider the following code:

trait T {
    extern "amdgpu-kernel" fn mu();
}

type TAU = extern "amdgpu-kernel" fn();

The check_abi function…

pub(super) fn check_abi(tcx: TyCtxt<'_>, span: Span, abi: Abi) {
if !tcx.sess.target.is_abi_supported(abi) {
struct_span_err!(
tcx.sess,
span,
E0570,
"The ABI `{}` is not supported for the current target",
abi
)
.emit()
}
// This ABI is only allowed on function pointers
if abi == Abi::CCmseNonSecureCall {
struct_span_err!(
tcx.sess,
span,
E0781,
"the `\"C-cmse-nonsecure-call\"` ABI is only allowed on function pointers."
)
.emit()
}
}

… is not called for the following two ABI lines, meaning that the checks present therein do not activate, potentially allowing circumvention of the checks this function implements. In particular one thing that is allowed is taking the TAU function pointer as an argument and calling it on architectures where this ABI is unsupported.

This becomes especially relevant after #86231 lands.

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-ABIArea: Concerning the application binary interface (ABI)C-bugCategory: This is a bug.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions