     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28

    // Set the length of the vec when the `SetLenOnDrop` value goes out of scope.
    //
    // The idea is: The length field in SetLenOnDrop is a local variable
    // that the optimizer will see does not alias with any stores through the Vec's data
    // pointer. This is a workaround for alias analysis issue #32155
    pub(super) struct SetLenOnDrop<'a> {
        len: &'a mut usize,
        local_len: usize,
    }

    impl<'a> SetLenOnDrop<'a> {
        #[inline]
        pub(super) fn new(len: &'a mut usize) -> Self {
            SetLenOnDrop { local_len: *len, len }
        }

        #[inline]
        pub(super) fn increment_len(&mut self, increment: usize) {
            self.local_len += increment;
        }
    }

    impl Drop for SetLenOnDrop<'_> {
        #[inline]
        fn drop(&mut self) {
            *self.len = self.local_len;
        }
    }