From: Ted Kremenek Date: Thu, 27 Feb 2014 05:42:07 +0000 (+0000) Subject: [-Wunreachable-code] Don't warn about unreachable 'default:' cases. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1f9ec9292912314ed825a5dc97383a759223c8ec;p=clang [-Wunreachable-code] Don't warn about unreachable 'default:' cases. They are covered by -Wcovered-switch-default. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@202349 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/ReachableCode.cpp b/lib/Analysis/ReachableCode.cpp index 599779871f..046c9f4792 100644 --- a/lib/Analysis/ReachableCode.cpp +++ b/lib/Analysis/ReachableCode.cpp @@ -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(Label)) + return; + SourceRange R1, R2; SourceLocation Loc = GetUnreachableLoc(S, R1, R2); CB.HandleUnreachable(Loc, R1, R2); diff --git a/test/Sema/warn-unreachable.c b/test/Sema/warn-unreachable.c index a626fa8dd2..0d5d08942a 100644 --- a/test/Sema/warn-unreachable.c +++ b/test/Sema/warn-unreachable.c @@ -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; + } +} +