diff --git a/llvm/include/llvm/Support/raw_ostream.h b/llvm/include/llvm/Support/raw_ostream.h --- a/llvm/include/llvm/Support/raw_ostream.h +++ b/llvm/include/llvm/Support/raw_ostream.h @@ -625,6 +625,9 @@ /// A raw_ostream that writes to an std::string. This is a simple adaptor /// class. This class does not encounter output errors. +/// raw_string_ostream operates without a buffer, delegating all memory +/// management to the std::string. Thus the std::string is always up-to-date, +/// may be used directly and there is no need to call flush(). class raw_string_ostream : public raw_ostream { std::string &OS; @@ -639,14 +642,11 @@ explicit raw_string_ostream(std::string &O) : OS(O) { SetUnbuffered(); } - ~raw_string_ostream() override; - /// Flushes the stream contents to the target string and returns the string's - /// reference. - std::string& str() { - flush(); - return OS; - } + /// Returns the string's reference. In most cases it is better to simply use + /// the underlying std::string directly. + /// TODO: Consider removing this API. + std::string &str() { return OS; } void reserveExtraSpace(uint64_t ExtraSize) override { OS.reserve(tell() + ExtraSize); diff --git a/llvm/lib/Support/raw_ostream.cpp b/llvm/lib/Support/raw_ostream.cpp --- a/llvm/lib/Support/raw_ostream.cpp +++ b/llvm/lib/Support/raw_ostream.cpp @@ -937,10 +937,6 @@ // raw_string_ostream //===----------------------------------------------------------------------===// -raw_string_ostream::~raw_string_ostream() { - flush(); -} - void raw_string_ostream::write_impl(const char *Ptr, size_t Size) { OS.append(Ptr, Size); } diff --git a/llvm/unittests/Support/raw_ostream_test.cpp b/llvm/unittests/Support/raw_ostream_test.cpp --- a/llvm/unittests/Support/raw_ostream_test.cpp +++ b/llvm/unittests/Support/raw_ostream_test.cpp @@ -21,11 +21,10 @@ template std::string printToString(const T &Value) { std::string res; - { - llvm::raw_string_ostream OS(res); - OS.SetBuffered(); - OS << Value; - } + llvm::raw_string_ostream OS(res); + OS.SetBuffered(); + OS << Value; + OS.flush(); return res; } @@ -141,7 +140,8 @@ OS << "hello"; OS << 1; OS << 'w' << 'o' << 'r' << 'l' << 'd'; - EXPECT_EQ("hello1world", OS.str()); + OS.flush(); + EXPECT_EQ("hello1world", Str); } TEST(raw_ostreamTest, WriteEscaped) { @@ -457,6 +457,9 @@ TiedTo << "y"; TiedStream << "0"; EXPECT_EQ("acegostuv", TiedToBuffer); + + TiedTo.flush(); + TiedStream.flush(); } TEST(raw_ostreamTest, reserve_stream) {