diff --git a/src/libarena/lib.rs b/src/libarena/lib.rs index 924dd5ffed6..1528c313b73 100644 --- a/src/libarena/lib.rs +++ b/src/libarena/lib.rs @@ -208,13 +208,13 @@ impl Arena { } #[inline] - fn alloc_copy(&self, op: || -> T) -> &T { + fn alloc_copy(&self, op: || -> T) -> &mut T { unsafe { let ptr = self.alloc_copy_inner(mem::size_of::(), mem::min_align_of::()); let ptr = ptr as *mut T; ptr::write(&mut (*ptr), op()); - return &*ptr; + return &mut *ptr; } } @@ -262,7 +262,7 @@ impl Arena { } #[inline] - fn alloc_noncopy(&self, op: || -> T) -> &T { + fn alloc_noncopy(&self, op: || -> T) -> &mut T { unsafe { let tydesc = get_tydesc::(); let (ty_ptr, ptr) = @@ -279,14 +279,14 @@ impl Arena { // the object is there. *ty_ptr = bitpack_tydesc_ptr(tydesc, true); - return &*ptr; + return &mut *ptr; } } /// Allocates a new item in the arena, using `op` to initialize the value, /// and returns a reference to it. #[inline] - pub fn alloc(&self, op: || -> T) -> &T { + pub fn alloc(&self, op: || -> T) -> &mut T { unsafe { if intrinsics::needs_drop::() { self.alloc_noncopy(op) @@ -458,12 +458,12 @@ impl TypedArena { /// Allocates an object in the `TypedArena`, returning a reference to it. #[inline] - pub fn alloc(&self, object: T) -> &T { + pub fn alloc(&self, object: T) -> &mut T { if self.ptr == self.end { self.grow() } - let ptr: &T = unsafe { + let ptr: &mut T = unsafe { let ptr: &mut T = mem::transmute(self.ptr); ptr::write(ptr, object); self.ptr.set(self.ptr.get().offset(1)); diff --git a/src/librustc/middle/typeck/variance.rs b/src/librustc/middle/typeck/variance.rs index c8214a743de..b8c47cff48c 100644 --- a/src/librustc/middle/typeck/variance.rs +++ b/src/librustc/middle/typeck/variance.rs @@ -715,7 +715,7 @@ impl<'a, 'tcx> ConstraintContext<'a, 'tcx> { } _ => { - self.terms_cx.arena.alloc(|| TransformTerm(v1, v2)) + &*self.terms_cx.arena.alloc(|| TransformTerm(v1, v2)) } } }