diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 77681636944..5ea2e14087c 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,19 @@ +2004-12-02 Paolo Carlini + + * testsuite/testsuite_io.h (class sync_buf): New, templatized + version of sync_streambuf; add typedefs for streambuf/wstreambuf. + (class fail_buf): Likewise, for fail_streambuf. + (class fail_num_get): Templatize and add char/wchar_t typedefs. + (class fail_num_put): Likewise. + * testsuite/27_io/basic_istream/extractors_arithmetic/char/ + exceptions_badbit_throw.cc: Use the latter. + * testsuite/27_io/basic_istream/extractors_arithmetic/char/ + exceptions_failbit_throw.cc: Likewise. + * testsuite/27_io/basic_ostream/inserters_arithmetic/char/ + exceptions_badbit_throw.cc: Likewise. + * testsuite/27_io/basic_ostream/inserters_arithmetic/char/ + exceptions_failbit_throw.cc: Likewise. + 2004-12-01 Paolo Carlini * testsuite/27_io/basic_istream/get/wchar_t/1.cc: New. diff --git a/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/char/exceptions_badbit_throw.cc b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/char/exceptions_badbit_throw.cc index f7c43e2b630..5bb89ad5b4f 100644 --- a/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/char/exceptions_badbit_throw.cc +++ b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/char/exceptions_badbit_throw.cc @@ -1,6 +1,6 @@ // 2003-03-08 Jerry Quinn -// Copyright (C) 2003 Free Software Foundation, Inc. +// Copyright (C) 2003, 2004 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 @@ -30,7 +30,7 @@ void test_badbit() using namespace std; bool test __attribute__((unused)) = true; - locale loc(locale::classic(), new __gnu_test::fail_num_get); + locale loc(locale::classic(), new __gnu_test::fail_num_get_char); istringstream stream("jaylib - champion sound"); stream.imbue(loc); diff --git a/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/char/exceptions_failbit_throw.cc b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/char/exceptions_failbit_throw.cc index 0b223bcbeef..3b208691dc3 100644 --- a/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/char/exceptions_failbit_throw.cc +++ b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/char/exceptions_failbit_throw.cc @@ -1,5 +1,4 @@ -// Copyright (C) 2003 -// Free Software Foundation, Inc. +// Copyright (C) 2003, 2004 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 @@ -37,7 +36,7 @@ void test_failbit() using namespace std; bool test __attribute__((unused)) = true; - locale loc(locale::classic(), new __gnu_test::fail_num_get); + locale loc(locale::classic(), new __gnu_test::fail_num_get_char); istringstream stream("jaylib - champion sound"); stream.imbue(loc); diff --git a/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/char/exceptions_badbit_throw.cc b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/char/exceptions_badbit_throw.cc index 32ff029b6a0..9fb887e246f 100644 --- a/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/char/exceptions_badbit_throw.cc +++ b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/char/exceptions_badbit_throw.cc @@ -30,7 +30,7 @@ void test_badbit() using namespace std; bool test __attribute__((unused)) = true; - locale loc(locale::classic(), new __gnu_test::fail_num_put); + locale loc(locale::classic(), new __gnu_test::fail_num_put_char); ostringstream stream("jaylib - champion sound"); stream.imbue(loc); diff --git a/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/char/exceptions_failbit_throw.cc b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/char/exceptions_failbit_throw.cc index 6b3b77df68c..88ed30e52e2 100644 --- a/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/char/exceptions_failbit_throw.cc +++ b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/char/exceptions_failbit_throw.cc @@ -37,7 +37,7 @@ void test_failbit() using namespace std; bool test __attribute__((unused)) = true; - locale loc(locale::classic(), new __gnu_test::fail_num_put); + locale loc(locale::classic(), new __gnu_test::fail_num_put_char); ostringstream stream("jaylib - champion sound"); stream.imbue(loc); diff --git a/libstdc++-v3/testsuite/testsuite_io.h b/libstdc++-v3/testsuite/testsuite_io.h index 809d0801c6d..14f5cb4d47e 100644 --- a/libstdc++-v3/testsuite/testsuite_io.h +++ b/libstdc++-v3/testsuite/testsuite_io.h @@ -103,189 +103,225 @@ namespace __gnu_test // Used to check if basic_streambuf::pubsync() has been called. // This is useful for checking if a function creates [io]stream::sentry // objects, since the sentry constructors call tie()->flush(). - class sync_streambuf : public std::streambuf - { - private: - bool m_sync_called; - - public: - sync_streambuf() - : m_sync_called(false) - { } - - bool sync_called() const - { return m_sync_called; } - - protected: - int sync() + template + class sync_buf + : public T { - m_sync_called = true; - return 0; - } - }; + private: + bool m_sync_called; + + public: + sync_buf() + : m_sync_called(false) + { } + + bool sync_called() const + { return m_sync_called; } + + protected: + int sync() + { + m_sync_called = true; + return 0; + } + }; + + typedef sync_buf sync_streambuf; +#ifdef _GLIBCXX_USE_WCHAR_T + typedef sync_buf sync_wstreambuf; +#endif // Throws on all overflow and underflow calls. struct underflow_error: std::exception { }; struct overflow_error: std::exception { }; struct positioning_error: std::exception { }; - struct fail_streambuf : std::streambuf - { - private: - char p[2]; - - public: - fail_streambuf() + template + struct fail_buf + : public T { - p[0] = 's'; - p[1] = char(); - setg(p, p, p + 1); - } + typedef typename T::char_type char_type; + typedef typename T::int_type int_type; + typedef typename T::off_type off_type; + typedef typename T::pos_type pos_type; - virtual int_type underflow() - { - throw underflow_error(); - return -1; - } - - virtual int_type uflow() - { - throw underflow_error(); - return -1; - } + private: + char_type p[2]; - virtual int_type - overflow(int_type) - { - throw overflow_error(); - return -1; - } + public: + fail_buf() + { + p[0] = char_type('s'); + p[1] = char_type(); + setg(p, p, p + 1); + } - virtual pos_type - seekoff(off_type, std::ios_base::seekdir, std::ios_base::openmode) - { - throw positioning_error(); - return pos_type(off_type(-1)); - } - - virtual pos_type - seekpos(pos_type, std::ios_base::openmode) - { - throw positioning_error(); - return pos_type(off_type(-1)); - } + virtual int_type underflow() + { + throw underflow_error(); + return -1; + } + + virtual int_type uflow() + { + throw underflow_error(); + return -1; + } + + virtual int_type + overflow(int_type) + { + throw overflow_error(); + return -1; + } + + virtual pos_type + seekoff(off_type, std::ios_base::seekdir, std::ios_base::openmode) + { + throw positioning_error(); + return pos_type(off_type(-1)); + } + + virtual pos_type + seekpos(pos_type, std::ios_base::openmode) + { + throw positioning_error(); + return pos_type(off_type(-1)); + } + + virtual int + sync() + { + throw positioning_error(); + return 0; + } + }; - virtual int - sync() - { - throw positioning_error(); - return 0; - } - }; + typedef fail_buf fail_streambuf; +#ifdef _GLIBCXX_USE_WCHAR_T + typedef fail_buf fail_wstreambuf; +#endif // Facets that throw an exception for every virtual function. struct facet_error: std::exception { }; - class fail_num_get : public std::num_get - { - typedef std::ios_base ios_base; + template + class fail_num_get + : public std::num_get + { + typedef std::ios_base ios_base; + typedef typename std::num_get::iter_type iter_type; - protected: - iter_type - do_get(iter_type a, iter_type, ios_base&, ios_base::iostate&, bool&) const - { throw facet_error(); return iter_type(); } + protected: + iter_type + do_get(iter_type a, iter_type, ios_base&, ios_base::iostate&, bool&) const + { throw facet_error(); return iter_type(); } - virtual iter_type - do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, long&) const - { throw facet_error(); return iter_type(); } - - virtual iter_type - do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, - unsigned short&) const - { throw facet_error(); return iter_type(); } - - virtual iter_type - do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, - unsigned int&) const - { throw facet_error(); return iter_type(); } - - virtual iter_type - do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, - unsigned long&) const - { throw facet_error(); return iter_type(); } + virtual iter_type + do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, long&) const + { throw facet_error(); return iter_type(); } + + virtual iter_type + do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, + unsigned short&) const + { throw facet_error(); return iter_type(); } + + virtual iter_type + do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, + unsigned int&) const + { throw facet_error(); return iter_type(); } + + virtual iter_type + do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, + unsigned long&) const + { throw facet_error(); return iter_type(); } #ifdef _GLIBCXX_USE_LONG_LONG - virtual iter_type - do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, - long long&) const - { throw facet_error(); return iter_type(); } - - virtual iter_type - do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, - unsigned long long&) const - { throw facet_error(); return iter_type(); } + virtual iter_type + do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, + long long&) const + { throw facet_error(); return iter_type(); } + + virtual iter_type + do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, + unsigned long long&) const + { throw facet_error(); return iter_type(); } #endif - virtual iter_type - do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, - float&) const - { throw facet_error(); return iter_type(); } + virtual iter_type + do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, + float&) const + { throw facet_error(); return iter_type(); } + + virtual iter_type + do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, + double&) const + { throw facet_error(); return iter_type(); } + + virtual iter_type + do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, + long double&) const + { throw facet_error(); return iter_type(); } + + virtual iter_type + do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, + void*&) const + { throw facet_error(); return iter_type(); } + }; - virtual iter_type - do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, - double&) const - { throw facet_error(); return iter_type(); } + typedef fail_num_get fail_num_get_char; +#ifdef _GLIBCXX_USE_WCHAR_T + typedef fail_num_get fail_num_get_wchar_t; +#endif - virtual iter_type - do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, - long double&) const - { throw facet_error(); return iter_type(); } + template + class fail_num_put + : public std::num_put + { + typedef std::ios_base ios_base; + typedef typename std::num_put::iter_type iter_type; + typedef typename std::num_put::char_type char_type; - virtual iter_type - do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, - void*&) const - { throw facet_error(); return iter_type(); } - }; + protected: + iter_type + do_put(iter_type, ios_base&, char_type __fill, bool __v) const + { throw facet_error(); return iter_type(NULL); } + + virtual iter_type + do_put(iter_type, ios_base&, char_type __fill, long __v) const + { throw facet_error(); return iter_type(NULL); } - class fail_num_put : public std::num_put - { - typedef std::ios_base ios_base; - - protected: - iter_type - do_put(iter_type, ios_base&, char_type __fill, bool __v) const - { throw facet_error(); return iter_type(NULL); } - - virtual iter_type - do_put(iter_type, ios_base&, char_type __fill, long __v) const - { throw facet_error(); return iter_type(NULL); } - - virtual iter_type - do_put(iter_type, ios_base&, char_type __fill, unsigned long) const - { throw facet_error(); return iter_type(NULL); } + virtual iter_type + do_put(iter_type, ios_base&, char_type __fill, unsigned long) const + { throw facet_error(); return iter_type(NULL); } #ifdef _GLIBCXX_USE_LONG_LONG - virtual iter_type - do_put(iter_type, ios_base&, char_type __fill, long long __v) const - { throw facet_error(); return iter_type(NULL); } + virtual iter_type + do_put(iter_type, ios_base&, char_type __fill, long long __v) const + { throw facet_error(); return iter_type(NULL); } - virtual iter_type - do_put(iter_type, ios_base&, char_type __fill, unsigned long long) const - { throw facet_error(); return iter_type(NULL); } + virtual iter_type + do_put(iter_type, ios_base&, char_type __fill, unsigned long long) const + { throw facet_error(); return iter_type(NULL); } #endif + + virtual iter_type + do_put(iter_type, ios_base&, char_type __fill, double __v) const + { throw facet_error(); return iter_type(NULL); } - virtual iter_type - do_put(iter_type, ios_base&, char_type __fill, double __v) const - { throw facet_error(); return iter_type(NULL); } + virtual iter_type + do_put(iter_type, ios_base&, char_type __fill, long double __v) const + { throw facet_error(); return iter_type(NULL); } + + virtual iter_type + do_put(iter_type, ios_base&, char_type __fill, const void* __v) const + { throw facet_error(); return iter_type(NULL); } + }; - virtual iter_type - do_put(iter_type, ios_base&, char_type __fill, long double __v) const - { throw facet_error(); return iter_type(NULL); } - - virtual iter_type - do_put(iter_type, ios_base&, char_type __fill, const void* __v) const - { throw facet_error(); return iter_type(NULL); } - }; + typedef fail_num_put fail_num_put_char; +#ifdef _GLIBCXX_USE_WCHAR_T + typedef fail_num_put fail_num_put_wchar_t; +#endif }; // namespace __gnu_test #endif // _GLIBCXX_TESTSUITE_IO_H