diff options
Diffstat (limited to 'tests/codegen-llvm/align-fn.rs')
| -rw-r--r-- | tests/codegen-llvm/align-fn.rs | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/tests/codegen-llvm/align-fn.rs b/tests/codegen-llvm/align-fn.rs new file mode 100644 index 00000000000..cbc24e2ae2e --- /dev/null +++ b/tests/codegen-llvm/align-fn.rs @@ -0,0 +1,143 @@ +//@ compile-flags: -C no-prepopulate-passes -Z mir-opt-level=0 -Clink-dead-code +//@ edition: 2024 +//@ ignore-wasm32 aligning functions is not currently supported on wasm (#143368) + +#![crate_type = "lib"] +// FIXME(#82232, #143834): temporarily renamed to mitigate `#[align]` nameres ambiguity +#![feature(rustc_attrs)] +#![feature(fn_align)] + +// CHECK: align 16 +#[unsafe(no_mangle)] +#[rustc_align(16)] +pub fn fn_align() {} + +pub struct A; + +impl A { + // CHECK: align 16 + #[unsafe(no_mangle)] + #[rustc_align(16)] + pub fn method_align(self) {} + + // CHECK: align 16 + #[unsafe(no_mangle)] + #[rustc_align(16)] + pub fn associated_fn() {} +} + +trait T: Sized { + fn trait_fn() {} + + fn trait_method(self) {} + + #[rustc_align(8)] + fn trait_method_inherit_low(self); + + #[rustc_align(32)] + fn trait_method_inherit_high(self); + + #[rustc_align(32)] + fn trait_method_inherit_default(self) {} + + #[rustc_align(4)] + #[rustc_align(128)] + #[rustc_align(8)] + fn inherit_highest(self) {} +} + +impl T for A { + // CHECK-LABEL: trait_fn + // CHECK-SAME: align 16 + #[unsafe(no_mangle)] + #[rustc_align(16)] + fn trait_fn() {} + + // CHECK-LABEL: trait_method + // CHECK-SAME: align 16 + #[unsafe(no_mangle)] + #[rustc_align(16)] + fn trait_method(self) {} + + // The prototype's align is ignored because the align here is higher. + // CHECK-LABEL: trait_method_inherit_low + // CHECK-SAME: align 16 + #[unsafe(no_mangle)] + #[rustc_align(16)] + fn trait_method_inherit_low(self) {} + + // The prototype's align is used because it is higher. + // CHECK-LABEL: trait_method_inherit_high + // CHECK-SAME: align 32 + #[unsafe(no_mangle)] + #[rustc_align(16)] + fn trait_method_inherit_high(self) {} + + // The prototype's align inherited. + // CHECK-LABEL: trait_method_inherit_default + // CHECK-SAME: align 32 + #[unsafe(no_mangle)] + fn trait_method_inherit_default(self) {} + + // The prototype's highest align inherited. + // CHECK-LABEL: inherit_highest + // CHECK-SAME: align 128 + #[unsafe(no_mangle)] + #[rustc_align(32)] + #[rustc_align(64)] + fn inherit_highest(self) {} +} + +trait HasDefaultImpl: Sized { + // CHECK-LABEL: inherit_from_default_method + // CHECK-LABEL: inherit_from_default_method + // CHECK-SAME: align 32 + #[rustc_align(32)] + fn inherit_from_default_method(self) {} +} + +pub struct InstantiateDefaultMethods; + +impl HasDefaultImpl for InstantiateDefaultMethods {} + +// CHECK-LABEL: align_specified_twice_1 +// CHECK-SAME: align 64 +#[unsafe(no_mangle)] +#[rustc_align(32)] +#[rustc_align(64)] +pub fn align_specified_twice_1() {} + +// CHECK-LABEL: align_specified_twice_2 +// CHECK-SAME: align 128 +#[unsafe(no_mangle)] +#[rustc_align(128)] +#[rustc_align(32)] +pub fn align_specified_twice_2() {} + +// CHECK-LABEL: align_specified_twice_3 +// CHECK-SAME: align 256 +#[unsafe(no_mangle)] +#[rustc_align(32)] +#[rustc_align(256)] +pub fn align_specified_twice_3() {} + +const _: () = { + // CHECK-LABEL: align_unmangled + // CHECK-SAME: align 256 + #[unsafe(no_mangle)] + #[rustc_align(32)] + #[rustc_align(256)] + extern "C" fn align_unmangled() {} +}; + +unsafe extern "C" { + #[rustc_align(256)] + fn align_unmangled(); +} + +// FIXME also check `gen` et al +// CHECK-LABEL: async_align +// CHECK-SAME: align 64 +#[unsafe(no_mangle)] +#[rustc_align(64)] +pub async fn async_align() {} |
