[clangd] IncludeCleaner: Do not process locations in built-in files

Doing otherwise leads to crashing. Way to reproduce: open "gmock/gmock.h" in
the LLVM source tree.

Reviewed By: kadircet

Differential Revision: https://reviews.llvm.org/D112608
This commit is contained in:
Kirill Bobyrev 2021-10-27 19:31:39 +02:00
parent 65bb6593e5
commit 22079c61a8
No known key found for this signature in database
GPG Key ID: 2307C055C8384FA0
2 changed files with 9 additions and 2 deletions

View File

@ -129,7 +129,9 @@ struct ReferencedFiles {
void add(SourceLocation Loc) { add(SM.getFileID(Loc), Loc); } void add(SourceLocation Loc) { add(SM.getFileID(Loc), Loc); }
void add(FileID FID, SourceLocation 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; return;
assert(SM.isInFileID(Loc, FID)); assert(SM.isInFileID(Loc, FID));
if (Loc.isFileID()) { if (Loc.isFileID()) {

View File

@ -234,7 +234,7 @@ TEST(IncludeCleaner, GetUnusedHeaders) {
"<system_header.h>")); "<system_header.h>"));
} }
TEST(IncludeCleaner, ScratchBuffer) { TEST(IncludeCleaner, VirtualBuffers) {
TestTU TU; TestTU TU;
TU.Filename = "foo.cpp"; TU.Filename = "foo.cpp";
TU.Code = R"cpp( TU.Code = R"cpp(
@ -242,6 +242,10 @@ TEST(IncludeCleaner, ScratchBuffer) {
using flags::FLAGS_FOO; 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; int concat(a, b) = 42;
)cpp"; )cpp";
// The pasting operator in combination with DEFINE_FLAG will create // The pasting operator in combination with DEFINE_FLAG will create
@ -258,6 +262,7 @@ TEST(IncludeCleaner, ScratchBuffer) {
#define ab x #define ab x
#define concat(x, y) x##y #define concat(x, y) x##y
)cpp"; )cpp";
TU.ExtraArgs = {"-DCLI=42"};
ParsedAST AST = TU.build(); ParsedAST AST = TU.build();
auto &SM = AST.getSourceManager(); auto &SM = AST.getSourceManager();
auto &Includes = AST.getIncludeStructure(); auto &Includes = AST.getIncludeStructure();