Index: src/ControlStruct/ExceptTranslate.cc
===================================================================
--- src/ControlStruct/ExceptTranslate.cc	(revision a8a3485239153c854ff04818abd00b3938c9d469)
+++ src/ControlStruct/ExceptTranslate.cc	(revision 7f9968adc291989fb495461dc2b178248a560216)
@@ -10,6 +10,6 @@
 // Created On       : Wed Jun 14 16:49:00 2017
 // Last Modified By : Andrew Beach
-// Last Modified On : Tue May 26 10:56:00 2020
-// Update Count     : 16
+// Last Modified On : Wed Jun 24 11:18:00 2020
+// Update Count     : 17
 //
 
@@ -72,5 +72,4 @@
 			ThrowStmt * throwStmt, const char * throwFunc );
 		Statement * create_terminate_rethrow( ThrowStmt * throwStmt );
-		Statement * create_resume_rethrow( ThrowStmt * throwStmt );
 
 	public:
@@ -113,15 +112,4 @@
 			new UntypedExpr( new NameExpr( "__cfaehm_rethrow_terminate" ) )
 			) );
-		delete throwStmt;
-		return result;
-	}
-
-	Statement * ThrowMutatorCore::create_resume_rethrow(
-			ThrowStmt *throwStmt ) {
-		// return false;
-		Statement * result = new ReturnStmt(
-			new ConstantExpr( Constant::from_bool( false ) )
-			);
-		result->labels = throwStmt->labels;
 		delete throwStmt;
 		return result;
@@ -167,5 +155,6 @@
 				return create_either_throw( throwStmt, "$throwResume" );
 			} else if ( ResHandler == cur_context ) {
-				return create_resume_rethrow( throwStmt );
+				// This has to be handled later.
+				return throwStmt;
 			} else {
 				abort("Invalid throwResume in %s at %i\n",
@@ -196,4 +185,5 @@
 		FunctionDecl * create_finally_wrapper( TryStmt * tryStmt );
 		ObjectDecl * create_finally_hook( FunctionDecl * finally_wrapper );
+		Statement * create_resume_rethrow( ThrowStmt * throwStmt );
 
 		// Types used in translation, make sure to use clone.
@@ -227,4 +217,5 @@
 		void premutate( StructDecl *structDecl );
 		Statement * postmutate( TryStmt *tryStmt );
+		Statement * postmutate( ThrowStmt *throwStmt );
 	};
 
@@ -594,4 +585,14 @@
 			attributes
 			);
+	}
+
+	Statement * TryMutatorCore::create_resume_rethrow( ThrowStmt *throwStmt ) {
+		// return false;
+		Statement * result = new ReturnStmt(
+			new ConstantExpr( Constant::from_bool( false ) )
+			);
+		result->labels = throwStmt->labels;
+		delete throwStmt;
+		return result;
 	}
 
@@ -668,4 +669,10 @@
 	}
 
+	Statement * TryMutatorCore::postmutate( ThrowStmt *throwStmt ) {
+		// Only valid `throwResume;` statements should remain. (2/3 checks)
+		assert( ThrowStmt::Resume == throwStmt->kind && ! throwStmt->expr );
+		return create_resume_rethrow( throwStmt );
+	}
+
 	void translateThrows( std::list< Declaration *> & translationUnit ) {
 		PassVisitor<ThrowMutatorCore> translator;
Index: tests/exceptions/.expect/resume.txt
===================================================================
--- tests/exceptions/.expect/resume.txt	(revision a8a3485239153c854ff04818abd00b3938c9d469)
+++ tests/exceptions/.expect/resume.txt	(revision 7f9968adc291989fb495461dc2b178248a560216)
@@ -31,2 +31,6 @@
 inner catch
 outer catch
+
+throw
+rethrow
+handle
Index: tests/exceptions/.expect/terminate.txt
===================================================================
--- tests/exceptions/.expect/terminate.txt	(revision a8a3485239153c854ff04818abd00b3938c9d469)
+++ tests/exceptions/.expect/terminate.txt	(revision 7f9968adc291989fb495461dc2b178248a560216)
@@ -29,2 +29,6 @@
 inner catch
 outer catch
+
+throw
+rethrow
+handle
Index: tests/exceptions/resume.cfa
===================================================================
--- tests/exceptions/resume.cfa	(revision a8a3485239153c854ff04818abd00b3938c9d469)
+++ tests/exceptions/resume.cfa	(revision 7f9968adc291989fb495461dc2b178248a560216)
@@ -8,4 +8,6 @@
 TRIVIAL_EXCEPTION(zen);
 TRIVIAL_EXCEPTION(moment_of, zen);
+
+void in_void(void);
 
 int main(int argc, char * argv[]) {
@@ -121,3 +123,21 @@
 		printf("outer catch\n");
 	}
+	printf("\n");
+
+	in_void();
 }
+
+// Do a throw and rethrow in a void function.
+void in_void(void) {
+	try {
+		try {
+			printf("throw\n");
+			throwResume (zen){};
+		} catchResume (zen *) {
+			printf("rethrow\n");
+			throwResume;
+		}
+	} catchResume (zen *) {
+		printf("handle\n");
+	}
+}
Index: tests/exceptions/terminate.cfa
===================================================================
--- tests/exceptions/terminate.cfa	(revision a8a3485239153c854ff04818abd00b3938c9d469)
+++ tests/exceptions/terminate.cfa	(revision 7f9968adc291989fb495461dc2b178248a560216)
@@ -8,4 +8,6 @@
 TRIVIAL_EXCEPTION(zen);
 TRIVIAL_EXCEPTION(moment_of, zen);
+
+void in_void(void);
 
 int main(int argc, char * argv[]) {
@@ -121,3 +123,22 @@
 		printf("outer catch\n");
 	}
+	printf("\n");
+
+	in_void();
 }
+
+// Do a throw and rethrow in a void function.
+void in_void(void) {
+	try {
+		try {
+			printf("throw\n");
+			throw (zen){};
+		} catch (zen *) {
+			printf("rethrow\n");
+			throw;
+		}
+	} catch (zen *) {
+		printf("handle\n");
+	}
+}
+
