summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKadir Cetinkaya <kadircet@google.com>2020-01-20 19:02:48 +0100
committerTom Stellard <tstellar@redhat.com>2020-06-23 14:23:12 -0700
commit97065683c6a965be9bc3dc06b0264940ed75c4af (patch)
treec217b780866315d92dc92062dfbdc445512d2e4e
parentc69ed62ea195a598c62e216fa45bbe1b1ede5bae (diff)
downloadllvm-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.cpp7
-rw-r--r--clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp9
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(