diff options
| author | bors <bors@rust-lang.org> | 2014-08-20 03:25:58 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-08-20 03:25:58 +0000 |
| commit | 4be4ea7bb00c343e7199dc5dcc059f911f33a0c6 (patch) | |
| tree | 461dad2e00d4102e5ea18dab90854ac8ea9a5b1b /src/test | |
| parent | 4a0272da67d8fab7e1dd8950e92fb33480ba669a (diff) | |
| parent | 4155643428f10530cbdfe579c83f5070d58a18dd (diff) | |
| download | rust-4be4ea7bb00c343e7199dc5dcc059f911f33a0c6.tar.gz rust-4be4ea7bb00c343e7199dc5dcc059f911f33a0c6.zip | |
auto merge of #16606 : pczarn/rust/inline-asm, r=alexcrichton
It's unfortunate that the read+write operands need special treatment in the AST. A separate vec for all expressions is an alternative, but it doesn't play nicely with trans. Fixes #14936
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/run-pass/issue-14936.rs | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/test/run-pass/issue-14936.rs b/src/test/run-pass/issue-14936.rs new file mode 100644 index 00000000000..123ad36ee4f --- /dev/null +++ b/src/test/run-pass/issue-14936.rs @@ -0,0 +1,54 @@ +// Copyright 2012-2014 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. + +#![feature(asm, macro_rules)] + +type History = Vec<&'static str>; + +fn wrap<A>(x:A, which: &'static str, history: &mut History) -> A { + history.push(which); + x +} + +macro_rules! demo { + ( $output_constraint:tt ) => { + { + let mut x: int = 0; + let y: int = 1; + + let mut history: History = vec!(); + unsafe { + asm!("mov ($1), $0" + : $output_constraint (*wrap(&mut x, "out", &mut history)) + : "r"(&wrap(y, "in", &mut history))); + } + assert_eq!((x,y), (1,1)); + assert_eq!(history.as_slice(), &["out", "in"]); + } + } +} + +#[cfg(target_arch = "x86")] +#[cfg(target_arch = "x86_64")] +fn main() { + fn out_write_only_expr_then_in_expr() { + demo!("=r") + } + + fn out_read_write_expr_then_in_expr() { + demo!("+r") + } + + out_write_only_expr_then_in_expr(); + out_read_write_expr_then_in_expr(); +} + +#[cfg(not(target_arch = "x86"), not(target_arch = "x86_64"))] +pub fn main() {} |
