diff options
Diffstat (limited to 'clang-tools-extra/clangd/FindSymbols.cpp')
-rw-r--r-- | clang-tools-extra/clangd/FindSymbols.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/clang-tools-extra/clangd/FindSymbols.cpp b/clang-tools-extra/clangd/FindSymbols.cpp index 84bcbc1..7655a39 100644 --- a/clang-tools-extra/clangd/FindSymbols.cpp +++ b/clang-tools-extra/clangd/FindSymbols.cpp @@ -14,6 +14,7 @@ #include "SourceCode.h" #include "index/Index.h" #include "support/Logger.h" +#include "clang/AST/DeclFriend.h" #include "clang/AST/DeclTemplate.h" #include "clang/Index/IndexSymbol.h" #include "llvm/ADT/ArrayRef.h" @@ -391,6 +392,17 @@ private: D = TD; } + // FriendDecls don't act as DeclContexts, but they might wrap a function + // definition that won't be visible through other means in the AST. Hence + // unwrap it here instead. + if (auto *Friend = llvm::dyn_cast<FriendDecl>(D)) { + if (auto *Func = + llvm::dyn_cast_or_null<FunctionDecl>(Friend->getFriendDecl())) { + if (Func->isThisDeclarationADefinition()) + D = Func; + } + } + VisitKind Visit = shouldVisit(D); if (Visit == VisitKind::No) return; |