diff options
author | Kadir Cetinkaya <kadircet@google.com> | 2020-01-20 19:02:48 +0100 |
---|---|---|
committer | Tom Stellard <tstellar@redhat.com> | 2020-06-23 14:23:12 -0700 |
commit | 97065683c6a965be9bc3dc06b0264940ed75c4af (patch) | |
tree | c217b780866315d92dc92062dfbdc445512d2e4e | |
parent | c69ed62ea195a598c62e216fa45bbe1b1ede5bae (diff) | |
download | llvm-97065683c6a965be9bc3dc06b0264940ed75c4af.tar.gz |
[clangd] Fix DocumentOutline for concepts
Summary: Fixes https://github.com/clangd/clangd/issues/256
Reviewers: kbobyrev
Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D73056
(cherry picked from commit fb3d9153c01b9a560680465190d6ecd804e4c486)
-rw-r--r-- | clang-tools-extra/clangd/FindSymbols.cpp | 7 | ||||
-rw-r--r-- | clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp | 9 |
2 files changed, 14 insertions, 2 deletions
diff --git a/clang-tools-extra/clangd/FindSymbols.cpp b/clang-tools-extra/clangd/FindSymbols.cpp index 4c92c8896b9d..1ce4222b5764 100644 --- a/clang-tools-extra/clangd/FindSymbols.cpp +++ b/clang-tools-extra/clangd/FindSymbols.cpp @@ -193,8 +193,11 @@ private: enum class VisitKind { No, OnlyDecl, DeclAndChildren }; void traverseDecl(Decl *D, std::vector<DocumentSymbol> &Results) { - if (auto *Templ = llvm::dyn_cast<TemplateDecl>(D)) - D = Templ->getTemplatedDecl(); + if (auto *Templ = llvm::dyn_cast<TemplateDecl>(D)) { + // TemplatedDecl might be null, e.g. concepts. + if (auto *TD = Templ->getTemplatedDecl()) + D = TD; + } auto *ND = llvm::dyn_cast<NamedDecl>(D); if (!ND) return; diff --git a/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp b/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp index 8eebb190edae..eba920a7a452 100644 --- a/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp +++ b/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp @@ -449,6 +449,15 @@ TEST_F(DocumentSymbolsTest, DeclarationDefinition) { SymNameRange(Main.range("def"))))); } +TEST_F(DocumentSymbolsTest, Concepts) { + CDB.ExtraClangFlags = {"-std=c++2a"}; + std::string FilePath = testPath("foo.cpp"); + addFile(FilePath, + "template <typename T> concept C = requires(T t) { t.foo(); };"); + + EXPECT_THAT(getSymbols(FilePath), ElementsAre(WithName("C"))); +} + TEST_F(DocumentSymbolsTest, ExternSymbol) { std::string FilePath = testPath("foo.cpp"); addFile(testPath("foo.h"), R"cpp( |