73 lines · cpp
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-exception6//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("parm", 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 else39 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 else61 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 namespace73