/// let mut vec: Vec<i32> = Vec::new();
/// ```
#[inline]
- #[rustc_const_stable(feature = "const_vec_new", since = "1.32.0")]
+ #[rustc_const_stable(feature = "const_vec_new", since = "1.39.0")]
#[stable(feature = "rust1", since = "1.0.0")]
pub const fn new() -> Vec<T> {
Vec { buf: RawVec::NEW, len: 0 }
#[stable(feature = "rust1", since = "1.0.0")]
unsafe impl<#[may_dangle] T> Drop for IntoIter<T> {
fn drop(&mut self) {
+ struct DropGuard<'a, T>(&'a mut IntoIter<T>);
+
+ impl<T> Drop for DropGuard<'_, T> {
+ fn drop(&mut self) {
+ // RawVec handles deallocation
+ let _ = unsafe { RawVec::from_raw_parts(self.0.buf.as_ptr(), self.0.cap) };
+ }
+ }
+
+ let guard = DropGuard(self);
// destroy the remaining elements
unsafe {
- ptr::drop_in_place(self.as_mut_slice());
+ ptr::drop_in_place(guard.0.as_mut_slice());
}
-
- // RawVec handles deallocation
- let _ = unsafe { RawVec::from_raw_parts(self.buf.as_ptr(), self.cap) };
+ // now `guard` will be dropped and do the rest
}
}
/// The filter test predicate.
pred: F,
/// A flag that indicates a panic has occurred in the filter test prodicate.
- /// This is used as a hint in the drop implmentation to prevent consumption
+ /// This is used as a hint in the drop implementation to prevent consumption
/// of the remainder of the `DrainFilter`. Any unprocessed items will be
/// backshifted in the `vec`, but no further items will be dropped or
/// tested by the filter predicate.