RecursiveASTVisitorTests/CXXOperatorCallExprTraverser.cpp
RecursiveASTVisitorTests/DeclRefExpr.cpp
RecursiveASTVisitorTests/ImplicitCtor.cpp
+ RecursiveASTVisitorTests/ImplicitCtorInitializer.cpp
RecursiveASTVisitorTests/InitListExprPostOrder.cpp
RecursiveASTVisitorTests/InitListExprPostOrderNoQueue.cpp
RecursiveASTVisitorTests/InitListExprPreOrder.cpp
--- /dev/null
+//=- 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);
+ EXPECT_TRUE(Visitor.runOver(R"cpp(
+ class A {};
+ class B : public A {
+ B() {};
+ };
+ class C : public A {
+ C() : A() {}
+ };
+ )cpp",
+ CXXCtorInitializerVisitor::Lang_CXX));
+ EXPECT_EQ(Visitor.VisitedImplicitInitializer, VisitImplCode);
+ }
+}
+} // end anonymous namespace