From 58ff10e7331b93c411f882af8f5246a0a146e275 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Thu, 29 May 2014 05:02:22 +0000 Subject: Linux: Correctly identify valid error codes [syserr.errcat.objects]p4 specifies that system_category().default_error_condition(ev) map to error_condition(posv, generic_category()) if ev could map to a POSIX errno. Linux reserves up to and including 4095 for errno values, use this as a bound. This fixes syserr.errcat.objects/system_category.pass.cpp on Linux. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@209795 91177308-0d34-0410-b5e6-96231b3b80d8 (cherry picked from commit 0f5a5124d21cad2ea1278a2aed44bfd40a17b542) --- src/ios.cpp | 4 +++- src/system_error.cpp | 9 +++++++++ .../syserr.errcat/syserr.errcat.objects/system_category.pass.cpp | 4 ++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/ios.cpp b/src/ios.cpp index 7019eb411..35cb03020 100644 --- a/src/ios.cpp +++ b/src/ios.cpp @@ -56,7 +56,9 @@ __iostream_category::message(int ev) const if (ev != static_cast(io_errc::stream) #ifdef ELAST && ev <= ELAST -#endif +#elif defined(__linux__) + && ev <= 4095 +#endif // ELAST ) return __do_message::message(ev); return string("unspecified iostream_category error"); diff --git a/src/system_error.cpp b/src/system_error.cpp index 00920ffd6..d5cb2d4ae 100644 --- a/src/system_error.cpp +++ b/src/system_error.cpp @@ -68,6 +68,9 @@ __generic_error_category::message(int ev) const #ifdef ELAST if (ev > ELAST) return string("unspecified generic_category error"); +#elif defined(__linux__) + if (ev > 4095) + return string("unspecified generic_category error"); #endif // ELAST return __do_message::message(ev); } @@ -100,6 +103,9 @@ __system_error_category::message(int ev) const #ifdef ELAST if (ev > ELAST) return string("unspecified system_category error"); +#elif defined(__linux__) + if (ev > 4095) + return string("unspecified system_category error"); #endif // ELAST return __do_message::message(ev); } @@ -110,6 +116,9 @@ __system_error_category::default_error_condition(int ev) const _NOEXCEPT #ifdef ELAST if (ev > ELAST) return error_condition(ev, system_category()); +#elif defined(__linux__) + if (ev > 4095) + return error_condition(ev, system_category()); #endif // ELAST return error_condition(ev, generic_category()); } diff --git a/test/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/system_category.pass.cpp b/test/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/system_category.pass.cpp index ddcb72531..b5cb18ad7 100644 --- a/test/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/system_category.pass.cpp +++ b/test/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/system_category.pass.cpp @@ -23,7 +23,7 @@ int main() std::error_condition e_cond = e_cat1.default_error_condition(5); assert(e_cond.value() == 5); assert(e_cond.category() == std::generic_category()); - e_cond = e_cat1.default_error_condition(500); - assert(e_cond.value() == 500); + e_cond = e_cat1.default_error_condition(5000); + assert(e_cond.value() == 5000); assert(e_cond.category() == std::system_category()); } -- cgit v1.2.3