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