1// Copyright (C) 2000-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.8.1.7 ifstream member functions 19// @require@ %-*.tst %-*.txt 20// @diff@ %-*.tst %-*.txt 21 22#include <istream> 23#include <fstream> 24#include <testsuite_hooks.h> 25 26const char name_01[] = "ifstream_members-1.tst"; 27const char name_02[] = "ifstream_members-1.txt"; 28 29void 30redirect_buffer(std::ios& stream, std::streambuf* new_buf) 31{ stream.rdbuf(new_buf); } 32 33std::streambuf* 34active_buffer(std::ios& stream) 35{ return stream.rdbuf(); } 36 37// libstdc++/2832 38void test03() 39{ 40 bool test __attribute__((unused)) = true; 41 const char* strlit01 = "fuck war"; 42 const std::string str00; 43 const std::string str01(strlit01); 44 std::string str02; 45 std::filebuf fbuf; 46 std::streambuf* pbasebuf0 = &fbuf; 47 48 std::ifstream sstrm1; 49 // derived rdbuf() always returns original streambuf, even though 50 // it's no longer associated with the stream. 51 std::filebuf* const buf1 = sstrm1.rdbuf(); 52 // base rdbuf() returns the currently associated streambuf 53 std::streambuf* pbasebuf1 = active_buffer(sstrm1); 54 redirect_buffer(sstrm1, &fbuf); 55 std::filebuf* const buf2 = sstrm1.rdbuf(); 56 std::streambuf* pbasebuf2 = active_buffer(sstrm1); 57 VERIFY( buf1 == buf2 ); 58 VERIFY( pbasebuf1 != pbasebuf2 ); 59 VERIFY( pbasebuf2 == pbasebuf0 ); 60 61 // How confusing and non-intuitive is this? 62 // These semantics are a joke, a serious defect, and incredibly lame. 63} 64 65int main() 66{ 67 test03(); 68 return 0; 69} 70 71 72 73