+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.
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 );
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