[libc++] Fix error flags and exceptions propagated from input stream operations

Summary:
This is a re-application of r357533 and r357531. They had been reverted
because we thought the commits broke the LLDB data formatters, but it
turns out this was because only r357531 had been included in the CI
run.

Before this patch, we would only ever throw an exception if the badbit
was set on the stream. The Standard is currently very unclear on how
exceptions should be propagated and what error flags should be set by
the input stream operations. This commit changes libc++ to behave under
a different (but valid) interpretation of the Standard. This interpretation
of the Standard matches what other implementations are doing.

This effectively implements the wording in p1264r0. It hasn't been voted
into the Standard yet, however there is wide agreement that the fix is
correct and it's just a matter of time before the fix is standardized.

PR21586
PR15949
rdar://problem/15347558

Reviewers: mclow.lists, EricWF

Subscribers: christof, dexonsmith, cfe-commits

Differential Revision: https://reviews.llvm.org/D49863

llvm-svn: 357775
This commit is contained in:
Louis Dionne
2019-04-05 16:33:37 +00:00
parent bbeca849d7
commit 396145d0da
42 changed files with 2505 additions and 558 deletions

View File

@@ -330,6 +330,15 @@ public:
void __set_badbit_and_consider_rethrow();
void __set_failbit_and_consider_rethrow();
_LIBCPP_INLINE_VISIBILITY
void __setstate_nothrow(iostate __state)
{
if (__rdbuf_)
__rdstate_ |= __state;
else
__rdstate_ |= __state | ios_base::badbit;
}
protected:
_LIBCPP_INLINE_VISIBILITY
ios_base() {// purposefully does no initialization

File diff suppressed because it is too large Load Diff

View File

@@ -15,6 +15,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -75,6 +76,44 @@ int main(int, char**)
assert(!is.eof());
assert(!is.fail());
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::failbit);
return 0;
bool threw = false;
try {
bool n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
bool n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
#endif // TEST_HAS_NO_EXCEPTIONS
return 0;
}

View File

@@ -15,6 +15,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -75,6 +76,44 @@ int main(int, char**)
assert(!is.eof());
assert(!is.fail());
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::failbit);
return 0;
bool threw = false;
try {
double n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
double n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
#endif // TEST_HAS_NO_EXCEPTIONS
return 0;
}

View File

@@ -15,6 +15,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -75,6 +76,44 @@ int main(int, char**)
assert(!is.eof());
assert(!is.fail());
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::failbit);
return 0;
bool threw = false;
try {
float n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
float n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
#endif // TEST_HAS_NO_EXCEPTIONS
return 0;
}

View File

@@ -16,6 +16,7 @@
#include <istream>
#include <limits>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -76,6 +77,44 @@ int main(int, char**)
assert(!is.eof());
assert( is.fail());
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::failbit);
return 0;
bool threw = false;
try {
int n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
int n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
#endif // TEST_HAS_NO_EXCEPTIONS
return 0;
}

View File

@@ -15,6 +15,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -75,6 +76,44 @@ int main(int, char**)
assert(!is.eof());
assert(!is.fail());
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::failbit);
return 0;
bool threw = false;
try {
long n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
long n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
#endif // TEST_HAS_NO_EXCEPTIONS
return 0;
}

View File

@@ -15,6 +15,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -75,6 +76,44 @@ int main(int, char**)
assert(!is.eof());
assert(!is.fail());
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::failbit);
return 0;
bool threw = false;
try {
long double n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
long double n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
#endif // TEST_HAS_NO_EXCEPTIONS
return 0;
}

View File

@@ -15,6 +15,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -75,6 +76,44 @@ int main(int, char**)
assert(!is.eof());
assert(!is.fail());
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::failbit);
return 0;
bool threw = false;
try {
long long n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
long long n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
#endif // TEST_HAS_NO_EXCEPTIONS
return 0;
}

View File

@@ -19,6 +19,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -97,6 +98,44 @@ int main(int, char**)
assert( is.eof());
assert(!is.fail());
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::failbit);
return 0;
bool threw = false;
try {
void* n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
void* n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
#endif // TEST_HAS_NO_EXCEPTIONS
return 0;
}

View File

@@ -16,6 +16,7 @@
#include <istream>
#include <limits>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -76,6 +77,44 @@ int main(int, char**)
assert(!is.eof());
assert( is.fail());
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::failbit);
return 0;
bool threw = false;
try {
short n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
short n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
#endif // TEST_HAS_NO_EXCEPTIONS
return 0;
}

View File

@@ -15,6 +15,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -75,6 +76,44 @@ int main(int, char**)
assert(!is.eof());
assert(!is.fail());
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::failbit);
return 0;
bool threw = false;
try {
unsigned int n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
unsigned int n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
#endif // TEST_HAS_NO_EXCEPTIONS
return 0;
}

View File

@@ -15,6 +15,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -75,6 +76,44 @@ int main(int, char**)
assert(!is.eof());
assert(!is.fail());
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::failbit);
return 0;
bool threw = false;
try {
unsigned long n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
unsigned long n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
#endif // TEST_HAS_NO_EXCEPTIONS
return 0;
}

View File

@@ -15,6 +15,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -75,6 +76,44 @@ int main(int, char**)
assert(!is.eof());
assert(!is.fail());
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::failbit);
return 0;
bool threw = false;
try {
unsigned long long n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
unsigned long long n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
#endif // TEST_HAS_NO_EXCEPTIONS
return 0;
}

View File

@@ -15,6 +15,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -75,6 +76,44 @@ int main(int, char**)
assert(!is.eof());
assert(!is.fail());
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::failbit);
return 0;
bool threw = false;
try {
unsigned short n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
unsigned short n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
#endif // TEST_HAS_NO_EXCEPTIONS
return 0;
}

View File

@@ -13,6 +13,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -83,6 +84,80 @@ int main(int, char**)
assert(!is.fail());
assert(c == L'c');
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::failbit);
return 0;
bool threw = false;
try {
char n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<wchar_t> sb;
std::basic_istream<wchar_t> is(&sb);
is.exceptions(std::ios_base::failbit);
bool threw = false;
try {
wchar_t n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
char n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<wchar_t> sb;
std::basic_istream<wchar_t> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
wchar_t n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
#endif // TEST_HAS_NO_EXCEPTIONS
return 0;
}

View File

@@ -13,6 +13,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -66,6 +67,44 @@ int main(int, char**)
assert(!is.fail());
assert(c == 'c');
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::failbit);
return 0;
bool threw = false;
try {
signed char n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
signed char n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
#endif // TEST_HAS_NO_EXCEPTIONS
return 0;
}

View File

@@ -13,6 +13,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -103,6 +104,46 @@ int main(int, char**)
assert(std::string((char*)s) == "");
}
#endif
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::failbit);
return 0;
bool threw = false;
try {
signed char s[20];
is.width(10);
is >> s;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
signed char s[20];
is.width(10);
is >> s;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
#endif
return 0;
}

View File

@@ -11,11 +11,13 @@
// template <class charT, class traits = char_traits<charT> >
// class basic_istream;
// basic_istream<charT,traits>& operator<<(basic_streambuf<charT,traits>* sb);
// basic_istream<charT,traits>& operator>>(basic_streambuf<charT,traits>* sb);
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
class testbuf
: public std::basic_streambuf<CharT>
@@ -65,6 +67,104 @@ int main(int, char**)
assert(sb2.str() == "testing...");
assert(is.gcount() == 10);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb(" ");
std::basic_istream<char> is(&sb);
testbuf<char> sb2;
is.exceptions(std::istream::eofbit);
bool threw = false;
try {
is >> &sb2;
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert(!is.bad());
assert( is.eof());
assert(!is.fail());
}
{
testbuf<wchar_t> sb(L" ");
std::basic_istream<wchar_t> is(&sb);
testbuf<wchar_t> sb2;
is.exceptions(std::istream::eofbit);
bool threw = false;
try {
is >> &sb2;
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert(!is.bad());
assert( is.eof());
assert(!is.fail());
}
return 0;
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
testbuf<char> sb2;
is.exceptions(std::istream::failbit);
bool threw = false;
try {
is >> &sb2;
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert(!is.bad());
assert( is.eof());
assert( is.fail());
}
{
testbuf<wchar_t> sb;
std::basic_istream<wchar_t> is(&sb);
testbuf<wchar_t> sb2;
is.exceptions(std::istream::failbit);
bool threw = false;
try {
is >> &sb2;
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert(!is.bad());
assert( is.eof());
assert( is.fail());
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::istream::failbit);
bool threw = false;
try {
is >> static_cast<testbuf<char>*>(0);
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert(!is.bad());
assert(!is.eof());
assert( is.fail());
}
{
testbuf<wchar_t> sb;
std::basic_istream<wchar_t> is(&sb);
is.exceptions(std::istream::failbit);
bool threw = false;
try {
is >> static_cast<testbuf<wchar_t>*>(0);
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert(!is.bad());
assert(!is.eof());
assert( is.fail());
}
#endif
return 0;
}

View File

@@ -13,6 +13,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -66,6 +67,44 @@ int main(int, char**)
assert(!is.fail());
assert(c == 'c');
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::failbit);
return 0;
bool threw = false;
try {
unsigned char n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
unsigned char n = 0;
is >> n;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
#endif // TEST_HAS_NO_EXCEPTIONS
return 0;
}

View File

@@ -13,6 +13,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -103,6 +104,46 @@ int main(int, char**)
assert(std::string((char*)s) == "");
}
#endif
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::failbit);
return 0;
bool threw = false;
try {
unsigned char s[20];
is.width(10);
is >> s;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
unsigned char s[20];
is.width(10);
is >> s;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
#endif // TEST_HAS_NO_EXCEPTIONS
return 0;
}

View File

@@ -13,6 +13,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -114,6 +115,84 @@ int main(int, char**)
assert(std::string(s) == "");
}
#endif
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::failbit);
return 0;
bool threw = false;
try {
char s[20];
is.width(10);
is >> s;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<wchar_t> sb;
std::wistream is(&sb);
is.exceptions(std::ios_base::failbit);
bool threw = false;
try {
wchar_t s[20];
is.width(10);
is >> s;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
char s[20];
is.width(10);
is >> s;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
testbuf<wchar_t> sb;
std::wistream is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
wchar_t s[20];
is.width(10);
is >> s;
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
#endif // TEST_HAS_NO_EXCEPTIONS
return 0;
}

View File

@@ -14,6 +14,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -75,6 +76,42 @@ int main(int, char**)
assert(is.eof());
assert(is.fail());
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb(" ");
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
return 0;
bool threw = false;
try {
std::ws(is);
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(!is.fail());
assert( is.eof());
assert(threw);
}
{
testbuf<wchar_t> sb(L" ");
std::basic_istream<wchar_t> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
std::ws(is);
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert(!is.fail());
assert( is.eof());
assert(threw);
}
#endif
return 0;
}

View File

@@ -12,6 +12,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -96,6 +97,50 @@ int main(int, char**)
assert(c == L'c');
assert(is.gcount() == 1);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb("rrrrrrrrr");
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
return 0;
bool threw = false;
try {
while (true) {
is.get();
if (is.eof())
break;
}
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert( is.fail());
assert( is.eof());
assert(threw);
}
{
testbuf<wchar_t> sb(L"rrrrrrrrr");
std::basic_istream<wchar_t> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
while (true) {
is.get();
if (is.eof())
break;
}
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert( is.fail());
assert( is.eof());
assert(threw);
}
#endif
return 0;
}

View File

@@ -12,6 +12,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -99,6 +100,52 @@ int main(int, char**)
assert(c == L'c');
assert(is.gcount() == 1);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb("rrrrrrrrr");
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
return 0;
bool threw = false;
try {
while (true) {
char c;
is.get(c);
if (is.eof())
break;
}
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert( is.fail());
assert( is.eof());
assert(threw);
}
{
testbuf<wchar_t> sb(L"rrrrrrrrr");
std::basic_istream<wchar_t> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
while (true) {
wchar_t c;
is.get(c);
if (is.eof())
break;
}
} catch (std::ios_base::failure const&) {
threw = true;
}
assert(!is.bad());
assert( is.fail());
assert( is.eof());
assert(threw);
}
#endif
return 0;
}

View File

@@ -84,26 +84,6 @@ int main(int, char**)
assert(std::string(s) == "");
assert(is.gcount() == 0);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb(" ");
std::istream is(&sb);
char s[5] = "test";
is.exceptions(std::istream::eofbit | std::istream::badbit);
try
{
is.get(s, 5);
assert(false);
}
catch (std::ios_base::failure&)
{
}
assert( is.eof());
assert( is.fail());
assert(std::string(s) == " ");
assert(is.gcount() == 1);
}
#endif
{
testbuf<wchar_t> sb(L" \n \n ");
std::wistream is(&sb);
@@ -140,23 +120,78 @@ int main(int, char**)
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<wchar_t> sb(L" ");
std::wistream is(&sb);
wchar_t s[5] = L"test";
is.exceptions(std::wistream::eofbit | std::wistream::badbit);
try
{
testbuf<char> sb(" ");
std::basic_istream<char> is(&sb);
char s[5] = "test";
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.get(s, 5);
assert(false);
}
catch (std::ios_base::failure&)
{
} catch (std::ios_base::failure&) {
threw = true;
}
assert(!is.bad());
assert( is.eof());
assert( is.fail());
assert(!is.fail());
assert(threw);
assert(std::string(s) == " ");
assert(is.gcount() == 1);
}
{
testbuf<wchar_t> sb(L" ");
std::basic_istream<wchar_t> is(&sb);
wchar_t s[5] = L"test";
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.get(s, 5);
} catch (std::ios_base::failure&) {
threw = true;
}
assert(!is.bad());
assert( is.eof());
assert(!is.fail());
assert(threw);
assert(std::wstring(s) == L" ");
assert(is.gcount() == 1);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
char s[5] = "test";
is.exceptions(std::ios_base::failbit);
bool threw = false;
try {
is.get(s, 5);
} catch (std::ios_base::failure&) {
threw = true;
}
assert(!is.bad());
assert( is.eof());
assert( is.fail());
assert(threw);
assert(std::basic_string<char>(s) == "");
assert(is.gcount() == 0);
}
{
testbuf<wchar_t> sb;
std::basic_istream<wchar_t> is(&sb);
wchar_t s[5] = L"test";
is.exceptions(std::ios_base::failbit);
bool threw = false;
try {
is.get(s, 5);
} catch (std::ios_base::failure&) {
threw = true;
}
assert(!is.bad());
assert( is.eof());
assert( is.fail());
assert(threw);
assert(std::basic_string<wchar_t>(s) == L"");
assert(is.gcount() == 0);
}
#endif
return 0;

View File

@@ -84,26 +84,6 @@ int main(int, char**)
assert(std::string(s) == "");
assert(is.gcount() == 0);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb(" ");
std::istream is(&sb);
char s[5] = "test";
is.exceptions(std::istream::eofbit | std::istream::badbit);
try
{
is.get(s, 5, '*');
assert(false);
}
catch (std::ios_base::failure&)
{
}
assert( is.eof());
assert( is.fail());
assert(std::string(s) == " ");
assert(is.gcount() == 1);
}
#endif
{
testbuf<wchar_t> sb(L" * * ");
std::wistream is(&sb);
@@ -139,23 +119,78 @@ int main(int, char**)
assert(is.gcount() == 0);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb(" ");
std::basic_istream<char> is(&sb);
char s[5] = "test";
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.get(s, 5, '*');
} catch (std::ios_base::failure&) {
threw = true;
}
assert(!is.bad());
assert( is.eof());
assert(!is.fail());
assert(threw);
assert(std::basic_string<char>(s) == " ");
assert(is.gcount() == 1);
}
{
testbuf<wchar_t> sb(L" ");
std::wistream is(&sb);
std::basic_istream<wchar_t> is(&sb);
wchar_t s[5] = L"test";
is.exceptions(std::wistream::eofbit | std::wistream::badbit);
try
{
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.get(s, 5, L'*');
assert(false);
} catch (std::ios_base::failure&) {
threw = true;
}
catch (std::ios_base::failure&)
{
assert(!is.bad());
assert( is.eof());
assert(!is.fail());
assert(threw);
assert(std::basic_string<wchar_t>(s) == L" ");
assert(is.gcount() == 1);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
char s[5] = "test";
is.exceptions(std::ios_base::failbit);
bool threw = false;
try {
is.get(s, 5, '*');
} catch (std::ios_base::failure&) {
threw = true;
}
assert(!is.bad());
assert( is.eof());
assert( is.fail());
assert(std::wstring(s) == L" ");
assert(is.gcount() == 1);
assert(threw);
assert(std::basic_string<char>(s) == "");
assert(is.gcount() == 0);
}
{
testbuf<wchar_t> sb;
std::basic_istream<wchar_t> is(&sb);
wchar_t s[5] = L"test";
is.exceptions(std::ios_base::failbit);
bool threw = false;
try {
is.get(s, 5, L'*');
} catch (std::ios_base::failure&) {
threw = true;
}
assert(!is.bad());
assert( is.eof());
assert( is.fail());
assert(threw);
assert(std::basic_string<wchar_t>(s) == L"");
assert(is.gcount() == 0);
}
#endif

View File

@@ -13,6 +13,8 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
class testbuf
: public std::basic_streambuf<CharT>
@@ -84,6 +86,73 @@ int main(int, char**)
assert(!is.fail());
assert(is.gcount() == 3);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb(" ");
std::basic_istream<char> is(&sb);
testbuf<char> sb2;
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.get(sb2);
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert(!is.bad());
assert( is.eof());
assert(!is.fail());
}
{
testbuf<wchar_t> sb(L" ");
std::basic_istream<wchar_t> is(&sb);
testbuf<wchar_t> sb2;
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.get(sb2);
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert(!is.bad());
assert( is.eof());
assert(!is.fail());
}
return 0;
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
testbuf<char> sb2;
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.get(sb2);
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert(!is.bad());
assert( is.eof());
assert( is.fail());
}
{
testbuf<wchar_t> sb;
std::basic_istream<wchar_t> is(&sb);
testbuf<wchar_t> sb2;
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.get(sb2);
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert(!is.bad());
assert( is.eof());
assert( is.fail());
}
#endif
return 0;
}

View File

@@ -13,6 +13,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
class testbuf
@@ -85,6 +86,73 @@ int main(int, char**)
assert(!is.fail());
assert(is.gcount() == 3);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb(" ");
std::basic_istream<char> is(&sb);
testbuf<char> sb2;
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.get(sb2, '*');
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert(!is.bad());
assert( is.eof());
assert(!is.fail());
}
{
testbuf<wchar_t> sb(L" ");
std::basic_istream<wchar_t> is(&sb);
testbuf<wchar_t> sb2;
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.get(sb2, L'*');
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert(!is.bad());
assert( is.eof());
assert(!is.fail());
}
return 0;
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
testbuf<char> sb2;
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.get(sb2, '*');
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert(!is.bad());
assert( is.eof());
assert( is.fail());
}
{
testbuf<wchar_t> sb;
std::basic_istream<wchar_t> is(&sb);
testbuf<wchar_t> sb2;
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.get(sb2, L'*');
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert(!is.bad());
assert( is.eof());
assert( is.fail());
}
#endif
return 0;
}

View File

@@ -76,26 +76,6 @@ int main(int, char**)
assert(std::string(s) == "");
assert(is.gcount() == 0);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb(" ");
std::istream is(&sb);
char s[5] = "test";
is.exceptions(std::istream::eofbit | std::istream::badbit);
try
{
is.getline(s, 5);
assert(false);
}
catch (std::ios_base::failure&)
{
}
assert( is.eof());
assert( is.fail());
assert(std::string(s) == " ");
assert(is.gcount() == 1);
}
#endif
{
testbuf<wchar_t> sb(L" \n \n ");
std::wistream is(&sb);
@@ -124,22 +104,77 @@ int main(int, char**)
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<wchar_t> sb(L" ");
std::wistream is(&sb);
wchar_t s[5] = L"test";
is.exceptions(std::wistream::eofbit | std::wistream::badbit);
try
{
testbuf<char> sb(" ");
std::basic_istream<char> is(&sb);
char s[5] = "test";
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.getline(s, 5);
assert(false);
} catch (std::ios_base::failure&) {
threw = true;
}
catch (std::ios_base::failure&)
{
assert(!is.bad());
assert( is.eof());
assert(!is.fail());
assert(threw);
assert(std::basic_string<char>(s) == " ");
assert(is.gcount() == 1);
}
{
testbuf<wchar_t> sb(L" ");
std::basic_istream<wchar_t> is(&sb);
wchar_t s[5] = L"test";
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.getline(s, 5);
} catch (std::ios_base::failure&) {
threw = true;
}
assert(!is.bad());
assert( is.eof());
assert(!is.fail());
assert(threw);
assert(std::basic_string<wchar_t>(s) == L" ");
assert(is.gcount() == 1);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
char s[5] = "test";
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.getline(s, 5);
} catch (std::ios_base::failure&) {
threw = true;
}
assert(!is.bad());
assert( is.eof());
assert( is.fail());
assert(std::wstring(s) == L" ");
assert(is.gcount() == 1);
assert(threw);
assert(std::basic_string<char>(s) == "");
assert(is.gcount() == 0);
}
{
testbuf<wchar_t> sb;
std::basic_istream<wchar_t> is(&sb);
wchar_t s[5] = L"test";
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.getline(s, 5);
} catch (std::ios_base::failure&) {
threw = true;
}
assert(!is.bad());
assert( is.eof());
assert( is.fail());
assert(threw);
assert(std::basic_string<wchar_t>(s) == L"");
assert(is.gcount() == 0);
}
#endif

View File

@@ -76,26 +76,6 @@ int main(int, char**)
assert(std::string(s) == "");
assert(is.gcount() == 0);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb(" ");
std::istream is(&sb);
char s[5] = "test";
is.exceptions(std::istream::eofbit | std::istream::badbit);
try
{
is.getline(s, 5, '*');
assert(false);
}
catch (std::ios_base::failure&)
{
}
assert( is.eof());
assert( is.fail());
assert(std::string(s) == " ");
assert(is.gcount() == 1);
}
#endif
{
testbuf<wchar_t> sb(L" * * ");
std::wistream is(&sb);
@@ -123,23 +103,78 @@ int main(int, char**)
assert(is.gcount() == 0);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb(" ");
std::basic_istream<char> is(&sb);
char s[5] = "test";
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.getline(s, 5, '*');
} catch (std::ios_base::failure&) {
threw = true;
}
assert(!is.bad());
assert( is.eof());
assert(!is.fail());
assert(threw);
assert(std::basic_string<char>(s) == " ");
assert(is.gcount() == 1);
}
{
testbuf<wchar_t> sb(L" ");
std::wistream is(&sb);
std::basic_istream<wchar_t> is(&sb);
wchar_t s[5] = L"test";
is.exceptions(std::wistream::eofbit | std::wistream::badbit);
try
{
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.getline(s, 5, L'*');
assert(false);
} catch (std::ios_base::failure&) {
threw = true;
}
catch (std::ios_base::failure&)
{
assert(!is.bad());
assert( is.eof());
assert(!is.fail());
assert(threw);
assert(std::basic_string<wchar_t>(s) == L" ");
assert(is.gcount() == 1);
}
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
char s[5] = "test";
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.getline(s, 5, '*');
} catch (std::ios_base::failure&) {
threw = true;
}
assert(!is.bad());
assert( is.eof());
assert( is.fail());
assert(std::wstring(s) == L" ");
assert(is.gcount() == 1);
assert(threw);
assert(std::basic_string<char>(s) == "");
assert(is.gcount() == 0);
}
{
testbuf<wchar_t> sb;
std::basic_istream<wchar_t> is(&sb);
wchar_t s[5] = L"test";
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.getline(s, 5, L'*');
} catch (std::ios_base::failure&) {
threw = true;
}
assert(!is.bad());
assert( is.eof());
assert( is.fail());
assert(threw);
assert(std::basic_string<wchar_t>(s) == L"");
assert(is.gcount() == 0);
}
#endif

View File

@@ -14,6 +14,8 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
: public std::basic_streambuf<CharT>
@@ -72,6 +74,38 @@ int main(int, char**)
assert(!is.fail());
assert(is.gcount() == 6);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb(" ");
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.ignore(5);
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert(!is.bad());
assert( is.eof());
assert(!is.fail());
}
{
testbuf<wchar_t> sb(L" ");
std::basic_istream<wchar_t> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.ignore(5);
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert(!is.bad());
assert( is.eof());
assert(!is.fail());
}
#endif
return 0;
return 0;
}

View File

@@ -12,6 +12,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -65,6 +66,38 @@ int main(int, char**)
assert(!is.fail());
assert(is.gcount() == 0);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.peek();
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert(!is.bad());
assert( is.eof());
assert(!is.fail());
}
{
testbuf<wchar_t> sb;
std::basic_istream<wchar_t> is(&sb);
is.exceptions(std::ios_base::eofbit);
bool threw = false;
try {
is.peek();
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert(!is.bad());
assert( is.eof());
assert(!is.fail());
}
#endif
return 0;
return 0;
}

View File

@@ -13,6 +13,8 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
: public std::basic_streambuf<CharT>
@@ -85,6 +87,38 @@ int main(int, char**)
assert(is.bad());
assert(is.gcount() == 0);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::badbit);
bool threw = false;
try {
is.putback('x');
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert( is.bad());
assert(!is.eof());
assert( is.fail());
}
{
testbuf<wchar_t> sb;
std::basic_istream<wchar_t> is(&sb);
is.exceptions(std::ios_base::badbit);
bool threw = false;
try {
is.putback(L'x');
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert( is.bad());
assert(!is.eof());
assert( is.fail());
}
#endif
return 0;
return 0;
}

View File

@@ -12,6 +12,7 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
@@ -77,6 +78,40 @@ int main(int, char**)
assert( is.fail());
assert(is.gcount() == 0);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
char s[10];
bool threw = false;
try {
is.read(s, 5);
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert(!is.bad());
assert( is.eof());
assert( is.fail());
}
{
testbuf<wchar_t> sb;
std::basic_istream<wchar_t> is(&sb);
is.exceptions(std::ios_base::eofbit);
wchar_t s[10];
bool threw = false;
try {
is.read(s, 5);
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert(!is.bad());
assert( is.eof());
assert( is.fail());
}
#endif
return 0;
return 0;
}

View File

@@ -13,6 +13,8 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
int sync_called = 0;
template <class CharT>
@@ -46,6 +48,41 @@ protected:
}
};
#ifndef TEST_HAS_NO_EXCEPTIONS
struct testbuf_exception { };
template <class CharT>
struct throwing_testbuf
: public std::basic_streambuf<CharT>
{
typedef std::basic_string<CharT> string_type;
typedef std::basic_streambuf<CharT> base;
private:
string_type str_;
public:
throwing_testbuf() {}
throwing_testbuf(const string_type& str)
: str_(str)
{
base::setg(const_cast<CharT*>(str_.data()),
const_cast<CharT*>(str_.data()),
const_cast<CharT*>(str_.data()) + str_.size());
}
CharT* eback() const {return base::eback();}
CharT* gptr() const {return base::gptr();}
CharT* egptr() const {return base::egptr();}
protected:
virtual int sync()
{
throw testbuf_exception();
return 5;
}
};
#endif // TEST_HAS_NO_EXCEPTIONS
int main(int, char**)
{
{
@@ -60,6 +97,36 @@ int main(int, char**)
assert(is.sync() == 0);
assert(sync_called == 2);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
throwing_testbuf<char> sb(" 123456789");
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::badbit);
bool threw = false;
try {
is.sync();
} catch (testbuf_exception const&) {
threw = true;
}
assert( is.bad());
assert(!is.eof());
assert( is.fail());
}
{
throwing_testbuf<wchar_t> sb(L" 123456789");
std::basic_istream<wchar_t> is(&sb);
is.exceptions(std::ios_base::badbit);
bool threw = false;
try {
is.sync();
} catch (testbuf_exception const&) {
threw = true;
}
assert( is.bad());
assert(!is.eof());
assert( is.fail());
}
#endif
return 0;
return 0;
}

View File

@@ -13,6 +13,8 @@
#include <istream>
#include <cassert>
#include "test_macros.h"
template <class CharT>
struct testbuf
: public std::basic_streambuf<CharT>
@@ -77,6 +79,38 @@ int main(int, char**)
assert(is.bad());
assert(is.gcount() == 0);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
testbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::badbit);
bool threw = false;
try {
is.unget();
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert( is.bad());
assert(!is.eof());
assert( is.fail());
}
{
testbuf<wchar_t> sb;
std::basic_istream<wchar_t> is(&sb);
is.exceptions(std::ios_base::badbit);
bool threw = false;
try {
is.unget();
} catch (std::ios_base::failure&) {
threw = true;
}
assert(threw);
assert( is.bad());
assert(!is.eof());
assert( is.fail());
}
#endif
return 0;
return 0;
}

View File

@@ -18,6 +18,7 @@
#include <cassert>
#include "min_allocator.h"
#include "test_macros.h"
int main(int, char**)
{
@@ -77,6 +78,85 @@ int main(int, char**)
assert(s == L" ghij");
}
#endif
#ifndef TEST_HAS_NO_EXCEPTIONS
{
std::basic_stringbuf<char> sb("hello");
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::eofbit);
return 0;
std::basic_string<char> s;
bool threw = false;
try {
std::getline(is, s);
} catch (std::ios::failure const&) {
threw = true;
}
assert(!is.bad());
assert(!is.fail());
assert( is.eof());
assert(threw);
assert(s == "hello");
}
{
std::basic_stringbuf<wchar_t> sb(L"hello");
std::basic_istream<wchar_t> is(&sb);
is.exceptions(std::ios_base::eofbit);
std::basic_string<wchar_t> s;
bool threw = false;
try {
std::getline(is, s);
} catch (std::ios::failure const&) {
threw = true;
}
assert(!is.bad());
assert(!is.fail());
assert( is.eof());
assert(threw);
assert(s == L"hello");
}
{
std::basic_stringbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios_base::failbit);
std::basic_string<char> s;
bool threw = false;
try {
std::getline(is, s);
} catch (std::ios::failure const&) {
threw = true;
}
assert(!is.bad());
assert( is.fail());
assert( is.eof());
assert(threw);
assert(s == "");
}
{
std::basic_stringbuf<wchar_t> sb;
std::basic_istream<wchar_t> is(&sb);
is.exceptions(std::ios_base::failbit);
std::basic_string<wchar_t> s;
bool threw = false;
try {
std::getline(is, s);
} catch (std::ios::failure const&) {
threw = true;
}
assert(!is.bad());
assert( is.fail());
assert( is.eof());
assert(threw);
assert(s == L"");
}
#endif // TEST_HAS_NO_EXCEPTIONS
return 0;
}

View File

@@ -18,6 +18,7 @@
#include <cassert>
#include "min_allocator.h"
#include "test_macros.h"
int main(int, char**)
{
@@ -89,6 +90,84 @@ int main(int, char**)
assert(s == L" ghij");
}
#endif
#ifndef TEST_HAS_NO_EXCEPTIONS
{
std::basic_stringbuf<char> sb("hello");
std::basic_istream<char> is(&sb);
is.exceptions(std::ios::eofbit);
return 0;
std::basic_string<char> s;
bool threw = false;
try {
std::getline(is, s, '\n');
} catch (std::ios::failure const&) {
threw = true;
}
assert(!is.bad());
assert(!is.fail());
assert( is.eof());
assert(threw);
assert(s == "hello");
}
{
std::basic_stringbuf<wchar_t> sb(L"hello");
std::basic_istream<wchar_t> is(&sb);
is.exceptions(std::ios::eofbit);
std::basic_string<wchar_t> s;
bool threw = false;
try {
std::getline(is, s, L'\n');
} catch (std::ios::failure const&) {
threw = true;
}
assert(!is.bad());
assert(!is.fail());
assert( is.eof());
assert(threw);
assert(s == L"hello");
}
{
std::basic_stringbuf<char> sb;
std::basic_istream<char> is(&sb);
is.exceptions(std::ios::failbit);
std::basic_string<char> s;
bool threw = false;
try {
std::getline(is, s, '\n');
} catch (std::ios::failure const&) {
threw = true;
}
assert(!is.bad());
assert( is.fail());
assert( is.eof());
assert(threw);
assert(s == "");
}
{
std::basic_stringbuf<wchar_t> sb;
std::basic_istream<wchar_t> is(&sb);
is.exceptions(std::ios::failbit);
std::basic_string<wchar_t> s;
bool threw = false;
try {
std::getline(is, s, L'\n');
} catch (std::ios::failure const&) {
threw = true;
}
assert(!is.bad());
assert( is.fail());
assert( is.eof());
assert(threw);
assert(s == L"");
}
#endif // TEST_HAS_NO_EXCEPTIONS
return 0;
}

View File

@@ -18,6 +18,7 @@
#include <cassert>
#include "min_allocator.h"
#include "test_macros.h"
int main(int, char**)
{
@@ -65,6 +66,44 @@ int main(int, char**)
in >> s;
assert(in.fail());
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
std::stringbuf sb;
std::istream is(&sb);
is.exceptions(std::ios::failbit);
bool threw = false;
try {
std::string s;
is >> s;
} catch (std::ios::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
std::stringbuf sb;
std::istream is(&sb);
is.exceptions(std::ios::eofbit);
bool threw = false;
try {
std::string s;
is >> s;
} catch (std::ios::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
#endif // TEST_HAS_NO_EXCEPTIONS
#if TEST_STD_VER >= 11
{
typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;

View File

@@ -9,19 +9,60 @@
// test:
// template <class charT, class traits, size_t N>
// basic_ostream<charT, traits>&
// operator<<(basic_ostream<charT, traits>& os, const bitset<N>& x);
// basic_istream<charT, traits>&
// operator>>(basic_istream<charT, traits>& is, bitset<N>& x);
#include <bitset>
#include <sstream>
#include <cassert>
#include "test_macros.h"
int main(int, char**)
{
std::istringstream in("01011010");
std::bitset<8> b;
in >> b;
assert(b.to_ulong() == 0x5A);
{
std::istringstream in("01011010");
std::bitset<8> b;
in >> b;
assert(b.to_ulong() == 0x5A);
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
std::stringbuf sb;
std::istream is(&sb);
is.exceptions(std::ios::failbit);
return 0;
bool threw = false;
try {
std::bitset<8> b;
is >> b;
} catch (std::ios::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
{
std::stringbuf sb;
std::istream is(&sb);
is.exceptions(std::ios::eofbit);
bool threw = false;
try {
std::bitset<8> b;
is >> b;
} catch (std::ios::failure const&) {
threw = true;
}
assert(!is.bad());
assert(is.fail());
assert(is.eof());
assert(threw);
}
#endif // TEST_HAS_NO_EXCEPTIONS
return 0;
}

View File

@@ -9,8 +9,8 @@
// test:
// template <class charT, class traits, size_t N>
// basic_istream<charT, traits>&
// operator>>(basic_istream<charT, traits>& is, bitset<N>& x);
// basic_ostream<charT, traits>&
// operator<<(basic_ostream<charT, traits>& os, const bitset<N>& x);
#include <bitset>
#include <sstream>