mirror of
https://github.com/boostorg/outcome.git
synced 2026-01-26 06:42:24 +00:00
981 lines
57 KiB
HTML
981 lines
57 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html><meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<title>Changelog - Boost.Outcome documentation</title>
|
|
<link rel="stylesheet" href="./css/boost.css" type="text/css">
|
|
<meta name="generator" content="Hugo 0.52 with Boostdoc theme">
|
|
<meta name="viewport" content="width=device-width,initial-scale=1.0"/>
|
|
|
|
<link rel="icon" href="./images/favicon.ico" type="image/ico"/>
|
|
<body><div class="spirit-nav">
|
|
<a accesskey="p" href="./videos.html"><img src="./images/prev.png" alt="Prev"></a>
|
|
<a accesskey="u" href="./index.html"><img src="./images/up.png" alt="Up"></a>
|
|
<a accesskey="h" href="./index.html"><img src="./images/home.png" alt="Home"></a><a accesskey="n" href="./changelog/upgrade_v21_v22.html"><img src="./images/next.png" alt="Next"></a></div><div id="content">
|
|
|
|
<div class="titlepage"><div><div><h1 style="clear: both">Changelog</h1></div></div></div>
|
|
<div class="toc"><dl class="toc">
|
|
<dt>
|
|
<dd><dl>
|
|
<dt><a href="#v2-2-15-boost-1-91-release-https-github-com-ned14-outcome-releases-tag-v2-2-15">v2.2.15 ? (Boost 1.91) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.15">[release]</a></a>
|
|
<dd><dl>
|
|
<dt><a href="#enhancements">Enhancements:</a></dt>
|
|
<dt><a href="#bug-fixes">Bug fixes:</a></dt>
|
|
</dl></dd></dt>
|
|
<dt><a href="#v2-2-14-10th-december-2025-boost-1-90-release-https-github-com-ned14-outcome-releases-tag-v2-2-14">v2.2.14 10th December 2025 (Boost 1.90) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.14">[release]</a></a>
|
|
<dd><dl>
|
|
<dt><a href="#enhancements-1">Enhancements:</a></dt>
|
|
</dl></dd></dt>
|
|
<dt><a href="#v2-2-13-6th-august-2025-boost-1-89-release-https-github-com-ned14-outcome-releases-tag-v2-2-13">v2.2.13 6th August 2025 (Boost 1.89) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.13">[release]</a></a>
|
|
<dd><dl>
|
|
<dt><a href="#enhancements-2">Enhancements:</a></dt>
|
|
</dl></dd></dt>
|
|
<dt><a href="#v2-2-12-10th-april-2025-boost-1-88-release-https-github-com-ned14-outcome-releases-tag-v2-2-12">v2.2.12 10th April 2025 (Boost 1.88) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.12">[release]</a></a>
|
|
<dd><dl>
|
|
<dt><a href="#bug-fixes-1">Bug fixes:</a></dt>
|
|
</dl></dd></dt>
|
|
<dt><a href="#v2-2-11-12th-december-2024-boost-1-87-release-https-github-com-ned14-outcome-releases-tag-v2-2-11">v2.2.11 12th December 2024 (Boost 1.87) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.11">[release]</a></a>
|
|
<dd><dl>
|
|
<dt><a href="#enhancements-3">Enhancements:</a></dt>
|
|
<dt><a href="#bug-fixes-2">Bug fixes:</a></dt>
|
|
</dl></dd></dt>
|
|
<dt><a href="#v2-2-10-14th-august-2024-boost-1-86-release-https-github-com-ned14-outcome-releases-tag-v2-2-10">v2.2.10 14th August 2024 (Boost 1.86) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.10">[release]</a></a>
|
|
<dd><dl>
|
|
<dt><a href="#enhancements-4">Enhancements:</a></dt>
|
|
<dt><a href="#bug-fixes-3">Bug fixes:</a></dt>
|
|
</dl></dd></dt>
|
|
<dt><a href="#v2-2-9-15th-april-2024-boost-1-85-release-https-github-com-ned14-outcome-releases-tag-v2-2-9">v2.2.9 15th April 2024 (Boost 1.85) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.9">[release]</a></a>
|
|
<dd><dl>
|
|
<dt><a href="#enhancements-5">Enhancements:</a></dt>
|
|
</dl></dd></dt>
|
|
<dt><a href="#v2-2-8-13th-december-2023-boost-1-84-release-https-github-com-ned14-outcome-releases-tag-v2-2-8">v2.2.8 13th December 2023 (Boost 1.84) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.8">[release]</a></a>
|
|
<dd><dl>
|
|
<dt><a href="#enhancements-6">Enhancements:</a></dt>
|
|
<dt><a href="#bug-fixes-4">Bug fixes:</a></dt>
|
|
</dl></dd></dt>
|
|
<dt><a href="#v2-2-7-13th-august-2023-boost-1-83-release-https-github-com-ned14-outcome-releases-tag-v2-2-7">v2.2.7 13th August 2023 (Boost 1.83) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.7">[release]</a></a>
|
|
<dd><dl>
|
|
<dt><a href="#enhancements-7">Enhancements:</a></dt>
|
|
<dt><a href="#bug-fixes-5">Bug fixes:</a></dt>
|
|
</dl></dd></dt>
|
|
<dt><a href="#v2-2-6-24th-march-2023-boost-1-82-release-https-github-com-ned14-outcome-releases-tag-v2-2-6">v2.2.6 24th March 2023 (Boost 1.82) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.6">[release]</a></a>
|
|
<dd><dl>
|
|
<dt><a href="#enhancements-8">Enhancements:</a></dt>
|
|
<dt><a href="#bug-fixes-6">Bug fixes:</a></dt>
|
|
</dl></dd></dt>
|
|
<dt><a href="#v2-2-4-11th-august-2022-boost-1-80-release-https-github-com-ned14-outcome-releases-tag-v2-2-4">v2.2.4 11th August 2022 (Boost 1.80) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.4">[release]</a></a>
|
|
<dd><dl>
|
|
<dt><a href="#enhancements-9">Enhancements:</a></dt>
|
|
<dt><a href="#bug-fixes-7">Bug fixes:</a></dt>
|
|
</dl></dd></dt>
|
|
<dt><a href="#v2-2-3-17th-march-2022-boost-1-79-release-https-github-com-ned14-outcome-releases-tag-v2-2-3">v2.2.3 17th March 2022 (Boost 1.79) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.3">[release]</a></a>
|
|
<dd><dl>
|
|
<dt><a href="#enhancements-10">Enhancements:</a></dt>
|
|
<dt><a href="#bug-fixes-8">Bug fixes:</a></dt>
|
|
</dl></dd></dt>
|
|
<dt><a href="#v2-2-2-8th-december-2021-boost-1-78-release-https-github-com-ned14-outcome-releases-tag-v2-2-2">v2.2.2 8th December 2021 (Boost 1.78) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.2">[release]</a></a>
|
|
<dd><dl>
|
|
<dt><a href="#enhancements-11">Enhancements:</a></dt>
|
|
<dt><a href="#bug-fixes-9">Bug fixes:</a></dt>
|
|
</dl></dd></dt>
|
|
<dt><a href="#v2-2-1-13th-august-2021-boost-1-77-release-https-github-com-ned14-outcome-releases-tag-v2-2-1">v2.2.1 13th August 2021 (Boost 1.77) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.1">[release]</a></a>
|
|
<dd><dl>
|
|
<dt><a href="#bug-fixes-10">Bug fixes:</a></dt>
|
|
</dl></dd></dt>
|
|
<dt><a href="#v2-2-0-16th-april-2021-boost-1-76-release-https-github-com-ned14-outcome-releases-tag-v2-2-0">v2.2.0 16th April 2021 (Boost 1.76) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.0">[release]</a></a>
|
|
<dd><dl>
|
|
<dt><a href="#enhancements-12">Enhancements:</a></dt>
|
|
<dt><a href="#bug-fixes-11">Bug fixes:</a></dt>
|
|
</dl></dd></dt>
|
|
<dt><a href="#v2-1-5-11th-december-2020-boost-1-75-release-https-github-com-ned14-outcome-releases-tag-v2-1-5">v2.1.5 11th December 2020 (Boost 1.75) <a href="https://github.com/ned14/outcome/releases/tag/v2.1.5">[release]</a></a>
|
|
<dd><dl>
|
|
<dt><a href="#enhancements-13">Enhancements:</a></dt>
|
|
<dt><a href="#bug-fixes-12">Bug fixes:</a></dt>
|
|
</dl></dd></dt>
|
|
<dt><a href="#v2-1-4-14th-august-2020-boost-1-74-release-https-github-com-ned14-outcome-releases-tag-v2-1-4">v2.1.4 14th August 2020 (Boost 1.74) <a href="https://github.com/ned14/outcome/releases/tag/v2.1.4">[release]</a></a>
|
|
<dd><dl>
|
|
<dt><a href="#enhancements-14">Enhancements:</a></dt>
|
|
<dt><a href="#bug-fixes-13">Bug fixes:</a></dt>
|
|
</dl></dd></dt>
|
|
<dt><a href="#v2-1-3-29th-april-2020-boost-1-73-release-https-github-com-ned14-outcome-releases-tag-v2-1-3">v2.1.3 29th April 2020 (Boost 1.73) <a href="https://github.com/ned14/outcome/releases/tag/v2.1.3">[release]</a></a>
|
|
<dd><dl>
|
|
<dt><a href="#enhancements-15">Enhancements:</a></dt>
|
|
<dt><a href="#bug-fixes-14">Bug fixes:</a></dt>
|
|
</dl></dd></dt>
|
|
<dt><a href="#v2-1-2-11th-december-2019-boost-1-72-release-https-github-com-ned14-outcome-releases-tag-v2-1-2">v2.1.2 11th December 2019 (Boost 1.72) <a href="https://github.com/ned14/outcome/releases/tag/v2.1.2">[release]</a></a>
|
|
<dd><dl>
|
|
<dt><a href="#enhancements-16">Enhancements:</a></dt>
|
|
<dt><a href="#bug-fixes-15">Bug fixes:</a></dt>
|
|
</dl></dd></dt>
|
|
<dt><a href="#v2-1-1-19th-august-2019-boost-1-71-release-https-github-com-ned14-outcome-releases-tag-v2-1-1">v2.1.1 19th August 2019 (Boost 1.71) <a href="https://github.com/ned14/outcome/releases/tag/v2.1.1">[release]</a></a>
|
|
<dd><dl>
|
|
<dt><a href="#enhancements-17">Enhancements:</a></dt>
|
|
<dt><a href="#bug-fixes-16">Bug fixes:</a></dt>
|
|
</dl></dd></dt>
|
|
<dt><a href="#v2-1-12th-apr-2019-boost-1-70-release-https-github-com-ned14-outcome-releases-tag-v2-1">v2.1 12th Apr 2019 (Boost 1.70) <a href="https://github.com/ned14/outcome/releases/tag/v2.1">[release]</a></a></dt>
|
|
<dt><a href="#v2-0-18th-jan-2018-release-https-github-com-ned14-outcome-releases-tag-v2-0-boost-peer-review">v2.0 18th Jan 2018 <a href="https://github.com/ned14/outcome/releases/tag/v2.0-boost-peer-review">[release]</a></a></dt>
|
|
</dl></dd></dt>
|
|
</dl>
|
|
</div>
|
|
|
|
|
|
<hr />
|
|
|
|
<h2 id="v2-2-15-boost-1-91-release-https-github-com-ned14-outcome-releases-tag-v2-2-15">v2.2.15 ? (Boost 1.91) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.15">[release]</a></h2>
|
|
|
|
<h3 id="enhancements">Enhancements:</h3>
|
|
|
|
<ul>
|
|
<li><p>Added the beginnings of a complete reimplementation of Experimental Outcome
|
|
from scratch, but written 100% in C. This reimplementation will be usable from
|
|
any ISO C right back to 1989, and it is 100% ABI compatible with this C++
|
|
implementation i.e. you can cast pointers to the types from one
|
|
implementation to the other if you wish, and virtual functions do correctly
|
|
call into 100% C implementations and vice versa.</p></li>
|
|
|
|
<li><p>The C reimplementation required that the C++ <code>status_code_domain</code>’s virtual
|
|
and thunk functions had to be refactored so calling them with <code>__thiscall</code>
|
|
would also work when called with <code>__cdecl</code> on all major architectures and
|
|
calling conventions. I also made them able to return failure without throwing
|
|
a C++ exception. If you have created your own <code>status_code_domain</code>’s
|
|
you will need to update your code (the refactoring is very minor), otherwise
|
|
you shouldn’t notice any change.</p></li>
|
|
|
|
<li><p>The C reimplementation simplified the implementation of <code>atomic_refcounted_string_ref</code>,
|
|
and the C++ implementation was updated to match. The biggest change is that the
|
|
input string is now ALWAYS COPIED and is no longer a <code>malloc</code> pointer whose
|
|
ownership is taken. If you have used <code>atomic_refcounted_string_ref</code> in your own
|
|
code, you’ll need to refactor it to no longer allocate the input buffer using
|
|
<code>malloc</code> and instead pass in the original <code>char</code> buffer.</p></li>
|
|
|
|
<li><p>The complete C reimplementation is currently <strong>NOT YET FIT FOR PRODUCTION USE</strong> and
|
|
you should use instead the current, mature, C API to the C++ implementation.
|
|
The documentation currently makes no reference to the complete C reimplementation,
|
|
though if/when it becomes production ready, it will be updated.</p></li>
|
|
|
|
<li><p>Finally, the C reimplementation is what is being proposed for standardisation
|
|
into the C standard library, so expect the usual renaming and other mild changes
|
|
that standards committees like to do. As I no longer serve on WG21 C++ standards,
|
|
I don’t expect any further changes from that standards commitee.</p></li>
|
|
</ul>
|
|
|
|
<h3 id="bug-fixes">Bug fixes:</h3>
|
|
|
|
<ul>
|
|
<li>In Experimental.Outcome, the <code>make_status_code()</code> ADL customisation point in
|
|
<code>status_code</code> kinda supported transforming between kinds of status code, but it
|
|
also kinda didn’t. Now it definitely does. This fix may cause corner case breakage.</li>
|
|
</ul>
|
|
|
|
<hr />
|
|
|
|
<h2 id="v2-2-14-10th-december-2025-boost-1-90-release-https-github-com-ned14-outcome-releases-tag-v2-2-14">v2.2.14 10th December 2025 (Boost 1.90) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.14">[release]</a></h2>
|
|
|
|
<h3 id="enhancements-1">Enhancements:</h3>
|
|
|
|
<p><a href="https://github.com/ned14/outcome/issues/314">#314</a>
|
|
- Bump Boost min cmake required to 3.10 to match standalone Outcome. Also bump minium cmake to 3.10
|
|
everywhere else in Outcome, as CI is now failing due to us requested too old a cmake.</p>
|
|
|
|
<hr />
|
|
|
|
<h2 id="v2-2-13-6th-august-2025-boost-1-89-release-https-github-com-ned14-outcome-releases-tag-v2-2-13">v2.2.13 6th August 2025 (Boost 1.89) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.13">[release]</a></h2>
|
|
|
|
<h3 id="enhancements-2">Enhancements:</h3>
|
|
|
|
<p><a href="https://github.com/ned14/outcome/issues/312">#312</a>
|
|
- <code>iostream_support.hpp</code> has been split into <code>iostream_support_result.hpp</code> and <code>iostream_support.hpp</code>.</p>
|
|
|
|
<p><a href="https://github.com/ned14/outcome/issues/313">#313</a>
|
|
- Bump min cmake required to 3.10 amongst other cmake modernisation fixes to please cmake 4.0.</p>
|
|
|
|
<hr />
|
|
|
|
<h2 id="v2-2-12-10th-april-2025-boost-1-88-release-https-github-com-ned14-outcome-releases-tag-v2-2-12">v2.2.12 10th April 2025 (Boost 1.88) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.12">[release]</a></h2>
|
|
|
|
<h3 id="bug-fixes-1">Bug fixes:</h3>
|
|
|
|
<ul>
|
|
<li>The Android build had become broken, fixed.</li>
|
|
</ul>
|
|
|
|
<hr />
|
|
|
|
<h2 id="v2-2-11-12th-december-2024-boost-1-87-release-https-github-com-ned14-outcome-releases-tag-v2-2-11">v2.2.11 12th December 2024 (Boost 1.87) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.11">[release]</a></h2>
|
|
|
|
<h3 id="enhancements-3">Enhancements:</h3>
|
|
|
|
<ul>
|
|
<li>Outcome.Experimental has had C representation support since the beginning, however it had
|
|
been mainly intended that C++ would originate Results, they would pass through C, and back
|
|
into C++. It hadn’t really been expected that C would want to do much with Results other than
|
|
inspect them for happy or sad path.</li>
|
|
</ul>
|
|
|
|
<p>It turns out there is more demand than expected for a more functional Result from within C,
|
|
so this release adds the power to create Results in success and two types of failure, semantic
|
|
comparison of Results, and printing of Result messages. You can also wrap a C enum into a
|
|
quick status code from enum, allowing easy custom C error coding from 100% within C.</p>
|
|
|
|
<p><a href="./experimental/c-api.html">The documentation for the C support</a> has been updated
|
|
to reflect the new facilities.</p>
|
|
|
|
<h3 id="bug-fixes-2">Bug fixes:</h3>
|
|
|
|
<ul>
|
|
<li>This was fixed in Standalone Outcome in the last release, but the fix came too late for Boost.Outcome
|
|
which ended up shipping with inline GDB pretty printers with the wrong escaping which caused
|
|
failure to load.</li>
|
|
</ul>
|
|
|
|
<hr />
|
|
|
|
<h2 id="v2-2-10-14th-august-2024-boost-1-86-release-https-github-com-ned14-outcome-releases-tag-v2-2-10">v2.2.10 14th August 2024 (Boost 1.86) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.10">[release]</a></h2>
|
|
|
|
<h3 id="enhancements-4">Enhancements:</h3>
|
|
|
|
<ul>
|
|
<li>Something I’ve been meaning to do for far too long now is make the GDB pretty printers
|
|
auto-loading so you don’t have to set up <code>.gdbinit</code>. This is now done. I also improved
|
|
the pretty printers to also pretty print the C result type which can be very useful if
|
|
working with that type, as it will print the error message in GDB.</li>
|
|
</ul>
|
|
|
|
<p>Experimental Outcome’s <code>status_code</code> has also gained its own auto-loading GDB pretty printer
|
|
with display of <code>strerror()</code> if the code domain is POSIX or generic.</p>
|
|
|
|
<h3 id="bug-fixes-3">Bug fixes:</h3>
|
|
|
|
<ul>
|
|
<li>The <code>status</code> enumeration used to track state internally did not list all possible enum
|
|
values. This caused static analysers to complain.</li>
|
|
</ul>
|
|
|
|
<hr />
|
|
|
|
<h2 id="v2-2-9-15th-april-2024-boost-1-85-release-https-github-com-ned14-outcome-releases-tag-v2-2-9">v2.2.9 15th April 2024 (Boost 1.85) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.9">[release]</a></h2>
|
|
|
|
<h3 id="enhancements-5">Enhancements:</h3>
|
|
|
|
<p><a href="https://github.com/ned14/outcome/issues/293">#293</a>
|
|
- Some users wished that Outcome would be clean with <code>-Wpedantic</code>, this is now turned on for
|
|
the test suite.</p>
|
|
|
|
<p><a href="https://github.com/ned14/outcome/issues/294">#294</a>
|
|
- All use of <code>assert()</code> has been replaced with <code>BOOST_OUTCOME_ASSERT</code>, which can be user overridden
|
|
at compile time.</p>
|
|
|
|
<p><a href="https://github.com/ned14/outcome/issues/295">#295</a>
|
|
- In git commit 12b14e1533848e9a0f7f3c38e41da0ee4e819770 (Aug 11 2022) status code had its
|
|
paths changed due to its headers not previously having the right path convention. It was not
|
|
realised at the time that in Boost.Outcome this resulted in
|
|
<code><boost/outcome/experimental/status-code/status-code/headers.hpp></code> which is not desirable.
|
|
This has now been remedied to remove the double <code>status-code</code>, which will obviously break
|
|
any Boost.Outcome code which relies on the double <code>status-code</code>. Standalone Outcome is unaffected.</p>
|
|
|
|
<hr />
|
|
|
|
<h2 id="v2-2-8-13th-december-2023-boost-1-84-release-https-github-com-ned14-outcome-releases-tag-v2-2-8">v2.2.8 13th December 2023 (Boost 1.84) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.8">[release]</a></h2>
|
|
|
|
<h3 id="enhancements-6">Enhancements:</h3>
|
|
|
|
<ul>
|
|
<li>cmake 3.9 is now the minimum required for standalone Outcome. This fixes a long standing
|
|
cmake issue with probing for standard library facilities. cmake 3.9 is what RHEL7 ships with,
|
|
when RHEL7 EOLs we may raise the minimum cmake version at that point.</li>
|
|
</ul>
|
|
|
|
<h3 id="bug-fixes-4">Bug fixes:</h3>
|
|
|
|
<ul>
|
|
<li>There was a bug in the Outcome C++ coroutine awaitables whereby we were over eagerly resuming
|
|
execution of coroutines which return one of our awaitables. It is surprising how many years have
|
|
passed before this was noticed, but it is now fixed. It is believed that this has been fixed
|
|
without affecting ABI stability, however mixing old Outcome and new Outcome in the same binary
|
|
without recompiling all the C++ coroutine code to use new Outcome will not fix the bug.</li>
|
|
</ul>
|
|
|
|
<p><a href="https://github.com/ned14/outcome/issues/291">#291</a>
|
|
- A Result or Outcome with <code>void</code> value type and move-only non-value type was only usable in
|
|
const use cases, due to the lack of provision of non-const member functions in relevant observers
|
|
injection layers for the <code>void</code> specialisation. The missing non-const member functions have now
|
|
been added.</p>
|
|
|
|
<hr />
|
|
|
|
<h2 id="v2-2-7-13th-august-2023-boost-1-83-release-https-github-com-ned14-outcome-releases-tag-v2-2-7">v2.2.7 13th August 2023 (Boost 1.83) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.7">[release]</a></h2>
|
|
|
|
<h3 id="enhancements-7">Enhancements:</h3>
|
|
|
|
<ul>
|
|
<li><p>Update the list of known compiler issues in the docs.</p></li>
|
|
|
|
<li><p>Update Outcome.Experimental to match latest changes requested of <code>status_code</code> by WG21.
|
|
This as usual will cause minor breakage due to LEWG renaming of things.</p></li>
|
|
|
|
<li><p>Outcome previously took addresses of things not using <code>std::addressof()</code>, and until now
|
|
nobody complained because custom <code>operator&</code> which doesn’t return an address is an
|
|
abomination not used in much modern C++. But finally someone did complain, so
|
|
for both normal Outcome and Experimental.Outcome, if you set <code>BOOST_OUTCOME_USE_STD_ADDRESSOF = 1</code>,
|
|
Outcome will use <code>std::addressof()</code></p></li>
|
|
</ul>
|
|
|
|
<h3 id="bug-fixes-5">Bug fixes:</h3>
|
|
|
|
<p><a href="https://github.com/ned14/outcome/issues/273">#273</a>
|
|
- Changes to other Boost libraries had caused Boost.Outcome’s test suite to fail to compile for some
|
|
compiler and C++ language configurations in recent releases. Thanks to work contributed by @alandefreitas
|
|
and @pdimov, Boost.Outcome now CI tests a wide range of compilers and configurations and it
|
|
is believed all those corner case issues have been fixed or worked around, for the compilers
|
|
and configurations within that CI matrix.</p>
|
|
|
|
<p>Standalone Outcome’s test suite was never affected, as it did not have Boost changing underneath it.
|
|
Nevertheless, a few of the compiler parse bug workarounds will have improved compatibility there
|
|
too for atyical toolchain choices.</p>
|
|
|
|
<ul>
|
|
<li>Experimental.Outcome now supports big endian architectures. Implementation for them simply wasn’t done
|
|
before under the assumption that nobody would be using Experimental.Outcome on big endian architectures.
|
|
Turns out that was a wrong assumption!</li>
|
|
</ul>
|
|
|
|
<hr />
|
|
|
|
<h2 id="v2-2-6-24th-march-2023-boost-1-82-release-https-github-com-ned14-outcome-releases-tag-v2-2-6">v2.2.6 24th March 2023 (Boost 1.82) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.6">[release]</a></h2>
|
|
|
|
<h3 id="enhancements-8">Enhancements:</h3>
|
|
|
|
<ul>
|
|
<li>Update to latest <code>status-code</code> in Experimental.Outcome, which relocates its header files and may
|
|
cause some end user inclusions to need path changes.</li>
|
|
</ul>
|
|
|
|
<h3 id="bug-fixes-6">Bug fixes:</h3>
|
|
|
|
<ul>
|
|
<li>Latest <code>status-code</code> fixes a number of nasty bugs, some mild build breakage in Experimental.Outcome
|
|
may occur as a result. See its commit log for more information.</li>
|
|
</ul>
|
|
|
|
<hr />
|
|
|
|
<h2 id="v2-2-4-11th-august-2022-boost-1-80-release-https-github-com-ned14-outcome-releases-tag-v2-2-4">v2.2.4 11th August 2022 (Boost 1.80) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.4">[release]</a></h2>
|
|
|
|
<h3 id="enhancements-9">Enhancements:</h3>
|
|
|
|
<ul>
|
|
<li><p>Update to latest <code>status-code</code> in Experimental.Outcome, which has some breaking changes and important
|
|
bug fixes.</p></li>
|
|
|
|
<li><p>Add <a href="./reference/types/awaitables/generator.html" class="api-reference"><code>generator<T, Executor = void></code></a>
|
|
to coroutine awaitables.</p></li>
|
|
|
|
<li><p>Add optional <code>Executor</code> template parameter to all Outcome awaitable types for improved compatibility
|
|
with third party software such as <a href="https://think-async.com/Asio/">ASIO</a>.</p></li>
|
|
|
|
<li><p>To Experimental.Outcome add <code>clone()</code> for <code>basic_result</code> and <code>basic_outcome</code> types whose <code>EC</code> is
|
|
a <code>status_code</code>. Erased status codes are move-only which makes the Result/Outcome type move-only, but
|
|
they provide a cloning function, so this convenience function both clones the status code and propagates
|
|
the spare storage so stack backtraces etc are also cloned.</p></li>
|
|
|
|
<li><p>Add type constraints to <code>success()</code> and <code>failure()</code> to disable them if they aren’t available.</p></li>
|
|
|
|
<li><p>Work around a bug in GCC’s C++ Coroutines implementation whereby one gets an ICE from <code>gimplify_expr</code>
|
|
in any <code>BOOST_OUTCOME_CO_TRY</code> taking even a mildly complex expression, which obviously is a showstopper.
|
|
The work around assigns the failure type to a stack temporary before <code>co_return</code>-ing that
|
|
temporary. Thanks to RVO pre-17 and copy elision since, this should add no runtime overhead.</p></li>
|
|
</ul>
|
|
|
|
<h3 id="bug-fixes-7">Bug fixes:</h3>
|
|
|
|
<dl>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/261">#261</a></dt>
|
|
<dd>Move assignable with move constructible not available did not work with <code>void</code>.</dd>
|
|
</dl>
|
|
|
|
<hr />
|
|
|
|
<h2 id="v2-2-3-17th-march-2022-boost-1-79-release-https-github-com-ned14-outcome-releases-tag-v2-2-3">v2.2.3 17th March 2022 (Boost 1.79) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.3">[release]</a></h2>
|
|
|
|
<h3 id="enhancements-10">Enhancements:</h3>
|
|
|
|
<dl>
|
|
<dt>Standalone Outcome permanently locks ABI to v2.2.3 release</dt>
|
|
<dd>From this release onwards, you are guaranteed that any code compiled with v2.2.3 Outcome
|
|
or newer will link without issue with any code compiled with a different version of Outcome
|
|
after v2.2.3. As a result, <code>BOOST_OUTCOME_UNSTABLE_VERSION</code> is no longer defined by default, and
|
|
therefore <code>BOOST_OUTCOME_V2_NAMESPACE</code> is now hard coded to <code>outcome_v2</code> rather than a namespace
|
|
which permutes per commit.</dd>
|
|
</dl>
|
|
|
|
<h3 id="bug-fixes-8">Bug fixes:</h3>
|
|
|
|
<dl>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/259">#255</a></dt>
|
|
<dd>Fix enabling of move assignable was not calculated correctly.</dd>
|
|
</dl>
|
|
|
|
<hr />
|
|
|
|
<h2 id="v2-2-2-8th-december-2021-boost-1-78-release-https-github-com-ned14-outcome-releases-tag-v2-2-2">v2.2.2 8th December 2021 (Boost 1.78) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.2">[release]</a></h2>
|
|
|
|
<h3 id="enhancements-11">Enhancements:</h3>
|
|
|
|
<dl>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/255">#255</a></dt>
|
|
<dd>Restore Experimental Outcome constexpr compatibility in C++ 20 which was an undocumented
|
|
property of the Outcome v2.1 series, and which had been dropped in the v2.2 series.</dd>
|
|
<dt>GCC Coroutines support</dt>
|
|
<dd>Coroutine support in GCCs after 10 is now correctly detected.</dd>
|
|
</dl>
|
|
|
|
<h3 id="bug-fixes-9">Bug fixes:</h3>
|
|
|
|
<ul>
|
|
<li>None.</li>
|
|
</ul>
|
|
|
|
<hr />
|
|
|
|
<h2 id="v2-2-1-13th-august-2021-boost-1-77-release-https-github-com-ned14-outcome-releases-tag-v2-2-1">v2.2.1 13th August 2021 (Boost 1.77) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.1">[release]</a></h2>
|
|
|
|
<h3 id="bug-fixes-10">Bug fixes:</h3>
|
|
|
|
<dl>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/251">#251</a></dt>
|
|
<dd><p>Fix failure to compile Boost.Outcome when the compiler declares support for C++ modules.</p></dd>
|
|
<dd><p>Don’t use <code>[[likely]]</code> in GCCs before 9.</p></dd>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/253">#251</a></dt>
|
|
<dd><p>Make support for C++ modules opt-in.</p></dd>
|
|
</dl>
|
|
|
|
<hr />
|
|
|
|
<h2 id="v2-2-0-16th-april-2021-boost-1-76-release-https-github-com-ned14-outcome-releases-tag-v2-2-0">v2.2.0 16th April 2021 (Boost 1.76) <a href="https://github.com/ned14/outcome/releases/tag/v2.2.0">[release]</a></h2>
|
|
|
|
<dl>
|
|
<dt>BREAKING CHANGE As announced for a year and three Boost releases, Outcome v2.2 became the default, replacing v2.1.</dt>
|
|
<dd>All v2.1 Outcome code will need to be upgraded as described in <a href="./changelog/upgrade_v21_v22.html">the v2.1 => v2.2 upgrade guide</a>.
|
|
This branch has a number of major breaking changes to Outcome v2.1, see
|
|
<a href="./changelog/v22.html">the list of v2.2 major changes</a>.</dd>
|
|
</dl>
|
|
|
|
<h3 id="enhancements-12">Enhancements:</h3>
|
|
|
|
<dl>
|
|
<dt>VS2019.8 compatibility</dt>
|
|
<dd>VS2019.8 changed how to enable Coroutines, which caused Outcome to not compile on that compiler.</dd>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/237">#237</a></dt>
|
|
<dd>If on C++ 20, we now use C++ 20 <code>[[likely]]</code> instead of compiler-specific markup to indicate
|
|
when TRY has likely success or failure.</dd>
|
|
<dt>BREAKING CHANGE <a href="https://github.com/ned14/outcome/issues/247">#247</a></dt>
|
|
<dd><p>Previously the value of <a href="./reference/functions/hooks/spare_storage.html" class="api-reference"><code>spare_storage(const basic_result|basic_outcome *) noexcept</code></a>
|
|
was
|
|
not propagated over <code>BOOST_OUTCOME_TRY</code>, which causes things like stack backtraces captured at the point of
|
|
construction of an errored result to get dropped at every <code>TRY</code> point. This has been fixed by adding
|
|
an optional <code>spare_storage</code> to <a href="./reference/types/success_type.html" class="api-reference"><code>success_type<T></code></a>
|
|
and <a href="./reference/traits/is_failure_type.html" class="api-reference"><code>failure_type<T></code></a>
|
|
, as well
|
|
as to <a href="./reference/functions/success.html" class="api-reference"><code>auto success(T &&, ...)</code></a>
|
|
and <a href="./reference/functions/failure.html" class="api-reference"><code>auto failure(T &&, ...)</code></a>
|
|
.</p>
|
|
|
|
<p>You should not notice this in your code, except that where before spare storage values did not
|
|
propagate through TRY, now they do, which is a breaking change.</p></dd>
|
|
</dl>
|
|
|
|
<h3 id="bug-fixes-11">Bug fixes:</h3>
|
|
|
|
<dl>
|
|
<dt>BREAKING CHANGE <a href="https://github.com/ned14/outcome/issues/244">#244</a></dt>
|
|
<dd><p>It came as a shock to learn that <code>BOOST_OUTCOME_TRY</code> had been broken since the inception of this
|
|
library for certain corner case code:</p>
|
|
<div class="highlight"><pre class="chroma"><code class="language-c++" data-lang="c++"><span class="n">outcome</span><span class="o">::</span><span class="n">result</span><span class="o"><</span><span class="n">Foo</span><span class="o">></span> <span class="n">get_foo</span><span class="p">();</span>
|
|
<span class="n">outcome</span><span class="o">::</span><span class="n">result</span><span class="o"><</span><span class="n">Foo</span><span class="o">></span> <span class="n">filter1</span><span class="p">(</span><span class="n">outcome</span><span class="o">::</span><span class="n">result</span><span class="o"><</span><span class="n">Foo</span><span class="o">></span> <span class="o">&&</span><span class="p">);</span>
|
|
<span class="n">outcome</span><span class="o">::</span><span class="n">result</span><span class="o"><</span><span class="n">Foo</span><span class="o">></span> <span class="o">&&</span> <span class="n">filter2</span><span class="p">(</span><span class="n">outcome</span><span class="o">::</span><span class="n">result</span><span class="o"><</span><span class="n">Foo</span><span class="o">></span> <span class="o">&&</span><span class="p">);</span>
|
|
|
|
<span class="c1">// This works fine, and always has
|
|
</span><span class="c1"></span><span class="n">BOOST_OUTCOME_TRY</span><span class="p">(</span><span class="k">auto</span> <span class="n">v</span><span class="p">,</span> <span class="n">filter1</span><span class="p">(</span><span class="n">get_foo</span><span class="p">()))</span>
|
|
|
|
<span class="c1">// This causes UB due to result<Foo> being destructed before move of value into v
|
|
</span><span class="c1"></span><span class="n">BOOST_OUTCOME_TRY</span><span class="p">(</span><span class="k">auto</span> <span class="n">v</span><span class="p">,</span> <span class="n">filter2</span><span class="p">(</span><span class="n">get_foo</span><span class="p">()))</span>
|
|
</code></pre></div>
|
|
<p>Whilst reference passthrough filter functions are not common, they can turn up in highly generic
|
|
code, where destruction before copy/move is not helpful.</p>
|
|
|
|
<p>The cause is that TRY used to work by binding the result of the expression to an <code>auto &&unique</code>,
|
|
testing if that unique if successful or not, and if successful then moving from <code>unique.value()</code>
|
|
into the user’s output variable. If the expression returned is a prvalue, the Result’s lifetime is
|
|
extended by the bound reference to outside of the statement, and all is good. If the expression
|
|
returned is an xvalue or lvalue, then the lifetime extension does not exceed that of the statement,
|
|
and the Result is destructed after the semicolon succeeding the assignment to <code>auto &&unique</code>.</p>
|
|
|
|
<p>This bug has been fixed by TRY deducing the <a href="https://en.cppreference.com/w/cpp/language/value_category">value category</a>
|
|
of its input expression as follows:</p>
|
|
|
|
<ul>
|
|
<li>prvalues => <code>auto unique = (expr)</code> (breaking change)</li>
|
|
<li>xvalue => <code>auto unique = (expr)</code> (breaking change)</li>
|
|
<li>lvalue => <code>auto unique = (expr)</code> (breaking change)</li>
|
|
</ul>
|
|
|
|
<p>This ensures that xvalue and lvalue inputs do not cause unhelpfully early lifetime end, though it
|
|
does silently change the behaviour of existing code which relied on rvalues and lvalues being passed
|
|
through, as a new construct-move-destruct or construct-copy-destruct cycle is introduced to where
|
|
there was none before. Also, before C++ 17, there is now an added copy/move for prvalue inputs,
|
|
which does not affect runtime codegen due to Return Value Optimisation (RVO), but does cause
|
|
Results containing non-copying non-moving types to fail to compile, which is a breaking change
|
|
from beforehand.</p>
|
|
|
|
<p>If one wishes rvalues or lvalues to be passed through, one can avail of a new TRY syntax based on
|
|
preprocessor overloading:</p>
|
|
|
|
<ul>
|
|
<li><code>BOOST_OUTCOME_TRY((refspec, varname), expr)</code></li>
|
|
<li><code>BOOST_OUTCOME_TRYV2(refspec, expr)</code></li>
|
|
</ul>
|
|
|
|
<p>Here <code>refspec</code> is the storage to be used for <strong>both</strong> the internal temporary unique, AND <code>varname</code>.
|
|
So if you write:</p>
|
|
<div class="highlight"><pre class="chroma"><code class="language-c++" data-lang="c++"><span class="n">Foo</span> <span class="o">&&</span><span class="n">foo</span><span class="p">;</span>
|
|
<span class="n">BOOST_OUTCOME_TRY</span><span class="p">((</span><span class="k">auto</span> <span class="o">&&</span><span class="p">,</span> <span class="n">v</span><span class="p">),</span> <span class="n">filter2</span><span class="p">(</span><span class="n">foo</span><span class="p">))</span>
|
|
</code></pre></div>
|
|
<p>… then the internal unique is declared as <code>auto &&unique = (filter2(foo))</code>, and the output variable
|
|
is declared as <code>auto &&v = std::move(unique).assume_value()</code>. This passes through the rvalue referencing,
|
|
and completely avoids copies and moves of <code>Foo</code>. If you wish to not extract the value but also
|
|
specify unique storage, there is a new <code>BOOST_OUTCOME_TRYV2(refspec, expr)</code>.</p>
|
|
|
|
<p>My thanks to KamilCuk from <a href="https://stackoverflow.com/questions/66069152/token-detection-within-a-c-preprocessor-macro-argument">https://stackoverflow.com/questions/66069152/token-detection-within-a-c-preprocessor-macro-argument</a>
|
|
for all their help in designing the new overloaded TRY syntax. My thanks also to vasama for reporting this
|
|
issue and working through how best to fix it with me.</p></dd>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/249">#249</a></dt>
|
|
<dd><p>The preprocessor logic for choosing when to use <code>bool</code> with <code>concept</code> on GCC was yet again refactored.
|
|
This should fix those choices of GCC configuration which caused failure due to the wrong combination
|
|
being chosen.</p></dd>
|
|
</dl>
|
|
|
|
<hr />
|
|
|
|
<h2 id="v2-1-5-11th-december-2020-boost-1-75-release-https-github-com-ned14-outcome-releases-tag-v2-1-5">v2.1.5 11th December 2020 (Boost 1.75) <a href="https://github.com/ned14/outcome/releases/tag/v2.1.5">[release]</a></h2>
|
|
|
|
<h3 id="enhancements-13">Enhancements:</h3>
|
|
|
|
<dl>
|
|
<dt><a href="./tutorial/advanced/hooks.html">The ADL discovered event hooks</a> have been replaced with policy-specified event hooks instead</dt>
|
|
<dd>This is due to brittleness (where hooks would quietly
|
|
self-disable if somebody changed something), compiler bugs (a difference in compiler settings causes
|
|
the wrong hooks, or some but not all hooks, to get discovered), and end user difficulty in using
|
|
them at all. The policy-specified event hooks can be told to default to ADL discovered hooks for
|
|
backwards compatibility: set <a href="./reference/macros/enable_legacy_support_for.html" class="api-reference"><code>BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR</code></a>
|
|
to less than <code>220</code> to
|
|
enable emulation.</dd>
|
|
<dt>Improve configuring <code>BOOST_OUTCOME_GCC6_CONCEPT_BOOL</code></dt>
|
|
<dd>Older GCCs had boolean based concepts syntax, whereas newer GCCs are standards conforming.
|
|
However the precise logic of when to use legacy and conforming syntax was not well understood,
|
|
which caused Outcome to fail to compile depending on what options you pass to GCC. The new logic
|
|
always uses the legacy syntax if on GCC 8 or older, otherwise we use conforming syntax if and
|
|
only if GCC is in C++ 20 mode or later. This hopefully will resolve the corner case build
|
|
failures on GCC.</dd>
|
|
</dl>
|
|
|
|
<h3 id="bug-fixes-12">Bug fixes:</h3>
|
|
|
|
<dl>
|
|
<dt>Boost.Outcome should now compile with <code>BOOST_NO_EXCEPTIONS</code> defined</dt>
|
|
<dd>Thanks to Emil, maintainer of Boost.Exception, making a change for me, Boost.Outcome
|
|
should now compile with C++ exceptions globally disabled. You won’t be able to use
|
|
<code>boost::exception_ptr</code> as it can’t be included if C++ exceptions are globally disabled.</dd>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/236">#236</a></dt>
|
|
<dd>In the Coroutine support the <code>final_suspend()</code> was not <code>noexcept</code>, despite being required
|
|
to be so in the C++ 20 standard. This has been fixed, but only if your compiler implements
|
|
<code>noop_coroutine</code>. Additionally, if <code>noop_coroutine</code> is available, we use the much more
|
|
efficient coroutine handle returning variant of <code>await_suspend()</code> which should significantly
|
|
improve codegen and context switching performance.</dd>
|
|
</dl>
|
|
|
|
<hr />
|
|
|
|
<h2 id="v2-1-4-14th-august-2020-boost-1-74-release-https-github-com-ned14-outcome-releases-tag-v2-1-4">v2.1.4 14th August 2020 (Boost 1.74) <a href="https://github.com/ned14/outcome/releases/tag/v2.1.4">[release]</a></h2>
|
|
|
|
<h3 id="enhancements-14">Enhancements:</h3>
|
|
|
|
<dl>
|
|
<dt>BREAKING CHANGE <code>void</code> results and outcomes no longer default construct types during explicit construction</dt>
|
|
<dd>Previously if you explicitly constructed a <code>result<T></code> from a non-errored
|
|
<code>result<void></code>, it default constructed <code>T</code>. This was found to cause unhelpful
|
|
surprise, so it has been disabled.</dd>
|
|
<dt>New macro <code>BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR</code></dt>
|
|
<dd>The macro <a href="./reference/macros/enable_legacy_support_for.html" class="api-reference"><code>BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR</code></a>
|
|
can be used to
|
|
enable aliasing of older naming and features to newer naming and features when
|
|
using a newer version of Outcome.</dd>
|
|
<dt>Concepts now have snake case style naming instead of camel case style</dt>
|
|
<dd>When Outcome was first implemented, it was thought that C++ 20 concepts were
|
|
going to have camel case style. This was changed before the C++ 20 release, and
|
|
Outcome’s concepts have been renamed similarly. This won’t break any code in
|
|
Outcome v2.1, as compatibility aliases are provided. However code compiled
|
|
against Outcome v2.2 will need to be upgraded, unless <code>BOOST_OUTCOME_ENABLE_LEGACY_SUPPORT_FOR</code>
|
|
is set to less than <code>220</code>.</dd>
|
|
<dt>Concepts now live in <code>BOOST_OUTCOME_V2_NAMESPACE::concepts</code> namespace</dt>
|
|
<dd>Previously concepts lived in the <code>convert</code> namespace, now they live in their
|
|
own namespace.</dd>
|
|
<dt>New concepts <a href="./reference/concepts/basic_result.html" class="api-reference"><code>basic_result<T></code></a>
|
|
and <a href="./reference/concepts/basic_outcome.html" class="api-reference"><code>basic_outcome<T></code></a>
|
|
added</dt>
|
|
<dd>End users were finding an unhelpful gap in between <a href="./reference/traits/is_basic_result.html" class="api-reference"><code>is_basic_result<T></code></a>
|
|
|
|
and <a href="./reference/concepts/value_or_error.html" class="api-reference"><code>value_or_error<T></code></a>
|
|
where they wanted a concept that matched
|
|
types which were <code>basic_result</code>, but not exactly one of those. Concepts filling
|
|
that gap were added.</dd>
|
|
<dt>Operation <code>TRY</code> works differently from Outcome v2.2 onwards</dt>
|
|
<dd>This is a severely code breaking change which change the syntax of how one uses
|
|
<code>BOOST_OUTCOME_TRY()</code>. A regular expression suitable for upgrading code can be found in
|
|
the list of changes between Outcome v2.1 and v2.2.</dd>
|
|
</dl>
|
|
|
|
<h3 id="bug-fixes-13">Bug fixes:</h3>
|
|
|
|
<dl>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/224">#224</a></dt>
|
|
<dd>The clang Apple ships in Xcode 11.4 (currently the latest) has not been patched
|
|
with the fixes to LLVM clang that fix <code>noexcept(std::is_constructible<T, void>)</code>
|
|
failing to compile which I originally submitted years ago. So give up waiting on
|
|
Apple to fix their clang, add a workaround to Outcome.</dd>
|
|
<dt>Use of <code>void</code> in <code>T</code> or <code>E</code> caused <code>noexcept(false)</code></dt>
|
|
<dd>Direct traits examination of <code>void</code> was causing nothrow detection to return false,
|
|
fixed.</dd>
|
|
<dt>Spare storage could not be used from within no-value policy classes</dt>
|
|
<dd>Due to an obvious brain fart when writing the code at the time, the spare storage
|
|
APIs had the wrong prototype which prevented them working from within policy classes.
|
|
Sorry.</dd>
|
|
</dl>
|
|
|
|
<hr />
|
|
|
|
<h2 id="v2-1-3-29th-april-2020-boost-1-73-release-https-github-com-ned14-outcome-releases-tag-v2-1-3">v2.1.3 29th April 2020 (Boost 1.73) <a href="https://github.com/ned14/outcome/releases/tag/v2.1.3">[release]</a></h2>
|
|
|
|
<h3 id="enhancements-15">Enhancements:</h3>
|
|
|
|
<dl>
|
|
<dt>Performance of Outcome-based code compiled by clang has been greatly improved</dt>
|
|
<dd><p>The previous implementation of Outcome’s status bitfield confused clang’s
|
|
optimiser, which caused low quality codegen. Unlike most codegen issues, this was
|
|
noticeably in empirical benchmarks of real world code, as was shown by
|
|
<a href="https://wg21.link/P1886">P1886 <em>Error speed benchmarking</em></a>.</p>
|
|
|
|
<p>The safe part of the <a href="https://github.com/ned14/outcome/tree/better_optimisation"><code>better_optimisation</code></a>
|
|
Outcome v2.2.0 future branch was merged to Outcome v2.1.3 which includes a new
|
|
status bitfield implementation. This appears to not confuse clang’s optimiser,
|
|
and clang 9 produces code which routinely beats GCC 9’s code for various canned
|
|
use cases.</p></dd>
|
|
<dt>Precompiled headers are automatically enabled on new enough cmake’s for standalone Outcome</dt>
|
|
<dd><p>If on cmake 3.16 or later, its new precompiled headers build support is used
|
|
to tell consumers of the <code>outcome::hl</code> cmake target to precompile Outcome, <strong>if
|
|
and only if</strong> <code>outcome_IS_DEPENDENCY</code> is false. <code>outcome_IS_DEPENDENCY</code> is set
|
|
by Outcome’s CMakeLists.txt if it detects that it was included using
|
|
<code>add_subdirectory()</code>, so for the vast majority of Outcome end users, the use
|
|
of precompiled headers will NOT be enabled.</p>
|
|
|
|
<p>Exported targets do NOT request precompilation of headers, as it is
|
|
assumed that importers of the Outcome cmake targets will configure their own
|
|
precompiled headers which incorporate Outcome.</p></dd>
|
|
<dt>Installability is now CI tested per commit</dt>
|
|
<dd><p>Due to installability of standalone Outcome (e.g. <code>make install</code>) breaking
|
|
itself rather more frequently than is ideal, installability is now tested on CI
|
|
per commit.</p></dd>
|
|
<dt>Coroutines support has been documented</dt>
|
|
<dd><p>The coroutines support added in v2.1.2 has now been properly documented.</p></dd>
|
|
</dl>
|
|
|
|
<h3 id="bug-fixes-14">Bug fixes:</h3>
|
|
|
|
<dl>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/214">#214</a></dt>
|
|
<dd>Newer Concepts implementing compilers were unhappy with the early check for
|
|
destructibility of <code>T</code> and <code>E</code>, so removed template constraints, falling back
|
|
to static assert which runs later in the type instantiation sequence.</dd>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/215">#215</a></dt>
|
|
<dd>For standalone Outcome, <code>CMAKE_TOOLCHAIN_FILE</code> is now passed through during
|
|
dependency superbuild. This should solve build issues for some embedded toolchain
|
|
users.</dd>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/220">#220</a></dt>
|
|
<dd>A false positive undefined behaviour sanitiser failure in some use cases of
|
|
Experimental Outcome was worked around to avoid the failure message.</dd>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/221">#221</a></dt>
|
|
<dd>Restored compatibility with x86 on Windows, which was failing with link errors.
|
|
It was quite surprising that this bug was not reported sooner, but obviously
|
|
almost nobody is using Outcome with x86 on Windows.</dd>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/223">#223</a></dt>
|
|
<dd>Fix a segfault in Debug builds only when cloning a <code>status_code_ptr</code> in
|
|
Experimental.Outcome only.</dd>
|
|
</dl>
|
|
|
|
<hr />
|
|
|
|
<h2 id="v2-1-2-11th-december-2019-boost-1-72-release-https-github-com-ned14-outcome-releases-tag-v2-1-2">v2.1.2 11th December 2019 (Boost 1.72) <a href="https://github.com/ned14/outcome/releases/tag/v2.1.2">[release]</a></h2>
|
|
|
|
<h3 id="enhancements-16">Enhancements:</h3>
|
|
|
|
<dl>
|
|
<dt>Improved compatibility with cmake tooling</dt>
|
|
<dd>Standalone outcome is now <code>make install</code>-able, and cmake <code>find_package()</code> can find it.
|
|
Note that you must separately install and <code>find_package()</code> Outcome’s dependency, quickcpplib,
|
|
else <code>find_package()</code> of Outcome will fail.</dd>
|
|
<dt>Non-permissive parsing is now default in Visual Studio</dt>
|
|
<dd>The default targets in standalone Outcome’s cmake now enable non-permissive parsing.
|
|
This was required partially because VS2019 16.3’s quite buggy Concepts implementation is
|
|
unusuable in permissive parsing mode. Even then, lazy ADL two phase lookup is broken
|
|
in VS2019 16.3 with <code>/std:latest</code>, you may wish to use an earlier language standard.</dd>
|
|
<dt><strong>Breaking change!</strong></dt>
|
|
<dd>The git submodule mechanism used by standalone Outcome of specifying dependent libraries
|
|
has been replaced with a cmake superbuild of dependencies mechanism instead. Upon cmake
|
|
configure, an internal copy of quickcpplib will be git cloned, built and installed into the
|
|
build directory from where an internal <code>find_package()</code> uses it. This breaks the use of
|
|
the unconfigured Outcome repo as an implementation of Outcome, one must now do one of:
|
|
|
|
<ol>
|
|
<li>Add Outcome as subdirectory to cmake build.</li>
|
|
<li>Use cmake superbuild (i.e. <code>ExternalProject_Add()</code>) to build and install Outcome into
|
|
a local installation.</li>
|
|
<li>Use one of the single header editions.</li>
|
|
</ol></dd>
|
|
<dt><strong>Breaking change!</strong></dt>
|
|
<dd>For standalone Outcome, the current compiler is now checked for whether it will compile
|
|
code containing C++ Concepts, and if it does, all cmake consumers of Outcome will enable
|
|
C++ Concepts. Set the cmake variable <code>BOOST_OUTCOME_C_CONCEPTS_FLAGS</code> to an empty string to prevent
|
|
auto detection and enabling of C++ Concepts support occurring.</dd>
|
|
<dt><code>BOOST_OUTCOME_TRY</code> operation now hints to the compiler that operation will be successful</dt>
|
|
<dd><a href="https://wg21.link/P1886">P1886 <em>Error speed benchmarking</em></a> showed that there is
|
|
considerable gain in very small functions by hinting to the compiler whether the expression
|
|
is expected to be successful or not. <code>BOOST_OUTCOME_TRY</code> previously did not hint to the compiler
|
|
at all, but now it does. A new suite of macros <code>BOOST_OUTCOME_TRY_FAILURE_LIKELY</code> hint to the
|
|
compiler that failure is expected. If you wish to return to the previously unhinted
|
|
behaviour, define <code>BOOST_OUTCOME_TRY_LIKELY(expr)</code> to <code>(!!expr)</code>.</dd>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/199">#199</a></dt>
|
|
<dd>Support for C++ Coroutines has been added. This comes in two parts, firstly there is
|
|
now an <code>BOOST_OUTCOME_CO_TRY()</code> operation suitable for performing the <code>TRY</code> operation from
|
|
within a C++ Coroutine. Secondly, in the header <code>outcome/coroutine_support.hpp</code> there are
|
|
implementations of <code>eager<OutcomeType></code> and <code>lazy<OutcomeType></code> which let you more
|
|
naturally and efficiently use <code>basic_result</code> or <code>basic_outcome</code> from within C++
|
|
Coroutines – specifically, if the result or outcome will construct from an exception
|
|
pointer, exceptions thrown in the coroutine return an errored or excepted result with
|
|
the thrown exception instead of throwing the exception through the coroutine machinery
|
|
(which in current compilers, has a high likelihood of blowing up the program). Both
|
|
<code>eager<T></code> and <code>lazy<T></code> can accept any <code>T</code> as well. Both have been tested and found
|
|
working on VS2019 and clang 9.</dd>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/210">#210</a></dt>
|
|
<dd><code>make_error_code()</code> and <code>make_exception_ptr()</code> are now additionally considered for
|
|
compatible copy and move conversions for <code>basic_result<></code>. This lets you construct
|
|
a <code>basic_result<T, E></code> into a <code>basic_result<T, error_code></code>, where <code>E</code> is a
|
|
custom type which has implemented the ADL discovered free function
|
|
<code>error_code make_error_code(E)</code>, but is otherwise unrelated to <code>error_code</code>.
|
|
The same availability applies for <code>exception_ptr</code> with <code>make_exception_ptr()</code> being
|
|
the ADL discovered free function. <code>basic_outcome<></code> has less support for this than
|
|
<code>basic_result<></code> in order to keep constructor count down, but it will accept via
|
|
this mechanism conversions from <code>basic_result<></code> and <code>failure_type<></code>.</dd>
|
|
</dl>
|
|
|
|
<h3 id="bug-fixes-15">Bug fixes:</h3>
|
|
|
|
<dl>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/207">#184</a></dt>
|
|
<dd>The detection of <code>[[nodiscard]]</code> support in the compiler was very mildly broken.</dd>
|
|
</dl>
|
|
|
|
<hr />
|
|
|
|
<h2 id="v2-1-1-19th-august-2019-boost-1-71-release-https-github-com-ned14-outcome-releases-tag-v2-1-1">v2.1.1 19th August 2019 (Boost 1.71) <a href="https://github.com/ned14/outcome/releases/tag/v2.1.1">[release]</a></h2>
|
|
|
|
<h3 id="enhancements-17">Enhancements:</h3>
|
|
|
|
<dl>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/184">#184</a></dt>
|
|
<dd>As per request from Boost release managers, relocated <code>version.hpp</code> and
|
|
<code>revision.hpp</code> into detail, and added the Boost licence boilerplate to the top
|
|
of every source file which was missing one (I think). Also took the opportunity
|
|
to run the licence restamping script over all Outcome, so copyright dates are now
|
|
up to date.</dd>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/185">#185</a></dt>
|
|
<dd>Add FAQ item explaining issue #185, and why we will do nothing to
|
|
fix it right now.</dd>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/189">#189</a></dt>
|
|
<dd>Refactored the <code>BOOST_OUTCOME_TRY</code> implementation to use more clarified
|
|
customisation points capable of accepting very foreign inputs. Removed the
|
|
<code>std::experimental::expected<T, E></code> specialisations, as those are no longer
|
|
necessary. Fixed the documentation for the customisation points which
|
|
previously claimed that they are ADL discovered, which they are not. Added
|
|
a recipe describing how to add in support for foreign input types.</dd>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/183">#183</a></dt>
|
|
<dd>Added a separate <code>motivation/plug_error_code</code> specifically for Boost.</dd>
|
|
</dl>
|
|
|
|
<h3 id="bug-fixes-16">Bug fixes:</h3>
|
|
|
|
<dl>
|
|
<dt>-</dt>
|
|
<dd><code>BOOST_OUTCOME_VERSION_MINOR</code> hadn’t been updated to 1.</dd>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/181">#181</a></dt>
|
|
<dd>Fix issue #181 where Outcome didn’t actually implement the strong swap guarantee,
|
|
despite being documented as doing so.</dd>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/190">#190</a></dt>
|
|
<dd>Fix issue #190 in Boost edition where unit test suite was not runnable from
|
|
the Boost release distro.</dd>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/182">#182</a></dt>
|
|
<dd>Fix issue #182 where <code>trait::is_exception_ptr_available<T></code> was always true,
|
|
thus causing much weirdness, like not printing diagnostics and trying to feed
|
|
everything to <code>make_exception_ptr()</code>.</dd>
|
|
<dt><a href="https://github.com/ned14/outcome/issues/192">#194</a></dt>
|
|
<dd>Fix issue #192 where the <code>std::basic_outcome_failure_exception_from_error()</code>
|
|
was being defined twice for translation units which combine standalone and
|
|
Boost Outcome’s.</dd>
|
|
</dl>
|
|
|
|
<hr />
|
|
|
|
<h2 id="v2-1-12th-apr-2019-boost-1-70-release-https-github-com-ned14-outcome-releases-tag-v2-1">v2.1 12th Apr 2019 (Boost 1.70) <a href="https://github.com/ned14/outcome/releases/tag/v2.1">[release]</a></h2>
|
|
|
|
<ul>
|
|
<li><p><a href="https://github.com/ned14/outcome/issues/180">#180</a></p>
|
|
|
|
<ul>
|
|
<li><code>success()</code> and <code>failure()</code> now produce types marked <code>[[nodiscard]]</code>.</li>
|
|
</ul></li>
|
|
|
|
<li><p><code>include/outcome/outcome.natvis</code> is now namespace permuted like the rest of
|
|
Outcome, so debugging Outcome based code in Visual Studio should look much
|
|
prettier than before.</p></li>
|
|
|
|
<li><p><a href="https://github.com/ned14/outcome/issues/162">#162</a></p>
|
|
|
|
<ul>
|
|
<li><code>.has_failure()</code> was returning false at times when it should have returned true.</li>
|
|
</ul></li>
|
|
|
|
<li><p><a href="https://github.com/ned14/outcome/issues/152">#152</a></p>
|
|
|
|
<ul>
|
|
<li>GCC 5 no longer can compile Outcome at all due to <a href="https://stackoverflow.com/questions/45607450/gcc5-nested-variable-template-is-not-a-function-template">https://stackoverflow.com/questions/45607450/gcc5-nested-variable-template-is-not-a-function-template</a>.
|
|
Added explicit version trap for GCC 5 to say it can not work. Note this is not a
|
|
breaking change, GCC 5 was never supported officially in any v2 Outcome.</li>
|
|
</ul></li>
|
|
|
|
<li><p><a href="https://github.com/ned14/outcome/issues/150">#150</a></p>
|
|
|
|
<ul>
|
|
<li><strong>BREAKING CHANGE</strong> <code>result<T, E></code>, <code>boost_result<T, E></code> and <code>std_result<T, E></code>
|
|
no longer implement hard UB on fetching a value from a valueless instance if <code>E</code> is
|
|
a UDT, they now fail to compile with a useful error message. If you wish hard UB,
|
|
use <code>unchecked<T, E></code>, <code>boost_unchecked<T, E></code> or <code>std_unchecked<T, E></code> instead.</li>
|
|
</ul></li>
|
|
|
|
<li><p><a href="https://github.com/ned14/outcome/issues/140">#140</a></p>
|
|
|
|
<ul>
|
|
<li>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.</li>
|
|
</ul></li>
|
|
|
|
<li><p>Added experimental <code>status_result</code> and <code>status_outcome</code> based on experimental
|
|
<code>status_code</code>.</p></li>
|
|
|
|
<li><p>Boost edition is now 100% Boost, so defaults for <code>result</code> and <code>outcome</code> are
|
|
<code>boost::system::error_code::errc_t</code> and <code>boost::exception_ptr</code>. 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 <code>std</code> types.</p></li>
|
|
|
|
<li><p>Renamed ADL discovered customisation point <code>throw_as_system_error_with_payload()</code>
|
|
to <code>outcome_throw_as_system_error_with_payload()</code>.</p></li>
|
|
|
|
<li><p><a href="https://github.com/ned14/outcome/issues/135">#135</a></p>
|
|
|
|
<ul>
|
|
<li>Added much clearer compile failure when user tries <code>result<T, T></code> or <code>outcome</code>
|
|
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 <code>result<T, T></code> etc to be a valid type, but
|
|
not constructible.</li>
|
|
</ul></li>
|
|
|
|
<li><p><a href="https://github.com/ned14/outcome/issues/67">#67</a></p>
|
|
|
|
<ul>
|
|
<li>Fixed one of the oldest long open bugs in Outcome, that the noexcept
|
|
unit tests failed on OS X for an unknown reason.</li>
|
|
</ul></li>
|
|
|
|
<li><p><a href="https://github.com/ned14/outcome/issues/115">#115</a></p>
|
|
|
|
<ul>
|
|
<li>Outcome did not construct correctly from <code>failure_type</code>.</li>
|
|
</ul></li>
|
|
|
|
<li><p>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!</p></li>
|
|
|
|
<li><p><a href="https://github.com/ned14/outcome/issues/107">#107</a> and <a href="https://github.com/ned14/outcome/issues/116">#116</a></p>
|
|
|
|
<ul>
|
|
<li><code>operator==</code> and <code>operator!=</code> now become disabled if the value, error and
|
|
exception types do not implement the same operator.</li>
|
|
<li>Relatedly, both comparison operators simply didn’t work right. Fixed.</li>
|
|
</ul></li>
|
|
|
|
<li><p><a href="https://github.com/ned14/outcome/issues/109">#109</a></p>
|
|
|
|
<ul>
|
|
<li><code>swap()</code> now has correct <code>noexcept</code> calculation and now correctly orders
|
|
the swaps to be whichever is the throwing swap first.</li>
|
|
</ul></li>
|
|
|
|
<li><p>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.</p></li>
|
|
|
|
<li><p><a href="https://github.com/ned14/outcome/issues/124">#124</a></p>
|
|
|
|
<ul>
|
|
<li><code>BOOST_OUTCOME_TRY</code> is now overloaded and selects <code>void</code> or <code>auto</code> edition
|
|
according to input parameter count.</li>
|
|
</ul></li>
|
|
|
|
<li><p><a href="https://github.com/ned14/outcome/issues/120">#120</a></p>
|
|
|
|
<ul>
|
|
<li>Fix generation of double underscored temporary variables in
|
|
<code>BOOST_OUTCOME_UNIQUE_NAME</code>, which is UB.</li>
|
|
</ul></li>
|
|
|
|
<li><p><a href="https://github.com/ned14/outcome/issues/110">#110</a></p>
|
|
|
|
<ul>
|
|
<li>Separated <code>result</code> from its hard coded dependency on the <code><system_error></code> header.</li>
|
|
<li>Renamed <code>result</code> and <code>outcome</code> to <code>basic_result</code> and <code>basic_outcome</code>.</li>
|
|
<li>Renamed <code>result.hpp</code> into <code>basic_result.hpp</code>.</li>
|
|
<li>Moved <code><system_error></code> and <code><exception></code> dependent code into new
|
|
<code>std_result.hpp</code> and <code>std_outcome.hpp</code> header files.</li>
|
|
<li>Added <code>boost_result.hpp</code> and <code>boost_outcome.hpp</code> which use Boost.System
|
|
and Boost.Exception (these are <code>result.hpp</code> and <code>outcome.hpp</code> in the Boost edition).</li>
|
|
</ul></li>
|
|
</ul>
|
|
|
|
<hr />
|
|
|
|
<h2 id="v2-0-18th-jan-2018-release-https-github-com-ned14-outcome-releases-tag-v2-0-boost-peer-review">v2.0 18th Jan 2018 <a href="https://github.com/ned14/outcome/releases/tag/v2.0-boost-peer-review">[release]</a></h2>
|
|
|
|
<ul>
|
|
<li>Boost peer review edition. This is what was reviewed.</li>
|
|
<li>Changelog from v1 can be found in the release notes for this release.</li>
|
|
</ul>
|
|
|
|
|
|
|
|
</div><p><small>Last revised: January 08, 2026 at 18:51:10 UTC</small></p>
|
|
<hr>
|
|
<div class="spirit-nav">
|
|
<a accesskey="p" href="./videos.html"><img src="./images/prev.png" alt="Prev"></a>
|
|
<a accesskey="u" href="./index.html"><img src="./images/up.png" alt="Up"></a>
|
|
<a accesskey="h" href="./index.html"><img src="./images/home.png" alt="Home"></a><a accesskey="n" href="./changelog/upgrade_v21_v22.html"><img src="./images/next.png" alt="Next"></a></div></body>
|
|
</html>
|