[Parser] Unbreak parsing with incremental parsing enabled and add a unit-test for it.

llvm-svn: 195564
This commit is contained in:
Argyrios Kyrtzidis 2013-11-24 02:12:18 +00:00
parent aa61cbbe8b
commit 336fcd9c61
2 changed files with 33 additions and 3 deletions

View 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()) {

View 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