Otherwise `--pretty expanded` diverges.
.connect(",")
.as_slice());
- let mut clobbers = get_clobbers();
- if !ia.clobbers.get().is_empty() && !clobbers.is_empty() {
- clobbers = format!("{},{}", ia.clobbers.get(), clobbers);
- } else {
- clobbers.push_str(ia.clobbers.get());
+ let mut clobbers =
+ String::from_str(ia.clobbers.iter()
+ .map(|s| format!("~{{{}}}", s.get()))
+ .collect::<Vec<String>>()
+ .connect(",")
+ .as_slice());
+ let more_clobbers = get_clobbers();
+ if !more_clobbers.is_empty() {
+ if !clobbers.is_empty() {
+ clobbers.push(',');
+ }
+ clobbers.push_str(more_clobbers.as_slice());
}
// Add the clobbers to our constraints list
pub asm_str_style: StrStyle,
pub outputs: Vec<(InternedString, P<Expr>, bool)>,
pub inputs: Vec<(InternedString, P<Expr>)>,
- pub clobbers: InternedString,
+ pub clobbers: Vec<InternedString>,
pub volatile: bool,
pub alignstack: bool,
pub dialect: AsmDialect,
let mut asm_str_style = None;
let mut outputs = Vec::new();
let mut inputs = Vec::new();
- let mut cons = "".to_string();
+ let mut clobs = Vec::new();
let mut volatile = false;
let mut alignstack = false;
let mut dialect = ast::AsmAtt;
}
}
Clobbers => {
- let mut clobs = Vec::new();
while p.token != token::Eof &&
p.token != token::Colon &&
p.token != token::ModSep {
}
let (s, _str_style) = p.parse_str();
- let clob = format!("~{{{}}}", s);
- clobs.push(clob);
if OPTIONS.iter().any(|opt| s.equiv(opt)) {
cx.span_warn(p.last_span, "expected a clobber, found an option");
}
+ clobs.push(s);
}
-
- cons = clobs.connect(",");
}
Options => {
let (option, _str_style) = p.parse_str();
asm_str_style: asm_str_style.unwrap(),
outputs: outputs,
inputs: inputs,
- clobbers: token::intern_and_get_ident(cons.as_slice()),
+ clobbers: clobs,
volatile: volatile,
alignstack: alignstack,
dialect: dialect,
try!(space(&mut self.s));
try!(self.word_space(":"));
- try!(self.print_string(a.clobbers.get(), ast::CookedStr));
+ try!(self.commasep(Inconsistent, a.clobbers.as_slice(),
+ |s, co| {
+ try!(s.print_string(co.get(), ast::CookedStr));
+ Ok(())
+ }));
try!(self.pclose());
}
ast::ExprMac(ref m) => try!(self.print_mac(m)),
--- /dev/null
+// Copyright 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)]
+
+pub fn main() { unsafe { asm!("" : : : "hello", "world") }; }
+