@@ -85,7 +85,12 @@ impl<T, A: Allocator> IntoIter<T, A> {
8585 /// assert_eq!(into_iter.as_slice(), &['b', 'c']);
8686 /// ```
8787 #[ stable( feature = "vec_into_iter_as_slice" , since = "1.15.0" ) ]
88- pub fn as_slice ( & self ) -> & [ T ] {
88+ pub fn as_slice ( & self ) -> & [ T ]
89+ //@ req true;
90+ //@ ens true;
91+ /*@ safety_proof { assume(false); } @*/
92+ {
93+ //@ assume(false);
8994 unsafe { slice:: from_raw_parts ( self . ptr . as_ptr ( ) , self . len ( ) ) }
9095 }
9196
@@ -103,14 +108,24 @@ impl<T, A: Allocator> IntoIter<T, A> {
103108 /// assert_eq!(into_iter.next().unwrap(), 'z');
104109 /// ```
105110 #[ stable( feature = "vec_into_iter_as_slice" , since = "1.15.0" ) ]
106- pub fn as_mut_slice ( & mut self ) -> & mut [ T ] {
111+ pub fn as_mut_slice ( & mut self ) -> & mut [ T ]
112+ //@ req true;
113+ //@ ens true;
114+ /*@ safety_proof { assume(false); } @*/
115+ {
116+ //@ assume(false);
107117 unsafe { & mut * self . as_raw_mut_slice ( ) }
108118 }
109119
110120 /// Returns a reference to the underlying allocator.
111121 #[ unstable( feature = "allocator_api" , issue = "32838" ) ]
112122 #[ inline]
113- pub fn allocator ( & self ) -> & A {
123+ pub fn allocator ( & self ) -> & A
124+ //@ req true;
125+ //@ ens true;
126+ /*@ safety_proof { assume(false); } @*/
127+ {
128+ //@ assume(false);
114129 & self . alloc
115130 }
116131
@@ -159,7 +174,12 @@ impl<T, A: Allocator> IntoIter<T, A> {
159174 }
160175
161176 /// Forgets to Drop the remaining elements while still allowing the backing allocation to be freed.
162- pub ( crate ) fn forget_remaining_elements ( & mut self ) {
177+ pub ( crate ) fn forget_remaining_elements ( & mut self )
178+ //@ req true;
179+ //@ ens true;
180+ /*@ safety_proof { assume(false); } @*/
181+ {
182+ //@ assume(false);
163183 // For the ZST case, it is crucial that we mutate `end` here, not `ptr`.
164184 // `ptr` must stay aligned, while `end` may be unaligned.
165185 self . end = self . ptr . as_ptr ( ) ;
@@ -195,7 +215,12 @@ impl<T, A: Allocator> IntoIter<T, A> {
195215
196216#[ stable( feature = "vec_intoiter_as_ref" , since = "1.46.0" ) ]
197217impl < T , A : Allocator > AsRef < [ T ] > for IntoIter < T , A > {
198- fn as_ref ( & self ) -> & [ T ] {
218+ fn as_ref ( & self ) -> & [ T ]
219+ //@ req true;
220+ //@ ens true;
221+ /*@ safety_proof { assume(false); } @*/
222+ {
223+ //@ assume(false);
199224 self . as_slice ( )
200225 }
201226}
@@ -210,7 +235,12 @@ impl<T, A: Allocator> Iterator for IntoIter<T, A> {
210235 type Item = T ;
211236
212237 #[ inline]
213- fn next ( & mut self ) -> Option < T > {
238+ fn next ( & mut self ) -> Option < T >
239+ //@ req thread_token(?t) &*& *self |-> ?self0 &*& <IntoIter<T, A>>.own(t, self0);
240+ //@ ens thread_token(t) &*& *self |-> ?self1 &*& <IntoIter<T, A>>.own(t, self1) &*& <std::option::Option<T>>.own(t, result);
241+ //@ on_unwind_ens false;
242+ {
243+ //@ assume(false);
214244 let ptr = if T :: IS_ZST {
215245 if self . ptr . as_ptr ( ) == self . end as * mut T {
216246 return None ;
@@ -231,7 +261,12 @@ impl<T, A: Allocator> Iterator for IntoIter<T, A> {
231261 }
232262
233263 #[ inline]
234- fn size_hint ( & self ) -> ( usize , Option < usize > ) {
264+ fn size_hint ( & self ) -> ( usize , Option < usize > )
265+ //@ req true;
266+ //@ ens true;
267+ /*@ safety_proof { assume(false); } @*/
268+ {
269+ //@ assume(false);
235270 let exact = if T :: IS_ZST {
236271 self . end . addr ( ) . wrapping_sub ( self . ptr . as_ptr ( ) . addr ( ) )
237272 } else {
@@ -241,7 +276,12 @@ impl<T, A: Allocator> Iterator for IntoIter<T, A> {
241276 }
242277
243278 #[ inline]
244- fn advance_by ( & mut self , n : usize ) -> Result < ( ) , NonZero < usize > > {
279+ fn advance_by ( & mut self , n : usize ) -> Result < ( ) , NonZero < usize > >
280+ //@ req true;
281+ //@ ens true;
282+ /*@ safety_proof { assume(false); } @*/
283+ {
284+ //@ assume(false);
245285 let step_size = self . len ( ) . min ( n) ;
246286 let to_drop = ptr:: slice_from_raw_parts_mut ( self . ptr . as_ptr ( ) , step_size) ;
247287 if T :: IS_ZST {
@@ -259,12 +299,22 @@ impl<T, A: Allocator> Iterator for IntoIter<T, A> {
259299 }
260300
261301 #[ inline]
262- fn count ( self ) -> usize {
302+ fn count ( self ) -> usize
303+ //@ req true;
304+ //@ ens true;
305+ /*@ safety_proof { assume(false); } @*/
306+ {
307+ //@ assume(false);
263308 self . len ( )
264309 }
265310
266311 #[ inline]
267- fn last ( mut self ) -> Option < T > {
312+ fn last ( mut self ) -> Option < T >
313+ //@ req true;
314+ //@ ens true;
315+ /*@ safety_proof { assume(false); } @*/
316+ {
317+ //@ assume(false);
268318 self . next_back ( )
269319 }
270320
@@ -364,7 +414,10 @@ impl<T, A: Allocator> Iterator for IntoIter<T, A> {
364414 unsafe fn __iterator_get_unchecked ( & mut self , i : usize ) -> Self :: Item
365415 where
366416 Self : TrustedRandomAccessNoCoerce ,
417+ //@ req true;
418+ //@ ens true;
367419 {
420+ //@ assume(false);
368421 // SAFETY: the caller must guarantee that `i` is in bounds of the
369422 // `Vec<T>`, so `i` cannot overflow an `isize`, and the `self.ptr.add(i)`
370423 // is guaranteed to pointer to an element of the `Vec<T>` and
@@ -380,7 +433,12 @@ impl<T, A: Allocator> Iterator for IntoIter<T, A> {
380433#[ stable( feature = "rust1" , since = "1.0.0" ) ]
381434impl < T , A : Allocator > DoubleEndedIterator for IntoIter < T , A > {
382435 #[ inline]
383- fn next_back ( & mut self ) -> Option < T > {
436+ fn next_back ( & mut self ) -> Option < T >
437+ //@ req true;
438+ //@ ens true;
439+ /*@ safety_proof { assume(false); } @*/
440+ {
441+ //@ assume(false);
384442 if T :: IS_ZST {
385443 if self . ptr . as_ptr ( ) == self . end as * mut _ {
386444 return None ;
@@ -403,7 +461,12 @@ impl<T, A: Allocator> DoubleEndedIterator for IntoIter<T, A> {
403461 }
404462
405463 #[ inline]
406- fn advance_back_by ( & mut self , n : usize ) -> Result < ( ) , NonZero < usize > > {
464+ fn advance_back_by ( & mut self , n : usize ) -> Result < ( ) , NonZero < usize > >
465+ //@ req true;
466+ //@ ens true;
467+ /*@ safety_proof { assume(false); } @*/
468+ {
469+ //@ assume(false);
407470 let step_size = self . len ( ) . min ( n) ;
408471 if T :: IS_ZST {
409472 // SAFETY: same as for advance_by()
@@ -423,7 +486,12 @@ impl<T, A: Allocator> DoubleEndedIterator for IntoIter<T, A> {
423486
424487#[ stable( feature = "rust1" , since = "1.0.0" ) ]
425488impl < T , A : Allocator > ExactSizeIterator for IntoIter < T , A > {
426- fn is_empty ( & self ) -> bool {
489+ fn is_empty ( & self ) -> bool
490+ //@ req true;
491+ //@ ens true;
492+ /*@ safety_proof { assume(false); } @*/
493+ {
494+ //@ assume(false);
427495 if T :: IS_ZST {
428496 self . ptr . as_ptr ( ) == self . end as * mut _
429497 } else {
@@ -455,7 +523,12 @@ where
455523 /// assert_eq!(iter.len(), 0);
456524 /// assert_eq!(iter.as_slice(), &[]);
457525 /// ```
458- fn default ( ) -> Self {
526+ fn default ( ) -> Self
527+ //@ req true;
528+ //@ ens true;
529+ /*@ safety_proof { assume(false); } @*/
530+ {
531+ //@ assume(false);
459532 super :: Vec :: new_in ( Default :: default ( ) ) . into_iter ( )
460533 }
461534}
@@ -491,7 +564,14 @@ impl<T: Clone, A: Allocator + Clone> Clone for IntoIter<T, A> {
491564
492565#[ stable( feature = "rust1" , since = "1.0.0" ) ]
493566unsafe impl < #[ may_dangle] T , A : Allocator > Drop for IntoIter < T , A > {
494- fn drop ( & mut self ) {
567+ fn drop ( & mut self )
568+ //@ req thread_token(?t) &*& t == currentThread &*& <IntoIter<T, A>>.full_borrow_content(t, self)();
569+ //@ ens thread_token(t) &*& (*self).buf |-> ?buf &*& (std::ptr::NonNull_own::<T>())(t, buf) &*& (*self).cap |-> ?cap &*& (*self).alloc |-> ?alloc &*& <A>.own(t, alloc) &*& (*self).ptr |-> ?ptr &*& (std::ptr::NonNull_own::<T>())(t, ptr) &*& (*self).end |-> ?end &*& struct_IntoIter_padding(self);
570+ {
571+ //@ open <IntoIter<T, A>>.full_borrow_content(t, self)();
572+ //@ open <IntoIter<T, A>>.own(t, *self);
573+ //@ open_points_to(self);
574+ //@ assume(false);
495575 struct DropGuard < ' a , T , A : Allocator > ( & ' a mut IntoIter < T , A > ) ;
496576
497577 impl < T , A : Allocator > Drop for DropGuard < ' _ , T , A > {
@@ -529,7 +609,11 @@ unsafe impl<T, A: Allocator> SourceIter for IntoIter<T, A> {
529609 type Source = Self ;
530610
531611 #[ inline]
532- unsafe fn as_inner ( & mut self ) -> & mut Self :: Source {
612+ unsafe fn as_inner ( & mut self ) -> & mut Self :: Source
613+ //@ req true;
614+ //@ ens true;
615+ {
616+ //@ assume(false);
533617 self
534618 }
535619}
0 commit comments