diff options
| author | Amanieu d'Antras <amanieu@gmail.com> | 2015-11-06 13:31:02 +0000 |
|---|---|---|
| committer | Amanieu d'Antras <amanieu@gmail.com> | 2015-12-05 08:18:30 +0000 |
| commit | 9d7b113b44457ae20cb90828f63edb1f6cea2f06 (patch) | |
| tree | 772372f07ceacf75a1ae3093a597fb54aae55ed4 /src/libsyntax | |
| parent | 3e2ebaa9183d8e58693de408685e05ac2ad8ee31 (diff) | |
| download | rust-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.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/ext/asm.rs | 7 | ||||
| -rw-r--r-- | src/libsyntax/fold.rs | 4 | ||||
| -rw-r--r-- | src/libsyntax/print/pprust.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/visit.rs | 2 |
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) } } |
