diff options
Diffstat (limited to 'absl/container')
-rw-r--r-- | absl/container/inlined_vector_test.cc | 6 | ||||
-rw-r--r-- | absl/container/internal/inlined_vector.h | 21 |
2 files changed, 14 insertions, 13 deletions
diff --git a/absl/container/inlined_vector_test.cc b/absl/container/inlined_vector_test.cc index 07304518..5acad650 100644 --- a/absl/container/inlined_vector_test.cc +++ b/absl/container/inlined_vector_test.cc @@ -1626,6 +1626,12 @@ TEST(DynamicVec, CreateNonEmptyDynamicVec) { EXPECT_EQ(v.size(), 1u); } +TEST(DynamicVec, EmplaceBack) { + DynamicVec v; + v.emplace_back(Dynamic{}); + EXPECT_EQ(v.size(), 1u); +} + TEST(AllocatorSupportTest, Constructors) { using MyAlloc = CountingAllocator<int>; using AllocVec = absl::InlinedVector<int, 4, MyAlloc>; diff --git a/absl/container/internal/inlined_vector.h b/absl/container/internal/inlined_vector.h index 639bf145..cdfd868e 100644 --- a/absl/container/internal/inlined_vector.h +++ b/absl/container/internal/inlined_vector.h @@ -390,25 +390,20 @@ class Storage { return data_.allocated.allocated_data; } - Pointer<A> GetInlinedData() { - return reinterpret_cast<Pointer<A>>(data_.inlined.inlined_data); - } - - ConstPointer<A> GetInlinedData() const { - return reinterpret_cast<ConstPointer<A>>(data_.inlined.inlined_data); - } - - // Like GetInlinedData(), but for data that has not been constructed yet. The - // only difference is ABSL_ATTRIBUTE_NO_SANITIZE_CFI, which is necessary - // because the object is uninitialized. + // ABSL_ATTRIBUTE_NO_SANITIZE_CFI is used because the memory pointed to may be + // uninitialized, a common pattern in allocate()+construct() APIs. // https://clang.llvm.org/docs/ControlFlowIntegrity.html#bad-cast-checking // NOTE: When this was written, LLVM documentation did not explicitly // mention that casting `char*` and using `reinterpret_cast` qualifies // as a bad cast. - ABSL_ATTRIBUTE_NO_SANITIZE_CFI Pointer<A> GetInlinedDataUninitialized() { + ABSL_ATTRIBUTE_NO_SANITIZE_CFI Pointer<A> GetInlinedData() { return reinterpret_cast<Pointer<A>>(data_.inlined.inlined_data); } + ConstPointer<A> GetInlinedData() const { + return reinterpret_cast<ConstPointer<A>>(data_.inlined.inlined_data); + } + SizeType<A> GetAllocatedCapacity() const { return data_.allocated.allocated_capacity; } @@ -637,7 +632,7 @@ auto Storage<T, N, A>::Initialize(ValueAdapter values, SizeType<A> new_size) SetAllocation(allocation); SetIsAllocated(); } else { - construct_data = GetInlinedDataUninitialized(); + construct_data = GetInlinedData(); } ConstructElements<A>(GetAllocator(), construct_data, values, new_size); |