[libcxx] [llvm] [CI] Migrate to runtimes build (PR #142696)

Aiden Grossman via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 9 22:30:50 PDT 2025


https://github.com/boomanaiden154 updated https://github.com/llvm/llvm-project/pull/142696

>From d5b8a8bf145e570af0109dc6b08349277582b24c Mon Sep 17 00:00:00 2001
From: Aiden Grossman <aidengrossman at google.com>
Date: Tue, 3 Jun 2025 23:35:16 +0000
Subject: [PATCH 1/7] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20ch?=
 =?UTF-8?q?anges=20to=20main=20this=20commit=20is=20based=20on?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Created using spr 1.3.4

[skip ci]
---
 .ci/compute_projects.py                       | 29 ++++++---
 .ci/compute_projects_test.py                  | 11 ++++
 .ci/monolithic-linux.sh                       | 60 +++++--------------
 .../mdspan/extents/assert.conversion.pass.cpp |  1 +
 .../extents/assert.ctor_from_array.pass.cpp   |  1 +
 .../assert.ctor_from_integral.pass.cpp        |  1 +
 .../extents/assert.ctor_from_span.pass.cpp    |  1 +
 .../views/mdspan/extents/assert.obs.pass.cpp  |  1 +
 .../layout_left/assert.conversion.pass.cpp    |  1 +
 .../layout_left/assert.ctor.extents.pass.cpp  |  1 +
 .../assert.ctor.layout_right.pass.cpp         |  1 +
 .../assert.ctor.layout_stride.pass.cpp        |  1 +
 .../layout_right/assert.conversion.pass.cpp   |  1 +
 .../layout_right/assert.ctor.extents.pass.cpp |  1 +
 .../assert.ctor.layout_left.pass.cpp          |  1 +
 .../assert.ctor.layout_stride.pass.cpp        |  1 +
 .../assert.ctor.extents_array.pass.cpp        |  1 +
 .../assert.ctor.extents_span.pass.cpp         |  1 +
 18 files changed, 60 insertions(+), 55 deletions(-)

diff --git a/.ci/compute_projects.py b/.ci/compute_projects.py
index 17a2136a270d5..40dd0507a9eaf 100644
--- a/.ci/compute_projects.py
+++ b/.ci/compute_projects.py
@@ -57,6 +57,13 @@
     ".ci": {"llvm", "clang", "lld", "lldb"},
 }
 
+# This mapping describes runtimes that should be enabled for a specific project,
+# but not necessarily run for testing. The only case of this currently is lldb
+# which needs some runtimes enabled for tests.
+DEPENDENT_RUNTIMES_TO_BUILD = {"lldb": {"libcxx", "libcxxabi", "libunwind"}}
+
+# This mapping describes runtimes that should be tested when the key project is
+# touched.
 DEPENDENT_RUNTIMES_TO_TEST = {"clang": {"libcxx", "libcxxabi", "libunwind"}}
 
 EXCLUDE_LINUX = {
@@ -180,16 +187,20 @@ def _compute_project_check_targets(projects_to_test: Set[str]) -> Set[str]:
 def _compute_runtimes_to_test(projects_to_test: Set[str]) -> Set[str]:
     runtimes_to_test = set()
     for project_to_test in projects_to_test:
-        if project_to_test not in DEPENDENT_RUNTIMES_TO_TEST:
-            continue
-        runtimes_to_test.update(DEPENDENT_RUNTIMES_TO_TEST[project_to_test])
+        if project_to_test in DEPENDENT_RUNTIMES_TO_TEST:
+            runtimes_to_test.update(DEPENDENT_RUNTIMES_TO_TEST[project_to_test])
+        if project_to_test in DEPENDENT_RUNTIMES_TO_BUILD:
+            runtimes_to_test.update(DEPENDENT_RUNTIMES_TO_BUILD[project_to_test])
     return runtimes_to_test
 
 
-def _compute_runtime_check_targets(runtimes_to_test: Set[str]) -> Set[str]:
+def _compute_runtime_check_targets(projects_to_test: Set[str]) -> Set[str]:
     check_targets = set()
-    for runtime_to_test in runtimes_to_test:
-        check_targets.add(PROJECT_CHECK_TARGETS[runtime_to_test])
+    for project_to_test in projects_to_test:
+        if project_to_test not in DEPENDENT_RUNTIMES_TO_TEST:
+            continue
+        for runtime_to_test in DEPENDENT_RUNTIMES_TO_TEST[project_to_test]:
+            check_targets.add(PROJECT_CHECK_TARGETS[runtime_to_test])
     return check_targets
 
 
@@ -216,8 +227,8 @@ def get_env_variables(modified_files: list[str], platform: str) -> Set[str]:
     projects_to_test = _compute_projects_to_test(modified_projects, platform)
     projects_to_build = _compute_projects_to_build(projects_to_test)
     projects_check_targets = _compute_project_check_targets(projects_to_test)
-    runtimes_to_test = _compute_runtimes_to_test(projects_to_test)
-    runtimes_check_targets = _compute_runtime_check_targets(runtimes_to_test)
+    runtimes_to_build = _compute_runtimes_to_test(projects_to_test)
+    runtimes_check_targets = _compute_runtime_check_targets(projects_to_test)
     # We use a semicolon to separate the projects/runtimes as they get passed
     # to the CMake invocation and thus we need to use the CMake list separator
     # (;). We use spaces to separate the check targets as they end up getting
@@ -225,7 +236,7 @@ def get_env_variables(modified_files: list[str], platform: str) -> Set[str]:
     return {
         "projects_to_build": ";".join(sorted(projects_to_build)),
         "project_check_targets": " ".join(sorted(projects_check_targets)),
-        "runtimes_to_build": ";".join(sorted(runtimes_to_test)),
+        "runtimes_to_build": ";".join(sorted(runtimes_to_build)),
         "runtimes_check_targets": " ".join(sorted(runtimes_check_targets)),
     }
 
diff --git a/.ci/compute_projects_test.py b/.ci/compute_projects_test.py
index 885f1dd6af845..ae376ea6a43cd 100644
--- a/.ci/compute_projects_test.py
+++ b/.ci/compute_projects_test.py
@@ -205,6 +205,17 @@ def test_ci(self):
             "check-cxx check-cxxabi check-unwind",
         )
 
+    def test_lldb(self):
+        env_variables = compute_projects.get_env_variables(
+            ["lldb/CMakeLists.txt"], "Linux"
+        )
+        self.assertEqual(env_variables["projects_to_build"], "clang;lldb;llvm")
+        self.assertEqual(env_variables["project_check_targets"], "check-lldb")
+        self.assertEqual(
+            env_variables["runtimes_to_build"], "libcxx;libcxxabi;libunwind"
+        )
+        self.assertEqual(env_variables["runtimes_check_targets"], "")
+
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/.ci/monolithic-linux.sh b/.ci/monolithic-linux.sh
index f5a31fa45a641..7503ea4e6a992 100755
--- a/.ci/monolithic-linux.sh
+++ b/.ci/monolithic-linux.sh
@@ -55,6 +55,8 @@ trap at-exit EXIT
 
 projects="${1}"
 targets="${2}"
+runtimes="${3}"
+runtime_targets="${4}"
 
 lit_args="-v --xunit-xml-output ${BUILD_DIR}/test-results.xml --use-unique-output-file-name --timeout=1200 --time-tests"
 
@@ -70,7 +72,7 @@ export LLVM_SYMBOLIZER_PATH=`which llvm-symbolizer`
 # It will not be built unless it is used.
 cmake -S "${MONOREPO_ROOT}"/llvm -B "${BUILD_DIR}" \
       -D LLVM_ENABLE_PROJECTS="${projects}" \
-      -D LLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind" \
+      -D LLVM_ENABLE_RUNTIMES="${runtimes}" \
       -G Ninja \
       -D CMAKE_PREFIX_PATH="${HOME}/.local" \
       -D CMAKE_BUILD_TYPE=Release \
@@ -91,62 +93,28 @@ echo "--- ninja"
 # Targets are not escaped as they are passed as separate arguments.
 ninja -C "${BUILD_DIR}" -k 0 ${targets}
 
-runtimes="${3}"
-runtime_targets="${4}"
-
 # Compiling runtimes with just-built Clang and running their tests
 # as an additional testing for Clang.
-if [[ "${runtimes}" != "" ]]; then
-  if [[ "${runtime_targets}" == "" ]]; then
-    echo "Runtimes to build are specified, but targets are not."
-    exit 1
-  fi
-
-  echo "--- ninja install-clang"
-
-  ninja -C ${BUILD_DIR} install-clang install-clang-resource-headers
-
-  RUNTIMES_BUILD_DIR="${MONOREPO_ROOT}/build-runtimes"
-  INSTALL_DIR="${BUILD_DIR}/install"
-  mkdir -p ${RUNTIMES_BUILD_DIR}
-
+if [[ "${runtimes_targets}" != "" ]]; then
   echo "--- cmake runtimes C++26"
 
-  rm -rf "${RUNTIMES_BUILD_DIR}"
-  cmake -S "${MONOREPO_ROOT}/runtimes" -B "${RUNTIMES_BUILD_DIR}" -GNinja \
-      -D CMAKE_C_COMPILER="${INSTALL_DIR}/bin/clang" \
-      -D CMAKE_CXX_COMPILER="${INSTALL_DIR}/bin/clang++" \
-      -D LLVM_ENABLE_RUNTIMES="${runtimes}" \
-      -D LIBCXX_CXX_ABI=libcxxabi \
-      -D CMAKE_BUILD_TYPE=RelWithDebInfo \
-      -D CMAKE_INSTALL_PREFIX="${INSTALL_DIR}" \
-      -D LIBCXX_TEST_PARAMS="std=c++26" \
-      -D LIBCXXABI_TEST_PARAMS="std=c++26" \
-      -D LLVM_LIT_ARGS="${lit_args}"
+  cmake \
+    -D LIBCXX_TEST_PARAMS="std=c++26" \
+    -D LIBCXXABI_TEST_PARAMS="std=c++26" \
+    "${BUILD_DIR}"
 
   echo "--- ninja runtimes C++26"
 
-  ninja -vC "${RUNTIMES_BUILD_DIR}" ${runtime_targets}
+  ninja -C "${BUILD_DIR}" ${runtime_targets}
 
   echo "--- cmake runtimes clang modules"
 
-  # We don't need to do a clean build of runtimes, because LIBCXX_TEST_PARAMS
-  # and LIBCXXABI_TEST_PARAMS only affect lit configuration, which successfully
-  # propagates without a clean build. Other that those two variables, builds
-  # are supposed to be the same.
-
-  cmake -S "${MONOREPO_ROOT}/runtimes" -B "${RUNTIMES_BUILD_DIR}" -GNinja \
-      -D CMAKE_C_COMPILER="${INSTALL_DIR}/bin/clang" \
-      -D CMAKE_CXX_COMPILER="${INSTALL_DIR}/bin/clang++" \
-      -D LLVM_ENABLE_RUNTIMES="${runtimes}" \
-      -D LIBCXX_CXX_ABI=libcxxabi \
-      -D CMAKE_BUILD_TYPE=RelWithDebInfo \
-      -D CMAKE_INSTALL_PREFIX="${INSTALL_DIR}" \
-      -D LIBCXX_TEST_PARAMS="enable_modules=clang" \
-      -D LIBCXXABI_TEST_PARAMS="enable_modules=clang" \
-      -D LLVM_LIT_ARGS="${lit_args}"
+  cmake \
+    -D LIBCXX_TEST_PARAMS="enable_modules=clang" \
+    -D LIBCXXABI_TEST_PARAMS="enable_modules=clang" \
+    "${BUILD_DIR}"
 
   echo "--- ninja runtimes clang modules"
 
-  ninja -vC "${RUNTIMES_BUILD_DIR}" ${runtime_targets}
+  ninja -C "${BUILD_DIR}" ${runtime_targets}
 fi
diff --git a/libcxx/test/libcxx/containers/views/mdspan/extents/assert.conversion.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/extents/assert.conversion.pass.cpp
index 31766e4c51c3b..6ac70d9bd63df 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/extents/assert.conversion.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/extents/assert.conversion.pass.cpp
@@ -30,6 +30,7 @@
 //          (((Extents != dynamic_extent) && (OtherExtents == dynamic_extent)) || ... ) ||
 //          (numeric_limits<index_type>::max() < numeric_limits<OtherIndexType>::max())
 
+#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_array.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_array.pass.cpp
index 90cb0c84a063b..fc52424eacdf2 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_array.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_array.pass.cpp
@@ -30,6 +30,7 @@
 //       for every rank index r.
 //
 
+#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_integral.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_integral.pass.cpp
index 37e79aabf8532..2fc57a35dacad 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_integral.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_integral.pass.cpp
@@ -32,6 +32,7 @@
 //     - each element of exts is nonnegative and is representable as a value of type index_type.
 //
 
+#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_span.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_span.pass.cpp
index 5bf5143590180..4c3f0a7c5cc70 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_span.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_span.pass.cpp
@@ -28,6 +28,7 @@
 //       for every rank index r.
 //
 
+#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/extents/assert.obs.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/extents/assert.obs.pass.cpp
index c473879d87b71..980d9889187a6 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/extents/assert.obs.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/extents/assert.obs.pass.cpp
@@ -24,6 +24,7 @@
 //
 //   Returns: Di.
 
+#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.conversion.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.conversion.pass.cpp
index 7b6616f19d724..bf7a4fd398bcd 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.conversion.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.conversion.pass.cpp
@@ -21,6 +21,7 @@
 //
 // Preconditions: other.required_span_size() is representable as a value of type index_type.
 
+#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.extents.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.extents.pass.cpp
index 7c96f8ec9353f..8a1cf24221f8e 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.extents.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.extents.pass.cpp
@@ -19,6 +19,7 @@
 //
 // Effects: Direct-non-list-initializes extents_ with e.
 
+#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.layout_right.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.layout_right.pass.cpp
index e578bac2103b0..310b91e593cd8 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.layout_right.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.layout_right.pass.cpp
@@ -23,6 +23,7 @@
 //
 // Preconditions: other.required_span_size() is representable as a value of type index_type
 
+#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.layout_stride.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.layout_stride.pass.cpp
index cec8df8aba8d6..5e9c4f15133c9 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.layout_stride.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.layout_stride.pass.cpp
@@ -32,6 +32,7 @@
 //
 // Effects: Direct-non-list-initializes extents_ with other.extents().
 
+#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.conversion.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.conversion.pass.cpp
index df16edb925407..5fa6cc949e571 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.conversion.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.conversion.pass.cpp
@@ -21,6 +21,7 @@
 //
 // Preconditions: other.required_span_size() is representable as a value of type index_type.
 
+#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.extents.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.extents.pass.cpp
index 52095691f6d24..a2aa0be0102ca 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.extents.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.extents.pass.cpp
@@ -19,6 +19,7 @@
 //
 // Effects: Direct-non-list-initializes extents_ with e.
 
+#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.layout_left.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.layout_left.pass.cpp
index 1757ddb286b9c..79ee49e7a925c 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.layout_left.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.layout_left.pass.cpp
@@ -23,6 +23,7 @@
 //
 // Preconditions: other.required_span_size() is representable as a value of type index_type
 
+#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.layout_stride.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.layout_stride.pass.cpp
index b77d964540f9d..fa83d6087ec85 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.layout_stride.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.layout_stride.pass.cpp
@@ -32,6 +32,7 @@
 //
 // Effects: Direct-non-list-initializes extents_ with other.extents().
 
+#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/layout_stride/assert.ctor.extents_array.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/layout_stride/assert.ctor.extents_array.pass.cpp
index 6782a9789f89f..0ba5ffb47c7ea 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/layout_stride/assert.ctor.extents_array.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/layout_stride/assert.ctor.extents_array.pass.cpp
@@ -30,6 +30,7 @@
 //
 // Effects: Direct-non-list-initializes extents_ with e, and for all d in the range [0, rank_), direct-non-list-initializes strides_[d] with as_const(s[d]).
 
+#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/layout_stride/assert.ctor.extents_span.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/layout_stride/assert.ctor.extents_span.pass.cpp
index 74e4793c91372..f8e7ddc8b5770 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/layout_stride/assert.ctor.extents_span.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/layout_stride/assert.ctor.extents_span.pass.cpp
@@ -30,6 +30,7 @@
 //
 // Effects: Direct-non-list-initializes extents_ with e, and for all d in the range [0, rank_), direct-non-list-initializes strides_[d] with as_const(s[d]).
 
+#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 

>From 360e723b51ee201603f72b56859cd7c6d6faec24 Mon Sep 17 00:00:00 2001
From: Aiden Grossman <aidengrossman at google.com>
Date: Thu, 5 Jun 2025 06:51:37 +0000
Subject: [PATCH 2/7] feedback

Created using spr 1.3.4
---
 .ci/compute_projects.py | 17 +++++------------
 1 file changed, 5 insertions(+), 12 deletions(-)

diff --git a/.ci/compute_projects.py b/.ci/compute_projects.py
index b12b729eadd3f..8134e1e2c29fb 100644
--- a/.ci/compute_projects.py
+++ b/.ci/compute_projects.py
@@ -145,22 +145,15 @@ def _add_dependencies(projects: Set[str], runtimes: Set[str]) -> Set[str]:
 
 
 def _exclude_projects(current_projects: Set[str], platform: str) -> Set[str]:
-    new_project_set = set(current_projects)
     if platform == "Linux":
-        for to_exclude in EXCLUDE_LINUX:
-            if to_exclude in new_project_set:
-                new_project_set.remove(to_exclude)
+        to_exclude = EXCLUDE_LINUX
     elif platform == "Windows":
-        for to_exclude in EXCLUDE_WINDOWS:
-            if to_exclude in new_project_set:
-                new_project_set.remove(to_exclude)
+        to_exclude = EXCLUDE_WINDOWS
     elif platform == "Darwin":
-        for to_exclude in EXCLUDE_MAC:
-            if to_exclude in new_project_set:
-                new_project_set.remove(to_exclude)
+        to_exclude = EXCLUDE_MAC
     else:
-        raise ValueError("Unexpected platform.")
-    return new_project_set
+        raise ValueError(f"Unexpected platform: {platform}")
+    return current_projects.difference(to_exclude)
 
 
 def _compute_projects_to_test(modified_projects: Set[str], platform: str) -> Set[str]:

>From 4d278b5cc46ce5781deb6063a8ff16ee380d21e2 Mon Sep 17 00:00:00 2001
From: Aiden Grossman <aidengrossman at google.com>
Date: Thu, 5 Jun 2025 08:38:10 +0000
Subject: [PATCH 3/7] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20ch?=
 =?UTF-8?q?anges=20introduced=20through=20rebase?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Created using spr 1.3.4

[skip ci]
---
 libcxx/include/mdspan                                           | 1 +
 .../containers/views/mdspan/extents/assert.conversion.pass.cpp  | 1 -
 .../views/mdspan/extents/assert.ctor_from_array.pass.cpp        | 1 -
 .../views/mdspan/extents/assert.ctor_from_integral.pass.cpp     | 1 -
 .../views/mdspan/extents/assert.ctor_from_span.pass.cpp         | 2 +-
 .../libcxx/containers/views/mdspan/extents/assert.obs.pass.cpp  | 1 -
 .../views/mdspan/layout_left/assert.conversion.pass.cpp         | 1 -
 .../views/mdspan/layout_left/assert.ctor.extents.pass.cpp       | 1 -
 .../views/mdspan/layout_left/assert.ctor.layout_right.pass.cpp  | 1 -
 .../views/mdspan/layout_left/assert.ctor.layout_stride.pass.cpp | 1 -
 .../views/mdspan/layout_right/assert.conversion.pass.cpp        | 1 -
 .../views/mdspan/layout_right/assert.ctor.extents.pass.cpp      | 1 -
 .../views/mdspan/layout_right/assert.ctor.layout_left.pass.cpp  | 1 -
 .../mdspan/layout_right/assert.ctor.layout_stride.pass.cpp      | 1 -
 .../mdspan/layout_stride/assert.ctor.extents_array.pass.cpp     | 2 +-
 .../mdspan/layout_stride/assert.ctor.extents_span.pass.cpp      | 2 +-
 libcxx/test/std/containers/views/mdspan/CustomTestLayouts.h     | 1 -
 .../std/containers/views/mdspan/extents/comparison.pass.cpp     | 1 -
 .../std/containers/views/mdspan/extents/conversion.pass.cpp     | 1 -
 libcxx/test/std/containers/views/mdspan/extents/ctad.pass.cpp   | 1 -
 .../test/std/containers/views/mdspan/extents/dextents.pass.cpp  | 1 -
 libcxx/test/std/containers/views/mdspan/extents/dims.pass.cpp   | 1 -
 .../std/containers/views/mdspan/extents/index_type.verify.cpp   | 1 -
 .../std/containers/views/mdspan/extents/obs_static.pass.cpp     | 1 -
 libcxx/test/std/containers/views/mdspan/extents/types.pass.cpp  | 1 -
 .../std/containers/views/mdspan/layout_left/comparison.pass.cpp | 1 -
 .../containers/views/mdspan/layout_left/ctor.default.pass.cpp   | 1 -
 .../containers/views/mdspan/layout_left/ctor.extents.pass.cpp   | 1 -
 .../views/mdspan/layout_left/ctor.layout_right.pass.cpp         | 1 -
 .../views/mdspan/layout_left/ctor.layout_stride.pass.cpp        | 1 -
 .../containers/views/mdspan/layout_left/ctor.mapping.pass.cpp   | 1 -
 .../containers/views/mdspan/layout_left/index_operator.pass.cpp | 1 -
 .../std/containers/views/mdspan/layout_left/properties.pass.cpp | 1 -
 .../views/mdspan/layout_left/required_span_size.pass.cpp        | 1 -
 .../views/mdspan/layout_left/static_requirements.pass.cpp       | 1 -
 .../std/containers/views/mdspan/layout_left/stride.pass.cpp     | 1 -
 .../containers/views/mdspan/layout_right/comparison.pass.cpp    | 1 -
 .../containers/views/mdspan/layout_right/ctor.default.pass.cpp  | 1 -
 .../containers/views/mdspan/layout_right/ctor.extents.pass.cpp  | 1 -
 .../views/mdspan/layout_right/ctor.layout_left.pass.cpp         | 1 -
 .../views/mdspan/layout_right/ctor.layout_stride.pass.cpp       | 1 -
 .../containers/views/mdspan/layout_right/ctor.mapping.pass.cpp  | 1 -
 .../views/mdspan/layout_right/index_operator.pass.cpp           | 1 -
 .../containers/views/mdspan/layout_right/properties.pass.cpp    | 1 -
 .../views/mdspan/layout_right/required_span_size.pass.cpp       | 1 -
 .../views/mdspan/layout_right/static_requirements.pass.cpp      | 1 -
 .../std/containers/views/mdspan/layout_right/stride.pass.cpp    | 1 -
 .../containers/views/mdspan/layout_stride/comparison.pass.cpp   | 1 -
 .../containers/views/mdspan/layout_stride/ctor.default.pass.cpp | 1 -
 .../views/mdspan/layout_stride/ctor.extents_array.pass.cpp      | 1 -
 .../views/mdspan/layout_stride/ctor.strided_mapping.pass.cpp    | 1 -
 .../views/mdspan/layout_stride/index_operator.pass.cpp          | 1 -
 .../mdspan/layout_stride/is_exhaustive_corner_case.pass.cpp     | 1 -
 .../containers/views/mdspan/layout_stride/properties.pass.cpp   | 1 -
 .../views/mdspan/layout_stride/required_span_size.pass.cpp      | 1 -
 .../views/mdspan/layout_stride/static_requirements.pass.cpp     | 1 -
 .../std/containers/views/mdspan/layout_stride/stride.pass.cpp   | 1 -
 libcxx/test/std/containers/views/mdspan/mdspan/assign.pass.cpp  | 1 -
 .../test/std/containers/views/mdspan/mdspan/conversion.pass.cpp | 1 -
 .../test/std/containers/views/mdspan/mdspan/ctor.copy.pass.cpp  | 1 -
 .../std/containers/views/mdspan/mdspan/ctor.default.pass.cpp    | 1 -
 .../std/containers/views/mdspan/mdspan/ctor.dh_array.pass.cpp   | 1 -
 .../std/containers/views/mdspan/mdspan/ctor.dh_extents.pass.cpp | 1 -
 .../containers/views/mdspan/mdspan/ctor.dh_integers.pass.cpp    | 1 -
 .../std/containers/views/mdspan/mdspan/ctor.dh_map.pass.cpp     | 1 -
 .../std/containers/views/mdspan/mdspan/ctor.dh_map_acc.pass.cpp | 1 -
 .../test/std/containers/views/mdspan/mdspan/ctor.move.pass.cpp  | 1 -
 libcxx/test/std/containers/views/mdspan/mdspan/move.pass.cpp    | 1 -
 .../test/std/containers/views/mdspan/mdspan/properties.pass.cpp | 1 -
 libcxx/test/std/containers/views/mdspan/mdspan/swap.pass.cpp    | 1 -
 libcxx/test/std/containers/views/mdspan/mdspan/types.pass.cpp   | 1 -
 71 files changed, 4 insertions(+), 70 deletions(-)

diff --git a/libcxx/include/mdspan b/libcxx/include/mdspan
index 43982e0f339b8..06d2fb6fcd026 100644
--- a/libcxx/include/mdspan
+++ b/libcxx/include/mdspan
@@ -450,6 +450,7 @@ namespace std {
 #  include <__config>
 
 #  if _LIBCPP_STD_VER >= 23
+#    include <__fwd/span.h>
 #    include <__fwd/mdspan.h>
 #    include <__mdspan/default_accessor.h>
 #    include <__mdspan/extents.h>
diff --git a/libcxx/test/libcxx/containers/views/mdspan/extents/assert.conversion.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/extents/assert.conversion.pass.cpp
index 6ac70d9bd63df..31766e4c51c3b 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/extents/assert.conversion.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/extents/assert.conversion.pass.cpp
@@ -30,7 +30,6 @@
 //          (((Extents != dynamic_extent) && (OtherExtents == dynamic_extent)) || ... ) ||
 //          (numeric_limits<index_type>::max() < numeric_limits<OtherIndexType>::max())
 
-#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_array.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_array.pass.cpp
index fc52424eacdf2..90cb0c84a063b 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_array.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_array.pass.cpp
@@ -30,7 +30,6 @@
 //       for every rank index r.
 //
 
-#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_integral.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_integral.pass.cpp
index 2fc57a35dacad..37e79aabf8532 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_integral.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_integral.pass.cpp
@@ -32,7 +32,6 @@
 //     - each element of exts is nonnegative and is representable as a value of type index_type.
 //
 
-#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_span.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_span.pass.cpp
index 4c3f0a7c5cc70..041a0f2f42f00 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_span.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/extents/assert.ctor_from_span.pass.cpp
@@ -28,7 +28,7 @@
 //       for every rank index r.
 //
 
-#include <span> // dynamic_extent
+#include <span>
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/extents/assert.obs.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/extents/assert.obs.pass.cpp
index 980d9889187a6..c473879d87b71 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/extents/assert.obs.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/extents/assert.obs.pass.cpp
@@ -24,7 +24,6 @@
 //
 //   Returns: Di.
 
-#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.conversion.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.conversion.pass.cpp
index bf7a4fd398bcd..7b6616f19d724 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.conversion.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.conversion.pass.cpp
@@ -21,7 +21,6 @@
 //
 // Preconditions: other.required_span_size() is representable as a value of type index_type.
 
-#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.extents.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.extents.pass.cpp
index 8a1cf24221f8e..7c96f8ec9353f 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.extents.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.extents.pass.cpp
@@ -19,7 +19,6 @@
 //
 // Effects: Direct-non-list-initializes extents_ with e.
 
-#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.layout_right.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.layout_right.pass.cpp
index 310b91e593cd8..e578bac2103b0 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.layout_right.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.layout_right.pass.cpp
@@ -23,7 +23,6 @@
 //
 // Preconditions: other.required_span_size() is representable as a value of type index_type
 
-#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.layout_stride.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.layout_stride.pass.cpp
index 5e9c4f15133c9..cec8df8aba8d6 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.layout_stride.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/layout_left/assert.ctor.layout_stride.pass.cpp
@@ -32,7 +32,6 @@
 //
 // Effects: Direct-non-list-initializes extents_ with other.extents().
 
-#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.conversion.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.conversion.pass.cpp
index 5fa6cc949e571..df16edb925407 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.conversion.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.conversion.pass.cpp
@@ -21,7 +21,6 @@
 //
 // Preconditions: other.required_span_size() is representable as a value of type index_type.
 
-#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.extents.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.extents.pass.cpp
index a2aa0be0102ca..52095691f6d24 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.extents.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.extents.pass.cpp
@@ -19,7 +19,6 @@
 //
 // Effects: Direct-non-list-initializes extents_ with e.
 
-#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.layout_left.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.layout_left.pass.cpp
index 79ee49e7a925c..1757ddb286b9c 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.layout_left.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.layout_left.pass.cpp
@@ -23,7 +23,6 @@
 //
 // Preconditions: other.required_span_size() is representable as a value of type index_type
 
-#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.layout_stride.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.layout_stride.pass.cpp
index fa83d6087ec85..b77d964540f9d 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.layout_stride.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/layout_right/assert.ctor.layout_stride.pass.cpp
@@ -32,7 +32,6 @@
 //
 // Effects: Direct-non-list-initializes extents_ with other.extents().
 
-#include <span> // dynamic_extent
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/layout_stride/assert.ctor.extents_array.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/layout_stride/assert.ctor.extents_array.pass.cpp
index 0ba5ffb47c7ea..50536dfde122f 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/layout_stride/assert.ctor.extents_array.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/layout_stride/assert.ctor.extents_array.pass.cpp
@@ -30,7 +30,7 @@
 //
 // Effects: Direct-non-list-initializes extents_ with e, and for all d in the range [0, rank_), direct-non-list-initializes strides_[d] with as_const(s[d]).
 
-#include <span> // dynamic_extent
+#include <span>
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/libcxx/containers/views/mdspan/layout_stride/assert.ctor.extents_span.pass.cpp b/libcxx/test/libcxx/containers/views/mdspan/layout_stride/assert.ctor.extents_span.pass.cpp
index f8e7ddc8b5770..be9da6e2089a6 100644
--- a/libcxx/test/libcxx/containers/views/mdspan/layout_stride/assert.ctor.extents_span.pass.cpp
+++ b/libcxx/test/libcxx/containers/views/mdspan/layout_stride/assert.ctor.extents_span.pass.cpp
@@ -30,7 +30,7 @@
 //
 // Effects: Direct-non-list-initializes extents_ with e, and for all d in the range [0, rank_), direct-non-list-initializes strides_[d] with as_const(s[d]).
 
-#include <span> // dynamic_extent
+#include <span>
 #include <mdspan>
 #include <cassert>
 
diff --git a/libcxx/test/std/containers/views/mdspan/CustomTestLayouts.h b/libcxx/test/std/containers/views/mdspan/CustomTestLayouts.h
index 7cd42139758e3..588a5e9774a55 100644
--- a/libcxx/test/std/containers/views/mdspan/CustomTestLayouts.h
+++ b/libcxx/test/std/containers/views/mdspan/CustomTestLayouts.h
@@ -25,7 +25,6 @@
 #include <cstddef>
 #include <limits>
 #include <mdspan>
-#include <span> // dynamic_extent
 #include <type_traits>
 #include <utility>
 
diff --git a/libcxx/test/std/containers/views/mdspan/extents/comparison.pass.cpp b/libcxx/test/std/containers/views/mdspan/extents/comparison.pass.cpp
index 1d713044e60f7..65bb5475353d3 100644
--- a/libcxx/test/std/containers/views/mdspan/extents/comparison.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/extents/comparison.pass.cpp
@@ -20,7 +20,6 @@
 #include <cassert>
 #include <cstddef>
 #include <mdspan>
-#include <span> // dynamic_extent
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/containers/views/mdspan/extents/conversion.pass.cpp b/libcxx/test/std/containers/views/mdspan/extents/conversion.pass.cpp
index 7baaa7ec9898e..4b6b1a63b80f9 100644
--- a/libcxx/test/std/containers/views/mdspan/extents/conversion.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/extents/conversion.pass.cpp
@@ -32,7 +32,6 @@
 #include <cstddef>
 #include <limits>
 #include <mdspan>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 template <class To, class From>
diff --git a/libcxx/test/std/containers/views/mdspan/extents/ctad.pass.cpp b/libcxx/test/std/containers/views/mdspan/extents/ctad.pass.cpp
index 82f111153ce6a..b72c3e050b1f9 100644
--- a/libcxx/test/std/containers/views/mdspan/extents/ctad.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/extents/ctad.pass.cpp
@@ -19,7 +19,6 @@
 #include <cassert>
 #include <cstddef>
 #include <mdspan>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "../ConvertibleToIntegral.h"
diff --git a/libcxx/test/std/containers/views/mdspan/extents/dextents.pass.cpp b/libcxx/test/std/containers/views/mdspan/extents/dextents.pass.cpp
index 2adfa49d3bc47..a9fc8f3bed074 100644
--- a/libcxx/test/std/containers/views/mdspan/extents/dextents.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/extents/dextents.pass.cpp
@@ -18,7 +18,6 @@
 
 #include <mdspan>
 #include <cstddef>
-#include <span> // dynamic_extent
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/containers/views/mdspan/extents/dims.pass.cpp b/libcxx/test/std/containers/views/mdspan/extents/dims.pass.cpp
index 0476c11efdb64..e74bc0e66fca1 100644
--- a/libcxx/test/std/containers/views/mdspan/extents/dims.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/extents/dims.pass.cpp
@@ -18,7 +18,6 @@
 
 #include <mdspan>
 #include <cstddef>
-#include <span> // dynamic_extent
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/containers/views/mdspan/extents/index_type.verify.cpp b/libcxx/test/std/containers/views/mdspan/extents/index_type.verify.cpp
index cdc0464251419..ba6941a1ab4c1 100644
--- a/libcxx/test/std/containers/views/mdspan/extents/index_type.verify.cpp
+++ b/libcxx/test/std/containers/views/mdspan/extents/index_type.verify.cpp
@@ -19,7 +19,6 @@
 #include <cstddef>
 #include <climits>
 #include <mdspan>
-#include <span> // dynamic_extent
 
 void invalid_index_types() {
   // expected-error@*:* {{static assertion failed: extents::index_type must be a signed or unsigned integer type}}
diff --git a/libcxx/test/std/containers/views/mdspan/extents/obs_static.pass.cpp b/libcxx/test/std/containers/views/mdspan/extents/obs_static.pass.cpp
index 1d5f61d02e4ff..12d5e5a85f64e 100644
--- a/libcxx/test/std/containers/views/mdspan/extents/obs_static.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/extents/obs_static.pass.cpp
@@ -29,7 +29,6 @@
 #include <cassert>
 #include <cstddef>
 #include <mdspan>
-#include <span> // dynamic_extent
 #include <utility>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/extents/types.pass.cpp b/libcxx/test/std/containers/views/mdspan/extents/types.pass.cpp
index 10bc769473951..5b28a58e06c47 100644
--- a/libcxx/test/std/containers/views/mdspan/extents/types.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/extents/types.pass.cpp
@@ -26,7 +26,6 @@
 #include <concepts>
 #include <cstddef>
 #include <mdspan>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/layout_left/comparison.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_left/comparison.pass.cpp
index 151da5ba61740..6db8fa48f5def 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_left/comparison.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_left/comparison.pass.cpp
@@ -18,7 +18,6 @@
 #include <cassert>
 #include <cstddef>
 #include <mdspan>
-#include <span> // dynamic_extent
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/containers/views/mdspan/layout_left/ctor.default.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_left/ctor.default.pass.cpp
index 12c59a4caf10e..7fb657e9debb3 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_left/ctor.default.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_left/ctor.default.pass.cpp
@@ -18,7 +18,6 @@
 #include <cstddef>
 #include <cstdint>
 #include <mdspan>
-#include <span> // dynamic_extent
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/containers/views/mdspan/layout_left/ctor.extents.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_left/ctor.extents.pass.cpp
index 299012dc5af84..c13775c8ba75f 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_left/ctor.extents.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_left/ctor.extents.pass.cpp
@@ -21,7 +21,6 @@
 #include <cstddef>
 #include <cstdint>
 #include <mdspan>
-#include <span> // dynamic_extent
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/containers/views/mdspan/layout_left/ctor.layout_right.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_left/ctor.layout_right.pass.cpp
index 1e8f8fb54d5ef..f7ea39acf0179 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_left/ctor.layout_right.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_left/ctor.layout_right.pass.cpp
@@ -24,7 +24,6 @@
 #include <cstddef>
 #include <limits>
 #include <mdspan>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/layout_left/ctor.layout_stride.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_left/ctor.layout_stride.pass.cpp
index 1668c26a697d4..cbd759eaf72cb 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_left/ctor.layout_stride.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_left/ctor.layout_stride.pass.cpp
@@ -27,7 +27,6 @@
 #include <cassert>
 #include <cstddef>
 #include <mdspan>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/layout_left/ctor.mapping.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_left/ctor.mapping.pass.cpp
index 737e5f3d25728..28749327033aa 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_left/ctor.mapping.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_left/ctor.mapping.pass.cpp
@@ -22,7 +22,6 @@
 #include <cstddef>
 #include <limits>
 #include <mdspan>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/layout_left/index_operator.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_left/index_operator.pass.cpp
index 75fd37055ad60..55d9539d8c63f 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_left/index_operator.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_left/index_operator.pass.cpp
@@ -27,7 +27,6 @@
 #include <cstddef>
 #include <cstdint>
 #include <mdspan>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/layout_left/properties.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_left/properties.pass.cpp
index 32442ecd5a0e6..e252e0ec73a78 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_left/properties.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_left/properties.pass.cpp
@@ -29,7 +29,6 @@
 #include <cassert>
 #include <cstddef>
 #include <mdspan>
-#include <span> // dynamic_extent
 #include <utility>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/layout_left/required_span_size.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_left/required_span_size.pass.cpp
index 9ad61b0799c15..174c9633c2677 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_left/required_span_size.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_left/required_span_size.pass.cpp
@@ -18,7 +18,6 @@
 #include <cstddef>
 #include <cstdint>
 #include <mdspan>
-#include <span> // dynamic_extent
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/containers/views/mdspan/layout_left/static_requirements.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_left/static_requirements.pass.cpp
index 6410fecdab59e..7b42e5045854a 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_left/static_requirements.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_left/static_requirements.pass.cpp
@@ -79,7 +79,6 @@
 #include <cassert>
 #include <cstddef>
 #include <mdspan>
-#include <span> // dynamic_extent
 #include <type_traits>
 #include <utility>
 
diff --git a/libcxx/test/std/containers/views/mdspan/layout_left/stride.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_left/stride.pass.cpp
index 064c279bcc49f..0b1f9f57ecabf 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_left/stride.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_left/stride.pass.cpp
@@ -23,7 +23,6 @@
 #include <cassert>
 #include <cstdint>
 #include <cstdio>
-#include <span> // dynamic_extent
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/containers/views/mdspan/layout_right/comparison.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_right/comparison.pass.cpp
index a65d7d39db8e2..bcf26e0f53866 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_right/comparison.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_right/comparison.pass.cpp
@@ -18,7 +18,6 @@
 #include <cassert>
 #include <cstddef>
 #include <mdspan>
-#include <span> // dynamic_extent
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/containers/views/mdspan/layout_right/ctor.default.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_right/ctor.default.pass.cpp
index d644b0ff18d82..1ef377191404f 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_right/ctor.default.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_right/ctor.default.pass.cpp
@@ -18,7 +18,6 @@
 #include <cstddef>
 #include <cstdint>
 #include <mdspan>
-#include <span> // dynamic_extent
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/containers/views/mdspan/layout_right/ctor.extents.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_right/ctor.extents.pass.cpp
index cd0cff838fac5..5579e5a0d3030 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_right/ctor.extents.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_right/ctor.extents.pass.cpp
@@ -21,7 +21,6 @@
 #include <cstddef>
 #include <cstdint>
 #include <mdspan>
-#include <span> // dynamic_extent
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/containers/views/mdspan/layout_right/ctor.layout_left.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_right/ctor.layout_left.pass.cpp
index 994d98a803211..8f49b37732616 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_right/ctor.layout_left.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_right/ctor.layout_left.pass.cpp
@@ -24,7 +24,6 @@
 #include <cstddef>
 #include <limits>
 #include <mdspan>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/layout_right/ctor.layout_stride.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_right/ctor.layout_stride.pass.cpp
index 89321f860dc3a..5886eba9d15ee 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_right/ctor.layout_stride.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_right/ctor.layout_stride.pass.cpp
@@ -27,7 +27,6 @@
 #include <cassert>
 #include <cstddef>
 #include <mdspan>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/layout_right/ctor.mapping.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_right/ctor.mapping.pass.cpp
index ee00c688301ef..7a08f694f3103 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_right/ctor.mapping.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_right/ctor.mapping.pass.cpp
@@ -22,7 +22,6 @@
 #include <cstddef>
 #include <limits>
 #include <mdspan>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/layout_right/index_operator.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_right/index_operator.pass.cpp
index e9362ed50df24..4623af7fb5b76 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_right/index_operator.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_right/index_operator.pass.cpp
@@ -27,7 +27,6 @@
 #include <cstddef>
 #include <cstdint>
 #include <mdspan>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/layout_right/properties.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_right/properties.pass.cpp
index 857ec3cb05835..29204775c5f5c 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_right/properties.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_right/properties.pass.cpp
@@ -29,7 +29,6 @@
 #include <cassert>
 #include <cstddef>
 #include <mdspan>
-#include <span> // dynamic_extent
 #include <utility>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/layout_right/required_span_size.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_right/required_span_size.pass.cpp
index 2ffd1f41f9638..d19dccfe23aa2 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_right/required_span_size.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_right/required_span_size.pass.cpp
@@ -18,7 +18,6 @@
 #include <cstddef>
 #include <cstdint>
 #include <mdspan>
-#include <span> // dynamic_extent
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/containers/views/mdspan/layout_right/static_requirements.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_right/static_requirements.pass.cpp
index b7e01d14532d4..b9add4da42827 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_right/static_requirements.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_right/static_requirements.pass.cpp
@@ -79,7 +79,6 @@
 #include <cassert>
 #include <cstddef>
 #include <mdspan>
-#include <span> // dynamic_extent
 #include <type_traits>
 #include <utility>
 
diff --git a/libcxx/test/std/containers/views/mdspan/layout_right/stride.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_right/stride.pass.cpp
index c04f07847c0be..7784c572e9cfe 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_right/stride.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_right/stride.pass.cpp
@@ -23,7 +23,6 @@
 #include <cassert>
 #include <cstdint>
 #include <cstdio>
-#include <span> // dynamic_extent
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/containers/views/mdspan/layout_stride/comparison.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_stride/comparison.pass.cpp
index 7c9b4a4ded34d..37e20a3061f5f 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_stride/comparison.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_stride/comparison.pass.cpp
@@ -25,7 +25,6 @@
 #include <mdspan>
 #include <cassert>
 #include <concepts>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/layout_stride/ctor.default.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_stride/ctor.default.pass.cpp
index 055986d80c726..27843805d91ba 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_stride/ctor.default.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_stride/ctor.default.pass.cpp
@@ -24,7 +24,6 @@
 #include <cstddef>
 #include <cstdint>
 #include <mdspan>
-#include <span> // dynamic_extent
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/containers/views/mdspan/layout_stride/ctor.extents_array.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_stride/ctor.extents_array.pass.cpp
index bbda6d4a73631..380c5eb90c033 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_stride/ctor.extents_array.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_stride/ctor.extents_array.pass.cpp
@@ -32,7 +32,6 @@
 #include <cstddef>
 #include <cstdint>
 #include <mdspan>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/layout_stride/ctor.strided_mapping.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_stride/ctor.strided_mapping.pass.cpp
index 6ba67ea2d0122..66946d2b77b65 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_stride/ctor.strided_mapping.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_stride/ctor.strided_mapping.pass.cpp
@@ -38,7 +38,6 @@
 #include <mdspan>
 #include <cassert>
 #include <limits>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/layout_stride/index_operator.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_stride/index_operator.pass.cpp
index 5669991b8a13a..b483885049a7b 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_stride/index_operator.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_stride/index_operator.pass.cpp
@@ -27,7 +27,6 @@
 #include <array>
 #include <cassert>
 #include <cstdint>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/layout_stride/is_exhaustive_corner_case.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_stride/is_exhaustive_corner_case.pass.cpp
index 9f51cc01cf9df..900adb42096a7 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_stride/is_exhaustive_corner_case.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_stride/is_exhaustive_corner_case.pass.cpp
@@ -23,7 +23,6 @@
 #include <cassert>
 #include <cstddef>
 #include <mdspan>
-#include <span> // dynamic_extent
 
 template <class E>
 constexpr void
diff --git a/libcxx/test/std/containers/views/mdspan/layout_stride/properties.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_stride/properties.pass.cpp
index eac1029882e3a..21ce56fcc65f1 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_stride/properties.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_stride/properties.pass.cpp
@@ -43,7 +43,6 @@
 #include <concepts>
 #include <cstddef>
 #include <mdspan>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/layout_stride/required_span_size.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_stride/required_span_size.pass.cpp
index 629849646bb22..cf1685f6676f9 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_stride/required_span_size.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_stride/required_span_size.pass.cpp
@@ -24,7 +24,6 @@
 #include <cstddef>
 #include <cstdint>
 #include <mdspan>
-#include <span> // dynamic_extent
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/containers/views/mdspan/layout_stride/static_requirements.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_stride/static_requirements.pass.cpp
index 8131ecde5d769..1c31421424b1b 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_stride/static_requirements.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_stride/static_requirements.pass.cpp
@@ -79,7 +79,6 @@
 #include <cassert>
 #include <cstddef>
 #include <mdspan>
-#include <span> // dynamic_extent
 #include <type_traits>
 #include <utility>
 
diff --git a/libcxx/test/std/containers/views/mdspan/layout_stride/stride.pass.cpp b/libcxx/test/std/containers/views/mdspan/layout_stride/stride.pass.cpp
index 2f16b1f6ec9aa..8c462af54e009 100644
--- a/libcxx/test/std/containers/views/mdspan/layout_stride/stride.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/layout_stride/stride.pass.cpp
@@ -23,7 +23,6 @@
 #include <cassert>
 #include <cstdint>
 #include <cstdio>
-#include <span> // dynamic_extent
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/containers/views/mdspan/mdspan/assign.pass.cpp b/libcxx/test/std/containers/views/mdspan/mdspan/assign.pass.cpp
index e0577aeb2826d..0dc789cc09be7 100644
--- a/libcxx/test/std/containers/views/mdspan/mdspan/assign.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/mdspan/assign.pass.cpp
@@ -14,7 +14,6 @@
 #include <mdspan>
 #include <cassert>
 #include <concepts>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/mdspan/conversion.pass.cpp b/libcxx/test/std/containers/views/mdspan/mdspan/conversion.pass.cpp
index 1adab199b0ca6..63a673f87b415 100644
--- a/libcxx/test/std/containers/views/mdspan/mdspan/conversion.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/mdspan/conversion.pass.cpp
@@ -41,7 +41,6 @@
 #include <mdspan>
 #include <cassert>
 #include <concepts>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/mdspan/ctor.copy.pass.cpp b/libcxx/test/std/containers/views/mdspan/mdspan/ctor.copy.pass.cpp
index b35a4fb832a1a..d00d275b222de 100644
--- a/libcxx/test/std/containers/views/mdspan/mdspan/ctor.copy.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/mdspan/ctor.copy.pass.cpp
@@ -16,7 +16,6 @@
 #include <mdspan>
 #include <cassert>
 #include <concepts>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/mdspan/ctor.default.pass.cpp b/libcxx/test/std/containers/views/mdspan/mdspan/ctor.default.pass.cpp
index f77dbc46285a7..ac7918b331e7c 100644
--- a/libcxx/test/std/containers/views/mdspan/mdspan/ctor.default.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/mdspan/ctor.default.pass.cpp
@@ -24,7 +24,6 @@
 #include <mdspan>
 #include <cassert>
 #include <concepts>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/mdspan/ctor.dh_array.pass.cpp b/libcxx/test/std/containers/views/mdspan/mdspan/ctor.dh_array.pass.cpp
index f9540fd99c991..f4ceb862d66bc 100644
--- a/libcxx/test/std/containers/views/mdspan/mdspan/ctor.dh_array.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/mdspan/ctor.dh_array.pass.cpp
@@ -32,7 +32,6 @@
 #include <cassert>
 #include <concepts>
 #include <mdspan>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/mdspan/ctor.dh_extents.pass.cpp b/libcxx/test/std/containers/views/mdspan/mdspan/ctor.dh_extents.pass.cpp
index 4d9f91f63d54c..4b94dcfed169b 100644
--- a/libcxx/test/std/containers/views/mdspan/mdspan/ctor.dh_extents.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/mdspan/ctor.dh_extents.pass.cpp
@@ -26,7 +26,6 @@
 #include <mdspan>
 #include <cassert>
 #include <concepts>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/mdspan/ctor.dh_integers.pass.cpp b/libcxx/test/std/containers/views/mdspan/mdspan/ctor.dh_integers.pass.cpp
index 381b2d3a8bc2a..ebed92da74138 100644
--- a/libcxx/test/std/containers/views/mdspan/mdspan/ctor.dh_integers.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/mdspan/ctor.dh_integers.pass.cpp
@@ -33,7 +33,6 @@
 #include <cassert>
 #include <concepts>
 #include <mdspan>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/mdspan/ctor.dh_map.pass.cpp b/libcxx/test/std/containers/views/mdspan/mdspan/ctor.dh_map.pass.cpp
index f5e9c1b7e2a4c..2260e679aa288 100644
--- a/libcxx/test/std/containers/views/mdspan/mdspan/ctor.dh_map.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/mdspan/ctor.dh_map.pass.cpp
@@ -24,7 +24,6 @@
 #include <mdspan>
 #include <cassert>
 #include <concepts>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/mdspan/ctor.dh_map_acc.pass.cpp b/libcxx/test/std/containers/views/mdspan/mdspan/ctor.dh_map_acc.pass.cpp
index 3239c1d65deb9..8ca1bf5eafb57 100644
--- a/libcxx/test/std/containers/views/mdspan/mdspan/ctor.dh_map_acc.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/mdspan/ctor.dh_map_acc.pass.cpp
@@ -21,7 +21,6 @@
 #include <mdspan>
 #include <cassert>
 #include <concepts>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/mdspan/ctor.move.pass.cpp b/libcxx/test/std/containers/views/mdspan/mdspan/ctor.move.pass.cpp
index 46ba2b2096c40..71b119567cd33 100644
--- a/libcxx/test/std/containers/views/mdspan/mdspan/ctor.move.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/mdspan/ctor.move.pass.cpp
@@ -16,7 +16,6 @@
 #include <mdspan>
 #include <cassert>
 #include <concepts>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/mdspan/move.pass.cpp b/libcxx/test/std/containers/views/mdspan/mdspan/move.pass.cpp
index 5ce2d06712bf6..70ca0d580ac1e 100644
--- a/libcxx/test/std/containers/views/mdspan/mdspan/move.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/mdspan/move.pass.cpp
@@ -16,7 +16,6 @@
 #include <mdspan>
 #include <cassert>
 #include <concepts>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/mdspan/properties.pass.cpp b/libcxx/test/std/containers/views/mdspan/mdspan/properties.pass.cpp
index 6368acd0b0f41..504af33783721 100644
--- a/libcxx/test/std/containers/views/mdspan/mdspan/properties.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/mdspan/properties.pass.cpp
@@ -54,7 +54,6 @@
 #include <mdspan>
 #include <cassert>
 #include <concepts>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/mdspan/swap.pass.cpp b/libcxx/test/std/containers/views/mdspan/mdspan/swap.pass.cpp
index 47f2abecade8f..3d5de0c49b814 100644
--- a/libcxx/test/std/containers/views/mdspan/mdspan/swap.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/mdspan/swap.pass.cpp
@@ -19,7 +19,6 @@
 #include <mdspan>
 #include <cassert>
 #include <concepts>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/containers/views/mdspan/mdspan/types.pass.cpp b/libcxx/test/std/containers/views/mdspan/mdspan/types.pass.cpp
index 69bce593bd363..b576419828b71 100644
--- a/libcxx/test/std/containers/views/mdspan/mdspan/types.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/mdspan/types.pass.cpp
@@ -30,7 +30,6 @@
 #include <mdspan>
 #include <cassert>
 #include <concepts>
-#include <span> // dynamic_extent
 #include <type_traits>
 
 #include "test_macros.h"

>From b33a541a669b9deb809ee8fca701bcd3a5dc7c9e Mon Sep 17 00:00:00 2001
From: Aiden Grossman <aidengrossman at google.com>
Date: Thu, 5 Jun 2025 08:43:05 +0000
Subject: [PATCH 4/7] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20ch?=
 =?UTF-8?q?anges=20introduced=20through=20rebase?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Created using spr 1.3.4

[skip ci]
---
 libcxx/include/mdspan | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libcxx/include/mdspan b/libcxx/include/mdspan
index 06d2fb6fcd026..32468a128dc9a 100644
--- a/libcxx/include/mdspan
+++ b/libcxx/include/mdspan
@@ -450,8 +450,8 @@ namespace std {
 #  include <__config>
 
 #  if _LIBCPP_STD_VER >= 23
-#    include <__fwd/span.h>
 #    include <__fwd/mdspan.h>
+#    include <__fwd/span.h>
 #    include <__mdspan/default_accessor.h>
 #    include <__mdspan/extents.h>
 #    include <__mdspan/layout_left.h>

>From 26a48b3ba70c829862788335f4b5b610dfd5dd3a Mon Sep 17 00:00:00 2001
From: Aiden Grossman <aidengrossman at google.com>
Date: Thu, 5 Jun 2025 08:55:00 +0000
Subject: [PATCH 5/7] feedback

Created using spr 1.3.4
---
 .ci/compute_projects.py         | 20 ++++++++++----------
 .ci/compute_projects_test.py    | 32 ++++++++++++++++----------------
 .ci/monolithic-linux.sh         |  8 ++++----
 .github/workflows/premerge.yaml |  4 ++--
 4 files changed, 32 insertions(+), 32 deletions(-)

diff --git a/.ci/compute_projects.py b/.ci/compute_projects.py
index 8134e1e2c29fb..50a64cb15a937 100644
--- a/.ci/compute_projects.py
+++ b/.ci/compute_projects.py
@@ -66,7 +66,7 @@
 DEPENDENT_RUNTIMES_TO_TEST = {
     "clang": {"compiler-rt"},
 }
-DEPENDENT_RUNTIMES_TO_TEST_MULTICONFIG = {
+DEPENDENT_RUNTIMES_TO_TEST_NEEDS_RECONFIG = {
     "llvm": {"libcxx", "libcxxabi", "libunwind"},
     "clang": {"libcxx", "libcxxabi", "libunwind"},
     ".ci": {"libcxx", "libcxxabi", "libunwind"},
@@ -201,15 +201,15 @@ def _compute_runtimes_to_test(modified_projects: Set[str], platform: str) -> Set
     return _exclude_projects(runtimes_to_test, platform)
 
 
-def _compute_runtimes_to_test_multiconfig(
+def _compute_runtimes_to_test_needs_reconfig(
     modified_projects: Set[str], platform: str
 ) -> Set[str]:
     runtimes_to_test = set()
     for modified_project in modified_projects:
-        if modified_project not in DEPENDENT_RUNTIMES_TO_TEST_MULTICONFIG:
+        if modified_project not in DEPENDENT_RUNTIMES_TO_TEST_NEEDS_RECONFIG:
             continue
         runtimes_to_test.update(
-            DEPENDENT_RUNTIMES_TO_TEST_MULTICONFIG[modified_project]
+            DEPENDENT_RUNTIMES_TO_TEST_NEEDS_RECONFIG[modified_project]
         )
     return _exclude_projects(runtimes_to_test, platform)
 
@@ -246,17 +246,17 @@ def get_env_variables(modified_files: list[str], platform: str) -> Set[str]:
     modified_projects = _get_modified_projects(modified_files)
     projects_to_test = _compute_projects_to_test(modified_projects, platform)
     runtimes_to_test = _compute_runtimes_to_test(modified_projects, platform)
-    runtimes_to_test_multiconfig = _compute_runtimes_to_test_multiconfig(
+    runtimes_to_test_needs_reconfig = _compute_runtimes_to_test_needs_reconfig(
         modified_projects, platform
     )
     runtimes_to_build = _compute_runtimes_to_build(
-        runtimes_to_test | runtimes_to_test_multiconfig, modified_projects, platform
+        runtimes_to_test | runtimes_to_test_needs_reconfig, modified_projects, platform
     )
     projects_to_build = _compute_projects_to_build(projects_to_test, runtimes_to_build)
     projects_check_targets = _compute_project_check_targets(projects_to_test)
     runtimes_check_targets = _compute_project_check_targets(runtimes_to_test)
-    runtimes_check_targets_multiconfig = _compute_project_check_targets(
-        runtimes_to_test_multiconfig
+    runtimes_check_targets_needs_reconfig = _compute_project_check_targets(
+        runtimes_to_test_needs_reconfig
     )
     # We use a semicolon to separate the projects/runtimes as they get passed
     # to the CMake invocation and thus we need to use the CMake list separator
@@ -267,8 +267,8 @@ def get_env_variables(modified_files: list[str], platform: str) -> Set[str]:
         "project_check_targets": " ".join(sorted(projects_check_targets)),
         "runtimes_to_build": ";".join(sorted(runtimes_to_build)),
         "runtimes_check_targets": " ".join(sorted(runtimes_check_targets)),
-        "runtimes_check_targets_multiconfig": " ".join(
-            sorted(runtimes_check_targets_multiconfig)
+        "runtimes_check_targets_needs_reconfig": " ".join(
+            sorted(runtimes_check_targets_needs_reconfig)
         ),
     }
 
diff --git a/.ci/compute_projects_test.py b/.ci/compute_projects_test.py
index dc57a1a1f3fbc..46abc754f0353 100644
--- a/.ci/compute_projects_test.py
+++ b/.ci/compute_projects_test.py
@@ -29,7 +29,7 @@ def test_llvm(self):
             "",
         )
         self.assertEqual(
-            env_variables["runtimes_check_targets_multiconfig"],
+            env_variables["runtimes_check_targets_needs_reconfig"],
             "check-cxx check-cxxabi check-unwind",
         )
 
@@ -53,7 +53,7 @@ def test_llvm_windows(self):
             "",
         )
         self.assertEqual(
-            env_variables["runtimes_check_targets_multiconfig"],
+            env_variables["runtimes_check_targets_needs_reconfig"],
             "check-cxx check-cxxabi check-unwind",
         )
 
@@ -77,7 +77,7 @@ def test_llvm_mac(self):
             "",
         )
         self.assertEqual(
-            env_variables["runtimes_check_targets_multiconfig"],
+            env_variables["runtimes_check_targets_needs_reconfig"],
             "check-cxx check-cxxabi check-unwind",
         )
 
@@ -101,7 +101,7 @@ def test_clang(self):
             "check-compiler-rt",
         )
         self.assertEqual(
-            env_variables["runtimes_check_targets_multiconfig"],
+            env_variables["runtimes_check_targets_needs_reconfig"],
             "check-cxx check-cxxabi check-unwind",
         )
 
@@ -123,7 +123,7 @@ def test_clang_windows(self):
             "",
         )
         self.assertEqual(
-            env_variables["runtimes_check_targets_multiconfig"],
+            env_variables["runtimes_check_targets_needs_reconfig"],
             "check-cxx check-cxxabi check-unwind",
         )
 
@@ -135,7 +135,7 @@ def test_bolt(self):
         self.assertEqual(env_variables["project_check_targets"], "check-bolt")
         self.assertEqual(env_variables["runtimes_to_build"], "")
         self.assertEqual(env_variables["runtimes_check_targets"], "")
-        self.assertEqual(env_variables["runtimes_check_targets_multiconfig"], "")
+        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")
 
     def test_lldb(self):
         env_variables = compute_projects.get_env_variables(
@@ -145,7 +145,7 @@ def test_lldb(self):
         self.assertEqual(env_variables["project_check_targets"], "check-lldb")
         self.assertEqual(env_variables["runtimes_to_build"], "")
         self.assertEqual(env_variables["runtimes_check_targets"], "")
-        self.assertEqual(env_variables["runtimes_check_targets_multiconfig"], "")
+        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")
 
     def test_mlir(self):
         env_variables = compute_projects.get_env_variables(
@@ -157,7 +157,7 @@ def test_mlir(self):
         )
         self.assertEqual(env_variables["runtimes_to_build"], "")
         self.assertEqual(env_variables["runtimes_check_targets"], "")
-        self.assertEqual(env_variables["runtimes_check_targets_multiconfig"], "")
+        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")
 
     def test_flang(self):
         env_variables = compute_projects.get_env_variables(
@@ -167,7 +167,7 @@ def test_flang(self):
         self.assertEqual(env_variables["project_check_targets"], "check-flang")
         self.assertEqual(env_variables["runtimes_to_build"], "")
         self.assertEqual(env_variables["runtimes_check_targets"], "")
-        self.assertEqual(env_variables["runtimes_check_targets_multiconfig"], "")
+        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")
 
     def test_invalid_subproject(self):
         env_variables = compute_projects.get_env_variables(
@@ -177,7 +177,7 @@ def test_invalid_subproject(self):
         self.assertEqual(env_variables["project_check_targets"], "")
         self.assertEqual(env_variables["runtimes_to_build"], "")
         self.assertEqual(env_variables["runtimes_check_targets"], "")
-        self.assertEqual(env_variables["runtimes_check_targets_multiconfig"], "")
+        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")
 
     def test_top_level_file(self):
         env_variables = compute_projects.get_env_variables(["README.md"], "Linux")
@@ -185,7 +185,7 @@ def test_top_level_file(self):
         self.assertEqual(env_variables["project_check_targets"], "")
         self.assertEqual(env_variables["runtimes_to_build"], "")
         self.assertEqual(env_variables["runtimes_check_targets"], "")
-        self.assertEqual(env_variables["runtimes_check_targets_multiconfig"], "")
+        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")
 
     def test_exclude_runtiems_in_projects(self):
         env_variables = compute_projects.get_env_variables(
@@ -195,7 +195,7 @@ def test_exclude_runtiems_in_projects(self):
         self.assertEqual(env_variables["project_check_targets"], "")
         self.assertEqual(env_variables["runtimes_to_build"], "")
         self.assertEqual(env_variables["runtimes_check_targets"], "")
-        self.assertEqual(env_variables["runtimes_check_targets_multiconfig"], "")
+        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")
 
     def test_exclude_docs(self):
         env_variables = compute_projects.get_env_variables(
@@ -205,7 +205,7 @@ def test_exclude_docs(self):
         self.assertEqual(env_variables["project_check_targets"], "")
         self.assertEqual(env_variables["runtimes_to_build"], "")
         self.assertEqual(env_variables["runtimes_check_targets"], "")
-        self.assertEqual(env_variables["runtimes_check_targets_multiconfig"], "")
+        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")
 
     def test_exclude_gn(self):
         env_variables = compute_projects.get_env_variables(
@@ -215,7 +215,7 @@ def test_exclude_gn(self):
         self.assertEqual(env_variables["project_check_targets"], "")
         self.assertEqual(env_variables["runtimes_to_build"], "")
         self.assertEqual(env_variables["runtimes_check_targets"], "")
-        self.assertEqual(env_variables["runtimes_check_targets_multiconfig"], "")
+        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")
 
     def test_ci(self):
         env_variables = compute_projects.get_env_variables(
@@ -235,7 +235,7 @@ def test_ci(self):
             "",
         )
         self.assertEqual(
-            env_variables["runtimes_check_targets_multiconfig"],
+            env_variables["runtimes_check_targets_needs_reconfig"],
             "check-cxx check-cxxabi check-unwind",
         )
 
@@ -249,7 +249,7 @@ def test_lldb(self):
             env_variables["runtimes_to_build"], "libcxx;libcxxabi;libunwind"
         )
         self.assertEqual(env_variables["runtimes_check_targets"], "")
-        self.assertEqual(env_variables["runtimes_check_targets_multiconfig"], "")
+        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")
 
 
 if __name__ == "__main__":
diff --git a/.ci/monolithic-linux.sh b/.ci/monolithic-linux.sh
index aa558017ae76a..c350a58679140 100755
--- a/.ci/monolithic-linux.sh
+++ b/.ci/monolithic-linux.sh
@@ -57,7 +57,7 @@ projects="${1}"
 targets="${2}"
 runtimes="${3}"
 runtime_targets="${4}"
-runtime_targets_multiconfig="${5}"
+runtime_targets_needs_reconfig="${5}"
 
 lit_args="-v --xunit-xml-output ${BUILD_DIR}/test-results.xml --use-unique-output-file-name --timeout=1200 --time-tests"
 
@@ -102,7 +102,7 @@ fi
 
 # Compiling runtimes with just-built Clang and running their tests
 # as an additional testing for Clang.
-if [[ "${runtime_targets_multiconfig}" != "" ]]; then
+if [[ "${runtime_targets_needs_reconfig}" != "" ]]; then
   echo "--- cmake runtimes C++26"
 
   cmake \
@@ -112,7 +112,7 @@ if [[ "${runtime_targets_multiconfig}" != "" ]]; then
 
   echo "--- ninja runtimes C++26"
 
-  ninja -C "${BUILD_DIR}" ${runtime_targets_multiconfig}
+  ninja -C "${BUILD_DIR}" ${runtime_targets_needs_reconfig}
 
   echo "--- cmake runtimes clang modules"
 
@@ -123,5 +123,5 @@ if [[ "${runtime_targets_multiconfig}" != "" ]]; then
 
   echo "--- ninja runtimes clang modules"
 
-  ninja -C "${BUILD_DIR}" ${runtime_targets_multiconfig}
+  ninja -C "${BUILD_DIR}" ${runtime_targets_needs_reconfig}
 fi
diff --git a/.github/workflows/premerge.yaml b/.github/workflows/premerge.yaml
index 8bf8d35abf0cf..4435a3e905768 100644
--- a/.github/workflows/premerge.yaml
+++ b/.github/workflows/premerge.yaml
@@ -56,12 +56,12 @@ jobs:
           echo "Running project checks targets: ${project_check_targets}"
           echo "Building runtimes: ${runtimes_to_build}"
           echo "Running runtimes checks targets: ${runtimes_check_targets}"
-          echo "Running multiconfig runtimes checks targets: ${runtimes_check_targets_multiconfig}"
+          echo "Running runtimes checks requiring reconfiguring targets: ${runtimes_check_targets_needs_reconfig}"
 
           export CC=/opt/llvm/bin/clang
           export CXX=/opt/llvm/bin/clang++
 
-          ./.ci/monolithic-linux.sh "${projects_to_build}" "${project_check_targets}" "${runtimes_to_build}" "${runtimes_check_targets}" "${runtimes_check_targets_multiconfig}"
+          ./.ci/monolithic-linux.sh "${projects_to_build}" "${project_check_targets}" "${runtimes_to_build}" "${runtimes_check_targets}" "${runtimes_check_targets_needs_reconfig}"
       - name: Upload Artifacts
         uses: actions/upload-artifact at 65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0
         with:

>From 89db4b3b4498ed0c1bf3dbea307031fd285c7b01 Mon Sep 17 00:00:00 2001
From: Aiden Grossman <aidengrossman at google.com>
Date: Sat, 7 Jun 2025 13:06:33 -0700
Subject: [PATCH 6/7] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20ch?=
 =?UTF-8?q?anges=20introduced=20through=20rebase?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Created using spr 1.3.6

[skip ci]
---
 libcxx/include/mdspan | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/libcxx/include/mdspan b/libcxx/include/mdspan
index 32468a128dc9a..5aeec1bcbfc39 100644
--- a/libcxx/include/mdspan
+++ b/libcxx/include/mdspan
@@ -450,7 +450,11 @@ namespace std {
 #  include <__config>
 
 #  if _LIBCPP_STD_VER >= 23
-#    include <__fwd/mdspan.h>
+#    include <__fwd/mdspan.h> // TODO(boomanaiden154): This is currently a
+                              // non-standard extension to include
+                              // std::dynamic_extent tracked by LWG issue 4275.
+                              // This comment should be deleted or the include
+                              // deleted upon resolution.
 #    include <__fwd/span.h>
 #    include <__mdspan/default_accessor.h>
 #    include <__mdspan/extents.h>

>From a5c242ce772763e847e3b70d0970b5b7f5322f87 Mon Sep 17 00:00:00 2001
From: Aiden Grossman <aidengrossman at google.com>
Date: Mon, 9 Jun 2025 22:30:37 -0700
Subject: [PATCH 7/7] feedback

Created using spr 1.3.6
---
 .ci/compute_projects.py      |  1 +
 .ci/compute_projects_test.py | 12 ++++++++++++
 2 files changed, 13 insertions(+)

diff --git a/.ci/compute_projects.py b/.ci/compute_projects.py
index 50a64cb15a937..e61b8dc5021f3 100644
--- a/.ci/compute_projects.py
+++ b/.ci/compute_projects.py
@@ -65,6 +65,7 @@
 # touched.
 DEPENDENT_RUNTIMES_TO_TEST = {
     "clang": {"compiler-rt"},
+    "clang-tools-extra": {"libc"},
 }
 DEPENDENT_RUNTIMES_TO_TEST_NEEDS_RECONFIG = {
     "llvm": {"libcxx", "libcxxabi", "libunwind"},
diff --git a/.ci/compute_projects_test.py b/.ci/compute_projects_test.py
index 46abc754f0353..6bc2e34a1cbe1 100644
--- a/.ci/compute_projects_test.py
+++ b/.ci/compute_projects_test.py
@@ -251,6 +251,18 @@ def test_lldb(self):
         self.assertEqual(env_variables["runtimes_check_targets"], "")
         self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")
 
+    def test_clang_tools_extra(self):
+        env_variables = compute_projects.get_env_variables(
+            ["clang-tools-extra/CMakeLists.txt"], "Linux"
+        )
+        self.assertEqual(
+            env_variables["projects_to_build"], "clang;clang-tools-extra;lld;llvm"
+        )
+        self.assertEqual(env_variables["project_check_targets"], "check-clang-tools")
+        self.assertEqual(env_variables["runtimes_to_build"], "libc")
+        self.assertEqual(env_variables["runtimes_check_targets"], "check-libc")
+        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")
+
 
 if __name__ == "__main__":
     unittest.main()



More information about the llvm-commits mailing list