diff --git a/src/doc/book/inline-assembly.md b/src/doc/book/inline-assembly.md index 2c2d89a1fbf..a8340d9d31e 100644 --- a/src/doc/book/inline-assembly.md +++ b/src/doc/book/inline-assembly.md @@ -57,7 +57,7 @@ but you must add the right number of `:` if you skip them: asm!("xor %eax, %eax" : : - : "{eax}" + : "eax" ); # } } ``` @@ -68,7 +68,7 @@ Whitespace also doesn't matter: # #![feature(asm)] # #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] # fn main() { unsafe { -asm!("xor %eax, %eax" ::: "{eax}"); +asm!("xor %eax, %eax" ::: "eax"); # } } ``` @@ -127,7 +127,7 @@ stay valid. # #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] # fn main() { unsafe { // Put the value 0x200 in eax -asm!("mov $$0x200, %eax" : /* no outputs */ : /* no inputs */ : "{eax}"); +asm!("mov $$0x200, %eax" : /* no outputs */ : /* no inputs */ : "eax"); # } } ``` diff --git a/src/libsyntax_ext/asm.rs b/src/libsyntax_ext/asm.rs index 56a8c28ffed..9cf45606238 100644 --- a/src/libsyntax_ext/asm.rs +++ b/src/libsyntax_ext/asm.rs @@ -192,7 +192,10 @@ pub fn expand_asm<'cx>(cx: &'cx mut ExtCtxt, sp: Span, tts: &[tokenstream::Token if OPTIONS.iter().any(|&opt| s == opt) { cx.span_warn(p.last_span, "expected a clobber, found an option"); + } else if s.starts_with("{") || s.ends_with("}") { + cx.span_err(p.last_span, "clobber should not be surrounded by braces"); } + clobs.push(s); } } diff --git a/src/test/compile-fail/asm-bad-clobber.rs b/src/test/compile-fail/asm-bad-clobber.rs new file mode 100644 index 00000000000..714343a372d --- /dev/null +++ b/src/test/compile-fail/asm-bad-clobber.rs @@ -0,0 +1,26 @@ +// Copyright 2016 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. + +// ignore-android +// ignore-arm +// ignore-aarch64 + +#![feature(asm, rustc_attrs)] + +#[cfg(any(target_arch = "x86", + target_arch = "x86_64"))] +#[rustc_error] +pub fn main() { + unsafe { + // clobber formatted as register input/output + asm!("xor %eax, %eax" : : : "{eax}"); + //~^ ERROR clobber should not be surrounded by braces + } +}