summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhihao Yuan <zy@miator.net>2017-12-13 18:12:55 +0000
committerZhihao Yuan <zy@miator.net>2017-12-13 18:12:55 +0000
commit4159a369fe70669111b550f9708f1c1be87d1925 (patch)
tree496ad3f256e565c49d09b764c0e4f0ba12975a2d
parent851ea6e01a3960f33a3fae43e1ff08eefb6b4d10 (diff)
[libcxx] Fix basic_stringbuf constructor
Summary: [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. Thanks Mikhail Maltsev for the patch. Reviewers: EricWF, mclow.lists Reviewed By: mclow.lists Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D40707 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@320604 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/sstream1
-rw-r--r--test/std/input.output/string.streams/stringbuf/stringbuf.cons/default.pass.cpp23
2 files changed, 23 insertions, 1 deletions
diff --git a/include/sstream b/include/sstream
index 31cb37a1e..34b0014c1 100644
--- a/include/sstream
+++ b/include/sstream
@@ -243,7 +243,6 @@ basic_stringbuf<_CharT, _Traits, _Allocator>::basic_stringbuf(ios_base::openmode
: __hm_(0),
__mode_(__wch)
{
- str(string_type());
}
template <class _CharT, class _Traits, class _Allocator>
diff --git a/test/std/input.output/string.streams/stringbuf/stringbuf.cons/default.pass.cpp b/test/std/input.output/string.streams/stringbuf/stringbuf.cons/default.pass.cpp
index 28007c8ed..af2cccc96 100644
--- a/test/std/input.output/string.streams/stringbuf/stringbuf.cons/default.pass.cpp
+++ b/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() == NULL);
+ assert(this->gptr() == NULL);
+ assert(this->egptr() == NULL);
+ assert(this->pbase() == NULL);
+ assert(this->pptr() == NULL);
+ assert(this->epptr() == NULL);
+ }
+};
+
int main()
{
{
@@ -27,4 +42,12 @@ int main()
std::wstringbuf buf;
assert(buf.str() == L"");
}
+ {
+ testbuf<char> buf;
+ buf.check();
+ }
+ {
+ testbuf<wchar_t> buf;
+ buf.check();
+ }
}