diff --git a/llvm/include/llvm/ADT/SmallString.h b/llvm/include/llvm/ADT/SmallString.h --- a/llvm/include/llvm/ADT/SmallString.h +++ b/llvm/include/llvm/ADT/SmallString.h @@ -275,6 +275,9 @@ /// Implicit conversion to StringRef. operator StringRef() const { return str(); } + // Explicit conversion to std::string. + explicit operator std::string() const { return str().str(); } + // Extra operators. const SmallString &operator=(StringRef RHS) { this->clear(); diff --git a/llvm/unittests/ADT/SmallStringTest.cpp b/llvm/unittests/ADT/SmallStringTest.cpp --- a/llvm/unittests/ADT/SmallStringTest.cpp +++ b/llvm/unittests/ADT/SmallStringTest.cpp @@ -96,6 +96,20 @@ EXPECT_STREQ("abcabc", theString.c_str()); } +TEST_F(SmallStringTest, StringRefConversion) { + StringRef abc = "abc"; + theString.assign(abc.begin(), abc.end()); + StringRef theStringRef = theString; + EXPECT_EQ("abc", theStringRef); +} + +TEST_F(SmallStringTest, StdStringConversion) { + StringRef abc = "abc"; + theString.assign(abc.begin(), abc.end()); + std::string theStdString = std::string(theString); + EXPECT_EQ("abc", theStdString); +} + TEST_F(SmallStringTest, Substr) { theString = "hello"; EXPECT_EQ("lo", theString.substr(3));