// Copyright 2018 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. // Test that the compiler will catch passing invalid values to inline assembly // operands. #![feature(asm)] #[repr(C)] struct MyPtr(usize); fn main() { issue_37433(); issue_37437(); issue_40187(); issue_54067(); } fn issue_37433() { unsafe { asm!("" :: "r"("")); //~ ERROR E0669 } unsafe { let target = MyPtr(0); asm!("ret" : : "{rdi}"(target)); //~ ERROR E0669 } } fn issue_37437() { let hello: &str = "hello"; // this should fail... unsafe { asm!("" :: "i"(hello)) }; //~ ERROR E0669 // but this should succeed. unsafe { asm!("" :: "r"(hello.as_ptr())) }; } fn issue_40187() { let arr: [u8; 1] = [0; 1]; unsafe { asm!("movups $1, %xmm0"::"m"(arr)); //~ ERROR E0669 } } fn issue_54067() { let addr: Option = Some(123); unsafe { asm!("mov sp, $0"::"r"(addr)); //~ ERROR E0669 } }