Skip to content

Commit 2678637

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

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
@@ -347,7 +347,7 @@ impl<K, V, S> HashMap<K, V, S> {
347347
unsafe {
348348
Iter {
349349
inner: self.table.iter(),
350-
_marker: PhantomData,
350+
marker: PhantomData,
351351
}
352352
}
353353
}
@@ -381,7 +381,7 @@ impl<K, V, S> HashMap<K, V, S> {
381381
unsafe {
382382
IterMut {
383383
inner: self.table.iter(),
384-
_marker: PhantomData,
384+
marker: PhantomData,
385385
}
386386
}
387387
}
@@ -1092,7 +1092,7 @@ where
10921092
/// [`HashMap`]: struct.HashMap.html
10931093
pub struct Iter<'a, K, V> {
10941094
inner: RawIter<(K, V)>,
1095-
_marker: PhantomData<(&'a K, &'a V)>,
1095+
marker: PhantomData<(&'a K, &'a V)>,
10961096
}
10971097

10981098
// FIXME(#26925) Remove in favor of `#[derive(Clone)]`
@@ -1101,7 +1101,7 @@ impl<K, V> Clone for Iter<'_, K, V> {
11011101
fn clone(&self) -> Self {
11021102
Iter {
11031103
inner: self.inner.clone(),
1104-
_marker: PhantomData,
1104+
marker: PhantomData,
11051105
}
11061106
}
11071107
}
@@ -1122,7 +1122,7 @@ impl<K: Debug, V: Debug> fmt::Debug for Iter<'_, K, V> {
11221122
pub struct IterMut<'a, K, V> {
11231123
inner: RawIter<(K, V)>,
11241124
// To ensure invariance with respect to V
1125-
_marker: PhantomData<(&'a K, &'a mut V)>,
1125+
marker: PhantomData<(&'a K, &'a mut V)>,
11261126
}
11271127

11281128
impl<K, V> IterMut<'_, K, V> {
@@ -1131,7 +1131,7 @@ impl<K, V> IterMut<'_, K, V> {
11311131
pub(super) fn iter(&self) -> Iter<'_, K, V> {
11321132
Iter {
11331133
inner: self.inner.clone(),
1134-
_marker: PhantomData,
1134+
marker: PhantomData,
11351135
}
11361136
}
11371137
}
@@ -1153,7 +1153,7 @@ impl<K, V> IntoIter<K, V> {
11531153
pub(super) fn iter(&self) -> Iter<'_, K, V> {
11541154
Iter {
11551155
inner: self.inner.iter(),
1156-
_marker: PhantomData,
1156+
marker: PhantomData,
11571157
}
11581158
}
11591159
}
@@ -1229,7 +1229,7 @@ impl<K, V> Drain<'_, K, V> {
12291229
pub(super) fn iter(&self) -> Iter<'_, K, V> {
12301230
Iter {
12311231
inner: self.inner.iter(),
1232-
_marker: PhantomData,
1232+
marker: PhantomData,
12331233
}
12341234
}
12351235
}

src/raw/mod.rs

+33-3
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,9 @@ pub struct RawTable<T> {
336336

337337
// Number of elements in the table, only really used by len()
338338
items: usize,
339+
340+
// Tell dropck that we own instances of T.
341+
marker: PhantomData<T>,
339342
}
340343

341344
impl<T> RawTable<T> {
@@ -352,6 +355,7 @@ impl<T> RawTable<T> {
352355
bucket_mask: 0,
353356
items: 0,
354357
growth_left: 0,
358+
marker: PhantomData,
355359
}
356360
}
357361

@@ -373,6 +377,7 @@ impl<T> RawTable<T> {
373377
bucket_mask: buckets - 1,
374378
items: 0,
375379
growth_left: bucket_mask_to_capacity(buckets - 1),
380+
marker: PhantomData,
376381
})
377382
}
378383

@@ -915,7 +920,7 @@ impl<T> RawTable<T> {
915920
iter: self.iter(),
916921
table: ManuallyDrop::new(mem::replace(self, Self::new())),
917922
orig_table: NonNull::from(self),
918-
_marker: PhantomData,
923+
marker: PhantomData,
919924
}
920925
}
921926

@@ -1032,7 +1037,11 @@ impl<T> IntoIterator for RawTable<T> {
10321037
unsafe {
10331038
let iter = self.iter();
10341039
let alloc = self.into_alloc();
1035-
RawIntoIter { iter, alloc }
1040+
RawIntoIter {
1041+
iter,
1042+
alloc,
1043+
marker: PhantomData,
1044+
}
10361045
}
10371046
}
10381047
}
@@ -1225,6 +1234,7 @@ impl<T> FusedIterator for RawIter<T> {}
12251234
pub struct RawIntoIter<T> {
12261235
iter: RawIter<T>,
12271236
alloc: Option<(NonNull<u8>, Layout)>,
1237+
marker: PhantomData<T>,
12281238
}
12291239

12301240
impl<T> RawIntoIter<T> {
@@ -1237,6 +1247,26 @@ impl<T> RawIntoIter<T> {
12371247
unsafe impl<T> Send for RawIntoIter<T> where T: Send {}
12381248
unsafe impl<T> Sync for RawIntoIter<T> where T: Sync {}
12391249

1250+
#[cfg(feature = "nightly")]
1251+
unsafe impl<#[may_dangle] T> Drop for RawIntoIter<T> {
1252+
#[inline]
1253+
fn drop(&mut self) {
1254+
unsafe {
1255+
// Drop all remaining elements
1256+
if mem::needs_drop::<T>() {
1257+
while let Some(item) = self.iter.next() {
1258+
item.drop();
1259+
}
1260+
}
1261+
1262+
// Free the table
1263+
if let Some((ptr, layout)) = self.alloc {
1264+
dealloc(ptr.as_ptr(), layout);
1265+
}
1266+
}
1267+
}
1268+
}
1269+
#[cfg(not(feature = "nightly"))]
12401270
impl<T> Drop for RawIntoIter<T> {
12411271
#[inline]
12421272
fn drop(&mut self) {
@@ -1285,7 +1315,7 @@ pub struct RawDrain<'a, T> {
12851315

12861316
// We don't use a &'a mut RawTable<T> because we want RawDrain to be
12871317
// covariant over T.
1288-
_marker: PhantomData<&'a RawTable<T>>,
1318+
marker: PhantomData<&'a RawTable<T>>,
12891319
}
12901320

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

0 commit comments

Comments
 (0)