summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorAmanieu d'Antras <amanieu@gmail.com>2015-11-06 13:31:02 +0000
committerAmanieu d'Antras <amanieu@gmail.com>2015-12-05 08:18:30 +0000
commit9d7b113b44457ae20cb90828f63edb1f6cea2f06 (patch)
tree772372f07ceacf75a1ae3093a597fb54aae55ed4 /src/libsyntax
parent3e2ebaa9183d8e58693de408685e05ac2ad8ee31 (diff)
downloadrust-9d7b113b44457ae20cb90828f63edb1f6cea2f06.tar.gz
rust-9d7b113b44457ae20cb90828f63edb1f6cea2f06.zip
Add proper support for indirect output constraints in inline asm
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/ast.rs2
-rw-r--r--src/libsyntax/ext/asm.rs7
-rw-r--r--src/libsyntax/fold.rs4
-rw-r--r--src/libsyntax/print/pprust.rs2
-rw-r--r--src/libsyntax/visit.rs2
5 files changed, 9 insertions, 8 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs
index f11291fc0f7..ac3e26d0335 100644
--- a/src/libsyntax/ast.rs
+++ b/src/libsyntax/ast.rs
@@ -1462,7 +1462,7 @@ pub enum AsmDialect {
 pub struct InlineAsm {
     pub asm: InternedString,
     pub asm_str_style: StrStyle,
-    pub outputs: Vec<(InternedString, P<Expr>, bool)>,
+    pub outputs: Vec<(InternedString, P<Expr>, bool, bool)>,
     pub inputs: Vec<(InternedString, P<Expr>)>,
     pub clobbers: Vec<InternedString>,
     pub volatile: bool,
diff --git a/src/libsyntax/ext/asm.rs b/src/libsyntax/ext/asm.rs
index d968858f634..f643f0be276 100644
--- a/src/libsyntax/ext/asm.rs
+++ b/src/libsyntax/ext/asm.rs
@@ -125,7 +125,8 @@ pub fn expand_asm<'cx>(cx: &'cx mut ExtCtxt, sp: Span, tts: &[ast::TokenTree])
                     };
 
                     let is_rw = output.is_some();
-                    outputs.push((output.unwrap_or(constraint), out, is_rw));
+                    let is_indirect = constraint.contains("*");
+                    outputs.push((output.unwrap_or(constraint), out, is_rw, is_indirect));
                 }
             }
             Inputs => {
@@ -139,9 +140,9 @@ pub fn expand_asm<'cx>(cx: &'cx mut ExtCtxt, sp: Span, tts: &[ast::TokenTree])
 
                     let (constraint, _str_style) = panictry!(p.parse_str());
 
-                    if constraint.starts_with("=") && !constraint.contains("*") {
+                    if constraint.starts_with("=") {
                         cx.span_err(p.last_span, "input operand constraint contains '='");
-                    } else if constraint.starts_with("+") && !constraint.contains("*") {
+                    } else if constraint.starts_with("+") {
                         cx.span_err(p.last_span, "input operand constraint contains '+'");
                     }
 
diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs
index 73f2c51b246..8619c3c0bdb 100644
--- a/src/libsyntax/fold.rs
+++ b/src/libsyntax/fold.rs
@@ -1303,8 +1303,8 @@ pub fn noop_fold_expr<T: Folder>(Expr {id, node, span, attrs}: Expr, folder: &mu
                 inputs: inputs.move_map(|(c, input)| {
                     (c, folder.fold_expr(input))
                 }),
-                outputs: outputs.move_map(|(c, out, is_rw)| {
-                    (c, folder.fold_expr(out), is_rw)
+                outputs: outputs.move_map(|(c, out, is_rw, is_indirect)| {
+                    (c, folder.fold_expr(out), is_rw, is_indirect)
                 }),
                 asm: asm,
                 asm_str_style: asm_str_style,
diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs
index aa55cb847fa..a0b7df3e2e9 100644
--- a/src/libsyntax/print/pprust.rs
+++ b/src/libsyntax/print/pprust.rs
@@ -2221,7 +2221,7 @@ impl<'a> State<'a> {
                 try!(self.word_space(":"));
 
                 try!(self.commasep(Inconsistent, &a.outputs,
-                                   |s, &(ref co, ref o, is_rw)| {
+                                   |s, &(ref co, ref o, is_rw, _)| {
                     match co.slice_shift_char() {
                         Some(('=', operand)) if is_rw => {
                             try!(s.print_string(&format!("+{}", operand),
diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs
index cdc11fb2c1c..5ede6596e8f 100644
--- a/src/libsyntax/visit.rs
+++ b/src/libsyntax/visit.rs
@@ -786,7 +786,7 @@ pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr) {
             for &(_, ref input) in &ia.inputs {
                 visitor.visit_expr(&input)
             }
-            for &(_, ref output, _) in &ia.outputs {
+            for &(_, ref output, _, _) in &ia.outputs {
                 visitor.visit_expr(&output)
             }
         }