aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2018-08-03 13:53:34 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2018-08-03 13:53:34 +0100
commitd7487e2ae8666f071cb841a845e1e8770b4f9f67 (patch)
treebbd49f77d9f7a7cb2957bf0f4730414eb945cace
parentc9f8fca6d677b01bd622b17a2a7acb2938a69e0a (diff)
downloadgcc-d7487e2ae8666f071cb841a845e1e8770b4f9f67.zip
gcc-d7487e2ae8666f071cb841a845e1e8770b4f9f67.tar.gz
gcc-d7487e2ae8666f071cb841a845e1e8770b4f9f67.tar.bz2
Add workaround for non-unique errno values on AIX
* src/c++11/system_error.cc (system_error_category::default_error_condition): Add workaround for ENOTEMPTY and EEXIST having the same value on AIX. * testsuite/19_diagnostics/error_category/system_category.cc: Add extra testcases for EDOM, EILSEQ, ERANGE, EEXIST and ENOTEMPTY. From-SVN: r263289
-rw-r--r--libstdc++-v3/ChangeLog8
-rw-r--r--libstdc++-v3/src/c++11/system_error.cc3
-rw-r--r--libstdc++-v3/testsuite/19_diagnostics/error_category/system_category.cc37
3 files changed, 47 insertions, 1 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 8d7306a..94ab41b 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,11 @@
+2018-08-03 Jonathan Wakely <jwakely@redhat.com>
+
+ * src/c++11/system_error.cc
+ (system_error_category::default_error_condition): Add workaround for
+ ENOTEMPTY and EEXIST having the same value on AIX.
+ * testsuite/19_diagnostics/error_category/system_category.cc: Add
+ extra testcases for EDOM, EILSEQ, ERANGE, EEXIST and ENOTEMPTY.
+
2018-08-01 Jonathan Wakely <jwakely@redhat.com>
* configure: Regenerate.
diff --git a/libstdc++-v3/src/c++11/system_error.cc b/libstdc++-v3/src/c++11/system_error.cc
index 82b4cb5..07f44c0 100644
--- a/libstdc++-v3/src/c++11/system_error.cc
+++ b/libstdc++-v3/src/c++11/system_error.cc
@@ -241,7 +241,8 @@ namespace
#ifdef ENOTDIR
case ENOTDIR:
#endif
-#ifdef ENOTEMPTY
+#if defined ENOTEMPTY && (!defined EEXIST || ENOTEMPTY != EEXIST)
+ // AIX sometimes uses the same value for EEXIST and ENOTEMPTY
case ENOTEMPTY:
#endif
#ifdef ENOTRECOVERABLE
diff --git a/libstdc++-v3/testsuite/19_diagnostics/error_category/system_category.cc b/libstdc++-v3/testsuite/19_diagnostics/error_category/system_category.cc
index 6076d73..77cd9c5 100644
--- a/libstdc++-v3/testsuite/19_diagnostics/error_category/system_category.cc
+++ b/libstdc++-v3/testsuite/19_diagnostics/error_category/system_category.cc
@@ -34,6 +34,22 @@ test02()
const std::error_category& cat = std::system_category();
std::error_condition cond;
+ // As of 2011, ISO C only defines EDOM, EILSEQ and ERANGE:
+ cond = cat.default_error_condition(EDOM);
+ VERIFY( cond.value() == EDOM );
+ VERIFY( cond == std::errc::argument_out_of_domain );
+ VERIFY( cond.category() == std::generic_category() );
+ cond = cat.default_error_condition(EILSEQ);
+ VERIFY( cond.value() == EILSEQ );
+ VERIFY( cond == std::errc::illegal_byte_sequence );
+ VERIFY( cond.category() == std::generic_category() );
+ cond = cat.default_error_condition(ERANGE);
+ VERIFY( cond.value() == ERANGE );
+ VERIFY( cond == std::errc::result_out_of_range );
+ VERIFY( cond.category() == std::generic_category() );
+
+ // EBADF and EACCES are defined on all targets,
+ // according to config/os/*/error_constants.h
cond = cat.default_error_condition(EBADF);
VERIFY( cond.value() == EBADF );
VERIFY( cond == std::errc::bad_file_descriptor );
@@ -52,8 +68,29 @@ test02()
VERIFY( cond.category() == cat );
// PR libstdc++/60555
+ VERIFY( std::error_code(EDOM, cat) == std::errc::argument_out_of_domain );
+ VERIFY( std::error_code(EILSEQ, cat) == std::errc::illegal_byte_sequence );
+ VERIFY( std::error_code(ERANGE, cat) == std::errc::result_out_of_range );
VERIFY( std::error_code(EBADF, cat) == std::errc::bad_file_descriptor );
VERIFY( std::error_code(EACCES, cat) == std::errc::permission_denied );
+
+ // As shown at https://gcc.gnu.org/ml/libstdc++/2018-08/msg00018.html
+ // these two error codes might have the same value on AIX, but we still
+ // expect both to be matched by system_category and so use generic_category:
+#ifdef EEXIST
+ cond = cat.default_error_condition(EEXIST);
+ VERIFY( cond.value() == EEXIST );
+ VERIFY( cond == std::errc::file_exists );
+ VERIFY( cond.category() == std::generic_category() );
+ VERIFY( std::error_code(EEXIST, cat) == std::errc::file_exists );
+#endif
+#ifdef ENOTEMPTY
+ cond = cat.default_error_condition(ENOTEMPTY);
+ VERIFY( cond.value() == ENOTEMPTY );
+ VERIFY( cond == std::errc::directory_not_empty );
+ VERIFY( cond.category() == std::generic_category() );
+ VERIFY( std::error_code(ENOTEMPTY, cat) == std::errc::directory_not_empty );
+#endif
}
void