On Thu, 15 May 2025 at 12:15, Daniel Krügler <daniel.krueg...@gmail.com> wrote: > > Am Do., 15. Mai 2025 um 13:00 Uhr schrieb Jonathan Wakely > <jwak...@redhat.com>: >> >> Although Clang trunk has been adjusted to handle our std::format_kind >> definition (because they need to be able to compile the GCC 15.1.0 >> release), it's probably better to not rely on something that they might >> start diagnosing again in future. >> >> Define the primary template in terms of an immediately invoked function >> expression, so that we can put a static_assert(false) in the body. >> >> The diagnostic that users will see looks like this: >> >> include/c++/16.0.0/format:5470:21: error: static assertion failed >> 5470 | static_assert(false); // Cannot use primary template of >> std::format_kind >> | ^~~~~ >> >> libstdc++-v3/ChangeLog: >> >> PR libstdc++/120190 >> * include/std/format (format_kind): Adjust primary template to >> not depend on itself. >> * testsuite/std/format/ranges/format_kind_neg.cc: Adjust >> expected errors. Check more invalid specializations. >> --- >> >> Tested x86_64-linux. >> >> I haven't tested it fully with Clang, because the version of Clang in >> Fedora is older than the change which started rejecting the previous >> definition of std::format_kind, and the build in Compiler Explorer is >> newer than the revert of that change. >> >> libstdc++-v3/include/std/format | 19 ++++++++++++++----- >> .../std/format/ranges/format_kind_neg.cc | 15 ++++++++++----- >> 2 files changed, 24 insertions(+), 10 deletions(-) >> >> diff --git a/libstdc++-v3/include/std/format >> b/libstdc++-v3/include/std/format >> index bfda5895e0c0..887e891f2096 100644 >> --- a/libstdc++-v3/include/std/format >> +++ b/libstdc++-v3/include/std/format >> @@ -5464,13 +5464,22 @@ namespace __format >> debug_string >> }; >> >> - /// @cond undocumented >> + /** @brief A constant determining how a range should be formatted. >> + * >> + * The primary template of `std::format_kind` cannot be instantiated. >> + * There is a partial specialization for input ranges and you can >> + * specialize the variable template for your own cv-unqualified types >> + * that satisfy the `ranges::input_range` concept. >> + * >> + * @since C++23 >> + */ >> template<typename _Rg> >> - constexpr auto format_kind = >> - __primary_template_not_defined( >> - format_kind<_Rg> // you can specialize this for non-const input ranges >> - ); >> + constexpr auto format_kind = []{ >> + static_assert(false); // Cannot use primary template of >> 'std::format_kind' > > > Shouldn't the comment actually be used as static_assert message > > static_assert(false, "Cannot use primary template of 'std::format_kind'"); > > ?
Ha, yes, obviously that would be better! :-)