about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2012-08-03 11:51:04 -0700
committerPatrick Walton <pcwalton@mimiga.net>2012-08-03 11:51:04 -0700
commit4e60d7e3a60e143b274e7fbfe391b0b33b40ea67 (patch)
tree7c9fea12e393e86d92285d1c5381b0ca16645b24
parent4bfd4fb8ea3000af665de8be5f72f0712668aa05 (diff)
downloadrust-4e60d7e3a60e143b274e7fbfe391b0b33b40ea67.tar.gz
rust-4e60d7e3a60e143b274e7fbfe391b0b33b40ea67.zip
rustc: "foo" is now a static string
-rw-r--r--src/rustc/middle/trans/alt.rs3
-rw-r--r--src/rustc/middle/trans/base.rs9
-rw-r--r--src/rustc/middle/trans/tvec.rs13
-rw-r--r--src/rustc/middle/typeck/check.rs2
4 files changed, 12 insertions, 15 deletions
diff --git a/src/rustc/middle/trans/alt.rs b/src/rustc/middle/trans/alt.rs
index b0a2acbe3a7..539ec5d7e11 100644
--- a/src/rustc/middle/trans/alt.rs
+++ b/src/rustc/middle/trans/alt.rs
@@ -52,7 +52,8 @@ fn trans_opt(bcx: block, o: opt) -> opt_result {
                            ast::vstore_uniq) {
             let strty = ty::mk_estr(bcx.tcx(), ty::vstore_uniq);
             let cell = empty_dest_cell();
-            bcx = tvec::trans_estr(bcx, s, ast::vstore_uniq, by_val(cell));
+            bcx = tvec::trans_estr(bcx, s, some(ast::vstore_uniq),
+                                   by_val(cell));
             add_clean_temp(bcx, *cell, strty);
             return single_result(rslt(bcx, *cell));
           }
diff --git a/src/rustc/middle/trans/base.rs b/src/rustc/middle/trans/base.rs
index d8518303804..9730c7e968d 100644
--- a/src/rustc/middle/trans/base.rs
+++ b/src/rustc/middle/trans/base.rs
@@ -1424,12 +1424,9 @@ fn store_temp_expr(cx: block, action: copy_action, dst: ValueRef,
 fn trans_lit(cx: block, e: @ast::expr, lit: ast::lit, dest: dest) -> block {
     let _icx = cx.insn_ctxt(~"trans_lit");
     if dest == ignore { return cx; }
-    alt lit.node {
-      ast::lit_str(s) { tvec::trans_estr(cx, s,
-                                         ast::vstore_fixed(none), dest) }
-      _ {
-        store_in_dest(cx, consts::const_lit(cx.ccx(), e, lit), dest)
-      }
+    match lit.node {
+        ast::lit_str(s) => tvec::trans_estr(cx, s, none, dest),
+        _ => store_in_dest(cx, consts::const_lit(cx.ccx(), e, lit), dest)
     }
 }
 
diff --git a/src/rustc/middle/trans/tvec.rs b/src/rustc/middle/trans/tvec.rs
index 213117f15f4..0f99fe9b2f7 100644
--- a/src/rustc/middle/trans/tvec.rs
+++ b/src/rustc/middle/trans/tvec.rs
@@ -220,7 +220,7 @@ fn trans_vstore(bcx: block, e: @ast::expr,
                 v: ast::vstore, dest: dest) -> block {
     alt e.node {
       ast::expr_lit(@{node: ast::lit_str(s), span: _}) {
-        return trans_estr(bcx, s, v, dest);
+        return trans_estr(bcx, s, some(v), dest);
       }
       ast::expr_vec(es, mutbl) {
         return trans_evec(bcx, es, v, e.id, dest);
@@ -266,27 +266,26 @@ fn get_base_and_len(cx: block, v: ValueRef, e_ty: ty::t)
     }
 }
 
-fn trans_estr(bcx: block, s: @~str, vstore: ast::vstore,
+fn trans_estr(bcx: block, s: @~str, vstore: option<ast::vstore>,
               dest: dest) -> block {
     let _icx = bcx.insn_ctxt(~"tvec::trans_estr");
     if dest == base::ignore { return bcx; }
     let ccx = bcx.ccx();
 
     let c = alt vstore {
-      ast::vstore_fixed(_)
-      {
+      some(ast::vstore_fixed(_)) => {
         // "hello"/_  =>  "hello"/5  =>  ~[i8 x 6] in llvm
         debug!{"trans_estr: fixed: %s", *s};
         C_postr(*s)
       }
 
-      ast::vstore_slice(_) {
+      some(ast::vstore_slice(_)) | none => {
         // "hello"  =>  (*i8, 6u) in llvm
         debug!{"trans_estr: slice '%s'", *s};
         C_estr_slice(ccx, *s)
       }
 
-      ast::vstore_uniq {
+      some(ast::vstore_uniq) => {
         let cs = PointerCast(bcx, C_cstr(ccx, *s), T_ptr(T_i8()));
         let len = C_uint(ccx, str::len(*s));
         let c = Call(bcx, ccx.upcalls.str_new_uniq, ~[cs, len]);
@@ -294,7 +293,7 @@ fn trans_estr(bcx: block, s: @~str, vstore: ast::vstore,
                     T_unique_ptr(T_unique(ccx, T_vec(ccx, T_i8()))))
       }
 
-      ast::vstore_box {
+      some(ast::vstore_box) => {
         let cs = PointerCast(bcx, C_cstr(ccx, *s), T_ptr(T_i8()));
         let len = C_uint(ccx, str::len(*s));
         let c = Call(bcx, ccx.upcalls.str_new_shared, ~[cs, len]);
diff --git a/src/rustc/middle/typeck/check.rs b/src/rustc/middle/typeck/check.rs
index 05f53018f41..0de0ae37ac2 100644
--- a/src/rustc/middle/typeck/check.rs
+++ b/src/rustc/middle/typeck/check.rs
@@ -703,7 +703,7 @@ fn check_lit(fcx: @fn_ctxt, lit: @ast::lit) -> ty::t {
     alt lit.node {
       ast::lit_str(s) {
         tcx.sess.span_warn(lit.span, ~"fixed length string");
-        ty::mk_estr(tcx, ty::vstore_fixed(s.len()))
+        ty::mk_estr(tcx, ty::vstore_slice(ty::re_static))
       }
       ast::lit_int(_, t) { ty::mk_mach_int(tcx, t) }
       ast::lit_uint(_, t) { ty::mk_mach_uint(tcx, t) }