[libcxx-commits] [libcxx] [libc++] Avoid including <string_view> in <vector> (PR #220862)

via libcxx-commits libcxx-commits at lists.llvm.org
Thu Sep 3 07:49:17 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-libcxx

Author: Nikolas Klauser (philnik777)

<details>
<summary>Changes</summary>

By splitting up `<__format/concepts.h>` we can avoid including `<string_view>` in `<vector>`, making it ~20% faster to parse.


---
Full diff: https://github.com/llvm/llvm-project/pull/220862.diff


27 Files Affected:

- (modified) libcxx/include/CMakeLists.txt (+2-1) 
- (modified) libcxx/include/__chrono/formatter.h (+1-1) 
- (modified) libcxx/include/__chrono/parser_std_format_spec.h (-1) 
- (modified) libcxx/include/__chrono/statically_widen.h (+1-1) 
- (modified) libcxx/include/__format/buffer.h (+1-1) 
- (modified) libcxx/include/__format/container_adaptor.h (+1-1) 
- (added) libcxx/include/__format/fmt_char_type.h (+37) 
- (modified) libcxx/include/__format/format_arg.h (+1-1) 
- (modified) libcxx/include/__format/format_arg_store.h (+1-1) 
- (renamed) libcxx/include/__format/formattable.h (+6-14) 
- (modified) libcxx/include/__format/formatter_bool.h (+1-1) 
- (modified) libcxx/include/__format/formatter_bool_impl.h (+1-1) 
- (modified) libcxx/include/__format/formatter_char.h (+1-1) 
- (modified) libcxx/include/__format/formatter_floating_point.h (+1-1) 
- (modified) libcxx/include/__format/formatter_integer.h (+1-1) 
- (modified) libcxx/include/__format/formatter_integral.h (+1-1) 
- (modified) libcxx/include/__format/formatter_output.h (+1-1) 
- (modified) libcxx/include/__format/formatter_pointer.h (+1-1) 
- (modified) libcxx/include/__format/formatter_string.h (+1-1) 
- (modified) libcxx/include/__format/formatter_tuple.h (+2-1) 
- (modified) libcxx/include/__format/range_default_formatter.h (+1-1) 
- (modified) libcxx/include/__format/range_formatter.h (+1-1) 
- (modified) libcxx/include/__thread/formatter.h (+1-1) 
- (modified) libcxx/include/format (+1-1) 
- (modified) libcxx/include/module.modulemap.in (+2-1) 
- (modified) libcxx/test/libcxx/transitive_includes/cxx26.csv (-6) 
- (modified) libcxx/test/libcxx/transitive_includes/cxx29.csv (-6) 


``````````diff
diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt
index b559309929a67..ff117df6b792b 100644
--- a/libcxx/include/CMakeLists.txt
+++ b/libcxx/include/CMakeLists.txt
@@ -397,11 +397,11 @@ set(files
   __flat_set/ra_iterator.h
   __flat_set/utils.h
   __format/buffer.h
-  __format/concepts.h
   __format/container_adaptor.h
   __format/enable_insertable.h
   __format/escaped_output_table.h
   __format/extended_grapheme_cluster_table.h
+  __format/fmt_char_type.h
   __format/fmt_pair_like.h
   __format/format_arg.h
   __format/format_arg_store.h
@@ -412,6 +412,7 @@ set(files
   __format/format_parse_context.h
   __format/format_string.h
   __format/format_to_n_result.h
+  __format/formattable.h
   __format/formatter.h
   __format/formatter_bool.h
   __format/formatter_bool_impl.h
diff --git a/libcxx/include/__chrono/formatter.h b/libcxx/include/__chrono/formatter.h
index 49b7bee157243..70491a114a6e3 100644
--- a/libcxx/include/__chrono/formatter.h
+++ b/libcxx/include/__chrono/formatter.h
@@ -43,7 +43,7 @@
 #  include <__chrono/zoned_time.h>
 #  include <__concepts/arithmetic.h>
 #  include <__concepts/same_as.h>
-#  include <__format/concepts.h>
+#  include <__format/fmt_char_type.h>
 #  include <__format/format_error.h>
 #  include <__format/format_functions.h>
 #  include <__format/format_parse_context.h>
diff --git a/libcxx/include/__chrono/parser_std_format_spec.h b/libcxx/include/__chrono/parser_std_format_spec.h
index 8ecc19f3c7821..4b0ce983c33d8 100644
--- a/libcxx/include/__chrono/parser_std_format_spec.h
+++ b/libcxx/include/__chrono/parser_std_format_spec.h
@@ -14,7 +14,6 @@
 
 #if _LIBCPP_HAS_LOCALIZATION
 
-#  include <__format/concepts.h>
 #  include <__format/format_error.h>
 #  include <__format/format_parse_context.h>
 #  include <__format/formatter_string.h>
diff --git a/libcxx/include/__chrono/statically_widen.h b/libcxx/include/__chrono/statically_widen.h
index 40e085633b8c1..e9ccc6d2f62ef 100644
--- a/libcxx/include/__chrono/statically_widen.h
+++ b/libcxx/include/__chrono/statically_widen.h
@@ -14,7 +14,7 @@
 
 #include <__concepts/same_as.h>
 #include <__config>
-#include <__format/concepts.h>
+#include <__format/fmt_char_type.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/libcxx/include/__format/buffer.h b/libcxx/include/__format/buffer.h
index e7454f08f45d5..bf2bebf9b2a85 100644
--- a/libcxx/include/__format/buffer.h
+++ b/libcxx/include/__format/buffer.h
@@ -19,8 +19,8 @@
 #include <__algorithm/unwrap_iter.h>
 #include <__concepts/same_as.h>
 #include <__config>
-#include <__format/concepts.h>
 #include <__format/enable_insertable.h>
+#include <__format/fmt_char_type.h>
 #include <__format/format_to_n_result.h>
 #include <__iterator/back_insert_iterator.h>
 #include <__iterator/concepts.h>
diff --git a/libcxx/include/__format/container_adaptor.h b/libcxx/include/__format/container_adaptor.h
index ec8b1dedb190b..09803ee3ac5d9 100644
--- a/libcxx/include/__format/container_adaptor.h
+++ b/libcxx/include/__format/container_adaptor.h
@@ -15,7 +15,7 @@
 #endif
 
 #include <__config>
-#include <__format/concepts.h>
+#include <__format/formattable.h>
 #include <__format/formatter.h>
 #include <__format/range_default_formatter.h>
 #include <__fwd/queue.h>
diff --git a/libcxx/include/__format/fmt_char_type.h b/libcxx/include/__format/fmt_char_type.h
new file mode 100644
index 0000000000000..34b1a1d93fd5a
--- /dev/null
+++ b/libcxx/include/__format/fmt_char_type.h
@@ -0,0 +1,37 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef _LIBCPP___FORMAT_FMT_CHAR_TYPE_H
+#define _LIBCPP___FORMAT_FMT_CHAR_TYPE_H
+
+#include <__concepts/same_as.h>
+#include <__config>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+#  pragma GCC system_header
+#endif
+
+#if _LIBCPP_STD_VER >= 20
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+/// The character type specializations of \ref formatter.
+template <class _CharT>
+concept __fmt_char_type =
+    same_as<_CharT, char>
+#  if _LIBCPP_HAS_WIDE_CHARACTERS
+    || same_as<_CharT, wchar_t>
+#  endif
+    ;
+
+_LIBCPP_END_NAMESPACE_STD
+
+#endif // _LIBCPP_STD_VER >= 20
+
+#endif // _LIBCPP___FORMAT_FMT_CHAR_TYPE_H
diff --git a/libcxx/include/__format/format_arg.h b/libcxx/include/__format/format_arg.h
index 19794f0f084ce..4f52c6ab2c3e4 100644
--- a/libcxx/include/__format/format_arg.h
+++ b/libcxx/include/__format/format_arg.h
@@ -14,8 +14,8 @@
 #include <__concepts/arithmetic.h>
 #include <__config>
 #include <__cstddef/size_t.h>
-#include <__format/concepts.h>
 #include <__format/format_parse_context.h>
+#include <__format/formattable.h>
 #include <__functional/invoke.h>
 #include <__fwd/format.h>
 #include <__memory/addressof.h>
diff --git a/libcxx/include/__format/format_arg_store.h b/libcxx/include/__format/format_arg_store.h
index fbb4cad21b232..3f88161a5edd9 100644
--- a/libcxx/include/__format/format_arg_store.h
+++ b/libcxx/include/__format/format_arg_store.h
@@ -17,8 +17,8 @@
 #include <__concepts/same_as.h>
 #include <__config>
 #include <__cstddef/size_t.h>
-#include <__format/concepts.h>
 #include <__format/format_arg.h>
+#include <__format/formattable.h>
 #include <__type_traits/conditional.h>
 #include <__type_traits/extent.h>
 #include <__type_traits/integer_traits.h>
diff --git a/libcxx/include/__format/concepts.h b/libcxx/include/__format/formattable.h
similarity index 84%
rename from libcxx/include/__format/concepts.h
rename to libcxx/include/__format/formattable.h
index 5b603701c0248..f6e856a986c71 100644
--- a/libcxx/include/__format/concepts.h
+++ b/libcxx/include/__format/formattable.h
@@ -7,8 +7,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef _LIBCPP___FORMAT_CONCEPTS_H
-#define _LIBCPP___FORMAT_CONCEPTS_H
+#ifndef _LIBCPP___FORMAT_FORMATTABLE_H
+#define _LIBCPP___FORMAT_FORMATTABLE_H
 
 #include <__concepts/same_as.h>
 #include <__concepts/semiregular.h>
@@ -22,18 +22,9 @@
 #  pragma GCC system_header
 #endif
 
-_LIBCPP_BEGIN_NAMESPACE_STD
-
 #if _LIBCPP_STD_VER >= 20
 
-/// The character type specializations of \ref formatter.
-template <class _CharT>
-concept __fmt_char_type =
-    same_as<_CharT, char>
-#  if _LIBCPP_HAS_WIDE_CHARACTERS
-    || same_as<_CharT, wchar_t>
-#  endif
-    ;
+_LIBCPP_BEGIN_NAMESPACE_STD
 
 // The output iterator isn't specified. A formatter should accept any
 // output_iterator. This iterator is a minimal iterator to test the concept.
@@ -62,8 +53,9 @@ concept __formattable =
 template <class _Tp, class _CharT>
 concept formattable = __formattable<_Tp, _CharT>;
 #  endif // _LIBCPP_STD_VER >= 23
-#endif   // _LIBCPP_STD_VER >= 20
 
 _LIBCPP_END_NAMESPACE_STD
 
-#endif // _LIBCPP___FORMAT_CONCEPTS_H
+#endif // _LIBCPP_STD_VER >= 20
+
+#endif // _LIBCPP___FORMAT_FORMATTABLE_H
diff --git a/libcxx/include/__format/formatter_bool.h b/libcxx/include/__format/formatter_bool.h
index be34a1b0de452..139917c1e29e5 100644
--- a/libcxx/include/__format/formatter_bool.h
+++ b/libcxx/include/__format/formatter_bool.h
@@ -11,7 +11,7 @@
 #define _LIBCPP___FORMAT_FORMATTER_BOOL_H
 
 #include <__config>
-#include <__format/concepts.h>
+#include <__format/fmt_char_type.h>
 #include <__format/formatter.h>
 #include <__format/parser_std_format_spec_data.h>
 
diff --git a/libcxx/include/__format/formatter_bool_impl.h b/libcxx/include/__format/formatter_bool_impl.h
index 98befd6e26b28..477ef39feedd6 100644
--- a/libcxx/include/__format/formatter_bool_impl.h
+++ b/libcxx/include/__format/formatter_bool_impl.h
@@ -12,7 +12,7 @@
 
 #include <__assert>
 #include <__config>
-#include <__format/concepts.h>
+#include <__format/fmt_char_type.h>
 #include <__format/formatter_bool.h>
 #include <__format/formatter_integral.h>
 #include <__format/parser_std_format_spec.h>
diff --git a/libcxx/include/__format/formatter_char.h b/libcxx/include/__format/formatter_char.h
index 40eb5a02a79e5..919c5b7b9f9f9 100644
--- a/libcxx/include/__format/formatter_char.h
+++ b/libcxx/include/__format/formatter_char.h
@@ -12,7 +12,7 @@
 
 #include <__concepts/same_as.h>
 #include <__config>
-#include <__format/concepts.h>
+#include <__format/fmt_char_type.h>
 #include <__format/format_parse_context.h>
 #include <__format/formatter.h>
 #include <__format/formatter_integral.h>
diff --git a/libcxx/include/__format/formatter_floating_point.h b/libcxx/include/__format/formatter_floating_point.h
index a1ccf218e1397..44e352a9687cc 100644
--- a/libcxx/include/__format/formatter_floating_point.h
+++ b/libcxx/include/__format/formatter_floating_point.h
@@ -25,7 +25,7 @@
 #include <__concepts/same_as.h>
 #include <__config>
 #include <__cstddef/ptrdiff_t.h>
-#include <__format/concepts.h>
+#include <__format/fmt_char_type.h>
 #include <__format/format_parse_context.h>
 #include <__format/formatter.h>
 #include <__format/formatter_integral.h>
diff --git a/libcxx/include/__format/formatter_integer.h b/libcxx/include/__format/formatter_integer.h
index cf186c64e3d0f..a0996704e1e2a 100644
--- a/libcxx/include/__format/formatter_integer.h
+++ b/libcxx/include/__format/formatter_integer.h
@@ -12,7 +12,7 @@
 
 #include <__concepts/arithmetic.h>
 #include <__config>
-#include <__format/concepts.h>
+#include <__format/fmt_char_type.h>
 #include <__format/format_parse_context.h>
 #include <__format/formatter.h>
 #include <__format/formatter_integral.h>
diff --git a/libcxx/include/__format/formatter_integral.h b/libcxx/include/__format/formatter_integral.h
index 99a76c1efdd0d..35fb138c7dace 100644
--- a/libcxx/include/__format/formatter_integral.h
+++ b/libcxx/include/__format/formatter_integral.h
@@ -16,7 +16,7 @@
 #include <__concepts/arithmetic.h>
 #include <__concepts/same_as.h>
 #include <__config>
-#include <__format/concepts.h>
+#include <__format/fmt_char_type.h>
 #include <__format/format_error.h>
 #include <__format/formatter_output.h>
 #include <__format/parser_std_format_spec.h>
diff --git a/libcxx/include/__format/formatter_output.h b/libcxx/include/__format/formatter_output.h
index 63dd7fcacdcc9..f4bcaac53f6a8 100644
--- a/libcxx/include/__format/formatter_output.h
+++ b/libcxx/include/__format/formatter_output.h
@@ -19,7 +19,7 @@
 #include <__cstddef/ptrdiff_t.h>
 #include <__cstddef/size_t.h>
 #include <__format/buffer.h>
-#include <__format/concepts.h>
+#include <__format/fmt_char_type.h>
 #include <__format/formatter.h>
 #include <__format/parser_std_format_spec.h>
 #include <__format/unicode.h>
diff --git a/libcxx/include/__format/formatter_pointer.h b/libcxx/include/__format/formatter_pointer.h
index 4c5896d589cfc..cd2a7919021f4 100644
--- a/libcxx/include/__format/formatter_pointer.h
+++ b/libcxx/include/__format/formatter_pointer.h
@@ -12,7 +12,7 @@
 
 #include <__config>
 #include <__cstddef/nullptr_t.h>
-#include <__format/concepts.h>
+#include <__format/fmt_char_type.h>
 #include <__format/format_parse_context.h>
 #include <__format/formatter.h>
 #include <__format/formatter_integral.h>
diff --git a/libcxx/include/__format/formatter_string.h b/libcxx/include/__format/formatter_string.h
index dc00c4bd52132..548a27d952588 100644
--- a/libcxx/include/__format/formatter_string.h
+++ b/libcxx/include/__format/formatter_string.h
@@ -12,7 +12,7 @@
 
 #include <__assert>
 #include <__config>
-#include <__format/concepts.h>
+#include <__format/fmt_char_type.h>
 #include <__format/format_parse_context.h>
 #include <__format/formatter.h>
 #include <__format/formatter_output.h>
diff --git a/libcxx/include/__format/formatter_tuple.h b/libcxx/include/__format/formatter_tuple.h
index 525d0408c9448..8bfb4567f8403 100644
--- a/libcxx/include/__format/formatter_tuple.h
+++ b/libcxx/include/__format/formatter_tuple.h
@@ -14,10 +14,11 @@
 #include <__chrono/statically_widen.h>
 #include <__config>
 #include <__format/buffer.h>
-#include <__format/concepts.h>
+#include <__format/fmt_char_type.h>
 #include <__format/format_context.h>
 #include <__format/format_error.h>
 #include <__format/format_parse_context.h>
+#include <__format/formattable.h>
 #include <__format/formatter.h>
 #include <__format/formatter_output.h>
 #include <__format/parser_std_format_spec.h>
diff --git a/libcxx/include/__format/range_default_formatter.h b/libcxx/include/__format/range_default_formatter.h
index fbad9022821c0..bc6153d55bf32 100644
--- a/libcxx/include/__format/range_default_formatter.h
+++ b/libcxx/include/__format/range_default_formatter.h
@@ -17,8 +17,8 @@
 #include <__algorithm/ranges_copy.h>
 #include <__chrono/statically_widen.h>
 #include <__config>
-#include <__format/concepts.h>
 #include <__format/fmt_pair_like.h>
+#include <__format/formattable.h>
 #include <__format/formatter.h>
 #include <__format/range_format.h>
 #include <__format/range_formatter.h>
diff --git a/libcxx/include/__format/range_formatter.h b/libcxx/include/__format/range_formatter.h
index 86cc14a2489d0..01b05a63654a8 100644
--- a/libcxx/include/__format/range_formatter.h
+++ b/libcxx/include/__format/range_formatter.h
@@ -19,10 +19,10 @@
 #include <__concepts/same_as.h>
 #include <__config>
 #include <__format/buffer.h>
-#include <__format/concepts.h>
 #include <__format/fmt_pair_like.h>
 #include <__format/format_context.h>
 #include <__format/format_error.h>
+#include <__format/formattable.h>
 #include <__format/formatter.h>
 #include <__format/formatter_output.h>
 #include <__format/parser_std_format_spec.h>
diff --git a/libcxx/include/__thread/formatter.h b/libcxx/include/__thread/formatter.h
index c71b68e0b5fb5..66e389586901c 100644
--- a/libcxx/include/__thread/formatter.h
+++ b/libcxx/include/__thread/formatter.h
@@ -12,7 +12,7 @@
 
 #include <__concepts/arithmetic.h>
 #include <__config>
-#include <__format/concepts.h>
+#include <__format/fmt_char_type.h>
 #include <__format/format_parse_context.h>
 #include <__format/formatter.h>
 #include <__format/formatter_integral.h>
diff --git a/libcxx/include/format b/libcxx/include/format
index 12462d0560dac..d89c8d8b0ae89 100644
--- a/libcxx/include/format
+++ b/libcxx/include/format
@@ -198,7 +198,6 @@ namespace std {
 
 #  if _LIBCPP_STD_VER >= 20
 #    include <__format/buffer.h>
-#    include <__format/concepts.h>
 #    include <__format/container_adaptor.h>
 #    include <__format/enable_insertable.h>
 #    include <__format/escaped_output_table.h>
@@ -212,6 +211,7 @@ namespace std {
 #    include <__format/format_parse_context.h>
 #    include <__format/format_string.h>
 #    include <__format/format_to_n_result.h>
+#    include <__format/formattable.h>
 #    include <__format/formatter.h>
 #    include <__format/formatter_bool_impl.h>
 #    include <__format/formatter_char.h>
diff --git a/libcxx/include/module.modulemap.in b/libcxx/include/module.modulemap.in
index f0defc3040ef9..d02a6542af6d8 100644
--- a/libcxx/include/module.modulemap.in
+++ b/libcxx/include/module.modulemap.in
@@ -1356,11 +1356,11 @@ module std {
       header "__format/buffer.h"
       export std.iterator.back_insert_iterator
     }
-    module concepts                           { header "__format/concepts.h" }
     module container_adaptor                  { header "__format/container_adaptor.h" }
     module enable_insertable                  { header "__format/enable_insertable.h" }
     module escaped_output_table               { header "__format/escaped_output_table.h" }
     module extended_grapheme_cluster_table    { header "__format/extended_grapheme_cluster_table.h" }
+    module fmt_char_type                      { header "__format/fmt_char_type.h" }
     module fmt_pair_like                      { header "__format/fmt_pair_like.h" }
     module format_arg                         { header "__format/format_arg.h" }
     module format_arg_store                   { header "__format/format_arg_store.h" }
@@ -1379,6 +1379,7 @@ module std {
     module format_parse_context               { header "__format/format_parse_context.h" }
     module format_string                      { header "__format/format_string.h" }
     module format_to_n_result                 { header "__format/format_to_n_result.h" }
+    module formattable                        { header "__format/formattable.h" }
     module formatter                          { header "__format/formatter.h" }
     module formatter_bool                {
       header "__format/formatter_bool.h"
diff --git a/libcxx/test/libcxx/transitive_includes/cxx26.csv b/libcxx/test/libcxx/transitive_includes/cxx26.csv
index 3f4daee66625a..3bfc12b3259f6 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx26.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx26.csv
@@ -733,16 +733,13 @@ queue cctype
 queue climits
 queue compare
 queue cstdint
-queue cstdio
 queue cstring
 queue cwchar
 queue cwctype
 queue deque
 queue initializer_list
-queue iosfwd
 queue limits
 queue stdexcept
-queue string_view
 queue tuple
 queue vector
 queue version
@@ -1106,14 +1103,11 @@ vector cctype
 vector climits
 vector compare
 vector cstdint
-vector cstdio
 vector cstring
 vector cwchar
 vector cwctype
 vector initializer_list
-vector iosfwd
 vector limits
 vector stdexcept
-vector string_view
 vector tuple
 vector version
diff --git a/libcxx/test/libcxx/transitive_includes/cxx29.csv b/libcxx/test/libcxx/transitive_includes/cxx29.csv
index 3f4daee66625a..3bfc12b3259f6 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx29.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx29.csv
@@ -733,16 +733,13 @@ queue cctype
 queue climits
 queue compare
 queue cstdint
-queue cstdio
 queue cstring
 queue cwchar
 queue cwctype
 queue deque
 queue initializer_list
-queue iosfwd
 queue limits
 queue stdexcept
-queue string_view
 queue tuple
 queue vector
 queue version
@@ -1106,14 +1103,11 @@ vector cctype
 vector climits
 vector compare
 vector cstdint
-vector cstdio
 vector cstring
 vector cwchar
 vector cwctype
 vector initializer_list
-vector iosfwd
 vector limits
 vector stdexcept
-vector string_view
 vector tuple
 vector version

``````````

</details>


https://github.com/llvm/llvm-project/pull/220862


More information about the libcxx-commits mailing list