Index: tools/clang/include/clang/Basic/Diagnostic.h
==================================================================
--- tools/clang/include/clang/Basic/Diagnostic.h
+++ tools/clang/include/clang/Basic/Diagnostic.h
@@ -174,10 +174,12 @@
   bool WarningsAsErrors;         // Treat warnings like errors.
   bool EnableAllWarnings;        // Enable all warnings.
   bool ErrorsAsFatal;            // Treat errors like fatal errors.
   bool SuppressSystemWarnings;   // Suppress warnings in system headers.
   bool SuppressAllDiagnostics;   // Suppress all diagnostics.
+  bool ForceEmitDiagnostics;     // Ensure diagnostics are emitted regardless of
+                                 // suppression settings (limit still applies).
   bool ElideType;                // Elide common types of templates.
   bool PrintTemplateTree;        // Print a tree when comparing templates.
   bool ShowColors;               // Color printing is enabled.
   OverloadsShown ShowOverloads;  // Which overload candidates to show.
   unsigned ErrorLimit;           // Cap of # errors emitted, 0 -> no limit.
@@ -455,10 +457,18 @@
  
   /// \brief Set color printing, so the type diffing will inject color markers
   /// into the output.
   void setShowColors(bool Val = false) { ShowColors = Val; }
   bool getShowColors() { return ShowColors; }
+
+  /// \brief Force diagnostics to be emitted, overriding SuppressAllDiagnostics
+  /// and FatalErrorOccurred which otherwise suppress diagnostics.  This will
+  /// not override other suppression mechanisms, for example, ErrorLimit.
+  void setForceEmitDiagnostics(bool Val = true) {
+    ForceEmitDiagnostics = Val;
+  }
+  bool getForceEmitDiagnostics() const { return ForceEmitDiagnostics; }
 
   /// \brief Specify which overload candidates to show when overload resolution
   /// fails.  By default, we show all candidates.
   void setShowOverloads(OverloadsShown Val) {
     ShowOverloads = Val;

Index: tools/clang/lib/Basic/Diagnostic.cpp
==================================================================
--- tools/clang/lib/Basic/Diagnostic.cpp
+++ tools/clang/lib/Basic/Diagnostic.cpp
@@ -46,10 +46,11 @@
   WarningsAsErrors = false;
   EnableAllWarnings = false;
   ErrorsAsFatal = false;
   SuppressSystemWarnings = false;
   SuppressAllDiagnostics = false;
+  ForceEmitDiagnostics = false;
   ElideType = true;
   PrintTemplateTree = false;
   ShowColors = false;
   ShowOverloads = Ovl_All;
   ExtBehavior = Ext_Ignore;

Index: tools/clang/lib/Basic/DiagnosticIDs.cpp
==================================================================
--- tools/clang/lib/Basic/DiagnosticIDs.cpp
+++ tools/clang/lib/Basic/DiagnosticIDs.cpp
@@ -575,11 +575,11 @@
 /// ProcessDiag - This is the method used to report a diagnostic that is
 /// finally fully formed.
 bool DiagnosticIDs::ProcessDiag(DiagnosticsEngine &Diag) const {
   Diagnostic Info(&Diag);
 
-  if (Diag.SuppressAllDiagnostics)
+  if (Diag.SuppressAllDiagnostics && !Diag.ForceEmitDiagnostics)
     return false;
 
   assert(Diag.getClient() && "DiagnosticClient not set!");
 
   // Figure out the diagnostic level of this message.
@@ -620,11 +620,11 @@
       ++Diag.TrapNumUnrecoverableErrorsOccurred;
   }
 
   // If a fatal error has already been emitted, silence all subsequent
   // diagnostics.
-  if (Diag.FatalErrorOccurred) {
+  if (Diag.FatalErrorOccurred && !Diag.ForceEmitDiagnostics) {
     if (DiagLevel >= DiagnosticIDs::Error &&
         Diag.Client->IncludeInDiagnosticCounts()) {
       ++Diag.NumErrors;
       ++Diag.NumErrorsSuppressed;
     }
Index: tools/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp
==================================================================
--- tools/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp
+++ tools/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp
@@ -390,12 +390,17 @@
     else
       OS << "\n  Line " << SourceMgr->getPresumedLineNumber(I->first);
     OS << ": " << I->second;
   }
 
+  // Override diagnostic suppression so that -verify diagnostics
+  // are always shown.
+  bool Force = Diags.getForceEmitDiagnostics();
+  Diags.setForceEmitDiagnostics();
   Diags.Report(diag::err_verify_inconsistent_diags)
     << Kind << !Expected << OS.str();
+  Diags.setForceEmitDiagnostics(Force);
   return std::distance(diag_begin, diag_end);
 }
 
 static unsigned PrintProblem(DiagnosticsEngine &Diags, SourceManager *SourceMgr,
                              DirectiveList &DL, const char *Kind,
@@ -416,12 +421,17 @@
          << SourceMgr->getFilename(D.DirectiveLoc) << ":"
          << SourceMgr->getPresumedLineNumber(D.DirectiveLoc) << ")";
     OS << ": " << D.Text;
   }
 
+  // Override diagnostic suppression so that -verify diagnostics
+  // are always shown.
+  bool Force = Diags.getForceEmitDiagnostics();
+  Diags.setForceEmitDiagnostics();
   Diags.Report(diag::err_verify_inconsistent_diags)
     << Kind << !Expected << OS.str();
+  Diags.setForceEmitDiagnostics(Force);
   return DL.size();
 }
 
 /// CheckLists - Compare expected to seen diagnostic lists and return the
 /// the difference between them.

