[clang] [clang] Fix include behavior for leading double slashes (PR #213689)
QIU Chaofan via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 6 12:10:12 PDT 2026
https://github.com/ecnelises updated https://github.com/llvm/llvm-project/pull/213689
>From e11e853f5de5f27f7dc2bb36885e8b5fe5d4525d Mon Sep 17 00:00:00 2001
From: Qiu Chaofan <qcf at ecnelises.com>
Date: Mon, 3 Aug 2026 22:36:06 +0800
Subject: [PATCH] [clang] Fix include behavior for leading double slashes
LLVM path parsing sees path like "//foo.h" as network-style root name
instead of file in root directory, which makes compiler normalize
"//foo.h" to "foo.h" and search it unexpectedly in paths.
This change uses `is_absolute_gnu` instead so that path separator is
treated directly. Windows UNC paths are also seen as absolute.
Fixes #133174
---
clang/docs/ReleaseNotes.md | 3 +++
clang/lib/Lex/HeaderSearch.cpp | 6 ++++--
clang/test/Preprocessor/Inputs/leading-double-slash.h | 0
clang/test/Preprocessor/include-leading-double-backslash.c | 4 ++++
clang/test/Preprocessor/include-leading-double-slash.c | 3 +++
5 files changed, 14 insertions(+), 2 deletions(-)
create mode 100644 clang/test/Preprocessor/Inputs/leading-double-slash.h
create mode 100644 clang/test/Preprocessor/include-leading-double-backslash.c
create mode 100644 clang/test/Preprocessor/include-leading-double-slash.c
diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md
index 2f13ec59483ee..ebf369ba3244c 100644
--- a/clang/docs/ReleaseNotes.md
+++ b/clang/docs/ReleaseNotes.md
@@ -447,6 +447,9 @@ features cannot lower the translation-unit ABI level;
non-reproducible across runs. (#GH209639)
#### Miscellaneous Bug Fixes
+- Fixed incorrect header search when filename starts with two path separators.
+ Clang now treats path in `#include <//foo.h>` as `/foo.h` instead of `foo.h`.
+ (GH#133174)
#### Miscellaneous Clang Crashes Fixed
- Fixed a crash when instantiating an invalid dependent friend destructor declaration in a class template. (#GH210234)
diff --git a/clang/lib/Lex/HeaderSearch.cpp b/clang/lib/Lex/HeaderSearch.cpp
index ecd80db10f2bd..61ac296b12453 100644
--- a/clang/lib/Lex/HeaderSearch.cpp
+++ b/clang/lib/Lex/HeaderSearch.cpp
@@ -967,8 +967,10 @@ OptionalFileEntryRef HeaderSearch::LookupFile(
if (SuggestedModule)
*SuggestedModule = ModuleMap::KnownHeader();
- // If 'Filename' is absolute, check to see if it exists and no searching.
- if (llvm::sys::path::is_absolute(Filename)) {
+ // If 'Filename' is absolute under GNU rules, check it directly without
+ // searching in paths. Paths with leading native separator are treated as
+ // absolute, including '//' and Windows UNC paths.
+ if (llvm::sys::path::is_absolute_gnu(Filename)) {
CurDir = nullptr;
// If this was an #include_next "/absolute/file", fail.
diff --git a/clang/test/Preprocessor/Inputs/leading-double-slash.h b/clang/test/Preprocessor/Inputs/leading-double-slash.h
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Preprocessor/include-leading-double-backslash.c b/clang/test/Preprocessor/include-leading-double-backslash.c
new file mode 100644
index 0000000000000..3afc36eb63cb9
--- /dev/null
+++ b/clang/test/Preprocessor/include-leading-double-backslash.c
@@ -0,0 +1,4 @@
+// RUN: %clang_cc1 %s -verify -I %S/Inputs
+// REQUIRES: system-windows
+
+#include "\\leading-double-slash.h" // expected-error {{'\\leading-double-slash.h' file not found}}
diff --git a/clang/test/Preprocessor/include-leading-double-slash.c b/clang/test/Preprocessor/include-leading-double-slash.c
new file mode 100644
index 0000000000000..aa6b9af200270
--- /dev/null
+++ b/clang/test/Preprocessor/include-leading-double-slash.c
@@ -0,0 +1,3 @@
+// RUN: %clang_cc1 %s -verify -I %S/Inputs
+
+#include "//leading-double-slash.h" // expected-error {{'//leading-double-slash.h' file not found}}
More information about the cfe-commits
mailing list