[clang-tools-extra] cbcd07a - [clangd] Add C++20 concepts support to TargetFinder
Nathan Ridge via cfe-commits
cfe-commits at lists.llvm.org
Thu Jan 23 12:12:39 PST 2020
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.
More information about the cfe-commits
mailing list