https://github.com/aeubanks created https://github.com/llvm/llvm-project/pull/71097
Canonicalizing paths on Windows leads to unexpected things like changing drive letters. As a short term fix, do not canonicalize system headers on Windows by default. Fixes #70011 >From 3d519b42c350417727570ad405201cff6f1fb186 Mon Sep 17 00:00:00 2001 From: Arthur Eubanks <aeuba...@google.com> Date: Thu, 2 Nov 2023 13:00:33 -0700 Subject: [PATCH] [clang] Do not pass -canonical-system-headers on Windows by default Canonicalizing paths on Windows leads to unexpected things like changing drive letters. As a short term fix, do not canonicalize system headers on Windows by default. Fixes #70011 --- clang/lib/Driver/ToolChains/Clang.cpp | 13 ++++++++++++- clang/test/Driver/canonical-system-headers-win.c | 9 +++++++++ clang/test/Driver/canonical-system-headers.c | 3 +++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 clang/test/Driver/canonical-system-headers-win.c diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 79f7fba22570746..b94728f79e0a175 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -1180,8 +1180,19 @@ void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA, if (ArgM->getOption().matches(options::OPT_M) || ArgM->getOption().matches(options::OPT_MD)) CmdArgs.push_back("-sys-header-deps"); + + // #70011: Canonicalization on Windows does unexpected things like change + // drive letters. + // FIXME: find and use Windows API that canonicalizes paths except for + // drive letter. +#if defined(_WIN32) || defined(_WIN64) + bool CanonicalSystemHeadersDefault = false; +#else + bool CanonicalSystemHeadersDefault = true; +#endif if (Args.hasFlag(options::OPT_canonical_prefixes, - options::OPT_no_canonical_prefixes, true)) + options::OPT_no_canonical_prefixes, + CanonicalSystemHeadersDefault)) CmdArgs.push_back("-canonical-system-headers"); if ((isa<PrecompileJobAction>(JA) && !Args.hasArg(options::OPT_fno_module_file_deps)) || diff --git a/clang/test/Driver/canonical-system-headers-win.c b/clang/test/Driver/canonical-system-headers-win.c new file mode 100644 index 000000000000000..cc3ec57ff4de614 --- /dev/null +++ b/clang/test/Driver/canonical-system-headers-win.c @@ -0,0 +1,9 @@ +// REQUIRES: system-windows +// The default on Windows is false due to #70011. + +// RUN: %clang -MD -no-canonical-prefixes -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-NO +// RUN: %clang -MD -canonical-prefixes -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-YES +// RUN: %clang -MD -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-NO + +// CHECK-YES: "-canonical-system-headers" +// CHECK-NO-NOT: "-canonical-system-headers" diff --git a/clang/test/Driver/canonical-system-headers.c b/clang/test/Driver/canonical-system-headers.c index a7ab57521fc2249..d37b5925c73035d 100644 --- a/clang/test/Driver/canonical-system-headers.c +++ b/clang/test/Driver/canonical-system-headers.c @@ -1,3 +1,6 @@ +// REQUIRES: !system-windows +// The default on Windows is false due to #70011. + // RUN: %clang -MD -no-canonical-prefixes -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-NO // RUN: %clang -MD -canonical-prefixes -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-YES // RUN: %clang -MD -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-YES _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits