52 lines · cpp
1//=- unittest/Tooling/RecursiveASTVisitorTests/ImplicitCtorInitializer.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 11using namespace clang;12 13namespace {14 15class CXXCtorInitializerVisitor : public ExpectedLocationVisitor {16public:17 CXXCtorInitializerVisitor(bool VisitImplicitCode) {18 ShouldVisitImplicitCode = VisitImplicitCode;19 }20 21 bool TraverseConstructorInitializer(CXXCtorInitializer *Init) override {22 if (!Init->isWritten())23 VisitedImplicitInitializer = true;24 Match("initializer", Init->getSourceLocation());25 return ExpectedLocationVisitor::TraverseConstructorInitializer(Init);26 }27 28 bool VisitedImplicitInitializer = false;29};30 31// Check to ensure that CXXCtorInitializer is not visited when implicit code32// should not be visited and that it is visited when implicit code should be33// visited.34TEST(RecursiveASTVisitor, CXXCtorInitializerVisitNoImplicit) {35 for (bool VisitImplCode : {true, false}) {36 CXXCtorInitializerVisitor Visitor(VisitImplCode);37 Visitor.ExpectMatch("initializer", 7, 17);38 llvm::StringRef Code = R"cpp(39 class A {};40 class B : public A {41 B() {};42 };43 class C : public A {44 C() : A() {}45 };46 )cpp";47 EXPECT_TRUE(Visitor.runOver(Code, CXXCtorInitializerVisitor::Lang_CXX));48 EXPECT_EQ(Visitor.VisitedImplicitInitializer, VisitImplCode);49 }50}51} // end anonymous namespace52