1
Fork 0

librustc: Convert all uses of old lifetime notation to new lifetime notation. rs=delifetiming

This commit is contained in:
Patrick Walton 2013-03-14 11:22:51 -07:00
parent 7352d919f6
commit 352c070365
147 changed files with 523 additions and 501 deletions

View file

@ -174,9 +174,9 @@ pub mod traits {
use kinds::Copy; use kinds::Copy;
use ops::Add; use ops::Add;
impl<T:Copy> Add<&self/[const T],@[T]> for @[T] { impl<T:Copy> Add<&'self [const T],@[T]> for @[T] {
#[inline(always)] #[inline(always)]
pure fn add(&self, rhs: & &self/[const T]) -> @[T] { pure fn add(&self, rhs: & &'self [const T]) -> @[T] {
append(*self, (*rhs)) append(*self, (*rhs))
} }
} }

View file

@ -59,17 +59,17 @@ pub unsafe fn transmute<L, G>(thing: L) -> G {
/// Coerce an immutable reference to be mutable. /// Coerce an immutable reference to be mutable.
#[inline(always)] #[inline(always)]
pub unsafe fn transmute_mut<T>(ptr: &a/T) -> &a/mut T { transmute(ptr) } pub unsafe fn transmute_mut<T>(ptr: &'a T) -> &'a mut T { transmute(ptr) }
/// Coerce a mutable reference to be immutable. /// Coerce a mutable reference to be immutable.
#[inline(always)] #[inline(always)]
pub unsafe fn transmute_immut<T>(ptr: &a/mut T) -> &a/T { pub unsafe fn transmute_immut<T>(ptr: &'a mut T) -> &'a T {
transmute(ptr) transmute(ptr)
} }
/// Coerce a borrowed pointer to have an arbitrary associated region. /// Coerce a borrowed pointer to have an arbitrary associated region.
#[inline(always)] #[inline(always)]
pub unsafe fn transmute_region<T>(ptr: &a/T) -> &b/T { transmute(ptr) } pub unsafe fn transmute_region<T>(ptr: &'a T) -> &'b T { transmute(ptr) }
/// Coerce an immutable reference to be mutable. /// Coerce an immutable reference to be mutable.
#[inline(always)] #[inline(always)]
@ -85,19 +85,19 @@ pub unsafe fn transmute_immut_unsafe<T>(ptr: *const T) -> *T {
/// Coerce a borrowed mutable pointer to have an arbitrary associated region. /// Coerce a borrowed mutable pointer to have an arbitrary associated region.
#[inline(always)] #[inline(always)]
pub unsafe fn transmute_mut_region<T>(ptr: &a/mut T) -> &b/mut T { pub unsafe fn transmute_mut_region<T>(ptr: &'a mut T) -> &'b mut T {
transmute(ptr) transmute(ptr)
} }
/// Transforms lifetime of the second pointer to match the first. /// Transforms lifetime of the second pointer to match the first.
#[inline(always)] #[inline(always)]
pub unsafe fn copy_lifetime<S,T>(_ptr: &a/S, ptr: &T) -> &a/T { pub unsafe fn copy_lifetime<S,T>(_ptr: &'a S, ptr: &T) -> &'a T {
transmute_region(ptr) transmute_region(ptr)
} }
/// Transforms lifetime of the second pointer to match the first. /// Transforms lifetime of the second pointer to match the first.
#[inline(always)] #[inline(always)]
pub unsafe fn copy_lifetime_vec<S,T>(_ptr: &a/[S], ptr: &T) -> &a/T { pub unsafe fn copy_lifetime_vec<S,T>(_ptr: &'a [S], ptr: &T) -> &'a T {
transmute_region(ptr) transmute_region(ptr)
} }

View file

@ -22,8 +22,8 @@ use cast::transmute;
* NB: These must match the representation in the C++ runtime. * NB: These must match the representation in the C++ runtime.
*/ */
type DropGlue = &self/fn(**TypeDesc, *c_void); type DropGlue = &'self fn(**TypeDesc, *c_void);
type FreeGlue = &self/fn(**TypeDesc, *c_void); type FreeGlue = &'self fn(**TypeDesc, *c_void);
type TaskID = uintptr_t; type TaskID = uintptr_t;

View file

@ -21,12 +21,12 @@ pub struct Handler<T, U> {
} }
pub struct Condition<T, U> { pub struct Condition<T, U> {
name: &static/str, name: &'static str,
key: task::local_data::LocalDataKey/&self<Handler<T, U>> key: task::local_data::LocalDataKey/&self<Handler<T, U>>
} }
pub impl<T, U> Condition/&self<T, U> { pub impl<T, U> Condition/&self<T, U> {
fn trap(&self, h: &self/fn(T) -> U) -> Trap/&self<T, U> { fn trap(&self, h: &'self fn(T) -> U) -> Trap/&self<T, U> {
unsafe { unsafe {
let p : *RustClosure = ::cast::transmute(&h); let p : *RustClosure = ::cast::transmute(&h);
let prev = task::local_data::local_data_get(self.key); let prev = task::local_data::local_data_get(self.key);
@ -65,12 +65,12 @@ pub impl<T, U> Condition/&self<T, U> {
} }
struct Trap<T, U> { struct Trap<T, U> {
cond: &self/Condition/&self<T, U>, cond: &'self Condition/&self<T, U>,
handler: @Handler<T, U> handler: @Handler<T, U>
} }
pub impl<T, U> Trap/&self<T, U> { pub impl<T, U> Trap/&self<T, U> {
fn in<V>(&self, inner: &self/fn() -> V) -> V { fn in<V>(&self, inner: &'self fn() -> V) -> V {
unsafe { unsafe {
let _g = Guard { cond: self.cond }; let _g = Guard { cond: self.cond };
debug!("Trap: pushing handler to TLS"); debug!("Trap: pushing handler to TLS");
@ -81,7 +81,7 @@ pub impl<T, U> Trap/&self<T, U> {
} }
struct Guard<T, U> { struct Guard<T, U> {
cond: &self/Condition/&self<T, U> cond: &'self Condition/&self<T, U>
} }
impl<T, U> Drop for Guard/&self<T, U> { impl<T, U> Drop for Guard/&self<T, U> {

View file

@ -39,7 +39,7 @@ pub trait Map<K, V>: Mutable {
fn mutate_values(&mut self, f: &fn(&K, &mut V) -> bool); fn mutate_values(&mut self, f: &fn(&K, &mut V) -> bool);
/// Return the value corresponding to the key in the map /// Return the value corresponding to the key in the map
pure fn find(&self, key: &K) -> Option<&self/V>; pure fn find(&self, key: &K) -> Option<&'self V>;
/// Insert a key-value pair into the map. An existing value for a /// Insert a key-value pair into the map. An existing value for a
/// key is replaced by the new value. Return true if the key did /// key is replaced by the new value. Return true if the key did

View file

@ -122,7 +122,7 @@ unsafe fn is_safe_point(pc: *Word) -> Option<SafePoint> {
return None; return None;
} }
type Visitor = &self/fn(root: **Word, tydesc: *Word) -> bool; type Visitor = &'self fn(root: **Word, tydesc: *Word) -> bool;
// Walks the list of roots for the given safe point, and calls visitor // Walks the list of roots for the given safe point, and calls visitor
// on each root. // on each root.

View file

@ -185,7 +185,7 @@ pub mod linear {
} }
#[inline(always)] #[inline(always)]
pure fn value_for_bucket(&self, idx: uint) -> &self/V { pure fn value_for_bucket(&self, idx: uint) -> &'self V {
match self.buckets[idx] { match self.buckets[idx] {
Some(ref bkt) => &bkt.value, Some(ref bkt) => &bkt.value,
None => fail!(~"LinearMap::find: internal logic error"), None => fail!(~"LinearMap::find: internal logic error"),
@ -270,10 +270,10 @@ pub mod linear {
} }
impl<K:Hash + IterBytes + Eq,V> impl<K:Hash + IterBytes + Eq,V>
BaseIter<(&self/K, &self/V)> for LinearMap<K, V> BaseIter<(&'self K, &'self V)> for LinearMap<K, V>
{ {
/// Visit all key-value pairs /// Visit all key-value pairs
pure fn each(&self, blk: &fn(&(&self/K, &self/V)) -> bool) { pure fn each(&self, blk: &fn(&(&'self K, &'self V)) -> bool) {
for uint::range(0, self.buckets.len()) |i| { for uint::range(0, self.buckets.len()) |i| {
let mut broke = false; let mut broke = false;
do self.buckets[i].map |bucket| { do self.buckets[i].map |bucket| {
@ -339,7 +339,7 @@ pub mod linear {
} }
/// Return the value corresponding to the key in the map /// Return the value corresponding to the key in the map
pure fn find(&self, k: &K) -> Option<&self/V> { pure fn find(&self, k: &K) -> Option<&'self V> {
match self.bucket_for_key(k) { match self.bucket_for_key(k) {
FoundEntry(idx) => Some(self.value_for_bucket(idx)), FoundEntry(idx) => Some(self.value_for_bucket(idx)),
TableFull | FoundHole(_) => None, TableFull | FoundHole(_) => None,
@ -412,7 +412,7 @@ pub mod linear {
/// Return the value corresponding to the key in the map, or insert /// Return the value corresponding to the key in the map, or insert
/// and return the value if it doesn't exist. /// and return the value if it doesn't exist.
fn find_or_insert(&mut self, k: K, v: V) -> &self/V { fn find_or_insert(&mut self, k: K, v: V) -> &'self V {
if self.size >= self.resize_at { if self.size >= self.resize_at {
// n.b.: We could also do this after searching, so // n.b.: We could also do this after searching, so
// that we do not resize if this call to insert is // that we do not resize if this call to insert is
@ -442,7 +442,7 @@ pub mod linear {
/// Return the value corresponding to the key in the map, or create, /// Return the value corresponding to the key in the map, or create,
/// insert, and return a new value if it doesn't exist. /// insert, and return a new value if it doesn't exist.
fn find_or_insert_with(&mut self, k: K, f: &fn(&K) -> V) -> &self/V { fn find_or_insert_with(&mut self, k: K, f: &fn(&K) -> V) -> &'self V {
if self.size >= self.resize_at { if self.size >= self.resize_at {
// n.b.: We could also do this after searching, so // n.b.: We could also do this after searching, so
// that we do not resize if this call to insert is // that we do not resize if this call to insert is
@ -487,7 +487,7 @@ pub mod linear {
} }
} }
pure fn get(&self, k: &K) -> &self/V { pure fn get(&self, k: &K) -> &'self V {
match self.find(k) { match self.find(k) {
Some(v) => v, Some(v) => v,
None => fail!(fmt!("No entry found for key: %?", k)), None => fail!(fmt!("No entry found for key: %?", k)),
@ -509,7 +509,7 @@ pub mod linear {
/// Return the value corresponding to the key in the map, using /// Return the value corresponding to the key in the map, using
/// equivalence /// equivalence
pure fn find_equiv<Q:Hash + IterBytes + Equiv<K>>(&self, k: &Q) pure fn find_equiv<Q:Hash + IterBytes + Equiv<K>>(&self, k: &Q)
-> Option<&self/V> { -> Option<&'self V> {
match self.bucket_for_key_equiv(k) { match self.bucket_for_key_equiv(k) {
FoundEntry(idx) => Some(self.value_for_bucket(idx)), FoundEntry(idx) => Some(self.value_for_bucket(idx)),
TableFull | FoundHole(_) => None, TableFull | FoundHole(_) => None,

View file

@ -589,7 +589,7 @@ pub fn file_reader(path: &Path) -> Result<@Reader, ~str> {
// Byte readers // Byte readers
pub struct BytesReader { pub struct BytesReader {
bytes: &self/[u8], bytes: &'self [u8],
mut pos: uint mut pos: uint
} }

View file

@ -20,7 +20,7 @@ use option::{None, Option, Some};
use vec; use vec;
/// A function used to initialize the elements of a sequence /// A function used to initialize the elements of a sequence
pub type InitOp<T> = &self/fn(uint) -> T; pub type InitOp<T> = &'self fn(uint) -> T;
pub trait BaseIter<A> { pub trait BaseIter<A> {
pure fn each(&self, blk: &fn(v: &A) -> bool); pure fn each(&self, blk: &fn(v: &A) -> bool);

View file

@ -122,7 +122,7 @@ pub pure fn get<T:Copy>(opt: Option<T>) -> T {
} }
#[inline(always)] #[inline(always)]
pub pure fn get_ref<T>(opt: &r/Option<T>) -> &r/T { pub pure fn get_ref<T>(opt: &'r Option<T>) -> &'r T {
/*! /*!
Gets an immutable reference to the value inside an option. Gets an immutable reference to the value inside an option.
@ -143,7 +143,7 @@ pub pure fn get_ref<T>(opt: &r/Option<T>) -> &r/T {
} }
} }
pub pure fn get_mut_ref<T>(opt: &r/mut Option<T>) -> &r/mut T { pub pure fn get_mut_ref<T>(opt: &'r mut Option<T>) -> &'r mut T {
/*! /*!
Gets a mutable reference to the value inside an option. Gets a mutable reference to the value inside an option.
@ -165,7 +165,7 @@ pub pure fn get_mut_ref<T>(opt: &r/mut Option<T>) -> &r/mut T {
} }
#[inline(always)] #[inline(always)]
pub pure fn map<T, U>(opt: &r/Option<T>, f: &fn(x: &r/T) -> U) -> Option<U> { pub pure fn map<T, U>(opt: &'r Option<T>, f: &fn(x: &'r T) -> U) -> Option<U> {
//! Maps a `some` value by reference from one type to another //! Maps a `some` value by reference from one type to another
match *opt { Some(ref x) => Some(f(x)), None => None } match *opt { Some(ref x) => Some(f(x)), None => None }
@ -256,8 +256,8 @@ pub pure fn get_or_default<T:Copy>(opt: Option<T>, def: T) -> T {
} }
#[inline(always)] #[inline(always)]
pub pure fn map_default<T, U>(opt: &r/Option<T>, def: U, pub pure fn map_default<T, U>(opt: &'r Option<T>, def: U,
f: &fn(&r/T) -> U) -> U { f: &fn(&'r T) -> U) -> U {
//! Applies a function to the contained value or returns a default //! Applies a function to the contained value or returns a default
match *opt { None => def, Some(ref t) => f(t) } match *opt { None => def, Some(ref t) => f(t) }
@ -313,7 +313,7 @@ pub pure fn expect<T>(opt: Option<T>, reason: &str) -> T {
impl<T> BaseIter<T> for Option<T> { impl<T> BaseIter<T> for Option<T> {
/// Performs an operation on the contained value by reference /// Performs an operation on the contained value by reference
#[inline(always)] #[inline(always)]
pure fn each(&self, f: &fn(x: &self/T) -> bool) { pure fn each(&self, f: &fn(x: &'self T) -> bool) {
match *self { None => (), Some(ref t) => { f(t); } } match *self { None => (), Some(ref t) => { f(t); } }
} }
@ -350,7 +350,7 @@ pub impl<T> Option<T> {
/// Maps a `some` value from one type to another by reference /// Maps a `some` value from one type to another by reference
#[inline(always)] #[inline(always)]
pure fn map<U>(&self, f: &fn(&self/T) -> U) -> Option<U> { map(self, f) } pure fn map<U>(&self, f: &fn(&'self T) -> U) -> Option<U> { map(self, f) }
/// As `map`, but consumes the option and gives `f` ownership to avoid /// As `map`, but consumes the option and gives `f` ownership to avoid
/// copying. /// copying.
@ -361,7 +361,7 @@ pub impl<T> Option<T> {
/// Applies a function to the contained value or returns a default /// Applies a function to the contained value or returns a default
#[inline(always)] #[inline(always)]
pure fn map_default<U>(&self, def: U, f: &fn(&self/T) -> U) -> U { pure fn map_default<U>(&self, def: U, f: &fn(&'self T) -> U) -> U {
map_default(self, def, f) map_default(self, def, f)
} }
@ -403,7 +403,7 @@ pub impl<T> Option<T> {
case explicitly. case explicitly.
*/ */
#[inline(always)] #[inline(always)]
pure fn get_ref(&self) -> &self/T { get_ref(self) } pure fn get_ref(&self) -> &'self T { get_ref(self) }
/** /**
Gets a mutable reference to the value inside an option. Gets a mutable reference to the value inside an option.
@ -420,7 +420,7 @@ pub impl<T> Option<T> {
case explicitly. case explicitly.
*/ */
#[inline(always)] #[inline(always)]
pure fn get_mut_ref(&mut self) -> &self/mut T { get_mut_ref(self) } pure fn get_mut_ref(&mut self) -> &'self mut T { get_mut_ref(self) }
/** /**
* Gets the value out of an option without copying. * Gets the value out of an option without copying.

View file

@ -1170,11 +1170,11 @@ pub mod consts {
pub use os::consts::windows::*; pub use os::consts::windows::*;
pub mod unix { pub mod unix {
pub const FAMILY: &static/str = "unix"; pub const FAMILY: &'static str = "unix";
} }
pub mod windows { pub mod windows {
pub const FAMILY: &static/str = "windows"; pub const FAMILY: &'static str = "windows";
} }
#[cfg(target_os = "macos")] #[cfg(target_os = "macos")]
@ -1193,38 +1193,38 @@ pub mod consts {
pub use os::consts::win32::*; pub use os::consts::win32::*;
pub mod macos { pub mod macos {
pub const SYSNAME: &static/str = "macos"; pub const SYSNAME: &'static str = "macos";
pub const DLL_PREFIX: &static/str = "lib"; pub const DLL_PREFIX: &'static str = "lib";
pub const DLL_SUFFIX: &static/str = ".dylib"; pub const DLL_SUFFIX: &'static str = ".dylib";
pub const EXE_SUFFIX: &static/str = ""; pub const EXE_SUFFIX: &'static str = "";
} }
pub mod freebsd { pub mod freebsd {
pub const SYSNAME: &static/str = "freebsd"; pub const SYSNAME: &'static str = "freebsd";
pub const DLL_PREFIX: &static/str = "lib"; pub const DLL_PREFIX: &'static str = "lib";
pub const DLL_SUFFIX: &static/str = ".so"; pub const DLL_SUFFIX: &'static str = ".so";
pub const EXE_SUFFIX: &static/str = ""; pub const EXE_SUFFIX: &'static str = "";
} }
pub mod linux { pub mod linux {
pub const SYSNAME: &static/str = "linux"; pub const SYSNAME: &'static str = "linux";
pub const DLL_PREFIX: &static/str = "lib"; pub const DLL_PREFIX: &'static str = "lib";
pub const DLL_SUFFIX: &static/str = ".so"; pub const DLL_SUFFIX: &'static str = ".so";
pub const EXE_SUFFIX: &static/str = ""; pub const EXE_SUFFIX: &'static str = "";
} }
pub mod android { pub mod android {
pub const SYSNAME: &static/str = "android"; pub const SYSNAME: &'static str = "android";
pub const DLL_PREFIX: &static/str = "lib"; pub const DLL_PREFIX: &'static str = "lib";
pub const DLL_SUFFIX: &static/str = ".so"; pub const DLL_SUFFIX: &'static str = ".so";
pub const EXE_SUFFIX: &static/str = ""; pub const EXE_SUFFIX: &'static str = "";
} }
pub mod win32 { pub mod win32 {
pub const SYSNAME: &static/str = "win32"; pub const SYSNAME: &'static str = "win32";
pub const DLL_PREFIX: &static/str = ""; pub const DLL_PREFIX: &'static str = "";
pub const DLL_SUFFIX: &static/str = ".dll"; pub const DLL_SUFFIX: &'static str = ".dll";
pub const EXE_SUFFIX: &static/str = ".exe"; pub const EXE_SUFFIX: &'static str = ".exe";
} }

View file

@ -446,7 +446,7 @@ pub fn try_recv<T:Owned,Tbuffer:Owned>(p: RecvPacketBuffered<T, Tbuffer>)
let p = unsafe { &*p_ }; let p = unsafe { &*p_ };
struct DropState { struct DropState {
p: &self/PacketHeader, p: &'self PacketHeader,
drop { drop {
if task::failing() { if task::failing() {

View file

@ -178,7 +178,7 @@ pub pure fn to_uint<T>(thing: &T) -> uint {
/// Determine if two borrowed pointers point to the same thing. /// Determine if two borrowed pointers point to the same thing.
#[inline(always)] #[inline(always)]
pub pure fn ref_eq<T>(thing: &a/T, other: &b/T) -> bool { pub pure fn ref_eq<T>(thing: &'a T, other: &'b T) -> bool {
to_uint(thing) == to_uint(other) to_uint(thing) == to_uint(other)
} }
@ -312,34 +312,34 @@ impl<T> Ord for *const T {
// Equality for region pointers // Equality for region pointers
#[cfg(notest)] #[cfg(notest)]
impl<T:Eq> Eq for &self/const T { impl<T:Eq> Eq for &'self const T {
#[inline(always)] #[inline(always)]
pure fn eq(&self, other: & &self/const T) -> bool { pure fn eq(&self, other: & &'self const T) -> bool {
return *(*self) == *(*other); return *(*self) == *(*other);
} }
#[inline(always)] #[inline(always)]
pure fn ne(&self, other: & &self/const T) -> bool { pure fn ne(&self, other: & &'self const T) -> bool {
return *(*self) != *(*other); return *(*self) != *(*other);
} }
} }
// Comparison for region pointers // Comparison for region pointers
#[cfg(notest)] #[cfg(notest)]
impl<T:Ord> Ord for &self/const T { impl<T:Ord> Ord for &'self const T {
#[inline(always)] #[inline(always)]
pure fn lt(&self, other: & &self/const T) -> bool { pure fn lt(&self, other: & &'self const T) -> bool {
*(*self) < *(*other) *(*self) < *(*other)
} }
#[inline(always)] #[inline(always)]
pure fn le(&self, other: & &self/const T) -> bool { pure fn le(&self, other: & &'self const T) -> bool {
*(*self) <= *(*other) *(*self) <= *(*other)
} }
#[inline(always)] #[inline(always)]
pure fn ge(&self, other: & &self/const T) -> bool { pure fn ge(&self, other: & &'self const T) -> bool {
*(*self) >= *(*other) *(*self) >= *(*other)
} }
#[inline(always)] #[inline(always)]
pure fn gt(&self, other: & &self/const T) -> bool { pure fn gt(&self, other: & &'self const T) -> bool {
*(*self) > *(*other) *(*self) > *(*other)
} }
} }

View file

@ -214,9 +214,9 @@ impl<V:TyVisitor + MovePtr> TyVisitor for MovePtrAdaptor<V> {
} }
fn visit_estr_slice(&self) -> bool { fn visit_estr_slice(&self) -> bool {
self.align_to::<&static/str>(); self.align_to::<&'static str>();
if ! self.inner.visit_estr_slice() { return false; } if ! self.inner.visit_estr_slice() { return false; }
self.bump_past::<&static/str>(); self.bump_past::<&'static str>();
true true
} }
@ -251,9 +251,9 @@ impl<V:TyVisitor + MovePtr> TyVisitor for MovePtrAdaptor<V> {
} }
fn visit_rptr(&self, mtbl: uint, inner: *TyDesc) -> bool { fn visit_rptr(&self, mtbl: uint, inner: *TyDesc) -> bool {
self.align_to::<&static/u8>(); self.align_to::<&'static u8>();
if ! self.inner.visit_rptr(mtbl, inner) { return false; } if ! self.inner.visit_rptr(mtbl, inner) { return false; }
self.bump_past::<&static/u8>(); self.bump_past::<&'static u8>();
true true
} }
@ -285,9 +285,9 @@ impl<V:TyVisitor + MovePtr> TyVisitor for MovePtrAdaptor<V> {
} }
fn visit_evec_slice(&self, mtbl: uint, inner: *TyDesc) -> bool { fn visit_evec_slice(&self, mtbl: uint, inner: *TyDesc) -> bool {
self.align_to::<&static/[u8]>(); self.align_to::<&'static [u8]>();
if ! self.inner.visit_evec_slice(mtbl, inner) { return false; } if ! self.inner.visit_evec_slice(mtbl, inner) { return false; }
self.bump_past::<&static/[u8]>(); self.bump_past::<&'static [u8]>();
true true
} }
@ -465,9 +465,9 @@ impl<V:TyVisitor + MovePtr> TyVisitor for MovePtrAdaptor<V> {
} }
fn visit_self(&self) -> bool { fn visit_self(&self) -> bool {
self.align_to::<&static/u8>(); self.align_to::<&'static u8>();
if ! self.inner.visit_self() { return false; } if ! self.inner.visit_self() { return false; }
self.align_to::<&static/u8>(); self.align_to::<&'static u8>();
true true
} }

View file

@ -53,7 +53,7 @@ pub pure fn get<T:Copy,U>(res: &Result<T, U>) -> T {
* If the result is an error * If the result is an error
*/ */
#[inline(always)] #[inline(always)]
pub pure fn get_ref<T, U>(res: &a/Result<T, U>) -> &a/T { pub pure fn get_ref<T, U>(res: &'a Result<T, U>) -> &'a T {
match *res { match *res {
Ok(ref t) => t, Ok(ref t) => t,
Err(ref the_err) => unsafe { Err(ref the_err) => unsafe {
@ -229,7 +229,7 @@ pub pure fn map_err<T:Copy,E,F:Copy>(res: &Result<T, E>, op: &fn(&E) -> F)
pub impl<T, E> Result<T, E> { pub impl<T, E> Result<T, E> {
#[inline(always)] #[inline(always)]
pure fn get_ref(&self) -> &self/T { get_ref(self) } pure fn get_ref(&self) -> &'self T { get_ref(self) }
#[inline(always)] #[inline(always)]
pure fn is_ok(&self) -> bool { is_ok(self) } pure fn is_ok(&self) -> bool { is_ok(self) }

View file

@ -22,7 +22,7 @@ pub trait EventLoop {
fn run(&mut self); fn run(&mut self);
fn callback(&mut self, ~fn()); fn callback(&mut self, ~fn());
/// The asynchronous I/O services. Not all event loops may provide one /// The asynchronous I/O services. Not all event loops may provide one
fn io(&mut self) -> Option<&self/mut IoFactoryObject>; fn io(&mut self) -> Option<&'self mut IoFactoryObject>;
} }
pub trait IoFactory { pub trait IoFactory {

View file

@ -265,12 +265,12 @@ pub impl Scheduler {
} }
} }
// XXX: Hack. This should return &self/mut but I don't know how to // XXX: Hack. This should return &'self mut but I don't know how to
// make the borrowcheck happy // make the borrowcheck happy
fn task_from_last_cleanup_job(&mut self) -> &mut Task { fn task_from_last_cleanup_job(&mut self) -> &mut Task {
fail_unless!(!self.cleanup_jobs.is_empty()); fail_unless!(!self.cleanup_jobs.is_empty());
let last_job: &self/mut CleanupJob = &mut self.cleanup_jobs[0]; let last_job: &'self mut CleanupJob = &mut self.cleanup_jobs[0];
let last_task: &self/Task = match last_job { let last_task: &'self Task = match last_job {
&RescheduleTask(~ref task) => task, &RescheduleTask(~ref task) => task,
&RecycleTask(~ref task) => task, &RecycleTask(~ref task) => task,
&GiveTask(~ref task, _) => task, &GiveTask(~ref task, _) => task,
@ -356,7 +356,7 @@ impl ThreadLocalScheduler {
} }
} }
fn get_scheduler(&mut self) -> &self/mut Scheduler { fn get_scheduler(&mut self) -> &'self mut Scheduler {
unsafe { unsafe {
let key = match self { &ThreadLocalScheduler(key) => key }; let key = match self { &ThreadLocalScheduler(key) => key };
let mut value: *mut c_void = tls::get(key); let mut value: *mut c_void = tls::get(key);

View file

@ -659,7 +659,7 @@ fn install_watcher_data<H, W: Watcher + NativeHandle<*H>>(watcher: &mut W) {
} }
fn get_watcher_data<H, W: Watcher + NativeHandle<*H>>( fn get_watcher_data<H, W: Watcher + NativeHandle<*H>>(
watcher: &r/mut W) -> &r/mut WatcherData { watcher: &'r mut W) -> &'r mut WatcherData {
unsafe { unsafe {
let data = uvll::get_data_for_uv_handle(watcher.native_handle()); let data = uvll::get_data_for_uv_handle(watcher.native_handle());

View file

@ -69,7 +69,7 @@ impl EventLoop for UvEventLoop {
} }
} }
fn io(&mut self) -> Option<&self/mut IoFactoryObject> { fn io(&mut self) -> Option<&'self mut IoFactoryObject> {
Some(&mut self.uvio) Some(&mut self.uvio)
} }
} }
@ -91,7 +91,7 @@ fn test_callback_run_once() {
pub struct UvIoFactory(Loop); pub struct UvIoFactory(Loop);
pub impl UvIoFactory { pub impl UvIoFactory {
fn uv_loop(&mut self) -> &self/mut Loop { fn uv_loop(&mut self) -> &'self mut Loop {
match self { &UvIoFactory(ref mut ptr) => ptr } match self { &UvIoFactory(ref mut ptr) => ptr }
} }
} }

View file

@ -279,7 +279,7 @@ pub fn shift_char(s: &mut ~str) -> char {
* If the string does not contain any characters * If the string does not contain any characters
*/ */
#[inline] #[inline]
pub fn view_shift_char(s: &a/str) -> (char, &a/str) { pub fn view_shift_char(s: &'a str) -> (char, &'a str) {
let CharRange {ch, next} = char_range_at(s, 0u); let CharRange {ch, next} = char_range_at(s, 0u);
let next_s = unsafe { raw::view_bytes(s, next, len(s)) }; let next_s = unsafe { raw::view_bytes(s, next, len(s)) };
return (ch, next_s); return (ch, next_s);
@ -429,7 +429,7 @@ pub pure fn slice(s: &str, begin: uint, end: uint) -> ~str {
* Fails when `begin` and `end` do not point to valid characters or beyond * Fails when `begin` and `end` do not point to valid characters or beyond
* the last character of the string * the last character of the string
*/ */
pub pure fn view(s: &a/str, begin: uint, end: uint) -> &a/str { pub pure fn view(s: &'a str, begin: uint, end: uint) -> &'a str {
fail_unless!(is_char_boundary(s, begin)); fail_unless!(is_char_boundary(s, begin));
fail_unless!(is_char_boundary(s, end)); fail_unless!(is_char_boundary(s, end));
unsafe { raw::view_bytes(s, begin, end) } unsafe { raw::view_bytes(s, begin, end) }
@ -530,7 +530,7 @@ pure fn split_inner(s: &str, sepfn: &fn(cc: char) -> bool, count: uint,
} }
// See Issue #1932 for why this is a naive search // See Issue #1932 for why this is a naive search
pure fn iter_matches(s: &a/str, sep: &b/str, f: &fn(uint, uint)) { pure fn iter_matches(s: &'a str, sep: &'b str, f: &fn(uint, uint)) {
let sep_len = len(sep), l = len(s); let sep_len = len(sep), l = len(s);
fail_unless!(sep_len > 0u); fail_unless!(sep_len > 0u);
let mut i = 0u, match_start = 0u, match_i = 0u; let mut i = 0u, match_start = 0u, match_i = 0u;
@ -557,7 +557,7 @@ pure fn iter_matches(s: &a/str, sep: &b/str, f: &fn(uint, uint)) {
} }
} }
pure fn iter_between_matches(s: &a/str, sep: &b/str, f: &fn(uint, uint)) { pure fn iter_between_matches(s: &'a str, sep: &'b str, f: &fn(uint, uint)) {
let mut last_end = 0u; let mut last_end = 0u;
do iter_matches(s, sep) |from, to| { do iter_matches(s, sep) |from, to| {
f(last_end, from); f(last_end, from);
@ -575,7 +575,7 @@ pure fn iter_between_matches(s: &a/str, sep: &b/str, f: &fn(uint, uint)) {
* fail_unless!(["", "XXX", "YYY", ""] == split_str(".XXX.YYY.", ".")) * fail_unless!(["", "XXX", "YYY", ""] == split_str(".XXX.YYY.", "."))
* ~~~ * ~~~
*/ */
pub pure fn split_str(s: &a/str, sep: &b/str) -> ~[~str] { pub pure fn split_str(s: &'a str, sep: &'b str) -> ~[~str] {
let mut result = ~[]; let mut result = ~[];
do iter_between_matches(s, sep) |from, to| { do iter_between_matches(s, sep) |from, to| {
unsafe { result.push(raw::slice_bytes(s, from, to)); } unsafe { result.push(raw::slice_bytes(s, from, to)); }
@ -583,7 +583,7 @@ pub pure fn split_str(s: &a/str, sep: &b/str) -> ~[~str] {
result result
} }
pub pure fn split_str_nonempty(s: &a/str, sep: &b/str) -> ~[~str] { pub pure fn split_str_nonempty(s: &'a str, sep: &'b str) -> ~[~str] {
let mut result = ~[]; let mut result = ~[];
do iter_between_matches(s, sep) |from, to| { do iter_between_matches(s, sep) |from, to| {
if to > from { if to > from {
@ -792,7 +792,7 @@ pure fn cmp(a: &str, b: &str) -> Ordering {
#[cfg(notest)] #[cfg(notest)]
impl TotalOrd for &'self str { impl TotalOrd for &'self str {
pure fn cmp(&self, other: & &self/str) -> Ordering { cmp(*self, *other) } pure fn cmp(&self, other: & &'self str) -> Ordering { cmp(*self, *other) }
} }
#[cfg(notest)] #[cfg(notest)]
@ -837,13 +837,13 @@ pure fn gt(a: &str, b: &str) -> bool {
} }
#[cfg(notest)] #[cfg(notest)]
impl Eq for &self/str { impl Eq for &'self str {
#[inline(always)] #[inline(always)]
pure fn eq(&self, other: & &self/str) -> bool { pure fn eq(&self, other: & &'self str) -> bool {
eq_slice((*self), (*other)) eq_slice((*self), (*other))
} }
#[inline(always)] #[inline(always)]
pure fn ne(&self, other: & &self/str) -> bool { !(*self).eq(other) } pure fn ne(&self, other: & &'self str) -> bool { !(*self).eq(other) }
} }
#[cfg(notest)] #[cfg(notest)]
@ -879,15 +879,15 @@ impl Ord for ~str {
} }
#[cfg(notest)] #[cfg(notest)]
impl Ord for &self/str { impl Ord for &'self str {
#[inline(always)] #[inline(always)]
pure fn lt(&self, other: & &self/str) -> bool { lt((*self), (*other)) } pure fn lt(&self, other: & &'self str) -> bool { lt((*self), (*other)) }
#[inline(always)] #[inline(always)]
pure fn le(&self, other: & &self/str) -> bool { le((*self), (*other)) } pure fn le(&self, other: & &'self str) -> bool { le((*self), (*other)) }
#[inline(always)] #[inline(always)]
pure fn ge(&self, other: & &self/str) -> bool { ge((*self), (*other)) } pure fn ge(&self, other: & &'self str) -> bool { ge((*self), (*other)) }
#[inline(always)] #[inline(always)]
pure fn gt(&self, other: & &self/str) -> bool { gt((*self), (*other)) } pure fn gt(&self, other: & &'self str) -> bool { gt((*self), (*other)) }
} }
#[cfg(notest)] #[cfg(notest)]
@ -1348,7 +1348,7 @@ pub pure fn rfind_between(s: &str, start: uint, end: uint,
} }
// Utility used by various searching functions // Utility used by various searching functions
pure fn match_at(haystack: &a/str, needle: &b/str, at: uint) -> bool { pure fn match_at(haystack: &'a str, needle: &'b str, at: uint) -> bool {
let mut i = at; let mut i = at;
for each(needle) |c| { if haystack[i] != c { return false; } i += 1u; } for each(needle) |c| { if haystack[i] != c { return false; } i += 1u; }
return true; return true;
@ -1367,7 +1367,7 @@ pure fn match_at(haystack: &a/str, needle: &b/str, at: uint) -> bool {
* An `option` containing the byte index of the first matching substring * An `option` containing the byte index of the first matching substring
* or `none` if there is no match * or `none` if there is no match
*/ */
pub pure fn find_str(haystack: &a/str, needle: &b/str) -> Option<uint> { pub pure fn find_str(haystack: &'a str, needle: &'b str) -> Option<uint> {
find_str_between(haystack, needle, 0u, len(haystack)) find_str_between(haystack, needle, 0u, len(haystack))
} }
@ -1390,7 +1390,7 @@ pub pure fn find_str(haystack: &a/str, needle: &b/str) -> Option<uint> {
* *
* `start` must be less than or equal to `len(s)` * `start` must be less than or equal to `len(s)`
*/ */
pub pure fn find_str_from(haystack: &a/str, needle: &b/str, start: uint) pub pure fn find_str_from(haystack: &'a str, needle: &'b str, start: uint)
-> Option<uint> { -> Option<uint> {
find_str_between(haystack, needle, start, len(haystack)) find_str_between(haystack, needle, start, len(haystack))
} }
@ -1415,7 +1415,7 @@ pub pure fn find_str_from(haystack: &a/str, needle: &b/str, start: uint)
* `start` must be less than or equal to `end` and `end` must be less than * `start` must be less than or equal to `end` and `end` must be less than
* or equal to `len(s)`. * or equal to `len(s)`.
*/ */
pub pure fn find_str_between(haystack: &a/str, needle: &b/str, start: uint, pub pure fn find_str_between(haystack: &'a str, needle: &'b str, start: uint,
end:uint) end:uint)
-> Option<uint> { -> Option<uint> {
// See Issue #1932 for why this is a naive search // See Issue #1932 for why this is a naive search
@ -1441,7 +1441,7 @@ pub pure fn find_str_between(haystack: &a/str, needle: &b/str, start: uint,
* * haystack - The string to look in * * haystack - The string to look in
* * needle - The string to look for * * needle - The string to look for
*/ */
pub pure fn contains(haystack: &a/str, needle: &b/str) -> bool { pub pure fn contains(haystack: &'a str, needle: &'b str) -> bool {
find_str(haystack, needle).is_some() find_str(haystack, needle).is_some()
} }
@ -1465,7 +1465,7 @@ pub pure fn contains_char(haystack: &str, needle: char) -> bool {
* * haystack - The string to look in * * haystack - The string to look in
* * needle - The string to look for * * needle - The string to look for
*/ */
pub pure fn starts_with(haystack: &a/str, needle: &b/str) -> bool { pub pure fn starts_with(haystack: &'a str, needle: &'b str) -> bool {
let haystack_len = len(haystack), needle_len = len(needle); let haystack_len = len(haystack), needle_len = len(needle);
if needle_len == 0u { true } if needle_len == 0u { true }
else if needle_len > haystack_len { false } else if needle_len > haystack_len { false }
@ -1480,7 +1480,7 @@ pub pure fn starts_with(haystack: &a/str, needle: &b/str) -> bool {
* * haystack - The string to look in * * haystack - The string to look in
* * needle - The string to look for * * needle - The string to look for
*/ */
pub pure fn ends_with(haystack: &a/str, needle: &b/str) -> bool { pub pure fn ends_with(haystack: &'a str, needle: &'b str) -> bool {
let haystack_len = len(haystack), needle_len = len(needle); let haystack_len = len(haystack), needle_len = len(needle);
if needle_len == 0u { true } if needle_len == 0u { true }
else if needle_len > haystack_len { false } else if needle_len > haystack_len { false }
@ -1662,7 +1662,7 @@ pub pure fn count_chars(s: &str, start: uint, end: uint) -> uint {
} }
/// Counts the number of bytes taken by the `n` in `s` starting from `start`. /// Counts the number of bytes taken by the `n` in `s` starting from `start`.
pub pure fn count_bytes(s: &b/str, start: uint, n: uint) -> uint { pub pure fn count_bytes(s: &'b str, start: uint, n: uint) -> uint {
fail_unless!(is_char_boundary(s, start)); fail_unless!(is_char_boundary(s, start));
let mut end = start, cnt = n; let mut end = start, cnt = n;
let l = len(s); let l = len(s);
@ -1905,7 +1905,7 @@ pub pure fn as_bytes<T>(s: &const ~str, f: &fn(&~[u8]) -> T) -> T {
* *
* The byte slice does not include the null terminator. * The byte slice does not include the null terminator.
*/ */
pub pure fn as_bytes_slice(s: &a/str) -> &a/[u8] { pub pure fn as_bytes_slice(s: &'a str) -> &'a [u8] {
unsafe { unsafe {
let (ptr, len): (*u8, uint) = ::cast::reinterpret_cast(&s); let (ptr, len): (*u8, uint) = ::cast::reinterpret_cast(&s);
let outgoing_tuple: (*u8, uint) = (ptr, len - 1); let outgoing_tuple: (*u8, uint) = (ptr, len - 1);
@ -2233,9 +2233,9 @@ pub mod traits {
use ops::Add; use ops::Add;
use str::append; use str::append;
impl Add<&self/str,~str> for ~str { impl Add<&'self str,~str> for ~str {
#[inline(always)] #[inline(always)]
pure fn add(&self, rhs: & &self/str) -> ~str { pure fn add(&self, rhs: & &'self str) -> ~str {
append(copy *self, (*rhs)) append(copy *self, (*rhs))
} }
} }
@ -2247,7 +2247,7 @@ pub mod traits {}
pub trait StrSlice { pub trait StrSlice {
pure fn all(&self, it: &fn(char) -> bool) -> bool; pure fn all(&self, it: &fn(char) -> bool) -> bool;
pure fn any(&self, it: &fn(char) -> bool) -> bool; pure fn any(&self, it: &fn(char) -> bool) -> bool;
pure fn contains(&self, needle: &a/str) -> bool; pure fn contains(&self, needle: &'a str) -> bool;
pure fn contains_char(&self, needle: char) -> bool; pure fn contains_char(&self, needle: char) -> bool;
pure fn each(&self, it: &fn(u8) -> bool); pure fn each(&self, it: &fn(u8) -> bool);
pure fn eachi(&self, it: &fn(uint, u8) -> bool); pure fn eachi(&self, it: &fn(uint, u8) -> bool);
@ -2261,8 +2261,8 @@ pub trait StrSlice {
pure fn slice(&self, begin: uint, end: uint) -> ~str; pure fn slice(&self, begin: uint, end: uint) -> ~str;
pure fn split(&self, sepfn: &fn(char) -> bool) -> ~[~str]; pure fn split(&self, sepfn: &fn(char) -> bool) -> ~[~str];
pure fn split_char(&self, sep: char) -> ~[~str]; pure fn split_char(&self, sep: char) -> ~[~str];
pure fn split_str(&self, sep: &a/str) -> ~[~str]; pure fn split_str(&self, sep: &'a str) -> ~[~str];
pure fn starts_with(&self, needle: &a/str) -> bool; pure fn starts_with(&self, needle: &'a str) -> bool;
pure fn substr(&self, begin: uint, n: uint) -> ~str; pure fn substr(&self, begin: uint, n: uint) -> ~str;
pure fn to_lower(&self) -> ~str; pure fn to_lower(&self) -> ~str;
pure fn to_upper(&self) -> ~str; pure fn to_upper(&self) -> ~str;
@ -2278,7 +2278,7 @@ pub trait StrSlice {
} }
/// Extension methods for strings /// Extension methods for strings
impl StrSlice for &self/str { impl StrSlice for &'self str {
/** /**
* Return true if a predicate matches all characters or if the string * Return true if a predicate matches all characters or if the string
* contains no characters * contains no characters
@ -2293,7 +2293,7 @@ impl StrSlice for &self/str {
pure fn any(&self, it: &fn(char) -> bool) -> bool { any(*self, it) } pure fn any(&self, it: &fn(char) -> bool) -> bool { any(*self, it) }
/// Returns true if one string contains another /// Returns true if one string contains another
#[inline] #[inline]
pure fn contains(&self, needle: &a/str) -> bool { pure fn contains(&self, needle: &'a str) -> bool {
contains(*self, needle) contains(*self, needle)
} }
/// Returns true if a string contains a char /// Returns true if a string contains a char
@ -2366,10 +2366,10 @@ impl StrSlice for &self/str {
* string * string
*/ */
#[inline] #[inline]
pure fn split_str(&self, sep: &a/str) -> ~[~str] { split_str(*self, sep) } pure fn split_str(&self, sep: &'a str) -> ~[~str] { split_str(*self, sep) }
/// Returns true if one string starts with another /// Returns true if one string starts with another
#[inline] #[inline]
pure fn starts_with(&self, needle: &a/str) -> bool { pure fn starts_with(&self, needle: &'a str) -> bool {
starts_with(*self, needle) starts_with(*self, needle)
} }
/** /**
@ -2612,8 +2612,8 @@ mod tests {
#[test] #[test]
fn test_split_str() { fn test_split_str() {
fn t(s: &str, sep: &a/str, i: int, k: &str) { fn t(s: &str, sep: &'a str, i: int, k: &str) {
fn borrow(x: &a/str) -> &a/str { x } fn borrow(x: &'a str) -> &'a str { x }
let v = split_str(s, sep); let v = split_str(s, sep);
fail_unless!(borrow(v[i]) == k); fail_unless!(borrow(v[i]) == k);
} }

View file

@ -19,7 +19,7 @@ use libc::{c_void, c_char, size_t};
use repr; use repr;
use str; use str;
pub type FreeGlue = &self/fn(*TypeDesc, *c_void); pub type FreeGlue = &'self fn(*TypeDesc, *c_void);
// Corresponds to runtime type_desc type // Corresponds to runtime type_desc type
pub struct TypeDesc { pub struct TypeDesc {

View file

@ -44,7 +44,7 @@ use task::rt;
* *
* These two cases aside, the interface is safe. * These two cases aside, the interface is safe.
*/ */
pub type LocalDataKey<T> = &self/fn(v: @T); pub type LocalDataKey<T> = &'self fn(v: @T);
/** /**
* Remove a task-local data value from the table, returning the * Remove a task-local data value from the table, returning the

View file

@ -123,7 +123,7 @@ struct TaskGroupData {
} }
type TaskGroupArc = unstable::Exclusive<Option<TaskGroupData>>; type TaskGroupArc = unstable::Exclusive<Option<TaskGroupData>>;
type TaskGroupInner = &self/mut Option<TaskGroupData>; type TaskGroupInner = &'self mut Option<TaskGroupData>;
// A taskgroup is 'dead' when nothing can cause it to fail; only members can. // A taskgroup is 'dead' when nothing can cause it to fail; only members can.
pure fn taskgroup_is_dead(tg: &TaskGroupData) -> bool { pure fn taskgroup_is_dead(tg: &TaskGroupData) -> bool {

View file

@ -19,7 +19,7 @@ use io::Writer;
use option::{None, Option, Some}; use option::{None, Option, Some};
use str; use str;
pub type Cb = &self/fn(buf: &[const u8]) -> bool; pub type Cb = &'self fn(buf: &[const u8]) -> bool;
/** /**
* A trait to implement in order to make a type hashable; * A trait to implement in order to make a type hashable;
@ -197,7 +197,7 @@ impl IterBytes for int {
} }
} }
impl<A:IterBytes> IterBytes for &self/[A] { impl<A:IterBytes> IterBytes for &'self [A] {
#[inline(always)] #[inline(always)]
pure fn iter_bytes(&self, lsb0: bool, f: Cb) { pure fn iter_bytes(&self, lsb0: bool, f: Cb) {
for (*self).each |elt| { for (*self).each |elt| {
@ -231,7 +231,7 @@ impl<A:IterBytes,B:IterBytes,C:IterBytes> IterBytes for (A,B,C) {
} }
// Move this to vec, probably. // Move this to vec, probably.
pure fn borrow<A>(a: &x/[A]) -> &x/[A] { pure fn borrow<A>(a: &'x [A]) -> &'x [A] {
a a
} }
@ -352,7 +352,7 @@ pub pure fn iter_bytes_7<A: IterBytes,
g.iter_bytes(lsb0, |bytes| {flag = z(bytes); flag}); g.iter_bytes(lsb0, |bytes| {flag = z(bytes); flag});
} }
impl IterBytes for &self/str { impl IterBytes for &'self str {
#[inline(always)] #[inline(always)]
pure fn iter_bytes(&self, _lsb0: bool, f: Cb) { pure fn iter_bytes(&self, _lsb0: bool, f: Cb) {
do str::byte_slice(*self) |bytes| { do str::byte_slice(*self) |bytes| {
@ -389,7 +389,7 @@ impl<A:IterBytes> IterBytes for Option<A> {
} }
} }
impl<A:IterBytes> IterBytes for &self/A { impl<A:IterBytes> IterBytes for &'self A {
#[inline(always)] #[inline(always)]
pure fn iter_bytes(&self, lsb0: bool, f: Cb) { pure fn iter_bytes(&self, lsb0: bool, f: Cb) {
(**self).iter_bytes(lsb0, f); (**self).iter_bytes(lsb0, f);

View file

@ -32,7 +32,7 @@ impl ToStr for ~str {
#[inline(always)] #[inline(always)]
pure fn to_str(&self) -> ~str { copy *self } pure fn to_str(&self) -> ~str { copy *self }
} }
impl ToStr for &self/str { impl ToStr for &'self str {
#[inline(always)] #[inline(always)]
pure fn to_str(&self) -> ~str { ::str::from_slice(*self) } pure fn to_str(&self) -> ~str { ::str::from_slice(*self) }
} }
@ -72,7 +72,7 @@ impl<A:ToStr,B:ToStr,C:ToStr> ToStr for (A, B, C) {
} }
} }
impl<A:ToStr> ToStr for &self/[A] { impl<A:ToStr> ToStr for &'self [A] {
#[inline(always)] #[inline(always)]
pure fn to_str(&self) -> ~str { pure fn to_str(&self) -> ~str {
unsafe { unsafe {

View file

@ -32,7 +32,7 @@ pub struct TrieMap<T> {
impl<T> BaseIter<(uint, &'self T)> for TrieMap<T> { impl<T> BaseIter<(uint, &'self T)> for TrieMap<T> {
/// Visit all key-value pairs in order /// Visit all key-value pairs in order
#[inline(always)] #[inline(always)]
pure fn each(&self, f: &fn(&(uint, &self/T)) -> bool) { pure fn each(&self, f: &fn(&(uint, &'self T)) -> bool) {
self.root.each(f); self.root.each(f);
} }
#[inline(always)] #[inline(always)]
@ -42,7 +42,7 @@ impl<T> BaseIter<(uint, &'self T)> for TrieMap<T> {
impl<T> ReverseIter<(uint, &'self T)> for TrieMap<T> { impl<T> ReverseIter<(uint, &'self T)> for TrieMap<T> {
/// Visit all key-value pairs in reverse order /// Visit all key-value pairs in reverse order
#[inline(always)] #[inline(always)]
pure fn each_reverse(&self, f: &fn(&(uint, &self/T)) -> bool) { pure fn each_reverse(&self, f: &fn(&(uint, &'self T)) -> bool) {
self.root.each_reverse(f); self.root.each_reverse(f);
} }
} }
@ -93,8 +93,8 @@ impl<T> Map<uint, T> for TrieMap<T> {
/// Return the value corresponding to the key in the map /// Return the value corresponding to the key in the map
#[inline(hint)] #[inline(hint)]
pure fn find(&self, key: &uint) -> Option<&self/T> { pure fn find(&self, key: &uint) -> Option<&'self T> {
let mut node: &self/TrieNode<T> = &self.root; let mut node: &'self TrieNode<T> = &self.root;
let mut idx = 0; let mut idx = 0;
loop { loop {
match node.children[chunk(*key, idx)] { match node.children[chunk(*key, idx)] {
@ -233,7 +233,7 @@ impl<T> TrieNode<T> {
} }
impl<T> TrieNode<T> { impl<T> TrieNode<T> {
pure fn each(&self, f: &fn(&(uint, &self/T)) -> bool) -> bool { pure fn each(&self, f: &fn(&(uint, &'self T)) -> bool) -> bool {
for uint::range(0, self.children.len()) |idx| { for uint::range(0, self.children.len()) |idx| {
match self.children[idx] { match self.children[idx] {
Internal(ref x) => if !x.each(f) { return false }, Internal(ref x) => if !x.each(f) { return false },
@ -244,7 +244,7 @@ impl<T> TrieNode<T> {
true true
} }
pure fn each_reverse(&self, f: &fn(&(uint, &self/T)) -> bool) -> bool { pure fn each_reverse(&self, f: &fn(&(uint, &'self T)) -> bool) -> bool {
for uint::range_rev(self.children.len(), 0) |idx| { for uint::range_rev(self.children.len(), 0) |idx| {
match self.children[idx - 1] { match self.children[idx - 1] {
Internal(ref x) => if !x.each_reverse(f) { return false }, Internal(ref x) => if !x.each_reverse(f) { return false },

View file

@ -47,19 +47,19 @@ impl<T:Copy,U:Copy> CopyableTuple<T, U> for (T, U) {
} }
pub trait ImmutableTuple<T, U> { pub trait ImmutableTuple<T, U> {
pure fn first_ref(&self) -> &self/T; pure fn first_ref(&self) -> &'self T;
pure fn second_ref(&self) -> &self/U; pure fn second_ref(&self) -> &'self U;
} }
impl<T, U> ImmutableTuple<T, U> for (T, U) { impl<T, U> ImmutableTuple<T, U> for (T, U) {
#[inline(always)] #[inline(always)]
pure fn first_ref(&self) -> &self/T { pure fn first_ref(&self) -> &'self T {
match *self { match *self {
(ref t, _) => t, (ref t, _) => t,
} }
} }
#[inline(always)] #[inline(always)]
pure fn second_ref(&self) -> &self/U { pure fn second_ref(&self) -> &'self U {
match *self { match *self {
(_, ref u) => u, (_, ref u) => u,
} }
@ -71,7 +71,7 @@ pub trait ExtendedTupleOps<A,B> {
fn map<C>(&self, f: &fn(a: &A, b: &B) -> C) -> ~[C]; fn map<C>(&self, f: &fn(a: &A, b: &B) -> C) -> ~[C];
} }
impl<A:Copy,B:Copy> ExtendedTupleOps<A,B> for (&self/[A], &self/[B]) { impl<A:Copy,B:Copy> ExtendedTupleOps<A,B> for (&'self [A], &'self [B]) {
#[inline(always)] #[inline(always)]
fn zip(&self) -> ~[(A, B)] { fn zip(&self) -> ~[(A, B)] {
match *self { match *self {

View file

@ -173,7 +173,7 @@ pub unsafe fn get_shared_mutable_state<T:Owned>(
} }
#[inline(always)] #[inline(always)]
pub unsafe fn get_shared_immutable_state<T:Owned>( pub unsafe fn get_shared_immutable_state<T:Owned>(
rc: &a/SharedMutableState<T>) -> &a/T { rc: &'a SharedMutableState<T>) -> &'a T {
unsafe { unsafe {
let ptr: ~ArcData<T> = cast::reinterpret_cast(&(*rc).data); let ptr: ~ArcData<T> = cast::reinterpret_cast(&(*rc).data);
fail_unless!(ptr.count > 0); fail_unless!(ptr.count > 0);

View file

@ -31,7 +31,7 @@ pub trait Finally<T> {
fn finally(&self, dtor: &fn()) -> T; fn finally(&self, dtor: &fn()) -> T;
} }
impl<T> Finally<T> for &self/fn() -> T { impl<T> Finally<T> for &'self fn() -> T {
fn finally(&self, dtor: &fn()) -> T { fn finally(&self, dtor: &fn()) -> T {
let _d = Finallyalizer { let _d = Finallyalizer {
dtor: dtor dtor: dtor
@ -42,7 +42,7 @@ impl<T> Finally<T> for &self/fn() -> T {
} }
struct Finallyalizer { struct Finallyalizer {
dtor: &self/fn() dtor: &'self fn()
} }
impl Drop for Finallyalizer/&self { impl Drop for Finallyalizer/&self {

View file

@ -42,7 +42,7 @@ use sys::Closure;
#[cfg(test)] use task::spawn; #[cfg(test)] use task::spawn;
#[cfg(test)] use uint; #[cfg(test)] use uint;
pub type GlobalDataKey<T> = &self/fn(v: T); pub type GlobalDataKey<T> = &'self fn(v: T);
pub unsafe fn global_data_clone_create<T:Owned + Clone>( pub unsafe fn global_data_clone_create<T:Owned + Clone>(
key: GlobalDataKey<T>, create: &fn() -> ~T) -> T { key: GlobalDataKey<T>, create: &fn() -> ~T) -> T {

View file

@ -217,46 +217,46 @@ pub pure fn build_sized_opt<A>(size: Option<uint>,
// Accessors // Accessors
/// Returns the first element of a vector /// Returns the first element of a vector
pub pure fn head<T>(v: &r/[T]) -> &r/T { pub pure fn head<T>(v: &'r [T]) -> &'r T {
if v.len() == 0 { fail!(~"head: empty vector") } if v.len() == 0 { fail!(~"head: empty vector") }
&v[0] &v[0]
} }
/// Returns `Some(x)` where `x` is the first element of the slice `v`, /// Returns `Some(x)` where `x` is the first element of the slice `v`,
/// or `None` if the vector is empty. /// or `None` if the vector is empty.
pub pure fn head_opt<T>(v: &r/[T]) -> Option<&r/T> { pub pure fn head_opt<T>(v: &'r [T]) -> Option<&'r T> {
if v.len() == 0 { None } else { Some(&v[0]) } if v.len() == 0 { None } else { Some(&v[0]) }
} }
/// Returns a vector containing all but the first element of a slice /// Returns a vector containing all but the first element of a slice
pub pure fn tail<T>(v: &r/[T]) -> &r/[T] { slice(v, 1, v.len()) } pub pure fn tail<T>(v: &'r [T]) -> &'r [T] { slice(v, 1, v.len()) }
/// Returns a vector containing all but the first `n` elements of a slice /// Returns a vector containing all but the first `n` elements of a slice
pub pure fn tailn<T>(v: &r/[T], n: uint) -> &r/[T] { slice(v, n, v.len()) } pub pure fn tailn<T>(v: &'r [T], n: uint) -> &'r [T] { slice(v, n, v.len()) }
/// Returns a vector containing all but the last element of a slice /// Returns a vector containing all but the last element of a slice
pub pure fn init<T>(v: &r/[T]) -> &r/[T] { slice(v, 0, v.len() - 1) } pub pure fn init<T>(v: &'r [T]) -> &'r [T] { slice(v, 0, v.len() - 1) }
/// Returns a vector containing all but the last `n' elements of a slice /// Returns a vector containing all but the last `n' elements of a slice
pub pure fn initn<T>(v: &r/[T], n: uint) -> &r/[T] { pub pure fn initn<T>(v: &'r [T], n: uint) -> &'r [T] {
slice(v, 0, v.len() - n) slice(v, 0, v.len() - n)
} }
/// Returns the last element of the slice `v`, failing if the slice is empty. /// Returns the last element of the slice `v`, failing if the slice is empty.
pub pure fn last<T>(v: &r/[T]) -> &r/T { pub pure fn last<T>(v: &'r [T]) -> &'r T {
if v.len() == 0 { fail!(~"last: empty vector") } if v.len() == 0 { fail!(~"last: empty vector") }
&v[v.len() - 1] &v[v.len() - 1]
} }
/// Returns `Some(x)` where `x` is the last element of the slice `v`, or /// Returns `Some(x)` where `x` is the last element of the slice `v`, or
/// `None` if the vector is empty. /// `None` if the vector is empty.
pub pure fn last_opt<T>(v: &r/[T]) -> Option<&r/T> { pub pure fn last_opt<T>(v: &'r [T]) -> Option<&'r T> {
if v.len() == 0 { None } else { Some(&v[v.len() - 1]) } if v.len() == 0 { None } else { Some(&v[v.len() - 1]) }
} }
/// Return a slice that points into another slice. /// Return a slice that points into another slice.
#[inline(always)] #[inline(always)]
pub pure fn slice<T>(v: &r/[T], start: uint, end: uint) -> &r/[T] { pub pure fn slice<T>(v: &'r [T], start: uint, end: uint) -> &'r [T] {
fail_unless!(start <= end); fail_unless!(start <= end);
fail_unless!(end <= len(v)); fail_unless!(end <= len(v));
do as_imm_buf(v) |p, _len| { do as_imm_buf(v) |p, _len| {
@ -270,10 +270,10 @@ pub pure fn slice<T>(v: &r/[T], start: uint, end: uint) -> &r/[T] {
/// Return a slice that points into another slice. /// Return a slice that points into another slice.
#[inline(always)] #[inline(always)]
pub pure fn mut_slice<T>(v: &r/mut [T], pub pure fn mut_slice<T>(v: &'r mut [T],
start: uint, start: uint,
end: uint) end: uint)
-> &r/mut [T] { -> &'r mut [T] {
fail_unless!(start <= end); fail_unless!(start <= end);
fail_unless!(end <= v.len()); fail_unless!(end <= v.len());
do as_mut_buf(v) |p, _len| { do as_mut_buf(v) |p, _len| {
@ -287,10 +287,10 @@ pub pure fn mut_slice<T>(v: &r/mut [T],
/// Return a slice that points into another slice. /// Return a slice that points into another slice.
#[inline(always)] #[inline(always)]
pub pure fn const_slice<T>(v: &r/[const T], pub pure fn const_slice<T>(v: &'r [const T],
start: uint, start: uint,
end: uint) end: uint)
-> &r/[const T] { -> &'r [const T] {
fail_unless!(start <= end); fail_unless!(start <= end);
fail_unless!(end <= len(v)); fail_unless!(end <= len(v));
do as_const_buf(v) |p, _len| { do as_const_buf(v) |p, _len| {
@ -1334,7 +1334,7 @@ pub pure fn reversed<T:Copy>(v: &[const T]) -> ~[T] {
* ~~~ * ~~~
*/ */
#[inline(always)] #[inline(always)]
pub pure fn each<T>(v: &r/[T], f: &fn(&r/T) -> bool) { pub pure fn each<T>(v: &'r [T], f: &fn(&'r T) -> bool) {
// ^^^^ // ^^^^
// NB---this CANNOT be &[const T]! The reason // NB---this CANNOT be &[const T]! The reason
// is that you are passing it to `f()` using // is that you are passing it to `f()` using
@ -1389,7 +1389,7 @@ pub pure fn each_const<T>(v: &[const T], f: &fn(elem: &const T) -> bool) {
* Return true to continue, false to break. * Return true to continue, false to break.
*/ */
#[inline(always)] #[inline(always)]
pub pure fn eachi<T>(v: &r/[T], f: &fn(uint, v: &r/T) -> bool) { pub pure fn eachi<T>(v: &'r [T], f: &fn(uint, v: &'r T) -> bool) {
let mut i = 0; let mut i = 0;
for each(v) |p| { for each(v) |p| {
if !f(i, p) { return; } if !f(i, p) { return; }
@ -1403,7 +1403,7 @@ pub pure fn eachi<T>(v: &r/[T], f: &fn(uint, v: &r/T) -> bool) {
* Return true to continue, false to break. * Return true to continue, false to break.
*/ */
#[inline(always)] #[inline(always)]
pub pure fn rev_each<T>(v: &r/[T], blk: &fn(v: &r/T) -> bool) { pub pure fn rev_each<T>(v: &'r [T], blk: &fn(v: &'r T) -> bool) {
rev_eachi(v, |_i, v| blk(v)) rev_eachi(v, |_i, v| blk(v))
} }
@ -1413,7 +1413,7 @@ pub pure fn rev_each<T>(v: &r/[T], blk: &fn(v: &r/T) -> bool) {
* Return true to continue, false to break. * Return true to continue, false to break.
*/ */
#[inline(always)] #[inline(always)]
pub pure fn rev_eachi<T>(v: &r/[T], blk: &fn(i: uint, v: &r/T) -> bool) { pub pure fn rev_eachi<T>(v: &'r [T], blk: &fn(i: uint, v: &'r T) -> bool) {
let mut i = v.len(); let mut i = v.len();
while i > 0 { while i > 0 {
i -= 1; i -= 1;
@ -1555,11 +1555,11 @@ pure fn eq<T:Eq>(a: &[T], b: &[T]) -> bool {
} }
#[cfg(notest)] #[cfg(notest)]
impl<T:Eq> Eq for &self/[T] { impl<T:Eq> Eq for &'self [T] {
#[inline(always)] #[inline(always)]
pure fn eq(&self, other: & &self/[T]) -> bool { eq((*self), (*other)) } pure fn eq(&self, other: & &'self [T]) -> bool { eq((*self), (*other)) }
#[inline(always)] #[inline(always)]
pure fn ne(&self, other: & &self/[T]) -> bool { !(*self).eq(other) } pure fn ne(&self, other: & &'self [T]) -> bool { !(*self).eq(other) }
} }
@ -1604,7 +1604,7 @@ pure fn cmp<T: TotalOrd>(a: &[T], b: &[T]) -> Ordering {
#[cfg(notest)] #[cfg(notest)]
impl<T: TotalOrd> TotalOrd for &'self [T] { impl<T: TotalOrd> TotalOrd for &'self [T] {
#[inline(always)] #[inline(always)]
pure fn cmp(&self, other: & &self/[T]) -> Ordering { cmp(*self, *other) } pure fn cmp(&self, other: & &'self [T]) -> Ordering { cmp(*self, *other) }
} }
#[cfg(notest)] #[cfg(notest)]
@ -1639,15 +1639,15 @@ pure fn ge<T:Ord>(a: &[T], b: &[T]) -> bool { !lt(a, b) }
pure fn gt<T:Ord>(a: &[T], b: &[T]) -> bool { lt(b, a) } pure fn gt<T:Ord>(a: &[T], b: &[T]) -> bool { lt(b, a) }
#[cfg(notest)] #[cfg(notest)]
impl<T:Ord> Ord for &self/[T] { impl<T:Ord> Ord for &'self [T] {
#[inline(always)] #[inline(always)]
pure fn lt(&self, other: & &self/[T]) -> bool { lt((*self), (*other)) } pure fn lt(&self, other: & &'self [T]) -> bool { lt((*self), (*other)) }
#[inline(always)] #[inline(always)]
pure fn le(&self, other: & &self/[T]) -> bool { le((*self), (*other)) } pure fn le(&self, other: & &'self [T]) -> bool { le((*self), (*other)) }
#[inline(always)] #[inline(always)]
pure fn ge(&self, other: & &self/[T]) -> bool { ge((*self), (*other)) } pure fn ge(&self, other: & &'self [T]) -> bool { ge((*self), (*other)) }
#[inline(always)] #[inline(always)]
pure fn gt(&self, other: & &self/[T]) -> bool { gt((*self), (*other)) } pure fn gt(&self, other: & &'self [T]) -> bool { gt((*self), (*other)) }
} }
#[cfg(notest)] #[cfg(notest)]
@ -1680,15 +1680,15 @@ pub mod traits {
use ops::Add; use ops::Add;
use vec::append; use vec::append;
impl<T:Copy> Add<&self/[const T],~[T]> for ~[T] { impl<T:Copy> Add<&'self [const T],~[T]> for ~[T] {
#[inline(always)] #[inline(always)]
pure fn add(&self, rhs: & &self/[const T]) -> ~[T] { pure fn add(&self, rhs: & &'self [const T]) -> ~[T] {
append(copy *self, (*rhs)) append(copy *self, (*rhs))
} }
} }
} }
impl<T> Container for &self/[const T] { impl<T> Container for &'self [const T] {
/// Returns true if a vector contains no elements /// Returns true if a vector contains no elements
#[inline] #[inline]
pure fn is_empty(&self) -> bool { is_empty(*self) } pure fn is_empty(&self) -> bool { is_empty(*self) }
@ -1712,15 +1712,15 @@ impl<T: Copy> CopyableVector<T> for &'self [const T] {
} }
pub trait ImmutableVector<T> { pub trait ImmutableVector<T> {
pure fn view(&self, start: uint, end: uint) -> &self/[T]; pure fn view(&self, start: uint, end: uint) -> &'self [T];
pure fn head(&self) -> &self/T; pure fn head(&self) -> &'self T;
pure fn head_opt(&self) -> Option<&self/T>; pure fn head_opt(&self) -> Option<&'self T>;
pure fn tail(&self) -> &self/[T]; pure fn tail(&self) -> &'self [T];
pure fn tailn(&self, n: uint) -> &self/[T]; pure fn tailn(&self, n: uint) -> &'self [T];
pure fn init(&self) -> &self/[T]; pure fn init(&self) -> &'self [T];
pure fn initn(&self, n: uint) -> &self/[T]; pure fn initn(&self, n: uint) -> &'self [T];
pure fn last(&self) -> &self/T; pure fn last(&self) -> &'self T;
pure fn last_opt(&self) -> Option<&self/T>; pure fn last_opt(&self) -> Option<&'self T>;
pure fn foldr<U: Copy>(&self, z: U, p: &fn(t: &T, u: U) -> U) -> U; pure fn foldr<U: Copy>(&self, z: U, p: &fn(t: &T, u: U) -> U) -> U;
pure fn map<U>(&self, f: &fn(t: &T) -> U) -> ~[U]; pure fn map<U>(&self, f: &fn(t: &T) -> U) -> ~[U];
pure fn mapi<U>(&self, f: &fn(uint, t: &T) -> U) -> ~[U]; pure fn mapi<U>(&self, f: &fn(uint, t: &T) -> U) -> ~[U];
@ -1731,44 +1731,44 @@ pub trait ImmutableVector<T> {
} }
/// Extension methods for vectors /// Extension methods for vectors
impl<T> ImmutableVector<T> for &self/[T] { impl<T> ImmutableVector<T> for &'self [T] {
/// Return a slice that points into another slice. /// Return a slice that points into another slice.
#[inline] #[inline]
pure fn view(&self, start: uint, end: uint) -> &self/[T] { pure fn view(&self, start: uint, end: uint) -> &'self [T] {
slice(*self, start, end) slice(*self, start, end)
} }
/// Returns the first element of a vector, failing if the vector is empty. /// Returns the first element of a vector, failing if the vector is empty.
#[inline] #[inline]
pure fn head(&self) -> &self/T { head(*self) } pure fn head(&self) -> &'self T { head(*self) }
/// Returns the first element of a vector /// Returns the first element of a vector
#[inline] #[inline]
pure fn head_opt(&self) -> Option<&self/T> { head_opt(*self) } pure fn head_opt(&self) -> Option<&'self T> { head_opt(*self) }
/// Returns all but the first element of a vector /// Returns all but the first element of a vector
#[inline] #[inline]
pure fn tail(&self) -> &self/[T] { tail(*self) } pure fn tail(&self) -> &'self [T] { tail(*self) }
/// Returns all but the first `n' elements of a vector /// Returns all but the first `n' elements of a vector
#[inline] #[inline]
pure fn tailn(&self, n: uint) -> &self/[T] { tailn(*self, n) } pure fn tailn(&self, n: uint) -> &'self [T] { tailn(*self, n) }
/// Returns all but the last elemnt of a vector /// Returns all but the last elemnt of a vector
#[inline] #[inline]
pure fn init(&self) -> &self/[T] { init(*self) } pure fn init(&self) -> &'self [T] { init(*self) }
/// Returns all but the last `n' elemnts of a vector /// Returns all but the last `n' elemnts of a vector
#[inline] #[inline]
pure fn initn(&self, n: uint) -> &self/[T] { initn(*self, n) } pure fn initn(&self, n: uint) -> &'self [T] { initn(*self, n) }
/// Returns the last element of a `v`, failing if the vector is empty. /// Returns the last element of a `v`, failing if the vector is empty.
#[inline] #[inline]
pure fn last(&self) -> &self/T { last(*self) } pure fn last(&self) -> &'self T { last(*self) }
/// Returns the last element of a `v`, failing if the vector is empty. /// Returns the last element of a `v`, failing if the vector is empty.
#[inline] #[inline]
pure fn last_opt(&self) -> Option<&self/T> { last_opt(*self) } pure fn last_opt(&self) -> Option<&'self T> { last_opt(*self) }
/// Reduce a vector from right to left /// Reduce a vector from right to left
#[inline] #[inline]
@ -1834,7 +1834,7 @@ pub trait ImmutableEqVector<T:Eq> {
pure fn rposition_elem(&self, t: &T) -> Option<uint>; pure fn rposition_elem(&self, t: &T) -> Option<uint>;
} }
impl<T:Eq> ImmutableEqVector<T> for &self/[T] { impl<T:Eq> ImmutableEqVector<T> for &'self [T] {
/** /**
* Find the first index matching some predicate * Find the first index matching some predicate
* *
@ -1879,7 +1879,7 @@ pub trait ImmutableCopyableVector<T> {
} }
/// Extension methods for vectors /// Extension methods for vectors
impl<T:Copy> ImmutableCopyableVector<T> for &self/[T] { impl<T:Copy> ImmutableCopyableVector<T> for &'self [T] {
/** /**
* Construct a new vector from the elements of a vector for which some * Construct a new vector from the elements of a vector for which some
* predicate holds. * predicate holds.
@ -2139,7 +2139,7 @@ pub mod raw {
len: uint, len: uint,
f: &fn(v: &[T]) -> U) -> U { f: &fn(v: &[T]) -> U) -> U {
let pair = (p, len * sys::nonzero_size_of::<T>()); let pair = (p, len * sys::nonzero_size_of::<T>());
let v : *(&blk/[T]) = let v : *(&'blk [T]) =
::cast::reinterpret_cast(&addr_of(&pair)); ::cast::reinterpret_cast(&addr_of(&pair));
f(*v) f(*v)
} }
@ -2153,7 +2153,7 @@ pub mod raw {
len: uint, len: uint,
f: &fn(v: &mut [T]) -> U) -> U { f: &fn(v: &mut [T]) -> U) -> U {
let pair = (p, len * sys::nonzero_size_of::<T>()); let pair = (p, len * sys::nonzero_size_of::<T>());
let v : *(&blk/mut [T]) = let v : *(&'blk mut [T]) =
::cast::reinterpret_cast(&addr_of(&pair)); ::cast::reinterpret_cast(&addr_of(&pair));
f(*v) f(*v)
} }
@ -2327,7 +2327,7 @@ impl<A> iter::MutableIter<A> for @mut [A] {
} }
} }
impl<A> iter::ExtendedIter<A> for &self/[A] { impl<A> iter::ExtendedIter<A> for &'self [A] {
pub pure fn eachi(&self, blk: &fn(uint, v: &A) -> bool) { pub pure fn eachi(&self, blk: &fn(uint, v: &A) -> bool) {
iter::eachi(self, blk) iter::eachi(self, blk)
} }
@ -2404,7 +2404,7 @@ impl<A> iter::ExtendedIter<A> for @[A] {
} }
} }
impl<A:Eq> iter::EqIter<A> for &self/[A] { impl<A:Eq> iter::EqIter<A> for &'self [A] {
pub pure fn contains(&self, x: &A) -> bool { iter::contains(self, x) } pub pure fn contains(&self, x: &A) -> bool { iter::contains(self, x) }
pub pure fn count(&self, x: &A) -> uint { iter::count(self, x) } pub pure fn count(&self, x: &A) -> uint { iter::count(self, x) }
} }
@ -2421,7 +2421,7 @@ impl<A:Eq> iter::EqIter<A> for @[A] {
pub pure fn count(&self, x: &A) -> uint { iter::count(self, x) } pub pure fn count(&self, x: &A) -> uint { iter::count(self, x) }
} }
impl<A:Copy> iter::CopyableIter<A> for &self/[A] { impl<A:Copy> iter::CopyableIter<A> for &'self [A] {
pure fn filter_to_vec(&self, pred: &fn(&A) -> bool) -> ~[A] { pure fn filter_to_vec(&self, pred: &fn(&A) -> bool) -> ~[A] {
iter::filter_to_vec(self, pred) iter::filter_to_vec(self, pred)
} }
@ -2453,7 +2453,7 @@ impl<A:Copy> iter::CopyableIter<A> for @[A] {
} }
} }
impl<A:Copy + Ord> iter::CopyableOrderedIter<A> for &self/[A] { impl<A:Copy + Ord> iter::CopyableOrderedIter<A> for &'self [A] {
pure fn min(&self) -> A { iter::min(self) } pure fn min(&self) -> A { iter::min(self) }
pure fn max(&self) -> A { iter::max(self) } pure fn max(&self) -> A { iter::max(self) }
} }
@ -2470,7 +2470,7 @@ impl<A:Copy + Ord> iter::CopyableOrderedIter<A> for @[A] {
pure fn max(&self) -> A { iter::max(self) } pure fn max(&self) -> A { iter::max(self) }
} }
impl<A:Copy> iter::CopyableNonstrictIter<A> for &self/[A] { impl<A:Copy> iter::CopyableNonstrictIter<A> for &'self [A] {
pure fn each_val(&const self, f: &fn(A) -> bool) { pure fn each_val(&const self, f: &fn(A) -> bool) {
let mut i = 0; let mut i = 0;
while i < self.len() { while i < self.len() {

View file

@ -38,23 +38,23 @@ impl ValidUsage {
} }
enum Action { enum Action {
Exec(&self/str), Exec(&'self str),
Call(&self/fn(args: &[~str]) -> ValidUsage) Call(&'self fn(args: &[~str]) -> ValidUsage)
} }
enum UsageSource { enum UsageSource {
UsgExec(&self/str), UsgExec(&'self str),
UsgStr(&self/str) UsgStr(&'self str)
} }
struct Command { struct Command {
cmd: &self/str, cmd: &'self str,
action: Action/&self, action: Action/&self,
usage_line: &self/str, usage_line: &'self str,
usage_full: UsageSource/&self usage_full: UsageSource/&self
} }
const commands: &static/[Command/&static] = &[ const commands: &'static [Command/&static] = &[
Command{ Command{
cmd: "build", cmd: "build",
action: Exec("rustc"), action: Exec("rustc"),

View file

@ -19,7 +19,7 @@ use syntax::codemap;
use syntax::codemap::dummy_sp; use syntax::codemap::dummy_sp;
use syntax::fold; use syntax::fold;
const CORE_VERSION: &static/str = "0.6"; const CORE_VERSION: &'static str = "0.6";
pub fn maybe_inject_libcore_ref(sess: Session, pub fn maybe_inject_libcore_ref(sess: Session,
crate: @ast::crate) -> @ast::crate { crate: @ast::crate) -> @ast::crate {

View file

@ -257,7 +257,7 @@ mod __test {
std::test::test_main_static(::os::args(), tests) std::test::test_main_static(::os::args(), tests)
} }
const tests : &static/[std::test::TestDescAndFn] = &[ const tests : &'static [std::test::TestDescAndFn] = &[
... the list of tests in the crate ... ... the list of tests in the crate ...
]; ];
} }
@ -352,7 +352,7 @@ fn path_node_global(+ids: ~[ast::ident]) -> @ast::path {
types: ~[] } types: ~[] }
} }
#[cfg(stage0)]
fn mk_tests(cx: &TestCtxt) -> @ast::item { fn mk_tests(cx: &TestCtxt) -> @ast::item {
let ext_cx = cx.ext_cx; let ext_cx = cx.ext_cx;
@ -367,6 +367,22 @@ fn mk_tests(cx: &TestCtxt) -> @ast::item {
)).get() )).get()
} }
#[cfg(stage1)]
#[cfg(stage2)]
fn mk_tests(cx: &TestCtxt) -> @ast::item {
let ext_cx = cx.ext_cx;
// The vector of test_descs for this crate
let test_descs = mk_test_descs(cx);
(quote_item!(
pub const tests : &'static [self::std::test::TestDescAndFn] =
$test_descs
;
)).get()
}
fn is_std(cx: &TestCtxt) -> bool { fn is_std(cx: &TestCtxt) -> bool {
let is_std = { let is_std = {
let items = attr::find_linkage_metas(cx.crate.node.attrs); let items = attr::find_linkage_metas(cx.crate.node.attrs);

View file

@ -66,7 +66,7 @@ fn lookup_hash(d: ebml::Doc, eq_fn: &fn(x:&[u8]) -> bool, hash: uint) ->
None None
} }
pub type GetCrateDataCb = &self/fn(ast::crate_num) -> cmd; pub type GetCrateDataCb = &'self fn(ast::crate_num) -> cmd;
pub fn maybe_find_item(item_id: int, items: ebml::Doc) -> Option<ebml::Doc> { pub fn maybe_find_item(item_id: int, items: ebml::Doc) -> Option<ebml::Doc> {
fn eq_item(bytes: &[u8], item_id: int) -> bool { fn eq_item(bytes: &[u8], item_id: int) -> bool {
@ -544,7 +544,7 @@ pub fn get_item_path(intr: @ident_interner, cdata: cmd, id: ast::node_id)
item_path(intr, lookup_item(id, cdata.data)) item_path(intr, lookup_item(id, cdata.data))
} }
pub type decode_inlined_item = &self/fn( pub type decode_inlined_item = &'self fn(
cdata: @cstore::crate_metadata, cdata: @cstore::crate_metadata,
tcx: ty::ctxt, tcx: ty::ctxt,
path: ast_map::path, path: ast_map::path,

View file

@ -1291,7 +1291,7 @@ fn encode_hash(ebml_w: writer::Encoder, hash: &str) {
} }
// NB: Increment this as you change the metadata encoding version. // NB: Increment this as you change the metadata encoding version.
pub const metadata_encoding_version : &static/[u8] = pub const metadata_encoding_version : &'static [u8] =
&[0x72, //'r' as u8, &[0x72, //'r' as u8,
0x75, //'u' as u8, 0x75, //'u' as u8,
0x73, //'s' as u8, 0x73, //'s' as u8,

View file

@ -21,7 +21,7 @@ use core::result::Result;
use core::result; use core::result;
use core::str; use core::str;
pub type pick<T> = &self/fn(path: &Path) -> Option<T>; pub type pick<T> = &'self fn(path: &Path) -> Option<T>;
pub fn pick_file(file: Path, path: &Path) -> Option<Path> { pub fn pick_file(file: Path, path: &Path) -> Option<Path> {
if path.file_path() == file { option::Some(copy *path) } if path.file_path() == file { option::Some(copy *path) }

View file

@ -49,7 +49,7 @@ pub enum DefIdSource {
// Identifies a type parameter (`fn foo<X>() { ... }`). // Identifies a type parameter (`fn foo<X>() { ... }`).
TypeParameter TypeParameter
} }
type conv_did = &self/fn(source: DefIdSource, ast::def_id) -> ast::def_id; type conv_did = &'self fn(source: DefIdSource, ast::def_id) -> ast::def_id;
pub struct PState { pub struct PState {
data: @~[u8], data: @~[u8],

View file

@ -514,7 +514,7 @@ pub impl GatherLoanCtxt {
// consumes one mut pointer and returns a narrower one: // consumes one mut pointer and returns a narrower one:
// //
// struct Foo { f: int } // struct Foo { f: int }
// fn foo(p: &v/mut Foo) -> &v/mut int { &mut p.f } // fn foo(p: &'v mut Foo) -> &'v mut int { &mut p.f }
// //
// I think this should work fine but there is more subtlety to it than // I think this should work fine but there is more subtlety to it than
// I at first imagined. Unfortunately it's a very important use case, // I at first imagined. Unfortunately it's a very important use case,

View file

@ -64,7 +64,7 @@ pub impl BorrowckCtxt {
} }
struct PreserveCtxt { struct PreserveCtxt {
bccx: &self/BorrowckCtxt, bccx: &'self BorrowckCtxt,
// the region scope for which we must preserve the memory // the region scope for which we must preserve the memory
scope_region: ty::Region, scope_region: ty::Region,

View file

@ -55,7 +55,7 @@ use syntax::{visit, ast_util};
// primitives in the stdlib are explicitly annotated to only take sendable // primitives in the stdlib are explicitly annotated to only take sendable
// types. // types.
pub const try_adding: &static/str = "Try adding a move"; pub const try_adding: &'static str = "Try adding a move";
pub type rval_map = HashMap<node_id, ()>; pub type rval_map = HashMap<node_id, ()>;

View file

@ -96,7 +96,7 @@ pub impl LanguageItems {
} }
} }
static pub fn item_name(&self, index: uint) -> &static/str { static pub fn item_name(&self, index: uint) -> &'static str {
match index { match index {
0 => "const", 0 => "const",
1 => "copy", 1 => "copy",
@ -257,7 +257,7 @@ pub impl LanguageItems {
fn LanguageItemCollector(crate: @crate, fn LanguageItemCollector(crate: @crate,
session: Session, session: Session,
items: &r/mut LanguageItems) items: &'r mut LanguageItems)
-> LanguageItemCollector/&r { -> LanguageItemCollector/&r {
let item_refs = HashMap(); let item_refs = HashMap();
@ -312,7 +312,7 @@ fn LanguageItemCollector(crate: @crate,
} }
struct LanguageItemCollector { struct LanguageItemCollector {
items: &self/mut LanguageItems, items: &'self mut LanguageItems,
crate: @crate, crate: @crate,
session: Session, session: Session,

View file

@ -90,7 +90,7 @@ pub enum lint {
// dead_assignment // dead_assignment
} }
pub fn level_to_str(lv: level) -> &static/str { pub fn level_to_str(lv: level) -> &'static str {
match lv { match lv {
allow => "allow", allow => "allow",
warn => "warn", warn => "warn",
@ -106,7 +106,7 @@ pub enum level {
struct LintSpec { struct LintSpec {
lint: lint, lint: lint,
desc: &static/str, desc: &'static str,
default: level default: level
} }
@ -881,14 +881,14 @@ fn check_item_non_camel_case_types(cx: ty::ctxt, it: @ast::item) {
!ident.contains_char('_') !ident.contains_char('_')
} }
fn ident_without_trailing_underscores(ident: &r/str) -> &r/str { fn ident_without_trailing_underscores(ident: &'r str) -> &'r str {
match str::rfind(ident, |c| c != '_') { match str::rfind(ident, |c| c != '_') {
Some(idx) => str::view(ident, 0, idx + 1), Some(idx) => str::view(ident, 0, idx + 1),
None => ident, // all underscores None => ident, // all underscores
} }
} }
fn ident_without_leading_underscores(ident: &r/str) -> &r/str { fn ident_without_leading_underscores(ident: &'r str) -> &'r str {
match str::find(ident, |c| c != '_') { match str::find(ident, |c| c != '_') {
Some(idx) => str::view(ident, idx, ident.len()), Some(idx) => str::view(ident, idx, ident.len()),
None => ident // all underscores None => ident // all underscores

View file

@ -438,7 +438,7 @@ pub fn join_variance(++variance1: region_variance,
/// particular site to yield the final variance of the reference. /// particular site to yield the final variance of the reference.
/// ///
/// Example: if we are checking function arguments then the ambient /// Example: if we are checking function arguments then the ambient
/// variance is contravariant. If we then find a `&r/T` pointer, `r` /// variance is contravariant. If we then find a `&'r T` pointer, `r`
/// appears in a co-variant position. This implies that this /// appears in a co-variant position. This implies that this
/// occurrence of `r` is contra-variant with respect to the current /// occurrence of `r` is contra-variant with respect to the current
/// item, and hence the function returns `rv_contravariant`. /// item, and hence the function returns `rv_contravariant`.
@ -517,9 +517,9 @@ pub impl DetermineRpCtxt {
// concrete. // concrete.
// //
// 1. impl foo for &int { ... } // 1. impl foo for &int { ... }
// 2. impl foo for &self/int { ... } // 2. impl foo for &'self int { ... }
// 3. impl foo for bar { fn m(@self) -> &self/int { ... } } // 3. impl foo for bar { fn m(@self) -> &'self int { ... } }
// 4. impl foo for bar { fn m(&self) -> &self/int { ... } } // 4. impl foo for bar { fn m(&self) -> &'self int { ... } }
// 5. impl foo for bar { fn m(&self) -> &int { ... } } // 5. impl foo for bar { fn m(&self) -> &int { ... } }
// //
// In case 1, the anonymous region is being referenced, // In case 1, the anonymous region is being referenced,
@ -644,9 +644,9 @@ pub fn determine_rp_in_ty(ty: @ast::Ty,
// impl etc. So we can ignore it and its components. // impl etc. So we can ignore it and its components.
if cx.item_id == 0 { return; } if cx.item_id == 0 { return; }
// if this type directly references a region pointer like &r/ty, // if this type directly references a region pointer like &'r ty,
// add to the worklist/set. Note that &r/ty is contravariant with // add to the worklist/set. Note that &'r ty is contravariant with
// respect to &r, because &r/ty can be used whereever a *smaller* // respect to &r, because &'r ty can be used whereever a *smaller*
// region is expected (and hence is a supertype of those // region is expected (and hence is a supertype of those
// locations) // locations)
let sess = cx.sess; let sess = cx.sess;

View file

@ -212,7 +212,7 @@ pub impl<T> ResolveResult<T> {
pub enum TypeParameters/& { pub enum TypeParameters/& {
NoTypeParameters, //< No type parameters. NoTypeParameters, //< No type parameters.
HasTypeParameters(&self/Generics, //< Type parameters. HasTypeParameters(&'self Generics, //< Type parameters.
node_id, //< ID of the enclosing item node_id, //< ID of the enclosing item
// The index to start numbering the type parameters at. // The index to start numbering the type parameters at.

View file

@ -327,7 +327,7 @@ pub type BindingsMap = HashMap<ident, BindingInfo>;
pub struct ArmData { pub struct ArmData {
bodycx: block, bodycx: block,
arm: &self/ast::arm, arm: &'self ast::arm,
bindings_map: BindingsMap bindings_map: BindingsMap
} }
@ -391,7 +391,7 @@ pub fn expand_nested_bindings(bcx: block, m: &[@Match/&r],
} }
} }
pub type enter_pat = &self/fn(@ast::pat) -> Option<~[@ast::pat]>; pub type enter_pat = &'self fn(@ast::pat) -> Option<~[@ast::pat]>;
pub fn assert_is_binding_or_wild(bcx: block, p: @ast::pat) { pub fn assert_is_binding_or_wild(bcx: block, p: @ast::pat) {
if !pat_is_binding_or_wild(bcx.tcx().def_map, p) { if !pat_is_binding_or_wild(bcx.tcx().def_map, p) {

View file

@ -550,8 +550,8 @@ pub fn trans_call_inner(
pub enum CallArgs { pub enum CallArgs {
ArgExprs(&self/[@ast::expr]), ArgExprs(&'self [@ast::expr]),
ArgVals(&self/[ValueRef]) ArgVals(&'self [ValueRef])
} }
pub struct Args { pub struct Args {

View file

@ -617,7 +617,7 @@ pub impl Datum {
// using `to_ref_llval()`). // using `to_ref_llval()`).
// Convert to ref, yielding lltype *T. Then create a Rust // Convert to ref, yielding lltype *T. Then create a Rust
// type &static/T (which translates to *T). Construct new // type &'static T (which translates to *T). Construct new
// result (which will be by-value). Note that it is not // result (which will be by-value). Note that it is not
// significant *which* region we pick here. // significant *which* region we pick here.
let llval = self.to_ref_llval(bcx); let llval = self.to_ref_llval(bcx);

View file

@ -520,7 +520,7 @@ pub fn get_base_and_len(bcx: block,
pub type val_and_ty_fn = @fn(block, ValueRef, ty::t) -> Result; pub type val_and_ty_fn = @fn(block, ValueRef, ty::t) -> Result;
pub type iter_vec_block = &self/fn(block, ValueRef, ty::t) -> block; pub type iter_vec_block = &'self fn(block, ValueRef, ty::t) -> block;
pub fn iter_vec_raw(bcx: block, data_ptr: ValueRef, vec_ty: ty::t, pub fn iter_vec_raw(bcx: block, data_ptr: ValueRef, vec_ty: ty::t,
fill: ValueRef, f: iter_vec_block) -> block { fill: ValueRef, f: iter_vec_block) -> block {

View file

@ -448,13 +448,13 @@ pub enum Region {
#[auto_encode] #[auto_encode]
#[auto_decode] #[auto_decode]
pub enum bound_region { pub enum bound_region {
/// The self region for structs, impls (&T in a type defn or &self/T) /// The self region for structs, impls (&T in a type defn or &'self T)
br_self, br_self,
/// An anonymous region parameter for a given fn (&T) /// An anonymous region parameter for a given fn (&T)
br_anon(uint), br_anon(uint),
/// Named region parameters for functions (a in &a/T) /// Named region parameters for functions (a in &'a T)
br_named(ast::ident), br_named(ast::ident),
/// Fresh bound identifiers created during GLB computations. /// Fresh bound identifiers created during GLB computations.

View file

@ -46,7 +46,7 @@
* type foo/& = ...; * type foo/& = ...;
* type bar = fn(&foo, &a.foo) * type bar = fn(&foo, &a.foo)
* The fully expanded version of type bar is: * The fully expanded version of type bar is:
* type bar = fn(&foo/&, &a.foo/&a) * type bar = fn(&'foo &, &a.foo/&a)
* Note that the self region for the `foo` defaulted to `&` in the first * Note that the self region for the `foo` defaulted to `&` in the first
* case but `&a` in the second. Basically, defaults that appear inside * case but `&a` in the second. Basically, defaults that appear inside
* an rptr (`&r.T`) use the region `r` that appears in the rptr. * an rptr (`&r.T`) use the region `r` that appears in the rptr.

View file

@ -157,7 +157,7 @@ pub struct LookupContext {
self_expr: @ast::expr, self_expr: @ast::expr,
callee_id: node_id, callee_id: node_id,
m_name: ast::ident, m_name: ast::ident,
supplied_tps: &self/[ty::t], supplied_tps: &'self [ty::t],
impl_dups: HashMap<def_id, ()>, impl_dups: HashMap<def_id, ()>,
inherent_candidates: @mut ~[Candidate], inherent_candidates: @mut ~[Candidate],
extension_candidates: @mut ~[Candidate], extension_candidates: @mut ~[Candidate],

View file

@ -18,7 +18,7 @@ know whether a given type will be a region pointer or not until this
phase. phase.
In particular, we ensure that, if the type of an expression or In particular, we ensure that, if the type of an expression or
variable is `&r/T`, then the expression or variable must occur within variable is `&'r T`, then the expression or variable must occur within
the region scope `r`. Note that in some cases `r` may still be a the region scope `r`. Note that in some cases `r` may still be a
region variable, so this gives us a chance to influence the value for region variable, so this gives us a chance to influence the value for
`r` that we infer to ensure we choose a value large enough to enclose `r` that we infer to ensure we choose a value large enough to enclose
@ -500,7 +500,7 @@ pub mod guarantor {
* *
* struct Foo { i: int } * struct Foo { i: int }
* struct Bar { foo: Foo } * struct Bar { foo: Foo }
* fn get_i(x: &a/Bar) -> &a/int { * fn get_i(x: &'a Bar) -> &'a int {
* let foo = &x.foo; // Lifetime L1 * let foo = &x.foo; // Lifetime L1
* &foo.i // Lifetime L2 * &foo.i // Lifetime L2
* } * }

View file

@ -550,8 +550,8 @@ pub impl CoherenceChecker {
} }
fn can_unify_universally_quantified(&self, fn can_unify_universally_quantified(&self,
a: &a/UniversalQuantificationResult, a: &'a UniversalQuantificationResult,
b: &a/UniversalQuantificationResult) b: &'a UniversalQuantificationResult)
-> bool { -> bool {
let mut might_unify = true; let mut might_unify = true;
let _ = do self.inference_context.probe { let _ = do self.inference_context.probe {

View file

@ -438,7 +438,7 @@ pub fn compare_impl_method(tcx: ty::ctxt,
// Replace any references to the self region in the self type with // Replace any references to the self region in the self type with
// a free region. So, for example, if the impl type is // a free region. So, for example, if the impl type is
// "&self/str", then this would replace the self type with a free // "&'self str", then this would replace the self type with a free
// region `self`. // region `self`.
let dummy_self_r = ty::re_free(cm.body_id, ty::br_self); let dummy_self_r = ty::re_free(cm.body_id, ty::br_self);
let self_ty = replace_bound_self(tcx, self_ty, dummy_self_r); let self_ty = replace_bound_self(tcx, self_ty, dummy_self_r);
@ -601,7 +601,7 @@ pub fn convert_methods(ccx: &CrateCtxt,
pub fn ensure_no_ty_param_bounds(ccx: &CrateCtxt, pub fn ensure_no_ty_param_bounds(ccx: &CrateCtxt,
span: span, span: span,
generics: &ast::Generics, generics: &ast::Generics,
thing: &static/str) { thing: &'static str) {
for generics.ty_params.each |ty_param| { for generics.ty_params.each |ty_param| {
if ty_param.bounds.len() > 0 { if ty_param.bounds.len() > 0 {
ccx.tcx.sess.span_err( ccx.tcx.sess.span_err(

View file

@ -58,7 +58,7 @@ pub trait LatticeValue {
-> cres<Self>; -> cres<Self>;
} }
pub type LatticeOp<T> = &self/fn(cf: &CombineFields, a: &T, b: &T) -> cres<T>; pub type LatticeOp<T> = &'self fn(cf: &CombineFields, a: &T, b: &T) -> cres<T>;
impl LatticeValue for ty::t { impl LatticeValue for ty::t {
static fn sub(&self, cf: &CombineFields, a: &ty::t, b: &ty::t) -> ures { static fn sub(&self, cf: &CombineFields, a: &ty::t, b: &ty::t) -> ures {
@ -378,7 +378,7 @@ pub fn super_lattice_tys<L:LatticeDir + TyLatticeDir + Combine>(
} }
} }
pub type LatticeDirOp<T> = &self/fn(a: &T, b: &T) -> cres<T>; pub type LatticeDirOp<T> = &'self fn(a: &T, b: &T) -> cres<T>;
pub enum LatticeVarResult<V,T> { pub enum LatticeVarResult<V,T> {
VarResult(V), VarResult(V),

View file

@ -153,7 +153,7 @@ The problem we are addressing is that there is a kind of subtyping
between functions with bound region parameters. Consider, for between functions with bound region parameters. Consider, for
example, whether the following relation holds: example, whether the following relation holds:
fn(&a/int) <: &fn(&b/int)? (Yes, a => b) fn(&'a int) <: &fn(&'b int)? (Yes, a => b)
The answer is that of course it does. These two types are basically The answer is that of course it does. These two types are basically
the same, except that in one we used the name `a` and one we used the same, except that in one we used the name `a` and one we used
@ -163,14 +163,14 @@ In the examples that follow, it becomes very important to know whether
a lifetime is bound in a function type (that is, is a lifetime a lifetime is bound in a function type (that is, is a lifetime
parameter) or appears free (is defined in some outer scope). parameter) or appears free (is defined in some outer scope).
Therefore, from now on I will write the bindings explicitly, using a Therefore, from now on I will write the bindings explicitly, using a
notation like `fn<a>(&a/int)` to indicate that `a` is a lifetime notation like `fn<a>(&'a int)` to indicate that `a` is a lifetime
parameter. parameter.
Now let's consider two more function types. Here, we assume that the Now let's consider two more function types. Here, we assume that the
`self` lifetime is defined somewhere outside and hence is not a `self` lifetime is defined somewhere outside and hence is not a
lifetime parameter bound by the function type (it "appears free"): lifetime parameter bound by the function type (it "appears free"):
fn<a>(&a/int) <: &fn(&self/int)? (Yes, a => self) fn<a>(&'a int) <: &fn(&'self int)? (Yes, a => self)
This subtyping relation does in fact hold. To see why, you have to This subtyping relation does in fact hold. To see why, you have to
consider what subtyping means. One way to look at `T1 <: T2` is to consider what subtyping means. One way to look at `T1 <: T2` is to
@ -187,7 +187,7 @@ to the same thing: a function that accepts pointers with any lifetime
So, what if we reverse the order of the two function types, like this: So, what if we reverse the order of the two function types, like this:
fn(&self/int) <: &fn<a>(&a/int)? (No) fn(&'self int) <: &fn<a>(&'a int)? (No)
Does the subtyping relationship still hold? The answer of course is Does the subtyping relationship still hold? The answer of course is
no. In this case, the function accepts *only the lifetime `&self`*, no. In this case, the function accepts *only the lifetime `&self`*,
@ -196,8 +196,8 @@ accepted any lifetime.
What about these two examples: What about these two examples:
fn<a,b>(&a/int, &b/int) <: &fn<a>(&a/int, &a/int)? (Yes) fn<a,b>(&'a int, &'b int) <: &fn<a>(&'a int, &'a int)? (Yes)
fn<a>(&a/int, &a/int) <: &fn<a,b>(&a/int, &b/int)? (No) fn<a>(&'a int, &'a int) <: &fn<a,b>(&'a int, &'b int)? (No)
Here, it is true that functions which take two pointers with any two Here, it is true that functions which take two pointers with any two
lifetimes can be treated as if they only accepted two pointers with lifetimes can be treated as if they only accepted two pointers with
@ -221,12 +221,12 @@ Let's walk through some examples and see how this algorithm plays out.
We'll start with the first example, which was: We'll start with the first example, which was:
1. fn<a>(&a/T) <: &fn<b>(&b/T)? Yes: a -> b 1. fn<a>(&'a T) <: &fn<b>(&'b T)? Yes: a -> b
After steps 1 and 2 of the algorithm we will have replaced the types After steps 1 and 2 of the algorithm we will have replaced the types
like so: like so:
1. fn(&A/T) <: &fn(&x/T)? 1. fn(&'A T) <: &fn(&'x T)?
Here the upper case `&A` indicates a *region variable*, that is, a Here the upper case `&A` indicates a *region variable*, that is, a
region whose value is being inferred by the system. I also replaced region whose value is being inferred by the system. I also replaced
@ -238,7 +238,7 @@ region names anymore (as indicated by the absence of `<` and `>`).
The next step is to check that the parameter types match. Because The next step is to check that the parameter types match. Because
parameters are contravariant, this means that we check whether: parameters are contravariant, this means that we check whether:
&x/T <: &A/T &'x T <: &'A T
Region pointers are contravariant so this implies that Region pointers are contravariant so this implies that
@ -255,12 +255,12 @@ So far we have encountered no error, so the subtype check succeeds.
Now let's look first at the third example, which was: Now let's look first at the third example, which was:
3. fn(&self/T) <: &fn<b>(&b/T)? No! 3. fn(&'self T) <: &fn<b>(&'b T)? No!
After steps 1 and 2 of the algorithm we will have replaced the types After steps 1 and 2 of the algorithm we will have replaced the types
like so: like so:
3. fn(&self/T) <: &fn(&x/T)? 3. fn(&'self T) <: &fn(&'x T)?
This looks pretty much the same as before, except that on the LHS This looks pretty much the same as before, except that on the LHS
`&self` was not bound, and hence was left as-is and not replaced with `&self` was not bound, and hence was left as-is and not replaced with
@ -275,33 +275,33 @@ You may be wondering about that mysterious last step in the algorithm.
So far it has not been relevant. The purpose of that last step is to So far it has not been relevant. The purpose of that last step is to
catch something like *this*: catch something like *this*:
fn<a>() -> fn(&a/T) <: &fn() -> fn<b>(&b/T)? No. fn<a>() -> fn(&'a T) <: &fn() -> fn<b>(&'b T)? No.
Here the function types are the same but for where the binding occurs. Here the function types are the same but for where the binding occurs.
The subtype returns a function that expects a value in precisely one The subtype returns a function that expects a value in precisely one
region. The supertype returns a function that expects a value in any region. The supertype returns a function that expects a value in any
region. If we allow an instance of the subtype to be used where the region. If we allow an instance of the subtype to be used where the
supertype is expected, then, someone could call the fn and think that supertype is expected, then, someone could call the fn and think that
the return value has type `fn<b>(&b/T)` when it really has type the return value has type `fn<b>(&'b T)` when it really has type
`fn(&a/T)` (this is case #3, above). Bad. `fn(&'a T)` (this is case #3, above). Bad.
So let's step through what happens when we perform this subtype check. So let's step through what happens when we perform this subtype check.
We first replace the bound regions in the subtype (the supertype has We first replace the bound regions in the subtype (the supertype has
no bound regions). This gives us: no bound regions). This gives us:
fn() -> fn(&A/T) <: &fn() -> fn<b>(&b/T)? fn() -> fn(&'A T) <: &fn() -> fn<b>(&'b T)?
Now we compare the return types, which are covariant, and hence we have: Now we compare the return types, which are covariant, and hence we have:
fn(&A/T) <: &fn<b>(&b/T)? fn(&'A T) <: &fn<b>(&'b T)?
Here we skolemize the bound region in the supertype to yield: Here we skolemize the bound region in the supertype to yield:
fn(&A/T) <: &fn(&x/T)? fn(&'A T) <: &fn(&'x T)?
And then proceed to compare the argument types: And then proceed to compare the argument types:
&x/T <: &A/T &'x T <: &'A T
&A <= &x &A <= &x
Finally, this is where it gets interesting! This is where an error Finally, this is where it gets interesting! This is where an error
@ -314,7 +314,7 @@ The difference between this example and the first one is that the variable
`A` already existed at the point where the skolemization occurred. In `A` already existed at the point where the skolemization occurred. In
the first example, you had two functions: the first example, you had two functions:
fn<a>(&a/T) <: &fn<b>(&b/T) fn<a>(&'a T) <: &fn<b>(&'b T)
and hence `&A` and `&x` were created "together". In general, the and hence `&A` and `&x` were created "together". In general, the
intention of the skolemized names is that they are supposed to be intention of the skolemized names is that they are supposed to be

View file

@ -35,8 +35,8 @@ pub struct Node<V, T> {
} }
pub trait UnifyVid<T> { pub trait UnifyVid<T> {
static fn appropriate_vals_and_bindings(&self, infcx: &v/mut InferCtxt) static fn appropriate_vals_and_bindings(&self, infcx: &'v mut InferCtxt)
-> &v/mut ValsAndBindings<Self, T>; -> &'v mut ValsAndBindings<Self, T>;
} }
pub impl InferCtxt { pub impl InferCtxt {
@ -235,15 +235,15 @@ pub impl InferCtxt {
// ______________________________________________________________________ // ______________________________________________________________________
impl UnifyVid<Bounds<ty::t>> for ty::TyVid { impl UnifyVid<Bounds<ty::t>> for ty::TyVid {
static fn appropriate_vals_and_bindings(&self, infcx: &v/mut InferCtxt) static fn appropriate_vals_and_bindings(&self, infcx: &'v mut InferCtxt)
-> &v/mut ValsAndBindings<ty::TyVid, Bounds<ty::t>> { -> &'v mut ValsAndBindings<ty::TyVid, Bounds<ty::t>> {
return &mut infcx.ty_var_bindings; return &mut infcx.ty_var_bindings;
} }
} }
impl UnifyVid<Option<IntVarValue>> for ty::IntVid { impl UnifyVid<Option<IntVarValue>> for ty::IntVid {
static fn appropriate_vals_and_bindings(&self, infcx: &v/mut InferCtxt) static fn appropriate_vals_and_bindings(&self, infcx: &'v mut InferCtxt)
-> &v/mut ValsAndBindings<ty::IntVid, Option<IntVarValue>> { -> &'v mut ValsAndBindings<ty::IntVid, Option<IntVarValue>> {
return &mut infcx.int_var_bindings; return &mut infcx.int_var_bindings;
} }
} }
@ -256,8 +256,8 @@ impl SimplyUnifiable for IntVarValue {
} }
impl UnifyVid<Option<ast::float_ty>> for ty::FloatVid { impl UnifyVid<Option<ast::float_ty>> for ty::FloatVid {
static fn appropriate_vals_and_bindings(&self, infcx: &v/mut InferCtxt) static fn appropriate_vals_and_bindings(&self, infcx: &'v mut InferCtxt)
-> &v/mut ValsAndBindings<ty::FloatVid, Option<ast::float_ty>> { -> &'v mut ValsAndBindings<ty::FloatVid, Option<ast::float_ty>> {
return &mut infcx.float_var_bindings; return &mut infcx.float_var_bindings;
} }
} }

View file

@ -27,8 +27,8 @@ use core::task;
/// As sync::condvar, a mechanism for unlock-and-descheduling and signalling. /// As sync::condvar, a mechanism for unlock-and-descheduling and signalling.
pub struct Condvar { pub struct Condvar {
is_mutex: bool, is_mutex: bool,
failed: &self/mut bool, failed: &'self mut bool,
cond: &self/sync::Condvar/&self cond: &'self sync::Condvar/&self
} }
pub impl Condvar/&self { pub impl Condvar/&self {
@ -95,7 +95,7 @@ pub fn ARC<T:Const + Owned>(data: T) -> ARC<T> {
* Access the underlying data in an atomically reference counted * Access the underlying data in an atomically reference counted
* wrapper. * wrapper.
*/ */
pub fn get<T:Const + Owned>(rc: &a/ARC<T>) -> &a/T { pub fn get<T:Const + Owned>(rc: &'a ARC<T>) -> &'a T {
unsafe { get_shared_immutable_state(&rc.x) } unsafe { get_shared_immutable_state(&rc.x) }
} }
@ -193,7 +193,7 @@ pub impl<T:Owned> MutexARC<T> {
#[inline(always)] #[inline(always)]
unsafe fn access_cond<U>( unsafe fn access_cond<U>(
&self, &self,
blk: &fn(x: &x/mut T, c: &c/Condvar) -> U) -> U blk: &fn(x: &'x mut T, c: &'c Condvar) -> U) -> U
{ {
unsafe { unsafe {
let state = get_shared_mutable_state(&self.x); let state = get_shared_mutable_state(&self.x);
@ -239,7 +239,7 @@ impl Drop for PoisonOnFail {
} }
} }
fn PoisonOnFail(failed: &r/mut bool) -> PoisonOnFail { fn PoisonOnFail(failed: &'r mut bool) -> PoisonOnFail {
PoisonOnFail { PoisonOnFail {
failed: ptr::to_mut_unsafe_ptr(failed) failed: ptr::to_mut_unsafe_ptr(failed)
} }
@ -313,7 +313,7 @@ pub impl<T:Const + Owned> RWARC<T> {
} }
/// As write(), but with a condvar, as sync::rwlock.write_cond(). /// As write(), but with a condvar, as sync::rwlock.write_cond().
#[inline(always)] #[inline(always)]
fn write_cond<U>(&self, blk: &fn(x: &x/mut T, c: &c/Condvar) -> U) -> U { fn write_cond<U>(&self, blk: &fn(x: &'x mut T, c: &'c Condvar) -> U) -> U {
unsafe { unsafe {
let state = get_shared_mutable_state(&self.x); let state = get_shared_mutable_state(&self.x);
do (*borrow_rwlock(state)).write_cond |cond| { do (*borrow_rwlock(state)).write_cond |cond| {
@ -436,7 +436,7 @@ pub impl<T:Const + Owned> RWWriteMode/&self<T> {
} }
} }
/// Access the pre-downgrade RWARC in write mode with a condvar. /// Access the pre-downgrade RWARC in write mode with a condvar.
fn write_cond<U>(&self, blk: &fn(x: &x/mut T, c: &c/Condvar) -> U) -> U { fn write_cond<U>(&self, blk: &fn(x: &'x mut T, c: &'c Condvar) -> U) -> U {
match *self { match *self {
RWWriteMode { RWWriteMode {
data: ref data, data: ref data,

View file

@ -201,7 +201,7 @@ pub impl Arena {
} }
#[inline(always)] #[inline(always)]
fn alloc_pod<T>(&self, op: &fn() -> T) -> &self/T { fn alloc_pod<T>(&self, op: &fn() -> T) -> &'self T {
unsafe { unsafe {
let tydesc = sys::get_type_desc::<T>(); let tydesc = sys::get_type_desc::<T>();
let ptr = self.alloc_pod_inner((*tydesc).size, (*tydesc).align); let ptr = self.alloc_pod_inner((*tydesc).size, (*tydesc).align);
@ -246,7 +246,7 @@ pub impl Arena {
} }
#[inline(always)] #[inline(always)]
fn alloc_nonpod<T>(&self, op: &fn() -> T) -> &self/T { fn alloc_nonpod<T>(&self, op: &fn() -> T) -> &'self T {
unsafe { unsafe {
let tydesc = sys::get_type_desc::<T>(); let tydesc = sys::get_type_desc::<T>();
let (ty_ptr, ptr) = let (ty_ptr, ptr) =
@ -268,7 +268,7 @@ pub impl Arena {
// The external interface // The external interface
#[inline(always)] #[inline(always)]
fn alloc<T>(&self, op: &fn() -> T) -> &self/T { fn alloc<T>(&self, op: &fn() -> T) -> &'self T {
unsafe { unsafe {
if !rusti::needs_drop::<T>() { if !rusti::needs_drop::<T>() {
self.alloc_pod(op) self.alloc_pod(op)

View file

@ -16,7 +16,7 @@ pub trait ToBase64 {
pure fn to_base64(&self) -> ~str; pure fn to_base64(&self) -> ~str;
} }
impl ToBase64 for &self/[u8] { impl ToBase64 for &'self [u8] {
pure fn to_base64(&self) -> ~str { pure fn to_base64(&self) -> ~str {
let chars = str::chars( let chars = str::chars(
~"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ~"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
@ -69,7 +69,7 @@ impl ToBase64 for &self/[u8] {
} }
} }
impl ToBase64 for &self/str { impl ToBase64 for &'self str {
pure fn to_base64(&self) -> ~str { pure fn to_base64(&self) -> ~str {
str::to_bytes(*self).to_base64() str::to_bytes(*self).to_base64()
} }

View file

@ -1045,9 +1045,9 @@ mod biguint_tests {
fail_unless!(BigUint::new(~[0, 0, -1]).to_uint() == uint::max_value); fail_unless!(BigUint::new(~[0, 0, -1]).to_uint() == uint::max_value);
} }
const sum_triples: &static/[(&static/[BigDigit], const sum_triples: &'static [(&'static [BigDigit],
&static/[BigDigit], &'static [BigDigit],
&static/[BigDigit])] = &[ &'static [BigDigit])] = &[
(&[], &[], &[]), (&[], &[], &[]),
(&[], &[ 1], &[ 1]), (&[], &[ 1], &[ 1]),
(&[ 1], &[ 1], &[ 2]), (&[ 1], &[ 1], &[ 2]),
@ -1085,9 +1085,9 @@ mod biguint_tests {
} }
} }
const mul_triples: &static/[(&static/[BigDigit], const mul_triples: &'static [(&'static [BigDigit],
&static/[BigDigit], &'static [BigDigit],
&static/[BigDigit])] = &[ &'static [BigDigit])] = &[
(&[], &[], &[]), (&[], &[], &[]),
(&[], &[ 1], &[]), (&[], &[ 1], &[]),
(&[ 2], &[], &[]), (&[ 2], &[], &[]),
@ -1111,10 +1111,10 @@ mod biguint_tests {
(&[ 0, 0, 1], &[ 0, 0, 0, 1], &[0, 0, 0, 0, 0, 1]) (&[ 0, 0, 1], &[ 0, 0, 0, 1], &[0, 0, 0, 0, 0, 1])
]; ];
const divmod_quadruples: &static/[(&static/[BigDigit], const divmod_quadruples: &'static [(&'static [BigDigit],
&static/[BigDigit], &'static [BigDigit],
&static/[BigDigit], &'static [BigDigit],
&static/[BigDigit])] &'static [BigDigit])]
= &[ = &[
(&[ 1], &[ 2], &[], &[1]), (&[ 1], &[ 2], &[], &[1]),
(&[ 1, 1], &[ 2], &[-1/2+1], &[1]), (&[ 1, 1], &[ 2], &[-1/2+1], &[1]),
@ -1399,9 +1399,9 @@ mod bigint_tests {
).to_uint() == 0); ).to_uint() == 0);
} }
const sum_triples: &static/[(&static/[BigDigit], const sum_triples: &'static [(&'static [BigDigit],
&static/[BigDigit], &'static [BigDigit],
&static/[BigDigit])] = &[ &'static [BigDigit])] = &[
(&[], &[], &[]), (&[], &[], &[]),
(&[], &[ 1], &[ 1]), (&[], &[ 1], &[ 1]),
(&[ 1], &[ 1], &[ 2]), (&[ 1], &[ 1], &[ 2]),
@ -1451,9 +1451,9 @@ mod bigint_tests {
} }
} }
const mul_triples: &static/[(&static/[BigDigit], const mul_triples: &'static [(&'static [BigDigit],
&static/[BigDigit], &'static [BigDigit],
&static/[BigDigit])] = &[ &'static [BigDigit])] = &[
(&[], &[], &[]), (&[], &[], &[]),
(&[], &[ 1], &[]), (&[], &[ 1], &[]),
(&[ 2], &[], &[]), (&[ 2], &[], &[]),
@ -1477,10 +1477,10 @@ mod bigint_tests {
(&[ 0, 0, 1], &[ 0, 0, 0, 1], &[0, 0, 0, 0, 0, 1]) (&[ 0, 0, 1], &[ 0, 0, 0, 1], &[0, 0, 0, 0, 0, 1])
]; ];
const divmod_quadruples: &static/[(&static/[BigDigit], const divmod_quadruples: &'static [(&'static [BigDigit],
&static/[BigDigit], &'static [BigDigit],
&static/[BigDigit], &'static [BigDigit],
&static/[BigDigit])] &'static [BigDigit])]
= &[ = &[
(&[ 1], &[ 2], &[], &[1]), (&[ 1], &[ 2], &[], &[1]),
(&[ 1, 1], &[ 2], &[-1/2+1], &[1]), (&[ 1, 1], &[ 2], &[-1/2+1], &[1]),

View file

@ -49,17 +49,17 @@ pub impl<T> Deque<T> {
/// Return a reference to the first element in the deque /// Return a reference to the first element in the deque
/// ///
/// Fails if the deque is empty /// Fails if the deque is empty
fn peek_front(&self) -> &self/T { get(self.elts, self.lo) } fn peek_front(&self) -> &'self T { get(self.elts, self.lo) }
/// Return a reference to the last element in the deque /// Return a reference to the last element in the deque
/// ///
/// Fails if the deque is empty /// Fails if the deque is empty
fn peek_back(&self) -> &self/T { get(self.elts, self.hi - 1u) } fn peek_back(&self) -> &'self T { get(self.elts, self.hi - 1u) }
/// Retrieve an element in the deque by index /// Retrieve an element in the deque by index
/// ///
/// Fails if there is no element with the given index /// Fails if there is no element with the given index
fn get(&self, i: int) -> &self/T { fn get(&self, i: int) -> &'self T {
let idx = (self.lo + (i as uint)) % self.elts.len(); let idx = (self.lo + (i as uint)) % self.elts.len();
get(self.elts, idx) get(self.elts, idx)
} }
@ -130,7 +130,7 @@ fn grow<T>(nelts: uint, lo: uint, elts: &mut [Option<T>]) -> ~[Option<T>] {
rv rv
} }
fn get<T>(elts: &r/[Option<T>], i: uint) -> &r/T { fn get<T>(elts: &'r [Option<T>], i: uint) -> &'r T {
match elts[i] { Some(ref t) => t, _ => fail!() } match elts[i] { Some(ref t) => t, _ => fail!() }
} }

View file

@ -55,7 +55,7 @@ pub impl<A:Copy> Future<A> {
pub impl<A> Future<A> { pub impl<A> Future<A> {
pure fn get_ref(&self) -> &self/A { pure fn get_ref(&self) -> &'self A {
/*! /*!
* Executes the future's closure and then returns a borrowed * Executes the future's closure and then returns a borrowed
* pointer to the result. The borrowed pointer lasts as long as * pointer to the result. The borrowed pointer lasts as long as

View file

@ -748,7 +748,7 @@ pub fn from_str(s: &str) -> Result<Json, Error> {
pub struct Decoder { pub struct Decoder {
priv json: Json, priv json: Json,
priv mut stack: ~[&self/Json], priv mut stack: ~[&'self Json],
} }
pub fn Decoder(json: Json) -> Decoder { pub fn Decoder(json: Json) -> Decoder {
@ -756,12 +756,12 @@ pub fn Decoder(json: Json) -> Decoder {
} }
priv impl Decoder/&self { priv impl Decoder/&self {
fn peek(&self) -> &self/Json { fn peek(&self) -> &'self Json {
if self.stack.len() == 0 { self.stack.push(&self.json); } if self.stack.len() == 0 { self.stack.push(&self.json); }
self.stack[self.stack.len() - 1] self.stack[self.stack.len() - 1]
} }
fn pop(&self) -> &self/Json { fn pop(&self) -> &'self Json {
if self.stack.len() == 0 { self.stack.push(&self.json); } if self.stack.len() == 0 { self.stack.push(&self.json); }
self.stack.pop() self.stack.pop()
} }

View file

@ -50,10 +50,10 @@ impl<T:Ord> Mutable for PriorityQueue<T> {
pub impl <T:Ord> PriorityQueue<T> { pub impl <T:Ord> PriorityQueue<T> {
/// Returns the greatest item in the queue - fails if empty /// Returns the greatest item in the queue - fails if empty
pure fn top(&self) -> &self/T { &self.data[0] } pure fn top(&self) -> &'self T { &self.data[0] }
/// Returns the greatest item in the queue - None if empty /// Returns the greatest item in the queue - None if empty
pure fn maybe_top(&self) -> Option<&self/T> { pure fn maybe_top(&self) -> Option<&'self T> {
if self.is_empty() { None } else { Some(self.top()) } if self.is_empty() { None } else { Some(self.top()) }
} }

View file

@ -213,7 +213,7 @@ impl<D:Decoder> Decodable<D> for i64 {
} }
} }
impl<S:Encoder> Encodable<S> for &self/str { impl<S:Encoder> Encodable<S> for &'self str {
fn encode(&self, s: &S) { s.emit_borrowed_str(*self) } fn encode(&self, s: &S) { s.emit_borrowed_str(*self) }
} }
@ -286,7 +286,7 @@ impl<D:Decoder> Decodable<D> for () {
} }
} }
impl<S:Encoder,T:Encodable<S>> Encodable<S> for &self/T { impl<S:Encoder,T:Encodable<S>> Encodable<S> for &'self T {
fn encode(&self, s: &S) { fn encode(&self, s: &S) {
s.emit_borrowed(|| (**self).encode(s)) s.emit_borrowed(|| (**self).encode(s))
} }
@ -316,7 +316,7 @@ impl<D:Decoder,T:Decodable<D>> Decodable<D> for @T {
} }
} }
impl<S:Encoder,T:Encodable<S>> Encodable<S> for &self/[T] { impl<S:Encoder,T:Encodable<S>> Encodable<S> for &'self [T] {
fn encode(&self, s: &S) { fn encode(&self, s: &S) {
do s.emit_borrowed_vec(self.len()) { do s.emit_borrowed_vec(self.len()) {
for self.eachi |i, e| { for self.eachi |i, e| {

View file

@ -22,9 +22,9 @@ pub struct SmallIntMap<T> {
priv v: ~[Option<T>], priv v: ~[Option<T>],
} }
impl<V> BaseIter<(uint, &self/V)> for SmallIntMap<V> { impl<V> BaseIter<(uint, &'self V)> for SmallIntMap<V> {
/// Visit all key-value pairs in order /// Visit all key-value pairs in order
pure fn each(&self, it: &fn(&(uint, &self/V)) -> bool) { pure fn each(&self, it: &fn(&(uint, &'self V)) -> bool) {
for uint::range(0, self.v.len()) |i| { for uint::range(0, self.v.len()) |i| {
match self.v[i] { match self.v[i] {
Some(ref elt) => if !it(&(i, elt)) { break }, Some(ref elt) => if !it(&(i, elt)) { break },
@ -36,9 +36,9 @@ impl<V> BaseIter<(uint, &self/V)> for SmallIntMap<V> {
pure fn size_hint(&self) -> Option<uint> { Some(self.len()) } pure fn size_hint(&self) -> Option<uint> { Some(self.len()) }
} }
impl<V> ReverseIter<(uint, &self/V)> for SmallIntMap<V> { impl<V> ReverseIter<(uint, &'self V)> for SmallIntMap<V> {
/// Visit all key-value pairs in reverse order /// Visit all key-value pairs in reverse order
pure fn each_reverse(&self, it: &fn(&(uint, &self/V)) -> bool) { pure fn each_reverse(&self, it: &fn(&(uint, &'self V)) -> bool) {
for uint::range_rev(self.v.len(), 0) |i| { for uint::range_rev(self.v.len(), 0) |i| {
match self.v[i - 1] { match self.v[i - 1] {
Some(ref elt) => if !it(&(i - 1, elt)) { break }, Some(ref elt) => if !it(&(i - 1, elt)) { break },
@ -96,7 +96,7 @@ impl<V> Map<uint, V> for SmallIntMap<V> {
} }
/// Iterate over the map and mutate the contained values /// Iterate over the map and mutate the contained values
pure fn find(&self, key: &uint) -> Option<&self/V> { pure fn find(&self, key: &uint) -> Option<&'self V> {
if *key < self.v.len() { if *key < self.v.len() {
match self.v[*key] { match self.v[*key] {
Some(ref value) => Some(value), Some(ref value) => Some(value),
@ -136,7 +136,7 @@ pub impl<V> SmallIntMap<V> {
/// Create an empty SmallIntMap /// Create an empty SmallIntMap
static pure fn new() -> SmallIntMap<V> { SmallIntMap{v: ~[]} } static pure fn new() -> SmallIntMap<V> { SmallIntMap{v: ~[]} }
pure fn get(&self, key: &uint) -> &self/V { pure fn get(&self, key: &uint) -> &'self V {
self.find(key).expect("key not present") self.find(key).expect("key not present")
} }
} }

View file

@ -16,7 +16,7 @@ use core::util;
use core::vec::{len, push}; use core::vec::{len, push};
use core::vec; use core::vec;
type Le<T> = &self/pure fn(v1: &T, v2: &T) -> bool; type Le<T> = &'self pure fn(v1: &T, v2: &T) -> bool;
/** /**
* Merge sort. Returns a new vector containing the sorted list. * Merge sort. Returns a new vector containing the sorted list.
@ -168,7 +168,7 @@ pub trait Sort {
fn qsort(self); fn qsort(self);
} }
impl<T:Copy + Ord + Eq> Sort for &self/mut [T] { impl<T:Copy + Ord + Eq> Sort for &'self mut [T] {
fn qsort(self) { quick_sort3(self); } fn qsort(self) { quick_sort3(self); }
} }
@ -868,7 +868,7 @@ mod tests {
#[test] #[test]
pub fn test_merge_sort_stability() { pub fn test_merge_sort_stability() {
// tjc: funny that we have to use parens // tjc: funny that we have to use parens
pure fn ile(x: &(&static/str), y: &(&static/str)) -> bool pure fn ile(x: &(&'static str), y: &(&'static str)) -> bool
{ {
unsafe // to_lower is not pure... unsafe // to_lower is not pure...
{ {
@ -1172,7 +1172,7 @@ mod big_tests {
struct LVal { struct LVal {
val: uint, val: uint,
key: &self/fn(@uint), key: &'self fn(@uint),
} }
impl Drop for LVal/&self { impl Drop for LVal/&self {
@ -1190,16 +1190,16 @@ mod big_tests {
} }
impl Ord for LVal/&self { impl Ord for LVal/&self {
pure fn lt(&self, other: &a/LVal/&self) -> bool { pure fn lt(&self, other: &'a LVal/&self) -> bool {
(*self).val < other.val (*self).val < other.val
} }
pure fn le(&self, other: &a/LVal/&self) -> bool { pure fn le(&self, other: &'a LVal/&self) -> bool {
(*self).val <= other.val (*self).val <= other.val
} }
pure fn gt(&self, other: &a/LVal/&self) -> bool { pure fn gt(&self, other: &'a LVal/&self) -> bool {
(*self).val > other.val (*self).val > other.val
} }
pure fn ge(&self, other: &a/LVal/&self) -> bool { pure fn ge(&self, other: &'a LVal/&self) -> bool {
(*self).val >= other.val (*self).val >= other.val
} }
} }

View file

@ -30,7 +30,7 @@ pub trait Stats {
fn median_abs_dev_pct(self) -> f64; fn median_abs_dev_pct(self) -> f64;
} }
impl Stats for &self/[f64] { impl Stats for &'self [f64] {
fn sum(self) -> f64 { fn sum(self) -> f64 {
vec::foldl(0.0, self, |p,q| p + *q) vec::foldl(0.0, self, |p,q| p + *q)
} }

View file

@ -165,7 +165,7 @@ pub impl Sem<~[Waitqueue]> {
#[doc(hidden)] #[doc(hidden)]
type SemRelease = SemReleaseGeneric/&self<()>; type SemRelease = SemReleaseGeneric/&self<()>;
type SemAndSignalRelease = SemReleaseGeneric/&self<~[Waitqueue]>; type SemAndSignalRelease = SemReleaseGeneric/&self<~[Waitqueue]>;
struct SemReleaseGeneric<Q> { sem: &self/Sem<Q> } struct SemReleaseGeneric<Q> { sem: &'self Sem<Q> }
impl<Q:Owned> Drop for SemReleaseGeneric/&self<Q> { impl<Q:Owned> Drop for SemReleaseGeneric/&self<Q> {
fn finalize(&self) { fn finalize(&self) {
@ -173,13 +173,13 @@ impl<Q:Owned> Drop for SemReleaseGeneric/&self<Q> {
} }
} }
fn SemRelease(sem: &r/Sem<()>) -> SemRelease/&r { fn SemRelease(sem: &'r Sem<()>) -> SemRelease/&r {
SemReleaseGeneric { SemReleaseGeneric {
sem: sem sem: sem
} }
} }
fn SemAndSignalRelease(sem: &r/Sem<~[Waitqueue]>) fn SemAndSignalRelease(sem: &'r Sem<~[Waitqueue]>)
-> SemAndSignalRelease/&r { -> SemAndSignalRelease/&r {
SemReleaseGeneric { SemReleaseGeneric {
sem: sem sem: sem
@ -187,7 +187,7 @@ fn SemAndSignalRelease(sem: &r/Sem<~[Waitqueue]>)
} }
/// A mechanism for atomic-unlock-and-deschedule blocking and signalling. /// A mechanism for atomic-unlock-and-deschedule blocking and signalling.
pub struct Condvar { priv sem: &self/Sem<~[Waitqueue]> } pub struct Condvar { priv sem: &'self Sem<~[Waitqueue]> }
impl Drop for Condvar/&self { fn finalize(&self) {} } impl Drop for Condvar/&self { fn finalize(&self) {} }
@ -258,7 +258,7 @@ pub impl Condvar/&self {
// mutex during unwinding. As long as the wrapper (mutex, etc) is // mutex during unwinding. As long as the wrapper (mutex, etc) is
// bounded in when it gets released, this shouldn't hang forever. // bounded in when it gets released, this shouldn't hang forever.
struct SemAndSignalReacquire { struct SemAndSignalReacquire {
sem: &self/Sem<~[Waitqueue]>, sem: &'self Sem<~[Waitqueue]>,
} }
impl Drop for SemAndSignalReacquire/&self { impl Drop for SemAndSignalReacquire/&self {
@ -272,7 +272,7 @@ pub impl Condvar/&self {
} }
} }
fn SemAndSignalReacquire(sem: &r/Sem<~[Waitqueue]>) fn SemAndSignalReacquire(sem: &'r Sem<~[Waitqueue]>)
-> SemAndSignalReacquire/&r { -> SemAndSignalReacquire/&r {
SemAndSignalReacquire { SemAndSignalReacquire {
sem: sem sem: sem
@ -610,7 +610,7 @@ pub impl RWlock {
// FIXME(#3588) should go inside of read() // FIXME(#3588) should go inside of read()
#[doc(hidden)] #[doc(hidden)]
struct RWlockReleaseRead { struct RWlockReleaseRead {
lock: &self/RWlock, lock: &'self RWlock,
} }
impl Drop for RWlockReleaseRead/&self { impl Drop for RWlockReleaseRead/&self {
@ -635,7 +635,7 @@ impl Drop for RWlockReleaseRead/&self {
} }
} }
fn RWlockReleaseRead(lock: &r/RWlock) -> RWlockReleaseRead/&r { fn RWlockReleaseRead(lock: &'r RWlock) -> RWlockReleaseRead/&r {
RWlockReleaseRead { RWlockReleaseRead {
lock: lock lock: lock
} }
@ -644,7 +644,7 @@ fn RWlockReleaseRead(lock: &r/RWlock) -> RWlockReleaseRead/&r {
// FIXME(#3588) should go inside of downgrade() // FIXME(#3588) should go inside of downgrade()
#[doc(hidden)] #[doc(hidden)]
struct RWlockReleaseDowngrade { struct RWlockReleaseDowngrade {
lock: &self/RWlock, lock: &'self RWlock,
} }
impl Drop for RWlockReleaseDowngrade/&self { impl Drop for RWlockReleaseDowngrade/&self {
@ -677,18 +677,18 @@ impl Drop for RWlockReleaseDowngrade/&self {
} }
} }
fn RWlockReleaseDowngrade(lock: &r/RWlock) -> RWlockReleaseDowngrade/&r { fn RWlockReleaseDowngrade(lock: &'r RWlock) -> RWlockReleaseDowngrade/&r {
RWlockReleaseDowngrade { RWlockReleaseDowngrade {
lock: lock lock: lock
} }
} }
/// The "write permission" token used for rwlock.write_downgrade(). /// The "write permission" token used for rwlock.write_downgrade().
pub struct RWlockWriteMode { priv lock: &self/RWlock } pub struct RWlockWriteMode { priv lock: &'self RWlock }
impl Drop for RWlockWriteMode/&self { fn finalize(&self) {} } impl Drop for RWlockWriteMode/&self { fn finalize(&self) {} }
/// The "read permission" token used for rwlock.write_downgrade(). /// The "read permission" token used for rwlock.write_downgrade().
pub struct RWlockReadMode { priv lock: &self/RWlock } pub struct RWlockReadMode { priv lock: &'self RWlock }
impl Drop for RWlockReadMode/&self { fn finalize(&self) {} } impl Drop for RWlockReadMode/&self { fn finalize(&self) {} }
pub impl RWlockWriteMode/&self { pub impl RWlockWriteMode/&self {

View file

@ -49,7 +49,7 @@ pub mod rustrt {
// hierarchically it may. // hierarchically it may.
pub enum TestName { pub enum TestName {
StaticTestName(&static/str), StaticTestName(&'static str),
DynTestName(~str) DynTestName(~str)
} }
impl ToStr for TestName { impl ToStr for TestName {

View file

@ -88,7 +88,7 @@ impl<K: Ord + TotalOrd, V> Ord for TreeMap<K, V> {
impl<'self, K: TotalOrd, V> BaseIter<(&'self K, &'self V)> for TreeMap<K, V> { impl<'self, K: TotalOrd, V> BaseIter<(&'self K, &'self V)> for TreeMap<K, V> {
/// Visit all key-value pairs in order /// Visit all key-value pairs in order
pure fn each(&self, f: &fn(&(&self/K, &self/V)) -> bool) { pure fn each(&self, f: &fn(&(&'self K, &'self V)) -> bool) {
each(&self.root, f) each(&self.root, f)
} }
pure fn size_hint(&self) -> Option<uint> { Some(self.len()) } pure fn size_hint(&self) -> Option<uint> { Some(self.len()) }
@ -99,7 +99,7 @@ impl<'self, K: TotalOrd, V>
for TreeMap<K, V> for TreeMap<K, V>
{ {
/// Visit all key-value pairs in reverse order /// Visit all key-value pairs in reverse order
pure fn each_reverse(&self, f: &fn(&(&self/K, &self/V)) -> bool) { pure fn each_reverse(&self, f: &fn(&(&'self K, &'self V)) -> bool) {
each_reverse(&self.root, f); each_reverse(&self.root, f);
} }
} }
@ -140,8 +140,8 @@ impl<K: TotalOrd, V> Map<K, V> for TreeMap<K, V> {
} }
/// Return the value corresponding to the key in the map /// Return the value corresponding to the key in the map
pure fn find(&self, key: &K) -> Option<&self/V> { pure fn find(&self, key: &K) -> Option<&'self V> {
let mut current: &self/Option<~TreeNode<K, V>> = &self.root; let mut current: &'self Option<~TreeNode<K, V>> = &self.root;
loop { loop {
match *current { match *current {
Some(ref r) => { Some(ref r) => {
@ -197,15 +197,15 @@ pub impl<K: TotalOrd, V> TreeMap<K, V> {
/// Lazy forward iterator over a map /// Lazy forward iterator over a map
pub struct TreeMapIterator<K, V> { pub struct TreeMapIterator<K, V> {
priv stack: ~[&self/~TreeNode<K, V>], priv stack: ~[&'self ~TreeNode<K, V>],
priv node: &self/Option<~TreeNode<K, V>> priv node: &'self Option<~TreeNode<K, V>>
} }
/// Advance the iterator to the next node (in order) and return a /// Advance the iterator to the next node (in order) and return a
/// tuple with a reference to the key and value. If there are no /// tuple with a reference to the key and value. If there are no
/// more nodes, return `None`. /// more nodes, return `None`.
pub fn map_next<K, V>(iter: &mut TreeMapIterator/&r<K, V>) pub fn map_next<K, V>(iter: &mut TreeMapIterator/&r<K, V>)
-> Option<(&r/K, &r/V)> { -> Option<(&'r K, &'r V)> {
while !iter.stack.is_empty() || iter.node.is_some() { while !iter.stack.is_empty() || iter.node.is_some() {
match *iter.node { match *iter.node {
Some(ref x) => { Some(ref x) => {
@ -224,7 +224,7 @@ pub fn map_next<K, V>(iter: &mut TreeMapIterator/&r<K, V>)
/// Advance the iterator through the map /// Advance the iterator through the map
pub fn map_advance<K, V>(iter: &mut TreeMapIterator/&r<K, V>, pub fn map_advance<K, V>(iter: &mut TreeMapIterator/&r<K, V>,
f: &fn((&r/K, &r/V)) -> bool) { f: &fn((&'r K, &'r V)) -> bool) {
loop { loop {
match map_next(iter) { match map_next(iter) {
Some(x) => { Some(x) => {
@ -519,14 +519,14 @@ pub struct TreeSetIterator<T> {
/// Advance the iterator to the next node (in order). If this iterator is /// Advance the iterator to the next node (in order). If this iterator is
/// finished, does nothing. /// finished, does nothing.
#[inline(always)] #[inline(always)]
pub fn set_next<T>(iter: &mut TreeSetIterator/&r<T>) -> Option<&r/T> { pub fn set_next<T>(iter: &mut TreeSetIterator/&r<T>) -> Option<&'r T> {
do map_next(&mut iter.iter).map |&(value, _)| { value } do map_next(&mut iter.iter).map |&(value, _)| { value }
} }
/// Advance the iterator through the set /// Advance the iterator through the set
#[inline(always)] #[inline(always)]
pub fn set_advance<T>(iter: &mut TreeSetIterator/&r<T>, pub fn set_advance<T>(iter: &mut TreeSetIterator/&r<T>,
f: &fn(&r/T) -> bool) { f: &fn(&'r T) -> bool) {
do map_advance(&mut iter.iter) |(k, _)| { f(k) } do map_advance(&mut iter.iter) |(k, _)| { f(k) }
} }
@ -547,16 +547,16 @@ pub impl<K: TotalOrd, V> TreeNode<K, V> {
} }
} }
pure fn each<K: TotalOrd, V>(node: &r/Option<~TreeNode<K, V>>, pure fn each<K: TotalOrd, V>(node: &'r Option<~TreeNode<K, V>>,
f: &fn(&(&r/K, &r/V)) -> bool) { f: &fn(&(&'r K, &'r V)) -> bool) {
for node.each |x| { for node.each |x| {
each(&x.left, f); each(&x.left, f);
if f(&(&x.key, &x.value)) { each(&x.right, f) } if f(&(&x.key, &x.value)) { each(&x.right, f) }
} }
} }
pure fn each_reverse<K: TotalOrd, V>(node: &r/Option<~TreeNode<K, V>>, pure fn each_reverse<K: TotalOrd, V>(node: &'r Option<~TreeNode<K, V>>,
f: &fn(&(&r/K, &r/V)) -> bool) { f: &fn(&(&'r K, &'r V)) -> bool) {
for node.each |x| { for node.each |x| {
each_reverse(&x.right, f); each_reverse(&x.right, f);
if f(&(&x.key, &x.value)) { each_reverse(&x.left, f) } if f(&(&x.key, &x.value)) { each_reverse(&x.left, f) }

View file

@ -421,7 +421,7 @@ pub fn get_exprs_from_tts(cx: @ext_ctxt, tts: &[ast::token_tree])
// use a top-level managed pointer by some difficulties // use a top-level managed pointer by some difficulties
// with pushing and popping functionally, and the ownership // with pushing and popping functionally, and the ownership
// issues. As a result, the values returned by the table // issues. As a result, the values returned by the table
// also need to be managed; the &self/... type that Maps // also need to be managed; the &'self ... type that Maps
// return won't work for things that need to get outside // return won't work for things that need to get outside
// of that managed pointer. The easiest way to do this // of that managed pointer. The easiest way to do this
// is just to insist that the values in the tables are // is just to insist that the values in the tables are
@ -454,7 +454,7 @@ impl <K: Eq + Hash + IterBytes ,V: Copy> MapChain<K,V>{
// ugh: can't get this to compile with mut because of the // ugh: can't get this to compile with mut because of the
// lack of flow sensitivity. // lack of flow sensitivity.
fn get_map(&self) -> &self/LinearMap<K,@V> { fn get_map(&self) -> &'self LinearMap<K,@V> {
match *self { match *self {
BaseMapChain (~ref map) => map, BaseMapChain (~ref map) => map,
ConsMapChain (~ref map,_) => map ConsMapChain (~ref map,_) => map

View file

@ -45,12 +45,12 @@ pub impl Junction {
} }
} }
type ExpandDerivingStructDefFn = &self/fn(@ext_ctxt, type ExpandDerivingStructDefFn = &'self fn(@ext_ctxt,
span, span,
x: &struct_def, x: &struct_def,
ident, ident,
y: &Generics) -> @item; y: &Generics) -> @item;
type ExpandDerivingEnumDefFn = &self/fn(@ext_ctxt, type ExpandDerivingEnumDefFn = &'self fn(@ext_ctxt,
span, span,
x: &enum_def, x: &enum_def,
ident, ident,

View file

@ -392,6 +392,12 @@ fn mk_token(cx: @ext_ctxt, sp: span, tok: token::Token) -> @ast::expr {
build::mk_lit(cx, sp, ast::lit_bool(b))]); build::mk_lit(cx, sp, ast::lit_bool(b))]);
} }
LIFETIME(ident) => {
return build::mk_call(cx, sp,
ids_ext(cx, ~[~"LIFETIME"]),
~[mk_ident(cx, sp, ident)]);
}
DOC_COMMENT(ident) => { DOC_COMMENT(ident) => {
return build::mk_call(cx, sp, return build::mk_call(cx, sp,
ids_ext(cx, ~[~"DOC_COMMENT"]), ids_ext(cx, ~[~"DOC_COMMENT"]),

View file

@ -61,7 +61,7 @@ impl<T> OptVec<T> {
} }
} }
pure fn get(&self, i: uint) -> &self/T { pure fn get(&self, i: uint) -> &'self T {
match *self { match *self {
Empty => fail!(fmt!("Invalid index %u", i)), Empty => fail!(fmt!("Invalid index %u", i)),
Vec(ref v) => &v[i] Vec(ref v) => &v[i]

View file

@ -708,7 +708,7 @@ pub impl Parser {
} }
fn parse_borrowed_pointee(&self) -> ty_ { fn parse_borrowed_pointee(&self) -> ty_ {
// look for `&'lt` or `&foo/` and interpret `foo` as the region name: // look for `&'lt` or `&'foo ` and interpret `foo` as the region name:
let opt_lifetime = self.parse_opt_lifetime(); let opt_lifetime = self.parse_opt_lifetime();
if self.token_is_closure_keyword(&copy *self.token) { if self.token_is_closure_keyword(&copy *self.token) {

View file

@ -11,6 +11,6 @@
pub extern fn bar() { pub extern fn bar() {
} }
pub const foopy: &static/str = "hi there"; pub const foopy: &'static str = "hi there";
pub const uint_val: uint = 12; pub const uint_val: uint = 12;
pub const uint_expr: uint = (1 << uint_val) - 1; pub const uint_expr: uint = (1 << uint_val) - 1;

View file

@ -8,8 +8,8 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
fn foo(x: @int) -> @fn() -> &static/int { fn foo(x: @int) -> @fn() -> &'static int {
let result: @fn() -> &static/int = || &*x; //~ ERROR illegal borrow let result: @fn() -> &'static int = || &*x; //~ ERROR illegal borrow
result result
} }

View file

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
const a: &static/str = &"foo"; const a: &'static str = &"foo";
const b: *u8 = a as *u8; //~ ERROR non-scalar cast const b: *u8 = a as *u8; //~ ERROR non-scalar cast
const c: *u8 = &a as *u8; //~ ERROR mismatched types const c: *u8 = &a as *u8; //~ ERROR mismatched types

View file

@ -22,6 +22,6 @@ impl<A> vec_monad<A> for ~[A] {
} }
fn main() { fn main() {
["hi"].bind(|x| [x] ); ["hi"].bind(|x| [x] );
//~^ ERROR type `[&static/str * 1]` does not implement any method in scope named `bind` //~^ ERROR type `[&'static str * 1]` does not implement any method in scope named `bind`
//~^^ ERROR Unconstrained region variable //~^^ ERROR Unconstrained region variable
} }

View file

@ -9,7 +9,7 @@
// except according to those terms. // except according to those terms.
// xfail-test // xfail-test
fn foo() -> &a/int { fn foo() -> &'a int {
return &x; return &x;
} }
const x: int = 5; const x: int = 5;

View file

@ -10,7 +10,7 @@
// xfail-test // xfail-test
fn function() -> &mut [int] { fn function() -> &mut [int] {
let mut x: &static/mut [int] = &[1,2,3]; let mut x: &'static mut [int] = &[1,2,3];
x[0] = 12345; x[0] = 12345;
x //~ ERROR bad x //~ ERROR bad
} }

View file

@ -15,7 +15,7 @@ struct Foo {
} }
pub impl Foo<'self> { pub impl Foo<'self> {
fn get_s(&self) -> &self/str { fn get_s(&self) -> &'self str {
self.s self.s
} }
} }

View file

@ -10,7 +10,7 @@
trait A { trait A {
fn a(&self) { fn a(&self) {
|| self.b() //~ ERROR type `&self/self` does not implement any method in scope named `b` || self.b() //~ ERROR type `&'self self` does not implement any method in scope named `b`
} }
} }
fn main() {} fn main() {}

View file

@ -10,7 +10,7 @@
// n.b. This should be a run-pass test, but for now I'm testing // n.b. This should be a run-pass test, but for now I'm testing
// that we don't see an "unknown scope" error. // that we don't see an "unknown scope" error.
fn vec_peek<T>(v: &r/[T]) -> Option< (&r/T, &r/[T]) > { fn vec_peek<T>(v: &'r [T]) -> Option< (&'r T, &'r [T]) > {
if v.len() == 0 { if v.len() == 0 {
None None
} else { } else {

View file

@ -11,7 +11,7 @@
// xfail-test // xfail-test
fn id<T>(t: T) -> T { t } fn id<T>(t: T) -> T { t }
fn f<T>(v: &r/T) -> &r/fn()->T { id::<&r/fn()->T>(|| *v) } //~ ERROR ??? fn f<T>(v: &'r T) -> &'r fn()->T { id::<&'r fn()->T>(|| *v) } //~ ERROR ???
fn main() { fn main() {
let v = &5; let v = &5;

View file

@ -10,7 +10,7 @@
fn foopy() {} fn foopy() {}
const f: &'static fn() = foopy; //~ ERROR mismatched types: expected `&static/fn()` const f: &'static fn() = foopy; //~ ERROR mismatched types: expected `&'static fn()`
fn main () { fn main () {
f(); f();

View file

@ -21,10 +21,10 @@ fn repeater<A:Copy>(v: @A) -> @repeat<A> {
fn main() { fn main() {
// Error results because the type of is inferred to be // Error results because the type of is inferred to be
// @repeat<&blk/int> where blk is the lifetime of the block below. // @repeat<&'blk int> where blk is the lifetime of the block below.
let y = { //~ ERROR reference is not valid let y = { //~ ERROR reference is not valid
let x: &blk/int = &3; let x: &'blk int = &3;
repeater(@x) repeater(@x)
}; };
fail_unless!(3 == *(y.get())); //~ ERROR reference is not valid fail_unless!(3 == *(y.get())); //~ ERROR reference is not valid

View file

@ -12,7 +12,7 @@
// except according to those terms. // except according to those terms.
// A dummy trait/impl that work close over any type. The trait will // A dummy trait/impl that work close over any type. The trait will
// be parameterized by a region due to the &self/int constraint. // be parameterized by a region due to the &'self int constraint.
trait foo { trait foo {
fn foo(&self, i: &'self int) -> int; fn foo(&self, i: &'self int) -> int;

View file

@ -14,12 +14,12 @@ struct dog {
pub impl dog { pub impl dog {
fn chase_cat(&mut self) { fn chase_cat(&mut self) {
let p: &static/mut uint = &mut self.cats_chased; //~ ERROR cannot infer an appropriate lifetime due to conflicting requirements let p: &'static mut uint = &mut self.cats_chased; //~ ERROR cannot infer an appropriate lifetime due to conflicting requirements
*p += 1u; *p += 1u;
} }
fn chase_cat_2(&mut self) { fn chase_cat_2(&mut self) {
let p: &blk/mut uint = &mut self.cats_chased; let p: &'blk mut uint = &mut self.cats_chased;
*p += 1u; *p += 1u;
} }
} }

View file

@ -10,13 +10,13 @@
fn foo(cond: bool) { fn foo(cond: bool) {
let x = 5; let x = 5;
let mut y: &blk/int = &x; let mut y: &'blk int = &x;
let mut z: &blk/int; let mut z: &'blk int;
if cond { if cond {
z = &x; //~ ERROR cannot infer an appropriate lifetime due to conflicting requirements z = &x; //~ ERROR cannot infer an appropriate lifetime due to conflicting requirements
} else { } else {
let w: &blk/int = &x; let w: &'blk int = &x;
z = w; z = w;
} }
} }

View file

@ -11,7 +11,7 @@
fn of<T>() -> @fn(T) { fail!(); } fn of<T>() -> @fn(T) { fail!(); }
fn subtype<T>(x: @fn(T)) { fail!(); } fn subtype<T>(x: @fn(T)) { fail!(); }
fn test_fn<T>(_x: &x/T, _y: &y/T, _z: &z/T) { fn test_fn<T>(_x: &'x T, _y: &'y T, _z: &'z T) {
// Here, x, y, and z are free. Other letters // Here, x, y, and z are free. Other letters
// are bound. Note that the arrangement // are bound. Note that the arrangement
// subtype::<T1>(of::<T2>()) will typecheck // subtype::<T1>(of::<T2>()) will typecheck

View file

@ -11,47 +11,47 @@
fn of<T>() -> @fn(T) { fail!(); } fn of<T>() -> @fn(T) { fail!(); }
fn subtype<T>(x: @fn(T)) { fail!(); } fn subtype<T>(x: @fn(T)) { fail!(); }
fn test_fn<T>(_x: &x/T, _y: &y/T, _z: &z/T) { fn test_fn<T>(_x: &'x T, _y: &'y T, _z: &'z T) {
// Here, x, y, and z are free. Other letters // Here, x, y, and z are free. Other letters
// are bound. Note that the arrangement // are bound. Note that the arrangement
// subtype::<T1>(of::<T2>()) will typecheck // subtype::<T1>(of::<T2>()) will typecheck
// iff T1 <: T2. // iff T1 <: T2.
subtype::<&fn(&a/T)>( subtype::<&fn(&'a T)>(
of::<&fn(&a/T)>()); of::<&fn(&'a T)>());
subtype::<&fn(&a/T)>( subtype::<&fn(&'a T)>(
of::<&fn(&b/T)>()); of::<&fn(&'b T)>());
subtype::<&fn(&b/T)>( subtype::<&fn(&'b T)>(
of::<&fn(&x/T)>()); of::<&fn(&'x T)>());
subtype::<&fn(&x/T)>( subtype::<&fn(&'x T)>(
of::<&fn(&b/T)>()); //~ ERROR mismatched types of::<&fn(&'b T)>()); //~ ERROR mismatched types
subtype::<&fn(&a/T, &b/T)>( subtype::<&fn(&'a T, &'b T)>(
of::<&fn(&a/T, &a/T)>()); of::<&fn(&'a T, &'a T)>());
subtype::<&fn(&a/T, &a/T)>( subtype::<&fn(&'a T, &'a T)>(
of::<&fn(&a/T, &b/T)>()); //~ ERROR mismatched types of::<&fn(&'a T, &'b T)>()); //~ ERROR mismatched types
subtype::<&fn(&a/T, &b/T)>( subtype::<&fn(&'a T, &'b T)>(
of::<&fn(&x/T, &y/T)>()); of::<&fn(&'x T, &'y T)>());
subtype::<&fn(&x/T, &y/T)>( subtype::<&fn(&'x T, &'y T)>(
of::<&fn(&a/T, &b/T)>()); //~ ERROR mismatched types of::<&fn(&'a T, &'b T)>()); //~ ERROR mismatched types
subtype::<&fn(&x/T) -> @fn(&a/T)>( subtype::<&fn(&'x T) -> @fn(&'a T)>(
of::<&fn(&x/T) -> @fn(&a/T)>()); of::<&fn(&'x T) -> @fn(&'a T)>());
subtype::<&fn(&a/T) -> @fn(&a/T)>( subtype::<&fn(&'a T) -> @fn(&'a T)>(
of::<&fn(&a/T) -> @fn(&b/T)>()); //~ ERROR mismatched types of::<&fn(&'a T) -> @fn(&'b T)>()); //~ ERROR mismatched types
subtype::<&fn(&a/T) -> @fn(&a/T)>( subtype::<&fn(&'a T) -> @fn(&'a T)>(
of::<&fn(&x/T) -> @fn(&b/T)>()); //~ ERROR mismatched types of::<&fn(&'x T) -> @fn(&'b T)>()); //~ ERROR mismatched types
subtype::<&fn(&a/T) -> @fn(&b/T)>( subtype::<&fn(&'a T) -> @fn(&'b T)>(
of::<&fn(&a/T) -> @fn(&a/T)>()); of::<&fn(&'a T) -> @fn(&'a T)>());
} }
fn main() {} fn main() {}

View file

@ -11,8 +11,8 @@
// Before fn subtyping was properly implemented, // Before fn subtyping was properly implemented,
// we reported errors in this case: // we reported errors in this case:
fn not_ok(a: &uint, b: &b/uint) { fn not_ok(a: &uint, b: &'b uint) {
let mut g: @fn(x: &uint) = |x: &b/uint| {}; let mut g: @fn(x: &uint) = |x: &'b uint| {};
//~^ ERROR mismatched types //~^ ERROR mismatched types
g(a); g(a);
} }

View file

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
fn wants_static_fn(_x: &static/fn()) {} fn wants_static_fn(_x: &'static fn()) {}
fn main() { fn main() {
let i = 3; let i = 3;

View file

@ -13,7 +13,7 @@ struct point {
y: int, y: int,
} }
fn x_coord(p: &r/point) -> &r/int { fn x_coord(p: &'r point) -> &'r int {
return &p.x; return &p.x;
} }

View file

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
fn borrow<T>(x: &r/T) -> &r/T {x} fn borrow<T>(x: &'r T) -> &'r T {x}
fn foo(cond: &fn() -> bool, box: &fn() -> @int) { fn foo(cond: &fn() -> bool, box: &fn() -> @int) {
let mut y: &int; let mut y: &int;

View file

@ -8,13 +8,13 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
fn select(x: &r/int, y: &r/int) -> &r/int { x } fn select(x: &'r int, y: &'r int) -> &'r int { x }
fn with<T>(f: &fn(x: &int) -> T) -> T { fn with<T>(f: &fn(x: &int) -> T) -> T {
f(&20) f(&20)
} }
fn manip(x: &a/int) -> int { fn manip(x: &'a int) -> int {
let z = do with |y| { select(x, y) }; let z = do with |y| { select(x, y) };
//~^ ERROR cannot infer an appropriate lifetime //~^ ERROR cannot infer an appropriate lifetime
*z *z

Some files were not shown because too many files have changed in this diff Show more