diff options
| author | bors <bors@rust-lang.org> | 2018-08-14 08:32:59 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-08-14 08:32:59 +0000 |
| commit | 5bb923988f949639f11dba0c1ab1980fe8dfec3d (patch) | |
| tree | 7916ac62e655674abfafde761e925e472d08091c | |
| parent | a8763b5370ed044b6e703981217f074e8ddf1e7c (diff) | |
| parent | 5ee5a7eb5568011b29a9fee16b00e2b576603da3 (diff) | |
| download | rust-5bb923988f949639f11dba0c1ab1980fe8dfec3d.tar.gz rust-5bb923988f949639f11dba0c1ab1980fe8dfec3d.zip | |
Auto merge of #53033 - RalfJung:manually_dro, r=SimonSapin
unsized ManuallyDrop I think this matches what @eddyb had in https://github.com/rust-lang/rust/pull/52711 originally. ~~However, I have never added a `CoerceUnsized` before so I am not sure if I did this right. I copied the `unstable` attribute on the `impl` from elsewhere, but AFAIK it is useless because `impl`'s are insta-stable... so shouldn't this rather say "stable since 1.30"?~~ This is insta-stable and hence requires FCP, at least. Fixes https://github.com/rust-lang/rust/issues/47034
| -rw-r--r-- | src/libcore/mem.rs | 9 | ||||
| -rw-r--r-- | src/libcore/tests/manually_drop.rs | 5 |
2 files changed, 11 insertions, 3 deletions
diff --git a/src/libcore/mem.rs b/src/libcore/mem.rs index 8a74e7c6f1c..ea711c69393 100644 --- a/src/libcore/mem.rs +++ b/src/libcore/mem.rs @@ -956,7 +956,8 @@ pub fn discriminant<T>(v: &T) -> Discriminant<T> { #[stable(feature = "manually_drop", since = "1.20.0")] #[lang = "manually_drop"] #[derive(Copy, Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct ManuallyDrop<T> { +#[repr(transparent)] +pub struct ManuallyDrop<T: ?Sized> { value: T, } @@ -990,7 +991,9 @@ impl<T> ManuallyDrop<T> { pub fn into_inner(slot: ManuallyDrop<T>) -> T { slot.value } +} +impl<T: ?Sized> ManuallyDrop<T> { /// Manually drops the contained value. /// /// # Safety @@ -1006,7 +1009,7 @@ impl<T> ManuallyDrop<T> { } #[stable(feature = "manually_drop", since = "1.20.0")] -impl<T> Deref for ManuallyDrop<T> { +impl<T: ?Sized> Deref for ManuallyDrop<T> { type Target = T; #[inline] fn deref(&self) -> &Self::Target { @@ -1015,7 +1018,7 @@ impl<T> Deref for ManuallyDrop<T> { } #[stable(feature = "manually_drop", since = "1.20.0")] -impl<T> DerefMut for ManuallyDrop<T> { +impl<T: ?Sized> DerefMut for ManuallyDrop<T> { #[inline] fn deref_mut(&mut self) -> &mut Self::Target { &mut self.value diff --git a/src/libcore/tests/manually_drop.rs b/src/libcore/tests/manually_drop.rs index 96bc9247da6..82dfb8d4c0b 100644 --- a/src/libcore/tests/manually_drop.rs +++ b/src/libcore/tests/manually_drop.rs @@ -21,4 +21,9 @@ fn smoke() { let x = ManuallyDrop::new(TypeWithDrop); drop(x); + + // also test unsizing + let x : Box<ManuallyDrop<[TypeWithDrop]>> = + Box::new(ManuallyDrop::new([TypeWithDrop, TypeWithDrop])); + drop(x); } |
