[clangd] Fix an assertion crash in ReferenceFinder.

Summary: The assertion is almost correct, but it fails on refs from non-preamble

Reviewers: sammccall

Reviewed By: sammccall

Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, usaxena95, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D77222
This commit is contained in:
Haojian Wu 2020-04-02 09:29:16 +02:00
parent 1858f4b50d
commit b420065969
2 changed files with 26 additions and 4 deletions

View File

@ -583,13 +583,11 @@ public:
SourceLocation Loc,
index::IndexDataConsumer::ASTNodeInfo ASTNode) override {
assert(D->isCanonicalDecl() && "expect D to be a canonical declaration");
if (!CanonicalTargets.count(D))
const SourceManager &SM = AST.getSourceManager();
if (!CanonicalTargets.count(D) || !isInsideMainFile(Loc, SM))
return true;
const auto &TB = AST.getTokens();
const SourceManager &SM = AST.getSourceManager();
Loc = SM.getFileLoc(Loc);
// We are only traversing decls *inside* the main file, so this should hold.
assert(isInsideMainFile(Loc, SM));
if (const auto *Tok = TB.spelledTokenAt(Loc))
References.push_back({*Tok, Roles});
return true;

View File

@ -1121,6 +1121,30 @@ TEST(FindReferences, WithinAST) {
}
}
TEST(FindReferences, MainFileReferencesOnly) {
llvm::StringRef Test =
R"cpp(
void test() {
int [[fo^o]] = 1;
// refs not from main file should not be included.
#include "foo.inc"
})cpp";
Annotations Code(Test);
auto TU = TestTU::withCode(Code.code());
TU.AdditionalFiles["foo.inc"] = R"cpp(
foo = 3;
)cpp";
auto AST = TU.build();
std::vector<Matcher<Location>> ExpectedLocations;
for (const auto &R : Code.ranges())
ExpectedLocations.push_back(RangeIs(R));
EXPECT_THAT(findReferences(AST, Code.point(), 0).References,
ElementsAreArray(ExpectedLocations))
<< Test;
}
TEST(FindReferences, ExplicitSymbols) {
const char *Tests[] = {
R"cpp(