about summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-08-20 03:25:58 +0000
committerbors <bors@rust-lang.org>2014-08-20 03:25:58 +0000
commit4be4ea7bb00c343e7199dc5dcc059f911f33a0c6 (patch)
tree461dad2e00d4102e5ea18dab90854ac8ea9a5b1b /src/test
parent4a0272da67d8fab7e1dd8950e92fb33480ba669a (diff)
parent4155643428f10530cbdfe579c83f5070d58a18dd (diff)
downloadrust-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.rs54
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() {}