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 19// 27.5.2 template class basic_streambuf 20 21#include <cstring> 22#include <cwchar> 23#include <streambuf> 24#include <sstream> 25#include <ostream> 26#include <testsuite_hooks.h> 27 28// libstdc++/9424 29class Outbuf_2 : public std::wstreambuf 30{ 31 wchar_t buf[1]; 32 33public: 34 Outbuf_2() 35 { 36 setp(buf, buf + 1); 37 } 38 39 int_type overflow(int_type c) 40 { 41 int_type eof = traits_type::eof(); 42 43 if (pptr() < epptr()) 44 { 45 if (traits_type::eq_int_type(c, eof)) 46 return traits_type::not_eof(c); 47 48 *pptr() = traits_type::to_char_type(c); 49 pbump(1); 50 return c; 51 } 52 53 return eof; 54 } 55}; 56 57class Inbuf_2 : public std::wstreambuf 58{ 59 static const wchar_t buf[]; 60 const wchar_t* current; 61 int size; 62 63public: 64 Inbuf_2() 65 { 66 current = buf; 67 size = std::wcslen(buf); 68 } 69 70 int_type underflow() 71 { 72 if (current < buf + size) 73 return traits_type::to_int_type(*current); 74 return traits_type::eof(); 75 } 76 77 int_type uflow() 78 { 79 if (current < buf + size) 80 return traits_type::to_int_type(*current++); 81 return traits_type::eof(); 82 } 83}; 84 85const wchar_t Inbuf_2::buf[] = L"Atteivlis"; 86 87void test11() 88{ 89 bool test __attribute__((unused)) = true; 90 91 Inbuf_2 inbuf1; 92 std::wistream is(&inbuf1); 93 Outbuf_2 outbuf1; 94 is >> &outbuf1; 95 VERIFY( inbuf1.sgetc() == L't' ); 96 VERIFY( is.good() ); 97} 98 99int main() 100{ 101 test11(); 102 return 0; 103} 104