Skip to content

Commit 3ff159b

Browse files
committed
Add invariant to Vec::pop that len < cap if pop successful
Fixes: #114334
1 parent f475098 commit 3ff159b

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

library/alloc/src/vec/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1903,6 +1903,7 @@ impl<T, A: Allocator> Vec<T, A> {
19031903
} else {
19041904
unsafe {
19051905
self.len -= 1;
1906+
core::intrinsics::assume(self.len < self.capacity());
19061907
Some(ptr::read(self.as_ptr().add(self.len())))
19071908
}
19081909
}

tests/codegen/vec_pop_push_noop.rs

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// compile-flags: -O
2+
3+
#![crate_type = "lib"]
4+
5+
#[no_mangle]
6+
pub fn noop(v: &mut Vec<u8>) {
7+
// CHECK: start:
8+
// CHECK-NEXT: getelementptr
9+
// CHECK-NEXT: load
10+
// CHECK-NEXT: icmp eq
11+
// CHECK-NEXT: br
12+
13+
// CHECK: add
14+
// CHECK-NEXT: getelementptr
15+
// CHECK-NEXT: load
16+
// CHECK-NEXT: icmp
17+
// CHECK-NEXT: tail call
18+
// CHECK-NEXT: br label %bb3
19+
20+
// CHECK: bb3:
21+
// CHECK-NEXT: ret void
22+
if let Some(x) = v.pop() {
23+
v.push(x)
24+
}
25+
}

0 commit comments

Comments
 (0)