diff options
| author | Pete Cooper <peter_cooper@apple.com> | 2016-03-23 21:49:31 +0000 |
|---|---|---|
| committer | Pete Cooper <peter_cooper@apple.com> | 2016-03-23 21:49:31 +0000 |
| commit | b08d9060b77ee35d278397dfca54a72a86c3a9bb (patch) | |
| tree | 6004f37b8f47d10989b721e7ff9078aa0b98463b | |
| parent | f43c2a0b4967626c7255940a7317ec4c8c9e9319 (diff) | |
| download | bcm5719-llvm-b08d9060b77ee35d278397dfca54a72a86c3a9bb.tar.gz bcm5719-llvm-b08d9060b77ee35d278397dfca54a72a86c3a9bb.zip | |
StringRef::copy shouldn't allocate anything for length 0 strings.
The BumpPtrAllocator currently doesn't handle zero length allocations well.
The discussion for how to fix that is ongoing. However, there's no need
for StringRef::copy to actually allocate anything here anyway, so just
return StringRef() when we get a zero length copy.
Reviewed by David Blaikie
llvm-svn: 264201
| -rw-r--r-- | llvm/include/llvm/ADT/StringRef.h | 3 | ||||
| -rw-r--r-- | llvm/unittests/ADT/StringRefTest.cpp | 9 |
2 files changed, 12 insertions, 0 deletions
diff --git a/llvm/include/llvm/ADT/StringRef.h b/llvm/include/llvm/ADT/StringRef.h index 90d0a159dcd..f1189690ffb 100644 --- a/llvm/include/llvm/ADT/StringRef.h +++ b/llvm/include/llvm/ADT/StringRef.h @@ -133,6 +133,9 @@ namespace llvm { // copy - Allocate copy in Allocator and return StringRef to it. template <typename Allocator> StringRef copy(Allocator &A) const { + // Don't request a length 0 copy from the allocator. + if (empty()) + return StringRef(); char *S = A.template Allocate<char>(Length); std::copy(begin(), end(), S); return StringRef(S, Length); diff --git a/llvm/unittests/ADT/StringRefTest.cpp b/llvm/unittests/ADT/StringRefTest.cpp index 6354026d7ae..66e5944b56e 100644 --- a/llvm/unittests/ADT/StringRefTest.cpp +++ b/llvm/unittests/ADT/StringRefTest.cpp @@ -589,6 +589,15 @@ TEST(StringRefTest, joinStrings) { TEST(StringRefTest, AllocatorCopy) { BumpPtrAllocator Alloc; + // First test empty strings. We don't want these to allocate anything on the + // allocator. + StringRef StrEmpty = ""; + StringRef StrEmptyc = StrEmpty.copy(Alloc); + EXPECT_TRUE(StrEmpty.equals(StrEmptyc)); + EXPECT_EQ(StrEmptyc.data(), nullptr); + EXPECT_EQ(StrEmptyc.size(), 0u); + EXPECT_EQ(Alloc.getTotalMemory(), 0u); + StringRef Str1 = "hello"; StringRef Str2 = "bye"; StringRef Str1c = Str1.copy(Alloc); |

