Please also add the message to dg-error check in format_kind_neg.cc. With that LGTM.
On Thu, May 15, 2025 at 2:19 PM Jonathan Wakely <jwak...@redhat.com> wrote: > 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! :-) > >