<feed xmlns='http://www.w3.org/2005/Atom'>
<title>catch3/tests/SelfTest/UsageTests/Compilation.tests.cpp, branch constexpr_approx</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>Fix &amp; extend tests for comparing const instances of zero lit types</title>
<updated>2024-04-08T11:15:35+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2024-04-08T11:15:31+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=05fb437cbbf60de794a7101c5e6ef8f650755ce4'/>
<id>05fb437cbbf60de794a7101c5e6ef8f650755ce4</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</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>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>
<entry>
<title>Move SFINAE in decomposer into return type</title>
<updated>2022-12-08T23:40:01+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2022-12-08T15:31:55+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=28e651f1521449f2fce8b202307b6312a0ebe429'/>
<id>28e651f1521449f2fce8b202307b6312a0ebe429</id>
<content type='text'>
This is needed so that we can use conjunction and other logical
type traits to workaround issue with older GCC versions (8 and
below), when they run into types that have ambiguous constructor
from `0`, see e.g. #2571.

However, using conjunction and friends in the SFINAE constraint
in the template parameter breaks for C++20 and up, due to the new
comparison operator rewriting rules. With C++20, when the compiler
see `a == b`, it also tries `b == a` and collects overload set
for both of these expressions.

In Catch2, this means that e.g. `REQUIRE( 1 == 2 )` would lead
the compiler to check overloads for both `ExprLhs&lt;int&gt; == int`
and `int == ExprLhs&lt;int&gt;`. Since the overload set and SFINAE
constraints assume that `ExprLhs&lt;T&gt;` is always on the left side,
when the compiler tries to resolve the template parameters, all
hell breaks loose and the compilation fails.

By moving the SFINAE constraints to the return type, the compiler
can discard the switched expression without having to resolve
the complex SFINAE constraints, and thus everything works the
way it is supposed to.

Fixes #2571
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This is needed so that we can use conjunction and other logical
type traits to workaround issue with older GCC versions (8 and
below), when they run into types that have ambiguous constructor
from `0`, see e.g. #2571.

However, using conjunction and friends in the SFINAE constraint
in the template parameter breaks for C++20 and up, due to the new
comparison operator rewriting rules. With C++20, when the compiler
see `a == b`, it also tries `b == a` and collects overload set
for both of these expressions.

In Catch2, this means that e.g. `REQUIRE( 1 == 2 )` would lead
the compiler to check overloads for both `ExprLhs&lt;int&gt; == int`
and `int == ExprLhs&lt;int&gt;`. Since the overload set and SFINAE
constraints assume that `ExprLhs&lt;T&gt;` is always on the left side,
when the compiler tries to resolve the template parameters, all
hell breaks loose and the compilation fails.

By moving the SFINAE constraints to the return type, the compiler
can discard the switched expression without having to resolve
the complex SFINAE constraints, and thus everything works the
way it is supposed to.

Fixes #2571
</pre>
</div>
</content>
</entry>
<entry>
<title>Revert "Fix old GCC + types with ambiguous constructor from 0"</title>
<updated>2022-11-22T14:23:03+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2022-11-22T14:23:03+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=a20200be7e29e4be4929167b3bc56bb03d30ca4a'/>
<id>a20200be7e29e4be4929167b3bc56bb03d30ca4a</id>
<content type='text'>
This reverts commit 291c502f6676b8d304b608f936ec26e3b347054a.

The issue is that it breaks under C++20 for some reason.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This reverts commit 291c502f6676b8d304b608f936ec26e3b347054a.

The issue is that it breaks under C++20 for some reason.
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix old GCC + types with ambiguous constructor from 0</title>
<updated>2022-11-20T16:07:32+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2022-11-20T10:06:45+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=291c502f6676b8d304b608f936ec26e3b347054a'/>
<id>291c502f6676b8d304b608f936ec26e3b347054a</id>
<content type='text'>
Closes #2571
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Closes #2571
</pre>
</div>
</content>
</entry>
<entry>
<title>Support decomposing types that only compare with literal 0</title>
<updated>2022-11-04T18:24:44+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2022-11-01T14:01:43+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=ec59cd8736b7ee8fcd69c76c71c2a0b72293b00c'/>
<id>ec59cd8736b7ee8fcd69c76c71c2a0b72293b00c</id>
<content type='text'>
This is primarily done to support new `std::*_ordering` types,
but the refactoring also supports any other type with this
property.

The compilation overhead is surprisingly low. Testing it with
clang on a Linux machine, compiling our SelfTest project takes
only 2-3% longer with these changes than it takes otherwise.

Closes #2555
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This is primarily done to support new `std::*_ordering` types,
but the refactoring also supports any other type with this
property.

The compilation overhead is surprisingly low. Testing it with
clang on a Linux machine, compiling our SelfTest project takes
only 2-3% longer with these changes than it takes otherwise.

Closes #2555
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix references to license file</title>
<updated>2022-10-28T09:30:15+00:00</updated>
<author>
<name>Lars Toenning</name>
</author>
<published>2022-10-28T09:22:53+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=f1084fb30990fe40c8f5b70034970c7eb4e1da72'/>
<id>f1084fb30990fe40c8f5b70034970c7eb4e1da72</id>
<content type='text'>
The license file was renamed with 6a502cc2f5fedd59b3495b58708f0d6d987ed9e1
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The license file was renamed with 6a502cc2f5fedd59b3495b58708f0d6d987ed9e1
</pre>
</div>
</content>
</entry>
<entry>
<title>Add -Wmissing-prototypes to common warnings</title>
<updated>2022-05-03T11:54:05+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2022-05-02T10:57:46+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=e2d07d35f4e31fa07fda89aadfb547e20b6b63b3'/>
<id>e2d07d35f4e31fa07fda89aadfb547e20b6b63b3</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Use the new licence header in SelfTest's cpp files</title>
<updated>2022-01-28T23:03:43+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2022-01-28T23:03:43+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=f83332d89b4cad0e6e1583caf6cd3d6b34c41136'/>
<id>f83332d89b4cad0e6e1583caf6cd3d6b34c41136</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
</feed>
