[PATCH] Flip the order the preprocessor and frontendaction are informed of the end of a file.

Richard Smith richard at metafoo.co.uk
Thu Aug 7 13:51:46 PDT 2014


LGTM


On Thu, Aug 7, 2014 at 1:33 PM, Benjamin Kramer <benny.kra at gmail.com> wrote:

> Added unit test.
>
> http://reviews.llvm.org/D4773
>
> Files:
>   lib/Frontend/FrontendAction.cpp
>   unittests/Frontend/FrontendActionTest.cpp
>
> Index: lib/Frontend/FrontendAction.cpp
> ===================================================================
> --- lib/Frontend/FrontendAction.cpp
> +++ lib/Frontend/FrontendAction.cpp
> @@ -432,6 +432,10 @@
>    // Inform the diagnostic client we are done with this source file.
>    CI.getDiagnosticClient().EndSourceFile();
>
> +  // Inform the preprocessor we are done.
> +  if (CI.hasPreprocessor())
> +    CI.getPreprocessor().EndSourceFile();
> +
>    // Finalize the action.
>    EndSourceFileAction();
>
> @@ -453,10 +457,6 @@
>      CI.setASTConsumer(nullptr);
>    }
>
> -  // Inform the preprocessor we are done.
> -  if (CI.hasPreprocessor())
> -    CI.getPreprocessor().EndSourceFile();
> -
>    if (CI.getFrontendOpts().ShowStats) {
>      llvm::errs() << "\nSTATISTICS FOR '" << getCurrentFile() << "':\n";
>      CI.getPreprocessor().PrintStats();
> Index: unittests/Frontend/FrontendActionTest.cpp
> ===================================================================
> --- unittests/Frontend/FrontendActionTest.cpp
> +++ unittests/Frontend/FrontendActionTest.cpp
> @@ -100,4 +100,50 @@
>    EXPECT_EQ("x", test_action.decl_names[1]);
>  }
>
> +struct TestPPCallbacks : public PPCallbacks {
> +  TestPPCallbacks() : SeenEnd(false) {}
> +
> +  void EndOfMainFile() override { SeenEnd = true; }
> +
> +  bool SeenEnd;
> +};
> +
> +class TestPPCallbacksFrontendAction : public PreprocessorFrontendAction {
> +  TestPPCallbacks *Callbacks;
> +
> +public:
> +  TestPPCallbacksFrontendAction(TestPPCallbacks *C)
> +      : Callbacks(C), SeenEnd(false) {}
> +
> +  void ExecuteAction() override {
> +    Preprocessor &PP = getCompilerInstance().getPreprocessor();
> +    PP.addPPCallbacks(Callbacks);
> +    PP.EnterMainSourceFile();
> +  }
> +  void EndSourceFileAction() override { SeenEnd = Callbacks->SeenEnd; }
> +
> +  bool SeenEnd;
> +};
> +
> +TEST(PreprocessorFrontendAction, EndSourceFile) {
> +  CompilerInvocation *Invocation = new CompilerInvocation;
> +  Invocation->getPreprocessorOpts().addRemappedFile(
> +      "test.cc", MemoryBuffer::getMemBuffer("int main() { float x; }"));
> +  Invocation->getFrontendOpts().Inputs.push_back(
> +      FrontendInputFile("test.cc", IK_CXX));
> +  Invocation->getFrontendOpts().ProgramAction = frontend::ParseSyntaxOnly;
> +  Invocation->getTargetOpts().Triple = "i386-unknown-linux-gnu";
> +  CompilerInstance Compiler;
> +  Compiler.setInvocation(Invocation);
> +  Compiler.createDiagnostics();
> +
> +  TestPPCallbacks *Callbacks = new TestPPCallbacks;
> +  TestPPCallbacksFrontendAction TestAction(Callbacks);
> +  ASSERT_FALSE(Callbacks->SeenEnd);
> +  ASSERT_FALSE(TestAction.SeenEnd);
> +  ASSERT_TRUE(Compiler.ExecuteAction(TestAction));
> +  // Check that EndOfMainFile was called before EndSourceFileAction.
> +  ASSERT_TRUE(TestAction.SeenEnd);
> +}
> +
>  } // anonymous namespace
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140807/1e0d9b91/attachment.html>


More information about the cfe-commits mailing list