about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFolkert de Vries <folkert@folkertdev.nl>2025-09-13 20:53:42 +0200
committerFolkert de Vries <folkert@folkertdev.nl>2025-09-13 21:05:12 +0200
commita107ea18af5274c3f7e82fa917f3bda6eeb591fe (patch)
treec7f6c2f8452d9a8b9f4ff40d0702ea7ccb530488
parentd28c31a60069d6c6019341edd2b2b26d903f081c (diff)
downloadrust-a107ea18af5274c3f7e82fa917f3bda6eeb591fe.tar.gz
rust-a107ea18af5274c3f7e82fa917f3bda6eeb591fe.zip
c-variadic: check that inline attributes are accepted on c-variadic functions
they don't do anything, because LLVM is unable to inline c-variadic functions (on most targets, anyway)
-rw-r--r--tests/codegen-llvm/cffi/c-variadic-inline.rs47
1 files changed, 47 insertions, 0 deletions
diff --git a/tests/codegen-llvm/cffi/c-variadic-inline.rs b/tests/codegen-llvm/cffi/c-variadic-inline.rs
new file mode 100644
index 00000000000..369b7e571ca
--- /dev/null
+++ b/tests/codegen-llvm/cffi/c-variadic-inline.rs
@@ -0,0 +1,47 @@
+//@ compile-flags: -C opt-level=3
+#![feature(c_variadic)]
+
+// Test that the inline attributes are accepted on C-variadic functions.
+//
+// Currently LLVM is unable to inline C-variadic functions, but that is valid because despite
+// the name even `#[inline(always)]` is just a hint.
+
+#[inline(always)]
+unsafe extern "C" fn inline_always(mut ap: ...) -> u32 {
+    ap.arg::<u32>()
+}
+
+#[inline]
+unsafe extern "C" fn inline(mut ap: ...) -> u32 {
+    ap.arg::<u32>()
+}
+
+#[inline(never)]
+unsafe extern "C" fn inline_never(mut ap: ...) -> u32 {
+    ap.arg::<u32>()
+}
+
+#[cold]
+unsafe extern "C" fn cold(mut ap: ...) -> u32 {
+    ap.arg::<u32>()
+}
+
+#[unsafe(no_mangle)]
+#[inline(never)]
+fn helper() {
+    // CHECK-LABEL: helper
+    // CHECK-LABEL: call c_variadic_inline::inline_always
+    // CHECK-LABEL: call c_variadic_inline::inline
+    // CHECK-LABEL: call c_variadic_inline::inline_never
+    // CHECK-LABEL: call c_variadic_inline::cold
+    unsafe {
+        inline_always(1);
+        inline(2);
+        inline_never(3);
+        cold(4);
+    }
+}
+
+fn main() {
+    helper()
+}