Index: include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- include/clang/Basic/DiagnosticSemaKinds.td	(revision 182581)
+++ include/clang/Basic/DiagnosticSemaKinds.td	(working copy)
@@ -5994,6 +5994,8 @@
 def err_case_not_in_switch : Error<"'case' statement not in switch statement">;
 def warn_bool_switch_condition : Warning<
   "switch condition has boolean value">;
+def warn_empty_switch : Warning<"switch statement contains no 'case' or "
+  "'default' labels">, InGroup<Switch>;
 def warn_case_value_overflow : Warning<
   "overflow converting case value to switch condition type (%0 to %1)">,
   InGroup<Switch>;
Index: lib/Sema/SemaStmt.cpp
===================================================================
--- lib/Sema/SemaStmt.cpp	(revision 182581)
+++ lib/Sema/SemaStmt.cpp	(working copy)
@@ -805,6 +805,10 @@
     }
   }
 
+  // If we don't have any case or default labels, warn the user.
+  if (!SS->getSwitchCaseList())
+    Diag(SwitchLoc, diag::warn_empty_switch);
+
   if (!HasDependentValue) {
     // If we don't have a default statement, check whether the
     // condition is constant.
Index: test/Sema/switch.c
===================================================================
--- test/Sema/switch.c	(revision 182581)
+++ test/Sema/switch.c	(working copy)
@@ -27,6 +27,9 @@
   switch (0); // expected-warning {{no case matching constant switch condition '0'}} \
               // expected-warning {{switch statement has empty body}} \
               // expected-note{{put the semicolon on a separate line to silence this warning}}
+
+  // different empty switch
+  switch (0) {}  // expected-warning {{switch statement contains no 'case' or 'default' labels}}
 }
 
 extern int g();
