[clang] Fix main header matching for headers with special characters. (PR #211934)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jul 24 14:54:10 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: dmaclach (dmaclach)
<details>
<summary>Changes</summary>
In Clang Tooling, escape HeaderStem before constructing MainIncludeRegex to prevent special characters (such as '+') from being interpreted as regex operators. Useful for Objective-C where "Foo+Bar.h" headers are very common for categories.
---
Full diff: https://github.com/llvm/llvm-project/pull/211934.diff
2 Files Affected:
- (modified) clang/lib/Tooling/Inclusions/HeaderIncludes.cpp (+2-1)
- (modified) clang/unittests/Tooling/HeaderIncludesTest.cpp (+14)
``````````diff
diff --git a/clang/lib/Tooling/Inclusions/HeaderIncludes.cpp b/clang/lib/Tooling/Inclusions/HeaderIncludes.cpp
index 1212af52e1490..34f21faa8e342 100644
--- a/clang/lib/Tooling/Inclusions/HeaderIncludes.cpp
+++ b/clang/lib/Tooling/Inclusions/HeaderIncludes.cpp
@@ -340,7 +340,8 @@ bool IncludeCategoryManager::isMainHeader(StringRef IncludeName) const {
else if (FileStem.equals_insensitive(HeaderStem))
Matching = FileStem; // example 3)
if (!Matching.empty()) {
- llvm::Regex MainIncludeRegex(HeaderStem.str() + Style.IncludeIsMainRegex,
+ llvm::Regex MainIncludeRegex(llvm::Regex::escape(HeaderStem) +
+ Style.IncludeIsMainRegex,
llvm::Regex::IgnoreCase);
if (MainIncludeRegex.match(Matching))
return true;
diff --git a/clang/unittests/Tooling/HeaderIncludesTest.cpp b/clang/unittests/Tooling/HeaderIncludesTest.cpp
index 95fb05885a0b9..bc2ac3a97e97d 100644
--- a/clang/unittests/Tooling/HeaderIncludesTest.cpp
+++ b/clang/unittests/Tooling/HeaderIncludesTest.cpp
@@ -144,6 +144,20 @@ TEST_F(HeaderIncludesTest, InsertAfterMainHeader) {
EXPECT_NE(Expected, insert(Code, "<a>")) << "Not main header";
}
+TEST_F(HeaderIncludesTest, InsertAfterMainHeaderWithSpecialChars) {
+ std::string Code = "#include \"fix+bar.h\"\n"
+ "\n"
+ "int main() {}";
+ std::string Expected = "#include \"fix+bar.h\"\n"
+ "#include <a>\n"
+ "\n"
+ "int main() {}";
+ Style = format::getGoogleStyle(format::FormatStyle::LanguageKind::LK_Cpp)
+ .IncludeStyle;
+ FileName = "fix+bar.cpp";
+ EXPECT_EQ(Expected, insert(Code, "<a>"));
+}
+
TEST_F(HeaderIncludesTest, InsertMainHeader) {
Style = format::getGoogleStyle(format::FormatStyle::LanguageKind::LK_Cpp)
.IncludeStyle;
``````````
</details>
https://github.com/llvm/llvm-project/pull/211934
More information about the cfe-commits
mailing list