From 9a9e690a149328cc3b2c17e534a315081960af59 Mon Sep 17 00:00:00 2001 From: Valentyn Kit Date: Mon, 29 Jun 2026 18:20:03 +0300 Subject: [PATCH] std: map ENOTSUP to ErrorKind::Unsupported decode_error_kind maps EOPNOTSUPP to Unsupported but not ENOTSUP. The two are the same value on some targets (Linux, FreeBSD), where that arm already covers both, and different on others (Apple, OpenBSD), where ENOTSUP fell through to Uncategorized. Since they alias on some targets, an or-pattern would be an unreachable arm there; use a match guard, like the existing EAGAIN/EWOULDBLOCK arm. --- library/std/src/sys/io/error/unix.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/library/std/src/sys/io/error/unix.rs b/library/std/src/sys/io/error/unix.rs index 56295578bf7d9..36aed77b34319 100644 --- a/library/std/src/sys/io/error/unix.rs +++ b/library/std/src/sys/io/error/unix.rs @@ -138,10 +138,14 @@ pub fn decode_error_kind(errno: i32) -> io::ErrorKind { libc::EXDEV => CrossesDevices, libc::EINPROGRESS => InProgress, libc::EMFILE | libc::ENFILE => TooManyOpenFiles, - libc::EOPNOTSUPP => Unsupported, libc::EACCES | libc::EPERM => PermissionDenied, + // EOPNOTSUPP and ENOTSUP can have the same value on some systems, + // but different values on others (e.g. Apple), so we can't use a + // match clause + x if x == libc::EOPNOTSUPP || x == libc::ENOTSUP => Unsupported, + // These two constants can have the same value on some systems, // but different values on others, so we can't use a match // clause