diff --git a/libstdc++-v3/config/os/generic/error_constants.h b/libstdc++-v3/config/os/generic/error_constants.h index 4d900414494c733f19c66d6ed6d4eba06990327c..ba2795352bcc86619759839f7385ce3ccf47f531 100644 --- a/libstdc++-v3/config/os/generic/error_constants.h +++ b/libstdc++-v3/config/os/generic/error_constants.h @@ -167,6 +167,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #ifdef EOVERFLOW value_too_large = EOVERFLOW, +#elif defined __AVR__ + value_too_large = 999, #endif wrong_protocol_type = EPROTOTYPE diff --git a/libstdc++-v3/src/c++11/system_error.cc b/libstdc++-v3/src/c++11/system_error.cc index 6e7c0ac0c26cc0be1f63711ddd8ee83ab5dc2abe..748eee941681849747cf30bbf954d3f6b0cd064b 100644 --- a/libstdc++-v3/src/c++11/system_error.cc +++ b/libstdc++-v3/src/c++11/system_error.cc @@ -251,6 +251,15 @@ namespace X (WRITE_PROTECT, EROFS); #undef X +#elif defined __AVR__ + // avr-libc only defines a few distinct error numbers. Most <errno.h> + // constants are not usable in #if directives and have the same value. + case EDOM: + case ERANGE: + case ENOSYS: + case EINTR: + case 0: + return std::error_condition(ev, generic_category_instance.obj); #else // List of errno macros from [cerrno.syn]. // C11 only defines EDOM, EILSEQ and ERANGE, the rest are from POSIX. diff --git a/libstdc++-v3/src/c++17/fs_ops.cc b/libstdc++-v3/src/c++17/fs_ops.cc index b49bf4a6b2093407a424a75e7df3210c1c0eee98..c94d260632f68fdeebbb1ea42deca64af0ea23b5 100644 --- a/libstdc++-v3/src/c++17/fs_ops.cc +++ b/libstdc++-v3/src/c++17/fs_ops.cc @@ -736,7 +736,7 @@ fs::path fs::current_path(error_code& ec) { path p; -#ifdef _GLIBCXX_HAVE_UNISTD_H +#if defined _GLIBCXX_HAVE_UNISTD_H && ! defined __AVR__ #if defined __GLIBC__ || defined _GLIBCXX_FILESYSTEM_IS_WINDOWS if (char_ptr cwd = char_ptr{posix::getcwd(nullptr, 0)}) { @@ -1302,6 +1302,7 @@ fs::remove_all(const path& p) } // Directory is empty now, will remove it below. break; +#ifndef __AVR__ case ENOENT: // Our work here is done. return 0; @@ -1309,6 +1310,7 @@ fs::remove_all(const path& p) case ELOOP: // Not a directory, will remove below. break; +#endif default: // An error occurred. _GLIBCXX_THROW_OR_ABORT(filesystem_error("cannot remove all", p, ec)); @@ -1339,6 +1341,7 @@ fs::remove_all(const path& p, error_code& ec) } // Directory is empty now, will remove it below. break; +#ifndef __AVR__ case ENOENT: // Our work here is done. ec.clear(); @@ -1347,6 +1350,7 @@ fs::remove_all(const path& p, error_code& ec) case ELOOP: // Not a directory, will remove below. break; +#endif default: // An error occurred. return -1; diff --git a/libstdc++-v3/src/filesystem/ops-common.h b/libstdc++-v3/src/filesystem/ops-common.h index b0d49dd4d4f866e76bdebfe3cb762b52663b1859..02c75be09d2060c180b2c5414f3d77cd2999005b 100644 --- a/libstdc++-v3/src/filesystem/ops-common.h +++ b/libstdc++-v3/src/filesystem/ops-common.h @@ -167,7 +167,7 @@ namespace __gnu_posix return ret; } using char_type = wchar_t; -#elif defined _GLIBCXX_HAVE_UNISTD_H +#elif defined _GLIBCXX_HAVE_UNISTD_H && ! defined __AVR__ using ::open; using ::close; # ifdef _GLIBCXX_HAVE_SYS_STAT_H