Unverified Commit 7aaa86b2 authored by Kadir Cetinkaya's avatar Kadir Cetinkaya
Browse files

[include-cleaner] Add regression tests for outliving File&Source Manager

parent 0b044061
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -558,5 +558,35 @@ TEST_F(PragmaIncludeTest, ExportInUnnamedBuffer) {
      PI.getExporters(llvm::cantFail(FM->getFileRef("foo.h")), *FM),
      testing::ElementsAre(llvm::cantFail(FM->getFileRef("exporter.h"))));
}

TEST_F(PragmaIncludeTest, OutlivesFMAndSM) {
  Inputs.Code = R"cpp(
    #include "public.h"
  )cpp";
  Inputs.ExtraFiles["public.h"] = R"cpp(
    #include "private.h"
    #include "private2.h" // IWYU pragma: export
  )cpp";
  Inputs.ExtraFiles["private.h"] = R"cpp(
    // IWYU pragma: private, include "public.h"
  )cpp";
  Inputs.ExtraFiles["private2.h"] = R"cpp(
    // IWYU pragma: private
  )cpp";
  build(); // Fills up PI, file/source manager used is destroyed afterwards.
  Inputs.MakeAction = nullptr; // Don't populate PI anymore.

  // Now this build gives us a new File&Source Manager.
  TestAST Processed = build();
  auto &FM = Processed.fileManager();
  auto PrivateFE = FM.getFile("private.h");
  assert(PrivateFE);
  EXPECT_EQ(PI.getPublic(PrivateFE.get()), "\"public.h\"");

  auto Private2FE = FM.getFile("private2.h");
  assert(Private2FE);
  EXPECT_THAT(PI.getExporters(Private2FE.get(), FM),
              testing::ElementsAre(llvm::cantFail(FM.getFileRef("public.h"))));
}
} // namespace
} // namespace clang::include_cleaner