https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69789
--- Comment #3 from Thomas Markwalder <tmark at isc dot org> --- After further analysis we've discovered that the optimizer does not remove the tests, it alters the comparison of (ec == enumerated value). If one replaces the "ec" with "ec.value()" in the expressions, such that you are explicitly comparing the interger error value the code works correctly when optimized: {{{ : // Retry operation if interrupted by signal. if (ec.value() == boost::asio::error::interrupted) continue; // Check if we need to run the operation again. if (ec.value() == boost::asio::error::would_block || ec == boost::asio::error::try_again) return false; : }}} Alternatively, adding an inline operator: {{{ inline friend bool operator==( const error_code & lhs, const int & rhs ) BOOST_SYSTEM_NOEXCEPT { return lhs.m_val == rhs; } }}} to error_code class also avoids the issue.