diff options
author | bors <bors@rust-lang.org> | 2023-05-17 15:17:13 +0000 |
---|---|---|
committer | bors <bors@rust-lang.org> | 2023-05-17 15:17:13 +0000 |
commit | ad23942ad4079f779651983b262fa34c0beda701 (patch) | |
tree | c531783a8a7eecefef323d6a2fe2a3bd22d363ea /tests/ui/drop/issue-110682.rs | |
parent | c2ccc855e74aec03e434405eca3c247ee2432e53 (diff) | |
parent | b0d92c2b7060cf434fcc738b3fabf69410244cd3 (diff) | |
download | rust-ad23942ad4079f779651983b262fa34c0beda701.tar.gz |
Auto merge of #111680 - Dylan-DPC:rollup-1p45gxt, r=Dylan-DPC
Rollup of 6 pull requests
Successful merges:
- #110930 (Don't expect normalization to succeed in elaborate_drops)
- #111557 (Revert "Validate resolution for SelfCtor too.")
- #111565 (rustdoc-json: Add tests for visibility of impls)
- #111588 (Emits E0599 when meeting `MyTrait::missing_method`)
- #111625 (Move rustc_middle/src/ty/query.rs to rustc_middle/src/query/plumbing.rs)
- #111674 (Add missing backslash in HTML string)
Failed merges:
r? `@ghost`
`@rustbot` modify labels: rollup
Diffstat (limited to 'tests/ui/drop/issue-110682.rs')
-rw-r--r-- | tests/ui/drop/issue-110682.rs | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/tests/ui/drop/issue-110682.rs b/tests/ui/drop/issue-110682.rs new file mode 100644 index 00000000000..35f9c7e8d9b --- /dev/null +++ b/tests/ui/drop/issue-110682.rs @@ -0,0 +1,92 @@ +// build-pass +// compile-flags: -Zmir-opt-level=3 + +use std::fmt::Debug; +use std::mem::ManuallyDrop; +use std::ptr; + +pub trait BitRegister {} + +macro_rules! register { + ($($t:ty),+ $(,)?) => { $( + impl BitRegister for $t { + } + )* }; +} + +register!(u8, u16, u32); + +pub trait BitStore: Sized + Debug { + /// The register type that the implementor describes. + type Mem: BitRegister + Into<Self>; +} + +macro_rules! store { + ($($t:ty),+ $(,)?) => { $( + impl BitStore for $t { + type Mem = Self; + } + )+ }; +} + +store!(u8, u16, u32,); + +#[repr(C)] +pub struct BitVec<T> +where + T: BitStore, +{ + /// Region pointer describing the live portion of the owned buffer. + pointer: ptr::NonNull<T>, + /// Allocated capacity, in elements `T`, of the owned buffer. + capacity: usize, +} + +impl<T> BitVec<T> +where + T: BitStore, +{ + pub fn new() -> Self { + let pointer = ptr::NonNull::<T>::new(ptr::null_mut()).unwrap(); + + BitVec { pointer, capacity: 10 } + } + + pub fn clear(&mut self) { + unsafe { + self.set_len(0); + } + } + + #[inline] + pub unsafe fn set_len(&mut self, new_len: usize) {} + + fn with_vec<F, R>(&mut self, func: F) -> R + where + F: FnOnce(&mut ManuallyDrop<Vec<T::Mem>>) -> R, + { + let cap = self.capacity; + let elts = 10; + let mut vec = ManuallyDrop::new(unsafe { Vec::from_raw_parts(ptr::null_mut(), elts, cap) }); + let out = func(&mut vec); + + out + } +} + +impl<T> Drop for BitVec<T> +where + T: BitStore, +{ + #[inline] + fn drop(&mut self) { + // The buffer elements do not have destructors. + self.clear(); + // Run the `Vec` destructor to deƤllocate the buffer. + self.with_vec(|vec| unsafe { ManuallyDrop::drop(vec) }); + } +} + +fn main() { + let bitvec = BitVec::<u32>::new(); +} |