blob: 652f46f615ce6217c27eec6bfe32be9214a9de66 [file] [log] [blame]
#include <ostream>
#include <testsuite_hooks.h>
#include <testsuite_io.h>
// C++11 27.7.3.5 basic_ostream seek members [ostream.seeks]
// Verify [ostream.seeks] functions use a sentry, as per N3168.
void
test01()
{
// Check that the sentry sets failbit when seeking on a bad stream.
// The standard doesn't guarantee this, but it is true for libstdc++.
std::wostream os(0);
VERIFY( os.rdstate() == std::ios_base::badbit );
std::wostream::pos_type pos = std::wostream::pos_type();
os.seekp(pos);
VERIFY( os.rdstate() & std::ios_base::failbit );
os.clear();
std::wostream::off_type off(5);
os.seekp(off, std::ios_base::cur);
VERIFY( os.rdstate() & std::ios_base::failbit );
os.clear();
os.exceptions(std::ios_base::failbit);
try
{
os.clear();
os.seekp(pos);
VERIFY( false );
}
catch (const std::ios_base::failure&)
{
VERIFY( os.rdstate() & std::ios_base::failbit );
}
catch (...)
{
VERIFY( false );
}
try
{
os.clear();
os.seekp(off, std::ios_base::cur);
VERIFY( false );
}
catch (const std::ios_base::failure&)
{
VERIFY( os.rdstate() & std::ios_base::failbit );
}
catch (...)
{
VERIFY( false );
}
}
void
test02()
{
// Check that the sentry flushes a tied stream when seeking.
{
__gnu_test::sync_wstreambuf buf;
std::wostream os(&buf);
__gnu_test::sync_wstreambuf buf_tie;
std::wostream os_tie(&buf_tie);
os.tie(&os_tie);
std::wostream::pos_type pos = std::wostream::pos_type();
os.seekp(pos);
VERIFY( buf_tie.sync_called() );
}
{
__gnu_test::sync_wstreambuf buf;
std::wostream os(&buf);
__gnu_test::sync_wstreambuf buf_tie;
std::wostream os_tie(&buf_tie);
os.tie(&os_tie);
std::wostream::off_type off(0);
os.seekp(off, std::ios_base::cur);
VERIFY( buf_tie.sync_called() );
}
}
int main()
{
test01();
test02();
}