Index: tests/.expect/attributes.nast.x64.txt
===================================================================
--- tests/.expect/attributes.nast.x64.txt	(revision fb63c7000e1bf4b0f15e255f7a6699deefbb4a02)
+++ tests/.expect/attributes.nast.x64.txt	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
@@ -1339,9 +1339,5 @@
         }
 
-        {
-            ((void)(_X4_retM12__anonymous4_2=(*_X4_dstM12__anonymous4_2)) /* ?{} */);
-        }
-
-        return _X4_retM12__anonymous4_2;
+        return (*_X4_dstM12__anonymous4_2);
     }
     {
Index: tests/.expect/attributes.nast.x86.txt
===================================================================
--- tests/.expect/attributes.nast.x86.txt	(revision fb63c7000e1bf4b0f15e255f7a6699deefbb4a02)
+++ tests/.expect/attributes.nast.x86.txt	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
@@ -1339,9 +1339,5 @@
         }
 
-        {
-            ((void)(_X4_retM12__anonymous4_2=(*_X4_dstM12__anonymous4_2)) /* ?{} */);
-        }
-
-        return _X4_retM12__anonymous4_2;
+        return (*_X4_dstM12__anonymous4_2);
     }
     {
Index: tests/.expect/attributes.oast.x64.txt
===================================================================
--- tests/.expect/attributes.oast.x64.txt	(revision fb63c7000e1bf4b0f15e255f7a6699deefbb4a02)
+++ tests/.expect/attributes.oast.x64.txt	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
@@ -1339,9 +1339,5 @@
         }
 
-        {
-            ((void)(_X4_retM12__anonymous4_2=(*_X4_dstM12__anonymous4_2)) /* ?{} */);
-        }
-
-        return _X4_retM12__anonymous4_2;
+        return (*_X4_dstM12__anonymous4_2);
     }
     {
Index: tests/.expect/attributes.oast.x86.txt
===================================================================
--- tests/.expect/attributes.oast.x86.txt	(revision fb63c7000e1bf4b0f15e255f7a6699deefbb4a02)
+++ tests/.expect/attributes.oast.x86.txt	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
@@ -1339,8 +1339,4 @@
         }
 
-        {
-            ((void)(_X4_retM12__anonymous4_2=(*_X4_dstM12__anonymous4_2)) /* ?{} */);
-        }
-
         return _X4_retM12__anonymous4_2;
     }
Index: tests/.expect/nested_function.txt
===================================================================
--- tests/.expect/nested_function.txt	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
+++ tests/.expect/nested_function.txt	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
@@ -0,0 +1,1 @@
+total 105
Index: tests/.expect/quasiKeyword.txt
===================================================================
--- tests/.expect/quasiKeyword.txt	(revision fb63c7000e1bf4b0f15e255f7a6699deefbb4a02)
+++ tests/.expect/quasiKeyword.txt	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
@@ -1,1 +1,1 @@
-quasiKeyword.cfa:54:25: warning: Compiled
+quasiKeyword.cfa:52:25: warning: Compiled
Index: tests/concurrent/examples/multiSort.cfa
===================================================================
--- tests/concurrent/examples/multiSort.cfa	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
+++ tests/concurrent/examples/multiSort.cfa	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
@@ -0,0 +1,121 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2022 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// multiSort.c -- compute sort single array multiple times
+//			make sure sorting works, thread don't screw up
+//			and trampolines work on thread stacks
+//
+// Author           : Peter A. Buhr
+// Created On       : Tue 05 24 11:34:23 2022
+// Last Modified By :
+// Last Modified On :
+// Update Count     :
+//
+
+#include <barrier.hfa>
+#include <fstream.hfa>
+#include <math.trait.hfa>
+#include <stdlib.hfa>
+#include <thread.hfa>
+
+forall(T) {
+	struct MyVec2 {
+		T val1;
+		T val2;
+	};
+
+	forall(| Equality( T ))
+	int ?!=?( MyVec2(T) lhs, MyVec2(T) rhs ) { return lhs.val1 != rhs.val1 || lhs.val2 != rhs.val2; }
+
+	forall(| Relational(T)) {
+		static inline int ?<?( MyVec2(T) lhs, MyVec2(T) rhs ) {
+			if(lhs.val1 < rhs.val1) return true;
+			if(lhs.val1 > rhs.val1) return false;
+			if(lhs.val2 < rhs.val2) return true;
+			if(lhs.val2 > rhs.val2) return false;
+			return false;
+		}
+	}
+
+	forall(| { T random( void ); })
+	MyVec2(T) random( void ) {
+		MyVec2(T) r;
+		r.val1 = random();
+		r.val2 = random();
+		return r;
+	}
+}
+
+
+
+const unsigned nthreads = 7;
+const unsigned nvecs = 313;
+barrier bar = { nthreads + 1 };
+const MyVec2(long int) * original;
+
+thread Sorter {
+	MyVec2(long int) * copy;
+};
+
+void ^?{}( Sorter & mutex this ) {
+	free(this.copy);
+}
+
+// Make this a polymorphic call to prevent thunks from being hosted
+forall( T | Relational(T) | sized(MyVec2(T)) )
+void block_sort( MyVec2(T) * vals, size_t dim ) __attribute__((noinline)) {
+	MyVec2(T) dummy = vals[0];
+	block( bar );
+
+	qsort(vals, dim);
+}
+
+
+void main( Sorter & this ) {
+	this.copy = aalloc(nvecs);
+	for(i; nvecs) {
+		this.copy[i] = original[i];
+	}
+
+	block_sort(this.copy, nvecs);
+}
+
+int main() {
+	sout | "Generating";
+	MyVec2(long int) * local = aalloc( nvecs );
+	for(i; nvecs) {
+		local[i] = random();
+	}
+
+	original = local;
+
+	sout | "Launching";
+
+	processor p; {
+		Sorter sorters[nthreads];
+
+		block( bar );
+
+		sout | "Sorting";
+
+		qsort(local, nvecs);
+
+		sout | "Checking";
+
+		for(i; nthreads) {
+			const MyVec2(long int) * copy = join( sorters[i] ).copy;
+			for(j; nvecs) {
+				if(copy[j] != original[j]) {
+					sout | "Error at thread" | i | ", index" | j | ": data doesn't match!";
+				}
+			}
+		}
+	}
+
+	free(local);
+
+	sout | "Done";
+}
Index: tests/enum_tests/.expect/structEnum.txt
===================================================================
--- tests/enum_tests/.expect/structEnum.txt	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
+++ tests/enum_tests/.expect/structEnum.txt	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
@@ -0,0 +1,1 @@
+100 c
Index: tests/enum_tests/structEnum.cfa
===================================================================
--- tests/enum_tests/structEnum.cfa	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
+++ tests/enum_tests/structEnum.cfa	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
@@ -0,0 +1,33 @@
+#include <stdio.h>
+
+struct Point {
+    int x;
+    char y;
+};
+
+enum(Point) PointEnum {
+    first={
+        100,
+        'c'
+    },
+    second={
+        200,
+        'a'
+    }
+};
+
+// The only valid usage
+struct Point apple = first;
+// Failed due to Qualified name is currently unimplemented.
+// struct Point banana = PointEnum.first;
+
+int main() {
+    printf("%d %c\n", apple.x, apple.y);
+    // Failed; enumInstType is now not a real type and not instantiated. 
+    // Not sure if we want that
+    // printf("%d %c\n", second.x, second.y);
+    return 0;
+}
+
+
+
Index: tests/exceptions/defaults.cfa
===================================================================
--- tests/exceptions/defaults.cfa	(revision fb63c7000e1bf4b0f15e255f7a6699deefbb4a02)
+++ tests/exceptions/defaults.cfa	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
@@ -2,5 +2,4 @@
 
 #include <string.h>
-#include <exception.hfa>
 
 exception log_message {
@@ -8,9 +7,20 @@
 };
 
-_EHM_DEFINE_COPY(log_message, )
+// Manually define the virtual table and helper functions.
+void copy(log_message * this, log_message * that) {
+	*this = *that;
+}
+
 const char * msg(log_message * this) {
 	return this->msg;
 }
-_EHM_VIRTUAL_TABLE(log_message, , log_vt);
+
+const struct log_message_vtable log_vt @= {
+	.__cfavir_typeid : &__cfatid_log_message,
+	.size : sizeof(struct log_message),
+	.copy : copy,
+	.^?{} : ^?{},
+	.msg : msg,
+};
 
 // Logging messages don't have to be handled.
Index: tests/include/.expect/includes.nast.txt
===================================================================
--- tests/include/.expect/includes.nast.txt	(revision fb63c7000e1bf4b0f15e255f7a6699deefbb4a02)
+++ tests/include/.expect/includes.nast.txt	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
@@ -1,1 +1,1 @@
-include/includes.cfa:169:25: warning: Compiled
+include/includes.cfa:173:25: warning: Compiled
Index: tests/include/includes.cfa
===================================================================
--- tests/include/includes.cfa	(revision fb63c7000e1bf4b0f15e255f7a6699deefbb4a02)
+++ tests/include/includes.cfa	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue May 10 16:36:44 2022
-// Update Count     : 776
+// Last Modified On : Sun May 22 08:27:20 2022
+// Update Count     : 779
 //
 
@@ -47,6 +47,8 @@
 #endif
 #include <execinfo.h>
-#include <expat.h>
+#if __has_include( "expat.h" )
+#include <expat.h>										// may not be installed
 #include <expat_external.h>
+#endif
 #include <fcntl.h>
 #include <features.h>
@@ -79,5 +81,7 @@
 //#include <link.h>										// CFA bug #240 nested anonymous enum fails
 #include <locale.h>
-#include <ltdl.h>
+#if __has_include( "ltdl.h" )
+#include <ltdl.h>										// may not be installed
+#endif
 //#include <malloc.h>									// cannot include in extern "C" because of CFA #include_next
 #include <math.h>
Index: tests/linking/exception-nothreads.cfa
===================================================================
--- tests/linking/exception-nothreads.cfa	(revision fb63c7000e1bf4b0f15e255f7a6699deefbb4a02)
+++ tests/linking/exception-nothreads.cfa	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
@@ -15,8 +15,7 @@
 
 #include <stdlib.hfa>
-#include <exception.hfa>
 
-EHM_EXCEPTION(ping)();
-EHM_VIRTUAL_TABLE(ping, ping_vt);
+exception ping {};
+vtable(ping) ping_vt;
 
 int main(void) {
Index: tests/linking/exception-withthreads.cfa
===================================================================
--- tests/linking/exception-withthreads.cfa	(revision fb63c7000e1bf4b0f15e255f7a6699deefbb4a02)
+++ tests/linking/exception-withthreads.cfa	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
@@ -15,9 +15,8 @@
 
 #include <stdlib.hfa>
-#include <exception.hfa>
 #include "../exceptions/with-threads.hfa"
 
-EHM_EXCEPTION(ping)();
-EHM_VIRTUAL_TABLE(ping, ping_vt);
+exception ping {};
+vtable(ping) ping_vt;
 
 int main(void) {
Index: tests/nested_function.cfa
===================================================================
--- tests/nested_function.cfa	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
+++ tests/nested_function.cfa	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
@@ -0,0 +1,38 @@
+#include <thread.hfa>
+#include <fstream.hfa>
+#include <stdlib.hfa>
+
+enum { VALUES = 10_000 };
+int values[VALUES], total = 0;
+
+thread T { int id; };
+
+void main( T & ) {
+	int sum = 0;
+	void f() {
+		int i = 0;
+		void h( void ) {								// nest routine
+			int j = i;									// non-local reference
+			void g( void ) {							// nest routine
+				i += 1;									// non-local reference
+				j += 1;									// non-local reference
+				if ( i < 3 ) h();
+			} // g
+			if ( prng( 6 ) == 0 ) g();					// prevent compiler inlining
+			else h();
+			i += 1;
+			sum += bsearchl( j, values, VALUES );		// has internal nested compare routine
+		} // h
+		h();
+	} // f
+	f();
+	__atomic_fetch_add( &total, sum, __ATOMIC_SEQ_CST );
+}
+int main() {
+	set_seed( 1003 );
+	for ( i; VALUES ) values[i] = i;
+	{
+		T t[5];
+	}
+	sout | "total" | total;
+}
Index: tests/pybin/settings.py
===================================================================
--- tests/pybin/settings.py	(revision fb63c7000e1bf4b0f15e255f7a6699deefbb4a02)
+++ tests/pybin/settings.py	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
@@ -201,2 +201,4 @@
 	global output_width
 	output_width = max(map(lambda t: len(t.target()), tests))
+	# 35 is the maximum width of the name field before we get line wrapping.
+	output_width = min(output_width, 35)
Index: tests/pybin/test_run.py
===================================================================
--- tests/pybin/test_run.py	(revision fb63c7000e1bf4b0f15e255f7a6699deefbb4a02)
+++ tests/pybin/test_run.py	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
@@ -43,4 +43,14 @@
 		return os.path.normpath( os.path.join(settings.BUILDDIR, self.path, self.name) )
 
+	def format_target(self, width):
+		target = self.target()
+		length = len(target)
+		if length < width:
+			return '{0:{width}}'.format(target, width=width)
+		elif length == width:
+			return target
+		else:
+			return '...' + target[3-width:]
+
 	@staticmethod
 	def valid_name(name):
Index: tests/quasiKeyword.cfa
===================================================================
--- tests/quasiKeyword.cfa	(revision fb63c7000e1bf4b0f15e255f7a6699deefbb4a02)
+++ tests/quasiKeyword.cfa	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
@@ -4,5 +4,5 @@
 // quasiKeyword.cfa -- test that quasi-keywords can be used for variable and functions names, as well as keywords in
 //					   control structures.
-// 
+//
 // Author           : Peter A. Buhr
 // Created On       : Wed Feb 17 10:33:49 2021
@@ -10,9 +10,7 @@
 // Last Modified On : Sat Jun  5 10:07:59 2021
 // Update Count     : 8
-// 
+//
 
-#include <exception.hfa>
-
-EHM_EXCEPTION( E )();
+exception E {};
 
 void catch( int i ) {}
@@ -49,5 +47,5 @@
 		} fixup ( E * ) {
 		} finally {
-		} 
+		}
 	else catch = 3;
 
Index: tests/test.py
===================================================================
--- tests/test.py	(revision fb63c7000e1bf4b0f15e255f7a6699deefbb4a02)
+++ tests/test.py	(revision e5d92746a45efa56d2837baffcca4e904b5555a3)
@@ -132,5 +132,5 @@
 	parser.add_argument('--install', help='Run all tests based on installed binaries or tree binaries', type=comma_separated(yes_no), default='no')
 	parser.add_argument('--continue', help='When multiple specifications are passed (debug/install/arch), sets whether or not to continue if the last specification failed', type=yes_no, default='yes', dest='continue_')
-	parser.add_argument('--timeout', help='Maximum duration in seconds after a single test is considered to have timed out', type=int, default=120)
+	parser.add_argument('--timeout', help='Maximum duration in seconds after a single test is considered to have timed out', type=int, default=180)
 	parser.add_argument('--global-timeout', help='Maximum cumulative duration in seconds after the ALL tests are considered to have timed out', type=int, default=7200)
 	parser.add_argument('--timeout-with-gdb', help='Instead of killing the command when it times out, orphan it and print process id to allow gdb to attach', type=yes_no, default="no")
@@ -252,5 +252,5 @@
 	try :
 		# print formated name
-		name_txt = '{0:{width}}  '.format(t.target(), width=settings.output_width)
+		name_txt = t.format_target(width=settings.output_width) + '  '
 
 		retcode, error, duration = run_single_test(t)
