about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2013-02-26 14:50:09 -0800
committerPatrick Walton <pcwalton@mimiga.net>2013-02-27 09:40:16 -0800
commit573a31dfa769887f4be77a621ef4cab2d92a74e5 (patch)
treebfbed5ea785d70a71467cd8a66d53c719ab43d12
parent8d7e6ef7725f8a11de940892a74398fc1911dfc7 (diff)
downloadrust-573a31dfa769887f4be77a621ef4cab2d92a74e5.tar.gz
rust-573a31dfa769887f4be77a621ef4cab2d92a74e5.zip
libsyntax: Forbid mutable vectors. rs=demuting
-rw-r--r--src/libcore/dvec.rs14
-rw-r--r--src/libcore/os.rs2
-rw-r--r--src/libcore/vec.rs45
-rw-r--r--src/libstd/sort.rs6
-rw-r--r--src/libstd/stats.rs2
-rw-r--r--src/libstd/test.rs2
-rw-r--r--src/libsyntax/parse/obsolete.rs7
-rw-r--r--src/libsyntax/parse/parser.rs8
-rw-r--r--src/test/run-pass/import-in-block.rs6
9 files changed, 31 insertions, 61 deletions
diff --git a/src/libcore/dvec.rs b/src/libcore/dvec.rs
index 7651b737bf3..9f2036c5f41 100644
--- a/src/libcore/dvec.rs
+++ b/src/libcore/dvec.rs
@@ -133,18 +133,6 @@ impl<A> DVec<A> {
         self.check_out(|v| self.give_back(f(v)))
     }
 
-    /**
-     * Swaps out the current vector and hands it off to a user-provided
-     * function `f`.  The function should transform it however is desired
-     * and return a new vector to replace it with.
-     */
-    #[inline(always)]
-    fn swap_mut(f: &fn(v: ~[mut A]) -> ~[mut A]) {
-        do self.swap |v| {
-            vec::cast_from_mut(f(vec::cast_to_mut(v)))
-        }
-    }
-
     /// Returns the number of elements currently in the dvec
     #[inline(always)]
     pure fn len() -> uint {
@@ -217,7 +205,7 @@ impl<A> DVec<A> {
     }
 
     /// Gives access to the vector as a slice with mutable contents
-    fn borrow_mut<R>(op: fn(x: &[mut A]) -> R) -> R {
+    fn borrow_mut<R>(op: &fn(x: &mut [A]) -> R) -> R {
         do self.check_out |v| {
             let mut v = v;
             let result = op(v);
diff --git a/src/libcore/os.rs b/src/libcore/os.rs
index 9cd5e8f4965..2522e9c2cda 100644
--- a/src/libcore/os.rs
+++ b/src/libcore/os.rs
@@ -109,7 +109,7 @@ pub mod win32 {
             let mut done = false;
             while !done {
                 let mut k: DWORD = 0;
-                let buf = vec::cast_to_mut(vec::from_elem(n as uint, 0u16));
+                let mut buf = vec::from_elem(n as uint, 0u16);
                 do vec::as_mut_buf(buf) |b, _sz| {
                     k = f(b, TMPBUF_SZ as DWORD);
                     if k == (0 as DWORD) {
diff --git a/src/libcore/vec.rs b/src/libcore/vec.rs
index 31c837e7e8a..687ad2f7938 100644
--- a/src/libcore/vec.rs
+++ b/src/libcore/vec.rs
@@ -209,16 +209,6 @@ pub pure fn build_sized_opt<A>(size: Option<uint>,
     build_sized(size.get_or_default(4), builder)
 }
 
-/// Produces a mut vector from an immutable vector.
-pub pure fn cast_to_mut<T>(v: ~[T]) -> ~[mut T] {
-    unsafe { ::cast::transmute(v) }
-}
-
-/// Produces an immutable vector from a mut vector.
-pub pure fn cast_from_mut<T>(v: ~[mut T]) -> ~[T] {
-    unsafe { ::cast::transmute(v) }
-}
-
 // Accessors
 
 /// Returns the first element of a vector
@@ -274,9 +264,10 @@ pub pure fn slice<T>(v: &r/[T], start: uint, end: uint) -> &r/[T] {
 
 /// Return a slice that points into another slice.
 #[inline(always)]
-pub pure fn mut_slice<T>(v: &r/[mut T], start: uint,
-                         end: uint) -> &r/[mut T] {
-
+pub pure fn mut_slice<T>(v: &r/mut [T],
+                         start: uint,
+                         end: uint)
+                      -> &r/mut [T] {
     assert (start <= end);
     assert (end <= len(v));
     do as_mut_buf(v) |p, _len| {
@@ -290,8 +281,10 @@ pub pure fn mut_slice<T>(v: &r/[mut T], start: uint,
 
 /// Return a slice that points into another slice.
 #[inline(always)]
-pub pure fn const_slice<T>(v: &r/[const T], start: uint,
-                      end: uint) -> &r/[const T] {
+pub pure fn const_slice<T>(v: &r/[const T],
+                           start: uint,
+                           end: uint)
+                        -> &r/[const T] {
     assert (start <= end);
     assert (end <= len(v));
     do as_const_buf(v) |p, _len| {
@@ -3338,28 +3331,6 @@ mod tests {
     }
 
     #[test]
-    fn cast_to_mut_no_copy() {
-        unsafe {
-            let x = ~[1, 2, 3];
-            let addr = raw::to_ptr(x);
-            let x_mut = cast_to_mut(x);
-            let addr_mut = raw::to_ptr(x_mut);
-            assert addr == addr_mut;
-        }
-    }
-
-    #[test]
-    fn cast_from_mut_no_copy() {
-        unsafe {
-            let x = ~[mut 1, 2, 3];
-            let addr = raw::to_ptr(x);
-            let x_imm = cast_from_mut(x);
-            let addr_imm = raw::to_ptr(x_imm);
-            assert addr == addr_imm;
-        }
-    }
-
-    #[test]
     fn test_unshift() {
         let mut x = ~[1, 2, 3];
         x.unshift(0);
diff --git a/src/libstd/sort.rs b/src/libstd/sort.rs
index d2515df3e1b..75f38da5a19 100644
--- a/src/libstd/sort.rs
+++ b/src/libstd/sort.rs
@@ -455,8 +455,7 @@ impl<T:Copy + Ord> MergeState<T> {
                 base2: uint, len2: uint) {
         assert len1 != 0 && len2 != 0 && base1+len1 == base2;
 
-        let tmp = vec::cast_to_mut(
-            vec::slice(array, base1, base1+len1).to_vec());
+        let mut tmp = vec::slice(array, base1, base1+len1).to_vec();
 
         let mut c1 = 0;
         let mut c2 = base2;
@@ -559,8 +558,7 @@ impl<T:Copy + Ord> MergeState<T> {
                 base2: uint, len2: uint) {
         assert len1 != 1 && len2 != 0 && base1 + len1 == base2;
 
-        let tmp = vec::cast_to_mut(
-            vec::slice(array, base2, base2+len2).to_vec());
+        let mut tmp = vec::slice(array, base2, base2+len2).to_vec();
 
         let mut c1 = base1 + len1 - 1;
         let mut c2 = len2 - 1;
diff --git a/src/libstd/stats.rs b/src/libstd/stats.rs
index fb6f80a6500..7dafdec95e0 100644
--- a/src/libstd/stats.rs
+++ b/src/libstd/stats.rs
@@ -52,7 +52,7 @@ impl Stats for &[f64] {
 
     fn median(self) -> f64 {
         assert self.len() != 0;
-        let tmp = vec::cast_to_mut(vec::from_slice(self));
+        let mut tmp = vec::from_slice(self);
         sort::tim_sort(tmp);
         if tmp.len() & 1 == 0 {
             let m = tmp.len() / 2;
diff --git a/src/libstd/test.rs b/src/libstd/test.rs
index e14e9665216..bfeaf8400bc 100644
--- a/src/libstd/test.rs
+++ b/src/libstd/test.rs
@@ -377,7 +377,7 @@ pub fn run_tests_console(opts: &TestOpts,
 
 fn print_failures(st: @ConsoleTestState) {
     st.out.write_line(~"\nfailures:");
-    let failures = vec::cast_to_mut(st.failures.map(|t| t.name.to_str()));
+    let mut failures = st.failures.map(|t| t.name.to_str());
     sort::tim_sort(failures);
     for vec::each(failures) |name| {
         st.out.write_line(fmt!("    %s", name.to_str()));
diff --git a/src/libsyntax/parse/obsolete.rs b/src/libsyntax/parse/obsolete.rs
index 0c5c0f3d513..33d959a7753 100644
--- a/src/libsyntax/parse/obsolete.rs
+++ b/src/libsyntax/parse/obsolete.rs
@@ -49,6 +49,7 @@ pub enum ObsoleteSyntax {
     ObsoleteImplSyntax,
     ObsoleteTraitBoundSeparator,
     ObsoleteMutOwnedPointer,
+    ObsoleteMutVector,
 }
 
 pub impl to_bytes::IterBytes for ObsoleteSyntax {
@@ -133,6 +134,12 @@ pub impl Parser {
                  in a mutable location, like a mutable local variable or an \
                  `@mut` box"
             ),
+            ObsoleteMutVector => (
+                "const or mutable vector",
+                "mutability inherits through `~` pointers; place the vector \
+                 in a mutable location, like a mutable local variable or an \
+                 `@mut` box"
+            ),
         };
 
         self.report(sp, kind, kind_str, desc);
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index c9102cbb86b..b4bd28cbfe2 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -76,6 +76,7 @@ use parse::obsolete::{ObsoleteStructCtor, ObsoleteWith};
 use parse::obsolete::{ObsoleteSyntax, ObsoleteLowerCaseKindBounds};
 use parse::obsolete::{ObsoleteUnsafeBlock, ObsoleteImplSyntax};
 use parse::obsolete::{ObsoleteTraitBoundSeparator, ObsoleteMutOwnedPointer};
+use parse::obsolete::{ObsoleteMutVector};
 use parse::prec::{as_prec, token_to_binop};
 use parse::token::{can_begin_expr, is_ident, is_ident_or_path};
 use parse::token::{is_plain_ident, INTERPOLATED, special_idents};
@@ -624,6 +625,9 @@ pub impl Parser {
         } else if *self.token == token::LBRACKET {
             self.expect(token::LBRACKET);
             let mt = self.parse_mt();
+            if mt.mutbl == m_mutbl {    // `m_const` too after snapshot
+                self.obsolete(*self.last_span, ObsoleteMutVector);
+            }
 
             // Parse the `* 3` in `[ int * 3 ]`
             let t = match self.maybe_parse_fixed_vstore_with_star() {
@@ -1134,6 +1138,10 @@ pub impl Parser {
         } else if *self.token == token::LBRACKET {
             self.bump();
             let mutbl = self.parse_mutability();
+            if mutbl == m_mutbl {   // `m_const` too after snapshot
+                self.obsolete(*self.last_span, ObsoleteMutVector);
+            }
+
             if *self.token == token::RBRACKET {
                 // Empty vector.
                 self.bump();
diff --git a/src/test/run-pass/import-in-block.rs b/src/test/run-pass/import-in-block.rs
index 6ad33445997..72f6d23cacc 100644
--- a/src/test/run-pass/import-in-block.rs
+++ b/src/test/run-pass/import-in-block.rs
@@ -9,10 +9,8 @@
 // except according to those terms.
 
 pub fn main() {
-    // Once cast_to_mut is removed, pick a better function to import
-    // for this test!
-    use vec::cast_to_mut;
-    log(debug, vec::len(cast_to_mut(~[1, 2])));
+    use vec::from_fn;
+    log(debug, vec::len(from_fn(2, |i| i)));
     {
         use vec::*;
         log(debug, len(~[2]));