]> granicus.if.org Git - clang/commitdiff
[Parser] Unbreak parsing with incremental parsing enabled and add a unit-test for it.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Sun, 24 Nov 2013 02:12:18 +0000 (02:12 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Sun, 24 Nov 2013 02:12:18 +0000 (02:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@195564 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Parse/Parser.cpp
unittests/Frontend/FrontendActionTest.cpp

index cacff4a3eebc84b28b18286a03e996ed85032a11..0f950ceabc556901a113a76cc840679584cb6205 100644 (file)
@@ -584,10 +584,8 @@ bool Parser::ParseTopLevelDecl(DeclGroupPtrTy &Result) {
 
   // Skip over the EOF token, flagging end of previous input for incremental
   // processing
-  if (PP.isIncrementalProcessingEnabled() && Tok.is(tok::eof)) {
+  if (PP.isIncrementalProcessingEnabled() && Tok.is(tok::eof))
     ConsumeToken();
-    return false;
-  }
 
   Result = DeclGroupPtrTy();
   switch (Tok.getKind()) {
index bcb340d668877639fada95436c29bb982f38bc57..1871a2f567f4bae1a19647ec19a1540e200d1cb5 100644 (file)
@@ -13,6 +13,7 @@
 #include "clang/AST/RecursiveASTVisitor.h"
 #include "clang/Frontend/CompilerInstance.h"
 #include "clang/Frontend/CompilerInvocation.h"
+#include "clang/Lex/Preprocessor.h"
 #include "llvm/ADT/Triple.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "gtest/gtest.h"
@@ -24,8 +25,19 @@ namespace {
 
 class TestASTFrontendAction : public ASTFrontendAction {
 public:
+  TestASTFrontendAction(bool enableIncrementalProcessing = false)
+    : EnableIncrementalProcessing(enableIncrementalProcessing) { }
+
+  bool EnableIncrementalProcessing;
   std::vector<std::string> decl_names;
 
+  virtual bool BeginSourceFileAction(CompilerInstance &ci, StringRef filename) {
+    if (EnableIncrementalProcessing)
+      ci.getPreprocessor().enableIncrementalProcessing();
+
+    return ASTFrontendAction::BeginSourceFileAction(ci, filename);
+  }
+
   virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
                                          StringRef InFile) {
     return new Visitor(decl_names);
@@ -70,4 +82,24 @@ TEST(ASTFrontendAction, Sanity) {
   EXPECT_EQ("x", test_action.decl_names[2]);
 }
 
+TEST(ASTFrontendAction, IncrementalParsing) {
+  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();
+
+  TestASTFrontendAction test_action(/*enableIncrementalProcessing=*/true);
+  ASSERT_TRUE(compiler.ExecuteAction(test_action));
+  ASSERT_EQ(3U, test_action.decl_names.size());
+  EXPECT_EQ("__builtin_va_list", test_action.decl_names[0]);
+  EXPECT_EQ("main", test_action.decl_names[1]);
+  EXPECT_EQ("x", test_action.decl_names[2]);
+}
+
 } // anonymous namespace