outcome v2.1 Release Notes

Release Date: 2019-06-17 // about 3 years ago


    - success() and failure() now produce types marked [[nodiscard]].

    include/outcome/outcome.natvis is now namespace permuted like the rest of
    Outcome, so debugging Outcome based code in Visual Studio should look much
    prettier than before.


    - .has_failure() was returning false at times when it should have returned true.



    • BREAKING CHANGE result<T, E>, boost_result<T, E> and std_result<T, E>
      no longer implement hard UB on fetching a value from a valueless instance if E is
      a UDT, they now fail to compile with a useful error message. If you wish hard UB,
      use unchecked<T, E>, boost_unchecked<T, E> or std_unchecked<T, E> instead.


    • Fixed a nasty corner case bug where value type's without a copy constructor
      🚚 but with a move constructor would indicate via traits that copy construction
      was available. Thanks to Microsoft's compiler team for reporting this issue.

    Added experimental status_result and status_outcome based on experimental

    0️⃣ Boost edition is now 100% Boost, so defaults for result and outcome are
    boost::system::error_code::errc_t and boost::exception_ptr. Moreover,
    βœ… the test suite in the Boost edition now exclusively tests the Boost edition.
    One can, of course, freely use the standalone edition with Boost, and the Boost
    edition with std types.

    Renamed ADL discovered customisation point throw_as_system_error_with_payload()
    to outcome_throw_as_system_error_with_payload().


    • Added much clearer compile failure when user tries result<T, T> or outcome
      where two or more types are identical. Thanks to Andrzej KrzemieΔΉβ€žski
      for suggesting a technique which combines SFINAE correctness with
      the remaining ability for result<T, T> etc to be a valid type, but
      not constructible.


    • Fixed one of the oldest long open bugs in Outcome, that the noexcept
      βœ… unit tests failed on OS X for an unknown reason.


    - Outcome did not construct correctly from failure_type.

    🚚 Inexplicably outcome's error + exception constructor had been removed.
    πŸ‘€ Nobody noticed during the Boost peer review, which is worrying seeing as that
    constructor is needed for one of the main advertised features to Boost!

    #107 and #116

    • operator== and operator!= now become disabled if the value, error and
      πŸ‘» exception types do not implement the same operator.

    - Relatedly, both comparison operators simply didn't work right. Fixed.


    • swap() now has correct noexcept calculation and now correctly orders
      the swaps to be whichever is the throwing swap first.

    βž• Added reference dump of v2.1 ABI so we can check if ABI breakage detection
    πŸ‘· works in the next set of changes, plus Travis job to check ABI and API compatibility
    per commit.


    • OUTCOME_TRY is now overloaded and selects void or auto edition
      according to input parameter count.


    • Fix generation of double underscored temporary variables in
      OUTCOME_UNIQUE_NAME, which is UB.


    • Separated result from its hard coded dependency on the <system_error> header.
    • Renamed result and outcome to basic_result and basic_outcome.
    • Renamed result.hpp into basic_result.hpp.
    • Moved <system_error> and <exception> dependent code into new
      std_result.hpp and std_outcome.hpp header files.
    • Added boost_result.hpp and boost_outcome.hpp which use Boost.System
      πŸ‘» and Boost.Exception (these are result.hpp and outcome.hpp in the Boost edition).