Index: libcfa/src/bits/random.hfa
===================================================================
--- libcfa/src/bits/random.hfa	(revision 0348fd8041753ad3a2b4b4442a5b639a0aa201d4)
+++ libcfa/src/bits/random.hfa	(revision d99a7168a496bfc355c644d298212bbfcfd3ef37)
@@ -10,11 +10,11 @@
 // Created On       : Fri Jan 14 07:18:11 2022
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Dec 11 18:43:58 2022
-// Update Count     : 171
+// Last Modified On : Thu Dec 22 20:54:22 2022
+// Update Count     : 178
 // 
 
 #pragma once
 
-#include <stdint.h>
+#include <stdint.h>										// uintXX_t
 
 #define GLUE2( x, y ) x##y
@@ -24,18 +24,20 @@
 #ifdef __x86_64__										// 64-bit architecture
 	// 64-bit generators
-	#define LEHMER64
+	//#define LEHMER64
 	//#define XORSHIFT_12_25_27
-	//#define XOSHIRO256PP
+	#define XOSHIRO256PP
 	//#define KISS_64
 
 	// 32-bit generators
-	#define XORSHIFT_6_21_7
-	//#define XOSHIRO128PP
+	//#define XORSHIFT_6_21_7
+	#define XOSHIRO128PP
 #else													// 32-bit architecture
 	// 64-bit generators
-	#define XORSHIFT_13_7_17
+	//#define XORSHIFT_13_7_17
+	#define XOSHIRO256PP
 
 	// 32-bit generators
-	#define XORSHIFT_6_21_7
+	//#define XORSHIFT_6_21_7
+	#define XOSHIRO128PP
 #endif // __x86_64__
 
@@ -47,5 +49,5 @@
 #define PRNG_NAME_64 xoshiro256pp
 #define PRNG_STATE_64_T GLUE(PRNG_NAME_64,_t)
-typedef struct PRNG_STATE_64_T { uint64_t s[4]; } PRNG_STATE_64_T;
+typedef struct PRNG_STATE_64_T { uint64_t s0, s1, s2, s3; } PRNG_STATE_64_T;
 #endif // XOSHIRO256PP
 
@@ -53,5 +55,5 @@
 #define PRNG_NAME_32 xoshiro128pp
 #define PRNG_STATE_32_T GLUE(PRNG_NAME_32,_t)
-typedef struct PRNG_STATE_32_T { uint32_t s[4]; } PRNG_STATE_32_T;
+typedef struct PRNG_STATE_32_T { uint32_t s0, s1, s2, s3; } PRNG_STATE_32_T;
 #endif // XOSHIRO128PP
 
@@ -110,6 +112,8 @@
 
 // ALL PRNG ALGORITHMS ARE OPTIMIZED SO THAT THE PRNG LOGIC CAN HAPPEN IN PARALLEL WITH THE USE OF THE RESULT.
-// Therefore, the set_seed routine primes the PRNG by calling it with the state so the seed is not return as the
-// first random value.
+// Specifically, the current random state is copied for returning, before computing the next value.  As a consequence,
+// the set_seed routine primes the PRNG by calling it with the state so the seed is not return as the first random
+// value.
+
 
 #ifdef __cforall										// don't include in C code (invoke.h)
@@ -126,26 +130,26 @@
 
 #ifndef XOSHIRO256PP
-typedef struct xoshiro256pp_t { uint64_t s[4]; } xoshiro256pp_t;
+typedef struct xoshiro256pp_t { uint64_t s0, s1, s2, s3; } xoshiro256pp_t;
 #endif // ! XOSHIRO256PP
 
 static inline uint64_t xoshiro256pp( xoshiro256pp_t & rs ) with(rs) {
-	inline uint64_t rotl(const uint64_t x, int k) {
+	inline uint64_t rotl( const uint64_t x, int k ) {
 		return (x << k) | (x >> (64 - k));
 	} // rotl
 
-	const uint64_t result = rotl( s[0] + s[3], 23 ) + s[0];
-	const uint64_t t = s[1] << 17;
-
-	s[2] ^= s[0];
-	s[3] ^= s[1];
-	s[1] ^= s[2];
-	s[0] ^= s[3];
-	s[2] ^= t;
-	s[3] = rotl( s[3], 45 );
+	const uint64_t result = rotl( s0 + s3, 23 ) + s0;
+	const uint64_t t = s1 << 17;
+
+	s2 ^= s0;
+	s3 ^= s1;
+	s1 ^= s2;
+	s0 ^= s3;
+	s2 ^= t;
+	s3 = rotl( s3, 45 );
 	return result;
 } // xoshiro256pp
 
-static inline void xoshiro256pp_set_seed( xoshiro256pp_t & state,  uint64_t seed ) {
-	state = (xoshiro256pp_t){ {seed, seed, seed, seed} };
+static inline void xoshiro256pp_set_seed( xoshiro256pp_t & state, uint64_t seed ) {
+	state = (xoshiro256pp_t){ seed, seed, seed, seed };
 	xoshiro256pp( state );
 } // xoshiro256pp_set_seed
@@ -161,5 +165,5 @@
 
 #ifndef XOSHIRO128PP
-typedef struct xoshiro128pp_t { uint32_t s[4]; } xoshiro128pp_t;
+typedef struct xoshiro128pp_t { uint32_t s0, s1, s2, s3; } xoshiro128pp_t;
 #endif // ! XOSHIRO128PP
 
@@ -169,34 +173,33 @@
 	} // rotl
 
-	const uint32_t result = rotl( s[0] + s[3], 7 ) + s[0];
-	const uint32_t t = s[1] << 9;
-
-	s[2] ^= s[0];
-	s[3] ^= s[1];
-	s[1] ^= s[2];
-	s[0] ^= s[3];
-	s[2] ^= t;
-	s[3] = rotl( s[3], 11 );
+	const uint32_t result = rotl( s0 + s3, 7 ) + s0;
+	const uint32_t t = s1 << 9;
+
+	s2 ^= s0;
+	s3 ^= s1;
+	s1 ^= s2;
+	s0 ^= s3;
+	s2 ^= t;
+	s3 = rotl( s3, 11 );
 	return result;
 } // xoshiro128pp
 
 static inline void xoshiro128pp_set_seed( xoshiro128pp_t & state, uint32_t seed ) {
-	state = (xoshiro128pp_t){ {seed, seed, seed, seed} };
+	state = (xoshiro128pp_t){ seed, seed, seed, seed };
 	xoshiro128pp( state );								// prime
 } // xoshiro128pp_set_seed
 
 #ifdef __SIZEOF_INT128__
-	// Pipelined to allow out-of-order overlap with reduced dependencies. Critically, the current random state is
-	// returned (copied), and then compute and store the next random value.
 	//--------------------------------------------------
 	static inline uint64_t lehmer64( __uint128_t & state ) {
 		__uint128_t ret = state;
-		state *= 0xda942042e4dd58b5;
+		state *= 0x_da94_2042_e4dd_58b5;
 		return ret >> 64;
 	} // lehmer64
 
 	static inline void lehmer64_set_seed( __uint128_t & state, uint64_t seed ) {
+		// The seed needs to be coprime with the 2^64 modulus to get the largest period, so no factors of 2 in the seed.
 		state = seed;
-		lehmer64( state );
+		lehmer64( state );								// prime
 	} // lehmer64_set_seed
 
@@ -272,10 +275,10 @@
 #endif // ! KISS_64
 
-static inline uint64_t kiss_64( kiss_64_t & state ) with(state) {
-	kiss_64_t ret = state;
+static inline uint64_t kiss_64( kiss_64_t & rs ) with(rs) {
+	kiss_64_t ret = rs;
 	z = 36969 * (z & 65535) + (z >> 16);
 	w = 18000 * (w & 65535) + (w >> 16);
-	jsr ^= (jsr << 17);
 	jsr ^= (jsr << 13);
+	jsr ^= (jsr >> 17);
 	jsr ^= (jsr << 5);
 	jcong = 69069 * jcong + 1234567;
@@ -283,7 +286,7 @@
 } // kiss_64
 
-static inline void kiss_64_set_seed( kiss_64_t & state, uint64_t seed ) with(state) {
+static inline void kiss_64_set_seed( kiss_64_t & rs, uint64_t seed ) with(rs) {
 	z = 1; w = 1; jsr = 4; jcong = seed;
-	kiss_64( state );									// prime
+	kiss_64( rs );										// prime
 } // kiss_64_set_seed
 
@@ -294,5 +297,5 @@
 #endif // ! XORWOW
 
-static inline uint32_t xorwow( xorwow_t & state ) with(state) {
+static inline uint32_t xorwow( xorwow_t & rs ) with(rs) {
 	// Algorithm "xorwow" from p. 5 of Marsaglia, "Xorshift RNGs".
 	uint32_t ret = a + counter;
@@ -312,7 +315,7 @@
 } // xorwow
 
-static inline void xorwow_set_seed( xorwow_t & state, uint32_t seed ) {
-	state = (xorwow_t){ seed, seed, seed, seed, 0 };
-	xorwow( state );									// prime
+static inline void xorwow_set_seed( xorwow_t & rs, uint32_t seed ) {
+	rs = (xorwow_t){ seed, seed, seed, seed, 0 };
+	xorwow( rs );										// prime
 } // xorwow_set_seed
 
@@ -326,12 +329,12 @@
 
 // Bi-directional LCG random-number generator
-static inline uint32_t LCGBI_fwd( uint64_t & state ) {
-	state = (A * state + C) & (M - 1);
-	return state >> D;
+static inline uint32_t LCGBI_fwd( uint64_t & rs ) {
+	rs = (A * rs + C) & (M - 1);
+	return rs >> D;
 } // LCGBI_fwd
 
-static inline uint32_t LCGBI_bck( uint64_t & state ) {
-	unsigned int r = state >> D;
-	state = AI * (state - C) & (M - 1);
+static inline uint32_t LCGBI_bck( uint64_t & rs ) {
+	unsigned int r = rs >> D;
+	rs = AI * (rs - C) & (M - 1);
 	return r;
 } // LCGBI_bck
Index: libcfa/src/heap.cfa
===================================================================
--- libcfa/src/heap.cfa	(revision 0348fd8041753ad3a2b4b4442a5b639a0aa201d4)
+++ libcfa/src/heap.cfa	(revision d99a7168a496bfc355c644d298212bbfcfd3ef37)
@@ -10,6 +10,6 @@
 // Created On       : Tue Dec 19 21:58:35 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Oct 30 20:56:20 2022
-// Update Count     : 1584
+// Last Modified On : Wed Dec 28 12:37:38 2022
+// Update Count     : 1597
 //
 
@@ -17,8 +17,6 @@
 #include <string.h>										// memset, memcpy
 #include <limits.h>										// ULONG_MAX
-#include <stdlib.h>										// EXIT_FAILURE
 #include <errno.h>										// errno, ENOMEM, EINVAL
-#include <unistd.h>										// STDERR_FILENO, sbrk, sysconf
-#include <malloc.h>										// memalign, malloc_usable_size
+#include <unistd.h>										// STDERR_FILENO, sbrk, sysconf, write
 #include <sys/mman.h>									// mmap, munmap
 extern "C" {
@@ -26,4 +24,5 @@
 } // extern "C"
 
+#include "heap.hfa"
 #include "bits/align.hfa"								// libAlign
 #include "bits/defs.hfa"								// likely, unlikely
@@ -140,5 +139,5 @@
 #endif
 
-typedef volatile uintptr_t SpinLock_t CALIGN;			// aligned addressable word-size
+typedef volatile uintptr_t SpinLock_t;
 
 static inline __attribute__((always_inline)) void lock( volatile SpinLock_t & slock ) {
@@ -147,5 +146,5 @@
 
 	for ( unsigned int i = 1;; i += 1 ) {
-	  if ( slock == 0 && __atomic_test_and_set( &slock, __ATOMIC_SEQ_CST ) == 0 ) break; // Fence
+	  if ( slock == 0 && __atomic_test_and_set( &slock, __ATOMIC_ACQUIRE ) == 0 ) break; // Fence
 		for ( volatile unsigned int s = 0; s < spin; s += 1 ) Pause(); // exponential spin
 		spin += spin;									// powers of 2
@@ -156,5 +155,5 @@
 
 static inline __attribute__((always_inline)) void unlock( volatile SpinLock_t & slock ) {
-	__atomic_clear( &slock, __ATOMIC_SEQ_CST );			// Fence
+	__atomic_clear( &slock, __ATOMIC_RELEASE );			// Fence
 } // spin_unlock
 
@@ -261,6 +260,6 @@
 	static_assert( libAlign() >= sizeof( Storage ), "minimum alignment < sizeof( Storage )" );
 
-	struct __attribute__(( aligned (8) )) FreeHeader {
-		size_t blockSize __attribute__(( aligned(8) )); // size of allocations on this list
+	struct CALIGN FreeHeader {
+		size_t blockSize CALIGN;						// size of allocations on this list
 		#ifdef OWNERSHIP
 		#ifdef RETURNSPIN
@@ -284,5 +283,5 @@
 
 	#ifdef __CFA_DEBUG__
-	int64_t allocUnfreed;								// running total of allocations minus frees; can be negative
+	ptrdiff_t allocUnfreed;								// running total of allocations minus frees; can be negative
 	#endif // __CFA_DEBUG__
 
@@ -369,5 +368,5 @@
 // Thread-local storage is allocated lazily when the storage is accessed.
 static __thread size_t PAD1 CALIGN TLSMODEL __attribute__(( unused )); // protect false sharing
-static __thread Heap * volatile heapManager CALIGN TLSMODEL;
+static __thread Heap * heapManager CALIGN TLSMODEL;
 static __thread size_t PAD2 CALIGN TLSMODEL __attribute__(( unused )); // protect further false sharing
 
@@ -443,5 +442,5 @@
 		// 12K ~= 120K byte superblock.  Where 128-heap superblock handles a medium sized multi-processor server.
 		size_t remaining = heapManagersStorageEnd - heapManagersStorage; // remaining free heaps in superblock
-		if ( ! heapManagersStorage || remaining != 0 ) {
+		if ( ! heapManagersStorage || remaining == 0 ) {
 			// Each block of heaps is a multiple of the number of cores on the computer.
 			int HeapDim = get_nprocs();					// get_nprocs_conf does not work
@@ -562,5 +561,5 @@
 		// allocUnfreed is set to 0 when a heap is created and it accumulates any unfreed storage during its multiple thread
 		// usages.  At the end, add up each heap allocUnfreed value across all heaps to get the total unfreed storage.
-		int64_t allocUnfreed = 0;
+		ptrdiff_t allocUnfreed = 0;
 		for ( Heap * heap = heapMaster.heapManagersList; heap; heap = heap->nextHeapManager ) {
 			allocUnfreed += heap->allocUnfreed;
@@ -572,5 +571,5 @@
 			char helpText[512];
 			__cfaabi_bits_print_buffer( STDERR_FILENO, helpText, sizeof(helpText),
-										"CFA warning (UNIX pid:%ld) : program terminating with %ju(0x%jx) bytes of storage allocated but not freed.\n"
+										"CFA warning (UNIX pid:%ld) : program terminating with %td(%#tx) bytes of storage allocated but not freed.\n"
 										"Possible cause is unfreed storage allocated by the program or system/library routines called from the program.\n",
 										(long int)getpid(), allocUnfreed, allocUnfreed ); // always print the UNIX pid
@@ -950,5 +949,5 @@
 		block = freeHead->freeList;						// remove node from stack
 		if ( unlikely( block == 0p ) ) {				// no free block ?
-			// Freelist for this size is empty, so check return list (OWNERSHIP), carve it out of the heap, if there
+			// Freelist for this size is empty, so check return list (OWNERSHIP), or carve it out of the heap if there
 			// is enough left, or get some more heap storage and carve it off.
 			#ifdef OWNERSHIP
@@ -1115,4 +1114,10 @@
 			while ( ! __atomic_compare_exchange_n( &freeHead->returnList, &header->kind.real.next, (Heap.Storage *)header,
 												   false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST ) );
+
+			#ifdef __STATISTICS__
+			stats.return_pushes += 1;
+			stats.return_storage_request += rsize;
+			stats.return_storage_alloc += size;
+			#endif // __STATISTICS__
 			#endif // RETURNSPIN
 		} // if
@@ -1125,10 +1130,4 @@
 		freeHead->freeList = (Heap.Storage *)header;
 		#endif // ! OWNERSHIP
-
-		#ifdef __U_STATISTICS__
-		stats.return_pushes += 1;
-		stats.return_storage_request += rsize;
-		stats.return_storage_alloc += size;
-		#endif // __U_STATISTICS__
 
 		// OK TO BE PREEMPTED HERE AS heapManager IS NO LONGER ACCESSED.
@@ -1180,9 +1179,9 @@
 
 #ifdef __STATISTICS__
-static void incCalls( intptr_t statName ) libcfa_nopreempt {
+static void incCalls( size_t statName ) libcfa_nopreempt {
 	heapManager->stats.counters[statName].calls += 1;
 } // incCalls
 
-static void incZeroCalls( intptr_t statName ) libcfa_nopreempt {
+static void incZeroCalls( size_t statName ) libcfa_nopreempt {
 	heapManager->stats.counters[statName].calls_0 += 1;
 } // incZeroCalls
@@ -1456,6 +1455,4 @@
 	// 0p, no operation is performed.
 	void free( void * addr ) libcfa_public {
-//		verify( heapManager );
-
 	  if ( unlikely( addr == 0p ) ) {					// special case
 			#ifdef __STATISTICS__
Index: src/AST/Pass.hpp
===================================================================
--- src/AST/Pass.hpp	(revision 0348fd8041753ad3a2b4b4442a5b639a0aa201d4)
+++ src/AST/Pass.hpp	(revision d99a7168a496bfc355c644d298212bbfcfd3ef37)
@@ -86,6 +86,6 @@
 	{
 		// After the pass is constructed, check if it wants the have a pointer to the wrapping visitor
-		type * const * visitor = __pass::visitor(core, 0);
-		if(visitor) {
+		type * const * visitor = __pass::visitor( core, 0 );
+		if ( visitor ) {
 			*const_cast<type **>( visitor ) = this;
 		}
@@ -98,6 +98,6 @@
 
 	/// If the core defines a result, call it if possible, otherwise return it.
-	inline auto get_result() -> decltype( __pass::get_result( core, '0' ) ) {
-		return __pass::get_result( core, '0' );
+	inline auto get_result() -> decltype( __pass::result::get( core, '0' ) ) {
+		return __pass::result::get( core, '0' );
 	}
 
Index: src/AST/Pass.proto.hpp
===================================================================
--- src/AST/Pass.proto.hpp	(revision 0348fd8041753ad3a2b4b4442a5b639a0aa201d4)
+++ src/AST/Pass.proto.hpp	(revision d99a7168a496bfc355c644d298212bbfcfd3ef37)
@@ -489,5 +489,4 @@
 		template<typename core_t>
 		static inline auto replace( core_t &, long, const ast::TypeInstType *& ) {}
-
 	} // namespace forall
 
@@ -506,16 +505,19 @@
 	}
 
-	template<typename core_t>
-	static inline auto get_result( core_t & core, char ) -> decltype( core.result() ) {
-		return core.result();
-	}
-
-	template<typename core_t>
-	static inline auto get_result( core_t & core, int ) -> decltype( core.result ) {
-		return core.result;
-	}
-
-	template<typename core_t>
-	static inline void get_result( core_t &, long ) {}
+	// For passes, usually utility passes, that have a result.
+	namespace result {
+		template<typename core_t>
+		static inline auto get( core_t & core, char ) -> decltype( core.result() ) {
+			return core.result();
+		}
+
+		template<typename core_t>
+		static inline auto get( core_t & core, int ) -> decltype( core.result ) {
+			return core.result;
+		}
+
+		template<typename core_t>
+		static inline void get( core_t &, long ) {}
+	}
 } // namespace __pass
 } // namespace ast
Index: src/CompilationState.cc
===================================================================
--- src/CompilationState.cc	(revision 0348fd8041753ad3a2b4b4442a5b639a0aa201d4)
+++ src/CompilationState.cc	(revision d99a7168a496bfc355c644d298212bbfcfd3ef37)
@@ -33,5 +33,4 @@
 	useNewAST = true,
 	nomainp = false,
-	parsep = false,
 	resolvep = false,
 	resolvprotop = false,
Index: src/CompilationState.h
===================================================================
--- src/CompilationState.h	(revision 0348fd8041753ad3a2b4b4442a5b639a0aa201d4)
+++ src/CompilationState.h	(revision d99a7168a496bfc355c644d298212bbfcfd3ef37)
@@ -32,5 +32,4 @@
 	useNewAST,
 	nomainp,
-	parsep,
 	resolvep,
 	resolvprotop,
Index: src/GenPoly/Box.cc
===================================================================
--- src/GenPoly/Box.cc	(revision 0348fd8041753ad3a2b4b4442a5b639a0aa201d4)
+++ src/GenPoly/Box.cc	(revision d99a7168a496bfc355c644d298212bbfcfd3ef37)
@@ -424,6 +424,4 @@
 	namespace {
 		std::string makePolyMonoSuffix( FunctionType const * function, const TyVarMap &tyVars ) {
-			std::stringstream name;
-
 			// NOTE: this function previously used isPolyObj, which failed to produce
 			// the correct thing in some situations. It's not clear to me why this wasn't working.
@@ -432,19 +430,12 @@
 			// to take those polymorphic types as pointers. Therefore, there can be two different functions
 			// with the same mangled name, so we need to further mangle the names.
+			std::stringstream name;
 			for ( DeclarationWithType const * const ret : function->returnVals ) {
-				if ( isPolyType( ret->get_type(), tyVars ) ) {
-					name << "P";
-				} else {
-					name << "M";
-				}
-			}
-			name << "_";
+				name << ( isPolyType( ret->get_type(), tyVars ) ? 'P' : 'M' );
+			}
+			name << '_';
 			for ( DeclarationWithType const * const arg : function->parameters ) {
-				if ( isPolyType( arg->get_type(), tyVars ) ) {
-					name << "P";
-				} else {
-					name << "M";
-				}
-			} // for
+				name << ( isPolyType( arg->get_type(), tyVars ) ? 'P' : 'M' );
+			}
 			return name.str();
 		}
@@ -565,5 +556,5 @@
 			// even when converted to strings, sort in the original order.
 			// (At least, that is the best explination I have.)
-			for ( std::pair<std::string, TypeDecl::Data> const & tyParam : exprTyVars ) {
+			for ( std::pair<const std::string, TypeDecl::Data> const & tyParam : exprTyVars ) {
 				if ( !tyParam.second.isComplete ) continue;
 				Type *concrete = env->lookup( tyParam.first );
Index: src/GenPoly/ScrubTyVars.cc
===================================================================
--- src/GenPoly/ScrubTyVars.cc	(revision 0348fd8041753ad3a2b4b4442a5b639a0aa201d4)
+++ src/GenPoly/ScrubTyVars.cc	(revision d99a7168a496bfc355c644d298212bbfcfd3ef37)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Fri Oct  7 15:42:00 2022
-// Update Count     : 5
+// Last Modified On : Wed Dec  7 17:01:00 2022
+// Update Count     : 6
 //
 
@@ -117,10 +117,4 @@
 namespace {
 
-enum class ScrubMode {
-	FromMap,
-	DynamicFromMap,
-	All,
-};
-
 struct ScrubTypeVars :
 	public ast::WithGuards,
@@ -253,7 +247,8 @@
 }
 
+} // namespace
+
 const ast::Node * scrubTypeVarsBase(
-		const ast::Node * target,
-		ScrubMode mode, const TypeVarMap * typeVars ) {
+		const ast::Node * node, const TypeVarMap * typeVars, ScrubMode mode ) {
 	if ( ScrubMode::All == mode ) {
 		assert( nullptr == typeVars );
@@ -262,24 +257,5 @@
 	}
 	ast::Pass<ScrubTypeVars> visitor( mode, typeVars );
-	return target->accept( visitor );
-}
-
-} // namespace
-
-template<>
-ast::Node const * scrubTypeVars<ast::Node>(
-        const ast::Node * target, const TypeVarMap & typeVars ) {
-	return scrubTypeVarsBase( target, ScrubMode::FromMap, &typeVars );
-}
-
-template<>
-ast::Node const * scrubTypeVarsDynamic<ast::Node>(
-        ast::Node const * target, const TypeVarMap & typeVars ) {
-	return scrubTypeVarsBase( target, ScrubMode::DynamicFromMap, &typeVars );
-}
-
-template<>
-ast::Node const * scrubAllTypeVars<ast::Node>( const ast::Node * target ) {
-	return scrubTypeVarsBase( target, ScrubMode::All, nullptr );
+	return node->accept( visitor );
 }
 
Index: src/GenPoly/ScrubTyVars.h
===================================================================
--- src/GenPoly/ScrubTyVars.h	(revision 0348fd8041753ad3a2b4b4442a5b639a0aa201d4)
+++ src/GenPoly/ScrubTyVars.h	(revision d99a7168a496bfc355c644d298212bbfcfd3ef37)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Fri Oct  7 15:51:00 2022
-// Update Count     : 4
+// Last Modified On : Wed Dec  7 16:57:00 2022
+// Update Count     : 5
 //
 
@@ -109,4 +109,11 @@
 	}
 
+// ScrubMode and scrubTypeVarsBase are internal.
+enum class ScrubMode { FromMap, DynamicFromMap, All };
+
+const ast::Node * scrubTypeVarsBase(
+	const ast::Node * target, const TypeVarMap * typeVars, ScrubMode mode );
+
+
 /// For all polymorphic types with type variables in `typeVars`,
 /// replaces generic types, dtypes, and ftypes with the appropriate void type,
@@ -116,5 +123,5 @@
 		node_t const * target, const TypeVarMap & typeVars ) {
 	return strict_dynamic_cast<node_t const *>(
-			scrubTypeVars<ast::Node>( target, typeVars ) );
+			scrubTypeVarsBase( target, &typeVars, ScrubMode::FromMap ) );
 }
 
@@ -123,8 +130,8 @@
 /// and sizeof/alignof expressions with the proper variable.
 template<typename node_t>
-ast::Node const * scrubTypeVarsDynamic(
+node_t const * scrubTypeVarsDynamic(
 		node_t const * target, const TypeVarMap & typeVars ) {
 	return strict_dynamic_cast<node_t const *>(
-			scrubTypeVarsDynamic<ast::Node>( target, typeVars ) );
+			scrubTypeVarsBase( target, &typeVars, ScrubMode::DynamicFromMap ) );
 }
 
@@ -134,18 +141,6 @@
 node_t const * scrubAllTypeVars( node_t const * target ) {
 	return strict_dynamic_cast<node_t const *>(
-			scrubAllTypeVars<ast::Node>( target ) );
+			scrubTypeVarsBase( target, nullptr, ScrubMode::All ) );
 }
-
-// We specialize for Node as a base case.
-template<>
-ast::Node const * scrubTypeVars<ast::Node>(
-		const ast::Node * target, const TypeVarMap & typeVars );
-
-template<>
-ast::Node const * scrubTypeVarsDynamic<ast::Node>(
-		ast::Node const * target, const TypeVarMap & typeVars );
-
-template<>
-ast::Node const * scrubAllTypeVars<ast::Node>( const ast::Node * target );
 
 } // namespace GenPoly
Index: src/Parser/RunParser.cpp
===================================================================
--- src/Parser/RunParser.cpp	(revision 0348fd8041753ad3a2b4b4442a5b639a0aa201d4)
+++ src/Parser/RunParser.cpp	(revision d99a7168a496bfc355c644d298212bbfcfd3ef37)
@@ -10,10 +10,14 @@
 // Created On       : Mon Dec 19 11:00:00 2022
 // Last Modified By : Andrew Beach
-// Last Modified On : Mon Dec 19 11:15:00 2022
-// Update Count     : 0
+// Last Modified On : Thr Dec 22 10:18:00 2022
+// Update Count     : 1
 //
 
 #include "RunParser.hpp"
 
+#include "AST/Convert.hpp"                  // for convert
+#include "AST/TranslationUnit.hpp"          // for TranslationUnit
+#include "CodeTools/TrackLoc.h"             // for fillLocations
+#include "Common/CodeLocationTools.hpp"     // for forceFillCodeLocations
 #include "Parser/ParseNode.h"               // for DeclarationNode, buildList
 #include "Parser/TypedefTable.h"            // for TypedefTable
@@ -41,11 +45,5 @@
 } // parse
 
-void dumpParseTree( std::ostream & out ) {
-	parseTree->printList( out );
-	delete parseTree;
-	parseTree = nullptr;
-}
-
-std::list<Declaration *> buildUnit(void) {
+ast::TranslationUnit buildUnit(void) {
 	std::list<Declaration *> translationUnit;
 	buildList( parseTree, translationUnit );
@@ -54,5 +52,11 @@
 	parseTree = nullptr;
 
-	return translationUnit;
+	// When the parse/buildList code is translated to the new ast, these
+	// fill passes (and the one after 'Hoist Type Decls') should be redundent
+	// because the code locations should already be filled.
+	CodeTools::fillLocations( translationUnit );
+	ast::TranslationUnit transUnit = convert( std::move( translationUnit ) );
+	forceFillCodeLocations( transUnit );
+	return transUnit;
 }
 
Index: src/Parser/RunParser.hpp
===================================================================
--- src/Parser/RunParser.hpp	(revision 0348fd8041753ad3a2b4b4442a5b639a0aa201d4)
+++ src/Parser/RunParser.hpp	(revision d99a7168a496bfc355c644d298212bbfcfd3ef37)
@@ -10,6 +10,6 @@
 // Created On       : Mon Dec 19 10:42:00 2022
 // Last Modified By : Andrew Beach
-// Last Modified On : Mon Dec 19 11:15:00 2022
-// Update Count     : 0
+// Last Modified On : Thr Dec 22 10:23:00 2022
+// Update Count     : 1
 //
 
@@ -17,8 +17,9 @@
 
 #include <iosfwd>                           // for ostream
-#include <list>                             // for list
 
 #include "SynTree/LinkageSpec.h"            // for Spec
-class Declaration;
+namespace ast {
+	class TranslationUnit;
+}
 
 // The Parser does not have an enclosing namespace.
@@ -30,10 +31,7 @@
 void parse( FILE * input, LinkageSpec::Spec linkage, bool alwaysExit = false );
 
-/// Drain the internal accumulator of parsed code and print it to the stream.
-void dumpParseTree( std::ostream & );
-
 /// Drain the internal accumulator of parsed code and build a translation
 /// unit from it.
-std::list<Declaration *> buildUnit(void);
+ast::TranslationUnit buildUnit(void);
 
 // Local Variables: //
Index: src/main.cc
===================================================================
--- src/main.cc	(revision 0348fd8041753ad3a2b4b4442a5b639a0aa201d4)
+++ src/main.cc	(revision d99a7168a496bfc355c644d298212bbfcfd3ef37)
@@ -228,4 +228,5 @@
 	ostream * output = & cout;
 	list< Declaration * > translationUnit;
+	ast::TranslationUnit transUnit;
 
 	Signal( SIGSEGV, sigSegvBusHandler, SA_SIGINFO );
@@ -294,20 +295,11 @@
 		parse( input, libcfap ? LinkageSpec::Intrinsic : LinkageSpec::Cforall, yydebug );
 
-		if ( parsep ) {
-			dumpParseTree( cout );
-			return EXIT_SUCCESS;
-		} // if
-
-		translationUnit = buildUnit();
+		transUnit = buildUnit();
 
 		if ( astp ) {
-			dump( translationUnit );
-			return EXIT_SUCCESS;
-		} // if
-
-		// Temporary: fill locations after parsing so that every node has a location, for early error messages.
-		// Eventually we should pass the locations from the parser to every node, but this quick and dirty solution
-		// works okay for now.
-		CodeTools::fillLocations( translationUnit );
+			dump( std::move( transUnit ) );
+			return EXIT_SUCCESS;
+		} // if
+
 		Stats::Time::StopBlock();
 
@@ -316,15 +308,5 @@
 			ast::pass_visitor_stats.max = Stats::Counters::build<Stats::Counters::MaxCounter<double>>("Max depth - New");
 		}
-		auto transUnit = convert( std::move( translationUnit ) );
-
-		forceFillCodeLocations( transUnit );
-
-		PASS( "Translate Exception Declarations", ControlStruct::translateExcept( transUnit ) );
-		if ( exdeclp ) {
-			dump( std::move( transUnit ) );
-			return EXIT_SUCCESS;
-		}
-
-		PASS( "Verify Ctor, Dtor & Assign", Validate::verifyCtorDtorAssign( transUnit ) );
+
 		PASS( "Hoist Type Decls", Validate::hoistTypeDecls( transUnit ) );
 		// Hoist Type Decls pulls some declarations out of contexts where
@@ -333,4 +315,11 @@
 		forceFillCodeLocations( transUnit );
 
+		PASS( "Translate Exception Declarations", ControlStruct::translateExcept( transUnit ) );
+		if ( exdeclp ) {
+			dump( std::move( transUnit ) );
+			return EXIT_SUCCESS;
+		}
+
+		PASS( "Verify Ctor, Dtor & Assign", Validate::verifyCtorDtorAssign( transUnit ) );
 		PASS( "Replace Typedefs", Validate::replaceTypedef( transUnit ) );
 		PASS( "Fix Return Types", Validate::fixReturnTypes( transUnit ) );
@@ -474,5 +463,11 @@
 		if ( errorp ) {
 			cerr << "---AST at error:---" << endl;
-			dump( translationUnit, cerr );
+			// We check which section the errors came from without looking at
+			// transUnit because std::move means it could look like anything.
+			if ( !translationUnit.empty() ) {
+				dump( translationUnit, cerr );
+			} else {
+				dump( std::move( transUnit ), cerr );
+			}
 			cerr << endl << "---End of AST, begin error message:---\n" << endl;
 		} // if
@@ -578,5 +573,4 @@
 	{ "rproto", resolvprotop, true, "resolver-proto instance" },
 	{ "rsteps", resolvep, true, "print resolver steps" },
-	{ "tree", parsep, true, "print parse tree" },
 	// code dumps
 	{ "ast", astp, true, "print AST after parsing" },
Index: tests/.expect/PRNG.x64.txt
===================================================================
--- tests/.expect/PRNG.x64.txt	(revision 0348fd8041753ad3a2b4b4442a5b639a0aa201d4)
+++ tests/.expect/PRNG.x64.txt	(revision d99a7168a496bfc355c644d298212bbfcfd3ef37)
@@ -1,96 +1,96 @@
 
-       PRNG()   PRNG(5)    PRNG(0,5)
-          861         3            0
-10137507171299805328         1            2
-12205946788447993741         4            0
-16222929371023265189         2            5
-11921944259646500358         1            1
-9511863719043198063         2            0
-18170109536749574203         0            1
-15896208456307578543         0            3
-4171113079117645375         1            4
-5535309872453329531         1            1
-13293369315461644140         2            2
-855811942427900360         1            1
-9125507373316195824         1            5
-6942856496042419510         1            5
-16774706561877323900         2            4
-17765436951300330249         4            0
-3766082030894719812         1            2
-15818141700523398820         3            5
-1244962761353699441         0            5
-4506898200126256218         1            2
+                    PRNG()     PRNG(5)   PRNG(0,5)
+                8464106481           4           4
+       5215204710507639537           1           2
+       1880401021892145483           0           4
+      12503840966285181348           2           5
+        801971300205459356           0           2
+       6123812066052045228           3           1
+       7691074772031490538           4           3
+       4793575011534070065           0           0
+      10647551928893428440           1           3
+      10865128702974868079           0           3
+        530720947131684825           3           0
+      10520125295812061287           1           5
+       7539957561855178679           4           4
+      13739826796006269835           0           2
+       4289714351582916365           3           2
+      16911914987551424434           2           1
+       5327155553462670435           4           0
+      16251986870929071204           4           4
+      13394433706240223001           0           3
+       4814982023332666924           4           0
 seed 1009
 
 Sequential
-trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
+trials 100000000 buckets 100000 min 871 max 1144 avg 1000.0 std 31.6 rstd 3.2%
 
 Concurrent
-trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
-trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
-trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
-trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
+trials 100000000 buckets 100000 min 871 max 1144 avg 1000.0 std 31.6 rstd 3.2%
+trials 100000000 buckets 100000 min 871 max 1144 avg 1000.0 std 31.6 rstd 3.2%
+trials 100000000 buckets 100000 min 871 max 1144 avg 1000.0 std 31.6 rstd 3.2%
+trials 100000000 buckets 100000 min 871 max 1144 avg 1000.0 std 31.6 rstd 3.2%
 
-       prng()   prng(5)    prng(0,5)
-          861         3            0
-10137507171299805328         1            2
-12205946788447993741         4            0
-16222929371023265189         2            5
-11921944259646500358         1            1
-9511863719043198063         2            0
-18170109536749574203         0            1
-15896208456307578543         0            3
-4171113079117645375         1            4
-5535309872453329531         1            1
-13293369315461644140         2            2
-855811942427900360         1            1
-9125507373316195824         1            5
-6942856496042419510         1            5
-16774706561877323900         2            4
-17765436951300330249         4            0
-3766082030894719812         1            2
-15818141700523398820         3            5
-1244962761353699441         0            5
-4506898200126256218         1            2
+                    prng()     prng(5)   prng(0,5)
+                8464106481           4           4
+       5215204710507639537           1           2
+       1880401021892145483           0           4
+      12503840966285181348           2           5
+        801971300205459356           0           2
+       6123812066052045228           3           1
+       7691074772031490538           4           3
+       4793575011534070065           0           0
+      10647551928893428440           1           3
+      10865128702974868079           0           3
+        530720947131684825           3           0
+      10520125295812061287           1           5
+       7539957561855178679           4           4
+      13739826796006269835           0           2
+       4289714351582916365           3           2
+      16911914987551424434           2           1
+       5327155553462670435           4           0
+      16251986870929071204           4           4
+      13394433706240223001           0           3
+       4814982023332666924           4           0
 seed 1009
 
 Sequential
-trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
+trials 100000000 buckets 100000 min 871 max 1144 avg 1000.0 std 31.6 rstd 3.2%
 
 Concurrent
-trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
-trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
-trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
-trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
+trials 100000000 buckets 100000 min 871 max 1144 avg 1000.0 std 31.6 rstd 3.2%
+trials 100000000 buckets 100000 min 871 max 1144 avg 1000.0 std 31.6 rstd 3.2%
+trials 100000000 buckets 100000 min 871 max 1144 avg 1000.0 std 31.6 rstd 3.2%
+trials 100000000 buckets 100000 min 871 max 1144 avg 1000.0 std 31.6 rstd 3.2%
 
-      prng(t) prng(t,5)  prng(t,0,5)
-          861         3            0
-10137507171299805328         1            2
-12205946788447993741         4            0
-16222929371023265189         2            5
-11921944259646500358         1            1
-9511863719043198063         2            0
-18170109536749574203         0            1
-15896208456307578543         0            3
-4171113079117645375         1            4
-5535309872453329531         1            1
-13293369315461644140         2            2
-855811942427900360         1            1
-9125507373316195824         1            5
-6942856496042419510         1            5
-16774706561877323900         2            4
-17765436951300330249         4            0
-3766082030894719812         1            2
-15818141700523398820         3            5
-1244962761353699441         0            5
-4506898200126256218         1            2
+                   prng(t)   prng(t,5) prng(t,0,5)
+                8464106481           4           4
+       5215204710507639537           1           2
+       1880401021892145483           0           4
+      12503840966285181348           2           5
+        801971300205459356           0           2
+       6123812066052045228           3           1
+       7691074772031490538           4           3
+       4793575011534070065           0           0
+      10647551928893428440           1           3
+      10865128702974868079           0           3
+        530720947131684825           3           0
+      10520125295812061287           1           5
+       7539957561855178679           4           4
+      13739826796006269835           0           2
+       4289714351582916365           3           2
+      16911914987551424434           2           1
+       5327155553462670435           4           0
+      16251986870929071204           4           4
+      13394433706240223001           0           3
+       4814982023332666924           4           0
 seed 1009
 
 Sequential
-trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
+trials 100000000 buckets 100000 min 871 max 1144 avg 1000.0 std 31.6 rstd 3.2%
 
 Concurrent
-trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
-trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
-trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
-trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
+trials 100000000 buckets 100000 min 871 max 1144 avg 1000.0 std 31.6 rstd 3.2%
+trials 100000000 buckets 100000 min 871 max 1144 avg 1000.0 std 31.6 rstd 3.2%
+trials 100000000 buckets 100000 min 871 max 1144 avg 1000.0 std 31.6 rstd 3.2%
+trials 100000000 buckets 100000 min 871 max 1144 avg 1000.0 std 31.6 rstd 3.2%
Index: tests/.expect/PRNG.x86.txt
===================================================================
--- tests/.expect/PRNG.x86.txt	(revision 0348fd8041753ad3a2b4b4442a5b639a0aa201d4)
+++ tests/.expect/PRNG.x86.txt	(revision d99a7168a496bfc355c644d298212bbfcfd3ef37)
@@ -1,96 +1,96 @@
 
-       PRNG()   PRNG(5)    PRNG(0,5)
-      8333105         1            2
-   1989339636         4            5
-    266970699         3            2
-   1928130121         3            4
-   1351003938         4            5
-   1624164922         4            3
-    363429604         1            2
-   3355083174         1            1
-    214422584         1            1
-   2266729947         1            2
-   3649702519         2            4
-   2250875012         2            4
-   4184653025         1            3
-   2640851227         2            5
-    206468178         2            3
-   2600873108         1            3
-   3007574582         3            3
-    394476790         0            2
-   1312145388         1            5
-   2989081290         2            4
+                    PRNG()     PRNG(5)   PRNG(0,5)
+                    130161           1           1
+                4074541490           0           0
+                 927506267           0           3
+                1991273445           1           3
+                 669918146           2           3
+                 519546860           1           1
+                1136699882           4           3
+                2130185384           3           1
+                 992239050           0           5
+                2250903111           0           1
+                1544429724           3           2
+                1591091660           3           3
+                2511657707           2           4
+                1065770984           2           4
+                2412763405           4           4
+                1834447239           4           2
+                 360289337           0           4
+                2449452027           1           1
+                3370425396           2           1
+                3109103043           0           3
 seed 1009
 
 Sequential
-trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
+trials 100000000 buckets 100000 min 867 max 1135 avg 1000.0 std 31.7 rstd 3.2%
 
 Concurrent
-trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
-trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
-trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
-trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
+trials 100000000 buckets 100000 min 867 max 1135 avg 1000.0 std 31.7 rstd 3.2%
+trials 100000000 buckets 100000 min 867 max 1135 avg 1000.0 std 31.7 rstd 3.2%
+trials 100000000 buckets 100000 min 867 max 1135 avg 1000.0 std 31.7 rstd 3.2%
+trials 100000000 buckets 100000 min 867 max 1135 avg 1000.0 std 31.7 rstd 3.2%
 
-       prng()   prng(5)    prng(0,5)
-      8333105         1            2
-   1989339636         4            5
-    266970699         3            2
-   1928130121         3            4
-   1351003938         4            5
-   1624164922         4            3
-    363429604         1            2
-   3355083174         1            1
-    214422584         1            1
-   2266729947         1            2
-   3649702519         2            4
-   2250875012         2            4
-   4184653025         1            3
-   2640851227         2            5
-    206468178         2            3
-   2600873108         1            3
-   3007574582         3            3
-    394476790         0            2
-   1312145388         1            5
-   2989081290         2            4
+                    prng()     prng(5)   prng(0,5)
+                    130161           1           1
+                4074541490           0           0
+                 927506267           0           3
+                1991273445           1           3
+                 669918146           2           3
+                 519546860           1           1
+                1136699882           4           3
+                2130185384           3           1
+                 992239050           0           5
+                2250903111           0           1
+                1544429724           3           2
+                1591091660           3           3
+                2511657707           2           4
+                1065770984           2           4
+                2412763405           4           4
+                1834447239           4           2
+                 360289337           0           4
+                2449452027           1           1
+                3370425396           2           1
+                3109103043           0           3
 seed 1009
 
 Sequential
-trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
+trials 100000000 buckets 100000 min 867 max 1135 avg 1000.0 std 31.7 rstd 3.2%
 
 Concurrent
-trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
-trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
-trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
-trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
+trials 100000000 buckets 100000 min 867 max 1135 avg 1000.0 std 31.7 rstd 3.2%
+trials 100000000 buckets 100000 min 867 max 1135 avg 1000.0 std 31.7 rstd 3.2%
+trials 100000000 buckets 100000 min 867 max 1135 avg 1000.0 std 31.7 rstd 3.2%
+trials 100000000 buckets 100000 min 867 max 1135 avg 1000.0 std 31.7 rstd 3.2%
 
-      prng(t) prng(t,5)  prng(t,0,5)
-      8333105         1            2
-   1989339636         4            5
-    266970699         3            2
-   1928130121         3            4
-   1351003938         4            5
-   1624164922         4            3
-    363429604         1            2
-   3355083174         1            1
-    214422584         1            1
-   2266729947         1            2
-   3649702519         2            4
-   2250875012         2            4
-   4184653025         1            3
-   2640851227         2            5
-    206468178         2            3
-   2600873108         1            3
-   3007574582         3            3
-    394476790         0            2
-   1312145388         1            5
-   2989081290         2            4
+                   prng(t)   prng(t,5) prng(t,0,5)
+                    130161           1           1
+                4074541490           0           0
+                 927506267           0           3
+                1991273445           1           3
+                 669918146           2           3
+                 519546860           1           1
+                1136699882           4           3
+                2130185384           3           1
+                 992239050           0           5
+                2250903111           0           1
+                1544429724           3           2
+                1591091660           3           3
+                2511657707           2           4
+                1065770984           2           4
+                2412763405           4           4
+                1834447239           4           2
+                 360289337           0           4
+                2449452027           1           1
+                3370425396           2           1
+                3109103043           0           3
 seed 1009
 
 Sequential
-trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
+trials 100000000 buckets 100000 min 867 max 1135 avg 1000.0 std 31.7 rstd 3.2%
 
 Concurrent
-trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
-trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
-trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
-trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
+trials 100000000 buckets 100000 min 867 max 1135 avg 1000.0 std 31.7 rstd 3.2%
+trials 100000000 buckets 100000 min 867 max 1135 avg 1000.0 std 31.7 rstd 3.2%
+trials 100000000 buckets 100000 min 867 max 1135 avg 1000.0 std 31.7 rstd 3.2%
+trials 100000000 buckets 100000 min 867 max 1135 avg 1000.0 std 31.7 rstd 3.2%
Index: sts/.expect/alloc.txt.old
===================================================================
--- tests/.expect/alloc.txt.old	(revision 0348fd8041753ad3a2b4b4442a5b639a0aa201d4)
+++ 	(revision )
@@ -1,74 +1,0 @@
-C   malloc 0xdeadbeef
-CFA malloc 0xdeadbeef
-CFA alloc 0xdeadbeef
-CFA alloc, fill dededede
-CFA alloc, fill 3
-
-C   array calloc, fill 0
-0 0 0 0 0 0 0 0 0 0 
-CFA array calloc, fill 0
-0 0 0 0 0 0 0 0 0 0 
-CFA array alloc, no fill
-0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 
-CFA array alloc, fill 0xde
-0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 
-CFA array alloc, fill 0xef
-0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 
-CFA array alloc, fill from array
-0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 
-
-C realloc
-0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 
-CFA realloc
-0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 
-
-CFA realloc array alloc
-0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 
-CFA realloc array alloc
-0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 
-CFA realloc array alloc
-0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 
-CFA realloc array alloc, fill
-0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 
-CFA realloc array alloc, fill
-0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 
-CFA realloc array alloc, fill
-0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 
-
-C   memalign 42 42.5
-CFA memalign 42 42.5
-CFA posix_memalign 42 42.5
-CFA posix_memalign 42 42.5
-CFA alloc_align 42 42.5
-CFA alloc_align 42 42.5
-CFA alloc_align fill 0xdededede -0x1.ededededededep+494
-CFA alloc_align fill 42 42.5
-CFA alloc_align 42 42.5
-
-CFA array alloc_align
-42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 
-CFA array alloc_align, fill
-0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 
-CFA array alloc_align, fill
-42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 
-CFA array alloc_align, fill array
-42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 
-CFA realloc array alloc_align
-42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 
-
-CFA memset 0xdededede -0x1.ededededededep+494
-CFA memcpy 0xdededede -0x1.ededededededep+494
-
-CFA array memset
-0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 
-CFA array memcpy
-0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 
-
-CFA new initialize
-42 42.5 42 42.5
-CFA array new initialize
-42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 
-42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 
-
-pointer arithmetic 0
-CFA deep malloc 0xdeadbeef
Index: tests/.expect/nested_function.x64.txt
===================================================================
--- tests/.expect/nested_function.x64.txt	(revision 0348fd8041753ad3a2b4b4442a5b639a0aa201d4)
+++ tests/.expect/nested_function.x64.txt	(revision d99a7168a496bfc355c644d298212bbfcfd3ef37)
@@ -1,1 +1,1 @@
-total 80
+total 155
Index: tests/.expect/nested_function.x86.txt
===================================================================
--- tests/.expect/nested_function.x86.txt	(revision 0348fd8041753ad3a2b4b4442a5b639a0aa201d4)
+++ tests/.expect/nested_function.x86.txt	(revision d99a7168a496bfc355c644d298212bbfcfd3ef37)
@@ -1,1 +1,1 @@
-total 55
+total 105
Index: tests/PRNG.cfa
===================================================================
--- tests/PRNG.cfa	(revision 0348fd8041753ad3a2b4b4442a5b639a0aa201d4)
+++ tests/PRNG.cfa	(revision d99a7168a496bfc355c644d298212bbfcfd3ef37)
@@ -8,6 +8,6 @@
 // Created On       : Wed Dec 29 09:38:12 2021
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov 22 22:51:12 2022
-// Update Count     : 381
+// Last Modified On : Wed Dec 21 20:39:59 2022
+// Update Count     : 406
 // 
 
@@ -60,5 +60,5 @@
 
 
-unsigned int seed = 1009;
+size_t seed = 1009;
 
 thread T1 {};
@@ -116,7 +116,11 @@
 } // dummy
 
+
 int main() {
 	// causes leaked storage message
-//	setlocale( LC_NUMERIC, getenv( "LANG" ) );			// print digit separator
+	// setlocale( LC_NUMERIC, getenv( "LANG" ) );			// print digit separator
+	// locale_t loc = newlocale( LC_NUMERIC_MASK, getenv( "LANG" ), (locale_t)0p );
+	// if ( loc == (locale_t)0p ) abort( "newlocale" );
+	// uselocale( loc );
 
 	enum { TASKS = 4 };
@@ -130,9 +134,9 @@
 
 	sout | sepDisable;
-	sout | wd(13, "rand()" ) | wd(10, "rand(5)") | wd(13, "rand(0,5)" );
-	for ( 20 ) {
-		sout | wd(13, rand()) | nonl;
-		sout | wd(10, rand() % 5) | nonl;
-		sout | wd(13, rand() % (5 - 0 + 1) + 0);
+	sout | wd(26, "rand()" ) | wd(12, "rand(5)") | wd(12, "rand(0,5)" );
+	for ( 20 ) {
+		sout | wd(26, rand()) | nonl;
+		sout | wd(12, rand() % 5) | nonl;
+		sout | wd(12, rand() % (5 - 0 + 1) + 0);
 	} // for
 	sout | sepEnable;
@@ -168,9 +172,9 @@
 
 	sout | sepDisable;
-	sout | nl | wd(13, "PRNG()" ) | wd(10, "PRNG(5)") | wd(13, "PRNG(0,5)" );
-	for ( 20 ) {
-		sout | wd(13, prng( prng )) | nonl;				// cascading => side-effect functions called in arbitary order
-		sout | wd(10, prng( prng, 5 )) | nonl;
-		sout | wd(13, prng( prng, 0, 5 ));
+	sout | nl | wd(26, "PRNG()" ) | wd(12, "PRNG(5)") | wd(12, "PRNG(0,5)" );
+	for ( 20 ) {
+		sout | wd(26, prng( prng )) | nonl;				// cascading => side-effect functions called in arbitary order
+		sout | wd(12, prng( prng, 5 )) | nonl;
+		sout | wd(12, prng( prng, 0, 5 ));
 	} // for
 	sout | sepEnable;
@@ -203,9 +207,9 @@
 
 	sout | sepDisable;
-	sout | nl | wd(13, "prng()" ) | wd(10, "prng(5)") | wd(13, "prng(0,5)" );
-	for ( 20 ) {
-		sout | wd(13, prng()) | nonl;					// cascading => side-effect functions called in arbitary order
-		sout | wd(10, prng( 5 )) | nonl;
-		sout | wd(13, prng( 0, 5 ));
+	sout | nl | wd(26, "prng()" ) | wd(12, "prng(5)") | wd(12, "prng(0,5)" );
+	for ( 20 ) {
+		sout | wd(26, prng()) | nonl;					// cascading => side-effect functions called in arbitary order
+		sout | wd(12, prng( 5 )) | nonl;
+		sout | wd(12, prng( 0, 5 ));
 	} // for
 	sout | sepEnable;
@@ -239,9 +243,9 @@
 
 	sout | sepDisable;
-	sout | nl | wd(13, "prng(t)" ) | wd(10, "prng(t,5)") | wd(13, "prng(t,0,5)" );
-	for ( 20 ) {
-		sout | wd(13, prng( th )) | nonl;				// cascading => side-effect functions called in arbitary order
-		sout | wd(10, prng( th, 5 )) | nonl;
-		sout | wd(13, prng( th, 0, 5 ));
+	sout | nl | wd(26, "prng(t)" ) | wd(12, "prng(t,5)") | wd(12, "prng(t,0,5)" );
+	for ( 20 ) {
+		sout | wd(26, prng( th )) | nonl;				// cascading => side-effect functions called in arbitary order
+		sout | wd(12, prng( th, 5 )) | nonl;
+		sout | wd(12, prng( th, 0, 5 ));
 	} // for
 	sout | sepEnable;
@@ -266,4 +270,5 @@
 #endif // 0
 //	malloc_stats();
+	// freelocale( loc );
 } // main
 
Index: tests/concurrent/pthread/.expect/bounded_buffer.x64.txt
===================================================================
--- tests/concurrent/pthread/.expect/bounded_buffer.x64.txt	(revision 0348fd8041753ad3a2b4b4442a5b639a0aa201d4)
+++ tests/concurrent/pthread/.expect/bounded_buffer.x64.txt	(revision d99a7168a496bfc355c644d298212bbfcfd3ef37)
@@ -1,2 +1,2 @@
-producer total value is 24150
-consumer total value is 24150
+producer total value is 44280
+consumer total value is 44280
Index: tests/concurrent/pthread/.expect/bounded_buffer.x86.txt
===================================================================
--- tests/concurrent/pthread/.expect/bounded_buffer.x86.txt	(revision 0348fd8041753ad3a2b4b4442a5b639a0aa201d4)
+++ tests/concurrent/pthread/.expect/bounded_buffer.x86.txt	(revision d99a7168a496bfc355c644d298212bbfcfd3ef37)
@@ -1,2 +1,2 @@
-producer total value is 5940
-consumer total value is 5940
+producer total value is 45060
+consumer total value is 45060
