From ece69f4aa33c8de3b6e2b6444dc19aee54f5c662 Mon Sep 17 00:00:00 2001 From: Cem Dervis Date: Thu, 26 Feb 2026 22:26:00 +0100 Subject: [PATCH 01/32] Add Xcode 26.3 Signed-off-by: Cem Dervis --- toolchain_xcode.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/toolchain_xcode.yaml b/toolchain_xcode.yaml index 02eebfe..1a0131f 100644 --- a/toolchain_xcode.yaml +++ b/toolchain_xcode.yaml @@ -492,3 +492,10 @@ infos: apple_clang: 17.0.0 (clang-1700.6.3.2) refs: - https://developer.apple.com/documentation/xcode-release-notes/xcode-26_2-release-notes + + - name: Xcode 26.3 + released: February 26, 2026 + requires: macOS 15.6 (Sequoia) + apple_clang: 17.0.0 (clang-1700.6.4.2) + refs: + - https://developer.apple.com/documentation/xcode-release-notes/xcode-26_3-release-notes From d5a81abbeb447cf7d753fabb0edd7c9de1db276d Mon Sep 17 00:00:00 2001 From: Cem Dervis Date: Wed, 4 Mar 2026 13:39:38 +0100 Subject: [PATCH 02/32] Add Clang 19 support for N2653 Fixes #92 Signed-off-by: Cem Dervis --- features_c23.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/features_c23.yaml b/features_c23.yaml index 21280df..240aa98 100644 --- a/features_c23.yaml +++ b/features_c23.yaml @@ -140,10 +140,11 @@ features: - Clang 13 - MSVC 14.40 - Xcode 13.3 - - desc: "Type change of [u8 string literals](https://en.cppreference.com/w/c/language/string_literal.html)" + - desc: "Type change of [u8 string literals](https://en.cppreference.com/w/c/language/string_literal.html) to `char8_t[]`" paper: N2653 support: - GCC 13 + - Clang 19 - desc: "`[[maybe_unused]]` for labels" paper: N2662 support: From 85f9020bde80cfd7c1ee3a98fc59504aaaf0bcce Mon Sep 17 00:00:00 2001 From: Eisenwave Date: Sun, 8 Mar 2026 15:13:09 +0100 Subject: [PATCH 03/32] Add and correct information on P1383 --- content/more-constexpr-cmath.md | 27 +++++++++++++++++++++++++++ features_cpp26.yaml | 4 +++- 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 content/more-constexpr-cmath.md diff --git a/content/more-constexpr-cmath.md b/content/more-constexpr-cmath.md new file mode 100644 index 0000000..e976f3d --- /dev/null +++ b/content/more-constexpr-cmath.md @@ -0,0 +1,27 @@ +--- +execute: false +--- + +## What It Does + +Most functions in the `` and `` headers are made `constexpr`. + +## Why It Matters + +Historically, while arithmetic expressions such as addition and multiplication +between floating-point operands could be used in constant expressions, +common mathematical functions such as `std::sqrt` or `std::pow` couldn't be. +This meant that some computations had to be done unnecessarily at runtime, +or the user had to re-implement a `constexpr` version +of the ``functions themselves. +The same applies to the corresponding functions in ``. + +## Example + +```cpp +#include +#include + +constexpr double sqrt_10 = std::sqrt(10); +constexpr std::complex i = std::sqrt(std::complex(-1)); +``` diff --git a/features_cpp26.yaml b/features_cpp26.yaml index 78a0e10..949f0cb 100644 --- a/features_cpp26.yaml +++ b/features_cpp26.yaml @@ -309,8 +309,10 @@ features: - desc: "More constexpr for `` and ``" paper: P1383 + summary: "More mathematical functions are now `constexpr`, such as `std::sqrt`." + content: more-constexpr-cmath.md lib: true - support: [GCC 4.6] + support: [GCC 4.6 (partial)] ftm: - name: __cpp_lib_constexpr_cmath value: 202306L From b08b78ad819895a47206186f1f95e7dd51eeb0c2 Mon Sep 17 00:00:00 2001 From: Eisenwave Date: Sun, 8 Mar 2026 14:51:24 +0100 Subject: [PATCH 04/32] Add a feature-test macro for P3641 --- features_cpp26.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/features_cpp26.yaml b/features_cpp26.yaml index 949f0cb..a5504ae 100644 --- a/features_cpp26.yaml +++ b/features_cpp26.yaml @@ -1372,6 +1372,9 @@ features: - desc: "Rename `std::observable()` to `std::observable_checkpoint()`, and add a feature-test macro" paper: P3641 lib: true + ftm: + - name: __cpp_lib_observable_checkpoint + value: 202506L - desc: "`std::string::subview()`" paper: P3044 From df646d2927ab6925c1734cb9f26cf9ef74c12630 Mon Sep 17 00:00:00 2001 From: Eisenwave Date: Sun, 8 Mar 2026 14:36:03 +0100 Subject: [PATCH 05/32] Add explanation of P3176 --- content/oxford-variadic-comma.md | 28 ++++++++++++++++++++++++++++ features_cpp26.yaml | 2 ++ 2 files changed, 30 insertions(+) create mode 100644 content/oxford-variadic-comma.md diff --git a/content/oxford-variadic-comma.md b/content/oxford-variadic-comma.md new file mode 100644 index 0000000..f7671d3 --- /dev/null +++ b/content/oxford-variadic-comma.md @@ -0,0 +1,28 @@ +--- +execute: false +--- + +## What It Does + +This proposal makes use of a variadic ellipsis (`...`) deprecated, +if it is not separated by a comma from previous parameters. + +## Why It Matters + +Without a separating comma, +users can confuse whether `...` refers to a parameter pack +or to "C-style" variadic arguments. +The lack of a comma also prevents using syntax such as `int...` for new features, +without changing the meaning of existing code. + +## Example + +```cpp +void f(int...); // deprecated +void g(int, ...); // OK, also valid in C +void h(...); // OK, also valid in C + +void i(auto...); // OK, declares a function parameter pack +void j(auto......); // deprecated +void k(auto..., ...); // OK +``` diff --git a/features_cpp26.yaml b/features_cpp26.yaml index a5504ae..a358780 100644 --- a/features_cpp26.yaml +++ b/features_cpp26.yaml @@ -911,6 +911,8 @@ features: - desc: "The Oxford variadic comma" paper: P3176 support: [GCC 15, Clang 20] + summary: "Variadic ellipsis parameters (`...`) without a separating comma are deprecated, such as `int...`." + content: oxford-variadic-comma.md - desc: "Retiring niebloids" paper: P3136 From d361283b045d9c6336dca3f012e5998fc45dff64 Mon Sep 17 00:00:00 2001 From: Eisenwave Date: Sun, 8 Mar 2026 19:40:35 +0100 Subject: [PATCH 06/32] Add feature-test macro and summary for P3774 --- features_cpp26.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/features_cpp26.yaml b/features_cpp26.yaml index a358780..284bf24 100644 --- a/features_cpp26.yaml +++ b/features_cpp26.yaml @@ -1594,7 +1594,11 @@ features: - desc: "Rename `std::nontype`, and make it broadly useful" paper: P3774 + summary: "`std::nontype_t` and `std::nontype` are renamed to `std::constant_arg_t` and `std::constant_arg`, respectively." lib: true + ftm: + - name: __cpp_lib_function_ref + value: 202511L - desc: "Remove `evaluation_exception()` from contract-violation handling for C++26" paper: P3819 From 80dc3cea3153e32d1f259924232e1f0c2639991a Mon Sep 17 00:00:00 2001 From: Eisenwave Date: Sun, 8 Mar 2026 19:32:45 +0100 Subject: [PATCH 07/32] Add summary for P2870 --- features_cpp26.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/features_cpp26.yaml b/features_cpp26.yaml index 284bf24..eed02d3 100644 --- a/features_cpp26.yaml +++ b/features_cpp26.yaml @@ -512,6 +512,7 @@ features: - desc: "Remove `std::basic_string::reserve()` from C++26" paper: P2870 + summary: "The overload of `std::basic_string::reserve()` with no parameters is removed. It used to be a poor substitute for `std::basic_string::shrink_to_fit()`." lib: true support: [Clang 18, Xcode 16] From 7ba1ef588393bc0b805fdc7acaa9490f796c11e0 Mon Sep 17 00:00:00 2001 From: Eisenwave Date: Sun, 8 Mar 2026 19:26:52 +0100 Subject: [PATCH 08/32] Add explanation of P2748 --- content/disallow-return-temporary-glvalue.md | 33 ++++++++++++++++++++ features_cpp26.yaml | 1 + 2 files changed, 34 insertions(+) create mode 100644 content/disallow-return-temporary-glvalue.md diff --git a/content/disallow-return-temporary-glvalue.md b/content/disallow-return-temporary-glvalue.md new file mode 100644 index 0000000..502c43e --- /dev/null +++ b/content/disallow-return-temporary-glvalue.md @@ -0,0 +1,33 @@ +--- +execute: false +--- + +## What It Does + +`&&` and `const&` references can bind to temporary objects. +With this change, this is no longer permitted when binding the result of a function +to a temporary object. + +## Why It Matters + +Binding the result of a function to a temporary object creates a reference that immediately dangles. +Disallowing it prevents the user from running into undefined behavior by accident. + +## Example + +```cpp +int&& f1() { + return 42; // error +} +const double& f2() { + static int x = 42; + return x; // error +} + +auto&& id(auto&& r) { + return static_cast(r); +} +int&& f3() { + return id(42); // OK, but probably a bug +} +``` diff --git a/features_cpp26.yaml b/features_cpp26.yaml index eed02d3..d5d8087 100644 --- a/features_cpp26.yaml +++ b/features_cpp26.yaml @@ -579,6 +579,7 @@ features: - desc: "Disallow binding a returned [glvalue](https://en.cppreference.com/w/cpp/language/value_category.html#glvalue) to a temporary" paper: P2748 + content: disallow-return-temporary-glvalue.md support: - GCC 14 - Clang 19 From c5b8eb318f765794adb413930b64b9bf673d7103 Mon Sep 17 00:00:00 2001 From: Eisenwave Date: Sun, 8 Mar 2026 20:46:10 +0100 Subject: [PATCH 09/32] Add GCC 16 support for P3836 --- features_cpp26.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features_cpp26.yaml b/features_cpp26.yaml index d5d8087..287913f 100644 --- a/features_cpp26.yaml +++ b/features_cpp26.yaml @@ -1588,7 +1588,7 @@ features: - desc: "Make `std::optional` trivially copyable" paper: P3836 lib: true - support: [Clang 22] + support: [GCC 16, Clang 22] - desc: "When Do You Know `execution::connect()` Doesn’t Throw?" paper: P3388 From 4637da7c9ce6910f3645da4649dcbdd55c5c64f7 Mon Sep 17 00:00:00 2001 From: Eisenwave Date: Sun, 8 Mar 2026 21:21:18 +0100 Subject: [PATCH 10/32] Add GCC 16 support for P3663 --- features_cpp26.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/features_cpp26.yaml b/features_cpp26.yaml index 287913f..66316f6 100644 --- a/features_cpp26.yaml +++ b/features_cpp26.yaml @@ -1584,6 +1584,7 @@ features: - desc: "Future-proof `submdspan_mapping`" paper: P3663 lib: true + support: [GCC 16] - desc: "Make `std::optional` trivially copyable" paper: P3836 From e45a4c2c3163f50073c0eb565b4b9b64e94a776b Mon Sep 17 00:00:00 2001 From: Eisenwave Date: Sun, 8 Mar 2026 21:24:23 +0100 Subject: [PATCH 11/32] Add GCC 16 support for P3913 --- features_cpp26.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/features_cpp26.yaml b/features_cpp26.yaml index 66316f6..27c051b 100644 --- a/features_cpp26.yaml +++ b/features_cpp26.yaml @@ -1650,3 +1650,4 @@ features: - desc: "Optimize for `std::optional` in range adaptors" paper: P3913 lib: true + support: [GCC 16] From 48819a8217b6227c5a499c2f75354621a9f384c1 Mon Sep 17 00:00:00 2001 From: Eisenwave Date: Mon, 9 Mar 2026 06:56:51 +0100 Subject: [PATCH 12/32] Add GCC 16 support for P3641 --- features_cpp26.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/features_cpp26.yaml b/features_cpp26.yaml index 27c051b..1547b94 100644 --- a/features_cpp26.yaml +++ b/features_cpp26.yaml @@ -1379,6 +1379,7 @@ features: ftm: - name: __cpp_lib_observable_checkpoint value: 202506L + support: [GCC 16] - desc: "`std::string::subview()`" paper: P3044 From ca4ea565680215f6fb449a86273b793b9b2105b4 Mon Sep 17 00:00:00 2001 From: Eisenwave Date: Sun, 8 Mar 2026 20:33:04 +0100 Subject: [PATCH 13/32] Add summary and explanation of P3008 --- content/atomic-floating-min-max.md | 35 ++++++++++++++++++++++++++++++ features_cpp26.yaml | 2 ++ 2 files changed, 37 insertions(+) create mode 100644 content/atomic-floating-min-max.md diff --git a/content/atomic-floating-min-max.md b/content/atomic-floating-min-max.md new file mode 100644 index 0000000..6b300c9 --- /dev/null +++ b/content/atomic-floating-min-max.md @@ -0,0 +1,35 @@ +--- +execute: true +--- + +## What It Does + +The `fetch_max`, `fetch_min`, `fetch_fmaximum`, `fetch_fminimum`, `fetch_fmaximum_num`, and `fetch_fminimum_num` +member functions for `std::atomic` and `std::atomic_ref` make it possible to atomically +take the minimum or maximum of two floating-point numbers. +`std::fmaximum`, `std::fmaximum_num`, `std::fminimum`, and `std::fminimum_num` +are also added to ``, providing non-atomic counterparts. + +## Why It Matters + +By utilizing hardware support, +floating-point minimum and maximum can have much better performance than existing code +which uses `compare_exchange_weak` in a loop, +especially with high contention. +The new `` functions imported from C23 are also generally useful, +and implement operations from the ISO/IEC 60559 standard. + +## Example + +```cpp +#include +#include + +std::atomic x = 0.5; + +int main() { + std::println("{}", x.fetch_max(0)); // prints 0.5, no update + std::println("{}", x.fetch_max(1)); // prints 0.5, x = 1 + std::println("{}", x.load()); // prints 1 +} +``` diff --git a/features_cpp26.yaml b/features_cpp26.yaml index 1547b94..4df145d 100644 --- a/features_cpp26.yaml +++ b/features_cpp26.yaml @@ -1490,6 +1490,8 @@ features: - desc: "Atomic floating-point min/max" paper: P3008 + summary: "Adds atomic minimum/maximum operations between floating-point types, as well as non-atomic `` functions." + content: atomic-float-min-max.md lib: true ftm: - name: __cpp_lib_atomic_min_max From d1a2b0ad2d4a68294660bd71d4be40aa1b435191 Mon Sep 17 00:00:00 2001 From: Eisenwave Date: Sun, 8 Mar 2026 21:14:55 +0100 Subject: [PATCH 14/32] Add summary and explanation of P1789 --- .../expansion-statements-library-support.md | 40 +++++++++++++++++++ features_cpp26.yaml | 2 + 2 files changed, 42 insertions(+) create mode 100644 content/expansion-statements-library-support.md diff --git a/content/expansion-statements-library-support.md b/content/expansion-statements-library-support.md new file mode 100644 index 0000000..b9233b1 --- /dev/null +++ b/content/expansion-statements-library-support.md @@ -0,0 +1,40 @@ +--- +execute: true +--- + +## What It Does + +`std::integer_sequence` can now be used in `template for` +to conveniently write a loop where the loop index is a `constexpr` variable, +as well as to create a `constexpr` pack using structured bindings. +This is made possible by specializing `std::tuple_size`, `std::tuple_element`, and `std::get` +for `std::integer_sequence`. + +## Why It Matters + +These changes remove boilerplate code such as creating an immediately invoked lambda expression +when creating a `constexpr` pack of indices or writing a loop with a `constexpr` index. +This is especially important because C++26 supports pack indexing, +where a `constexpr` index is needed. + +## Example + +```cpp +#include +#include +#include + +int main() { + auto tup = std::tuple{1, 3.14, "hello"}; + + // Output: + // tup[0] = 1 + // tup[1] = 3.14 + // tup[2] = hello + template for (constexpr std::size_t I : std::make_index_sequence<3>()) { + std::println("tup[{}] = {}", I, std::get(tup)); + } + + constexpr auto [...Is] = std::make_index_sequence<3>(); +} +``` diff --git a/features_cpp26.yaml b/features_cpp26.yaml index 4df145d..3978242 100644 --- a/features_cpp26.yaml +++ b/features_cpp26.yaml @@ -1612,6 +1612,8 @@ features: - desc: "Library Support for Expansion Statements" paper: P1789 + summary: "Specializes `std::tuple_size`, `std::tuple_element`, and `std::get` for `std::integer_sequence` to make it usable in expansion statements and structured bindings." + content: expansion-statements-library-support.md lib: true support: [Clang 22] ftm: From a7da1ef666e9ac38f2df9b77c8b8b3c23328a772 Mon Sep 17 00:00:00 2001 From: Matthias Wippich Date: Mon, 9 Mar 2026 22:28:15 +0100 Subject: [PATCH 15/32] Improve P1789 description Signed-off-by: Matthias Wippich --- .../expansion-statements-library-support.md | 69 ++++++++++++++----- 1 file changed, 51 insertions(+), 18 deletions(-) diff --git a/content/expansion-statements-library-support.md b/content/expansion-statements-library-support.md index b9233b1..698d518 100644 --- a/content/expansion-statements-library-support.md +++ b/content/expansion-statements-library-support.md @@ -4,37 +4,70 @@ execute: true ## What It Does -`std::integer_sequence` can now be used in `template for` -to conveniently write a loop where the loop index is a `constexpr` variable, -as well as to create a `constexpr` pack using structured bindings. -This is made possible by specializing `std::tuple_size`, `std::tuple_element`, and `std::get` -for `std::integer_sequence`. +`std::integer_sequence` can now be used in `template for` to conveniently write a loop +where the loop index is a `constexpr` variable. Additionally it can be used to create a +`constexpr` pack in the current function scope through structured bindings. + +This is made possible by implementing the tuple protocol for `std::integer_sequence` ( +specializing `std::tuple_size` + `std::tuple_element` and providing overloads for `get`). ## Why It Matters -These changes remove boilerplate code such as creating an immediately invoked lambda expression -when creating a `constexpr` pack of indices or writing a loop with a `constexpr` index. -This is especially important because C++26 supports pack indexing, -where a `constexpr` index is needed. +These changes obsolete the common metaprogramming idiom of using an immediately invoked lambda +expression to introduce a pack of constant indices. This is especially interesting when operating +on multiple packs (or tuple-likes) of equal size at the same time. + +This change has intended symbiotic effects with +- P1306 expansion statements (`template for`) +- P2662 pack indexing (`Pack...[Idx]`) +- P1061 structured bindings can introduce a pack + P2686 constexpr structured bindings +- P3096 function parameter reflection (IILE trick cannot be used here) + ## Example ```cpp +#include #include #include -#include + + +// before C++26 +template +bool is_eq_iile(std::tuple lhs, std::tuple rhs) { + return [&](std::index_sequence) { + return ((get(lhs) == get(rhs)) && ...); + }(std::index_sequence_for()); +} + +// with structured bindings +template +bool is_eq_fold(std::tuple lhs, std::tuple rhs) { + static constexpr auto [...Idx] = std::index_sequence_for(); + return ((get(lhs) == get(rhs)) && ...); +} + +// with expansion statements +template +bool is_eq_template_for(std::tuple lhs, std::tuple rhs) { + template for (constexpr auto Idx : std::index_sequence_for()) { + if (get(lhs) != get(rhs)) { + return false; + } + } + return true; +} int main() { auto tup = std::tuple{1, 3.14, "hello"}; + auto tup2 = std::tuple{2, 3.14, "hell"}; - // Output: - // tup[0] = 1 - // tup[1] = 3.14 - // tup[2] = hello - template for (constexpr std::size_t I : std::make_index_sequence<3>()) { - std::println("tup[{}] = {}", I, std::get(tup)); - } + assert(not is_eq_iile(tup, tup2)); + assert(not is_eq_fold(tup, tup2)); + assert(not is_eq_template_for(tup, tup2)); - constexpr auto [...Is] = std::make_index_sequence<3>(); + assert(is_eq_iile(tup, tup)); + assert(is_eq_fold(tup, tup)); + assert(is_eq_template_for(tup, tup)); } ``` From a87de8df044afc21a4c07bd9101f97b1e9ad64fd Mon Sep 17 00:00:00 2001 From: Matthias Wippich Date: Tue, 10 Mar 2026 00:52:29 +0100 Subject: [PATCH 16/32] Update expansion-statements-library-support.md Signed-off-by: Matthias Wippich --- content/expansion-statements-library-support.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/expansion-statements-library-support.md b/content/expansion-statements-library-support.md index 698d518..7fbfb50 100644 --- a/content/expansion-statements-library-support.md +++ b/content/expansion-statements-library-support.md @@ -62,9 +62,9 @@ int main() { auto tup = std::tuple{1, 3.14, "hello"}; auto tup2 = std::tuple{2, 3.14, "hell"}; - assert(not is_eq_iile(tup, tup2)); - assert(not is_eq_fold(tup, tup2)); - assert(not is_eq_template_for(tup, tup2)); + assert(!is_eq_iile(tup, tup2)); + assert(!is_eq_fold(tup, tup2)); + assert(!is_eq_template_for(tup, tup2)); assert(is_eq_iile(tup, tup)); assert(is_eq_fold(tup, tup)); From 3e966ebc7801b87698e70e9d565892d3fe71981b Mon Sep 17 00:00:00 2001 From: Cem Dervis Date: Tue, 10 Mar 2026 08:56:03 +0100 Subject: [PATCH 17/32] Add hint to Clang 22 support for P1789 Fixes #109 Signed-off-by: Cem Dervis --- features_cpp26.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/features_cpp26.yaml b/features_cpp26.yaml index 3978242..94c26c8 100644 --- a/features_cpp26.yaml +++ b/features_cpp26.yaml @@ -1615,10 +1615,13 @@ features: summary: "Specializes `std::tuple_size`, `std::tuple_element`, and `std::get` for `std::integer_sequence` to make it usable in expansion statements and structured bindings." content: expansion-statements-library-support.md lib: true - support: [Clang 22] + support: [Clang 22 (hint)] ftm: - name: __cpp_lib_integer_sequence value: 202511L + hints: + - target: Clang 22 + msg: "Currently not usable due to pending core language changes. See [CWG3135](https://cplusplus.github.io/CWG/issues/3135.html) for details." keywords: ["reflection"] - desc: "Missing deduction guide from `simd::mask` to `simd::vec`" From 11d7c5326b6eca8cb205c4756925639e3d3d30ed Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 11 Mar 2026 13:25:40 +0000 Subject: [PATCH 18/32] Update features_cpp23.yaml for P2438 in GCC Implemented in https://github.com/gcc-mirror/gcc/commit/716ec14c573c7ec9e3732e66c7288db8f0348154 Signed-off-by: Jonathan Wakely --- features_cpp23.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/features_cpp23.yaml b/features_cpp23.yaml index b7a227f..ed6d723 100644 --- a/features_cpp23.yaml +++ b/features_cpp23.yaml @@ -1239,6 +1239,7 @@ features: paper: P2438 lib: true support: + - GCC 16 - Clang 16 - MSVC 14.34 - Xcode 15 From 8f3157552e846f0bb555dcb2679166143220c7c2 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 11 Mar 2026 14:00:13 +0000 Subject: [PATCH 19/32] Update features_cpp23.yaml for P2077 in GCC Implemented in https://github.com/gcc-mirror/gcc/commit/3f7905550483408a2c4c5096a1adc8d7e863eb12 Signed-off-by: Jonathan Wakely --- features_cpp23.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features_cpp23.yaml b/features_cpp23.yaml index ed6d723..9181cc7 100644 --- a/features_cpp23.yaml +++ b/features_cpp23.yaml @@ -597,7 +597,7 @@ features: - desc: "Heterogeneous erasure overloads for associative containers" paper: P2077 lib: true - support: [MSVC 14.32] + support: [GCC 16, MSVC 14.32] ftm: - name: __cpp_lib_associative_heterogeneous_erasure value: 202110L From 4bc1b72c2eb21c11f150f8ff714d7328ea9cbf2f Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 11 Mar 2026 15:14:20 +0000 Subject: [PATCH 20/32] Update features_cpp23.yaml for P1264 in GCC I confirm that libstdc++ already implements the expected behaviour. Signed-off-by: Jonathan Wakely --- features_cpp23.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features_cpp23.yaml b/features_cpp23.yaml index 9181cc7..d6a7dec 100644 --- a/features_cpp23.yaml +++ b/features_cpp23.yaml @@ -1010,7 +1010,7 @@ features: paper: P1264 lib: true support: - - GCC ? + - GCC - Clang 9 - MSVC - Xcode 12 From 98a74897aff3614513f1cf3cdd62588e4575a03e Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 11 Mar 2026 15:16:59 +0000 Subject: [PATCH 21/32] Update features_cpp26.yaml for P2363 in GCC Implemented by https://github.com/gcc-mirror/gcc/commit/94d5ca4583876ca0fd2978b24f1fbc93a53b8373 Signed-off-by: Jonathan Wakely --- features_cpp26.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/features_cpp26.yaml b/features_cpp26.yaml index 94c26c8..45b544e 100644 --- a/features_cpp26.yaml +++ b/features_cpp26.yaml @@ -214,6 +214,7 @@ features: - desc: "Extending associative containers with the remaining heterogeneous overloads" paper: P2363 lib: true + support: [GCC 16] ftm: - name: __cpp_lib_associative_heterogeneous_insertion value: 202306L From 1e909f9b864aeb27165d0a4b24dcc10a012c4314 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 11 Mar 2026 15:20:06 +0000 Subject: [PATCH 22/32] Update features_cpp26.yaml for P0493 in GCC Implemented in https://github.com/gcc-mirror/gcc/commit/68a1218c189cce1eea2f3b035848984aa2ee8a5b and https://github.com/gcc-mirror/gcc/commit/0772974fec9d1e35c412fc6fcbe9754c7cb57eb0 Signed-off-by: Jonathan Wakely --- features_cpp26.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/features_cpp26.yaml b/features_cpp26.yaml index 45b544e..f52c939 100644 --- a/features_cpp26.yaml +++ b/features_cpp26.yaml @@ -207,6 +207,7 @@ features: - desc: "Atomic minimum/maximum" paper: P0493 lib: true + support: [GCC 16] ftm: - name: __cpp_lib_atomic_min_max value: 202403L From f3c6e12fdb9ff9395304f6ee87c2f21d89b400ae Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 11 Mar 2026 15:26:15 +0000 Subject: [PATCH 23/32] Update features_cpp26.yaml for P2875 in GCC Implemented for 15.1.0 by https://github.com/gcc-mirror/gcc/commit/c3e237338eb7ffc90f3cc8d32a3971d17f6d0b31 and backported for GCC 14.3.0 and 13.4.0. Since all releases >= 14.3.0 have the change, I chose 14.3 for the value in the table. Signed-off-by: Jonathan Wakely --- features_cpp26.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features_cpp26.yaml b/features_cpp26.yaml index f52c939..19dd32d 100644 --- a/features_cpp26.yaml +++ b/features_cpp26.yaml @@ -645,7 +645,7 @@ features: - desc: "Undeprecate `std::polymorphic_allocator::destroy()` for C++26" paper: P2875 lib: true - support: [Clang 15, MSVC 14.41] + support: [GCC 14.3, Clang 15, MSVC 14.41] - desc: "Remove deprecated strstreams from C++26" paper: P2867 From 9bf5e7192b1c4c73f73f646eaebb7addf32caa11 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 11 Mar 2026 15:29:23 +0000 Subject: [PATCH 24/32] Update features_cpp26.yaml for P2845 in GCC Implemented by https://github.com/gcc-mirror/gcc/commit/642020ab7e5ba659a626a0808347e0488ae69394 Signed-off-by: Jonathan Wakely --- features_cpp26.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/features_cpp26.yaml b/features_cpp26.yaml index 19dd32d..a5556fb 100644 --- a/features_cpp26.yaml +++ b/features_cpp26.yaml @@ -688,6 +688,7 @@ features: - desc: "Formatting of `filesystem::path` (`std::formatter`)" paper: P2845 lib: true + support: [GCC 16] ftm: - name: __cpp_lib_format_path value: 202403L From dd0e66cdf00cd4ef30acbde70890d864c8449aa9 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 11 Mar 2026 15:32:53 +0000 Subject: [PATCH 25/32] Update features_cpp26.yaml for P3369 in GCC Implemented by https://github.com/gcc-mirror/gcc/commit/3052b336455e19a773b06e1eaa681917b3d93169 Signed-off-by: Jonathan Wakely --- features_cpp26.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/features_cpp26.yaml b/features_cpp26.yaml index a5556fb..ad69a06 100644 --- a/features_cpp26.yaml +++ b/features_cpp26.yaml @@ -977,6 +977,7 @@ features: - desc: "`constexpr` for `std::uninitialized_default_construct()`" paper: P3369 lib: true + support: [GCC 15] ftm: - name: __cpp_lib_raw_memory_algorithms value: 202411L From 85ed3f1450fef0e55e35733eb5443f2e7f0ea0b7 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 11 Mar 2026 15:35:59 +0000 Subject: [PATCH 26/32] Update features_cpp26.yaml for P3383 in GCC Implemented in https://github.com/gcc-mirror/gcc/commit/43f7452026fc05a16ce1941e14d164e7da5edb76 Signed-off-by: Jonathan Wakely --- features_cpp26.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/features_cpp26.yaml b/features_cpp26.yaml index ad69a06..b98a636 100644 --- a/features_cpp26.yaml +++ b/features_cpp26.yaml @@ -1418,6 +1418,7 @@ features: - desc: "`std::mdspan::at()`" paper: P3383 lib: true + support: [GCC 16] - desc: "Inspecting `std::exception_ptr`" paper: P2927 From d275a897622c59f4025eb5ab5685938ecbc4ca5d Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 11 Mar 2026 15:57:19 +0000 Subject: [PATCH 27/32] Update features_cpp26.yaml for P2400 in GCC Implemented by https://github.com/gcc-mirror/gcc/commit/fbde291af66e026e0fe7031aa6d5abd4a90dc82b Signed-off-by: Jonathan Wakely --- features_cpp26.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/features_cpp26.yaml b/features_cpp26.yaml index b98a636..e5ef600 100644 --- a/features_cpp26.yaml +++ b/features_cpp26.yaml @@ -1032,6 +1032,7 @@ features: - desc: "Contracts for C++ (``)" paper: P2900 summary: "Contracts let you specify preconditions, postconditions, and assertions that document and enforce function requirements." + support: [GCC 16] ftm: - name: __cpp_contracts value: 202502L From ecfd804347fa7e21544410f3a33501afbfc2325a Mon Sep 17 00:00:00 2001 From: Cem Dervis Date: Wed, 11 Mar 2026 16:58:28 +0100 Subject: [PATCH 28/32] Fix FTM for (P1885, P2862) --- features_cpp26.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features_cpp26.yaml b/features_cpp26.yaml index e5ef600..6906b35 100644 --- a/features_cpp26.yaml +++ b/features_cpp26.yaml @@ -245,7 +245,7 @@ features: lib: true support: [GCC 14] ftm: - - name: _cpp_lib_text_encoding + - name: __cpp_lib_text_encoding value: 202306L - desc: "`std::function_ref`: type-erased callable reference" From 557579f20f19f5757239d238397fe9b9751dacba Mon Sep 17 00:00:00 2001 From: Cem Dervis Date: Wed, 11 Mar 2026 19:14:45 +0100 Subject: [PATCH 29/32] Update README.md Signed-off-by: Cem Dervis --- README.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 941c67e..17bf600 100644 --- a/README.md +++ b/README.md @@ -18,14 +18,19 @@ cppstat is a site that lists C and C++ features and their respective support by ## Contributing -cppstat is generated from YAML data files in the root directory. +cppstat fetches data from YAML files in the root directory. The files are maintained as a best-effort and contributions are always welcome. -You can edit these files directly via GitHub's web interface and commit your changes for approval. +You can contribute in multiple ways. -Alternatively, you can [submit a ticket](https://github.com/cdervis/cppstat/issues) for any incorrect or missing information, or feature ideas. +**The recommended approach is cppstat's [UI-based editor](https://cppstat.dev/editor/).** -If you are a toolchain developer, feel free to request full editorial access. +The editor provides search and a clear view of the data, and will create a patch, commit, and PR automatically for you. + +Alternatively, you can use GitHub's web interface and commit your changes for approval. +Another approachc is to [submit a ticket](https://github.com/cdervis/cppstat/issues) for any incorrect or missing information, or feature ideas. + +**If you are a toolchain developer, feel free to request full editorial access.** --- From 6f1b6ae8d5f5cef28d94c52b24062dab653e081d Mon Sep 17 00:00:00 2001 From: Cem Dervis Date: Wed, 11 Mar 2026 19:19:25 +0100 Subject: [PATCH 30/32] Update README.md Signed-off-by: Cem Dervis --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 17bf600..e19bdc5 100644 --- a/README.md +++ b/README.md @@ -19,16 +19,14 @@ cppstat is a site that lists C and C++ features and their respective support by ## Contributing cppstat fetches data from YAML files in the root directory. -The files are maintained as a best-effort and contributions are always welcome. - -You can contribute in multiple ways. +The files are maintained as a best-effort and contributions are always welcome. You can contribute in multiple ways. **The recommended approach is cppstat's [UI-based editor](https://cppstat.dev/editor/).** The editor provides search and a clear view of the data, and will create a patch, commit, and PR automatically for you. Alternatively, you can use GitHub's web interface and commit your changes for approval. -Another approachc is to [submit a ticket](https://github.com/cdervis/cppstat/issues) for any incorrect or missing information, or feature ideas. +Another approach is to [submit a ticket](https://github.com/cdervis/cppstat/issues) for any incorrect or missing information, or feature ideas. **If you are a toolchain developer, feel free to request full editorial access.** From 61f01b385a8cbe4fbfba301203284e155901bee3 Mon Sep 17 00:00:00 2001 From: Cem Dervis Date: Wed, 11 Mar 2026 19:20:25 +0100 Subject: [PATCH 31/32] Update README.md Signed-off-by: Cem Dervis --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e19bdc5..2a042f8 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ The files are maintained as a best-effort and contributions are always welcome. **The recommended approach is cppstat's [UI-based editor](https://cppstat.dev/editor/).** -The editor provides search and a clear view of the data, and will create a patch, commit, and PR automatically for you. +The editor provides search and a clear view of the data, Markdown preview and input validation. It can create a patch, commit, and PR automatically for you with a single click. Alternatively, you can use GitHub's web interface and commit your changes for approval. Another approach is to [submit a ticket](https://github.com/cdervis/cppstat/issues) for any incorrect or missing information, or feature ideas. From afc378b559492d4fe6295eaa66f7110f4300f1e1 Mon Sep 17 00:00:00 2001 From: Cem Dervis Date: Mon, 16 Mar 2026 15:42:12 +0100 Subject: [PATCH 32/32] Update P0067 support for Clang --- features_cpp17.yaml | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/features_cpp17.yaml b/features_cpp17.yaml index 83b603a..5bc2b02 100644 --- a/features_cpp17.yaml +++ b/features_cpp17.yaml @@ -902,33 +902,22 @@ features: - desc: "Elementary string conversions (`std::to_chars()` and `std::from_chars()`)" paper: P0067 lib: true - support: - - GCC 8 (partial) - - GCC 11 - - Clang 7 (partial) - - Clang 14 (partial) - - Clang 20 (partial) - - MSVC 14.14 (partial) - - MSVC 14.15 (partial) - - MSVC 14.16 (partial) - - MSVC 14.24 - - Xcode 10 (partial) - - Xcode 14.3 (partial) + support: [GCC 8 (partial), GCC 11, Clang 7 (partial), Clang 14 (partial), Clang 20 (partial), MSVC 14.14 (partial), MSVC 14.15 (partial), MSVC 14.16 (partial), MSVC 14.24, Xcode 10 (partial), Xcode 14.3 (partial)] hints: - target: GCC 8 msg: "No support for floating-point types, only integer types." - target: Clang 7 - msg: "Adds `std::to_chars()` support for `float` and `double`." + msg: "Adds `std::to_chars()` and `std::from_chars()` support for integer types." - target: Clang 14 - msg: "Adds `std::from_chars()` support for `float` and `double`." + msg: "Adds only `std::to_chars()` support for `float` and `double`." - target: Clang 20 - msg: "Support is complete except for `long double`." + msg: "Adds `std::from_chars()` support for `float` and `double`. Support is complete except for `long double`.\n\nIn total, the current status is:\n\n| Type | `to_chars` | `from_chars` |\n|------------------|------------|--------------|\n| integers | libc++ 7 | libc++ 7 |\n| `float`/`double` | libc++ 14 | libc++ 20 |\n| `long double` | - | - |\n\n---\n\n**Note**: Calling both functions with `long double` falls back to the `double` overload." - target: MSVC 14.14 msg: "No support for floating-point types, only integer types." - target: MSVC 14.15 msg: "Adds `std::from_chars()` support for `float` and `double`." - target: MSVC 14.16 - msg: 'Adds shortest round-trip decimal overloads of floating-point `std::to_chars()`, e.g. `"%.8e"` and `"%.16e"`.' + msg: "Adds shortest round-trip decimal overloads of floating-point `std::to_chars()`, e.g. `\"%.8e\"` and `\"%.16e\"`." - target: Xcode 10 msg: "No support for floating-point types, only integer types." - target: Xcode 14.3