|
@@ -100,4 +100,50 @@ TEST(ASTFrontendAction, IncrementalParsing) {
|
|
|
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
|