// only-x86_64 #![feature(asm)] #![feature(llvm_asm)] #![feature(naked_functions)] #![feature(or_patterns)] #![crate_type = "lib"] #[repr(C)] pub struct P { x: u8, y: u16 } #[naked] pub unsafe extern "C" fn patterns( mut a: u32, //~^ ERROR patterns not allowed in naked function parameters &b: &i32, //~^ ERROR patterns not allowed in naked function parameters (None | Some(_)): Option>, //~^ ERROR patterns not allowed in naked function parameters P { x, y }: P, //~^ ERROR patterns not allowed in naked function parameters ) { asm!("", options(noreturn)) } #[naked] pub unsafe extern "C" fn inc(a: u32) -> u32 { //~^ WARN naked functions must contain a single asm block //~| WARN this was previously accepted a + 1 //~^ ERROR referencing function parameters is not allowed in naked functions } #[naked] pub unsafe extern "C" fn inc_asm(a: u32) -> u32 { asm!("/* {0} */", in(reg) a, options(noreturn)); //~^ ERROR referencing function parameters is not allowed in naked functions //~| WARN only `const` and `sym` operands are supported in naked functions //~| WARN this was previously accepted } #[naked] pub unsafe extern "C" fn inc_closure(a: u32) -> u32 { //~^ WARN naked functions must contain a single asm block //~| WARN this was previously accepted (|| a + 1)() } #[naked] pub unsafe extern "C" fn unsupported_operands() { //~^ WARN naked functions must contain a single asm block //~| WARN this was previously accepted let mut a = 0usize; let mut b = 0usize; let mut c = 0usize; let mut d = 0usize; let mut e = 0usize; const F: usize = 0usize; static G: usize = 0usize; asm!("/* {0} {1} {2} {3} {4} {5} {6} */", //~^ WARN asm in naked functions must use `noreturn` option //~| WARN this was previously accepted in(reg) a, //~^ WARN only `const` and `sym` operands are supported in naked functions //~| WARN this was previously accepted inlateout(reg) b, inout(reg) c, lateout(reg) d, out(reg) e, const F, sym G, ); } #[naked] pub extern "C" fn missing_assembly() { //~^ WARN naked functions must contain a single asm block //~| WARN this was previously accepted } #[naked] pub extern "C" fn too_many_asm_blocks() { //~^ WARN naked functions must contain a single asm block //~| WARN this was previously accepted asm!(""); //~^ WARN asm in naked functions must use `noreturn` option //~| WARN this was previously accepted asm!(""); //~^ WARN asm in naked functions must use `noreturn` option //~| WARN this was previously accepted asm!(""); //~^ WARN asm in naked functions must use `noreturn` option //~| WARN this was previously accepted asm!("", options(noreturn)); } pub fn outer(x: u32) -> extern "C" fn(usize) -> usize { #[naked] pub extern "C" fn inner(y: usize) -> usize { //~^ WARN naked functions must contain a single asm block //~| WARN this was previously accepted *&y //~^ ERROR referencing function parameters is not allowed in naked functions } inner } #[naked] unsafe extern "C" fn llvm() -> ! { //~^ WARN naked functions must contain a single asm block //~| WARN this was previously accepted llvm_asm!(""); //~^ WARN LLVM-style inline assembly is unsupported in naked functions //~| WARN this was previously accepted core::hint::unreachable_unchecked(); } #[naked] unsafe extern "C" fn invalid_options() { asm!("", options(nomem, preserves_flags, noreturn)); //~^ WARN asm options unsupported in naked functions: `nomem`, `preserves_flags` //~| WARN this was previously accepted } #[naked] unsafe extern "C" fn invalid_options_continued() { asm!("", options(readonly, nostack), options(pure)); //~^ ERROR asm with `pure` option must have at least one output //~| WARN asm options unsupported in naked functions: `nostack`, `pure`, `readonly` //~| WARN this was previously accepted //~| WARN asm in naked functions must use `noreturn` option //~| WARN this was previously accepted } #[naked] pub unsafe fn default_abi() { //~^ WARN Rust ABI is unsupported in naked functions //~| WARN this was previously accepted asm!("", options(noreturn)); } #[naked] pub unsafe extern "Rust" fn rust_abi() { //~^ WARN Rust ABI is unsupported in naked functions //~| WARN this was previously accepted asm!("", options(noreturn)); } #[naked] pub extern "C" fn valid_a() -> T { unsafe { asm!("", options(noreturn)); } } #[naked] pub extern "C" fn valid_b() { unsafe { { { asm!("", options(noreturn)); ; ; ; } ; } ; } } #[naked] pub unsafe extern "C" fn valid_c() { asm!("", options(noreturn)); } #[cfg(target_arch = "x86_64")] #[naked] pub unsafe extern "C" fn valid_att_syntax() { asm!("", options(noreturn, att_syntax)); }