Author: Nathan Ridge Date: 2020-01-23T15:12:21-05:00 New Revision: cbcd07a4815f546739fb1374a7f24f35e5352e17
URL: https://github.com/llvm/llvm-project/commit/cbcd07a4815f546739fb1374a7f24f35e5352e17 DIFF: https://github.com/llvm/llvm-project/commit/cbcd07a4815f546739fb1374a7f24f35e5352e17.diff LOG: [clangd] Add C++20 concepts support to TargetFinder Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D73140 Added: Modified: clang-tools-extra/clangd/FindTarget.cpp clang-tools-extra/clangd/unittests/FindTargetTests.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/FindTarget.cpp b/clang-tools-extra/clangd/FindTarget.cpp index 6123ffbb76ac..ca0584cbec78 100644 --- a/clang-tools-extra/clangd/FindTarget.cpp +++ b/clang-tools-extra/clangd/FindTarget.cpp @@ -17,6 +17,7 @@ #include "clang/AST/DeclarationName.h" #include "clang/AST/Expr.h" #include "clang/AST/ExprCXX.h" +#include "clang/AST/ExprConcepts.h" #include "clang/AST/ExprObjC.h" #include "clang/AST/NestedNameSpecifier.h" #include "clang/AST/PrettyPrinter.h" @@ -279,6 +280,9 @@ struct TargetFinder { void VisitCallExpr(const CallExpr *CE) { Outer.add(CE->getCalleeDecl(), Flags); } + void VisitConceptSpecializationExpr(const ConceptSpecializationExpr *E) { + Outer.add(E->getNamedConcept(), Flags); + } void VisitDeclRefExpr(const DeclRefExpr *DRE) { const Decl *D = DRE->getDecl(); // UsingShadowDecl allows us to record the UsingDecl. diff --git a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp index 96e488d8a0f4..0f450e8dfc21 100644 --- a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp +++ b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp @@ -339,6 +339,24 @@ TEST_F(TargetDeclTest, ClassTemplate) { {"struct Test", Rel::TemplatePattern}); } +TEST_F(TargetDeclTest, Concept) { + Code = R"cpp( + template <typename T> + concept Fooable = requires (T t) { t.foo(); }; + + template <typename T> requires [[Fooable]]<T> + void bar(T t) { + t.foo(); + } + )cpp"; + Flags.push_back("-std=c++2a"); + EXPECT_DECLS( + "ConceptSpecializationExpr", + // FIXME: Should we truncate the pretty-printed form of a concept decl + // somewhere? + {"template <typename T> concept Fooable = requires (T t) { t.foo(); };"}); +} + TEST_F(TargetDeclTest, FunctionTemplate) { Code = R"cpp( // Implicit specialization. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits