Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision c2931ea2efda8cee0e0cd69b27d7bea9755849eb)
+++ src/InitTweak/FixInit.cc	(revision e39aa0f16322a921d6a17d13906cfd8c8ffca0d9)
@@ -35,5 +35,5 @@
 bool ctorp = false;
 bool cpctorp = false;
-bool dtorp = true;
+bool dtorp = false;
 #define PRINT( text ) if ( ctordtorp ) { text }
 #define CP_CTOR_PRINT( text ) if ( ctordtorp || cpctorp ) { text }
@@ -499,5 +499,5 @@
 				curVars.insert( objDecl );
 			}
-			return Parent::visit( stmt );
+			Parent::visit( stmt );
 		}
 
@@ -563,6 +563,13 @@
 		}
 
+		// Handle break/continue/goto in the same manner as C++.
+		// Basic idea: any objects that are in scope at the BranchStmt
+		// but not at the labelled (target) statement must be destructed.
+		// If there are any objects in scope at the target location but
+		// not at the BranchStmt then those objects would be uninitialized
+		// so notify the user of the error.
+		// See C++ Reference 6.6 Jump Statements for details.
 		void InsertDtors::handleGoto( BranchStmt * stmt ) {
-			assert( stmt->get_type() == BranchStmt::Goto );
+			assert( stmt->get_target() != "" && "BranchStmt missing a label" );
 			// S_L = lvars = set of objects in scope at label definition
 			// S_G = curVars = set of objects in scope at goto statement
@@ -602,17 +609,10 @@
 
 		void InsertDtors::visit( BranchStmt * stmt ) {
-			// TODO: adding to the end of a block isn't sufficient, since
-			// return/break/goto should trigger destructor when block is left.
 			switch( stmt->get_type() ) {
 				case BranchStmt::Continue:
 				case BranchStmt::Break:
-				// xxx - easiest thing to do: generate a label for every break/continue
-				// this label is unused, so attach unused attribute to it
-				// finally, all of these cases can be the same (this is less efficient than it could be,
-				// because the S_L-S_G check is unnecessary [the set should always be empty], but this
-				// serves as a bit of a sanity check, so I'm okay with it.)
-					// xxx - this is insufficient, because multiple blocks can be opened in a switch or loop
-					insertDtors( reverseDeclOrder.front().begin(), reverseDeclOrder.front().end(), back_inserter( stmtsToAdd ) );
-					break;
+				// could optimize the break/continue case, because the S_L-S_G check
+				// is unnecessary (this set should always be empty), but it serves
+				// as a small sanity check.
 				case BranchStmt::Goto:
 					handleGoto( stmt );
