forked from OSchip/llvm-project
[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:
parent
1858f4b50d
commit
b420065969
|
@ -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;
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in New Issue