Index: tests/exceptions/.expect/defaults.txt
===================================================================
--- tests/exceptions/.expect/defaults.txt	(revision 9ec8c5f33d27fb98eb1108e4b42790b2e6e66ef7)
+++ tests/exceptions/.expect/defaults.txt	(revision 381132ba126ac35f3861afa076f853406af1e11c)
@@ -3,2 +3,8 @@
 jump default handler.
 Catch unhandled_exception.
+cross terminate throw
+cross terminate default
+cross terminate catch
+cross resume throw
+cross resume default
+cross resume catch
Index: tests/exceptions/defaults.cfa
===================================================================
--- tests/exceptions/defaults.cfa	(revision 9ec8c5f33d27fb98eb1108e4b42790b2e6e66ef7)
+++ tests/exceptions/defaults.cfa	(revision 381132ba126ac35f3861afa076f853406af1e11c)
@@ -30,5 +30,5 @@
 		throwResume (log_message){(char *)"Should be printed.\n"};
 	} catchResume (log_message * this) {
-		printf(this->virtual_table->msg(this));
+		printf("%s", this->virtual_table->msg(this));
 	}
 	// But we don't have to:
@@ -69,7 +69,33 @@
 }
 
+TRIVIAL_EXCEPTION(second);
+
+void cross_test(void) {
+	void defaultTerminationHandler(first &) {
+		printf("cross terminate default\n");
+		throw (second){};
+	}
+	void defaultResumptionHandler(first &) {
+		printf("cross resume default\n");
+		throwResume (second){};
+	}
+	try {
+		printf("cross terminate throw\n");
+		throw (first){};
+	} catch (second *) {
+		printf("cross terminate catch\n");
+	}
+	try {
+		printf("cross resume throw\n");
+		throwResume (first){};
+	} catchResume (second *) {
+		printf("cross resume catch\n");
+	}
+}
+
 int main(int argc, char * argv[]) {
 	log_test();
 	jump_test();
 	unhandled_test();
+	cross_test();
 }
