@@ -49,15 +49,15 @@ const READ_COUNT_MASK: usize = !(ONE_READ - 1);
4949/// #
5050/// # })
5151/// ```
52- pub struct RwLock < T > {
52+ pub struct RwLock < T : ? Sized > {
5353 state : AtomicUsize ,
5454 read_wakers : WakerSet ,
5555 write_wakers : WakerSet ,
5656 value : UnsafeCell < T > ,
5757}
5858
59- unsafe impl < T : Send > Send for RwLock < T > { }
60- unsafe impl < T : Send + Sync > Sync for RwLock < T > { }
59+ unsafe impl < T : ? Sized + Send > Send for RwLock < T > { }
60+ unsafe impl < T : ? Sized + Send + Sync > Sync for RwLock < T > { }
6161
6262impl < T > RwLock < T > {
6363 /// Creates a new reader-writer lock.
@@ -77,7 +77,9 @@ impl<T> RwLock<T> {
7777 value : UnsafeCell :: new ( t) ,
7878 }
7979 }
80+ }
8081
82+ impl < T : ?Sized > RwLock < T > {
8183 /// Acquires a read lock.
8284 ///
8385 /// Returns a guard that releases the lock when dropped.
@@ -316,7 +318,7 @@ impl<T> RwLock<T> {
316318 /// let lock = RwLock::new(10);
317319 /// assert_eq!(lock.into_inner(), 10);
318320 /// ```
319- pub fn into_inner ( self ) -> T {
321+ pub fn into_inner ( self ) -> T where T : Sized {
320322 self . value . into_inner ( )
321323 }
322324
@@ -343,7 +345,7 @@ impl<T> RwLock<T> {
343345 }
344346}
345347
346- impl < T : fmt:: Debug > fmt:: Debug for RwLock < T > {
348+ impl < T : ? Sized + fmt:: Debug > fmt:: Debug for RwLock < T > {
347349 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
348350 struct Locked ;
349351 impl fmt:: Debug for Locked {
@@ -365,19 +367,19 @@ impl<T> From<T> for RwLock<T> {
365367 }
366368}
367369
368- impl < T : Default > Default for RwLock < T > {
370+ impl < T : ? Sized + Default > Default for RwLock < T > {
369371 fn default ( ) -> RwLock < T > {
370372 RwLock :: new ( Default :: default ( ) )
371373 }
372374}
373375
374376/// A guard that releases the read lock when dropped.
375- pub struct RwLockReadGuard < ' a , T > ( & ' a RwLock < T > ) ;
377+ pub struct RwLockReadGuard < ' a , T : ? Sized > ( & ' a RwLock < T > ) ;
376378
377- unsafe impl < T : Send > Send for RwLockReadGuard < ' _ , T > { }
378- unsafe impl < T : Sync > Sync for RwLockReadGuard < ' _ , T > { }
379+ unsafe impl < T : ? Sized + Send > Send for RwLockReadGuard < ' _ , T > { }
380+ unsafe impl < T : ? Sized + Sync > Sync for RwLockReadGuard < ' _ , T > { }
379381
380- impl < T > Drop for RwLockReadGuard < ' _ , T > {
382+ impl < T : ? Sized > Drop for RwLockReadGuard < ' _ , T > {
381383 fn drop ( & mut self ) {
382384 let state = self . 0 . state . fetch_sub ( ONE_READ , Ordering :: SeqCst ) ;
383385
@@ -388,19 +390,19 @@ impl<T> Drop for RwLockReadGuard<'_, T> {
388390 }
389391}
390392
391- impl < T : fmt:: Debug > fmt:: Debug for RwLockReadGuard < ' _ , T > {
393+ impl < T : ? Sized + fmt:: Debug > fmt:: Debug for RwLockReadGuard < ' _ , T > {
392394 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
393395 fmt:: Debug :: fmt ( & * * self , f)
394396 }
395397}
396398
397- impl < T : fmt:: Display > fmt:: Display for RwLockReadGuard < ' _ , T > {
399+ impl < T : ? Sized + fmt:: Display > fmt:: Display for RwLockReadGuard < ' _ , T > {
398400 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
399401 ( * * self ) . fmt ( f)
400402 }
401403}
402404
403- impl < T > Deref for RwLockReadGuard < ' _ , T > {
405+ impl < T : ? Sized > Deref for RwLockReadGuard < ' _ , T > {
404406 type Target = T ;
405407
406408 fn deref ( & self ) -> & T {
@@ -409,12 +411,12 @@ impl<T> Deref for RwLockReadGuard<'_, T> {
409411}
410412
411413/// A guard that releases the write lock when dropped.
412- pub struct RwLockWriteGuard < ' a , T > ( & ' a RwLock < T > ) ;
414+ pub struct RwLockWriteGuard < ' a , T : ? Sized > ( & ' a RwLock < T > ) ;
413415
414- unsafe impl < T : Send > Send for RwLockWriteGuard < ' _ , T > { }
415- unsafe impl < T : Sync > Sync for RwLockWriteGuard < ' _ , T > { }
416+ unsafe impl < T : ? Sized + Send > Send for RwLockWriteGuard < ' _ , T > { }
417+ unsafe impl < T : ? Sized + Sync > Sync for RwLockWriteGuard < ' _ , T > { }
416418
417- impl < T > Drop for RwLockWriteGuard < ' _ , T > {
419+ impl < T : ? Sized > Drop for RwLockWriteGuard < ' _ , T > {
418420 fn drop ( & mut self ) {
419421 self . 0 . state . store ( 0 , Ordering :: SeqCst ) ;
420422
@@ -427,27 +429,27 @@ impl<T> Drop for RwLockWriteGuard<'_, T> {
427429 }
428430}
429431
430- impl < T : fmt:: Debug > fmt:: Debug for RwLockWriteGuard < ' _ , T > {
432+ impl < T : ? Sized + fmt:: Debug > fmt:: Debug for RwLockWriteGuard < ' _ , T > {
431433 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
432434 fmt:: Debug :: fmt ( & * * self , f)
433435 }
434436}
435437
436- impl < T : fmt:: Display > fmt:: Display for RwLockWriteGuard < ' _ , T > {
438+ impl < T : ? Sized + fmt:: Display > fmt:: Display for RwLockWriteGuard < ' _ , T > {
437439 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
438440 ( * * self ) . fmt ( f)
439441 }
440442}
441443
442- impl < T > Deref for RwLockWriteGuard < ' _ , T > {
444+ impl < T : ? Sized > Deref for RwLockWriteGuard < ' _ , T > {
443445 type Target = T ;
444446
445447 fn deref ( & self ) -> & T {
446448 unsafe { & * self . 0 . value . get ( ) }
447449 }
448450}
449451
450- impl < T > DerefMut for RwLockWriteGuard < ' _ , T > {
452+ impl < T : ? Sized > DerefMut for RwLockWriteGuard < ' _ , T > {
451453 fn deref_mut ( & mut self ) -> & mut T {
452454 unsafe { & mut * self . 0 . value . get ( ) }
453455 }
0 commit comments