blob: 277936d0bac2ab27fc2dc0462d81ad1efe83b10a [file] [edit]
//! Checks that `#[repr(complex)]` `Complex<T>` matches the C `_Complex` ABI in `extern "C"`
//! functions. This is the rustc side of `tests/run-make/complex-c-abi`, which additionally
//! checks these signatures against clang. Revisions are grouped by LLVM component.
//@ add-minicore
//@ compile-flags: -C no-prepopulate-passes -Z codegen-source-order -C opt-level=3
//@ revisions: X86_64 WINDOWS_MSVC WINDOWS_GNU
//@ [X86_64] compile-flags: --target x86_64-unknown-linux-gnu
//@ [X86_64] needs-llvm-components: x86
//@ [WINDOWS_MSVC] compile-flags: --target x86_64-pc-windows-msvc
//@ [WINDOWS_MSVC] needs-llvm-components: x86
//@ [WINDOWS_GNU] compile-flags: --target x86_64-pc-windows-gnu
//@ [WINDOWS_GNU] needs-llvm-components: x86
//@ revisions: I686 WIN32_MSVC WIN32_GNU
//@ [I686] compile-flags: --target i686-unknown-linux-gnu
//@ [I686] needs-llvm-components: x86
//@ [WIN32_MSVC] compile-flags: --target i686-pc-windows-msvc
//@ [WIN32_MSVC] needs-llvm-components: x86
//@ [WIN32_GNU] compile-flags: --target i686-pc-windows-gnu
//@ [WIN32_GNU] needs-llvm-components: x86
// FIXME: the below revisions are deliberately disabled for now.
// revisions: AARCH64 AARCH64_DARWIN AARCH64_MSVC ARM64EC
// [AARCH64] compile-flags: --target aarch64-unknown-linux-gnu
// [AARCH64] needs-llvm-components: aarch64
// [AARCH64_DARWIN] compile-flags: --target aarch64-apple-darwin
// [AARCH64_DARWIN] needs-llvm-components: aarch64
// [AARCH64_MSVC] compile-flags: --target aarch64-pc-windows-msvc
// [AARCH64_MSVC] needs-llvm-components: aarch64
// [ARM64EC] compile-flags: --target arm64ec-pc-windows-msvc
// [ARM64EC] needs-llvm-components: aarch64
// revisions: ARM
// [ARM] compile-flags: --target arm-unknown-linux-gnueabihf
// [ARM] needs-llvm-components: arm
// revisions: RISCV64 RISCV32
// [RISCV64] compile-flags: --target riscv64gc-unknown-linux-gnu
// [RISCV64] needs-llvm-components: riscv
// [RISCV32] compile-flags: --target riscv32gc-unknown-linux-gnu
// [RISCV32] needs-llvm-components: riscv
// revisions: LOONGARCH64 LOONGARCH32
// [LOONGARCH64] compile-flags: --target loongarch64-unknown-linux-gnu
// [LOONGARCH64] needs-llvm-components: loongarch
// [LOONGARCH32] compile-flags: --target loongarch32-unknown-none
// [LOONGARCH32] needs-llvm-components: loongarch
// revisions: SPARC64 SPARC
// [SPARC64] compile-flags: --target sparc64-unknown-linux-gnu
// [SPARC64] needs-llvm-components: sparc
// [SPARC] compile-flags: --target sparc-unknown-linux-gnu
// [SPARC] needs-llvm-components: sparc
// revisions: S390X
// [S390X] compile-flags: --target s390x-unknown-linux-gnu
// [S390X] needs-llvm-components: systemz
// revisions: POWERPC POWERPC64LE POWERPC64 AIX
// [POWERPC] compile-flags: --target powerpc-unknown-linux-gnu
// [POWERPC] needs-llvm-components: powerpc
// [POWERPC64LE] compile-flags: --target powerpc64le-unknown-linux-gnu
// [POWERPC64LE] needs-llvm-components: powerpc
// [POWERPC64] compile-flags: --target powerpc64-unknown-linux-gnu
// [POWERPC64] needs-llvm-components: powerpc
// [AIX] compile-flags: --target powerpc64-ibm-aix
// [AIX] needs-llvm-components: powerpc
// revisions: MIPS64EL MIPS
// [MIPS64EL] compile-flags: --target mips64el-unknown-linux-gnuabi64
// [MIPS64EL] needs-llvm-components: mips
// [MIPS] compile-flags: --target mips-unknown-linux-gnu
// [MIPS] needs-llvm-components: mips
// revisions: WASM32 WASM64
// [WASM32] compile-flags: --target wasm32-unknown-unknown
// [WASM32] needs-llvm-components: webassembly
// [WASM64] compile-flags: --target wasm64-unknown-unknown
// [WASM64] needs-llvm-components: webassembly
// revisions: CSKY
// [CSKY] compile-flags: --target csky-unknown-linux-gnuabiv2
// [CSKY] needs-llvm-components: csky
// revisions: NVPTX
// [NVPTX] compile-flags: --target nvptx64-nvidia-cuda
// [NVPTX] needs-llvm-components: nvptx
// revisions: BPF
// [BPF] compile-flags: --target bpfel-unknown-none
// [BPF] needs-llvm-components: bpf
#![feature(no_core, lang_items, f16, f128)]
#![no_core]
#![allow(improper_ctypes)] // only Complex<{float}> is guaranteed to be ABI-compatible for now
#![crate_type = "lib"]
extern crate minicore;
use minicore::num::Complex;
#[no_mangle]
pub extern "C" fn cplx_f16(x: Complex<f16>) -> Complex<f16> {
// AARCH64: define{{.*}} { half, half } @cplx_f16([2 x half] {{.*}})
// AARCH64_DARWIN: define{{.*}} { half, half } @cplx_f16([2 x half] {{.*}})
// AARCH64_MSVC: define{{.*}} { half, half } @cplx_f16([2 x half] {{.*}})
// ARM64EC: define{{.*}} { half, half } @cplx_f16([2 x half] {{.*}})
// ARM: define{{.*}} i32 @cplx_f16([1 x i32] {{.*}})
// I686: define{{.*}} <2 x half> @cplx_f16(ptr {{.*}} byval([4 x i8]) {{.*}})
// LOONGARCH32: define{{.*}} { half, half } @cplx_f16(half {{.*}}, half {{.*}})
// LOONGARCH64: define{{.*}} { half, half } @cplx_f16(half {{.*}}, half {{.*}})
// NVPTX: define{{.*}} { half, half } @cplx_f16(ptr {{.*}} byval({ half, half }) {{.*}})
// RISCV32: define{{.*}} { half, half } @cplx_f16(half {{.*}}, half {{.*}})
// RISCV64: define{{.*}} { half, half } @cplx_f16(half {{.*}}, half {{.*}})
// S390X: define{{.*}} void @cplx_f16(ptr {{.*}} sret({ half, half }) {{.*}}, ptr {{.*}})
// WIN32_GNU: define{{.*}} <2 x half> @cplx_f16(ptr {{.*}} byval([4 x i8]) {{.*}})
// WIN32_MSVC: define{{.*}} <2 x half> @cplx_f16(ptr {{.*}} byval([4 x i8]) {{.*}})
// WINDOWS_GNU: define{{.*}} i32 @cplx_f16(i32 {{.*}})
// WINDOWS_MSVC: define{{.*}} i32 @cplx_f16(i32 {{.*}})
// X86_64: define{{.*}} float @cplx_f16(float {{.*}})
x
}
#[no_mangle]
pub extern "C" fn cplx_f32(x: Complex<f32>) -> Complex<f32> {
// AARCH64: define{{.*}} { float, float } @cplx_f32([2 x float] {{.*}})
// AARCH64_DARWIN: define{{.*}} { float, float } @cplx_f32([2 x float] {{.*}})
// AARCH64_MSVC: define{{.*}} { float, float } @cplx_f32([2 x float] {{.*}})
// AIX: define{{.*}} { float, float } @cplx_f32(float {{.*}}, float {{.*}})
// ARM64EC: define{{.*}} { float, float } @cplx_f32([2 x float] {{.*}})
// ARM: define{{.*}} { float, float } @cplx_f32({ float, float } {{.*}})
// BPF: define{{.*}} void @cplx_f32(ptr {{.*}} sret({ float, float }) {{.*}}, i64 {{.*}})
// CSKY: define{{.*}} [2 x i32] @cplx_f32([2 x i32] {{.*}})
// I686: define{{.*}} i64 @cplx_f32(ptr {{.*}} byval([8 x i8]) {{.*}})
// LOONGARCH32: define{{.*}} { float, float } @cplx_f32(float {{.*}}, float {{.*}})
// LOONGARCH64: define{{.*}} { float, float } @cplx_f32(float {{.*}}, float {{.*}})
// MIPS64EL: define{{.*}} { float, float } @cplx_f32(float {{.*}}, float {{.*}})
// MIPS: define{{.*}} { float, float } @cplx_f32(i32 {{.*}}, i32 {{.*}})
// NVPTX: define{{.*}} { float, float } @cplx_f32(ptr {{.*}} byval({ float, float }) {{.*}})
// POWERPC64: define{{.*}} { float, float } @cplx_f32(float {{.*}}, float {{.*}})
// POWERPC64LE: define{{.*}} { float, float } @cplx_f32(float {{.*}}, float {{.*}})
// POWERPC: define{{.*}} void @cplx_f32(ptr {{.*}} sret({ float, float }) {{.*}}, ptr {{.*}} byval({ float, float }) {{.*}})
// RISCV32: define{{.*}} { float, float } @cplx_f32(float {{.*}}, float {{.*}})
// RISCV64: define{{.*}} { float, float } @cplx_f32(float {{.*}}, float {{.*}})
// S390X: define{{.*}} void @cplx_f32(ptr {{.*}} sret({ float, float }) {{.*}}, ptr {{.*}})
// SPARC64: define{{.*}} {{.*}} { float, float } @cplx_f32(float {{.*}}, float {{.*}})
// SPARC: define{{.*}} { float, float } @cplx_f32(ptr {{.*}} byval({ float, float }) {{.*}})
// WASM32: define{{.*}} void @cplx_f32(ptr {{.*}} sret({ float, float }) {{.*}}, ptr {{.*}} byval({ float, float }) {{.*}})
// WASM64: define{{.*}} void @cplx_f32(ptr {{.*}} sret({ float, float }) {{.*}}, ptr {{.*}} byval({ float, float }) {{.*}})
// WIN32_GNU: define{{.*}} i64 @cplx_f32(ptr {{.*}} byval([8 x i8]) {{.*}})
// WIN32_MSVC: define{{.*}} i64 @cplx_f32(ptr {{.*}} byval([8 x i8]) {{.*}})
// WINDOWS_GNU: define{{.*}} i64 @cplx_f32(i64 {{.*}})
// WINDOWS_MSVC: define{{.*}} i64 @cplx_f32(i64 {{.*}})
// X86_64: define{{.*}} double @cplx_f32(double {{.*}})
x
}
#[no_mangle]
pub extern "C" fn cplx_f64(x: Complex<f64>) -> Complex<f64> {
// AARCH64: define{{.*}} { double, double } @cplx_f64([2 x double] {{.*}})
// AARCH64_DARWIN: define{{.*}} { double, double } @cplx_f64([2 x double] {{.*}})
// AARCH64_MSVC: define{{.*}} { double, double } @cplx_f64([2 x double] {{.*}})
// AIX: define{{.*}} { double, double } @cplx_f64(double {{.*}}, double {{.*}})
// ARM64EC: define{{.*}} { double, double } @cplx_f64([2 x double] {{.*}})
// ARM: define{{.*}} { double, double } @cplx_f64({ double, double } {{.*}})
// BPF: define{{.*}} void @cplx_f64(ptr {{.*}} sret({ double, double }) {{.*}}, [2 x i64] {{.*}})
// CSKY: define{{.*}} void @cplx_f64(ptr {{.*}} sret({ double, double }) {{.*}}, [4 x i32] {{.*}})
// I686: define{{.*}} void @cplx_f64(ptr {{.*}} sret([16 x i8]) {{.*}}, ptr {{.*}} byval([16 x i8]) {{.*}})
// LOONGARCH32: define{{.*}} { double, double } @cplx_f64(double {{.*}}, double {{.*}})
// LOONGARCH64: define{{.*}} { double, double } @cplx_f64(double {{.*}}, double {{.*}})
// MIPS64EL: define{{.*}} { double, double } @cplx_f64(double {{.*}}, double {{.*}})
// MIPS: define{{.*}} { double, double } @cplx_f64(i32 {{.*}}, i32 {{.*}}, i32 {{.*}}, i32 {{.*}})
// NVPTX: define{{.*}} { double, double } @cplx_f64(ptr {{.*}} byval({ double, double }) {{.*}})
// POWERPC64: define{{.*}} { double, double } @cplx_f64(double {{.*}}, double {{.*}})
// POWERPC64LE: define{{.*}} { double, double } @cplx_f64(double {{.*}}, double {{.*}})
// POWERPC: define{{.*}} void @cplx_f64(ptr {{.*}} sret({ double, double }) {{.*}}, ptr {{.*}} byval({ double, double }) {{.*}})
// RISCV32: define{{.*}} { double, double } @cplx_f64(double {{.*}}, double {{.*}})
// RISCV64: define{{.*}} { double, double } @cplx_f64(double {{.*}}, double {{.*}})
// S390X: define{{.*}} void @cplx_f64(ptr {{.*}} sret({ double, double }) {{.*}}, ptr {{.*}})
// SPARC64: define{{.*}} { double, double } @cplx_f64(double {{.*}}, double {{.*}})
// SPARC: define{{.*}} { double, double } @cplx_f64(ptr {{.*}} byval({ double, double }) {{.*}})
// WASM32: define{{.*}} void @cplx_f64(ptr {{.*}} sret({ double, double }) {{.*}}, ptr {{.*}} byval({ double, double }) {{.*}})
// WASM64: define{{.*}} void @cplx_f64(ptr {{.*}} sret({ double, double }) {{.*}}, ptr {{.*}} byval({ double, double }) {{.*}})
// WIN32_GNU: define{{.*}} void @cplx_f64(ptr {{.*}} sret([16 x i8]) {{.*}}, ptr {{.*}} byval([16 x i8]) {{.*}})
// WIN32_MSVC: define{{.*}} void @cplx_f64(ptr {{.*}} sret([16 x i8]) {{.*}}, ptr {{.*}} byval([16 x i8]) {{.*}})
// WINDOWS_GNU: define{{.*}} void @cplx_f64(ptr {{.*}} sret([16 x i8]) {{.*}}, ptr {{.*}})
// WINDOWS_MSVC: define{{.*}} void @cplx_f64(ptr {{.*}} sret([16 x i8]) {{.*}}, ptr {{.*}})
// X86_64: define{{.*}} { double, double } @cplx_f64({ double, double } {{.*}})
x
}
#[no_mangle]
pub extern "C" fn cplx_f128(x: Complex<f128>) -> Complex<f128> {
// I686: define{{.*}} void @cplx_f128(ptr {{.*}} sret([32 x i8]) {{.*}}, ptr {{.*}} byval([32 x i8]) {{.*}})
// WASM32: define{{.*}} void @cplx_f128(ptr {{.*}} sret({ fp128, fp128 }) {{.*}}, ptr {{.*}} byval({ fp128, fp128 }) {{.*}})
// WASM64: define{{.*}} void @cplx_f128(ptr {{.*}} sret({ fp128, fp128 }) {{.*}}, ptr {{.*}} byval({ fp128, fp128 }) {{.*}})
// WIN32_GNU: define{{.*}} void @cplx_f128(ptr {{.*}} sret([32 x i8]) {{.*}}, ptr {{.*}} byval([32 x i8]) {{.*}})
// WINDOWS_GNU: define{{.*}} void @cplx_f128(ptr {{.*}} sret([32 x i8]) {{.*}}, ptr {{.*}})
// X86_64: define{{.*}} void @cplx_f128(ptr {{.*}} sret([32 x i8]) {{.*}}, ptr {{.*}} byval([32 x i8]) {{.*}})
x
}
#[no_mangle]
pub extern "C" fn cplx_i8(x: Complex<i8>) -> Complex<i8> {
// AARCH64: define{{.*}} i16 @cplx_i8(i64{{.*}})
// AARCH64_DARWIN: define{{.*}} i16 @cplx_i8(i64{{.*}})
// AARCH64_MSVC: define{{.*}} i16 @cplx_i8(i64{{.*}})
// AIX: define{{.*}} { i8, i8 } @cplx_i8(i8 {{.*}}, i8 {{.*}})
// ARM64EC: define{{.*}} i16 @cplx_i8(i64{{.*}})
// ARM: define{{.*}} i16 @cplx_i8([1 x i32]{{.*}})
// BPF: define{{.*}} void @cplx_i8(ptr {{.*}} sret({ i8, i8 }) {{.*}}, i16 {{.*}})
// CSKY: define{{.*}} {{.*}} i32 @cplx_i8(i32{{.*}})
// I686: define{{.*}} i16 @cplx_i8(ptr {{.*}} byval([2 x i8]) {{.*}})
// LOONGARCH32: define{{.*}} {{.*}} i32 @cplx_i8(i32{{.*}})
// LOONGARCH64: define{{.*}} {{.*}} i64 @cplx_i8(i64{{.*}})
// MIPS64EL: define{{.*}} { i8, i8 } @cplx_i8(i16 {{.*}})
// MIPS: define{{.*}} { i8, i8 } @cplx_i8(i16 {{.*}})
// NVPTX: define{{.*}} { i8, i8 } @cplx_i8(ptr {{.*}} byval({ i8, i8 }) {{.*}})
// POWERPC64: define{{.*}} { i8, i8 } @cplx_i8(i8 {{.*}}, i8 {{.*}})
// POWERPC64LE: define{{.*}} { i8, i8 } @cplx_i8(i8 {{.*}}, i8 {{.*}})
// POWERPC: define{{.*}} void @cplx_i8(ptr {{.*}} sret({ i8, i8 }) {{.*}}, ptr {{.*}} byval({ i8, i8 }) {{.*}})
// RISCV32: define{{.*}} {{.*}} i32 @cplx_i8(i32{{.*}})
// RISCV64: define{{.*}} {{.*}} i64 @cplx_i8(i64{{.*}})
// S390X: define{{.*}} void @cplx_i8(ptr {{.*}} sret({ i8, i8 }) {{.*}}, ptr {{.*}})
// SPARC64: define{{.*}} {{.*}} i64 @cplx_i8(i64{{.*}})
// SPARC: define{{.*}} { i8, i8 } @cplx_i8(ptr {{.*}} byval({ i8, i8 }) {{.*}})
// WASM32: define{{.*}} void @cplx_i8(ptr {{.*}} sret({ i8, i8 }) {{.*}}, ptr {{.*}} byval({ i8, i8 }) {{.*}})
// WASM64: define{{.*}} void @cplx_i8(ptr {{.*}} sret({ i8, i8 }) {{.*}}, ptr {{.*}} byval({ i8, i8 }) {{.*}})
// WIN32_GNU: define{{.*}} i16 @cplx_i8(ptr {{.*}} byval([2 x i8]) {{.*}})
// WIN32_MSVC: define{{.*}} i16 @cplx_i8(ptr {{.*}} byval([2 x i8]) {{.*}})
// WINDOWS_GNU: define{{.*}} i16 @cplx_i8(i16 {{.*}})
// WINDOWS_MSVC: define{{.*}} i16 @cplx_i8(i16 {{.*}})
// X86_64: define{{.*}} i16 @cplx_i8(i16 {{.*}})
x
}
#[no_mangle]
pub extern "C" fn cplx_i16(x: Complex<i16>) -> Complex<i16> {
// AARCH64: define{{.*}} i32 @cplx_i16(i64{{.*}})
// AARCH64_DARWIN: define{{.*}} i32 @cplx_i16(i64{{.*}})
// AARCH64_MSVC: define{{.*}} i32 @cplx_i16(i64{{.*}})
// AIX: define{{.*}} { i16, i16 } @cplx_i16(i16 {{.*}}, i16 {{.*}})
// ARM64EC: define{{.*}} i32 @cplx_i16(i64{{.*}})
// ARM: define{{.*}} i32 @cplx_i16([1 x i32] {{.*}})
// BPF: define{{.*}} void @cplx_i16(ptr {{.*}} sret({ i16, i16 }) {{.*}}, i32 {{.*}})
// CSKY: define{{.*}} i32 @cplx_i16(i32 {{.*}})
// I686: define{{.*}} i32 @cplx_i16(ptr {{.*}} byval([4 x i8]) {{.*}})
// LOONGARCH32: define{{.*}} i32 @cplx_i16(i32 {{.*}})
// LOONGARCH64: define{{.*}} {{.*}} i64 @cplx_i16(i64{{.*}})
// MIPS64EL: define{{.*}} { i16, i16 } @cplx_i16(i32 {{.*}})
// MIPS: define{{.*}} { i16, i16 } @cplx_i16(i32 {{.*}})
// NVPTX: define{{.*}} { i16, i16 } @cplx_i16(ptr {{.*}} byval({ i16, i16 }) {{.*}})
// POWERPC64: define{{.*}} { i16, i16 } @cplx_i16(i16 {{.*}}, i16 {{.*}})
// POWERPC64LE: define{{.*}} { i16, i16 } @cplx_i16(i16 {{.*}}, i16 {{.*}})
// POWERPC: define{{.*}} void @cplx_i16(ptr {{.*}} sret({ i16, i16 }) {{.*}}, ptr {{.*}} byval({ i16, i16 }) {{.*}})
// RISCV32: define{{.*}} i32 @cplx_i16(i32 {{.*}})
// RISCV64: define{{.*}} {{.*}} i64 @cplx_i16(i64{{.*}})
// S390X: define{{.*}} void @cplx_i16(ptr {{.*}} sret({ i16, i16 }) {{.*}}, ptr {{.*}})
// SPARC64: define{{.*}} {{.*}} i64 @cplx_i16(i64{{.*}})
// SPARC: define{{.*}} { i16, i16 } @cplx_i16(ptr {{.*}} byval({ i16, i16 }) {{.*}})
// WASM32: define{{.*}} void @cplx_i16(ptr {{.*}} sret({ i16, i16 }) {{.*}}, ptr {{.*}} byval({ i16, i16 }) {{.*}})
// WASM64: define{{.*}} void @cplx_i16(ptr {{.*}} sret({ i16, i16 }) {{.*}}, ptr {{.*}} byval({ i16, i16 }) {{.*}})
// WIN32_GNU: define{{.*}} i32 @cplx_i16(ptr {{.*}} byval([4 x i8]) {{.*}})
// WIN32_MSVC: define{{.*}} i32 @cplx_i16(ptr {{.*}} byval([4 x i8]) {{.*}})
// WINDOWS_GNU: define{{.*}} i32 @cplx_i16(i32 {{.*}})
// WINDOWS_MSVC: define{{.*}} i32 @cplx_i16(i32 {{.*}})
// X86_64: define{{.*}} i32 @cplx_i16(i32 {{.*}})
x
}
#[no_mangle]
pub extern "C" fn cplx_i32(x: Complex<i32>) -> Complex<i32> {
// AARCH64: define{{.*}} i64 @cplx_i32(i64 {{.*}})
// AARCH64_DARWIN: define{{.*}} i64 @cplx_i32(i64 {{.*}})
// AARCH64_MSVC: define{{.*}} i64 @cplx_i32(i64 {{.*}})
// AIX: define{{.*}} { i32, i32 } @cplx_i32(i32 {{.*}}, i32 {{.*}})
// ARM64EC: define{{.*}} i64 @cplx_i32(i64 {{.*}})
// ARM: define{{.*}} void @cplx_i32(ptr {{.*}} sret({ i32, i32 }) {{.*}}, [2 x i32] {{.*}})
// BPF: define{{.*}} void @cplx_i32(ptr {{.*}} sret({ i32, i32 }) {{.*}}, i64 {{.*}})
// CSKY: define{{.*}} [2 x i32] @cplx_i32([2 x i32] {{.*}})
// I686: define{{.*}} i64 @cplx_i32(ptr {{.*}} byval([8 x i8]) {{.*}})
// LOONGARCH32: define{{.*}} [2 x i32] @cplx_i32([2 x i32] {{.*}})
// LOONGARCH64: define{{.*}} i64 @cplx_i32(i64 {{.*}})
// MIPS64EL: define{{.*}} { i32, i32 } @cplx_i32(i64 {{.*}})
// MIPS: define{{.*}} { i32, i32 } @cplx_i32(i32 {{.*}}, i32 {{.*}})
// NVPTX: define{{.*}} { i32, i32 } @cplx_i32(ptr {{.*}} byval({ i32, i32 }) {{.*}})
// POWERPC64: define{{.*}} { i32, i32 } @cplx_i32(i32 {{.*}}, i32 {{.*}})
// POWERPC64LE: define{{.*}} { i32, i32 } @cplx_i32(i32 {{.*}}, i32 {{.*}})
// POWERPC: define{{.*}} void @cplx_i32(ptr {{.*}} sret({ i32, i32 }) {{.*}}, ptr {{.*}} byval({ i32, i32 }) {{.*}})
// RISCV32: define{{.*}} [2 x i32] @cplx_i32([2 x i32] {{.*}})
// RISCV64: define{{.*}} i64 @cplx_i32(i64 {{.*}})
// S390X: define{{.*}} void @cplx_i32(ptr {{.*}} sret({ i32, i32 }) {{.*}}, ptr {{.*}})
// SPARC64: define{{.*}} i64 @cplx_i32(i64 {{.*}})
// SPARC: define{{.*}} { i32, i32 } @cplx_i32(ptr {{.*}} byval({ i32, i32 }) {{.*}})
// WASM32: define{{.*}} void @cplx_i32(ptr {{.*}} sret({ i32, i32 }) {{.*}}, ptr {{.*}} byval({ i32, i32 }) {{.*}})
// WASM64: define{{.*}} void @cplx_i32(ptr {{.*}} sret({ i32, i32 }) {{.*}}, ptr {{.*}} byval({ i32, i32 }) {{.*}})
// WIN32_GNU: define{{.*}} i64 @cplx_i32(ptr {{.*}} byval([8 x i8]) {{.*}})
// WIN32_MSVC: define{{.*}} i64 @cplx_i32(ptr {{.*}} byval([8 x i8]) {{.*}})
// WINDOWS_GNU: define{{.*}} i64 @cplx_i32(i64 {{.*}})
// WINDOWS_MSVC: define{{.*}} i64 @cplx_i32(i64 {{.*}})
// X86_64: define{{.*}} i64 @cplx_i32(i64 {{.*}})
x
}
#[no_mangle]
pub extern "C" fn cplx_i64(x: Complex<i64>) -> Complex<i64> {
// AARCH64: define{{.*}} [2 x i64] @cplx_i64([2 x i64] {{.*}})
// AARCH64_DARWIN: define{{.*}} [2 x i64] @cplx_i64([2 x i64] {{.*}})
// AARCH64_MSVC: define{{.*}} [2 x i64] @cplx_i64([2 x i64] {{.*}})
// AIX: define{{.*}} { i64, i64 } @cplx_i64(i64 {{.*}}, i64 {{.*}})
// ARM64EC: define{{.*}} [2 x i64] @cplx_i64([2 x i64] {{.*}})
// ARM: define{{.*}} void @cplx_i64(ptr {{.*}} sret({ i64, i64 }) {{.*}}, [2 x i64] {{.*}})
// BPF: define{{.*}} void @cplx_i64(ptr {{.*}} sret({ i64, i64 }) {{.*}}, [2 x i64] {{.*}})
// CSKY: define{{.*}} void @cplx_i64(ptr {{.*}} sret({ i64, i64 }) {{.*}}, [4 x i32] {{.*}})
// I686: define{{.*}} void @cplx_i64(ptr {{.*}} sret([16 x i8]) {{.*}}, ptr {{.*}} byval([16 x i8]) {{.*}})
// LOONGARCH32: define{{.*}} void @cplx_i64(ptr {{.*}} sret({ i64, i64 }) {{.*}}, ptr {{.*}})
// LOONGARCH64: define{{.*}} [2 x i64] @cplx_i64([2 x i64] {{.*}})
// MIPS64EL: define{{.*}} { i64, i64 } @cplx_i64(i64 {{.*}}, i64 {{.*}})
// MIPS: define{{.*}} { i64, i64 } @cplx_i64(i32 {{.*}}, i32 {{.*}}, i32 {{.*}}, i32 {{.*}})
// NVPTX: define{{.*}} { i64, i64 } @cplx_i64(ptr {{.*}} byval({ i64, i64 }) {{.*}})
// POWERPC64: define{{.*}} { i64, i64 } @cplx_i64(i64 {{.*}}, i64 {{.*}})
// POWERPC64LE: define{{.*}} { i64, i64 } @cplx_i64(i64 {{.*}}, i64 {{.*}})
// POWERPC: define{{.*}} void @cplx_i64(ptr {{.*}} sret({ i64, i64 }) {{.*}}, ptr {{.*}} byval({ i64, i64 }) {{.*}})
// RISCV32: define{{.*}} void @cplx_i64(ptr {{.*}} sret({ i64, i64 }) {{.*}}, ptr {{.*}})
// RISCV64: define{{.*}} [2 x i64] @cplx_i64([2 x i64] {{.*}})
// S390X: define{{.*}} void @cplx_i64(ptr {{.*}} sret({ i64, i64 }) {{.*}}, ptr {{.*}})
// SPARC64: define{{.*}} { i64, i64 } @cplx_i64(i64 {{.*}}, i64 {{.*}})
// SPARC: define{{.*}} { i64, i64 } @cplx_i64(ptr {{.*}} byval({ i64, i64 }) {{.*}})
// WASM32: define{{.*}} void @cplx_i64(ptr {{.*}} sret({ i64, i64 }) {{.*}}, ptr {{.*}} byval({ i64, i64 }) {{.*}})
// WASM64: define{{.*}} void @cplx_i64(ptr {{.*}} sret({ i64, i64 }) {{.*}}, ptr {{.*}} byval({ i64, i64 }) {{.*}})
// WIN32_GNU: define{{.*}} void @cplx_i64(ptr {{.*}} sret([16 x i8]) {{.*}}, ptr {{.*}} byval([16 x i8]) {{.*}})
// WIN32_MSVC: define{{.*}} void @cplx_i64(ptr {{.*}} sret([16 x i8]) {{.*}}, ptr {{.*}} byval([16 x i8]) {{.*}})
// WINDOWS_GNU: define{{.*}} void @cplx_i64(ptr {{.*}} sret([16 x i8]) {{.*}}, ptr {{.*}})
// WINDOWS_MSVC: define{{.*}} void @cplx_i64(ptr {{.*}} sret([16 x i8]) {{.*}}, ptr {{.*}})
// X86_64: define{{.*}} { i64, i64 } @cplx_i64({ i64, i64 } {{.*}})
x
}
#[repr(transparent)]
struct Wrapper<T>(T);
#[no_mangle]
pub extern "C" fn wrapper_cplx_i64(x: Wrapper<Complex<i64>>) -> Wrapper<Complex<i64>> {
// I686: define{{.*}} void @wrapper_cplx_i64(ptr {{.*}} sret([16 x i8]) {{.*}}, ptr {{.*}} byval([16 x i8]) {{.*}})
// WIN32_GNU: define{{.*}} void @wrapper_cplx_i64(ptr {{.*}} sret([16 x i8]) {{.*}}, ptr {{.*}} byval([16 x i8]) {{.*}})
// WIN32_MSVC: define{{.*}} void @wrapper_cplx_i64(ptr {{.*}} sret([16 x i8]) {{.*}}, ptr {{.*}} byval([16 x i8]) {{.*}})
// WINDOWS_GNU: define{{.*}} void @wrapper_cplx_i64(ptr {{.*}} sret([16 x i8]) {{.*}}, ptr {{.*}})
// WINDOWS_MSVC: define{{.*}} void @wrapper_cplx_i64(ptr {{.*}} sret([16 x i8]) {{.*}}, ptr {{.*}})
// X86_64: define{{.*}} { i64, i64 } @wrapper_cplx_i64({ i64, i64 } {{.*}})
x
}