Skip to content

Commit 7871bec

Browse files
committed
add test
1 parent 930c39a commit 7871bec

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed

tests/ui/drop/issue-110682.rs

+92
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
// build-pass
2+
// compile-flags: -Zmir-opt-level=3
3+
4+
use std::fmt::Debug;
5+
use std::mem::ManuallyDrop;
6+
use std::ptr;
7+
8+
pub trait BitRegister {}
9+
10+
macro_rules! register {
11+
($($t:ty),+ $(,)?) => { $(
12+
impl BitRegister for $t {
13+
}
14+
)* };
15+
}
16+
17+
register!(u8, u16, u32);
18+
19+
pub trait BitStore: Sized + Debug {
20+
/// The register type that the implementor describes.
21+
type Mem: BitRegister + Into<Self>;
22+
}
23+
24+
macro_rules! store {
25+
($($t:ty),+ $(,)?) => { $(
26+
impl BitStore for $t {
27+
type Mem = Self;
28+
}
29+
)+ };
30+
}
31+
32+
store!(u8, u16, u32,);
33+
34+
#[repr(C)]
35+
pub struct BitVec<T>
36+
where
37+
T: BitStore,
38+
{
39+
/// Region pointer describing the live portion of the owned buffer.
40+
pointer: ptr::NonNull<T>,
41+
/// Allocated capacity, in elements `T`, of the owned buffer.
42+
capacity: usize,
43+
}
44+
45+
impl<T> BitVec<T>
46+
where
47+
T: BitStore,
48+
{
49+
pub fn new() -> Self {
50+
let pointer = ptr::NonNull::<T>::new(ptr::null_mut()).unwrap();
51+
52+
BitVec { pointer, capacity: 10 }
53+
}
54+
55+
pub fn clear(&mut self) {
56+
unsafe {
57+
self.set_len(0);
58+
}
59+
}
60+
61+
#[inline]
62+
pub unsafe fn set_len(&mut self, new_len: usize) {}
63+
64+
fn with_vec<F, R>(&mut self, func: F) -> R
65+
where
66+
F: FnOnce(&mut ManuallyDrop<Vec<T::Mem>>) -> R,
67+
{
68+
let cap = self.capacity;
69+
let elts = 10;
70+
let mut vec = ManuallyDrop::new(unsafe { Vec::from_raw_parts(ptr::null_mut(), elts, cap) });
71+
let out = func(&mut vec);
72+
73+
out
74+
}
75+
}
76+
77+
impl<T> Drop for BitVec<T>
78+
where
79+
T: BitStore,
80+
{
81+
#[inline]
82+
fn drop(&mut self) {
83+
// The buffer elements do not have destructors.
84+
self.clear();
85+
// Run the `Vec` destructor to deällocate the buffer.
86+
self.with_vec(|vec| unsafe { ManuallyDrop::drop(vec) });
87+
}
88+
}
89+
90+
fn main() {
91+
let bitvec = BitVec::<u32>::new();
92+
}

0 commit comments

Comments
 (0)