extern crate collections;
-use std::cast::{transmute, transmute_mut, transmute_mut_lifetime};
+use std::cast::{transmute, transmute_mut_lifetime};
use std::cast;
use std::cell::{Cell, RefCell};
use std::mem;
#[inline]
pub fn alloc<'a, T>(&'a self, op: || -> T) -> &'a T {
unsafe {
- // FIXME: Borrow check
- let this = transmute_mut(self);
+ // FIXME #13933: Remove/justify all `&T` to `&mut T` transmutes
+ let this: &mut Arena = transmute::<&_, &mut _>(self);
if intrinsics::needs_drop::<T>() {
this.alloc_noncopy(op)
} else {
#[inline]
pub fn alloc<'a>(&'a self, object: T) -> &'a T {
unsafe {
- let this = cast::transmute_mut(self);
+ // FIXME #13933: Remove/justify all `&T` to `&mut T` transmutes
+ let this: &mut TypedArena<T> = cast::transmute::<&_, &mut _>(self);
if this.ptr == this.end {
this.grow()
}
fn tell(&self) -> Result<u64, IoError> {
// This transmute is fine because our seek implementation doesn't
// actually use the mutable self at all.
- unsafe { cast::transmute_mut(self).seek(0, io::SeekCur) }
+ // FIXME #13933: Remove/justify all `&T` to `&mut T` transmutes
+ unsafe { cast::transmute::<&_, &mut FileDesc>(self).seek(0, io::SeekCur) }
}
fn fsync(&mut self) -> Result<(), IoError> {
fn tell(&self) -> Result<u64, IoError> {
use libc::SEEK_CUR;
// this is temporary
- let self_ = unsafe { cast::transmute_mut(self) };
+ // FIXME #13933: Remove/justify all `&T` to `&mut T` transmutes
+ let self_ = unsafe { cast::transmute::<&_, &mut FileWatcher>(self) };
self_.seek_common(0, SEEK_CUR)
}
fn fsync(&mut self) -> Result<(), IoError> {
/// Coerce an immutable reference to be mutable.
#[inline]
+#[deprecated="casting &T to &mut T is undefined behaviour: use Cell<T>, RefCell<T> or Unsafe<T>"]
pub unsafe fn transmute_mut<'a,T>(ptr: &'a T) -> &'a mut T { transmute(ptr) }
/// Coerce a reference to have an arbitrary associated lifetime.
mod shared;
mod sync;
+// FIXME #13933: Remove/justify all `&T` to `&mut T` transmutes
+unsafe fn transmute_mut<'a,T>(x: &'a T) -> &'a mut T {
+ cast::transmute::<&_, &mut _>(x)
+}
+
// Use a power of 2 to allow LLVM to optimize to something that's not a
// division, this is hit pretty regularly.
static RESCHED_FREQ: int = 256;
unsafe {
let mut tmp = Sender::new(Stream(new_inner));
- mem::swap(&mut cast::transmute_mut(self).inner, &mut tmp.inner);
+ mem::swap(&mut transmute_mut(self).inner, &mut tmp.inner);
}
return ret;
}
(*packet.get()).inherit_blocker(sleeper);
let mut tmp = Sender::new(Shared(packet.clone()));
- mem::swap(&mut cast::transmute_mut(self).inner, &mut tmp.inner);
+ mem::swap(&mut transmute_mut(self).inner, &mut tmp.inner);
}
Sender::new(Shared(packet))
}
}
};
unsafe {
- mem::swap(&mut cast::transmute_mut(self).inner,
+ mem::swap(&mut transmute_mut(self).inner,
&mut new_port.inner);
}
}
Sync(ref p) => return unsafe { (*p.get()).recv() }
};
unsafe {
- mem::swap(&mut cast::transmute_mut(self).inner,
+ mem::swap(&mut transmute_mut(self).inner,
&mut new_port.inner);
}
}
}
};
unsafe {
- mem::swap(&mut cast::transmute_mut(self).inner,
+ mem::swap(&mut transmute_mut(self).inner,
&mut new_port.inner);
}
}
};
task = t;
unsafe {
- mem::swap(&mut cast::transmute_mut(self).inner,
+ mem::swap(&mut transmute_mut(self).inner,
&mut new_port.inner);
}
}
let mut new_port = match result { Ok(b) => return b, Err(p) => p };
was_upgrade = true;
unsafe {
- mem::swap(&mut cast::transmute_mut(self).inner,
+ mem::swap(&mut transmute_mut(self).inner,
&mut new_port.inner);
}
}
match x {
None => f(None),
// We're violating a lot of compiler guarantees with this
- // invocation of `transmute_mut`, but we're doing runtime checks to
+ // invocation of `transmute`, but we're doing runtime checks to
// ensure that it's always valid (only one at a time).
//
// there is no need to be upset!
- Some(x) => { f(Some(unsafe { cast::transmute_mut(x) })) }
+ Some(x) => { f(Some(unsafe { cast::transmute::<&_, &mut _>(x) })) }
}
})
}
if self.len() == 0 { return None; }
unsafe {
let s: &mut Slice<T> = transmute(self);
- Some(cast::transmute_mut(&*raw::shift_ptr(s)))
+ // FIXME #13933: this `&` -> `&mut` cast is a little
+ // dubious
+ Some(&mut *(raw::shift_ptr(s) as *mut _))
}
}
if self.len() == 0 { return None; }
unsafe {
let s: &mut Slice<T> = transmute(self);
- Some(cast::transmute_mut(&*raw::pop_ptr(s)))
+ // FIXME #13933: this `&` -> `&mut` cast is a little
+ // dubious
+ Some(&mut *(raw::pop_ptr(s) as *mut _))
}
}
#[should_fail]
fn test_from_elem_fail() {
use cast;
+ use cell::Cell;
use rc::Rc;
struct S {
- f: int,
+ f: Cell<int>,
boxes: (~int, Rc<int>)
}
impl Clone for S {
fn clone(&self) -> S {
- let s = unsafe { cast::transmute_mut(self) };
- s.f += 1;
- if s.f == 10 { fail!() }
- S { f: s.f, boxes: s.boxes.clone() }
+ self.f.set(self.f.get() + 1);
+ if self.f.get() == 10 { fail!() }
+ S { f: self.f, boxes: self.boxes.clone() }
}
}
- let s = S { f: 0, boxes: (box 0, Rc::new(0)) };
+ let s = S { f: Cell::new(0), boxes: (box 0, Rc::new(0)) };
let _ = Vec::from_elem(100, s);
}
// reference count is guaranteed to be 1 at this point, and we required
// the Arc itself to be `mut`, so we're returning the only possible
// reference to the inner data.
- unsafe { cast::transmute_mut(self.deref()) }
+ unsafe { cast::transmute::<&_, &mut _>(self.deref()) }
}
}