diff --git a/src/libcore/dvec.rs b/src/libcore/dvec.rs index 7651b737bf34..9f2036c5f41a 100644 --- a/src/libcore/dvec.rs +++ b/src/libcore/dvec.rs @@ -133,18 +133,6 @@ impl DVec { 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 DVec { } /// Gives access to the vector as a slice with mutable contents - fn borrow_mut(op: fn(x: &[mut A]) -> R) -> R { + fn borrow_mut(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 9cd5e8f4965d..2522e9c2cda5 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 31c837e7e8a3..687ad2f79387 100644 --- a/src/libcore/vec.rs +++ b/src/libcore/vec.rs @@ -209,16 +209,6 @@ pub pure fn build_sized_opt(size: Option, build_sized(size.get_or_default(4), builder) } -/// Produces a mut vector from an immutable vector. -pub pure fn cast_to_mut(v: ~[T]) -> ~[mut T] { - unsafe { ::cast::transmute(v) } -} - -/// Produces an immutable vector from a mut vector. -pub pure fn cast_from_mut(v: ~[mut T]) -> ~[T] { - unsafe { ::cast::transmute(v) } -} - // Accessors /// Returns the first element of a vector @@ -274,9 +264,10 @@ pub pure fn slice(v: &r/[T], start: uint, end: uint) -> &r/[T] { /// Return a slice that points into another slice. #[inline(always)] -pub pure fn mut_slice(v: &r/[mut T], start: uint, - end: uint) -> &r/[mut T] { - +pub pure fn mut_slice(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(v: &r/[mut T], start: uint, /// Return a slice that points into another slice. #[inline(always)] -pub pure fn const_slice(v: &r/[const T], start: uint, - end: uint) -> &r/[const T] { +pub pure fn const_slice(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| { @@ -3337,28 +3330,6 @@ mod tests { let _x = windowed (0u, ~[1u,2u,3u,4u,5u,6u]); } - #[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]; diff --git a/src/libstd/sort.rs b/src/libstd/sort.rs index d2515df3e1b4..75f38da5a19a 100644 --- a/src/libstd/sort.rs +++ b/src/libstd/sort.rs @@ -455,8 +455,7 @@ impl MergeState { 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 MergeState { 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 fb6f80a65008..7dafdec95e07 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 e14e9665216f..bfeaf8400bc4 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 0c5c0f3d5138..33d959a7753c 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 c9102cbb86b4..b4bd28cbfe21 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 6ad334459973..72f6d23cacce 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]));