xref: /llvm-project/clang/unittests/Tooling/RecursiveASTVisitorTests/LambdaTemplateParams.cpp (revision 4e600751d2f7e8e7b85a71b7128b68444bdde91b)
1 //===- unittest/Tooling/RecursiveASTVisitorTests/LambdaTemplateParams.cpp -===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "TestVisitor.h"
10 
11 using namespace clang;
12 
13 namespace {
14 
15 // Matches (optional) explicit template parameters.
16 class LambdaTemplateParametersVisitor : public ExpectedLocationVisitor {
17 public:
18   LambdaTemplateParametersVisitor() { ShouldVisitImplicitCode = false; }
19 
20   bool VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) override {
21     EXPECT_FALSE(D->isImplicit());
22     Match(D->getName(), D->getBeginLoc());
23     return true;
24   }
25 
26   bool VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) override {
27     EXPECT_FALSE(D->isImplicit());
28     Match(D->getName(), D->getBeginLoc());
29     return true;
30   }
31 
32   bool VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) override {
33     EXPECT_FALSE(D->isImplicit());
34     Match(D->getName(), D->getBeginLoc());
35     return true;
36   }
37 };
38 
39 TEST(RecursiveASTVisitor, VisitsLambdaExplicitTemplateParameters) {
40   LambdaTemplateParametersVisitor Visitor;
41   Visitor.ExpectMatch("T",  2, 15);
42   Visitor.ExpectMatch("I",  2, 24);
43   Visitor.ExpectMatch("TT", 2, 31);
44   EXPECT_TRUE(Visitor.runOver(
45       "void f() { \n"
46       "  auto l = []<class T, int I, template<class> class TT>(auto p) { }; \n"
47       "}",
48       LambdaTemplateParametersVisitor::Lang_CXX2a));
49 }
50 
51 } // end anonymous namespace
52