56
56
#[ cfg( not( no_global_oom_handling) ) ]
57
57
use core:: cmp;
58
58
use core:: cmp:: Ordering ;
59
- use core:: fmt;
60
59
use core:: hash:: { Hash , Hasher } ;
61
60
#[ cfg( not( no_global_oom_handling) ) ]
62
61
use core:: iter;
@@ -65,6 +64,7 @@ use core::mem::{self, ManuallyDrop, MaybeUninit, SizedTypeProperties};
65
64
use core:: ops:: { self , Index , IndexMut , Range , RangeBounds } ;
66
65
use core:: ptr:: { self , NonNull } ;
67
66
use core:: slice:: { self , SliceIndex } ;
67
+ use core:: { fmt, intrinsics} ;
68
68
69
69
#[ unstable( feature = "extract_if" , reason = "recently added" , issue = "43244" ) ]
70
70
pub use self :: extract_if:: ExtractIf ;
@@ -2675,7 +2675,14 @@ impl<T, A: Allocator> Vec<T, A> {
2675
2675
#[ rustc_const_unstable( feature = "const_vec_string_slice" , issue = "129041" ) ]
2676
2676
#[ rustc_confusables( "length" , "size" ) ]
2677
2677
pub const fn len ( & self ) -> usize {
2678
- self . len
2678
+ let len = self . len ;
2679
+
2680
+ // SAFETY: The maximum capacity of `Vec<T>` is `isize::MAX` bytes, so the maximum value can
2681
+ // be returned is `usize::checked_div(mem::size_of::<T>()).unwrap_or(usize::MAX)`, which
2682
+ // matches the definition of `T::MAX_SLICE_LEN`.
2683
+ unsafe { intrinsics:: assume ( len <= T :: MAX_SLICE_LEN ) } ;
2684
+
2685
+ len
2679
2686
}
2680
2687
2681
2688
/// Returns `true` if the vector contains no elements.
0 commit comments