Index: libcxx/test/libcxx/strings/c.strings/version_cuchar.pass.cpp =================================================================== --- libcxx/test/libcxx/strings/c.strings/version_cuchar.pass.cpp +++ libcxx/test/libcxx/strings/c.strings/version_cuchar.pass.cpp @@ -8,6 +8,10 @@ // // XFAIL: * +// Skip this test on windows. If built on top of the MSVC runtime, the +// header actually does exist (although not provided by us). +// UNSUPPORTED: windows + // #include Index: libcxx/test/std/input.output/filesystems/class.directory_entry/directory_entry.cons/path.pass.cpp =================================================================== --- libcxx/test/std/input.output/filesystems/class.directory_entry/directory_entry.cons/path.pass.cpp +++ libcxx/test/std/input.output/filesystems/class.directory_entry/directory_entry.cons/path.pass.cpp @@ -8,8 +8,6 @@ // UNSUPPORTED: c++03 -// XFAIL: LIBCXX-WINDOWS-FIXME - // // class directory_entry @@ -155,7 +153,8 @@ // reading directories; test using a special inaccessible directory // instead. const path dir = GetWindowsInaccessibleDir(); - TEST_REQUIRE(!dir.empty()); + if (dir.empty()) + TEST_UNSUPPORTED(); const path file = dir / "file"; { std::error_code ec = GetTestEC(); Index: libcxx/test/std/input.output/filesystems/class.directory_iterator/directory_iterator.members/ctor.pass.cpp =================================================================== --- libcxx/test/std/input.output/filesystems/class.directory_iterator/directory_iterator.members/ctor.pass.cpp +++ libcxx/test/std/input.output/filesystems/class.directory_iterator/directory_iterator.members/ctor.pass.cpp @@ -8,8 +8,6 @@ // UNSUPPORTED: c++03 -// XFAIL: LIBCXX-WINDOWS-FIXME - // // class directory_iterator @@ -94,7 +92,8 @@ // reading directories; test using a special inaccessible directory // instead. const path testDir = GetWindowsInaccessibleDir(); - TEST_REQUIRE(!testDir.empty()); + if (testDir.empty()) + TEST_UNSUPPORTED(); #else scoped_test_env env; path const testDir = env.make_env_path("dir1"); Index: libcxx/test/std/input.output/filesystems/class.rec.dir.itr/rec.dir.itr.members/ctor.pass.cpp =================================================================== --- libcxx/test/std/input.output/filesystems/class.rec.dir.itr/rec.dir.itr.members/ctor.pass.cpp +++ libcxx/test/std/input.output/filesystems/class.rec.dir.itr/rec.dir.itr.members/ctor.pass.cpp @@ -8,8 +8,6 @@ // UNSUPPORTED: c++03 -// XFAIL: LIBCXX-WINDOWS-FIXME - // // class directory_iterator @@ -95,7 +93,8 @@ // reading directories; test using a special inaccessible directory // instead. const path testDir = GetWindowsInaccessibleDir(); - TEST_REQUIRE(!testDir.empty()); + if (testDir.empty()) + TEST_UNSUPPORTED(); #else scoped_test_env env; path const testDir = env.make_env_path("dir1"); Index: libcxx/test/std/input.output/filesystems/fs.op.funcs/fs.op.exists/exists.pass.cpp =================================================================== --- libcxx/test/std/input.output/filesystems/fs.op.funcs/fs.op.exists/exists.pass.cpp +++ libcxx/test/std/input.output/filesystems/fs.op.funcs/fs.op.exists/exists.pass.cpp @@ -8,8 +8,6 @@ // UNSUPPORTED: c++03 -// XFAIL: LIBCXX-WINDOWS-FIXME - // // bool exists(file_status s) noexcept @@ -91,7 +89,8 @@ // reading directories; test using a special inaccessible directory // instead. const path p = GetWindowsInaccessibleDir(); - TEST_REQUIRE(!p.empty()); + if (p.empty()) + TEST_UNSUPPORTED(); #else scoped_test_env env; const path dir = env.create_dir("dir"); Index: libcxx/test/std/strings/c.strings/cuchar.pass.cpp =================================================================== --- libcxx/test/std/strings/c.strings/cuchar.pass.cpp +++ libcxx/test/std/strings/c.strings/cuchar.pass.cpp @@ -8,6 +8,10 @@ // // XFAIL: libc++ +// Skip this test on windows. If built on top of the MSVC runtime, the +// header actually does exist (although not provided by us). +// UNSUPPORTED: windows + // #include Index: libcxx/test/support/filesystem_test_helper.h =================================================================== --- libcxx/test/support/filesystem_test_helper.h +++ libcxx/test/support/filesystem_test_helper.h @@ -678,22 +678,28 @@ const fs::path dir("C:\\System Volume Information"); std::error_code ec; const fs::path root("C:\\"); - fs::directory_iterator it(root, ec); - if (ec) - return fs::path(); - const fs::directory_iterator endIt{}; - while (it != endIt) { - const fs::directory_entry &ent = *it; - if (ent == dir) { - // Basic sanity checks on the directory_entry - if (!ent.exists()) - return fs::path(); - if (!ent.is_directory()) - return fs::path(); - return ent; + for (const auto &ent : fs::directory_iterator(root, ec)) { + if (ent != dir) + continue; + // Basic sanity checks on the directory_entry + if (!ent.exists() || !ent.is_directory()) { + fprintf(stderr, "The expected inaccessible directory \"%s\" was found " + "but doesn't behave as expected, skipping tests " + "regarding it\n", dir.string().c_str()); + return fs::path(); } - ++it; + // Check that it indeed is inaccessible as expected + (void)fs::exists(ent, ec); + if (!ec) { + fprintf(stderr, "The expected inaccessible directory \"%s\" was found " + "but seems to be accessible, skipping tests " + "regarding it\n", dir.string().c_str()); + return fs::path(); + } + return ent; } + fprintf(stderr, "No inaccessible directory \"%s\" found, skipping tests " + "regarding it\n", dir.string().c_str()); return fs::path(); } Index: libcxx/utils/ci/buildkite-pipeline.yml =================================================================== --- libcxx/utils/ci/buildkite-pipeline.yml +++ libcxx/utils/ci/buildkite-pipeline.yml @@ -277,6 +277,20 @@ - exit_status: -1 # Agent was lost limit: 2 + - label: "Windows" + # The CI runner doesn't have bash in the path currently + command: "\"\\Program Files\\Git\\usr\\bin\\bash\" libcxx/utils/ci/run-buildbot generic-win" + artifact_paths: + - "**/test-results.xml" + agents: + queue: "windows" + retry: + automatic: + - exit_status: -1 # Agent was lost + limit: 2 + soft_fail: + - exit_status: 1 + # All jobs defined before this `wait` will run whenever a CI job is started. # Jobs defined after the `wait` will run only if all the jobs above succeeded. # We use this to reduce the load on testers that have more constrained resources Index: libcxx/utils/ci/run-buildbot =================================================================== --- libcxx/utils/ci/run-buildbot +++ libcxx/utils/ci/run-buildbot @@ -421,6 +421,36 @@ generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Armv7Thumb-noexceptions.cmake" check-cxx-cxxabi ;; +generic-win) + clean + # Add bash to the path; the current CI runner doesn't have it added + # globally. + export PATH="$PATH:/c/Program Files/Git/usr/bin" + + # -D_LIBCPP_HAS_NO_INT128 allows building filesystem with a MSVC + # setup that lacks the necessary builtins for int128. + + # -loldnames is needed for some tests unless using Clang 12 (the + # CI runner has Clang 11 currently). + + # -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=NO is needed, as the testsuite + # fails to link that library if enabled, in a DLL build. + + echo "--- Generating CMake" + cmake -S "${MONOREPO_ROOT}/libcxx" \ + -B "${BUILD_DIR}" \ + -GNinja -DCMAKE_MAKE_PROGRAM="${NINJA}" \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_C_COMPILER=clang-cl \ + -DCMAKE_CXX_COMPILER=clang-cl \ + -DLLVM_LIT_ARGS="-sv --show-unsupported --xunit-xml-output test-results.xml" \ + -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=NO \ + -DLIBCXX_ENABLE_FILESYSTEM=YES \ + -DCMAKE_CXX_FLAGS="-D_LIBCPP_HAS_NO_INT128" \ + -DLIBCXX_TEST_LINKER_FLAGS="-loldnames" + echo "+++ Running the libc++ tests" + ${NINJA} -vC "${BUILD_DIR}" check-cxx +;; *) echo "${BUILDER} is not a known configuration" exit 1