// needs-asm-support // ignore-nvptx64 // ignore-spirv // ignore-wasm32 #![feature(asm_const)] use std::arch::{asm, global_asm}; fn main() { unsafe { // Outputs must be place expressions asm!("{}", in(reg) 1 + 2); asm!("{}", out(reg) 1 + 2); //~^ ERROR invalid asm output asm!("{}", inout(reg) 1 + 2); //~^ ERROR invalid asm output // Operands must be sized let v: [u64; 3] = [0, 1, 2]; asm!("{}", in(reg) v[..]); //~^ ERROR the size for values of type `[u64]` cannot be known at compilation time //~| ERROR cannot use value of type `[u64]` for inline assembly asm!("{}", out(reg) v[..]); //~^ ERROR the size for values of type `[u64]` cannot be known at compilation time //~| ERROR cannot use value of type `[u64]` for inline assembly asm!("{}", inout(reg) v[..]); //~^ ERROR the size for values of type `[u64]` cannot be known at compilation time //~| ERROR cannot use value of type `[u64]` for inline assembly // Constants must be... constant let x = 0; const fn const_foo(x: i32) -> i32 { x } const fn const_bar(x: T) -> T { x } asm!("{}", const x); //~^ ERROR attempt to use a non-constant value in a constant asm!("{}", const const_foo(0)); asm!("{}", const const_foo(x)); //~^ ERROR attempt to use a non-constant value in a constant asm!("{}", const const_bar(0)); asm!("{}", const const_bar(x)); //~^ ERROR attempt to use a non-constant value in a constant asm!("{}", sym x); //~^ ERROR invalid `sym` operand // Const operands must be integers and must be constants. asm!("{}", const 0); asm!("{}", const 0i32); asm!("{}", const 0i128); asm!("{}", const 0f32); //~^ ERROR mismatched types asm!("{}", const 0 as *mut u8); //~^ ERROR mismatched types asm!("{}", const &0); //~^ ERROR mismatched types } } unsafe fn generic() { asm!("{}", sym generic::); } // Const operands must be integers and must be constants. global_asm!("{}", const 0); global_asm!("{}", const 0i32); global_asm!("{}", const 0i128); global_asm!("{}", const 0f32); //~^ ERROR mismatched types global_asm!("{}", const 0 as *mut u8); //~^ ERROR mismatched types