about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJules Bertholet <julesbertholet@quoi.xyz>2025-06-29 13:01:41 -0400
committerJules Bertholet <julesbertholet@quoi.xyz>2025-07-06 16:56:41 -0400
commita1cefee8d5d39e7e36b60ea0cca06c0220938f74 (patch)
tree90a66f781b6729f57d01f2b3894b177c01cfb089
parent97a7b9b1b498ca60ef68376fc34a61a001a0fea6 (diff)
downloadrust-a1cefee8d5d39e7e36b60ea0cca06c0220938f74.tar.gz
rust-a1cefee8d5d39e7e36b60ea0cca06c0220938f74.zip
Support `#[align(…)]` on fns in `extern` blocks
-rw-r--r--compiler/rustc_passes/src/check_attr.rs2
-rw-r--r--tests/codegen/align-fn.rs14
2 files changed, 15 insertions, 1 deletions
diff --git a/compiler/rustc_passes/src/check_attr.rs b/compiler/rustc_passes/src/check_attr.rs
index 3d9eac0aedc..b8f1ec7ca93 100644
--- a/compiler/rustc_passes/src/check_attr.rs
+++ b/compiler/rustc_passes/src/check_attr.rs
@@ -1915,7 +1915,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
     /// Checks if the `#[align]` attributes on `item` are valid.
     fn check_align(&self, span: Span, target: Target, align: Align, repr_span: Span) {
         match target {
-            Target::Fn | Target::Method(_) => {}
+            Target::Fn | Target::Method(_) | Target::ForeignFn => {}
             Target::Struct | Target::Union | Target::Enum => {
                 self.dcx().emit_err(errors::AlignShouldBeReprAlign {
                     span: repr_span,
diff --git a/tests/codegen/align-fn.rs b/tests/codegen/align-fn.rs
index 90073ff3081..4a9fc49d211 100644
--- a/tests/codegen/align-fn.rs
+++ b/tests/codegen/align-fn.rs
@@ -116,3 +116,17 @@ pub fn align_specified_twice_2() {}
 #[align(32)]
 #[align(256)]
 pub fn align_specified_twice_3() {}
+
+const _: () = {
+    // CHECK-LABEL: align_unmangled
+    // CHECK-SAME: align 256
+    #[unsafe(no_mangle)]
+    #[align(32)]
+    #[align(256)]
+    extern "C" fn align_unmangled() {}
+};
+
+unsafe extern "C" {
+    #[align(256)]
+    fn align_unmangled();
+}