diff --git a/clang-tools-extra/clangd/Preamble.cpp b/clang-tools-extra/clangd/Preamble.cpp --- a/clang-tools-extra/clangd/Preamble.cpp +++ b/clang-tools-extra/clangd/Preamble.cpp @@ -685,13 +685,16 @@ // Include already present in the baseline preamble. Set resolved path and // put into preamble includes. if (It != ExistingIncludes.end()) { - auto &PatchedInc = PP.PreambleIncludes.emplace_back(); - // Copy everything from existing include, apart from the location, when - // it's coming from baseline preamble. - if (It->second) + if (It->second) { + // If this header is included in an active region of the baseline + // preamble, preserve it. + auto &PatchedInc = PP.PreambleIncludes.emplace_back(); + // Copy everything from existing include, apart from the location, + // when it's coming from baseline preamble. PatchedInc = *It->second; - PatchedInc.HashLine = Inc.HashLine; - PatchedInc.HashOffset = Inc.HashOffset; + PatchedInc.HashLine = Inc.HashLine; + PatchedInc.HashOffset = Inc.HashOffset; + } continue; } // Include is new in the modified preamble. Inject it into the patch and diff --git a/clang-tools-extra/clangd/unittests/PreambleTests.cpp b/clang-tools-extra/clangd/unittests/PreambleTests.cpp --- a/clang-tools-extra/clangd/unittests/PreambleTests.cpp +++ b/clang-tools-extra/clangd/unittests/PreambleTests.cpp @@ -170,6 +170,9 @@ auto TU = TestTU::withCode(R"cpp( #include "a.h" // IWYU pragma: keep #include "c.h" + #ifdef FOO + #include "d.h" + #endif )cpp"); TU.AdditionalFiles["a.h"] = "#include \"b.h\""; TU.AdditionalFiles["b.h"] = ""; @@ -178,10 +181,14 @@ auto BaselinePreamble = buildPreamble( TU.Filename, *buildCompilerInvocation(PI, Diags), PI, true, nullptr); // We drop c.h from modified and add a new header. Since the latter is patched - // we should only get a.h in preamble includes. + // we should only get a.h in preamble includes. d.h shouldn't be part of the + // preamble, as it's coming from a disabled region. TU.Code = R"cpp( #include "a.h" #include "b.h" + #ifdef FOO + #include "d.h" + #endif )cpp"; auto PP = PreamblePatch::createFullPatch(testPath(TU.Filename), TU.inputs(FS), *BaselinePreamble);