1 //===- unittest/Tooling/RecursiveASTVisitorTests/LambdaTemplateParams.cpp -===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "TestVisitor.h"
11
12 using namespace clang;
13
14 namespace {
15
16 // Matches (optional) explicit template parameters.
17 class LambdaTemplateParametersVisitor
18 : public ExpectedLocationVisitor<LambdaTemplateParametersVisitor> {
19 public:
shouldVisitImplicitCode() const20 bool shouldVisitImplicitCode() const { return false; }
21
VisitTemplateTypeParmDecl(TemplateTypeParmDecl * D)22 bool VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
23 EXPECT_FALSE(D->isImplicit());
24 Match(D->getName(), D->getBeginLoc());
25 return true;
26 }
27
VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl * D)28 bool VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
29 EXPECT_FALSE(D->isImplicit());
30 Match(D->getName(), D->getBeginLoc());
31 return true;
32 }
33
VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl * D)34 bool VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
35 EXPECT_FALSE(D->isImplicit());
36 Match(D->getName(), D->getBeginLoc());
37 return true;
38 }
39 };
40
TEST(RecursiveASTVisitor,VisitsLambdaExplicitTemplateParameters)41 TEST(RecursiveASTVisitor, VisitsLambdaExplicitTemplateParameters) {
42 LambdaTemplateParametersVisitor Visitor;
43 Visitor.ExpectMatch("T", 2, 15);
44 Visitor.ExpectMatch("I", 2, 24);
45 Visitor.ExpectMatch("TT", 2, 31);
46 EXPECT_TRUE(Visitor.runOver(
47 "void f() { \n"
48 " auto l = []<class T, int I, template<class> class TT>(auto p) { }; \n"
49 "}",
50 LambdaTemplateParametersVisitor::Lang_CXX2a));
51 }
52
53 } // end anonymous namespace
54