Skip to content

Commit 40148be

Browse files
committed
Add #[may_dangle] to RawIntoIter
Also adds PhantomData<T> to RawTable and RawIntoIter
1 parent 83052e9 commit 40148be

File tree

3 files changed

+43
-13
lines changed

3 files changed

+43
-13
lines changed

src/external_trait_impls/rayon/raw.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ pub struct RawParDrain<'a, T> {
8484
// We don't use a &'a mut RawTable<T> because we want RawParDrain to be
8585
// covariant over T.
8686
table: NonNull<RawTable<T>>,
87-
_marker: PhantomData<&'a RawTable<T>>,
87+
marker: PhantomData<&'a RawTable<T>>,
8888
}
8989

9090
unsafe impl<T> Send for RawParDrain<'_, T> {}
@@ -187,7 +187,7 @@ impl<T> RawTable<T> {
187187
pub fn par_drain(&mut self) -> RawParDrain<'_, T> {
188188
RawParDrain {
189189
table: NonNull::from(self),
190-
_marker: PhantomData,
190+
marker: PhantomData,
191191
}
192192
}
193193
}

src/map.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ impl<K, V, S> HashMap<K, V, S>
422422
unsafe {
423423
Iter {
424424
inner: self.table.iter(),
425-
_marker: PhantomData,
425+
marker: PhantomData,
426426
}
427427
}
428428
}
@@ -456,7 +456,7 @@ impl<K, V, S> HashMap<K, V, S>
456456
unsafe {
457457
IterMut {
458458
inner: self.table.iter(),
459-
_marker: PhantomData,
459+
marker: PhantomData,
460460
}
461461
}
462462
}
@@ -1090,7 +1090,7 @@ where
10901090
/// [`HashMap`]: struct.HashMap.html
10911091
pub struct Iter<'a, K, V> {
10921092
inner: RawIter<(K, V)>,
1093-
_marker: PhantomData<(&'a K, &'a V)>,
1093+
marker: PhantomData<(&'a K, &'a V)>,
10941094
}
10951095

10961096
// FIXME(#26925) Remove in favor of `#[derive(Clone)]`
@@ -1099,7 +1099,7 @@ impl<K, V> Clone for Iter<'_, K, V> {
10991099
fn clone(&self) -> Self {
11001100
Iter {
11011101
inner: self.inner.clone(),
1102-
_marker: PhantomData,
1102+
marker: PhantomData,
11031103
}
11041104
}
11051105
}
@@ -1120,7 +1120,7 @@ impl<K: Debug, V: Debug> fmt::Debug for Iter<'_, K, V> {
11201120
pub struct IterMut<'a, K, V> {
11211121
inner: RawIter<(K, V)>,
11221122
// To ensure invariance with respect to V
1123-
_marker: PhantomData<(&'a K, &'a mut V)>,
1123+
marker: PhantomData<(&'a K, &'a mut V)>,
11241124
}
11251125

11261126
impl<K, V> IterMut<'_, K, V> {
@@ -1129,7 +1129,7 @@ impl<K, V> IterMut<'_, K, V> {
11291129
pub(super) fn iter(&self) -> Iter<'_, K, V> {
11301130
Iter {
11311131
inner: self.inner.clone(),
1132-
_marker: PhantomData,
1132+
marker: PhantomData,
11331133
}
11341134
}
11351135
}
@@ -1151,7 +1151,7 @@ impl<K, V> IntoIter<K, V> {
11511151
pub(super) fn iter(&self) -> Iter<'_, K, V> {
11521152
Iter {
11531153
inner: self.inner.iter(),
1154-
_marker: PhantomData,
1154+
marker: PhantomData,
11551155
}
11561156
}
11571157
}
@@ -1227,7 +1227,7 @@ impl<K, V> Drain<'_, K, V> {
12271227
pub(super) fn iter(&self) -> Iter<'_, K, V> {
12281228
Iter {
12291229
inner: self.inner.iter(),
1230-
_marker: PhantomData,
1230+
marker: PhantomData,
12311231
}
12321232
}
12331233
}

src/raw/mod.rs

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,9 @@ pub struct RawTable<T> {
343343

344344
// Number of elements in the table, only really used by len()
345345
items: usize,
346+
347+
// Tell dropck that we own instances of T.
348+
marker: PhantomData<T>,
346349
}
347350

348351
impl<T> RawTable<T> {
@@ -359,6 +362,7 @@ impl<T> RawTable<T> {
359362
bucket_mask: 0,
360363
items: 0,
361364
growth_left: 0,
365+
marker: PhantomData,
362366
}
363367
}
364368

@@ -380,6 +384,7 @@ impl<T> RawTable<T> {
380384
bucket_mask: buckets - 1,
381385
items: 0,
382386
growth_left: bucket_mask_to_capacity(buckets - 1),
387+
marker: PhantomData,
383388
})
384389
}
385390

@@ -922,7 +927,7 @@ impl<T> RawTable<T> {
922927
iter: self.iter(),
923928
table: ManuallyDrop::new(mem::replace(self, Self::new())),
924929
orig_table: NonNull::from(self),
925-
_marker: PhantomData,
930+
marker: PhantomData,
926931
}
927932
}
928933

@@ -1039,7 +1044,11 @@ impl<T> IntoIterator for RawTable<T> {
10391044
unsafe {
10401045
let iter = self.iter();
10411046
let alloc = self.into_alloc();
1042-
RawIntoIter { iter, alloc }
1047+
RawIntoIter {
1048+
iter,
1049+
alloc,
1050+
marker: PhantomData,
1051+
}
10431052
}
10441053
}
10451054
}
@@ -1229,6 +1238,7 @@ impl<T> FusedIterator for RawIter<T> {}
12291238
pub struct RawIntoIter<T> {
12301239
iter: RawIter<T>,
12311240
alloc: Option<(NonNull<u8>, Layout)>,
1241+
marker: PhantomData<T>,
12321242
}
12331243

12341244
impl<T> RawIntoIter<T> {
@@ -1241,6 +1251,26 @@ impl<T> RawIntoIter<T> {
12411251
unsafe impl<T> Send for RawIntoIter<T> where T: Send {}
12421252
unsafe impl<T> Sync for RawIntoIter<T> where T: Sync {}
12431253

1254+
#[cfg(feature = "nightly")]
1255+
unsafe impl<#[may_dangle] T> Drop for RawIntoIter<T> {
1256+
#[inline]
1257+
fn drop(&mut self) {
1258+
unsafe {
1259+
// Drop all remaining elements
1260+
if mem::needs_drop::<T>() {
1261+
while let Some(item) = self.iter.next() {
1262+
item.drop();
1263+
}
1264+
}
1265+
1266+
// Free the table
1267+
if let Some((ptr, layout)) = self.alloc {
1268+
dealloc(ptr.as_ptr(), layout);
1269+
}
1270+
}
1271+
}
1272+
}
1273+
#[cfg(not(feature = "nightly"))]
12441274
impl<T> Drop for RawIntoIter<T> {
12451275
#[inline]
12461276
fn drop(&mut self) {
@@ -1289,7 +1319,7 @@ pub struct RawDrain<'a, T> {
12891319

12901320
// We don't use a &'a mut RawTable<T> because we want RawDrain to be
12911321
// covariant over T.
1292-
_marker: PhantomData<&'a RawTable<T>>,
1322+
marker: PhantomData<&'a RawTable<T>>,
12931323
}
12941324

12951325
impl<T> RawDrain<'_, T> {

0 commit comments

Comments
 (0)