diff options
author | redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-11-14 12:17:57 +0000 |
---|---|---|
committer | redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-11-14 12:17:57 +0000 |
commit | 84e41970756d1c3882aaf6a9368c7f282b294250 (patch) | |
tree | 7608d5f540586abdbb3a9159b02a5def19043a66 /libstdc++-v3/include/bits | |
parent | d5f9f518fbf45d3d91a0eb7eca0b1471d6a03bba (diff) | |
download | gcc-84e41970756d1c3882aaf6a9368c7f282b294250.tar.gz |
Define C++11 version of std::ios_base::failure.
* config/abi/pre/gnu.ver: Add new exports.
* include/bits/ios_base.h (ios_base::failure): New definition using
abi_tag.
(io_errc, make_error_code, make_error_category, iostream_category):
Define.
* include/std/system_error (system_error): Add char* constructors.
* src/c++11/Makefile.am: Add new file.
* src/c++11/Makefile.in: Regenerate.
* src/c++11/cxx11-ios_failure.cc: New file.
* src/c++98/ios_failure.cc: Compile old definition without abi_tag.
* testsuite/27_io/ios_base/failure/cxx11.cc: New.
* testsuite/27_io/ios_base/failure/what-1.cc: Allow string returned by
ios_base::failure::what() to contain additional data.
* testsuite/27_io/ios_base/failure/what-2.cc: Likewise..
* testsuite/27_io/ios_base/failure/what-3.cc: Likewise..
* testsuite/27_io/ios_base/failure/what-big.cc: Likewise..
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@217559 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include/bits')
-rw-r--r-- | libstdc++-v3/include/bits/ios_base.h | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/libstdc++-v3/include/bits/ios_base.h b/libstdc++-v3/include/bits/ios_base.h index 5e33b812fe3..8e600598fe2 100644 --- a/libstdc++-v3/include/bits/ios_base.h +++ b/libstdc++-v3/include/bits/ios_base.h @@ -40,6 +40,12 @@ #include <bits/localefwd.h> #include <bits/locale_classes.h> +#if __cplusplus < 201103L +# include <stdexcept> +#else +# include <system_error> +#endif + namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION @@ -186,6 +192,23 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _S_ios_seekdir_end = 1L << 16 }; +#if __cplusplus >= 201103L + /// I/O error code + enum class io_errc { stream = 1 }; + + template <> struct is_error_code_enum<io_errc> : public true_type { }; + + const error_category& iostream_category() noexcept; + + inline error_code + make_error_code(io_errc e) noexcept + { return error_code(static_cast<int>(e), iostream_category()); } + + inline error_condition + make_error_condition(io_errc e) noexcept + { return error_condition(static_cast<int>(e), iostream_category()); } +#endif + // 27.4.2 Class ios_base /** * @brief The base of the I/O class hierarchy. @@ -198,6 +221,22 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION */ class ios_base { +#if _GLIBCXX_USE_CXX11_ABI +#if __cplusplus < 201103L + // Type that is layout-compatible with std::system_error + struct system_error : std::runtime_error + { + // Type that is layout-compatible with std::error_code + struct error_code + { + error_code() { } + private: + int _M_value; + const void* _M_cat; + } _M_code; + }; +#endif +#endif public: /** @@ -206,6 +245,28 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * * 27.4.2.1.1 Class ios_base::failure */ +#if _GLIBCXX_USE_CXX11_ABI + class _GLIBCXX_ABI_TAG_CXX11 failure : public system_error + { + public: + explicit + failure(const string& __str); + +#if __cplusplus >= 201103L + explicit + failure(const string&, const error_code&); + + explicit + failure(const char*, const error_code& = io_errc::stream); +#endif + + virtual + ~failure() throw(); + + virtual const char* + what() const throw(); + }; +#else class failure : public exception { public: @@ -225,6 +286,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION private: string _M_msg; }; +#endif // 27.4.2.1.2 Type ios_base::fmtflags /** |