[libcxx-commits] [libcxx] [libc++] Clean up headers that relied on `<optional>`'s transitive includes (PR #213158)
William Tran-Viet via libcxx-commits
libcxx-commits at lists.llvm.org
Fri Jul 31 15:49:54 PDT 2026
https://github.com/smallp-o-p updated https://github.com/llvm/llvm-project/pull/213158
>From 4cc180b499f03da0832e1412a8e538ab928ef716 Mon Sep 17 00:00:00 2001
From: William Tran-Viet <wtranviet at proton.me>
Date: Thu, 30 Jul 2026 18:14:12 -0400
Subject: [PATCH 1/4] [libc++] Clean up headers that relied on `<optional>`'s
transitive includes
---
libcxx/include/__algorithm/ranges_fold.h | 1 +
libcxx/include/__node_handle | 2 ++
libcxx/include/__pstl/cpu_algos/transform_reduce.h | 2 ++
libcxx/include/__ranges/join_view.h | 4 ++++
libcxx/include/__ranges/movable_box.h | 4 ++++
libcxx/include/__ranges/non_propagating_cache.h | 1 +
libcxx/include/optional | 14 --------------
.../quoted.manip/quoted_traits.compile.pass.cpp | 1 +
.../class.path/path.nonmember/path.io.pass.cpp | 1 +
.../const_optional_U.pass.cpp | 1 +
.../optional.object.ctor/const_optional_U.pass.cpp | 1 +
.../optional.object.ctor/copy.pass.cpp | 1 +
.../explicit_optional_U.pass.cpp | 1 +
.../optional.object.ctor/move.pass.cpp | 1 +
.../optional.object.ctor/rvalue_T.pass.cpp | 1 +
.../optional.object.observe/value_or.pass.cpp | 1 +
16 files changed, 23 insertions(+), 14 deletions(-)
diff --git a/libcxx/include/__algorithm/ranges_fold.h b/libcxx/include/__algorithm/ranges_fold.h
index 87579b264296a..a82d9acfcea8c 100644
--- a/libcxx/include/__algorithm/ranges_fold.h
+++ b/libcxx/include/__algorithm/ranges_fold.h
@@ -31,6 +31,7 @@
#include <__type_traits/decay.h>
#include <__type_traits/invoke.h>
#include <__utility/forward.h>
+#include <__utility/in_place.h>
#include <__utility/move.h>
#include <optional>
diff --git a/libcxx/include/__node_handle b/libcxx/include/__node_handle
index 993283cc926da..8f4e34d47ac59 100644
--- a/libcxx/include/__node_handle
+++ b/libcxx/include/__node_handle
@@ -63,7 +63,9 @@ public:
#include <__memory/allocator_traits.h>
#include <__memory/pointer_traits.h>
#include <__type_traits/is_specialization.h>
+#include <__type_traits/remove_const.h>
#include <__utility/exchange.h>
+#include <__utility/move.h>
#include <optional>
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
diff --git a/libcxx/include/__pstl/cpu_algos/transform_reduce.h b/libcxx/include/__pstl/cpu_algos/transform_reduce.h
index edfb28b4466fc..cc9d0b54dd394 100644
--- a/libcxx/include/__pstl/cpu_algos/transform_reduce.h
+++ b/libcxx/include/__pstl/cpu_algos/transform_reduce.h
@@ -17,6 +17,8 @@
#include <__pstl/backend_fwd.h>
#include <__pstl/cpu_algos/cpu_traits.h>
#include <__type_traits/desugars_to.h>
+#include <__type_traits/enable_if.h>
+#include <__type_traits/invoke.h>
#include <__type_traits/is_arithmetic.h>
#include <__type_traits/is_execution_policy.h>
#include <__utility/move.h>
diff --git a/libcxx/include/__ranges/join_view.h b/libcxx/include/__ranges/join_view.h
index 4f3f8d1c1e5b4..b8a75c4726eb2 100644
--- a/libcxx/include/__ranges/join_view.h
+++ b/libcxx/include/__ranges/join_view.h
@@ -31,10 +31,14 @@
#include <__ranges/range_adaptor.h>
#include <__ranges/view_interface.h>
#include <__type_traits/common_type.h>
+#include <__type_traits/conditional.h>
+#include <__type_traits/is_reference.h>
#include <__type_traits/maybe_const.h>
+#include <__type_traits/remove_cvref.h>
#include <__utility/as_lvalue.h>
#include <__utility/empty.h>
#include <__utility/forward.h>
+#include <__utility/move.h>
#include <optional>
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
diff --git a/libcxx/include/__ranges/movable_box.h b/libcxx/include/__ranges/movable_box.h
index 5a456cc3a1b66..20986d56dc503 100644
--- a/libcxx/include/__ranges/movable_box.h
+++ b/libcxx/include/__ranges/movable_box.h
@@ -16,7 +16,11 @@
#include <__config>
#include <__memory/addressof.h>
#include <__memory/construct_at.h>
+#include <__type_traits/is_constructible.h>
#include <__type_traits/is_nothrow_constructible.h>
+#include <__type_traits/is_object.h>
+#include <__utility/forward.h>
+#include <__utility/in_place.h>
#include <__utility/move.h>
#include <optional>
diff --git a/libcxx/include/__ranges/non_propagating_cache.h b/libcxx/include/__ranges/non_propagating_cache.h
index beae13a98e9e3..c2bfc443faa18 100644
--- a/libcxx/include/__ranges/non_propagating_cache.h
+++ b/libcxx/include/__ranges/non_propagating_cache.h
@@ -14,6 +14,7 @@
#include <__iterator/concepts.h> // indirectly_readable
#include <__iterator/iterator_traits.h> // iter_reference_t
#include <__memory/addressof.h>
+#include <__type_traits/is_object.h>
#include <__utility/forward.h>
#include <optional>
diff --git a/libcxx/include/optional b/libcxx/include/optional
index 170062aa32497..3527436eae24b 100644
--- a/libcxx/include/optional
+++ b/libcxx/include/optional
@@ -268,21 +268,7 @@ namespace std {
# include <__optional/optional.h>
# include <__optional/optional_ref.h>
# include <__optional/swap.h>
-
-// TODO: Some headers rely on these transitive includes
-# include <__cstddef/size_t.h>
-# include <__type_traits/conditional.h>
-# include <__type_traits/enable_if.h>
-# include <__type_traits/invoke.h>
-# include <__type_traits/is_constructible.h>
-# include <__type_traits/is_object.h>
-# include <__type_traits/is_reference.h>
-# include <__type_traits/remove_const.h>
-# include <__type_traits/remove_cvref.h>
-# include <__utility/declval.h>
-# include <__utility/forward.h>
# include <__utility/in_place.h>
-# include <__utility/move.h>
# include <initializer_list>
diff --git a/libcxx/test/libcxx/input.output/iostream.format/quoted.manip/quoted_traits.compile.pass.cpp b/libcxx/test/libcxx/input.output/iostream.format/quoted.manip/quoted_traits.compile.pass.cpp
index c16e0017822a9..9e0645f682e2d 100644
--- a/libcxx/test/libcxx/input.output/iostream.format/quoted.manip/quoted_traits.compile.pass.cpp
+++ b/libcxx/test/libcxx/input.output/iostream.format/quoted.manip/quoted_traits.compile.pass.cpp
@@ -25,6 +25,7 @@
#include <string>
#include <string_view>
#include <type_traits>
+#include <utility>
#include "test_allocator.h"
#include "test_macros.h"
diff --git a/libcxx/test/std/input.output/filesystems/class.path/path.nonmember/path.io.pass.cpp b/libcxx/test/std/input.output/filesystems/class.path/path.nonmember/path.io.pass.cpp
index 0d667d0e2a7d8..0839d5e2754ed 100644
--- a/libcxx/test/std/input.output/filesystems/class.path/path.nonmember/path.io.pass.cpp
+++ b/libcxx/test/std/input.output/filesystems/class.path/path.nonmember/path.io.pass.cpp
@@ -27,6 +27,7 @@
#include <sstream>
#include <cassert>
#include <iostream>
+#include <utility>
#include "count_new.h"
#include "make_string.h"
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/const_optional_U.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/const_optional_U.pass.cpp
index 6b6dcbf428380..da0fda6d86270 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/const_optional_U.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/const_optional_U.pass.cpp
@@ -16,6 +16,7 @@
#include <optional>
#include <type_traits>
#include <cassert>
+#include <utility>
#include "test_macros.h"
#include "archetypes.h"
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/const_optional_U.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/const_optional_U.pass.cpp
index 844317c8570d9..5163a04dd2d3d 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/const_optional_U.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/const_optional_U.pass.cpp
@@ -16,6 +16,7 @@
#include <cassert>
#include <optional>
#include <type_traits>
+#include <utility>
#include "../optional_helper_types.h"
#include "test_macros.h"
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/copy.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/copy.pass.cpp
index fd7332f3b422b..56886f9a8c65e 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/copy.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/copy.pass.cpp
@@ -14,6 +14,7 @@
#include <cassert>
#include <optional>
#include <type_traits>
+#include <utility>
#include "test_macros.h"
#include "archetypes.h"
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/explicit_optional_U.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/explicit_optional_U.pass.cpp
index bddbd4ba93d5a..3baa7d5dfdd6a 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/explicit_optional_U.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/explicit_optional_U.pass.cpp
@@ -15,6 +15,7 @@
#include <cassert>
#include <optional>
#include <type_traits>
+#include <utility>
#include "test_macros.h"
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/move.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/move.pass.cpp
index bb36283a5e3ea..4772b8ca672d9 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/move.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/move.pass.cpp
@@ -15,6 +15,7 @@
#include <cassert>
#include <optional>
#include <type_traits>
+#include <utility>
#include "test_macros.h"
#include "archetypes.h"
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/rvalue_T.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/rvalue_T.pass.cpp
index e73eef4592256..7abaa7a54b101 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/rvalue_T.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/rvalue_T.pass.cpp
@@ -15,6 +15,7 @@
#include <cassert>
#include <optional>
#include <type_traits>
+#include <utility>
#include "test_macros.h"
#include "archetypes.h"
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_or.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_or.pass.cpp
index f4ad896ed9816..5c0fd262805fb 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_or.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_or.pass.cpp
@@ -14,6 +14,7 @@
#include <optional>
#include <type_traits>
#include <cassert>
+#include <utility>
#include "test_macros.h"
>From 5a5f8811f02302befe3fda36d5ad76f112466ff0 Mon Sep 17 00:00:00 2001
From: William Tran-Viet <wtranviet at proton.me>
Date: Fri, 31 Jul 2026 15:16:31 -0400
Subject: [PATCH 2/4] Remove in_place_t
---
libcxx/include/optional | 1 -
libcxx/test/libcxx/ranges/range.adaptors/range.move.wrap/types.h | 1 +
.../test/std/concepts/concepts.object/regular.compile.pass.cpp | 1 +
.../std/thread/thread.stoptoken/stopsource/cons.copy.pass.cpp | 1 +
.../optional.object/optional.object.ctor/in_place_t.pass.cpp | 1 +
.../optional.object.ctor/initializer_list.pass.cpp | 1 +
.../optional/optional.syn/optional_in_place_t.verify.cpp | 1 +
7 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/libcxx/include/optional b/libcxx/include/optional
index 3527436eae24b..ca421a55d45e9 100644
--- a/libcxx/include/optional
+++ b/libcxx/include/optional
@@ -268,7 +268,6 @@ namespace std {
# include <__optional/optional.h>
# include <__optional/optional_ref.h>
# include <__optional/swap.h>
-# include <__utility/in_place.h>
# include <initializer_list>
diff --git a/libcxx/test/libcxx/ranges/range.adaptors/range.move.wrap/types.h b/libcxx/test/libcxx/ranges/range.adaptors/range.move.wrap/types.h
index 9e6bf5d89c18e..303c767ba1254 100644
--- a/libcxx/test/libcxx/ranges/range.adaptors/range.move.wrap/types.h
+++ b/libcxx/test/libcxx/ranges/range.adaptors/range.move.wrap/types.h
@@ -13,6 +13,7 @@
#include <cassert>
#include <concepts>
#include <type_traits>
+#include <utility>
#include "test_macros.h"
diff --git a/libcxx/test/std/concepts/concepts.object/regular.compile.pass.cpp b/libcxx/test/std/concepts/concepts.object/regular.compile.pass.cpp
index ab5472f6c391d..af2e28f33de3c 100644
--- a/libcxx/test/std/concepts/concepts.object/regular.compile.pass.cpp
+++ b/libcxx/test/std/concepts/concepts.object/regular.compile.pass.cpp
@@ -22,6 +22,7 @@
#include <stdexcept>
#include <tuple>
#include <unordered_map>
+#include <utility>
#include <vector>
#include "type_classification/moveconstructible.h"
diff --git a/libcxx/test/std/thread/thread.stoptoken/stopsource/cons.copy.pass.cpp b/libcxx/test/std/thread/thread.stoptoken/stopsource/cons.copy.pass.cpp
index eadde8da44e5a..ff3cbc2b7fe89 100644
--- a/libcxx/test/std/thread/thread.stoptoken/stopsource/cons.copy.pass.cpp
+++ b/libcxx/test/std/thread/thread.stoptoken/stopsource/cons.copy.pass.cpp
@@ -15,6 +15,7 @@
#include <optional>
#include <stop_token>
#include <type_traits>
+#include <utility>
#include "test_macros.h"
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/in_place_t.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/in_place_t.pass.cpp
index c3b498e56a5a1..22398d33f99a1 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/in_place_t.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/in_place_t.pass.cpp
@@ -18,6 +18,7 @@
#include <cassert>
#include <optional>
#include <type_traits>
+#include <utility>
#include "test_macros.h"
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/initializer_list.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/initializer_list.pass.cpp
index 1993476792878..e1967e9f7ff8b 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/initializer_list.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/initializer_list.pass.cpp
@@ -17,6 +17,7 @@
#include <memory>
#include <optional>
#include <type_traits>
+#include <utility>
#include <vector>
#include "test_macros.h"
diff --git a/libcxx/test/std/utilities/optional/optional.syn/optional_in_place_t.verify.cpp b/libcxx/test/std/utilities/optional/optional.syn/optional_in_place_t.verify.cpp
index 8731b0b37e9bc..ff79b10ea9d69 100644
--- a/libcxx/test/std/utilities/optional/optional.syn/optional_in_place_t.verify.cpp
+++ b/libcxx/test/std/utilities/optional/optional.syn/optional_in_place_t.verify.cpp
@@ -14,6 +14,7 @@
// (possibly cv-qualified) in_place_t is ill-formed.
#include <optional>
+#include <utility>
#include "test_macros.h"
>From 67aa887f15865547cdd499d4fc0101b28731ea13 Mon Sep 17 00:00:00 2001
From: William Tran-Viet <wtranviet at proton.me>
Date: Fri, 31 Jul 2026 16:44:12 -0400
Subject: [PATCH 3/4] Missed a test
---
.../optional.object/optional.object.ctor/ctor.verify.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/ctor.verify.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/ctor.verify.cpp
index a13b4334da332..dc9dd9ab25aae 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/ctor.verify.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/ctor.verify.cpp
@@ -15,6 +15,7 @@
#include <cassert>
#include <optional>
+#include <utility>
#include "test_macros.h"
>From 751dff5eb8442250450f1fa3245a5f43c583b3a6 Mon Sep 17 00:00:00 2001
From: William Tran-Viet <wtranviet at proton.me>
Date: Fri, 31 Jul 2026 18:49:42 -0400
Subject: [PATCH 4/4] Missed a test
---
.../optional.object/optional.object.assign/assign_value.pass.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp
index f1e2493954d38..07dd1a9e3db6f 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp
@@ -15,6 +15,7 @@
#include <type_traits>
#include <cassert>
#include <memory>
+#include <utility>
#include "test_macros.h"
#include "archetypes.h"
More information about the libcxx-commits
mailing list