Rollup merge of #115860 - Soveu:varargs2, r=WaffleLapkin
Enable varargs support for AAPCS calling convention Welp, I was looking for a reason why this shouldn't be stabilized after so long... and here it is.
This commit is contained in:
commit
ab90d708da
@ -117,7 +117,7 @@
|
|||||||
fluent_messages! { "../messages.ftl" }
|
fluent_messages! { "../messages.ftl" }
|
||||||
|
|
||||||
fn require_c_abi_if_c_variadic(tcx: TyCtxt<'_>, decl: &hir::FnDecl<'_>, abi: Abi, span: Span) {
|
fn require_c_abi_if_c_variadic(tcx: TyCtxt<'_>, decl: &hir::FnDecl<'_>, abi: Abi, span: Span) {
|
||||||
const CONVENTIONS_UNSTABLE: &str = "`C`, `cdecl`, `win64`, `sysv64` or `efiapi`";
|
const CONVENTIONS_UNSTABLE: &str = "`C`, `cdecl`, `aapcs`, `win64`, `sysv64` or `efiapi`";
|
||||||
const CONVENTIONS_STABLE: &str = "`C` or `cdecl`";
|
const CONVENTIONS_STABLE: &str = "`C` or `cdecl`";
|
||||||
const UNSTABLE_EXPLAIN: &str =
|
const UNSTABLE_EXPLAIN: &str =
|
||||||
"using calling conventions other than `C` or `cdecl` for varargs functions is unstable";
|
"using calling conventions other than `C` or `cdecl` for varargs functions is unstable";
|
||||||
|
@ -68,7 +68,7 @@ pub enum Abi {
|
|||||||
impl Abi {
|
impl Abi {
|
||||||
pub fn supports_varargs(self) -> bool {
|
pub fn supports_varargs(self) -> bool {
|
||||||
// * C and Cdecl obviously support varargs.
|
// * C and Cdecl obviously support varargs.
|
||||||
// * C can be based on SysV64 or Win64, so they must support varargs.
|
// * C can be based on Aapcs, SysV64 or Win64, so they must support varargs.
|
||||||
// * EfiApi is based on Win64 or C, so it also supports it.
|
// * EfiApi is based on Win64 or C, so it also supports it.
|
||||||
//
|
//
|
||||||
// * Stdcall does not, because it would be impossible for the callee to clean
|
// * Stdcall does not, because it would be impossible for the callee to clean
|
||||||
@ -79,6 +79,7 @@ pub fn supports_varargs(self) -> bool {
|
|||||||
match self {
|
match self {
|
||||||
Self::C { .. }
|
Self::C { .. }
|
||||||
| Self::Cdecl { .. }
|
| Self::Cdecl { .. }
|
||||||
|
| Self::Aapcs { .. }
|
||||||
| Self::Win64 { .. }
|
| Self::Win64 { .. }
|
||||||
| Self::SysV64 { .. }
|
| Self::SysV64 { .. }
|
||||||
| Self::EfiApi => true,
|
| Self::EfiApi => true,
|
||||||
|
@ -3,10 +3,13 @@
|
|||||||
|
|
||||||
fn baz(f: extern "stdcall" fn(usize, ...)) {
|
fn baz(f: extern "stdcall" fn(usize, ...)) {
|
||||||
//~^ ERROR: C-variadic function must have a compatible calling convention,
|
//~^ ERROR: C-variadic function must have a compatible calling convention,
|
||||||
// like C, cdecl, win64, sysv64 or efiapi
|
// like C, cdecl, aapcs, win64, sysv64 or efiapi
|
||||||
f(22, 44);
|
f(22, 44);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn aapcs(f: extern "aapcs" fn(usize, ...)) {
|
||||||
|
f(22, 44);
|
||||||
|
}
|
||||||
fn sysv(f: extern "sysv64" fn(usize, ...)) {
|
fn sysv(f: extern "sysv64" fn(usize, ...)) {
|
||||||
f(22, 44);
|
f(22, 44);
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
error[E0045]: C-variadic function must have a compatible calling convention, like `C`, `cdecl`, `win64`, `sysv64` or `efiapi`
|
error[E0045]: C-variadic function must have a compatible calling convention, like `C`, `cdecl`, `aapcs`, `win64`, `sysv64` or `efiapi`
|
||||||
--> $DIR/variadic-ffi-2.rs:4:11
|
--> $DIR/variadic-ffi-2.rs:4:11
|
||||||
|
|
|
|
||||||
LL | fn baz(f: extern "stdcall" fn(usize, ...)) {
|
LL | fn baz(f: extern "stdcall" fn(usize, ...)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user