Auto merge of #136897 - workingjubilee:revert-unfcped-stab, r=WaffleLapkin
Revert "Stabilize `extended_varargs_abi_support`" I cannot find an FCP for this, despite it being a stabilization PR which normally means we do an FCP of some kind? It would seem reasonable for _either_ compiler or lang to have FCPed it? I am thus opening a revert PR, which mostly-cleanly applies, so that we can later actually land this properly with a stability report and FCP. - https://github.com/rust-lang/rust/issues/136896 - https://github.com/rust-lang/rust/pull/116161 - https://github.com/rust-lang/rust/issues/100189
This commit is contained in:
commit
021fb9c09a
16 changed files with 126 additions and 12 deletions
|
@ -197,9 +197,6 @@ declare_features! (
|
||||||
(accepted, expr_fragment_specifier_2024, "1.83.0", Some(123742)),
|
(accepted, expr_fragment_specifier_2024, "1.83.0", Some(123742)),
|
||||||
/// Allows arbitrary expressions in key-value attributes at parse time.
|
/// Allows arbitrary expressions in key-value attributes at parse time.
|
||||||
(accepted, extended_key_value_attributes, "1.54.0", Some(78835)),
|
(accepted, extended_key_value_attributes, "1.54.0", Some(78835)),
|
||||||
/// Allows using `efiapi`, `aapcs`, `sysv64` and `win64` as calling
|
|
||||||
/// convention for functions with varargs.
|
|
||||||
(accepted, extended_varargs_abi_support, "1.85.0", Some(100189)),
|
|
||||||
/// Allows resolving absolute paths as paths from other crates.
|
/// Allows resolving absolute paths as paths from other crates.
|
||||||
(accepted, extern_absolute_paths, "1.30.0", Some(44660)),
|
(accepted, extern_absolute_paths, "1.30.0", Some(44660)),
|
||||||
/// Allows `extern crate foo as bar;`. This puts `bar` into extern prelude.
|
/// Allows `extern crate foo as bar;`. This puts `bar` into extern prelude.
|
||||||
|
|
|
@ -487,6 +487,9 @@ declare_features! (
|
||||||
(unstable, exhaustive_patterns, "1.13.0", Some(51085)),
|
(unstable, exhaustive_patterns, "1.13.0", Some(51085)),
|
||||||
/// Allows explicit tail calls via `become` expression.
|
/// Allows explicit tail calls via `become` expression.
|
||||||
(incomplete, explicit_tail_calls, "1.72.0", Some(112788)),
|
(incomplete, explicit_tail_calls, "1.72.0", Some(112788)),
|
||||||
|
/// Allows using `efiapi`, `sysv64` and `win64` as calling convention
|
||||||
|
/// for functions with varargs.
|
||||||
|
(unstable, extended_varargs_abi_support, "1.65.0", Some(100189)),
|
||||||
/// Allows defining `extern type`s.
|
/// Allows defining `extern type`s.
|
||||||
(unstable, extern_types, "1.23.0", Some(43467)),
|
(unstable, extern_types, "1.23.0", Some(43467)),
|
||||||
/// Allow using 128-bit (quad precision) floating point numbers.
|
/// Allow using 128-bit (quad precision) floating point numbers.
|
||||||
|
|
|
@ -602,7 +602,7 @@ hir_analysis_value_of_associated_struct_already_specified =
|
||||||
.label = re-bound here
|
.label = re-bound here
|
||||||
.previous_bound_label = `{$item_name}` bound here first
|
.previous_bound_label = `{$item_name}` bound here first
|
||||||
|
|
||||||
hir_analysis_variadic_function_compatible_convention = C-variadic function must have a compatible calling convention, like `C`, `cdecl`, `system`, `aapcs`, `win64`, `sysv64` or `efiapi`
|
hir_analysis_variadic_function_compatible_convention = C-variadic function must have a compatible calling convention, like {$conventions}
|
||||||
.label = C-variadic function must have a compatible calling convention
|
.label = C-variadic function must have a compatible calling convention
|
||||||
|
|
||||||
hir_analysis_variances_of = {$variances}
|
hir_analysis_variances_of = {$variances}
|
||||||
|
|
|
@ -646,10 +646,11 @@ pub(crate) struct MainFunctionGenericParameters {
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
#[diag(hir_analysis_variadic_function_compatible_convention, code = E0045)]
|
#[diag(hir_analysis_variadic_function_compatible_convention, code = E0045)]
|
||||||
pub(crate) struct VariadicFunctionCompatibleConvention {
|
pub(crate) struct VariadicFunctionCompatibleConvention<'a> {
|
||||||
#[primary_span]
|
#[primary_span]
|
||||||
#[label]
|
#[label]
|
||||||
pub span: Span,
|
pub span: Span,
|
||||||
|
pub conventions: &'a str,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
|
|
|
@ -100,6 +100,8 @@ use rustc_middle::middle;
|
||||||
use rustc_middle::mir::interpret::GlobalId;
|
use rustc_middle::mir::interpret::GlobalId;
|
||||||
use rustc_middle::query::Providers;
|
use rustc_middle::query::Providers;
|
||||||
use rustc_middle::ty::{self, Const, Ty, TyCtxt};
|
use rustc_middle::ty::{self, Const, Ty, TyCtxt};
|
||||||
|
use rustc_session::parse::feature_err;
|
||||||
|
use rustc_span::symbol::sym;
|
||||||
use rustc_span::{ErrorGuaranteed, Span};
|
use rustc_span::{ErrorGuaranteed, Span};
|
||||||
use rustc_trait_selection::traits;
|
use rustc_trait_selection::traits;
|
||||||
|
|
||||||
|
@ -114,9 +116,34 @@ fn require_c_abi_if_c_variadic(
|
||||||
abi: ExternAbi,
|
abi: ExternAbi,
|
||||||
span: Span,
|
span: Span,
|
||||||
) {
|
) {
|
||||||
if decl.c_variadic && !abi.supports_varargs() {
|
const CONVENTIONS_UNSTABLE: &str =
|
||||||
tcx.dcx().emit_err(errors::VariadicFunctionCompatibleConvention { span });
|
"`C`, `cdecl`, `system`, `aapcs`, `win64`, `sysv64` or `efiapi`";
|
||||||
|
const CONVENTIONS_STABLE: &str = "`C` or `cdecl`";
|
||||||
|
const UNSTABLE_EXPLAIN: &str =
|
||||||
|
"using calling conventions other than `C` or `cdecl` for varargs functions is unstable";
|
||||||
|
|
||||||
|
if !decl.c_variadic || matches!(abi, ExternAbi::C { .. } | ExternAbi::Cdecl { .. }) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let extended_abi_support = tcx.features().extended_varargs_abi_support();
|
||||||
|
let conventions = match (extended_abi_support, abi.supports_varargs()) {
|
||||||
|
// User enabled additional ABI support for varargs and function ABI matches those ones.
|
||||||
|
(true, true) => return,
|
||||||
|
|
||||||
|
// Using this ABI would be ok, if the feature for additional ABI support was enabled.
|
||||||
|
// Return CONVENTIONS_STABLE, because we want the other error to look the same.
|
||||||
|
(false, true) => {
|
||||||
|
feature_err(&tcx.sess, sym::extended_varargs_abi_support, span, UNSTABLE_EXPLAIN)
|
||||||
|
.emit();
|
||||||
|
CONVENTIONS_STABLE
|
||||||
|
}
|
||||||
|
|
||||||
|
(false, false) => CONVENTIONS_STABLE,
|
||||||
|
(true, false) => CONVENTIONS_UNSTABLE,
|
||||||
|
};
|
||||||
|
|
||||||
|
tcx.dcx().emit_err(errors::VariadicFunctionCompatibleConvention { span, conventions });
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn provide(providers: &mut Providers) {
|
pub fn provide(providers: &mut Providers) {
|
||||||
|
|
|
@ -272,6 +272,9 @@
|
||||||
//
|
//
|
||||||
// Language features:
|
// Language features:
|
||||||
// tidy-alphabetical-start
|
// tidy-alphabetical-start
|
||||||
|
|
||||||
|
// stabilization was reverted after it hit beta
|
||||||
|
#![cfg_attr(not(bootstrap), feature(extended_varargs_abi_support))]
|
||||||
#![feature(alloc_error_handler)]
|
#![feature(alloc_error_handler)]
|
||||||
#![feature(allocator_internals)]
|
#![feature(allocator_internals)]
|
||||||
#![feature(allow_internal_unsafe)]
|
#![feature(allow_internal_unsafe)]
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
# `extended_varargs_abi_support`
|
||||||
|
|
||||||
|
The tracking issue for this feature is: [#100189]
|
||||||
|
|
||||||
|
[#100189]: https://github.com/rust-lang/rust/issues/100189
|
||||||
|
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
This feature adds the possibility of using `sysv64`, `win64` or `efiapi` calling
|
||||||
|
conventions on functions with varargs.
|
|
@ -0,0 +1,19 @@
|
||||||
|
//@ only-x86_64
|
||||||
|
|
||||||
|
fn efiapi(f: extern "efiapi" fn(usize, ...)) {
|
||||||
|
//~^ ERROR: C-variadic function must have a compatible calling convention, like `C` or `cdecl`
|
||||||
|
//~^^ ERROR: using calling conventions other than `C` or `cdecl` for varargs functions is unstable
|
||||||
|
f(22, 44);
|
||||||
|
}
|
||||||
|
fn sysv(f: extern "sysv64" fn(usize, ...)) {
|
||||||
|
//~^ ERROR: C-variadic function must have a compatible calling convention, like `C` or `cdecl`
|
||||||
|
//~^^ ERROR: using calling conventions other than `C` or `cdecl` for varargs functions is unstable
|
||||||
|
f(22, 44);
|
||||||
|
}
|
||||||
|
fn win(f: extern "win64" fn(usize, ...)) {
|
||||||
|
//~^ ERROR: C-variadic function must have a compatible calling convention, like `C` or `cdecl`
|
||||||
|
//~^^ ERROR: using calling conventions other than `C` or `cdecl` for varargs functions is unstable
|
||||||
|
f(22, 44);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,52 @@
|
||||||
|
error[E0658]: using calling conventions other than `C` or `cdecl` for varargs functions is unstable
|
||||||
|
--> $DIR/feature-gate-extended_varargs_abi_support.rs:3:14
|
||||||
|
|
|
||||||
|
LL | fn efiapi(f: extern "efiapi" fn(usize, ...)) {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #100189 <https://github.com/rust-lang/rust/issues/100189> for more information
|
||||||
|
= help: add `#![feature(extended_varargs_abi_support)]` to the crate attributes to enable
|
||||||
|
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||||
|
|
||||||
|
error[E0045]: C-variadic function must have a compatible calling convention, like `C` or `cdecl`
|
||||||
|
--> $DIR/feature-gate-extended_varargs_abi_support.rs:3:14
|
||||||
|
|
|
||||||
|
LL | fn efiapi(f: extern "efiapi" fn(usize, ...)) {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C-variadic function must have a compatible calling convention
|
||||||
|
|
||||||
|
error[E0658]: using calling conventions other than `C` or `cdecl` for varargs functions is unstable
|
||||||
|
--> $DIR/feature-gate-extended_varargs_abi_support.rs:8:12
|
||||||
|
|
|
||||||
|
LL | fn sysv(f: extern "sysv64" fn(usize, ...)) {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #100189 <https://github.com/rust-lang/rust/issues/100189> for more information
|
||||||
|
= help: add `#![feature(extended_varargs_abi_support)]` to the crate attributes to enable
|
||||||
|
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||||
|
|
||||||
|
error[E0045]: C-variadic function must have a compatible calling convention, like `C` or `cdecl`
|
||||||
|
--> $DIR/feature-gate-extended_varargs_abi_support.rs:8:12
|
||||||
|
|
|
||||||
|
LL | fn sysv(f: extern "sysv64" fn(usize, ...)) {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C-variadic function must have a compatible calling convention
|
||||||
|
|
||||||
|
error[E0658]: using calling conventions other than `C` or `cdecl` for varargs functions is unstable
|
||||||
|
--> $DIR/feature-gate-extended_varargs_abi_support.rs:13:11
|
||||||
|
|
|
||||||
|
LL | fn win(f: extern "win64" fn(usize, ...)) {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #100189 <https://github.com/rust-lang/rust/issues/100189> for more information
|
||||||
|
= help: add `#![feature(extended_varargs_abi_support)]` to the crate attributes to enable
|
||||||
|
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||||
|
|
||||||
|
error[E0045]: C-variadic function must have a compatible calling convention, like `C` or `cdecl`
|
||||||
|
--> $DIR/feature-gate-extended_varargs_abi_support.rs:13:11
|
||||||
|
|
|
||||||
|
LL | fn win(f: extern "win64" fn(usize, ...)) {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C-variadic function must have a compatible calling convention
|
||||||
|
|
||||||
|
error: aborting due to 6 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0045, E0658.
|
||||||
|
For more information about an error, try `rustc --explain E0045`.
|
|
@ -1,4 +1,4 @@
|
||||||
error[E0045]: C-variadic function must have a compatible calling convention, like `C`, `cdecl`, `system`, `aapcs`, `win64`, `sysv64` or `efiapi`
|
error[E0045]: C-variadic function must have a compatible calling convention, like `C` or `cdecl`
|
||||||
--> $DIR/variadic-ffi-1.rs:9:5
|
--> $DIR/variadic-ffi-1.rs:9:5
|
||||||
|
|
|
|
||||||
LL | fn printf(_: *const u8, ...);
|
LL | fn printf(_: *const u8, ...);
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
//@ only-arm
|
//@ only-arm
|
||||||
//@ build-pass
|
//@ build-pass
|
||||||
|
#![feature(extended_varargs_abi_support)]
|
||||||
|
|
||||||
fn aapcs(f: extern "aapcs" fn(usize, ...)) {
|
fn aapcs(f: extern "aapcs" fn(usize, ...)) {
|
||||||
f(22, 44);
|
f(22, 44);
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
//@ ignore-arm stdcall isn't supported
|
//@ ignore-arm stdcall isn't supported
|
||||||
|
#![feature(extended_varargs_abi_support)]
|
||||||
|
|
||||||
#[allow(unsupported_fn_ptr_calling_conventions)]
|
#[allow(unsupported_fn_ptr_calling_conventions)]
|
||||||
fn baz(f: extern "stdcall" fn(usize, ...)) {
|
fn baz(f: extern "stdcall" fn(usize, ...)) {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error[E0045]: C-variadic function must have a compatible calling convention, like `C`, `cdecl`, `system`, `aapcs`, `win64`, `sysv64` or `efiapi`
|
error[E0045]: C-variadic function must have a compatible calling convention, like `C`, `cdecl`, `system`, `aapcs`, `win64`, `sysv64` or `efiapi`
|
||||||
--> $DIR/variadic-ffi-2.rs:4:11
|
--> $DIR/variadic-ffi-2.rs:5:11
|
||||||
|
|
|
|
||||||
LL | fn baz(f: extern "stdcall" fn(usize, ...)) {
|
LL | fn baz(f: extern "stdcall" fn(usize, ...)) {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C-variadic function must have a compatible calling convention
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C-variadic function must have a compatible calling convention
|
||||||
|
|
|
@ -39,4 +39,4 @@ type WithTransparentTraitObject =
|
||||||
//~^ ERROR return value of `"C-cmse-nonsecure-call"` function too large to pass via registers [E0798]
|
//~^ ERROR return value of `"C-cmse-nonsecure-call"` function too large to pass via registers [E0798]
|
||||||
|
|
||||||
type WithVarArgs = extern "C-cmse-nonsecure-call" fn(u32, ...);
|
type WithVarArgs = extern "C-cmse-nonsecure-call" fn(u32, ...);
|
||||||
//~^ ERROR C-variadic function must have a compatible calling convention, like `C`, `cdecl`, `system`, `aapcs`, `win64`, `sysv64` or `efiapi` [E0045]
|
//~^ ERROR C-variadic function must have a compatible calling convention, like `C` or `cdecl` [E0045]
|
||||||
|
|
|
@ -69,7 +69,7 @@ LL | extern "C-cmse-nonsecure-call" fn(WrapperTransparent) -> WrapperTranspa
|
||||||
= note: functions with the `"C-cmse-nonsecure-call"` ABI must pass their result via the available return registers
|
= note: functions with the `"C-cmse-nonsecure-call"` ABI must pass their result via the available return registers
|
||||||
= note: the result must either be a (transparently wrapped) i64, u64 or f64, or be at most 4 bytes in size
|
= note: the result must either be a (transparently wrapped) i64, u64 or f64, or be at most 4 bytes in size
|
||||||
|
|
||||||
error[E0045]: C-variadic function must have a compatible calling convention, like `C`, `cdecl`, `system`, `aapcs`, `win64`, `sysv64` or `efiapi`
|
error[E0045]: C-variadic function must have a compatible calling convention, like `C` or `cdecl`
|
||||||
--> $DIR/generics.rs:41:20
|
--> $DIR/generics.rs:41:20
|
||||||
|
|
|
|
||||||
LL | type WithVarArgs = extern "C-cmse-nonsecure-call" fn(u32, ...);
|
LL | type WithVarArgs = extern "C-cmse-nonsecure-call" fn(u32, ...);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
error[E0045]: C-variadic function must have a compatible calling convention, like `C`, `cdecl`, `system`, `aapcs`, `win64`, `sysv64` or `efiapi`
|
error[E0045]: C-variadic function must have a compatible calling convention, like `C` or `cdecl`
|
||||||
--> $DIR/E0045.rs:1:17
|
--> $DIR/E0045.rs:1:17
|
||||||
|
|
|
|
||||||
LL | extern "Rust" { fn foo(x: u8, ...); }
|
LL | extern "Rust" { fn foo(x: u8, ...); }
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue