|
| 1 | +//@ build-pass |
| 2 | +//@ ignore-backends: gcc |
| 3 | +//@ add-minicore |
| 4 | +//@ min-llvm-version: 22 |
| 5 | +// |
| 6 | +//@ revisions: i686 |
| 7 | +//@[i686] compile-flags: --target i686-unknown-linux-gnu |
| 8 | +//@[i686] needs-llvm-components: x86 |
| 9 | +//@ revisions: x86-64 |
| 10 | +//@[x86-64] compile-flags: --target x86_64-unknown-linux-gnu |
| 11 | +//@[x86-64] needs-llvm-components: x86 |
| 12 | +//@ revisions: x86-64-win |
| 13 | +//@[x86-64-win] compile-flags: --target x86_64-pc-windows-msvc |
| 14 | +//@[x86-64-win] needs-llvm-components: x86 |
| 15 | +//@ revisions: arm |
| 16 | +//@[arm] compile-flags: --target arm-unknown-linux-gnueabi |
| 17 | +//@[arm] needs-llvm-components: arm |
| 18 | +//@ revisions: thumb |
| 19 | +//@[thumb] compile-flags: --target thumbv8m.main-none-eabi |
| 20 | +//@[thumb] needs-llvm-components: arm |
| 21 | +//@ revisions: aarch64 |
| 22 | +//@[aarch64] compile-flags: --target aarch64-unknown-linux-gnu |
| 23 | +//@[aarch64] needs-llvm-components: aarch64 |
| 24 | +//@ revisions: s390x |
| 25 | +//@[s390x] compile-flags: --target s390x-unknown-linux-gnu |
| 26 | +//@[s390x] needs-llvm-components: systemz |
| 27 | +//@ revisions: sparc |
| 28 | +//@[sparc] compile-flags: --target sparc-unknown-linux-gnu |
| 29 | +//@[sparc] needs-llvm-components: sparc |
| 30 | +//@ revisions: sparc64 |
| 31 | +//@[sparc64] compile-flags: --target sparc64-unknown-linux-gnu |
| 32 | +//@[sparc64] needs-llvm-components: sparc |
| 33 | +//@ revisions: powerpc64 |
| 34 | +//@[powerpc64] compile-flags: --target powerpc64-unknown-linux-gnu |
| 35 | +//@[powerpc64] needs-llvm-components: powerpc |
| 36 | +//@ revisions: loongarch32 |
| 37 | +//@[loongarch32] compile-flags: --target loongarch32-unknown-none |
| 38 | +//@[loongarch32] needs-llvm-components: loongarch |
| 39 | +//@ revisions: loongarch64 |
| 40 | +//@[loongarch64] compile-flags: --target loongarch64-unknown-linux-gnu |
| 41 | +//@[loongarch64] needs-llvm-components: loongarch |
| 42 | +//@ revisions: bpf |
| 43 | +//@[bpf] compile-flags: --target bpfeb-unknown-none |
| 44 | +//@[bpf] needs-llvm-components: bpf |
| 45 | +//@ revisions: m68k |
| 46 | +//@[m68k] compile-flags: --target m68k-unknown-linux-gnu |
| 47 | +//@[m68k] needs-llvm-components: m68k |
| 48 | +//@ revisions: nvptx64 |
| 49 | +//@[nvptx64] compile-flags: --target nvptx64-nvidia-cuda |
| 50 | +//@[nvptx64] needs-llvm-components: nvptx |
| 51 | +// |
| 52 | +// Riscv does not support byval in LLVM 22 (but wil in LLVM 23) |
| 53 | +// |
| 54 | +// //@ revisions: riscv |
| 55 | +// //@[riscv] compile-flags: --target riscv64gc-unknown-linux-gnu |
| 56 | +// //@[riscv] needs-llvm-components: riscv |
| 57 | +// |
| 58 | +// Wasm needs a special target feature. |
| 59 | +// |
| 60 | +//@ revisions: wasm |
| 61 | +//@[wasm] compile-flags: --target wasm32-unknown-unknown -Ctarget-feature=+tail-call |
| 62 | +//@[wasm] needs-llvm-components: webassembly |
| 63 | +//@ revisions: wasip1 |
| 64 | +//@[wasip1] compile-flags: --target wasm32-wasip1 -Ctarget-feature=+tail-call |
| 65 | +//@[wasip1] needs-llvm-components: webassembly |
| 66 | +// |
| 67 | +// Failing cases (just zero support) |
| 68 | +// |
| 69 | +// //@ revisions: powerpc |
| 70 | +// //@[powerpc] compile-flags: --target powerpc-unknown-linux-gnu |
| 71 | +// //@[powerpc] needs-llvm-components: powerpc |
| 72 | +// //@ revisions: aix |
| 73 | +// //@[aix] compile-flags: --target powerpc64-ibm-aix |
| 74 | +// //@[aix] needs-llvm-components: powerpc |
| 75 | +// //@ revisions: csky |
| 76 | +// //@[csky] compile-flags: --target csky-unknown-linux-gnuabiv2 |
| 77 | +// //@[csky] needs-llvm-components: csky |
| 78 | +// //@ revisions: mips |
| 79 | +// //@[mips] compile-flags: --target mips-unknown-linux-gnu |
| 80 | +// //@[mips] needs-llvm-components: mips |
| 81 | +// //@ revisions: mips64 |
| 82 | +// //@[mips64] compile-flags: --target mips64-unknown-linux-gnuabi64 |
| 83 | +// //@[mips64] needs-llvm-components: mips |
| 84 | +#![feature(no_core, explicit_tail_calls)] |
| 85 | +#![expect(incomplete_features)] |
| 86 | +#![no_core] |
| 87 | +#![crate_type = "lib"] |
| 88 | + |
| 89 | +extern crate minicore; |
| 90 | +use minicore::*; |
| 91 | + |
| 92 | +// The rust calling convention will pass this by-value. |
| 93 | +struct PassedByVal { |
| 94 | + a: u64, |
| 95 | + b: u64, |
| 96 | + c: u64, |
| 97 | + d: u64, |
| 98 | +} |
| 99 | + |
| 100 | +#[inline(never)] |
| 101 | +fn callee(x: PassedByVal) -> PassedByVal { |
| 102 | + x |
| 103 | +} |
| 104 | + |
| 105 | +#[unsafe(no_mangle)] |
| 106 | +fn byval(x: PassedByVal) -> PassedByVal { |
| 107 | + become callee(x); |
| 108 | +} |
0 commit comments