Index: src/ControlStruct/LabelFixer.cc
===================================================================
--- src/ControlStruct/LabelFixer.cc	(revision 5518719a47526994033bde07b833a0aada3e4cb4)
+++ src/ControlStruct/LabelFixer.cc	(revision 9d6317f3af502c6844dc1fb064f8fddb2e98a33b)
@@ -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 5518719a47526994033bde07b833a0aada3e4cb4)
+++ src/ControlStruct/MLEMutator.cc	(revision 9d6317f3af502c6844dc1fb064f8fddb2e98a33b)
@@ -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 5518719a47526994033bde07b833a0aada3e4cb4)
+++ src/ControlStruct/MLEMutator.h	(revision 9d6317f3af502c6844dc1fb064f8fddb2e98a33b)
@@ -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 >
Index: tests/.expect/except-finally-error.txt
===================================================================
--- tests/.expect/except-finally-error.txt	(revision 5518719a47526994033bde07b833a0aada3e4cb4)
+++ tests/.expect/except-finally-error.txt	(revision 9d6317f3af502c6844dc1fb064f8fddb2e98a33b)
@@ -11,2 +11,5 @@
 except-finally-error.cfa:111:1 error: 'fallthrough' must be enclosed in a 'switch' or 'choose'
 except-finally-error.cfa:124:1 error: 'fallthrough' must be enclosed in a 'switch' or 'choose'
+except-finally-error.cfa:133:1 error: 'return' may not appear in a finally clause
+except-finally-error.cfa:139:1 error: 'return' may not appear in a finally clause
+except-finally-error.cfa:148:1 error: 'break' outside a loop, 'switch', or labelled block
Index: tests/except-finally-error.cfa
===================================================================
--- tests/except-finally-error.cfa	(revision 5518719a47526994033bde07b833a0aada3e4cb4)
+++ tests/except-finally-error.cfa	(revision 9d6317f3af502c6844dc1fb064f8fddb2e98a33b)
@@ -142,4 +142,13 @@
 }
 
+// Checked in the same place, make sure it does't break.
+void break_in_function() {
+	while (true) {
+		void inner() {
+			break;
+		}
+	}
+}
+
 void main() {
 	// Should not compile.
