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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "TestVisitor.h" 10 11 using namespace clang; 12 13 namespace { 14 15 class CXXCtorInitializerVisitor : public ExpectedLocationVisitor { 16 public: 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 code 32 // should not be visited and that it is visited when implicit code should be 33 // visited. 34 TEST(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 namespace 52