Index: src/ControlStruct/FixLabels.cpp
===================================================================
--- src/ControlStruct/FixLabels.cpp	(revision 21fe17fb9204b02e5ee7ce500f9d93f6889e2447)
+++ src/ControlStruct/FixLabels.cpp	(revision 817bb3caacea2f610a325e8437fdf9ef7f30b2b2)
@@ -10,6 +10,6 @@
 // Created On       : Mon Nov  1 09:39:00 2021
 // Last Modified By : Andrew Beach
-// Last Modified On : Mon Nov  5 16:05:00 2021
-// Update Count     : 1
+// Last Modified On : Mon Nov  5 19:20:00 2021
+// Update Count     : 2
 //
 
@@ -58,7 +58,6 @@
 		}
 	}
-	LabelToStmt * copy = new LabelToStmt( labelTable );
 	return ast::mutate_field( decl, &ast::FunctionDecl::stmts,
-		multiLevelExitUpdate( decl->stmts.get(), copy, label_gen ) );
+		multiLevelExitUpdate( decl->stmts.get(), labelTable, label_gen ) );
 }
 
Index: src/ControlStruct/MultiLevelExit.cpp
===================================================================
--- src/ControlStruct/MultiLevelExit.cpp	(revision 21fe17fb9204b02e5ee7ce500f9d93f6889e2447)
+++ src/ControlStruct/MultiLevelExit.cpp	(revision 817bb3caacea2f610a325e8437fdf9ef7f30b2b2)
@@ -5,11 +5,11 @@
 // file "LICENCE" distributed with Cforall.
 //
-// MultiLevelExit.cpp --
+// MultiLevelExit.cpp -- Replaces CFA's local control flow with C's versions.
 //
 // Author           : Andrew Beach
 // Created On       : Mon Nov  1 13:48:00 2021
 // Last Modified By : Andrew Beach
-// Last Modified On : Mon Nov  5 12:06:00 2021
-// Update Count     : 0
+// Last Modified On : Mon Nov  5 19:20:00 2021
+// Update Count     : 1
 //
 
@@ -102,9 +102,8 @@
 }
 
-struct MultiLevelExitCore :
+struct MultiLevelExitCore final :
 		public ast::WithVisitorRef<MultiLevelExitCore>,
 		public ast::WithShortCircuiting, public ast::WithGuards {
-	MultiLevelExitCore( LabelToStmt * lt, LabelGenerator_new * lg );
-	~MultiLevelExitCore();
+	MultiLevelExitCore( const LabelToStmt & lt, LabelGenerator_new * lg );
 
 	void previsit( const ast::FunctionDecl * );
@@ -128,5 +127,5 @@
 	const ast::Stmt * mutateLoop( const ast::Stmt * body, Entry& );
 
-	LabelToStmt * target_table;
+	const LabelToStmt & target_table;
 	std::set<ast::Label> fallthrough_labels;
 	std::vector<Entry> enclosing_control_structures;
@@ -142,36 +141,22 @@
 	std::list<ast::ptr<ast::Stmt>> fixBlock(
 		const std::list<ast::ptr<ast::Stmt>> & kids, bool caseClause );
+
+	template<typename UnaryPredicate>
+	auto findEnclosingControlStructure( UnaryPredicate pred ) {
+		return std::find_if( enclosing_control_structures.rbegin(),
+			enclosing_control_structures.rend(), pred );
+	}
 };
 
-/*
-template<typename... Args>
-void MultiLevelExitCore::GuardEntry( Args&&... args ) {
-	enclosing_control_structures.emplace_back( std::forward<Args>(args)... );
-  GuardAction([this]() { enclosing_control_structures.pop_back(); } )
-}
-
-template<typename UnaryPredicate>
-void MultiLevelExitCore::findEnclosingControlStructure(UnaryPredicate pred) {
-	return std::find_if(
-		enclosing_control_structures.rbegin(),
-		enclosing_control_structures.rend(),
-		pred );
-}
-
-ast::NullStmt * MultiLevelExitCore::labeledNullStmt(
+ast::NullStmt * labelledNullStmt(
 		const CodeLocation & cl, const ast::Label & label ) {
 	return new ast::NullStmt( cl, std::vector<ast::Label>{ label } );
 }
-*/
-
-MultiLevelExitCore::MultiLevelExitCore( LabelToStmt * lt, LabelGenerator_new * lg ) :
+
+MultiLevelExitCore::MultiLevelExitCore(
+		const LabelToStmt & lt, LabelGenerator_new * lg ) :
 	target_table( lt ), break_label( CodeLocation(), "" ), label_gen( lg ),
 	inFinally( false )
 {}
-
-MultiLevelExitCore::~MultiLevelExitCore() {
-	delete target_table;
-	target_table = nullptr;
-}
 
 void MultiLevelExitCore::previsit( const ast::FunctionDecl * ) {
@@ -247,8 +232,5 @@
 		if ( stmt->target.empty() ) {
 			if ( isContinue ) {
-				targetEntry = std::find_if(
-					enclosing_control_structures.rbegin(),
-					enclosing_control_structures.rend(),
-					isContinueTarget );
+				targetEntry = findEnclosingControlStructure( isContinueTarget );
 			} else {
 				if ( enclosing_control_structures.empty() ) {
@@ -256,16 +238,11 @@
 						"'break' outside a loop, 'switch', or labelled block" );
 				}
-				targetEntry = std::find_if(
-					enclosing_control_structures.rbegin(),
-					enclosing_control_structures.rend(),
-					isBreakTarget );
+				targetEntry = findEnclosingControlStructure( isBreakTarget );
 			}
 		// Handle labeled break and continue.
 		} else {
 			// Lookup label in table to find attached control structure.
-			targetEntry = std::find_if(
-				enclosing_control_structures.rbegin(),
-				enclosing_control_structures.rend(),
-				[ targetStmt = (*target_table)[stmt->target] ](auto entry){
+			targetEntry = findEnclosingControlStructure(
+				[ targetStmt = target_table.at(stmt->target) ](auto entry){
 					return entry.stmt == targetStmt;
 				} );
@@ -283,9 +260,5 @@
 	}
 	case ast::BranchStmt::FallThrough: {
-		targetEntry = std::find_if(
-			enclosing_control_structures.rbegin(),
-			enclosing_control_structures.rend(),
-			isFallthroughTarget
-		);
+		targetEntry = findEnclosingControlStructure( isFallthroughTarget );
 		// Check that target is valid.
 		if ( targetEntry == enclosing_control_structures.rend() ) {
@@ -303,5 +276,5 @@
 	}
 	case ast::BranchStmt::FallThroughDefault: {
-		targetEntry = std::find_if( enclosing_control_structures.rbegin(), enclosing_control_structures.rend(), isFallthroughDefaultTarget );
+		targetEntry = findEnclosingControlStructure( isFallthroughDefaultTarget );
 
 		// Check that this is in a switch or choose statement.
@@ -397,4 +370,5 @@
 	// If it is the default, mark the default as seen.
 	if ( stmt->isDefault() ) {
+		assert( !enclosing_control_structures.empty() );
 		enclosing_control_structures.back().seenDefault();
 	}
@@ -422,8 +396,6 @@
 		Entry & entry = enclosing_control_structures.back();
 		if ( entry.isFallUsed() ) {
-			mutStmt->stmts.push_back( new ast::NullStmt(
-				mutStmt->location,
-				std::vector<ast::Label>{ entry.useFallExit() }
-			) );
+			mutStmt->stmts.push_back(
+				labelledNullStmt( mutStmt->location, entry.useFallExit() ) );
 		}
 	}
@@ -436,7 +408,6 @@
 		if ( entry.isFallDefaultUsed() ) {
 			// Add fallthrough default label if necessary.
-			push_front( mutStmt->stmts, new ast::NullStmt(
-				stmt->location,
-				std::vector<ast::Label>{ enclosing_control_structures.back().useFallDefaultExit() }
+			push_front( mutStmt->stmts, labelledNullStmt(
+				stmt->location, entry.useFallDefaultExit()
 			) );
 		}
@@ -568,10 +539,6 @@
 		ast::CompoundStmt * new_body = new ast::CompoundStmt( body->location );
 		new_body->kids.push_back( body );
-
-		new_body->kids.push_back( new ast::NullStmt(
-			body->location,
-			std::vector<ast::Label>{ entry.useContExit() }
-		) );
-
+		new_body->kids.push_back(
+			labelledNullStmt( body->location, entry.useContExit() ) );
 		return new_body;
 	}
@@ -624,8 +591,6 @@
 
 		if ( !break_label.empty() ) {
-			ret.push_back( new ast::NullStmt(
-				ret.back()->location,
-				std::vector<ast::Label>{ break_label }
-			) );
+			ret.push_back(
+				labelledNullStmt( ret.back()->location, break_label ) );
 			break_label = ast::Label( CodeLocation(), "" );
 		}
@@ -642,9 +607,10 @@
 const ast::CompoundStmt * multiLevelExitUpdate(
     	const ast::CompoundStmt * stmt,
-		LabelToStmt * labelTable,
+		const LabelToStmt & labelTable,
 		LabelGenerator_new * labelGen ) {
 	// Must start in the body, so FunctionDecls can be a stopping point.
 	ast::Pass<MultiLevelExitCore> visitor( labelTable, labelGen );
-	return stmt->accept( visitor );
+	const ast::CompoundStmt * ret = stmt->accept( visitor );
+	return ret;
 }
 
Index: src/ControlStruct/MultiLevelExit.hpp
===================================================================
--- src/ControlStruct/MultiLevelExit.hpp	(revision 21fe17fb9204b02e5ee7ce500f9d93f6889e2447)
+++ src/ControlStruct/MultiLevelExit.hpp	(revision 817bb3caacea2f610a325e8437fdf9ef7f30b2b2)
@@ -5,11 +5,11 @@
 // file "LICENCE" distributed with Cforall.
 //
-// MultiLevelExit.hpp --
+// MultiLevelExit.hpp -- Replaces CFA's local control flow with C's versions.
 //
 // Author           : Andrew Beach
 // Created On       : Mon Nov  1 13:49:00 2021
 // Last Modified By : Andrew Beach
-// Last Modified On : Mon Nov  2 10:26:00 2021
-// Update Count     : 0
+// Last Modified On : Mon Nov  5 19:20:00 2021
+// Update Count     : 1
 //
 
@@ -20,5 +20,5 @@
 namespace ast {
 	class CompoundStmt;
-    class Label;
+	class Label;
 	class Stmt;
 }
@@ -31,5 +31,5 @@
 /// Mutate a function body to handle multi-level exits.
 const ast::CompoundStmt * multiLevelExitUpdate(
-	const ast::CompoundStmt *, LabelToStmt *, LabelGenerator_new *);
+	const ast::CompoundStmt *, const LabelToStmt &, LabelGenerator_new *);
 
 }
