about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorKang Seonghoon <public+git@mearie.org>2014-11-30 11:56:31 +0900
committerKang Seonghoon <public+git@mearie.org>2014-11-30 11:58:23 +0900
commit989f906af31d8a1d25eb3657896d2f3550d62fa2 (patch)
tree17f1c273f116c2028e41a1bd91550a557199dca6 /src
parent8d8f41b75f9bec7c7676122f85e049e7d7933298 (diff)
downloadrust-989f906af31d8a1d25eb3657896d2f3550d62fa2.tar.gz
rust-989f906af31d8a1d25eb3657896d2f3550d62fa2.zip
syntax: Make `asm!` clobbers a proper vector.
Otherwise `--pretty expanded` diverges.
Diffstat (limited to 'src')
-rw-r--r--src/librustc_trans/trans/asm.rs17
-rw-r--r--src/libsyntax/ast.rs2
-rw-r--r--src/libsyntax/ext/asm.rs10
-rw-r--r--src/libsyntax/print/pprust.rs6
-rw-r--r--src/test/pretty/asm-clobbers.rs14
5 files changed, 35 insertions, 14 deletions
diff --git a/src/librustc_trans/trans/asm.rs b/src/librustc_trans/trans/asm.rs
index 024df2a63ad..58bb42f3d67 100644
--- a/src/librustc_trans/trans/asm.rs
+++ b/src/librustc_trans/trans/asm.rs
@@ -85,11 +85,18 @@ pub fn trans_inline_asm<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, ia: &ast::InlineAsm)
                                     .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
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs
index 28d5fbb9689..7e421df505d 100644
--- a/src/libsyntax/ast.rs
+++ b/src/libsyntax/ast.rs
@@ -1177,7 +1177,7 @@ pub struct InlineAsm {
     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,
diff --git a/src/libsyntax/ext/asm.rs b/src/libsyntax/ext/asm.rs
index d04144ef26e..a1c4c0a0a10 100644
--- a/src/libsyntax/ext/asm.rs
+++ b/src/libsyntax/ext/asm.rs
@@ -53,7 +53,7 @@ pub fn expand_asm<'cx>(cx: &'cx mut ExtCtxt, sp: Span, tts: &[ast::TokenTree])
     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;
@@ -138,7 +138,6 @@ pub fn expand_asm<'cx>(cx: &'cx mut ExtCtxt, sp: Span, tts: &[ast::TokenTree])
                 }
             }
             Clobbers => {
-                let mut clobs = Vec::new();
                 while p.token != token::Eof &&
                       p.token != token::Colon &&
                       p.token != token::ModSep {
@@ -148,15 +147,12 @@ pub fn expand_asm<'cx>(cx: &'cx mut ExtCtxt, sp: Span, tts: &[ast::TokenTree])
                     }
 
                     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();
@@ -216,7 +212,7 @@ pub fn expand_asm<'cx>(cx: &'cx mut ExtCtxt, sp: Span, tts: &[ast::TokenTree])
             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,
diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs
index c12c3098279..b2c783b4bd9 100644
--- a/src/libsyntax/print/pprust.rs
+++ b/src/libsyntax/print/pprust.rs
@@ -1839,7 +1839,11 @@ impl<'a> State<'a> {
                 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)),
diff --git a/src/test/pretty/asm-clobbers.rs b/src/test/pretty/asm-clobbers.rs
new file mode 100644
index 00000000000..20a3ac226bd
--- /dev/null
+++ b/src/test/pretty/asm-clobbers.rs
@@ -0,0 +1,14 @@
+// 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") }; }
+