Linux: Correctly identify valid error codes
authorDavid Majnemer <david.majnemer@gmail.com>
Thu, 29 May 2014 05:02:22 +0000 (05:02 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Thu, 29 May 2014 05:02:22 +0000 (05:02 +0000)
[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.

llvm-svn: 209795

libcxx/src/ios.cpp
libcxx/src/system_error.cpp
libcxx/test/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/system_category.pass.cpp

index 03af978..e241394 100644 (file)
@@ -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");
index 00920ff..d5cb2d4 100644 (file)
@@ -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());
 }
index ddcb725..b5cb18a 100644 (file)
@@ -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());
 }