forked from OSchip/llvm-project
59 lines
1.5 KiB
C++
59 lines
1.5 KiB
C++
//=------ unittest/Tooling/RecursiveASTVisitorTests/CXXMethodDecl.cpp ------=//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "TestVisitor.h"
|
|
#include "clang/AST/Expr.h"
|
|
|
|
using namespace clang;
|
|
|
|
namespace {
|
|
|
|
class CXXMethodDeclVisitor
|
|
: public ExpectedLocationVisitor<CXXMethodDeclVisitor> {
|
|
public:
|
|
CXXMethodDeclVisitor(bool VisitImplicitCode)
|
|
: VisitImplicitCode(VisitImplicitCode) {}
|
|
|
|
bool shouldVisitImplicitCode() const { return VisitImplicitCode; }
|
|
|
|
bool VisitDeclRefExpr(DeclRefExpr *D) {
|
|
Match("declref", D->getLocation());
|
|
return true;
|
|
}
|
|
bool VisitParmVarDecl(ParmVarDecl *P) {
|
|
Match("parm", P->getLocation());
|
|
return true;
|
|
}
|
|
|
|
private:
|
|
bool VisitImplicitCode;
|
|
};
|
|
|
|
TEST(RecursiveASTVisitor, CXXMethodDeclNoDefaultBodyVisited) {
|
|
for (bool VisitImplCode : {false, true}) {
|
|
CXXMethodDeclVisitor Visitor(VisitImplCode);
|
|
if (VisitImplCode)
|
|
Visitor.ExpectMatch("declref", 8, 28);
|
|
else
|
|
Visitor.DisallowMatch("declref", 8, 28);
|
|
|
|
Visitor.ExpectMatch("parm", 8, 27);
|
|
llvm::StringRef Code = R"cpp(
|
|
struct B {};
|
|
struct A {
|
|
B BB;
|
|
A &operator=(A &&O);
|
|
};
|
|
|
|
A &A::operator=(A &&O) = default;
|
|
)cpp";
|
|
EXPECT_TRUE(Visitor.runOver(Code, CXXMethodDeclVisitor::Lang_CXX11));
|
|
}
|
|
}
|
|
} // end anonymous namespace
|