[PATCH] libstdc++: Fix std::format_kind primary template for Clang [PR120190]
Tomasz Kaminski
tkaminsk@redhat.com
Thu May 15 12:35:26 GMT 2025
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 <jwakely@redhat.com> wrote:
> On Thu, 15 May 2025 at 12:15, Daniel Krügler <daniel.kruegler@gmail.com>
> wrote:
> >
> > Am Do., 15. Mai 2025 um 13:00 Uhr schrieb Jonathan Wakely <
> jwakely@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! :-)
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://gcc.gnu.org/pipermail/libstdc++/attachments/20250515/741607e5/attachment.htm>
More information about the Libstdc++
mailing list