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! :-)

Reply via email to