[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
This commit is contained in:
Nathan Ridge 2020-01-21 16:55:43 -05:00
parent c6c5dbc824
commit cbcd07a481
2 changed files with 22 additions and 0 deletions

View File

@ -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 @@ public:
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.

View File

@ -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.