| //@ 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() {} |