From fb3d9153c01b9a560680465190d6ecd804e4c486 Mon Sep 17 00:00:00 2001 From: Kadir Cetinkaya Date: Mon, 20 Jan 2020 19:02:48 +0100 Subject: [PATCH] [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 --- clang-tools-extra/clangd/FindSymbols.cpp | 7 +++++-- 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 4c92c88..1ce4222 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 &Results) { - if (auto *Templ = llvm::dyn_cast(D)) - D = Templ->getTemplatedDecl(); + if (auto *Templ = llvm::dyn_cast(D)) { + // TemplatedDecl might be null, e.g. concepts. + if (auto *TD = Templ->getTemplatedDecl()) + D = TD; + } auto *ND = llvm::dyn_cast(D); if (!ND) return; diff --git a/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp b/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp index 8eebb19..eba920a 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 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( -- 2.7.4