miyuki created this revision. [libcxx] Fix basic_stringbuf constructor
The C++ Standard [stringbuf.cons]p1 defines the effects of the basic_stringbuf constructor that takes ios_base::openmode as follows: Effects: Constructs an object of class basic_stringbuf, initializing the base class with basic_streambuf(), and initializing mode with which. Postconditions: str() == "". The default constructor of basic_streambuf shall initialize all its pointer member objects to null pointers [streambuf.cons]p1. Currently libc++ calls "str(string_type());" in the aforementioned constructor setting basic_streambuf's pointers to a non-null value. This patch removes the call (note that the postcondition str() == "" remains valid because __str_ is default-initialized) and adds a test checking that the basic_streambuf's pointers are null after construction. https://reviews.llvm.org/D40707 Files: include/sstream test/std/input.output/string.streams/stringbuf/stringbuf.cons/default.pass.cpp Index: test/std/input.output/string.streams/stringbuf/stringbuf.cons/default.pass.cpp =================================================================== --- test/std/input.output/string.streams/stringbuf/stringbuf.cons/default.pass.cpp +++ test/std/input.output/string.streams/stringbuf/stringbuf.cons/default.pass.cpp @@ -17,6 +17,21 @@ #include <sstream> #include <cassert> +template<typename CharT> +struct testbuf + : std::basic_stringbuf<CharT> +{ + void check() + { + assert(this->eback() == 0); + assert(this->gptr() == 0); + assert(this->egptr() == 0); + assert(this->pbase() == 0); + assert(this->pptr() == 0); + assert(this->epptr() == 0); + } +}; + int main() { { @@ -27,4 +42,12 @@ std::wstringbuf buf; assert(buf.str() == L""); } + { + testbuf<char> buf; + buf.check(); + } + { + testbuf<wchar_t> buf; + buf.check(); + } } Index: include/sstream =================================================================== --- include/sstream +++ include/sstream @@ -243,7 +243,6 @@ : __hm_(0), __mode_(__wch) { - str(string_type()); } template <class _CharT, class _Traits, class _Allocator>
Index: test/std/input.output/string.streams/stringbuf/stringbuf.cons/default.pass.cpp =================================================================== --- test/std/input.output/string.streams/stringbuf/stringbuf.cons/default.pass.cpp +++ test/std/input.output/string.streams/stringbuf/stringbuf.cons/default.pass.cpp @@ -17,6 +17,21 @@ #include <sstream> #include <cassert> +template<typename CharT> +struct testbuf + : std::basic_stringbuf<CharT> +{ + void check() + { + assert(this->eback() == 0); + assert(this->gptr() == 0); + assert(this->egptr() == 0); + assert(this->pbase() == 0); + assert(this->pptr() == 0); + assert(this->epptr() == 0); + } +}; + int main() { { @@ -27,4 +42,12 @@ std::wstringbuf buf; assert(buf.str() == L""); } + { + testbuf<char> buf; + buf.check(); + } + { + testbuf<wchar_t> buf; + buf.check(); + } } Index: include/sstream =================================================================== --- include/sstream +++ include/sstream @@ -243,7 +243,6 @@ : __hm_(0), __mode_(__wch) { - str(string_type()); } template <class _CharT, class _Traits, class _Allocator>
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits