From 33db2d65ffd5b988fdedc8ed91b395abaa57f777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B0=D0=BB=D0=B5=D1=80=D0=B8=D0=B9=20=D0=9B=D0=B0?= =?UTF-8?q?=D1=88=D0=BC=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Thu, 31 Mar 2016 10:11:59 -0400 Subject: [PATCH] added missing refcell ref/refmut coercions to unsized --- src/libcore/cell.rs | 10 ++++++++-- src/libcoretest/cell.rs | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/libcore/cell.rs b/src/libcore/cell.rs index fdd2e3a178499..aa02d982b5265 100644 --- a/src/libcore/cell.rs +++ b/src/libcore/cell.rs @@ -147,8 +147,8 @@ use clone::Clone; use cmp::{PartialEq, Eq}; use default::Default; -use marker::{Copy, Send, Sync, Sized}; -use ops::{Deref, DerefMut, Drop, FnOnce}; +use marker::{Copy, Send, Sync, Sized, Unsize}; +use ops::{Deref, DerefMut, Drop, FnOnce, CoerceUnsized}; use option::Option; use option::Option::{None, Some}; @@ -638,6 +638,9 @@ impl<'b, T: ?Sized> Ref<'b, T> { } } +#[unstable(feature = "coerce_unsized", issue = "27732")] +impl<'b, T: ?Sized + Unsize, U: ?Sized> CoerceUnsized> for Ref<'b, T> {} + impl<'b, T: ?Sized> RefMut<'b, T> { /// Make a new `RefMut` for a component of the borrowed data, e.g. an enum /// variant. @@ -770,6 +773,9 @@ impl<'b, T: ?Sized> DerefMut for RefMut<'b, T> { } } +#[unstable(feature = "coerce_unsized", issue = "27732")] +impl<'b, T: ?Sized + Unsize, U: ?Sized> CoerceUnsized> for RefMut<'b, T> {} + /// The core primitive for interior mutability in Rust. /// /// `UnsafeCell` is a type that wraps some `T` and indicates unsafe interior operations on the diff --git a/src/libcoretest/cell.rs b/src/libcoretest/cell.rs index cafffb5266f91..c0b22274ee9d6 100644 --- a/src/libcoretest/cell.rs +++ b/src/libcoretest/cell.rs @@ -261,3 +261,23 @@ fn refcell_unsized() { let comp: &mut [i32] = &mut [4, 2, 5]; assert_eq!(&*cell.borrow(), comp); } + +#[test] +fn refcell_ref_coercion() { + let cell: RefCell<[i32; 3]> = RefCell::new([1, 2, 3]); + { + let mut cellref: RefMut<[i32; 3]> = cell.borrow_mut(); + cellref[0] = 4; + let mut coerced: RefMut<[i32]> = cellref; + coerced[2] = 5; + } + { + let comp: &mut [i32] = &mut [4, 2, 5]; + let cellref: Ref<[i32; 3]> = cell.borrow(); + assert_eq!(&*cellref, comp); + let coerced: Ref<[i32]> = cellref; + assert_eq!(&*coerced, comp); + } +} + +