1// Copyright (C) 2004 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 2, 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 COPYING.  If not, write to the Free
16// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
17// USA.
18
19// 27.7.6 - Member functions [lib.stringstream.members]
20
21#include <sstream>
22#include <testsuite_hooks.h>
23
24void
25redirect_buffer(std::wios& stream, std::wstreambuf* new_buf)
26{ stream.rdbuf(new_buf); }
27
28std::wstreambuf*
29active_buffer(std::wios& stream)
30{ return stream.rdbuf(); }
31
32// libstdc++/2832
33void test02()
34{
35  bool test __attribute__((unused)) = true;
36  std::wstringbuf sbuf;
37  std::wstreambuf* pbasebuf0 = &sbuf;
38
39  std::wstringstream sstrm1;
40  // derived rdbuf() always returns original streambuf, even though
41  // it's no longer associated with the stream.
42  std::wstringbuf* const buf1 = sstrm1.rdbuf();
43  // base rdbuf() returns the currently associated streambuf
44  std::wstreambuf* pbasebuf1 = active_buffer(sstrm1);
45  redirect_buffer(sstrm1, &sbuf);
46  std::wstringbuf* const buf2 = sstrm1.rdbuf();
47  std::wstreambuf* pbasebuf2 = active_buffer(sstrm1);
48  VERIFY( buf1 == buf2 );
49  VERIFY( pbasebuf1 != pbasebuf2 );
50  VERIFY( pbasebuf2 == pbasebuf0 );
51
52  // How confusing and non-intuitive is this?
53  // These semantics are a joke, a serious defect, and incredibly lame.
54}
55
56int main()
57{
58  test02();
59  return 0;
60}
61