about summary refs log tree commit diff
path: root/tests/codegen-llvm/align-fn.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/codegen-llvm/align-fn.rs')
-rw-r--r--tests/codegen-llvm/align-fn.rs143
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() {}