diff gen/statements.cpp @ 311:9967a3270837 trunk

[svn r332] Fix codegen for continue within switch.
author ChristianK
date Sat, 28 Jun 2008 18:37:27 +0200
parents d59c363fccad
children 8d98e42ece93
line wrap: on
line diff
--- a/gen/statements.cpp	Sat Jun 28 11:50:28 2008 +0200
+++ b/gen/statements.cpp	Sat Jun 28 18:37:27 2008 +0200
@@ -458,8 +458,15 @@
         assert(0);
     }
     else {
-        DtoEnclosingHandlers(enclosinghandler, gIR->loopbbs.back().enclosinghandler);
-        llvm::BranchInst::Create(gIR->loopbbs.back().begin, gIR->scopebb());
+        // can't 'continue' within switch, so omit them
+        IRState::LoopScopeVec::reverse_iterator it;
+        for(it = gIR->loopbbs.rbegin(); it != gIR->loopbbs.rend(); ++it) {
+            if(!it->isSwitch) {
+                break;
+            }
+        }
+        DtoEnclosingHandlers(enclosinghandler, it->enclosinghandler);
+        llvm::BranchInst::Create(it->begin, gIR->scopebb());
     }
 }
 
@@ -757,7 +764,7 @@
     assert(body);
 
     p->scope() = IRScope(bodybb, endbb);
-    p->loopbbs.push_back(IRLoopScope(this,enclosinghandler,p->scopebb(),endbb));
+    p->loopbbs.push_back(IRLoopScope(this,enclosinghandler,p->scopebb(),endbb,true));
     body->toIR(p);
     p->loopbbs.pop_back();