summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2014-05-29 05:02:22 +0000
committerDan Albert <danalbert@google.com>2014-07-29 15:49:18 -0700
commit58ff10e7331b93c411f882af8f5246a0a146e275 (patch)
treed98d8802ceb2a72657d3993e0ca4cd20611430af
parent0ac811445c369a7b1ee798ec5281557ee6306707 (diff)
downloadexternal_libcxx-58ff10e7331b93c411f882af8f5246a0a146e275.tar.gz
external_libcxx-58ff10e7331b93c411f882af8f5246a0a146e275.tar.bz2
external_libcxx-58ff10e7331b93c411f882af8f5246a0a146e275.zip
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)
-rw-r--r--src/ios.cpp4
-rw-r--r--src/system_error.cpp9
-rw-r--r--test/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/system_category.pass.cpp4
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<int>(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());
}