Correcting enum values mentioned in comments.
[oota-llvm.git] / include / llvm / Support / system_error.h
index c17e7bf7983381aadd896936a12e676bd7e09f32..0d164f688d376a557828a5ad1c3152914f69fa64 100644 (file)
@@ -1,4 +1,4 @@
-//===---------------------------- system_error ----------------------------===//
+//===---------------------------- system_error ------------------*- C++ -*-===//
 //
 //                     The LLVM Compiler Infrastructure
 //
@@ -17,6 +17,8 @@
 #ifndef LLVM_SYSTEM_SYSTEM_ERROR_H
 #define LLVM_SYSTEM_SYSTEM_ERROR_H
 
+#include "llvm/Support/Compiler.h"
+
 /*
     system_error synopsis
 
@@ -222,7 +224,7 @@ template <> struct hash<std::error_code>;
 
 */
 
-#include "llvm/Config/config.h"
+#include "llvm/Config/llvm-config.h"
 #include "llvm/Support/type_traits.h"
 #include <cerrno>
 #include <string>
@@ -230,129 +232,127 @@ template <> struct hash<std::error_code>;
 // This must be here instead of a .inc file because it is used in the definition
 // of the enum values below.
 #ifdef LLVM_ON_WIN32
-  // VS 2008 needs this for some of the defines below.
-# include <WinSock2.h>
 
   // The following numbers were taken from VS2010.
 # ifndef EAFNOSUPPORT
-#   define EAFNOSUPPORT WSAEAFNOSUPPORT
+#   define EAFNOSUPPORT 102
 # endif
 # ifndef EADDRINUSE
-#   define EADDRINUSE WSAEADDRINUSE
+#   define EADDRINUSE 100
 # endif
 # ifndef EADDRNOTAVAIL
-#   define EADDRNOTAVAIL WSAEADDRNOTAVAIL
+#   define EADDRNOTAVAIL 101
 # endif
 # ifndef EISCONN
-#   define EISCONN WSAEISCONN
+#   define EISCONN 113
 # endif
 # ifndef E2BIG
-#   define E2BIG WSAE2BIG
+#   define E2BIG 7
 # endif
 # ifndef EDOM
-#   define EDOM WSAEDOM
+#   define EDOM 33
 # endif
 # ifndef EFAULT
-#   define EFAULT WSAEFAULT
+#   define EFAULT 14
 # endif
 # ifndef EBADF
-#   define EBADF WSAEBADF
+#   define EBADF 9
 # endif
 # ifndef EBADMSG
 #   define EBADMSG 104
 # endif
 # ifndef EPIPE
-#   define EPIPE WSAEPIPE
+#   define EPIPE 32
 # endif
 # ifndef ECONNABORTED
-#   define ECONNABORTED WSAECONNABORTED
+#   define ECONNABORTED 106
 # endif
 # ifndef EALREADY
-#   define EALREADY WSAEALREADY
+#   define EALREADY 103
 # endif
 # ifndef ECONNREFUSED
-#   define ECONNREFUSED WSAECONNREFUSED
+#   define ECONNREFUSED 107
 # endif
 # ifndef ECONNRESET
-#   define ECONNRESET WSAECONNRESET
+#   define ECONNRESET 108
 # endif
 # ifndef EXDEV
-#   define EXDEV WSAEXDEV
+#   define EXDEV 18
 # endif
 # ifndef EDESTADDRREQ
-#   define EDESTADDRREQ WSAEDESTADDRREQ
+#   define EDESTADDRREQ 109
 # endif
 # ifndef EBUSY
-#   define EBUSY WSAEBUSY
+#   define EBUSY 16
 # endif
 # ifndef ENOTEMPTY
-#   define ENOTEMPTY WSAENOTEMPTY
+#   define ENOTEMPTY 41
 # endif
 # ifndef ENOEXEC
-#   define ENOEXEC WSAENOEXEC
+#   define ENOEXEC 8
 # endif
 # ifndef EEXIST
-#   define EEXIST WSAEEXIST
+#   define EEXIST 17
 # endif
 # ifndef EFBIG
-#   define EFBIG WSAEFBIG
+#   define EFBIG 27
 # endif
 # ifndef ENAMETOOLONG
-#   define ENAMETOOLONG WSAENAMETOOLONG
+#   define ENAMETOOLONG 38
 # endif
 # ifndef ENOSYS
-#   define ENOSYS WSAENOSYS
+#   define ENOSYS 40
 # endif
 # ifndef EHOSTUNREACH
-#   define EHOSTUNREACH WSAEHOSTUNREACH
+#   define EHOSTUNREACH 110
 # endif
 # ifndef EIDRM
 #   define EIDRM 111
 # endif
 # ifndef EILSEQ
-#   define EILSEQ WSAEILSEQ
+#   define EILSEQ 42
 # endif
 # ifndef ENOTTY
-#   define ENOTTY WSAENOTTY
+#   define ENOTTY 25
 # endif
 # ifndef EINTR
-#   define EINTR WSAEINTR
+#   define EINTR 4
 # endif
 # ifndef EINVAL
-#   define EINVAL WSAEINVAL
+#   define EINVAL 22
 # endif
 # ifndef ESPIPE
-#   define ESPIPE WSAESPIPE
+#   define ESPIPE 29
 # endif
 # ifndef EIO
-#   define EIO WSAEIO
+#   define EIO 5
 # endif
 # ifndef EISDIR
-#   define EISDIR WSAEISDIR
+#   define EISDIR 21
 # endif
 # ifndef EMSGSIZE
-#   define EMSGSIZE WSAEMSGSIZE
+#   define EMSGSIZE 115
 # endif
 # ifndef ENETDOWN
-#   define ENETDOWN WSAENETDOWN
+#   define ENETDOWN 116
 # endif
 # ifndef ENETRESET
-#   define ENETRESET WSAENETRESET
+#   define ENETRESET 117
 # endif
 # ifndef ENETUNREACH
-#   define ENETUNREACH WSAENETUNREACH
+#   define ENETUNREACH 118
 # endif
 # ifndef ENOBUFS
-#   define ENOBUFS WSAENOBUFS
+#   define ENOBUFS 119
 # endif
 # ifndef ECHILD
-#   define ECHILD WSAECHILD
+#   define ECHILD 10
 # endif
 # ifndef ENOLINK
 #   define ENOLINK 121
 # endif
 # ifndef ENOLCK
-#   define ENOLCK WSAENOLCK
+#   define ENOLCK 39
 # endif
 # ifndef ENODATA
 #   define ENODATA 120
@@ -361,40 +361,40 @@ template <> struct hash<std::error_code>;
 #   define ENOMSG 122
 # endif
 # ifndef ENOPROTOOPT
-#   define ENOPROTOOPT WSAENOPROTOOPT
+#   define ENOPROTOOPT 123
 # endif
 # ifndef ENOSPC
-#   define ENOSPC WSAENOSPC
+#   define ENOSPC 28
 # endif
 # ifndef ENOSR
 #   define ENOSR 124
 # endif
 # ifndef ENXIO
-#   define ENXIO WSAENXIO
+#   define ENXIO 6
 # endif
 # ifndef ENODEV
-#   define ENODEV WSAENODEV
+#   define ENODEV 19
 # endif
 # ifndef ENOENT
-#   define ENOENT WSAENOENT
+#   define ENOENT 2
 # endif
 # ifndef ESRCH
-#   define ESRCH WSAESRCH
+#   define ESRCH 3
 # endif
 # ifndef ENOTDIR
-#   define ENOTDIR WSAENOTDIR
+#   define ENOTDIR 20
 # endif
 # ifndef ENOTSOCK
-#   define ENOTSOCK WSAENOTSOCK
+#   define ENOTSOCK 128
 # endif
 # ifndef ENOSTR
 #   define ENOSTR 125
 # endif
 # ifndef ENOTCONN
-#   define ENOTCONN WSAENOTCONN
+#   define ENOTCONN 126
 # endif
 # ifndef ENOMEM
-#   define ENOMEM WSAENOMEM
+#   define ENOMEM 12
 # endif
 # ifndef ENOTSUP
 #   define ENOTSUP 129
@@ -403,40 +403,40 @@ template <> struct hash<std::error_code>;
 #   define ECANCELED 105
 # endif
 # ifndef EINPROGRESS
-#   define EINPROGRESS WSAEINPROGRESS
+#   define EINPROGRESS 112
 # endif
 # ifndef EPERM
-#   define EPERM WSAEPERM
+#   define EPERM 1
 # endif
 # ifndef EOPNOTSUPP
-#   define EOPNOTSUPP WSAEOPNOTSUPP
+#   define EOPNOTSUPP 130
 # endif
 # ifndef EWOULDBLOCK
-#   define EWOULDBLOCK WSAEWOULDBLOCK
+#   define EWOULDBLOCK 140
 # endif
 # ifndef EOWNERDEAD
 #   define EOWNERDEAD 133
 # endif
 # ifndef EACCES
-#   define EACCES WSAEACCES
+#   define EACCES 13
 # endif
 # ifndef EPROTO
 #   define EPROTO 134
 # endif
 # ifndef EPROTONOSUPPORT
-#   define EPROTONOSUPPORT WSAEPROTONOSUPPORT
+#   define EPROTONOSUPPORT 135
 # endif
 # ifndef EROFS
-#   define EROFS WSAEROFS
+#   define EROFS 30
 # endif
 # ifndef EDEADLK
-#   define EDEADLK WSAEDEADLK
+#   define EDEADLK 36
 # endif
 # ifndef EAGAIN
-#   define EAGAIN WSAEAGAIN
+#   define EAGAIN 11
 # endif
 # ifndef ERANGE
-#   define ERANGE WSAERANGE
+#   define ERANGE 34
 # endif
 # ifndef ENOTRECOVERABLE
 #   define ENOTRECOVERABLE 127
@@ -448,41 +448,30 @@ template <> struct hash<std::error_code>;
 #   define ETXTBSY 139
 # endif
 # ifndef ETIMEDOUT
-#   define ETIMEDOUT WSAETIMEDOUT
+#   define ETIMEDOUT 138
 # endif
 # ifndef ENFILE
-#   define ENFILE WSAENFILE
+#   define ENFILE 23
 # endif
 # ifndef EMFILE
-#   define EMFILE WSAEMFILE
+#   define EMFILE 24
 # endif
 # ifndef EMLINK
-#   define EMLINK WSAEMLINK
+#   define EMLINK 31
 # endif
 # ifndef ELOOP
-#   define ELOOP WSAELOOP
+#   define ELOOP 114
 # endif
 # ifndef EOVERFLOW
 #   define EOVERFLOW 132
 # endif
 # ifndef EPROTOTYPE
-#   define EPROTOTYPE WSAEPROTOTYPE
+#   define EPROTOTYPE 136
 # endif
 #endif
 
 namespace llvm {
 
-template <class T, T v>
-struct integral_constant {
-  typedef T value_type;
-  static const value_type value = v;
-  typedef integral_constant<T,v> type;
-  operator value_type() { return value; }
-};
-
-typedef integral_constant<bool, true> true_type;
-typedef integral_constant<bool, false> false_type;
-
 // is_error_code_enum
 
 template <class Tp> struct is_error_code_enum : public false_type {};
@@ -642,8 +631,8 @@ public:
 
 private:
   error_category();
-  error_category(const error_category&);// = delete;
-  error_category& operator=(const error_category&);// = delete;
+  error_category(const error_category&) LLVM_DELETED_FUNCTION;
+  error_category& operator=(const error_category&) LLVM_DELETED_FUNCTION;
 
 public:
   virtual const char* name() const = 0;
@@ -664,12 +653,17 @@ public:
 class _do_message : public error_category
 {
 public:
-  virtual std::string message(int ev) const;
+  virtual std::string message(int ev) const LLVM_OVERRIDE;
 };
 
 const error_category& generic_category();
 const error_category& system_category();
 
+/// Get the error_category used for errno values from POSIX functions. This is
+/// the same as the system_category on POSIX systems, but is the same as the
+/// generic_category on Windows.
+const error_category& posix_category();
+
 class error_condition
 {
   int _val_;
@@ -710,8 +704,12 @@ public:
   const error_category& category() const {return *_cat_;}
   std::string message() const;
 
-  // explicit
-  operator bool() const {return _val_ != 0;}
+  typedef void (*unspecified_bool_type)();
+  static void unspecified_bool_true() {}
+
+  operator unspecified_bool_type() const { // true if error
+    return _val_ == 0 ? 0 : unspecified_bool_true;
+  }
 };
 
 inline error_condition make_error_condition(errc _e) {
@@ -731,6 +729,10 @@ class error_code {
 public:
   error_code() : _val_(0), _cat_(&system_category()) {}
 
+  static error_code success() {
+    return error_code();
+  }
+
   error_code(int _val, const error_category& _cat)
     : _val_(_val), _cat_(&_cat) {}
 
@@ -769,8 +771,12 @@ public:
 
   std::string message() const;
 
-  // explicit
-  operator bool() const {return _val_ != 0;}
+  typedef void (*unspecified_bool_type)();
+  static void unspecified_bool_true() {}
+
+  operator unspecified_bool_type() const { // true if error
+    return _val_ == 0 ? 0 : unspecified_bool_true;
+  }
 };
 
 inline error_code make_error_code(errc _e) {
@@ -815,19 +821,7 @@ inline bool operator!=(const error_condition& _x, const error_condition& _y) {
   return !(_x == _y);
 }
 
-// system_error
-
-} // end namespace llvm
-
-// This needs to stay here for KillTheDoctor.
-#ifdef LLVM_ON_WIN32
-// FIXME: These two headers really really really need to be removed from here.
-//        Not only is it a violation of System, they define the stupid min and
-//        max macros :(.
-#include <Windows.h>
-#include <WinError.h>
-
-namespace llvm {
+// Windows errors.
 
 //  To construct an error_code after an API error:
 //
@@ -835,63 +829,65 @@ namespace llvm {
 struct windows_error {
 enum _ {
   success = 0,
-  // These names and values are based on Windows winerror.h
-  // This is not a complete list.
-  invalid_function        = ERROR_INVALID_FUNCTION,
-  file_not_found          = ERROR_FILE_NOT_FOUND,
-  path_not_found          = ERROR_PATH_NOT_FOUND,
-  too_many_open_files     = ERROR_TOO_MANY_OPEN_FILES,
-  access_denied           = ERROR_ACCESS_DENIED,
-  invalid_handle          = ERROR_INVALID_HANDLE,
-  arena_trashed           = ERROR_ARENA_TRASHED,
-  not_enough_memory       = ERROR_NOT_ENOUGH_MEMORY,
-  invalid_block           = ERROR_INVALID_BLOCK,
-  bad_environment         = ERROR_BAD_ENVIRONMENT,
-  bad_format              = ERROR_BAD_FORMAT,
-  invalid_access          = ERROR_INVALID_ACCESS,
-  outofmemory             = ERROR_OUTOFMEMORY,
-  invalid_drive           = ERROR_INVALID_DRIVE,
-  current_directory       = ERROR_CURRENT_DIRECTORY,
-  not_same_device         = ERROR_NOT_SAME_DEVICE,
-  no_more_files           = ERROR_NO_MORE_FILES,
-  write_protect           = ERROR_WRITE_PROTECT,
-  bad_unit                = ERROR_BAD_UNIT,
-  not_ready               = ERROR_NOT_READY,
-  bad_command             = ERROR_BAD_COMMAND,
-  crc                     = ERROR_CRC,
-  bad_length              = ERROR_BAD_LENGTH,
-  seek                    = ERROR_SEEK,
-  not_dos_disk            = ERROR_NOT_DOS_DISK,
-  sector_not_found        = ERROR_SECTOR_NOT_FOUND,
-  out_of_paper            = ERROR_OUT_OF_PAPER,
-  write_fault             = ERROR_WRITE_FAULT,
-  read_fault              = ERROR_READ_FAULT,
-  gen_failure             = ERROR_GEN_FAILURE,
-  sharing_violation       = ERROR_SHARING_VIOLATION,
-  lock_violation          = ERROR_LOCK_VIOLATION,
-  wrong_disk              = ERROR_WRONG_DISK,
-  sharing_buffer_exceeded = ERROR_SHARING_BUFFER_EXCEEDED,
-  handle_eof              = ERROR_HANDLE_EOF,
-  handle_disk_full        = ERROR_HANDLE_DISK_FULL,
-  rem_not_list            = ERROR_REM_NOT_LIST,
-  dup_name                = ERROR_DUP_NAME,
-  bad_net_path            = ERROR_BAD_NETPATH,
-  network_busy            = ERROR_NETWORK_BUSY,
-  file_exists             = ERROR_FILE_EXISTS,
-  cannot_make             = ERROR_CANNOT_MAKE,
-  broken_pipe             = ERROR_BROKEN_PIPE,
-  open_failed             = ERROR_OPEN_FAILED,
-  buffer_overflow         = ERROR_BUFFER_OVERFLOW,
-  disk_full               = ERROR_DISK_FULL,
-  lock_failed             = ERROR_LOCK_FAILED,
-  busy                    = ERROR_BUSY,
-  cancel_violation        = ERROR_CANCEL_VIOLATION,
-  already_exists          = ERROR_ALREADY_EXISTS
+  // These names and values are based on Windows WinError.h
+  // This is not a complete list. Add to this list if you need to explicitly
+  // check for it.
+  invalid_function        = 1, // ERROR_INVALID_FUNCTION,
+  file_not_found          = 2, // ERROR_FILE_NOT_FOUND,
+  path_not_found          = 3, // ERROR_PATH_NOT_FOUND,
+  too_many_open_files     = 4, // ERROR_TOO_MANY_OPEN_FILES,
+  access_denied           = 5, // ERROR_ACCESS_DENIED,
+  invalid_handle          = 6, // ERROR_INVALID_HANDLE,
+  arena_trashed           = 7, // ERROR_ARENA_TRASHED,
+  not_enough_memory       = 8, // ERROR_NOT_ENOUGH_MEMORY,
+  invalid_block           = 9, // ERROR_INVALID_BLOCK,
+  bad_environment         = 10, // ERROR_BAD_ENVIRONMENT,
+  bad_format              = 11, // ERROR_BAD_FORMAT,
+  invalid_access          = 12, // ERROR_INVALID_ACCESS,
+  outofmemory             = 14, // ERROR_OUTOFMEMORY,
+  invalid_drive           = 15, // ERROR_INVALID_DRIVE,
+  current_directory       = 16, // ERROR_CURRENT_DIRECTORY,
+  not_same_device         = 17, // ERROR_NOT_SAME_DEVICE,
+  no_more_files           = 18, // ERROR_NO_MORE_FILES,
+  write_protect           = 19, // ERROR_WRITE_PROTECT,
+  bad_unit                = 20, // ERROR_BAD_UNIT,
+  not_ready               = 21, // ERROR_NOT_READY,
+  bad_command             = 22, // ERROR_BAD_COMMAND,
+  crc                     = 23, // ERROR_CRC,
+  bad_length              = 24, // ERROR_BAD_LENGTH,
+  seek                    = 25, // ERROR_SEEK,
+  not_dos_disk            = 26, // ERROR_NOT_DOS_DISK,
+  sector_not_found        = 27, // ERROR_SECTOR_NOT_FOUND,
+  out_of_paper            = 28, // ERROR_OUT_OF_PAPER,
+  write_fault             = 29, // ERROR_WRITE_FAULT,
+  read_fault              = 30, // ERROR_READ_FAULT,
+  gen_failure             = 31, // ERROR_GEN_FAILURE,
+  sharing_violation       = 32, // ERROR_SHARING_VIOLATION,
+  lock_violation          = 33, // ERROR_LOCK_VIOLATION,
+  wrong_disk              = 34, // ERROR_WRONG_DISK,
+  sharing_buffer_exceeded = 36, // ERROR_SHARING_BUFFER_EXCEEDED,
+  handle_eof              = 38, // ERROR_HANDLE_EOF,
+  handle_disk_full        = 39, // ERROR_HANDLE_DISK_FULL,
+  rem_not_list            = 51, // ERROR_REM_NOT_LIST,
+  dup_name                = 52, // ERROR_DUP_NAME,
+  bad_net_path            = 53, // ERROR_BAD_NETPATH,
+  network_busy            = 54, // ERROR_NETWORK_BUSY,
+  file_exists             = 80, // ERROR_FILE_EXISTS,
+  cannot_make             = 82, // ERROR_CANNOT_MAKE,
+  broken_pipe             = 109, // ERROR_BROKEN_PIPE,
+  open_failed             = 110, // ERROR_OPEN_FAILED,
+  buffer_overflow         = 111, // ERROR_BUFFER_OVERFLOW,
+  disk_full               = 112, // ERROR_DISK_FULL,
+  insufficient_buffer     = 122, // ERROR_INSUFFICIENT_BUFFER,
+  lock_failed             = 167, // ERROR_LOCK_FAILED,
+  busy                    = 170, // ERROR_BUSY,
+  cancel_violation        = 173, // ERROR_CANCEL_VIOLATION,
+  already_exists          = 183  // ERROR_ALREADY_EXISTS
 };
   _ v_;
 
   windows_error(_ v) : v_(v) {}
-  explicit windows_error(DWORD v) : v_(_(v)) {}
+  explicit windows_error(int v) : v_(_(v)) {}
   operator int() const {return v_;}
 };
 
@@ -906,6 +902,4 @@ inline error_code make_error_code(windows_error e) {
 
 } // end namespace llvm
 
-#endif // LLVM_ON_WINDOWS
-
 #endif