system_error.h revision 218885
1218885Sdim//===---------------------------- system_error ----------------------------===// 2218885Sdim// 3218885Sdim// The LLVM Compiler Infrastructure 4218885Sdim// 5218885Sdim// This file is distributed under the University of Illinois Open Source 6218885Sdim// License. See LICENSE.TXT for details. 7218885Sdim// 8218885Sdim//===----------------------------------------------------------------------===// 9218885Sdim// 10218885Sdim// This was lifted from libc++ and modified for C++03. This is called 11218885Sdim// system_error even though it does not define that class because that's what 12218885Sdim// it's called in C++0x. We don't define system_error because it is only used 13218885Sdim// for exception handling, which we don't use in LLVM. 14218885Sdim// 15218885Sdim//===----------------------------------------------------------------------===// 16218885Sdim 17218885Sdim#ifndef LLVM_SYSTEM_SYSTEM_ERROR_H 18218885Sdim#define LLVM_SYSTEM_SYSTEM_ERROR_H 19218885Sdim 20218885Sdim/* 21218885Sdim system_error synopsis 22218885Sdim 23218885Sdimnamespace std 24218885Sdim{ 25218885Sdim 26218885Sdimclass error_category 27218885Sdim{ 28218885Sdimpublic: 29218885Sdim virtual ~error_category(); 30218885Sdim 31218885Sdim error_category(const error_category&) = delete; 32218885Sdim error_category& operator=(const error_category&) = delete; 33218885Sdim 34218885Sdim virtual const char* name() const = 0; 35218885Sdim virtual error_condition default_error_condition(int ev) const; 36218885Sdim virtual bool equivalent(int code, const error_condition& condition) const; 37218885Sdim virtual bool equivalent(const error_code& code, int condition) const; 38218885Sdim virtual std::string message(int ev) const = 0; 39218885Sdim 40218885Sdim bool operator==(const error_category& rhs) const; 41218885Sdim bool operator!=(const error_category& rhs) const; 42218885Sdim bool operator<(const error_category& rhs) const; 43218885Sdim}; 44218885Sdim 45218885Sdimconst error_category& generic_category(); 46218885Sdimconst error_category& system_category(); 47218885Sdim 48218885Sdimtemplate <class T> struct is_error_code_enum 49218885Sdim : public false_type {}; 50218885Sdim 51218885Sdimtemplate <class T> struct is_error_condition_enum 52218885Sdim : public false_type {}; 53218885Sdim 54218885Sdimclass error_code 55218885Sdim{ 56218885Sdimpublic: 57218885Sdim // constructors: 58218885Sdim error_code(); 59218885Sdim error_code(int val, const error_category& cat); 60218885Sdim template <class ErrorCodeEnum> 61218885Sdim error_code(ErrorCodeEnum e); 62218885Sdim 63218885Sdim // modifiers: 64218885Sdim void assign(int val, const error_category& cat); 65218885Sdim template <class ErrorCodeEnum> 66218885Sdim error_code& operator=(ErrorCodeEnum e); 67218885Sdim void clear(); 68218885Sdim 69218885Sdim // observers: 70218885Sdim int value() const; 71218885Sdim const error_category& category() const; 72218885Sdim error_condition default_error_condition() const; 73218885Sdim std::string message() const; 74218885Sdim explicit operator bool() const; 75218885Sdim}; 76218885Sdim 77218885Sdim// non-member functions: 78218885Sdimbool operator<(const error_code& lhs, const error_code& rhs); 79218885Sdimtemplate <class charT, class traits> 80218885Sdim basic_ostream<charT,traits>& 81218885Sdim operator<<(basic_ostream<charT,traits>& os, const error_code& ec); 82218885Sdim 83218885Sdimclass error_condition 84218885Sdim{ 85218885Sdimpublic: 86218885Sdim // constructors: 87218885Sdim error_condition(); 88218885Sdim error_condition(int val, const error_category& cat); 89218885Sdim template <class ErrorConditionEnum> 90218885Sdim error_condition(ErrorConditionEnum e); 91218885Sdim 92218885Sdim // modifiers: 93218885Sdim void assign(int val, const error_category& cat); 94218885Sdim template <class ErrorConditionEnum> 95218885Sdim error_condition& operator=(ErrorConditionEnum e); 96218885Sdim void clear(); 97218885Sdim 98218885Sdim // observers: 99218885Sdim int value() const; 100218885Sdim const error_category& category() const; 101218885Sdim std::string message() const; 102218885Sdim explicit operator bool() const; 103218885Sdim}; 104218885Sdim 105218885Sdimbool operator<(const error_condition& lhs, const error_condition& rhs); 106218885Sdim 107218885Sdimclass system_error 108218885Sdim : public runtime_error 109218885Sdim{ 110218885Sdimpublic: 111218885Sdim system_error(error_code ec, const std::string& what_arg); 112218885Sdim system_error(error_code ec, const char* what_arg); 113218885Sdim system_error(error_code ec); 114218885Sdim system_error(int ev, const error_category& ecat, const std::string& what_arg); 115218885Sdim system_error(int ev, const error_category& ecat, const char* what_arg); 116218885Sdim system_error(int ev, const error_category& ecat); 117218885Sdim 118218885Sdim const error_code& code() const throw(); 119218885Sdim const char* what() const throw(); 120218885Sdim}; 121218885Sdim 122218885Sdimenum class errc 123218885Sdim{ 124218885Sdim address_family_not_supported, // EAFNOSUPPORT 125218885Sdim address_in_use, // EADDRINUSE 126218885Sdim address_not_available, // EADDRNOTAVAIL 127218885Sdim already_connected, // EISCONN 128218885Sdim argument_list_too_long, // E2BIG 129218885Sdim argument_out_of_domain, // EDOM 130218885Sdim bad_address, // EFAULT 131218885Sdim bad_file_descriptor, // EBADF 132218885Sdim bad_message, // EBADMSG 133218885Sdim broken_pipe, // EPIPE 134218885Sdim connection_aborted, // ECONNABORTED 135218885Sdim connection_already_in_progress, // EALREADY 136218885Sdim connection_refused, // ECONNREFUSED 137218885Sdim connection_reset, // ECONNRESET 138218885Sdim cross_device_link, // EXDEV 139218885Sdim destination_address_required, // EDESTADDRREQ 140218885Sdim device_or_resource_busy, // EBUSY 141218885Sdim directory_not_empty, // ENOTEMPTY 142218885Sdim executable_format_error, // ENOEXEC 143218885Sdim file_exists, // EEXIST 144218885Sdim file_too_large, // EFBIG 145218885Sdim filename_too_long, // ENAMETOOLONG 146218885Sdim function_not_supported, // ENOSYS 147218885Sdim host_unreachable, // EHOSTUNREACH 148218885Sdim identifier_removed, // EIDRM 149218885Sdim illegal_byte_sequence, // EILSEQ 150218885Sdim inappropriate_io_control_operation, // ENOTTY 151218885Sdim interrupted, // EINTR 152218885Sdim invalid_argument, // EINVAL 153218885Sdim invalid_seek, // ESPIPE 154218885Sdim io_error, // EIO 155218885Sdim is_a_directory, // EISDIR 156218885Sdim message_size, // EMSGSIZE 157218885Sdim network_down, // ENETDOWN 158218885Sdim network_reset, // ENETRESET 159218885Sdim network_unreachable, // ENETUNREACH 160218885Sdim no_buffer_space, // ENOBUFS 161218885Sdim no_child_process, // ECHILD 162218885Sdim no_link, // ENOLINK 163218885Sdim no_lock_available, // ENOLCK 164218885Sdim no_message_available, // ENODATA 165218885Sdim no_message, // ENOMSG 166218885Sdim no_protocol_option, // ENOPROTOOPT 167218885Sdim no_space_on_device, // ENOSPC 168218885Sdim no_stream_resources, // ENOSR 169218885Sdim no_such_device_or_address, // ENXIO 170218885Sdim no_such_device, // ENODEV 171218885Sdim no_such_file_or_directory, // ENOENT 172218885Sdim no_such_process, // ESRCH 173218885Sdim not_a_directory, // ENOTDIR 174218885Sdim not_a_socket, // ENOTSOCK 175218885Sdim not_a_stream, // ENOSTR 176218885Sdim not_connected, // ENOTCONN 177218885Sdim not_enough_memory, // ENOMEM 178218885Sdim not_supported, // ENOTSUP 179218885Sdim operation_canceled, // ECANCELED 180218885Sdim operation_in_progress, // EINPROGRESS 181218885Sdim operation_not_permitted, // EPERM 182218885Sdim operation_not_supported, // EOPNOTSUPP 183218885Sdim operation_would_block, // EWOULDBLOCK 184218885Sdim owner_dead, // EOWNERDEAD 185218885Sdim permission_denied, // EACCES 186218885Sdim protocol_error, // EPROTO 187218885Sdim protocol_not_supported, // EPROTONOSUPPORT 188218885Sdim read_only_file_system, // EROFS 189218885Sdim resource_deadlock_would_occur, // EDEADLK 190218885Sdim resource_unavailable_try_again, // EAGAIN 191218885Sdim result_out_of_range, // ERANGE 192218885Sdim state_not_recoverable, // ENOTRECOVERABLE 193218885Sdim stream_timeout, // ETIME 194218885Sdim text_file_busy, // ETXTBSY 195218885Sdim timed_out, // ETIMEDOUT 196218885Sdim too_many_files_open_in_system, // ENFILE 197218885Sdim too_many_files_open, // EMFILE 198218885Sdim too_many_links, // EMLINK 199218885Sdim too_many_symbolic_link_levels, // ELOOP 200218885Sdim value_too_large, // EOVERFLOW 201218885Sdim wrong_protocol_type // EPROTOTYPE 202218885Sdim}; 203218885Sdim 204218885Sdimtemplate <> struct is_error_condition_enum<errc> : true_type { } 205218885Sdim 206218885Sdimerror_code make_error_code(errc e); 207218885Sdimerror_condition make_error_condition(errc e); 208218885Sdim 209218885Sdim// Comparison operators: 210218885Sdimbool operator==(const error_code& lhs, const error_code& rhs); 211218885Sdimbool operator==(const error_code& lhs, const error_condition& rhs); 212218885Sdimbool operator==(const error_condition& lhs, const error_code& rhs); 213218885Sdimbool operator==(const error_condition& lhs, const error_condition& rhs); 214218885Sdimbool operator!=(const error_code& lhs, const error_code& rhs); 215218885Sdimbool operator!=(const error_code& lhs, const error_condition& rhs); 216218885Sdimbool operator!=(const error_condition& lhs, const error_code& rhs); 217218885Sdimbool operator!=(const error_condition& lhs, const error_condition& rhs); 218218885Sdim 219218885Sdimtemplate <> struct hash<std::error_code>; 220218885Sdim 221218885Sdim} // std 222218885Sdim 223218885Sdim*/ 224218885Sdim 225218885Sdim#include "llvm/Config/config.h" 226218885Sdim#include "llvm/Support/type_traits.h" 227218885Sdim#include <cerrno> 228218885Sdim#include <string> 229218885Sdim 230218885Sdim// This must be here instead of a .inc file because it is used in the definition 231218885Sdim// of the enum values below. 232218885Sdim#ifdef LLVM_ON_WIN32 233218885Sdim 234218885Sdim // The following numbers were taken from VS2010. 235218885Sdim# ifndef EAFNOSUPPORT 236218885Sdim# define EAFNOSUPPORT 102 237218885Sdim# endif 238218885Sdim# ifndef EADDRINUSE 239218885Sdim# define EADDRINUSE 100 240218885Sdim# endif 241218885Sdim# ifndef EADDRNOTAVAIL 242218885Sdim# define EADDRNOTAVAIL 101 243218885Sdim# endif 244218885Sdim# ifndef EISCONN 245218885Sdim# define EISCONN 113 246218885Sdim# endif 247218885Sdim# ifndef E2BIG 248218885Sdim# define E2BIG 7 249218885Sdim# endif 250218885Sdim# ifndef EDOM 251218885Sdim# define EDOM 33 252218885Sdim# endif 253218885Sdim# ifndef EFAULT 254218885Sdim# define EFAULT 14 255218885Sdim# endif 256218885Sdim# ifndef EBADF 257218885Sdim# define EBADF 9 258218885Sdim# endif 259218885Sdim# ifndef EBADMSG 260218885Sdim# define EBADMSG 104 261218885Sdim# endif 262218885Sdim# ifndef EPIPE 263218885Sdim# define EPIPE 32 264218885Sdim# endif 265218885Sdim# ifndef ECONNABORTED 266218885Sdim# define ECONNABORTED 106 267218885Sdim# endif 268218885Sdim# ifndef EALREADY 269218885Sdim# define EALREADY 103 270218885Sdim# endif 271218885Sdim# ifndef ECONNREFUSED 272218885Sdim# define ECONNREFUSED 107 273218885Sdim# endif 274218885Sdim# ifndef ECONNRESET 275218885Sdim# define ECONNRESET 108 276218885Sdim# endif 277218885Sdim# ifndef EXDEV 278218885Sdim# define EXDEV 18 279218885Sdim# endif 280218885Sdim# ifndef EDESTADDRREQ 281218885Sdim# define EDESTADDRREQ 109 282218885Sdim# endif 283218885Sdim# ifndef EBUSY 284218885Sdim# define EBUSY 16 285218885Sdim# endif 286218885Sdim# ifndef ENOTEMPTY 287218885Sdim# define ENOTEMPTY 41 288218885Sdim# endif 289218885Sdim# ifndef ENOEXEC 290218885Sdim# define ENOEXEC 8 291218885Sdim# endif 292218885Sdim# ifndef EEXIST 293218885Sdim# define EEXIST 17 294218885Sdim# endif 295218885Sdim# ifndef EFBIG 296218885Sdim# define EFBIG 27 297218885Sdim# endif 298218885Sdim# ifndef ENAMETOOLONG 299218885Sdim# define ENAMETOOLONG 38 300218885Sdim# endif 301218885Sdim# ifndef ENOSYS 302218885Sdim# define ENOSYS 40 303218885Sdim# endif 304218885Sdim# ifndef EHOSTUNREACH 305218885Sdim# define EHOSTUNREACH 110 306218885Sdim# endif 307218885Sdim# ifndef EIDRM 308218885Sdim# define EIDRM 111 309218885Sdim# endif 310218885Sdim# ifndef EILSEQ 311218885Sdim# define EILSEQ 42 312218885Sdim# endif 313218885Sdim# ifndef ENOTTY 314218885Sdim# define ENOTTY 25 315218885Sdim# endif 316218885Sdim# ifndef EINTR 317218885Sdim# define EINTR 4 318218885Sdim# endif 319218885Sdim# ifndef EINVAL 320218885Sdim# define EINVAL 22 321218885Sdim# endif 322218885Sdim# ifndef ESPIPE 323218885Sdim# define ESPIPE 29 324218885Sdim# endif 325218885Sdim# ifndef EIO 326218885Sdim# define EIO 5 327218885Sdim# endif 328218885Sdim# ifndef EISDIR 329218885Sdim# define EISDIR 21 330218885Sdim# endif 331218885Sdim# ifndef EMSGSIZE 332218885Sdim# define EMSGSIZE 115 333218885Sdim# endif 334218885Sdim# ifndef ENETDOWN 335218885Sdim# define ENETDOWN 116 336218885Sdim# endif 337218885Sdim# ifndef ENETRESET 338218885Sdim# define ENETRESET 117 339218885Sdim# endif 340218885Sdim# ifndef ENETUNREACH 341218885Sdim# define ENETUNREACH 118 342218885Sdim# endif 343218885Sdim# ifndef ENOBUFS 344218885Sdim# define ENOBUFS 119 345218885Sdim# endif 346218885Sdim# ifndef ECHILD 347218885Sdim# define ECHILD 10 348218885Sdim# endif 349218885Sdim# ifndef ENOLINK 350218885Sdim# define ENOLINK 121 351218885Sdim# endif 352218885Sdim# ifndef ENOLCK 353218885Sdim# define ENOLCK 39 354218885Sdim# endif 355218885Sdim# ifndef ENODATA 356218885Sdim# define ENODATA 120 357218885Sdim# endif 358218885Sdim# ifndef ENOMSG 359218885Sdim# define ENOMSG 122 360218885Sdim# endif 361218885Sdim# ifndef ENOPROTOOPT 362218885Sdim# define ENOPROTOOPT 123 363218885Sdim# endif 364218885Sdim# ifndef ENOSPC 365218885Sdim# define ENOSPC 28 366218885Sdim# endif 367218885Sdim# ifndef ENOSR 368218885Sdim# define ENOSR 124 369218885Sdim# endif 370218885Sdim# ifndef ENXIO 371218885Sdim# define ENXIO 6 372218885Sdim# endif 373218885Sdim# ifndef ENODEV 374218885Sdim# define ENODEV 19 375218885Sdim# endif 376218885Sdim# ifndef ENOENT 377218885Sdim# define ENOENT 2 378218885Sdim# endif 379218885Sdim# ifndef ESRCH 380218885Sdim# define ESRCH 3 381218885Sdim# endif 382218885Sdim# ifndef ENOTDIR 383218885Sdim# define ENOTDIR 20 384218885Sdim# endif 385218885Sdim# ifndef ENOTSOCK 386218885Sdim# define ENOTSOCK 128 387218885Sdim# endif 388218885Sdim# ifndef ENOSTR 389218885Sdim# define ENOSTR 125 390218885Sdim# endif 391218885Sdim# ifndef ENOTCONN 392218885Sdim# define ENOTCONN 126 393218885Sdim# endif 394218885Sdim# ifndef ENOMEM 395218885Sdim# define ENOMEM 12 396218885Sdim# endif 397218885Sdim# ifndef ENOTSUP 398218885Sdim# define ENOTSUP 129 399218885Sdim# endif 400218885Sdim# ifndef ECANCELED 401218885Sdim# define ECANCELED 105 402218885Sdim# endif 403218885Sdim# ifndef EINPROGRESS 404218885Sdim# define EINPROGRESS 112 405218885Sdim# endif 406218885Sdim# ifndef EPERM 407218885Sdim# define EPERM 1 408218885Sdim# endif 409218885Sdim# ifndef EOPNOTSUPP 410218885Sdim# define EOPNOTSUPP 130 411218885Sdim# endif 412218885Sdim# ifndef EWOULDBLOCK 413218885Sdim# define EWOULDBLOCK 140 414218885Sdim# endif 415218885Sdim# ifndef EOWNERDEAD 416218885Sdim# define EOWNERDEAD 133 417218885Sdim# endif 418218885Sdim# ifndef EACCES 419218885Sdim# define EACCES 13 420218885Sdim# endif 421218885Sdim# ifndef EPROTO 422218885Sdim# define EPROTO 134 423218885Sdim# endif 424218885Sdim# ifndef EPROTONOSUPPORT 425218885Sdim# define EPROTONOSUPPORT 135 426218885Sdim# endif 427218885Sdim# ifndef EROFS 428218885Sdim# define EROFS 30 429218885Sdim# endif 430218885Sdim# ifndef EDEADLK 431218885Sdim# define EDEADLK 36 432218885Sdim# endif 433218885Sdim# ifndef EAGAIN 434218885Sdim# define EAGAIN 11 435218885Sdim# endif 436218885Sdim# ifndef ERANGE 437218885Sdim# define ERANGE 34 438218885Sdim# endif 439218885Sdim# ifndef ENOTRECOVERABLE 440218885Sdim# define ENOTRECOVERABLE 127 441218885Sdim# endif 442218885Sdim# ifndef ETIME 443218885Sdim# define ETIME 137 444218885Sdim# endif 445218885Sdim# ifndef ETXTBSY 446218885Sdim# define ETXTBSY 139 447218885Sdim# endif 448218885Sdim# ifndef ETIMEDOUT 449218885Sdim# define ETIMEDOUT 138 450218885Sdim# endif 451218885Sdim# ifndef ENFILE 452218885Sdim# define ENFILE 23 453218885Sdim# endif 454218885Sdim# ifndef EMFILE 455218885Sdim# define EMFILE 24 456218885Sdim# endif 457218885Sdim# ifndef EMLINK 458218885Sdim# define EMLINK 31 459218885Sdim# endif 460218885Sdim# ifndef ELOOP 461218885Sdim# define ELOOP 114 462218885Sdim# endif 463218885Sdim# ifndef EOVERFLOW 464218885Sdim# define EOVERFLOW 132 465218885Sdim# endif 466218885Sdim# ifndef EPROTOTYPE 467218885Sdim# define EPROTOTYPE 136 468218885Sdim# endif 469218885Sdim#endif 470218885Sdim 471218885Sdimnamespace llvm { 472218885Sdim 473218885Sdimtemplate <class T, T v> 474218885Sdimstruct integral_constant { 475218885Sdim typedef T value_type; 476218885Sdim static const value_type value = v; 477218885Sdim typedef integral_constant<T,v> type; 478218885Sdim operator value_type() { return value; } 479218885Sdim}; 480218885Sdim 481218885Sdimtypedef integral_constant<bool, true> true_type; 482218885Sdimtypedef integral_constant<bool, false> false_type; 483218885Sdim 484218885Sdim// is_error_code_enum 485218885Sdim 486218885Sdimtemplate <class Tp> struct is_error_code_enum : public false_type {}; 487218885Sdim 488218885Sdim// is_error_condition_enum 489218885Sdim 490218885Sdimtemplate <class Tp> struct is_error_condition_enum : public false_type {}; 491218885Sdim 492218885Sdim// Some error codes are not present on all platforms, so we provide equivalents 493218885Sdim// for them: 494218885Sdim 495218885Sdim//enum class errc 496218885Sdimstruct errc { 497218885Sdimenum _ { 498218885Sdim success = 0, 499218885Sdim address_family_not_supported = EAFNOSUPPORT, 500218885Sdim address_in_use = EADDRINUSE, 501218885Sdim address_not_available = EADDRNOTAVAIL, 502218885Sdim already_connected = EISCONN, 503218885Sdim argument_list_too_long = E2BIG, 504218885Sdim argument_out_of_domain = EDOM, 505218885Sdim bad_address = EFAULT, 506218885Sdim bad_file_descriptor = EBADF, 507218885Sdim#ifdef EBADMSG 508218885Sdim bad_message = EBADMSG, 509218885Sdim#else 510218885Sdim bad_message = EINVAL, 511218885Sdim#endif 512218885Sdim broken_pipe = EPIPE, 513218885Sdim connection_aborted = ECONNABORTED, 514218885Sdim connection_already_in_progress = EALREADY, 515218885Sdim connection_refused = ECONNREFUSED, 516218885Sdim connection_reset = ECONNRESET, 517218885Sdim cross_device_link = EXDEV, 518218885Sdim destination_address_required = EDESTADDRREQ, 519218885Sdim device_or_resource_busy = EBUSY, 520218885Sdim directory_not_empty = ENOTEMPTY, 521218885Sdim executable_format_error = ENOEXEC, 522218885Sdim file_exists = EEXIST, 523218885Sdim file_too_large = EFBIG, 524218885Sdim filename_too_long = ENAMETOOLONG, 525218885Sdim function_not_supported = ENOSYS, 526218885Sdim host_unreachable = EHOSTUNREACH, 527218885Sdim identifier_removed = EIDRM, 528218885Sdim illegal_byte_sequence = EILSEQ, 529218885Sdim inappropriate_io_control_operation = ENOTTY, 530218885Sdim interrupted = EINTR, 531218885Sdim invalid_argument = EINVAL, 532218885Sdim invalid_seek = ESPIPE, 533218885Sdim io_error = EIO, 534218885Sdim is_a_directory = EISDIR, 535218885Sdim message_size = EMSGSIZE, 536218885Sdim network_down = ENETDOWN, 537218885Sdim network_reset = ENETRESET, 538218885Sdim network_unreachable = ENETUNREACH, 539218885Sdim no_buffer_space = ENOBUFS, 540218885Sdim no_child_process = ECHILD, 541218885Sdim#ifdef ENOLINK 542218885Sdim no_link = ENOLINK, 543218885Sdim#else 544218885Sdim no_link = EINVAL, 545218885Sdim#endif 546218885Sdim no_lock_available = ENOLCK, 547218885Sdim#ifdef ENODATA 548218885Sdim no_message_available = ENODATA, 549218885Sdim#else 550218885Sdim no_message_available = ENOMSG, 551218885Sdim#endif 552218885Sdim no_message = ENOMSG, 553218885Sdim no_protocol_option = ENOPROTOOPT, 554218885Sdim no_space_on_device = ENOSPC, 555218885Sdim#ifdef ENOSR 556218885Sdim no_stream_resources = ENOSR, 557218885Sdim#else 558218885Sdim no_stream_resources = ENOMEM, 559218885Sdim#endif 560218885Sdim no_such_device_or_address = ENXIO, 561218885Sdim no_such_device = ENODEV, 562218885Sdim no_such_file_or_directory = ENOENT, 563218885Sdim no_such_process = ESRCH, 564218885Sdim not_a_directory = ENOTDIR, 565218885Sdim not_a_socket = ENOTSOCK, 566218885Sdim#ifdef ENOSTR 567218885Sdim not_a_stream = ENOSTR, 568218885Sdim#else 569218885Sdim not_a_stream = EINVAL, 570218885Sdim#endif 571218885Sdim not_connected = ENOTCONN, 572218885Sdim not_enough_memory = ENOMEM, 573218885Sdim not_supported = ENOTSUP, 574218885Sdim#ifdef ECANCELED 575218885Sdim operation_canceled = ECANCELED, 576218885Sdim#else 577218885Sdim operation_canceled = EINVAL, 578218885Sdim#endif 579218885Sdim operation_in_progress = EINPROGRESS, 580218885Sdim operation_not_permitted = EPERM, 581218885Sdim operation_not_supported = EOPNOTSUPP, 582218885Sdim operation_would_block = EWOULDBLOCK, 583218885Sdim#ifdef EOWNERDEAD 584218885Sdim owner_dead = EOWNERDEAD, 585218885Sdim#else 586218885Sdim owner_dead = EINVAL, 587218885Sdim#endif 588218885Sdim permission_denied = EACCES, 589218885Sdim#ifdef EPROTO 590218885Sdim protocol_error = EPROTO, 591218885Sdim#else 592218885Sdim protocol_error = EINVAL, 593218885Sdim#endif 594218885Sdim protocol_not_supported = EPROTONOSUPPORT, 595218885Sdim read_only_file_system = EROFS, 596218885Sdim resource_deadlock_would_occur = EDEADLK, 597218885Sdim resource_unavailable_try_again = EAGAIN, 598218885Sdim result_out_of_range = ERANGE, 599218885Sdim#ifdef ENOTRECOVERABLE 600218885Sdim state_not_recoverable = ENOTRECOVERABLE, 601218885Sdim#else 602218885Sdim state_not_recoverable = EINVAL, 603218885Sdim#endif 604218885Sdim#ifdef ETIME 605218885Sdim stream_timeout = ETIME, 606218885Sdim#else 607218885Sdim stream_timeout = ETIMEDOUT, 608218885Sdim#endif 609218885Sdim text_file_busy = ETXTBSY, 610218885Sdim timed_out = ETIMEDOUT, 611218885Sdim too_many_files_open_in_system = ENFILE, 612218885Sdim too_many_files_open = EMFILE, 613218885Sdim too_many_links = EMLINK, 614218885Sdim too_many_symbolic_link_levels = ELOOP, 615218885Sdim value_too_large = EOVERFLOW, 616218885Sdim wrong_protocol_type = EPROTOTYPE 617218885Sdim}; 618218885Sdim 619218885Sdim _ v_; 620218885Sdim 621218885Sdim errc(_ v) : v_(v) {} 622218885Sdim operator int() const {return v_;} 623218885Sdim}; 624218885Sdim 625218885Sdimtemplate <> struct is_error_condition_enum<errc> : true_type { }; 626218885Sdim 627218885Sdimtemplate <> struct is_error_condition_enum<errc::_> : true_type { }; 628218885Sdim 629218885Sdimclass error_condition; 630218885Sdimclass error_code; 631218885Sdim 632218885Sdim// class error_category 633218885Sdim 634218885Sdimclass _do_message; 635218885Sdim 636218885Sdimclass error_category 637218885Sdim{ 638218885Sdimpublic: 639218885Sdim virtual ~error_category(); 640218885Sdim 641218885Sdimprivate: 642218885Sdim error_category(); 643218885Sdim error_category(const error_category&);// = delete; 644218885Sdim error_category& operator=(const error_category&);// = delete; 645218885Sdim 646218885Sdimpublic: 647218885Sdim virtual const char* name() const = 0; 648218885Sdim virtual error_condition default_error_condition(int _ev) const; 649218885Sdim virtual bool equivalent(int _code, const error_condition& _condition) const; 650218885Sdim virtual bool equivalent(const error_code& _code, int _condition) const; 651218885Sdim virtual std::string message(int _ev) const = 0; 652218885Sdim 653218885Sdim bool operator==(const error_category& _rhs) const {return this == &_rhs;} 654218885Sdim 655218885Sdim bool operator!=(const error_category& _rhs) const {return !(*this == _rhs);} 656218885Sdim 657218885Sdim bool operator< (const error_category& _rhs) const {return this < &_rhs;} 658218885Sdim 659218885Sdim friend class _do_message; 660218885Sdim}; 661218885Sdim 662218885Sdimclass _do_message : public error_category 663218885Sdim{ 664218885Sdimpublic: 665218885Sdim virtual std::string message(int ev) const; 666218885Sdim}; 667218885Sdim 668218885Sdimconst error_category& generic_category(); 669218885Sdimconst error_category& system_category(); 670218885Sdim 671218885Sdim/// Get the error_category used for errno values from POSIX functions. This is 672218885Sdim/// the same as the system_category on POISIX systems, but is the same as the 673218885Sdim/// generic_category on Windows. 674218885Sdimconst error_category& posix_category(); 675218885Sdim 676218885Sdimclass error_condition 677218885Sdim{ 678218885Sdim int _val_; 679218885Sdim const error_category* _cat_; 680218885Sdimpublic: 681218885Sdim error_condition() : _val_(0), _cat_(&generic_category()) {} 682218885Sdim 683218885Sdim error_condition(int _val, const error_category& _cat) 684218885Sdim : _val_(_val), _cat_(&_cat) {} 685218885Sdim 686218885Sdim template <class E> 687218885Sdim error_condition(E _e, typename enable_if_c< 688218885Sdim is_error_condition_enum<E>::value 689218885Sdim >::type* = 0) 690218885Sdim {*this = make_error_condition(_e);} 691218885Sdim 692218885Sdim void assign(int _val, const error_category& _cat) { 693218885Sdim _val_ = _val; 694218885Sdim _cat_ = &_cat; 695218885Sdim } 696218885Sdim 697218885Sdim template <class E> 698218885Sdim typename enable_if_c 699218885Sdim < 700218885Sdim is_error_condition_enum<E>::value, 701218885Sdim error_condition& 702218885Sdim >::type 703218885Sdim operator=(E _e) 704218885Sdim {*this = make_error_condition(_e); return *this;} 705218885Sdim 706218885Sdim void clear() { 707218885Sdim _val_ = 0; 708218885Sdim _cat_ = &generic_category(); 709218885Sdim } 710218885Sdim 711218885Sdim int value() const {return _val_;} 712218885Sdim 713218885Sdim const error_category& category() const {return *_cat_;} 714218885Sdim std::string message() const; 715218885Sdim 716218885Sdim typedef void (*unspecified_bool_type)(); 717218885Sdim static void unspecified_bool_true() {} 718218885Sdim 719218885Sdim operator unspecified_bool_type() const { // true if error 720218885Sdim return _val_ == 0 ? 0 : unspecified_bool_true; 721218885Sdim } 722218885Sdim}; 723218885Sdim 724218885Sdiminline error_condition make_error_condition(errc _e) { 725218885Sdim return error_condition(static_cast<int>(_e), generic_category()); 726218885Sdim} 727218885Sdim 728218885Sdiminline bool operator<(const error_condition& _x, const error_condition& _y) { 729218885Sdim return _x.category() < _y.category() 730218885Sdim || (_x.category() == _y.category() && _x.value() < _y.value()); 731218885Sdim} 732218885Sdim 733218885Sdim// error_code 734218885Sdim 735218885Sdimclass error_code { 736218885Sdim int _val_; 737218885Sdim const error_category* _cat_; 738218885Sdimpublic: 739218885Sdim error_code() : _val_(0), _cat_(&system_category()) {} 740218885Sdim 741218885Sdim error_code(int _val, const error_category& _cat) 742218885Sdim : _val_(_val), _cat_(&_cat) {} 743218885Sdim 744218885Sdim template <class E> 745218885Sdim error_code(E _e, typename enable_if_c< 746218885Sdim is_error_code_enum<E>::value 747218885Sdim >::type* = 0) { 748218885Sdim *this = make_error_code(_e); 749218885Sdim } 750218885Sdim 751218885Sdim void assign(int _val, const error_category& _cat) { 752218885Sdim _val_ = _val; 753218885Sdim _cat_ = &_cat; 754218885Sdim } 755218885Sdim 756218885Sdim template <class E> 757218885Sdim typename enable_if_c 758218885Sdim < 759218885Sdim is_error_code_enum<E>::value, 760218885Sdim error_code& 761218885Sdim >::type 762218885Sdim operator=(E _e) 763218885Sdim {*this = make_error_code(_e); return *this;} 764218885Sdim 765218885Sdim void clear() { 766218885Sdim _val_ = 0; 767218885Sdim _cat_ = &system_category(); 768218885Sdim } 769218885Sdim 770218885Sdim int value() const {return _val_;} 771218885Sdim 772218885Sdim const error_category& category() const {return *_cat_;} 773218885Sdim 774218885Sdim error_condition default_error_condition() const 775218885Sdim {return _cat_->default_error_condition(_val_);} 776218885Sdim 777218885Sdim std::string message() const; 778218885Sdim 779218885Sdim typedef void (*unspecified_bool_type)(); 780218885Sdim static void unspecified_bool_true() {} 781218885Sdim 782218885Sdim operator unspecified_bool_type() const { // true if error 783218885Sdim return _val_ == 0 ? 0 : unspecified_bool_true; 784218885Sdim } 785218885Sdim}; 786218885Sdim 787218885Sdiminline error_code make_error_code(errc _e) { 788218885Sdim return error_code(static_cast<int>(_e), generic_category()); 789218885Sdim} 790218885Sdim 791218885Sdiminline bool operator<(const error_code& _x, const error_code& _y) { 792218885Sdim return _x.category() < _y.category() 793218885Sdim || (_x.category() == _y.category() && _x.value() < _y.value()); 794218885Sdim} 795218885Sdim 796218885Sdiminline bool operator==(const error_code& _x, const error_code& _y) { 797218885Sdim return _x.category() == _y.category() && _x.value() == _y.value(); 798218885Sdim} 799218885Sdim 800218885Sdiminline bool operator==(const error_code& _x, const error_condition& _y) { 801218885Sdim return _x.category().equivalent(_x.value(), _y) 802218885Sdim || _y.category().equivalent(_x, _y.value()); 803218885Sdim} 804218885Sdim 805218885Sdiminline bool operator==(const error_condition& _x, const error_code& _y) { 806218885Sdim return _y == _x; 807218885Sdim} 808218885Sdim 809218885Sdiminline bool operator==(const error_condition& _x, const error_condition& _y) { 810218885Sdim return _x.category() == _y.category() && _x.value() == _y.value(); 811218885Sdim} 812218885Sdim 813218885Sdiminline bool operator!=(const error_code& _x, const error_code& _y) { 814218885Sdim return !(_x == _y); 815218885Sdim} 816218885Sdim 817218885Sdiminline bool operator!=(const error_code& _x, const error_condition& _y) { 818218885Sdim return !(_x == _y); 819218885Sdim} 820218885Sdim 821218885Sdiminline bool operator!=(const error_condition& _x, const error_code& _y) { 822218885Sdim return !(_x == _y); 823218885Sdim} 824218885Sdim 825218885Sdiminline bool operator!=(const error_condition& _x, const error_condition& _y) { 826218885Sdim return !(_x == _y); 827218885Sdim} 828218885Sdim 829218885Sdim// Windows errors. 830218885Sdim 831218885Sdim// To construct an error_code after an API error: 832218885Sdim// 833218885Sdim// error_code( ::GetLastError(), system_category() ) 834218885Sdimstruct windows_error { 835218885Sdimenum _ { 836218885Sdim success = 0, 837218885Sdim // These names and values are based on Windows WinError.h 838218885Sdim // This is not a complete list. Add to this list if you need to explicitly 839218885Sdim // check for it. 840218885Sdim invalid_function = 1, // ERROR_INVALID_FUNCTION, 841218885Sdim file_not_found = 2, // ERROR_FILE_NOT_FOUND, 842218885Sdim path_not_found = 3, // ERROR_PATH_NOT_FOUND, 843218885Sdim too_many_open_files = 4, // ERROR_TOO_MANY_OPEN_FILES, 844218885Sdim access_denied = 5, // ERROR_ACCESS_DENIED, 845218885Sdim invalid_handle = 6, // ERROR_INVALID_HANDLE, 846218885Sdim arena_trashed = 7, // ERROR_ARENA_TRASHED, 847218885Sdim not_enough_memory = 8, // ERROR_NOT_ENOUGH_MEMORY, 848218885Sdim invalid_block = 9, // ERROR_INVALID_BLOCK, 849218885Sdim bad_environment = 10, // ERROR_BAD_ENVIRONMENT, 850218885Sdim bad_format = 11, // ERROR_BAD_FORMAT, 851218885Sdim invalid_access = 12, // ERROR_INVALID_ACCESS, 852218885Sdim outofmemory = 14, // ERROR_OUTOFMEMORY, 853218885Sdim invalid_drive = 15, // ERROR_INVALID_DRIVE, 854218885Sdim current_directory = 16, // ERROR_CURRENT_DIRECTORY, 855218885Sdim not_same_device = 17, // ERROR_NOT_SAME_DEVICE, 856218885Sdim no_more_files = 18, // ERROR_NO_MORE_FILES, 857218885Sdim write_protect = 19, // ERROR_WRITE_PROTECT, 858218885Sdim bad_unit = 20, // ERROR_BAD_UNIT, 859218885Sdim not_ready = 21, // ERROR_NOT_READY, 860218885Sdim bad_command = 22, // ERROR_BAD_COMMAND, 861218885Sdim crc = 23, // ERROR_CRC, 862218885Sdim bad_length = 24, // ERROR_BAD_LENGTH, 863218885Sdim seek = 25, // ERROR_SEEK, 864218885Sdim not_dos_disk = 26, // ERROR_NOT_DOS_DISK, 865218885Sdim sector_not_found = 27, // ERROR_SECTOR_NOT_FOUND, 866218885Sdim out_of_paper = 28, // ERROR_OUT_OF_PAPER, 867218885Sdim write_fault = 29, // ERROR_WRITE_FAULT, 868218885Sdim read_fault = 30, // ERROR_READ_FAULT, 869218885Sdim gen_failure = 31, // ERROR_GEN_FAILURE, 870218885Sdim sharing_violation = 32, // ERROR_SHARING_VIOLATION, 871218885Sdim lock_violation = 33, // ERROR_LOCK_VIOLATION, 872218885Sdim wrong_disk = 34, // ERROR_WRONG_DISK, 873218885Sdim sharing_buffer_exceeded = 36, // ERROR_SHARING_BUFFER_EXCEEDED, 874218885Sdim handle_eof = 38, // ERROR_HANDLE_EOF, 875218885Sdim handle_disk_full = 39, // ERROR_HANDLE_DISK_FULL, 876218885Sdim rem_not_list = 51, // ERROR_REM_NOT_LIST, 877218885Sdim dup_name = 52, // ERROR_DUP_NAME, 878218885Sdim bad_net_path = 53, // ERROR_BAD_NETPATH, 879218885Sdim network_busy = 54, // ERROR_NETWORK_BUSY, 880218885Sdim file_exists = 80, // ERROR_FILE_EXISTS, 881218885Sdim cannot_make = 82, // ERROR_CANNOT_MAKE, 882218885Sdim broken_pipe = 109, // ERROR_BROKEN_PIPE, 883218885Sdim open_failed = 110, // ERROR_OPEN_FAILED, 884218885Sdim buffer_overflow = 111, // ERROR_BUFFER_OVERFLOW, 885218885Sdim disk_full = 112, // ERROR_DISK_FULL, 886218885Sdim insufficient_buffer = 122, // ERROR_INSUFFICIENT_BUFFER, 887218885Sdim lock_failed = 167, // ERROR_LOCK_FAILED, 888218885Sdim busy = 170, // ERROR_BUSY, 889218885Sdim cancel_violation = 173, // ERROR_CANCEL_VIOLATION, 890218885Sdim already_exists = 183 // ERROR_ALREADY_EXISTS 891218885Sdim}; 892218885Sdim _ v_; 893218885Sdim 894218885Sdim windows_error(_ v) : v_(v) {} 895218885Sdim explicit windows_error(int v) : v_(_(v)) {} 896218885Sdim operator int() const {return v_;} 897218885Sdim}; 898218885Sdim 899218885Sdim 900218885Sdimtemplate <> struct is_error_code_enum<windows_error> : true_type { }; 901218885Sdim 902218885Sdimtemplate <> struct is_error_code_enum<windows_error::_> : true_type { }; 903218885Sdim 904218885Sdiminline error_code make_error_code(windows_error e) { 905218885Sdim return error_code(static_cast<int>(e), system_category()); 906218885Sdim} 907218885Sdim 908218885Sdim} // end namespace llvm 909218885Sdim 910218885Sdim#endif 911