Index: Jenkinsfile
===================================================================
--- Jenkinsfile	(revision 44198fb9159caf1a5c6b949919830261ff7d2f2c)
+++ Jenkinsfile	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -155,5 +155,5 @@
 			dir (BuildDir) {
 				//Run the tests from the tests directory
-				sh """make ${jopt} --no-print-directory -C tests timeouts="--timeout=600 --global-timeout=14400" tests debug=yes archiveerrors=${BuildDir}/tests/crashes/full-debug"""
+				sh """make ${jopt} --no-print-directory -C tests timeout=600 global-timeout=14400 tests debug=yes archive-errors=${BuildDir}/tests/crashes/full-debug"""
 			}
 		}
@@ -162,5 +162,5 @@
 			dir (BuildDir) {
 				//Run the tests from the tests directory
-				sh """make ${jopt} --no-print-directory -C tests timeouts="--timeout=600 --global-timeout=14400" tests debug=no archiveerrors=${BuildDir}/tests/crashes/full-nodebug"""
+				sh """make ${jopt} --no-print-directory -C tests timeout=600 global-timeout=14400 tests debug=no archive-errors=${BuildDir}/tests/crashes/full-nodebug"""
 			}
 		}
Index: benchmark/Makefile.am
===================================================================
--- benchmark/Makefile.am	(revision 44198fb9159caf1a5c6b949919830261ff7d2f2c)
+++ benchmark/Makefile.am	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -11,6 +11,6 @@
 ## Created On       : Sun May 31 09:08:15 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Tue Mar 10 11:41:18 2020
-## Update Count     : 258
+## Last Modified On : Fri May 26 12:13:48 2023
+## Update Count     : 260
 ###############################################################################
 
@@ -374,20 +374,20 @@
 ## =========================================================================================================
 
-mutexStmt$(EXEEXT) :		    \
-	mutexStmt-cpp1.run			\
-	mutexStmt-cpp2.run			\
-	mutexStmt-cpp4.run			\
-	mutexStmt-cpp8.run			\
-	mutexStmt-java.run			\
-	mutexStmt-lock1.run		    \
-	mutexStmt-lock2.run		    \
-	mutexStmt-lock4.run		    \
-	mutexStmt-lock8.run		    \
-	mutexStmt-no-stmt-lock1.run \
-	mutexStmt-no-stmt-lock2.run \
-	mutexStmt-no-stmt-lock4.run \
-	mutexStmt-no-stmt-lock8.run \
-	mutexStmt-monitor1.run      \
-	mutexStmt-monitor2.run      \
+mutexStmt$(EXEEXT) :			\
+	mutexStmt-cpp1.run		\
+	mutexStmt-cpp2.run		\
+	mutexStmt-cpp4.run		\
+	mutexStmt-cpp8.run		\
+	mutexStmt-java.run		\
+	mutexStmt-lock1.run		\
+	mutexStmt-lock2.run		\
+	mutexStmt-lock4.run		\
+	mutexStmt-lock8.run		\
+	mutexStmt-no-stmt-lock1.run	\
+	mutexStmt-no-stmt-lock2.run	\
+	mutexStmt-no-stmt-lock4.run	\
+	mutexStmt-no-stmt-lock8.run	\
+	mutexStmt-monitor1.run		\
+	mutexStmt-monitor2.run		\
 	mutexStmt-monitor4.run
 
@@ -567,5 +567,5 @@
 	compile-array.make	\
 	compile-attributes.make	\
-	compile-empty.make  	\
+	compile-empty.make	\
 	compile-expression.make	\
 	compile-io.make		\
@@ -592,5 +592,5 @@
 
 compile-monitor$(EXEEXT):
-	$(CFACOMPILE) -DNO_COMPILED_PRAGMA -fsyntax-only -w $(testdir)/concurrent/monitor.cfa
+	$(CFACOMPILE) -DNO_COMPILED_PRAGMA -fsyntax-only -w $(testdir)/concurrency/monitor.cfa
 
 compile-operators$(EXEEXT):
@@ -598,5 +598,5 @@
 
 compile-thread$(EXEEXT):
-	$(CFACOMPILE) -DNO_COMPILED_PRAGMA -fsyntax-only -w $(testdir)/concurrent/thread.cfa
+	$(CFACOMPILE) -DNO_COMPILED_PRAGMA -fsyntax-only -w $(testdir)/concurrency/thread.cfa
 
 compile-typeof$(EXEEXT):
Index: doc/theses/colby_parsons_MMAth/benchmarks/waituntil/cfa/future.cfa
===================================================================
--- doc/theses/colby_parsons_MMAth/benchmarks/waituntil/cfa/future.cfa	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
+++ doc/theses/colby_parsons_MMAth/benchmarks/waituntil/cfa/future.cfa	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -0,0 +1,105 @@
+#include <select.hfa>
+#include <thread.hfa>
+#include <future.hfa>
+#include <fstream.hfa>
+#include <stdio.h>
+#include <time.hfa>
+#include <string.h>
+
+size_t Clients = 1, Time = 10;
+
+size_t globalTotal = 0;
+future(size_t) A, B, C;
+volatile bool server_done_loop = false;
+volatile bool client_done_loop = false;
+volatile bool client_done = false;
+volatile bool server_done = false;
+
+volatile size_t client_count = 0;
+volatile size_t client_loop_count = 0;
+thread Client {};
+void main( Client & this ) {
+    size_t i = 0;
+    for(;; i++ ) {
+        waituntil( A ) { get(A); }
+        and waituntil( B ) { get(B); }
+        or waituntil( C ) { get(C); }
+
+        // needs to check after waituntil for termination synchronization
+        if ( client_done ) break;
+
+        // Barrier-like synch needed to reset futures safely
+        if ( __atomic_add_fetch( &client_count, 1, __ATOMIC_SEQ_CST ) == Clients ) { // synchronize reset
+            client_count = 0;
+            reset( A );
+            reset( B );
+            reset( C );
+            client_done_loop = true; // unblock clients
+        }
+        while( !client_done_loop ) {} // client barrier
+        if ( __atomic_add_fetch( &client_loop_count, 1, __ATOMIC_SEQ_CST ) == Clients ) { 
+            client_done_loop = false; // reset barrier before clients can proceed past waituntil
+            server_done_loop = true; // unblock server to restart iteration
+            client_loop_count = 0;
+        }
+    }
+    __atomic_fetch_add( &globalTotal, i, __ATOMIC_SEQ_CST );
+}
+
+thread Server {};
+void main( Server & this ) {
+    for( size_t i = 0; !server_done; i++ ) {
+        if ( i % 4 == 0 ) {
+            fulfil(A, i);
+            fulfil(B, i);
+        } else if ( i % 4 == 1 ) {
+            fulfil(A, i);
+            fulfil(C, i);
+        } else if ( i % 4 == 2 ) {
+            fulfil(B, i);
+            fulfil(C, i);
+        } else {
+            fulfil(C, i);
+        }
+        while( !server_done_loop && !server_done ) {} // server barrier
+        server_done_loop = false; // reset server barrier
+    }
+}
+
+int main( int argc, char * argv[] ) {
+    switch ( argc ) {
+	  case 3:
+		if ( strcmp( argv[2], "d" ) != 0 ) {			// default ?
+			Time = atoi( argv[2] );
+		} // if
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			Clients = atoi( argv[1] );
+			if ( Clients < 1 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		sout | "Usage: " | argv[0]
+             | " [ clients (> 0) | 'd' (default " | Clients
+			 | ") ] [ time (>= 0) | 'd' (default " | Time
+			 | ") ]" ;
+		exit( EXIT_FAILURE );
+	} // switch
+    processor p[Clients];
+
+    {
+        Client c[Clients];
+        {
+            Server s;
+
+            sleep(Time`s);
+            server_done = true;
+        }
+        while( available(A) || available(B) || available(C) ) {}
+        client_done = true;
+        fulfil( C, 0 );
+    }
+    printf("%zu\n", globalTotal);
+}
Index: doc/theses/colby_parsons_MMAth/benchmarks/waituntil/run
===================================================================
--- doc/theses/colby_parsons_MMAth/benchmarks/waituntil/run	(revision 44198fb9159caf1a5c6b949919830261ff7d2f2c)
+++ doc/theses/colby_parsons_MMAth/benchmarks/waituntil/run	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -94,4 +94,5 @@
 
 chan_size='10'
+future_time='10'
 
 # toggle benchmarks
@@ -99,12 +100,16 @@
 contend=${true}
 sidechan=${true}
-# spin=${false}
-# contend=${false}
-# sidechan=${false}
+future=${true}
+spin=${false}
+contend=${false}
+sidechan=${false}
+# future=${false}
 
 runCFA=${true}
 runGO=${true}
+runUCPP=${true}
 # runCFA=${false}
-# runGO=${false}
+runGO=${false}
+# runUCPP=${false}
 
 cfa=~/cfa-cc/driver/cfa
@@ -158,4 +163,13 @@
 }
 
+run_future() {
+    for p in ${num_threads} ; do
+        pre_args=$(( ${p} - 1 ))
+        affinity ${p}
+        preprint="${p}\t"
+        repeat_command taskset -c ${taskset} ./a.${hostname} ${pre_args} ${post_args}
+    done
+}
+
 arch # get hostname
 
@@ -177,4 +191,8 @@
 # cfa flags
 cfa_flags='-quiet -O3 -nodebug -DNDEBUG'
+
+# UCPP flags
+UCPPflags="-quiet -g -Wall -Wextra -O3 -nodebug -DNDEBUG -multi"
+UCPP=~/ucpp/u++-7.0.0/bin/u++
 
 # run the benchmarks
@@ -243,2 +261,24 @@
 fi
 
+if [ ${future} -eq ${true} ] ; then
+    echo "future: "
+    post_args=${future_time}
+    if [ ${runCFA} -eq ${true} ] ; then
+        cd cfa # CFA RUN
+        print_header 'CFA'
+        ${cfa} ${cfa_flags} future.cfa -o a.${hostname} > /dev/null 2>&1
+        run_future
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done CFA
+
+    if [ ${runUCPP} -eq ${true} ] ; then
+        cd ucpp
+        print_header 'uC++'
+        ${UCPP} ${UCPPflags} future.cc -o a.${hostname} > /dev/null 2>&1
+        run_future
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done Go
+fi
+
Index: doc/theses/colby_parsons_MMAth/benchmarks/waituntil/ucpp/future.cc
===================================================================
--- doc/theses/colby_parsons_MMAth/benchmarks/waituntil/ucpp/future.cc	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
+++ doc/theses/colby_parsons_MMAth/benchmarks/waituntil/ucpp/future.cc	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -0,0 +1,104 @@
+#include <iostream>
+using namespace std;
+#include <uFuture.h>
+
+size_t Clients = 2, Time = 10;
+
+size_t globalTotal = 0;
+Future_ISM<size_t> A, B, C;
+volatile bool server_done_loop = false;
+volatile bool client_done_loop = false;
+volatile bool client_done = false;
+volatile bool server_done = false;
+
+volatile size_t client_count = 0;
+volatile size_t client_loop_count = 0;
+_Task Client {
+	void main() {
+		size_t i = 0;
+        for(;; i++ ) {
+            _Select( A ) { A(); }
+            and _Select( B ) { B(); }
+            or _Select( C ) { C(); }
+
+            // needs to check after waituntil for termination synchronization
+            if ( client_done ) break;
+            
+            // Barrier-like synch needed to reset futures safely
+            if ( __atomic_add_fetch(&client_count, 1, __ATOMIC_SEQ_CST) == Clients ) {
+                client_count = 0;
+                A.reset();
+                B.reset();
+                C.reset();
+                client_done_loop = true;
+            }
+            while( !client_done_loop ) {} // client barrier
+            if ( __atomic_add_fetch( &client_loop_count, 1, __ATOMIC_SEQ_CST ) == Clients ) { 
+                client_done_loop = false; // reset barrier before clients can proceed past waituntil
+                server_done_loop = true; // unblock server to restart iteration
+                client_loop_count = 0;
+            }
+        }
+        __atomic_fetch_add( &globalTotal, i, __ATOMIC_SEQ_CST );
+	} 
+};
+
+_Task Server {
+	void main() {
+		for( size_t i = 0; !server_done; i++ ) {
+            if ( i % 4 == 0 ) {
+                A.delivery(i);
+                B.delivery(i);
+            } else if ( i % 4 == 1 ) {
+                A.delivery(i);
+                C.delivery(i);
+            } else if ( i % 4 == 2 ) {
+                B.delivery(i);
+                C.delivery(i);
+            } else {
+                C.delivery(i);
+            }
+            while( !server_done_loop && !server_done ) {} // server barrier
+            server_done_loop = false; // reset server barrier
+        }
+	}
+};
+
+int main( int argc, char * argv[] ) {
+	switch ( argc ) {
+	  case 3:
+		if ( strcmp( argv[2], "d" ) != 0 ) {			// default ?
+			Time = atoi( argv[2] );
+		} // if
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			Clients = atoi( argv[1] );
+			if ( Clients < 1 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		cerr << "Usage: " << argv[0]
+             << " [ clients (> 0) | 'd' (default " << Clients
+			 << ") ] [ time (>= 0) | 'd' (default " << Time
+			 << ") ]" ;
+		exit( EXIT_FAILURE );
+	} // switch
+    uProcessor p[Clients];
+
+    {
+        Client c[Clients];
+        {
+            Server s;
+
+            uBaseTask::sleep( uDuration( Time ) );
+
+            server_done = true;
+        }
+        while( A.available() || B.available() || C.available() ) {}
+        client_done = true;
+        C.delivery(1); // can't deliver 0 since it causes ambiguity
+    }
+    cout << globalTotal << endl;
+} // main
Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision 44198fb9159caf1a5c6b949919830261ff7d2f2c)
+++ src/AST/Pass.impl.hpp	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -46,5 +46,5 @@
 
 #ifdef PEDANTIC_PASS_ASSERT
-#define __pedantic_pass_assert(...) assert (__VA_ARGS__)
+#define __pedantic_pass_assert(...) assert(__VA_ARGS__)
 #define __pedantic_pass_assertf(...) assertf(__VA_ARGS__)
 #else
Index: src/AST/Pass.proto.hpp
===================================================================
--- src/AST/Pass.proto.hpp	(revision 44198fb9159caf1a5c6b949919830261ff7d2f2c)
+++ src/AST/Pass.proto.hpp	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -27,5 +27,5 @@
 
 #ifdef PEDANTIC_PASS_ASSERT
-#define __pedantic_pass_assert(...) assert (__VA_ARGS__)
+#define __pedantic_pass_assert(...) assert(__VA_ARGS__)
 #define __pedantic_pass_assertf(...) assertf(__VA_ARGS__)
 #else
Index: src/Concurrency/Waituntil.cpp
===================================================================
--- src/Concurrency/Waituntil.cpp	(revision 44198fb9159caf1a5c6b949919830261ff7d2f2c)
+++ src/Concurrency/Waituntil.cpp	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -940,37 +940,8 @@
 	}
 
-    // C_TODO: will remove this commented code later. Currently it isn't needed but may switch to a modified version of this later if it has better performance
-    // std::vector<ptr<CaseClause>> switchCases;
-
-    // int idx = 0;
-    // for ( const auto & clause: stmt->clauses ) {
-    //     const CodeLocation & cLoc = clause->location;
-    //     switchCases.push_back(
-    //         new CaseClause( cLoc,
-    //             new CastExpr( cLoc, 
-    //                 new AddressExpr( cLoc, new NameExpr( cLoc, data.at(idx)->targetName ) ),
-    //                 new BasicType( BasicType::Kind::LongUnsignedInt ), GeneratedFlag::ExplicitCast 
-    //             ),
-    //             {
-    //                 new CompoundStmt( cLoc,
-    //                     {
-    //                         ast::deepCopy( clause->stmt ),
-    //                         new BranchStmt( cLoc, BranchStmt::Kind::Break, Label( cLoc ) )
-    //                     }
-    //                 )
-    //             }
-    //         )
-    //     );
-    //     idx++;
-    // }
-
     return new CompoundStmt( loc,
         {
             new ExprStmt( loc, new UntypedExpr( loc, new NameExpr( loc, "park" ) ) ),
             outerIf
-            // new SwitchStmt( loc,
-            //     new NameExpr( loc, statusName ),
-            //     std::move( switchCases )
-            // )
         }
     );
@@ -1015,4 +986,5 @@
     const CodeLocation & cLoc = stmt->clauses.at(idx)->location;
 
+    Expr * baseCond = genSelectTraitCall( stmt->clauses.at(idx), data.at(idx), "register_select" );
     Expr * ifCond;
 
@@ -1025,10 +997,10 @@
             ),
             new CastExpr( cLoc,
-                genSelectTraitCall( stmt->clauses.at(idx), data.at(idx), "register_select" ),
+                baseCond,
                 new BasicType( BasicType::Kind::Bool ), GeneratedFlag::ExplicitCast 
             ),
             LogicalFlag::AndExpr
         );
-    } else ifCond = genSelectTraitCall( stmt->clauses.at(idx), data.at(idx), "register_select" );
+    } else ifCond = baseCond;
 
     return new CompoundStmt( cLoc,
Index: src/SymTab/Autogen.h
===================================================================
--- src/SymTab/Autogen.h	(revision 44198fb9159caf1a5c6b949919830261ff7d2f2c)
+++ src/SymTab/Autogen.h	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -20,10 +20,4 @@
 #include <string>                 // for string
 
-#include "AST/Decl.hpp"
-#include "AST/Expr.hpp"
-#include "AST/Init.hpp"
-#include "AST/Node.hpp"
-#include "AST/Stmt.hpp"
-#include "AST/Type.hpp"
 #include "CodeGen/OperatorTable.h"
 #include "Common/UniqueName.h"    // for UniqueName
@@ -57,7 +51,4 @@
 	/// maybePolymorphic is true if the resulting FunctionType is allowed to be polymorphic
 	FunctionType * genCopyType( Type * paramType, bool maybePolymorphic = true );
-
-	/// Enum for loop direction
-	enum LoopDirection { LoopBackward, LoopForward };
 
 	/// inserts into out a generated call expression to function fname with arguments dstParam and srcParam. Intended to be used with generated ?=?, ?{}, and ^?{} calls.
Index: src/SymTab/GenImplicitCall.cpp
===================================================================
--- src/SymTab/GenImplicitCall.cpp	(revision 44198fb9159caf1a5c6b949919830261ff7d2f2c)
+++ src/SymTab/GenImplicitCall.cpp	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -16,9 +16,16 @@
 #include "GenImplicitCall.hpp"
 
+#include "AST/Decl.hpp"                  // for ObjectDecl
+#include "AST/Expr.hpp"                  // for ConstantExpr, UntypedExpr,...
+#include "AST/Init.hpp"                  // for SingleInit
 #include "AST/Inspect.hpp"               // for isUnnamedBitfield
+#include "AST/Stmt.hpp"                  // for ExprStmt
+#include "AST/Type.hpp"                  // for ArrayType, BasicType, ...
 #include "CodeGen/OperatorTable.h"       // for isCtorDtor
 #include "Common/UniqueName.h"           // for UniqueName
 
 namespace SymTab {
+
+namespace {
 
 template< typename OutIter >
@@ -173,4 +180,6 @@
 }
 
+} // namespace
+
 ast::ptr< ast::Stmt > genImplicitCall(
 	InitTweak::InitExpander_new & srcParam, const ast::Expr * dstParam,
Index: src/SymTab/GenImplicitCall.hpp
===================================================================
--- src/SymTab/GenImplicitCall.hpp	(revision 44198fb9159caf1a5c6b949919830261ff7d2f2c)
+++ src/SymTab/GenImplicitCall.hpp	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -17,8 +17,12 @@
 
 #include "InitTweak/InitTweak.h"  // for InitExpander
-#include "SymTab/Autogen.h"       // for LoopDirection
 
 namespace SymTab {
 
+/// Enum for loop direction
+enum LoopDirection { LoopBackward, LoopForward };
+
+/// Returns a generated call expression to function fname with srcParam and
+/// dstParam. Intended to be used with generated ?=?, ?{}, and ^?{} calls.
 ast::ptr<ast::Stmt> genImplicitCall(
 	InitTweak::InitExpander_new & srcParam, const ast::Expr * dstParam,
@@ -34,3 +38,2 @@
 // compile-command: "make install" //
 // End: //
-
Index: src/Validate/Autogen.cpp
===================================================================
--- src/Validate/Autogen.cpp	(revision 44198fb9159caf1a5c6b949919830261ff7d2f2c)
+++ src/Validate/Autogen.cpp	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -44,7 +44,4 @@
 #include "CompilationState.h"
 
-// TODO: The other new ast function should be moved over to this file.
-#include "SymTab/Autogen.h"
-
 namespace Validate {
 
@@ -96,5 +93,5 @@
 
 	const CodeLocation& getLocation() const { return getDecl()->location; }
-	ast::FunctionDecl * genProto( const std::string& name,
+	ast::FunctionDecl * genProto( std::string&& name,
 		std::vector<ast::ptr<ast::DeclWithType>>&& params,
 		std::vector<ast::ptr<ast::DeclWithType>>&& returns ) const;
@@ -337,6 +334,14 @@
 }
 
+void replaceAll( std::vector<ast::ptr<ast::DeclWithType>> & dwts,
+		const ast::DeclReplacer::TypeMap & map ) {
+	for ( auto & dwt : dwts ) {
+		dwt = strict_dynamic_cast<const ast::DeclWithType *>(
+				ast::DeclReplacer::replace( dwt, map ) );
+	}
+}
+
 /// Generates a basic prototype function declaration.
-ast::FunctionDecl * FuncGenerator::genProto( const std::string& name,
+ast::FunctionDecl * FuncGenerator::genProto( std::string&& name,
 		std::vector<ast::ptr<ast::DeclWithType>>&& params,
 		std::vector<ast::ptr<ast::DeclWithType>>&& returns ) const {
@@ -344,22 +349,22 @@
 	// Handle generic prameters and assertions, if any.
 	auto const & old_type_params = getGenericParams( type );
+	ast::DeclReplacer::TypeMap oldToNew;
 	std::vector<ast::ptr<ast::TypeDecl>> type_params;
 	std::vector<ast::ptr<ast::DeclWithType>> assertions;
 	for ( auto & old_param : old_type_params ) {
 		ast::TypeDecl * decl = ast::deepCopy( old_param );
-		for ( auto assertion : decl->assertions ) {
-			assertions.push_back( assertion );
-		}
-		decl->assertions.clear();
+		decl->init = nullptr;
+		splice( assertions, decl->assertions );
+		oldToNew.emplace( std::make_pair( old_param, decl ) );
 		type_params.push_back( decl );
 	}
-	// TODO: The values in params and returns still may point at the old
-	// generic params, that does not appear to be an issue but perhaps it
-	// should be addressed.
+	replaceAll( params, oldToNew );
+	replaceAll( returns, oldToNew );
+	replaceAll( assertions, oldToNew );
 
 	ast::FunctionDecl * decl = new ast::FunctionDecl(
 		// Auto-generated routines use the type declaration's location.
 		getLocation(),
-		name,
+		std::move( name ),
 		std::move( type_params ),
 		std::move( assertions ),
Index: tests/.expect/array-ERR1.txt
===================================================================
--- tests/.expect/array-ERR1.txt	(revision 44198fb9159caf1a5c6b949919830261ff7d2f2c)
+++ tests/.expect/array-ERR1.txt	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -1,3 +1,3 @@
-array.cfa:105:25: warning: Preprocessor started
+array.cfa:119:25: warning: Preprocessor started
 array.cfa:40:22: error: '[*]' not allowed in other than function prototype scope
 array.cfa:46:24: error: '[*]' not allowed in other than function prototype scope
Index: tests/.expect/array-ERR2.txt
===================================================================
--- tests/.expect/array-ERR2.txt	(revision 44198fb9159caf1a5c6b949919830261ff7d2f2c)
+++ tests/.expect/array-ERR2.txt	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -1,2 +1,2 @@
-array.cfa:105:25: warning: Preprocessor started
-array.cfa:95:32: error: syntax error, unexpected STATIC before token "static"
+array.cfa:119:25: warning: Preprocessor started
+array.cfa:109:32: error: syntax error, unexpected STATIC before token "static"
Index: tests/.expect/array-ERR3.txt
===================================================================
--- tests/.expect/array-ERR3.txt	(revision 44198fb9159caf1a5c6b949919830261ff7d2f2c)
+++ tests/.expect/array-ERR3.txt	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -1,2 +1,2 @@
-array.cfa:105:25: warning: Preprocessor started
-array.cfa:96:32: error: syntax error, unexpected ']' before token "]"
+array.cfa:119:25: warning: Preprocessor started
+array.cfa:110:32: error: syntax error, unexpected ']' before token "]"
Index: tests/.expect/array.txt
===================================================================
--- tests/.expect/array.txt	(revision 44198fb9159caf1a5c6b949919830261ff7d2f2c)
+++ tests/.expect/array.txt	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -1,1 +1,1 @@
-array.cfa:105:25: warning: Preprocessor started
+array.cfa:119:25: warning: Preprocessor started
Index: tests/Makefile.am
===================================================================
--- tests/Makefile.am	(revision 44198fb9159caf1a5c6b949919830261ff7d2f2c)
+++ tests/Makefile.am	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -11,6 +11,6 @@
 ## Created On       : Sun May 31 09:08:15 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Fri May 26 08:23:09 2023
-## Update Count     : 179
+## Last Modified On : Sun May 28 08:15:43 2023
+## Update Count     : 196
 ###############################################################################
 
@@ -26,11 +26,11 @@
 ARCH = ${if ${arch},"--arch=${arch}"}
 arch_support = "x86/x64/arm"
+TIMEOUT = ${if ${timeout},"--timeout=${timeout}"}
+GLOBAL_TIMEOUT = ${if ${global-timeout},"--global-timeout=${global-timeout}"}
+ARCHIVE_ERRORS = ${if ${archive-errors},"--archive-errors=${archive-errors}"}
+
 DEBUG_FLAGS = -debug -g -O0
 
 quick_test = avl_test operators numericConstants expression enum array typeof cast raii/dtor-early-exit raii/init_once attributes meta/dumpable
-
-archiveerrors=
-concurrent=
-timeouts=
 
 TEST_PY = python3 ${builddir}/test.py
@@ -67,5 +67,5 @@
 PRETTY_PATH = mkdir -p ${dir ${abspath ${@}}} && cd ${srcdir} &&
 
-.PHONY : list .validate .test_makeflags
+.PHONY : concurrency list .validate .test_makeflags
 .INTERMEDIATE : .validate .validate.cfa .test_makeflags
 EXTRA_PROGRAMS = avl_test linkonce linking/mangling/anon .dummy_hack # build but do not install
@@ -90,5 +90,5 @@
 	concurrency/clib.c \
 	concurrency/unified_locking/mutex_test.hfa \
-	concurrentcy/channels/parallel_harness.hfa
+	concurrency/channels/parallel_harness.hfa
 
 dist-hook:
@@ -109,30 +109,31 @@
 #----------------------------------------------------------------------------------------------------------------
 
+# '@' => do not echo command (SILENT), '+' => allows recursive make from within python program
 all-local : # This name is important to automake and implies the default build target.
-	@+${TEST_PY} --debug=${debug} --install=${installed} --invariant --archive-errors=${archiveerrors} ${concurrent} ${timeouts} ${ARCH} --all # '@' => do not echo command (SILENT), '+' => allows recursive make from within python program
-
-install : all-local # PAB only
-
-tests : all-local
+	@+${TEST_PY} --debug=${debug} --install=${installed} --invariant ${ARCHIVE_ERRORS} ${TIMEOUT} ${GLOBAL_TIMEOUT} ${ARCH} --all
+
+tests : all-local # synonym
+
+install : all-local  # synonym, PAB only
 
 quick :
-	@+${TEST_PY} --debug=${debug} --install=${installed} --archive-errors=${archiveerrors} ${concurrent} ${timeouts} ${ARCH} ${quick_test}
+	@+${TEST_PY} --debug=${debug} --install=${installed} ${ARCHIVE_ERRORS} ${ARCH} ${quick_test}
 
 concurrency :
-	@+${TEST_PY} --debug=${debug} --install=${installed} ${ARCH} -Iconcurrent
+	@+${TEST_PY} --debug=${debug} --install=${installed} ${ARCHIVE_ERRORS} ${TIMEOUT} ${GLOBAL_TIMEOUT} ${ARCH} -Iconcurrency
 
 list :
-	@+${TEST_PY} --list ${concurrent}
+	@+${TEST_PY} --list
 
 help :
 	@echo "user targets:"
 	@echo "    Run the complete test suite."
-	@echo "    $$ make (null) / tests [debug=yes/no] [installed=yes/no] [arch=${arch_support}]"
+	@echo "    $$ make (null) / tests [debug=yes/no] [installed=yes/no] [archive-errors=dump-dir] [timeout=seconds] [global-timeout=seconds] [arch=${arch_support}]"
 	@echo ""
 	@echo "    Run the short (quick) test suite."
-	@echo "    $$ make quick [debug=yes/no] [installed=yes/no] [arch=${arch_support}]"
+	@echo "    $$ make quick [debug=yes/no] [installed=yes/no] [archive-errors=dump-dir] [arch=${arch_support}]"
 	@echo ""
-	@echo "    Run the concurrent test suite."
-	@echo "    $$ make concurrency [debug=yes/no] [installed=yes/no] [arch=${arch_support}]"
+	@echo "    Run the concurrency test suite."
+	@echo "    $$ make concurrency [debug=yes/no] [installed=yes/no] [archive-errors=dump-dir] [timeout=seconds] [global-timeout=seconds] [arch=${arch_support}]"
 	@echo ""
 	@echo "    List all tests in the test suite."
Index: tests/array.cfa
===================================================================
--- tests/array.cfa	(revision 44198fb9159caf1a5c6b949919830261ff7d2f2c)
+++ tests/array.cfa	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -81,21 +81,35 @@
     }
     [ * [int]( [3] int T,
-            [const 3] int p1,
-            [static 3] int p2,
-            [static const 3] int p3
-            )
+               [const 3] int p1,
+               [static 3] int p2,
+               [static const 3] int p3
+             )
     ] janes_twin(...) {
     }
     #endif
 
+    // GCC 11+ gives a false warning (-Wvla-parameter) on the valid (C11 ARM p134-135) combination:
+    // declare with type int[*], define with type int[n].
+    // https://gcc.gnu.org/bugzilla//show_bug.cgi?id=100420 suggests the internal representation of
+    // of a[*] is the same as a[0].
+    // https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wno-vla-parameter explains
+    // the purpose of -Wvla-parameter is to report conflicts between int[] and int[n], which would
+    // understandably also include those between int[42] and int[n].
+    // https://stackoverflow.com/questions/17371645/why-use-an-asterisk-instead-of-an-integer-for-a-vla-array-parameter-of-a-f
+    // explains the declare-*, define-n pattern.
 
-//  int fm1( int, int, int[][*] );                      // TODO: investigate gcc-11 warning 
-//  int fm1( int r, int c, int m[][c] ) {}
+    // To work around the false warning, and keep to this test's purpose of exercising CFA's
+    // handling of exotic C array syntax, what would ideally be demonstrated as a declaration of
+    // fm1, followed by its definition, is instead split into fm1x and fm1y.  And similarly for
+    // fm5.
+
+    int fm1x( int, int, int[][*] );
+    int fm1y( int r, int c, int m[][c] ) {}
     int fm2( int r, int c, int (*m)[c] ) {}             // same as fm1
 E2( int fm3( int r, int c, int m[][static c] ) {}  )    // that's not static
 E3( int fm4( int r, int c, int m[][] );            )    // m's immediate element type is incomplete
-    int fm5( int, int, int[*][*] );                     // same as fm1 decl
+    int fm5x( int, int, int[*][*] );                    // same as fm1 decl
                                                         #ifndef __cforall
-    int fm5( int r, int c, int m[r][c] ) {}             // BUG 276: CFA chokes but should accept
+    int fm5y( int r, int c, int m[r][c] ) {}            // BUG 276: CFA chokes but should accept
                                                         // C: same as fm1 defn
                                                         #endif
Index: tests/concurrency/barrier/gen_generation_expect.cfa
===================================================================
--- tests/concurrency/barrier/gen_generation_expect.cfa	(revision 44198fb9159caf1a5c6b949919830261ff7d2f2c)
+++ tests/concurrency/barrier/gen_generation_expect.cfa	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -5,5 +5,5 @@
 // file "LICENCE" distributed with Cforall.
 //
-// gen_generation_expect.cfa -- simple 'script' generates the expect file for concurrent/barrier/generation
+// gen_generation_expect.cfa -- simple 'script' generates the expect file for concurrency/barrier/generation
 //
 // Author           : Thierry Delisle
Index: tests/concurrency/barrier/generation.cfa
===================================================================
--- tests/concurrency/barrier/generation.cfa	(revision 44198fb9159caf1a5c6b949919830261ff7d2f2c)
+++ tests/concurrency/barrier/generation.cfa	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -5,6 +5,5 @@
 // file "LICENCE" distributed with Cforall.
 //
-// concurrent/barrier/generation.cfa -- simple test that validates barriers by printing
-//                                      alphabetical generations
+// generation.cfa -- simple test that validates barriers by printing alphabetical generations
 //
 // Author           : Thierry Delisle
Index: tests/concurrency/barrier/last.cfa
===================================================================
--- tests/concurrency/barrier/last.cfa	(revision 44198fb9159caf1a5c6b949919830261ff7d2f2c)
+++ tests/concurrency/barrier/last.cfa	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -5,5 +5,5 @@
 // file "LICENCE" distributed with Cforall.
 //
-// concurrent/barrier/last.cfa -- validates barrier's last hook functionality
+// last.cfa -- validates barrier's last hook functionality
 //
 // Author           : Thierry Delisle
Index: tests/concurrency/barrier/order.cfa
===================================================================
--- tests/concurrency/barrier/order.cfa	(revision 44198fb9159caf1a5c6b949919830261ff7d2f2c)
+++ tests/concurrency/barrier/order.cfa	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -5,5 +5,5 @@
 // file "LICENCE" distributed with Cforall.
 //
-// concurrent/barrier/order.cfa -- validates barriers the return value of
+// order.cfa -- validates barriers the return value of
 //                                 barrier block
 //
Index: tests/concurrency/readyQ/barrier_sleeper.cfa
===================================================================
--- tests/concurrency/readyQ/barrier_sleeper.cfa	(revision 44198fb9159caf1a5c6b949919830261ff7d2f2c)
+++ tests/concurrency/readyQ/barrier_sleeper.cfa	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -5,5 +5,5 @@
 // file "LICENCE" distributed with Cforall.
 //
-// concurrent/readyQ/barrier_sleeper.cfa -- testing the ready-queue
+// barrier_sleeper.cfa -- testing the ready-queue
 //
 // Author           : Thierry Delisle
Index: tests/concurrency/readyQ/leader_spin.cfa
===================================================================
--- tests/concurrency/readyQ/leader_spin.cfa	(revision 44198fb9159caf1a5c6b949919830261ff7d2f2c)
+++ tests/concurrency/readyQ/leader_spin.cfa	(revision 2cb8bf71ee22c19594b82251503bc555aa250fc9)
@@ -5,5 +5,5 @@
 // file "LICENCE" distributed with Cforall.
 //
-// concurrent/readyQ/leader_spin.cfa -- validates ready queue fairness
+// leader_spin.cfa -- validates ready queue fairness
 //
 // Author           : Thierry Delisle
