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