aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/CodeGen/CGStmt.cpp4
-rw-r--r--test/CodeGen/switch-dce.c13
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;
+}