1// Copyright (C) 2004-2015 Free Software Foundation, Inc. 2// 3// This file is part of the GNU ISO C++ Library. This library is free 4// software; you can redistribute it and/or modify it under the 5// terms of the GNU General Public License as published by the 6// Free Software Foundation; either version 3, or (at your option) 7// any later version. 8 9// This library is distributed in the hope that it will be useful, 10// but WITHOUT ANY WARRANTY; without even the implied warranty of 11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12// GNU General Public License for more details. 13 14// You should have received a copy of the GNU General Public License along 15// with this library; see the file COPYING3. If not see 16// <http://www.gnu.org/licenses/>. 17 18// 27.7.6 member functions (stringstream_members) 19 20#include <sstream> 21#include <testsuite_hooks.h> 22 23void 24redirect_buffer(std::wios& stream, std::wstreambuf* new_buf) 25{ stream.rdbuf(new_buf); } 26 27std::wstreambuf* 28active_buffer(std::wios& stream) 29{ return stream.rdbuf(); } 30 31// libstdc++/2832 32void test02() 33{ 34 bool test __attribute__((unused)) = true; 35 const wchar_t* strlit01 = L"fuck war"; 36 const std::wstring str00; 37 const std::wstring str01(strlit01); 38 std::wstring str02; 39 std::wstringbuf sbuf(str01); 40 std::wstreambuf* pbasebuf0 = &sbuf; 41 42 std::wstringstream sstrm1; 43 VERIFY( sstrm1.str() == str00 ); 44 // derived rdbuf() always returns original streambuf, even though 45 // it's no longer associated with the stream. 46 std::wstringbuf* const buf1 = sstrm1.rdbuf(); 47 // base rdbuf() returns the currently associated streambuf 48 std::wstreambuf* pbasebuf1 = active_buffer(sstrm1); 49 redirect_buffer(sstrm1, &sbuf); 50 std::wstringbuf* const buf2 = sstrm1.rdbuf(); 51 std::wstreambuf* pbasebuf2 = active_buffer(sstrm1); 52 VERIFY( buf1 == buf2 ); 53 VERIFY( pbasebuf1 != pbasebuf2 ); 54 VERIFY( pbasebuf2 == pbasebuf0 ); 55 56 // derived rdbuf() returns the original buf, so str() doesn't change. 57 VERIFY( sstrm1.str() != str01 ); 58 VERIFY( sstrm1.str() == str00 ); 59 // however, casting the active streambuf to a stringbuf shows what's up: 60 std::wstringbuf* psbuf = dynamic_cast<std::wstringbuf*>(pbasebuf2); 61 str02 = psbuf->str(); 62 VERIFY( str02 == str01 ); 63 64 // How confusing and non-intuitive is this? 65 // These semantics are a joke, a serious defect, and incredibly lame. 66} 67 68int main() 69{ 70 test02(); 71 return 0; 72} 73