From fde18e721c6607149e7a25504e7c2b7d66f4e019 Mon Sep 17 00:00:00 2001 From: Steve Gerbino Date: Wed, 24 Jun 2026 14:58:18 +0200 Subject: [PATCH] cond::timeout now matches std::errc::timed_out cond_cat::equivalent matched cond::timeout only against error::timeout, while cond::canceled also matched raw std::errc::operation_canceled. A platform or third-party timed_out code therefore compared equal to cond::canceled's analogue but not to cond::timeout. Accept std::errc::timed_out for cond::timeout so callers can compare any timeout code against the portable condition, mirroring the canceled branch. --- src/cond.cpp | 6 +++++- test/unit/cond.cpp | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/cond.cpp b/src/cond.cpp index ba54d3045..bef7dcefc 100644 --- a/src/cond.cpp +++ b/src/cond.cpp @@ -64,7 +64,11 @@ equivalent( return ec == capy::error::not_found; case cond::timeout: - return ec == capy::error::timeout; + if(ec == capy::error::timeout) + return true; + if(ec == std::errc::timed_out) + return true; + return false; default: return false; diff --git a/test/unit/cond.cpp b/test/unit/cond.cpp index 1262939a3..e620dbca2 100644 --- a/test/unit/cond.cpp +++ b/test/unit/cond.cpp @@ -97,6 +97,18 @@ class cond_test BOOST_TEST(!(make_error_code(error::eof) == cond::stream_truncated)); BOOST_TEST(make_error_code(error::timeout) == cond::timeout); + // Equivalence: std::errc::timed_out == cond::timeout + { + auto ec = make_error_code(std::errc::timed_out); + BOOST_TEST(ec == cond::timeout); + BOOST_TEST(!(ec == cond::eof)); + } + { + std::error_code ec = std::make_error_code(std::errc::timed_out); + BOOST_TEST(ec == cond::timeout); + BOOST_TEST(!(ec == cond::canceled)); + } + // Out-of-range condition is equivalent to nothing. { auto ec = make_error_code(error::eof);