1//=------ unittest/Tooling/RecursiveASTVisitorTests/CXXMethodDecl.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#include "clang/AST/Expr.h"
11
12using namespace clang;
13
14namespace {
15
16class CXXMethodDeclVisitor : public ExpectedLocationVisitor {
17public:
18 CXXMethodDeclVisitor(bool VisitImplicitCode) {
19 ShouldVisitImplicitCode = VisitImplicitCode;
20 }
21
22 bool VisitDeclRefExpr(DeclRefExpr *D) override {
23 Match("declref", D->getLocation());
24 return true;
25 }
26
27 bool VisitParmVarDecl(ParmVarDecl *P) override {
28 Match(Name: "parm", Location: P->getLocation());
29 return true;
30 }
31};
32
33TEST(RecursiveASTVisitor, CXXMethodDeclNoDefaultBodyVisited) {
34 for (bool VisitImplCode : {false, true}) {
35 CXXMethodDeclVisitor Visitor(VisitImplCode);
36 if (VisitImplCode)
37 Visitor.ExpectMatch("declref", 8, 28);
38 else
39 Visitor.DisallowMatch("declref", 8, 28);
40
41 Visitor.ExpectMatch("parm", 8, 27);
42 llvm::StringRef Code = R"cpp(
43 struct B {};
44 struct A {
45 B BB;
46 A &operator=(A &&O);
47 };
48
49 A &A::operator=(A &&O) = default;
50 )cpp";
51 EXPECT_TRUE(Visitor.runOver(Code, CXXMethodDeclVisitor::Lang_CXX11));
52 }
53}
54
55TEST(RecursiveASTVisitor, FunctionDeclNoDefaultBodyVisited) {
56 for (bool VisitImplCode : {false, true}) {
57 CXXMethodDeclVisitor Visitor(VisitImplCode);
58 if (VisitImplCode)
59 Visitor.ExpectMatch("declref", 4, 58, /*Times=*/2);
60 else
61 Visitor.DisallowMatch("declref", 4, 58);
62 llvm::StringRef Code = R"cpp(
63 struct s {
64 int x;
65 friend auto operator==(s a, s b) -> bool = default;
66 };
67 bool k = s() == s(); // make sure clang generates the "==" definition.
68 )cpp";
69 EXPECT_TRUE(Visitor.runOver(Code, CXXMethodDeclVisitor::Lang_CXX2a));
70 }
71}
72} // end anonymous namespace
73

Provided by KDAB

Privacy Policy
Update your C++ knowledge – Modern C++11/14/17 Training
Find out more

source code of clang/unittests/Tooling/RecursiveASTVisitorTests/CXXMethodDecl.cpp