From 9a95027b70ab1349ab7338568e10fa3b292bedcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojt=C4=9Bch=20Michal?= Date: Fri, 21 Nov 2025 15:51:55 +0100 Subject: [PATCH 1/4] Add tests --- .../test.compile.pass.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/std/tests/P3107R5_enabled_specializations/test.compile.pass.cpp b/tests/std/tests/P3107R5_enabled_specializations/test.compile.pass.cpp index 53c28d0c0e2..0362385173f 100644 --- a/tests/std/tests/P3107R5_enabled_specializations/test.compile.pass.cpp +++ b/tests/std/tests/P3107R5_enabled_specializations/test.compile.pass.cpp @@ -122,11 +122,23 @@ static_assert(enable_nonlocking_formatter_optimization); static_assert(enable_nonlocking_formatter_optimization); static_assert(enable_nonlocking_formatter_optimization); static_assert(enable_nonlocking_formatter_optimization>); +static_assert(enable_nonlocking_formatter_optimization>); +static_assert(enable_nonlocking_formatter_optimization>); static_assert(!enable_nonlocking_formatter_optimization>); +static_assert(!enable_nonlocking_formatter_optimization>); +static_assert(!enable_nonlocking_formatter_optimization>); static_assert(!enable_nonlocking_formatter_optimization>); +static_assert(!enable_nonlocking_formatter_optimization>); +static_assert(!enable_nonlocking_formatter_optimization>); static_assert(enable_nonlocking_formatter_optimization>); +static_assert(enable_nonlocking_formatter_optimization>); +static_assert(enable_nonlocking_formatter_optimization>); static_assert(!enable_nonlocking_formatter_optimization>); +static_assert(!enable_nonlocking_formatter_optimization>); +static_assert(!enable_nonlocking_formatter_optimization>); static_assert(!enable_nonlocking_formatter_optimization>); +static_assert(!enable_nonlocking_formatter_optimization>); +static_assert(!enable_nonlocking_formatter_optimization>); // Validate that various ranges are unoptimized static_assert(!enable_nonlocking_formatter_optimization>); From c288f741df2bc107dc4caca1938918f69e180769 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojt=C4=9Bch=20Michal?= Date: Fri, 21 Nov 2025 15:53:04 +0100 Subject: [PATCH 2/4] Apply remove_cv_ref_t in specialization of enable_nonlocking_formatter_optimization for pair and tuple --- stl/inc/__msvc_formatter.hpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/stl/inc/__msvc_formatter.hpp b/stl/inc/__msvc_formatter.hpp index d1355eb20fc..8fa4c3017e4 100644 --- a/stl/inc/__msvc_formatter.hpp +++ b/stl/inc/__msvc_formatter.hpp @@ -401,11 +401,12 @@ constexpr bool enable_nonlocking_formatter_optimization constexpr bool enable_nonlocking_formatter_optimization> = - enable_nonlocking_formatter_optimization<_Ty1> && enable_nonlocking_formatter_optimization<_Ty2>; + enable_nonlocking_formatter_optimization> + && enable_nonlocking_formatter_optimization>; template constexpr bool enable_nonlocking_formatter_optimization> = - (enable_nonlocking_formatter_optimization<_Ts> && ...); + (enable_nonlocking_formatter_optimization> && ...); template struct _Fill_align_and_width_specs { From 68b801e675183c0fe2b03d8cfaebac8613b7ea2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojt=C4=9Bch=20Michal?= Date: Fri, 21 Nov 2025 15:57:26 +0100 Subject: [PATCH 3/4] Mention LWG-4399 in the test suite --- .../tests/P3107R5_enabled_specializations/test.compile.pass.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/std/tests/P3107R5_enabled_specializations/test.compile.pass.cpp b/tests/std/tests/P3107R5_enabled_specializations/test.compile.pass.cpp index 0362385173f..aeec890bbda 100644 --- a/tests/std/tests/P3107R5_enabled_specializations/test.compile.pass.cpp +++ b/tests/std/tests/P3107R5_enabled_specializations/test.compile.pass.cpp @@ -14,6 +14,8 @@ #include #include +// Extended to test LWG-4399 "enable_nonlocking_formatter_optimization for pair and tuple needs remove_cvref_t" + using namespace std; struct unoptimized {}; From e3a089138a8f3b832b9cb21490d8bb9accd56f06 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sun, 23 Nov 2025 14:18:39 -0800 Subject: [PATCH 4/4] Extract helpers to also test `const T` and `const T&`. --- .../test.compile.pass.cpp | 43 ++++++++++--------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/tests/std/tests/P3107R5_enabled_specializations/test.compile.pass.cpp b/tests/std/tests/P3107R5_enabled_specializations/test.compile.pass.cpp index aeec890bbda..2eed1af8c39 100644 --- a/tests/std/tests/P3107R5_enabled_specializations/test.compile.pass.cpp +++ b/tests/std/tests/P3107R5_enabled_specializations/test.compile.pass.cpp @@ -14,8 +14,6 @@ #include #include -// Extended to test LWG-4399 "enable_nonlocking_formatter_optimization for pair and tuple needs remove_cvref_t" - using namespace std; struct unoptimized {}; @@ -123,24 +121,29 @@ static_assert(enable_nonlocking_formatter_optimization); static_assert(enable_nonlocking_formatter_optimization); static_assert(enable_nonlocking_formatter_optimization); static_assert(enable_nonlocking_formatter_optimization); -static_assert(enable_nonlocking_formatter_optimization>); -static_assert(enable_nonlocking_formatter_optimization>); -static_assert(enable_nonlocking_formatter_optimization>); -static_assert(!enable_nonlocking_formatter_optimization>); -static_assert(!enable_nonlocking_formatter_optimization>); -static_assert(!enable_nonlocking_formatter_optimization>); -static_assert(!enable_nonlocking_formatter_optimization>); -static_assert(!enable_nonlocking_formatter_optimization>); -static_assert(!enable_nonlocking_formatter_optimization>); -static_assert(enable_nonlocking_formatter_optimization>); -static_assert(enable_nonlocking_formatter_optimization>); -static_assert(enable_nonlocking_formatter_optimization>); -static_assert(!enable_nonlocking_formatter_optimization>); -static_assert(!enable_nonlocking_formatter_optimization>); -static_assert(!enable_nonlocking_formatter_optimization>); -static_assert(!enable_nonlocking_formatter_optimization>); -static_assert(!enable_nonlocking_formatter_optimization>); -static_assert(!enable_nonlocking_formatter_optimization>); + +// Extended to test LWG-4399 "enable_nonlocking_formatter_optimization for pair and tuple needs remove_cvref_t" +template