15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
95a83710eSEric Fiselier // <sstream>
105a83710eSEric Fiselier 
115a83710eSEric Fiselier // template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
125a83710eSEric Fiselier // class basic_stringbuf
135a83710eSEric Fiselier 
14*a11f8b1aSMarek Kurdej // explicit basic_stringbuf(ios_base::openmode which = ios_base::in | ios_base::out); // before C++20
15*a11f8b1aSMarek Kurdej // basic_stringbuf() : basic_stringbuf(ios_base::in | ios_base::out) {}               // C++20
16*a11f8b1aSMarek Kurdej // explicit basic_stringbuf(ios_base::openmode which);                                // C++20
175a83710eSEric Fiselier 
185a83710eSEric Fiselier #include <sstream>
195a83710eSEric Fiselier #include <cassert>
205a83710eSEric Fiselier 
217fc6a556SMarshall Clow #include "test_macros.h"
22*a11f8b1aSMarek Kurdej #if TEST_STD_VER >= 11
23*a11f8b1aSMarek Kurdej #include "test_convertible.h"
24*a11f8b1aSMarek Kurdej #endif
257fc6a556SMarshall Clow 
26378ae52bSZhihao Yuan template<typename CharT>
27378ae52bSZhihao Yuan struct testbuf
28378ae52bSZhihao Yuan     : std::basic_stringbuf<CharT>
29378ae52bSZhihao Yuan {
30378ae52bSZhihao Yuan     void check()
31378ae52bSZhihao Yuan     {
32378ae52bSZhihao Yuan         assert(this->eback() == NULL);
33378ae52bSZhihao Yuan         assert(this->gptr() == NULL);
34378ae52bSZhihao Yuan         assert(this->egptr() == NULL);
35378ae52bSZhihao Yuan         assert(this->pbase() == NULL);
36378ae52bSZhihao Yuan         assert(this->pptr() == NULL);
37378ae52bSZhihao Yuan         assert(this->epptr() == NULL);
38378ae52bSZhihao Yuan     }
39378ae52bSZhihao Yuan };
40378ae52bSZhihao Yuan 
412df59c50SJF Bastien int main(int, char**)
425a83710eSEric Fiselier {
435a83710eSEric Fiselier     {
445a83710eSEric Fiselier         std::stringbuf buf;
455a83710eSEric Fiselier         assert(buf.str() == "");
465a83710eSEric Fiselier     }
475a83710eSEric Fiselier     {
485a83710eSEric Fiselier         std::wstringbuf buf;
495a83710eSEric Fiselier         assert(buf.str() == L"");
505a83710eSEric Fiselier     }
51378ae52bSZhihao Yuan     {
52378ae52bSZhihao Yuan         testbuf<char> buf;
53378ae52bSZhihao Yuan         buf.check();
54378ae52bSZhihao Yuan     }
55378ae52bSZhihao Yuan     {
56378ae52bSZhihao Yuan         testbuf<wchar_t> buf;
57378ae52bSZhihao Yuan         buf.check();
58378ae52bSZhihao Yuan     }
592df59c50SJF Bastien 
60*a11f8b1aSMarek Kurdej #if TEST_STD_VER >= 11
61*a11f8b1aSMarek Kurdej     {
62*a11f8b1aSMarek Kurdej       typedef std::stringbuf B;
63*a11f8b1aSMarek Kurdej       static_assert(test_convertible<B>(), "");
64*a11f8b1aSMarek Kurdej       static_assert(!test_convertible<B, std::ios_base::openmode>(), "");
65*a11f8b1aSMarek Kurdej     }
66*a11f8b1aSMarek Kurdej #endif
67*a11f8b1aSMarek Kurdej 
682df59c50SJF Bastien     return 0;
695a83710eSEric Fiselier }
70