diff --git a/clang-tools-extra/clangd/IncludeCleaner.cpp b/clang-tools-extra/clangd/IncludeCleaner.cpp --- a/clang-tools-extra/clangd/IncludeCleaner.cpp +++ b/clang-tools-extra/clangd/IncludeCleaner.cpp @@ -129,7 +129,9 @@ void add(SourceLocation Loc) { add(SM.getFileID(Loc), Loc); } void add(FileID FID, SourceLocation Loc) { - if (FID.isInvalid()) + // Check if Loc is not written in a physical file. + if (FID.isInvalid() || SM.isWrittenInBuiltinFile(Loc) || + SM.isWrittenInCommandLineFile(Loc)) return; assert(SM.isInFileID(Loc, FID)); if (Loc.isFileID()) { diff --git a/clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp b/clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp --- a/clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp +++ b/clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp @@ -234,7 +234,7 @@ "")); } -TEST(IncludeCleaner, ScratchBuffer) { +TEST(IncludeCleaner, VirtualBuffers) { TestTU TU; TU.Filename = "foo.cpp"; TU.Code = R"cpp( @@ -242,6 +242,10 @@ using flags::FLAGS_FOO; + // CLI will come from a define, __llvm__ is a built-in. In both cases, they + // come from non-existent files. + int y = CLI + __llvm__; + int concat(a, b) = 42; )cpp"; // The pasting operator in combination with DEFINE_FLAG will create @@ -258,6 +262,7 @@ #define ab x #define concat(x, y) x##y )cpp"; + TU.ExtraArgs = {"-DCLI=42"}; ParsedAST AST = TU.build(); auto &SM = AST.getSourceManager(); auto &Includes = AST.getIncludeStructure();