summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Basic/SourceManager.cpp1
-rw-r--r--clang/lib/Lex/Preprocessor.cpp2
-rw-r--r--clang/lib/Parse/ParseAST.cpp44
3 files changed, 12 insertions, 35 deletions
diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp
index 24bd51928c9..6ddc2880a05 100644
--- a/clang/lib/Basic/SourceManager.cpp
+++ b/clang/lib/Basic/SourceManager.cpp
@@ -407,7 +407,6 @@ SourceManager::~SourceManager() {
void SourceManager::clearIDTables() {
MainFileID = FileID();
- PredefinesFileID = FileID();
LocalSLocEntryTable.clear();
LoadedSLocEntryTable.clear();
SLocEntryLoaded.clear();
diff --git a/clang/lib/Lex/Preprocessor.cpp b/clang/lib/Lex/Preprocessor.cpp
index b420c6cd1d2..5509f5f4e81 100644
--- a/clang/lib/Lex/Preprocessor.cpp
+++ b/clang/lib/Lex/Preprocessor.cpp
@@ -427,7 +427,7 @@ void Preprocessor::EnterMainSourceFile() {
llvm::MemoryBuffer *SB =
llvm::MemoryBuffer::getMemBufferCopy(Predefines, "<built-in>");
assert(SB && "Cannot create predefined source buffer");
- FileID FID = SourceMgr.createPredefinesFileIDForMemBuffer(SB);
+ FileID FID = SourceMgr.createFileIDForMemBuffer(SB);
assert(!FID.isInvalid() && "Could not create FileID for predefines?");
// Start parsing the predefines.
diff --git a/clang/lib/Parse/ParseAST.cpp b/clang/lib/Parse/ParseAST.cpp
index 3f86c4d2c89..c50c1c980e5 100644
--- a/clang/lib/Parse/ParseAST.cpp
+++ b/clang/lib/Parse/ParseAST.cpp
@@ -83,46 +83,24 @@ void clang::ParseAST(Sema &S, bool PrintStats, bool SkipFunctionBodies) {
// declaration. C++ doesn't have this restriction. We also don't want to
// complain if we have a precompiled header, although technically if the PCH
// is empty we should still emit the (pedantic) diagnostic.
- bool WarnForEmptyTU = !S.getLangOpts().CPlusPlus;
- if (ExternalASTSource *External = S.getASTContext().getExternalSource()) {
- External->StartTranslationUnit(Consumer);
- WarnForEmptyTU = false;
- }
-
- // Clang's predefines contain top-level declarations for things like va_list,
- // making it hard to tell if the /user's/ translation unit has at least one
- // top-level declaration. So we parse cautiously, looking for a declaration
- // that doesn't come from our predefines.
- // Note that ParseTopLevelDecl returns 'true' at EOF.
- SourceManager &SM = S.getSourceManager();
Parser::DeclGroupPtrTy ADecl;
- while (WarnForEmptyTU && !P.ParseTopLevelDecl(ADecl)) {
- if (ADecl) {
- if (!Consumer->HandleTopLevelDecl(ADecl.get()))
- return;
- if (DeclGroupRef::iterator FirstDecl = ADecl.get().begin()) {
- SourceLocation DeclLoc = (*FirstDecl)->getLocation();
- WarnForEmptyTU = SM.isFromPredefines(DeclLoc);
- }
- }
- }
+ ExternalASTSource *External = S.getASTContext().getExternalSource();
+ if (External)
+ External->StartTranslationUnit(Consumer);
- // If we ended up seeing EOF before any top-level declarations, emit our
- // diagnostic. Otherwise, parse the rest of the file normally.
- if (WarnForEmptyTU) {
- P.Diag(diag::ext_empty_translation_unit);
+ if (P.ParseTopLevelDecl(ADecl)) {
+ if (!External && !S.getLangOpts().CPlusPlus)
+ P.Diag(diag::ext_empty_translation_unit);
} else {
- while (!P.ParseTopLevelDecl(ADecl)) { // Not end of file.
+ do {
// If we got a null return and something *was* parsed, ignore it. This
// is due to a top-level semicolon, an action override, or a parse error
// skipping something.
- if (ADecl) {
- if (!Consumer->HandleTopLevelDecl(ADecl.get()))
- return;
- }
- };
+ if (ADecl && !Consumer->HandleTopLevelDecl(ADecl.get()))
+ return;
+ } while (!P.ParseTopLevelDecl(ADecl));
}
-
+
// Process any TopLevelDecls generated by #pragma weak.
for (SmallVector<Decl*,2>::iterator
I = S.WeakTopLevelDecls().begin(),
OpenPOWER on IntegriCloud