diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2013-01-31 17:12:29 -0800 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2013-02-07 05:53:30 -0800 |
| commit | a32498d8464e0dfa4e2cb31967a66e076da40109 (patch) | |
| tree | 62fc02049c4d06ccd64a704f6f9e3af53d2835e3 /src/libcore | |
| parent | 82d73963334f01b818cda767b44cd0c8f3baf4cc (diff) | |
| download | rust-a32498d8464e0dfa4e2cb31967a66e076da40109.tar.gz rust-a32498d8464e0dfa4e2cb31967a66e076da40109.zip | |
Make ~fn non-copyable, make &fn copyable, split barefn/closure types,
correct handling of moves for struct-record update. Part of #3678. Fixes #2828, #3904, #4719.
Diffstat (limited to 'src/libcore')
58 files changed, 123 insertions, 220 deletions
diff --git a/src/libcore/at_vec.rs b/src/libcore/at_vec.rs index be95148e554..75db5359e2e 100644 --- a/src/libcore/at_vec.rs +++ b/src/libcore/at_vec.rs @@ -10,10 +10,6 @@ //! Managed vectors -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use cast::transmute; use kinds::Copy; use iter; diff --git a/src/libcore/bool.rs b/src/libcore/bool.rs index 2f3a53ea504..1eebb716a59 100644 --- a/src/libcore/bool.rs +++ b/src/libcore/bool.rs @@ -9,10 +9,6 @@ // except according to those terms. -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - //! Boolean logic use bool; diff --git a/src/libcore/cast.rs b/src/libcore/cast.rs index 950a753d73f..14cc79ceaff 100644 --- a/src/libcore/cast.rs +++ b/src/libcore/cast.rs @@ -8,9 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -//! Unsafe operations -#[forbid(deprecated_mode)] - #[abi = "rust-intrinsic"] extern mod rusti { fn forget<T>(-x: T); diff --git a/src/libcore/char.rs b/src/libcore/char.rs index deecdc98ffa..f7a369489d1 100644 --- a/src/libcore/char.rs +++ b/src/libcore/char.rs @@ -10,10 +10,6 @@ //! Utilities for manipulating the char type -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use char; use cmp::Eq; use option::{None, Option, Some}; diff --git a/src/libcore/cleanup.rs b/src/libcore/cleanup.rs index 1967f1771be..11a4cad5d1b 100644 --- a/src/libcore/cleanup.rs +++ b/src/libcore/cleanup.rs @@ -10,10 +10,6 @@ #[doc(hidden)]; -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use libc::{c_char, c_void, intptr_t, uintptr_t}; use ptr::{mut_null, null, to_unsafe_ptr}; use repr::BoxRepr; diff --git a/src/libcore/cmp.rs b/src/libcore/cmp.rs index 038ea2ba675..e1ec8c7737c 100644 --- a/src/libcore/cmp.rs +++ b/src/libcore/cmp.rs @@ -20,10 +20,6 @@ and `Eq` to overload the `==` and `!=` operators. */ -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - /** * Trait for values that can be compared for equality * and inequality. diff --git a/src/libcore/container.rs b/src/libcore/container.rs index c8be690a38c..2a5ca7d8dfa 100644 --- a/src/libcore/container.rs +++ b/src/libcore/container.rs @@ -10,9 +10,6 @@ //! Container traits -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use option::Option; pub trait Container { diff --git a/src/libcore/core.rc b/src/libcore/core.rc index aece60652a2..64b480818b1 100644 --- a/src/libcore/core.rc +++ b/src/libcore/core.rc @@ -48,8 +48,6 @@ Implicitly, all crates behave as if they included the following prologue: // Don't link to core. We are core. #[no_core]; -#[warn(deprecated_mode)]; -#[warn(deprecated_pattern)]; #[warn(vecs_implicitly_copyable)]; #[deny(non_camel_case_types)]; #[allow(deprecated_self)]; diff --git a/src/libcore/dlist.rs b/src/libcore/dlist.rs index d4216b283a9..ed67e010b40 100644 --- a/src/libcore/dlist.rs +++ b/src/libcore/dlist.rs @@ -18,10 +18,6 @@ Do not use ==, !=, <, etc on doubly-linked lists -- it may not terminate. */ -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use kinds::Copy; use managed; use option::{None, Option, Some}; diff --git a/src/libcore/dvec.rs b/src/libcore/dvec.rs index 2fd7d71a7fc..fe36ed15960 100644 --- a/src/libcore/dvec.rs +++ b/src/libcore/dvec.rs @@ -19,10 +19,6 @@ Note that recursive use is not permitted. */ -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use cast; use cast::reinterpret_cast; use prelude::*; diff --git a/src/libcore/either.rs b/src/libcore/either.rs index 5e9ccd84195..7efde62c4ca 100644 --- a/src/libcore/either.rs +++ b/src/libcore/either.rs @@ -8,10 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - //! A type that represents one of two alternatives use cmp::Eq; diff --git a/src/libcore/extfmt.rs b/src/libcore/extfmt.rs index 259895da2a5..4d2a1b2afe0 100644 --- a/src/libcore/extfmt.rs +++ b/src/libcore/extfmt.rs @@ -51,10 +51,6 @@ //! * s - str (any flavor) //! * ? - arbitrary type (does not use the to_str trait) -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - // Transitional #[allow(structural_records)]; // Macros -- needs a snapshot diff --git a/src/libcore/flate.rs b/src/libcore/flate.rs index 39a3aa890df..6b5c083662b 100644 --- a/src/libcore/flate.rs +++ b/src/libcore/flate.rs @@ -14,10 +14,6 @@ Simple compression */ -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use libc; use libc::{c_void, size_t, c_int}; use ptr; diff --git a/src/libcore/from_str.rs b/src/libcore/from_str.rs index c3fda7eb8bd..9322c7e7cb8 100644 --- a/src/libcore/from_str.rs +++ b/src/libcore/from_str.rs @@ -10,10 +10,6 @@ //! The trait for types that can be created from strings -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use option::Option; pub trait FromStr { diff --git a/src/libcore/gc.rs b/src/libcore/gc.rs index 8150bfbe0ee..d0c40ccf19a 100644 --- a/src/libcore/gc.rs +++ b/src/libcore/gc.rs @@ -35,9 +35,6 @@ with destructors. */ -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; // Transitional #[allow(structural_records)]; diff --git a/src/libcore/hash.rs b/src/libcore/hash.rs index d676570e1e6..692cfee5365 100644 --- a/src/libcore/hash.rs +++ b/src/libcore/hash.rs @@ -8,10 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - /*! * Implementation of SipHash 2-4 * diff --git a/src/libcore/hashmap.rs b/src/libcore/hashmap.rs index 88981f514cf..be785863f71 100644 --- a/src/libcore/hashmap.rs +++ b/src/libcore/hashmap.rs @@ -10,10 +10,6 @@ //! Sendable hash maps. -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use container::{Container, Mutable, Map, Set}; use cmp::Eq; use hash::Hash; diff --git a/src/libcore/io.rs b/src/libcore/io.rs index e7d568c5433..721a6584c65 100644 --- a/src/libcore/io.rs +++ b/src/libcore/io.rs @@ -14,9 +14,6 @@ Basic input/output */ -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use result::Result; use cmp::Eq; diff --git a/src/libcore/iter-trait.rs b/src/libcore/iter-trait.rs index 942db1c5f29..df2aa6271d1 100644 --- a/src/libcore/iter-trait.rs +++ b/src/libcore/iter-trait.rs @@ -12,9 +12,6 @@ // workaround our lack of traits and lack of macros. See core.{rc,rs} for // how this file is used. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use cmp::{Eq, Ord}; use iter::BaseIter; use iter; diff --git a/src/libcore/iter.rs b/src/libcore/iter.rs index 2ffa8702261..c414ab0f5f3 100644 --- a/src/libcore/iter.rs +++ b/src/libcore/iter.rs @@ -14,9 +14,6 @@ The iteration traits and common implementation */ -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use cmp::{Eq, Ord}; use kinds::Copy; use option::{None, Option, Some}; diff --git a/src/libcore/libc.rs b/src/libcore/libc.rs index a1107d49c0e..6976c83a6f4 100644 --- a/src/libcore/libc.rs +++ b/src/libcore/libc.rs @@ -8,9 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; /*! * Bindings for libc. * diff --git a/src/libcore/logging.rs b/src/libcore/logging.rs index 922995a5af7..357a3415ac2 100644 --- a/src/libcore/logging.rs +++ b/src/libcore/logging.rs @@ -10,10 +10,6 @@ //! Logging -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use cast::transmute; use io; use libc; diff --git a/src/libcore/managed.rs b/src/libcore/managed.rs index 32fc5f527b7..700feee9839 100644 --- a/src/libcore/managed.rs +++ b/src/libcore/managed.rs @@ -10,10 +10,6 @@ //! Operations on managed box types -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use cast::transmute; use cmp::{Eq, Ord}; use managed::raw::BoxRepr; diff --git a/src/libcore/mutable.rs b/src/libcore/mutable.rs index 4623a3f4543..3c44c197f5e 100644 --- a/src/libcore/mutable.rs +++ b/src/libcore/mutable.rs @@ -18,8 +18,6 @@ dynamic checks: your program will fail if you attempt to perform mutation when the data structure should be immutable. */ -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; use util::with; use cast::transmute_immut; diff --git a/src/libcore/nil.rs b/src/libcore/nil.rs index f3eb62a3a3a..8f03a1b6e34 100644 --- a/src/libcore/nil.rs +++ b/src/libcore/nil.rs @@ -14,10 +14,6 @@ Functions for the unit type. */ -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use cmp::{Eq, Ord}; #[cfg(notest)] diff --git a/src/libcore/num/cmath.rs b/src/libcore/num/cmath.rs index 6341481809e..c030dfc5899 100644 --- a/src/libcore/num/cmath.rs +++ b/src/libcore/num/cmath.rs @@ -9,9 +9,6 @@ // except according to those terms. #[doc(hidden)]; // FIXME #3538 -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; use libc::c_int; use libc::c_float; diff --git a/src/libcore/num/f32.rs b/src/libcore/num/f32.rs index 24ad5c114af..738445b5cd9 100644 --- a/src/libcore/num/f32.rs +++ b/src/libcore/num/f32.rs @@ -8,10 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - //! Operations and constants for `f32` use cmath; diff --git a/src/libcore/num/f64.rs b/src/libcore/num/f64.rs index 126a48cf280..f09d874803c 100644 --- a/src/libcore/num/f64.rs +++ b/src/libcore/num/f64.rs @@ -8,10 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - //! Operations and constants for `f64` use cmath; diff --git a/src/libcore/num/float.rs b/src/libcore/num/float.rs index 32cda029cd1..f5ae05ebffb 100644 --- a/src/libcore/num/float.rs +++ b/src/libcore/num/float.rs @@ -8,10 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - //! Operations and constants for `float` // Even though this module exports everything defined in it, diff --git a/src/libcore/num/int-template.rs b/src/libcore/num/int-template.rs index 8b02f3a94c5..1856781b1d7 100644 --- a/src/libcore/num/int-template.rs +++ b/src/libcore/num/int-template.rs @@ -8,10 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use T = self::inst::T; use char; diff --git a/src/libcore/num/uint-template.rs b/src/libcore/num/uint-template.rs index 82c6e017014..f8bbb35204a 100644 --- a/src/libcore/num/uint-template.rs +++ b/src/libcore/num/uint-template.rs @@ -8,10 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use T = self::inst::T; use T_SIGNED = self::inst::T_SIGNED; diff --git a/src/libcore/ops.rs b/src/libcore/ops.rs index 36293d6a1c0..aaa4ab3fecf 100644 --- a/src/libcore/ops.rs +++ b/src/libcore/ops.rs @@ -10,9 +10,6 @@ // Core operators -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - #[lang="drop"] pub trait Drop { fn finalize(&self); // FIXME(#4332): Rename to "drop"? --pcwalton diff --git a/src/libcore/option.rs b/src/libcore/option.rs index 9cb955ad352..e5d703eec4a 100644 --- a/src/libcore/option.rs +++ b/src/libcore/option.rs @@ -41,9 +41,6 @@ let unwrapped_msg = match move msg { */ -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use cmp::Eq; use kinds::Copy; use option; diff --git a/src/libcore/os.rs b/src/libcore/os.rs index af484454ef4..a14abd23cc3 100644 --- a/src/libcore/os.rs +++ b/src/libcore/os.rs @@ -8,9 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; #[allow(structural_records)]; /*! diff --git a/src/libcore/owned.rs b/src/libcore/owned.rs index fb14820113e..d841188501d 100644 --- a/src/libcore/owned.rs +++ b/src/libcore/owned.rs @@ -10,10 +10,6 @@ //! Operations on unique pointer types -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use cmp::{Eq, Ord}; #[cfg(notest)] diff --git a/src/libcore/path.rs b/src/libcore/path.rs index 0b64df8c112..bf1f1c713a9 100644 --- a/src/libcore/path.rs +++ b/src/libcore/path.rs @@ -14,10 +14,6 @@ Cross-platform file path handling */ -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use cmp::Eq; use libc; use option::{None, Option, Some}; diff --git a/src/libcore/pipes.rs b/src/libcore/pipes.rs index 5f9eed70868..3f0aecb887d 100644 --- a/src/libcore/pipes.rs +++ b/src/libcore/pipes.rs @@ -82,11 +82,6 @@ bounded and unbounded protocols allows for less code duplication. */ -// NB: transitionary, de-mode-ing. -// tjc: allowing deprecated modes due to function issue, -// re-forbid after snapshot -#[forbid(deprecated_pattern)]; - // Transitional -- needs snapshot #[allow(structural_records)]; diff --git a/src/libcore/prelude.rs b/src/libcore/prelude.rs index 4e6f209e79e..a798d8c866a 100644 --- a/src/libcore/prelude.rs +++ b/src/libcore/prelude.rs @@ -36,7 +36,7 @@ pub use path::PosixPath; pub use path::WindowsPath; pub use pipes::{GenericChan, GenericPort}; pub use ptr::Ptr; -pub use str::{StrSlice, Trimmable}; +pub use str::{StrSlice, Trimmable, OwnedStr}; pub use to_bytes::IterBytes; pub use to_str::ToStr; pub use tuple::{CopyableTuple, ImmutableTuple, ExtendedTupleOps}; diff --git a/src/libcore/private.rs b/src/libcore/private.rs index 40194713365..d4cf39ad262 100644 --- a/src/libcore/private.rs +++ b/src/libcore/private.rs @@ -8,11 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// NB: transitionary, de-mode-ing. -// tjc: Re-forbid deprecated modes once a snapshot fixes the -// function problem -#[forbid(deprecated_pattern)]; - #[doc(hidden)]; use cast; diff --git a/src/libcore/private/finally.rs b/src/libcore/private/finally.rs index 2c27b8ab3a2..50c5ea70cbb 100644 --- a/src/libcore/private/finally.rs +++ b/src/libcore/private/finally.rs @@ -26,10 +26,19 @@ do || { use ops::Drop; use task::{spawn, failing}; +#[cfg(stage0)] pub trait Finally<T> { fn finally(&self, +dtor: &fn()) -> T; } +#[cfg(stage1)] +#[cfg(stage2)] +#[cfg(stage3)] +pub trait Finally<T> { + fn finally(&self, dtor: &fn()) -> T; +} + +#[cfg(stage0)] impl<T> &fn() -> T: Finally<T> { // FIXME #4518: Should not require a mode here fn finally(&self, +dtor: &fn()) -> T { @@ -41,6 +50,19 @@ impl<T> &fn() -> T: Finally<T> { } } +#[cfg(stage1)] +#[cfg(stage2)] +#[cfg(stage3)] +impl<T> &fn() -> T: Finally<T> { + fn finally(&self, dtor: &fn()) -> T { + let _d = Finallyalizer { + dtor: dtor + }; + + (*self)() + } +} + struct Finallyalizer { dtor: &fn() } diff --git a/src/libcore/ptr.rs b/src/libcore/ptr.rs index fb82c07da04..ad0bcb5cff8 100644 --- a/src/libcore/ptr.rs +++ b/src/libcore/ptr.rs @@ -10,9 +10,6 @@ //! Unsafe pointer utility functions -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use cast; use cmp::{Eq, Ord}; use libc; diff --git a/src/libcore/rand.rs b/src/libcore/rand.rs index 50232f99f85..452ab945251 100644 --- a/src/libcore/rand.rs +++ b/src/libcore/rand.rs @@ -10,10 +10,6 @@ //! Random number generation -// NB: transitional, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use int; use prelude::*; use str; diff --git a/src/libcore/reflect.rs b/src/libcore/reflect.rs index dcbb7067670..de94100d7a5 100644 --- a/src/libcore/reflect.rs +++ b/src/libcore/reflect.rs @@ -14,9 +14,6 @@ Runtime type reflection */ -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use intrinsic::{TyDesc, get_tydesc, visit_tydesc, TyVisitor}; use libc::c_void; use sys; diff --git a/src/libcore/repr.rs b/src/libcore/repr.rs index 1f04f9e77a9..a47bad008b8 100644 --- a/src/libcore/repr.rs +++ b/src/libcore/repr.rs @@ -14,9 +14,6 @@ More runtime type reflection */ -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use cast::transmute; use cast; use char; diff --git a/src/libcore/result.rs b/src/libcore/result.rs index d04667698fd..7f151317378 100644 --- a/src/libcore/result.rs +++ b/src/libcore/result.rs @@ -12,9 +12,6 @@ // NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use cmp; use cmp::Eq; use either; diff --git a/src/libcore/rt.rs b/src/libcore/rt.rs index f9de0bc91fd..33d76cb3c68 100644 --- a/src/libcore/rt.rs +++ b/src/libcore/rt.rs @@ -8,9 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; //! Runtime calls emitted by the compiler. use cast::transmute; diff --git a/src/libcore/run.rs b/src/libcore/run.rs index c10eacc7a0a..e44bd2aab81 100644 --- a/src/libcore/run.rs +++ b/src/libcore/run.rs @@ -8,9 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; #[allow(structural_records)]; //! Process spawning diff --git a/src/libcore/stackwalk.rs b/src/libcore/stackwalk.rs index 17921a1a1b0..2e24df86c78 100644 --- a/src/libcore/stackwalk.rs +++ b/src/libcore/stackwalk.rs @@ -11,12 +11,7 @@ #[doc(hidden)]; // FIXME #3538 #[legacy_modes]; // tjc: remove after snapshot - -// NB: transitionary, de-mode-ing. -// FIXME #4425: Can't forbid this because frame_address needs a deprecated -// mode. #[allow(deprecated_mode)]; -#[forbid(deprecated_pattern)]; use cast::reinterpret_cast; use ptr::offset; diff --git a/src/libcore/str.rs b/src/libcore/str.rs index 64695be21d5..9b25f92ede2 100644 --- a/src/libcore/str.rs +++ b/src/libcore/str.rs @@ -17,9 +17,6 @@ * some heavy-duty uses, try std::rope. */ -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use at_vec; use cast; use char; @@ -2314,6 +2311,21 @@ impl &str: StrSlice { pure fn char_at(i: uint) -> char { char_at(self, i) } } +pub trait OwnedStr { + fn push_str(&mut self, v: &str); + fn push_char(&mut self, c: char); +} + +pub impl ~str : OwnedStr { + fn push_str(&mut self, v: &str) { + push_str(self, v); + } + + fn push_char(&mut self, c: char) { + push_char(self, c); + } +} + #[cfg(test)] mod tests { use char; diff --git a/src/libcore/sys.rs b/src/libcore/sys.rs index 914eccd3d86..1571e645117 100644 --- a/src/libcore/sys.rs +++ b/src/libcore/sys.rs @@ -10,10 +10,6 @@ //! Misc low level stuff -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use cast; use cmp::{Eq, Ord}; use gc; diff --git a/src/libcore/task/mod.rs b/src/libcore/task/mod.rs index d276f0c6ea9..9240a67c69a 100644 --- a/src/libcore/task/mod.rs +++ b/src/libcore/task/mod.rs @@ -8,11 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// NB: transitionary, de-mode-ing. -// tjc: Deprecated modes allowed because of function arg issue -// in task::spawn. Re-forbid after snapshot. -#[forbid(deprecated_pattern)]; - /*! * Task management. * diff --git a/src/libcore/task/spawn.rs b/src/libcore/task/spawn.rs index c88587067c1..22a0c870de6 100644 --- a/src/libcore/task/spawn.rs +++ b/src/libcore/task/spawn.rs @@ -71,7 +71,6 @@ ****************************************************************************/ #[doc(hidden)]; // FIXME #3538 -#[warn(deprecated_mode)]; use cast; use container::Map; diff --git a/src/libcore/to_bytes.rs b/src/libcore/to_bytes.rs index 84e5140d8ed..b4647d0c621 100644 --- a/src/libcore/to_bytes.rs +++ b/src/libcore/to_bytes.rs @@ -14,16 +14,12 @@ The `ToBytes` and `IterBytes` traits */ -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use io; use io::Writer; use option::{None, Option, Some}; use str; -pub type Cb = fn(buf: &[const u8]) -> bool; +pub type Cb = &fn(buf: &[const u8]) -> bool; /** * A trait to implement in order to make a type hashable; diff --git a/src/libcore/to_str.rs b/src/libcore/to_str.rs index 0e46b4fd004..d98e341eab8 100644 --- a/src/libcore/to_str.rs +++ b/src/libcore/to_str.rs @@ -14,10 +14,6 @@ The `ToStr` trait for converting to strings */ -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use kinds::Copy; use str; use vec; diff --git a/src/libcore/tuple.rs b/src/libcore/tuple.rs index c497a2f3c7f..484fc1a5a27 100644 --- a/src/libcore/tuple.rs +++ b/src/libcore/tuple.rs @@ -8,10 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - //! Operations on tuples use cmp::{Eq, Ord}; diff --git a/src/libcore/unicode.rs b/src/libcore/unicode.rs index dedd5d12c55..ff3b908186a 100644 --- a/src/libcore/unicode.rs +++ b/src/libcore/unicode.rs @@ -9,9 +9,6 @@ // except according to those terms. #[doc(hidden)]; // FIXME #3538 -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; pub mod general_category { pub pure fn Cc(c: char) -> bool { diff --git a/src/libcore/util.rs b/src/libcore/util.rs index 8dff492e634..3b6a134bc52 100644 --- a/src/libcore/util.rs +++ b/src/libcore/util.rs @@ -14,10 +14,6 @@ Miscellaneous helpers for common patterns. */ -// NB: transitionary, de-mode-ing. -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; - use cmp::Eq; use prelude::*; diff --git a/src/libcore/vec.rs b/src/libcore/vec.rs index 7846d3d0302..9ad5d9f32da 100644 --- a/src/libcore/vec.rs +++ b/src/libcore/vec.rs @@ -10,8 +10,6 @@ //! Vectors -#[forbid(deprecated_mode)]; -#[forbid(deprecated_pattern)]; #[warn(non_camel_case_types)]; use container::{Container, Mutable}; @@ -841,14 +839,37 @@ pub pure fn map2<T: Copy, U: Copy, V>(v0: &[T], v1: &[U], u } -/** - * Apply a function to each element of a vector and return the results - * - * If function `f` returns `none` then that element is excluded from - * the resulting vector. - */ -pub pure fn filter_map<T, U: Copy>(v: &[T], f: fn(t: &T) -> Option<U>) - -> ~[U] { +pub fn filter_map<T, U>( + v: ~[T], + f: fn(t: T) -> Option<U>) -> ~[U] +{ + /*! + * + * Apply a function to each element of a vector and return the results. + * Consumes the input vector. If function `f` returns `None` then that + * element is excluded from the resulting vector. + */ + + let mut result = ~[]; + do consume(v) |_, elem| { + match f(elem) { + None => {} + Some(result_elem) => { result.push(result_elem); } + } + } + result +} + +pub pure fn filter_mapped<T, U: Copy>( + v: &[T], + f: fn(t: &T) -> Option<U>) -> ~[U] +{ + /*! + * + * Like `filter_map()`, but operates on a borrowed slice + * and does not consume the input. + */ + let mut result = ~[]; for each(v) |elem| { match f(elem) { @@ -1695,7 +1716,7 @@ pub trait ImmutableVector<T> { fn map_r<U>(&self, f: fn(x: &T) -> U) -> ~[U]; pure fn alli(&self, f: fn(uint, t: &T) -> bool) -> bool; pure fn flat_map<U>(&self, f: fn(t: &T) -> ~[U]) -> ~[U]; - pure fn filter_map<U: Copy>(&self, f: fn(t: &T) -> Option<U>) -> ~[U]; + pure fn filter_mapped<U: Copy>(&self, f: fn(t: &T) -> Option<U>) -> ~[U]; } /// Extension methods for vectors @@ -1758,8 +1779,8 @@ impl<T> &[T]: ImmutableVector<T> { * the resulting vector. */ #[inline] - pure fn filter_map<U: Copy>(&self, f: fn(t: &T) -> Option<U>) -> ~[U] { - filter_map(*self, f) + pure fn filter_mapped<U: Copy>(&self, f: fn(t: &T) -> Option<U>) -> ~[U] { + filter_mapped(*self, f) } } @@ -2439,10 +2460,14 @@ mod tests { pure fn is_equal(x: &uint, y:&uint) -> bool { return *x == *y; } - fn square_if_odd(n: &uint) -> Option<uint> { + fn square_if_odd_r(n: &uint) -> Option<uint> { return if *n % 2u == 1u { Some(*n * *n) } else { None }; } + fn square_if_odd_v(n: uint) -> Option<uint> { + return if n % 2u == 1u { Some(n * n) } else { None }; + } + fn add(x: uint, y: &uint) -> uint { return x + *y; } #[test] @@ -2775,17 +2800,17 @@ mod tests { } #[test] - fn test_filter_map() { + fn test_filter_mapped() { // Test on-stack filter-map. let mut v = ~[1u, 2u, 3u]; - let mut w = filter_map(v, square_if_odd); + let mut w = filter_mapped(v, square_if_odd_r); assert (len(w) == 2u); assert (w[0] == 1u); assert (w[1] == 9u); // Test on-heap filter-map. v = ~[1u, 2u, 3u, 4u, 5u]; - w = filter_map(v, square_if_odd); + w = filter_mapped(v, square_if_odd_r); assert (len(w) == 3u); assert (w[0] == 1u); assert (w[1] == 9u); @@ -2804,7 +2829,46 @@ mod tests { let all_odd2: ~[int] = ~[]; let mix: ~[int] = ~[9, 2, 6, 7, 1, 0, 0, 3]; let mix_dest: ~[int] = ~[1, 3, 0, 0]; - assert (filter_map(all_even, halve) == map(all_even, halve_for_sure)); + assert (filter_mapped(all_even, halve) == + map(all_even, halve_for_sure)); + assert (filter_mapped(all_odd1, halve) == ~[]); + assert (filter_mapped(all_odd2, halve) == ~[]); + assert (filter_mapped(mix, halve) == mix_dest); + } + + #[test] + fn test_filter_map() { + // Test on-stack filter-map. + let mut v = ~[1u, 2u, 3u]; + let mut w = filter_map(v, square_if_odd_v); + assert (len(w) == 2u); + assert (w[0] == 1u); + assert (w[1] == 9u); + + // Test on-heap filter-map. + v = ~[1u, 2u, 3u, 4u, 5u]; + w = filter_map(v, square_if_odd_v); + assert (len(w) == 3u); + assert (w[0] == 1u); + assert (w[1] == 9u); + assert (w[2] == 25u); + + fn halve(i: int) -> Option<int> { + if i % 2 == 0 { + return option::Some::<int>(i / 2); + } else { + return option::None::<int>; + } + } + fn halve_for_sure(i: &int) -> int { return *i / 2; } + let all_even: ~[int] = ~[0, 2, 8, 6]; + let all_even0: ~[int] = copy all_even; + let all_odd1: ~[int] = ~[1, 7, 3]; + let all_odd2: ~[int] = ~[]; + let mix: ~[int] = ~[9, 2, 6, 7, 1, 0, 0, 3]; + let mix_dest: ~[int] = ~[1, 3, 0, 0]; + assert (filter_map(all_even, halve) == + map(all_even0, halve_for_sure)); assert (filter_map(all_odd1, halve) == ~[]); assert (filter_map(all_odd2, halve) == ~[]); assert (filter_map(mix, halve) == mix_dest); @@ -3664,10 +3728,10 @@ mod tests { #[ignore(windows)] #[should_fail] #[allow(non_implicitly_copyable_typarams)] - fn test_filter_map_fail() { + fn test_filter_mapped_fail() { let v = [(~0, @0), (~0, @0), (~0, @0), (~0, @0)]; let mut i = 0; - do filter_map(v) |_elt| { + do filter_mapped(v) |_elt| { if i == 2 { die!() } |
