rust/src/test/ui/inline-asm-bad-operand.rs
Levente Kurusa 3d7476eae1
codegen_llvm: verify that inline assembly operands are scalars
Otherwise, LLVM translation will fail with a panic.

Signed-off-by: Levente Kurusa <lkurusa@acm.org>
2018-10-06 12:45:19 +02:00

57 lines
1.3 KiB
Rust

// 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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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<u32> = Some(123);
unsafe {
asm!("mov sp, $0"::"r"(addr)); //~ ERROR E0669
}
}