diff --git a/include/clang/Basic/SourceManager.h b/include/clang/Basic/SourceManager.h index 8eb386b8dc332b7533fef49e186f602129454737..603bfebfd36fae9518705476e006de54c0bab151 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 24bd51928c9e87807f92cd377eae664e58f9bcf8..6ddc2880a05898ccf3fa372234b688f4f9e0cb67 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 b420c6cd1d289db0bcc4da98466a5fe9f48de356..5509f5f4e810846783e8307871ad810ed7a550d7 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 3f86c4d2c89bc61f94695c8b6c247900a1fe53f4..c50c1c980e5d962114688d0d1d4007eca3458acd 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(),