Index: tests/exceptions/.expect/fibonacci_nonlocal.txt
===================================================================
--- tests/exceptions/.expect/fibonacci_nonlocal.txt	(revision bef224516892e07bf860916060c1f2ca5b6870e0)
+++ tests/exceptions/.expect/fibonacci_nonlocal.txt	(revision bef224516892e07bf860916060c1f2ca5b6870e0)
@@ -0,0 +1,7 @@
+0
+1
+1
+0
+2
+4
+20
Index: tests/exceptions/.expect/nonlocal_pingpong.txt
===================================================================
--- tests/exceptions/.expect/nonlocal_pingpong.txt	(revision bef224516892e07bf860916060c1f2ca5b6870e0)
+++ tests/exceptions/.expect/nonlocal_pingpong.txt	(revision bef224516892e07bf860916060c1f2ca5b6870e0)
@@ -0,0 +1,2 @@
+start
+done
Index: tests/exceptions/fibonacci_nonlocal.cfa
===================================================================
--- tests/exceptions/fibonacci_nonlocal.cfa	(revision bef224516892e07bf860916060c1f2ca5b6870e0)
+++ tests/exceptions/fibonacci_nonlocal.cfa	(revision bef224516892e07bf860916060c1f2ca5b6870e0)
@@ -0,0 +1,77 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// fibonacci.c -- 3-state finite-state machine
+//
+// Author           : Colby Parsons
+// Created On       : Thu July  6 07:29:37 2023
+// Last Modified By : Colby Parsons
+// Last Modified On : Thu July  6 07:29:37 2023
+// Update Count     : 0
+//
+
+#include <fstream.hfa>
+#include <coroutine.hfa>
+#include <stdlib.hfa>
+
+exception fib_num {
+    int num;
+};
+vtable(fib_num) fib_num_vt;
+
+exception fib_2_num {
+    int num1, num2;
+};
+vtable(fib_2_num) fib_2_num_vt;
+
+coroutine Fibonacci { int fn; };						// used for communication
+
+void main( Fibonacci & fib ) with( fib ) {				// called on first resume
+    int fn1, fn2;										// retained between resumes
+    try{
+        fn = 0;  fn1 = fn;									// 1st case
+        poll( fib );
+        suspend;											// restart last resume
+        fn = 1;  fn2 = fn1;  fn1 = fn;						// 2nd case
+        poll( fib );
+        suspend;											// restart last resume
+        for () {
+            fn = fn1 + fn2;  fn2 = fn1;  fn1 = fn;			// general case
+            poll( fib );
+            suspend;										// restart last resume
+        } // for
+    } catchResume ( fib_num * e ) {
+        fn1 = e->num;
+        fn2 = e->num;
+        fn = fn1 + fn2;
+    }  catchResume ( fib_2_num * e ) {
+        fn1 = e->num1;
+        fn2 = e->num1;
+        fn = fn1 + fn2;
+    }
+}
+
+int main() {
+	Fibonacci f1, f2;
+	for ( 3 ) {										// print N Fibonacci values
+		sout | resume( f1 ).fn;
+	} // for
+    for ( i; 3 ) {
+        fib_num except{ &fib_num_vt, i };
+        resumeAt( f1, except );
+        sout | resume( f1 ).fn;
+    }
+    {
+        fib_2_num except{ &fib_2_num_vt, 10, 12 };
+        resumeAt( f1, except );
+    }
+    sout | resume( f1 ).fn;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa fibonacci.cfa" //
+// End: //
Index: tests/exceptions/nonlocal_pingpong.cfa
===================================================================
--- tests/exceptions/nonlocal_pingpong.cfa	(revision bef224516892e07bf860916060c1f2ca5b6870e0)
+++ tests/exceptions/nonlocal_pingpong.cfa	(revision bef224516892e07bf860916060c1f2ca5b6870e0)
@@ -0,0 +1,66 @@
+#include <fstream.hfa>
+#include <thread.hfa>
+#include <coroutine.hfa>
+#include <stdlib.hfa>
+#include <fstream.hfa>
+
+exception num_pings { int num; };
+vtable(num_pings) num_pings_vt;
+
+exception num_pongs { int num; };
+vtable(num_pongs) num_pongs_vt;
+
+thread Ping;
+thread Pong { Ping & p; int cnt; };
+thread Ping { Pong & p; int cnt; };
+
+int numtimes = 100000;
+
+void main( Pong & this ) with(this) {
+    try {
+        for ( ;; ) {
+            while( !poll( this ) ) {}
+            num_pongs except{ &num_pongs_vt, cnt + 1 };
+            resumeAt( p, except );
+        }
+    } catchResume ( num_pings * e; e->num < numtimes ) {
+        cnt = e->num;
+    } catch( num_pings * e ) {
+        if ( e->num == numtimes ){
+            num_pongs except{ &num_pongs_vt, e->num + 1 };
+            resumeAt( p, except );
+        }
+    }
+}
+
+void main( Ping & this ) with(this) {
+    try {
+        for ( ;; ) {
+            while( !poll( this ) ) {}
+            num_pings except{ &num_pings_vt, cnt + 1 };
+            resumeAt( p, except );
+        }
+    } catchResume ( num_pongs * e; e->num < numtimes ) {
+        cnt = e->num;
+    } catch( num_pongs * e ) {
+        if ( e->num == numtimes ){
+            num_pings except{ &num_pings_vt, e->num + 1 };
+            resumeAt( p, except );
+        }
+    }
+}
+
+int main() {
+    processor p;
+    sout | "start";
+    {
+        Ping ping;
+        Pong pong;
+        &ping.p = &pong;
+        &pong.p = &ping;
+        num_pings except{ &num_pings_vt, 0 };
+        resumeAt( pong, except );
+    }
+    sout | "done";
+}
+
