[libcxx-commits] [libcxx] 4746e69 - [libc++] Avoid including <string_view> in <vector> (#220862)
via libcxx-commits
libcxx-commits at lists.llvm.org
Fri Sep 4 04:11:52 PDT 2026
Author: Nikolas Klauser
Date: 2026-09-04T13:11:47+02:00
New Revision: 4746e698304bf95b7e4c55d6e798e422732ae514
URL: https://github.com/llvm/llvm-project/commit/4746e698304bf95b7e4c55d6e798e422732ae514
DIFF: https://github.com/llvm/llvm-project/commit/4746e698304bf95b7e4c55d6e798e422732ae514.diff
LOG: [libc++] Avoid including <string_view> in <vector> (#220862)
By splitting up `<__format/concepts.h>` we can avoid including
`<string_view>` in `<vector>`, making it ~20% faster to parse.
Added:
libcxx/include/__format/fmt_char_type.h
libcxx/include/__format/formattable.h
Modified:
libcxx/include/CMakeLists.txt
libcxx/include/__chrono/formatter.h
libcxx/include/__chrono/parser_std_format_spec.h
libcxx/include/__chrono/statically_widen.h
libcxx/include/__format/buffer.h
libcxx/include/__format/container_adaptor.h
libcxx/include/__format/format_arg.h
libcxx/include/__format/format_arg_store.h
libcxx/include/__format/formatter_bool.h
libcxx/include/__format/formatter_bool_impl.h
libcxx/include/__format/formatter_char.h
libcxx/include/__format/formatter_floating_point.h
libcxx/include/__format/formatter_integer.h
libcxx/include/__format/formatter_integral.h
libcxx/include/__format/formatter_output.h
libcxx/include/__format/formatter_pointer.h
libcxx/include/__format/formatter_string.h
libcxx/include/__format/formatter_tuple.h
libcxx/include/__format/range_default_formatter.h
libcxx/include/__format/range_formatter.h
libcxx/include/__thread/formatter.h
libcxx/include/format
libcxx/include/module.modulemap.in
libcxx/test/libcxx/transitive_includes/cxx26.csv
libcxx/test/libcxx/transitive_includes/cxx29.csv
Removed:
libcxx/include/__format/concepts.h
################################################################################
diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt
index e990d390e904f..16b0ee0cd952b 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/ptr
diff _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/ptr
diff _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 b7b7dc9ba6ad8..4c5e63721610a 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 a497cc5ec712b..800d65aed4704 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx26.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx26.csv
@@ -732,16 +732,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
@@ -1105,14 +1102,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 a497cc5ec712b..800d65aed4704 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx29.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx29.csv
@@ -732,16 +732,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
@@ -1105,14 +1102,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
More information about the libcxx-commits
mailing list