[llvm] r243995 - [ArrayRef] Make copy use std::uninitialized_copy.
Benjamin Kramer
benny.kra at gmail.com
Wed Aug 5 02:47:33 PDT 2015
On Wed, Aug 5, 2015 at 7:57 AM, Yaron Keren <yaron.keren at gmail.com> wrote:
> gcc 4.8 fails the unit test, see the bots.
Reenabled the test for GCC 4.8 in r244023. Sorry for the breakage.
- Ben
> 2015-08-04 18:52 GMT+03:00 Benjamin Kramer <benny.kra at googlemail.com>:
>>
>> Author: d0k
>> Date: Tue Aug 4 10:52:56 2015
>> New Revision: 243995
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=243995&view=rev
>> Log:
>> [ArrayRef] Make copy use std::uninitialized_copy.
>>
>> std::copy does not work for non-trivially copyable classes when we're
>> copying into uninitialized memory.
>>
>> Modified:
>> llvm/trunk/include/llvm/ADT/ArrayRef.h
>> llvm/trunk/unittests/ADT/ArrayRefTest.cpp
>>
>> Modified: llvm/trunk/include/llvm/ADT/ArrayRef.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ArrayRef.h?rev=243995&r1=243994&r2=243995&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/ADT/ArrayRef.h (original)
>> +++ llvm/trunk/include/llvm/ADT/ArrayRef.h Tue Aug 4 10:52:56 2015
>> @@ -148,7 +148,7 @@ namespace llvm {
>> // copy - Allocate copy in Allocator and return ArrayRef<T> to it.
>> template <typename Allocator> ArrayRef<T> copy(Allocator &A) {
>> T *Buff = A.template Allocate<T>(Length);
>> - std::copy(begin(), end(), Buff);
>> + std::uninitialized_copy(begin(), end(), Buff);
>> return ArrayRef<T>(Buff, Length);
>> }
>>
>>
>> Modified: llvm/trunk/unittests/ADT/ArrayRefTest.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/ArrayRefTest.cpp?rev=243995&r1=243994&r2=243995&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/unittests/ADT/ArrayRefTest.cpp (original)
>> +++ llvm/trunk/unittests/ADT/ArrayRefTest.cpp Tue Aug 4 10:52:56 2015
>> @@ -31,7 +31,7 @@ static_assert(
>> !std::is_convertible<ArrayRef<volatile int *>, ArrayRef<int
>> *>>::value,
>> "Removing volatile");
>>
>> -namespace llvm {
>> +namespace {
>>
>> TEST(ArrayRefTest, AllocatorCopy) {
>> BumpPtrAllocator Alloc;
>> @@ -45,6 +45,18 @@ TEST(ArrayRefTest, AllocatorCopy) {
>> EXPECT_NE(Array1.data(), Array1c.data());
>> EXPECT_TRUE(Array2.equals(Array2c));
>> EXPECT_NE(Array2.data(), Array2c.data());
>> +
>> + // Check that copy can cope with uninitialized memory.
>> + struct NonAssignable {
>> + const char *Ptr;
>> +
>> + NonAssignable(const NonAssignable &RHS) = default;
>> + void operator=(const NonAssignable &RHS) { assert(RHS.Ptr !=
>> nullptr); }
>> + bool operator==(const NonAssignable &RHS) const { return Ptr ==
>> RHS.Ptr; }
>> + } Array3Src[] = {{"hello"}, {"world"}};
>> + ArrayRef<NonAssignable> Array3Copy =
>> makeArrayRef(Array3Src).copy(Alloc);
>> + EXPECT_EQ(makeArrayRef(Array3Src), Array3Copy);
>> + EXPECT_NE(makeArrayRef(Array3Src).data(), Array3Copy.data());
>> }
>>
>> TEST(ArrayRefTest, DropBack) {
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
More information about the llvm-commits
mailing list