Auto merge of #147042 - Noratrieb:untrack-caller-vec, r=tgross35
Remove most `#[track_caller]` from allocating Vec methods They cause significant binary size overhead while contributing little value. closes rust-lang/rust#146963, see that issue for more details.
This commit is contained in:
commit
c7f6aa2869
14 changed files with 1 additions and 122 deletions
|
|
@ -103,7 +103,6 @@ pub struct VecDeque<
|
|||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<T: Clone, A: Allocator + Clone> Clone for VecDeque<T, A> {
|
||||
#[track_caller]
|
||||
fn clone(&self) -> Self {
|
||||
let mut deq = Self::with_capacity_in(self.len(), self.allocator().clone());
|
||||
deq.extend(self.iter().cloned());
|
||||
|
|
@ -114,7 +113,6 @@ impl<T: Clone, A: Allocator + Clone> Clone for VecDeque<T, A> {
|
|||
///
|
||||
/// This method is preferred over simply assigning `source.clone()` to `self`,
|
||||
/// as it avoids reallocation if possible.
|
||||
#[track_caller]
|
||||
fn clone_from(&mut self, source: &Self) {
|
||||
self.clear();
|
||||
self.extend(source.iter().cloned());
|
||||
|
|
@ -577,7 +575,6 @@ impl<T> VecDeque<T> {
|
|||
#[inline]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[must_use]
|
||||
#[track_caller]
|
||||
pub fn with_capacity(capacity: usize) -> VecDeque<T> {
|
||||
Self::with_capacity_in(capacity, Global)
|
||||
}
|
||||
|
|
@ -633,7 +630,6 @@ impl<T, A: Allocator> VecDeque<T, A> {
|
|||
/// let deque: VecDeque<u32> = VecDeque::with_capacity(10);
|
||||
/// ```
|
||||
#[unstable(feature = "allocator_api", issue = "32838")]
|
||||
#[track_caller]
|
||||
pub fn with_capacity_in(capacity: usize, alloc: A) -> VecDeque<T, A> {
|
||||
VecDeque { head: 0, len: 0, buf: RawVec::with_capacity_in(capacity, alloc) }
|
||||
}
|
||||
|
|
@ -799,7 +795,6 @@ impl<T, A: Allocator> VecDeque<T, A> {
|
|||
///
|
||||
/// [`reserve`]: VecDeque::reserve
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[track_caller]
|
||||
pub fn reserve_exact(&mut self, additional: usize) {
|
||||
let new_cap = self.len.checked_add(additional).expect("capacity overflow");
|
||||
let old_cap = self.capacity();
|
||||
|
|
@ -830,7 +825,6 @@ impl<T, A: Allocator> VecDeque<T, A> {
|
|||
/// ```
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[cfg_attr(not(test), rustc_diagnostic_item = "vecdeque_reserve")]
|
||||
#[track_caller]
|
||||
pub fn reserve(&mut self, additional: usize) {
|
||||
let new_cap = self.len.checked_add(additional).expect("capacity overflow");
|
||||
let old_cap = self.capacity();
|
||||
|
|
@ -962,7 +956,6 @@ impl<T, A: Allocator> VecDeque<T, A> {
|
|||
/// assert!(buf.capacity() >= 4);
|
||||
/// ```
|
||||
#[stable(feature = "deque_extras_15", since = "1.5.0")]
|
||||
#[track_caller]
|
||||
pub fn shrink_to_fit(&mut self) {
|
||||
self.shrink_to(0);
|
||||
}
|
||||
|
|
@ -988,7 +981,6 @@ impl<T, A: Allocator> VecDeque<T, A> {
|
|||
/// assert!(buf.capacity() >= 4);
|
||||
/// ```
|
||||
#[stable(feature = "shrink_to", since = "1.56.0")]
|
||||
#[track_caller]
|
||||
pub fn shrink_to(&mut self, min_capacity: usize) {
|
||||
let target_cap = min_capacity.max(self.len);
|
||||
|
||||
|
|
@ -1891,7 +1883,6 @@ impl<T, A: Allocator> VecDeque<T, A> {
|
|||
/// assert_eq!(d.front(), Some(&2));
|
||||
/// ```
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[track_caller]
|
||||
pub fn push_front(&mut self, value: T) {
|
||||
let _ = self.push_front_mut(value);
|
||||
}
|
||||
|
|
@ -1910,7 +1901,6 @@ impl<T, A: Allocator> VecDeque<T, A> {
|
|||
/// assert_eq!(d.front(), Some(&7));
|
||||
/// ```
|
||||
#[unstable(feature = "push_mut", issue = "135974")]
|
||||
#[track_caller]
|
||||
#[must_use = "if you don't need a reference to the value, use `VecDeque::push_front` instead"]
|
||||
pub fn push_front_mut(&mut self, value: T) -> &mut T {
|
||||
if self.is_full() {
|
||||
|
|
@ -1937,7 +1927,6 @@ impl<T, A: Allocator> VecDeque<T, A> {
|
|||
/// ```
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[rustc_confusables("push", "put", "append")]
|
||||
#[track_caller]
|
||||
pub fn push_back(&mut self, value: T) {
|
||||
let _ = self.push_back_mut(value);
|
||||
}
|
||||
|
|
@ -1956,7 +1945,6 @@ impl<T, A: Allocator> VecDeque<T, A> {
|
|||
/// assert_eq!(d.back(), Some(&10));
|
||||
/// ```
|
||||
#[unstable(feature = "push_mut", issue = "135974")]
|
||||
#[track_caller]
|
||||
#[must_use = "if you don't need a reference to the value, use `VecDeque::push_back` instead"]
|
||||
pub fn push_back_mut(&mut self, value: T) -> &mut T {
|
||||
if self.is_full() {
|
||||
|
|
@ -2071,7 +2059,6 @@ impl<T, A: Allocator> VecDeque<T, A> {
|
|||
/// assert_eq!(vec_deque, &['a', 'd', 'b', 'c', 'e']);
|
||||
/// ```
|
||||
#[stable(feature = "deque_extras_15", since = "1.5.0")]
|
||||
#[track_caller]
|
||||
pub fn insert(&mut self, index: usize, value: T) {
|
||||
let _ = self.insert_mut(index, value);
|
||||
}
|
||||
|
|
@ -2099,7 +2086,6 @@ impl<T, A: Allocator> VecDeque<T, A> {
|
|||
/// assert_eq!(vec_deque, &[1, 12, 2, 3]);
|
||||
/// ```
|
||||
#[unstable(feature = "push_mut", issue = "135974")]
|
||||
#[track_caller]
|
||||
#[must_use = "if you don't need a reference to the value, use `VecDeque::insert` instead"]
|
||||
pub fn insert_mut(&mut self, index: usize, value: T) -> &mut T {
|
||||
assert!(index <= self.len(), "index out of bounds");
|
||||
|
|
@ -2205,7 +2191,6 @@ impl<T, A: Allocator> VecDeque<T, A> {
|
|||
#[inline]
|
||||
#[must_use = "use `.truncate()` if you don't need the other half"]
|
||||
#[stable(feature = "split_off", since = "1.4.0")]
|
||||
#[track_caller]
|
||||
pub fn split_off(&mut self, at: usize) -> Self
|
||||
where
|
||||
A: Clone,
|
||||
|
|
@ -2272,7 +2257,6 @@ impl<T, A: Allocator> VecDeque<T, A> {
|
|||
/// ```
|
||||
#[inline]
|
||||
#[stable(feature = "append", since = "1.4.0")]
|
||||
#[track_caller]
|
||||
pub fn append(&mut self, other: &mut Self) {
|
||||
if T::IS_ZST {
|
||||
self.len = self.len.checked_add(other.len).expect("capacity overflow");
|
||||
|
|
@ -2395,7 +2379,6 @@ impl<T, A: Allocator> VecDeque<T, A> {
|
|||
// be called in cold paths.
|
||||
// This may panic or abort
|
||||
#[inline(never)]
|
||||
#[track_caller]
|
||||
fn grow(&mut self) {
|
||||
// Extend or possibly remove this assertion when valid use-cases for growing the
|
||||
// buffer without it being full emerge
|
||||
|
|
@ -2434,7 +2417,6 @@ impl<T, A: Allocator> VecDeque<T, A> {
|
|||
/// assert_eq!(buf, [5, 10, 101, 102, 103]);
|
||||
/// ```
|
||||
#[stable(feature = "vec_resize_with", since = "1.33.0")]
|
||||
#[track_caller]
|
||||
pub fn resize_with(&mut self, new_len: usize, generator: impl FnMut() -> T) {
|
||||
let len = self.len;
|
||||
|
||||
|
|
@ -2981,7 +2963,6 @@ impl<T: Clone, A: Allocator> VecDeque<T, A> {
|
|||
/// assert_eq!(buf, [5, 10, 20, 20, 20]);
|
||||
/// ```
|
||||
#[stable(feature = "deque_extras", since = "1.16.0")]
|
||||
#[track_caller]
|
||||
pub fn resize(&mut self, new_len: usize, value: T) {
|
||||
if new_len > self.len() {
|
||||
let extra = new_len - self.len();
|
||||
|
|
@ -3101,7 +3082,6 @@ impl<T, A: Allocator> IndexMut<usize> for VecDeque<T, A> {
|
|||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<T> FromIterator<T> for VecDeque<T> {
|
||||
#[track_caller]
|
||||
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> VecDeque<T> {
|
||||
SpecFromIter::spec_from_iter(iter.into_iter())
|
||||
}
|
||||
|
|
@ -3141,19 +3121,16 @@ impl<'a, T, A: Allocator> IntoIterator for &'a mut VecDeque<T, A> {
|
|||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<T, A: Allocator> Extend<T> for VecDeque<T, A> {
|
||||
#[track_caller]
|
||||
fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
|
||||
<Self as SpecExtend<T, I::IntoIter>>::spec_extend(self, iter.into_iter());
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
fn extend_one(&mut self, elem: T) {
|
||||
self.push_back(elem);
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
fn extend_reserve(&mut self, additional: usize) {
|
||||
self.reserve(additional);
|
||||
}
|
||||
|
|
@ -3169,19 +3146,16 @@ impl<T, A: Allocator> Extend<T> for VecDeque<T, A> {
|
|||
|
||||
#[stable(feature = "extend_ref", since = "1.2.0")]
|
||||
impl<'a, T: 'a + Copy, A: Allocator> Extend<&'a T> for VecDeque<T, A> {
|
||||
#[track_caller]
|
||||
fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
|
||||
self.spec_extend(iter.into_iter());
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
fn extend_one(&mut self, &elem: &'a T) {
|
||||
self.push_back(elem);
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
fn extend_reserve(&mut self, additional: usize) {
|
||||
self.reserve(additional);
|
||||
}
|
||||
|
|
@ -3279,7 +3253,6 @@ impl<T, const N: usize> From<[T; N]> for VecDeque<T> {
|
|||
/// let deq2: VecDeque<_> = [1, 2, 3, 4].into();
|
||||
/// assert_eq!(deq1, deq2);
|
||||
/// ```
|
||||
#[track_caller]
|
||||
fn from(arr: [T; N]) -> Self {
|
||||
let mut deq = VecDeque::with_capacity(N);
|
||||
let arr = ManuallyDrop::new(arr);
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@ use crate::vec;
|
|||
|
||||
// Specialization trait used for VecDeque::extend
|
||||
pub(super) trait SpecExtend<T, I> {
|
||||
#[track_caller]
|
||||
fn spec_extend(&mut self, iter: I);
|
||||
}
|
||||
|
||||
|
|
@ -16,7 +15,6 @@ impl<T, I, A: Allocator> SpecExtend<T, I> for VecDeque<T, A>
|
|||
where
|
||||
I: Iterator<Item = T>,
|
||||
{
|
||||
#[track_caller]
|
||||
default fn spec_extend(&mut self, mut iter: I) {
|
||||
// This function should be the moral equivalent of:
|
||||
//
|
||||
|
|
@ -47,7 +45,6 @@ impl<T, I, A: Allocator> SpecExtend<T, I> for VecDeque<T, A>
|
|||
where
|
||||
I: TrustedLen<Item = T>,
|
||||
{
|
||||
#[track_caller]
|
||||
default fn spec_extend(&mut self, iter: I) {
|
||||
// This is the case for a TrustedLen iterator.
|
||||
let (low, high) = iter.size_hint();
|
||||
|
|
@ -81,7 +78,6 @@ where
|
|||
|
||||
#[cfg(not(test))]
|
||||
impl<T, A: Allocator> SpecExtend<T, vec::IntoIter<T>> for VecDeque<T, A> {
|
||||
#[track_caller]
|
||||
fn spec_extend(&mut self, mut iterator: vec::IntoIter<T>) {
|
||||
let slice = iterator.as_slice();
|
||||
self.reserve(slice.len());
|
||||
|
|
@ -99,7 +95,6 @@ where
|
|||
I: Iterator<Item = &'a T>,
|
||||
T: Copy,
|
||||
{
|
||||
#[track_caller]
|
||||
default fn spec_extend(&mut self, iterator: I) {
|
||||
self.spec_extend(iterator.copied())
|
||||
}
|
||||
|
|
@ -109,7 +104,6 @@ impl<'a, T: 'a, A: Allocator> SpecExtend<&'a T, slice::Iter<'a, T>> for VecDeque
|
|||
where
|
||||
T: Copy,
|
||||
{
|
||||
#[track_caller]
|
||||
fn spec_extend(&mut self, iterator: slice::Iter<'a, T>) {
|
||||
let slice = iterator.as_slice();
|
||||
self.reserve(slice.len());
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ impl<T, I> SpecFromIter<T, I> for VecDeque<T>
|
|||
where
|
||||
I: Iterator<Item = T>,
|
||||
{
|
||||
#[track_caller]
|
||||
default fn spec_from_iter(iterator: I) -> Self {
|
||||
// Since converting is O(1) now, just re-use the `Vec` logic for
|
||||
// anything where we can't do something extra-special for `VecDeque`,
|
||||
|
|
|
|||
|
|
@ -24,7 +24,6 @@ mod tests;
|
|||
// only one location which panics rather than a bunch throughout the module.
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[cfg_attr(not(panic = "immediate-abort"), inline(never))]
|
||||
#[track_caller]
|
||||
fn capacity_overflow() -> ! {
|
||||
panic!("capacity overflow");
|
||||
}
|
||||
|
|
@ -123,7 +122,6 @@ impl<T> RawVec<T, Global> {
|
|||
#[cfg(not(any(no_global_oom_handling, test)))]
|
||||
#[must_use]
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
pub(crate) fn with_capacity(capacity: usize) -> Self {
|
||||
Self { inner: RawVecInner::with_capacity(capacity, T::LAYOUT), _marker: PhantomData }
|
||||
}
|
||||
|
|
@ -132,7 +130,6 @@ impl<T> RawVec<T, Global> {
|
|||
#[cfg(not(any(no_global_oom_handling, test)))]
|
||||
#[must_use]
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
pub(crate) fn with_capacity_zeroed(capacity: usize) -> Self {
|
||||
Self {
|
||||
inner: RawVecInner::with_capacity_zeroed_in(capacity, Global, T::LAYOUT),
|
||||
|
|
@ -145,7 +142,6 @@ impl RawVecInner<Global> {
|
|||
#[cfg(not(any(no_global_oom_handling, test)))]
|
||||
#[must_use]
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
fn with_capacity(capacity: usize, elem_layout: Layout) -> Self {
|
||||
match Self::try_allocate_in(capacity, AllocInit::Uninitialized, Global, elem_layout) {
|
||||
Ok(res) => res,
|
||||
|
|
@ -186,7 +182,6 @@ impl<T, A: Allocator> RawVec<T, A> {
|
|||
/// allocator for the returned `RawVec`.
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
pub(crate) fn with_capacity_in(capacity: usize, alloc: A) -> Self {
|
||||
Self {
|
||||
inner: RawVecInner::with_capacity_in(capacity, alloc, T::LAYOUT),
|
||||
|
|
@ -208,7 +203,6 @@ impl<T, A: Allocator> RawVec<T, A> {
|
|||
/// of allocator for the returned `RawVec`.
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
pub(crate) fn with_capacity_zeroed_in(capacity: usize, alloc: A) -> Self {
|
||||
Self {
|
||||
inner: RawVecInner::with_capacity_zeroed_in(capacity, alloc, T::LAYOUT),
|
||||
|
|
@ -328,7 +322,6 @@ impl<T, A: Allocator> RawVec<T, A> {
|
|||
/// Aborts on OOM.
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
pub(crate) fn reserve(&mut self, len: usize, additional: usize) {
|
||||
// SAFETY: All calls on self.inner pass T::LAYOUT as the elem_layout
|
||||
unsafe { self.inner.reserve(len, additional, T::LAYOUT) }
|
||||
|
|
@ -338,7 +331,6 @@ impl<T, A: Allocator> RawVec<T, A> {
|
|||
/// caller to ensure `len == self.capacity()`.
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[inline(never)]
|
||||
#[track_caller]
|
||||
pub(crate) fn grow_one(&mut self) {
|
||||
// SAFETY: All calls on self.inner pass T::LAYOUT as the elem_layout
|
||||
unsafe { self.inner.grow_one(T::LAYOUT) }
|
||||
|
|
@ -372,7 +364,6 @@ impl<T, A: Allocator> RawVec<T, A> {
|
|||
///
|
||||
/// Aborts on OOM.
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[track_caller]
|
||||
pub(crate) fn reserve_exact(&mut self, len: usize, additional: usize) {
|
||||
// SAFETY: All calls on self.inner pass T::LAYOUT as the elem_layout
|
||||
unsafe { self.inner.reserve_exact(len, additional, T::LAYOUT) }
|
||||
|
|
@ -399,7 +390,6 @@ impl<T, A: Allocator> RawVec<T, A> {
|
|||
///
|
||||
/// Aborts on OOM.
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[track_caller]
|
||||
#[inline]
|
||||
pub(crate) fn shrink_to_fit(&mut self, cap: usize) {
|
||||
// SAFETY: All calls on self.inner pass T::LAYOUT as the elem_layout
|
||||
|
|
@ -425,7 +415,6 @@ impl<A: Allocator> RawVecInner<A> {
|
|||
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
fn with_capacity_in(capacity: usize, alloc: A, elem_layout: Layout) -> Self {
|
||||
match Self::try_allocate_in(capacity, AllocInit::Uninitialized, alloc, elem_layout) {
|
||||
Ok(this) => {
|
||||
|
|
@ -450,7 +439,6 @@ impl<A: Allocator> RawVecInner<A> {
|
|||
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
fn with_capacity_zeroed_in(capacity: usize, alloc: A, elem_layout: Layout) -> Self {
|
||||
match Self::try_allocate_in(capacity, AllocInit::Zeroed, alloc, elem_layout) {
|
||||
Ok(res) => res,
|
||||
|
|
@ -553,7 +541,6 @@ impl<A: Allocator> RawVecInner<A> {
|
|||
/// - `elem_layout`'s size must be a multiple of its alignment
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
unsafe fn reserve(&mut self, len: usize, additional: usize, elem_layout: Layout) {
|
||||
// Callers expect this function to be very cheap when there is already sufficient capacity.
|
||||
// Therefore, we move all the resizing and error-handling logic from grow_amortized and
|
||||
|
|
@ -585,7 +572,6 @@ impl<A: Allocator> RawVecInner<A> {
|
|||
/// - `elem_layout`'s size must be a multiple of its alignment
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
unsafe fn grow_one(&mut self, elem_layout: Layout) {
|
||||
// SAFETY: Precondition passed to caller
|
||||
if let Err(err) = unsafe { self.grow_amortized(self.cap.as_inner(), 1, elem_layout) } {
|
||||
|
|
@ -621,7 +607,6 @@ impl<A: Allocator> RawVecInner<A> {
|
|||
/// initially construct `self`
|
||||
/// - `elem_layout`'s size must be a multiple of its alignment
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[track_caller]
|
||||
unsafe fn reserve_exact(&mut self, len: usize, additional: usize, elem_layout: Layout) {
|
||||
// SAFETY: Precondition passed to caller
|
||||
if let Err(err) = unsafe { self.try_reserve_exact(len, additional, elem_layout) } {
|
||||
|
|
@ -659,7 +644,6 @@ impl<A: Allocator> RawVecInner<A> {
|
|||
/// - `cap` must be less than or equal to `self.capacity(elem_layout.size())`
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
unsafe fn shrink_to_fit(&mut self, cap: usize, elem_layout: Layout) {
|
||||
if let Err(err) = unsafe { self.shrink(cap, elem_layout) } {
|
||||
handle_error(err);
|
||||
|
|
@ -872,7 +856,6 @@ where
|
|||
#[cfg(not(no_global_oom_handling))]
|
||||
#[cold]
|
||||
#[optimize(size)]
|
||||
#[track_caller]
|
||||
fn handle_error(e: TryReserveError) -> ! {
|
||||
match e.kind() {
|
||||
CapacityOverflow => capacity_overflow(),
|
||||
|
|
|
|||
|
|
@ -1105,7 +1105,6 @@ impl String {
|
|||
/// ```
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[rustc_confusables("append", "push")]
|
||||
#[rustc_diagnostic_item = "string_push_str"]
|
||||
|
|
@ -1208,7 +1207,6 @@ impl String {
|
|||
/// ```
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub fn reserve(&mut self, additional: usize) {
|
||||
self.vec.reserve(additional)
|
||||
|
|
@ -1260,7 +1258,6 @@ impl String {
|
|||
#[cfg(not(no_global_oom_handling))]
|
||||
#[inline]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[track_caller]
|
||||
pub fn reserve_exact(&mut self, additional: usize) {
|
||||
self.vec.reserve_exact(additional)
|
||||
}
|
||||
|
|
@ -1356,7 +1353,6 @@ impl String {
|
|||
/// ```
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub fn shrink_to_fit(&mut self) {
|
||||
self.vec.shrink_to_fit()
|
||||
|
|
@ -1384,7 +1380,6 @@ impl String {
|
|||
/// ```
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
#[stable(feature = "shrink_to", since = "1.56.0")]
|
||||
pub fn shrink_to(&mut self, min_capacity: usize) {
|
||||
self.vec.shrink_to(min_capacity)
|
||||
|
|
@ -1406,7 +1401,6 @@ impl String {
|
|||
#[cfg(not(no_global_oom_handling))]
|
||||
#[inline]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[track_caller]
|
||||
pub fn push(&mut self, ch: char) {
|
||||
let len = self.len();
|
||||
let ch_len = ch.len_utf8();
|
||||
|
|
@ -2115,7 +2109,6 @@ impl String {
|
|||
#[stable(feature = "box_str", since = "1.4.0")]
|
||||
#[must_use = "`self` will be dropped if the result is not used"]
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
pub fn into_boxed_str(self) -> Box<str> {
|
||||
let slice = self.vec.into_boxed_slice();
|
||||
unsafe { from_boxed_utf8_unchecked(slice) }
|
||||
|
|
@ -2293,7 +2286,6 @@ impl Error for FromUtf16Error {}
|
|||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl Clone for String {
|
||||
#[track_caller]
|
||||
fn clone(&self) -> Self {
|
||||
String { vec: self.vec.clone() }
|
||||
}
|
||||
|
|
@ -2302,7 +2294,6 @@ impl Clone for String {
|
|||
///
|
||||
/// This method is preferred over simply assigning `source.clone()` to `self`,
|
||||
/// as it avoids reallocation if possible.
|
||||
#[track_caller]
|
||||
fn clone_from(&mut self, source: &Self) {
|
||||
self.vec.clone_from(&source.vec);
|
||||
}
|
||||
|
|
@ -2477,13 +2468,11 @@ impl<'a> Extend<Cow<'a, str>> for String {
|
|||
#[unstable(feature = "ascii_char", issue = "110998")]
|
||||
impl Extend<core::ascii::Char> for String {
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
fn extend<I: IntoIterator<Item = core::ascii::Char>>(&mut self, iter: I) {
|
||||
self.vec.extend(iter.into_iter().map(|c| c.to_u8()));
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
fn extend_one(&mut self, c: core::ascii::Char) {
|
||||
self.vec.push(c.to_u8());
|
||||
}
|
||||
|
|
@ -2493,13 +2482,11 @@ impl Extend<core::ascii::Char> for String {
|
|||
#[unstable(feature = "ascii_char", issue = "110998")]
|
||||
impl<'a> Extend<&'a core::ascii::Char> for String {
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
fn extend<I: IntoIterator<Item = &'a core::ascii::Char>>(&mut self, iter: I) {
|
||||
self.extend(iter.into_iter().cloned());
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
fn extend_one(&mut self, c: &'a core::ascii::Char) {
|
||||
self.vec.push(c.to_u8());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -58,7 +58,6 @@ impl<'a, T> FromIterator<T> for Cow<'a, [T]>
|
|||
where
|
||||
T: Clone,
|
||||
{
|
||||
#[track_caller]
|
||||
fn from_iter<I: IntoIterator<Item = T>>(it: I) -> Cow<'a, [T]> {
|
||||
Cow::Owned(FromIterator::from_iter(it))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -229,7 +229,6 @@ where
|
|||
I: Iterator<Item = T> + InPlaceCollect,
|
||||
<I as SourceIter>::Source: AsVecIntoIter,
|
||||
{
|
||||
#[track_caller]
|
||||
default fn from_iter(iterator: I) -> Self {
|
||||
// Select the implementation in const eval to avoid codegen of the dead branch to improve compile times.
|
||||
let fun: fn(I) -> Vec<T> = const {
|
||||
|
|
@ -247,7 +246,6 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
#[track_caller]
|
||||
fn from_iter_in_place<I, T>(mut iterator: I) -> Vec<T>
|
||||
where
|
||||
I: Iterator<Item = T> + InPlaceCollect,
|
||||
|
|
|
|||
|
|
@ -515,7 +515,6 @@ impl<T> Vec<T> {
|
|||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[must_use]
|
||||
#[rustc_diagnostic_item = "vec_with_capacity"]
|
||||
#[track_caller]
|
||||
pub fn with_capacity(capacity: usize) -> Self {
|
||||
Self::with_capacity_in(capacity, Global)
|
||||
}
|
||||
|
|
@ -926,7 +925,6 @@ impl<T, A: Allocator> Vec<T, A> {
|
|||
#[cfg(not(no_global_oom_handling))]
|
||||
#[inline]
|
||||
#[unstable(feature = "allocator_api", issue = "32838")]
|
||||
#[track_caller]
|
||||
pub fn with_capacity_in(capacity: usize, alloc: A) -> Self {
|
||||
Vec { buf: RawVec::with_capacity_in(capacity, alloc), len: 0 }
|
||||
}
|
||||
|
|
@ -1335,7 +1333,6 @@ impl<T, A: Allocator> Vec<T, A> {
|
|||
/// ```
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[track_caller]
|
||||
#[rustc_diagnostic_item = "vec_reserve"]
|
||||
pub fn reserve(&mut self, additional: usize) {
|
||||
self.buf.reserve(self.len, additional);
|
||||
|
|
@ -1367,7 +1364,6 @@ impl<T, A: Allocator> Vec<T, A> {
|
|||
/// ```
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[track_caller]
|
||||
pub fn reserve_exact(&mut self, additional: usize) {
|
||||
self.buf.reserve_exact(self.len, additional);
|
||||
}
|
||||
|
|
@ -1471,7 +1467,6 @@ impl<T, A: Allocator> Vec<T, A> {
|
|||
/// ```
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[track_caller]
|
||||
#[inline]
|
||||
pub fn shrink_to_fit(&mut self) {
|
||||
// The capacity is never less than the length, and there's nothing to do when
|
||||
|
|
@ -1502,7 +1497,6 @@ impl<T, A: Allocator> Vec<T, A> {
|
|||
/// ```
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "shrink_to", since = "1.56.0")]
|
||||
#[track_caller]
|
||||
pub fn shrink_to(&mut self, min_capacity: usize) {
|
||||
if self.capacity() > min_capacity {
|
||||
self.buf.shrink_to_fit(cmp::max(self.len, min_capacity));
|
||||
|
|
@ -1536,7 +1530,6 @@ impl<T, A: Allocator> Vec<T, A> {
|
|||
/// ```
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[track_caller]
|
||||
pub fn into_boxed_slice(mut self) -> Box<[T], A> {
|
||||
unsafe {
|
||||
self.shrink_to_fit();
|
||||
|
|
@ -2021,7 +2014,6 @@ impl<T, A: Allocator> Vec<T, A> {
|
|||
pub fn swap_remove(&mut self, index: usize) -> T {
|
||||
#[cold]
|
||||
#[cfg_attr(not(panic = "immediate-abort"), inline(never))]
|
||||
#[track_caller]
|
||||
#[optimize(size)]
|
||||
fn assert_failed(index: usize, len: usize) -> ! {
|
||||
panic!("swap_remove index (is {index}) should be < len (is {len})");
|
||||
|
|
@ -2568,7 +2560,6 @@ impl<T, A: Allocator> Vec<T, A> {
|
|||
#[inline]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[rustc_confusables("push_back", "put", "append")]
|
||||
#[track_caller]
|
||||
pub fn push(&mut self, value: T) {
|
||||
let _ = self.push_mut(value);
|
||||
}
|
||||
|
|
@ -2645,7 +2636,6 @@ impl<T, A: Allocator> Vec<T, A> {
|
|||
#[cfg(not(no_global_oom_handling))]
|
||||
#[inline]
|
||||
#[unstable(feature = "push_mut", issue = "135974")]
|
||||
#[track_caller]
|
||||
#[must_use = "if you don't need a reference to the value, use `Vec::push` instead"]
|
||||
pub fn push_mut(&mut self, value: T) -> &mut T {
|
||||
// Inform codegen that the length does not change across grow_one().
|
||||
|
|
@ -2793,7 +2783,6 @@ impl<T, A: Allocator> Vec<T, A> {
|
|||
#[cfg(not(no_global_oom_handling))]
|
||||
#[inline]
|
||||
#[stable(feature = "append", since = "1.4.0")]
|
||||
#[track_caller]
|
||||
pub fn append(&mut self, other: &mut Self) {
|
||||
unsafe {
|
||||
self.append_elements(other.as_slice() as _);
|
||||
|
|
@ -2804,7 +2793,6 @@ impl<T, A: Allocator> Vec<T, A> {
|
|||
/// Appends elements to `self` from other buffer.
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
unsafe fn append_elements(&mut self, other: *const [T]) {
|
||||
let count = other.len();
|
||||
self.reserve(count);
|
||||
|
|
@ -3039,7 +3027,6 @@ impl<T, A: Allocator> Vec<T, A> {
|
|||
/// ```
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "vec_resize_with", since = "1.33.0")]
|
||||
#[track_caller]
|
||||
pub fn resize_with<F>(&mut self, new_len: usize, f: F)
|
||||
where
|
||||
F: FnMut() -> T,
|
||||
|
|
@ -3304,7 +3291,6 @@ impl<T: Clone, A: Allocator> Vec<T, A> {
|
|||
/// ```
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "vec_resize", since = "1.5.0")]
|
||||
#[track_caller]
|
||||
pub fn resize(&mut self, new_len: usize, value: T) {
|
||||
let len = self.len();
|
||||
|
||||
|
|
@ -3335,7 +3321,6 @@ impl<T: Clone, A: Allocator> Vec<T, A> {
|
|||
/// [`extend`]: Vec::extend
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "vec_extend_from_slice", since = "1.6.0")]
|
||||
#[track_caller]
|
||||
pub fn extend_from_slice(&mut self, other: &[T]) {
|
||||
self.spec_extend(other.iter())
|
||||
}
|
||||
|
|
@ -3366,7 +3351,6 @@ impl<T: Clone, A: Allocator> Vec<T, A> {
|
|||
/// ```
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "vec_extend_from_within", since = "1.53.0")]
|
||||
#[track_caller]
|
||||
pub fn extend_from_within<R>(&mut self, src: R)
|
||||
where
|
||||
R: RangeBounds<usize>,
|
||||
|
|
@ -3427,7 +3411,6 @@ impl<T, A: Allocator, const N: usize> Vec<[T; N], A> {
|
|||
|
||||
impl<T: Clone, A: Allocator> Vec<T, A> {
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[track_caller]
|
||||
/// Extend the vector by `n` clones of value.
|
||||
fn extend_with(&mut self, n: usize, value: T) {
|
||||
self.reserve(n);
|
||||
|
|
@ -3488,7 +3471,6 @@ impl<T: PartialEq, A: Allocator> Vec<T, A> {
|
|||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[rustc_diagnostic_item = "vec_from_elem"]
|
||||
#[track_caller]
|
||||
pub fn from_elem<T: Clone>(elem: T, n: usize) -> Vec<T> {
|
||||
<T as SpecFromElem>::from_elem(elem, n, Global)
|
||||
}
|
||||
|
|
@ -3496,7 +3478,6 @@ pub fn from_elem<T: Clone>(elem: T, n: usize) -> Vec<T> {
|
|||
#[doc(hidden)]
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[unstable(feature = "allocator_api", issue = "32838")]
|
||||
#[track_caller]
|
||||
pub fn from_elem_in<T: Clone, A: Allocator>(elem: T, n: usize, alloc: A) -> Vec<T, A> {
|
||||
<T as SpecFromElem>::from_elem(elem, n, alloc)
|
||||
}
|
||||
|
|
@ -3587,7 +3568,6 @@ unsafe impl<T, A: Allocator> ops::DerefPure for Vec<T, A> {}
|
|||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<T: Clone, A: Allocator + Clone> Clone for Vec<T, A> {
|
||||
#[track_caller]
|
||||
fn clone(&self) -> Self {
|
||||
let alloc = self.allocator().clone();
|
||||
<[T]>::to_vec_in(&**self, alloc)
|
||||
|
|
@ -3615,7 +3595,6 @@ impl<T: Clone, A: Allocator + Clone> Clone for Vec<T, A> {
|
|||
/// // And no reallocation occurred
|
||||
/// assert_eq!(yp, y.as_ptr());
|
||||
/// ```
|
||||
#[track_caller]
|
||||
fn clone_from(&mut self, source: &Self) {
|
||||
crate::slice::SpecCloneIntoVec::clone_into(source.as_slice(), self);
|
||||
}
|
||||
|
|
@ -3706,7 +3685,6 @@ impl<T, I: SliceIndex<[T]>, A: Allocator> IndexMut<I> for Vec<T, A> {
|
|||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<T> FromIterator<T> for Vec<T> {
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Vec<T> {
|
||||
<Self as SpecFromIter<T, I::IntoIter>>::from_iter(iter.into_iter())
|
||||
}
|
||||
|
|
@ -3775,19 +3753,16 @@ impl<'a, T, A: Allocator> IntoIterator for &'a mut Vec<T, A> {
|
|||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<T, A: Allocator> Extend<T> for Vec<T, A> {
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
|
||||
<Self as SpecExtend<T, I::IntoIter>>::spec_extend(self, iter.into_iter())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
fn extend_one(&mut self, item: T) {
|
||||
self.push(item);
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
fn extend_reserve(&mut self, additional: usize) {
|
||||
self.reserve(additional);
|
||||
}
|
||||
|
|
@ -3807,7 +3782,6 @@ impl<T, A: Allocator> Vec<T, A> {
|
|||
// leaf method to which various SpecFrom/SpecExtend implementations delegate when
|
||||
// they have no further optimizations to apply
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[track_caller]
|
||||
fn extend_desugared<I: Iterator<Item = T>>(&mut self, mut iterator: I) {
|
||||
// This is the case for a general iterator.
|
||||
//
|
||||
|
|
@ -3835,7 +3809,6 @@ impl<T, A: Allocator> Vec<T, A> {
|
|||
// specific extend for `TrustedLen` iterators, called both by the specializations
|
||||
// and internal places where resolving specialization makes compilation slower
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[track_caller]
|
||||
fn extend_trusted(&mut self, iterator: impl iter::TrustedLen<Item = T>) {
|
||||
let (low, high) = iterator.size_hint();
|
||||
if let Some(additional) = high {
|
||||
|
|
@ -4013,19 +3986,16 @@ impl<T, A: Allocator> Vec<T, A> {
|
|||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "extend_ref", since = "1.2.0")]
|
||||
impl<'a, T: Copy + 'a, A: Allocator> Extend<&'a T> for Vec<T, A> {
|
||||
#[track_caller]
|
||||
fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
|
||||
self.spec_extend(iter.into_iter())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
fn extend_one(&mut self, &item: &'a T) {
|
||||
self.push(item);
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
fn extend_reserve(&mut self, additional: usize) {
|
||||
self.reserve(additional);
|
||||
}
|
||||
|
|
@ -4136,7 +4106,6 @@ impl<T: Clone> From<&[T]> for Vec<T> {
|
|||
/// ```
|
||||
/// assert_eq!(Vec::from(&[1, 2, 3][..]), vec![1, 2, 3]);
|
||||
/// ```
|
||||
#[track_caller]
|
||||
fn from(s: &[T]) -> Vec<T> {
|
||||
s.to_vec()
|
||||
}
|
||||
|
|
@ -4152,7 +4121,6 @@ impl<T: Clone> From<&mut [T]> for Vec<T> {
|
|||
/// ```
|
||||
/// assert_eq!(Vec::from(&mut [1, 2, 3][..]), vec![1, 2, 3]);
|
||||
/// ```
|
||||
#[track_caller]
|
||||
fn from(s: &mut [T]) -> Vec<T> {
|
||||
s.to_vec()
|
||||
}
|
||||
|
|
@ -4168,7 +4136,6 @@ impl<T: Clone, const N: usize> From<&[T; N]> for Vec<T> {
|
|||
/// ```
|
||||
/// assert_eq!(Vec::from(&[1, 2, 3]), vec![1, 2, 3]);
|
||||
/// ```
|
||||
#[track_caller]
|
||||
fn from(s: &[T; N]) -> Vec<T> {
|
||||
Self::from(s.as_slice())
|
||||
}
|
||||
|
|
@ -4184,7 +4151,6 @@ impl<T: Clone, const N: usize> From<&mut [T; N]> for Vec<T> {
|
|||
/// ```
|
||||
/// assert_eq!(Vec::from(&mut [1, 2, 3]), vec![1, 2, 3]);
|
||||
/// ```
|
||||
#[track_caller]
|
||||
fn from(s: &mut [T; N]) -> Vec<T> {
|
||||
Self::from(s.as_mut_slice())
|
||||
}
|
||||
|
|
@ -4200,7 +4166,6 @@ impl<T, const N: usize> From<[T; N]> for Vec<T> {
|
|||
/// ```
|
||||
/// assert_eq!(Vec::from([1, 2, 3]), vec![1, 2, 3]);
|
||||
/// ```
|
||||
#[track_caller]
|
||||
fn from(s: [T; N]) -> Vec<T> {
|
||||
<[T]>::into_vec(Box::new(s))
|
||||
}
|
||||
|
|
@ -4225,7 +4190,6 @@ where
|
|||
/// let b: Cow<'_, [i32]> = Cow::Borrowed(&[1, 2, 3]);
|
||||
/// assert_eq!(Vec::from(o), Vec::from(b));
|
||||
/// ```
|
||||
#[track_caller]
|
||||
fn from(s: Cow<'a, [T]>) -> Vec<T> {
|
||||
s.into_owned()
|
||||
}
|
||||
|
|
@ -4272,7 +4236,6 @@ impl<T, A: Allocator> From<Vec<T, A>> for Box<[T], A> {
|
|||
///
|
||||
/// assert_eq!(Box::from(vec), vec![1, 2, 3].into_boxed_slice());
|
||||
/// ```
|
||||
#[track_caller]
|
||||
fn from(v: Vec<T, A>) -> Self {
|
||||
v.into_boxed_slice()
|
||||
}
|
||||
|
|
@ -4288,7 +4251,6 @@ impl From<&str> for Vec<u8> {
|
|||
/// ```
|
||||
/// assert_eq!(Vec::from("123"), vec![b'1', b'2', b'3']);
|
||||
/// ```
|
||||
#[track_caller]
|
||||
fn from(s: &str) -> Vec<u8> {
|
||||
From::from(s.as_bytes())
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ use crate::alloc::Allocator;
|
|||
|
||||
// Specialization trait used for Vec::extend
|
||||
pub(super) trait SpecExtend<T, I> {
|
||||
#[track_caller]
|
||||
fn spec_extend(&mut self, iter: I);
|
||||
}
|
||||
|
||||
|
|
@ -14,7 +13,6 @@ impl<T, I, A: Allocator> SpecExtend<T, I> for Vec<T, A>
|
|||
where
|
||||
I: Iterator<Item = T>,
|
||||
{
|
||||
#[track_caller]
|
||||
default fn spec_extend(&mut self, iter: I) {
|
||||
self.extend_desugared(iter)
|
||||
}
|
||||
|
|
@ -24,14 +22,12 @@ impl<T, I, A: Allocator> SpecExtend<T, I> for Vec<T, A>
|
|||
where
|
||||
I: TrustedLen<Item = T>,
|
||||
{
|
||||
#[track_caller]
|
||||
default fn spec_extend(&mut self, iterator: I) {
|
||||
self.extend_trusted(iterator)
|
||||
}
|
||||
}
|
||||
|
||||
impl<T, A: Allocator> SpecExtend<T, IntoIter<T>> for Vec<T, A> {
|
||||
#[track_caller]
|
||||
fn spec_extend(&mut self, mut iterator: IntoIter<T>) {
|
||||
unsafe {
|
||||
self.append_elements(iterator.as_slice() as _);
|
||||
|
|
@ -45,7 +41,6 @@ where
|
|||
I: Iterator<Item = &'a T>,
|
||||
T: Clone,
|
||||
{
|
||||
#[track_caller]
|
||||
default fn spec_extend(&mut self, iterator: I) {
|
||||
self.spec_extend(iterator.cloned())
|
||||
}
|
||||
|
|
@ -55,7 +50,6 @@ impl<'a, T: 'a, A: Allocator> SpecExtend<&'a T, slice::Iter<'a, T>> for Vec<T, A
|
|||
where
|
||||
T: Copy,
|
||||
{
|
||||
#[track_caller]
|
||||
fn spec_extend(&mut self, iterator: slice::Iter<'a, T>) {
|
||||
let slice = iterator.as_slice();
|
||||
unsafe { self.append_elements(slice) };
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@ pub(super) trait SpecFromElem: Sized {
|
|||
}
|
||||
|
||||
impl<T: Clone> SpecFromElem for T {
|
||||
#[track_caller]
|
||||
default fn from_elem<A: Allocator>(elem: Self, n: usize, alloc: A) -> Vec<Self, A> {
|
||||
let mut v = Vec::with_capacity_in(n, alloc);
|
||||
v.extend_with(n, elem);
|
||||
|
|
@ -20,7 +19,6 @@ impl<T: Clone> SpecFromElem for T {
|
|||
|
||||
impl<T: Clone + IsZero> SpecFromElem for T {
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
default fn from_elem<A: Allocator>(elem: T, n: usize, alloc: A) -> Vec<T, A> {
|
||||
if elem.is_zero() {
|
||||
return Vec { buf: RawVec::with_capacity_zeroed_in(n, alloc), len: n };
|
||||
|
|
@ -33,7 +31,6 @@ impl<T: Clone + IsZero> SpecFromElem for T {
|
|||
|
||||
impl SpecFromElem for i8 {
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
fn from_elem<A: Allocator>(elem: i8, n: usize, alloc: A) -> Vec<i8, A> {
|
||||
if elem == 0 {
|
||||
return Vec { buf: RawVec::with_capacity_zeroed_in(n, alloc), len: n };
|
||||
|
|
@ -49,7 +46,6 @@ impl SpecFromElem for i8 {
|
|||
|
||||
impl SpecFromElem for u8 {
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
fn from_elem<A: Allocator>(elem: u8, n: usize, alloc: A) -> Vec<u8, A> {
|
||||
if elem == 0 {
|
||||
return Vec { buf: RawVec::with_capacity_zeroed_in(n, alloc), len: n };
|
||||
|
|
|
|||
|
|
@ -29,14 +29,12 @@ impl<T, I> SpecFromIter<T, I> for Vec<T>
|
|||
where
|
||||
I: Iterator<Item = T>,
|
||||
{
|
||||
#[track_caller]
|
||||
default fn from_iter(iterator: I) -> Self {
|
||||
SpecFromIterNested::from_iter(iterator)
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> SpecFromIter<T, IntoIter<T>> for Vec<T> {
|
||||
#[track_caller]
|
||||
fn from_iter(iterator: IntoIter<T>) -> Self {
|
||||
// A common case is passing a vector into a function which immediately
|
||||
// re-collects into a vector. We can short circuit this if the IntoIter
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@ impl<T, I> SpecFromIterNested<T, I> for Vec<T>
|
|||
where
|
||||
I: Iterator<Item = T>,
|
||||
{
|
||||
#[track_caller]
|
||||
default fn from_iter(mut iterator: I) -> Self {
|
||||
// Unroll the first iteration, as the vector is going to be
|
||||
// expanded on this iteration in every case when the iterable is not
|
||||
|
|
@ -48,7 +47,6 @@ impl<T, I> SpecFromIterNested<T, I> for Vec<T>
|
|||
where
|
||||
I: TrustedLen<Item = T>,
|
||||
{
|
||||
#[track_caller]
|
||||
fn from_iter(iterator: I) -> Self {
|
||||
let mut vector = match iterator.size_hint() {
|
||||
(_, Some(upper)) => Vec::with_capacity(upper),
|
||||
|
|
|
|||
|
|
@ -52,7 +52,6 @@ impl<I: Iterator, A: Allocator> ExactSizeIterator for Splice<'_, I, A> {}
|
|||
|
||||
#[stable(feature = "vec_splice", since = "1.21.0")]
|
||||
impl<I: Iterator, A: Allocator> Drop for Splice<'_, I, A> {
|
||||
#[track_caller]
|
||||
fn drop(&mut self) {
|
||||
self.drain.by_ref().for_each(drop);
|
||||
// At this point draining is done and the only remaining tasks are splicing
|
||||
|
|
@ -124,7 +123,6 @@ impl<T, A: Allocator> Drain<'_, T, A> {
|
|||
}
|
||||
|
||||
/// Makes room for inserting more elements before the tail.
|
||||
#[track_caller]
|
||||
unsafe fn move_tail(&mut self, additional: usize) {
|
||||
let vec = unsafe { self.vec.as_mut() };
|
||||
let len = self.tail_start + self.tail_len;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
|
||||
thread 'main' ($TID) panicked at $DIR/panic-location.rs:LL:CC:
|
||||
thread 'main' ($TID) panicked at library/alloc/src/raw_vec/mod.rs:LL:CC:
|
||||
capacity overflow
|
||||
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue