@@ -333,12 +333,12 @@ impl<T: ?Sized> Rc<T> {
333333 unsafe { self . ptr . as_ref ( ) }
334334 }
335335
336- fn from_inner ( ptr : NonNull < RcBox < T > > ) -> Self {
336+ unsafe fn from_inner ( ptr : NonNull < RcBox < T > > ) -> Self {
337337 Self { ptr, phantom : PhantomData }
338338 }
339339
340340 unsafe fn from_ptr ( ptr : * mut RcBox < T > ) -> Self {
341- Self :: from_inner ( unsafe { NonNull :: new_unchecked ( ptr) } )
341+ unsafe { Self :: from_inner ( NonNull :: new_unchecked ( ptr) ) }
342342 }
343343}
344344
@@ -359,9 +359,11 @@ impl<T> Rc<T> {
359359 // pointers, which ensures that the weak destructor never frees
360360 // the allocation while the strong destructor is running, even
361361 // if the weak pointer is stored inside the strong one.
362- Self :: from_inner (
363- Box :: leak ( box RcBox { strong : Cell :: new ( 1 ) , weak : Cell :: new ( 1 ) , value } ) . into ( ) ,
364- )
362+ unsafe {
363+ Self :: from_inner (
364+ Box :: leak ( box RcBox { strong : Cell :: new ( 1 ) , weak : Cell :: new ( 1 ) , value } ) . into ( ) ,
365+ )
366+ }
365367 }
366368
367369 /// Constructs a new `Rc<T>` using a weak reference to itself. Attempting
@@ -412,16 +414,16 @@ impl<T> Rc<T> {
412414 // otherwise.
413415 let data = data_fn ( & weak) ;
414416
415- unsafe {
417+ let strong = unsafe {
416418 let inner = init_ptr. as_ptr ( ) ;
417419 ptr:: write ( ptr:: addr_of_mut!( ( * inner) . value) , data) ;
418420
419421 let prev_value = ( * inner) . strong . get ( ) ;
420422 debug_assert_eq ! ( prev_value, 0 , "No prior strong references should exist" ) ;
421423 ( * inner) . strong . set ( 1 ) ;
422- }
423424
424- let strong = Rc :: from_inner ( init_ptr) ;
425+ Rc :: from_inner ( init_ptr)
426+ } ;
425427
426428 // Strong references should collectively own a shared weak reference,
427429 // so don't run the destructor for our old weak reference.
@@ -511,10 +513,12 @@ impl<T> Rc<T> {
511513 // pointers, which ensures that the weak destructor never frees
512514 // the allocation while the strong destructor is running, even
513515 // if the weak pointer is stored inside the strong one.
514- Ok ( Self :: from_inner (
515- Box :: leak ( Box :: try_new ( RcBox { strong : Cell :: new ( 1 ) , weak : Cell :: new ( 1 ) , value } ) ?)
516- . into ( ) ,
517- ) )
516+ unsafe {
517+ Ok ( Self :: from_inner (
518+ Box :: leak ( Box :: try_new ( RcBox { strong : Cell :: new ( 1 ) , weak : Cell :: new ( 1 ) , value } ) ?)
519+ . into ( ) ,
520+ ) )
521+ }
518522 }
519523
520524 /// Constructs a new `Rc` with uninitialized contents, returning an error if the allocation fails
@@ -733,7 +737,7 @@ impl<T> Rc<mem::MaybeUninit<T>> {
733737 #[ unstable( feature = "new_uninit" , issue = "63291" ) ]
734738 #[ inline]
735739 pub unsafe fn assume_init ( self ) -> Rc < T > {
736- Rc :: from_inner ( mem:: ManuallyDrop :: new ( self ) . ptr . cast ( ) )
740+ unsafe { Rc :: from_inner ( mem:: ManuallyDrop :: new ( self ) . ptr . cast ( ) ) }
737741 }
738742}
739743
@@ -1199,9 +1203,11 @@ impl Rc<dyn Any> {
11991203 /// ```
12001204 pub fn downcast < T : Any > ( self ) -> Result < Rc < T > , Rc < dyn Any > > {
12011205 if ( * self ) . is :: < T > ( ) {
1202- let ptr = self . ptr . cast :: < RcBox < T > > ( ) ;
1203- forget ( self ) ;
1204- Ok ( Rc :: from_inner ( ptr) )
1206+ unsafe {
1207+ let ptr = self . ptr . cast :: < RcBox < T > > ( ) ;
1208+ forget ( self ) ;
1209+ Ok ( Rc :: from_inner ( ptr) )
1210+ }
12051211 } else {
12061212 Err ( self )
12071213 }
@@ -1474,8 +1480,10 @@ impl<T: ?Sized> Clone for Rc<T> {
14741480 /// ```
14751481 #[ inline]
14761482 fn clone ( & self ) -> Rc < T > {
1477- self . inner ( ) . inc_strong ( ) ;
1478- Self :: from_inner ( self . ptr )
1483+ unsafe {
1484+ self . inner ( ) . inc_strong ( ) ;
1485+ Self :: from_inner ( self . ptr )
1486+ }
14791487 }
14801488}
14811489
@@ -2225,11 +2233,14 @@ impl<T: ?Sized> Weak<T> {
22252233 #[ stable( feature = "rc_weak" , since = "1.4.0" ) ]
22262234 pub fn upgrade ( & self ) -> Option < Rc < T > > {
22272235 let inner = self . inner ( ) ?;
2236+
22282237 if inner. strong ( ) == 0 {
22292238 None
22302239 } else {
2231- inner. inc_strong ( ) ;
2232- Some ( Rc :: from_inner ( self . ptr ) )
2240+ unsafe {
2241+ inner. inc_strong ( ) ;
2242+ Some ( Rc :: from_inner ( self . ptr ) )
2243+ }
22332244 }
22342245 }
22352246
0 commit comments