13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===---------------------------- system_error ----------------------------===//
33e519524SHoward Hinnant//
45b08a8a4SHoward Hinnant//                     The LLVM Compiler Infrastructure
53e519524SHoward Hinnant//
6412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
7412dbebeSHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
83e519524SHoward Hinnant//
93e519524SHoward Hinnant//===----------------------------------------------------------------------===//
103e519524SHoward Hinnant
113e519524SHoward Hinnant#ifndef _LIBCPP_SYSTEM_ERROR
123e519524SHoward Hinnant#define _LIBCPP_SYSTEM_ERROR
133e519524SHoward Hinnant
143e519524SHoward Hinnant/*
153e519524SHoward Hinnant    system_error synopsis
163e519524SHoward Hinnant
173e519524SHoward Hinnantnamespace std
183e519524SHoward Hinnant{
193e519524SHoward Hinnant
203e519524SHoward Hinnantclass error_category
213e519524SHoward Hinnant{
223e519524SHoward Hinnantpublic:
23a62f2899SHoward Hinnant    virtual ~error_category() noexcept;
243e519524SHoward Hinnant
25a86d5162SMarshall Clow    constexpr error_category();
263e519524SHoward Hinnant    error_category(const error_category&) = delete;
273e519524SHoward Hinnant    error_category& operator=(const error_category&) = delete;
283e519524SHoward Hinnant
29a62f2899SHoward Hinnant    virtual const char* name() const noexcept = 0;
30a62f2899SHoward Hinnant    virtual error_condition default_error_condition(int ev) const noexcept;
31a62f2899SHoward Hinnant    virtual bool equivalent(int code, const error_condition& condition) const noexcept;
32a62f2899SHoward Hinnant    virtual bool equivalent(const error_code& code, int condition) const noexcept;
333e519524SHoward Hinnant    virtual string message(int ev) const = 0;
343e519524SHoward Hinnant
35a62f2899SHoward Hinnant    bool operator==(const error_category& rhs) const noexcept;
36a62f2899SHoward Hinnant    bool operator!=(const error_category& rhs) const noexcept;
37a62f2899SHoward Hinnant    bool operator<(const error_category& rhs) const noexcept;
383e519524SHoward Hinnant};
393e519524SHoward Hinnant
40a62f2899SHoward Hinnantconst error_category& generic_category() noexcept;
41a62f2899SHoward Hinnantconst error_category& system_category() noexcept;
423e519524SHoward Hinnant
433e519524SHoward Hinnanttemplate <class T> struct is_error_code_enum
443e519524SHoward Hinnant    : public false_type {};
453e519524SHoward Hinnant
463e519524SHoward Hinnanttemplate <class T> struct is_error_condition_enum
473e519524SHoward Hinnant    : public false_type {};
483e519524SHoward Hinnant
49*e69a08baSMarshall Clowtemplate <class _Tp>
50*e69a08baSMarshall Clowconstexpr size_t is_error_condition_enum_v = is_error_condition_enum<_Tp>::value; // C++17
51*e69a08baSMarshall Clow
52*e69a08baSMarshall Clowtemplate <class _Tp>
53*e69a08baSMarshall Clowconstexpr size_t is_error_code_enum_v = is_error_code_enum<_Tp>::value; // C++17
54*e69a08baSMarshall Clow
553e519524SHoward Hinnantclass error_code
563e519524SHoward Hinnant{
573e519524SHoward Hinnantpublic:
583e519524SHoward Hinnant    // constructors:
59a62f2899SHoward Hinnant    error_code() noexcept;
60a62f2899SHoward Hinnant    error_code(int val, const error_category& cat) noexcept;
613e519524SHoward Hinnant    template <class ErrorCodeEnum>
62a62f2899SHoward Hinnant        error_code(ErrorCodeEnum e) noexcept;
633e519524SHoward Hinnant
643e519524SHoward Hinnant    // modifiers:
65a62f2899SHoward Hinnant    void assign(int val, const error_category& cat) noexcept;
663e519524SHoward Hinnant    template <class ErrorCodeEnum>
67a62f2899SHoward Hinnant        error_code& operator=(ErrorCodeEnum e) noexcept;
68a62f2899SHoward Hinnant    void clear() noexcept;
693e519524SHoward Hinnant
703e519524SHoward Hinnant    // observers:
71a62f2899SHoward Hinnant    int value() const noexcept;
72a62f2899SHoward Hinnant    const error_category& category() const noexcept;
73a62f2899SHoward Hinnant    error_condition default_error_condition() const noexcept;
743e519524SHoward Hinnant    string message() const;
75a62f2899SHoward Hinnant    explicit operator bool() const noexcept;
763e519524SHoward Hinnant};
773e519524SHoward Hinnant
783e519524SHoward Hinnant// non-member functions:
79a62f2899SHoward Hinnantbool operator<(const error_code& lhs, const error_code& rhs) noexcept;
803e519524SHoward Hinnanttemplate <class charT, class traits>
813e519524SHoward Hinnant    basic_ostream<charT,traits>&
823e519524SHoward Hinnant    operator<<(basic_ostream<charT,traits>& os, const error_code& ec);
833e519524SHoward Hinnant
843e519524SHoward Hinnantclass error_condition
853e519524SHoward Hinnant{
863e519524SHoward Hinnantpublic:
873e519524SHoward Hinnant    // constructors:
88a62f2899SHoward Hinnant    error_condition() noexcept;
89a62f2899SHoward Hinnant    error_condition(int val, const error_category& cat) noexcept;
903e519524SHoward Hinnant    template <class ErrorConditionEnum>
91a62f2899SHoward Hinnant        error_condition(ErrorConditionEnum e) noexcept;
923e519524SHoward Hinnant
933e519524SHoward Hinnant    // modifiers:
94a62f2899SHoward Hinnant    void assign(int val, const error_category& cat) noexcept;
953e519524SHoward Hinnant    template <class ErrorConditionEnum>
96a62f2899SHoward Hinnant        error_condition& operator=(ErrorConditionEnum e) noexcept;
97a62f2899SHoward Hinnant    void clear() noexcept;
983e519524SHoward Hinnant
993e519524SHoward Hinnant    // observers:
100a62f2899SHoward Hinnant    int value() const noexcept;
101a62f2899SHoward Hinnant    const error_category& category() const noexcept;
102a62f2899SHoward Hinnant    string message() const noexcept;
103a62f2899SHoward Hinnant    explicit operator bool() const noexcept;
1043e519524SHoward Hinnant};
1053e519524SHoward Hinnant
106a62f2899SHoward Hinnantbool operator<(const error_condition& lhs, const error_condition& rhs) noexcept;
1073e519524SHoward Hinnant
1083e519524SHoward Hinnantclass system_error
1093e519524SHoward Hinnant    : public runtime_error
1103e519524SHoward Hinnant{
1113e519524SHoward Hinnantpublic:
1123e519524SHoward Hinnant    system_error(error_code ec, const string& what_arg);
1133e519524SHoward Hinnant    system_error(error_code ec, const char* what_arg);
1143e519524SHoward Hinnant    system_error(error_code ec);
1153e519524SHoward Hinnant    system_error(int ev, const error_category& ecat, const string& what_arg);
1163e519524SHoward Hinnant    system_error(int ev, const error_category& ecat, const char* what_arg);
1173e519524SHoward Hinnant    system_error(int ev, const error_category& ecat);
1183e519524SHoward Hinnant
119a62f2899SHoward Hinnant    const error_code& code() const noexcept;
120a62f2899SHoward Hinnant    const char* what() const noexcept;
1213e519524SHoward Hinnant};
1223e519524SHoward Hinnant
1233e519524SHoward Hinnantenum class errc
1243e519524SHoward Hinnant{
1253e519524SHoward Hinnant    address_family_not_supported,       // EAFNOSUPPORT
1263e519524SHoward Hinnant    address_in_use,                     // EADDRINUSE
1273e519524SHoward Hinnant    address_not_available,              // EADDRNOTAVAIL
1283e519524SHoward Hinnant    already_connected,                  // EISCONN
1293e519524SHoward Hinnant    argument_list_too_long,             // E2BIG
1303e519524SHoward Hinnant    argument_out_of_domain,             // EDOM
1313e519524SHoward Hinnant    bad_address,                        // EFAULT
1323e519524SHoward Hinnant    bad_file_descriptor,                // EBADF
1333e519524SHoward Hinnant    bad_message,                        // EBADMSG
1343e519524SHoward Hinnant    broken_pipe,                        // EPIPE
1353e519524SHoward Hinnant    connection_aborted,                 // ECONNABORTED
1363e519524SHoward Hinnant    connection_already_in_progress,     // EALREADY
1373e519524SHoward Hinnant    connection_refused,                 // ECONNREFUSED
1383e519524SHoward Hinnant    connection_reset,                   // ECONNRESET
1393e519524SHoward Hinnant    cross_device_link,                  // EXDEV
1403e519524SHoward Hinnant    destination_address_required,       // EDESTADDRREQ
1413e519524SHoward Hinnant    device_or_resource_busy,            // EBUSY
1423e519524SHoward Hinnant    directory_not_empty,                // ENOTEMPTY
1433e519524SHoward Hinnant    executable_format_error,            // ENOEXEC
1443e519524SHoward Hinnant    file_exists,                        // EEXIST
1453e519524SHoward Hinnant    file_too_large,                     // EFBIG
1463e519524SHoward Hinnant    filename_too_long,                  // ENAMETOOLONG
1473e519524SHoward Hinnant    function_not_supported,             // ENOSYS
1483e519524SHoward Hinnant    host_unreachable,                   // EHOSTUNREACH
1493e519524SHoward Hinnant    identifier_removed,                 // EIDRM
1503e519524SHoward Hinnant    illegal_byte_sequence,              // EILSEQ
1513e519524SHoward Hinnant    inappropriate_io_control_operation, // ENOTTY
1523e519524SHoward Hinnant    interrupted,                        // EINTR
1533e519524SHoward Hinnant    invalid_argument,                   // EINVAL
1543e519524SHoward Hinnant    invalid_seek,                       // ESPIPE
1553e519524SHoward Hinnant    io_error,                           // EIO
1563e519524SHoward Hinnant    is_a_directory,                     // EISDIR
1573e519524SHoward Hinnant    message_size,                       // EMSGSIZE
1583e519524SHoward Hinnant    network_down,                       // ENETDOWN
1593e519524SHoward Hinnant    network_reset,                      // ENETRESET
1603e519524SHoward Hinnant    network_unreachable,                // ENETUNREACH
1613e519524SHoward Hinnant    no_buffer_space,                    // ENOBUFS
1623e519524SHoward Hinnant    no_child_process,                   // ECHILD
1633e519524SHoward Hinnant    no_link,                            // ENOLINK
1643e519524SHoward Hinnant    no_lock_available,                  // ENOLCK
1653e519524SHoward Hinnant    no_message_available,               // ENODATA
1663e519524SHoward Hinnant    no_message,                         // ENOMSG
1673e519524SHoward Hinnant    no_protocol_option,                 // ENOPROTOOPT
1683e519524SHoward Hinnant    no_space_on_device,                 // ENOSPC
1693e519524SHoward Hinnant    no_stream_resources,                // ENOSR
1703e519524SHoward Hinnant    no_such_device_or_address,          // ENXIO
1713e519524SHoward Hinnant    no_such_device,                     // ENODEV
1723e519524SHoward Hinnant    no_such_file_or_directory,          // ENOENT
1733e519524SHoward Hinnant    no_such_process,                    // ESRCH
1743e519524SHoward Hinnant    not_a_directory,                    // ENOTDIR
1753e519524SHoward Hinnant    not_a_socket,                       // ENOTSOCK
1763e519524SHoward Hinnant    not_a_stream,                       // ENOSTR
1773e519524SHoward Hinnant    not_connected,                      // ENOTCONN
1783e519524SHoward Hinnant    not_enough_memory,                  // ENOMEM
1793e519524SHoward Hinnant    not_supported,                      // ENOTSUP
1803e519524SHoward Hinnant    operation_canceled,                 // ECANCELED
1813e519524SHoward Hinnant    operation_in_progress,              // EINPROGRESS
1823e519524SHoward Hinnant    operation_not_permitted,            // EPERM
1833e519524SHoward Hinnant    operation_not_supported,            // EOPNOTSUPP
1843e519524SHoward Hinnant    operation_would_block,              // EWOULDBLOCK
1853e519524SHoward Hinnant    owner_dead,                         // EOWNERDEAD
1863e519524SHoward Hinnant    permission_denied,                  // EACCES
1873e519524SHoward Hinnant    protocol_error,                     // EPROTO
1883e519524SHoward Hinnant    protocol_not_supported,             // EPROTONOSUPPORT
1893e519524SHoward Hinnant    read_only_file_system,              // EROFS
1903e519524SHoward Hinnant    resource_deadlock_would_occur,      // EDEADLK
1913e519524SHoward Hinnant    resource_unavailable_try_again,     // EAGAIN
1923e519524SHoward Hinnant    result_out_of_range,                // ERANGE
1933e519524SHoward Hinnant    state_not_recoverable,              // ENOTRECOVERABLE
1943e519524SHoward Hinnant    stream_timeout,                     // ETIME
1953e519524SHoward Hinnant    text_file_busy,                     // ETXTBSY
1963e519524SHoward Hinnant    timed_out,                          // ETIMEDOUT
1973e519524SHoward Hinnant    too_many_files_open_in_system,      // ENFILE
1983e519524SHoward Hinnant    too_many_files_open,                // EMFILE
1993e519524SHoward Hinnant    too_many_links,                     // EMLINK
2003e519524SHoward Hinnant    too_many_symbolic_link_levels,      // ELOOP
2013e519524SHoward Hinnant    value_too_large,                    // EOVERFLOW
2023e519524SHoward Hinnant    wrong_protocol_type                 // EPROTOTYPE
2033e519524SHoward Hinnant};
2043e519524SHoward Hinnant
2053e519524SHoward Hinnanttemplate <> struct is_error_condition_enum<errc>
2063e519524SHoward Hinnant    : true_type { }
2073e519524SHoward Hinnant
208a62f2899SHoward Hinnanterror_code make_error_code(errc e) noexcept;
209a62f2899SHoward Hinnanterror_condition make_error_condition(errc e) noexcept;
2103e519524SHoward Hinnant
2113e519524SHoward Hinnant// Comparison operators:
212a62f2899SHoward Hinnantbool operator==(const error_code& lhs, const error_code& rhs) noexcept;
213a62f2899SHoward Hinnantbool operator==(const error_code& lhs, const error_condition& rhs) noexcept;
214a62f2899SHoward Hinnantbool operator==(const error_condition& lhs, const error_code& rhs) noexcept;
215a62f2899SHoward Hinnantbool operator==(const error_condition& lhs, const error_condition& rhs) noexcept;
216a62f2899SHoward Hinnantbool operator!=(const error_code& lhs, const error_code& rhs) noexcept;
217a62f2899SHoward Hinnantbool operator!=(const error_code& lhs, const error_condition& rhs) noexcept;
218a62f2899SHoward Hinnantbool operator!=(const error_condition& lhs, const error_code& rhs) noexcept;
219a62f2899SHoward Hinnantbool operator!=(const error_condition& lhs, const error_condition& rhs) noexcept;
2203e519524SHoward Hinnant
2213e519524SHoward Hinnanttemplate <> struct hash<std::error_code>;
2223e519524SHoward Hinnant
2233e519524SHoward Hinnant}  // std
2243e519524SHoward Hinnant
2253e519524SHoward Hinnant*/
2263e519524SHoward Hinnant
2273e519524SHoward Hinnant#include <__config>
2283e519524SHoward Hinnant#include <cerrno>
2293e519524SHoward Hinnant#include <type_traits>
2303e519524SHoward Hinnant#include <stdexcept>
2313e519524SHoward Hinnant#include <__functional_base>
2323e519524SHoward Hinnant
233073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
2343e519524SHoward Hinnant#pragma GCC system_header
235073458b1SHoward Hinnant#endif
2363e519524SHoward Hinnant
2373e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
2383e519524SHoward Hinnant
2393e519524SHoward Hinnant// is_error_code_enum
2403e519524SHoward Hinnant
241e0601335SHoward Hinnanttemplate <class _Tp>
242f0544c20SHoward Hinnantstruct _LIBCPP_TYPE_VIS_ONLY is_error_code_enum
2433e519524SHoward Hinnant    : public false_type {};
2443e519524SHoward Hinnant
245*e69a08baSMarshall Clow#if _LIBCPP_STD_VER > 14
246*e69a08baSMarshall Clowtemplate <class _Tp>
247*e69a08baSMarshall Clowconstexpr size_t is_error_code_enum_v = is_error_code_enum<_Tp>::value;
248*e69a08baSMarshall Clow#endif
249*e69a08baSMarshall Clow
2503e519524SHoward Hinnant// is_error_condition_enum
2513e519524SHoward Hinnant
252e0601335SHoward Hinnanttemplate <class _Tp>
253f0544c20SHoward Hinnantstruct _LIBCPP_TYPE_VIS_ONLY is_error_condition_enum
2543e519524SHoward Hinnant    : public false_type {};
2553e519524SHoward Hinnant
256*e69a08baSMarshall Clow#if _LIBCPP_STD_VER > 14
257*e69a08baSMarshall Clowtemplate <class _Tp>
258*e69a08baSMarshall Clowconstexpr size_t is_error_condition_enum_v = is_error_condition_enum<_Tp>::value;
259*e69a08baSMarshall Clow#endif
260*e69a08baSMarshall Clow
26137aab767SDavid Chisnall// Some error codes are not present on all platforms, so we provide equivalents
26237aab767SDavid Chisnall// for them:
26337aab767SDavid Chisnall
2643e519524SHoward Hinnant//enum class errc
26575689c10SHoward Hinnant_LIBCPP_DECLARE_STRONG_ENUM(errc)
2663e519524SHoward Hinnant{
2673e519524SHoward Hinnant    address_family_not_supported        = EAFNOSUPPORT,
2683e519524SHoward Hinnant    address_in_use                      = EADDRINUSE,
2693e519524SHoward Hinnant    address_not_available               = EADDRNOTAVAIL,
2703e519524SHoward Hinnant    already_connected                   = EISCONN,
2713e519524SHoward Hinnant    argument_list_too_long              = E2BIG,
2723e519524SHoward Hinnant    argument_out_of_domain              = EDOM,
2733e519524SHoward Hinnant    bad_address                         = EFAULT,
2743e519524SHoward Hinnant    bad_file_descriptor                 = EBADF,
2753e519524SHoward Hinnant    bad_message                         = EBADMSG,
2763e519524SHoward Hinnant    broken_pipe                         = EPIPE,
2773e519524SHoward Hinnant    connection_aborted                  = ECONNABORTED,
2783e519524SHoward Hinnant    connection_already_in_progress      = EALREADY,
2793e519524SHoward Hinnant    connection_refused                  = ECONNREFUSED,
2803e519524SHoward Hinnant    connection_reset                    = ECONNRESET,
2813e519524SHoward Hinnant    cross_device_link                   = EXDEV,
2823e519524SHoward Hinnant    destination_address_required        = EDESTADDRREQ,
2833e519524SHoward Hinnant    device_or_resource_busy             = EBUSY,
2843e519524SHoward Hinnant    directory_not_empty                 = ENOTEMPTY,
2853e519524SHoward Hinnant    executable_format_error             = ENOEXEC,
2863e519524SHoward Hinnant    file_exists                         = EEXIST,
2873e519524SHoward Hinnant    file_too_large                      = EFBIG,
2883e519524SHoward Hinnant    filename_too_long                   = ENAMETOOLONG,
2893e519524SHoward Hinnant    function_not_supported              = ENOSYS,
2903e519524SHoward Hinnant    host_unreachable                    = EHOSTUNREACH,
2913e519524SHoward Hinnant    identifier_removed                  = EIDRM,
2923e519524SHoward Hinnant    illegal_byte_sequence               = EILSEQ,
2933e519524SHoward Hinnant    inappropriate_io_control_operation  = ENOTTY,
2943e519524SHoward Hinnant    interrupted                         = EINTR,
2953e519524SHoward Hinnant    invalid_argument                    = EINVAL,
2963e519524SHoward Hinnant    invalid_seek                        = ESPIPE,
2973e519524SHoward Hinnant    io_error                            = EIO,
2983e519524SHoward Hinnant    is_a_directory                      = EISDIR,
2993e519524SHoward Hinnant    message_size                        = EMSGSIZE,
3003e519524SHoward Hinnant    network_down                        = ENETDOWN,
3013e519524SHoward Hinnant    network_reset                       = ENETRESET,
3023e519524SHoward Hinnant    network_unreachable                 = ENETUNREACH,
3033e519524SHoward Hinnant    no_buffer_space                     = ENOBUFS,
3043e519524SHoward Hinnant    no_child_process                    = ECHILD,
3053e519524SHoward Hinnant    no_link                             = ENOLINK,
3063e519524SHoward Hinnant    no_lock_available                   = ENOLCK,
30737aab767SDavid Chisnall#ifdef ENODATA
3083e519524SHoward Hinnant    no_message_available                = ENODATA,
30937aab767SDavid Chisnall#else
31037aab767SDavid Chisnall    no_message_available                = ENOMSG,
31137aab767SDavid Chisnall#endif
3123e519524SHoward Hinnant    no_message                          = ENOMSG,
3133e519524SHoward Hinnant    no_protocol_option                  = ENOPROTOOPT,
3143e519524SHoward Hinnant    no_space_on_device                  = ENOSPC,
31537aab767SDavid Chisnall#ifdef ENOSR
3163e519524SHoward Hinnant    no_stream_resources                 = ENOSR,
31737aab767SDavid Chisnall#else
31837aab767SDavid Chisnall    no_stream_resources                 = ENOMEM,
31937aab767SDavid Chisnall#endif
3203e519524SHoward Hinnant    no_such_device_or_address           = ENXIO,
3213e519524SHoward Hinnant    no_such_device                      = ENODEV,
3223e519524SHoward Hinnant    no_such_file_or_directory           = ENOENT,
3233e519524SHoward Hinnant    no_such_process                     = ESRCH,
3243e519524SHoward Hinnant    not_a_directory                     = ENOTDIR,
3253e519524SHoward Hinnant    not_a_socket                        = ENOTSOCK,
32637aab767SDavid Chisnall#ifdef ENOSTR
3273e519524SHoward Hinnant    not_a_stream                        = ENOSTR,
32837aab767SDavid Chisnall#else
32937aab767SDavid Chisnall    not_a_stream                        = EINVAL,
33037aab767SDavid Chisnall#endif
3313e519524SHoward Hinnant    not_connected                       = ENOTCONN,
3323e519524SHoward Hinnant    not_enough_memory                   = ENOMEM,
3333e519524SHoward Hinnant    not_supported                       = ENOTSUP,
3343e519524SHoward Hinnant    operation_canceled                  = ECANCELED,
3353e519524SHoward Hinnant    operation_in_progress               = EINPROGRESS,
3363e519524SHoward Hinnant    operation_not_permitted             = EPERM,
3373e519524SHoward Hinnant    operation_not_supported             = EOPNOTSUPP,
3383e519524SHoward Hinnant    operation_would_block               = EWOULDBLOCK,
3393e519524SHoward Hinnant    owner_dead                          = EOWNERDEAD,
3403e519524SHoward Hinnant    permission_denied                   = EACCES,
3413e519524SHoward Hinnant    protocol_error                      = EPROTO,
3423e519524SHoward Hinnant    protocol_not_supported              = EPROTONOSUPPORT,
3433e519524SHoward Hinnant    read_only_file_system               = EROFS,
3443e519524SHoward Hinnant    resource_deadlock_would_occur       = EDEADLK,
3453e519524SHoward Hinnant    resource_unavailable_try_again      = EAGAIN,
3463e519524SHoward Hinnant    result_out_of_range                 = ERANGE,
3473e519524SHoward Hinnant    state_not_recoverable               = ENOTRECOVERABLE,
34837aab767SDavid Chisnall#ifdef ETIME
3493e519524SHoward Hinnant    stream_timeout                      = ETIME,
35037aab767SDavid Chisnall#else
35137aab767SDavid Chisnall    stream_timeout                      = ETIMEDOUT,
35237aab767SDavid Chisnall#endif
3533e519524SHoward Hinnant    text_file_busy                      = ETXTBSY,
3543e519524SHoward Hinnant    timed_out                           = ETIMEDOUT,
3553e519524SHoward Hinnant    too_many_files_open_in_system       = ENFILE,
3563e519524SHoward Hinnant    too_many_files_open                 = EMFILE,
3573e519524SHoward Hinnant    too_many_links                      = EMLINK,
3583e519524SHoward Hinnant    too_many_symbolic_link_levels       = ELOOP,
3593e519524SHoward Hinnant    value_too_large                     = EOVERFLOW,
3603e519524SHoward Hinnant    wrong_protocol_type                 = EPROTOTYPE
3613e519524SHoward Hinnant};
36275689c10SHoward Hinnant_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(errc)
3633e519524SHoward Hinnant
364e0601335SHoward Hinnanttemplate <>
365f0544c20SHoward Hinnantstruct _LIBCPP_TYPE_VIS_ONLY is_error_condition_enum<errc>
3663e519524SHoward Hinnant    : true_type { };
3673e519524SHoward Hinnant
36875689c10SHoward Hinnant#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS
369e0601335SHoward Hinnanttemplate <>
370f0544c20SHoward Hinnantstruct _LIBCPP_TYPE_VIS_ONLY is_error_condition_enum<errc::__lx>
3713e519524SHoward Hinnant    : true_type { };
37275689c10SHoward Hinnant#endif
3733e519524SHoward Hinnant
3746e41256fSHoward Hinnantclass _LIBCPP_TYPE_VIS error_condition;
3756e41256fSHoward Hinnantclass _LIBCPP_TYPE_VIS error_code;
3763e519524SHoward Hinnant
3773e519524SHoward Hinnant// class error_category
3783e519524SHoward Hinnant
379aeb85680SHoward Hinnantclass _LIBCPP_HIDDEN __do_message;
3803e519524SHoward Hinnant
3816e41256fSHoward Hinnantclass _LIBCPP_TYPE_VIS error_category
3823e519524SHoward Hinnant{
3833e519524SHoward Hinnantpublic:
384a62f2899SHoward Hinnant    virtual ~error_category() _NOEXCEPT;
3853e519524SHoward Hinnant
386a86d5162SMarshall Clow#ifdef _LIBCPP_BUILDING_SYSTEM_ERROR
387a62f2899SHoward Hinnant    error_category() _NOEXCEPT;
388a86d5162SMarshall Clow#else
389d8bf8503SHoward Hinnant    _LIBCPP_ALWAYS_INLINE
390e57e3aebSEric Fiselier    _LIBCPP_CONSTEXPR_AFTER_CXX11 error_category() _NOEXCEPT _LIBCPP_DEFAULT
391a86d5162SMarshall Clow#endif
392cb16c680SHoward Hinnantprivate:
3933e519524SHoward Hinnant    error_category(const error_category&);// = delete;
3943e519524SHoward Hinnant    error_category& operator=(const error_category&);// = delete;
3953e519524SHoward Hinnant
3963e519524SHoward Hinnantpublic:
397a62f2899SHoward Hinnant    virtual const char* name() const _NOEXCEPT = 0;
398a62f2899SHoward Hinnant    virtual error_condition default_error_condition(int __ev) const _NOEXCEPT;
399a62f2899SHoward Hinnant    virtual bool equivalent(int __code, const error_condition& __condition) const _NOEXCEPT;
400a62f2899SHoward Hinnant    virtual bool equivalent(const error_code& __code, int __condition) const _NOEXCEPT;
4013e519524SHoward Hinnant    virtual string message(int __ev) const = 0;
4023e519524SHoward Hinnant
4033e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE
404a62f2899SHoward Hinnant    bool operator==(const error_category& __rhs) const _NOEXCEPT {return this == &__rhs;}
4053e519524SHoward Hinnant
4063e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE
407a62f2899SHoward Hinnant    bool operator!=(const error_category& __rhs) const _NOEXCEPT {return !(*this == __rhs);}
4083e519524SHoward Hinnant
4093e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE
410a62f2899SHoward Hinnant    bool operator< (const error_category& __rhs) const _NOEXCEPT {return this < &__rhs;}
4113e519524SHoward Hinnant
412aeb85680SHoward Hinnant    friend class _LIBCPP_HIDDEN __do_message;
4133e519524SHoward Hinnant};
4143e519524SHoward Hinnant
4153e519524SHoward Hinnantclass _LIBCPP_HIDDEN __do_message
4163e519524SHoward Hinnant    : public error_category
4173e519524SHoward Hinnant{
4183e519524SHoward Hinnantpublic:
4193e519524SHoward Hinnant    virtual string message(int ev) const;
4203e519524SHoward Hinnant};
4213e519524SHoward Hinnant
422f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS const error_category& generic_category() _NOEXCEPT;
423f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS const error_category& system_category() _NOEXCEPT;
4243e519524SHoward Hinnant
4256e41256fSHoward Hinnantclass _LIBCPP_TYPE_VIS error_condition
4263e519524SHoward Hinnant{
4273e519524SHoward Hinnant    int __val_;
4283e519524SHoward Hinnant    const error_category* __cat_;
4293e519524SHoward Hinnantpublic:
4303e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE
431a62f2899SHoward Hinnant    error_condition() _NOEXCEPT : __val_(0), __cat_(&generic_category()) {}
4323e519524SHoward Hinnant
4333e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE
434a62f2899SHoward Hinnant    error_condition(int __val, const error_category& __cat) _NOEXCEPT
4353e519524SHoward Hinnant        : __val_(__val), __cat_(&__cat) {}
4363e519524SHoward Hinnant
437c003db1fSHoward Hinnant    template <class _Ep>
4383e519524SHoward Hinnant        _LIBCPP_ALWAYS_INLINE
439c003db1fSHoward Hinnant        error_condition(_Ep __e,
440c003db1fSHoward Hinnant              typename enable_if<is_error_condition_enum<_Ep>::value>::type* = 0
441a62f2899SHoward Hinnant                                                                     ) _NOEXCEPT
4423e519524SHoward Hinnant            {*this = make_error_condition(__e);}
4433e519524SHoward Hinnant
4443e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE
445a62f2899SHoward Hinnant    void assign(int __val, const error_category& __cat) _NOEXCEPT
4463e519524SHoward Hinnant    {
4473e519524SHoward Hinnant        __val_ = __val;
4483e519524SHoward Hinnant        __cat_ = &__cat;
4493e519524SHoward Hinnant    }
4503e519524SHoward Hinnant
451c003db1fSHoward Hinnant    template <class _Ep>
4523e519524SHoward Hinnant        _LIBCPP_ALWAYS_INLINE
4533e519524SHoward Hinnant        typename enable_if
4543e519524SHoward Hinnant        <
455c003db1fSHoward Hinnant            is_error_condition_enum<_Ep>::value,
4563e519524SHoward Hinnant            error_condition&
4573e519524SHoward Hinnant        >::type
458c003db1fSHoward Hinnant        operator=(_Ep __e) _NOEXCEPT
4593e519524SHoward Hinnant            {*this = make_error_condition(__e); return *this;}
4603e519524SHoward Hinnant
4613e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE
462a62f2899SHoward Hinnant    void clear() _NOEXCEPT
4633e519524SHoward Hinnant    {
4643e519524SHoward Hinnant        __val_ = 0;
4653e519524SHoward Hinnant        __cat_ = &generic_category();
4663e519524SHoward Hinnant    }
4673e519524SHoward Hinnant
4683e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE
469a62f2899SHoward Hinnant    int value() const _NOEXCEPT {return __val_;}
4703e519524SHoward Hinnant
4713e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE
472a62f2899SHoward Hinnant    const error_category& category() const _NOEXCEPT {return *__cat_;}
4733e519524SHoward Hinnant    string message() const;
4743e519524SHoward Hinnant
4753e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE
476f2f2d8b9SHoward Hinnant        _LIBCPP_EXPLICIT
477a62f2899SHoward Hinnant        operator bool() const _NOEXCEPT {return __val_ != 0;}
4783e519524SHoward Hinnant};
4793e519524SHoward Hinnant
4803e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4813e519524SHoward Hinnanterror_condition
482a62f2899SHoward Hinnantmake_error_condition(errc __e) _NOEXCEPT
4833e519524SHoward Hinnant{
4843e519524SHoward Hinnant    return error_condition(static_cast<int>(__e), generic_category());
4853e519524SHoward Hinnant}
4863e519524SHoward Hinnant
4873e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4883e519524SHoward Hinnantbool
489a62f2899SHoward Hinnantoperator<(const error_condition& __x, const error_condition& __y) _NOEXCEPT
4903e519524SHoward Hinnant{
4913e519524SHoward Hinnant    return __x.category() < __y.category()
492c206366fSHoward Hinnant        || (__x.category() == __y.category() && __x.value() < __y.value());
4933e519524SHoward Hinnant}
4943e519524SHoward Hinnant
4953e519524SHoward Hinnant// error_code
4963e519524SHoward Hinnant
4976e41256fSHoward Hinnantclass _LIBCPP_TYPE_VIS error_code
4983e519524SHoward Hinnant{
4993e519524SHoward Hinnant    int __val_;
5003e519524SHoward Hinnant    const error_category* __cat_;
5013e519524SHoward Hinnantpublic:
5023e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE
503a62f2899SHoward Hinnant    error_code() _NOEXCEPT : __val_(0), __cat_(&system_category()) {}
5043e519524SHoward Hinnant
5053e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE
506a62f2899SHoward Hinnant    error_code(int __val, const error_category& __cat) _NOEXCEPT
5073e519524SHoward Hinnant        : __val_(__val), __cat_(&__cat) {}
5083e519524SHoward Hinnant
509c003db1fSHoward Hinnant    template <class _Ep>
5103e519524SHoward Hinnant        _LIBCPP_ALWAYS_INLINE
511c003db1fSHoward Hinnant        error_code(_Ep __e,
512c003db1fSHoward Hinnant                   typename enable_if<is_error_code_enum<_Ep>::value>::type* = 0
513a62f2899SHoward Hinnant                                                                     ) _NOEXCEPT
5143e519524SHoward Hinnant            {*this = make_error_code(__e);}
5153e519524SHoward Hinnant
5163e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE
517a62f2899SHoward Hinnant    void assign(int __val, const error_category& __cat) _NOEXCEPT
5183e519524SHoward Hinnant    {
5193e519524SHoward Hinnant        __val_ = __val;
5203e519524SHoward Hinnant        __cat_ = &__cat;
5213e519524SHoward Hinnant    }
5223e519524SHoward Hinnant
523c003db1fSHoward Hinnant    template <class _Ep>
5243e519524SHoward Hinnant        _LIBCPP_ALWAYS_INLINE
5253e519524SHoward Hinnant        typename enable_if
5263e519524SHoward Hinnant        <
527c003db1fSHoward Hinnant            is_error_code_enum<_Ep>::value,
5283e519524SHoward Hinnant            error_code&
5293e519524SHoward Hinnant        >::type
530c003db1fSHoward Hinnant        operator=(_Ep __e) _NOEXCEPT
5313e519524SHoward Hinnant            {*this = make_error_code(__e); return *this;}
5323e519524SHoward Hinnant
5333e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE
534a62f2899SHoward Hinnant    void clear() _NOEXCEPT
5353e519524SHoward Hinnant    {
5363e519524SHoward Hinnant        __val_ = 0;
5373e519524SHoward Hinnant        __cat_ = &system_category();
5383e519524SHoward Hinnant    }
5393e519524SHoward Hinnant
5403e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE
541a62f2899SHoward Hinnant    int value() const _NOEXCEPT {return __val_;}
5423e519524SHoward Hinnant
5433e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE
544a62f2899SHoward Hinnant    const error_category& category() const _NOEXCEPT {return *__cat_;}
5453e519524SHoward Hinnant
5463e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE
547a62f2899SHoward Hinnant    error_condition default_error_condition() const _NOEXCEPT
5483e519524SHoward Hinnant        {return __cat_->default_error_condition(__val_);}
5493e519524SHoward Hinnant
5503e519524SHoward Hinnant    string message() const;
5513e519524SHoward Hinnant
5523e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE
553f2f2d8b9SHoward Hinnant        _LIBCPP_EXPLICIT
554a62f2899SHoward Hinnant        operator bool() const _NOEXCEPT {return __val_ != 0;}
5553e519524SHoward Hinnant};
5563e519524SHoward Hinnant
5573e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5583e519524SHoward Hinnanterror_code
559a62f2899SHoward Hinnantmake_error_code(errc __e) _NOEXCEPT
5603e519524SHoward Hinnant{
5613e519524SHoward Hinnant    return error_code(static_cast<int>(__e), generic_category());
5623e519524SHoward Hinnant}
5633e519524SHoward Hinnant
5643e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5653e519524SHoward Hinnantbool
566a62f2899SHoward Hinnantoperator<(const error_code& __x, const error_code& __y) _NOEXCEPT
5673e519524SHoward Hinnant{
5683e519524SHoward Hinnant    return __x.category() < __y.category()
569c206366fSHoward Hinnant        || (__x.category() == __y.category() && __x.value() < __y.value());
5703e519524SHoward Hinnant}
5713e519524SHoward Hinnant
5723e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5733e519524SHoward Hinnantbool
574a62f2899SHoward Hinnantoperator==(const error_code& __x, const error_code& __y) _NOEXCEPT
5753e519524SHoward Hinnant{
5763e519524SHoward Hinnant    return __x.category() == __y.category() && __x.value() == __y.value();
5773e519524SHoward Hinnant}
5783e519524SHoward Hinnant
5793e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5803e519524SHoward Hinnantbool
581a62f2899SHoward Hinnantoperator==(const error_code& __x, const error_condition& __y) _NOEXCEPT
5823e519524SHoward Hinnant{
5833e519524SHoward Hinnant    return __x.category().equivalent(__x.value(), __y)
5843e519524SHoward Hinnant        || __y.category().equivalent(__x, __y.value());
5853e519524SHoward Hinnant}
5863e519524SHoward Hinnant
5873e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5883e519524SHoward Hinnantbool
589a62f2899SHoward Hinnantoperator==(const error_condition& __x, const error_code& __y) _NOEXCEPT
5903e519524SHoward Hinnant{
5913e519524SHoward Hinnant    return __y == __x;
5923e519524SHoward Hinnant}
5933e519524SHoward Hinnant
5943e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5953e519524SHoward Hinnantbool
596a62f2899SHoward Hinnantoperator==(const error_condition& __x, const error_condition& __y) _NOEXCEPT
5973e519524SHoward Hinnant{
5983e519524SHoward Hinnant    return __x.category() == __y.category() && __x.value() == __y.value();
5993e519524SHoward Hinnant}
6003e519524SHoward Hinnant
6013e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
6023e519524SHoward Hinnantbool
603a62f2899SHoward Hinnantoperator!=(const error_code& __x, const error_code& __y) _NOEXCEPT
604a62f2899SHoward Hinnant{return !(__x == __y);}
6053e519524SHoward Hinnant
6063e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
6073e519524SHoward Hinnantbool
608a62f2899SHoward Hinnantoperator!=(const error_code& __x, const error_condition& __y) _NOEXCEPT
609a62f2899SHoward Hinnant{return !(__x == __y);}
6103e519524SHoward Hinnant
6113e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
6123e519524SHoward Hinnantbool
613a62f2899SHoward Hinnantoperator!=(const error_condition& __x, const error_code& __y) _NOEXCEPT
614a62f2899SHoward Hinnant{return !(__x == __y);}
6153e519524SHoward Hinnant
6163e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
6173e519524SHoward Hinnantbool
618a62f2899SHoward Hinnantoperator!=(const error_condition& __x, const error_condition& __y) _NOEXCEPT
619a62f2899SHoward Hinnant{return !(__x == __y);}
6203e519524SHoward Hinnant
6213e519524SHoward Hinnanttemplate <>
622f0544c20SHoward Hinnantstruct _LIBCPP_TYPE_VIS_ONLY hash<error_code>
6233e519524SHoward Hinnant    : public unary_function<error_code, size_t>
6243e519524SHoward Hinnant{
625e0601335SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
626a62f2899SHoward Hinnant    size_t operator()(const error_code& __ec) const _NOEXCEPT
6273e519524SHoward Hinnant    {
6283e519524SHoward Hinnant        return static_cast<size_t>(__ec.value());
6293e519524SHoward Hinnant    }
6303e519524SHoward Hinnant};
6313e519524SHoward Hinnant
6323e519524SHoward Hinnant// system_error
6333e519524SHoward Hinnant
6346e41256fSHoward Hinnantclass _LIBCPP_TYPE_VIS system_error
6353e519524SHoward Hinnant    : public runtime_error
6363e519524SHoward Hinnant{
6373e519524SHoward Hinnant    error_code __ec_;
6383e519524SHoward Hinnantpublic:
6393e519524SHoward Hinnant    system_error(error_code __ec, const string& __what_arg);
6403e519524SHoward Hinnant    system_error(error_code __ec, const char* __what_arg);
6413e519524SHoward Hinnant    system_error(error_code __ec);
6423e519524SHoward Hinnant    system_error(int __ev, const error_category& __ecat, const string& __what_arg);
6433e519524SHoward Hinnant    system_error(int __ev, const error_category& __ecat, const char* __what_arg);
6443e519524SHoward Hinnant    system_error(int __ev, const error_category& __ecat);
645a62f2899SHoward Hinnant    ~system_error() _NOEXCEPT;
6463e519524SHoward Hinnant
6473e519524SHoward Hinnant    _LIBCPP_ALWAYS_INLINE
648a62f2899SHoward Hinnant    const error_code& code() const _NOEXCEPT {return __ec_;}
6493e519524SHoward Hinnant
6503e519524SHoward Hinnantprivate:
6513e519524SHoward Hinnant    static string __init(const error_code&, string);
6523e519524SHoward Hinnant};
6533e519524SHoward Hinnant
654d51f2a2aSAditya Kumar_LIBCPP_NORETURN _LIBCPP_FUNC_VIS
655d51f2a2aSAditya Kumarvoid __throw_system_error(int ev, const char* what_arg);
6563e519524SHoward Hinnant
6573e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
6583e519524SHoward Hinnant
6593e519524SHoward Hinnant#endif  // _LIBCPP_SYSTEM_ERROR
660