Skip to content

Commit 0c887cf

Browse files
committed
Update pop_back
1 parent 356598c commit 0c887cf

File tree

2 files changed

+10
-2
lines changed

2 files changed

+10
-2
lines changed

include/beman/inplace_vector/inplace_vector.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -396,8 +396,10 @@ struct inplace_vector_base : private storage::storage_for<T, N> {
396396

397397
constexpr void pop_back() {
398398
IV_EXPECT(size() > 0 && "pop_back from empty inplace_vector!");
399-
unsafe_destroy(end() - 1, end());
400-
unsafe_set_size(size() - 1);
399+
if (size() > 0) { // UB fail-safe
400+
unsafe_destroy(end() - 1, end());
401+
unsafe_set_size(size() - 1);
402+
}
401403
}
402404

403405
constexpr friend bool operator==(const inplace_vector_base &x,

tests/beman/inplace_vector/freestanding.test.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,11 +314,17 @@ TEST(Freestanding, usage) {
314314

315315
EXPECT_EQ(device.size(), device.capacity());
316316

317+
EXPECT_EQ(nullptr, device.try_emplace_back(T{}));
318+
319+
EXPECT_EQ(device.size(), device.capacity());
320+
317321
for (auto i = int(device.capacity()); i > 0; --i) {
318322
const auto value = T{i - 1};
319323
EXPECT_EQ(device.back(), value);
320324
device.pop_back();
321325
}
322326

327+
device.pop_back(); // UB should be safe
328+
323329
EXPECT_EQ(device.size(), 0);
324330
}

0 commit comments

Comments
 (0)