https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69789
--- Comment #5 from Thomas Markwalder <tmark at isc dot org> --- A bit more digging reveals that in the logic expression which fails: {{{ // Check if we need to run the operation again. if (ec == boost::asio::error::would_block || ec == boost::asio::error::try_again) return false; }}} The value for error_category:m_cat differs between the implicitly created instances for would_block and try_again. If one splits the if into two separate if statements, the values for m_cat are the same. This looks a like the behavior described under "Static Variables in Inline Functions" described here: http://processors.wiki.ti.com/index.php/C++_Inlining_Issues