https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99533
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> --- The standard says that skip_permission_denied means to ignore "an error indicating that permission to access p is denied" and it's pretty clearly intended to correspond to std::errc::permission_denied errors, not std::errc::operation_not_permitted. But this should solve the issue for MacOS: --- a/libstdc++-v3/src/c++17/fs_dir.cc +++ b/libstdc++-v3/src/c++17/fs_dir.cc @@ -207,7 +207,7 @@ recursive_directory_iterator(const path& p, directory_options options, else { const int err = errno; - if (err == EACCES + if (fs::is_permission_denied_error(err) && is_set(options, fs::directory_options::skip_permission_denied)) { if (ecptr) diff --git a/libstdc++-v3/src/filesystem/dir-common.h b/libstdc++-v3/src/filesystem/dir-common.h index 56e279230f4..a49b8304a29 100644 --- a/libstdc++-v3/src/filesystem/dir-common.h +++ b/libstdc++-v3/src/filesystem/dir-common.h @@ -141,6 +141,18 @@ struct _Dir_base posix::DIR* dirp; }; +inline bool +is_permission_denied_error(int e) +{ + if (e == EACCES) + return true; +#ifdef __APPLE__ + if (e == EPERM) // See PR 99533 + return true; +#endif + return false; +} + } // namespace filesystem // BEGIN/END macros must be defined before including this file. diff --git a/libstdc++-v3/src/filesystem/dir.cc b/libstdc++-v3/src/filesystem/dir.cc index acc62986c68..215a9533f1b 100644 --- a/libstdc++-v3/src/filesystem/dir.cc +++ b/libstdc++-v3/src/filesystem/dir.cc @@ -202,7 +202,7 @@ recursive_directory_iterator(const path& p, directory_options options, else { const int err = errno; - if (err == EACCES + if (std::filesystem::is_permission_denied_error(err) && is_set(options, fs::directory_options::skip_permission_denied)) {