On 15/05/25 14:35 +0200, Tomasz Kaminski wrote:
Please also add the message to dg-error check in format_kind_neg.cc.
With that LGTM.

Yes, already done locally. Here's what I'm testing now.


commit 3c154b2d95d30580c18aa0fedd9e67200867653f
Author:     Jonathan Wakely <jwak...@redhat.com>
AuthorDate: Thu May 15 11:01:05 2025
Commit:     Jonathan Wakely <r...@gcc.gnu.org>
CommitDate: Thu May 15 13:21:32 2025

    libstdc++: Fix std::format_kind primary template for Clang [PR120190]
    
    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.
    
    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.

diff --git a/libstdc++-v3/include/std/format b/libstdc++-v3/include/std/format
index bfda5895e0c0..b1823db83bc9 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'");
+      return type_identity<_Rg>{};
+    }();
 
+  /// @cond undocumented
   template<typename _Tp>
     consteval range_format
     __fmt_kind()
diff --git a/libstdc++-v3/testsuite/std/format/ranges/format_kind_neg.cc b/libstdc++-v3/testsuite/std/format/ranges/format_kind_neg.cc
index bf8619d3d276..bd22541b36b8 100644
--- a/libstdc++-v3/testsuite/std/format/ranges/format_kind_neg.cc
+++ b/libstdc++-v3/testsuite/std/format/ranges/format_kind_neg.cc
@@ -5,9 +5,14 @@
 
 #include <format>
 
-template<auto> struct Tester { };
+void test()
+{
+  (void) std::format_kind<void>; // { dg-error "here" }
+  (void) std::format_kind<const void>; // { dg-error "here" }
+  (void) std::format_kind<int>; // { dg-error "here" }
+  (void) std::format_kind<int&>; // { dg-error "here" }
+  (void) std::format_kind<const int(&)[10]>; // { dg-error "here" }
+  (void) std::format_kind<void()>; // { dg-error "here" }
+}
 
-Tester<std::format_kind<const int(&)[1]>> t; // { dg-error "here" }
-
-// { dg-error "use of 'std::format_kind" "" { target *-*-* } 0 }
-// { dg-error "primary_template_not_defined" "" { target *-*-* } 0 }
+// { dg-error "cannot use primary template" "" { target *-*-* } 0 }

Reply via email to