aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/Basic/SourceManager.h20
-rw-r--r--lib/Basic/SourceManager.cpp1
-rw-r--r--lib/Lex/Preprocessor.cpp2
-rw-r--r--lib/Parse/ParseAST.cpp44
4 files changed, 12 insertions, 55 deletions
diff --git a/include/clang/Basic/SourceManager.h b/include/clang/Basic/SourceManager.h
index 8eb386b8dc..603bfebfd3 100644
--- a/include/clang/Basic/SourceManager.h
+++ b/include/clang/Basic/SourceManager.h
@@ -591,9 +591,6 @@ class SourceManager : public RefCountedBase<SourceManager> {
/// \brief The file ID for the precompiled preamble there is one.
FileID PreambleFileID;
- /// \brief The file ID for the preprocessor's predefines.
- FileID PredefinesFileID;
-
// Statistics for -print-stats.
mutable unsigned NumLinearScans, NumBinaryProbes;
@@ -638,14 +635,6 @@ public:
MainFileID = createFileIDForMemBuffer(Buffer);
return MainFileID;
}
-
- /// \brief Create the FileID for a memory buffer that contains the
- /// preprocessor's predefines.
- FileID createPredefinesFileIDForMemBuffer(const llvm::MemoryBuffer *Buffer) {
- assert(PredefinesFileID.isInvalid() && "PredefinesFileID already set!");
- PredefinesFileID = createFileIDForMemBuffer(Buffer);
- return PredefinesFileID;
- }
//===--------------------------------------------------------------------===//
// MainFileID creation and querying methods.
@@ -654,9 +643,6 @@ public:
/// getMainFileID - Returns the FileID of the main source file.
FileID getMainFileID() const { return MainFileID; }
- /// \brief Returns the FileID of the preprocessor predefines buffer.
- FileID getPredefinesFileID() const { return PredefinesFileID; }
-
/// createMainFileID - Create the FileID for the main source file.
FileID createMainFileID(const FileEntry *SourceFile,
SrcMgr::CharacteristicKind Kind = SrcMgr::C_User) {
@@ -1138,12 +1124,6 @@ public:
return getFileID(Loc) == getMainFileID();
}
- /// isFromPredefines - Returns true if the provided SourceLocation is
- /// within the processor's predefines buffer.
- bool isFromPredefines(SourceLocation Loc) const {
- return getFileID(Loc) == getPredefinesFileID();
- }
-
/// isInSystemHeader - Returns if a SourceLocation is in a system header.
bool isInSystemHeader(SourceLocation Loc) const {
return getFileCharacteristic(Loc) != SrcMgr::C_User;
diff --git a/lib/Basic/SourceManager.cpp b/lib/Basic/SourceManager.cpp
index 24bd51928c..6ddc2880a0 100644
--- a/lib/Basic/SourceManager.cpp
+++ b/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/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp
index b420c6cd1d..5509f5f4e8 100644
--- a/lib/Lex/Preprocessor.cpp
+++ b/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/lib/Parse/ParseAST.cpp b/lib/Parse/ParseAST.cpp
index 3f86c4d2c8..c50c1c980e 100644
--- a/lib/Parse/ParseAST.cpp
+++ b/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(),