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