brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.0 KiB · 1eeb3df Raw
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