diff -U 3 -dHrN include/clang/Basic/Diagnostic.h include/clang/Basic/Diagnostic.h
--- include/clang/Basic/Diagnostic.h	2012-06-25 16:21:20.000000000 +0200
+++ include/clang/Basic/Diagnostic.h	2012-06-25 16:55:19.000000000 +0200
@@ -175,6 +175,8 @@
   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)
   OverloadsShown ShowOverloads;  // Which overload candidates to show.
   unsigned ErrorLimit;           // Cap of # errors emitted, 0 -> no limit.
   unsigned TemplateBacktraceLimit; // Cap on depth of template backtrace stack,
@@ -439,6 +441,14 @@
   }
   bool getSuppressAllDiagnostics() const { return SuppressAllDiagnostics; }
   
+  /// \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) {
diff -U 3 -dHrN lib/Basic/Diagnostic.cpp lib/Basic/Diagnostic.cpp
--- lib/Basic/Diagnostic.cpp	2012-06-25 16:21:20.000000000 +0200
+++ lib/Basic/Diagnostic.cpp	2012-06-25 16:56:51.000000000 +0200
@@ -48,6 +48,7 @@
   ErrorsAsFatal = false;
   SuppressSystemWarnings = false;
   SuppressAllDiagnostics = false;
+  ForceEmitDiagnostics = false;
   ShowOverloads = Ovl_All;
   ExtBehavior = Ext_Ignore;
 
diff -U 3 -dHrN lib/Basic/DiagnosticIDs.cpp lib/Basic/DiagnosticIDs.cpp
--- lib/Basic/DiagnosticIDs.cpp	2012-06-25 16:21:20.000000000 +0200
+++ lib/Basic/DiagnosticIDs.cpp	2012-06-25 16:57:52.000000000 +0200
@@ -577,7 +577,7 @@
 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!");
@@ -622,7 +622,7 @@
 
   // 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;
@@ -634,9 +634,10 @@
 
   // If the client doesn't care about this message, don't issue it.  If this is
   // a note and the last real diagnostic was ignored, ignore it too.
-  if (DiagLevel == DiagnosticIDs::Ignored ||
-      (DiagLevel == DiagnosticIDs::Note &&
-       Diag.LastDiagLevel == DiagnosticIDs::Ignored))
+  if (!Diag.ForceEmitDiagnostics &&
+        (DiagLevel == DiagnosticIDs::Ignored ||
+          (DiagLevel == DiagnosticIDs::Note &&
+           Diag.LastDiagLevel == DiagnosticIDs::Ignored)))
     return false;
 
   if (DiagLevel >= DiagnosticIDs::Error) {
diff -U 3 -dHrN lib/Frontend/VerifyDiagnosticConsumer.cpp lib/Frontend/VerifyDiagnosticConsumer.cpp
--- lib/Frontend/VerifyDiagnosticConsumer.cpp	2012-06-25 16:51:45.000000000 +0200
+++ lib/Frontend/VerifyDiagnosticConsumer.cpp	2012-06-25 16:59:16.000000000 +0200
@@ -394,8 +394,13 @@
     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);
 }
 
@@ -416,8 +421,13 @@
     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();
 }
 
