about summary refs log tree commit diff
path: root/src/libcore
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2013-01-31 17:12:29 -0800
committerNiko Matsakis <niko@alum.mit.edu>2013-02-07 05:53:30 -0800
commita32498d8464e0dfa4e2cb31967a66e076da40109 (patch)
tree62fc02049c4d06ccd64a704f6f9e3af53d2835e3 /src/libcore
parent82d73963334f01b818cda767b44cd0c8f3baf4cc (diff)
downloadrust-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')
-rw-r--r--src/libcore/at_vec.rs4
-rw-r--r--src/libcore/bool.rs4
-rw-r--r--src/libcore/cast.rs3
-rw-r--r--src/libcore/char.rs4
-rw-r--r--src/libcore/cleanup.rs4
-rw-r--r--src/libcore/cmp.rs4
-rw-r--r--src/libcore/container.rs3
-rw-r--r--src/libcore/core.rc2
-rw-r--r--src/libcore/dlist.rs4
-rw-r--r--src/libcore/dvec.rs4
-rw-r--r--src/libcore/either.rs4
-rw-r--r--src/libcore/extfmt.rs4
-rw-r--r--src/libcore/flate.rs4
-rw-r--r--src/libcore/from_str.rs4
-rw-r--r--src/libcore/gc.rs3
-rw-r--r--src/libcore/hash.rs4
-rw-r--r--src/libcore/hashmap.rs4
-rw-r--r--src/libcore/io.rs3
-rw-r--r--src/libcore/iter-trait.rs3
-rw-r--r--src/libcore/iter.rs3
-rw-r--r--src/libcore/libc.rs3
-rw-r--r--src/libcore/logging.rs4
-rw-r--r--src/libcore/managed.rs4
-rw-r--r--src/libcore/mutable.rs2
-rw-r--r--src/libcore/nil.rs4
-rw-r--r--src/libcore/num/cmath.rs3
-rw-r--r--src/libcore/num/f32.rs4
-rw-r--r--src/libcore/num/f64.rs4
-rw-r--r--src/libcore/num/float.rs4
-rw-r--r--src/libcore/num/int-template.rs4
-rw-r--r--src/libcore/num/uint-template.rs4
-rw-r--r--src/libcore/ops.rs3
-rw-r--r--src/libcore/option.rs3
-rw-r--r--src/libcore/os.rs3
-rw-r--r--src/libcore/owned.rs4
-rw-r--r--src/libcore/path.rs4
-rw-r--r--src/libcore/pipes.rs5
-rw-r--r--src/libcore/prelude.rs2
-rw-r--r--src/libcore/private.rs5
-rw-r--r--src/libcore/private/finally.rs22
-rw-r--r--src/libcore/ptr.rs3
-rw-r--r--src/libcore/rand.rs4
-rw-r--r--src/libcore/reflect.rs3
-rw-r--r--src/libcore/repr.rs3
-rw-r--r--src/libcore/result.rs3
-rw-r--r--src/libcore/rt.rs3
-rw-r--r--src/libcore/run.rs3
-rw-r--r--src/libcore/stackwalk.rs5
-rw-r--r--src/libcore/str.rs18
-rw-r--r--src/libcore/sys.rs4
-rw-r--r--src/libcore/task/mod.rs5
-rw-r--r--src/libcore/task/spawn.rs1
-rw-r--r--src/libcore/to_bytes.rs6
-rw-r--r--src/libcore/to_str.rs4
-rw-r--r--src/libcore/tuple.rs4
-rw-r--r--src/libcore/unicode.rs3
-rw-r--r--src/libcore/util.rs4
-rw-r--r--src/libcore/vec.rs104
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!()
             }