From: Ted Kremenek Date: Wed, 16 Mar 2011 04:32:01 +0000 (+0000) Subject: Teach CFGBuilder that the 'default' branch of a switch statement is dead if all enum... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=432c478fe0fec3946610d5dc7905daf5fbadf47b;p=clang Teach CFGBuilder that the 'default' branch of a switch statement is dead if all enum values in a switch conditioned are handled. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@127727 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/CFG.cpp b/lib/Analysis/CFG.cpp index 4772a69b4a..a1afd60fe7 100644 --- a/lib/Analysis/CFG.cpp +++ b/lib/Analysis/CFG.cpp @@ -2249,9 +2249,11 @@ CFGBlock* CFGBuilder::VisitSwitchStmt(SwitchStmt* Terminator) { } // If we have no "default:" case, the default transition is to the code - // following the switch body. + // following the switch body. Moreover, take into account if all the + // cases of a switch are covered (e.g., switching on an enum value). addSuccessor(SwitchTerminatedBlock, - switchExclusivelyCovered ? 0 : DefaultCaseBlock); + switchExclusivelyCovered || Terminator->isAllEnumCasesCovered() + ? 0 : DefaultCaseBlock); // Add the terminator and condition in the switch block. SwitchTerminatedBlock->setTerminator(Terminator); diff --git a/test/SemaCXX/array-bounds.cpp b/test/SemaCXX/array-bounds.cpp index 62b4d520cc..3bd6c35420 100644 --- a/test/SemaCXX/array-bounds.cpp +++ b/test/SemaCXX/array-bounds.cpp @@ -160,3 +160,16 @@ void test_nested_switch() } } +// Test that if all the values of an enum covered, that the 'default' branch +// is unreachable. +enum Values { A, B, C, D }; +void test_all_enums_covered(enum Values v) { + int x[2]; + switch (v) { + case A: return; + case B: return; + case C: return; + case D: return; + } + x[2] = 0; // no-warning +}