ImplicitCtorInitializer.cpp 1.8 KB

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