Index: tools/clang/include/clang/Basic/DiagnosticGroups.td
===================================================================
--- tools/clang/include/clang/Basic/DiagnosticGroups.td	(revision 157687)
+++ tools/clang/include/clang/Basic/DiagnosticGroups.td	(working copy)
@@ -209,7 +209,9 @@
 def CoveredSwitchDefault : DiagGroup<"covered-switch-default">;
 def SwitchEnum     : DiagGroup<"switch-enum">;
 def Switch         : DiagGroup<"switch">;
-def ImplicitFallthrough  : DiagGroup<"implicit-fallthrough">;
+def ImplicitFallthroughPerMethod : DiagGroup<"implicit-fallthrough-per-method">;
+def ImplicitFallthrough  : DiagGroup<"implicit-fallthrough",
+                                     [ImplicitFallthroughPerMethod]>;
 def Trigraphs      : DiagGroup<"trigraphs">;
 
 def : DiagGroup<"type-limits">;
Index: tools/clang/include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- tools/clang/include/clang/Basic/DiagnosticSemaKinds.td	(revision 157687)
+++ tools/clang/include/clang/Basic/DiagnosticSemaKinds.td	(working copy)
@@ -5293,6 +5293,9 @@
 def warn_unannotated_fallthrough : Warning<
   "unannotated fall-through between switch labels">,
   InGroup<ImplicitFallthrough>, DefaultIgnore;
+def warn_unannotated_fallthrough_per_method : Warning<
+  "unannotated fall-through between switch labels in partly annotated method">,
+  InGroup<ImplicitFallthroughPerMethod>, DefaultIgnore;
 def note_insert_fallthrough_fixit : Note<
   "insert '[[clang::fallthrough]];' to silence this warning">;
 def note_insert_break_fixit : Note<
Index: tools/clang/lib/Sema/AnalysisBasedWarnings.cpp
===================================================================
--- tools/clang/lib/Sema/AnalysisBasedWarnings.cpp	(revision 157687)
+++ tools/clang/lib/Sema/AnalysisBasedWarnings.cpp	(working copy)
@@ -814,13 +814,17 @@
   };
 }
 
-static void DiagnoseSwitchLabelsFallthrough(Sema &S, AnalysisDeclContext &AC) {
+static void DiagnoseSwitchLabelsFallthrough(Sema &S, AnalysisDeclContext &AC,
+                                            bool PerMethod) {
   FallthroughMapper FM(S);
   FM.TraverseStmt(AC.getBody());
 
   if (!FM.foundSwitchStatements())
     return;
 
+  if (PerMethod && FM.getFallthroughStmts().empty())
+    return;
+
   CFG *Cfg = AC.getCFG();
 
   if (!Cfg)
@@ -838,7 +842,9 @@
     if (!FM.checkFallThroughIntoBlock(B, AnnotatedCnt))
       continue;
 
-    S.Diag(Label->getLocStart(), diag::warn_unannotated_fallthrough);
+    S.Diag(Label->getLocStart(),
+        PerMethod ? diag::warn_unannotated_fallthrough_per_method
+                  : diag::warn_unannotated_fallthrough);
 
     if (!AnnotatedCnt) {
       SourceLocation L = Label->getLocStart();
@@ -1324,9 +1330,11 @@
     }
   }
 
-  if (Diags.getDiagnosticLevel(diag::warn_unannotated_fallthrough,
+  if (Diags.getDiagnosticLevel(diag::warn_unannotated_fallthrough_per_method,
                               D->getLocStart()) != DiagnosticsEngine::Ignored) {
-    DiagnoseSwitchLabelsFallthrough(S, AC);
+    bool Full = Diags.getDiagnosticLevel(diag::warn_unannotated_fallthrough,
+                             D->getLocStart()) != DiagnosticsEngine::Ignored;
+    DiagnoseSwitchLabelsFallthrough(S, AC, !Full);
   }
 
   // Collect statistics about the CFG if it was built.
