| //=- unittest/Tooling/RecursiveASTVisitorTests/ImplicitCtorInitializer.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" |
| |
| using namespace clang; |
| |
| namespace { |
| |
| class CXXCtorInitializerVisitor |
| : public ExpectedLocationVisitor<CXXCtorInitializerVisitor> { |
| public: |
| CXXCtorInitializerVisitor(bool VisitImplicitCode) |
| : VisitImplicitCode(VisitImplicitCode) {} |
| |
| bool shouldVisitImplicitCode() const { return VisitImplicitCode; } |
| |
| bool TraverseConstructorInitializer(CXXCtorInitializer *Init) { |
| if (!Init->isWritten()) |
| VisitedImplicitInitializer = true; |
| Match("initializer", Init->getSourceLocation()); |
| return ExpectedLocationVisitor< |
| CXXCtorInitializerVisitor>::TraverseConstructorInitializer(Init); |
| } |
| |
| bool VisitedImplicitInitializer = false; |
| |
| private: |
| bool VisitImplicitCode; |
| }; |
| |
| // Check to ensure that CXXCtorInitializer is not visited when implicit code |
| // should not be visited and that it is visited when implicit code should be |
| // visited. |
| TEST(RecursiveASTVisitor, CXXCtorInitializerVisitNoImplicit) { |
| for (bool VisitImplCode : {true, false}) { |
| CXXCtorInitializerVisitor Visitor(VisitImplCode); |
| Visitor.ExpectMatch("initializer", 7, 17); |
| llvm::StringRef Code = R"cpp( |
| class A {}; |
| class B : public A { |
| B() {}; |
| }; |
| class C : public A { |
| C() : A() {} |
| }; |
| )cpp"; |
| EXPECT_TRUE(Visitor.runOver(Code, CXXCtorInitializerVisitor::Lang_CXX)); |
| EXPECT_EQ(Visitor.VisitedImplicitInitializer, VisitImplCode); |
| } |
| } |
| } // end anonymous namespace |