forked from OSchip/llvm-project
[Parser] Unbreak parsing with incremental parsing enabled and add a unit-test for it.
llvm-svn: 195564
This commit is contained in:
parent
aa61cbbe8b
commit
336fcd9c61
|
@ -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()) {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue