Index: src/ControlStruct/LabelFixer.cc
===================================================================
--- src/ControlStruct/LabelFixer.cc	(revision 5cdeecd791d8dc7c7709def12ae1f699bc711512)
+++ src/ControlStruct/LabelFixer.cc	(revision 8b16980c32b666a9179e12e780d2eb89df7d5941)
@@ -45,5 +45,6 @@
 	void LabelFixer::postvisit( FunctionDecl * functionDecl ) {
 		PassVisitor<MultiLevelExitMutator> mlem( resolveJumps(), generator );
-		functionDecl->acceptMutator( mlem );
+		// We start in the body so we can stop when we hit another FunctionDecl.
+		maybeMutate( functionDecl->statements, mlem );
 	}
 
Index: src/ControlStruct/MLEMutator.cc
===================================================================
--- src/ControlStruct/MLEMutator.cc	(revision 5cdeecd791d8dc7c7709def12ae1f699bc711512)
+++ src/ControlStruct/MLEMutator.cc	(revision 8b16980c32b666a9179e12e780d2eb89df7d5941)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Tue Jan 21 10:33:00 2020
-// Update Count     : 222
+// Last Modified On : Wed Jan 22 11:50:00 2020
+// Update Count     : 223
 //
 
@@ -60,4 +60,8 @@
 		}
 	} // namespace
+
+	void MultiLevelExitMutator::premutate( FunctionDecl * ) {
+		visit_children = false;
+	}
 
 	// break labels have to come after the statement they break out of, so mutate a statement, then if they inform us
@@ -352,4 +356,12 @@
 		});
 		enclosingControlStructures = std::list<Entry>();
+		GuardValue( inFinally );
+		inFinally = true;
+	}
+
+	void MultiLevelExitMutator::premutate( ReturnStmt *returnStmt ) {
+		if ( inFinally ) {
+			SemanticError( returnStmt->location, "'return' may not appear in a finally clause" );
+		}
 	}
 
Index: src/ControlStruct/MLEMutator.h
===================================================================
--- src/ControlStruct/MLEMutator.h	(revision 5cdeecd791d8dc7c7709def12ae1f699bc711512)
+++ src/ControlStruct/MLEMutator.h	(revision 8b16980c32b666a9179e12e780d2eb89df7d5941)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Tue Jan 21 10:33:00 2020
-// Update Count     : 47
+// Last Modified On : Wed Jan 22 11:50:00 2020
+// Update Count     : 48
 //
 
@@ -38,4 +38,6 @@
 		~MultiLevelExitMutator();
 
+		void premutate( FunctionDecl * );
+
 		void premutate( CompoundStmt *cmpndStmt );
 		Statement * postmutate( BranchStmt *branchStmt ) throw ( SemanticErrorException );
@@ -49,4 +51,5 @@
 		void premutate( SwitchStmt *switchStmt );
 		Statement * postmutate( SwitchStmt *switchStmt );
+		void premutate( ReturnStmt *returnStmt );
 		void premutate( TryStmt *tryStmt );
 		Statement * postmutate( TryStmt *tryStmt );
@@ -113,4 +116,5 @@
 		Label breakLabel;
 		LabelGenerator *generator;
+		bool inFinally = false;
 
 		template< typename LoopClass >
