https://github.com/CendioOssman created 
https://github.com/llvm/llvm-project/pull/155239

The current code did not work with a standard gcc cross-compiler layout, and 
there was a lot of internal confusion in the code about what different 
directories need to be tracked and where to track them.

This tries to do some cleanup of this, trying to get closer to the primary gcc 
code in Gnu.cpp.

Long term, it might be best to drop this duplication and make the MinGW 
toolchain use the same gcc handling code as the other gcc platforms.

>From da0300319c571db0146bd33787c433dc15ba2c22 Mon Sep 17 00:00:00 2001
From: Pierre Ossman <oss...@cendio.se>
Date: Fri, 22 Aug 2025 09:34:15 +0200
Subject: [PATCH 1/7] Use Generic_GCC logic for libstdc++ include paths

---
 clang/lib/Driver/ToolChains/MinGW.cpp | 23 +++++++++++++++++------
 clang/lib/Driver/ToolChains/MinGW.h   |  1 +
 clang/test/Driver/mingw-sysroot.cpp   |  6 +++---
 clang/test/Driver/mingw.cpp           | 18 +++++++++---------
 4 files changed, 30 insertions(+), 18 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/MinGW.cpp 
b/clang/lib/Driver/ToolChains/MinGW.cpp
index 1bb9bcfe6aab2..12d463f6916ad 100644
--- a/clang/lib/Driver/ToolChains/MinGW.cpp
+++ b/clang/lib/Driver/ToolChains/MinGW.cpp
@@ -441,6 +441,9 @@ void toolchains::MinGW::findGccLibDir(const llvm::Triple 
&LiteralTriple) {
       llvm::SmallString<1024> LibDir(Base);
       llvm::sys::path::append(LibDir, CandidateLib, "gcc", CandidateSysroot);
       if (findGccVersion(LibDir, GccLibDir, Ver, GccVer)) {
+        llvm::SmallString<1024> ParentLib(LibDir);
+        llvm::sys::path::append(ParentLib, "..", "..");
+        GccParentLibPath = ParentLib.str();
         SubdirName = std::string(CandidateSysroot);
         return;
       }
@@ -797,7 +800,7 @@ void toolchains::MinGW::AddClangCXXStdlibIncludeArgs(
   }
 
   case ToolChain::CST_Libstdcxx:
-    llvm::SmallVector<llvm::SmallString<1024>, 7> CppIncludeBases;
+    llvm::SmallVector<llvm::SmallString<1024>, 9> CppIncludeBases;
     CppIncludeBases.emplace_back(Base);
     llvm::sys::path::append(CppIncludeBases[0], SubdirName, "include", "c++");
     CppIncludeBases.emplace_back(Base);
@@ -805,16 +808,24 @@ void toolchains::MinGW::AddClangCXXStdlibIncludeArgs(
                             Ver);
     CppIncludeBases.emplace_back(Base);
     llvm::sys::path::append(CppIncludeBases[2], "include", "c++", Ver);
+    CppIncludeBases.emplace_back(GccParentLibPath);
+    llvm::sys::path::append(CppIncludeBases[3], "..", TripleDirName);
+    llvm::sys::path::append(CppIncludeBases[3], "include", "c++", GccVer.Text);
+    CppIncludeBases.emplace_back(GccParentLibPath);
+    llvm::sys::path::append(CppIncludeBases[4],
+                            "gcc", TripleDirName, GccVer.Text);
+    llvm::sys::path::append(CppIncludeBases[4], "include", "c++");
+    CppIncludeBases.emplace_back(GccParentLibPath);
+    llvm::sys::path::append(CppIncludeBases[5],
+                            "..", "include", "c++", GccVer.Text);
     CppIncludeBases.emplace_back(GccLibDir);
-    llvm::sys::path::append(CppIncludeBases[3], "include", "c++");
-    CppIncludeBases.emplace_back(GccLibDir);
-    llvm::sys::path::append(CppIncludeBases[4], "include",
+    llvm::sys::path::append(CppIncludeBases[6], "include",
                             "g++-v" + GccVer.Text);
     CppIncludeBases.emplace_back(GccLibDir);
-    llvm::sys::path::append(CppIncludeBases[5], "include",
+    llvm::sys::path::append(CppIncludeBases[7], "include",
                             "g++-v" + GccVer.MajorStr + "." + GccVer.MinorStr);
     CppIncludeBases.emplace_back(GccLibDir);
-    llvm::sys::path::append(CppIncludeBases[6], "include",
+    llvm::sys::path::append(CppIncludeBases[8], "include",
                             "g++-v" + GccVer.MajorStr);
     for (auto &CppIncludeBase : CppIncludeBases) {
       addSystemInclude(DriverArgs, CC1Args, CppIncludeBase);
diff --git a/clang/lib/Driver/ToolChains/MinGW.h 
b/clang/lib/Driver/ToolChains/MinGW.h
index 1730da48cd434..dad72fe1e90b3 100644
--- a/clang/lib/Driver/ToolChains/MinGW.h
+++ b/clang/lib/Driver/ToolChains/MinGW.h
@@ -109,6 +109,7 @@ class LLVM_LIBRARY_VISIBILITY MinGW : public ToolChain {
 
   std::string Base;
   std::string GccLibDir;
+  std::string GccParentLibPath;
   clang::driver::toolchains::Generic_GCC::GCCVersion GccVer;
   std::string Ver;
   std::string SubdirName;
diff --git a/clang/test/Driver/mingw-sysroot.cpp 
b/clang/test/Driver/mingw-sysroot.cpp
index 0ba2f336fd2e0..683cc39fc025c 100644
--- a/clang/test/Driver/mingw-sysroot.cpp
+++ b/clang/test/Driver/mingw-sysroot.cpp
@@ -34,9 +34,9 @@
 // cross toolchains installed in /usr.
 
 // RUN: env "PATH=%t.dir/testroot-gcc/bin:%PATH%" %clang 
--target=x86_64-w64-mingw32 -rtlib=platform -stdlib=libstdc++ --sysroot="" -c 
-### %s 2>&1 | FileCheck -check-prefix=CHECK_TESTROOT_GCC %s 
--implicit-check-not="\"{{.*}}/testroot-gcc{{/|\\\\}}include\""
-// CHECK_TESTROOT_GCC: "-internal-isystem" 
"[[BASE:[^"]+]]/testroot-gcc{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}c++"
-// CHECK_TESTROOT_GCC-SAME: {{^}} "-internal-isystem" 
"[[BASE]]/testroot-gcc{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}x86_64-w64-mingw32"
-// CHECK_TESTROOT_GCC-SAME: {{^}} "-internal-isystem" 
"[[BASE]]/testroot-gcc{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}backward"
+// CHECK_TESTROOT_GCC: "-internal-isystem" 
"[[BASE:[^"]+]]/testroot-gcc{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}c++"
+// CHECK_TESTROOT_GCC-SAME: {{^}} "-internal-isystem" 
"[[BASE]]/testroot-gcc{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}x86_64-w64-mingw32"
+// CHECK_TESTROOT_GCC-SAME: {{^}} "-internal-isystem" 
"[[BASE]]/testroot-gcc{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}backward"
 // CHECK_TESTROOT_GCC: "-internal-isystem" 
"[[BASE]]/testroot-gcc{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}g++-v10.2-posix"
 // CHECK_TESTROOT_GCC: "-internal-isystem" 
"[[BASE]]/testroot-gcc{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}g++-v10.2"
 // CHECK_TESTROOT_GCC: "-internal-isystem" 
"[[BASE]]/testroot-gcc{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}g++-v10"
diff --git a/clang/test/Driver/mingw.cpp b/clang/test/Driver/mingw.cpp
index f43fa177e2905..c7d9e9bc29cd3 100644
--- a/clang/test/Driver/mingw.cpp
+++ b/clang/test/Driver/mingw.cpp
@@ -10,9 +10,9 @@
 
 
 // RUN: %clang --target=i686-pc-windows-gnu -rtlib=platform -stdlib=libstdc++ 
-c -### --sysroot=%S/Inputs/mingw_mingw_org_tree/mingw %s 2>&1 | FileCheck 
-check-prefix=CHECK_MINGW_ORG_TREE %s
-// CHECK_MINGW_ORG_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_mingw_org_tree/mingw{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}mingw32{{/|\\\\}}4.8.1{{/|\\\\}}include{{/|\\\\}}c++"
-// CHECK_MINGW_ORG_TREE: 
"[[BASE]]/Inputs/mingw_mingw_org_tree/mingw{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}mingw32{{/|\\\\}}4.8.1{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}mingw32"
-// CHECK_MINGW_ORG_TREE: 
"[[BASE]]/Inputs/mingw_mingw_org_tree/mingw{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}mingw32{{/|\\\\}}4.8.1{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}backward"
+// CHECK_MINGW_ORG_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_mingw_org_tree/mingw{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}mingw32{{/|\\\\}}4.8.1{{/|\\\\}}include{{/|\\\\}}c++"
+// CHECK_MINGW_ORG_TREE: 
"[[BASE]]/Inputs/mingw_mingw_org_tree/mingw{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}mingw32{{/|\\\\}}4.8.1{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}mingw32"
+// CHECK_MINGW_ORG_TREE: 
"[[BASE]]/Inputs/mingw_mingw_org_tree/mingw{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}mingw32{{/|\\\\}}4.8.1{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}backward"
 // CHECK_MINGW_ORG_TREE: 
"[[BASE]]/Inputs/mingw_mingw_org_tree/mingw{{/|\\\\}}mingw32{{/|\\\\}}include"
 // CHECK_MINGW_ORG_TREE: 
"[[BASE]]/Inputs/mingw_mingw_org_tree/mingw{{/|\\\\}}include"
 
@@ -33,9 +33,9 @@
 
 
 // RUN: %clang --target=x86_64-pc-windows-gnu -rtlib=platform 
-stdlib=libstdc++ -c -### --sysroot=%S/Inputs/mingw_opensuse_tree/usr %s 2>&1 | 
FileCheck -check-prefix=CHECK_MINGW_OPENSUSE_TREE %s
-// CHECK_MINGW_OPENSUSE_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_opensuse_tree/usr{{/|\\\\}}lib64{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}5.1.0{{/|\\\\}}include{{/|\\\\}}c++"
-// CHECK_MINGW_OPENSUSE_TREE: 
"[[BASE]]/Inputs/mingw_opensuse_tree/usr{{/|\\\\}}lib64{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}5.1.0{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}x86_64-w64-mingw32"
-// CHECK_MINGW_OPENSUSE_TREE: 
"[[BASE]]/Inputs/mingw_opensuse_tree/usr{{/|\\\\}}lib64{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}5.1.0{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}backward"
+// CHECK_MINGW_OPENSUSE_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_opensuse_tree/usr{{/|\\\\}}lib64{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}5.1.0{{/|\\\\}}include{{/|\\\\}}c++"
+// CHECK_MINGW_OPENSUSE_TREE: 
"[[BASE]]/Inputs/mingw_opensuse_tree/usr{{/|\\\\}}lib64{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}5.1.0{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}x86_64-w64-mingw32"
+// CHECK_MINGW_OPENSUSE_TREE: 
"[[BASE]]/Inputs/mingw_opensuse_tree/usr{{/|\\\\}}lib64{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}5.1.0{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}backward"
 // CHECK_MINGW_OPENSUSE_TREE: 
"[[BASE]]/Inputs/mingw_opensuse_tree/usr{{/|\\\\}}x86_64-w64-mingw32/sys-root/mingw{{/|\\\\}}include"
 
 
@@ -61,9 +61,9 @@
 
 
 // RUN: %clang --target=x86_64-pc-windows-gnu -rtlib=platform 
-stdlib=libstdc++ -c -### --sysroot=%S/Inputs/mingw_ubuntu_posix_tree/usr %s 
2>&1 | FileCheck -check-prefix=CHECK_MINGW_UBUNTU_POSIX_TREE %s
-// CHECK_MINGW_UBUNTU_POSIX_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_ubuntu_posix_tree/usr{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}c++"
-// CHECK_MINGW_UBUNTU_POSIX_TREE: 
"[[BASE]]/Inputs/mingw_ubuntu_posix_tree/usr{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}x86_64-w64-mingw32"
-// CHECK_MINGW_UBUNTU_POSIX_TREE: 
"[[BASE]]/Inputs/mingw_ubuntu_posix_tree/usr{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}backward"
+// CHECK_MINGW_UBUNTU_POSIX_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_ubuntu_posix_tree/usr{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}c++"
+// CHECK_MINGW_UBUNTU_POSIX_TREE: 
"[[BASE]]/Inputs/mingw_ubuntu_posix_tree/usr{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}x86_64-w64-mingw32"
+// CHECK_MINGW_UBUNTU_POSIX_TREE: 
"[[BASE]]/Inputs/mingw_ubuntu_posix_tree/usr{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}backward"
 // CHECK_MINGW_UBUNTU_POSIX_TREE: 
"[[BASE]]/Inputs/mingw_ubuntu_posix_tree/usr{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}include"
 
 // RUN: %clang --target=i686-windows-gnu -E -### %s 2>&1 | FileCheck 
-check-prefix=CHECK_MINGW_NO_UNICODE %s

>From db58604882a146339fb1040b33410293e7b36e0a Mon Sep 17 00:00:00 2001
From: Pierre Ossman <oss...@cendio.se>
Date: Thu, 21 Aug 2025 17:02:39 +0200
Subject: [PATCH 2/7] Always look for distribution supplied gcc

A cross compiling gcc is generally installed outside of the sysroot, so
we should always search the root system for gcc as well.
---
 clang/lib/Driver/ToolChains/MinGW.cpp | 33 +++++++++++++++++----------
 1 file changed, 21 insertions(+), 12 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/MinGW.cpp 
b/clang/lib/Driver/ToolChains/MinGW.cpp
index 12d463f6916ad..c025496ebe1b0 100644
--- a/clang/lib/Driver/ToolChains/MinGW.cpp
+++ b/clang/lib/Driver/ToolChains/MinGW.cpp
@@ -422,6 +422,12 @@ static llvm::Triple getLiteralTriple(const Driver &D, 
const llvm::Triple &T) {
 }
 
 void toolchains::MinGW::findGccLibDir(const llvm::Triple &LiteralTriple) {
+  std::string InstallBase =
+      std::string(llvm::sys::path::parent_path(getDriver().Dir));
+  llvm::SmallVector<llvm::SmallString<32>, 3> BaseNames;
+  BaseNames.emplace_back(Base);
+  BaseNames.emplace_back(InstallBase);
+  BaseNames.emplace_back("/usr");
   llvm::SmallVector<llvm::SmallString<32>, 5> SubdirNames;
   SubdirNames.emplace_back(LiteralTriple.str());
   SubdirNames.emplace_back(getTriple().str());
@@ -434,18 +440,21 @@ void toolchains::MinGW::findGccLibDir(const llvm::Triple 
&LiteralTriple) {
     SubdirName = getTriple().getArchName();
     SubdirName += "-w64-mingw32";
   }
-  // lib: Arch Linux, Ubuntu, Windows
-  // lib64: openSUSE Linux
-  for (StringRef CandidateLib : {"lib", "lib64"}) {
-    for (StringRef CandidateSysroot : SubdirNames) {
-      llvm::SmallString<1024> LibDir(Base);
-      llvm::sys::path::append(LibDir, CandidateLib, "gcc", CandidateSysroot);
-      if (findGccVersion(LibDir, GccLibDir, Ver, GccVer)) {
-        llvm::SmallString<1024> ParentLib(LibDir);
-        llvm::sys::path::append(ParentLib, "..", "..");
-        GccParentLibPath = ParentLib.str();
-        SubdirName = std::string(CandidateSysroot);
-        return;
+  // FIXME: Should pick the newest version
+  for (StringRef CandidateBase : BaseNames) {
+    // lib: Arch Linux, Ubuntu, Windows
+    // lib64: openSUSE Linux
+    for (StringRef CandidateLib : {"lib", "lib64"}) {
+      for (StringRef CandidateSysroot : SubdirNames) {
+        llvm::SmallString<1024> LibDir(CandidateBase);
+        llvm::sys::path::append(LibDir, CandidateLib, "gcc", CandidateSysroot);
+        if (findGccVersion(LibDir, GccLibDir, Ver, GccVer)) {
+          llvm::SmallString<1024> ParentLib(LibDir);
+          llvm::sys::path::append(ParentLib, "..", "..");
+          GccParentLibPath = ParentLib.str();
+          SubdirName = std::string(CandidateSysroot);
+          return;
+        }
       }
     }
   }

>From 243c6a50c75e967193bae1b7e5c107743f0cf4ca Mon Sep 17 00:00:00 2001
From: Pierre Ossman <oss...@cendio.se>
Date: Mon, 25 Aug 2025 12:53:44 +0200
Subject: [PATCH 3/7] Remove OpenSUSE and Fedora test cases

These won't work reliably as we can only specify the sysroot path, not
the mock system root directory (for finding the gcc installation).
---
 .../12.2.1/include-fixed/.keep                     |  0
 .../sys-root/mingw/include/.keep                   |  0
 .../sys-root/mingw/include/c++/backward/.keep      |  0
 .../mingw/include/c++/x86_64-w64-mingw32ucrt/.keep |  0
 .../x86_64-w64-mingw32/5.1.0/include-fixed/.keep   |  0
 .../5.1.0/include/c++/backward/.keep               |  0
 .../5.1.0/include/c++/x86_64-w64-mingw32/.keep     |  0
 .../sys-root/mingw/include/.keep                   |  0
 clang/test/Driver/mingw.cpp                        | 14 --------------
 9 files changed, 14 deletions(-)
 delete mode 100644 
clang/test/Driver/Inputs/mingw_fedora_tree/usr/lib/gcc/x86_64-w64-mingw32ucrt/12.2.1/include-fixed/.keep
 delete mode 100644 
clang/test/Driver/Inputs/mingw_fedora_tree/usr/x86_64-w64-mingw32ucrt/sys-root/mingw/include/.keep
 delete mode 100644 
clang/test/Driver/Inputs/mingw_fedora_tree/usr/x86_64-w64-mingw32ucrt/sys-root/mingw/include/c++/backward/.keep
 delete mode 100644 
clang/test/Driver/Inputs/mingw_fedora_tree/usr/x86_64-w64-mingw32ucrt/sys-root/mingw/include/c++/x86_64-w64-mingw32ucrt/.keep
 delete mode 100644 
clang/test/Driver/Inputs/mingw_opensuse_tree/usr/lib64/gcc/x86_64-w64-mingw32/5.1.0/include-fixed/.keep
 delete mode 100644 
clang/test/Driver/Inputs/mingw_opensuse_tree/usr/lib64/gcc/x86_64-w64-mingw32/5.1.0/include/c++/backward/.keep
 delete mode 100644 
clang/test/Driver/Inputs/mingw_opensuse_tree/usr/lib64/gcc/x86_64-w64-mingw32/5.1.0/include/c++/x86_64-w64-mingw32/.keep
 delete mode 100644 
clang/test/Driver/Inputs/mingw_opensuse_tree/usr/x86_64-w64-mingw32/sys-root/mingw/include/.keep

diff --git 
a/clang/test/Driver/Inputs/mingw_fedora_tree/usr/lib/gcc/x86_64-w64-mingw32ucrt/12.2.1/include-fixed/.keep
 
b/clang/test/Driver/Inputs/mingw_fedora_tree/usr/lib/gcc/x86_64-w64-mingw32ucrt/12.2.1/include-fixed/.keep
deleted file mode 100644
index e69de29bb2d1d..0000000000000
diff --git 
a/clang/test/Driver/Inputs/mingw_fedora_tree/usr/x86_64-w64-mingw32ucrt/sys-root/mingw/include/.keep
 
b/clang/test/Driver/Inputs/mingw_fedora_tree/usr/x86_64-w64-mingw32ucrt/sys-root/mingw/include/.keep
deleted file mode 100644
index e69de29bb2d1d..0000000000000
diff --git 
a/clang/test/Driver/Inputs/mingw_fedora_tree/usr/x86_64-w64-mingw32ucrt/sys-root/mingw/include/c++/backward/.keep
 
b/clang/test/Driver/Inputs/mingw_fedora_tree/usr/x86_64-w64-mingw32ucrt/sys-root/mingw/include/c++/backward/.keep
deleted file mode 100644
index e69de29bb2d1d..0000000000000
diff --git 
a/clang/test/Driver/Inputs/mingw_fedora_tree/usr/x86_64-w64-mingw32ucrt/sys-root/mingw/include/c++/x86_64-w64-mingw32ucrt/.keep
 
b/clang/test/Driver/Inputs/mingw_fedora_tree/usr/x86_64-w64-mingw32ucrt/sys-root/mingw/include/c++/x86_64-w64-mingw32ucrt/.keep
deleted file mode 100644
index e69de29bb2d1d..0000000000000
diff --git 
a/clang/test/Driver/Inputs/mingw_opensuse_tree/usr/lib64/gcc/x86_64-w64-mingw32/5.1.0/include-fixed/.keep
 
b/clang/test/Driver/Inputs/mingw_opensuse_tree/usr/lib64/gcc/x86_64-w64-mingw32/5.1.0/include-fixed/.keep
deleted file mode 100644
index e69de29bb2d1d..0000000000000
diff --git 
a/clang/test/Driver/Inputs/mingw_opensuse_tree/usr/lib64/gcc/x86_64-w64-mingw32/5.1.0/include/c++/backward/.keep
 
b/clang/test/Driver/Inputs/mingw_opensuse_tree/usr/lib64/gcc/x86_64-w64-mingw32/5.1.0/include/c++/backward/.keep
deleted file mode 100644
index e69de29bb2d1d..0000000000000
diff --git 
a/clang/test/Driver/Inputs/mingw_opensuse_tree/usr/lib64/gcc/x86_64-w64-mingw32/5.1.0/include/c++/x86_64-w64-mingw32/.keep
 
b/clang/test/Driver/Inputs/mingw_opensuse_tree/usr/lib64/gcc/x86_64-w64-mingw32/5.1.0/include/c++/x86_64-w64-mingw32/.keep
deleted file mode 100644
index e69de29bb2d1d..0000000000000
diff --git 
a/clang/test/Driver/Inputs/mingw_opensuse_tree/usr/x86_64-w64-mingw32/sys-root/mingw/include/.keep
 
b/clang/test/Driver/Inputs/mingw_opensuse_tree/usr/x86_64-w64-mingw32/sys-root/mingw/include/.keep
deleted file mode 100644
index e69de29bb2d1d..0000000000000
diff --git a/clang/test/Driver/mingw.cpp b/clang/test/Driver/mingw.cpp
index c7d9e9bc29cd3..971dc77bd37e0 100644
--- a/clang/test/Driver/mingw.cpp
+++ b/clang/test/Driver/mingw.cpp
@@ -32,20 +32,6 @@
 // CHECK_MINGW_MSYS_TREE: 
"[[BASE]]/Inputs/mingw_msys2_tree/msys64/mingw32{{/|\\\\}}include"
 
 
-// RUN: %clang --target=x86_64-pc-windows-gnu -rtlib=platform 
-stdlib=libstdc++ -c -### --sysroot=%S/Inputs/mingw_opensuse_tree/usr %s 2>&1 | 
FileCheck -check-prefix=CHECK_MINGW_OPENSUSE_TREE %s
-// CHECK_MINGW_OPENSUSE_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_opensuse_tree/usr{{/|\\\\}}lib64{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}5.1.0{{/|\\\\}}include{{/|\\\\}}c++"
-// CHECK_MINGW_OPENSUSE_TREE: 
"[[BASE]]/Inputs/mingw_opensuse_tree/usr{{/|\\\\}}lib64{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}5.1.0{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}x86_64-w64-mingw32"
-// CHECK_MINGW_OPENSUSE_TREE: 
"[[BASE]]/Inputs/mingw_opensuse_tree/usr{{/|\\\\}}lib64{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}5.1.0{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}backward"
-// CHECK_MINGW_OPENSUSE_TREE: 
"[[BASE]]/Inputs/mingw_opensuse_tree/usr{{/|\\\\}}x86_64-w64-mingw32/sys-root/mingw{{/|\\\\}}include"
-
-
-// RUN: %clang --target=x86_64-pc-windows-gnu -rtlib=platform 
-stdlib=libstdc++ -c -### --sysroot=%S/Inputs/mingw_fedora_tree/usr %s 2>&1 | 
FileCheck -check-prefix=CHECK_MINGW_FEDORA_TREE %s
-// CHECK_MINGW_FEDORA_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_fedora_tree/usr{{/|\\\\}}x86_64-w64-mingw32ucrt/sys-root/mingw{{/|\\\\}}include{{/|\\\\}}c++"
-// CHECK_MINGW_FEDORA_TREE: 
"[[BASE]]/Inputs/mingw_fedora_tree/usr{{/|\\\\}}x86_64-w64-mingw32ucrt/sys-root/mingw{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}x86_64-w64-mingw32ucrt"
-// CHECK_MINGW_FEDORA_TREE: 
"[[BASE]]/Inputs/mingw_fedora_tree/usr{{/|\\\\}}x86_64-w64-mingw32ucrt/sys-root/mingw{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}backward"
-// CHECK_MINGW_FEDORA_TREE: 
"[[BASE]]/Inputs/mingw_fedora_tree/usr{{/|\\\\}}x86_64-w64-mingw32ucrt/sys-root/mingw{{/|\\\\}}include"
-
-
 // RUN: %clang --target=i686-pc-windows-gnu -rtlib=platform -stdlib=libstdc++ 
-c -### --sysroot=%S/Inputs/mingw_arch_tree/usr %s 2>&1 | FileCheck 
-check-prefix=CHECK_MINGW_ARCH_TREE %s
 // CHECK_MINGW_ARCH_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_arch_tree/usr{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}5.1.0"
 // CHECK_MINGW_ARCH_TREE: 
"[[BASE]]/Inputs/mingw_arch_tree/usr{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}5.1.0{{/|\\\\}}i686-w64-mingw32"

>From 3f8914ff1df556c3bf072125becc5197e0e62baa Mon Sep 17 00:00:00 2001
From: Pierre Ossman <oss...@cendio.se>
Date: Thu, 21 Aug 2025 16:36:56 +0200
Subject: [PATCH 4/7] Be consistent that Base points to the sysroot

Not a general base directory that we assume has a triple subdirectory
with gcc's tooldir in it.
---
 clang/lib/Driver/ToolChains/MinGW.cpp         | 107 ++++++++++--------
 .../include/c++/backward/.keep                |   0
 .../include/c++/i686-w64-mingw32/.keep        |   0
 .../4.9.1/include-fixed/.keep                 |   0
 .../gcc/i686-w64-mingw32/4.9.1/include/.keep  |   0
 clang/test/Driver/mingw-sysroot.cpp           |  22 ----
 clang/test/Driver/mingw.cpp                   |  23 +---
 7 files changed, 65 insertions(+), 87 deletions(-)
 delete mode 100644 
clang/test/Driver/Inputs/mingw_mingw_builds_tree/mingw32/i686-w64-mingw32/include/c++/backward/.keep
 delete mode 100644 
clang/test/Driver/Inputs/mingw_mingw_builds_tree/mingw32/i686-w64-mingw32/include/c++/i686-w64-mingw32/.keep
 delete mode 100644 
clang/test/Driver/Inputs/mingw_mingw_builds_tree/mingw32/lib/gcc/i686-w64-mingw32/4.9.1/include-fixed/.keep
 delete mode 100644 
clang/test/Driver/Inputs/mingw_mingw_builds_tree/mingw32/lib/gcc/i686-w64-mingw32/4.9.1/include/.keep

diff --git a/clang/lib/Driver/ToolChains/MinGW.cpp 
b/clang/lib/Driver/ToolChains/MinGW.cpp
index c025496ebe1b0..6077dc7ed2fa1 100644
--- a/clang/lib/Driver/ToolChains/MinGW.cpp
+++ b/clang/lib/Driver/ToolChains/MinGW.cpp
@@ -436,52 +436,75 @@ void toolchains::MinGW::findGccLibDir(const llvm::Triple 
&LiteralTriple) {
   SubdirNames.emplace_back(getTriple().getArchName());
   SubdirNames.back() += "-w64-mingw32ucrt";
   SubdirNames.emplace_back("mingw32");
-  if (SubdirName.empty()) {
-    SubdirName = getTriple().getArchName();
-    SubdirName += "-w64-mingw32";
-  }
+  TripleDirName = getTriple().getArchName();
+  TripleDirName += "-w64-mingw32";
   // FIXME: Should pick the newest version
   for (StringRef CandidateBase : BaseNames) {
     // lib: Arch Linux, Ubuntu, Windows
     // lib64: openSUSE Linux
     for (StringRef CandidateLib : {"lib", "lib64"}) {
-      for (StringRef CandidateSysroot : SubdirNames) {
+      for (StringRef CandidateTriple : SubdirNames) {
         llvm::SmallString<1024> LibDir(CandidateBase);
-        llvm::sys::path::append(LibDir, CandidateLib, "gcc", CandidateSysroot);
+        llvm::sys::path::append(LibDir, CandidateLib, "gcc", CandidateTriple);
         if (findGccVersion(LibDir, GccLibDir, Ver, GccVer)) {
           llvm::SmallString<1024> ParentLib(LibDir);
           llvm::sys::path::append(ParentLib, "..", "..");
           GccParentLibPath = ParentLib.str();
-          SubdirName = std::string(CandidateSysroot);
+          TripleDirName = std::string(CandidateTriple);
           return;
         }
       }
     }
   }
+  // Let's try to find it relative a decorated gcc binary
+  for (StringRef CandidateLib : {"lib", "lib64"}) {
+    for (StringRef CandidateTriple : SubdirNames) {
+      llvm::ErrorOr<std::string> GPPName =
+        llvm::sys::findProgramByName(CandidateTriple.str() + "-gcc");
+      if (!GPPName)
+        continue;
+      llvm::SmallString<1024> LibDir;
+      llvm::sys::path::append(LibDir, 
llvm::sys::path::parent_path(llvm::sys::path::parent_path(GPPName.get())));
+      llvm::sys::path::append(LibDir, CandidateLib, "gcc", CandidateTriple);
+      if (findGccVersion(LibDir, GccLibDir, Ver, GccVer)) {
+        llvm::SmallString<1024> ParentLib(LibDir);
+        llvm::sys::path::append(ParentLib, "..", "..");
+        GccParentLibPath = ParentLib.str();
+        TripleDirName = std::string(CandidateTriple);
+        return;
+      }
+    }
+  }
 }
 
-static llvm::ErrorOr<std::string> findGcc(const llvm::Triple &LiteralTriple,
-                                          const llvm::Triple &T) {
+static llvm::ErrorOr<std::string> findGccRelativeSysroot(
+    const llvm::Triple &LiteralTriple, const llvm::Triple &T) {
   llvm::SmallVector<llvm::SmallString<32>, 5> Gccs;
   Gccs.emplace_back(LiteralTriple.str());
-  Gccs.back() += "-gcc";
   Gccs.emplace_back(T.str());
-  Gccs.back() += "-gcc";
   Gccs.emplace_back(T.getArchName());
-  Gccs.back() += "-w64-mingw32-gcc";
+  Gccs.back() += "-w64-mingw32";
   Gccs.emplace_back(T.getArchName());
-  Gccs.back() += "-w64-mingw32ucrt-gcc";
-  Gccs.emplace_back("mingw32-gcc");
+  Gccs.back() += "-w64-mingw32ucrt";
+  Gccs.emplace_back("mingw32");
   // Please do not add "gcc" here
-  for (StringRef CandidateGcc : Gccs)
-    if (llvm::ErrorOr<std::string> GPPName = 
llvm::sys::findProgramByName(CandidateGcc))
-      return GPPName;
+  for (StringRef CandidateGcc : Gccs) {
+    llvm::ErrorOr<std::string> GPPName =
+      llvm::sys::findProgramByName(CandidateGcc.str() + "-gcc");
+    llvm::SmallString<1024> SysrootDir;
+    if (!GPPName)
+      continue;
+    llvm::sys::path::append(SysrootDir, 
llvm::sys::path::parent_path(llvm::sys::path::parent_path(GPPName.get())));
+    llvm::sys::path::append(SysrootDir, CandidateGcc);
+    if (llvm::sys::fs::is_directory(SysrootDir))
+      return SysrootDir.str().str();
+  }
   return make_error_code(std::errc::no_such_file_or_directory);
 }
 
 static llvm::ErrorOr<std::string>
 findClangRelativeSysroot(const Driver &D, const llvm::Triple &LiteralTriple,
-                         const llvm::Triple &T, std::string &SubdirName) {
+                         const llvm::Triple &T) {
   llvm::SmallVector<llvm::SmallString<32>, 4> Subdirs;
   Subdirs.emplace_back(LiteralTriple.str());
   Subdirs.emplace_back(T.str());
@@ -493,7 +516,8 @@ findClangRelativeSysroot(const Driver &D, const 
llvm::Triple &LiteralTriple,
   StringRef Sep = llvm::sys::path::get_separator();
   for (StringRef CandidateSubdir : Subdirs) {
     if (llvm::sys::fs::is_directory(ClangRoot + Sep + CandidateSubdir)) {
-      SubdirName = std::string(CandidateSubdir);
+      if (llvm::sys::fs::is_directory(ClangRoot + Sep + CandidateSubdir + Sep 
+ "sys-root"))
+        return (ClangRoot + Sep + CandidateSubdir + Sep + "sys-root").str();
       return (ClangRoot + Sep + CandidateSubdir).str();
     }
   }
@@ -522,41 +546,35 @@ toolchains::MinGW::MinGW(const Driver &D, const 
llvm::Triple &Triple,
   llvm::Triple LiteralTriple = getLiteralTriple(D, getTriple());
   if (getDriver().SysRoot.size())
     Base = getDriver().SysRoot;
-  // Look for <clang-bin>/../<triplet>; if found, use <clang-bin>/.. as the
-  // base as it could still be a base for a gcc setup with libgcc.
+  // Look for <clang-bin>/../<triplet>
   else if (llvm::ErrorOr<std::string> TargetSubdir = findClangRelativeSysroot(
-               getDriver(), LiteralTriple, getTriple(), SubdirName))
-    Base = std::string(llvm::sys::path::parent_path(TargetSubdir.get()));
+               getDriver(), LiteralTriple, getTriple()))
+    Base = TargetSubdir.get();
   // If the install base of Clang seems to have mingw sysroot files directly
   // in the toplevel include and lib directories, use this as base instead of
   // looking for a triple prefixed GCC in the path.
   else if (looksLikeMinGWSysroot(InstallBase))
     Base = InstallBase;
-  else if (llvm::ErrorOr<std::string> GPPName =
-               findGcc(LiteralTriple, getTriple()))
-    Base = std::string(llvm::sys::path::parent_path(
-        llvm::sys::path::parent_path(GPPName.get())));
+  else if (llvm::ErrorOr<std::string> TargetSubdir =
+               findGccRelativeSysroot(LiteralTriple, getTriple()))
+    Base = TargetSubdir.get();
   else
     Base = InstallBase;
 
   Base += llvm::sys::path::get_separator();
   findGccLibDir(LiteralTriple);
-  TripleDirName = SubdirName;
   // GccLibDir must precede Base/lib so that the
   // correct crtbegin.o ,cetend.o would be found.
   getFilePaths().push_back(GccLibDir);
 
-  // openSUSE/Fedora
-  std::string CandidateSubdir = SubdirName + "/sys-root/mingw";
-  if (getDriver().getVFS().exists(Base + CandidateSubdir))
+  // openSUSE/Fedora/Gentoo
+  std::string CandidateSubdir = "mingw";
+  if (getDriver().getVFS().exists(Base + CandidateSubdir)) {
     SubdirName = CandidateSubdir;
+    SubdirName += llvm::sys::path::get_separator();
+  }
 
-  getFilePaths().push_back(
-      (Base + SubdirName + llvm::sys::path::get_separator() + "lib").str());
-
-  // Gentoo
-  getFilePaths().push_back(
-      (Base + SubdirName + llvm::sys::path::get_separator() + 
"mingw/lib").str());
+  getFilePaths().push_back(Base + SubdirName + "lib");
 
   // Only include <base>/lib if we're not cross compiling (not even for
   // windows->windows to a different arch), or if the sysroot has been set
@@ -716,13 +734,10 @@ void toolchains::MinGW::AddClangSystemIncludeArgs(const 
ArgList &DriverArgs,
   if (DriverArgs.hasArg(options::OPT_nostdlibinc))
     return;
 
-  addSystemInclude(DriverArgs, CC1Args,
-                   Base + SubdirName + llvm::sys::path::get_separator() +
-                       "include");
+  addSystemInclude(DriverArgs, CC1Args, Base + SubdirName + "include");
 
   // Gentoo
-  addSystemInclude(DriverArgs, CC1Args,
-                   Base + SubdirName + llvm::sys::path::get_separator() + 
"usr/include");
+  addSystemInclude(DriverArgs, CC1Args, Base + SubdirName + "usr/include");
 
   // Only include <base>/include if we're not cross compiling (but do allow it
   // if we're on Windows and building for Windows on another architecture),
@@ -801,7 +816,7 @@ void toolchains::MinGW::AddClangCXXStdlibIncludeArgs(
     if (getDriver().getVFS().exists(TargetDir))
       addSystemInclude(DriverArgs, CC1Args, TargetDir);
     addSystemInclude(DriverArgs, CC1Args,
-                     Base + SubdirName + Slash + "include" + Slash + "c++" +
+                     Base + SubdirName + "include" + Slash + "c++" +
                          Slash + "v1");
     addSystemInclude(DriverArgs, CC1Args,
                      Base + "include" + Slash + "c++" + Slash + "v1");
@@ -850,19 +865,19 @@ static bool testTriple(const Driver &D, const 
llvm::Triple &Triple,
                        const ArgList &Args) {
   // If an explicit sysroot is set, that will be used and we shouldn't try to
   // detect anything else.
-  std::string SubdirName;
   if (D.SysRoot.size())
     return true;
   llvm::Triple LiteralTriple = getLiteralTriple(D, Triple);
   std::string InstallBase = std::string(llvm::sys::path::parent_path(D.Dir));
   if (llvm::ErrorOr<std::string> TargetSubdir =
-          findClangRelativeSysroot(D, LiteralTriple, Triple, SubdirName))
+          findClangRelativeSysroot(D, LiteralTriple, Triple))
     return true;
   // If the install base itself looks like a mingw sysroot, we'll use that
   // - don't use any potentially unrelated gcc to influence what triple to use.
   if (looksLikeMinGWSysroot(InstallBase))
     return false;
-  if (llvm::ErrorOr<std::string> GPPName = findGcc(LiteralTriple, Triple))
+  if (llvm::ErrorOr<std::string> TargetSubdir =
+          findGccRelativeSysroot(LiteralTriple, Triple))
     return true;
   // If we neither found a colocated sysroot or a matching gcc executable,
   // conclude that we can't know if this is the correct spelling of the triple.
diff --git 
a/clang/test/Driver/Inputs/mingw_mingw_builds_tree/mingw32/i686-w64-mingw32/include/c++/backward/.keep
 
b/clang/test/Driver/Inputs/mingw_mingw_builds_tree/mingw32/i686-w64-mingw32/include/c++/backward/.keep
deleted file mode 100644
index e69de29bb2d1d..0000000000000
diff --git 
a/clang/test/Driver/Inputs/mingw_mingw_builds_tree/mingw32/i686-w64-mingw32/include/c++/i686-w64-mingw32/.keep
 
b/clang/test/Driver/Inputs/mingw_mingw_builds_tree/mingw32/i686-w64-mingw32/include/c++/i686-w64-mingw32/.keep
deleted file mode 100644
index e69de29bb2d1d..0000000000000
diff --git 
a/clang/test/Driver/Inputs/mingw_mingw_builds_tree/mingw32/lib/gcc/i686-w64-mingw32/4.9.1/include-fixed/.keep
 
b/clang/test/Driver/Inputs/mingw_mingw_builds_tree/mingw32/lib/gcc/i686-w64-mingw32/4.9.1/include-fixed/.keep
deleted file mode 100644
index e69de29bb2d1d..0000000000000
diff --git 
a/clang/test/Driver/Inputs/mingw_mingw_builds_tree/mingw32/lib/gcc/i686-w64-mingw32/4.9.1/include/.keep
 
b/clang/test/Driver/Inputs/mingw_mingw_builds_tree/mingw32/lib/gcc/i686-w64-mingw32/4.9.1/include/.keep
deleted file mode 100644
index e69de29bb2d1d..0000000000000
diff --git a/clang/test/Driver/mingw-sysroot.cpp 
b/clang/test/Driver/mingw-sysroot.cpp
index 683cc39fc025c..e84c23311a517 100644
--- a/clang/test/Driver/mingw-sysroot.cpp
+++ b/clang/test/Driver/mingw-sysroot.cpp
@@ -66,28 +66,6 @@
 // RUN: env "PATH=%t.dir/testroot-gcc/bin:%PATH%" 
%t.dir/testroot-gcc/bin/x86_64-w64-mingw32-clang --target=x86_64-w64-mingw32 
-rtlib=platform -stdlib=libstdc++ --sysroot="" -c -### %s 2>&1 | FileCheck 
-check-prefix=CHECK_TESTROOT_GCC %s
 
 
-// If we're executing clang from a directory with what looks like a mingw 
sysroot,
-// with headers in <base>/include and libs in <base>/lib, use that rather than 
looking
-// for another GCC in the path.
-//
-// Note, this test has a surprising quirk: We're testing with an install 
directory,
-// testroot-clang-native, which lacks the "x86_64-w64-mingw32" subdirectory, 
it only
-// has the include and lib subdirectories without any triple prefix.
-//
-// Since commit fd15cb935d7aae25ad62bfe06fe9f17cea585978, we avoid using the
-// <base>/include and <base>/lib directories when cross compiling. So 
technically, this
-// case testcase only works exactly as expected when running on x86_64 
Windows, when
-// this target isn't considered cross compiling.
-//
-// However we do still pass the include directory 
<base>/x86_64-w64-mingw32/include to
-// the -cc1 interface, even if it is missing. Thus, this test looks for this 
path name,
-// that indicates that we did choose the right base, even if this particular 
directory
-// actually doesn't exist here.
-
-// RUN: env "PATH=%t.dir/testroot-gcc/bin:%PATH%" 
%t.dir/testroot-clang-native/bin/clang -no-canonical-prefixes 
--target=x86_64-w64-mingw32 -rtlib=compiler-rt -stdlib=libstdc++ --sysroot="" 
-c -### %s 2>&1 | FileCheck -check-prefix=CHECK_TESTROOT_CLANG_NATIVE %s
-// CHECK_TESTROOT_CLANG_NATIVE: 
"{{[^"]+}}/testroot-clang-native{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}include"
-
-
 // If the user requests a different arch via the -m32 option, which changes
 // x86_64 into i386, check that the driver notices that it can't find a
 // sysroot for i386 but there is one for i686, and uses that one.
diff --git a/clang/test/Driver/mingw.cpp b/clang/test/Driver/mingw.cpp
index 971dc77bd37e0..0e2756c9fefc9 100644
--- a/clang/test/Driver/mingw.cpp
+++ b/clang/test/Driver/mingw.cpp
@@ -1,56 +1,41 @@
 // RUN: %clang --target=i686-windows-gnu -rtlib=platform -c -### 
--sysroot=%S/Inputs/mingw_clang_tree/mingw32 %s 2>&1 | FileCheck 
-check-prefix=CHECK_MINGW_CLANG_TREE %s
-// CHECK_MINGW_CLANG_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_clang_tree/mingw32{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}include"
-// CHECK_MINGW_CLANG_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_clang_tree/mingw32{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}usr{{/|\\\\}}include"
-// CHECK_MINGW_CLANG_TREE: 
"[[BASE]]/Inputs/mingw_clang_tree/mingw32{{/|\\\\}}include"
+// CHECK_MINGW_CLANG_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_clang_tree/mingw32{{/|\\\\}}include"
 
 
 // RUN: %clang --target=i686-windows-gnu -rtlib=platform -stdlib=libc++ -c 
-### --sysroot=%S/Inputs/mingw_clang_tree/mingw32 %s 2>&1 | FileCheck 
-check-prefix=CHECK_MINGW_CLANG_TREE_LIBCXX %s
 // CHECK_MINGW_CLANG_TREE_LIBCXX: 
"[[BASE:[^"]+]]/Inputs/mingw_clang_tree/mingw32{{/|\\\\}}include{{/|\\\\}}i686-unknown-windows-gnu{{/|\\\\}}c++{{/|\\\\}}v1"
-// CHECK_MINGW_CLANG_TREE_LIBCXX: 
"[[BASE:[^"]+]]/Inputs/mingw_clang_tree/mingw32{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}v1"
 
 
 // RUN: %clang --target=i686-pc-windows-gnu -rtlib=platform -stdlib=libstdc++ 
-c -### --sysroot=%S/Inputs/mingw_mingw_org_tree/mingw %s 2>&1 | FileCheck 
-check-prefix=CHECK_MINGW_ORG_TREE %s
 // CHECK_MINGW_ORG_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_mingw_org_tree/mingw{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}mingw32{{/|\\\\}}4.8.1{{/|\\\\}}include{{/|\\\\}}c++"
 // CHECK_MINGW_ORG_TREE: 
"[[BASE]]/Inputs/mingw_mingw_org_tree/mingw{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}mingw32{{/|\\\\}}4.8.1{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}mingw32"
 // CHECK_MINGW_ORG_TREE: 
"[[BASE]]/Inputs/mingw_mingw_org_tree/mingw{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}mingw32{{/|\\\\}}4.8.1{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}backward"
-// CHECK_MINGW_ORG_TREE: 
"[[BASE]]/Inputs/mingw_mingw_org_tree/mingw{{/|\\\\}}mingw32{{/|\\\\}}include"
 // CHECK_MINGW_ORG_TREE: 
"[[BASE]]/Inputs/mingw_mingw_org_tree/mingw{{/|\\\\}}include"
 
 
-// RUN: %clang --target=i686-pc-windows-gnu -rtlib=platform -stdlib=libstdc++ 
-c -### --sysroot=%S/Inputs/mingw_mingw_builds_tree/mingw32 %s 2>&1 | FileCheck 
-check-prefix=CHECK_MINGW_BUILDS_TREE %s
-// CHECK_MINGW_BUILDS_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_mingw_builds_tree/mingw32{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}include{{/|\\\\}}c++"
-// CHECK_MINGW_BUILDS_TREE: 
"[[BASE]]/Inputs/mingw_mingw_builds_tree/mingw32{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}i686-w64-mingw32"
-// CHECK_MINGW_BUILDS_TREE: 
"[[BASE]]/Inputs/mingw_mingw_builds_tree/mingw32{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}backward"
-// CHECK_MINGW_BUILDS_TREE: 
"[[BASE]]/Inputs/mingw_mingw_builds_tree/mingw32{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}include"
-
-
 // RUN: %clang --target=i686-pc-windows-gnu -rtlib=platform -stdlib=libstdc++ 
-c -### --sysroot=%S/Inputs/mingw_msys2_tree/msys64/mingw32 %s 2>&1 | FileCheck 
-check-prefix=CHECK_MINGW_MSYS_TREE %s
 // CHECK_MINGW_MSYS_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_msys2_tree/msys64{{/|\\\\}}mingw32{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}4.9.2"
 // CHECK_MINGW_MSYS_TREE: 
"[[BASE]]/Inputs/mingw_msys2_tree/msys64/mingw32{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}4.9.2{{/|\\\\}}i686-w64-mingw32"
 // CHECK_MINGW_MSYS_TREE: 
"[[BASE]]/Inputs/mingw_msys2_tree/msys64/mingw32{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}4.9.2{{/|\\\\}}backward"
-// CHECK_MINGW_MSYS_TREE: 
"[[BASE]]/Inputs/mingw_msys2_tree/msys64/mingw32{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}include"
 // CHECK_MINGW_MSYS_TREE: 
"[[BASE]]/Inputs/mingw_msys2_tree/msys64/mingw32{{/|\\\\}}include"
 
 
 // RUN: %clang --target=i686-pc-windows-gnu -rtlib=platform -stdlib=libstdc++ 
-c -### --sysroot=%S/Inputs/mingw_arch_tree/usr %s 2>&1 | FileCheck 
-check-prefix=CHECK_MINGW_ARCH_TREE %s
-// CHECK_MINGW_ARCH_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_arch_tree/usr{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}5.1.0"
-// CHECK_MINGW_ARCH_TREE: 
"[[BASE]]/Inputs/mingw_arch_tree/usr{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}5.1.0{{/|\\\\}}i686-w64-mingw32"
-// CHECK_MINGW_ARCH_TREE: 
"[[BASE]]/Inputs/mingw_arch_tree/usr{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}5.1.0{{/|\\\\}}backward"
-// CHECK_MINGW_ARCH_TREE: 
"[[BASE]]/Inputs/mingw_arch_tree/usr{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}include"
+// CHECK_MINGW_ARCH_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_arch_tree/usr{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}5.1.0"
+// CHECK_MINGW_ARCH_TREE: 
"[[BASE]]/Inputs/mingw_arch_tree/usr{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}5.1.0{{/|\\\\}}i686-w64-mingw32"
+// CHECK_MINGW_ARCH_TREE: 
"[[BASE]]/Inputs/mingw_arch_tree/usr{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}5.1.0{{/|\\\\}}backward"
 
 
 // RUN: %clang --target=x86_64-pc-windows-gnu -rtlib=platform 
-stdlib=libstdc++ -c -### --sysroot=%S/Inputs/mingw_ubuntu_tree/usr %s 2>&1 | 
FileCheck -check-prefix=CHECK_MINGW_UBUNTU_TREE %s
 // CHECK_MINGW_UBUNTU_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_ubuntu_tree/usr{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}4.8"
 // CHECK_MINGW_UBUNTU_TREE: 
"[[BASE]]/Inputs/mingw_ubuntu_tree/usr{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}4.8{{/|\\\\}}x86_64-w64-mingw32"
 // CHECK_MINGW_UBUNTU_TREE: 
"[[BASE]]/Inputs/mingw_ubuntu_tree/usr{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}4.8{{/|\\\\}}backward"
-// CHECK_MINGW_UBUNTU_TREE: 
"[[BASE]]/Inputs/mingw_ubuntu_tree/usr{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}include"
 
 
 // RUN: %clang --target=x86_64-pc-windows-gnu -rtlib=platform 
-stdlib=libstdc++ -c -### --sysroot=%S/Inputs/mingw_ubuntu_posix_tree/usr %s 
2>&1 | FileCheck -check-prefix=CHECK_MINGW_UBUNTU_POSIX_TREE %s
 // CHECK_MINGW_UBUNTU_POSIX_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_ubuntu_posix_tree/usr{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}c++"
 // CHECK_MINGW_UBUNTU_POSIX_TREE: 
"[[BASE]]/Inputs/mingw_ubuntu_posix_tree/usr{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}x86_64-w64-mingw32"
 // CHECK_MINGW_UBUNTU_POSIX_TREE: 
"[[BASE]]/Inputs/mingw_ubuntu_posix_tree/usr{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}backward"
-// CHECK_MINGW_UBUNTU_POSIX_TREE: 
"[[BASE]]/Inputs/mingw_ubuntu_posix_tree/usr{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}include"
 
 // RUN: %clang --target=i686-windows-gnu -E -### %s 2>&1 | FileCheck 
-check-prefix=CHECK_MINGW_NO_UNICODE %s
 // RUN: %clang --target=i686-windows-gnu -E -### %s -municode 2>&1 | FileCheck 
-check-prefix=CHECK_MINGW_UNICODE %s

>From 026333960f690ac1297cb2cd006727011b8c3ead Mon Sep 17 00:00:00 2001
From: Pierre Ossman <oss...@cendio.se>
Date: Fri, 22 Aug 2025 09:34:45 +0200
Subject: [PATCH 5/7] Don't add non-existant libstdc++ include paths

---
 clang/lib/Driver/ToolChains/MinGW.cpp | 2 ++
 clang/test/Driver/mingw-sysroot.cpp   | 3 ---
 clang/test/Driver/mingw.cpp           | 6 +++---
 3 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/MinGW.cpp 
b/clang/lib/Driver/ToolChains/MinGW.cpp
index 6077dc7ed2fa1..31198db9c21d3 100644
--- a/clang/lib/Driver/ToolChains/MinGW.cpp
+++ b/clang/lib/Driver/ToolChains/MinGW.cpp
@@ -852,6 +852,8 @@ void toolchains::MinGW::AddClangCXXStdlibIncludeArgs(
     llvm::sys::path::append(CppIncludeBases[8], "include",
                             "g++-v" + GccVer.MajorStr);
     for (auto &CppIncludeBase : CppIncludeBases) {
+      if (!getDriver().getVFS().exists(CppIncludeBase))
+        continue;
       addSystemInclude(DriverArgs, CC1Args, CppIncludeBase);
       CppIncludeBase += Slash;
       addSystemInclude(DriverArgs, CC1Args, CppIncludeBase + TripleDirName);
diff --git a/clang/test/Driver/mingw-sysroot.cpp 
b/clang/test/Driver/mingw-sysroot.cpp
index e84c23311a517..47e6c7f8ba600 100644
--- a/clang/test/Driver/mingw-sysroot.cpp
+++ b/clang/test/Driver/mingw-sysroot.cpp
@@ -37,9 +37,6 @@
 // CHECK_TESTROOT_GCC: "-internal-isystem" 
"[[BASE:[^"]+]]/testroot-gcc{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}c++"
 // CHECK_TESTROOT_GCC-SAME: {{^}} "-internal-isystem" 
"[[BASE]]/testroot-gcc{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}x86_64-w64-mingw32"
 // CHECK_TESTROOT_GCC-SAME: {{^}} "-internal-isystem" 
"[[BASE]]/testroot-gcc{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}backward"
-// CHECK_TESTROOT_GCC: "-internal-isystem" 
"[[BASE]]/testroot-gcc{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}g++-v10.2-posix"
-// CHECK_TESTROOT_GCC: "-internal-isystem" 
"[[BASE]]/testroot-gcc{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}g++-v10.2"
-// CHECK_TESTROOT_GCC: "-internal-isystem" 
"[[BASE]]/testroot-gcc{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}10.2-posix{{/|\\\\}}include{{/|\\\\}}g++-v10"
 // CHECK_TESTROOT_GCC: "-internal-isystem" 
"[[BASE]]/testroot-gcc{{/|\\\\}}x86_64-w64-mingw32{{/|\\\\}}include"
 
 
diff --git a/clang/test/Driver/mingw.cpp b/clang/test/Driver/mingw.cpp
index 0e2756c9fefc9..f5cc0bdd4d41d 100644
--- a/clang/test/Driver/mingw.cpp
+++ b/clang/test/Driver/mingw.cpp
@@ -21,9 +21,9 @@
 
 
 // RUN: %clang --target=i686-pc-windows-gnu -rtlib=platform -stdlib=libstdc++ 
-c -### --sysroot=%S/Inputs/mingw_arch_tree/usr %s 2>&1 | FileCheck 
-check-prefix=CHECK_MINGW_ARCH_TREE %s
-// CHECK_MINGW_ARCH_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_arch_tree/usr{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}5.1.0"
-// CHECK_MINGW_ARCH_TREE: 
"[[BASE]]/Inputs/mingw_arch_tree/usr{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}5.1.0{{/|\\\\}}i686-w64-mingw32"
-// CHECK_MINGW_ARCH_TREE: 
"[[BASE]]/Inputs/mingw_arch_tree/usr{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}5.1.0{{/|\\\\}}backward"
+// CHECK_MINGW_ARCH_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_arch_tree/usr{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}5.1.0"
+// CHECK_MINGW_ARCH_TREE: 
"[[BASE]]/Inputs/mingw_arch_tree/usr{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}5.1.0{{/|\\\\}}i686-w64-mingw32"
+// CHECK_MINGW_ARCH_TREE: 
"[[BASE]]/Inputs/mingw_arch_tree/usr{{/|\\\\}}lib{{/|\\\\}}gcc{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}..{{/|\\\\}}i686-w64-mingw32{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}5.1.0{{/|\\\\}}backward"
 
 
 // RUN: %clang --target=x86_64-pc-windows-gnu -rtlib=platform 
-stdlib=libstdc++ -c -### --sysroot=%S/Inputs/mingw_ubuntu_tree/usr %s 2>&1 | 
FileCheck -check-prefix=CHECK_MINGW_UBUNTU_TREE %s

>From 6ca173fd16be95b4332cfb85b2adf9b01a5cabc9 Mon Sep 17 00:00:00 2001
From: Pierre Ossman <oss...@cendio.se>
Date: Fri, 22 Aug 2025 10:09:20 +0200
Subject: [PATCH 6/7] Only add one libstdc++ include path

Later ones might be for a different gcc (e.g. system gcc rather than a
target specific one).
---
 clang/lib/Driver/ToolChains/MinGW.cpp |  1 +
 clang/test/Driver/mingw.cpp           | 12 ++++++------
 2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/MinGW.cpp 
b/clang/lib/Driver/ToolChains/MinGW.cpp
index 31198db9c21d3..e172ec241a3d2 100644
--- a/clang/lib/Driver/ToolChains/MinGW.cpp
+++ b/clang/lib/Driver/ToolChains/MinGW.cpp
@@ -858,6 +858,7 @@ void toolchains::MinGW::AddClangCXXStdlibIncludeArgs(
       CppIncludeBase += Slash;
       addSystemInclude(DriverArgs, CC1Args, CppIncludeBase + TripleDirName);
       addSystemInclude(DriverArgs, CC1Args, CppIncludeBase + "backward");
+      break;
     }
     break;
   }
diff --git a/clang/test/Driver/mingw.cpp b/clang/test/Driver/mingw.cpp
index f5cc0bdd4d41d..8d1ce97ecfb46 100644
--- a/clang/test/Driver/mingw.cpp
+++ b/clang/test/Driver/mingw.cpp
@@ -14,9 +14,9 @@
 
 
 // RUN: %clang --target=i686-pc-windows-gnu -rtlib=platform -stdlib=libstdc++ 
-c -### --sysroot=%S/Inputs/mingw_msys2_tree/msys64/mingw32 %s 2>&1 | FileCheck 
-check-prefix=CHECK_MINGW_MSYS_TREE %s
-// CHECK_MINGW_MSYS_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_msys2_tree/msys64{{/|\\\\}}mingw32{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}4.9.2"
-// CHECK_MINGW_MSYS_TREE: 
"[[BASE]]/Inputs/mingw_msys2_tree/msys64/mingw32{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}4.9.2{{/|\\\\}}i686-w64-mingw32"
-// CHECK_MINGW_MSYS_TREE: 
"[[BASE]]/Inputs/mingw_msys2_tree/msys64/mingw32{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}4.9.2{{/|\\\\}}backward"
+// CHECK_MINGW_MSYS_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_msys2_tree/msys64{{/|\\\\}}mingw32{{/|\\\\}}include{{/|\\\\}}c++"
+// CHECK_MINGW_MSYS_TREE: 
"[[BASE]]/Inputs/mingw_msys2_tree/msys64/mingw32{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}i686-w64-mingw32"
+// CHECK_MINGW_MSYS_TREE: 
"[[BASE]]/Inputs/mingw_msys2_tree/msys64/mingw32{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}backward"
 // CHECK_MINGW_MSYS_TREE: 
"[[BASE]]/Inputs/mingw_msys2_tree/msys64/mingw32{{/|\\\\}}include"
 
 
@@ -27,9 +27,9 @@
 
 
 // RUN: %clang --target=x86_64-pc-windows-gnu -rtlib=platform 
-stdlib=libstdc++ -c -### --sysroot=%S/Inputs/mingw_ubuntu_tree/usr %s 2>&1 | 
FileCheck -check-prefix=CHECK_MINGW_UBUNTU_TREE %s
-// CHECK_MINGW_UBUNTU_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_ubuntu_tree/usr{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}4.8"
-// CHECK_MINGW_UBUNTU_TREE: 
"[[BASE]]/Inputs/mingw_ubuntu_tree/usr{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}4.8{{/|\\\\}}x86_64-w64-mingw32"
-// CHECK_MINGW_UBUNTU_TREE: 
"[[BASE]]/Inputs/mingw_ubuntu_tree/usr{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}4.8{{/|\\\\}}backward"
+// CHECK_MINGW_UBUNTU_TREE: 
"[[BASE:[^"]+]]/Inputs/mingw_ubuntu_tree/usr{{/|\\\\}}include{{/|\\\\}}c++"
+// CHECK_MINGW_UBUNTU_TREE: 
"[[BASE]]/Inputs/mingw_ubuntu_tree/usr{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}x86_64-w64-mingw32"
+// CHECK_MINGW_UBUNTU_TREE: 
"[[BASE]]/Inputs/mingw_ubuntu_tree/usr{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}backward"
 
 
 // RUN: %clang --target=x86_64-pc-windows-gnu -rtlib=platform 
-stdlib=libstdc++ -c -### --sysroot=%S/Inputs/mingw_ubuntu_posix_tree/usr %s 
2>&1 | FileCheck -check-prefix=CHECK_MINGW_UBUNTU_POSIX_TREE %s

>From 88ca7a903ea0bc67b40901a90d71c29c7e75c8ae Mon Sep 17 00:00:00 2001
From: Pierre Ossman <oss...@cendio.se>
Date: Fri, 22 Aug 2025 11:04:40 +0200
Subject: [PATCH 7/7] Find cross-compiler toolchain libraries

---
 clang/lib/Driver/ToolChains/MinGW.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/clang/lib/Driver/ToolChains/MinGW.cpp 
b/clang/lib/Driver/ToolChains/MinGW.cpp
index e172ec241a3d2..999a9e1e180d9 100644
--- a/clang/lib/Driver/ToolChains/MinGW.cpp
+++ b/clang/lib/Driver/ToolChains/MinGW.cpp
@@ -566,6 +566,9 @@ toolchains::MinGW::MinGW(const Driver &D, const 
llvm::Triple &Triple,
   // GccLibDir must precede Base/lib so that the
   // correct crtbegin.o ,cetend.o would be found.
   getFilePaths().push_back(GccLibDir);
+  std::string CandidateGccLibDir = GccParentLibPath + "/../" + TripleDirName + 
"/lib";
+  if (getDriver().getVFS().exists(CandidateGccLibDir))
+    getFilePaths().push_back(CandidateGccLibDir);
 
   // openSUSE/Fedora/Gentoo
   std::string CandidateSubdir = "mingw";

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to