]> granicus.if.org Git - clang/commitdiff
[-Wunreachable-code] Don't warn about unreachable 'default:' cases.
authorTed Kremenek <kremenek@apple.com>
Thu, 27 Feb 2014 05:42:07 +0000 (05:42 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 27 Feb 2014 05:42:07 +0000 (05:42 +0000)
They are covered by -Wcovered-switch-default.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@202349 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/ReachableCode.cpp
test/Sema/warn-unreachable.c

index 599779871f8eeaa3b2db38fc29fc9dd0f3abb4be..046c9f4792b6aa77c840ea469ef82e64018b7847 100644 (file)
@@ -284,6 +284,12 @@ void DeadCodeScan::reportDeadCode(const CFGBlock *B,
   if (isBreakPrecededByNoReturn(B, S))
     return;
 
+  // Was this an unreachable 'default' case?  Such cases are covered
+  // by -Wcovered-switch-default, if the user so desires.
+  const Stmt *Label = B->getLabel();
+  if (Label && isa<DefaultStmt>(Label))
+    return;
+
   SourceRange R1, R2;
   SourceLocation Loc = GetUnreachableLoc(S, R1, R2);
   CB.HandleUnreachable(Loc, R1, R2);
index a626fa8dd200950ddfb3e3fb30aca866b9ac6f49..0d5d08942a108823cffec24d239c8f7e713f85de 100644 (file)
@@ -109,7 +109,7 @@ int test_enum_cases(enum Cases C) {
     case C3:
       return 1;
     default: {
-      int i = 0; // expected-warning{{will never be executed}}
+      int i = 0; // no-warning
       ++i;
       return i;
     }
@@ -164,3 +164,26 @@ int test_break_preceded_by_noreturn(int i) {
   }
   return i;
 }
+
+// Don't warn about unreachable 'default' cases, as that is covered
+// by -Wcovered-switch-default.
+typedef enum { Value1 = 1 } MyEnum;
+void unreachable_default(MyEnum e) {
+  switch (e) {
+    case Value1:
+    calledFun();
+    break;
+  default:
+    calledFun(); // no-warning
+    break;
+  }
+}
+void unreachable_in_default(MyEnum e) {
+  switch (e) {
+  default:
+    raze();
+    calledFun(); // expected-warning {{will never be executed}}
+    break;
+  }
+}
+