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
This commit is contained in:
parent
c9f8fca6d6
commit
d7487e2ae8
3 changed files with 47 additions and 1 deletions
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue