Index: lib/CodeGen/CGStmt.cpp
===================================================================
--- lib/CodeGen/CGStmt.cpp	(revision 148260)
+++ lib/CodeGen/CGStmt.cpp	(working copy)
@@ -1162,6 +1162,10 @@
   if (S.getConditionVariable())
     EmitAutoVarDecl(*S.getConditionVariable());
 
+  // Handle nested switch statements.
+  llvm::SwitchInst *SavedSwitchInsn = SwitchInsn;
+  llvm::BasicBlock *SavedCRBlock = CaseRangeBlock;
+
   // See if we can constant fold the condition of the switch and therefore only
   // emit the live case statement (if any) of the switch.
   llvm::APInt ConstantCondValue;
@@ -1171,20 +1175,26 @@
                                    getContext())) {
       RunCleanupsScope ExecutedScope(*this);
 
+      // At this point, we are no longer "within" a switch instance, so
+      // we can temporarily enforce this to ensure that any embedded case
+      // statements are not emitted.
+      SwitchInsn = 0;
+
       // Okay, we can dead code eliminate everything except this case.  Emit the
       // specified series of statements and we're good.
       for (unsigned i = 0, e = CaseStmts.size(); i != e; ++i)
         EmitStmt(CaseStmts[i]);
+
+      // Now we want to restore the saved switch instance so that nested switches
+      // continue to function properly
+      SwitchInsn = SavedSwitchInsn;
+
       return;
     }
   }
     
   llvm::Value *CondV = EmitScalarExpr(S.getCond());
 
-  // Handle nested switch statements.
-  llvm::SwitchInst *SavedSwitchInsn = SwitchInsn;
-  llvm::BasicBlock *SavedCRBlock = CaseRangeBlock;
-
   // Create basic block to hold stuff that comes after switch
   // statement. We also need to create a default block now so that
   // explicit case ranges tests can have a place to jump to on
Index: test/CodeGenCXX/switch-case-folding-2.cpp
===================================================================
--- test/CodeGenCXX/switch-case-folding-2.cpp	(revision 0)
+++ test/CodeGenCXX/switch-case-folding-2.cpp	(working copy)
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 %s -emit-llvm-only
+// CHECK that we don't crash.
+
+#include <stdio.h>
+int test(int val){
+ switch (val) {
+ case 4:
+   do {
+     switch (6) {
+       case 6: do { case 5: printf("bad\n"); } while (0);
+     };
+   } while (0);
+ }
+ return 0;
+}
+
+int main(void) {
+ return test(5);
+}
\ No newline at end of file
