[clangd] Make sure constructors do not reference class

Reviewers: gribozavr

Subscribers: ilya-biryukov, ioeric, MaskRay, jkorous, arphaman, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D58815

llvm-svn: 355679
This commit is contained in:
Kadir Cetinkaya 2019-03-08 09:54:37 +00:00
parent 7ec1ec10c9
commit 017cc6c190
3 changed files with 19 additions and 1 deletions

View File

@ -15,6 +15,7 @@
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/RecursiveASTVisitor.h"
#include "clang/Index/IndexDataConsumer.h"
#include "clang/Index/IndexSymbol.h"
#include "clang/Index/IndexingAction.h"
#include "clang/Index/USRGeneration.h"
#include "llvm/Support/Path.h"
@ -154,6 +155,10 @@ public:
llvm::ArrayRef<index::SymbolRelation> Relations,
SourceLocation Loc,
index::IndexDataConsumer::ASTNodeInfo ASTNode) override {
// Skip non-semantic references.
if (Roles & static_cast<unsigned>(index::SymbolRole::NameReference))
return true;
if (Loc == SearchedLocation) {
auto IsImplicitExpr = [](const Expr *E) {
if (!E)

View File

@ -305,6 +305,10 @@ bool SymbolCollector::handleDeclOccurence(
Decl::FriendObjectKind::FOK_None) &&
!(Roles & static_cast<unsigned>(index::SymbolRole::Definition)))
return true;
// Skip non-semantic references, we should start processing these when we
// decide to implement renaming with index support.
if ((Roles & static_cast<unsigned>(index::SymbolRole::NameReference)))
return true;
// A declaration created for a friend declaration should not be used as the
// canonical declaration in the index. Use OrigD instead, unless we've already
// picked a replacement for D

View File

@ -1337,6 +1337,15 @@ TEST(FindReferences, WithinAST) {
}
)cpp",
R"cpp(// Constructor
struct Foo {
[[F^oo]](int);
};
void foo() {
Foo f = [[Foo]](42);
}
)cpp",
R"cpp(// Typedef
typedef int [[Foo]];
int main() {