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(),