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:
Jonathan Wakely 2018-08-03 13:53:34 +01:00 committed by Jonathan Wakely
parent c9f8fca6d6
commit d7487e2ae8
3 changed files with 47 additions and 1 deletions

View File

@ -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.

View File

@ -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

View File

@ -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