diff --git a/llvm/include/llvm/ADT/StringExtras.h b/llvm/include/llvm/ADT/StringExtras.h --- a/llvm/include/llvm/ADT/StringExtras.h +++ b/llvm/include/llvm/ADT/StringExtras.h @@ -58,10 +58,19 @@ inline StringRef toStringRef(ArrayRef Input) { return StringRef(reinterpret_cast(Input.begin()), Input.size()); } +inline StringRef toStringRef(ArrayRef Input) { + return StringRef(Input.begin(), Input.size()); +} /// Construct a string ref from an array ref of unsigned chars. -inline ArrayRef arrayRefFromStringRef(StringRef Input) { - return {Input.bytes_begin(), Input.bytes_end()}; +template +inline ArrayRef arrayRefFromStringRef(StringRef Input) { + static_assert(std::is_same::value || + std::is_same::value || + std::is_same::value, + "Expected byte type"); + return ArrayRef(reinterpret_cast(Input.data()), + Input.size()); } /// Interpret the given character \p C as a hexadecimal digit and return its diff --git a/llvm/unittests/ADT/StringExtrasTest.cpp b/llvm/unittests/ADT/StringExtrasTest.cpp --- a/llvm/unittests/ADT/StringExtrasTest.cpp +++ b/llvm/unittests/ADT/StringExtrasTest.cpp @@ -362,3 +362,14 @@ Result.push_back(x); EXPECT_THAT(Result, testing::ElementsAre("foo", "bar", "", "baz")); } + +TEST(StringExtrasTest, arrayToStringRef) { + auto roundTripTestString = [](llvm::StringRef Str) { + EXPECT_EQ(Str, toStringRef(arrayRefFromStringRef(Str))); + EXPECT_EQ(Str, toStringRef(arrayRefFromStringRef(Str))); + }; + roundTripTestString(""); + roundTripTestString("foo"); + roundTripTestString("\0\n"); + roundTripTestString("\xFF\xFE"); +}