[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