diff options
-rw-r--r-- | lib/CodeGen/CGStmt.cpp | 4 | ||||
-rw-r--r-- | test/CodeGen/switch-dce.c | 13 |
2 files changed, 14 insertions, 3 deletions
diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp index 70cda5a225..c67d1d1b0d 100644 --- a/lib/CodeGen/CGStmt.cpp +++ b/lib/CodeGen/CGStmt.cpp @@ -857,9 +857,6 @@ static CSFC_Result CollectStatementsForCase(const Stmt *S, const SwitchCase *Case, bool &FoundCase, llvm::SmallVectorImpl<const Stmt*> &ResultStmts) { - assert((!FoundCase || Case == 0) && - "Can't be looking for the case if we already found it!"); - // If this is a null statement, just succeed. if (S == 0) return Case ? CSFC_Success : CSFC_FallThrough; @@ -942,6 +939,7 @@ static CSFC_Result CollectStatementsForCase(const Stmt *S, // just verify it doesn't have labels, which would make it invalid to elide. if (Case) { if (CodeGenFunction::ContainsLabel(S, true) || + // Don't skip over DeclStmts, which can be used even if skipped over. isa<DeclStmt>(S)) return CSFC_Failure; return CSFC_Success; diff --git a/test/CodeGen/switch-dce.c b/test/CodeGen/switch-dce.c index 3276737793..95c5e03633 100644 --- a/test/CodeGen/switch-dce.c +++ b/test/CodeGen/switch-dce.c @@ -167,3 +167,16 @@ void test9(int i) { } } + +int test10(void) { + switch(8) { + case 8: + break; + case 4: + break; + default: + dead(); + } + + return 0; +} |