77 lines
2.1 KiB
C++
77 lines
2.1 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));
|
|
}
|
|
}
|
|
|
|
TEST(RecursiveASTVisitor, FunctionDeclNoDefaultBodyVisited) {
|
|
for (bool VisitImplCode : {false, true}) {
|
|
CXXMethodDeclVisitor Visitor(VisitImplCode);
|
|
if (VisitImplCode)
|
|
Visitor.ExpectMatch("declref", 4, 58, /*Times=*/2);
|
|
else
|
|
Visitor.DisallowMatch("declref", 4, 58);
|
|
llvm::StringRef Code = R"cpp(
|
|
struct s {
|
|
int x;
|
|
friend auto operator==(s a, s b) -> bool = default;
|
|
};
|
|
bool k = s() == s(); // make sure clang generates the "==" definition.
|
|
)cpp";
|
|
EXPECT_TRUE(Visitor.runOver(Code, CXXMethodDeclVisitor::Lang_CXX2a));
|
|
}
|
|
}
|
|
} // end anonymous namespace
|