Index: lib/Sema/SemaStmt.cpp
===================================================================
--- lib/Sema/SemaStmt.cpp	(revision 140432)
+++ lib/Sema/SemaStmt.cpp	(working copy)
@@ -881,11 +881,17 @@
 
         if (RI == CaseRanges.end() || EI->first < RI->first) {
           hasCasesNotInSwitch = true;
-          if (!TheDefaultStmt)
-            UnhandledNames.push_back(EI->second->getDeclName());
+          UnhandledNames.push_back(EI->second->getDeclName());
         }
       }
 
+      if (TheDefaultStmt) {
+        if (UnhandledNames.size() == 0)
+          Diag(TheDefaultStmt->getDefaultLoc(), diag::warn_unreachable_default);
+        else
+          UnhandledNames.clear();
+      }
+
       // Produce a nice diagnostic if multiple values aren't handled.
       switch (UnhandledNames.size()) {
       case 0: break;
Index: include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- include/clang/Basic/DiagnosticSemaKinds.td	(revision 140432)
+++ include/clang/Basic/DiagnosticSemaKinds.td	(working copy)
@@ -4492,6 +4492,9 @@
 def warn_missing_cases : Warning<
   "%0 enumeration values not handled in switch: %1, %2, %3...">,
   InGroup<DiagGroup<"switch-enum"> >;
+def warn_unreachable_default : Warning<
+  "default is unreachable as all enumeration values are accounted for">,
+  InGroup<DiagGroup<"switch-enum"> >;
 
 def warn_not_in_enum : Warning<"case value not in enumerated type %0">,
   InGroup<DiagGroup<"switch-enum"> >; 
