[clang] [clang][Coverage] Fix crash for nested macro in system headers (PR #181319)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 12 22:56:00 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-codegen
Author: None (Nuullll)
<details>
<summary>Changes</summary>
When compiling with coverage enabled, clang crashes if a file includes a system header that contains nested macro expansions.
The existing logic in `CoverageMappingBuilder::gatherFileIDs` attempts to remap locations from system macros by checking `SM.isInSystemMacro(Loc)`. This check is insufficient as it misses cases where a location's *spelling location* is still in a system header, such as with nested macros. This leads to the `!SM.isInSystemHeader(SM.getSpellingLoc(Loc))` assertion firing later on.
This patch fixes #<!-- -->179316 by checking the spelling location anyway. It replaces the assertion with a check that skips any region whose spelling location is in a system header (when system header coverage is disabled). This correctly handles all cases, including nested macros.
---
Full diff: https://github.com/llvm/llvm-project/pull/181319.diff
3 Files Affected:
- (modified) clang/lib/CodeGen/CoverageMappingGen.cpp (+8-2)
- (added) clang/test/CoverageMapping/Inputs/nested.h (+2)
- (added) clang/test/CoverageMapping/system_nested_macro.cpp (+8)
``````````diff
diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp
index 803037d1874b3..82426d2893484 100644
--- a/clang/lib/CodeGen/CoverageMappingGen.cpp
+++ b/clang/lib/CodeGen/CoverageMappingGen.cpp
@@ -401,8 +401,14 @@ class CoverageMappingBuilder {
if (!Visited.insert(File).second)
continue;
- assert(SystemHeadersCoverage ||
- !SM.isInSystemHeader(SM.getSpellingLoc(Loc)));
+ // Ignore regions from system headers unless collecting coverage from
+ // system headers is explicitly enabled.
+ if (!SystemHeadersCoverage &&
+ SM.isInSystemHeader(SM.getSpellingLoc(Loc))) {
+ assert(!Region.isMCDCBranch() && !Region.isMCDCDecision() &&
+ "Don't suppress the condition in system headers");
+ continue;
+ }
unsigned Depth = 0;
for (SourceLocation Parent = getIncludeOrExpansionLoc(Loc);
diff --git a/clang/test/CoverageMapping/Inputs/nested.h b/clang/test/CoverageMapping/Inputs/nested.h
new file mode 100644
index 0000000000000..46c46242e1f73
--- /dev/null
+++ b/clang/test/CoverageMapping/Inputs/nested.h
@@ -0,0 +1,2 @@
+#define Y X
+Y
diff --git a/clang/test/CoverageMapping/system_nested_macro.cpp b/clang/test/CoverageMapping/system_nested_macro.cpp
new file mode 100644
index 0000000000000..ec73d2a69de5f
--- /dev/null
+++ b/clang/test/CoverageMapping/system_nested_macro.cpp
@@ -0,0 +1,8 @@
+// clang previously crashes when including nested macro from a system header.
+// REQUIRES: asserts
+// RUN: %clang -isystem %S/Inputs -fprofile-instr-generate -fcoverage-mapping -c %s
+
+int main() {
+#define X ;
+#include <nested.h>
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/181319
More information about the cfe-commits
mailing list