Skip to content

Commit f9bcc42

Browse files
committed
Add #[may_dangle] to RawIntoIter
Also adds PhantomData<T> to RawTable and RawIntoIter
1 parent b11f8cd commit f9bcc42

File tree

3 files changed

+43
-13
lines changed

3 files changed

+43
-13
lines changed

src/external_trait_impls/rayon/raw.rs

+2-2
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

+8-8
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ impl<K, V, S> HashMap<K, V, S> {
421421
unsafe {
422422
Iter {
423423
inner: self.table.iter(),
424-
_marker: PhantomData,
424+
marker: PhantomData,
425425
}
426426
}
427427
}
@@ -455,7 +455,7 @@ impl<K, V, S> HashMap<K, V, S> {
455455
unsafe {
456456
IterMut {
457457
inner: self.table.iter(),
458-
_marker: PhantomData,
458+
marker: PhantomData,
459459
}
460460
}
461461
}
@@ -1089,7 +1089,7 @@ where
10891089
/// [`HashMap`]: struct.HashMap.html
10901090
pub struct Iter<'a, K, V> {
10911091
inner: RawIter<(K, V)>,
1092-
_marker: PhantomData<(&'a K, &'a V)>,
1092+
marker: PhantomData<(&'a K, &'a V)>,
10931093
}
10941094

10951095
// FIXME(#26925) Remove in favor of `#[derive(Clone)]`
@@ -1098,7 +1098,7 @@ impl<K, V> Clone for Iter<'_, K, V> {
10981098
fn clone(&self) -> Self {
10991099
Iter {
11001100
inner: self.inner.clone(),
1101-
_marker: PhantomData,
1101+
marker: PhantomData,
11021102
}
11031103
}
11041104
}
@@ -1119,7 +1119,7 @@ impl<K: Debug, V: Debug> fmt::Debug for Iter<'_, K, V> {
11191119
pub struct IterMut<'a, K, V> {
11201120
inner: RawIter<(K, V)>,
11211121
// To ensure invariance with respect to V
1122-
_marker: PhantomData<(&'a K, &'a mut V)>,
1122+
marker: PhantomData<(&'a K, &'a mut V)>,
11231123
}
11241124

11251125
impl<K, V> IterMut<'_, K, V> {
@@ -1128,7 +1128,7 @@ impl<K, V> IterMut<'_, K, V> {
11281128
pub(super) fn iter(&self) -> Iter<'_, K, V> {
11291129
Iter {
11301130
inner: self.inner.clone(),
1131-
_marker: PhantomData,
1131+
marker: PhantomData,
11321132
}
11331133
}
11341134
}
@@ -1150,7 +1150,7 @@ impl<K, V> IntoIter<K, V> {
11501150
pub(super) fn iter(&self) -> Iter<'_, K, V> {
11511151
Iter {
11521152
inner: self.inner.iter(),
1153-
_marker: PhantomData,
1153+
marker: PhantomData,
11541154
}
11551155
}
11561156
}
@@ -1226,7 +1226,7 @@ impl<K, V> Drain<'_, K, V> {
12261226
pub(super) fn iter(&self) -> Iter<'_, K, V> {
12271227
Iter {
12281228
inner: self.inner.iter(),
1229-
_marker: PhantomData,
1229+
marker: PhantomData,
12301230
}
12311231
}
12321232
}

src/raw/mod.rs

+33-3
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)