1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
// Copyright (C) 2020-2024 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
// { dg-do run { target { { ! lp64 } && { ! simulator } } } }
// { dg-timeout-factor 2 }
#include <istream>
#include <streambuf>
#include <limits>
#include <testsuite_hooks.h>
typedef wchar_t C;
struct buff : std::basic_streambuf<C>
{
typedef std::streamsize streamsize;
typedef std::numeric_limits<streamsize> limits;
buff() : count(0), buf() { }
int_type underflow()
{
// Number of characters left until we overflow the counter
const streamsize headroom = limits::max() - count;
if (headroom == 0)
return traits_type::eof();
if (bufsz < headroom)
count += bufsz;
else
count = limits::max();
this->setg(buf + 1, buf + 1, buf + bufsz);
return buf[0];
}
int_type overflow(int_type c)
{
if (traits_type::eq_int_type(c , traits_type::eof()))
return c;
this->setp(buf, buf + bufsz - 1);
return traits_type::not_eof(c);
}
streamsize count;
static const streamsize bufsz = (2048 << limits::digits10) + 1;
char_type buf[bufsz];
};
void
test01()
{
// Not possible to overflow 64-bit streamsize in reasonable time.
if (std::numeric_limits<std::streamsize>::digits > 32)
return;
std::basic_istream<C> in(new buff);
buff out;
in.get(out);
VERIFY( in.gcount() == std::numeric_limits<std::streamsize>::max() );
delete in.rdbuf(new buff);
in.get();
VERIFY( in.gcount() == 1 );
in.get(out, 'a');
VERIFY( in.gcount() == std::numeric_limits<std::streamsize>::max() );
}
int
main()
{
test01();
}
|