<feed xmlns='http://www.w3.org/2005/Atom'>
<title>catch3/src/catch2/internal/catch_decomposer.hpp, branch feature/native-property-engine</title>
<subtitle>Progmasoft Catch3: an independently maintained C++17 test framework with a parallel runner, property checks, snapshots and structured results.</subtitle>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/'/>
<entry>
<title>Backport Catch2 3.16.1</title>
<updated>2026-10-10T23:56:25+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-10-10T23:56:25+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=1f78d8903c2fb18afea8c3055f8df83d8c60d9b5'/>
<id>1f78d8903c2fb18afea8c3055f8df83d8c60d9b5</id>
<content type='text'>
Review Catch2 devel through 08092139210881f01a34e60c5f2fd6afa0ea4024,
the commit of 3.16.1, and apply the eleven changes since the last
reviewed revision in upstream order:

  d7683484  better message when a reporter cannot be initialized
  ea5020f0  custom argument validation in every first-party reporter
  aa01559e  throwing-reporter test also throws in assertionEnded
  45cd3987  noexcept on handleUnexpectedInflightException
  6adbd539  MSVC optimizations enabled again after the benchmark headers
  e87f2882  no quadratic scaling for NTTP test registration
  73d546cd  REQUIRE expands its arguments fewer times under GCC and Clang
  b710039a  decomposer operators as plain functions
  f899467b  type-erased streaming of reconstructed expressions
  8f0e70ca  retired macos-14 runner dropped
  08092139  version 3.16.1 and its release notes

All of them applied to the sources without a conflict. The amalgamated
distribution under extras/ conflicted because it is generated; it is
generated again from the sources of this repository, which also brings
it up to date with fork changes it had not picked up: the list-based
stream pool, the Clang diagnostic boundary and the cassert include.

No file under src/Progmasoft changes. The fork-owned texts that name
the engine version say 3.16.1, and docs/upstream-status.md records the
review. Upstream files keep their names, licenses and compiler options.

Built with Clang 22 on Windows and tested: 148 of 149 tests pass. The
one that fails, Reporters::CrashInJunitReporter, fails the same way on
devel without this change with that compiler.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Review Catch2 devel through 08092139210881f01a34e60c5f2fd6afa0ea4024,
the commit of 3.16.1, and apply the eleven changes since the last
reviewed revision in upstream order:

  d7683484  better message when a reporter cannot be initialized
  ea5020f0  custom argument validation in every first-party reporter
  aa01559e  throwing-reporter test also throws in assertionEnded
  45cd3987  noexcept on handleUnexpectedInflightException
  6adbd539  MSVC optimizations enabled again after the benchmark headers
  e87f2882  no quadratic scaling for NTTP test registration
  73d546cd  REQUIRE expands its arguments fewer times under GCC and Clang
  b710039a  decomposer operators as plain functions
  f899467b  type-erased streaming of reconstructed expressions
  8f0e70ca  retired macos-14 runner dropped
  08092139  version 3.16.1 and its release notes

All of them applied to the sources without a conflict. The amalgamated
distribution under extras/ conflicted because it is generated; it is
generated again from the sources of this repository, which also brings
it up to date with fork changes it had not picked up: the list-based
stream pool, the Clang diagnostic boundary and the cassert include.

No file under src/Progmasoft changes. The fork-owned texts that name
the engine version say 3.16.1, and docs/upstream-status.md records the
review. Upstream files keep their names, licenses and compiler options.

Built with Clang 22 on Windows and tested: 148 of 149 tests pass. The
one that fails, Reporters::CrashInJunitReporter, fails the same way on
devel without this change with that compiler.
</pre>
</div>
</content>
</entry>
<entry>
<title>Mark some extra classes final</title>
<updated>2026-04-06T22:13:17+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2026-04-06T22:13:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=548e14a8c8147c5d20898d9d97809887ab89ad60'/>
<id>548e14a8c8147c5d20898d9d97809887ab89ad60</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Add enum types to what is captured by value by default</title>
<updated>2025-07-30T18:20:38+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2025-07-29T21:51:13+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=ccabd4de891e749f472121497941bb9437b83c2e'/>
<id>ccabd4de891e749f472121497941bb9437b83c2e</id>
<content type='text'>
As it turns out, enums can be used to declare bitfields, and we
cannot form a reference to a bitfield in the cpature. Thus, we add
`std::is_enum` as a criteria to the default for `capture_by_value`,
so that enum-based bitfields are also captured by value and thus
decomposable.

Closes #3001
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
As it turns out, enums can be used to declare bitfields, and we
cannot form a reference to a bitfield in the cpature. Thus, we add
`std::is_enum` as a criteria to the default for `capture_by_value`,
so that enum-based bitfields are also captured by value and thus
decomposable.

Closes #3001
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix typos</title>
<updated>2025-04-27T04:46:42+00:00</updated>
<author>
<name>Chris Thrasher</name>
</author>
<published>2025-04-27T00:46:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=4c93a595a1d9ecc8aacb7c99f6dbf0f1f2d475fa'/>
<id>4c93a595a1d9ecc8aacb7c99f6dbf0f1f2d475fa</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Sprinkle some constexpr around to make Jason happy</title>
<updated>2024-09-13T14:40:11+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2024-09-13T09:16:20+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=18df97df00848e91bfe1b63408bba19f8b8237ae'/>
<id>18df97df00848e91bfe1b63408bba19f8b8237ae</id>
<content type='text'>
Most of these will not matter in practice due to C++14 imposing
significant limitations on what else we can make constexpr, and we cannot
have references outliving the constexpr context either way.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Most of these will not matter in practice due to C++14 imposing
significant limitations on what else we can make constexpr, and we cannot
have references outliving the constexpr context either way.
</pre>
</div>
</content>
</entry>
<entry>
<title>Explicitly silence Wnon-virtual-dtor in Decomposer and MatchExpr</title>
<updated>2024-04-30T21:51:36+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2024-04-30T19:08:35+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=fa5a53df17303339eff8fda5cae0b601af207085'/>
<id>fa5a53df17303339eff8fda5cae0b601af207085</id>
<content type='text'>
Closes #2854
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Closes #2854
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix assertion for const instance of std::ordering</title>
<updated>2024-04-08T09:33:43+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2024-04-08T09:02:22+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=71b11c4e3328090d2ec72268299e3fb9e0ac3f8e'/>
<id>71b11c4e3328090d2ec72268299e3fb9e0ac3f8e</id>
<content type='text'>
The issue was that `capture_by_value` was meant to be specialized
by plain type, e.g. `capture_by_value&lt;std::weak_ordering&gt;`, but
the TMP in Decomposer did not properly throw away `const` (and
`volatile`) qualifiers, before taking the value of `capture_by_value`.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The issue was that `capture_by_value` was meant to be specialized
by plain type, e.g. `capture_by_value&lt;std::weak_ordering&gt;`, but
the TMP in Decomposer did not properly throw away `const` (and
`volatile`) qualifiers, before taking the value of `capture_by_value`.
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix build with gcc 5.4</title>
<updated>2024-03-12T16:15:03+00:00</updated>
<author>
<name>Cristian Morales Vega</name>
</author>
<published>2024-03-11T11:33:29+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=459ac8562b4f4b23280003beabeca910e823627a'/>
<id>459ac8562b4f4b23280003beabeca910e823627a</id>
<content type='text'>
The Core Guidelines state "A base class destructor should be either
public and virtual, or protected and non-virtual" so, hopefully, no
static analyser will complain.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The Core Guidelines state "A base class destructor should be either
public and virtual, or protected and non-virtual" so, hopefully, no
static analyser will complain.
</pre>
</div>
</content>
</entry>
<entry>
<title>Add documentation for the current state of decomposer</title>
<updated>2024-02-12T12:43:21+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2024-02-12T12:43:21+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=0787132fc82a75e3fb255aa9484ca1dc1eff2a30'/>
<id>0787132fc82a75e3fb255aa9484ca1dc1eff2a30</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Support literal-zero detectors using consteval int constructors</title>
<updated>2024-02-11T23:52:53+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2024-02-08T21:21:18+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=dc51386b9fd61f99ea9c660d01867e6ad489b403'/>
<id>dc51386b9fd61f99ea9c660d01867e6ad489b403</id>
<content type='text'>
This was originally motivated by `REQUIRE((a &lt;=&gt; b) == 0)` no
longer compiling using MSVC. After some investigation, I found
that they changed their implementation of the zero literal
detector from the previous pointer-constructor with deleted
other constructors, into one that uses `consteval` constructor
from int.

This breaks the previous detection logic, because now
`is_foo_comparable&lt;std::strong_ordering, int&gt;` is true, but
actually trying to compare them is a compile-time error...
The solution was to make the decomposition `constexpr` and rely
on a late C++20 DR that makes it so that `consteval` propagates
up through the callstack of `constexpr` functions, until it either
runs out of `constexpr` functions, or succeeds.

However, the default handling of types in decomposition is to
take a reference to them. This reference never becomes dangling,
but because the constexpr evaluation engine cannot prove this,
decomposition paths taking references to objects cannot be
actually evaluated at compilation time. Thankfully we already
did have a value-oriented decomposition path for arithmetic types
(as these are common linkage-less types), so we could just
explicitly spell out the `std::foo_ordering` types as also being
supposed to be decomposed by-value.

Two more fun facts about these changes
 1) The original motivation of the MSVC change was to avoid
    trigering a `Wzero-as-null-pointer-constant` warning. I still
    do not believe this was a good decision.
 2) Current latest version of MSVC does not actually implement the
    aforementioned C++20 DR, so even with this commit, MSVC cannot
    compile `REQUIRE((a &lt;=&gt; b) == 0)`.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This was originally motivated by `REQUIRE((a &lt;=&gt; b) == 0)` no
longer compiling using MSVC. After some investigation, I found
that they changed their implementation of the zero literal
detector from the previous pointer-constructor with deleted
other constructors, into one that uses `consteval` constructor
from int.

This breaks the previous detection logic, because now
`is_foo_comparable&lt;std::strong_ordering, int&gt;` is true, but
actually trying to compare them is a compile-time error...
The solution was to make the decomposition `constexpr` and rely
on a late C++20 DR that makes it so that `consteval` propagates
up through the callstack of `constexpr` functions, until it either
runs out of `constexpr` functions, or succeeds.

However, the default handling of types in decomposition is to
take a reference to them. This reference never becomes dangling,
but because the constexpr evaluation engine cannot prove this,
decomposition paths taking references to objects cannot be
actually evaluated at compilation time. Thankfully we already
did have a value-oriented decomposition path for arithmetic types
(as these are common linkage-less types), so we could just
explicitly spell out the `std::foo_ordering` types as also being
supposed to be decomposed by-value.

Two more fun facts about these changes
 1) The original motivation of the MSVC change was to avoid
    trigering a `Wzero-as-null-pointer-constant` warning. I still
    do not believe this was a good decision.
 2) Current latest version of MSVC does not actually implement the
    aforementioned C++20 DR, so even with this commit, MSVC cannot
    compile `REQUIRE((a &lt;=&gt; b) == 0)`.
</pre>
</div>
</content>
</entry>
</feed>
