https://gcc.gnu.org/g:87c14b9896b54696fbec7d8824eee135baca1f4d
commit r17-4838-g87c14b9896b54696fbec7d8824eee135baca1f4d Author: Jonathan Wakely <[email protected]> Date: Fri Sep 25 17:05:39 2026 +0100 libstdc++: Remove preprocessor checks for EPERM The config/os/mingw32-w64/error_constants.h and config/os/mingw32/error_constants.h headers check `#ifdef EPERM` before using it, but I think that's completely redundant. Windows and all versions of MinGW and mingw-w64 define EPERM and always have done as far as I can tell. And all UNIX-like and POSIX-based targets define it. We already have other code that uses EPERM without checking if it's defined, and that would not compile if it wasn't present for the target. Remove the #ifdef from those headers so that we use it unconditionally, and remove some other checks and comments that assume it can be absent. libstdc++-v3/ChangeLog: * config/os/mingw32-w64/error_constants.h: Use EPERM without checking if it's defined. * config/os/mingw32/error_constants.h: Likewise. * src/c++11/system_error.cc: Likewise. * src/c++17/fs_dir.cc (fs::recursive_directory_iterator::__erase): Likewise. * testsuite/19_diagnostics/headers/system_error/errc_std_c++0x.cc: Use errc::operation_not_permitted without checking if EPERM is defined. Reviewed-by: Tomasz KamiĆski <[email protected]> Diff: --- libstdc++-v3/config/os/mingw32-w64/error_constants.h | 2 -- libstdc++-v3/config/os/mingw32/error_constants.h | 2 -- libstdc++-v3/src/c++11/system_error.cc | 4 ---- libstdc++-v3/src/c++17/fs_dir.cc | 6 +----- .../testsuite/19_diagnostics/headers/system_error/errc_std_c++0x.cc | 4 ---- 5 files changed, 1 insertion(+), 17 deletions(-) diff --git a/libstdc++-v3/config/os/mingw32-w64/error_constants.h b/libstdc++-v3/config/os/mingw32-w64/error_constants.h index f2a4fb579042..eca02eeecc76 100644 --- a/libstdc++-v3/config/os/mingw32-w64/error_constants.h +++ b/libstdc++-v3/config/os/mingw32-w64/error_constants.h @@ -118,9 +118,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #endif operation_canceled = ECANCELED, operation_in_progress = EINPROGRESS, -#ifdef EPERM operation_not_permitted = EPERM, -#endif operation_not_supported = EOPNOTSUPP, #ifdef EWOULDBLOCK operation_would_block = EWOULDBLOCK, diff --git a/libstdc++-v3/config/os/mingw32/error_constants.h b/libstdc++-v3/config/os/mingw32/error_constants.h index 2586eed5b037..eeeeedc5c611 100644 --- a/libstdc++-v3/config/os/mingw32/error_constants.h +++ b/libstdc++-v3/config/os/mingw32/error_constants.h @@ -104,9 +104,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #endif // operation_canceled = ECANCELED, // operation_in_progress = EINPROGRESS, -#ifdef EPERM operation_not_permitted = EPERM, -#endif // operation_not_supported = EOPNOTSUPP, #ifdef EWOULDBLOCK operation_would_block = EWOULDBLOCK, diff --git a/libstdc++-v3/src/c++11/system_error.cc b/libstdc++-v3/src/c++11/system_error.cc index 851f51acd404..a251fe6a50e2 100644 --- a/libstdc++-v3/src/c++11/system_error.cc +++ b/libstdc++-v3/src/c++11/system_error.cc @@ -275,11 +275,7 @@ namespace X (NONPAGED_SYSTEM_RESOURCES, EAGAIN); X (NOT_ENOUGH_MEMORY, ENOMEM); X (NOT_ENOUGH_QUOTA, EIO); -#ifdef EPERM X (NOT_OWNER, EPERM); -#else - X (NOT_OWNER, EACCES); -#endif X (NOT_SAME_DEVICE, EXDEV); X (NOT_SUPPORTED, ENOSYS); X (NO_DATA, EPIPE); diff --git a/libstdc++-v3/src/c++17/fs_dir.cc b/libstdc++-v3/src/c++17/fs_dir.cc index 7cced0db823b..f0f613ba2c51 100644 --- a/libstdc++-v3/src/c++17/fs_dir.cc +++ b/libstdc++-v3/src/c++17/fs_dir.cc @@ -515,13 +515,9 @@ fs::recursive_directory_iterator::__erase(error_code* ecptr) // We did not have a cached type, so it's possible that top.entry // is actually a directory, and that's why the unlink above failed. const int err = ec.value(); -#ifdef EPERM // POSIX.1-2017 says unlink on a directory returns EPERM, - // but LSB allows EISDIR too. Some targets don't even define EPERM. + // but LSB allows EISDIR too. bool is_dir = err == EPERM || err == EISDIR; -#else - bool is_dir = err == EISDIR; -#endif #if ! _GLIBCXX_HAVE_UNLINKAT // Without unlinkat, _Dir::unlink uses ::remove, which retries as // rmdir for a directory. Unlinking a *non-empty* directory then diff --git a/libstdc++-v3/testsuite/19_diagnostics/headers/system_error/errc_std_c++0x.cc b/libstdc++-v3/testsuite/19_diagnostics/headers/system_error/errc_std_c++0x.cc index 1b1a950c2b0b..13f4b385e385 100644 --- a/libstdc++-v3/testsuite/19_diagnostics/headers/system_error/errc_std_c++0x.cc +++ b/libstdc++-v3/testsuite/19_diagnostics/headers/system_error/errc_std_c++0x.cc @@ -121,11 +121,7 @@ void test01() #endif TEST_ERRC(operation_in_progress); - -#ifdef EPERM TEST_ERRC(operation_not_permitted); -#endif - TEST_ERRC(operation_not_supported); #ifdef EWOULDBLOCK
