144144use clone:: Clone ;
145145use cmp:: PartialEq ;
146146use default:: Default ;
147- use marker:: { Copy , Send , Sync } ;
147+ use marker:: { Copy , Send , Sync , Sized } ;
148148use ops:: { Deref , DerefMut , Drop } ;
149149use option:: Option ;
150150use option:: Option :: { None , Some } ;
@@ -266,9 +266,9 @@ impl<T:PartialEq + Copy> PartialEq for Cell<T> {
266266///
267267/// See the [module-level documentation](index.html) for more.
268268#[ stable( feature = "rust1" , since = "1.0.0" ) ]
269- pub struct RefCell < T > {
270- value : UnsafeCell < T > ,
269+ pub struct RefCell < T : ?Sized > {
271270 borrow : Cell < BorrowFlag > ,
271+ value : UnsafeCell < T > ,
272272}
273273
274274/// An enumeration of values returned from the `state` method on a `RefCell<T>`.
@@ -328,7 +328,9 @@ impl<T> RefCell<T> {
328328 debug_assert ! ( self . borrow. get( ) == UNUSED ) ;
329329 unsafe { self . value . into_inner ( ) }
330330 }
331+ }
331332
333+ impl < T : ?Sized > RefCell < T > {
332334 /// Query the current state of this `RefCell`
333335 ///
334336 /// The returned value can be dispatched on to determine if a call to
@@ -449,7 +451,7 @@ impl<T> RefCell<T> {
449451}
450452
451453#[ stable( feature = "rust1" , since = "1.0.0" ) ]
452- unsafe impl < T > Send for RefCell < T > where T : Send { }
454+ unsafe impl < T : ? Sized > Send for RefCell < T > where T : Send { }
453455
454456#[ stable( feature = "rust1" , since = "1.0.0" ) ]
455457impl < T : Clone > Clone for RefCell < T > {
@@ -469,7 +471,7 @@ impl<T:Default> Default for RefCell<T> {
469471}
470472
471473#[ stable( feature = "rust1" , since = "1.0.0" ) ]
472- impl < T : PartialEq > PartialEq for RefCell < T > {
474+ impl < T : ? Sized + PartialEq > PartialEq for RefCell < T > {
473475 #[ inline]
474476 fn eq ( & self , other : & RefCell < T > ) -> bool {
475477 * self . borrow ( ) == * other. borrow ( )
@@ -519,15 +521,15 @@ impl<'b> Clone for BorrowRef<'b> {
519521///
520522/// See the [module-level documentation](index.html) for more.
521523#[ stable( feature = "rust1" , since = "1.0.0" ) ]
522- pub struct Ref < ' b , T : ' b > {
524+ pub struct Ref < ' b , T : ? Sized + ' b > {
523525 // FIXME #12808: strange name to try to avoid interfering with
524526 // field accesses of the contained type via Deref
525527 _value : & ' b T ,
526528 _borrow : BorrowRef < ' b > ,
527529}
528530
529531#[ stable( feature = "rust1" , since = "1.0.0" ) ]
530- impl < ' b , T > Deref for Ref < ' b , T > {
532+ impl < ' b , T : ? Sized > Deref for Ref < ' b , T > {
531533 type Target = T ;
532534
533535 #[ inline]
@@ -582,15 +584,15 @@ impl<'b> BorrowRefMut<'b> {
582584///
583585/// See the [module-level documentation](index.html) for more.
584586#[ stable( feature = "rust1" , since = "1.0.0" ) ]
585- pub struct RefMut < ' b , T : ' b > {
587+ pub struct RefMut < ' b , T : ? Sized + ' b > {
586588 // FIXME #12808: strange name to try to avoid interfering with
587589 // field accesses of the contained type via Deref
588590 _value : & ' b mut T ,
589591 _borrow : BorrowRefMut < ' b > ,
590592}
591593
592594#[ stable( feature = "rust1" , since = "1.0.0" ) ]
593- impl < ' b , T > Deref for RefMut < ' b , T > {
595+ impl < ' b , T : ? Sized > Deref for RefMut < ' b , T > {
594596 type Target = T ;
595597
596598 #[ inline]
@@ -600,7 +602,7 @@ impl<'b, T> Deref for RefMut<'b, T> {
600602}
601603
602604#[ stable( feature = "rust1" , since = "1.0.0" ) ]
603- impl < ' b , T > DerefMut for RefMut < ' b , T > {
605+ impl < ' b , T : ? Sized > DerefMut for RefMut < ' b , T > {
604606 #[ inline]
605607 fn deref_mut < ' a > ( & ' a mut self ) -> & ' a mut T {
606608 self . _value
@@ -633,7 +635,7 @@ impl<'b, T> DerefMut for RefMut<'b, T> {
633635/// recommended to access its fields directly, `get` should be used instead.
634636#[ lang="unsafe_cell" ]
635637#[ stable( feature = "rust1" , since = "1.0.0" ) ]
636- pub struct UnsafeCell < T > {
638+ pub struct UnsafeCell < T : ? Sized > {
637639 /// Wrapped value
638640 ///
639641 /// This field should not be accessed directly, it is made public for static
@@ -642,7 +644,7 @@ pub struct UnsafeCell<T> {
642644 pub value : T ,
643645}
644646
645- impl < T > !Sync for UnsafeCell < T > { }
647+ impl < T : ? Sized > !Sync for UnsafeCell < T > { }
646648
647649impl < T > UnsafeCell < T > {
648650 /// Constructs a new instance of `UnsafeCell` which will wrap the specified
@@ -664,7 +666,12 @@ impl<T> UnsafeCell<T> {
664666 UnsafeCell { value : value }
665667 }
666668
667- /// Gets a mutable pointer to the wrapped value.
669+ /// Unwraps the value.
670+ ///
671+ /// # Unsafety
672+ ///
673+ /// This function is unsafe because there is no guarantee that this or other threads are
674+ /// currently inspecting the inner value.
668675 ///
669676 /// # Examples
670677 ///
@@ -673,22 +680,15 @@ impl<T> UnsafeCell<T> {
673680 ///
674681 /// let uc = UnsafeCell::new(5);
675682 ///
676- /// let five = uc.get() ;
683+ /// let five = unsafe { uc.into_inner() } ;
677684 /// ```
678685 #[ inline]
679686 #[ stable( feature = "rust1" , since = "1.0.0" ) ]
680- pub fn get ( & self ) -> * mut T {
681- // FIXME(#23542) Replace with type ascription.
682- #![ allow( trivial_casts) ]
683- & self . value as * const T as * mut T
684- }
687+ pub unsafe fn into_inner ( self ) -> T { self . value }
688+ }
685689
686- /// Unwraps the value.
687- ///
688- /// # Unsafety
689- ///
690- /// This function is unsafe because there is no guarantee that this or other threads are
691- /// currently inspecting the inner value.
690+ impl < T : ?Sized > UnsafeCell < T > {
691+ /// Gets a mutable pointer to the wrapped value.
692692 ///
693693 /// # Examples
694694 ///
@@ -697,9 +697,14 @@ impl<T> UnsafeCell<T> {
697697 ///
698698 /// let uc = UnsafeCell::new(5);
699699 ///
700- /// let five = unsafe { uc.into_inner() } ;
700+ /// let five = uc.get() ;
701701 /// ```
702702 #[ inline]
703703 #[ stable( feature = "rust1" , since = "1.0.0" ) ]
704- pub unsafe fn into_inner ( self ) -> T { self . value }
704+ pub fn get ( & self ) -> * mut T {
705+ // FIXME(#23542) Replace with type ascription.
706+ #![ allow( trivial_casts) ]
707+ & self . value as * const T as * mut T
708+ }
709+
705710}
0 commit comments