Index: Jenkins/FullBuild
===================================================================
--- Jenkins/FullBuild	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ Jenkins/FullBuild	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -17,10 +17,13 @@
 
 				parallel (
+					clang_x86: { trigger_build( 'gcc-8',   'x86' ) },
+					gcc_5_x86: { trigger_build( 'gcc-7',   'x86' ) },
+					gcc_6_x86: { trigger_build( 'gcc-6',   'x86' ) },
+					gcc_9_x64: { trigger_build( 'gcc-9',   'x64' ) },
+					gcc_8_x64: { trigger_build( 'gcc-8',   'x64' ) },
+					gcc_7_x64: { trigger_build( 'gcc-7',   'x64' ) },
 					gcc_6_x64: { trigger_build( 'gcc-6',   'x64' ) },
-					gcc_6_x86: { trigger_build( 'gcc-6',   'x86' ) },
 					gcc_5_x64: { trigger_build( 'gcc-5',   'x64' ) },
-					gcc_5_x86: { trigger_build( 'gcc-5',   'x86' ) },
 					clang_x64: { trigger_build( 'clang',   'x64' ) },
-					clang_x86: { trigger_build( 'clang',   'x86' ) },
 				)
 			}
Index: Jenkinsfile
===================================================================
--- Jenkinsfile	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ Jenkinsfile	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -102,4 +102,9 @@
 
 		echo GitLogMessage()
+
+		// This is a complete hack but it solves problems with automake thinking it needs to regenerate makefiles
+		// We fudged automake/missing to handle that but automake stills bakes prints inside the makefiles
+		// and these cause more problems.
+		sh 'find . -name Makefile.in -exec touch {} +'
 	}
 }
@@ -358,4 +363,13 @@
 	BuildSettings(java.util.Collections$UnmodifiableMap param, String branch) {
 		switch( param.Compiler ) {
+			case 'gcc-9':
+				this.Compiler = new CC_Desc('gcc-9', 'g++-9', 'gcc-9')
+			break
+			case 'gcc-8':
+				this.Compiler = new CC_Desc('gcc-8', 'g++-8', 'gcc-8')
+			break
+			case 'gcc-7':
+				this.Compiler = new CC_Desc('gcc-7', 'g++-7', 'gcc-7')
+			break
 			case 'gcc-6':
 				this.Compiler = new CC_Desc('gcc-6', 'g++-6', 'gcc-6')
@@ -368,5 +382,5 @@
 			break
 			case 'clang':
-				this.Compiler = new CC_Desc('clang', 'clang++', 'gcc-6')
+				this.Compiler = new CC_Desc('clang', 'clang++-6.0', 'gcc-6')
 			break
 			default :
@@ -430,6 +444,6 @@
 					description: 'Which compiler to use',					\
 					name: 'Compiler',									\
-					choices: 'gcc-6\ngcc-5\ngcc-4.9\nclang',					\
-					defaultValue: 'gcc-6',								\
+					choices: 'gcc-9\ngcc-8\ngcc-7\ngcc-6\ngcc-5\ngcc-4.9\nclang',					\
+					defaultValue: 'gcc-8',								\
 				],												\
 				[$class: 'ChoiceParameterDefinition',						\
Index: benchmark/Makefile.am
===================================================================
--- benchmark/Makefile.am	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/Makefile.am	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -11,6 +11,6 @@
 ## Created On       : Sun May 31 09:08:15 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Mon Jul 29 18:02:19 2019
-## Update Count     : 54
+## Last Modified On : Sat Jan 25 09:20:44 2020
+## Update Count     : 255
 ###############################################################################
 
@@ -28,7 +28,9 @@
 BENCH_V_CFA = $(__bench_v_CFA_$(__quiet))
 BENCH_V_CXX = $(__bench_v_CXX_$(__quiet))
+BENCH_V_UPP = $(__bench_v_UPP_$(__quiet))
 BENCH_V_GOC = $(__bench_v_GOC_$(__quiet))
+BENCH_V_RUSTC = $(__bench_v_RUSTC_$(__quiet))
+BENCH_V_NODEJS = $(__bench_v_NODEJS_$(__quiet))
 BENCH_V_JAVAC = $(__bench_v_JAVAC_$(__quiet))
-BENCH_V_UPP = $(__bench_v_UPP_$(__quiet))
 
 __quiet = verbose
@@ -36,13 +38,16 @@
 __bench_v_CFA_quiet = @
 __bench_v_CXX_quiet = @
+__bench_v_UPP_quiet = @
 __bench_v_GOC_quiet = @
+__bench_v_RUSTC_quiet = @
 __bench_v_JAVAC_quiet = @
-__bench_v_UPP_quiet = @
 __bench_v_CC_verbose = $(AM_V_CC)
 __bench_v_CFA_verbose = $(AM_V_CFA)
 __bench_v_CXX_verbose = $(AM_V_CXX)
+__bench_v_UPP_verbose = $(AM_V_UPP)
 __bench_v_GOC_verbose = $(AM_V_GOC)
+__bench_v_RUSTC_verbose = $(AM_V_RUSTC)
+__bench_v_NODEJS_verbose = $(AM_V_NODEJS)
 __bench_v_JAVAC_verbose = $(AM_V_JAVAC)
-__bench_v_UPP_verbose = $(AM_V_UPP)
 
 
@@ -51,5 +56,5 @@
 STATS    = ${abs_top_srcdir}/tools/stat.py
 # NEED AT LEAST 4 DATA VALUES FOR BENCHMARKS BECAUSE THE MAX AND MIN VALUES ARE REMOVED
-repeats  = 5 # 31 for benchmarks
+repeats  = 13 # 31 for benchmarks
 arch     = x64
 skipcompile = no
@@ -62,35 +67,74 @@
 
 dummyC.c:
-	@echo "int main() { return 0; }" > ${@}
+	echo "int main() { return 0; }" > ${@}
 
 dummyCXX.cpp:
-	@echo "int main() { return 0; }" > ${@}
-
+	echo "int main() { return 0; }" > ${@}
+
+#.SILENT:		# do not print recipe
+.ONESHELL:		# use one shell to execute recipe
 .NOTPARALLEL:
-.PHONY: compile.csv ctxswitch.csv mutex.csv signal.csv
-
-## =========================================================================================================
-all : ctxswitch$(EXEEXT) mutex$(EXEEXT) signal$(EXEEXT) waitfor$(EXEEXT) creation$(EXEEXT)
+.PHONY: compile.csv basic.csv ctxswitch.csv mutex.csv schedint.csv
+
+## =========================================================================================================
+
+all : basic$(EXEEXT) ctxswitch$(EXEEXT) mutex$(EXEEXT) schedint$(EXEEXT) schedext$(EXEEXT) creation$(EXEEXT)
+
+basic_loop_DURATION = 15000000000
+basic_function_DURATION = 10000000000
+basic_tls_fetch_add_DURATION = 10000000000
+basic_DURATION = 250000000
+
+ctxswitch_pthread_DURATION = 25000000
+ctxswitch_rust_thread_DURATION = $(ctxswitch_pthread_DURATION)
+ctxswitch_cfa_generator_DURATION = 5000000000
+ctxswitch_nodejs_await_DURATION = 5000000
+ctxswitch_DURATION = 100000000
+
+#mutex_java_DURATION = 10000000
+mutex_DURATION = 50000000
+
+schedint_pthread_DURATION = 1000000
+schedint_java_DURATION = $(schedint_pthread_DURATION)
+schedint_rust_DURATION = $(schedint_pthread_DURATION)
+schedint_DURATION = 10000000
+
+schedext_DURATION = 10000000
+
+creation_pthread_DURATION = 250000
+creation_rust_thread_DURATION = ${creation_pthread_DURATION}
+creation_java_thread_DURATION = ${creation_pthread_DURATION}
+creation_cfa_coroutine_DURATION = 100000000
+creation_cfa_coroutine_eager_DURATION = 10000000
+creation_upp_coroutine_DURATION = ${creation_cfa_coroutine_eager_DURATION}
+creation_cfa_thread_DURATION = 10000000
+creation_upp_thread_DURATION = ${creation_cfa_thread_DURATION}
+creation_DURATION = 10000000
 
 %.run : %$(EXEEXT) ${REPEAT}
-	@rm -f .result.log
-	@echo "------------------------------------------------------"
-	@echo $<
-	@${REPEAT} ${repeats} ./a.out | tee -a .result.log
-	@${STATS} .result.log
-	@echo "------------------------------------------------------"
-	@rm -f a.out .result.log *.class
+	rm -f .result.log
+	echo "------------------------------------------------------"
+	echo $<
+	${REPEAT} ${repeats} -- ./a.out\
+		$(if ${$(subst -,_,$(basename $@))_DURATION},\
+			${$(subst -,_,$(basename $@))_DURATION},\
+			${$(firstword $(subst -, ,$(basename $@)))_DURATION}) | tee -a .result.log
+	${STATS} .result.log
+	echo "------------------------------------------------------"
+	rm -f a.out .result.log *.class
+
+#	${REPEAT} ${repeats} -- /usr/bin/time -f "%Uu %Ss %Er %Mkb" ./a.out
 
 %.runquiet :
-	@+make $(basename $@) CFLAGS="-w" __quiet=quiet
-	@taskset -c 1 ./a.out
-	@rm -f a.out
+	+make $(basename $@) CFLAGS="-w" __quiet=quiet
+	taskset -c 1 ./a.out
+	rm -f a.out
 
 %.make :
-	@printf "${PRINT_FORMAT}" $(basename $(subst compile-,,$@))
-	@+/usr/bin/time -f ${TIME_FORMAT} make $(basename $@) 2>&1
+	printf "${PRINT_FORMAT}" $(basename $(subst compile-,,$@))
+	+/usr/bin/time -f ${TIME_FORMAT} make $(basename $@) 2>&1
 
 ${REPEAT} :
-	@+make -C ${abs_top_builddir}/tools repeat
+	+make -C ${abs_top_builddir}/tools repeat
 
 ## =========================================================================================================
@@ -100,86 +144,101 @@
 jenkins$(EXEEXT):
 @DOifskipcompile@
-	@+make compile.csv
-	@-+make compile.diff.csv
+	+make compile.csv
+	-+make compile.diff.csv
 @DOendif@
-	@+make ctxswitch.csv
-	@-+make ctxswitch.diff.csv
-	@+make mutex.csv
-	@-+make mutex.diff.csv
-	@+make signal.csv
-	@-+make signal.diff.csv
+	+make basic.csv
+	-+make basic.diff.csv
+	+make ctxswitch.csv
+	-+make ctxswitch.diff.csv
+	+make mutex.csv
+	-+make mutex.diff.csv
+	+make schedint.csv
+	-+make schedint.diff.csv
 @DOifskipcompile@
 	cat compile.csv
 	-cat compile.diff.csv
 @DOendif@
+	cat basic.csv
+	-cat basic.diff.csv
 	cat ctxswitch.csv
 	-cat ctxswitch.diff.csv
 	cat mutex.csv
 	-cat mutex.diff.csv
-	cat signal.csv
-	-cat signal.diff.csv
+	cat schedint.csv
+	-cat schedint.diff.csv
 
 compile.csv:
-	@echo "array,attributes,empty,expression,io,monitor,operators,typeof" > $@
-	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-array.make >> $@
-	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-attributes.make >> $@
-	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-empty.make >> $@
-	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-expression.make >> $@
-	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-io.make >> $@
-	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-monitor.make >> $@
-	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-operators.make >> $@
-	@+make TIME_FORMAT='%e' PRINT_FORMAT='' compile-typeof.make >> $@
-	@$(srcdir)/fixcsv.sh $@
+	echo "array,attributes,empty,expression,io,monitor,operators,typeof" > $@
+	+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-array.make >> $@
+	+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-attributes.make >> $@
+	+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-empty.make >> $@
+	+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-expression.make >> $@
+	+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-io.make >> $@
+	+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-monitor.make >> $@
+	+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-operators.make >> $@
+	+make TIME_FORMAT='%e' PRINT_FORMAT='' compile-typeof.make >> $@
+	$(srcdir)/fixcsv.sh $@
+
+basic.csv:
+	echo "generator,coroutine,thread" > $@
+	+make basic-cfa_generator.runquiet >> $@ && echo -n ',' >> $@
+	+make basic-cfa_coroutine.runquiet >> $@ && echo -n ',' >> $@
+	+make basic-cfa_thread.runquiet >> $@
+	$(srcdir)/fixcsv.sh $@
 
 ctxswitch.csv:
-	@echo "generator,coroutine,thread" > $@
-	@+make ctxswitch-cfa_generator.runquiet >> $@ && echo -n ',' >> $@
-	@+make ctxswitch-cfa_coroutine.runquiet >> $@ && echo -n ',' >> $@
-	@+make ctxswitch-cfa_thread.runquiet >> $@
-	@$(srcdir)/fixcsv.sh $@
+	echo "generator,coroutine,thread" > $@
+	+make ctxswitch-cfa_generator.runquiet >> $@ && echo -n ',' >> $@
+	+make ctxswitch-cfa_coroutine.runquiet >> $@ && echo -n ',' >> $@
+	+make ctxswitch-cfa_thread.runquiet >> $@
+	$(srcdir)/fixcsv.sh $@
 
 mutex.csv:
-	@echo "1-monitor,2-monitor" > $@
-	@+make mutex-cfa1.runquiet >> $@ && echo -n ',' >> $@
-	@+make mutex-cfa2.runquiet >> $@
-	@$(srcdir)/fixcsv.sh $@
-
-signal.csv:
-	@echo "signal-1,signal-2,waitfor-1,waitfor-2" > $@
-	@+make signal-cfa1.runquiet >> $@ && echo -n ',' >> $@
-	@+make signal-cfa2.runquiet >> $@ && echo -n ',' >> $@
-	@+make waitfor-cfa1.runquiet >> $@ && echo -n ',' >> $@
-	@+make waitfor-cfa2.runquiet >> $@
-	@$(srcdir)/fixcsv.sh $@
+	echo "1-monitor,2-monitor" > $@
+	+make mutex-cfa1.runquiet >> $@ && echo -n ',' >> $@
+	+make mutex-cfa2.runquiet >> $@
+	$(srcdir)/fixcsv.sh $@
+
+schedint.csv:
+	echo "schedint-1,schedint-2,schedext-1,schedext-2" > $@
+	+make schedint-cfa1.runquiet >> $@ && echo -n ',' >> $@
+	+make schedint-cfa2.runquiet >> $@ && echo -n ',' >> $@
+	+make schedext-cfa1.runquiet >> $@ && echo -n ',' >> $@
+	+make schedext-cfa2.runquiet >> $@
+	$(srcdir)/fixcsv.sh $@
 
 %.diff.csv: %.csv
-	@test -e $(srcdir)/baselines/$(arch)/$< || (echo "Error : Missing baseline for ${<}" && false)
-	@$(srcdir)/baselines/calc.py $(srcdir)/baselines/$(arch)/$(<) $(<) > $@
-
-
-## =========================================================================================================
-loop$(EXEEXT):
-	$(BENCH_V_CC)$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/loop.c
-
-function$(EXEEXT):
-	$(BENCH_V_CC)$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/function.c
-
-fetch_add$(EXEEXT):
-	$(BENCH_V_CC)$(COMPILE) -DBENCH_N=500000000  $(srcdir)/fetch_add.c
-
-ttst_lock$(EXEEXT):
-	$(BENCH_V_CC)$(COMPILE) -DBENCH_N=500000000  $(srcdir)/ttst_lock.c
-
-tls-fetch_add$(EXEEXT):
-	$(BENCH_V_CC)$(COMPILE) -DBENCH_N=500000000  $(srcdir)/tls-fetch_add.c
-
-## =========================================================================================================
-CTXSWITCH_DEPEND  =                 \
-	loop.run				\
-	function.run			\
-	fetch_add.run			\
-	ttst_lock.run			\
-	tls-fetch_add.run			\
-	ctxswitch-pthread.run		\
+	test -e $(srcdir)/baselines/$(arch)/$< || (echo "Error : Missing baseline for ${<}" && false)
+	$(srcdir)/baselines/calc.py $(srcdir)/baselines/$(arch)/$(<) $(<) > $@
+
+## =========================================================================================================
+
+BASIC_DEPEND  =					\
+	basic-loop.run				\
+	basic-function.run			\
+	basic-fetch_add.run			\
+	basic-ttst_lock.run			\
+	basic-tls-fetch_add.run
+
+basic-loop$(EXEEXT):
+	$(BENCH_V_CC)$(COMPILE) $(srcdir)/basic/loop.c
+
+basic-function$(EXEEXT):
+	$(BENCH_V_CC)$(COMPILE) $(srcdir)/basic/function.c
+
+basic-fetch_add$(EXEEXT):
+	$(BENCH_V_CC)$(COMPILE) $(srcdir)/basic/fetch_add.c
+
+basic-ttst_lock$(EXEEXT):
+	$(BENCH_V_CC)$(COMPILE) $(srcdir)/basic/ttst_lock.c
+
+basic-tls-fetch_add$(EXEEXT):
+	$(BENCH_V_CC)$(COMPILE) $(srcdir)/basic/tls_fetch_add.c
+
+basic$(EXEEXT): $(BASIC_DEPEND)
+
+## =========================================================================================================
+
+CTXSWITCH_DEPEND  =			\
 	ctxswitch-cfa_generator.run	\
 	ctxswitch-cfa_coroutine.run	\
@@ -188,13 +247,17 @@
 	ctxswitch-upp_coroutine.run	\
 	ctxswitch-upp_thread.run	\
-	ctxswitch-goroutine.run		\
-	ctxswitch-java_thread.run
-
+	ctxswitch-python_coroutine.run	\
+	ctxswitch-nodejs_coroutine.run	\
+	ctxswitch-nodejs_await.run	\
+	ctxswitch-goroutine_thread.run	\
+	ctxswitch-rust_thread.run	\
+	ctxswitch-nodejs_coroutine.run	\
+	ctxswitch-java_thread.run	\
+	ctxswitch-pthread.run
 
 if WITH_LIBFIBRE
-CTXSWITCH_DEPEND  +=           \
-	ctxswitch-kos_fibre.run	 \
+CTXSWITCH_DEPEND  +=			\
+	ctxswitch-kos_fibre.run		\
 	ctxswitch-kos_fibre2.run
-
 
 ctxswitch-kos_fibre$(EXEEXT):
@@ -207,120 +270,155 @@
 ctxswitch$(EXEEXT): $(CTXSWITCH_DEPEND)
 
-ctxswitch-pthread$(EXEEXT):
-	$(BENCH_V_CC)$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/ctxswitch/pthreads.c
-
 ctxswitch-cfa_generator$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_gen.cfa
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/ctxswitch/cfa_gen.cfa
 
 ctxswitch-cfa_coroutine$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_cor.cfa
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/ctxswitch/cfa_cor.cfa
 
 ctxswitch-cfa_thread$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd.cfa
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/ctxswitch/cfa_thrd.cfa
 
 ctxswitch-cfa_thread2$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd2.cfa
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/ctxswitch/cfa_thrd2.cfa
 
 ctxswitch-upp_coroutine$(EXEEXT):
-	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_cor.cc
+	$(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/ctxswitch/upp_cor.cc
 
 ctxswitch-upp_thread$(EXEEXT):
-	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_thrd.cc
-
-ctxswitch-goroutine$(EXEEXT):
+	$(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/ctxswitch/upp_thrd.cc
+
+ctxswitch-python_coroutine$(EXEEXT):
+	echo "#!/bin/sh" > a.out
+	echo "python3.7 $(srcdir)/ctxswitch/python_cor.py" >> a.out
+	chmod a+x a.out
+
+ctxswitch-nodejs_coroutine$(EXEEXT):
+	echo "#!/bin/sh" > a.out
+	echo "nodejs $(srcdir)/ctxswitch/node_cor.js" >> a.out
+	chmod a+x a.out
+
+ctxswitch-nodejs_await$(EXEEXT):
+	echo "#!/bin/sh" > a.out
+	echo "nodejs $(srcdir)/ctxswitch/node_await.js" >> a.out
+	chmod a+x a.out
+
+ctxswitch-goroutine_thread$(EXEEXT):
 	$(BENCH_V_GOC)go build -o a.out $(srcdir)/ctxswitch/goroutine.go
+
+ctxswitch-rust_thread$(EXEEXT):
+	$(BENCH_V_RUSTC)rustc -C opt-level=3 -o a.out $(srcdir)/ctxswitch/rust_thrd.rs
 
 ctxswitch-java_thread$(EXEEXT):
 	$(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/ctxswitch/JavaThread.java
-	@echo "#!/bin/sh" > a.out
-	@echo "java JavaThread" >> a.out
-	@chmod a+x a.out
-
-## =========================================================================================================
-mutex$(EXEEXT) :\
-	loop.run			\
-	function.run		\
-	fetch_add.run		\
-	mutex-pthread_lock.run	\
-	mutex-upp.run		\
+	echo "#!/bin/sh" > a.out
+	echo "java JavaThread" >> a.out
+	chmod a+x a.out
+
+ctxswitch-pthread$(EXEEXT):
+	$(BENCH_V_CC)$(COMPILE) $(srcdir)/ctxswitch/pthreads.c
+
+## =========================================================================================================
+
+mutex$(EXEEXT) :		\
 	mutex-cfa1.run		\
 	mutex-cfa2.run		\
 	mutex-cfa4.run		\
-	mutex-java_thread.run
-
-mutex-pthread_lock$(EXEEXT):
-	$(BENCH_V_CC)$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/mutex/pthreads.c
+	mutex-upp.run		\
+	mutex-go.run		\
+	mutex-rust.run		\
+	mutex-java.run		\
+	mutex-pthread.run
+
+mutex-pthread$(EXEEXT):
+	$(BENCH_V_CC)$(COMPILE) $(srcdir)/mutex/pthreads.c
+
+mutex-cfa1$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/mutex/cfa1.cfa
+
+mutex-cfa2$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/mutex/cfa2.cfa
+
+mutex-cfa4$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/mutex/cfa4.cfa
 
 mutex-upp$(EXEEXT):
-	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/mutex/upp.cc
-
-mutex-cfa1$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa1.cfa
-
-mutex-cfa2$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa2.cfa
-
-mutex-cfa4$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa4.cfa
-
-mutex-java_thread$(EXEEXT):
+	$(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/mutex/upp.cc
+
+mutex-go$(EXEEXT):
+	$(BENCH_V_GOC)go build -o a.out $(srcdir)/mutex/goroutine.go
+
+mutex-rust$(EXEEXT):
+	$(BENCH_V_RUSTC)rustc -C opt-level=3 -o a.out $(srcdir)/mutex/rust.rs
+
+mutex-java$(EXEEXT):
 	$(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/mutex/JavaThread.java
-	@echo "#!/bin/sh" > a.out
-	@echo "java JavaThread" >> a.out
-	@chmod a+x a.out
-
-## =========================================================================================================
-signal$(EXEEXT) :\
-	signal-pthread_cond.run \
-	signal-upp.run		\
-	signal-cfa1.run		\
-	signal-cfa2.run		\
-	signal-cfa4.run		\
-	signal-java_thread.run
-
-signal-pthread_cond$(EXEEXT):
-	$(BENCH_V_CC)$(COMPILE)    -DBENCH_N=500000  $(srcdir)/schedint/pthreads.c
-
-signal-upp$(EXEEXT):
-	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedint/upp.cc
-
-signal-cfa1$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa1.cfa
-
-signal-cfa2$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa2.cfa
-
-signal-cfa4$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa4.cfa
-
-signal-java_thread$(EXEEXT):
+	echo "#!/bin/sh" > a.out
+	echo "java JavaThread" >> a.out
+	chmod a+x a.out
+
+## =========================================================================================================
+
+schedint$(EXEEXT) :		\
+	schedint-cfa1.run	\
+	schedint-cfa2.run	\
+	schedint-cfa4.run	\
+	schedint-upp.run	\
+	schedint-rust.run	\
+	schedint-java.run	\
+	schedint-pthread.run
+
+schedint-cfa1$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa1.cfa
+
+schedint-cfa2$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa2.cfa
+
+schedint-cfa4$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa4.cfa
+
+schedint-upp$(EXEEXT):
+	$(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/schedint/upp.cc
+
+schedint-rust$(EXEEXT):
+	$(BENCH_V_RUSTC)rustc -C opt-level=3 -o a.out $(srcdir)/schedint/rust.rs
+
+schedint-java$(EXEEXT):
 	$(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/schedint/JavaThread.java
-	@echo "#!/bin/sh" > a.out
-	@echo "java JavaThread" >> a.out
-	@chmod a+x a.out
-
-
-## =========================================================================================================
-waitfor$(EXEEXT) :\
-	waitfor-upp.run		\
-	waitfor-cfa1.run		\
-	waitfor-cfa2.run		\
-	waitfor-cfa4.run
-
-waitfor-upp$(EXEEXT):
-	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedext/upp.cc
-
-waitfor-cfa1$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa1.cfa
-
-waitfor-cfa2$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa2.cfa
-
-waitfor-cfa4$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa4.cfa
-
-## =========================================================================================================
-creation$(EXEEXT) :\
-	creation-pthread.run			\
+	echo "#!/bin/sh" > a.out
+	echo "java JavaThread" >> a.out
+	chmod a+x a.out
+
+schedint-pthread$(EXEEXT):
+	$(BENCH_V_CC)$(COMPILE) $(srcdir)/schedint/pthreads.c
+
+## =========================================================================================================
+
+schedext$(EXEEXT) :		\
+	schedext-cfa1.run	\
+	schedext-cfa2.run	\
+	schedext-cfa4.run	\
+	schedext-upp.run	\
+	schedext-goroutine.run
+
+schedext-cfa1$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa1.cfa
+
+schedext-cfa2$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa2.cfa
+
+schedext-cfa4$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa4.cfa
+
+schedext-upp$(EXEEXT):
+	$(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/schedext/upp.cc
+
+schedext-goroutine$(EXEEXT):
+	$(BENCH_V_GOC)go build -o a.out $(srcdir)/schedext/goroutine.go
+
+
+## =========================================================================================================
+
+creation$(EXEEXT) :				\
+	creation-cfa_generator.run		\
 	creation-cfa_coroutine.run		\
 	creation-cfa_coroutine_eager.run	\
@@ -328,37 +426,57 @@
 	creation-upp_coroutine.run		\
 	creation-upp_thread.run			\
-	creation-goroutine.run			\
-	creation-java_thread.run
+	creation-python_coroutine.run		\
+	creation-nodejs_coroutine.run		\
+	creation-goroutine_thread.run		\
+	creation-rust_thread.run		\
+	creation-java_thread.run		\
+	creation-pthread.run
+
+creation-cfa_generator$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/creation/cfa_gen.cfa
 
 creation-cfa_coroutine$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.cfa
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/creation/cfa_cor.cfa
 
 creation-cfa_coroutine_eager$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.cfa  -DEAGER
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/creation/cfa_cor.cfa  -DEAGER
 
 creation-cfa_thread$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_thrd.cfa
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/creation/cfa_thrd.cfa
 
 creation-upp_coroutine$(EXEEXT):
-	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_cor.cc
+	$(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/creation/upp_cor.cc
 
 creation-upp_thread$(EXEEXT):
-	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_thrd.cc
-
-creation-pthread$(EXEEXT):
-	$(BENCH_V_CC)$(COMPILE)    -DBENCH_N=250000   $(srcdir)/creation/pthreads.c
-
-creation-goroutine$(EXEEXT):
+	$(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/creation/upp_thrd.cc
+
+creation-python_coroutine$(EXEEXT):
+	echo "#!/bin/sh" > a.out
+	echo "python3.7 $(srcdir)/creation/python_cor.py" >> a.out
+	chmod a+x a.out
+
+creation-nodejs_coroutine$(EXEEXT):
+	echo "#!/bin/sh" > a.out
+	echo "nodejs $(srcdir)/creation/node_cor.js" >> a.out
+	chmod a+x a.out
+
+creation-goroutine_thread$(EXEEXT):
 	$(BENCH_V_GOC)go build -o a.out $(srcdir)/creation/goroutine.go
+
+creation-rust_thread$(EXEEXT):
+	$(BENCH_V_RUSTC)rustc -C opt-level=3 -o a.out $(srcdir)/creation/rust_thrd.rs
 
 creation-java_thread$(EXEEXT):
 	$(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/creation/JavaThread.java
-	@echo "#!/bin/sh" > a.out
-	@echo "java JavaThread" >> a.out
-	@chmod a+x a.out
-
-## =========================================================================================================
-
-compile$(EXEEXT) :\
+	echo "#!/bin/sh" > a.out
+	echo "java JavaThread" >> a.out
+	chmod a+x a.out
+
+creation-pthread$(EXEEXT):
+	$(BENCH_V_CC)$(COMPILE) $(srcdir)/creation/pthreads.c
+
+## =========================================================================================================
+
+compile$(EXEEXT) :		\
 	compile-array.make	\
 	compile-attributes.make	\
@@ -370,31 +488,30 @@
 	compile-typeof.make
 
-
 testdir = $(top_srcdir)/tests
 
 compile-array$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/array.cfa
+	$(CFACOMPILE) -fsyntax-only -w $(testdir)/array.cfa
 
 compile-attributes$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/attributes.cfa
+	$(CFACOMPILE) -fsyntax-only -w $(testdir)/attributes.cfa
 
 compile-empty$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(srcdir)/compile/empty.cfa
+	$(CFACOMPILE) -fsyntax-only -w $(srcdir)/compile/empty.cfa
 
 compile-expression$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/expression.cfa
+	$(CFACOMPILE) -fsyntax-only -w $(testdir)/expression.cfa
 
 compile-io$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/io1.cfa
+	$(CFACOMPILE) -fsyntax-only -w $(testdir)/io1.cfa
 
 compile-monitor$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/monitor.cfa
+	$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/monitor.cfa
 
 compile-operators$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/operators.cfa
+	$(CFACOMPILE) -fsyntax-only -w $(testdir)/operators.cfa
 
 compile-thread$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/thread.cfa
+	$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/thread.cfa
 
 compile-typeof$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/typeof.cfa
+	$(CFACOMPILE) -fsyntax-only -w $(testdir)/typeof.cfa
Index: benchmark/Makefile.in
===================================================================
--- benchmark/Makefile.in	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/Makefile.in	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -93,5 +93,5 @@
 EXTRA_PROGRAMS = dummy$(EXEEXT)
 @WITH_LIBFIBRE_TRUE@am__append_1 = \
-@WITH_LIBFIBRE_TRUE@	ctxswitch-kos_fibre.run	 \
+@WITH_LIBFIBRE_TRUE@	ctxswitch-kos_fibre.run		\
 @WITH_LIBFIBRE_TRUE@	ctxswitch-kos_fibre2.run
 
@@ -352,6 +352,5 @@
 LTCFACOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=compile $(CFACC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(CFAFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(AM_CFLAGS) $(CFAFLAGS) $(CFLAGS)
 
 AM_V_CFA = $(am__v_CFA_@AM_V@)
@@ -359,12 +358,4 @@
 am__v_CFA_0 = @echo "  CFA     " $@;
 am__v_CFA_1 = 
-AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
-am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
-am__v_JAVAC_0 = @echo "  JAVAC   " $@;
-am__v_JAVAC_1 = 
-AM_V_GOC = $(am__v_GOC_@AM_V@)
-am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
-am__v_GOC_0 = @echo "  GOC     " $@;
-am__v_GOC_1 = 
 UPPCC = u++
 UPPCOMPILE = $(UPPCC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_UPPFLAGS) $(UPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -373,4 +364,20 @@
 am__v_UPP_0 = @echo "  UPP     " $@;
 am__v_UPP_1 = 
+AM_V_GOC = $(am__v_GOC_@AM_V@)
+am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
+am__v_GOC_0 = @echo "  GOC     " $@;
+am__v_GOC_1 = 
+AM_V_RUST = $(am__v_RUST_@AM_V@)
+am__v_RUST_ = $(am__v_RUST_@AM_DEFAULT_V@)
+am__v_RUST_0 = @echo "  RUST     " $@;
+am__v_RUST_1 = 
+AM_V_NODEJS = $(am__v_NODEJS_@AM_V@)
+am__v_NODEJS_ = $(am__v_NODEJS_@AM_DEFAULT_V@)
+am__v_NODEJS_0 = @echo "  NODEJS     " $@;
+am__v_NODEJS_1 = 
+AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
+am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
+am__v_JAVAC_0 = @echo "  JAVAC   " $@;
+am__v_JAVAC_1 = 
 
 # applies to both programs
@@ -381,25 +388,30 @@
 BENCH_V_CFA = $(__bench_v_CFA_$(__quiet))
 BENCH_V_CXX = $(__bench_v_CXX_$(__quiet))
+BENCH_V_UPP = $(__bench_v_UPP_$(__quiet))
 BENCH_V_GOC = $(__bench_v_GOC_$(__quiet))
+BENCH_V_RUSTC = $(__bench_v_RUSTC_$(__quiet))
+BENCH_V_NODEJS = $(__bench_v_NODEJS_$(__quiet))
 BENCH_V_JAVAC = $(__bench_v_JAVAC_$(__quiet))
-BENCH_V_UPP = $(__bench_v_UPP_$(__quiet))
 __quiet = verbose
 __bench_v_CC_quiet = @
 __bench_v_CFA_quiet = @
 __bench_v_CXX_quiet = @
+__bench_v_UPP_quiet = @
 __bench_v_GOC_quiet = @
+__bench_v_RUSTC_quiet = @
 __bench_v_JAVAC_quiet = @
-__bench_v_UPP_quiet = @
 __bench_v_CC_verbose = $(AM_V_CC)
 __bench_v_CFA_verbose = $(AM_V_CFA)
 __bench_v_CXX_verbose = $(AM_V_CXX)
+__bench_v_UPP_verbose = $(AM_V_UPP)
 __bench_v_GOC_verbose = $(AM_V_GOC)
+__bench_v_RUSTC_verbose = $(AM_V_RUSTC)
+__bench_v_NODEJS_verbose = $(AM_V_NODEJS)
 __bench_v_JAVAC_verbose = $(AM_V_JAVAC)
-__bench_v_UPP_verbose = $(AM_V_UPP)
 TOOLSDIR = ${abs_top_builddir}/tools/
 REPEAT = ${abs_top_builddir}/tools/repeat
 STATS = ${abs_top_srcdir}/tools/stat.py
 # NEED AT LEAST 4 DATA VALUES FOR BENCHMARKS BECAUSE THE MAX AND MIN VALUES ARE REMOVED
-repeats = 5 # 31 for benchmarks
+repeats = 13 # 31 for benchmarks
 arch = x64
 skipcompile = no
@@ -407,12 +419,46 @@
 PRINT_FORMAT = %20s: #Comments needed for spacing
 dummy_SOURCES = dummyC.c dummyCXX.cpp
+basic_loop_DURATION = 15000000000
+basic_function_DURATION = 10000000000
+basic_tls_fetch_add_DURATION = 10000000000
+basic_DURATION = 250000000
+ctxswitch_pthread_DURATION = 25000000
+ctxswitch_rust_thread_DURATION = $(ctxswitch_pthread_DURATION)
+ctxswitch_cfa_generator_DURATION = 5000000000
+ctxswitch_nodejs_await_DURATION = 5000000
+ctxswitch_DURATION = 100000000
+
+#mutex_java_DURATION = 10000000
+mutex_DURATION = 50000000
+schedint_pthread_DURATION = 1000000
+schedint_java_DURATION = $(schedint_pthread_DURATION)
+schedint_rust_DURATION = $(schedint_pthread_DURATION)
+schedint_DURATION = 10000000
+schedext_DURATION = 10000000
+creation_pthread_DURATION = 250000
+creation_rust_thread_DURATION = ${creation_pthread_DURATION}
+creation_java_thread_DURATION = ${creation_pthread_DURATION}
+creation_cfa_coroutine_DURATION = 100000000
+creation_cfa_coroutine_eager_DURATION = 10000000
+creation_upp_coroutine_DURATION = ${creation_cfa_coroutine_eager_DURATION}
+creation_cfa_thread_DURATION = 10000000
+creation_upp_thread_DURATION = ${creation_cfa_thread_DURATION}
+creation_DURATION = 10000000
 FIX_NEW_LINES = cat $@ | tr "\n" "\t" | sed -r 's/\t,/,/' | tr "\t" "\n" > $@
-CTXSWITCH_DEPEND = loop.run function.run fetch_add.run ttst_lock.run \
-	tls-fetch_add.run ctxswitch-pthread.run \
-	ctxswitch-cfa_generator.run ctxswitch-cfa_coroutine.run \
-	ctxswitch-cfa_thread.run ctxswitch-cfa_thread2.run \
-	ctxswitch-upp_coroutine.run ctxswitch-upp_thread.run \
-	ctxswitch-goroutine.run ctxswitch-java_thread.run \
-	$(am__append_1)
+BASIC_DEPEND = \
+	basic-loop.run				\
+	basic-function.run			\
+	basic-fetch_add.run			\
+	basic-ttst_lock.run			\
+	basic-tls-fetch_add.run
+
+CTXSWITCH_DEPEND = ctxswitch-cfa_generator.run \
+	ctxswitch-cfa_coroutine.run ctxswitch-cfa_thread.run \
+	ctxswitch-cfa_thread2.run ctxswitch-upp_coroutine.run \
+	ctxswitch-upp_thread.run ctxswitch-python_coroutine.run \
+	ctxswitch-nodejs_coroutine.run ctxswitch-nodejs_await.run \
+	ctxswitch-goroutine_thread.run ctxswitch-rust_thread.run \
+	ctxswitch-nodejs_coroutine.run ctxswitch-java_thread.run \
+	ctxswitch-pthread.run $(am__append_1)
 testdir = $(top_srcdir)/tests
 all: all-am
@@ -733,108 +779,128 @@
 
 dummyC.c:
-	@echo "int main() { return 0; }" > ${@}
+	echo "int main() { return 0; }" > ${@}
 
 dummyCXX.cpp:
-	@echo "int main() { return 0; }" > ${@}
-
+	echo "int main() { return 0; }" > ${@}
+
+#.SILENT:		# do not print recipe
+.ONESHELL:		# use one shell to execute recipe
 .NOTPARALLEL:
-.PHONY: compile.csv ctxswitch.csv mutex.csv signal.csv
-
-all : ctxswitch$(EXEEXT) mutex$(EXEEXT) signal$(EXEEXT) waitfor$(EXEEXT) creation$(EXEEXT)
+.PHONY: compile.csv basic.csv ctxswitch.csv mutex.csv schedint.csv
+
+all : basic$(EXEEXT) ctxswitch$(EXEEXT) mutex$(EXEEXT) schedint$(EXEEXT) schedext$(EXEEXT) creation$(EXEEXT)
 
 %.run : %$(EXEEXT) ${REPEAT}
-	@rm -f .result.log
-	@echo "------------------------------------------------------"
-	@echo $<
-	@${REPEAT} ${repeats} ./a.out | tee -a .result.log
-	@${STATS} .result.log
-	@echo "------------------------------------------------------"
-	@rm -f a.out .result.log *.class
+	rm -f .result.log
+	echo "------------------------------------------------------"
+	echo $<
+	${REPEAT} ${repeats} -- ./a.out\
+		$(if ${$(subst -,_,$(basename $@))_DURATION},\
+			${$(subst -,_,$(basename $@))_DURATION},\
+			${$(firstword $(subst -, ,$(basename $@)))_DURATION}) | tee -a .result.log
+	${STATS} .result.log
+	echo "------------------------------------------------------"
+	rm -f a.out .result.log *.class
+
+#	${REPEAT} ${repeats} -- /usr/bin/time -f "%Uu %Ss %Er %Mkb" ./a.out
 
 %.runquiet :
-	@+make $(basename $@) CFLAGS="-w" __quiet=quiet
-	@taskset -c 1 ./a.out
-	@rm -f a.out
+	+make $(basename $@) CFLAGS="-w" __quiet=quiet
+	taskset -c 1 ./a.out
+	rm -f a.out
 
 %.make :
-	@printf "${PRINT_FORMAT}" $(basename $(subst compile-,,$@))
-	@+/usr/bin/time -f ${TIME_FORMAT} make $(basename $@) 2>&1
+	printf "${PRINT_FORMAT}" $(basename $(subst compile-,,$@))
+	+/usr/bin/time -f ${TIME_FORMAT} make $(basename $@) 2>&1
 
 ${REPEAT} :
-	@+make -C ${abs_top_builddir}/tools repeat
+	+make -C ${abs_top_builddir}/tools repeat
 
 jenkins$(EXEEXT):
 @DOifskipcompile@
-	@+make compile.csv
-	@-+make compile.diff.csv
+	+make compile.csv
+	-+make compile.diff.csv
 @DOendif@
-	@+make ctxswitch.csv
-	@-+make ctxswitch.diff.csv
-	@+make mutex.csv
-	@-+make mutex.diff.csv
-	@+make signal.csv
-	@-+make signal.diff.csv
+	+make basic.csv
+	-+make basic.diff.csv
+	+make ctxswitch.csv
+	-+make ctxswitch.diff.csv
+	+make mutex.csv
+	-+make mutex.diff.csv
+	+make schedint.csv
+	-+make schedint.diff.csv
 @DOifskipcompile@
 	cat compile.csv
 	-cat compile.diff.csv
 @DOendif@
+	cat basic.csv
+	-cat basic.diff.csv
 	cat ctxswitch.csv
 	-cat ctxswitch.diff.csv
 	cat mutex.csv
 	-cat mutex.diff.csv
-	cat signal.csv
-	-cat signal.diff.csv
+	cat schedint.csv
+	-cat schedint.diff.csv
 
 compile.csv:
-	@echo "array,attributes,empty,expression,io,monitor,operators,typeof" > $@
-	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-array.make >> $@
-	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-attributes.make >> $@
-	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-empty.make >> $@
-	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-expression.make >> $@
-	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-io.make >> $@
-	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-monitor.make >> $@
-	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-operators.make >> $@
-	@+make TIME_FORMAT='%e' PRINT_FORMAT='' compile-typeof.make >> $@
-	@$(srcdir)/fixcsv.sh $@
+	echo "array,attributes,empty,expression,io,monitor,operators,typeof" > $@
+	+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-array.make >> $@
+	+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-attributes.make >> $@
+	+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-empty.make >> $@
+	+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-expression.make >> $@
+	+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-io.make >> $@
+	+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-monitor.make >> $@
+	+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-operators.make >> $@
+	+make TIME_FORMAT='%e' PRINT_FORMAT='' compile-typeof.make >> $@
+	$(srcdir)/fixcsv.sh $@
+
+basic.csv:
+	echo "generator,coroutine,thread" > $@
+	+make basic-cfa_generator.runquiet >> $@ && echo -n ',' >> $@
+	+make basic-cfa_coroutine.runquiet >> $@ && echo -n ',' >> $@
+	+make basic-cfa_thread.runquiet >> $@
+	$(srcdir)/fixcsv.sh $@
 
 ctxswitch.csv:
-	@echo "generator,coroutine,thread" > $@
-	@+make ctxswitch-cfa_generator.runquiet >> $@ && echo -n ',' >> $@
-	@+make ctxswitch-cfa_coroutine.runquiet >> $@ && echo -n ',' >> $@
-	@+make ctxswitch-cfa_thread.runquiet >> $@
-	@$(srcdir)/fixcsv.sh $@
+	echo "generator,coroutine,thread" > $@
+	+make ctxswitch-cfa_generator.runquiet >> $@ && echo -n ',' >> $@
+	+make ctxswitch-cfa_coroutine.runquiet >> $@ && echo -n ',' >> $@
+	+make ctxswitch-cfa_thread.runquiet >> $@
+	$(srcdir)/fixcsv.sh $@
 
 mutex.csv:
-	@echo "1-monitor,2-monitor" > $@
-	@+make mutex-cfa1.runquiet >> $@ && echo -n ',' >> $@
-	@+make mutex-cfa2.runquiet >> $@
-	@$(srcdir)/fixcsv.sh $@
-
-signal.csv:
-	@echo "signal-1,signal-2,waitfor-1,waitfor-2" > $@
-	@+make signal-cfa1.runquiet >> $@ && echo -n ',' >> $@
-	@+make signal-cfa2.runquiet >> $@ && echo -n ',' >> $@
-	@+make waitfor-cfa1.runquiet >> $@ && echo -n ',' >> $@
-	@+make waitfor-cfa2.runquiet >> $@
-	@$(srcdir)/fixcsv.sh $@
+	echo "1-monitor,2-monitor" > $@
+	+make mutex-cfa1.runquiet >> $@ && echo -n ',' >> $@
+	+make mutex-cfa2.runquiet >> $@
+	$(srcdir)/fixcsv.sh $@
+
+schedint.csv:
+	echo "schedint-1,schedint-2,schedext-1,schedext-2" > $@
+	+make schedint-cfa1.runquiet >> $@ && echo -n ',' >> $@
+	+make schedint-cfa2.runquiet >> $@ && echo -n ',' >> $@
+	+make schedext-cfa1.runquiet >> $@ && echo -n ',' >> $@
+	+make schedext-cfa2.runquiet >> $@
+	$(srcdir)/fixcsv.sh $@
 
 %.diff.csv: %.csv
-	@test -e $(srcdir)/baselines/$(arch)/$< || (echo "Error : Missing baseline for ${<}" && false)
-	@$(srcdir)/baselines/calc.py $(srcdir)/baselines/$(arch)/$(<) $(<) > $@
-
-loop$(EXEEXT):
-	$(BENCH_V_CC)$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/loop.c
-
-function$(EXEEXT):
-	$(BENCH_V_CC)$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/function.c
-
-fetch_add$(EXEEXT):
-	$(BENCH_V_CC)$(COMPILE) -DBENCH_N=500000000  $(srcdir)/fetch_add.c
-
-ttst_lock$(EXEEXT):
-	$(BENCH_V_CC)$(COMPILE) -DBENCH_N=500000000  $(srcdir)/ttst_lock.c
-
-tls-fetch_add$(EXEEXT):
-	$(BENCH_V_CC)$(COMPILE) -DBENCH_N=500000000  $(srcdir)/tls-fetch_add.c
+	test -e $(srcdir)/baselines/$(arch)/$< || (echo "Error : Missing baseline for ${<}" && false)
+	$(srcdir)/baselines/calc.py $(srcdir)/baselines/$(arch)/$(<) $(<) > $@
+
+basic-loop$(EXEEXT):
+	$(BENCH_V_CC)$(COMPILE) $(srcdir)/basic/loop.c
+
+basic-function$(EXEEXT):
+	$(BENCH_V_CC)$(COMPILE) $(srcdir)/basic/function.c
+
+basic-fetch_add$(EXEEXT):
+	$(BENCH_V_CC)$(COMPILE) $(srcdir)/basic/fetch_add.c
+
+basic-ttst_lock$(EXEEXT):
+	$(BENCH_V_CC)$(COMPILE) $(srcdir)/basic/ttst_lock.c
+
+basic-tls-fetch_add$(EXEEXT):
+	$(BENCH_V_CC)$(COMPILE) $(srcdir)/basic/tls_fetch_add.c
+
+basic$(EXEEXT): $(BASIC_DEPEND)
 
 @WITH_LIBFIBRE_TRUE@ctxswitch-kos_fibre$(EXEEXT):
@@ -846,115 +912,146 @@
 ctxswitch$(EXEEXT): $(CTXSWITCH_DEPEND)
 
-ctxswitch-pthread$(EXEEXT):
-	$(BENCH_V_CC)$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/ctxswitch/pthreads.c
-
 ctxswitch-cfa_generator$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_gen.cfa
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/ctxswitch/cfa_gen.cfa
 
 ctxswitch-cfa_coroutine$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_cor.cfa
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/ctxswitch/cfa_cor.cfa
 
 ctxswitch-cfa_thread$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd.cfa
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/ctxswitch/cfa_thrd.cfa
 
 ctxswitch-cfa_thread2$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd2.cfa
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/ctxswitch/cfa_thrd2.cfa
 
 ctxswitch-upp_coroutine$(EXEEXT):
-	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_cor.cc
+	$(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/ctxswitch/upp_cor.cc
 
 ctxswitch-upp_thread$(EXEEXT):
-	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_thrd.cc
-
-ctxswitch-goroutine$(EXEEXT):
+	$(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/ctxswitch/upp_thrd.cc
+
+ctxswitch-python_coroutine$(EXEEXT):
+	echo "#!/bin/sh" > a.out
+	echo "python3.7 $(srcdir)/ctxswitch/python_cor.py" >> a.out
+	chmod a+x a.out
+
+ctxswitch-nodejs_coroutine$(EXEEXT):
+	echo "#!/bin/sh" > a.out
+	echo "nodejs $(srcdir)/ctxswitch/node_cor.js" >> a.out
+	chmod a+x a.out
+
+ctxswitch-nodejs_await$(EXEEXT):
+	echo "#!/bin/sh" > a.out
+	echo "nodejs $(srcdir)/ctxswitch/node_await.js" >> a.out
+	chmod a+x a.out
+
+ctxswitch-goroutine_thread$(EXEEXT):
 	$(BENCH_V_GOC)go build -o a.out $(srcdir)/ctxswitch/goroutine.go
+
+ctxswitch-rust_thread$(EXEEXT):
+	$(BENCH_V_RUSTC)rustc -C opt-level=3 -o a.out $(srcdir)/ctxswitch/rust_thrd.rs
 
 ctxswitch-java_thread$(EXEEXT):
 	$(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/ctxswitch/JavaThread.java
-	@echo "#!/bin/sh" > a.out
-	@echo "java JavaThread" >> a.out
-	@chmod a+x a.out
-
-mutex$(EXEEXT) :\
-	loop.run			\
-	function.run		\
-	fetch_add.run		\
-	mutex-pthread_lock.run	\
-	mutex-upp.run		\
+	echo "#!/bin/sh" > a.out
+	echo "java JavaThread" >> a.out
+	chmod a+x a.out
+
+ctxswitch-pthread$(EXEEXT):
+	$(BENCH_V_CC)$(COMPILE) $(srcdir)/ctxswitch/pthreads.c
+
+mutex$(EXEEXT) :		\
 	mutex-cfa1.run		\
 	mutex-cfa2.run		\
 	mutex-cfa4.run		\
-	mutex-java_thread.run
-
-mutex-pthread_lock$(EXEEXT):
-	$(BENCH_V_CC)$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/mutex/pthreads.c
+	mutex-upp.run		\
+	mutex-go.run		\
+	mutex-rust.run		\
+	mutex-java.run		\
+	mutex-pthread.run
+
+mutex-pthread$(EXEEXT):
+	$(BENCH_V_CC)$(COMPILE) $(srcdir)/mutex/pthreads.c
+
+mutex-cfa1$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/mutex/cfa1.cfa
+
+mutex-cfa2$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/mutex/cfa2.cfa
+
+mutex-cfa4$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/mutex/cfa4.cfa
 
 mutex-upp$(EXEEXT):
-	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/mutex/upp.cc
-
-mutex-cfa1$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa1.cfa
-
-mutex-cfa2$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa2.cfa
-
-mutex-cfa4$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa4.cfa
-
-mutex-java_thread$(EXEEXT):
+	$(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/mutex/upp.cc
+
+mutex-go$(EXEEXT):
+	$(BENCH_V_GOC)go build -o a.out $(srcdir)/mutex/goroutine.go
+
+mutex-rust$(EXEEXT):
+	$(BENCH_V_RUSTC)rustc -C opt-level=3 -o a.out $(srcdir)/mutex/rust.rs
+
+mutex-java$(EXEEXT):
 	$(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/mutex/JavaThread.java
-	@echo "#!/bin/sh" > a.out
-	@echo "java JavaThread" >> a.out
-	@chmod a+x a.out
-
-signal$(EXEEXT) :\
-	signal-pthread_cond.run \
-	signal-upp.run		\
-	signal-cfa1.run		\
-	signal-cfa2.run		\
-	signal-cfa4.run		\
-	signal-java_thread.run
-
-signal-pthread_cond$(EXEEXT):
-	$(BENCH_V_CC)$(COMPILE)    -DBENCH_N=500000  $(srcdir)/schedint/pthreads.c
-
-signal-upp$(EXEEXT):
-	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedint/upp.cc
-
-signal-cfa1$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa1.cfa
-
-signal-cfa2$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa2.cfa
-
-signal-cfa4$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa4.cfa
-
-signal-java_thread$(EXEEXT):
+	echo "#!/bin/sh" > a.out
+	echo "java JavaThread" >> a.out
+	chmod a+x a.out
+
+schedint$(EXEEXT) :		\
+	schedint-cfa1.run	\
+	schedint-cfa2.run	\
+	schedint-cfa4.run	\
+	schedint-upp.run	\
+	schedint-rust.run	\
+	schedint-java.run	\
+	schedint-pthread.run
+
+schedint-cfa1$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa1.cfa
+
+schedint-cfa2$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa2.cfa
+
+schedint-cfa4$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa4.cfa
+
+schedint-upp$(EXEEXT):
+	$(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/schedint/upp.cc
+
+schedint-rust$(EXEEXT):
+	$(BENCH_V_RUSTC)rustc -C opt-level=3 -o a.out $(srcdir)/schedint/rust.rs
+
+schedint-java$(EXEEXT):
 	$(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/schedint/JavaThread.java
-	@echo "#!/bin/sh" > a.out
-	@echo "java JavaThread" >> a.out
-	@chmod a+x a.out
-
-waitfor$(EXEEXT) :\
-	waitfor-upp.run		\
-	waitfor-cfa1.run		\
-	waitfor-cfa2.run		\
-	waitfor-cfa4.run
-
-waitfor-upp$(EXEEXT):
-	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedext/upp.cc
-
-waitfor-cfa1$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa1.cfa
-
-waitfor-cfa2$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa2.cfa
-
-waitfor-cfa4$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa4.cfa
-
-creation$(EXEEXT) :\
-	creation-pthread.run			\
+	echo "#!/bin/sh" > a.out
+	echo "java JavaThread" >> a.out
+	chmod a+x a.out
+
+schedint-pthread$(EXEEXT):
+	$(BENCH_V_CC)$(COMPILE) $(srcdir)/schedint/pthreads.c
+
+schedext$(EXEEXT) :		\
+	schedext-cfa1.run	\
+	schedext-cfa2.run	\
+	schedext-cfa4.run	\
+	schedext-upp.run	\
+	schedext-goroutine.run
+
+schedext-cfa1$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa1.cfa
+
+schedext-cfa2$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa2.cfa
+
+schedext-cfa4$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa4.cfa
+
+schedext-upp$(EXEEXT):
+	$(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/schedext/upp.cc
+
+schedext-goroutine$(EXEEXT):
+	$(BENCH_V_GOC)go build -o a.out $(srcdir)/schedext/goroutine.go
+
+creation$(EXEEXT) :				\
+	creation-cfa_generator.run		\
 	creation-cfa_coroutine.run		\
 	creation-cfa_coroutine_eager.run	\
@@ -962,35 +1059,55 @@
 	creation-upp_coroutine.run		\
 	creation-upp_thread.run			\
-	creation-goroutine.run			\
-	creation-java_thread.run
+	creation-python_coroutine.run		\
+	creation-nodejs_coroutine.run		\
+	creation-goroutine_thread.run		\
+	creation-rust_thread.run		\
+	creation-java_thread.run		\
+	creation-pthread.run
+
+creation-cfa_generator$(EXEEXT):
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/creation/cfa_gen.cfa
 
 creation-cfa_coroutine$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.cfa
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/creation/cfa_cor.cfa
 
 creation-cfa_coroutine_eager$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.cfa  -DEAGER
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/creation/cfa_cor.cfa  -DEAGER
 
 creation-cfa_thread$(EXEEXT):
-	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_thrd.cfa
+	$(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/creation/cfa_thrd.cfa
 
 creation-upp_coroutine$(EXEEXT):
-	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_cor.cc
+	$(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/creation/upp_cor.cc
 
 creation-upp_thread$(EXEEXT):
-	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_thrd.cc
-
-creation-pthread$(EXEEXT):
-	$(BENCH_V_CC)$(COMPILE)    -DBENCH_N=250000   $(srcdir)/creation/pthreads.c
-
-creation-goroutine$(EXEEXT):
+	$(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/creation/upp_thrd.cc
+
+creation-python_coroutine$(EXEEXT):
+	echo "#!/bin/sh" > a.out
+	echo "python3.7 $(srcdir)/creation/python_cor.py" >> a.out
+	chmod a+x a.out
+
+creation-nodejs_coroutine$(EXEEXT):
+	echo "#!/bin/sh" > a.out
+	echo "nodejs $(srcdir)/creation/node_cor.js" >> a.out
+	chmod a+x a.out
+
+creation-goroutine_thread$(EXEEXT):
 	$(BENCH_V_GOC)go build -o a.out $(srcdir)/creation/goroutine.go
+
+creation-rust_thread$(EXEEXT):
+	$(BENCH_V_RUSTC)rustc -C opt-level=3 -o a.out $(srcdir)/creation/rust_thrd.rs
 
 creation-java_thread$(EXEEXT):
 	$(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/creation/JavaThread.java
-	@echo "#!/bin/sh" > a.out
-	@echo "java JavaThread" >> a.out
-	@chmod a+x a.out
-
-compile$(EXEEXT) :\
+	echo "#!/bin/sh" > a.out
+	echo "java JavaThread" >> a.out
+	chmod a+x a.out
+
+creation-pthread$(EXEEXT):
+	$(BENCH_V_CC)$(COMPILE) $(srcdir)/creation/pthreads.c
+
+compile$(EXEEXT) :		\
 	compile-array.make	\
 	compile-attributes.make	\
@@ -1003,29 +1120,29 @@
 
 compile-array$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/array.cfa
+	$(CFACOMPILE) -fsyntax-only -w $(testdir)/array.cfa
 
 compile-attributes$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/attributes.cfa
+	$(CFACOMPILE) -fsyntax-only -w $(testdir)/attributes.cfa
 
 compile-empty$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(srcdir)/compile/empty.cfa
+	$(CFACOMPILE) -fsyntax-only -w $(srcdir)/compile/empty.cfa
 
 compile-expression$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/expression.cfa
+	$(CFACOMPILE) -fsyntax-only -w $(testdir)/expression.cfa
 
 compile-io$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/io1.cfa
+	$(CFACOMPILE) -fsyntax-only -w $(testdir)/io1.cfa
 
 compile-monitor$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/monitor.cfa
+	$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/monitor.cfa
 
 compile-operators$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/operators.cfa
+	$(CFACOMPILE) -fsyntax-only -w $(testdir)/operators.cfa
 
 compile-thread$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/thread.cfa
+	$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/thread.cfa
 
 compile-typeof$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/typeof.cfa
+	$(CFACOMPILE) -fsyntax-only -w $(testdir)/typeof.cfa
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
Index: benchmark/basic/fetch_add.c
===================================================================
--- benchmark/basic/fetch_add.c	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/basic/fetch_add.c	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,29 @@
+#include <stdio.h>
+
+#include "bench.h"
+
+// Does a "lock add" on entry and a "lock sub" on exit => 2 atomic instructions making it the most expensive
+// atomic test.
+
+volatile int value;
+
+void __attribute__((noinline)) do_call() {
+	__atomic_add_fetch( &value, 1, __ATOMIC_SEQ_CST );
+	asm volatile ("");
+	__atomic_sub_fetch( &value, 1, __ATOMIC_SEQ_CST );
+}
+
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+	BENCH(
+		for (size_t i = 0; i < times; i++) {
+			do_call();
+		},
+		result
+	)
+	printf( "%g\n", result );
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/basic/function.c
===================================================================
--- benchmark/basic/function.c	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/basic/function.c	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,22 @@
+#include <stdio.h>
+
+#include "bench.h"
+
+void __attribute__((noinline)) do_call() {
+	asm volatile("" ::: "memory");
+}
+
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+	BENCH(
+		for (size_t i = 0; i < times; i++) {
+			do_call();
+		},
+		result
+	)
+	printf( "%g\n", result );
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/basic/loop.c
===================================================================
--- benchmark/basic/loop.c	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/basic/loop.c	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,18 @@
+#include <stdio.h>
+
+#include "bench.h"
+
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+	BENCH(
+		for (size_t i = 0; i < times; i++) {
+			asm volatile( "" ::: "memory" );
+		},
+		result
+	)
+	printf( "%g\n", result );
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/basic/tls_fetch_add.c
===================================================================
--- benchmark/basic/tls_fetch_add.c	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/basic/tls_fetch_add.c	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,34 @@
+#include <stdbool.h>
+#include <stdio.h>
+
+#include "bench.h"
+
+// Does not do a fetch & add. It mimics the cfa protocol to disable interrupts locally, by writing true or false to a
+// thread_local Boolean. This means the entire protocol is just to "mov" instructions making it extremely cheap.
+
+#define thread_local _Thread_local
+
+thread_local volatile bool value;
+
+void __attribute__((noinline)) do_call() {
+	__atomic_store_n( &value, true, __ATOMIC_RELAXED );
+	__atomic_signal_fence(__ATOMIC_ACQUIRE);
+	asm volatile ("");
+	__atomic_store_n( &value, false, __ATOMIC_RELAXED );
+	__atomic_signal_fence(__ATOMIC_RELEASE);
+}
+
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+	BENCH(
+		for (size_t i = 0; i < times; i++) {
+			do_call();
+		},
+		result
+	)
+	printf( "%g\n", result );
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/basic/ttst_lock.c
===================================================================
--- benchmark/basic/ttst_lock.c	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/basic/ttst_lock.c	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,53 @@
+#include <stdio.h>
+#include <stdint.h>										// uintptr_t
+
+#include "bench.h"
+
+// Does a "lock xchg" on entry but a simple "mov" on exit => cheaper as 0 contention. While it has much more code, the
+// bulk is never run.
+
+#define CALIGN __attribute__(( aligned (CACHE_ALIGN) ))
+#define CACHE_ALIGN 128
+#define Pause() __asm__ __volatile__ ( "pause" : : : )
+
+typedef uintptr_t TYPE;									// addressable word-size
+static volatile TYPE lock __attribute__(( aligned (128) )); // Intel recommendation
+static TYPE PAD CALIGN __attribute__(( unused ));		// protect further false sharing
+
+static inline void spin_lock( volatile TYPE *lock ) {
+	enum { SPIN_START = 4, SPIN_END = 64 * 1024, };
+	unsigned int spin = SPIN_START;
+
+	for ( unsigned int i = 1;; i += 1 ) {
+	  if ( *lock == 0 && __atomic_test_and_set( lock, __ATOMIC_ACQUIRE ) == 0 ) break;
+		for ( volatile unsigned int s = 0; s < spin; s += 1 ) Pause(); // exponential spin
+		//spin += spin;									// powers of 2
+		if ( i % 64 == 0 ) spin += spin;				// slowly increase by powers of 2
+		if ( spin > SPIN_END ) spin = SPIN_START;		// prevent overflow
+	} // for
+} // spin_lock
+
+static inline void spin_unlock( volatile TYPE *lock ) {
+	__atomic_clear( lock, __ATOMIC_RELEASE );
+} // spin_unlock
+
+void __attribute__((noinline)) do_call() {
+	spin_lock( &lock );
+//	asm volatile ("");
+	spin_unlock( &lock );
+}
+
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+	BENCH(
+		for (size_t i = 0; i < times; i++) {
+			do_call();
+		},
+		result
+	)
+	printf( "%g\n", result );
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/bench.h
===================================================================
--- benchmark/bench.h	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/bench.h	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -5,5 +5,6 @@
 #endif
 	#include <stdlib.h>
-	#include <unistd.h>					// sysconf
+	#include <stdint.h>				// uint64_t
+	#include <unistd.h>				// sysconf
 #if ! defined(__cforall)
 	#include <time.h>
@@ -15,36 +16,29 @@
 
 
-static inline unsigned long long int bench_time() {
-    struct timespec ts;
-    clock_gettime(
-#if defined( __linux__ )
-	 CLOCK_THREAD_CPUTIME_ID,
-#elif defined( __freebsd__ )
-	 CLOCK_PROF,
-#elif defined( __solaris__ )
-	 CLOCK_HIGHRES,
-#else
-    #error uC++ : internal error, unsupported architecture
-#endif
-	 &ts );
-    return 1000000000LL * ts.tv_sec + ts.tv_nsec;
-} // Time
+static inline uint64_t bench_time() {
+	struct timespec ts;
+	clock_gettime( CLOCK_THREAD_CPUTIME_ID, &ts );
+	return 1000000000LL * ts.tv_sec + ts.tv_nsec;
+} // bench_time
 
 #ifndef BENCH_N
-#define BENCH_N 500 //10000000
+#define BENCH_N 10000000
 #endif
 
+size_t times = BENCH_N;
+
+#define BENCH_START()				\
+	if ( argc > 2 ) exit( EXIT_FAILURE );	\
+	if ( argc == 2 ) {			\
+		times = atoi( argv[1] );	\
+	}
+
 #define BENCH(statement, output)		\
-	size_t n = BENCH_N;			\
-	if( argc > 2 ) return 1;		\
-	if( argc == 2 ) {				\
-		n = atoi(argv[1]);		\
-	}						\
-	long long int StartTime, EndTime;	\
+	uint64_t StartTime, EndTime;		\
 	StartTime = bench_time();		\
-	statement;					\
+	statement;				\
 	EndTime = bench_time();			\
-	double output = 	\
-	    (double)( EndTime - StartTime ) / n;
+	double output = (double)( EndTime - StartTime ) / times;
+
 
 #if defined(__cforall)
@@ -53,2 +47,7 @@
 }
 #endif
+#if defined(__U_CPLUSPLUS__)
+unsigned int uDefaultPreemption() {
+	return 0;
+}
+#endif
Index: benchmark/creation/JavaThread.java
===================================================================
--- benchmark/creation/JavaThread.java	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/creation/JavaThread.java	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -26,5 +26,5 @@
 	static int x = 2;
 
-	static private final int NoOfTimes = Integer.parseInt("10000") ;
+	static private int times = Integer.parseInt("10000") ;
 
 	public static class MyThread extends Thread {
@@ -33,5 +33,5 @@
 	}
 	public static void helper() throws InterruptedException {
-		for(int i = 1; i <= NoOfTimes; i += 1) {
+		for(int i = 1; i <= times; i += 1) {
 			MyThread m = new MyThread();
 			x = nextRandom( x );
@@ -44,10 +44,13 @@
 		helper();
 		long end = System.nanoTime();
-		System.out.println( (end - start) / NoOfTimes );
+		System.out.println( (end - start) / times );
 	}
 	public static void main(String[] args) throws InterruptedException {
-		for (int n = Integer.parseInt("5"); --n >= 0 ; ) { 
+		if ( args.length > 2 ) System.exit( 1 );
+		if ( args.length == 2 ) { times = Integer.parseInt(args[1]); }
+
+		for (int i = Integer.parseInt("5"); --i >= 0 ; ) { 
 			InnerMain();
-			Thread.sleep(2000);     // 2 seconds
+			Thread.sleep(2000);		// 2 seconds
 			x = nextRandom(x);
 		}
@@ -55,2 +58,6 @@
 	}
 }
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/creation/cfa_cor.cfa
===================================================================
--- benchmark/creation/cfa_cor.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/creation/cfa_cor.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -5,19 +5,23 @@
 
 coroutine MyCoroutine {};
-void ?{} (MyCoroutine & this) {
+void ?{}( MyCoroutine & this ) {
 #ifdef EAGER
-	resume(this);
+	resume( this );
 #endif
 }
-void main(MyCoroutine &) {}
+void main( MyCoroutine & ) {}
 
-int main(int argc, char* argv[]) {
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	BENCH(
-		for ( i; n ) {
-			MyCoroutine m;
+		for ( times ) {
+			MyCoroutine c;
 		},
 		result
 	)
+	printf( "%g\n", result );
+}
 
-	printf("%g\n", result);
-}
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/creation/cfa_gen.cfa
===================================================================
--- benchmark/creation/cfa_gen.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/creation/cfa_gen.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,22 @@
+#include "bench.h"
+
+struct C {
+	volatile int restart; // ensure compiler does not optimize away all the code
+};
+void ?{}( C & c ) { c.restart = 0; }
+void main( C & ) {}
+
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+	BENCH(
+		for ( times ) {
+			 C c;
+		},
+		result
+	)
+	printf( "%g\n", result );
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/creation/cfa_thrd.cfa
===================================================================
--- benchmark/creation/cfa_thrd.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/creation/cfa_thrd.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -7,12 +7,16 @@
 void main(MyThread &) {}
 
-int main(int argc, char* argv[]) {
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	BENCH(
-		for ( i; n ) {
+		for ( times ) {
 			MyThread m;
 		},
 		result
 	)
+	printf( "%g\n", result );
+}
 
-	printf("%g\n", result);
-}
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/creation/goroutine.go
===================================================================
--- benchmark/creation/goroutine.go	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/creation/goroutine.go	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -2,6 +2,8 @@
 
 import (
-    "fmt"
-    "time"
+	"fmt"
+	"time"
+	"os"
+	"strconv"
 )
 
@@ -17,11 +19,18 @@
 
 func main() {
-	const NoOfTimes = 500000
+	var times int = 10000000
+	if len( os.Args ) > 2 { os.Exit( 1 ) }
+	if len( os.Args ) == 2 { times, _ = strconv.Atoi(os.Args[1]) }
+
 	start := time.Now()
-	for i := 1; i <= NoOfTimes; i += 1 {
+	for i := 1; i <= times; i += 1 {
 		go noop()		// creation
+		<- shake		// wait for completion
 	}
 	end := time.Now()
-	fmt.Printf("%d\n", end.Sub(start) / time.Duration(NoOfTimes))
-	<- shake
+	fmt.Printf( "%d\n", end.Sub(start) / time.Duration(times) )
 }
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/creation/node_cor.js
===================================================================
--- benchmark/creation/node_cor.js	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/creation/node_cor.js	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,18 @@
+var times = 50000000
+var argc = process.argv.length // node, path
+if ( argc > 3 ) process.exit( 1 )
+if ( argc == 3 ) times = Number( process.argv[2] )
+
+function * coroutine() { yield }
+var hrstart = process.hrtime()
+for ( var i = 0; i < times; i += 1 ) {
+	cor = coroutine()
+}
+hrend = process.hrtime( hrstart )
+var dur = (1000000000 * hrend[0] + hrend[1]) / times
+console.log( dur )
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "nodejs node_cor.js" //
+// End: //
Index: benchmark/creation/pthreads.c
===================================================================
--- benchmark/creation/pthreads.c	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/creation/pthreads.c	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -4,11 +4,12 @@
 #include "bench.h"
 
-static void *foo(void *arg) {
+static void * foo(void *arg) {
     return arg;
 }
 
-int main(int argc, char* argv[]) {
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	BENCH(
-		for (size_t i = 0; i < n; i++) {
+		for (size_t i = 0; i < times; i++) {
 			pthread_t thread;
 			if (pthread_create(&thread, NULL, foo, NULL) < 0) {
@@ -16,5 +17,4 @@
 				return 1;
 			}
-
 			if (pthread_join( thread, NULL) < 0) {
 				perror( "failure" );
@@ -24,5 +24,8 @@
 		result
 	)
+	printf( "%g\n", result );
+}
 
-	printf("%g\n", result);
-}
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/creation/python_cor.py
===================================================================
--- benchmark/creation/python_cor.py	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/creation/python_cor.py	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,24 @@
+import sys
+import time
+
+times = 50000000
+argc = len( sys.argv )
+if argc > 2:
+	sys.exit( 1 )
+if argc == 2:
+	times = int( sys.argv[1] )
+
+def C():
+	yield
+
+start = time.time_ns()
+for i in range( 10000000 ):
+	c = C()
+	next( c )  # resume
+end = time.time_ns()
+print( (end - start) / times )
+
+# Local Variables: #
+# tab-width: 4 #
+# compile-command: "python3.7 python_cor.py" #
+# End: #
Index: benchmark/creation/rust_thrd.rs
===================================================================
--- benchmark/creation/rust_thrd.rs	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/creation/rust_thrd.rs	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,25 @@
+use std::env;
+use std::process;
+use std::thread;
+use std::time::Instant;
+
+fn main() {
+	let mut times : u32 = 250000;
+	let args: Vec<String> = env::args().collect();
+	if args.len() > 2 { process::exit( 1 ); }
+	if args.len() == 2 { times = args[1].parse().unwrap(); }
+
+	let start = Instant::now();
+	for _ in 1..times {
+		let th = thread::spawn( move || {});
+		th.join().unwrap();
+	}
+	let duration = start.elapsed() / times;
+	println!( "{:?}", duration.as_nanos() )
+}
+
+// Local Variables: //
+// mode: c++ //
+// tab-width: 4 //
+// compile-command: "rustc -C opt-level=3 rust_thrd.rs" //
+// End: //
Index: benchmark/creation/upp_cor.cc
===================================================================
--- benchmark/creation/upp_cor.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/creation/upp_cor.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -5,14 +5,20 @@
 _Coroutine MyCor {
 	void main() {}
+  public:
+	MyCor() { resume(); }
 };
 
-int main(int argc, char* argv[]) {
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	BENCH(
-		for (size_t i = 0; i < n; i++) {
+		for (size_t i = 0; i < times; i++) {
 			MyCor m;
 		},
 		result
 	)
+	printf( "%g\n", result );
+}
 
-	printf("%g\n", result);
-}
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/creation/upp_thrd.cc
===================================================================
--- benchmark/creation/upp_thrd.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/creation/upp_thrd.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -7,12 +7,16 @@
 };
 
-int main(int argc, char* argv[]) {
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	BENCH(
-		for (size_t i = 0; i < n; i++) {
+		for (size_t i = 0; i < times; i++) {
 			MyThread m;
 		},
 		result
 	)
+	printf( "%g\n", result );
+}
 
-	printf("%g\n", result);
-}
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/ctxswitch/JavaThread.java
===================================================================
--- benchmark/ctxswitch/JavaThread.java	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/ctxswitch/JavaThread.java	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -26,8 +26,8 @@
 	static int x = 2;
 
-	static private final int NoOfTimes = Integer.parseInt("1000000") ;
+	static private int times = Integer.parseInt("100000");
 
 	public static void helper() {
-		for(int i = 1; i <= NoOfTimes; i += 1) {
+		for(int i = 1; i <= times; i += 1) {
 			Thread.yield();
 		}
@@ -37,10 +37,13 @@
 		helper();
 		long end = System.nanoTime();
-		System.out.println( (end - start) / NoOfTimes );
+		System.out.println( (end - start) / times );
 	}
 	public static void main(String[] args) throws InterruptedException {
-		for (int n = Integer.parseInt("5"); --n >= 0 ; ) { 
+		if ( args.length > 2 ) System.exit( 1 );
+		if ( args.length == 2 ) { times = Integer.parseInt(args[1]); }
+
+		for (int i = Integer.parseInt("5"); --i >= 0 ; ) {
 			InnerMain();
-			Thread.sleep(2000);     // 2 seconds
+			Thread.sleep(2000);	// 2 seconds
 			x = nextRandom(x);
 		}
@@ -48,2 +51,6 @@
 	}
 }
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/ctxswitch/cfa_cor.cfa
===================================================================
--- benchmark/ctxswitch/cfa_cor.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/ctxswitch/cfa_cor.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -4,26 +4,22 @@
 #include "bench.h"
 
-coroutine GreatSuspender {};
-
-void ?{}( GreatSuspender & this ) {
-	prime(this);
-}
-
-void main( __attribute__((unused)) GreatSuspender & this ) {
-	while( true ) {
+coroutine C {} c;
+void main( __attribute__((unused)) C & ) {
+	while () {
 		suspend();
 	}
 }
-
-int main(int argc, char* argv[]) {
-	GreatSuspender s;
-
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	BENCH(
-		for ( i; n ) {
-			resume( s );
+		for ( times ) {
+			resume( c );
 		},
 		result
 	)
+	printf( "%g\n", result );
+}
 
-	printf("%g\n", result);
-}
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/ctxswitch/cfa_cor_then.cfa
===================================================================
--- benchmark/ctxswitch/cfa_cor_then.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/ctxswitch/cfa_cor_then.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -6,26 +6,28 @@
 void noOp(void) {}
 
-coroutine GreatSuspender {};
+coroutine C {} c;
 
-void ?{}( GreatSuspender & this ) {
+void ?{}( C & this ) {
 	prime(this);
 }
 
-void main( __attribute__((unused)) GreatSuspender & this ) {
-	while( true ) {
+void main( __attribute__((unused)) C & this ) {
+	while () {
 		suspend_then(noOp);
 	}
 }
 
-int main(int argc, char* argv[]) {
-	GreatSuspender s;
-
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	BENCH(
-		for ( i; n ) {
-			resume( s );
+		for ( times ) {
+			resume( c );
 		},
 		result
 	)
+	printf( "%g\n", result );
+}
 
-	printf("%g\n", result);
-}
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/ctxswitch/cfa_gen.cfa
===================================================================
--- benchmark/ctxswitch/cfa_gen.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/ctxswitch/cfa_gen.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -3,25 +3,28 @@
 typedef struct {
 	void * next;
-} GreatSuspender;
+} C;
 
-void comain( GreatSuspender * this ) {
-    if ( __builtin_expect(this->next != 0, 1) ) goto *(this->next);
-    this->next = &&s1;
+void comain( C * c ) {
+	if ( __builtin_expect(c->next != 0, 1) ) goto *(c->next);
+	c->next = &&s1;
 	for () {
-	    return;
+		return;
 	  s1: ;
 	}
 }
 
-int main(int argc, char* argv[]) {
-    GreatSuspender s = { 0 };
-
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+	C c = { 0 };
 	BENCH(
-		for ( i; n ) {
-			comain( &s );
+		for ( times ) {
+			comain( &c );
 		},
 		result
 	)
+	printf( "%g\n", result );
+}
 
-	printf("%g\n", result);
-}
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/ctxswitch/cfa_thrd.cfa
===================================================================
--- benchmark/ctxswitch/cfa_thrd.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/ctxswitch/cfa_thrd.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -3,12 +3,16 @@
 #include "bench.h"
 
-int main(int argc, char* argv[]) {
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	BENCH(
-		for ( i; n ) {
+		for ( times ) {
 			yield();
 		},
 		result
 	)
+	printf( "%g\n", result );
+}
 
-	printf("%g\n", result);
-}
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/ctxswitch/cfa_thrd2.cfa
===================================================================
--- benchmark/ctxswitch/cfa_thrd2.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/ctxswitch/cfa_thrd2.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -8,20 +8,23 @@
 
 void main(__attribute__((unused)) Fibre & this) {
-	while(!done) {
+	while ( ! done ) {
 		yield();
 	}
 }
 
-int main(int argc, char* argv[]) {
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	Fibre f1;
   	BENCH(
-		for ( i; n ) {
+		for ( times ) {
 			yield();
 		},
 		result
 	)
+	printf( "%g\n", result );
+	done = true;
+}
 
-	printf("%g\n", result);
-	done = true;
-	return 0;
-}
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/ctxswitch/goroutine.go
===================================================================
--- benchmark/ctxswitch/goroutine.go	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/ctxswitch/goroutine.go	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -2,7 +2,9 @@
 
 import (
-    "fmt"
-    "runtime"
-    "time"
+	"fmt"
+	"time"
+	"os"
+	"strconv"
+	"runtime"
 )
 
@@ -28,6 +30,12 @@
 
 func main() {
-	const NoOfTimes = 10000000
-	go ContextSwitch( NoOfTimes )		// context switch
+	var times int = 10000000
+	if len( os.Args ) > 2 { os.Exit( 1 ) }
+	if len( os.Args ) == 2 { times, _ = strconv.Atoi(os.Args[1]) }
+	go ContextSwitch( times )		// context switch
 	<- shake
 }
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/ctxswitch/kos_fibre.cpp
===================================================================
--- benchmark/ctxswitch/kos_fibre.cpp	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/ctxswitch/kos_fibre.cpp	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -3,12 +3,16 @@
 #include "bench.h"
 
-int main(int argc, char* argv[]) {
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	BENCH(
-		for (size_t i = 0; i < n; i++) {
+		for (size_t i = 0; i < times; i++) {
 			Fibre::yield();
 		},
 		result
 	)
-	printf("%g\n", result);
-	return 0;
+	printf( "%g\n", result );
 }
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/ctxswitch/kos_fibre2.cpp
===================================================================
--- benchmark/ctxswitch/kos_fibre2.cpp	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/ctxswitch/kos_fibre2.cpp	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -11,16 +11,20 @@
 }
 
-int main(int argc, char* argv[]) {
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	Fibre* f1 = (new Fibre)->run(f1main);
   	BENCH(
-		for (size_t i = 0; i < n; i++) {
+		for (size_t i = 0; i < times; i++) {
 			Fibre::yield();
 		},
 		result
 	)
-	printf("%g\n", result);
+	printf( "%g\n", result );
 	done = true;
 	Fibre::yield();
 	f1->join();
-	return 0;
 }
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/ctxswitch/node_await.js
===================================================================
--- benchmark/ctxswitch/node_await.js	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/ctxswitch/node_await.js	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,26 @@
+var times = 5000000
+var argc = process.argv.length // node, path
+if ( argc > 3 ) process.exit( 1 )
+if ( argc == 3 ) times = Number( process.argv[2] )
+
+function instant() {
+     return new Promise(function(rs) {
+         setImmediate(rs);
+     });
+}
+
+async function l() {
+    var hrstart = process.hrtime()
+    for ( var i = 0; i < times; i += 1 )
+         await instant();
+	hrend = process.hrtime( hrstart )
+	var dur = (1000000000 * hrend[0] + hrend[1]) / times
+	console.log( dur )
+}
+
+l();
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "nodejs node_await.js" //
+// End: //
Index: benchmark/ctxswitch/node_cor.js
===================================================================
--- benchmark/ctxswitch/node_cor.js	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/ctxswitch/node_cor.js	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,24 @@
+var times = 50000000
+var argc = process.argv.length // node, path
+if ( argc > 3 ) process.exit( 1 )
+if ( argc == 3 ) times = Number( process.argv[2] )
+
+function * coroutine() {
+	while ( true ) {
+		yield
+	}
+}
+cor = coroutine()
+
+var hrstart = process.hrtime()
+for ( var i = 0; i < times; i += 1 ) {
+	cor.next();
+}
+hrend = process.hrtime( hrstart )
+var dur = (1000000000 * hrend[0] + hrend[1]) / times
+console.log( dur )
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "nodejs node_cor.js" //
+// End: //
Index: benchmark/ctxswitch/pthreads.c
===================================================================
--- benchmark/ctxswitch/pthreads.c	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/ctxswitch/pthreads.c	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -6,12 +6,12 @@
 #include "bench.h"
 
-int main(int argc, char* argv[]) {
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	BENCH(
-		for (size_t i = 0; i < n; i++) {
+		for (size_t i = 0; i < times; i++) {
 			sched_yield();
 		},
 		result
 	)
-
-	printf("%g\n", result);
+	printf( "%g\n", result );
 }
Index: benchmark/ctxswitch/python_cor.py
===================================================================
--- benchmark/ctxswitch/python_cor.py	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/ctxswitch/python_cor.py	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,26 @@
+import sys
+import time
+
+times = 50000000
+argc = len( sys.argv )
+if argc > 2:
+	sys.exit( 1 )
+if argc == 2:
+	times = int( sys.argv[1] )
+
+def C():
+	while True:
+		yield
+
+c = C()
+
+start = time.time_ns()
+for i in range( 10000000 ):
+	next( c )  # resume
+end = time.time_ns()
+print( (end - start) / times )
+
+# Local Variables: #
+# tab-width: 4 #
+# compile-command: "python3.7 python_cor.py" #
+# End: #
Index: benchmark/ctxswitch/rust_thrd.rs
===================================================================
--- benchmark/ctxswitch/rust_thrd.rs	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/ctxswitch/rust_thrd.rs	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,27 @@
+use std::env;
+use std::process;
+use std::thread;
+use std::time::Instant;
+
+fn main() {
+	let mut times : u32 = 50000000;
+	let args: Vec<String> = env::args().collect();
+	if args.len() > 2 { process::exit( 1 ); }
+	if args.len() == 2 { times = args[1].parse().unwrap(); }
+
+	let start = Instant::now();
+	let th = thread::spawn( move || {
+		for _ in 1..times {
+			thread::yield_now();
+		}
+	});
+	th.join().unwrap();
+	let duration = start.elapsed() / times;
+	println!( "{:?}", duration.as_nanos() )
+}
+
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "rustc -C opt-level=3 rust_thrd.rs" //
+// End: //
Index: benchmark/ctxswitch/upp_cor.cc
===================================================================
--- benchmark/ctxswitch/upp_cor.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/ctxswitch/upp_cor.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -3,14 +3,5 @@
 #include "bench.h"
 
-_Coroutine GreatSuspender {
-public:
-	GreatSuspender() {
-		resume();
-	}
-
-	void do_resume() {
-		resume();
-	}
-private:
+_Coroutine C {
 	void main() {
 		while( true ) {
@@ -18,16 +9,21 @@
 		}
 	}
-};
-
-int main(int argc, char* argv[]) {
-	GreatSuspender s;
-
+  public:
+	void do_resume() {
+		resume();
+	}
+} c;
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	BENCH(
-		for (size_t i = 0; i < n; i++) {
-			s.do_resume();
+		for (size_t i = 0; i < times; i++) {
+			c.do_resume();
 		},
 		result
 	)
+	printf( "%g\n", result );
+}
 
-	printf("%g\n", result);
-}
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/ctxswitch/upp_thrd.cc
===================================================================
--- benchmark/ctxswitch/upp_thrd.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/ctxswitch/upp_thrd.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -3,12 +3,16 @@
 #include "bench.h"
 
-int main(int argc, char* argv[]) {
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	BENCH(
-		for (size_t i = 0; i < n; i++) {
+		for (size_t i = 0; i < times; i++) {
 			uThisTask().yield();
 		},
 		result
 	)
+	printf( "%g\n", result );
+}
 
-	printf("%g\n", result);
-}
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/exclude
===================================================================
--- benchmark/exclude	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/exclude	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,12 @@
+.deps
+baselines
+mutexC
+Makefile*
+kos_fibre*
+fixcsv.sh
+cxx.cpp
+c.c
+fetch_add.c
+interrupt_linux.c
+exclude
+Monitor.c
Index: nchmark/fetch_add.c
===================================================================
--- benchmark/fetch_add.c	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ 	(revision )
@@ -1,22 +1,0 @@
-#include <stdio.h>
-
-#include "bench.h"
-
-volatile int value;
-
-void __attribute__((noinline)) do_call() {
-	__atomic_add_fetch( &value, 1, __ATOMIC_SEQ_CST );
-	asm volatile ("");
-	__atomic_sub_fetch( &value, 1, __ATOMIC_SEQ_CST );
-}
-
-int main(int argc, char* argv[]) {
-	BENCH(
-		for (size_t i = 0; i < n; i++) {
-			do_call();
-		},
-		result
-	)
-
-	printf("%g\n", result);
-}
Index: nchmark/function.c
===================================================================
--- benchmark/function.c	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ 	(revision )
@@ -1,18 +1,0 @@
-#include <stdio.h>
-
-#include "bench.h"
-
-void __attribute__((noinline)) do_call() {
-	asm volatile("" ::: "memory");
-}
-
-int main(int argc, char* argv[]) {
-	BENCH(
-		for (size_t i = 0; i < n; i++) {
-			do_call();
-		},
-		result
-	)
-
-	printf("%g\n", result);
-}
Index: nchmark/loop.c
===================================================================
--- benchmark/loop.c	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ 	(revision )
@@ -1,14 +1,0 @@
-#include <stdio.h>
-
-#include "bench.h"
-
-int main(int argc, char* argv[]) {
-	BENCH(
-		for (size_t i = 0; i < n; i++) {
-			asm volatile("" ::: "memory");
-		},
-		result
-	)
-
-	printf("%g\n", result);
-}
Index: benchmark/mutex/JavaThread.java
===================================================================
--- benchmark/mutex/JavaThread.java	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/mutex/JavaThread.java	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -26,5 +26,5 @@
 	static int x = 2;
 
-	static private final int NoOfTimes = Integer.parseInt("100000000") ;
+	static private int times = Integer.parseInt("100000000");
 
 	public synchronized void noop() {
@@ -35,5 +35,5 @@
 		// Inhibit biased locking ...
 		x = (j.hashCode() ^ System.identityHashCode(j)) | 1 ;     
-		for(int i = 1; i <= NoOfTimes; i += 1) {
+		for(int i = 1; i <= times; i += 1) {
 			x = nextRandom(x);
 			j.noop();
@@ -44,7 +44,10 @@
 		helper();
 		long end = System.nanoTime();
-		System.out.println( (end - start) / NoOfTimes );
+		System.out.println( (end - start) / times );
 	}
 	public static void main(String[] args) throws InterruptedException {
+		if ( args.length > 2 ) System.exit( 1 );
+		if ( args.length == 2 ) { times = Integer.parseInt(args[1]); }
+
 		for (int n = Integer.parseInt("5"); --n >= 0 ; ) { 
 			InnerMain();
@@ -55,2 +58,6 @@
 	}
 }
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/mutex/cfa1.cfa
===================================================================
--- benchmark/mutex/cfa1.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/mutex/cfa1.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -4,16 +4,19 @@
 #include "bench.h"
 
-monitor M {};
-void __attribute__((noinline)) call( M & mutex m ) {}
+monitor M {} m1;
+void __attribute__((noinline)) call( M & mutex p1 ) {}
 
-int main(int argc, char* argv[]) {
-	M m;
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	BENCH(
-		for ( i; n ) {
-			call(m);
+		for ( times ) {
+			call( m1 );
 		},
 		result
 	)
+	printf( "%g\n", result );
+}
 
-	printf("%g\n", result);
-}
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/mutex/cfa2.cfa
===================================================================
--- benchmark/mutex/cfa2.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/mutex/cfa2.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -4,16 +4,20 @@
 #include "bench.h"
 
-monitor M {};
-void __attribute__((noinline)) call( M & mutex m1, M & mutex m2 ) {}
+monitor M {} m1, m2;
 
-int main(int argc, char* argv[]) {
-	M m1, m2;
+void __attribute__((noinline)) call( M & mutex p1, M & mutex p2 ) {}
+
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	BENCH(
-		for ( i; n ) {
-			call(m1, m2);
+		for ( times ) {
+			call( m1, m2 );
 		},
 		result
 	)
+	printf( "%g\n", result );
+}
 
-	printf("%g\n", result);
-}
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/mutex/cfa4.cfa
===================================================================
--- benchmark/mutex/cfa4.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/mutex/cfa4.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -5,16 +5,19 @@
 
 
-monitor M {};
-void __attribute__((noinline)) call( M & mutex m1, M & mutex m2, M & mutex m3, M & mutex m4 ) {}
+monitor M {} m1, m2, m3, m4;
+void __attribute__((noinline)) call( M & mutex p1, M & mutex p2, M & mutex p3, M & mutex p4 ) {}
 
-int main(int argc, char* argv[]) {
-	M m1, m2, m3, m4;
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	BENCH(
-		for ( i; n ) {
-			call(m1, m2, m3, m4);
+		for ( times ) {
+			call( m1, m2, m3, m4 );
 		},
 		result
 	)
+	printf( "%g\n", result );
+}
 
-	printf("%g\n", result);
-}
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/mutex/goroutine.go
===================================================================
--- benchmark/mutex/goroutine.go	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/mutex/goroutine.go	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,32 @@
+package main
+
+import (
+	"fmt"
+	"time"
+	"os"
+	"strconv"
+	"sync"
+)
+
+var mutex sync.Mutex
+
+func call() {
+	 mutex.Lock();
+	 mutex.Unlock();
+}
+func main() {
+	var times int = 10000000
+	if len( os.Args ) > 2 { os.Exit( 1 ) }
+	if len( os.Args ) == 2 { times, _ = strconv.Atoi(os.Args[1]) }
+
+	start := time.Now()
+	for i := 1; i <= times; i += 1 {
+		call();
+	}
+	end := time.Now()
+	fmt.Printf( "%d\n", end.Sub(start) / time.Duration(times) )
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/mutex/pthreads.c
===================================================================
--- benchmark/mutex/pthreads.c	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/mutex/pthreads.c	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -7,16 +7,19 @@
 
 void __attribute__((noinline)) call() {
-	 pthread_mutex_lock  (&mutex);
-	 pthread_mutex_unlock(&mutex);
+	 pthread_mutex_lock( &mutex );
+	 pthread_mutex_unlock( &mutex );
 }
-
-int main(int argc, char* argv[]) {
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	BENCH(
-		for (size_t i = 0; i < n; i++) {
+		for ( size_t i = 0; i < times; i++ ) {
 			call();
 		},
 		result
 	)
+	printf( "%g\n", result );
+}
 
-	printf("%g\n", result);
-}
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/mutex/rust.rs
===================================================================
--- benchmark/mutex/rust.rs	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/mutex/rust.rs	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,29 @@
+use std::env;
+use std::process;
+use std::sync::Mutex;
+use std::time::Instant;
+
+fn call( lock : & Mutex<u32> ) {
+	let _ = lock.lock();
+}
+
+fn main() {
+	let mut times : u32 = 50000000;
+	let args: Vec<String> = env::args().collect();
+	if args.len() > 2 { process::exit( 1 ); }
+	if args.len() == 2 { times = args[1].parse().unwrap(); }
+
+	let lock = Mutex::new(0);
+
+	let start = Instant::now();
+	for _ in 1..times {
+		call( &lock );
+	}
+	let duration = start.elapsed() / times;
+	println!( "{:?}", duration.as_nanos() )
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "rustc -C opt-level=3 rust.rs" //
+// End: //
Index: benchmark/mutex/upp.cc
===================================================================
--- benchmark/mutex/upp.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/mutex/upp.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -8,13 +8,17 @@
 };
 
-int main(int argc, char* argv[]) {
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	MyMonitor m;
 	BENCH(
-		for (size_t i = 0; i < n; i++) {
+		for ( size_t i = 0; i < times; i++ ) {
 			m.call();
 		},
 		result
 	)
+	printf( "%g\n", result );
+}
 
-	printf("%g\n", result);
-}
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/mutexC/JavaThread.java
===================================================================
--- benchmark/mutexC/JavaThread.java	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/mutexC/JavaThread.java	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,89 @@
+class Noop {
+	// Simplistic low-quality Marsaglia Shift-XOR pseudo-random number generator.
+	// Bijective   
+	// Cycle length for non-zero values is 4G-1.
+	// 0 is absorbing and should be avoided -- fixed point.
+	// The returned value is typically masked to produce a positive value.
+	static volatile int Ticket = 0 ; 
+
+	public static int nextRandom( int x ) {
+		if (x == 0) { 
+			// reseed the PRNG
+			// Ticket is accessed infrequently and does not constitute a coherence hot-spot. 
+			// Note that we use a non-atomic racy increment -- the race is rare and benign. 
+			// If the race is a concern switch to an AtomicInteger.  
+			// In addition accesses to the RW volatile global "Ticket"  variable are not 
+			// (readily) predictable at compile-time so the JIT will not be able to elide 
+			// nextRandom() invocations.  
+			x = ++Ticket ; 
+			if (x == 0) x = 1 ; 
+		}
+		x ^= x << 6;
+		x ^= x >>> 21;
+		x ^= x << 7;
+		return x ;   
+	}
+}
+class Monitor {
+	private int x;
+	public volatile Boolean go = false;
+	public volatile Boolean go2 = false;
+	public synchronized void call() {
+		if ( x == 0 ) System.out.println(x);
+		x = Noop.nextRandom( x );
+	}
+	Monitor() { x = Noop.nextRandom( x ); }
+}
+class T extends Thread {
+	Monitor m;
+	public void run() {
+		m.go2 = true;
+		while ( ! m.go );
+		while ( m.go ) { m.call(); }
+	}
+	T( Monitor m ) { this.m = m; }
+}
+public class JavaThread {
+	static int x = 2;
+
+	static private int times = Integer.parseInt("10000000");
+
+	public static void call( Monitor m ) throws InterruptedException {
+		x = Noop.nextRandom( x );
+		m.go = true;
+		//while ( ! m.go2 );
+		for ( int i = 0; i < times; i += 1 ) {
+			m.call();
+			x = Noop.nextRandom( x );
+		}
+		m.go = false;
+	}
+	public static void InnerMain() throws InterruptedException {
+		Monitor m = new Monitor();
+		T t = new T( m );
+		t.start();
+		long start = System.nanoTime();
+		call( m );
+		long end = System.nanoTime();
+		System.out.println( (end - start) / times );
+		t.join();
+	}
+	public static void main( String[] args ) throws InterruptedException {
+		if ( args.length > 2 ) System.exit( 1 );
+		if ( args.length == 2 ) { times = Integer.parseInt(args[1]); }
+
+		if ( args.length > 2 ) System.exit( 1 );
+		if ( args.length == 2 ) { times = Integer.parseInt(args[1]); }
+
+		for ( int i = Integer.parseInt("5"); --i >= 0 ; ) { 
+			InnerMain();
+			// Thread.sleep(2000);	// 2 seconds
+			x = Noop.nextRandom( x );
+		}
+		if ( x == 0 ) System.out.println(x);
+	}
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/mutexC/cfa1.cfa
===================================================================
--- benchmark/mutexC/cfa1.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/mutexC/cfa1.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,36 @@
+#include <thread.hfa>
+#include <monitor.hfa>
+
+#include "../bench.h"
+
+monitor M {} m;
+void __attribute__((noinline)) call( M & mutex ) {}
+
+volatile bool go = false;
+
+void call() {
+	go = true;
+	for ( times ) {
+		call( m );
+	}
+	go = false;
+}
+thread T {};
+void main( T & ) {
+	while ( ! go );
+	while ( go ) { call( m ); }
+}
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+	processor p;
+	T t;
+	BENCH(
+		call(),
+		result
+	)
+	printf( "%g\n", result );
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/mutexC/cfa2.cfa
===================================================================
--- benchmark/mutexC/cfa2.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/mutexC/cfa2.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,35 @@
+#include <thread.hfa>
+#include <monitor.hfa>
+
+#include "../bench.h"
+
+monitor M {} m1, m2;
+void __attribute__((noinline)) call( M & mutex m1, M & mutex m2 ) {}
+
+volatile bool go = false;
+
+void call() {
+	go = true;
+	for ( times ) {
+		call( m1, m2 );
+	}
+	go = false;
+}
+thread T {};
+void main( T & this ) {
+	while ( ! go );
+	while ( go ) { call( m1, m2 ); }
+}
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+	T t;
+	BENCH(
+		call( m1, m2 ),
+		result
+	)
+	printf( "%g\n", result );
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/mutexC/cfa4.cfa
===================================================================
--- benchmark/mutexC/cfa4.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/mutexC/cfa4.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,35 @@
+#include <thread.hfa>
+#include <monitor.hfa>
+
+#include "../bench.h"
+
+monitor M {} m1, m2, m3, m4;
+void __attribute__((noinline)) call( M & mutex m1, M & mutex m2, M & mutex m3, M & mutex m4 ) {}
+
+volatile bool go = false;
+
+void call() {
+	go = true;
+	for ( times ) {
+		call( m1, m2, m3, m4 );
+	}
+	go = false;
+}
+thread T {};
+void main( T & this ) {
+	while ( ! go );
+	while ( go ) { call( m1, m2, m3, m4 ); }
+}
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+	T t;
+	BENCH(
+		call( m1, m2 ),
+		result
+	)
+	printf( "%g\n", result );
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/mutexC/pthreads.c
===================================================================
--- benchmark/mutexC/pthreads.c	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/mutexC/pthreads.c	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,47 @@
+#include <pthread.h>
+#include <stdio.h>
+#include <stdbool.h>
+
+#include "../bench.h"
+
+pthread_mutex_t mutex;
+
+volatile bool go = false;
+
+void call() {
+	go = true;
+	for ( size_t i = 0; i < times; i += 1 ) {
+		pthread_mutex_lock( &mutex );
+		pthread_mutex_unlock( &mutex );
+	}
+	go = false;
+}
+void * thread_main( __attribute__((unused)) void * arg ) {
+	while ( ! go );
+	while ( go ) {
+		pthread_mutex_lock( &mutex );
+		pthread_mutex_unlock( &mutex );
+	}
+	return NULL;
+}
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+	pthread_t thread;
+	if ( pthread_create( &thread, NULL, thread_main, NULL ) < 0 ) {
+		perror( "failure" );
+		return EXIT_FAILURE;
+	}
+	BENCH(
+		call(),
+		result
+	)
+	printf( "%g\n", result );
+	if ( pthread_join( thread, NULL ) < 0 ) {
+		perror( "failure" );
+		return EXIT_FAILURE;
+	}
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/mutexC/rust.rs
===================================================================
--- benchmark/mutexC/rust.rs	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/mutexC/rust.rs	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,26 @@
+use std::env;
+use std::process;
+use std::sync::Mutex;
+use std::time::Instant;
+
+fn call( lock : & Mutex<u32> ) {
+	let _ = lock.lock();
+}
+
+fn main() {
+	let mut times : u32 = 50000000;
+	let args: Vec<String> = env::args().collect();
+	if args.len() > 2 { process::exit( 1 ); }
+	if args.len() == 2 { times = args[1].parse().unwrap(); }
+
+	let lock = Mutex::new(0);
+
+	let start = Instant::now();
+	for _ in 1..times {
+		call( &lock );
+	}
+	let duration = start.elapsed() / times;
+	println!( "{:?}", duration.as_nanos() )
+}
+
+// rustc -C opt-level=3 rust.rs
Index: benchmark/mutexC/upp.cc
===================================================================
--- benchmark/mutexC/upp.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/mutexC/upp.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,38 @@
+#include <cstdio>
+
+#include "../bench.h"
+
+_Monitor MyMonitor {
+  public:
+	void __attribute__((noinline)) call() {}
+} m;
+
+volatile bool go = false;
+
+void call() {
+	go = true;
+	for ( size_t i = 0; i < times; i += 1 ) {
+		m.call();
+	}
+	go = false;
+}
+_Task T {
+	void main() {
+		while ( ! go );
+		while ( go ) { m.call(); }
+	}
+};
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+	uProcessor p;
+	T t;
+	BENCH(
+		call(),
+		result
+	)
+	printf( "%g\n", result );
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/schedext/cfa1.cfa
===================================================================
--- benchmark/schedext/cfa1.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/schedext/cfa1.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -4,39 +4,31 @@
 #include <stdio.h>
 
-#include "bench.h"
+#include "../bench.h"
 
-int argc;
-char** argv;
-volatile int go = 0;
+monitor M {} m1;
 
-monitor M {};
-M m1;
-
-void __attribute__((noinline)) call( M & mutex a1 ) {}
-
-int  __attribute__((noinline)) wait( M & mutex a1 ) {
-	go = 1;
-	BENCH(
-		for ( i; n ) {
-			waitfor(call, a1);
-		},
-		result
-	)
-
-	printf("%g\n", result);
-	go = 0;
-	return 0;
+void __attribute__((noinline)) call( M & mutex p1 ) {}
+void __attribute__((noinline)) wait( M & mutex p1 ) {
+	for ( times ) {
+		waitfor( call : p1 );
+	}
 }
 
 thread T {};
-void ^?{}( T & mutex this ) {}
 void main( T & ) {
-	while(go == 0) { yield(); }
-	while(go == 1) { call(m1); }
-
+	BENCH(
+		for ( times ) { call( m1 ); },
+		result
+	)
+	printf( "%g\n", result );
 }
 
-int main(__attribute__((unused)) int argc, __attribute__((unused)) char* argv[]) {
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	T t;
-	return wait(m1);
+	wait( m1 );
 }
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/schedext/cfa2.cfa
===================================================================
--- benchmark/schedext/cfa2.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/schedext/cfa2.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -4,39 +4,32 @@
 #include <stdio.h>
 
-#include "bench.h"
+#include "../bench.h"
 
-int argc;
-char** argv;
-volatile int go = 0;
+monitor M {} m1, m2;
 
-monitor M {};
-M m1, m2;
-
-void __attribute__((noinline)) call( M & mutex a1, M & mutex a2 ) {}
-
-int  __attribute__((noinline)) wait( M & mutex a1, M & mutex a2 ) {
-	go = 1;
+void __attribute__((noinline)) call( M & mutex p1, M & mutex p2 ) {}
+void __attribute__((noinline)) wait( M & mutex p1, M & mutex p2 ) {
+	for ( times ) {
+		waitfor( call : p1, p2 );
+	}
+}
+thread T {};
+void main( T & ) {
 	BENCH(
-		for ( i; n ) {
-			waitfor(call, a1, a2);
+		for ( times ) {
+			call( m1, m2 );
 		},
 		result
 	)
-
-	printf("%g\n", result);
-	go = 0;
-	return 0;
+	printf( "%g\n", result );
 }
 
-thread T {};
-void ^?{}( T & mutex this ) {}
-void main( T & ) {
-	while(go == 0) { yield(); }
-	while(go == 1) { call(m1, m2); }
-
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+	T t;
+	wait( m1, m2 );
 }
 
-int main(__attribute__((unused)) int argc, __attribute__((unused)) char* argv[]) {
-	T t;
-	return wait(m1, m2);
-}
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/schedext/cfa4.cfa
===================================================================
--- benchmark/schedext/cfa4.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/schedext/cfa4.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -4,39 +4,32 @@
 #include <stdio.h>
 
-#include "bench.h"
+#include "../bench.h"
 
-int argc;
-char** argv;
-volatile int go = 0;
+monitor M {} m1, m2, m3, m4;
 
-monitor M {};
-M m1, m2, m3, m4;
-
-void __attribute__((noinline)) call( M & mutex a1, M & mutex a2, M & mutex a3, M & mutex a4 ) {}
-
-int  __attribute__((noinline)) wait( M & mutex a1, M & mutex a2, M & mutex a3, M & mutex a4 ) {
-	go = 1;
+void __attribute__((noinline)) call( M & mutex p1, M & mutex p2, M & mutex p3, M & mutex p4 ) {}
+void __attribute__((noinline)) wait( M & mutex p1, M & mutex p2, M & mutex p3, M & mutex p4 ) {
+	for ( times ) {
+		waitfor( call : p1, p2, p3, p4 );
+	}
+}
+thread T {};
+void main( T & ) {
 	BENCH(
-		for ( i; n ) {
-			waitfor(call, a1, a2, a3, a4);
+		for ( times ) {
+			call( m1, m2, m3, m4 );
 		},
 		result
 	)
-
-	printf("%g\n", result);
-	go = 0;
-	return 0;
+	printf( "%g\n", result );
 }
 
-thread T {};
-void ^?{}( T & mutex this ) {}
-void main( T & ) {
-	while(go == 0) { yield(); }
-	while(go == 1) { call(m1, m2, m3, m4); }
-
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+	T t;
+	wait( m1, m2, m3, m4 );
 }
 
-int main(__attribute__((unused)) int argc, __attribute__((unused)) char* argv[]) {
-	T t;
-	return wait(m1, m2, m3, m4);
-}
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/schedext/goroutine.go
===================================================================
--- benchmark/schedext/goroutine.go	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/schedext/goroutine.go	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,42 @@
+package main
+
+import (
+	"fmt"
+	"time"
+	"os"
+	"strconv"
+)
+
+func main() {
+	shake := make( chan bool )
+	ch := make( chan int )
+
+	acceptor := func(times int) {
+		var v int
+		v += 1 // need usage
+		for i := 0; i < times; i += 1 {
+			select {
+				case v = <- ch :
+			}
+		}
+		shake <- true   // indicate completion
+	}
+
+	var times int = 10000000
+	if len( os.Args ) > 2 { os.Exit( 1 ) }
+	if len( os.Args ) == 2 { times, _ = strconv.Atoi(os.Args[1]) }
+
+	go acceptor( times )
+	start := time.Now()
+	for i := 0; i < times; i += 1 {
+		ch <- 1
+	}
+	end := time.Now()
+	fmt.Printf("%d\n", end.Sub(start) / time.Duration(times))
+	<- shake
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "go run goroutine.go" //
+// End: //
Index: benchmark/schedext/upp.cc
===================================================================
--- benchmark/schedext/upp.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/schedext/upp.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -3,41 +3,33 @@
 #include "bench.h"
 
-int argc;
-char** argv;
-volatile int go = 0;
-
 _Monitor M {
 public:
 	void __attribute__((noinline)) call() {}
+	void __attribute__((noinline)) wait() {
+		for ( size_t i = 0; i < times; i++ ) {
+			_Accept(call);
+		}
+	}
+} m;
 
-	int __attribute__((noinline)) wait() {
-		go = 1;
+_Task T {
+	void main() {
 		BENCH(
-			for (size_t i = 0; i < n; i++) {
-				_Accept(call);
+			for ( size_t i = 0; i < times; i++ ) {
+				m.call();
 			},
 			result
 		)
-
-		printf("%g\n", result);
-		go = 0;
-		return 0;
+		printf( "%g\n", result );
 	}
 };
 
-M m;
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+	T t;
+	m.wait();
+}
 
-_Task T {
-	void main() {
-		while(go == 0) { yield(); }
-		while(go == 1) { m.call(); }
-
-	}
-};
-
-int main(int margc, char* margv[]) {
-	argc = margc;
-	argv = margv;
-	T t;
-	return m.wait();
-}
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/schedint/JavaThread.java
===================================================================
--- benchmark/schedint/JavaThread.java	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/schedint/JavaThread.java	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -49,8 +49,8 @@
 	static int x = 2;
 
-	static private final int NoOfTimes = Integer.parseInt("1000000") ;
+	static private int times = Integer.parseInt("1000000");
 
 	public static void helper( Monitor m ) throws InterruptedException {
-		for(int i = 1; i <= NoOfTimes; i += 1) {
+		for(int i = 1; i <= times; i += 1) {
 			m.wait();		// relase monitor lock
 			m.next = true;
@@ -63,5 +63,5 @@
 		synchronized(m) {
 			s.start();
-			while( !Monitor.go ) {
+			while( ! Monitor.go ) { // waiter must start first
 				Thread.yield();
 			}
@@ -72,7 +72,10 @@
 		Monitor.go = false;
 		s.join();
-		System.out.println( (end - start) / NoOfTimes);
+		System.out.println( (end - start) / times);
 	}
 	public static void main(String[] args) throws InterruptedException {
+		if ( args.length > 2 ) System.exit( 1 );
+		if ( args.length == 2 ) { times = Integer.parseInt(args[1]); }
+
 		for (int n = Integer.parseInt("5"); --n >= 0 ; ) { 
 			InnerMain();
@@ -83,2 +86,6 @@
 	}
 }
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/schedint/cfa1.cfa
===================================================================
--- benchmark/schedint/cfa1.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/schedint/cfa1.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -4,42 +4,38 @@
 #include <stdio.h>
 
-#include "bench.h"
+#include "../bench.h"
 
-int argc;
-char** argv;
 volatile int go = 0;
 
 condition c;
-monitor M {};
-M m1;
+monitor M {} m1;
 
-void __attribute__((noinline)) call( M & mutex a1 ) {
-	signal(c);
+void __attribute__((noinline)) call( M & mutex p1 ) {
+	signal( c );
 }
-
-int  __attribute__((noinline)) wait( M & mutex a1 ) {
+void __attribute__((noinline)) wait( M & mutex p1 ) {
 	go = 1;
-	BENCH(
-		for ( i; n ) {
-			wait(c);
-		},
-		result
-	)
-
-	printf("%g\n", result);
-	go = 0;
-	return 0;
+	for ( times ) {
+		wait( c );
+	}
 }
 
 thread T {};
-void ^?{}( T & mutex ) {}
 void main( T & ) {
-	while(go == 0) { yield(); }
-	while(go == 1) { call(m1); }
-
+	while ( go == 0 ) { yield(); } // waiter must start first
+	BENCH(
+		for ( times ) { call( m1 ); },
+		result
+	)
+	printf( "%g\n", result );
 }
 
-int main(__attribute__((unused)) int argc, __attribute__((unused)) char* argv[]) {
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	T t;
-	return wait(m1);
+	wait( m1 );
 }
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/schedint/cfa2.cfa
===================================================================
--- benchmark/schedint/cfa2.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/schedint/cfa2.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -4,42 +4,38 @@
 #include <stdio.h>
 
-#include "bench.h"
+#include "../bench.h"
 
-int argc;
-char** argv;
 volatile int go = 0;
 
 condition c;
-monitor M {};
-M m1, m2;
+monitor M {} m1, m2;
 
-void __attribute__((noinline)) call( M & mutex a1, M & mutex a2 ) {
-	signal(c);
+void __attribute__((noinline)) call( M & mutex p1, M & mutex p2 ) {
+	signal( c );
 }
-
-int  __attribute__((noinline)) wait( M & mutex a1, M & mutex a2 ) {
+void __attribute__((noinline)) wait( M & mutex p1, M & mutex p2 ) {
 	go = 1;
-	BENCH(
-		for ( i; n ) {
-			wait(c);
-		},
-		result
-	)
-
-	printf("%g\n", result);
-	go = 0;
-	return 0;
+	for ( times ) {
+		wait( c );
+	}
 }
 
 thread T {};
-void ^?{}( T & mutex this ) {}
 void main( T & ) {
-	while(go == 0) { yield(); }
-	while(go == 1) { call(m1, m2); }
-
+	while ( go == 0 ) { yield(); } // waiter must start first
+	BENCH(
+		for ( times ) { call( m1, m2 ); },
+		result
+	)
+	printf( "%g\n", result );
 }
 
-int main(__attribute__((unused)) int argc, __attribute__((unused)) char* argv[]) {
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	T t;
-	return wait(m1, m2);
+	wait( m1, m2 );
 }
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/schedint/cfa4.cfa
===================================================================
--- benchmark/schedint/cfa4.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/schedint/cfa4.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -4,42 +4,38 @@
 #include <stdio.h>
 
-#include "bench.h"
+#include "../bench.h"
 
-int argc;
-char** argv;
 volatile int go = 0;
 
 condition c;
-monitor M {};
-M m1, m2, m3, m4;
+monitor M {} m1, m2, m3, m4;
 
-void __attribute__((noinline)) call( M & mutex a1, M & mutex a2, M & mutex a3, M & mutex a4 ) {
-	signal(c);
+void __attribute__((noinline)) call( M & mutex p1, M & mutex p2, M & mutex p3, M & mutex p4 ) {
+	signal( c );
 }
-
-int  __attribute__((noinline)) wait( M & mutex a1, M & mutex a2, M & mutex a3, M & mutex a4 ) {
+void __attribute__((noinline)) wait( M & mutex p1, M & mutex p2, M & mutex p3, M & mutex p4 ) {
 	go = 1;
-	BENCH(
-		for ( i; n ) {
-			wait(c);
-		},
-		result
-	)
-
-	printf("%g\n", result);
-	go = 0;
-	return 0;
+	for ( times ) {
+		wait( c );
+	}
 }
 
 thread T {};
-void ^?{}( T & mutex this ) {}
 void main( T & ) {
-	while(go == 0) { yield(); }
-	while(go == 1) { call(m1, m2, m3, m4); }
-
+	while ( go == 0 ) { yield(); } // waiter must start first
+	BENCH(
+		for ( times ) { call( m1, m2, m3, m4 ); },
+		result
+	)
+	printf( "%g\n", result );
 }
 
-int main(__attribute__((unused)) int argc, __attribute__((unused)) char* argv[]) {
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	T t;
-	return wait(m1, m2, m3, m4);
+	wait( m1, m2, m3, m4 );
 }
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/schedint/pthreads.c
===================================================================
--- benchmark/schedint/pthreads.c	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/schedint/pthreads.c	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -4,50 +4,51 @@
 #include "bench.h"
 
-int argc;
-char** argv;
 volatile int go = 0;
 
+pthread_mutex_t m;
 pthread_cond_t c;
-pthread_mutex_t m;
 
 void __attribute__((noinline)) call() {
-	pthread_mutex_lock(&m);
-	pthread_cond_signal(&c);
-	pthread_mutex_unlock(&m);
+	pthread_mutex_lock( &m );
+	pthread_cond_signal( &c );
+	pthread_mutex_unlock( &m );
 }
 
-int  __attribute__((noinline)) wait() {
+void __attribute__((noinline)) wait() {
 	pthread_mutex_lock(&m);
 	go = 1;
+	for ( size_t i = 0; i < times; i++ ) {
+		pthread_cond_wait( &c, &m );
+	}
+	go = 0;
+	pthread_mutex_unlock( &m );
+}
+
+void * thread_main( __attribute__((unused)) void * arg ) {
+	while ( go == 0 ) { sched_yield(); } // waiter must start first
+	// barging for lock acquire => may not execute N times
 	BENCH(
-		for (size_t i = 0; i < n; i++) {
-			pthread_cond_wait(&c, &m);
-		},
+		while ( go == 1 ) { call(); },
 		result
 	)
-
-	printf("%g\n", result);
-	go = 0;
-	pthread_mutex_unlock(&m);
-	return 0;
-}
-
-void* thread_main(__attribute__((unused)) void * arg ) {
-	while(go == 0) { sched_yield(); }
-	while(go == 1) { call(); }
+	printf( "%g\n", result );
 	return NULL;
 }
 
-int main(__attribute__((unused)) int argc, __attribute__((unused)) char* argv[]) {
+int main( int argc, char * argv[] ) {
+	BENCH_START()
 	pthread_t thread;
-	if (pthread_create(&thread, NULL, thread_main, NULL) < 0) {
+	if ( pthread_create( &thread, NULL, thread_main, NULL ) < 0 ) {
 		perror( "failure" );
 		return 1;
 	}
 	wait();
-	if (pthread_join( thread, NULL) < 0) {
+	if ( pthread_join( thread, NULL ) < 0 ) {
 		perror( "failure" );
 		return 1;
 	}
-	return 0;
 }
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: benchmark/schedint/rust.rs
===================================================================
--- benchmark/schedint/rust.rs	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ benchmark/schedint/rust.rs	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,45 @@
+use std::env;
+use std::process;
+use std::thread;
+use std::sync::{Arc, Mutex, Condvar};
+use std::time::Instant;
+
+fn main() {
+	let mut times : u32 = 500000;
+	let args: Vec<String> = env::args().collect();
+	if args.len() > 2 { process::exit( 1 ); }
+	if args.len() == 2 { times = args[1].parse().unwrap(); }
+
+	let m = Arc::new(Mutex::new(0));
+	let c = Arc::new(Condvar::new());
+
+	let m2 = Arc::clone(&m);
+	let c2 = Arc::clone(&c);
+
+	let th = thread::spawn( move || {
+		while *m2.lock().unwrap() == 0 { // waiter must start first
+			thread::yield_now();
+		}
+		let start = Instant::now();
+		while *m2.lock().unwrap() == 1 {
+			c2.notify_one();
+		}
+		let duration = start.elapsed() / times;
+		println!( "{:?}", duration.as_nanos() );
+	});
+ 	{
+		let mut sc = m.lock().unwrap();
+		*sc = 1;
+		for _ in 1..times {
+			sc = c.wait(sc).unwrap();
+		}
+		*sc = 0;
+	}
+	th.join().unwrap();
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "rustc -C opt-level=3 rust.rs" //
+// End: //
+
Index: benchmark/schedint/upp.cc
===================================================================
--- benchmark/schedint/upp.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ benchmark/schedint/upp.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -3,6 +3,4 @@
 #include "bench.h"
 
-int argc;
-char** argv;
 volatile int go = 0;
 
@@ -13,32 +11,32 @@
 		cond.signal();
 	}
+	void __attribute__((noinline)) wait() {
+		go = 1;
+		for ( size_t i = 0; i < times; i++ ) {
+			cond.wait();
+		}
+	}
+} m;
 
-	int __attribute__((noinline)) wait() {
-		go = 1;
+_Task T {
+	void main() {
+		while ( go == 0 ) { yield(); } // waiter must start first
 		BENCH(
-			for (size_t i = 0; i < n; i++) {
-				cond.wait();
+			for ( size_t i = 0; i < times; i++ ) {
+				m.call();
 			},
 			result
 		)
-
-		printf("%g\n", result);
-		go = 0;
-		return 0;
+		printf( "%g\n", result );
 	}
 };
 
-M m;
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+	T t;
+	m.wait();
+}
 
-_Task T {
-	void main() {
-		while(go == 0) { yield(); }
-		while(go == 1) { m.call(); }
-
-	}
-};
-
-int main(__attribute__((unused)) int argc, __attribute__((unused)) char* argv[]) {
-	T t;
-	return m.wait();
-}
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: nchmark/tls-fetch_add.c
===================================================================
--- benchmark/tls-fetch_add.c	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ 	(revision )
@@ -1,27 +1,0 @@
-#include <stdbool.h>
-#include <stdio.h>
-
-#include "bench.h"
-
-#define thread_local _Thread_local
-
-thread_local volatile bool value;
-
-void __attribute__((noinline)) do_call() {
-	__atomic_store_n( &value, true, __ATOMIC_RELAXED );
-	__atomic_signal_fence(__ATOMIC_ACQUIRE);
-	asm volatile ("");
-	__atomic_store_n( &value, false, __ATOMIC_RELAXED );
-	__atomic_signal_fence(__ATOMIC_RELEASE);
-}
-
-int main(int argc, char* argv[]) {
-	BENCH(
-		for (size_t i = 0; i < n; i++) {
-			do_call();
-		},
-		result
-	)
-
-	printf("%g\n", result);
-}
Index: nchmark/ttst_lock.c
===================================================================
--- benchmark/ttst_lock.c	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ 	(revision )
@@ -1,50 +1,0 @@
-#include <stdio.h>
-#include <stdint.h>										// uintptr_t
-
-#include "bench.h"
-
-#define CALIGN __attribute__(( aligned (CACHE_ALIGN) ))
-#define CACHE_ALIGN 128
-#define Pause() __asm__ __volatile__ ( "pause" : : : )
-
-typedef uintptr_t TYPE;									// addressable word-size
-static volatile TYPE lock __attribute__(( aligned (128) )); // Intel recommendation
-static TYPE PAD CALIGN __attribute__(( unused ));		// protect further false sharing
-
-static inline void spin_lock( volatile TYPE *lock ) {
-	enum { SPIN_START = 4, SPIN_END = 64 * 1024, };
-	unsigned int spin = SPIN_START;
-
-	for ( unsigned int i = 1;; i += 1 ) {
-	  if ( *lock == 0 && __atomic_test_and_set( lock, __ATOMIC_ACQUIRE ) == 0 ) break;
-		for ( volatile unsigned int s = 0; s < spin; s += 1 ) Pause(); // exponential spin
-		//spin += spin;									// powers of 2
-		if ( i % 64 == 0 ) spin += spin;				// slowly increase by powers of 2
-		if ( spin > SPIN_END ) spin = SPIN_START;		// prevent overflow
-	} // for
-} // spin_lock
-
-static inline void spin_unlock( volatile TYPE *lock ) {
-	__atomic_clear( lock, __ATOMIC_RELEASE );
-} // spin_unlock
-
-void __attribute__((noinline)) do_call() {
-	spin_lock( &lock );
-//	asm volatile ("");
-	spin_unlock( &lock );
-}
-
-int main(int argc, char* argv[]) {
-	BENCH(
-		for (size_t i = 0; i < n; i++) {
-			do_call();
-		},
-		result
-		)
-
-		printf("%g\n", result);
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: driver/cc1.cc
===================================================================
--- driver/cc1.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ driver/cc1.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -335,4 +335,12 @@
 	#endif // __DEBUG_H__
 
+	enum {
+		Color_Auto   = 0,
+		Color_Always = 1,
+		Color_Never  = 2,
+	} color_arg = Color_Auto;
+
+	const char * color_names[3] = { "--colors=auto", "--colors=always", "--colors=never" };
+
 	// process all the arguments
 
@@ -341,4 +349,13 @@
 		if ( prefix( arg, "-" ) ) {
 			// strip inappropriate flags
+
+			if ( prefix( arg, "-fdiagnostics-color=" ) ) {
+				string choice = arg.substr(20);
+				     if(choice == "always") color_arg = Color_Always;
+				else if(choice == "never" ) color_arg = Color_Never;
+				else if(choice == "auto"  ) color_arg = Color_Auto;
+			} else if ( arg == "-fno-diagnostics-color" ) {
+				color_arg = Color_Auto;
+			}
 
 			if ( arg == "-quiet" || arg == "-version" || arg == "-fpreprocessed" ||
@@ -440,4 +457,7 @@
 			cargs[ncargs++] = cfa_cpp_out.c_str();
 		} // if
+
+		cargs[ncargs++] = color_names[color_arg];
+
 		cargs[ncargs] = nullptr;						// terminate argument list
 
Index: driver/cfa.cc
===================================================================
--- driver/cfa.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ driver/cfa.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Tue Aug 20 13:44:49 2002
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Sep 10 17:00:15 2019
-// Update Count     : 420
+// Last Modified On : Fri Jan 31 16:48:03 2020
+// Update Count     : 421
 //
 
@@ -187,4 +187,5 @@
 			} else if ( arg == "-XCFA" ) {				// CFA pass through
 				i += 1;
+				if ( i == argc ) continue;				// next argument available ?
 				Putenv( argv, argv[i] );
 
@@ -401,4 +402,6 @@
 		args[nargs++] = "-Xlinker";
 		args[nargs++] = "--undefined=__cfaabi_appready_startup";
+		args[nargs++] = "-z";
+		args[nargs++] = "execstack";
 
 		// include the cfa library in case it is needed
@@ -409,5 +412,5 @@
 		args[nargs++] = "-Wl,--pop-state";
 		args[nargs++] = "-lcfa";
-		args[nargs++] = "-lpthread";
+		args[nargs++] = "-pthread";
 		args[nargs++] = "-ldl";
 		args[nargs++] = "-lrt";
Index: libcfa/automake/missing
===================================================================
--- libcfa/automake/missing	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/automake/missing	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -1,1 +1,5 @@
-/usr/share/automake-1.15/missing
+#! /bin/sh
+# Tdelisle : having the Makefiles.in automatically regenerated causes problems
+#            when using multiple versions of automake, even if only on end user machines
+#            therefore I am disabling that feature by commenting this script
+exit 0
Index: libcfa/configure
===================================================================
--- libcfa/configure	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/configure	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -3000,5 +3000,5 @@
 case $CONFIGURATION in
 	"debug"   )
-		CONFIG_CFLAGS="-Og -g"
+		CONFIG_CFLAGS="-O0 -g"
 		CONFIG_CFAFLAGS="-debug"
 		CONFIG_BUILDLIB="yes"
Index: libcfa/configure.ac
===================================================================
--- libcfa/configure.ac	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/configure.ac	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -68,5 +68,5 @@
 case $CONFIGURATION in
 	"debug"   )
-		CONFIG_CFLAGS="-Og -g"
+		CONFIG_CFLAGS="-O0 -g"
 		CONFIG_CFAFLAGS="-debug"
 		CONFIG_BUILDLIB="yes"
Index: libcfa/prelude/Makefile.am
===================================================================
--- libcfa/prelude/Makefile.am	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/prelude/Makefile.am	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -11,6 +11,6 @@
 ## Created On       : Sun May 31 08:54:01 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Wed Dec 14 15:00:35 2016
-## Update Count     : 205
+## Last Modified On : Mon Feb  3 21:27:18 2020
+## Update Count     : 208
 ###############################################################################
 
@@ -36,4 +36,5 @@
 extras.cf : ${srcdir}/extras.regx ${srcdir}/extras.c
 	${AM_V_GEN}gcc ${AM_CFLAGS} -E ${srcdir}/extras.c | grep -f ${srcdir}/extras.regx > extras.cf
+	${AM_V_GEN}gcc ${AM_CFLAGS} -E ${srcdir}/extras.c | grep -zo -f ${srcdir}/extras.regx2 | tr '\0' '\n' >> extras.cf
 
 # create forward declarations for gcc builtins
Index: libcfa/prelude/Makefile.in
===================================================================
--- libcfa/prelude/Makefile.in	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/prelude/Makefile.in	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -1,6 +1,6 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
@@ -331,6 +331,6 @@
 	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
 	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
 	esac;
 
@@ -377,5 +377,8 @@
 
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
 	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
 	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -540,4 +543,5 @@
 extras.cf : ${srcdir}/extras.regx ${srcdir}/extras.c
 	${AM_V_GEN}gcc ${AM_CFLAGS} -E ${srcdir}/extras.c | grep -f ${srcdir}/extras.regx > extras.cf
+	${AM_V_GEN}gcc ${AM_CFLAGS} -E ${srcdir}/extras.c | grep -zo -f ${srcdir}/extras.regx2 | tr '\0' '\n' >> extras.cf
 
 # create forward declarations for gcc builtins
Index: libcfa/prelude/builtins.c
===================================================================
--- libcfa/prelude/builtins.c	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/prelude/builtins.c	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Fri Jul 21 16:21:03 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jun 25 18:06:52 2019
-// Update Count     : 97
+// Last Modified On : Thu Nov 21 16:31:39 2019
+// Update Count     : 101
 //
 
@@ -69,6 +69,5 @@
 
 // universal typed pointer constant
-// Compiler issue: there is a problem with anonymous types that do not have a size.
-static inline forall( dtype DT | sized(DT) ) DT * intptr( uintptr_t addr ) { return (DT *)addr; }
+static inline forall( dtype DT ) DT * intptr( uintptr_t addr ) { return (DT *)addr; }
 
 // exponentiation operator implementation
Index: libcfa/prelude/extras.regx
===================================================================
--- libcfa/prelude/extras.regx	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/prelude/extras.regx	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -24,8 +24,2 @@
 typedef.* char32_t;
 typedef.* wchar_t;
-extern.*\*malloc\(.*\).*
-extern.* free\(.*\).*
-extern.* exit\(.*\).*
-extern.* atexit\(.*\).*
-extern.* abort\(.*\).*
-extern.* printf\(.*\).*
Index: libcfa/prelude/extras.regx2
===================================================================
--- libcfa/prelude/extras.regx2	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ libcfa/prelude/extras.regx2	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,6 @@
+extern void \*malloc[^;]*;
+extern void free[^;]*;
+extern void exit[^;]*;
+extern int atexit[^;]*;
+extern void abort[^;]*;
+extern int printf[^;]*;
Index: libcfa/prelude/prototypes.awk
===================================================================
--- libcfa/prelude/prototypes.awk	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/prelude/prototypes.awk	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 # Created On       : Sat May 16 07:57:37 2015
 # Last Modified By : Peter A. Buhr
-# Last Modified On : Thu Jun  6 20:46:28 2019
-# Update Count     : 34
+# Last Modified On : Sat Feb  8 09:46:58 2020
+# Update Count     : 36
 #
 
@@ -17,5 +17,5 @@
 
 BEGIN {
-  FS = "[( )]"
+	FS = "[( )]"
 	# order so string search is longest string
 	i=-1
@@ -84,10 +84,10 @@
 
 /BT_FN/ {
-	for (i = 1; i <= NF; i++) {
-	  if( match($i, "BT_FN") != 0 ) {
-		prototypes[$i] = $i
-	  }
+	for (i = 1; i <= NF; i += 1 ) {
+		if ( match($i, "BT_FN") != 0 ) {
+			prototypes[$i] = $i
+		}
 	}
-  }
+}
 
 END {
@@ -103,47 +103,47 @@
 
 	for ( prototype in prototypes ) {
-	  # printf( "//\"%s\"\n", prototype )
-	  if ( index( "BT_LAST", prototype ) == 1 ) {
-		continue
-	  } # if
+		# printf( "//\"%s\"\n", prototype )
+		if ( index( "BT_LAST", prototype ) == 1 ) {
+			continue
+		} # if
 
-	  printf( "#define %s(NAME) FUNC_SIMPLE(", prototype )
+		printf( "#define %s(NAME) FUNC_SIMPLE(", prototype )
 
-	  if ( sub( "BT_FN_", "", prototype ) == 0 ) {
-		printf( "\n********** BAD MACRO NAME \"%s\" **********\n", prototype )
-		exit 0
-	  } # if
+		if ( sub( "BT_FN_", "", prototype ) == 0 ) {
+			printf( "\n********** BAD MACRO NAME \"%s\" **********\n", prototype )
+			exit 0
+		} # if
 
-	  # generate function return type as macro
-	  for ( t = 0; t < N; t += 1 ) {					# find longest match
-		type = types[t];
-		if ( index( prototype, type ) == 1 ) {		# found match
-		  printf( "BT_%s, NAME", type )
-		  sub( type, "", prototype )
-		  break;
+		# generate function return type as macro
+		for ( t = 0; t < N; t += 1 ) {					# find longest match
+			type = types[t];
+			if ( index( prototype, type ) == 1 ) {		# found match
+				printf( "BT_%s, NAME", type )
+				sub( type, "", prototype )
+				break;
+			} # if
+		} # for
+
+		# generate function parameter types as macro
+		if ( index( prototype, "VAR" ) != 2 ) {			# C-style empty parameters ?
+			for ( p = 0; length( prototype ) > 0; p += 1 ) { # until all parameters types are removed
+				sub( "_", "", prototype)				# remove "_"
+				printf( ", ", type )
+				temp = prototype
+				for ( t = 0; t < N; t += 1 ) {			# find longest match
+					type = types[t];
+					if ( index( prototype, type ) == 1 ) { # found match
+						printf( "BT_%s", type )
+						sub( type, "", prototype )
+						break;
+					} # if
+				} # for
+				if ( temp == prototype ) {				# no match found for parameter in macro table
+					printf( "\n********** MISSING TYPE \"%s\" **********\n", prototype )
+					exit 0
+				} # if
+			} # for
 		} # if
-	  } # for
-
-	  # generate function parameter types as macro
-	  if ( index( prototype, "VAR" ) != 2 ) {			# C-style empty parameters ?
-		for ( p = 0; length( prototype ) > 0; p += 1 ) { # until all parameters types are removed
-		  sub( "_", "", prototype)				# remove "_"
-		  printf( ", ", type )
-		  temp = prototype
-		  for ( t = 0; t < N; t += 1 ) {			# find longest match
-			type = types[t];
-			if ( index( prototype, type ) == 1 ) { # found match
-			  printf( "BT_%s", type )
-			  sub( type, "", prototype )
-			  break;
-			} # if
-		  } # for
-		  if ( temp == prototype ) {				# no match found for parameter in macro table
-			printf( "\n********** MISSING TYPE \"%s\" **********\n", prototype )
-			exit 0
-		  } # if
-		} # for
-	  } # if
-	  printf( ")\n" )
+		printf( ")\n" )
 	} # for
 
Index: libcfa/prelude/sync-builtins.cf
===================================================================
--- libcfa/prelude/sync-builtins.cf	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/prelude/sync-builtins.cf	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -1,402 +1,258 @@
 char __sync_fetch_and_add(volatile char *, char,...);
-char __sync_fetch_and_add_1(volatile char *, char,...);
 signed char __sync_fetch_and_add(volatile signed char *, signed char,...);
-signed char __sync_fetch_and_add_1(volatile signed char *, signed char,...);
 unsigned char __sync_fetch_and_add(volatile unsigned char *, unsigned char,...);
-unsigned char __sync_fetch_and_add_1(volatile unsigned char *, unsigned char,...);
 signed short __sync_fetch_and_add(volatile signed short *, signed short,...);
-signed short __sync_fetch_and_add_2(volatile signed short *, signed short,...);
 unsigned short __sync_fetch_and_add(volatile unsigned short *, unsigned short,...);
-unsigned short __sync_fetch_and_add_2(volatile unsigned short *, unsigned short,...);
 signed int __sync_fetch_and_add(volatile signed int *, signed int,...);
-signed int __sync_fetch_and_add_4(volatile signed int *, signed int,...);
 unsigned int __sync_fetch_and_add(volatile unsigned int *, unsigned int,...);
-unsigned int __sync_fetch_and_add_4(volatile unsigned int *, unsigned int,...);
+signed long int __sync_fetch_and_add(volatile signed long int *, signed long int,...);
+unsigned long int __sync_fetch_and_add(volatile unsigned long int *, unsigned long int,...);
 signed long long int __sync_fetch_and_add(volatile signed long long int *, signed long long int,...);
-signed long long int __sync_fetch_and_add_8(volatile signed long long int *, signed long long int,...);
 unsigned long long int __sync_fetch_and_add(volatile unsigned long long int *, unsigned long long int,...);
-unsigned long long int __sync_fetch_and_add_8(volatile unsigned long long int *, unsigned long long int,...);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __sync_fetch_and_add(volatile signed __int128 *, signed __int128,...);
-signed __int128 __sync_fetch_and_add_16(volatile signed __int128 *, signed __int128,...);
 unsigned __int128 __sync_fetch_and_add(volatile unsigned __int128 *, unsigned __int128,...);
-unsigned __int128 __sync_fetch_and_add_16(volatile unsigned __int128 *, unsigned __int128,...);
 #endif
 
 char __sync_fetch_and_sub(volatile char *, char,...);
-char __sync_fetch_and_sub_1(volatile char *, char,...);
 signed char __sync_fetch_and_sub(volatile signed char *, signed char,...);
-signed char __sync_fetch_and_sub_1(volatile signed char *, signed char,...);
 unsigned char __sync_fetch_and_sub(volatile unsigned char *, unsigned char,...);
-unsigned char __sync_fetch_and_sub_1(volatile unsigned char *, unsigned char,...);
 signed short __sync_fetch_and_sub(volatile signed short *, signed short,...);
-signed short __sync_fetch_and_sub_2(volatile signed short *, signed short,...);
 unsigned short __sync_fetch_and_sub(volatile unsigned short *, unsigned short,...);
-unsigned short __sync_fetch_and_sub_2(volatile unsigned short *, unsigned short,...);
 signed int __sync_fetch_and_sub(volatile signed int *, signed int,...);
-signed int __sync_fetch_and_sub_4(volatile signed int *, signed int,...);
 unsigned int __sync_fetch_and_sub(volatile unsigned int *, unsigned int,...);
-unsigned int __sync_fetch_and_sub_4(volatile unsigned int *, unsigned int,...);
+signed long int __sync_fetch_and_sub(volatile signed long int *, signed long int,...);
+unsigned long int __sync_fetch_and_sub(volatile unsigned long int *, unsigned long int,...);
 signed long long int __sync_fetch_and_sub(volatile signed long long int *, signed long long int,...);
-signed long long int __sync_fetch_and_sub_8(volatile signed long long int *, signed long long int,...);
 unsigned long long int __sync_fetch_and_sub(volatile unsigned long long int *, unsigned long long int,...);
-unsigned long long int __sync_fetch_and_sub_8(volatile unsigned long long int *, unsigned long long int,...);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __sync_fetch_and_sub(volatile signed __int128 *, signed __int128,...);
-signed __int128 __sync_fetch_and_sub_16(volatile signed __int128 *, signed __int128,...);
 unsigned __int128 __sync_fetch_and_sub(volatile unsigned __int128 *, unsigned __int128,...);
-unsigned __int128 __sync_fetch_and_sub_16(volatile unsigned __int128 *, unsigned __int128,...);
 #endif
 
 char __sync_fetch_and_or(volatile char *, char,...);
-char __sync_fetch_and_or_1(volatile char *, char,...);
 signed char __sync_fetch_and_or(volatile signed char *, signed char,...);
-signed char __sync_fetch_and_or_1(volatile signed char *, signed char,...);
 unsigned char __sync_fetch_and_or(volatile unsigned char *, unsigned char,...);
-unsigned char __sync_fetch_and_or_1(volatile unsigned char *, unsigned char,...);
 signed short __sync_fetch_and_or(volatile signed short *, signed short,...);
-signed short __sync_fetch_and_or_2(volatile signed short *, signed short,...);
 unsigned short __sync_fetch_and_or(volatile unsigned short *, unsigned short,...);
-unsigned short __sync_fetch_and_or_2(volatile unsigned short *, unsigned short,...);
 signed int __sync_fetch_and_or(volatile signed int *, signed int,...);
-signed int __sync_fetch_and_or_4(volatile signed int *, signed int,...);
 unsigned int __sync_fetch_and_or(volatile unsigned int *, unsigned int,...);
-unsigned int __sync_fetch_and_or_4(volatile unsigned int *, unsigned int,...);
+signed long int __sync_fetch_and_or(volatile signed long int *, signed long int,...);
+unsigned long int __sync_fetch_and_or(volatile unsigned long int *, unsigned long int,...);
 signed long long int __sync_fetch_and_or(volatile signed long long int *, signed long long int,...);
-signed long long int __sync_fetch_and_or_8(volatile signed long long int *, signed long long int,...);
 unsigned long long int __sync_fetch_and_or(volatile unsigned long long int *, unsigned long long int,...);
-unsigned long long int __sync_fetch_and_or_8(volatile unsigned long long int *, unsigned long long int,...);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __sync_fetch_and_or(volatile signed __int128 *, signed __int128,...);
-signed __int128 __sync_fetch_and_or_16(volatile signed __int128 *, signed __int128,...);
 unsigned __int128 __sync_fetch_and_or(volatile unsigned __int128 *, unsigned __int128,...);
-unsigned __int128 __sync_fetch_and_or_16(volatile unsigned __int128 *, unsigned __int128,...);
 #endif
 
 char __sync_fetch_and_and(volatile char *, char,...);
-char __sync_fetch_and_and_1(volatile char *, char,...);
 signed char __sync_fetch_and_and(volatile signed char *, signed char,...);
-signed char __sync_fetch_and_and_1(volatile signed char *, signed char,...);
 unsigned char __sync_fetch_and_and(volatile unsigned char *, unsigned char,...);
-unsigned char __sync_fetch_and_and_1(volatile unsigned char *, unsigned char,...);
 signed short __sync_fetch_and_and(volatile signed short *, signed short,...);
-signed short __sync_fetch_and_and_2(volatile signed short *, signed short,...);
 unsigned short __sync_fetch_and_and(volatile unsigned short *, unsigned short,...);
-unsigned short __sync_fetch_and_and_2(volatile unsigned short *, unsigned short,...);
 signed int __sync_fetch_and_and(volatile signed int *, signed int,...);
-signed int __sync_fetch_and_and_4(volatile signed int *, signed int,...);
 unsigned int __sync_fetch_and_and(volatile unsigned int *, unsigned int,...);
-unsigned int __sync_fetch_and_and_4(volatile unsigned int *, unsigned int,...);
+signed long int __sync_fetch_and_and(volatile signed long int *, signed long int,...);
+unsigned long int __sync_fetch_and_and(volatile unsigned long int *, unsigned long int,...);
 signed long long int __sync_fetch_and_and(volatile signed long long int *, signed long long int,...);
-signed long long int __sync_fetch_and_and_8(volatile signed long long int *, signed long long int,...);
 unsigned long long int __sync_fetch_and_and(volatile unsigned long long int *, unsigned long long int,...);
-unsigned long long int __sync_fetch_and_and_8(volatile unsigned long long int *, unsigned long long int,...);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __sync_fetch_and_and(volatile signed __int128 *, signed __int128,...);
-signed __int128 __sync_fetch_and_and_16(volatile signed __int128 *, signed __int128,...);
 unsigned __int128 __sync_fetch_and_and(volatile unsigned __int128 *, unsigned __int128,...);
-unsigned __int128 __sync_fetch_and_and_16(volatile unsigned __int128 *, unsigned __int128,...);
 #endif
 
 char __sync_fetch_and_xor(volatile char *, char,...);
-char __sync_fetch_and_xor_1(volatile char *, char,...);
 signed char __sync_fetch_and_xor(volatile signed char *, signed char,...);
-signed char __sync_fetch_and_xor_1(volatile signed char *, signed char,...);
 unsigned char __sync_fetch_and_xor(volatile unsigned char *, unsigned char,...);
-unsigned char __sync_fetch_and_xor_1(volatile unsigned char *, unsigned char,...);
 signed short __sync_fetch_and_xor(volatile signed short *, signed short,...);
-signed short __sync_fetch_and_xor_2(volatile signed short *, signed short,...);
 unsigned short __sync_fetch_and_xor(volatile unsigned short *, unsigned short,...);
-unsigned short __sync_fetch_and_xor_2(volatile unsigned short *, unsigned short,...);
 signed int __sync_fetch_and_xor(volatile signed int *, signed int,...);
-signed int __sync_fetch_and_xor_4(volatile signed int *, signed int,...);
 unsigned int __sync_fetch_and_xor(volatile unsigned int *, unsigned int,...);
-unsigned int __sync_fetch_and_xor_4(volatile unsigned int *, unsigned int,...);
+signed long int __sync_fetch_and_xor(volatile signed long int *, signed long int,...);
+unsigned long int __sync_fetch_and_xor(volatile unsigned long int *, unsigned long int,...);
 signed long long int __sync_fetch_and_xor(volatile signed long long int *, signed long long int,...);
-signed long long int __sync_fetch_and_xor_8(volatile signed long long int *, signed long long int,...);
 unsigned long long int __sync_fetch_and_xor(volatile unsigned long long int *, unsigned long long int,...);
-unsigned long long int __sync_fetch_and_xor_8(volatile unsigned long long int *, unsigned long long int,...);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __sync_fetch_and_xor(volatile signed __int128 *, signed __int128,...);
-signed __int128 __sync_fetch_and_xor_16(volatile signed __int128 *, signed __int128,...);
 unsigned __int128 __sync_fetch_and_xor(volatile unsigned __int128 *, unsigned __int128,...);
-unsigned __int128 __sync_fetch_and_xor_16(volatile unsigned __int128 *, unsigned __int128,...);
 #endif
 
 char __sync_fetch_and_nand(volatile char *, char,...);
-char __sync_fetch_and_nand_1(volatile char *, char,...);
 signed char __sync_fetch_and_nand(volatile signed char *, signed char,...);
-signed char __sync_fetch_and_nand_1(volatile signed char *, signed char,...);
 unsigned char __sync_fetch_and_nand(volatile unsigned char *, unsigned char,...);
-unsigned char __sync_fetch_and_nand_1(volatile unsigned char *, unsigned char,...);
 signed short __sync_fetch_and_nand(volatile signed short *, signed short,...);
-signed short __sync_fetch_and_nand_2(volatile signed short *, signed short,...);
 unsigned short __sync_fetch_and_nand(volatile unsigned short *, unsigned short,...);
-unsigned short __sync_fetch_and_nand_2(volatile unsigned short *, unsigned short,...);
 signed int __sync_fetch_and_nand(volatile signed int *, signed int,...);
-signed int __sync_fetch_and_nand_4(volatile signed int *, signed int,...);
 unsigned int __sync_fetch_and_nand(volatile unsigned int *, unsigned int,...);
-unsigned int __sync_fetch_and_nand_4(volatile unsigned int *, unsigned int,...);
+signed long int __sync_fetch_and_nand(volatile signed long int *, signed long int,...);
+unsigned long int __sync_fetch_and_nand(volatile unsigned long int *, unsigned long int,...);
 signed long long int __sync_fetch_and_nand(volatile signed long long int *, signed long long int,...);
-signed long long int __sync_fetch_and_nand_8(volatile signed long long int *, signed long long int,...);
 unsigned long long int __sync_fetch_and_nand(volatile unsigned long long int *, unsigned long long int,...);
-unsigned long long int __sync_fetch_and_nand_8(volatile unsigned long long int *, unsigned long long int,...);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __sync_fetch_and_nand(volatile signed __int128 *, signed __int128,...);
-signed __int128 __sync_fetch_and_nand_16(volatile signed __int128 *, signed __int128,...);
 unsigned __int128 __sync_fetch_and_nand(volatile unsigned __int128 *, unsigned __int128,...);
-unsigned __int128 __sync_fetch_and_nand_16(volatile unsigned __int128 *, unsigned __int128,...);
 #endif
 
 char __sync_add_and_fetch(volatile char *, char,...);
-char __sync_add_and_fetch_1(volatile char *, char,...);
 signed char __sync_add_and_fetch(volatile signed char *, signed char,...);
-signed char __sync_add_and_fetch_1(volatile signed char *, signed char,...);
 unsigned char __sync_add_and_fetch(volatile unsigned char *, unsigned char,...);
-unsigned char __sync_add_and_fetch_1(volatile unsigned char *, unsigned char,...);
 signed short __sync_add_and_fetch(volatile signed short *, signed short,...);
-signed short __sync_add_and_fetch_2(volatile signed short *, signed short,...);
 unsigned short __sync_add_and_fetch(volatile unsigned short *, unsigned short,...);
-unsigned short __sync_add_and_fetch_2(volatile unsigned short *, unsigned short,...);
 signed int __sync_add_and_fetch(volatile signed int *, signed int,...);
-signed int __sync_add_and_fetch_4(volatile signed int *, signed int,...);
 signed int __sync_add_and_fetch(volatile signed int *, signed int,...);
-signed int __sync_add_and_fetch_4(volatile signed int *, signed int,...);
+signed long int __sync_add_and_fetch(volatile signed long int *, signed long int,...);
+unsigned long int __sync_add_and_fetch(volatile unsigned long int *, unsigned long int,...);
 signed long long int __sync_add_and_fetch(volatile signed long long int *, signed long long int,...);
-signed long long int __sync_add_and_fetch_8(volatile signed long long int *, signed long long int,...);
 unsigned long long int __sync_add_and_fetch(volatile unsigned long long int *, unsigned long long int,...);
-unsigned long long int __sync_add_and_fetch_8(volatile unsigned long long int *, unsigned long long int,...);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __sync_add_and_fetch(volatile signed __int128 *, signed __int128,...);
-signed __int128 __sync_add_and_fetch_16(volatile signed __int128 *, signed __int128,...);
 unsigned __int128 __sync_add_and_fetch(volatile unsigned __int128 *, unsigned __int128,...);
-unsigned __int128 __sync_add_and_fetch_16(volatile unsigned __int128 *, unsigned __int128,...);
 #endif
 
 char __sync_sub_and_fetch(volatile char *, char,...);
-char __sync_sub_and_fetch_1(volatile char *, char,...);
 signed char __sync_sub_and_fetch(volatile signed char *, signed char,...);
-signed char __sync_sub_and_fetch_1(volatile signed char *, signed char,...);
 unsigned char __sync_sub_and_fetch(volatile unsigned char *, unsigned char,...);
-unsigned char __sync_sub_and_fetch_1(volatile unsigned char *, unsigned char,...);
 signed short __sync_sub_and_fetch(volatile signed short *, signed short,...);
-signed short __sync_sub_and_fetch_2(volatile signed short *, signed short,...);
 unsigned short __sync_sub_and_fetch(volatile unsigned short *, unsigned short,...);
-unsigned short __sync_sub_and_fetch_2(volatile unsigned short *, unsigned short,...);
 signed int __sync_sub_and_fetch(volatile signed int *, signed int,...);
-signed int __sync_sub_and_fetch_4(volatile signed int *, signed int,...);
 unsigned int __sync_sub_and_fetch(volatile unsigned int *, unsigned int,...);
-unsigned int __sync_sub_and_fetch_4(volatile unsigned int *, unsigned int,...);
+signed long int __sync_sub_and_fetch(volatile signed long int *, signed long int,...);
+unsigned long int __sync_sub_and_fetch(volatile unsigned long int *, unsigned long int,...);
 signed long long int __sync_sub_and_fetch(volatile signed long long int *, signed long long int,...);
-signed long long int __sync_sub_and_fetch_8(volatile signed long long int *, signed long long int,...);
 unsigned long long int __sync_sub_and_fetch(volatile unsigned long long int *, unsigned long long int,...);
-unsigned long long int __sync_sub_and_fetch_8(volatile unsigned long long int *, unsigned long long int,...);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __sync_sub_and_fetch(volatile signed __int128 *, signed __int128,...);
-signed __int128 __sync_sub_and_fetch_16(volatile signed __int128 *, signed __int128,...);
 unsigned __int128 __sync_sub_and_fetch(volatile unsigned __int128 *, unsigned __int128,...);
-unsigned __int128 __sync_sub_and_fetch_16(volatile unsigned __int128 *, unsigned __int128,...);
 #endif
 
 char __sync_or_and_fetch(volatile char *, char,...);
-char __sync_or_and_fetch_1(volatile char *, char,...);
 signed char __sync_or_and_fetch(volatile signed char *, signed char,...);
-signed char __sync_or_and_fetch_1(volatile signed char *, signed char,...);
 unsigned char __sync_or_and_fetch(volatile unsigned char *, unsigned char,...);
-unsigned char __sync_or_and_fetch_1(volatile unsigned char *, unsigned char,...);
 signed short __sync_or_and_fetch(volatile signed short *, signed short,...);
-signed short __sync_or_and_fetch_2(volatile signed short *, signed short,...);
 unsigned short __sync_or_and_fetch(volatile unsigned short *, unsigned short,...);
-unsigned short __sync_or_and_fetch_2(volatile unsigned short *, unsigned short,...);
 signed int __sync_or_and_fetch(volatile signed int *, signed int,...);
-signed int __sync_or_and_fetch_4(volatile signed int *, signed int,...);
 unsigned int __sync_or_and_fetch(volatile unsigned int *, unsigned int,...);
-unsigned int __sync_or_and_fetch_4(volatile unsigned int *, unsigned int,...);
+signed long int __sync_or_and_fetch(volatile signed long int *, signed long int,...);
+unsigned long int __sync_or_and_fetch(volatile unsigned long int *, unsigned long int,...);
 signed long long int __sync_or_and_fetch(volatile signed long long int *, signed long long int,...);
-signed long long int __sync_or_and_fetch_8(volatile signed long long int *, signed long long int,...);
 unsigned long long int __sync_or_and_fetch(volatile unsigned long long int *, unsigned long long int,...);
-unsigned long long int __sync_or_and_fetch_8(volatile unsigned long long int *, unsigned long long int,...);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __sync_or_and_fetch(volatile signed __int128 *, signed __int128,...);
-signed __int128 __sync_or_and_fetch_16(volatile signed __int128 *, signed __int128,...);
 unsigned __int128 __sync_or_and_fetch(volatile unsigned __int128 *, unsigned __int128,...);
-unsigned __int128 __sync_or_and_fetch_16(volatile unsigned __int128 *, unsigned __int128,...);
 #endif
 
 char __sync_and_and_fetch(volatile char *, char,...);
-char __sync_and_and_fetch_1(volatile char *, char,...);
 signed char __sync_and_and_fetch(volatile signed char *, signed char,...);
-signed char __sync_and_and_fetch_1(volatile signed char *, signed char,...);
 unsigned char __sync_and_and_fetch(volatile unsigned char *, unsigned char,...);
-unsigned char __sync_and_and_fetch_1(volatile unsigned char *, unsigned char,...);
 signed short __sync_and_and_fetch(volatile signed short *, signed short,...);
-signed short __sync_and_and_fetch_2(volatile signed short *, signed short,...);
 unsigned short __sync_and_and_fetch(volatile unsigned short *, unsigned short,...);
-unsigned short __sync_and_and_fetch_2(volatile unsigned short *, unsigned short,...);
 signed int __sync_and_and_fetch(volatile signed int *, signed int,...);
-signed int __sync_and_and_fetch_4(volatile signed int *, signed int,...);
 unsigned int __sync_and_and_fetch(volatile unsigned int *, unsigned int,...);
-unsigned int __sync_and_and_fetch_4(volatile unsigned int *, unsigned int,...);
+signed long int __sync_and_and_fetch(volatile signed long int *, signed long int,...);
+unsigned long int __sync_and_and_fetch(volatile unsigned long int *, unsigned long int,...);
 signed long long int __sync_and_and_fetch(volatile signed long long int *, signed long long int,...);
-signed long long int __sync_and_and_fetch_8(volatile signed long long int *, signed long long int,...);
 unsigned long long int __sync_and_and_fetch(volatile unsigned long long int *, unsigned long long int,...);
-unsigned long long int __sync_and_and_fetch_8(volatile unsigned long long int *, unsigned long long int,...);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __sync_and_and_fetch(volatile signed __int128 *, signed __int128,...);
-signed __int128 __sync_and_and_fetch_16(volatile signed __int128 *, signed __int128,...);
 unsigned __int128 __sync_and_and_fetch(volatile unsigned __int128 *, unsigned __int128,...);
-unsigned __int128 __sync_and_and_fetch_16(volatile unsigned __int128 *, unsigned __int128,...);
 #endif
 
 char __sync_xor_and_fetch(volatile char *, char,...);
-char __sync_xor_and_fetch_1(volatile char *, char,...);
 signed char __sync_xor_and_fetch(volatile signed char *, signed char,...);
-signed char __sync_xor_and_fetch_1(volatile signed char *, signed char,...);
 unsigned char __sync_xor_and_fetch(volatile unsigned char *, unsigned char,...);
-unsigned char __sync_xor_and_fetch_1(volatile unsigned char *, unsigned char,...);
 signed short __sync_xor_and_fetch(volatile signed short *, signed short,...);
-signed short __sync_xor_and_fetch_2(volatile signed short *, signed short,...);
 unsigned short __sync_xor_and_fetch(volatile unsigned short *, unsigned short,...);
-unsigned short __sync_xor_and_fetch_2(volatile unsigned short *, unsigned short,...);
 signed int __sync_xor_and_fetch(volatile signed int *, signed int,...);
-signed int __sync_xor_and_fetch_4(volatile signed int *, signed int,...);
 unsigned int __sync_xor_and_fetch(volatile unsigned int *, unsigned int,...);
-unsigned int __sync_xor_and_fetch_4(volatile unsigned int *, unsigned int,...);
+signed long int __sync_xor_and_fetch(volatile signed long int *, signed long int,...);
+unsigned long int __sync_xor_and_fetch(volatile unsigned long int *, unsigned long int,...);
 signed long long int __sync_xor_and_fetch(volatile signed long long int *, signed long long int,...);
-signed long long int __sync_xor_and_fetch_8(volatile signed long long int *, signed long long int,...);
 unsigned long long int __sync_xor_and_fetch(volatile unsigned long long int *, unsigned long long int,...);
-unsigned long long int __sync_xor_and_fetch_8(volatile unsigned long long int *, unsigned long long int,...);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __sync_xor_and_fetch(volatile signed __int128 *, signed __int128,...);
-signed __int128 __sync_xor_and_fetch_16(volatile signed __int128 *, signed __int128,...);
 unsigned __int128 __sync_xor_and_fetch(volatile unsigned __int128 *, unsigned __int128,...);
-unsigned __int128 __sync_xor_and_fetch_16(volatile unsigned __int128 *, unsigned __int128,...);
 #endif
 
 char __sync_nand_and_fetch(volatile char *, char,...);
-char __sync_nand_and_fetch_1(volatile char *, char,...);
 signed char __sync_nand_and_fetch(volatile signed char *, signed char,...);
-signed char __sync_nand_and_fetch_1(volatile signed char *, signed char,...);
 unsigned char __sync_nand_and_fetch(volatile unsigned char *, unsigned char,...);
-unsigned char __sync_nand_and_fetch_1(volatile unsigned char *, unsigned char,...);
 signed short __sync_nand_and_fetch(volatile signed short *, signed short,...);
-signed short __sync_nand_and_fetch_2(volatile signed short *, signed short,...);
 unsigned short __sync_nand_and_fetch(volatile unsigned short *, unsigned short,...);
-unsigned short __sync_nand_and_fetch_2(volatile unsigned short *, unsigned short,...);
 signed int __sync_nand_and_fetch(volatile signed int *, signed int,...);
-signed int __sync_nand_and_fetch_4(volatile signed int *, signed int,...);
 unsigned int __sync_nand_and_fetch(volatile unsigned int *, unsigned int,...);
-unsigned int __sync_nand_and_fetch_4(volatile unsigned int *, unsigned int,...);
+signed long int __sync_nand_and_fetch(volatile signed long int *, signed long int,...);
+unsigned long int __sync_nand_and_fetch(volatile unsigned long int *, unsigned long int,...);
 signed long long int __sync_nand_and_fetch(volatile signed long long int *, signed long long int,...);
-signed long long int __sync_nand_and_fetch_8(volatile signed long long int *, signed long long int,...);
 unsigned long long int __sync_nand_and_fetch(volatile unsigned long long int *, unsigned long long int,...);
-unsigned long long int __sync_nand_and_fetch_8(volatile unsigned long long int *, unsigned long long int,...);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __sync_nand_and_fetch(volatile signed __int128 *, signed __int128,...);
-signed __int128 __sync_nand_and_fetch_16(volatile signed __int128 *, signed __int128,...);
 unsigned __int128 __sync_nand_and_fetch(volatile unsigned __int128 *, unsigned __int128,...);
-unsigned __int128 __sync_nand_and_fetch_16(volatile unsigned __int128 *, unsigned __int128,...);
 #endif
 
 _Bool __sync_bool_compare_and_swap(volatile char *, char, char,...);
-_Bool __sync_bool_compare_and_swap_1(volatile char *, char, char,...);
 _Bool __sync_bool_compare_and_swap(volatile signed char *, signed char, signed char,...);
-_Bool __sync_bool_compare_and_swap_1(volatile signed char *, signed char, signed char,...);
 _Bool __sync_bool_compare_and_swap(volatile unsigned char *, unsigned char, unsigned char,...);
-_Bool __sync_bool_compare_and_swap_1(volatile unsigned char *, unsigned char, unsigned char,...);
 _Bool __sync_bool_compare_and_swap(volatile short *, signed short, signed short,...);
-_Bool __sync_bool_compare_and_swap_2(volatile short *, signed short, signed short,...);
 _Bool __sync_bool_compare_and_swap(volatile short *, unsigned short, unsigned short,...);
-_Bool __sync_bool_compare_and_swap_2(volatile short *, unsigned short, unsigned short,...);
 _Bool __sync_bool_compare_and_swap(volatile signed int *, signed int, signed int,...);
-_Bool __sync_bool_compare_and_swap_4(volatile signed int *, signed int, signed int,...);
 _Bool __sync_bool_compare_and_swap(volatile unsigned int *, unsigned int, unsigned int,...);
-_Bool __sync_bool_compare_and_swap_4(volatile unsigned int *, unsigned int, unsigned int,...);
+_Bool __sync_bool_compare_and_swap(volatile signed long int *, signed long int, signed long int,...);
+_Bool __sync_bool_compare_and_swap(volatile unsigned long int *, unsigned long int, unsigned long int,...);
 _Bool __sync_bool_compare_and_swap(volatile signed long long int *, signed long long int, signed long long int,...);
-_Bool __sync_bool_compare_and_swap_8(volatile signed long long int *, signed long long int, signed long long int,...);
 _Bool __sync_bool_compare_and_swap(volatile unsigned long long int *, unsigned long long int, unsigned long long int,...);
-_Bool __sync_bool_compare_and_swap_8(volatile unsigned long long int *, unsigned long long int, unsigned long long int,...);
 #if defined(__SIZEOF_INT128__)
 _Bool __sync_bool_compare_and_swap(volatile signed __int128 *, signed __int128, signed __int128,...);
-_Bool __sync_bool_compare_and_swap_16(volatile signed __int128 *, signed __int128, signed __int128,...);
 _Bool __sync_bool_compare_and_swap(volatile unsigned __int128 *, unsigned __int128, unsigned __int128,...);
-_Bool __sync_bool_compare_and_swap_16(volatile unsigned __int128 *, unsigned __int128, unsigned __int128,...);
 #endif
 forall(dtype T) _Bool __sync_bool_compare_and_swap(T * volatile *, T *, T*, ...);
 
 char __sync_val_compare_and_swap(volatile char *, char, char,...);
-char __sync_val_compare_and_swap_1(volatile char *, char, char,...);
 signed char __sync_val_compare_and_swap(volatile signed char *, signed char, signed char,...);
-signed char __sync_val_compare_and_swap_1(volatile signed char *, signed char, signed char,...);
 unsigned char __sync_val_compare_and_swap(volatile unsigned char *, unsigned char, unsigned char,...);
-unsigned char __sync_val_compare_and_swap_1(volatile unsigned char *, unsigned char, unsigned char,...);
 signed short __sync_val_compare_and_swap(volatile signed short *, signed short, signed short,...);
-signed short __sync_val_compare_and_swap_2(volatile signed short *, signed short, signed short,...);
 unsigned short __sync_val_compare_and_swap(volatile unsigned short *, unsigned short, unsigned short,...);
-unsigned short __sync_val_compare_and_swap_2(volatile unsigned short *, unsigned short, unsigned short,...);
 signed int __sync_val_compare_and_swap(volatile signed int *, signed int, signed int,...);
-signed int __sync_val_compare_and_swap_4(volatile signed int *, signed int, signed int,...);
 unsigned int __sync_val_compare_and_swap(volatile unsigned int *, unsigned int, unsigned int,...);
-unsigned int __sync_val_compare_and_swap_4(volatile unsigned int *, unsigned int, unsigned int,...);
+signed long int __sync_val_compare_and_swap(volatile signed long int *, signed long int, signed long int,...);
+unsigned long int __sync_val_compare_and_swap(volatile unsigned long int *, unsigned long int, unsigned long int,...);
 signed long long int __sync_val_compare_and_swap(volatile signed long long int *, signed long long int, signed long long int,...);
-signed long long int __sync_val_compare_and_swap_8(volatile signed long long int *, signed long long int, signed long long int,...);
 unsigned long long int __sync_val_compare_and_swap(volatile unsigned long long int *, unsigned long long int, unsigned long long int,...);
-unsigned long long int __sync_val_compare_and_swap_8(volatile unsigned long long int *, unsigned long long int, unsigned long long int,...);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __sync_val_compare_and_swap(volatile signed __int128 *, signed __int128, signed __int128,...);
-signed __int128 __sync_val_compare_and_swap_16(volatile signed __int128 *, signed __int128, signed __int128,...);
 unsigned __int128 __sync_val_compare_and_swap(volatile unsigned __int128 *, unsigned __int128, unsigned __int128,...);
-unsigned __int128 __sync_val_compare_and_swap_16(volatile unsigned __int128 *, unsigned __int128, unsigned __int128,...);
 #endif
 forall(dtype T) T * __sync_val_compare_and_swap(T * volatile *, T *, T*,...);
 
 char __sync_lock_test_and_set(volatile char *, char,...);
-char __sync_lock_test_and_set_1(volatile char *, char,...);
 signed char __sync_lock_test_and_set(volatile signed char *, signed char,...);
-signed char __sync_lock_test_and_set_1(volatile signed char *, signed char,...);
 unsigned char __sync_lock_test_and_set(volatile unsigned char *, unsigned char,...);
-unsigned char __sync_lock_test_and_set_1(volatile unsigned char *, unsigned char,...);
 signed short __sync_lock_test_and_set(volatile signed short *, signed short,...);
-signed short __sync_lock_test_and_set_2(volatile signed short *, signed short,...);
 unsigned short __sync_lock_test_and_set(volatile unsigned short *, unsigned short,...);
-unsigned short __sync_lock_test_and_set_2(volatile unsigned short *, unsigned short,...);
 signed int __sync_lock_test_and_set(volatile signed int *, signed int,...);
-signed int __sync_lock_test_and_set_4(volatile signed int *, signed int,...);
 unsigned int __sync_lock_test_and_set(volatile unsigned int *, unsigned int,...);
-unsigned int __sync_lock_test_and_set_4(volatile unsigned int *, unsigned int,...);
+signed long int __sync_lock_test_and_set(volatile signed long int *, signed long int,...);
+unsigned long int __sync_lock_test_and_set(volatile unsigned long int *, unsigned long int,...);
 signed long long int __sync_lock_test_and_set(volatile signed long long int *, signed long long int,...);
-signed long long int __sync_lock_test_and_set_8(volatile signed long long int *, signed long long int,...);
 unsigned long long int __sync_lock_test_and_set(volatile unsigned long long int *, unsigned long long int,...);
-unsigned long long int __sync_lock_test_and_set_8(volatile unsigned long long int *, unsigned long long int,...);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __sync_lock_test_and_set(volatile signed __int128 *, signed __int128,...);
-signed __int128 __sync_lock_test_and_set_16(volatile signed __int128 *, signed __int128,...);
 unsigned __int128 __sync_lock_test_and_set(volatile unsigned __int128 *, unsigned __int128,...);
-unsigned __int128 __sync_lock_test_and_set_16(volatile unsigned __int128 *, unsigned __int128,...);
 #endif
 
 void __sync_lock_release(volatile char *,...);
-void __sync_lock_release_1(volatile char *,...);
 void __sync_lock_release(volatile signed char *,...);
-void __sync_lock_release_1(volatile signed char *,...);
 void __sync_lock_release(volatile unsigned char *,...);
-void __sync_lock_release_1(volatile unsigned char *,...);
 void __sync_lock_release(volatile signed short *,...);
-void __sync_lock_release_2(volatile signed short *,...);
 void __sync_lock_release(volatile unsigned short *,...);
-void __sync_lock_release_2(volatile unsigned short *,...);
 void __sync_lock_release(volatile signed int *,...);
-void __sync_lock_release_4(volatile signed int *,...);
 void __sync_lock_release(volatile unsigned int *,...);
-void __sync_lock_release_4(volatile unsigned int *,...);
+void __sync_lock_release(volatile signed long int *,...);
+void __sync_lock_release(volatile unsigned long int *,...);
 void __sync_lock_release(volatile signed long long int *,...);
-void __sync_lock_release_8(volatile signed long long int *,...);
 void __sync_lock_release(volatile unsigned long long int *,...);
-void __sync_lock_release_8(volatile unsigned long long int *,...);
 #if defined(__SIZEOF_INT128__)
 void __sync_lock_release(volatile signed __int128 *,...);
-void __sync_lock_release_16(volatile signed __int128 *,...);
 void __sync_lock_release(volatile unsigned __int128 *,...);
-void __sync_lock_release_16(volatile unsigned __int128 *,...);
 #endif
 
@@ -414,4 +270,6 @@
 _Bool __atomic_test_and_set(volatile signed int *, int);
 _Bool __atomic_test_and_set(volatile unsigned int *, int);
+_Bool __atomic_test_and_set(volatile signed long int *, int);
+_Bool __atomic_test_and_set(volatile unsigned long int *, int);
 _Bool __atomic_test_and_set(volatile signed long long int *, int);
 _Bool __atomic_test_and_set(volatile unsigned long long int *, int);
@@ -429,4 +287,6 @@
 void __atomic_clear(volatile signed int *, int);
 void __atomic_clear(volatile unsigned int *, int);
+void __atomic_clear(volatile signed long int *, int);
+void __atomic_clear(volatile unsigned long int *, int);
 void __atomic_clear(volatile signed long long int *, int);
 void __atomic_clear(volatile unsigned long long int *, int);
@@ -436,37 +296,32 @@
 #endif
 
+_Bool __atomic_exchange_n(volatile _Bool *, _Bool, int);
+void __atomic_exchange(volatile _Bool *, volatile _Bool *, volatile _Bool *, int);
 char __atomic_exchange_n(volatile char *, char, int);
-char __atomic_exchange_1(volatile char *, char, int);
 void __atomic_exchange(volatile char *, volatile char *, volatile char *, int);
 signed char __atomic_exchange_n(volatile signed char *, signed char, int);
-signed char __atomic_exchange_1(volatile signed char *, signed char, int);
 void __atomic_exchange(volatile signed char *, volatile signed char *, volatile signed char *, int);
 unsigned char __atomic_exchange_n(volatile unsigned char *, unsigned char, int);
-unsigned char __atomic_exchange_1(volatile unsigned char *, unsigned char, int);
 void __atomic_exchange(volatile unsigned char *, volatile unsigned char *, volatile unsigned char *, int);
 signed short __atomic_exchange_n(volatile signed short *, signed short, int);
-signed short __atomic_exchange_2(volatile signed short *, signed short, int);
 void __atomic_exchange(volatile signed short *, volatile signed short *, volatile signed short *, int);
 unsigned short __atomic_exchange_n(volatile unsigned short *, unsigned short, int);
-unsigned short __atomic_exchange_2(volatile unsigned short *, unsigned short, int);
 void __atomic_exchange(volatile unsigned short *, volatile unsigned short *, volatile unsigned short *, int);
 signed int __atomic_exchange_n(volatile signed int *, signed int, int);
-signed int __atomic_exchange_4(volatile signed int *, signed int, int);
 void __atomic_exchange(volatile signed int *, volatile signed int *, volatile signed int *, int);
 unsigned int __atomic_exchange_n(volatile unsigned int *, unsigned int, int);
-unsigned int __atomic_exchange_4(volatile unsigned int *, unsigned int, int);
 void __atomic_exchange(volatile unsigned int *, volatile unsigned int *, volatile unsigned int *, int);
+signed long int __atomic_exchange_n(volatile signed long int *, signed long int, int);
+void __atomic_exchange(volatile signed long int *, volatile signed long int *, volatile signed long int *, int);
+unsigned long int __atomic_exchange_n(volatile unsigned long int *, unsigned long int, int);
+void __atomic_exchange(volatile unsigned long int *, volatile unsigned long int *, volatile unsigned long int *, int);
 signed long long int __atomic_exchange_n(volatile signed long long int *, signed long long int, int);
-signed long long int __atomic_exchange_8(volatile signed long long int *, signed long long int, int);
 void __atomic_exchange(volatile signed long long int *, volatile signed long long int *, volatile signed long long int *, int);
 unsigned long long int __atomic_exchange_n(volatile unsigned long long int *, unsigned long long int, int);
-unsigned long long int __atomic_exchange_8(volatile unsigned long long int *, unsigned long long int, int);
 void __atomic_exchange(volatile unsigned long long int *, volatile unsigned long long int *, volatile unsigned long long int *, int);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __atomic_exchange_n(volatile signed __int128 *, signed __int128, int);
-signed __int128 __atomic_exchange_16(volatile signed __int128 *, signed __int128, int);
 void __atomic_exchange(volatile signed __int128 *, volatile signed __int128 *, volatile signed __int128 *, int);
 unsigned __int128 __atomic_exchange_n(volatile unsigned __int128 *, unsigned __int128, int);
-unsigned __int128 __atomic_exchange_16(volatile unsigned __int128 *, unsigned __int128, int);
 void __atomic_exchange(volatile unsigned __int128 *, volatile unsigned __int128 *, volatile unsigned __int128 *, int);
 #endif
@@ -477,36 +332,29 @@
 void __atomic_load(const volatile _Bool *, volatile _Bool *, int);
 char __atomic_load_n(const volatile char *, int);
-char __atomic_load_1(const volatile char *, int);
 void __atomic_load(const volatile char *, volatile char *, int);
 signed char __atomic_load_n(const volatile signed char *, int);
-signed char __atomic_load_1(const volatile signed char *, int);
 void __atomic_load(const volatile signed char *, volatile signed char *, int);
 unsigned char __atomic_load_n(const volatile unsigned char *, int);
-unsigned char __atomic_load_1(const volatile unsigned char *, int);
 void __atomic_load(const volatile unsigned char *, volatile unsigned char *, int);
 signed short __atomic_load_n(const volatile signed short *, int);
-signed short __atomic_load_2(const volatile signed short *, int);
 void __atomic_load(const volatile signed short *, volatile signed short *, int);
 unsigned short __atomic_load_n(const volatile unsigned short *, int);
-unsigned short __atomic_load_2(const volatile unsigned short *, int);
 void __atomic_load(const volatile unsigned short *, volatile unsigned short *, int);
 signed int __atomic_load_n(const volatile signed int *, int);
-signed int __atomic_load_4(const volatile signed int *, int);
 void __atomic_load(const volatile signed int *, volatile signed int *, int);
 unsigned int __atomic_load_n(const volatile unsigned int *, int);
-unsigned int __atomic_load_4(const volatile unsigned int *, int);
 void __atomic_load(const volatile unsigned int *, volatile unsigned int *, int);
+signed long int __atomic_load_n(const volatile signed long int *, int);
+void __atomic_load(const volatile signed long int *, volatile signed long int *, int);
+unsigned long int __atomic_load_n(const volatile unsigned long int *, int);
+void __atomic_load(const volatile unsigned long int *, volatile unsigned long int *, int);
 signed long long int __atomic_load_n(const volatile signed long long int *, int);
-signed long long int __atomic_load_8(const volatile signed long long int *, int);
 void __atomic_load(const volatile signed long long int *, volatile signed long long int *, int);
 unsigned long long int __atomic_load_n(const volatile unsigned long long int *, int);
-unsigned long long int __atomic_load_8(const volatile unsigned long long int *, int);
 void __atomic_load(const volatile unsigned long long int *, volatile unsigned long long int *, int);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __atomic_load_n(const volatile signed __int128 *, int);
-signed __int128 __atomic_load_16(const volatile signed __int128 *, int);
 void __atomic_load(const volatile signed __int128 *, volatile signed __int128 *, int);
 unsigned __int128 __atomic_load_n(const volatile unsigned __int128 *, int);
-unsigned __int128 __atomic_load_16(const volatile unsigned __int128 *, int);
 void __atomic_load(const volatile unsigned __int128 *, volatile unsigned __int128 *, int);
 #endif
@@ -515,36 +363,29 @@
 
 _Bool __atomic_compare_exchange_n(volatile char *, char *, char, _Bool, int, int);
-_Bool __atomic_compare_exchange_1(volatile char *, char *, char, _Bool, int, int);
 _Bool __atomic_compare_exchange  (volatile char *, char *, char *, _Bool, int, int);
 _Bool __atomic_compare_exchange_n(volatile signed char *, signed char *, signed char, _Bool, int, int);
-_Bool __atomic_compare_exchange_1(volatile signed char *, signed char *, signed char, _Bool, int, int);
 _Bool __atomic_compare_exchange  (volatile signed char *, signed char *, signed char *, _Bool, int, int);
 _Bool __atomic_compare_exchange_n(volatile unsigned char *, unsigned char *, unsigned char, _Bool, int, int);
-_Bool __atomic_compare_exchange_1(volatile unsigned char *, unsigned char *, unsigned char, _Bool, int, int);
 _Bool __atomic_compare_exchange  (volatile unsigned char *, unsigned char *, unsigned char *, _Bool, int, int);
 _Bool __atomic_compare_exchange_n(volatile signed short *, signed short *, signed short, _Bool, int, int);
-_Bool __atomic_compare_exchange_2(volatile signed short *, signed short *, signed short, _Bool, int, int);
 _Bool __atomic_compare_exchange  (volatile signed short *, signed short *, signed short *, _Bool, int, int);
 _Bool __atomic_compare_exchange_n(volatile unsigned short *, unsigned short *, unsigned short, _Bool, int, int);
-_Bool __atomic_compare_exchange_2(volatile unsigned short *, unsigned short *, unsigned short, _Bool, int, int);
 _Bool __atomic_compare_exchange  (volatile unsigned short *, unsigned short *, unsigned short *, _Bool, int, int);
 _Bool __atomic_compare_exchange_n(volatile signed int *, signed int *, signed int, _Bool, int, int);
-_Bool __atomic_compare_exchange_4(volatile signed int *, signed int *, signed int, _Bool, int, int);
 _Bool __atomic_compare_exchange  (volatile signed int *, signed int *, signed int *, _Bool, int, int);
 _Bool __atomic_compare_exchange_n(volatile unsigned int *, unsigned int *, unsigned int, _Bool, int, int);
-_Bool __atomic_compare_exchange_4(volatile unsigned int *, unsigned int *, unsigned int, _Bool, int, int);
 _Bool __atomic_compare_exchange  (volatile unsigned int *, unsigned int *, unsigned int *, _Bool, int, int);
+_Bool __atomic_compare_exchange_n(volatile signed long int *, signed long int *, signed long int, _Bool, int, int);
+_Bool __atomic_compare_exchange  (volatile signed long int *, signed long int *, signed long int *, _Bool, int, int);
+_Bool __atomic_compare_exchange_n(volatile unsigned long int *, unsigned long int *, unsigned long int, _Bool, int, int);
+_Bool __atomic_compare_exchange  (volatile unsigned long int *, unsigned long int *, unsigned long int *, _Bool, int, int);
 _Bool __atomic_compare_exchange_n(volatile signed long long int *, signed long long int *, signed long long int, _Bool, int, int);
-_Bool __atomic_compare_exchange_8(volatile signed long long int *, signed long long int *, signed long long int, _Bool, int, int);
 _Bool __atomic_compare_exchange  (volatile signed long long int *, signed long long int *, signed long long int *, _Bool, int, int);
 _Bool __atomic_compare_exchange_n(volatile unsigned long long int *, unsigned long long int *, unsigned long long int, _Bool, int, int);
-_Bool __atomic_compare_exchange_8(volatile unsigned long long int *, unsigned long long int *, unsigned long long int, _Bool, int, int);
 _Bool __atomic_compare_exchange  (volatile unsigned long long int *, unsigned long long int *, unsigned long long int *, _Bool, int, int);
 #if defined(__SIZEOF_INT128__)
 _Bool __atomic_compare_exchange_n (volatile signed __int128 *, signed __int128 *, signed __int128, _Bool, int, int);
-_Bool __atomic_compare_exchange_16(volatile signed __int128 *, signed __int128 *, signed __int128, _Bool, int, int);
 _Bool __atomic_compare_exchange   (volatile signed __int128 *, signed __int128 *, signed __int128 *, _Bool, int, int);
 _Bool __atomic_compare_exchange_n (volatile unsigned __int128 *, unsigned __int128 *, unsigned __int128, _Bool, int, int);
-_Bool __atomic_compare_exchange_16(volatile unsigned __int128 *, unsigned __int128 *, unsigned __int128, _Bool, int, int);
 _Bool __atomic_compare_exchange   (volatile unsigned __int128 *, unsigned __int128 *, unsigned __int128 *, _Bool, int, int);
 #endif
@@ -555,36 +396,29 @@
 void __atomic_store(volatile _Bool *, _Bool *, int);
 void __atomic_store_n(volatile char *, char, int);
-void __atomic_store_1(volatile char *, char, int);
 void __atomic_store(volatile char *, char *, int);
 void __atomic_store_n(volatile signed char *, signed char, int);
-void __atomic_store_1(volatile signed char *, signed char, int);
 void __atomic_store(volatile signed char *, signed char *, int);
 void __atomic_store_n(volatile unsigned char *, unsigned char, int);
-void __atomic_store_1(volatile unsigned char *, unsigned char, int);
 void __atomic_store(volatile unsigned char *, unsigned char *, int);
 void __atomic_store_n(volatile signed short *, signed short, int);
-void __atomic_store_2(volatile signed short *, signed short, int);
 void __atomic_store(volatile signed short *, signed short *, int);
 void __atomic_store_n(volatile unsigned short *, unsigned short, int);
-void __atomic_store_2(volatile unsigned short *, unsigned short, int);
 void __atomic_store(volatile unsigned short *, unsigned short *, int);
 void __atomic_store_n(volatile signed int *, signed int, int);
-void __atomic_store_4(volatile signed int *, signed int, int);
 void __atomic_store(volatile signed int *, signed int *, int);
 void __atomic_store_n(volatile unsigned int *, unsigned int, int);
-void __atomic_store_4(volatile unsigned int *, unsigned int, int);
 void __atomic_store(volatile unsigned int *, unsigned int *, int);
+void __atomic_store_n(volatile signed long int *, signed long int, int);
+void __atomic_store(volatile signed long int *, signed long int *, int);
+void __atomic_store_n(volatile unsigned long int *, unsigned long int, int);
+void __atomic_store(volatile unsigned long int *, unsigned long int *, int);
 void __atomic_store_n(volatile signed long long int *, signed long long int, int);
-void __atomic_store_8(volatile signed long long int *, signed long long int, int);
 void __atomic_store(volatile signed long long int *, signed long long int *, int);
 void __atomic_store_n(volatile unsigned long long int *, unsigned long long int, int);
-void __atomic_store_8(volatile unsigned long long int *, unsigned long long int, int);
 void __atomic_store(volatile unsigned long long int *, unsigned long long int *, int);
 #if defined(__SIZEOF_INT128__)
 void __atomic_store_n(volatile signed __int128 *, signed __int128, int);
-void __atomic_store_16(volatile signed __int128 *, signed __int128, int);
 void __atomic_store(volatile signed __int128 *, signed __int128 *, int);
 void __atomic_store_n(volatile unsigned __int128 *, unsigned __int128, int);
-void __atomic_store_16(volatile unsigned __int128 *, unsigned __int128, int);
 void __atomic_store(volatile unsigned __int128 *, unsigned __int128 *, int);
 #endif
@@ -593,301 +427,193 @@
 
 char __atomic_add_fetch  (volatile char *, char, int);
-char __atomic_add_fetch_1(volatile char *, char, int);
 signed char __atomic_add_fetch  (volatile signed char *, signed char, int);
-signed char __atomic_add_fetch_1(volatile signed char *, signed char, int);
 unsigned char __atomic_add_fetch  (volatile unsigned char *, unsigned char, int);
-unsigned char __atomic_add_fetch_1(volatile unsigned char *, unsigned char, int);
 signed short __atomic_add_fetch  (volatile signed short *, signed short, int);
-signed short __atomic_add_fetch_2(volatile signed short *, signed short, int);
 unsigned short __atomic_add_fetch  (volatile unsigned short *, unsigned short, int);
-unsigned short __atomic_add_fetch_2(volatile unsigned short *, unsigned short, int);
 signed int __atomic_add_fetch  (volatile signed int *, signed int, int);
-signed int __atomic_add_fetch_4(volatile signed int *, signed int, int);
 unsigned int __atomic_add_fetch  (volatile unsigned int *, unsigned int, int);
-unsigned int __atomic_add_fetch_4(volatile unsigned int *, unsigned int, int);
+signed long int __atomic_add_fetch  (volatile signed long int *, signed long int, int);
+unsigned long int __atomic_add_fetch  (volatile unsigned long int *, unsigned long int, int);
 signed long long int __atomic_add_fetch  (volatile signed long long int *, signed long long int, int);
-signed long long int __atomic_add_fetch_8(volatile signed long long int *, signed long long int, int);
 unsigned long long int __atomic_add_fetch  (volatile unsigned long long int *, unsigned long long int, int);
-unsigned long long int __atomic_add_fetch_8(volatile unsigned long long int *, unsigned long long int, int);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __atomic_add_fetch   (volatile signed __int128 *, signed __int128, int);
-signed __int128 __atomic_add_fetch_16(volatile signed __int128 *, signed __int128, int);
 unsigned __int128 __atomic_add_fetch   (volatile unsigned __int128 *, unsigned __int128, int);
-unsigned __int128 __atomic_add_fetch_16(volatile unsigned __int128 *, unsigned __int128, int);
 #endif
 
 char __atomic_sub_fetch  (volatile char *, char, int);
-char __atomic_sub_fetch_1(volatile char *, char, int);
 signed char __atomic_sub_fetch  (volatile signed char *, signed char, int);
-signed char __atomic_sub_fetch_1(volatile signed char *, signed char, int);
 unsigned char __atomic_sub_fetch  (volatile unsigned char *, unsigned char, int);
-unsigned char __atomic_sub_fetch_1(volatile unsigned char *, unsigned char, int);
 signed short __atomic_sub_fetch  (volatile signed short *, signed short, int);
-signed short __atomic_sub_fetch_2(volatile signed short *, signed short, int);
 unsigned short __atomic_sub_fetch  (volatile unsigned short *, unsigned short, int);
-unsigned short __atomic_sub_fetch_2(volatile unsigned short *, unsigned short, int);
 signed int __atomic_sub_fetch  (volatile signed int *, signed int, int);
-signed int __atomic_sub_fetch_4(volatile signed int *, signed int, int);
 unsigned int __atomic_sub_fetch  (volatile unsigned int *, unsigned int, int);
-unsigned int __atomic_sub_fetch_4(volatile unsigned int *, unsigned int, int);
+signed long long int __atomic_sub_fetch  (volatile signed long int *, signed long int, int);
+unsigned long long int __atomic_sub_fetch  (volatile unsigned long int *, unsigned long int, int);
 signed long long int __atomic_sub_fetch  (volatile signed long long int *, signed long long int, int);
-signed long long int __atomic_sub_fetch_8(volatile signed long long int *, signed long long int, int);
 unsigned long long int __atomic_sub_fetch  (volatile unsigned long long int *, unsigned long long int, int);
-unsigned long long int __atomic_sub_fetch_8(volatile unsigned long long int *, unsigned long long int, int);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __atomic_sub_fetch   (volatile signed __int128 *, signed __int128, int);
-signed __int128 __atomic_sub_fetch_16(volatile signed __int128 *, signed __int128, int);
 unsigned __int128 __atomic_sub_fetch   (volatile unsigned __int128 *, unsigned __int128, int);
-unsigned __int128 __atomic_sub_fetch_16(volatile unsigned __int128 *, unsigned __int128, int);
 #endif
 
 char __atomic_and_fetch  (volatile char *, char, int);
-char __atomic_and_fetch_1(volatile char *, char, int);
 signed char __atomic_and_fetch  (volatile signed char *, signed char, int);
-signed char __atomic_and_fetch_1(volatile signed char *, signed char, int);
 unsigned char __atomic_and_fetch  (volatile unsigned char *, unsigned char, int);
-unsigned char __atomic_and_fetch_1(volatile unsigned char *, unsigned char, int);
 signed short __atomic_and_fetch  (volatile signed short *, signed short, int);
-signed short __atomic_and_fetch_2(volatile signed short *, signed short, int);
 unsigned short __atomic_and_fetch  (volatile unsigned short *, unsigned short, int);
-unsigned short __atomic_and_fetch_2(volatile unsigned short *, unsigned short, int);
 signed int __atomic_and_fetch  (volatile signed int *, signed int, int);
-signed int __atomic_and_fetch_4(volatile signed int *, signed int, int);
 unsigned int __atomic_and_fetch  (volatile unsigned int *, unsigned int, int);
-unsigned int __atomic_and_fetch_4(volatile unsigned int *, unsigned int, int);
+signed long int __atomic_and_fetch  (volatile signed long int *, signed long int, int);
+unsigned long int __atomic_and_fetch  (volatile unsigned long int *, unsigned long int, int);
 signed long long int __atomic_and_fetch  (volatile signed long long int *, signed long long int, int);
-signed long long int __atomic_and_fetch_8(volatile signed long long int *, signed long long int, int);
 unsigned long long int __atomic_and_fetch  (volatile unsigned long long int *, unsigned long long int, int);
-unsigned long long int __atomic_and_fetch_8(volatile unsigned long long int *, unsigned long long int, int);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __atomic_and_fetch   (volatile signed __int128 *, signed __int128, int);
-signed __int128 __atomic_and_fetch_16(volatile signed __int128 *, signed __int128, int);
 unsigned __int128 __atomic_and_fetch   (volatile unsigned __int128 *, unsigned __int128, int);
-unsigned __int128 __atomic_and_fetch_16(volatile unsigned __int128 *, unsigned __int128, int);
 #endif
 
 char __atomic_nand_fetch  (volatile char *, char, int);
-char __atomic_nand_fetch_1(volatile char *, char, int);
 signed char __atomic_nand_fetch  (volatile signed char *, signed char, int);
-signed char __atomic_nand_fetch_1(volatile signed char *, signed char, int);
 unsigned char __atomic_nand_fetch  (volatile unsigned char *, unsigned char, int);
-unsigned char __atomic_nand_fetch_1(volatile unsigned char *, unsigned char, int);
 signed short __atomic_nand_fetch  (volatile signed short *, signed short, int);
-signed short __atomic_nand_fetch_2(volatile signed short *, signed short, int);
 unsigned short __atomic_nand_fetch  (volatile unsigned short *, unsigned short, int);
-unsigned short __atomic_nand_fetch_2(volatile unsigned short *, unsigned short, int);
 signed int __atomic_nand_fetch  (volatile signed int *, signed int, int);
-signed int __atomic_nand_fetch_4(volatile signed int *, signed int, int);
 unsigned int __atomic_nand_fetch  (volatile unsigned int *, unsigned int, int);
-unsigned int __atomic_nand_fetch_4(volatile unsigned int *, unsigned int, int);
+signed long int __atomic_nand_fetch  (volatile signed long int *, signed long int, int);
+unsigned long int __atomic_nand_fetch  (volatile unsigned long int *, unsigned long int, int);
 signed long long int __atomic_nand_fetch  (volatile signed long long int *, signed long long int, int);
-signed long long int __atomic_nand_fetch_8(volatile signed long long int *, signed long long int, int);
 unsigned long long int __atomic_nand_fetch  (volatile unsigned long long int *, unsigned long long int, int);
-unsigned long long int __atomic_nand_fetch_8(volatile unsigned long long int *, unsigned long long int, int);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __atomic_nand_fetch   (volatile signed __int128 *, signed __int128, int);
-signed __int128 __atomic_nand_fetch_16(volatile signed __int128 *, signed __int128, int);
 unsigned __int128 __atomic_nand_fetch   (volatile unsigned __int128 *, unsigned __int128, int);
-unsigned __int128 __atomic_nand_fetch_16(volatile unsigned __int128 *, unsigned __int128, int);
 #endif
 
 char __atomic_xor_fetch  (volatile char *, char, int);
-char __atomic_xor_fetch_1(volatile char *, char, int);
 signed char __atomic_xor_fetch  (volatile signed char *, signed char, int);
-signed char __atomic_xor_fetch_1(volatile signed char *, signed char, int);
 unsigned char __atomic_xor_fetch  (volatile unsigned char *, unsigned char, int);
-unsigned char __atomic_xor_fetch_1(volatile unsigned char *, unsigned char, int);
 signed short __atomic_xor_fetch  (volatile signed short *, signed short, int);
-signed short __atomic_xor_fetch_2(volatile signed short *, signed short, int);
 unsigned short __atomic_xor_fetch  (volatile unsigned short *, unsigned short, int);
-unsigned short __atomic_xor_fetch_2(volatile unsigned short *, unsigned short, int);
 signed int __atomic_xor_fetch  (volatile signed int *, signed int, int);
-signed int __atomic_xor_fetch_4(volatile signed int *, signed int, int);
 unsigned int __atomic_xor_fetch  (volatile unsigned int *, unsigned int, int);
-unsigned int __atomic_xor_fetch_4(volatile unsigned int *, unsigned int, int);
+signed long int __atomic_xor_fetch  (volatile signed long int *, signed long int, int);
+unsigned long int __atomic_xor_fetch  (volatile unsigned long int *, unsigned long int, int);
 signed long long int __atomic_xor_fetch  (volatile signed long long int *, signed long long int, int);
-signed long long int __atomic_xor_fetch_8(volatile signed long long int *, signed long long int, int);
 unsigned long long int __atomic_xor_fetch  (volatile unsigned long long int *, unsigned long long int, int);
-unsigned long long int __atomic_xor_fetch_8(volatile unsigned long long int *, unsigned long long int, int);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __atomic_xor_fetch   (volatile signed __int128 *, signed __int128, int);
-signed __int128 __atomic_xor_fetch_16(volatile signed __int128 *, signed __int128, int);
 unsigned __int128 __atomic_xor_fetch   (volatile unsigned __int128 *, unsigned __int128, int);
-unsigned __int128 __atomic_xor_fetch_16(volatile unsigned __int128 *, unsigned __int128, int);
 #endif
 
 char __atomic_or_fetch  (volatile char *, char, int);
-char __atomic_or_fetch_1(volatile char *, char, int);
 signed char __atomic_or_fetch  (volatile signed char *, signed char, int);
-signed char __atomic_or_fetch_1(volatile signed char *, signed char, int);
 unsigned char __atomic_or_fetch  (volatile unsigned char *, unsigned char, int);
-unsigned char __atomic_or_fetch_1(volatile unsigned char *, unsigned char, int);
 signed short __atomic_or_fetch  (volatile signed short *, signed short, int);
-signed short __atomic_or_fetch_2(volatile signed short *, signed short, int);
 unsigned short __atomic_or_fetch  (volatile unsigned short *, unsigned short, int);
-unsigned short __atomic_or_fetch_2(volatile unsigned short *, unsigned short, int);
 signed int __atomic_or_fetch  (volatile signed int *, signed int, int);
-signed int __atomic_or_fetch_4(volatile signed int *, signed int, int);
 unsigned int __atomic_or_fetch  (volatile unsigned int *, unsigned int, int);
-unsigned int __atomic_or_fetch_4(volatile unsigned int *, unsigned int, int);
+signed long int __atomic_or_fetch  (volatile signed long int *, signed long int, int);
+unsigned long int __atomic_or_fetch  (volatile unsigned long int *, unsigned long int, int);
 signed long long int __atomic_or_fetch  (volatile signed long long int *, signed long long int, int);
-signed long long int __atomic_or_fetch_8(volatile signed long long int *, signed long long int, int);
 unsigned long long int __atomic_or_fetch  (volatile unsigned long long int *, unsigned long long int, int);
-unsigned long long int __atomic_or_fetch_8(volatile unsigned long long int *, unsigned long long int, int);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __atomic_or_fetch   (volatile signed __int128 *, signed __int128, int);
-signed __int128 __atomic_or_fetch_16(volatile signed __int128 *, signed __int128, int);
 unsigned __int128 __atomic_or_fetch   (volatile unsigned __int128 *, unsigned __int128, int);
-unsigned __int128 __atomic_or_fetch_16(volatile unsigned __int128 *, unsigned __int128, int);
 #endif
 
 char __atomic_fetch_add  (volatile char *, char, int);
-char __atomic_fetch_add_1(volatile char *, char, int);
 signed char __atomic_fetch_add  (volatile signed char *, signed char, int);
-signed char __atomic_fetch_add_1(volatile signed char *, signed char, int);
 unsigned char __atomic_fetch_add  (volatile unsigned char *, unsigned char, int);
-unsigned char __atomic_fetch_add_1(volatile unsigned char *, unsigned char, int);
 signed short __atomic_fetch_add  (volatile signed short *, signed short, int);
-signed short __atomic_fetch_add_2(volatile signed short *, signed short, int);
 unsigned short __atomic_fetch_add  (volatile unsigned short *, unsigned short, int);
-unsigned short __atomic_fetch_add_2(volatile unsigned short *, unsigned short, int);
 signed int __atomic_fetch_add  (volatile signed int *, signed int, int);
-signed int __atomic_fetch_add_4(volatile signed int *, signed int, int);
 unsigned int __atomic_fetch_add  (volatile unsigned int *, unsigned int, int);
-unsigned int __atomic_fetch_add_4(volatile unsigned int *, unsigned int, int);
+signed long int __atomic_fetch_add  (volatile signed long int *, signed long int, int);
+unsigned long int __atomic_fetch_add  (volatile unsigned long int *, unsigned long int, int);
 signed long long int __atomic_fetch_add  (volatile signed long long int *, signed long long int, int);
-signed long long int __atomic_fetch_add_8(volatile signed long long int *, signed long long int, int);
 unsigned long long int __atomic_fetch_add  (volatile unsigned long long int *, unsigned long long int, int);
-unsigned long long int __atomic_fetch_add_8(volatile unsigned long long int *, unsigned long long int, int);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __atomic_fetch_add   (volatile signed __int128 *, signed __int128, int);
-signed __int128 __atomic_fetch_add_16(volatile signed __int128 *, signed __int128, int);
 unsigned __int128 __atomic_fetch_add   (volatile unsigned __int128 *, unsigned __int128, int);
-unsigned __int128 __atomic_fetch_add_16(volatile unsigned __int128 *, unsigned __int128, int);
 #endif
 
 char __atomic_fetch_sub  (volatile char *, char, int);
-char __atomic_fetch_sub_1(volatile char *, char, int);
 signed char __atomic_fetch_sub  (volatile signed char *, signed char, int);
-signed char __atomic_fetch_sub_1(volatile signed char *, signed char, int);
 unsigned char __atomic_fetch_sub  (volatile unsigned char *, unsigned char, int);
-unsigned char __atomic_fetch_sub_1(volatile unsigned char *, unsigned char, int);
 signed short __atomic_fetch_sub  (volatile signed short *, signed short, int);
-signed short __atomic_fetch_sub_2(volatile signed short *, signed short, int);
 unsigned short __atomic_fetch_sub  (volatile unsigned short *, unsigned short, int);
-unsigned short __atomic_fetch_sub_2(volatile unsigned short *, unsigned short, int);
 signed int __atomic_fetch_sub  (volatile signed int *, signed int, int);
-signed int __atomic_fetch_sub_4(volatile signed int *, signed int, int);
 unsigned int __atomic_fetch_sub  (volatile unsigned int *, unsigned int, int);
-unsigned int __atomic_fetch_sub_4(volatile unsigned int *, unsigned int, int);
+signed long int __atomic_fetch_sub  (volatile signed long int *, signed long int, int);
+unsigned long int __atomic_fetch_sub  (volatile unsigned long int *, unsigned long int, int);
 signed long long int __atomic_fetch_sub  (volatile signed long long int *, signed long long int, int);
-signed long long int __atomic_fetch_sub_8(volatile signed long long int *, signed long long int, int);
 unsigned long long int __atomic_fetch_sub  (volatile unsigned long long int *, unsigned long long int, int);
-unsigned long long int __atomic_fetch_sub_8(volatile unsigned long long int *, unsigned long long int, int);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __atomic_fetch_sub   (volatile signed  __int128 *, signed __int128, int);
-signed __int128 __atomic_fetch_sub_16(volatile signed  __int128 *, signed __int128, int);
 unsigned __int128 __atomic_fetch_sub   (volatile unsigned  __int128 *, unsigned __int128, int);
-unsigned __int128 __atomic_fetch_sub_16(volatile unsigned  __int128 *, unsigned __int128, int);
 #endif
 
 char __atomic_fetch_and  (volatile char *, char, int);
-char __atomic_fetch_and_1(volatile char *, char, int);
 signed char __atomic_fetch_and  (volatile signed char *, signed char, int);
-signed char __atomic_fetch_and_1(volatile signed char *, signed char, int);
 unsigned char __atomic_fetch_and  (volatile unsigned char *, unsigned char, int);
-unsigned char __atomic_fetch_and_1(volatile unsigned char *, unsigned char, int);
 signed short __atomic_fetch_and  (volatile signed short *, signed short, int);
-signed short __atomic_fetch_and_2(volatile signed short *, signed short, int);
 unsigned short __atomic_fetch_and  (volatile unsigned short *, unsigned short, int);
-unsigned short __atomic_fetch_and_2(volatile unsigned short *, unsigned short, int);
 signed int __atomic_fetch_and  (volatile signed int *, signed int, int);
-signed int __atomic_fetch_and_4(volatile signed int *, signed int, int);
 unsigned int __atomic_fetch_and  (volatile unsigned int *, unsigned int, int);
-unsigned int __atomic_fetch_and_4(volatile unsigned int *, unsigned int, int);
+signed long int __atomic_fetch_and  (volatile signed long int *, signed long int, int);
+unsigned long int __atomic_fetch_and  (volatile unsigned long int *, unsigned long int, int);
 signed long long int __atomic_fetch_and  (volatile signed long long int *, signed long long int, int);
-signed long long int __atomic_fetch_and_8(volatile signed long long int *, signed long long int, int);
 unsigned long long int __atomic_fetch_and  (volatile unsigned long long int *, unsigned long long int, int);
-unsigned long long int __atomic_fetch_and_8(volatile unsigned long long int *, unsigned long long int, int);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __atomic_fetch_and   (volatile signed __int128 *, signed __int128, int);
-signed __int128 __atomic_fetch_and_16(volatile signed __int128 *, signed __int128, int);
 unsigned __int128 __atomic_fetch_and   (volatile unsigned __int128 *, unsigned __int128, int);
-unsigned __int128 __atomic_fetch_and_16(volatile unsigned __int128 *, unsigned __int128, int);
 #endif
 
 char __atomic_fetch_nand  (volatile char *, char, int);
-char __atomic_fetch_nand_1(volatile char *, char, int);
 signed char __atomic_fetch_nand  (volatile signed char *, signed char, int);
-signed char __atomic_fetch_nand_1(volatile signed char *, signed char, int);
 unsigned char __atomic_fetch_nand  (volatile unsigned char *, unsigned char, int);
-unsigned char __atomic_fetch_nand_1(volatile unsigned char *, unsigned char, int);
 signed short __atomic_fetch_nand  (volatile signed short *, signed short, int);
-signed short __atomic_fetch_nand_2(volatile signed short *, signed short, int);
 unsigned short __atomic_fetch_nand  (volatile unsigned short *, unsigned short, int);
-unsigned short __atomic_fetch_nand_2(volatile unsigned short *, unsigned short, int);
 signed int __atomic_fetch_nand  (volatile signed int *, signed int, int);
-signed int __atomic_fetch_nand_4(volatile signed int *, signed int, int);
 unsigned int __atomic_fetch_nand  (volatile unsigned int *, unsigned int, int);
-unsigned int __atomic_fetch_nand_4(volatile unsigned int *, unsigned int, int);
+signed long int __atomic_fetch_nand  (volatile signed long int *, signed long int, int);
+unsigned long int __atomic_fetch_nand  (volatile unsigned long int *, unsigned long int, int);
 signed long long int __atomic_fetch_nand  (volatile signed long long int *, signed long long int, int);
-signed long long int __atomic_fetch_nand_8(volatile signed long long int *, signed long long int, int);
 unsigned long long int __atomic_fetch_nand  (volatile unsigned long long int *, unsigned long long int, int);
-unsigned long long int __atomic_fetch_nand_8(volatile unsigned long long int *, unsigned long long int, int);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __atomic_fetch_nand   (volatile signed __int128 *, signed __int128, int);
-signed __int128 __atomic_fetch_nand_16(volatile signed __int128 *, signed __int128, int);
 unsigned __int128 __atomic_fetch_nand   (volatile unsigned __int128 *, unsigned __int128, int);
-unsigned __int128 __atomic_fetch_nand_16(volatile unsigned __int128 *, unsigned __int128, int);
 #endif
 
 char __atomic_fetch_xor  (volatile char *, char, int);
-char __atomic_fetch_xor_1(volatile char *, char, int);
 signed char __atomic_fetch_xor  (volatile signed char *, signed char, int);
-signed char __atomic_fetch_xor_1(volatile signed char *, signed char, int);
 unsigned char __atomic_fetch_xor  (volatile unsigned char *, unsigned char, int);
-unsigned char __atomic_fetch_xor_1(volatile unsigned char *, unsigned char, int);
 signed short __atomic_fetch_xor  (volatile signed short *, signed short, int);
-signed short __atomic_fetch_xor_2(volatile signed short *, signed short, int);
 unsigned short __atomic_fetch_xor  (volatile unsigned short *, unsigned short, int);
-unsigned short __atomic_fetch_xor_2(volatile unsigned short *, unsigned short, int);
 signed int __atomic_fetch_xor  (volatile signed int *, signed int, int);
-signed int __atomic_fetch_xor_4(volatile signed int *, signed int, int);
 unsigned int __atomic_fetch_xor  (volatile unsigned int *, unsigned int, int);
-unsigned int __atomic_fetch_xor_4(volatile unsigned int *, unsigned int, int);
+signed long int __atomic_fetch_xor  (volatile signed long int *, signed long int, int);
+unsigned long int __atomic_fetch_xor  (volatile unsigned long int *, unsigned long int, int);
 signed long long int __atomic_fetch_xor  (volatile signed long long int *, signed long long int, int);
-signed long long int __atomic_fetch_xor_8(volatile signed long long int *, signed long long int, int);
 unsigned long long int __atomic_fetch_xor  (volatile unsigned long long int *, unsigned long long int, int);
-unsigned long long int __atomic_fetch_xor_8(volatile unsigned long long int *, unsigned long long int, int);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __atomic_fetch_xor   (volatile signed __int128 *, signed __int128, int);
-signed __int128 __atomic_fetch_xor_16(volatile signed __int128 *, signed __int128, int);
 unsigned __int128 __atomic_fetch_xor   (volatile unsigned __int128 *, unsigned __int128, int);
-unsigned __int128 __atomic_fetch_xor_16(volatile unsigned __int128 *, unsigned __int128, int);
 #endif
 
 char __atomic_fetch_or  (volatile char *, char, int);
-char __atomic_fetch_or_1(volatile char *, char, int);
 signed char __atomic_fetch_or  (volatile signed char *, signed char, int);
-signed char __atomic_fetch_or_1(volatile signed char *, signed char, int);
 unsigned char __atomic_fetch_or  (volatile unsigned char *, unsigned char, int);
-unsigned char __atomic_fetch_or_1(volatile unsigned char *, unsigned char, int);
 signed short __atomic_fetch_or  (volatile signed short *, signed short, int);
-signed short __atomic_fetch_or_2(volatile signed short *, signed short, int);
 unsigned short __atomic_fetch_or  (volatile unsigned short *, unsigned short, int);
-unsigned short __atomic_fetch_or_2(volatile unsigned short *, unsigned short, int);
 signed int __atomic_fetch_or  (volatile signed int *, signed int, int);
-signed int __atomic_fetch_or_4(volatile signed int *, signed int, int);
 unsigned int __atomic_fetch_or  (volatile unsigned int *, unsigned int, int);
-unsigned int __atomic_fetch_or_4(volatile unsigned int *, unsigned int, int);
+signed long int __atomic_fetch_or  (volatile signed long int *, signed long int, int);
+unsigned long int __atomic_fetch_or  (volatile unsigned long int *, unsigned long int, int);
 signed long long int __atomic_fetch_or  (volatile signed long long int *, signed long long int, int);
-signed long long int __atomic_fetch_or_8(volatile signed long long int *, signed long long int, int);
 unsigned long long int __atomic_fetch_or  (volatile unsigned long long int *, unsigned long long int, int);
-unsigned long long int __atomic_fetch_or_8(volatile unsigned long long int *, unsigned long long int, int);
 #if defined(__SIZEOF_INT128__)
 signed __int128 __atomic_fetch_or   (volatile signed __int128 *, signed __int128, int);
-signed __int128 __atomic_fetch_or_16(volatile signed __int128 *, signed __int128, int);
 unsigned __int128 __atomic_fetch_or   (volatile unsigned __int128 *, unsigned __int128, int);
-unsigned __int128 __atomic_fetch_or_16(volatile unsigned __int128 *, unsigned __int128, int);
 #endif
 
Index: libcfa/src/Makefile.am
===================================================================
--- libcfa/src/Makefile.am	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/Makefile.am	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -33,5 +33,5 @@
 # The built sources must not depend on the installed headers
 AM_CFAFLAGS = -quiet -cfalib -I$(srcdir)/stdhdr $(if $(findstring ${gdbwaittarget}, ${@}), -XCFA --gdb) @CONFIG_CFAFLAGS@
-AM_CFLAGS = -g -Wall -Wno-unused-function -fPIC @ARCH_FLAGS@ @CONFIG_CFLAGS@
+AM_CFLAGS = -g -Wall -Wno-unused-function -fPIC -pthread @ARCH_FLAGS@ @CONFIG_CFLAGS@
 AM_CCASFLAGS = -g -Wall -Wno-unused-function @ARCH_FLAGS@ @CONFIG_CFLAGS@
 CFACC = @CFACC@
Index: libcfa/src/Makefile.in
===================================================================
--- libcfa/src/Makefile.in	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/Makefile.in	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -416,6 +416,5 @@
 LTCFACOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=compile $(CFACC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(CFAFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(AM_CFLAGS) $(CFAFLAGS) $(CFLAGS)
 
 AM_V_CFA = $(am__v_CFA_@AM_V@)
@@ -423,12 +422,4 @@
 am__v_CFA_0 = @echo "  CFA     " $@;
 am__v_CFA_1 = 
-AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
-am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
-am__v_JAVAC_0 = @echo "  JAVAC   " $@;
-am__v_JAVAC_1 = 
-AM_V_GOC = $(am__v_GOC_@AM_V@)
-am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
-am__v_GOC_0 = @echo "  GOC     " $@;
-am__v_GOC_1 = 
 UPPCC = u++
 UPPCOMPILE = $(UPPCC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_UPPFLAGS) $(UPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -437,4 +428,20 @@
 am__v_UPP_0 = @echo "  UPP     " $@;
 am__v_UPP_1 = 
+AM_V_GOC = $(am__v_GOC_@AM_V@)
+am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
+am__v_GOC_0 = @echo "  GOC     " $@;
+am__v_GOC_1 = 
+AM_V_RUST = $(am__v_RUST_@AM_V@)
+am__v_RUST_ = $(am__v_RUST_@AM_DEFAULT_V@)
+am__v_RUST_0 = @echo "  RUST     " $@;
+am__v_RUST_1 = 
+AM_V_NODEJS = $(am__v_NODEJS_@AM_V@)
+am__v_NODEJS_ = $(am__v_NODEJS_@AM_DEFAULT_V@)
+am__v_NODEJS_0 = @echo "  NODEJS     " $@;
+am__v_NODEJS_1 = 
+AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
+am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
+am__v_JAVAC_0 = @echo "  JAVAC   " $@;
+am__v_JAVAC_1 = 
 lib_LTLIBRARIES = libcfa.la libcfathread.la
 gdbwaittarget = ""
@@ -445,5 +452,5 @@
 # The built sources must not depend on the installed headers
 AM_CFAFLAGS = -quiet -cfalib -I$(srcdir)/stdhdr $(if $(findstring ${gdbwaittarget}, ${@}), -XCFA --gdb) @CONFIG_CFAFLAGS@
-AM_CFLAGS = -g -Wall -Wno-unused-function -fPIC @ARCH_FLAGS@ @CONFIG_CFLAGS@
+AM_CFLAGS = -g -Wall -Wno-unused-function -fPIC -pthread @ARCH_FLAGS@ @CONFIG_CFLAGS@
 AM_CCASFLAGS = -g -Wall -Wno-unused-function @ARCH_FLAGS@ @CONFIG_CFLAGS@
 @BUILDLIB_FALSE@headers_nosrc = 
Index: libcfa/src/assert.cfa
===================================================================
--- libcfa/src/assert.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/assert.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon Nov 28 12:27:26 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 20 15:10:26 2017
-// Update Count     : 2
+// Last Modified On : Tue Feb  4 13:00:18 2020
+// Update Count     : 6
 //
 
@@ -17,4 +17,5 @@
 #include <stdarg.h>								// varargs
 #include <stdio.h>								// fprintf
+#include <unistd.h>								// STDERR_FILENO
 #include "bits/debug.hfa"
 
@@ -25,21 +26,21 @@
 
 	// called by macro assert in assert.h
-	void __assert_fail( const char *assertion, const char *file, unsigned int line, const char *function ) {
-		__cfaabi_dbg_bits_print_safe( CFA_ASSERT_FMT ".\n", assertion, __progname, function, line, file );
+	void __assert_fail( const char assertion[], const char file[], unsigned int line, const char function[] ) {
+		__cfaabi_bits_print_safe( STDERR_FILENO, CFA_ASSERT_FMT ".\n", assertion, __progname, function, line, file );
 		abort();
 	}
 
 	// called by macro assertf
-	void __assert_fail_f( const char *assertion, const char *file, unsigned int line, const char *function, const char *fmt, ... ) {
-		__cfaabi_dbg_bits_acquire();
-		__cfaabi_dbg_bits_print_nolock( CFA_ASSERT_FMT ": ", assertion, __progname, function, line, file );
+	void __assert_fail_f( const char assertion[], const char file[], unsigned int line, const char function[], const char fmt[], ... ) {
+		__cfaabi_bits_acquire();
+		__cfaabi_bits_print_nolock( STDERR_FILENO, CFA_ASSERT_FMT ": ", assertion, __progname, function, line, file );
 
 		va_list args;
 		va_start( args, fmt );
-		__cfaabi_dbg_bits_print_vararg( fmt, args );
+		__cfaabi_bits_print_vararg( STDERR_FILENO, fmt, args );
 		va_end( args );
 
-		__cfaabi_dbg_bits_print_nolock( "\n" );
-		__cfaabi_dbg_bits_release();
+		__cfaabi_bits_print_nolock( STDERR_FILENO, "\n" );
+		__cfaabi_bits_release();
 		abort();
 	}
Index: libcfa/src/bits/align.hfa
===================================================================
--- libcfa/src/bits/align.hfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/bits/align.hfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon Nov 28 12:27:26 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 21 23:05:35 2017
-// Update Count     : 2
+// Last Modified On : Sat Nov 16 18:58:22 2019
+// Update Count     : 3
 //
 // This  library is free  software; you  can redistribute  it and/or  modify it
@@ -33,5 +33,7 @@
 
 // Minimum size used to align memory boundaries for memory allocations.
-#define libAlign() (sizeof(double))
+//#define libAlign() (sizeof(double))
+// gcc-7 uses xmms instructions, which require 16 byte alignment.
+#define libAlign() (16)
 
 // Check for power of 2
Index: libcfa/src/bits/containers.hfa
===================================================================
--- libcfa/src/bits/containers.hfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/bits/containers.hfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Tue Oct 31 16:38:50 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jun 26 08:52:20 2019
-// Update Count     : 4
+// Last Modified On : Wed Jan 15 07:42:35 2020
+// Update Count     : 28
 
 #pragma once
@@ -44,20 +44,20 @@
 
 	forall(dtype T | sized(T))
-	static inline T& ?[?]( __small_array(T) & this, __lock_size_t idx) {
+	static inline T & ?[?]( __small_array(T) & this, __lock_size_t idx ) {
 		return ((typeof(this.data))this.data)[idx];
 	}
 
 	forall(dtype T | sized(T))
-	static inline T& ?[?]( const __small_array(T) & this, __lock_size_t idx) {
+	static inline T & ?[?]( const __small_array(T) & this, __lock_size_t idx ) {
 		return ((typeof(this.data))this.data)[idx];
 	}
 
+	forall(dtype T)
+	static inline T * begin( const __small_array(T) & this ) {
+		return ((typeof(this.data))this.data);
+	}
+
 	forall(dtype T | sized(T))
-	static inline T* begin( const __small_array(T) & this ) {
-		return ((typeof(this.data))this.data);
-	}
-
-	forall(dtype T | sized(T))
-	static inline T* end( const __small_array(T) & this ) {
+	static inline T * end( const __small_array(T) & this ) {
 		return ((typeof(this.data))this.data) + this.size;
 	}
@@ -70,5 +70,5 @@
 #ifdef __cforall
 	trait is_node(dtype T) {
-		T*& get_next( T& );
+		T *& get_next( T & );
 	};
 #endif
@@ -97,27 +97,26 @@
 	forall(dtype T)
 	static inline void ?{}( __stack(T) & this ) {
-		(this.top){ NULL };
-	}
-
-	forall(dtype T | is_node(T) | sized(T))
-	static inline void push( __stack(T) & this, T * val ) {
-		verify( !get_next( *val ) );
-		get_next( *val ) = this.top;
-		this.top = val;
-	}
-
-	forall(dtype T | is_node(T) | sized(T))
-	static inline T * pop( __stack(T) & this ) {
-		T * top = this.top;
-		if( top ) {
-			this.top = get_next( *top );
-			get_next( *top ) = NULL;
-		}
-		return top;
-	}
-
-	forall(dtype T | is_node(T))
-	static inline int ?!=?( const __stack(T) & this, __attribute__((unused)) zero_t zero ) {
-		return this.top != 0;
+		(this.top){ 0p };
+	}
+
+	static inline forall( dtype T | is_node(T) ) {
+		void push( __stack(T) & this, T * val ) {
+			verify( !get_next( *val ) );
+			get_next( *val ) = this.top;
+			this.top = val;
+		}
+
+		T * pop( __stack(T) & this ) {
+			T * top = this.top;
+			if( top ) {
+				this.top = get_next( *top );
+				get_next( *top ) = 0p;
+			}
+			return top;
+		}
+
+		int ?!=?( const __stack(T) & this, __attribute__((unused)) zero_t zero ) {
+			return this.top != 0;
+		}
 	}
 #endif
@@ -145,52 +144,48 @@
 
 #ifdef __cforall
-
-	forall(dtype T)
-	static inline void ?{}( __queue(T) & this ) with( this ) {
-		head{ NULL };
-		tail{ &head };
-	}
-
-	forall(dtype T | is_node(T) | sized(T))
-	static inline void append( __queue(T) & this, T * val ) with( this ) {
-		verify(tail != NULL);
-		*tail = val;
-		tail = &get_next( *val );
-	}
-
-	forall(dtype T | is_node(T) | sized(T))
-	static inline T * pop_head( __queue(T) & this ) {
-		T * head = this.head;
-		if( head ) {
-			this.head = get_next( *head );
-			if( !get_next( *head ) ) {
-				this.tail = &this.head;
-			}
-			get_next( *head ) = NULL;
-		}
-		return head;
-	}
-
-	forall(dtype T | is_node(T) | sized(T))
-	static inline T * remove( __queue(T) & this, T ** it ) with( this ) {
-		T * val = *it;
-		verify( val );
-
-		(*it) = get_next( *val );
-
-		if( tail == &get_next( *val ) ) {
-			tail = it;
-		}
-
-		get_next( *val ) = NULL;
-
-		verify( (head == NULL) == (&head == tail) );
-		verify( *tail == NULL );
-		return val;
-	}
-
-	forall(dtype T | is_node(T))
-	static inline int ?!=?( const __queue(T) & this, __attribute__((unused)) zero_t zero ) {
-		return this.head != 0;
+	static inline forall( dtype T | is_node(T) ) {
+		void ?{}( __queue(T) & this ) with( this ) {
+			head{ 0p };
+			tail{ &head };
+		}
+
+		void append( __queue(T) & this, T * val ) with( this ) {
+			verify(tail != 0p);
+			*tail = val;
+			tail = &get_next( *val );
+		}
+
+		T * pop_head( __queue(T) & this ) {
+			T * head = this.head;
+			if( head ) {
+				this.head = get_next( *head );
+				if( !get_next( *head ) ) {
+					this.tail = &this.head;
+				}
+				get_next( *head ) = 0p;
+			}
+			return head;
+		}
+
+		T * remove( __queue(T) & this, T ** it ) with( this ) {
+			T * val = *it;
+			verify( val );
+
+			(*it) = get_next( *val );
+
+			if( tail == &get_next( *val ) ) {
+				tail = it;
+			}
+
+			get_next( *val ) = 0p;
+
+			verify( (head == 0p) == (&head == tail) );
+			verify( *tail == 0p );
+			return val;
+		}
+
+		int ?!=?( const __queue(T) & this, __attribute__((unused)) zero_t zero ) {
+			return this.head != 0;
+		}
 	}
 #endif
@@ -223,8 +218,7 @@
 
 #ifdef __cforall
-
-	forall(dtype T | sized(T))
+	forall(dtype T )
 	static inline [void] ?{}( __dllist(T) & this, * [T * & next, T * & prev] ( T & ) __get ) {
-		this.head{ NULL };
+		this.head{ 0p };
 		this.__get = __get;
 	}
@@ -232,47 +226,44 @@
 	#define next 0
 	#define prev 1
-	forall(dtype T | sized(T))
-	static inline void push_front( __dllist(T) & this, T & node ) with( this ) {
-		verify(__get);
-		if ( head ) {
-			__get( node ).next = head;
-			__get( node ).prev = __get( *head ).prev;
-			// inserted node must be consistent before it is seen
+	static inline forall(dtype T) {
+		void push_front( __dllist(T) & this, T & node ) with( this ) {
+			verify(__get);
+			if ( head ) {
+				__get( node ).next = head;
+				__get( node ).prev = __get( *head ).prev;
+				// inserted node must be consistent before it is seen
+				// prevent code movement across barrier
+				asm( "" : : : "memory" );
+				__get( *head ).prev = &node;
+				T & _prev = *__get( node ).prev;
+				__get( _prev ).next = &node;
+			} else {
+				__get( node ).next = &node;
+				__get( node ).prev = &node;
+			}
+
 			// prevent code movement across barrier
 			asm( "" : : : "memory" );
-			__get( *head ).prev = &node;
-			T & _prev = *__get( node ).prev;
-			__get( _prev ).next = &node;
-		}
-		else {
-			__get( node ).next = &node;
-			__get( node ).prev = &node;
-		}
-
-		// prevent code movement across barrier
-		asm( "" : : : "memory" );
-		head = &node;
-	}
-
-	forall(dtype T | sized(T))
-	static inline void remove( __dllist(T) & this, T & node ) with( this ) {
-		verify(__get);
-		if ( &node == head ) {
-			if ( __get( *head ).next == head ) {
-				head = NULL;
-			}
-			else {
-				head = __get( *head ).next;
-			}
-		}
-		__get( *__get( node ).next ).prev = __get( node ).prev;
-		__get( *__get( node ).prev ).next = __get( node ).next;
-		__get( node ).next = NULL;
-		__get( node ).prev = NULL;
-	}
-
-	forall(dtype T | sized(T))
-	static inline int ?!=?( const __dllist(T) & this, __attribute__((unused)) zero_t zero ) {
-		return this.head != 0;
+			head = &node;
+		}
+
+		void remove( __dllist(T) & this, T & node ) with( this ) {
+			verify(__get);
+			if ( &node == head ) {
+				if ( __get( *head ).next == head ) {
+					head = 0p;
+				} else {
+					head = __get( *head ).next;
+				}
+			}
+			__get( *__get( node ).next ).prev = __get( node ).prev;
+			__get( *__get( node ).prev ).next = __get( node ).next;
+			__get( node ).next = 0p;
+			__get( node ).prev = 0p;
+		}
+
+		int ?!=?( const __dllist(T) & this, __attribute__((unused)) zero_t zero ) {
+			return this.head != 0;
+		}
 	}
 	#undef next
@@ -286,2 +277,6 @@
 
 #endif
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: libcfa/src/bits/debug.cfa
===================================================================
--- libcfa/src/bits/debug.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/bits/debug.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Thu Mar 30 12:30:01 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Jul 14 22:17:35 2019
-// Update Count     : 4
+// Last Modified On : Tue Feb  4 13:03:16 2020
+// Update Count     : 11
 //
 
@@ -27,6 +27,5 @@
 
 extern "C" {
-
-	void __cfaabi_dbg_bits_write( const char *in_buffer, int len ) {
+	void __cfaabi_bits_write( int fd, const char in_buffer[], int len ) {
 		// ensure all data is written
 		for ( int count = 0, retcode; count < len; count += retcode ) {
@@ -34,5 +33,5 @@
 
 			for ( ;; ) {
-				retcode = write( STDERR_FILENO, in_buffer, len - count );
+				retcode = write( fd, in_buffer, len - count );
 
 				// not a timer interrupt ?
@@ -44,21 +43,21 @@
 	}
 
-	void __cfaabi_dbg_bits_acquire() __attribute__((__weak__)) {}
-	void __cfaabi_dbg_bits_release() __attribute__((__weak__)) {}
+	void __cfaabi_bits_acquire() __attribute__((__weak__)) {}
+	void __cfaabi_bits_release() __attribute__((__weak__)) {}
 
-	void __cfaabi_dbg_bits_print_safe  ( const char fmt[], ... ) __attribute__(( format(printf, 1, 2) )) {
+	void __cfaabi_bits_print_safe  ( int fd, const char fmt[], ... ) __attribute__(( format(printf, 2, 3) )) {
 		va_list args;
 
 		va_start( args, fmt );
-		__cfaabi_dbg_bits_acquire();
+		__cfaabi_bits_acquire();
 
 		int len = vsnprintf( buffer, buffer_size, fmt, args );
-		__cfaabi_dbg_bits_write( buffer, len );
+		__cfaabi_bits_write( fd, buffer, len );
 
-		__cfaabi_dbg_bits_release();
+		__cfaabi_bits_release();
 		va_end( args );
 	}
 
-	void __cfaabi_dbg_bits_print_nolock( const char fmt[], ... ) __attribute__(( format(printf, 1, 2) )) {
+	void __cfaabi_bits_print_nolock( int fd, const char fmt[], ... ) __attribute__(( format(printf, 2, 3) )) {
 		va_list args;
 
@@ -66,15 +65,15 @@
 
 		int len = vsnprintf( buffer, buffer_size, fmt, args );
-		__cfaabi_dbg_bits_write( buffer, len );
+		__cfaabi_bits_write( fd, buffer, len );
 
 		va_end( args );
 	}
 
-	void __cfaabi_dbg_bits_print_vararg( const char fmt[], va_list args ) {
+	void __cfaabi_bits_print_vararg( int fd, const char fmt[], va_list args ) {
 		int len = vsnprintf( buffer, buffer_size, fmt, args );
-		__cfaabi_dbg_bits_write( buffer, len );
+		__cfaabi_bits_write( fd, buffer, len );
 	}
 
-	void __cfaabi_dbg_bits_print_buffer( char in_buffer[], int in_buffer_size, const char fmt[], ... ) __attribute__(( format(printf, 3, 4) )) {
+	void __cfaabi_bits_print_buffer( int fd, char in_buffer[], int in_buffer_size, const char fmt[], ... ) __attribute__(( format(printf, 4, 5) )) {
 		va_list args;
 
@@ -82,5 +81,5 @@
 
 		int len = vsnprintf( in_buffer, in_buffer_size, fmt, args );
-		__cfaabi_dbg_bits_write( in_buffer, len );
+		__cfaabi_bits_write( fd, in_buffer, len );
 
 		va_end( args );
Index: libcfa/src/bits/debug.hfa
===================================================================
--- libcfa/src/bits/debug.hfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/bits/debug.hfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon Nov 28 12:27:26 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Feb  8 12:35:19 2018
-// Update Count     : 2
+// Last Modified On : Tue Feb  4 12:29:21 2020
+// Update Count     : 9
 //
 
@@ -21,6 +21,6 @@
 	#define __cfaabi_dbg_ctx __PRETTY_FUNCTION__
 	#define __cfaabi_dbg_ctx2 , __PRETTY_FUNCTION__
-	#define __cfaabi_dbg_ctx_param const char * caller
-	#define __cfaabi_dbg_ctx_param2 , const char * caller
+	#define __cfaabi_dbg_ctx_param const char caller[]
+	#define __cfaabi_dbg_ctx_param2 , const char caller[]
 #else
 	#define __cfaabi_dbg_debug_do(...)
@@ -38,11 +38,11 @@
 	#include <stdio.h>
 
-      extern void __cfaabi_dbg_bits_write( const char *buffer, int len );
-      extern void __cfaabi_dbg_bits_acquire();
-      extern void __cfaabi_dbg_bits_release();
-      extern void __cfaabi_dbg_bits_print_safe  ( const char fmt[], ... ) __attribute__(( format(printf, 1, 2) ));
-      extern void __cfaabi_dbg_bits_print_nolock( const char fmt[], ... ) __attribute__(( format(printf, 1, 2) ));
-      extern void __cfaabi_dbg_bits_print_vararg( const char fmt[], va_list arg );
-      extern void __cfaabi_dbg_bits_print_buffer( char buffer[], int buffer_size, const char fmt[], ... ) __attribute__(( format(printf, 3, 4) ));
+	extern void __cfaabi_bits_write( int fd, const char buffer[], int len );
+	extern void __cfaabi_bits_acquire();
+	extern void __cfaabi_bits_release();
+	extern void __cfaabi_bits_print_safe  ( int fd, const char fmt[], ... ) __attribute__(( format(printf, 2, 3) ));
+	extern void __cfaabi_bits_print_nolock( int fd, const char fmt[], ... ) __attribute__(( format(printf, 2, 3) ));
+	extern void __cfaabi_bits_print_vararg( int fd, const char fmt[], va_list arg );
+	extern void __cfaabi_bits_print_buffer( int fd, char buffer[], int buffer_size, const char fmt[], ... ) __attribute__(( format(printf, 4, 5) ));
 #ifdef __cforall
 }
@@ -50,12 +50,12 @@
 
 #ifdef __CFA_DEBUG_PRINT__
-	#define __cfaabi_dbg_write( buffer, len )         __cfaabi_dbg_bits_write( buffer, len )
-	#define __cfaabi_dbg_acquire()                    __cfaabi_dbg_bits_acquire()
-	#define __cfaabi_dbg_release()                    __cfaabi_dbg_bits_release()
-	#define __cfaabi_dbg_print_safe(...)              __cfaabi_dbg_bits_print_safe   (__VA_ARGS__)
-	#define __cfaabi_dbg_print_nolock(...)            __cfaabi_dbg_bits_print_nolock (__VA_ARGS__)
-	#define __cfaabi_dbg_print_buffer(...)            __cfaabi_dbg_bits_print_buffer (__VA_ARGS__)
-	#define __cfaabi_dbg_print_buffer_decl(...)       char __dbg_text[256]; int __dbg_len = snprintf( __dbg_text, 256, __VA_ARGS__ ); __cfaabi_dbg_bits_write( __dbg_text, __dbg_len );
-	#define __cfaabi_dbg_print_buffer_local(...)      __dbg_len = snprintf( __dbg_text, 256, __VA_ARGS__ ); __cfaabi_dbg_bits_write( __dbg_text, __dbg_len );
+	#define __cfaabi_dbg_write( buffer, len )         __cfaabi_bits_write( STDERR_FILENO, buffer, len )
+	#define __cfaabi_dbg_acquire()                    __cfaabi_bits_acquire()
+	#define __cfaabi_dbg_release()                    __cfaabi_bits_release()
+	#define __cfaabi_dbg_print_safe(...)              __cfaabi_bits_print_safe   (__VA_ARGS__)
+	#define __cfaabi_dbg_print_nolock(...)            __cfaabi_bits_print_nolock (__VA_ARGS__)
+	#define __cfaabi_dbg_print_buffer(...)            __cfaabi_bits_print_buffer (__VA_ARGS__)
+	#define __cfaabi_dbg_print_buffer_decl(...)       char __dbg_text[256]; int __dbg_len = snprintf( __dbg_text, 256, __VA_ARGS__ ); __cfaabi_bits_write( __dbg_text, __dbg_len );
+	#define __cfaabi_dbg_print_buffer_local(...)      __dbg_len = snprintf( __dbg_text, 256, __VA_ARGS__ ); __cfaabi_dbg_write( __dbg_text, __dbg_len );
 #else
 	#define __cfaabi_dbg_write(...)               ((void)0)
Index: libcfa/src/bits/defs.hfa
===================================================================
--- libcfa/src/bits/defs.hfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/bits/defs.hfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Thu Nov  9 13:24:10 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Feb  8 16:22:41 2018
-// Update Count     : 8
+// Last Modified On : Tue Jan 28 22:38:27 2020
+// Update Count     : 9
 //
 
@@ -34,5 +34,6 @@
 
 #ifdef __cforall
-void abort ( const char fmt[], ... ) __attribute__ (( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ ));
+void abort( const char fmt[], ... ) __attribute__ (( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ ));
+void abort( bool signalAbort, const char fmt[], ... ) __attribute__ (( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ ));
 extern "C" {
 #endif
@@ -47,2 +48,8 @@
 #define OPTIONAL_THREAD __attribute__((weak))
 #endif
+
+static inline long long rdtscl(void) {
+    unsigned int lo, hi;
+    __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
+    return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
+}
Index: libcfa/src/bits/locks.hfa
===================================================================
--- libcfa/src/bits/locks.hfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/bits/locks.hfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Tue Oct 31 15:14:38 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Aug 11 15:42:24 2018
-// Update Count     : 10
+// Last Modified On : Tue Feb  4 13:03:19 2020
+// Update Count     : 11
 //
 
@@ -54,5 +54,5 @@
 
 		#ifdef __CFA_DEBUG__
-			void __cfaabi_dbg_record(__spinlock_t & this, const char * prev_name);
+			void __cfaabi_dbg_record(__spinlock_t & this, const char prev_name[]);
 		#else
 			#define __cfaabi_dbg_record(x, y)
Index: libcfa/src/bits/signal.hfa
===================================================================
--- libcfa/src/bits/signal.hfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/bits/signal.hfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -37,7 +37,17 @@
 
 	act.sa_sigaction = (void (*)(int, siginfo_t *, void *))handler;
+	sigemptyset( &act.sa_mask );
+	sigaddset( &act.sa_mask, SIGALRM );		// disabled during signal handler
+	sigaddset( &act.sa_mask, SIGUSR1 );
+	sigaddset( &act.sa_mask, SIGSEGV );
+	sigaddset( &act.sa_mask, SIGBUS );
+	sigaddset( &act.sa_mask, SIGILL );
+	sigaddset( &act.sa_mask, SIGFPE );
+	sigaddset( &act.sa_mask, SIGHUP );		// revert to default on second delivery
+	sigaddset( &act.sa_mask, SIGTERM );
+	sigaddset( &act.sa_mask, SIGINT );
 	act.sa_flags = flags;
 
-	if ( sigaction( sig, &act, NULL ) == -1 ) {
+	if ( sigaction( sig, &act, 0p ) == -1 ) {
 		__cfaabi_dbg_print_buffer_decl(
 			" __cfaabi_sigaction( sig:%d, handler:%p, flags:%d ), problem installing signal handler, error(%d) %s.\n",
@@ -45,21 +55,4 @@
 		);
 		_exit( EXIT_FAILURE );
-	}
+	} // if
 }
-
-// Sigaction wrapper : restore default handler
-static void __cfaabi_sigdefault( int sig ) {
-	struct sigaction act;
-
-	act.sa_handler = SIG_DFL;
-	act.sa_flags = 0;
-	sigemptyset( &act.sa_mask );
-
-	if ( sigaction( sig, &act, NULL ) == -1 ) {
-		__cfaabi_dbg_print_buffer_decl(
-			" __cfaabi_sigdefault( sig:%d ), problem reseting signal handler, error(%d) %s.\n",
-			sig, errno, strerror( errno )
-		);
-		_exit( EXIT_FAILURE );
-	}
-}
Index: libcfa/src/clock.hfa
===================================================================
--- libcfa/src/clock.hfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/clock.hfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,10 +10,9 @@
 // Created On       : Thu Apr 12 14:36:06 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jun 13 21:21:13 2019
-// Update Count     : 8
+// Last Modified On : Mon Jan  6 12:49:58 2020
+// Update Count     : 9
 //
 
 #include <time.hfa>
-
 
 //######################### C time #########################
@@ -26,23 +25,15 @@
 static inline tm * localtime_r( time_t tp, tm * result ) { return localtime_r( &tp, result ); }
 
-
 //######################### Clock #########################
 
 struct Clock {											// private
 	Duration offset;									// for virtual clock: contains offset from real-time
-	int clocktype;										// implementation only -1 (virtual), CLOCK_REALTIME
 };
 
 static inline {
-	void resetClock( Clock & clk ) with( clk ) {
-		clocktype = CLOCK_REALTIME_COARSE;
-	} // Clock::resetClock
-
 	void resetClock( Clock & clk, Duration adj ) with( clk ) {
-		clocktype = -1;
 		offset = adj + __timezone`s;					// timezone (global) is (UTC - local time) in seconds
 	} // resetClock
 
-	void ?{}( Clock & clk ) { resetClock( clk ); }
 	void ?{}( Clock & clk, Duration adj ) { resetClock( clk, adj ); }
 
@@ -89,4 +80,10 @@
 		return ret;
 	} // getTime
+
+	Time getCPUTime() {
+		timespec ts;
+		clock_gettime( CLOCK_THREAD_CPUTIME_ID, &ts );
+		return (Time){ ts };
+    } // getCPUTime
 } // distribution
 
Index: libcfa/src/concurrency/CtxSwitch-x86_64.S
===================================================================
--- libcfa/src/concurrency/CtxSwitch-x86_64.S	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/concurrency/CtxSwitch-x86_64.S	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -87,5 +87,6 @@
 CtxInvokeStub:
 	movq %rbx, %rdi
-	jmp *%r12
+	movq %r12, %rsi
+	jmp *%r13
 	.size  CtxInvokeStub, .-CtxInvokeStub
 
Index: libcfa/src/concurrency/alarm.cfa
===================================================================
--- libcfa/src/concurrency/alarm.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/concurrency/alarm.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Fri Jun 2 11:31:25 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri May 25 06:25:47 2018
-// Update Count     : 67
+// Last Modified On : Sun Jan  5 08:41:36 2020
+// Update Count     : 69
 //
 
@@ -39,6 +39,6 @@
 
 void __kernel_set_timer( Duration alarm ) {
-	verifyf(alarm >= 1`us || alarm == 0, "Setting timer to < 1us (%jins)", alarm.tv);
-	setitimer( ITIMER_REAL, &(itimerval){ alarm }, NULL );
+	verifyf(alarm >= 1`us || alarm == 0, "Setting timer to < 1us (%jins)", alarm`ns);
+	setitimer( ITIMER_REAL, &(itimerval){ alarm }, 0p );
 }
 
@@ -113,5 +113,5 @@
 			this->tail = &this->head;
 		}
-		head->next = NULL;
+		head->next = 0p;
 	}
 	verify( validate( this ) );
@@ -127,5 +127,5 @@
 		this->tail = it;
 	}
-	n->next = NULL;
+	n->next = 0p;
 
 	verify( validate( this ) );
Index: libcfa/src/concurrency/coroutine.cfa
===================================================================
--- libcfa/src/concurrency/coroutine.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/concurrency/coroutine.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon Nov 28 12:27:26 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Mar 30 17:20:57 2018
-// Update Count     : 9
+// Last Modified On : Tue Feb  4 12:29:25 2020
+// Update Count     : 16
 //
 
@@ -89,12 +89,12 @@
 }
 
-void ?{}( coroutine_desc & this, const char * name, void * storage, size_t storageSize ) with( this ) {
-	(this.context){NULL, NULL};
+void ?{}( coroutine_desc & this, const char name[], void * storage, size_t storageSize ) with( this ) {
+	(this.context){0p, 0p};
 	(this.stack){storage, storageSize};
 	this.name = name;
 	state = Start;
-	starter = NULL;
-	last = NULL;
-	cancellation = NULL;
+	starter = 0p;
+	last = 0p;
+	cancellation = 0p;
 }
 
@@ -131,5 +131,5 @@
 
 [void *, size_t] __stack_alloc( size_t storageSize ) {
-	static const size_t stack_data_size = libCeiling( sizeof(__stack_t), 16 ); // minimum alignment
+	const size_t stack_data_size = libCeiling( sizeof(__stack_t), 16 ); // minimum alignment
 	assert(__page_size != 0l);
 	size_t size = libCeiling( storageSize, 16 ) + stack_data_size;
@@ -157,5 +157,5 @@
 
 void __stack_prepare( __stack_info_t * this, size_t create_size ) {
-	static const size_t stack_data_size = libCeiling( sizeof(__stack_t), 16 ); // minimum alignment
+	const size_t stack_data_size = libCeiling( sizeof(__stack_t), 16 ); // minimum alignment
 	bool userStack;
 	void * storage;
@@ -187,9 +187,5 @@
 // is not inline (We can't inline Cforall in C)
 extern "C" {
-	void __suspend_internal(void) {
-		suspend();
-	}
-
-	void __leave_coroutine( coroutine_desc * src ) {
+	void __leave_coroutine( struct coroutine_desc * src ) {
 		coroutine_desc * starter = src->cancellation != 0 ? src->last : src->starter;
 
@@ -207,4 +203,16 @@
 		CoroutineCtxSwitch( src, starter );
 	}
+
+	struct coroutine_desc * __finish_coroutine(void) {
+		struct coroutine_desc * cor = kernelTLS.this_thread->curr_cor;
+
+		if(cor->state == Primed) {
+			suspend();
+		}
+
+		cor->state = Active;
+
+		return cor;
+	}
 }
 
Index: libcfa/src/concurrency/coroutine.hfa
===================================================================
--- libcfa/src/concurrency/coroutine.hfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/concurrency/coroutine.hfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon Nov 28 12:27:26 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jun 21 17:49:39 2019
-// Update Count     : 9
+// Last Modified On : Tue Feb  4 12:29:26 2020
+// Update Count     : 11
 //
 
@@ -35,12 +35,12 @@
 // void ^?{}( coStack_t & this );
 
-void ?{}( coroutine_desc & this, const char * name, void * storage, size_t storageSize );
+void ?{}( coroutine_desc & this, const char name[], void * storage, size_t storageSize );
 void ^?{}( coroutine_desc & this );
 
-static inline void ?{}( coroutine_desc & this)                                       { this{ "Anonymous Coroutine", NULL, 0 }; }
-static inline void ?{}( coroutine_desc & this, size_t stackSize)                     { this{ "Anonymous Coroutine", NULL, stackSize }; }
+static inline void ?{}( coroutine_desc & this)                                       { this{ "Anonymous Coroutine", 0p, 0 }; }
+static inline void ?{}( coroutine_desc & this, size_t stackSize)                     { this{ "Anonymous Coroutine", 0p, stackSize }; }
 static inline void ?{}( coroutine_desc & this, void * storage, size_t storageSize )  { this{ "Anonymous Coroutine", storage, storageSize }; }
-static inline void ?{}( coroutine_desc & this, const char * name)                    { this{ name, NULL, 0 }; }
-static inline void ?{}( coroutine_desc & this, const char * name, size_t stackSize ) { this{ name, NULL, stackSize }; }
+static inline void ?{}( coroutine_desc & this, const char name[])                    { this{ name, 0p, 0 }; }
+static inline void ?{}( coroutine_desc & this, const char name[], size_t stackSize ) { this{ name, 0p, stackSize }; }
 
 //-----------------------------------------------------------------------------
@@ -61,9 +61,8 @@
 // Start coroutine routines
 extern "C" {
-      forall(dtype T | is_coroutine(T))
-      void CtxInvokeCoroutine(T * this);
+	void CtxInvokeCoroutine(void (*main)(void *), void * this);
 
-      forall(dtype T | is_coroutine(T))
-      void CtxStart(T * this, void ( *invoke)(T *));
+	forall(dtype T)
+	void CtxStart(void (*main)(T &), struct coroutine_desc * cor, T & this, void (*invoke)(void (*main)(void *), void *));
 
 	extern void _CtxCoroutine_Unwind(struct _Unwind_Exception * storage, struct coroutine_desc *) __attribute__ ((__noreturn__));
@@ -89,5 +88,5 @@
 	src->state = Active;
 
-	if( unlikely(src->cancellation != NULL) ) {
+	if( unlikely(src->cancellation != 0p) ) {
 		_CtxCoroutine_Unwind(src->cancellation, src);
 	}
@@ -128,7 +127,9 @@
 	coroutine_desc * dst = get_coroutine(cor);
 
-	if( unlikely(dst->context.SP == NULL) ) {
+	if( unlikely(dst->context.SP == 0p) ) {
+		TL_GET( this_thread )->curr_cor = dst;
 		__stack_prepare(&dst->stack, 65000);
-		CtxStart(&cor, CtxInvokeCoroutine);
+		CtxStart(main, dst, cor, CtxInvokeCoroutine);
+		TL_GET( this_thread )->curr_cor = src;
 	}
 
Index: libcfa/src/concurrency/invoke.c
===================================================================
--- libcfa/src/concurrency/invoke.c	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/concurrency/invoke.c	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -29,8 +29,7 @@
 // Called from the kernel when starting a coroutine or task so must switch back to user mode.
 
-extern void __suspend_internal(void);
-extern void __leave_coroutine( struct coroutine_desc * );
-extern void __finish_creation( struct thread_desc * );
-extern void __leave_thread_monitor( struct thread_desc * this );
+extern void __leave_coroutine ( struct coroutine_desc * );
+extern struct coroutine_desc * __finish_coroutine(void);
+extern void __leave_thread_monitor();
 extern void disable_interrupts() OPTIONAL_THREAD;
 extern void enable_interrupts( __cfaabi_dbg_ctx_param );
@@ -38,15 +37,10 @@
 void CtxInvokeCoroutine(
 	void (*main)(void *),
-	struct coroutine_desc *(*get_coroutine)(void *),
 	void *this
 ) {
-	struct coroutine_desc* cor = get_coroutine( this );
+	// Finish setting up the coroutine by setting its state
+	struct coroutine_desc * cor = __finish_coroutine();
 
-	if(cor->state == Primed) {
-		__suspend_internal();
-	}
-
-	cor->state = Active;
-
+	// Call the main of the coroutine
 	main( this );
 
@@ -83,16 +77,7 @@
 
 void CtxInvokeThread(
-	void (*dtor)(void *),
 	void (*main)(void *),
-	struct thread_desc *(*get_thread)(void *),
 	void *this
 ) {
-	// Fetch the thread handle from the user defined thread structure
-	struct thread_desc* thrd = get_thread( this );
-
-	// First suspend, once the thread arrives here,
-	// the function pointer to main can be invalidated without risk
-	__finish_creation( thrd );
-
 	// Officially start the thread by enabling preemption
 	enable_interrupts( __cfaabi_dbg_ctx );
@@ -108,16 +93,14 @@
 	// The order of these 4 operations is very important
 	//Final suspend, should never return
-	__leave_thread_monitor( thrd );
+	__leave_thread_monitor();
 	__cabi_abort( "Resumed dead thread" );
 }
 
-
 void CtxStart(
 	void (*main)(void *),
-	struct coroutine_desc *(*get_coroutine)(void *),
+	struct coroutine_desc * cor,
 	void *this,
 	void (*invoke)(void *)
 ) {
-	struct coroutine_desc * cor = get_coroutine( this );
 	struct __stack_t * stack = cor->stack.storage;
 
@@ -138,5 +121,6 @@
 
 	fs->dummyReturn = NULL;
-	fs->argument[0] = this;     // argument to invoke
+	fs->argument[0] = main;     // argument to invoke
+	fs->argument[1] = this;     // argument to invoke
 	fs->rturn = invoke;
 
@@ -156,9 +140,10 @@
 	fs->dummyReturn = NULL;
 	fs->rturn = CtxInvokeStub;
-	fs->fixedRegisters[0] = this;
-	fs->fixedRegisters[1] = invoke;
+	fs->fixedRegisters[0] = main;
+	fs->fixedRegisters[1] = this;
+	fs->fixedRegisters[2] = invoke;
 
 #elif defined( __ARM_ARCH )
-
+#error ARM needs to be upgrade to use to parameters like X86/X64 (A.K.A. : I broke this and do not know how to fix it)
 	struct FakeStack {
 		float fpRegs[16];			// floating point registers
Index: libcfa/src/concurrency/invoke.h
===================================================================
--- libcfa/src/concurrency/invoke.h	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/concurrency/invoke.h	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Tue Jan 17 12:27:26 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jun 22 18:19:13 2019
-// Update Count     : 40
+// Last Modified On : Thu Dec  5 16:26:03 2019
+// Update Count     : 44
 //
 
@@ -46,5 +46,5 @@
 	#ifdef __cforall
 	extern "Cforall" {
-		extern thread_local struct KernelThreadData {
+		extern __attribute__((aligned(128))) thread_local struct KernelThreadData {
 			struct thread_desc    * volatile this_thread;
 			struct processor      * volatile this_processor;
@@ -55,4 +55,6 @@
 				volatile bool in_progress;
 			} preemption_state;
+
+			uint32_t rand_seed;
 		} kernelTLS __attribute__ ((tls_model ( "initial-exec" )));
 	}
@@ -205,5 +207,5 @@
 
 		static inline void ?{}(__monitor_group_t & this) {
-			(this.data){NULL};
+			(this.data){0p};
 			(this.size){0};
 			(this.func){NULL};
Index: libcfa/src/concurrency/kernel.cfa
===================================================================
--- libcfa/src/concurrency/kernel.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/concurrency/kernel.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Tue Jan 17 12:27:26 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jun 20 17:21:23 2019
-// Update Count     : 25
+// Last Modified On : Tue Feb  4 13:03:15 2020
+// Update Count     : 58
 //
 
@@ -26,4 +26,6 @@
 #include <signal.h>
 #include <unistd.h>
+#include <limits.h>										// PTHREAD_STACK_MIN
+#include <sys/mman.h>									// mprotect
 }
 
@@ -40,5 +42,5 @@
 //-----------------------------------------------------------------------------
 // Some assembly required
-#if   defined( __i386 )
+#if defined( __i386 )
 	#define CtxGet( ctx )        \
 		__asm__ volatile (     \
@@ -123,5 +125,5 @@
 
 extern "C" {
-struct { __dllist_t(cluster) list; __spinlock_t lock; } __cfa_dbg_global_clusters;
+	struct { __dllist_t(cluster) list; __spinlock_t lock; } __cfa_dbg_global_clusters;
 }
 
@@ -131,7 +133,8 @@
 // Global state
 thread_local struct KernelThreadData kernelTLS __attribute__ ((tls_model ( "initial-exec" ))) = {
+	NULL,												// cannot use 0p
 	NULL,
-	NULL,
-	{ 1, false, false }
+	{ 1, false, false },
+	6u //this should be seeded better but due to a bug calling rdtsc doesn't work
 };
 
@@ -139,8 +142,8 @@
 // Struct to steal stack
 struct current_stack_info_t {
-	__stack_t * storage;		// pointer to stack object
-	void *base;				// base of stack
-	void *limit;			// stack grows towards stack limit
-	void *context;			// address of cfa_context_t
+	__stack_t * storage;								// pointer to stack object
+	void * base;										// base of stack
+	void * limit;										// stack grows towards stack limit
+	void * context;										// address of cfa_context_t
 };
 
@@ -171,7 +174,7 @@
 	name = "Main Thread";
 	state = Start;
-	starter = NULL;
-	last = NULL;
-	cancellation = NULL;
+	starter = 0p;
+	last = 0p;
+	cancellation = 0p;
 }
 
@@ -184,8 +187,8 @@
 	self_mon.recursion = 1;
 	self_mon_p = &self_mon;
-	next = NULL;
-
-	node.next = NULL;
-	node.prev = NULL;
+	next = 0p;
+
+	node.next = 0p;
+	node.prev = 0p;
 	doregister(curr_cluster, this);
 
@@ -206,10 +209,10 @@
 
 static void start(processor * this);
-void ?{}(processor & this, const char * name, cluster & cltr) with( this ) {
+void ?{}(processor & this, const char name[], cluster & cltr) with( this ) {
 	this.name = name;
 	this.cltr = &cltr;
 	terminated{ 0 };
 	do_terminate = false;
-	preemption_alarm = NULL;
+	preemption_alarm = 0p;
 	pending_preemption = false;
 	runner.proc = &this;
@@ -231,8 +234,9 @@
 	}
 
-	pthread_join( kernel_thread, NULL );
-}
-
-void ?{}(cluster & this, const char * name, Duration preemption_rate) with( this ) {
+	pthread_join( kernel_thread, 0p );
+	free( this.stack );
+}
+
+void ?{}(cluster & this, const char name[], Duration preemption_rate) with( this ) {
 	this.name = name;
 	this.preemption_rate = preemption_rate;
@@ -260,4 +264,8 @@
 //Main of the processor contexts
 void main(processorCtx_t & runner) {
+	// Because of a bug, we couldn't initialized the seed on construction
+	// Do it here
+	kernelTLS.rand_seed ^= rdtscl();
+
 	processor * this = runner.proc;
 	verify(this);
@@ -273,11 +281,9 @@
 		__cfaabi_dbg_print_safe("Kernel : core %p started\n", this);
 
-		thread_desc * readyThread = NULL;
-		for( unsigned int spin_count = 0; ! __atomic_load_n(&this->do_terminate, __ATOMIC_SEQ_CST); spin_count++ )
-		{
+		thread_desc * readyThread = 0p;
+		for( unsigned int spin_count = 0; ! __atomic_load_n(&this->do_terminate, __ATOMIC_SEQ_CST); spin_count++ ) {
 			readyThread = nextThread( this->cltr );
 
-			if(readyThread)
-			{
+			if(readyThread) {
 				verify( ! kernelTLS.preemption_state.enabled );
 
@@ -290,7 +296,5 @@
 
 				spin_count = 0;
-			}
-			else
-			{
+			} else {
 				// spin(this, &spin_count);
 				halt(this);
@@ -405,5 +409,5 @@
 	processor * proc = (processor *) arg;
 	kernelTLS.this_processor = proc;
-	kernelTLS.this_thread    = NULL;
+	kernelTLS.this_thread    = 0p;
 	kernelTLS.preemption_state.[enabled, disable_count] = [false, 1];
 	// SKULLDUGGERY: We want to create a context for the processor coroutine
@@ -418,5 +422,5 @@
 
 	//Set global state
-	kernelTLS.this_thread    = NULL;
+	kernelTLS.this_thread = 0p;
 
 	//We now have a proper context from which to schedule threads
@@ -434,5 +438,39 @@
 	__cfaabi_dbg_print_safe("Kernel : core %p main ended (%p)\n", proc, &proc->runner);
 
-	return NULL;
+	return 0p;
+}
+
+static void Abort( int ret, const char func[] ) {
+	if ( ret ) {										// pthread routines return errno values
+		abort( "%s : internal error, error(%d) %s.", func, ret, strerror( ret ) );
+	} // if
+} // Abort
+
+void * create_pthread( pthread_t * pthread, void * (*start)(void *), void * arg ) {
+	pthread_attr_t attr;
+
+	Abort( pthread_attr_init( &attr ), "pthread_attr_init" ); // initialize attribute
+
+	size_t stacksize;
+	// default stack size, normally defined by shell limit
+	Abort( pthread_attr_getstacksize( &attr, &stacksize ), "pthread_attr_getstacksize" );
+	assert( stacksize >= PTHREAD_STACK_MIN );
+
+	void * stack;
+	__cfaabi_dbg_debug_do(
+		stack = memalign( __page_size, stacksize + __page_size );
+		// pthread has no mechanism to create the guard page in user supplied stack.
+		if ( mprotect( stack, __page_size, PROT_NONE ) == -1 ) {
+			abort( "mprotect : internal error, mprotect failure, error(%d) %s.", errno, strerror( errno ) );
+		} // if
+	);
+	__cfaabi_dbg_no_debug_do(
+		stack = malloc( stacksize );
+	);
+
+	Abort( pthread_attr_setstack( &attr, stack, stacksize ), "pthread_attr_setstack" );
+
+	Abort( pthread_create( pthread, &attr, start, arg ), "pthread_create" );
+	return stack;
 }
 
@@ -440,5 +478,5 @@
 	__cfaabi_dbg_print_safe("Kernel : Starting core %p\n", this);
 
-	pthread_create( &this->kernel_thread, NULL, CtxInvokeProcessor, (void*)this );
+	this->stack = create_pthread( &this->kernel_thread, CtxInvokeProcessor, (void *)this );
 
 	__cfaabi_dbg_print_safe("Kernel : core %p started\n", this);
@@ -452,6 +490,7 @@
 	verify( ! kernelTLS.preemption_state.enabled );
 
+	kernelTLS.this_thread->curr_cor = dst;
 	__stack_prepare( &dst->stack, 65000 );
-	CtxStart(&this->runner, CtxInvokeCoroutine);
+	CtxStart(main, dst, this->runner, CtxInvokeCoroutine);
 
 	verify( ! kernelTLS.preemption_state.enabled );
@@ -468,4 +507,6 @@
 	// when CtxSwitch returns we are back in the src coroutine
 
+	mainThread->curr_cor = &mainThread->self_cor;
+
 	// set state of new coroutine to active
 	src->state = Active;
@@ -497,5 +538,5 @@
 	verify( ! kernelTLS.preemption_state.enabled );
 
-	verifyf( thrd->next == NULL, "Expected null got %p", thrd->next );
+	verifyf( thrd->next == 0p, "Expected null got %p", thrd->next );
 
 	with( *thrd->curr_cluster ) {
@@ -676,5 +717,5 @@
 	void ?{}(processorCtx_t & this, processor * proc) {
 		(this.__cor){ "Processor" };
-		this.__cor.starter = NULL;
+		this.__cor.starter = 0p;
 		this.proc = proc;
 	}
@@ -685,5 +726,5 @@
 		terminated{ 0 };
 		do_terminate = false;
-		preemption_alarm = NULL;
+		preemption_alarm = 0p;
 		pending_preemption = false;
 		kernel_thread = pthread_self();
@@ -803,6 +844,7 @@
 		sigemptyset( &mask );
 		sigaddset( &mask, SIGALRM );		// block SIGALRM signals
-		sigsuspend( &mask );			// block the processor to prevent further damage during abort
-		_exit( EXIT_FAILURE );			// if processor unblocks before it is killed, terminate it
+		sigaddset( &mask, SIGUSR1 );		// block SIGALRM signals
+		sigsuspend( &mask );				// block the processor to prevent further damage during abort
+		_exit( EXIT_FAILURE );				// if processor unblocks before it is killed, terminate it
 	}
 	else {
@@ -819,17 +861,17 @@
 	if(thrd) {
 		int len = snprintf( abort_text, abort_text_size, "Error occurred while executing thread %.256s (%p)", thrd->self_cor.name, thrd );
-		__cfaabi_dbg_bits_write( abort_text, len );
+		__cfaabi_bits_write( STDERR_FILENO, abort_text, len );
 
 		if ( &thrd->self_cor != thrd->curr_cor ) {
 			len = snprintf( abort_text, abort_text_size, " in coroutine %.256s (%p).\n", thrd->curr_cor->name, thrd->curr_cor );
-			__cfaabi_dbg_bits_write( abort_text, len );
+			__cfaabi_bits_write( STDERR_FILENO, abort_text, len );
 		}
 		else {
-			__cfaabi_dbg_bits_write( ".\n", 2 );
+			__cfaabi_bits_write( STDERR_FILENO, ".\n", 2 );
 		}
 	}
 	else {
 		int len = snprintf( abort_text, abort_text_size, "Error occurred outside of any thread.\n" );
-		__cfaabi_dbg_bits_write( abort_text, len );
+		__cfaabi_bits_write( STDERR_FILENO, abort_text, len );
 	}
 }
@@ -842,9 +884,9 @@
 
 extern "C" {
-	void __cfaabi_dbg_bits_acquire() {
+	void __cfaabi_bits_acquire() {
 		lock( kernel_debug_lock __cfaabi_dbg_ctx2 );
 	}
 
-	void __cfaabi_dbg_bits_release() {
+	void __cfaabi_bits_release() {
 		unlock( kernel_debug_lock );
 	}
@@ -879,5 +921,5 @@
 
 void V(semaphore & this) with( this ) {
-	thread_desc * thrd = NULL;
+	thread_desc * thrd = 0p;
 	lock( lock __cfaabi_dbg_ctx2 );
 	count += 1;
@@ -939,5 +981,5 @@
 __cfaabi_dbg_debug_do(
 	extern "C" {
-		void __cfaabi_dbg_record(__spinlock_t & this, const char * prev_name) {
+		void __cfaabi_dbg_record(__spinlock_t & this, const char prev_name[]) {
 			this.prev_name = prev_name;
 			this.prev_thrd = kernelTLS.this_thread;
Index: libcfa/src/concurrency/kernel.hfa
===================================================================
--- libcfa/src/concurrency/kernel.hfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/concurrency/kernel.hfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Tue Jan 17 12:27:26 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jun 22 11:39:17 2019
-// Update Count     : 16
+// Last Modified On : Tue Feb  4 12:29:26 2020
+// Update Count     : 22
 //
 
@@ -20,4 +20,5 @@
 #include "invoke.h"
 #include "time_t.hfa"
+#include "coroutine.hfa"
 
 extern "C" {
@@ -88,6 +89,6 @@
 static inline void ?{}(FinishAction & this) {
 	this.action_code = No_Action;
-	this.thrd = NULL;
-	this.lock = NULL;
+	this.thrd = 0p;
+	this.lock = 0p;
 }
 static inline void ^?{}(FinishAction &) {}
@@ -134,4 +135,7 @@
 	semaphore terminated;
 
+	// pthread Stack
+	void * stack;
+
 	// Link lists fields
 	struct __dbg_node_proc {
@@ -146,10 +150,10 @@
 };
 
-void  ?{}(processor & this, const char * name, struct cluster & cltr);
+void  ?{}(processor & this, const char name[], struct cluster & cltr);
 void ^?{}(processor & this);
 
 static inline void  ?{}(processor & this)                    { this{ "Anonymous Processor", *mainCluster}; }
 static inline void  ?{}(processor & this, struct cluster & cltr)    { this{ "Anonymous Processor", cltr}; }
-static inline void  ?{}(processor & this, const char * name) { this{name, *mainCluster }; }
+static inline void  ?{}(processor & this, const char name[]) { this{name, *mainCluster }; }
 
 static inline [processor *&, processor *& ] __get( processor & this ) {
@@ -191,10 +195,10 @@
 extern Duration default_preemption();
 
-void ?{} (cluster & this, const char * name, Duration preemption_rate);
+void ?{} (cluster & this, const char name[], Duration preemption_rate);
 void ^?{}(cluster & this);
 
 static inline void ?{} (cluster & this)                           { this{"Anonymous Cluster", default_preemption()}; }
 static inline void ?{} (cluster & this, Duration preemption_rate) { this{"Anonymous Cluster", preemption_rate}; }
-static inline void ?{} (cluster & this, const char * name)        { this{name, default_preemption()}; }
+static inline void ?{} (cluster & this, const char name[])        { this{name, default_preemption()}; }
 
 static inline [cluster *&, cluster *& ] __get( cluster & this ) {
Index: libcfa/src/concurrency/kernel_private.hfa
===================================================================
--- libcfa/src/concurrency/kernel_private.hfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/concurrency/kernel_private.hfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon Feb 13 12:27:26 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 29 14:06:40 2018
-// Update Count     : 3
+// Last Modified On : Sat Nov 30 19:25:02 2019
+// Update Count     : 8
 //
 
@@ -57,4 +57,6 @@
 void main(processorCtx_t *);
 
+void * create_pthread( pthread_t *, void * (*)(void *), void * );
+
 static inline void wake_fast(processor * this) {
 	__cfaabi_dbg_print_safe("Kernel : Waking up processor %p\n", this);
@@ -86,6 +88,5 @@
 // Threads
 extern "C" {
-      forall(dtype T | is_thread(T))
-      void CtxInvokeThread(T * this);
+      void CtxInvokeThread(void (*main)(void *), void * this);
 }
 
@@ -100,4 +101,11 @@
 // Utils
 #define KERNEL_STORAGE(T,X) static char storage_##X[sizeof(T)]
+
+static inline uint32_t tls_rand() {
+	kernelTLS.rand_seed ^= kernelTLS.rand_seed << 6;
+	kernelTLS.rand_seed ^= kernelTLS.rand_seed >> 21;
+	kernelTLS.rand_seed ^= kernelTLS.rand_seed << 7;
+	return kernelTLS.rand_seed;
+}
 
 
Index: libcfa/src/concurrency/monitor.cfa
===================================================================
--- libcfa/src/concurrency/monitor.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/concurrency/monitor.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Thd Feb 23 12:27:26 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Mar 30 14:30:26 2018
-// Update Count     : 9
+// Last Modified On : Wed Dec  4 07:55:14 2019
+// Update Count     : 10
 //
 
@@ -243,5 +243,6 @@
 	// last routine called by a thread.
 	// Should never return
-	void __leave_thread_monitor( thread_desc * thrd ) {
+	void __leave_thread_monitor() {
+		thread_desc * thrd = TL_GET( this_thread );
 		monitor_desc * this = &thrd->self_mon;
 
@@ -363,5 +364,5 @@
 	this.waiting_thread = waiting_thread;
 	this.count = count;
-	this.next = NULL;
+	this.next = 0p;
 	this.user_info = user_info;
 }
@@ -369,7 +370,7 @@
 void ?{}(__condition_criterion_t & this ) with( this ) {
 	ready  = false;
-	target = NULL;
-	owner  = NULL;
-	next   = NULL;
+	target = 0p;
+	owner  = 0p;
+	next   = 0p;
 }
 
@@ -378,5 +379,5 @@
 	this.target = target;
 	this.owner  = &owner;
-	this.next   = NULL;
+	this.next   = 0p;
 }
 
@@ -387,5 +388,5 @@
 
 	// Check that everything is as expected
-	assertf( this.monitors != NULL, "Waiting with no monitors (%p)", this.monitors );
+	assertf( this.monitors != 0p, "Waiting with no monitors (%p)", this.monitors );
 	verifyf( this.monitor_count != 0, "Waiting with 0 monitors (%"PRIiFAST16")", this.monitor_count );
 	verifyf( this.monitor_count < 32u, "Excessive monitor count (%"PRIiFAST16")", this.monitor_count );
@@ -449,5 +450,5 @@
 
 	// Lock all monitors
-	lock_all( this.monitors, NULL, count );
+	lock_all( this.monitors, 0p, count );
 
 	//Pop the head of the waiting queue
@@ -471,5 +472,5 @@
 
 	//Check that everything is as expected
-	verifyf( this.monitors != NULL, "Waiting with no monitors (%p)", this.monitors );
+	verifyf( this.monitors != 0p, "Waiting with no monitors (%p)", this.monitors );
 	verifyf( this.monitor_count != 0, "Waiting with 0 monitors (%"PRIiFAST16")", this.monitor_count );
 
@@ -674,6 +675,6 @@
 
 static inline void reset_mask( monitor_desc * this ) {
-	this->mask.accepted = NULL;
-	this->mask.data = NULL;
+	this->mask.accepted = 0p;
+	this->mask.data = 0p;
 	this->mask.size = 0;
 }
@@ -816,6 +817,6 @@
 	}
 
-	__cfaabi_dbg_print_safe( "Kernel :  Runing %i (%p)\n", ready2run, ready2run ? node->waiting_thread : NULL );
-	return ready2run ? node->waiting_thread : NULL;
+	__cfaabi_dbg_print_safe( "Kernel :  Runing %i (%p)\n", ready2run, ready2run ? node->waiting_thread : 0p );
+	return ready2run ? node->waiting_thread : 0p;
 }
 
@@ -824,5 +825,5 @@
 	if( !this.monitors ) {
 		// __cfaabi_dbg_print_safe( "Branding\n" );
-		assertf( thrd->monitors.data != NULL, "No current monitor to brand condition %p", thrd->monitors.data );
+		assertf( thrd->monitors.data != 0p, "No current monitor to brand condition %p", thrd->monitors.data );
 		this.monitor_count = thrd->monitors.size;
 
Index: libcfa/src/concurrency/monitor.hfa
===================================================================
--- libcfa/src/concurrency/monitor.hfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/concurrency/monitor.hfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Thd Feb 23 12:27:26 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Oct  7 18:06:45 2017
-// Update Count     : 10
+// Last Modified On : Wed Dec  4 07:55:32 2019
+// Update Count     : 11
 //
 
@@ -31,11 +31,13 @@
 	entry_queue{};
 	signal_stack{};
-	owner         = NULL;
+	owner         = 0p;
 	recursion     = 0;
-	mask.accepted = NULL;
-	mask.data     = NULL;
+	mask.accepted = 0p;
+	mask.data     = 0p;
 	mask.size     = 0;
-	dtor_node     = NULL;
+	dtor_node     = 0p;
 }
+
+static inline void ^?{}(monitor_desc & ) {}
 
 struct monitor_guard_t {
@@ -120,5 +122,5 @@
 
 static inline void ?{}( condition & this ) {
-	this.monitors = NULL;
+	this.monitors = 0p;
 	this.monitor_count = 0;
 }
Index: libcfa/src/concurrency/mutex.cfa
===================================================================
--- libcfa/src/concurrency/mutex.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/concurrency/mutex.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -11,7 +11,7 @@
 // Author           : Thierry Delisle
 // Created On       : Fri May 25 01:37:11 2018
-// Last Modified By : Thierry Delisle
-// Last Modified On : Fri May 25 01:37:51 2018
-// Update Count     : 0
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Dec  4 09:16:39 2019
+// Update Count     : 1
 //
 
@@ -73,5 +73,5 @@
 	this.lock{};
 	this.blocked_threads{};
-	this.owner = NULL;
+	this.owner = 0p;
 	this.recursion_count = 0;
 }
@@ -83,5 +83,5 @@
 void lock(recursive_mutex_lock & this) with(this) {
 	lock( lock __cfaabi_dbg_ctx2 );
-	if( owner == NULL ) {
+	if( owner == 0p ) {
 		owner = kernelTLS.this_thread;
 		recursion_count = 1;
@@ -101,5 +101,5 @@
 	bool ret = false;
 	lock( lock __cfaabi_dbg_ctx2 );
-	if( owner == NULL ) {
+	if( owner == 0p ) {
 		owner = kernelTLS.this_thread;
 		recursion_count = 1;
Index: libcfa/src/concurrency/mutex.hfa
===================================================================
--- libcfa/src/concurrency/mutex.hfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/concurrency/mutex.hfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -11,7 +11,7 @@
 // Author           : Thierry Delisle
 // Created On       : Fri May 25 01:24:09 2018
-// Last Modified By : Thierry Delisle
-// Last Modified On : Fri May 25 01:24:12 2018
-// Update Count     : 0
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Dec  4 09:16:53 2019
+// Update Count     : 1
 //
 
@@ -110,5 +110,5 @@
 
 	static inline void ?{}(lock_scope(L) & this) {
-		this.locks = NULL;
+		this.locks = 0p;
 		this.count = 0;
 	}
Index: libcfa/src/concurrency/preemption.cfa
===================================================================
--- libcfa/src/concurrency/preemption.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/concurrency/preemption.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon Jun 5 14:20:42 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jun  5 17:35:49 2018
-// Update Count     : 37
+// Last Modified On : Thu Dec  5 16:34:05 2019
+// Update Count     : 43
 //
 
@@ -24,4 +24,5 @@
 #include <string.h>
 #include <unistd.h>
+#include <limits.h>										// PTHREAD_STACK_MIN
 }
 
@@ -64,4 +65,5 @@
 event_kernel_t * event_kernel;                        // kernel public handle to even kernel
 static pthread_t alarm_thread;                        // pthread handle to alarm thread
+static void * alarm_stack;							  // pthread stack for alarm thread
 
 static void ?{}(event_kernel_t & this) with( this ) {
@@ -81,14 +83,14 @@
 // Get next expired node
 static inline alarm_node_t * get_expired( alarm_list_t * alarms, Time currtime ) {
-	if( !alarms->head ) return NULL;                          // If no alarms return null
-	if( alarms->head->alarm >= currtime ) return NULL;        // If alarms head not expired return null
-	return pop(alarms);                                       // Otherwise just pop head
+	if( !alarms->head ) return 0p;						// If no alarms return null
+	if( alarms->head->alarm >= currtime ) return 0p;	// If alarms head not expired return null
+	return pop(alarms);									// Otherwise just pop head
 }
 
 // Tick one frame of the Discrete Event Simulation for alarms
 static void tick_preemption() {
-	alarm_node_t * node = NULL;                     // Used in the while loop but cannot be declared in the while condition
-	alarm_list_t * alarms = &event_kernel->alarms;  // Local copy for ease of reading
-	Time currtime = __kernel_get_time();			// Check current time once so we everything "happens at once"
+	alarm_node_t * node = 0p;							// Used in the while loop but cannot be declared in the while condition
+	alarm_list_t * alarms = &event_kernel->alarms;		// Local copy for ease of reading
+	Time currtime = __kernel_get_time();				// Check current time once so everything "happens at once"
 
 	//Loop throught every thing expired
@@ -243,5 +245,5 @@
 	sigaddset( &mask, sig );
 
-	if ( pthread_sigmask( SIG_UNBLOCK, &mask, NULL ) == -1 ) {
+	if ( pthread_sigmask( SIG_UNBLOCK, &mask, 0p ) == -1 ) {
 	    abort( "internal error, pthread_sigmask" );
 	}
@@ -254,5 +256,5 @@
 	sigaddset( &mask, sig );
 
-	if ( pthread_sigmask( SIG_BLOCK, &mask, NULL ) == -1 ) {
+	if ( pthread_sigmask( SIG_BLOCK, &mask, 0p ) == -1 ) {
 	    abort( "internal error, pthread_sigmask" );
 	}
@@ -301,9 +303,9 @@
 
 	// Setup proper signal handlers
-	__cfaabi_sigaction( SIGUSR1, sigHandler_ctxSwitch, SA_SIGINFO | SA_RESTART );         // CtxSwitch handler
+	__cfaabi_sigaction( SIGUSR1, sigHandler_ctxSwitch, SA_SIGINFO | SA_RESTART ); // CtxSwitch handler
 
 	signal_block( SIGALRM );
 
-	pthread_create( &alarm_thread, NULL, alarm_loop, NULL );
+	alarm_stack = create_pthread( &alarm_thread, alarm_loop, 0p );
 }
 
@@ -316,5 +318,5 @@
 	sigset_t mask;
 	sigfillset( &mask );
-	sigprocmask( SIG_BLOCK, &mask, NULL );
+	sigprocmask( SIG_BLOCK, &mask, 0p );
 
 	// Notify the alarm thread of the shutdown
@@ -323,5 +325,7 @@
 
 	// Wait for the preemption thread to finish
-	pthread_join( alarm_thread, NULL );
+
+	pthread_join( alarm_thread, 0p );
+	free( alarm_stack );
 
 	// Preemption is now fully stopped
@@ -380,5 +384,5 @@
 	static_assert( sizeof( sigset_t ) == sizeof( cxt->uc_sigmask ), "Expected cxt->uc_sigmask to be of sigset_t" );
 	#endif
-	if ( pthread_sigmask( SIG_SETMASK, (sigset_t *)&(cxt->uc_sigmask), NULL ) == -1 ) {
+	if ( pthread_sigmask( SIG_SETMASK, (sigset_t *)&(cxt->uc_sigmask), 0p ) == -1 ) {
 		abort( "internal error, sigprocmask" );
 	}
@@ -399,5 +403,5 @@
 	sigset_t mask;
 	sigfillset(&mask);
-	if ( pthread_sigmask( SIG_BLOCK, &mask, NULL ) == -1 ) {
+	if ( pthread_sigmask( SIG_BLOCK, &mask, 0p ) == -1 ) {
 	    abort( "internal error, pthread_sigmask" );
 	}
@@ -420,5 +424,5 @@
 					{__cfaabi_dbg_print_buffer_decl( " KERNEL: Spurious wakeup %d.\n", err );}
 					continue;
-       			case EINVAL :
+				case EINVAL :
 				 	abort( "Timeout was invalid." );
 				default:
@@ -453,5 +457,5 @@
 EXIT:
 	__cfaabi_dbg_print_safe( "Kernel : Preemption thread stopping\n" );
-	return NULL;
+	return 0p;
 }
 
@@ -466,5 +470,5 @@
 	sigset_t oldset;
 	int ret;
-	ret = pthread_sigmask(0, NULL, &oldset);
+	ret = pthread_sigmask(0, 0p, &oldset);
 	if(ret != 0) { abort("ERROR sigprocmask returned %d", ret); }
 
Index: libcfa/src/concurrency/thread.cfa
===================================================================
--- libcfa/src/concurrency/thread.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/concurrency/thread.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Tue Jan 17 12:27:26 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Mar 30 17:19:52 2018
-// Update Count     : 8
+// Last Modified On : Wed Dec  4 09:17:49 2019
+// Update Count     : 9
 //
 
@@ -33,5 +33,5 @@
 // Thread ctors and dtors
 void ?{}(thread_desc & this, const char * const name, cluster & cl, void * storage, size_t storageSize ) with( this ) {
-	context{ NULL, NULL };
+	context{ 0p, 0p };
 	self_cor{ name, storage, storageSize };
 	state = Start;
@@ -41,8 +41,8 @@
 	self_mon_p = &self_mon;
 	curr_cluster = &cl;
-	next = NULL;
+	next = 0p;
 
-	node.next = NULL;
-	node.prev = NULL;
+	node.next = 0p;
+	node.prev = 0p;
 	doregister(curr_cluster, this);
 
@@ -58,5 +58,5 @@
 void ?{}( scoped(T)& this ) with( this ) {
 	handle{};
-	__thrd_start(handle);
+	__thrd_start(handle, main);
 }
 
@@ -64,5 +64,5 @@
 void ?{}( scoped(T)& this, P params ) with( this ) {
 	handle{ params };
-	__thrd_start(handle);
+	__thrd_start(handle, main);
 }
 
@@ -75,27 +75,17 @@
 // Starting and stopping threads
 forall( dtype T | is_thread(T) )
-void __thrd_start( T& this ) {
+void __thrd_start( T & this, void (*main_p)(T &) ) {
 	thread_desc * this_thrd = get_thread(this);
 	thread_desc * curr_thrd = TL_GET( this_thread );
 
 	disable_interrupts();
-	CtxStart(&this, CtxInvokeThread);
+	CtxStart(main_p, get_coroutine(this), this, CtxInvokeThread);
+
 	this_thrd->context.[SP, FP] = this_thrd->self_cor.context.[SP, FP];
 	verify( this_thrd->context.SP );
-	CtxSwitch( &curr_thrd->context, &this_thrd->context );
+	// CtxSwitch( &curr_thrd->context, &this_thrd->context );
 
 	ScheduleThread(this_thrd);
 	enable_interrupts( __cfaabi_dbg_ctx );
-}
-
-extern "C" {
-	// KERNEL ONLY
-	void __finish_creation(thread_desc * this) {
-		// set new coroutine that the processor is executing
-		// and context switch to it
-		verify( kernelTLS.this_thread != this );
-		verify( kernelTLS.this_thread->context.SP );
-		CtxSwitch( &this->context, &kernelTLS.this_thread->context );
-	}
 }
 
Index: libcfa/src/concurrency/thread.hfa
===================================================================
--- libcfa/src/concurrency/thread.hfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/concurrency/thread.hfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Tue Jan 17 12:27:26 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jun 21 17:51:33 2019
-// Update Count     : 5
+// Last Modified On : Wed Dec  4 09:18:14 2019
+// Update Count     : 6
 //
 
@@ -54,5 +54,5 @@
 
 forall( dtype T | is_thread(T) )
-void __thrd_start( T & this );
+void __thrd_start( T & this, void (*)(T &) );
 
 //-----------------------------------------------------------------------------
@@ -61,13 +61,13 @@
 void ^?{}(thread_desc & this);
 
-static inline void ?{}(thread_desc & this)                                                                  { this{ "Anonymous Thread", *mainCluster, NULL, 65000 }; }
-static inline void ?{}(thread_desc & this, size_t stackSize )                                               { this{ "Anonymous Thread", *mainCluster, NULL, stackSize }; }
+static inline void ?{}(thread_desc & this)                                                                  { this{ "Anonymous Thread", *mainCluster, 0p, 65000 }; }
+static inline void ?{}(thread_desc & this, size_t stackSize )                                               { this{ "Anonymous Thread", *mainCluster, 0p, stackSize }; }
 static inline void ?{}(thread_desc & this, void * storage, size_t storageSize )                             { this{ "Anonymous Thread", *mainCluster, storage, storageSize }; }
-static inline void ?{}(thread_desc & this, struct cluster & cl )                                            { this{ "Anonymous Thread", cl, NULL, 65000 }; }
-static inline void ?{}(thread_desc & this, struct cluster & cl, size_t stackSize )                          { this{ "Anonymous Thread", cl, NULL, stackSize }; }
+static inline void ?{}(thread_desc & this, struct cluster & cl )                                            { this{ "Anonymous Thread", cl, 0p, 65000 }; }
+static inline void ?{}(thread_desc & this, struct cluster & cl, size_t stackSize )                          { this{ "Anonymous Thread", cl, 0p, stackSize }; }
 static inline void ?{}(thread_desc & this, struct cluster & cl, void * storage, size_t storageSize )        { this{ "Anonymous Thread", cl, storage, storageSize }; }
-static inline void ?{}(thread_desc & this, const char * const name)                                         { this{ name, *mainCluster, NULL, 65000 }; }
-static inline void ?{}(thread_desc & this, const char * const name, struct cluster & cl )                   { this{ name, cl, NULL, 65000 }; }
-static inline void ?{}(thread_desc & this, const char * const name, struct cluster & cl, size_t stackSize ) { this{ name, cl, NULL, stackSize }; }
+static inline void ?{}(thread_desc & this, const char * const name)                                         { this{ name, *mainCluster, 0p, 65000 }; }
+static inline void ?{}(thread_desc & this, const char * const name, struct cluster & cl )                   { this{ name, cl, 0p, 65000 }; }
+static inline void ?{}(thread_desc & this, const char * const name, struct cluster & cl, size_t stackSize ) { this{ name, cl, 0p, stackSize }; }
 
 //-----------------------------------------------------------------------------
Index: libcfa/src/exception.c
===================================================================
--- libcfa/src/exception.c	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/exception.c	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -69,6 +69,6 @@
 
 
-// This macro should be the only thing that needs to change across machines.  Used in the personality function, way down
-// in termination.
+// This macro should be the only thing that needs to change across machines.
+// Used in the personality function, way down in termination.
 // struct _Unwind_Context * -> _Unwind_Reason_Code(*)(exception_t *)
 #define MATCHER_FROM_CONTEXT(ptr_to_context) \
@@ -102,6 +102,7 @@
 }
 
-// Do we control where exceptions get thrown even with concurency?  If not these are not quite thread safe, the cleanup
-// hook has to be added after the node is built but before it is made the top node.
+// Do we control where exceptions get thrown even with concurency?
+// If not these are not quite thread safe, the cleanup hook has to
+// be added after the node is built but before it is made the top node.
 
 void __cfaabi_ehm__try_resume_setup(struct __cfaabi_ehm__try_resume_node * node,
@@ -212,13 +213,14 @@
 	_Unwind_Reason_Code ret = _Unwind_RaiseException( &this_exception_storage );
 
-	// If we reach here it means something happened.  For resumption to work we need to find a way to return back to
-	// here.  Most of them will probably boil down to setting a global flag and making the phase 1 either stop or
-	// fail.  Causing an error on purpose may help avoiding unnecessary work but it might have some weird side
-	// effects.  If we just pretend no handler was found that would work but may be expensive for no reason since we
-	// will always search the whole stack.
+	// If we reach here it means something happened. For resumption to work we need to find a way
+	// to return back to here. Most of them will probably boil down to setting a global flag and
+	// making the phase 1 either stop or fail. Causing an error on purpose may help avoiding
+	// unnecessary work but it might have some weird side effects. If we just pretend no handler
+	// was found that would work but may be expensive for no reason since we will always search
+	// the whole stack.
 
 	if( ret == _URC_END_OF_STACK ) {
-		// No proper handler was found.  This can be handled in several way.  C++ calls std::terminate Here we
-		// force unwind the stack, basically raising a cancellation.
+		// No proper handler was found. This can be handled in many ways, C++ calls std::terminate.
+		// Here we force unwind the stack, basically raising a cancellation.
 		printf("Uncaught exception %p\n", &this_exception_storage);
 
@@ -228,5 +230,5 @@
 	}
 
-	// We did not simply reach the end of the stack without finding a handler.  Something wen't wrong
+	// We did not simply reach the end of the stack without finding a handler. This is an error.
 	printf("UNWIND ERROR %d after raise exception\n", ret);
 	abort();
@@ -254,7 +256,8 @@
 	abort();
 }
-#else
-// This is our personality routine.  For every stack frame anotated with ".cfi_personality 0x3,__gcfa_personality_v0".
-// This function will be called twice when unwinding.  Once in the search phased and once in the cleanup phase.
+#else // PIC
+// This is our personality routine. For every stack frame annotated with
+// ".cfi_personality 0x3,__gcfa_personality_v0" this function will be called twice when unwinding.
+//  Once in the search phase and once in the cleanup phase.
 _Unwind_Reason_Code __gcfa_personality_v0 (
 		int version, _Unwind_Action actions, unsigned long long exceptionClass,
@@ -264,5 +267,6 @@
 
 	//__cfaabi_dbg_print_safe("CFA: 0x%lx\n", _Unwind_GetCFA(context));
-	__cfaabi_dbg_print_safe("Personality function (%d, %x, %llu, %p, %p):", version, actions, exceptionClass, unwind_exception, context);
+	__cfaabi_dbg_print_safe("Personality function (%d, %x, %llu, %p, %p):",
+			version, actions, exceptionClass, unwind_exception, context);
 
 	// If we've reached the end of the stack then there is nothing much we can do...
@@ -291,5 +295,5 @@
 	// Get the instuction pointer and a reading pointer into the exception table
 	lsda_header_info lsd_info;
-	const unsigned char * cur_ptr = parse_lsda_header( context, lsd, &lsd_info);
+	const unsigned char * cur_ptr = parse_lsda_header(context, lsd, &lsd_info);
 	_Unwind_Ptr instruction_ptr = _Unwind_GetIP( context );
 
@@ -302,8 +306,8 @@
 
 		// Decode the common stuff we have in here
-		cur_ptr = read_encoded_value (0, lsd_info.call_site_encoding, cur_ptr, &callsite_start);
-		cur_ptr = read_encoded_value (0, lsd_info.call_site_encoding, cur_ptr, &callsite_len);
-		cur_ptr = read_encoded_value (0, lsd_info.call_site_encoding, cur_ptr, &callsite_landing_pad);
-		cur_ptr = read_uleb128 (cur_ptr, &callsite_action);
+		cur_ptr = read_encoded_value(0, lsd_info.call_site_encoding, cur_ptr, &callsite_start);
+		cur_ptr = read_encoded_value(0, lsd_info.call_site_encoding, cur_ptr, &callsite_len);
+		cur_ptr = read_encoded_value(0, lsd_info.call_site_encoding, cur_ptr, &callsite_landing_pad);
+		cur_ptr = read_uleb128(cur_ptr, &callsite_action);
 
 		// Have we reach the correct frame info yet?
@@ -316,10 +320,11 @@
 			void * ep = (void*)lsd_info.Start + callsite_start + callsite_len;
 			void * ip = (void*)instruction_ptr;
-			__cfaabi_dbg_print_safe("\nfound %p - %p (%p, %p, %p), looking for %p\n", bp, ep, ls, cs, cl, ip);
+			__cfaabi_dbg_print_safe("\nfound %p - %p (%p, %p, %p), looking for %p\n",
+					bp, ep, ls, cs, cl, ip);
 #endif // __CFA_DEBUG_PRINT__
 			continue;
 		}
 
-		// Have we gone too far
+		// Have we gone too far?
 		if( lsd_info.Start + callsite_start > instruction_ptr ) {
 			printf(" gone too far");
@@ -331,8 +336,8 @@
 			// Which phase are we in
 			if (actions & _UA_SEARCH_PHASE) {
-				// Search phase, this means we probably found a potential handler and must check if it is a match
-
-				// If we have arbitrarily decided that 0 means nothing to do and 1 means there is a potential handler
-				// This doesn't seem to conflict the gcc default behavior
+				// In search phase, these means we found a potential handler we must check.
+
+				// We have arbitrarily decided that 0 means nothing to do and 1 means there is
+				// a potential handler. This doesn't seem to conflict the gcc default behavior.
 				if (callsite_action != 0) {
 					// Now we want to run some code to see if the handler matches
@@ -351,9 +356,6 @@
 					// The current apprach uses one exception table entry per try block
 					_uleb128_t imatcher;
-					// Get the relative offset to the
-					cur_ptr = read_uleb128 (cur_ptr, &imatcher);
-
-					// Get a function pointer from the relative offset and call it
-					// _Unwind_Reason_Code (*matcher)() = (_Unwind_Reason_Code (*)())lsd_info.LPStart + imatcher;
+					// Get the relative offset to the {...}?
+					cur_ptr = read_uleb128(cur_ptr, &imatcher);
 
 					_Unwind_Reason_Code (*matcher)(exception_t *) =
@@ -414,6 +416,6 @@
 }
 
-// Try statements are hoisted out see comments for details.  With this could probably be unique and simply linked from
-// libcfa but there is one problem left, see the exception table for details
+// Try statements are hoisted out see comments for details. While this could probably be unique
+// and simply linked from libcfa but there is one problem left, see the exception table for details
 __attribute__((noinline))
 void __cfaabi_ehm__try_terminate(void (*try_block)(),
@@ -428,7 +430,6 @@
 	// assembly works.
 
-	// Setup the personality routine
+	// Setup the personality routine and exception table.
 	asm volatile (".cfi_personality 0x3,__gcfa_personality_v0");
-	// Setup the exception table
 	asm volatile (".cfi_lsda 0x3, .LLSDACFA2");
 
@@ -442,5 +443,5 @@
 	asm volatile goto ("" : : : : CATCH );
 
-	// Normal return
+	// Normal return for when there is no throw.
 	return;
 
@@ -459,26 +460,33 @@
 }
 
-// Exception table data we need to generate.  While this is almost generic, the custom data refers to foo_try_match try
-// match, which is no way generic.  Some more works need to be done if we want to have a single call to the try routine.
+// Exception table data we need to generate. While this is almost generic, the custom data refers
+// to {*}try_terminate, which is no way generic. Some more works need to be done if we want to
+// have a single call to the try routine.
 
 #if defined( __i386 ) || defined( __x86_64 )
 asm (
-	//HEADER
+	// HEADER
 	".LFECFA1:\n"
 	"	.globl	__gcfa_personality_v0\n"
 	"	.section	.gcc_except_table,\"a\",@progbits\n"
-	".LLSDACFA2:\n"							//TABLE header
+	// TABLE HEADER (important field is the BODY length at the end)
+	".LLSDACFA2:\n"
 	"	.byte	0xff\n"
 	"	.byte	0xff\n"
 	"	.byte	0x1\n"
-	"	.uleb128 .LLSDACSECFA2-.LLSDACSBCFA2\n"		// BODY length
-	// Body uses language specific data and therefore could be modified arbitrarily
-	".LLSDACSBCFA2:\n"						// BODY start
-	"	.uleb128 .TRYSTART-__cfaabi_ehm__try_terminate\n"		// Handled area start  (relative to start of function)
-	"	.uleb128 .TRYEND-.TRYSTART\n"				// Handled area length
-	"	.uleb128 .CATCH-__cfaabi_ehm__try_terminate\n"				// Hanlder landing pad adress  (relative to start of function)
-	"	.uleb128 1\n"						// Action code, gcc seems to use always 0
-	".LLSDACSECFA2:\n"						// BODY end
-	"	.text\n"							// TABLE footer
+	"	.uleb128 .LLSDACSECFA2-.LLSDACSBCFA2\n"
+	// BODY (language specific data)
+	".LLSDACSBCFA2:\n"
+	//	Handled area start (relative to start of function)
+	"	.uleb128 .TRYSTART-__cfaabi_ehm__try_terminate\n"
+	//	Handled area length
+	"	.uleb128 .TRYEND-.TRYSTART\n"
+	//	Handler landing pad address (relative to start of function)
+	"	.uleb128 .CATCH-__cfaabi_ehm__try_terminate\n"
+	//	Action code, gcc seems to always use 0.
+	"	.uleb128 1\n"
+	// TABLE FOOTER
+	".LLSDACSECFA2:\n"
+	"	.text\n"
 	"	.size	__cfaabi_ehm__try_terminate, .-__cfaabi_ehm__try_terminate\n"
 	"	.ident	\"GCC: (Ubuntu 6.2.0-3ubuntu11~16.04) 6.2.0 20160901\"\n"
@@ -486,3 +494,3 @@
 );
 #endif // __i386 || __x86_64
-#endif //PIC
+#endif // PIC
Index: libcfa/src/executor.cfa
===================================================================
--- libcfa/src/executor.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/executor.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -8,10 +8,10 @@
 #include <stdio.h>
 
-forall( otype T | is_node(T) | is_monitor(T) ) {
-    monitor Buffer {					// unbounded buffer
-	__queue_t( T ) queue;				// unbounded list of work requests
-	condition delay;
-    }; // Buffer
-
+forall( dtype T )
+monitor Buffer {					// unbounded buffer
+    __queue_t( T ) queue;				// unbounded list of work requests
+    condition delay;
+}; // Buffer
+forall( dtype T | is_node(T) ) {
     void insert( Buffer( T ) & mutex buf, T * elem ) with(buf) {
 	append( queue, elem );				// insert element into buffer
@@ -20,6 +20,6 @@
 
     T * remove( Buffer( T ) & mutex buf ) with(buf) {
-	if ( ! queue ) wait( delay );			// no request to process ? => wait
-	return pop_head( queue );
+	if ( queue.head != 0 ) wait( delay );			// no request to process ? => wait
+//	return pop_head( queue );
     } // remove
 } // distribution
Index: libcfa/src/fstream.cfa
===================================================================
--- libcfa/src/fstream.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/fstream.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Sep 10 22:19:56 2019
-// Update Count     : 354
+// Last Modified On : Fri Feb  7 19:01:01 2020
+// Update Count     : 363
 //
 
@@ -32,75 +32,79 @@
 
 void ?{}( ofstream & os, void * file ) {
-	os.file = file;
-	os.sepDefault = true;
-	os.sepOnOff = false;
-	os.nlOnOff = true;
-	os.prt = false;
-	os.sawNL = false;
+	os.$file = file;
+	os.$sepDefault = true;
+	os.$sepOnOff = false;
+	os.$nlOnOff = true;
+	os.$prt = false;
+	os.$sawNL = false;
+	$sepSetCur( os, sepGet( os ) );
 	sepSet( os, " " );
-	sepSetCur( os, sepGet( os ) );
 	sepSetTuple( os, ", " );
 } // ?{}
 
 // private
-bool sepPrt( ofstream & os ) { setNL( os, false ); return os.sepOnOff; }
-void sepReset( ofstream & os ) { os.sepOnOff = os.sepDefault; }
-void sepReset( ofstream & os, bool reset ) { os.sepDefault = reset; os.sepOnOff = os.sepDefault; }
-const char * sepGetCur( ofstream & os ) { return os.sepCur; }
-void sepSetCur( ofstream & os, const char * sepCur ) { os.sepCur = sepCur; }
-bool getNL( ofstream & os ) { return os.sawNL; }
-void setNL( ofstream & os, bool state ) { os.sawNL = state; }
-bool getANL( ofstream & os ) { return os.nlOnOff; }
-bool getPrt( ofstream & os ) { return os.prt; }
-void setPrt( ofstream & os, bool state ) { os.prt = state; }
+bool $sepPrt( ofstream & os ) { $setNL( os, false ); return os.$sepOnOff; }
+void $sepReset( ofstream & os ) { os.$sepOnOff = os.$sepDefault; }
+void $sepReset( ofstream & os, bool reset ) { os.$sepDefault = reset; os.$sepOnOff = os.$sepDefault; }
+const char * $sepGetCur( ofstream & os ) { return os.$sepCur; }
+void $sepSetCur( ofstream & os, const char sepCur[] ) { os.$sepCur = sepCur; }
+bool $getNL( ofstream & os ) { return os.$sawNL; }
+void $setNL( ofstream & os, bool state ) { os.$sawNL = state; }
+bool $getANL( ofstream & os ) { return os.$nlOnOff; }
+bool $getPrt( ofstream & os ) { return os.$prt; }
+void $setPrt( ofstream & os, bool state ) { os.$prt = state; }
 
 // public
-void ?{}( ofstream & os ) { os.file = 0; }
-
-void ?{}( ofstream & os, const char * name, const char * mode ) {
+void ?{}( ofstream & os ) { os.$file = 0p; }
+
+void ?{}( ofstream & os, const char name[], const char mode[] ) {
 	open( os, name, mode );
 } // ?{}
 
-void ?{}( ofstream & os, const char * name ) {
+void ?{}( ofstream & os, const char name[] ) {
 	open( os, name, "w" );
 } // ?{}
 
-void sepOn( ofstream & os ) { os.sepOnOff = ! getNL( os ); }
-void sepOff( ofstream & os ) { os.sepOnOff = false; }
+void ^?{}( ofstream & os ) {
+	close( os );
+} // ^?{}
+
+void sepOn( ofstream & os ) { os.$sepOnOff = ! $getNL( os ); }
+void sepOff( ofstream & os ) { os.$sepOnOff = false; }
 
 bool sepDisable( ofstream & os ) {
-	bool temp = os.sepDefault;
-	os.sepDefault = false;
-	sepReset( os );
+	bool temp = os.$sepDefault;
+	os.$sepDefault = false;
+	$sepReset( os );
 	return temp;
 } // sepDisable
 
 bool sepEnable( ofstream & os ) {
-	bool temp = os.sepDefault;
-	os.sepDefault = true;
-	if ( os.sepOnOff ) sepReset( os );					// start of line ?
+	bool temp = os.$sepDefault;
+	os.$sepDefault = true;
+	if ( os.$sepOnOff ) $sepReset( os );				// start of line ?
 	return temp;
 } // sepEnable
 
-void nlOn( ofstream & os ) { os.nlOnOff = true; }
-void nlOff( ofstream & os ) { os.nlOnOff = false; }
-
-const char * sepGet( ofstream & os ) { return os.separator; }
-void sepSet( ofstream & os, const char * s ) {
+void nlOn( ofstream & os ) { os.$nlOnOff = true; }
+void nlOff( ofstream & os ) { os.$nlOnOff = false; }
+
+const char * sepGet( ofstream & os ) { return os.$separator; }
+void sepSet( ofstream & os, const char s[] ) {
 	assert( s );
-	strncpy( os.separator, s, sepSize - 1 );
-	os.separator[sepSize - 1] = '\0';
+	strncpy( os.$separator, s, sepSize - 1 );
+	os.$separator[sepSize - 1] = '\0';
 } // sepSet
 
-const char * sepGetTuple( ofstream & os ) { return os.tupleSeparator; }
-void sepSetTuple( ofstream & os, const char * s ) {
+const char * sepGetTuple( ofstream & os ) { return os.$tupleSeparator; }
+void sepSetTuple( ofstream & os, const char s[] ) {
 	assert( s );
-	strncpy( os.tupleSeparator, s, sepSize - 1 );
-	os.tupleSeparator[sepSize - 1] = '\0';
+	strncpy( os.$tupleSeparator, s, sepSize - 1 );
+	os.$tupleSeparator[sepSize - 1] = '\0';
 } // sepSet
 
 void ends( ofstream & os ) {
-	if ( getANL( os ) ) nl( os );
-	else setPrt( os, false );							// turn off
+	if ( $getANL( os ) ) nl( os );
+	else $setPrt( os, false );							// turn off
 	if ( &os == &exit ) exit( EXIT_FAILURE );
 	if ( &os == &abort ) abort();
@@ -108,15 +112,15 @@
 
 int fail( ofstream & os ) {
-	return os.file == 0 || ferror( (FILE *)(os.file) );
+	return os.$file == 0 || ferror( (FILE *)(os.$file) );
 } // fail
 
 int flush( ofstream & os ) {
-	return fflush( (FILE *)(os.file) );
+	return fflush( (FILE *)(os.$file) );
 } // flush
 
-void open( ofstream & os, const char * name, const char * mode ) {
+void open( ofstream & os, const char name[], const char mode[] ) {
 	FILE * file = fopen( name, mode );
 	#ifdef __CFA_DEBUG__
-	if ( file == 0 ) {
+	if ( file == 0p ) {
 		abort | IO_MSG "open output file \"" | name | "\"" | nl | strerror( errno );
 	} // if
@@ -125,22 +129,22 @@
 } // open
 
-void open( ofstream & os, const char * name ) {
+void open( ofstream & os, const char name[] ) {
 	open( os, name, "w" );
 } // open
 
 void close( ofstream & os ) {
-	if ( (FILE *)(os.file) == stdout || (FILE *)(os.file) == stderr ) return;
-
-	if ( fclose( (FILE *)(os.file) ) == EOF ) {
+	if ( (FILE *)(os.$file) == stdout || (FILE *)(os.$file) == stderr ) return;
+
+	if ( fclose( (FILE *)(os.$file) ) == EOF ) {
 		abort | IO_MSG "close output" | nl | strerror( errno );
 	} // if
 } // close
 
-ofstream & write( ofstream & os, const char * data, size_t size ) {
+ofstream & write( ofstream & os, const char data[], size_t size ) {
 	if ( fail( os ) ) {
 		abort | IO_MSG "attempt write I/O on failed stream";
 	} // if
 
-	if ( fwrite( data, 1, size, (FILE *)(os.file) ) != size ) {
+	if ( fwrite( data, 1, size, (FILE *)(os.$file) ) != size ) {
 		abort | IO_MSG "write" | nl | strerror( errno );
 	} // if
@@ -151,7 +155,7 @@
 	va_list args;
 	va_start( args, format );
-	int len = vfprintf( (FILE *)(os.file), format, args );
+	int len = vfprintf( (FILE *)(os.$file), format, args );
 	if ( len == EOF ) {
-		if ( ferror( (FILE *)(os.file) ) ) {
+		if ( ferror( (FILE *)(os.$file) ) ) {
 			abort | IO_MSG "invalid write";
 		} // if
@@ -159,6 +163,6 @@
 	va_end( args );
 
-	setPrt( os, true );									// called in output cascade
-	sepReset( os );										// reset separator
+	$setPrt( os, true );								// called in output cascade
+	$sepReset( os );									// reset separator
 	return len;
 } // fmt
@@ -180,49 +184,53 @@
 // private
 void ?{}( ifstream & is, void * file ) {
-	is.file = file;
-	is.nlOnOff = false;
+	is.$file = file;
+	is.$nlOnOff = false;
 } // ?{}
 
 // public
-void ?{}( ifstream & is ) {	is.file = 0; }
-
-void ?{}( ifstream & is, const char * name, const char * mode ) {
+void ?{}( ifstream & is ) { is.$file = 0p; }
+
+void ?{}( ifstream & is, const char name[], const char mode[] ) {
 	open( is, name, mode );
 } // ?{}
 
-void ?{}( ifstream & is, const char * name ) {
+void ?{}( ifstream & is, const char name[] ) {
 	open( is, name, "r" );
 } // ?{}
 
-void nlOn( ifstream & os ) { os.nlOnOff = true; }
-void nlOff( ifstream & os ) { os.nlOnOff = false; }
-bool getANL( ifstream & os ) { return os.nlOnOff; }
+void ^?{}( ifstream & is ) {
+	close( is );
+} // ^?{}
+
+void nlOn( ifstream & os ) { os.$nlOnOff = true; }
+void nlOff( ifstream & os ) { os.$nlOnOff = false; }
+bool getANL( ifstream & os ) { return os.$nlOnOff; }
 
 int fail( ifstream & is ) {
-	return is.file == 0 || ferror( (FILE *)(is.file) );
+	return is.$file == 0p || ferror( (FILE *)(is.$file) );
 } // fail
 
 int eof( ifstream & is ) {
-	return feof( (FILE *)(is.file) );
+	return feof( (FILE *)(is.$file) );
 } // eof
 
-void open( ifstream & is, const char * name, const char * mode ) {
+void open( ifstream & is, const char name[], const char mode[] ) {
 	FILE * file = fopen( name, mode );
 	#ifdef __CFA_DEBUG__
-	if ( file == 0 ) {
+	if ( file == 0p ) {
 		abort | IO_MSG "open input file \"" | name | "\"" | nl | strerror( errno );
 	} // if
 	#endif // __CFA_DEBUG__
-	is.file = file;
-} // open
-
-void open( ifstream & is, const char * name ) {
+	is.$file = file;
+} // open
+
+void open( ifstream & is, const char name[] ) {
 	open( is, name, "r" );
 } // open
 
 void close( ifstream & is ) {
-	if ( (FILE *)(is.file) == stdin ) return;
-
-	if ( fclose( (FILE *)(is.file) ) == EOF ) {
+	if ( (FILE *)(is.$file) == stdin ) return;
+
+	if ( fclose( (FILE *)(is.$file) ) == EOF ) {
 		abort | IO_MSG "close input" | nl | strerror( errno );
 	} // if
@@ -234,5 +242,5 @@
 	} // if
 
-	if ( fread( data, size, 1, (FILE *)(is.file) ) == 0 ) {
+	if ( fread( data, size, 1, (FILE *)(is.$file) ) == 0 ) {
 		abort | IO_MSG "read" | nl | strerror( errno );
 	} // if
@@ -245,5 +253,5 @@
 	} // if
 
-	if ( ungetc( c, (FILE *)(is.file) ) == EOF ) {
+	if ( ungetc( c, (FILE *)(is.$file) ) == EOF ) {
 		abort | IO_MSG "ungetc" | nl | strerror( errno );
 	} // if
@@ -255,7 +263,7 @@
 
 	va_start( args, format );
-	int len = vfscanf( (FILE *)(is.file), format, args );
+	int len = vfscanf( (FILE *)(is.$file), format, args );
 	if ( len == EOF ) {
-		if ( ferror( (FILE *)(is.file) ) ) {
+		if ( ferror( (FILE *)(is.$file) ) ) {
 			abort | IO_MSG "invalid read";
 		} // if
Index: libcfa/src/fstream.hfa
===================================================================
--- libcfa/src/fstream.hfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/fstream.hfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jul 15 18:10:23 2019
-// Update Count     : 167
+// Last Modified On : Fri Feb  7 19:00:51 2020
+// Update Count     : 174
 //
 
@@ -24,26 +24,26 @@
 enum { sepSize = 16 };
 struct ofstream {
-	void * file;
-	bool sepDefault;
-	bool sepOnOff;
-	bool nlOnOff;
-	bool prt;											// print text
-	bool sawNL;
-	const char * sepCur;
-	char separator[sepSize];
-	char tupleSeparator[sepSize];
+	void * $file;
+	bool $sepDefault;
+	bool $sepOnOff;
+	bool $nlOnOff;
+	bool $prt;											// print text
+	bool $sawNL;
+	const char * $sepCur;
+	char $separator[sepSize];
+	char $tupleSeparator[sepSize];
 }; // ofstream
 
 // private
-bool sepPrt( ofstream & );
-void sepReset( ofstream & );
-void sepReset( ofstream &, bool );
-const char * sepGetCur( ofstream & );
-void sepSetCur( ofstream &, const char * );
-bool getNL( ofstream & );
-void setNL( ofstream &, bool );
-bool getANL( ofstream & );
-bool getPrt( ofstream & );
-void setPrt( ofstream &, bool );
+bool $sepPrt( ofstream & );
+void $sepReset( ofstream & );
+void $sepReset( ofstream &, bool );
+const char * $sepGetCur( ofstream & );
+void $sepSetCur( ofstream &, const char [] );
+bool $getNL( ofstream & );
+void $setNL( ofstream &, bool );
+bool $getANL( ofstream & );
+bool $getPrt( ofstream & );
+void $setPrt( ofstream &, bool );
 
 // public
@@ -56,20 +56,21 @@
 
 const char * sepGet( ofstream & );
-void sepSet( ofstream &, const char * );
+void sepSet( ofstream &, const char [] );
 const char * sepGetTuple( ofstream & );
-void sepSetTuple( ofstream &, const char * );
+void sepSetTuple( ofstream &, const char [] );
 
 void ends( ofstream & os );
 int fail( ofstream & );
 int flush( ofstream & );
-void open( ofstream &, const char * name, const char * mode );
-void open( ofstream &, const char * name );
+void open( ofstream &, const char name[], const char mode[] );
+void open( ofstream &, const char name[] );
 void close( ofstream & );
-ofstream & write( ofstream &, const char * data, size_t size );
+ofstream & write( ofstream &, const char data[], size_t size );
 int fmt( ofstream &, const char format[], ... );
 
 void ?{}( ofstream & os );
-void ?{}( ofstream & os, const char * name, const char * mode );
-void ?{}( ofstream & os, const char * name );
+void ?{}( ofstream & os, const char name[], const char mode[] );
+void ?{}( ofstream & os, const char name[] );
+void ^?{}( ofstream & os );
 
 extern ofstream & sout, & stdout, & serr, & stderr;		// aliases
@@ -81,6 +82,6 @@
 
 struct ifstream {
-	void * file;
-	bool nlOnOff;
+	void * $file;
+	bool $nlOnOff;
 }; // ifstream
 
@@ -91,6 +92,6 @@
 int fail( ifstream & is );
 int eof( ifstream & is );
-void open( ifstream & is, const char * name, const char * mode );
-void open( ifstream & is, const char * name );
+void open( ifstream & is, const char name[], const char mode[] );
+void open( ifstream & is, const char name[] );
 void close( ifstream & is );
 ifstream & read( ifstream & is, char * data, size_t size );
@@ -99,6 +100,7 @@
 
 void ?{}( ifstream & is );
-void ?{}( ifstream & is, const char * name, const char * mode );
-void ?{}( ifstream & is, const char * name );
+void ?{}( ifstream & is, const char name[], const char mode[] );
+void ?{}( ifstream & is, const char name[] );
+void ^?{}( ifstream & is );
 
 extern ifstream & sin, & stdin;							// aliases
Index: libcfa/src/gmp.hfa
===================================================================
--- libcfa/src/gmp.hfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/gmp.hfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Tue Apr 19 08:43:43 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 13 15:25:05 2019
-// Update Count     : 27
+// Last Modified On : Sun Feb  9 09:56:54 2020
+// Update Count     : 31
 //
 
@@ -24,12 +24,10 @@
 
 static inline {
-	// constructor
+	// constructor, zero_t/one_t are unnecessary because of relationship with signed/unsigned int
 	void ?{}( Int & this ) { mpz_init( this.mpz ); }
 	void ?{}( Int & this, Int init ) { mpz_init_set( this.mpz, init.mpz ); }
-	void ?{}( Int & this, zero_t ) { mpz_init_set_si( this.mpz, 0 ); }
-	void ?{}( Int & this, one_t ) { mpz_init_set_si( this.mpz, 1 ); }
 	void ?{}( Int & this, signed long int init ) { mpz_init_set_si( this.mpz, init ); }
 	void ?{}( Int & this, unsigned long int init ) { mpz_init_set_ui( this.mpz, init ); }
-	void ?{}( Int & this, const char * val ) { if ( mpz_init_set_str( this.mpz, val, 0 ) ) abort(); }
+	void ?{}( Int & this, const char val[] ) { if ( mpz_init_set_str( this.mpz, val, 0 ) ) abort(); }
 	void ^?{}( Int & this ) { mpz_clear( this.mpz ); }
 
@@ -37,5 +35,5 @@
 	Int ?`mp( signed long int init ) { return (Int){ init }; }
 	Int ?`mp( unsigned long int init ) { return (Int){ init }; }
-	Int ?`mp( const char * init ) { return (Int){ init }; }
+	Int ?`mp( const char init[] ) { return (Int){ init }; }
 
 	// assignment
@@ -43,5 +41,5 @@
 	Int ?=?( Int & lhs, long int rhs ) { mpz_set_si( lhs.mpz, rhs ); return lhs; }
 	Int ?=?( Int & lhs, unsigned long int rhs ) { mpz_set_ui( lhs.mpz, rhs ); return lhs; }
-	Int ?=?( Int & lhs, const char * rhs ) { if ( mpz_set_str( lhs.mpz, rhs, 0 ) ) { abort | "invalid string conversion"; } return lhs; }
+	Int ?=?( Int & lhs, const char rhs[] ) { if ( mpz_set_str( lhs.mpz, rhs, 0 ) ) { abort | "invalid string conversion"; } return lhs; }
 
 	char ?=?( char & lhs, Int rhs ) { char val = mpz_get_si( rhs.mpz ); lhs = val; return lhs; }
@@ -265,5 +263,5 @@
 	forall( dtype ostype | ostream( ostype ) ) {
 		ostype & ?|?( ostype & os, Int mp ) {
-			if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+			if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 			gmp_printf( "%Zd", mp.mpz );
 			sepOn( os );
Index: libcfa/src/heap.cfa
===================================================================
--- libcfa/src/heap.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/heap.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Tue Dec 19 21:58:35 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Oct 18 07:42:09 2019
-// Update Count     : 556
+// Last Modified On : Tue Feb  4 10:04:51 2020
+// Update Count     : 648
 //
 
@@ -18,4 +18,5 @@
 #include <stdio.h>										// snprintf, fileno
 #include <errno.h>										// errno
+#include <string.h>										// memset, memcpy
 extern "C" {
 #include <sys/mman.h>									// mmap, munmap
@@ -27,13 +28,12 @@
 #include "bits/locks.hfa"								// __spinlock_t
 #include "startup.hfa"									// STARTUP_PRIORITY_MEMORY
-#include "stdlib.hfa"									// bsearchl
+//#include "stdlib.hfa"									// bsearchl
 #include "malloc.h"
 
+#define MIN(x, y) (y > x ? x : y)
 
 static bool traceHeap = false;
 
-inline bool traceHeap() {
-	return traceHeap;
-} // traceHeap
+inline bool traceHeap() { return traceHeap; }
 
 bool traceHeapOn() {
@@ -49,46 +49,34 @@
 } // traceHeapOff
 
-
-static bool checkFree = false;
-
-inline bool checkFree() {
-	return checkFree;
-} // checkFree
-
-bool checkFreeOn() {
-	bool temp = checkFree;
-	checkFree = true;
+bool traceHeapTerm() { return false; }
+
+
+static bool prtFree = false;
+
+inline bool prtFree() {
+	return prtFree;
+} // prtFree
+
+bool prtFreeOn() {
+	bool temp = prtFree;
+	prtFree = true;
 	return temp;
-} // checkFreeOn
-
-bool checkFreeOff() {
-	bool temp = checkFree;
-	checkFree = false;
+} // prtFreeOn
+
+bool prtFreeOff() {
+	bool temp = prtFree;
+	prtFree = false;
 	return temp;
-} // checkFreeOff
-
-
-// static bool traceHeapTerm = false;
-
-// inline bool traceHeapTerm() {
-// 	return traceHeapTerm;
-// } // traceHeapTerm
-
-// bool traceHeapTermOn() {
-// 	bool temp = traceHeapTerm;
-// 	traceHeapTerm = true;
-// 	return temp;
-// } // traceHeapTermOn
-
-// bool traceHeapTermOff() {
-// 	bool temp = traceHeapTerm;
-// 	traceHeapTerm = false;
-// 	return temp;
-// } // traceHeapTermOff
+} // prtFreeOff
 
 
 enum {
+	// Define the default extension heap amount in units of bytes. When the uC++ supplied heap reaches the brk address,
+	// the brk address is extended by the extension amount.
+	__CFA_DEFAULT_HEAP_EXPANSION__ = (1 * 1024 * 1024),
+
+	// Define the mmap crossover point during allocation. Allocations less than this amount are allocated from buckets;
+	// values greater than or equal to this value are mmap from the operating system.
 	__CFA_DEFAULT_MMAP_START__ = (512 * 1024 + 1),
-	__CFA_DEFAULT_HEAP_EXPANSION__ = (1 * 1024 * 1024),
 };
 
@@ -105,14 +93,14 @@
 static unsigned int allocFree;							// running total of allocations minus frees
 
-static void checkUnfreed() {
+static void prtUnfreed() {
 	if ( allocFree != 0 ) {
 		// DO NOT USE STREAMS AS THEY MAY BE UNAVAILABLE AT THIS POINT.
-		// char helpText[512];
-		// int len = snprintf( helpText, sizeof(helpText), "CFA warning (UNIX pid:%ld) : program terminating with %u(0x%x) 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(), allocFree, allocFree ); // always print the UNIX pid
-		// __cfaabi_dbg_bits_write( helpText, len );
-	} // if
-} // checkUnfreed
+		char helpText[512];
+		int len = snprintf( helpText, sizeof(helpText), "CFA warning (UNIX pid:%ld) : program terminating with %u(0x%x) 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(), allocFree, allocFree ); // always print the UNIX pid
+		__cfaabi_bits_write( STDERR_FILENO, helpText, len ); // print debug/nodebug
+	} // if
+} // prtUnfreed
 
 extern "C" {
@@ -123,8 +111,9 @@
 	void heapAppStop() {								// called by __cfaabi_appready_startdown
 		fclose( stdin ); fclose( stdout );
-		checkUnfreed();
+		prtUnfreed();
 	} // heapAppStop
 } // extern "C"
 #endif // __CFA_DEBUG__
+
 
 // statically allocated variables => zero filled.
@@ -134,7 +123,4 @@
 static unsigned int maxBucketsUsed;						// maximum number of buckets in use
 
-
-// #comment TD : This defined is significantly different from the __ALIGN__ define from locks.hfa
-#define ALIGN 16
 
 #define SPINLOCK 0
@@ -147,5 +133,5 @@
 // Recursive definitions: HeapManager needs size of bucket array and bucket area needs sizeof HeapManager storage.
 // Break recusion by hardcoding number of buckets and statically checking number is correct after bucket array defined.
-enum { NoBucketSizes = 93 };							// number of buckets sizes
+enum { NoBucketSizes = 91 };							// number of buckets sizes
 
 struct HeapManager {
@@ -194,9 +180,9 @@
 			} kind; // Kind
 		} header; // Header
-		char pad[ALIGN - sizeof( Header )];
+		char pad[libAlign() - sizeof( Header )];
 		char data[0];									// storage
 	}; // Storage
 
-	static_assert( ALIGN >= sizeof( Storage ), "ALIGN < sizeof( Storage )" );
+	static_assert( libAlign() >= sizeof( Storage ), "libAlign() < sizeof( Storage )" );
 
 	struct FreeHeader {
@@ -228,19 +214,24 @@
 #define __STATISTICS__
 
+// Bucket size must be multiple of 16.
 // Powers of 2 are common allocation sizes, so make powers of 2 generate the minimum required size.
 static const unsigned int bucketSizes[] @= {			// different bucket sizes
-	16, 32, 48, 64,
-	64 + sizeof(HeapManager.Storage), 96, 112, 128, 128 + sizeof(HeapManager.Storage), 160, 192, 224,
-	256 + sizeof(HeapManager.Storage), 320, 384, 448, 512 + sizeof(HeapManager.Storage), 640, 768, 896,
-	1_024 + sizeof(HeapManager.Storage), 1_536, 2_048 + sizeof(HeapManager.Storage), 2_560, 3_072, 3_584, 4_096 + sizeof(HeapManager.Storage), 6_144,
-	8_192 + sizeof(HeapManager.Storage), 9_216, 10_240, 11_264, 12_288, 13_312, 14_336, 15_360,
-	16_384 + sizeof(HeapManager.Storage), 18_432, 20_480, 22_528, 24_576, 26_624, 28_672, 30_720,
-	32_768 + sizeof(HeapManager.Storage), 36_864, 40_960, 45_056, 49_152, 53_248, 57_344, 61_440,
-	65_536 + sizeof(HeapManager.Storage), 73_728, 81_920, 90_112, 98_304, 106_496, 114_688, 122_880,
-	131_072 + sizeof(HeapManager.Storage), 147_456, 163_840, 180_224, 196_608, 212_992, 229_376, 245_760,
-	262_144 + sizeof(HeapManager.Storage), 294_912, 327_680, 360_448, 393_216, 425_984, 458_752, 491_520,
-	524_288 + sizeof(HeapManager.Storage), 655_360, 786_432, 917_504, 1_048_576 + sizeof(HeapManager.Storage), 1_179_648, 1_310_720, 1_441_792,
-	1_572_864, 1_703_936, 1_835_008, 1_966_080, 2_097_152 + sizeof(HeapManager.Storage), 2_621_440, 3_145_728, 3_670_016,
-	4_194_304 + sizeof(HeapManager.Storage)
+	16, 32, 48, 64 + sizeof(HeapManager.Storage), // 4
+	96, 112, 128 + sizeof(HeapManager.Storage), // 3
+	160, 192, 224, 256 + sizeof(HeapManager.Storage), // 4
+	320, 384, 448, 512 + sizeof(HeapManager.Storage), // 4
+	640, 768, 896, 1_024 + sizeof(HeapManager.Storage), // 4
+	1_536, 2_048 + sizeof(HeapManager.Storage), // 2
+	2_560, 3_072, 3_584, 4_096 + sizeof(HeapManager.Storage), // 4
+	6_144, 8_192 + sizeof(HeapManager.Storage), // 2
+	9_216, 10_240, 11_264, 12_288, 13_312, 14_336, 15_360, 16_384 + sizeof(HeapManager.Storage), // 8
+	18_432, 20_480, 22_528, 24_576, 26_624, 28_672, 30_720, 32_768 + sizeof(HeapManager.Storage), // 8
+	36_864, 40_960, 45_056, 49_152, 53_248, 57_344, 61_440, 65_536 + sizeof(HeapManager.Storage), // 8
+	73_728, 81_920, 90_112, 98_304, 106_496, 114_688, 122_880, 131_072 + sizeof(HeapManager.Storage), // 8
+	147_456, 163_840, 180_224, 196_608, 212_992, 229_376, 245_760, 262_144 + sizeof(HeapManager.Storage), // 8
+	294_912, 327_680, 360_448, 393_216, 425_984, 458_752, 491_520, 524_288 + sizeof(HeapManager.Storage), // 8
+	655_360, 786_432, 917_504, 1_048_576 + sizeof(HeapManager.Storage), // 4
+	1_179_648, 1_310_720, 1_441_792, 1_572_864, 1_703_936, 1_835_008, 1_966_080, 2_097_152 + sizeof(HeapManager.Storage), // 8
+	2_621_440, 3_145_728, 3_670_016, 4_194_304 + sizeof(HeapManager.Storage), // 4
 };
 
@@ -251,7 +242,6 @@
 static unsigned char lookup[LookupSizes];				// O(1) lookup for small sizes
 #endif // FASTLOOKUP
+
 static int mmapFd = -1;									// fake or actual fd for anonymous file
-
-
 #ifdef __CFA_DEBUG__
 static bool heapBoot = 0;								// detect recursion during boot
@@ -259,76 +249,8 @@
 static HeapManager heapManager __attribute__(( aligned (128) )) @= {}; // size of cache line to prevent false sharing
 
-// #comment TD : The return type of this function should be commented
-static inline bool setMmapStart( size_t value ) {
-  if ( value < pageSize || bucketSizes[NoBucketSizes - 1] < value ) return true;
-	mmapStart = value;									// set global
-
-	// find the closest bucket size less than or equal to the mmapStart size
-	maxBucketsUsed = bsearchl( (unsigned int)mmapStart, bucketSizes, NoBucketSizes ); // binary search
-	assert( maxBucketsUsed < NoBucketSizes );			// subscript failure ?
-	assert( mmapStart <= bucketSizes[maxBucketsUsed] ); // search failure ?
-	return false;
-} // setMmapStart
-
-
-static void ?{}( HeapManager & manager ) with ( manager ) {
-	pageSize = sysconf( _SC_PAGESIZE );
-
-	for ( unsigned int i = 0; i < NoBucketSizes; i += 1 ) { // initialize the free lists
-		freeLists[i].blockSize = bucketSizes[i];
-	} // for
-
-	#ifdef FASTLOOKUP
-	unsigned int idx = 0;
-	for ( unsigned int i = 0; i < LookupSizes; i += 1 ) {
-		if ( i > bucketSizes[idx] ) idx += 1;
-		lookup[i] = idx;
-	} // for
-	#endif // FASTLOOKUP
-
-	if ( setMmapStart( default_mmap_start() ) ) {
-		abort( "HeapManager : internal error, mmap start initialization failure." );
-	} // if
-	heapExpand = default_heap_expansion();
-
-	char * End = (char *)sbrk( 0 );
-	sbrk( (char *)libCeiling( (long unsigned int)End, libAlign() ) - End ); // move start of heap to multiple of alignment
-	heapBegin = heapEnd = sbrk( 0 );					// get new start point
-} // HeapManager
-
-
-static void ^?{}( HeapManager & ) {
-	#ifdef __STATISTICS__
-	// if ( traceHeapTerm() ) {
-	// 	printStats();
-	// 	if ( checkfree() ) checkFree( heapManager, true );
-	// } // if
-	#endif // __STATISTICS__
-} // ~HeapManager
-
-
-static void memory_startup( void ) __attribute__(( constructor( STARTUP_PRIORITY_MEMORY ) ));
-void memory_startup( void ) {
-	#ifdef __CFA_DEBUG__
-	if ( unlikely( heapBoot ) ) {						// check for recursion during system boot
-		// DO NOT USE STREAMS AS THEY MAY BE UNAVAILABLE AT THIS POINT.
-		abort( "boot() : internal error, recursively invoked during system boot." );
-	} // if
-	heapBoot = true;
-	#endif // __CFA_DEBUG__
-
-	//assert( heapManager.heapBegin != 0 );
-	//heapManager{};
-	if ( heapManager.heapBegin == 0 ) heapManager{};
-} // memory_startup
-
-static void memory_shutdown( void ) __attribute__(( destructor( STARTUP_PRIORITY_MEMORY ) ));
-void memory_shutdown( void ) {
-	^heapManager{};
-} // memory_shutdown
-
 
 #ifdef __STATISTICS__
-static unsigned long long int mmap_storage;				// heap statistics counters
+// Heap statistics counters.
+static unsigned long long int mmap_storage;
 static unsigned int mmap_calls;
 static unsigned long long int munmap_storage;
@@ -348,12 +270,11 @@
 static unsigned long long int realloc_storage;
 static unsigned int realloc_calls;
-
-static int statfd;										// statistics file descriptor (changed by malloc_stats_fd)
-
+// Statistics file descriptor (changed by malloc_stats_fd).
+static int statfd = STDERR_FILENO;						// default stderr
 
 // Use "write" because streams may be shutdown when calls are made.
 static void printStats() {
 	char helpText[512];
-	__cfaabi_dbg_bits_print_buffer( helpText, sizeof(helpText),
+	__cfaabi_bits_print_buffer( STDERR_FILENO, helpText, sizeof(helpText),
 									"\nHeap statistics:\n"
 									"  malloc: calls %u / storage %llu\n"
@@ -405,19 +326,20 @@
 						sbrk_calls, sbrk_storage
 		);
-	return write( fileno( stream ), helpText, len );	// -1 => error
+	__cfaabi_bits_write( fileno( stream ), helpText, len );	// ensures all bytes written or exit
+	return len;
 } // printStatsXML
 #endif // __STATISTICS__
 
-// #comment TD : Is this the samething as Out-of-Memory?
-static inline void noMemory() {
-	abort( "Heap memory exhausted at %zu bytes.\n"
-		   "Possible cause is very large memory allocation and/or large amount of unfreed storage allocated by the program or system/library routines.",
-		   ((char *)(sbrk( 0 )) - (char *)(heapManager.heapBegin)) );
-} // noMemory
+
+// static inline void noMemory() {
+// 	abort( "Heap memory exhausted at %zu bytes.\n"
+// 		   "Possible cause is very large memory allocation and/or large amount of unfreed storage allocated by the program or system/library routines.",
+// 		   ((char *)(sbrk( 0 )) - (char *)(heapManager.heapBegin)) );
+// } // noMemory
 
 
 static inline void checkAlign( size_t alignment ) {
-	if ( alignment < sizeof(void *) || ! libPow2( alignment ) ) {
-		abort( "Alignment %zu for memory allocation is less than sizeof(void *) and/or not a power of 2.", alignment );
+	if ( alignment < libAlign() || ! libPow2( alignment ) ) {
+		abort( "Alignment %zu for memory allocation is less than %d and/or not a power of 2.", alignment, libAlign() );
 	} // if
 } // checkAlign
@@ -431,94 +353,5 @@
 
 
-static inline void checkHeader( bool check, const char * name, void * addr ) {
-	if ( unlikely( check ) ) {							// bad address ?
-		abort( "Attempt to %s storage %p with address outside the heap.\n"
-			   "Possible cause is duplicate free on same block or overwriting of memory.",
-			   name, addr );
-	} // if
-} // checkHeader
-
-// #comment TD : function should be commented and/or have a more evocative name
-//               this isn't either a check or a constructor which is what I would expect this function to be
-static inline void fakeHeader( HeapManager.Storage.Header *& header, size_t & size, size_t & alignment ) {
-	if ( unlikely( (header->kind.fake.alignment & 1) == 1 ) ) { // fake header ?
-		size_t offset = header->kind.fake.offset;
-		alignment = header->kind.fake.alignment & -2;	// remove flag from value
-		#ifdef __CFA_DEBUG__
-		checkAlign( alignment );						// check alignment
-		#endif // __CFA_DEBUG__
-		header = (HeapManager.Storage.Header *)((char *)header - offset);
-	} // if
-} // fakeHeader
-
-// #comment TD : Why is this a define
-#define headerAddr( addr ) ((HeapManager.Storage.Header *)( (char *)addr - sizeof(HeapManager.Storage) ))
-
-static inline bool headers( const char * name, void * addr, HeapManager.Storage.Header *& header, HeapManager.FreeHeader *& freeElem, size_t & size, size_t & alignment ) with ( heapManager ) {
-	header = headerAddr( addr );
-
-	if ( unlikely( heapEnd < addr ) ) {					// mmapped ?
-		fakeHeader( header, size, alignment );
-		size = header->kind.real.blockSize & -3;		// mmap size
-		return true;
-	} // if
-
-	#ifdef __CFA_DEBUG__
-	checkHeader( addr < heapBegin || header < (HeapManager.Storage.Header *)heapBegin, name, addr ); // bad low address ?
-	#endif // __CFA_DEBUG__
-
-	// #comment TD : This code looks weird...
-	//               It's called as the first statement of both branches of the last if, with the same parameters in all cases
-
-	// header may be safe to dereference
-	fakeHeader( header, size, alignment );
-	#ifdef __CFA_DEBUG__
-	checkHeader( header < (HeapManager.Storage.Header *)heapBegin || (HeapManager.Storage.Header *)heapEnd < header, name, addr ); // bad address ? (offset could be + or -)
-	#endif // __CFA_DEBUG__
-
-	freeElem = (HeapManager.FreeHeader *)((size_t)header->kind.real.home & -3);
-	#ifdef __CFA_DEBUG__
-	if ( freeElem < &freeLists[0] || &freeLists[NoBucketSizes] <= freeElem ) {
-		abort( "Attempt to %s storage %p with corrupted header.\n"
-			   "Possible cause is duplicate free on same block or overwriting of header information.",
-			   name, addr );
-	} // if
-	#endif // __CFA_DEBUG__
-	size = freeElem->blockSize;
-	return false;
-} // headers
-
-
-static inline void * extend( size_t size ) with ( heapManager ) {
-	lock( extlock __cfaabi_dbg_ctx2 );
-	ptrdiff_t rem = heapRemaining - size;
-	if ( rem < 0 ) {
-		// If the size requested is bigger than the current remaining storage, increase the size of the heap.
-
-		size_t increase = libCeiling( size > heapExpand ? size : heapExpand, libAlign() );
-		if ( sbrk( increase ) == (void *)-1 ) {
-			unlock( extlock );
-			errno = ENOMEM;
-			return 0;
-		} // if
-		#ifdef __STATISTICS__
-		sbrk_calls += 1;
-		sbrk_storage += increase;
-		#endif // __STATISTICS__
-		#ifdef __CFA_DEBUG__
-		// Set new memory to garbage so subsequent uninitialized usages might fail.
-		memset( (char *)heapEnd + heapRemaining, '\377', increase );
-		#endif // __CFA_DEBUG__
-		rem = heapRemaining + increase - size;
-	} // if
-
-	HeapManager.Storage * block = (HeapManager.Storage *)heapEnd;
-	heapRemaining = rem;
-	heapEnd = (char *)heapEnd + size;
-	unlock( extlock );
-	return block;
-} // extend
-
-
+// thunk problem
 size_t Bsearchl( unsigned int key, const unsigned int * vals, size_t dim ) {
 	size_t l = 0, m, h = dim;
@@ -535,4 +368,117 @@
 
 
+static inline bool setMmapStart( size_t value ) {		// true => mmapped, false => sbrk
+  if ( value < pageSize || bucketSizes[NoBucketSizes - 1] < value ) return true;
+	mmapStart = value;									// set global
+
+	// find the closest bucket size less than or equal to the mmapStart size
+	maxBucketsUsed = Bsearchl( (unsigned int)mmapStart, bucketSizes, NoBucketSizes ); // binary search
+	assert( maxBucketsUsed < NoBucketSizes );			// subscript failure ?
+	assert( mmapStart <= bucketSizes[maxBucketsUsed] ); // search failure ?
+	return false;
+} // setMmapStart
+
+
+static inline void checkHeader( bool check, const char name[], void * addr ) {
+	if ( unlikely( check ) ) {							// bad address ?
+		abort( "Attempt to %s storage %p with address outside the heap.\n"
+			   "Possible cause is duplicate free on same block or overwriting of memory.",
+			   name, addr );
+	} // if
+} // checkHeader
+
+
+static inline void fakeHeader( HeapManager.Storage.Header *& header, size_t & alignment ) {
+	if ( unlikely( (header->kind.fake.alignment & 1) == 1 ) ) { // fake header ?
+		size_t offset = header->kind.fake.offset;
+		alignment = header->kind.fake.alignment & -2;	// remove flag from value
+		#ifdef __CFA_DEBUG__
+		checkAlign( alignment );						// check alignment
+		#endif // __CFA_DEBUG__
+		header = (HeapManager.Storage.Header *)((char *)header - offset);
+	} // if
+} // fakeHeader
+
+
+// <-------+----------------------------------------------------> bsize (bucket size)
+// |header |addr
+//==================================================================================
+//                                | alignment
+// <-----------------<------------+-----------------------------> bsize (bucket size)
+//                   |fake-header | addr
+#define headerAddr( addr ) ((HeapManager.Storage.Header *)( (char *)addr - sizeof(HeapManager.Storage) ))
+
+// <-------<<--------------------- dsize ---------------------->> bsize (bucket size)
+// |header |addr
+//==================================================================================
+//                                | alignment
+// <------------------------------<<---------- dsize --------->>> bsize (bucket size)
+//                   |fake-header |addr
+#define dataStorage( bsize, addr, header ) (bsize - ( (char *)addr - (char *)header ))
+
+
+static inline bool headers( const char name[] __attribute__(( unused )), void * addr, HeapManager.Storage.Header *& header, HeapManager.FreeHeader *& freeElem, size_t & size, size_t & alignment ) with ( heapManager ) {
+	header = headerAddr( addr );
+
+	if ( unlikely( heapEnd < addr ) ) {					// mmapped ?
+		fakeHeader( header, alignment );
+		size = header->kind.real.blockSize & -3;		// mmap size
+		return true;
+	} // if
+
+	#ifdef __CFA_DEBUG__
+	checkHeader( addr < heapBegin || header < (HeapManager.Storage.Header *)heapBegin, name, addr ); // bad low address ?
+	#endif // __CFA_DEBUG__
+
+	// header may be safe to dereference
+	fakeHeader( header, alignment );
+	#ifdef __CFA_DEBUG__
+	checkHeader( header < (HeapManager.Storage.Header *)heapBegin || (HeapManager.Storage.Header *)heapEnd < header, name, addr ); // bad address ? (offset could be + or -)
+	#endif // __CFA_DEBUG__
+
+	freeElem = (HeapManager.FreeHeader *)((size_t)header->kind.real.home & -3);
+	#ifdef __CFA_DEBUG__
+	if ( freeElem < &freeLists[0] || &freeLists[NoBucketSizes] <= freeElem ) {
+		abort( "Attempt to %s storage %p with corrupted header.\n"
+			   "Possible cause is duplicate free on same block or overwriting of header information.",
+			   name, addr );
+	} // if
+	#endif // __CFA_DEBUG__
+	size = freeElem->blockSize;
+	return false;
+} // headers
+
+
+static inline void * extend( size_t size ) with ( heapManager ) {
+	lock( extlock __cfaabi_dbg_ctx2 );
+	ptrdiff_t rem = heapRemaining - size;
+	if ( rem < 0 ) {
+		// If the size requested is bigger than the current remaining storage, increase the size of the heap.
+
+		size_t increase = libCeiling( size > heapExpand ? size : heapExpand, libAlign() );
+		if ( sbrk( increase ) == (void *)-1 ) {
+			unlock( extlock );
+			errno = ENOMEM;
+			return 0p;
+		} // if
+		#ifdef __STATISTICS__
+		sbrk_calls += 1;
+		sbrk_storage += increase;
+		#endif // __STATISTICS__
+		#ifdef __CFA_DEBUG__
+		// Set new memory to garbage so subsequent uninitialized usages might fail.
+		memset( (char *)heapEnd + heapRemaining, '\377', increase );
+		#endif // __CFA_DEBUG__
+		rem = heapRemaining + increase - size;
+	} // if
+
+	HeapManager.Storage * block = (HeapManager.Storage *)heapEnd;
+	heapRemaining = rem;
+	heapEnd = (char *)heapEnd + size;
+	unlock( extlock );
+	return block;
+} // extend
+
+
 static inline void * doMalloc( size_t size ) with ( heapManager ) {
 	HeapManager.Storage * block;						// pointer to new block of storage
@@ -541,5 +487,5 @@
 	// along with the block and is a multiple of the alignment size.
 
-  if ( unlikely( size > ~0ul - sizeof(HeapManager.Storage) ) ) return 0;
+  if ( unlikely( size > ~0ul - sizeof(HeapManager.Storage) ) ) return 0p;
 	size_t tsize = size + sizeof(HeapManager.Storage);
 	if ( likely( tsize < mmapStart ) ) {				// small size => sbrk
@@ -574,5 +520,5 @@
 		block = freeElem->freeList.pop();
 		#endif // SPINLOCK
-		if ( unlikely( block == 0 ) ) {					// no free block ?
+		if ( unlikely( block == 0p ) ) {				// no free block ?
 			#if defined( SPINLOCK )
 			unlock( freeElem->lock );
@@ -583,15 +529,15 @@
 
 			block = (HeapManager.Storage *)extend( tsize );	// mutual exclusion on call
-  if ( unlikely( block == 0 ) ) return 0;
-			#if defined( SPINLOCK )
+  if ( unlikely( block == 0p ) ) return 0p;
+		#if defined( SPINLOCK )
 		} else {
 			freeElem->freeList = block->header.kind.real.next;
 			unlock( freeElem->lock );
-			#endif // SPINLOCK
+		#endif // SPINLOCK
 		} // if
 
 		block->header.kind.real.home = freeElem;		// pointer back to free list of apropriate size
 	} else {											// large size => mmap
-  if ( unlikely( size > ~0ul - pageSize ) ) return 0;
+  if ( unlikely( size > ~0ul - pageSize ) ) return 0p;
 		tsize = libCeiling( tsize, pageSize );			// must be multiple of page size
 		#ifdef __STATISTICS__
@@ -611,19 +557,19 @@
 	} // if
 
-	void * area = &(block->data);						// adjust off header to user bytes
+	void * addr = &(block->data);						// adjust off header to user bytes
 
 	#ifdef __CFA_DEBUG__
-	assert( ((uintptr_t)area & (libAlign() - 1)) == 0 ); // minimum alignment ?
+	assert( ((uintptr_t)addr & (libAlign() - 1)) == 0 ); // minimum alignment ?
 	__atomic_add_fetch( &allocFree, tsize, __ATOMIC_SEQ_CST );
 	if ( traceHeap() ) {
 		enum { BufferSize = 64 };
 		char helpText[BufferSize];
-		int len = snprintf( helpText, BufferSize, "%p = Malloc( %zu ) (allocated %zu)\n", area, size, tsize );
-		// int len = snprintf( helpText, BufferSize, "Malloc %p %zu\n", area, size );
-		__cfaabi_dbg_bits_write( helpText, len );
+		int len = snprintf( helpText, BufferSize, "%p = Malloc( %zu ) (allocated %zu)\n", addr, size, tsize );
+		// int len = snprintf( helpText, BufferSize, "Malloc %p %zu\n", addr, size );
+		__cfaabi_bits_write( STDERR_FILENO, helpText, len ); // print debug/nodebug
 	} // if
 	#endif // __CFA_DEBUG__
 
-	return area;
+	return addr;
 } // doMalloc
 
@@ -631,5 +577,5 @@
 static inline void doFree( void * addr ) with ( heapManager ) {
 	#ifdef __CFA_DEBUG__
-	if ( unlikely( heapManager.heapBegin == 0 ) ) {
+	if ( unlikely( heapManager.heapBegin == 0p ) ) {
 		abort( "doFree( %p ) : internal error, called before heap is initialized.", addr );
 	} // if
@@ -677,5 +623,5 @@
 		char helpText[BufferSize];
 		int len = snprintf( helpText, sizeof(helpText), "Free( %p ) size:%zu\n", addr, size );
-		__cfaabi_dbg_bits_write( helpText, len );
+		__cfaabi_bits_write( STDERR_FILENO, helpText, len ); // print debug/nodebug
 	} // if
 	#endif // __CFA_DEBUG__
@@ -683,9 +629,9 @@
 
 
-size_t checkFree( HeapManager & manager ) with ( manager ) {
+size_t prtFree( HeapManager & manager ) with ( manager ) {
 	size_t total = 0;
 	#ifdef __STATISTICS__
-	__cfaabi_dbg_bits_acquire();
-	__cfaabi_dbg_bits_print_nolock( "\nBin lists (bin size : free blocks on list)\n" );
+	__cfaabi_bits_acquire();
+	__cfaabi_bits_print_nolock( STDERR_FILENO, "\nBin lists (bin size : free blocks on list)\n" );
 	#endif // __STATISTICS__
 	for ( unsigned int i = 0; i < maxBucketsUsed; i += 1 ) {
@@ -696,7 +642,7 @@
 
 		#if defined( SPINLOCK )
-		for ( HeapManager.Storage * p = freeLists[i].freeList; p != 0; p = p->header.kind.real.next ) {
+		for ( HeapManager.Storage * p = freeLists[i].freeList; p != 0p; p = p->header.kind.real.next ) {
 		#else
-		for ( HeapManager.Storage * p = freeLists[i].freeList.top(); p != 0; p = p->header.kind.real.next.top ) {
+		for ( HeapManager.Storage * p = freeLists[i].freeList.top(); p != 0p; p = p->header.kind.real.next.top ) {
 		#endif // SPINLOCK
 			total += size;
@@ -707,23 +653,103 @@
 
 		#ifdef __STATISTICS__
-		__cfaabi_dbg_bits_print_nolock( "%7zu, %-7u  ", size, N );
-		if ( (i + 1) % 8 == 0 ) __cfaabi_dbg_bits_print_nolock( "\n" );
+		__cfaabi_bits_print_nolock( STDERR_FILENO, "%7zu, %-7u  ", size, N );
+		if ( (i + 1) % 8 == 0 ) __cfaabi_bits_print_nolock( STDERR_FILENO, "\n" );
 		#endif // __STATISTICS__
 	} // for
 	#ifdef __STATISTICS__
-	__cfaabi_dbg_bits_print_nolock( "\ntotal free blocks:%zu\n", total );
-	__cfaabi_dbg_bits_release();
+	__cfaabi_bits_print_nolock( STDERR_FILENO, "\ntotal free blocks:%zu\n", total );
+	__cfaabi_bits_release();
 	#endif // __STATISTICS__
 	return (char *)heapEnd - (char *)heapBegin - total;
-} // checkFree
+} // prtFree
+
+
+static void ?{}( HeapManager & manager ) with ( manager ) {
+	pageSize = sysconf( _SC_PAGESIZE );
+
+	for ( unsigned int i = 0; i < NoBucketSizes; i += 1 ) { // initialize the free lists
+		freeLists[i].blockSize = bucketSizes[i];
+	} // for
+
+	#ifdef FASTLOOKUP
+	unsigned int idx = 0;
+	for ( unsigned int i = 0; i < LookupSizes; i += 1 ) {
+		if ( i > bucketSizes[idx] ) idx += 1;
+		lookup[i] = idx;
+	} // for
+	#endif // FASTLOOKUP
+
+	if ( setMmapStart( default_mmap_start() ) ) {
+		abort( "HeapManager : internal error, mmap start initialization failure." );
+	} // if
+	heapExpand = default_heap_expansion();
+
+	char * end = (char *)sbrk( 0 );
+	sbrk( (char *)libCeiling( (long unsigned int)end, libAlign() ) - end ); // move start of heap to multiple of alignment
+	heapBegin = heapEnd = sbrk( 0 );					// get new start point
+} // HeapManager
+
+
+static void ^?{}( HeapManager & ) {
+	#ifdef __STATISTICS__
+	if ( traceHeapTerm() ) {
+		printStats();
+		// if ( prtfree() ) prtFree( heapManager, true );
+	} // if
+	#endif // __STATISTICS__
+} // ~HeapManager
+
+
+static void memory_startup( void ) __attribute__(( constructor( STARTUP_PRIORITY_MEMORY ) ));
+void memory_startup( void ) {
+	#ifdef __CFA_DEBUG__
+	if ( unlikely( heapBoot ) ) {						// check for recursion during system boot
+		// DO NOT USE STREAMS AS THEY MAY BE UNAVAILABLE AT THIS POINT.
+		abort( "boot() : internal error, recursively invoked during system boot." );
+	} // if
+	heapBoot = true;
+	#endif // __CFA_DEBUG__
+
+	//assert( heapManager.heapBegin != 0 );
+	//heapManager{};
+	if ( heapManager.heapBegin == 0p ) heapManager{};
+} // memory_startup
+
+static void memory_shutdown( void ) __attribute__(( destructor( STARTUP_PRIORITY_MEMORY ) ));
+void memory_shutdown( void ) {
+	^heapManager{};
+} // memory_shutdown
 
 
 static inline void * mallocNoStats( size_t size ) {		// necessary for malloc statistics
 	//assert( heapManager.heapBegin != 0 );
-	if ( unlikely( heapManager.heapBegin == 0 ) ) heapManager{}; // called before memory_startup ?
-	void * area = doMalloc( size );
-	if ( unlikely( area == 0 ) ) errno = ENOMEM;		// POSIX
-	return area;
+	if ( unlikely( heapManager.heapBegin == 0p ) ) heapManager{}; // called before memory_startup ?
+	void * addr = doMalloc( size );
+	if ( unlikely( addr == 0p ) ) errno = ENOMEM;		// POSIX
+	return addr;
 } // mallocNoStats
+
+
+static inline void * callocNoStats( size_t noOfElems, size_t elemSize ) {
+	size_t size = noOfElems * elemSize;
+	char * addr = (char *)mallocNoStats( size );
+  if ( unlikely( addr == 0p ) ) return 0p;
+
+	HeapManager.Storage.Header * header;
+	HeapManager.FreeHeader * freeElem;
+	size_t bsize, alignment;
+	bool mapped __attribute__(( unused )) = headers( "calloc", addr, header, freeElem, bsize, alignment );
+	#ifndef __CFA_DEBUG__
+	// Mapped storage is zero filled, but in debug mode mapped memory is scrubbed in doMalloc, so it has to be reset to zero.
+	if ( ! mapped )
+	#endif // __CFA_DEBUG__
+		// Zero entire data space even when > than size => realloc without a new allocation and zero fill works.
+		// <-------00000000000000000000000000000000000000000000000000000> bsize (bucket size)
+		// `-header`-addr                      `-size
+		memset( addr, '\0', bsize - sizeof(HeapManager.Storage) ); // set to zeros
+
+	header->kind.real.blockSize |= 2;					// mark as zero filled
+	return addr;
+} // callocNoStats
 
 
@@ -745,13 +771,12 @@
 	// subtract libAlign() because it is already the minimum alignment
 	// add sizeof(Storage) for fake header
-	// #comment TD : this is the only place that calls doMalloc without calling mallocNoStats, why ?
-	char * area = (char *)doMalloc( size + alignment - libAlign() + sizeof(HeapManager.Storage) );
-  if ( unlikely( area == 0 ) ) return area;
+	char * addr = (char *)mallocNoStats( size + alignment - libAlign() + sizeof(HeapManager.Storage) );
+  if ( unlikely( addr == 0p ) ) return addr;
 
 	// address in the block of the "next" alignment address
-	char * user = (char *)libCeiling( (uintptr_t)(area + sizeof(HeapManager.Storage)), alignment );
+	char * user = (char *)libCeiling( (uintptr_t)(addr + sizeof(HeapManager.Storage)), alignment );
 
 	// address of header from malloc
-	HeapManager.Storage.Header * realHeader = headerAddr( area );
+	HeapManager.Storage.Header * realHeader = headerAddr( addr );
 	// address of fake header * before* the alignment location
 	HeapManager.Storage.Header * fakeHeader = headerAddr( user );
@@ -763,4 +788,23 @@
 	return user;
 } // memalignNoStats
+
+
+static inline void * cmemalignNoStats( size_t alignment, size_t noOfElems, size_t elemSize ) {
+	size_t size = noOfElems * elemSize;
+	char * addr = (char *)memalignNoStats( alignment, size );
+  if ( unlikely( addr == 0p ) ) return 0p;
+	HeapManager.Storage.Header * header;
+	HeapManager.FreeHeader * freeElem;
+	size_t bsize;
+	bool mapped __attribute__(( unused )) = headers( "cmemalign", addr, header, freeElem, bsize, alignment );
+	#ifndef __CFA_DEBUG__
+	// Mapped storage is zero filled, but in debug mode mapped memory is scrubbed in doMalloc, so it has to be reset to zero.
+	if ( ! mapped )
+	#endif // __CFA_DEBUG__
+		memset( addr, '\0', dataStorage( bsize, addr, header ) ); // set to zeros
+	header->kind.real.blockSize |= 2;				// mark as zero filled
+
+	return addr;
+} // cmemalignNoStats
 
 
@@ -776,5 +820,5 @@
 extern "C" {
 	// The malloc() function allocates size bytes and returns a pointer to the allocated memory. The memory is not
-	// initialized. If size is 0, then malloc() returns either NULL, or a unique pointer value that can later be
+	// initialized. If size is 0, then malloc() returns either 0p, or a unique pointer value that can later be
 	// successfully passed to free().
 	void * malloc( size_t size ) {
@@ -788,78 +832,43 @@
 
 	// The calloc() function allocates memory for an array of nmemb elements of size bytes each and returns a pointer to
-	// the allocated memory. The memory is set to zero. If nmemb or size is 0, then calloc() returns either NULL, or a
+	// the allocated memory. The memory is set to zero. If nmemb or size is 0, then calloc() returns either 0p, or a
 	// unique pointer value that can later be successfully passed to free().
 	void * calloc( size_t noOfElems, size_t elemSize ) {
-		size_t size = noOfElems * elemSize;
 		#ifdef __STATISTICS__
 		__atomic_add_fetch( &calloc_calls, 1, __ATOMIC_SEQ_CST );
-		__atomic_add_fetch( &calloc_storage, size, __ATOMIC_SEQ_CST );
-		#endif // __STATISTICS__
-
-		char * area = (char *)mallocNoStats( size );
-	  if ( unlikely( area == 0 ) ) return 0;
+		__atomic_add_fetch( &calloc_storage, noOfElems * elemSize, __ATOMIC_SEQ_CST );
+		#endif // __STATISTICS__
+
+		return callocNoStats( noOfElems, elemSize );
+	} // calloc
+
+	// The realloc() function changes the size of the memory block pointed to by ptr to size bytes. The contents will be
+	// unchanged in the range from the start of the region up to the minimum of the old and new sizes. If the new size
+	// is larger than the old size, the added memory will not be initialized.  If ptr is 0p, then the call is
+	// equivalent to malloc(size), for all values of size; if size is equal to zero, and ptr is not 0p, then the call
+	// is equivalent to free(ptr). Unless ptr is 0p, it must have been returned by an earlier call to malloc(),
+	// calloc() or realloc(). If the area pointed to was moved, a free(ptr) is done.
+	void * realloc( void * oaddr, size_t size ) {
+		#ifdef __STATISTICS__
+		__atomic_add_fetch( &realloc_calls, 1, __ATOMIC_SEQ_CST );
+		#endif // __STATISTICS__
+
+		// If size is equal to 0, either NULL or a pointer suitable to be passed to free() is returned.
+	  if ( unlikely( size == 0 ) ) { free( oaddr ); return mallocNoStats( size ); } // special cases
+	  if ( unlikely( oaddr == 0p ) ) return mallocNoStats( size );
 
 		HeapManager.Storage.Header * header;
 		HeapManager.FreeHeader * freeElem;
-		size_t asize, alignment;
-		bool mapped __attribute__(( unused )) = headers( "calloc", area, header, freeElem, asize, alignment );
-		#ifndef __CFA_DEBUG__
-		// Mapped storage is zero filled, but in debug mode mapped memory is scrubbed in doMalloc, so it has to be reset to zero.
-		if ( ! mapped )
-		#endif // __CFA_DEBUG__
-			memset( area, '\0', asize - sizeof(HeapManager.Storage) ); // set to zeros
-
-		header->kind.real.blockSize |= 2;				// mark as zero filled
-		return area;
-	} // calloc
-
-	// #comment TD : Document this function
-	void * cmemalign( size_t alignment, size_t noOfElems, size_t elemSize ) {
-		size_t size = noOfElems * elemSize;
-		#ifdef __STATISTICS__
-		__atomic_add_fetch( &cmemalign_calls, 1, __ATOMIC_SEQ_CST );
-		__atomic_add_fetch( &cmemalign_storage, size, __ATOMIC_SEQ_CST );
-		#endif // __STATISTICS__
-
-		char * area = (char *)memalignNoStats( alignment, size );
-	  if ( unlikely( area == 0 ) ) return 0;
-		HeapManager.Storage.Header * header;
-		HeapManager.FreeHeader * freeElem;
-		size_t asize;
-		bool mapped __attribute__(( unused )) = headers( "cmemalign", area, header, freeElem, asize, alignment );
-		#ifndef __CFA_DEBUG__
-		// Mapped storage is zero filled, but in debug mode mapped memory is scrubbed in doMalloc, so it has to be reset to zero.
-		if ( ! mapped )
-			#endif // __CFA_DEBUG__
-			memset( area, '\0', asize - ( (char *)area - (char *)header ) ); // set to zeros
-		header->kind.real.blockSize |= 2;				// mark as zero filled
-
-		return area;
-	} // cmemalign
-
-	// The realloc() function changes the size of the memory block pointed to by ptr to size bytes. The contents will be
-	// unchanged in the range from the start of the region up to the minimum of the old and new sizes. If the new size
-	// is larger than the old size, the added memory will not be initialized.  If ptr is NULL, then the call is
-	// equivalent to malloc(size), for all values of size; if size is equal to zero, and ptr is not NULL, then the call
-	// is equivalent to free(ptr). Unless ptr is NULL, it must have been returned by an earlier call to malloc(),
-	// calloc() or realloc(). If the area pointed to was moved, a free(ptr) is done.
-	void * realloc( void * addr, size_t size ) {
-		#ifdef __STATISTICS__
-		__atomic_add_fetch( &realloc_calls, 1, __ATOMIC_SEQ_CST );
-		#endif // __STATISTICS__
-
-	  if ( unlikely( addr == 0 ) ) return mallocNoStats( size ); // special cases
-	  if ( unlikely( size == 0 ) ) { free( addr ); return 0; }
-
-		HeapManager.Storage.Header * header;
-		HeapManager.FreeHeader * freeElem;
-		size_t asize, alignment = 0;
-		headers( "realloc", addr, header, freeElem, asize, alignment );
-
-		size_t usize = asize - ( (char *)addr - (char *)header ); // compute the amount of user storage in the block
-		if ( usize >= size ) {							// already sufficient storage
+		size_t bsize, oalign = 0;
+		headers( "realloc", oaddr, header, freeElem, bsize, oalign );
+
+		size_t odsize = dataStorage( bsize, oaddr, header ); // data storage available in bucket
+	  if ( size <= odsize && odsize <= size * 2 ) {	// allow up to 50% wasted storage in smaller size
+			// Do not know size of original allocation => cannot do 0 fill for any additional space because do not know
+			// where to start filling, i.e., do not overwrite existing values in space.
+			//
 			// This case does not result in a new profiler entry because the previous one still exists and it must match with
 			// the free for this memory.  Hence, this realloc does not appear in the profiler output.
-			return addr;
+			return oaddr;
 		} // if
 
@@ -868,24 +877,28 @@
 		#endif // __STATISTICS__
 
-		void * area;
-		if ( unlikely( alignment != 0 ) ) {				// previous request memalign?
-			area = memalign( alignment, size );			// create new aligned area
+		// change size and copy old content to new storage
+
+		void * naddr;
+		if ( unlikely( oalign != 0 ) ) {				// previous request memalign?
+			if ( unlikely( header->kind.real.blockSize & 2 ) ) { // previous request zero fill
+				naddr = cmemalignNoStats( oalign, 1, size ); // create new aligned area
+			} else {
+				naddr = memalignNoStats( oalign, size ); // create new aligned area
+			} // if
 		} else {
-			area = mallocNoStats( size );				// create new area
+			if ( unlikely( header->kind.real.blockSize & 2 ) ) { // previous request zero fill
+				naddr = callocNoStats( 1, size );		// create new area
+			} else {
+				naddr = mallocNoStats( size );			// create new area
+			} // if
 		} // if
-	  if ( unlikely( area == 0 ) ) return 0;
-		if ( unlikely( header->kind.real.blockSize & 2 ) ) { // previous request zero fill (calloc/cmemalign) ?
-			assert( (header->kind.real.blockSize & 1) == 0 );
-			bool mapped __attribute__(( unused )) = headers( "realloc", area, header, freeElem, asize, alignment );
-			#ifndef __CFA_DEBUG__
-			// Mapped storage is zero filled, but in debug mode mapped memory is scrubbed in doMalloc, so it has to be reset to zero.
-			if ( ! mapped )
-			#endif // __CFA_DEBUG__
-				memset( (char *)area + usize, '\0', asize - ( (char *)area - (char *)header ) - usize ); // zero-fill back part
-			header->kind.real.blockSize |= 2;			// mark new request as zero fill
-		} // if
-		memcpy( area, addr, usize );					// copy bytes
-		free( addr );
-		return area;
+	  if ( unlikely( naddr == 0p ) ) return 0p;
+
+		headers( "realloc", naddr, header, freeElem, bsize, oalign );
+		size_t ndsize = dataStorage( bsize, naddr, header ); // data storage avilable in bucket
+		// To preserve prior fill, the entire bucket must be copied versus the size.
+		memcpy( naddr, oaddr, MIN( odsize, ndsize ) );	// copy bytes
+		free( oaddr );
+		return naddr;
 	} // realloc
 
@@ -898,8 +911,17 @@
 		#endif // __STATISTICS__
 
-		void * area = memalignNoStats( alignment, size );
-
-		return area;
+		return memalignNoStats( alignment, size );
 	} // memalign
+
+
+	// The cmemalign() function is the same as calloc() with memory alignment.
+	void * cmemalign( size_t alignment, size_t noOfElems, size_t elemSize ) {
+		#ifdef __STATISTICS__
+		__atomic_add_fetch( &cmemalign_calls, 1, __ATOMIC_SEQ_CST );
+		__atomic_add_fetch( &cmemalign_storage, noOfElems * elemSize, __ATOMIC_SEQ_CST );
+		#endif // __STATISTICS__
+
+		return cmemalignNoStats( alignment, noOfElems, elemSize );
+	} // cmemalign
 
 	// The function aligned_alloc() is the same as memalign(), except for the added restriction that size should be a
@@ -912,10 +934,10 @@
 	// The function posix_memalign() allocates size bytes and places the address of the allocated memory in *memptr. The
 	// address of the allocated memory will be a multiple of alignment, which must be a power of two and a multiple of
-	// sizeof(void *). If size is 0, then posix_memalign() returns either NULL, or a unique pointer value that can later
+	// sizeof(void *). If size is 0, then posix_memalign() returns either 0p, or a unique pointer value that can later
 	// be successfully passed to free(3).
 	int posix_memalign( void ** memptr, size_t alignment, size_t size ) {
 	  if ( alignment < sizeof(void *) || ! libPow2( alignment ) ) return EINVAL; // check alignment
 		* memptr = memalign( alignment, size );
-	  if ( unlikely( * memptr == 0 ) ) return ENOMEM;
+	  if ( unlikely( * memptr == 0p ) ) return ENOMEM;
 		return 0;
 	} // posix_memalign
@@ -930,5 +952,5 @@
 	// The free() function frees the memory space pointed to by ptr, which must have been returned by a previous call to
 	// malloc(), calloc() or realloc().  Otherwise, or if free(ptr) has already been called before, undefined behavior
-	// occurs. If ptr is NULL, no operation is performed.
+	// occurs. If ptr is 0p, no operation is performed.
 	void free( void * addr ) {
 		#ifdef __STATISTICS__
@@ -936,15 +958,12 @@
 		#endif // __STATISTICS__
 
-		// #comment TD : To decrease nesting I would but the special case in the
-		//               else instead, plus it reads more naturally to have the
-		//               short / normal case instead
-		if ( unlikely( addr == 0 ) ) {					// special case
-			#ifdef __CFA_DEBUG__
-			if ( traceHeap() ) {
-				#define nullmsg "Free( 0x0 ) size:0\n"
-				// Do not debug print free( 0 ), as it can cause recursive entry from sprintf.
-				__cfaabi_dbg_bits_write( nullmsg, sizeof(nullmsg) - 1 );
-			} // if
-			#endif // __CFA_DEBUG__
+	  if ( unlikely( addr == 0p ) ) {					// special case
+			// #ifdef __CFA_DEBUG__
+			// if ( traceHeap() ) {
+			// 	#define nullmsg "Free( 0x0 ) size:0\n"
+			// 	// Do not debug print free( 0p ), as it can cause recursive entry from sprintf.
+			// 	__cfaabi_dbg_write( nullmsg, sizeof(nullmsg) - 1 );
+			// } // if
+			// #endif // __CFA_DEBUG__
 			return;
 		} // exit
@@ -953,44 +972,8 @@
 	} // free
 
-	// The mallopt() function adjusts parameters that control the behavior of the memory-allocation functions (see
-	// malloc(3)). The param argument specifies the parameter to be modified, and value specifies the new value for that
-	// parameter.
-	int mallopt( int option, int value ) {
-		choose( option ) {
-		  case M_TOP_PAD:
-			if ( setHeapExpand( value ) ) fallthru default;
-		  case M_MMAP_THRESHOLD:
-			if ( setMmapStart( value ) ) fallthru default;
-		  default:
-			// #comment TD : 1 for unsopported feels wrong
-			return 1;									// success, or unsupported
-		} // switch
-		return 0;										// error
-	} // mallopt
-
-	// The malloc_trim() function attempts to release free memory at the top of the heap (by calling sbrk(2) with a
-	// suitable argument).
-	int malloc_trim( size_t ) {
-		return 0;										// => impossible to release memory
-	} // malloc_trim
-
-	// The malloc_usable_size() function returns the number of usable bytes in the block pointed to by ptr, a pointer to
-	// a block of memory allocated by malloc(3) or a related function.
-	size_t malloc_usable_size( void * addr ) {
-	  if ( unlikely( addr == 0 ) ) return 0;			// null allocation has 0 size
-
-		HeapManager.Storage.Header * header;
-		HeapManager.FreeHeader * freeElem;
-		size_t size, alignment;
-
-		headers( "malloc_usable_size", addr, header, freeElem, size, alignment );
-		size_t usize = size - ( (char *)addr - (char *)header ); // compute the amount of user storage in the block
-		return usize;
-	} // malloc_usable_size
-
-
-    // The malloc_alignment() function returns the alignment of the allocation.
+
+	// The malloc_alignment() function returns the alignment of the allocation.
 	size_t malloc_alignment( void * addr ) {
-	  if ( unlikely( addr == 0 ) ) return libAlign();	// minimum alignment
+	  if ( unlikely( addr == 0p ) ) return libAlign();	// minimum alignment
 		HeapManager.Storage.Header * header = headerAddr( addr );
 		if ( (header->kind.fake.alignment & 1) == 1 ) {	// fake header ?
@@ -1002,7 +985,7 @@
 
 
-    // The malloc_zero_fill() function returns true if the allocation is zero filled, i.e., initially allocated by calloc().
+	// The malloc_zero_fill() function returns true if the allocation is zero filled, i.e., initially allocated by calloc().
 	bool malloc_zero_fill( void * addr ) {
-	  if ( unlikely( addr == 0 ) ) return false;		// null allocation is not zero fill
+	  if ( unlikely( addr == 0p ) ) return false;		// null allocation is not zero fill
 		HeapManager.Storage.Header * header = headerAddr( addr );
 		if ( (header->kind.fake.alignment & 1) == 1 ) { // fake header ?
@@ -1013,15 +996,28 @@
 
 
-    // The malloc_stats() function prints (on default standard error) statistics about memory allocated by malloc(3) and
-    // related functions.
+	// The malloc_usable_size() function returns the number of usable bytes in the block pointed to by ptr, a pointer to
+	// a block of memory allocated by malloc(3) or a related function.
+	size_t malloc_usable_size( void * addr ) {
+	  if ( unlikely( addr == 0p ) ) return 0;			// null allocation has 0 size
+		HeapManager.Storage.Header * header;
+		HeapManager.FreeHeader * freeElem;
+		size_t bsize, alignment;
+
+		headers( "malloc_usable_size", addr, header, freeElem, bsize, alignment );
+		return dataStorage( bsize, addr, header );	// data storage in bucket
+	} // malloc_usable_size
+
+
+	// The malloc_stats() function prints (on default standard error) statistics about memory allocated by malloc(3) and
+	// related functions.
 	void malloc_stats( void ) {
 		#ifdef __STATISTICS__
 		printStats();
-		if ( checkFree() ) checkFree( heapManager );
+		if ( prtFree() ) prtFree( heapManager );
 		#endif // __STATISTICS__
 	} // malloc_stats
 
 	// The malloc_stats_fd() function changes the file descripter where malloc_stats() writes the statistics.
-	int malloc_stats_fd( int fd ) {
+	int malloc_stats_fd( int fd __attribute__(( unused )) ) {
 		#ifdef __STATISTICS__
 		int temp = statfd;
@@ -1033,8 +1029,30 @@
 	} // malloc_stats_fd
 
+
+	// The mallopt() function adjusts parameters that control the behavior of the memory-allocation functions (see
+	// malloc(3)). The param argument specifies the parameter to be modified, and value specifies the new value for that
+	// parameter.
+	int mallopt( int option, int value ) {
+		choose( option ) {
+		  case M_TOP_PAD:
+			if ( setHeapExpand( value ) ) return 1;
+		  case M_MMAP_THRESHOLD:
+			if ( setMmapStart( value ) ) return 1;
+		} // switch
+		return 0;										// error, unsupported
+	} // mallopt
+
+	// The malloc_trim() function attempts to release free memory at the top of the heap (by calling sbrk(2) with a
+	// suitable argument).
+	int malloc_trim( size_t ) {
+		return 0;										// => impossible to release memory
+	} // malloc_trim
+
+
 	// The malloc_info() function exports an XML string that describes the current state of the memory-allocation
 	// implementation in the caller.  The string is printed on the file stream stream.  The exported string includes
 	// information about all arenas (see malloc(3)).
 	int malloc_info( int options, FILE * stream ) {
+		if ( options != 0 ) { errno = EINVAL; return -1; }
 		return printStatsXML( stream );
 	} // malloc_info
@@ -1046,5 +1064,5 @@
 	// structure is returned as the function result.  (It is the caller's responsibility to free(3) this memory.)
 	void * malloc_get_state( void ) {
-		return 0;										// unsupported
+		return 0p;										// unsupported
 	} // malloc_get_state
 
@@ -1058,4 +1076,53 @@
 
 
+// Must have CFA linkage to overload with C linkage realloc.
+void * realloc( void * oaddr, size_t nalign, size_t size ) {
+	#ifdef __STATISTICS__
+	__atomic_add_fetch( &realloc_calls, 1, __ATOMIC_SEQ_CST );
+	#endif // __STATISTICS__
+
+	// If size is equal to 0, either NULL or a pointer suitable to be passed to free() is returned.
+  if ( unlikely( size == 0 ) ) { free( oaddr ); return mallocNoStats( size ); } // special cases
+  if ( unlikely( oaddr == 0p ) ) return mallocNoStats( size );
+
+	if ( unlikely( nalign == 0 ) ) nalign = libAlign();	// reset alignment to minimum
+	#ifdef __CFA_DEBUG__
+	else
+		checkAlign( nalign );							// check alignment
+	#endif // __CFA_DEBUG__
+
+	HeapManager.Storage.Header * header;
+	HeapManager.FreeHeader * freeElem;
+	size_t bsize, oalign = 0;
+	headers( "realloc", oaddr, header, freeElem, bsize, oalign );
+	size_t odsize = dataStorage( bsize, oaddr, header ); // data storage available in bucket
+
+  if ( oalign != 0 && (uintptr_t)oaddr % nalign == 0 ) { // has alignment and just happens to work out
+		headerAddr( oaddr )->kind.fake.alignment = nalign | 1; // update alignment (could be the same)
+		return realloc( oaddr, size );
+	} // if
+
+	#ifdef __STATISTICS__
+	__atomic_add_fetch( &realloc_storage, size, __ATOMIC_SEQ_CST );
+	#endif // __STATISTICS__
+
+	// change size and copy old content to new storage
+
+	void * naddr;
+	if ( unlikely( header->kind.real.blockSize & 2 ) ) { // previous request zero fill
+		naddr = cmemalignNoStats( nalign, 1, size );	// create new aligned area
+	} else {
+		naddr = memalignNoStats( nalign, size );		// create new aligned area
+	} // if
+
+	headers( "realloc", naddr, header, freeElem, bsize, oalign );
+	size_t ndsize = dataStorage( bsize, naddr, header ); // data storage avilable in bucket
+	// To preserve prior fill, the entire bucket must be copied versus the size.
+	memcpy( naddr, oaddr, MIN( odsize, ndsize ) );		// copy bytes
+	free( oaddr );
+	return naddr;
+} // realloc
+
+
 // Local Variables: //
 // tab-width: 4 //
Index: libcfa/src/interpose.cfa
===================================================================
--- libcfa/src/interpose.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/interpose.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Wed Mar 29 16:10:31 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Jul 14 22:57:16 2019
-// Update Count     : 116
+// Last Modified On : Sat Feb  8 08:40:34 2020
+// Update Count     : 163
 //
 
@@ -29,4 +29,5 @@
 #include "bits/signal.hfa"								// sigHandler_?
 #include "startup.hfa"									// STARTUP_PRIORITY_CORE
+#include <assert.h>
 
 //=============================================================================================
@@ -40,5 +41,5 @@
 
 typedef void (* generic_fptr_t)(void);
-generic_fptr_t interpose_symbol( const char * symbol, const char * version ) {
+generic_fptr_t interpose_symbol( const char symbol[], const char version[] ) {
 	const char * error;
 
@@ -95,5 +96,5 @@
 	void __cfaabi_interpose_startup(void)  __attribute__(( constructor( STARTUP_PRIORITY_CORE ) ));
 	void __cfaabi_interpose_startup( void ) {
-		const char *version = NULL;
+		const char *version = 0p;
 
 		preload_libgcc();
@@ -105,12 +106,30 @@
 #pragma GCC diagnostic pop
 
+		// As a precaution (and necessity), errors that result in termination are delivered on a separate stack because
+		// task stacks might be very small (4K) and the signal delivery corrupts memory to the point that a clean
+		// shutdown is impossible. Also, when a stack overflow encounters the non-accessible sentinel page (debug only)
+		// and generates a segment fault, the signal cannot be delivered on the sentinel page. Finally, calls to abort
+		// print a stack trace that uses substantial stack space.
+
+		#define MINSTKSZ SIGSTKSZ * 8
+		static char stack[MINSTKSZ] __attribute__(( aligned (16) ));
+		static stack_t ss;
+
+		ss.ss_sp = stack;
+		ss.ss_size = MINSTKSZ;
+		ss.ss_flags = 0;
+		if ( sigaltstack( &ss, 0p ) == -1 ) {
+			abort( "__cfaabi_interpose_startup : internal error, sigaltstack error(%d) %s.", errno, strerror( errno ) );
+		} // if
+
 		// Failure handler
-		__cfaabi_sigaction( SIGSEGV, sigHandler_segv , SA_SIGINFO );
-		__cfaabi_sigaction( SIGBUS , sigHandler_segv , SA_SIGINFO );
-		__cfaabi_sigaction( SIGILL , sigHandler_ill  , SA_SIGINFO );
-		__cfaabi_sigaction( SIGFPE , sigHandler_fpe  , SA_SIGINFO );
-		__cfaabi_sigaction( SIGABRT, sigHandler_abrt, SA_SIGINFO | SA_RESETHAND);
-		__cfaabi_sigaction( SIGTERM, sigHandler_term , SA_SIGINFO );
-		__cfaabi_sigaction( SIGINT , sigHandler_term , SA_SIGINFO );
+		__cfaabi_sigaction( SIGSEGV, sigHandler_segv, SA_SIGINFO | SA_ONSTACK );
+		__cfaabi_sigaction( SIGBUS , sigHandler_segv, SA_SIGINFO | SA_ONSTACK );
+		__cfaabi_sigaction( SIGILL , sigHandler_ill , SA_SIGINFO | SA_ONSTACK );
+		__cfaabi_sigaction( SIGFPE , sigHandler_fpe , SA_SIGINFO | SA_ONSTACK );
+		__cfaabi_sigaction( SIGTERM, sigHandler_term, SA_SIGINFO | SA_ONSTACK | SA_RESETHAND ); // one shot handler, return to default
+		__cfaabi_sigaction( SIGINT , sigHandler_term, SA_SIGINFO | SA_ONSTACK | SA_RESETHAND );
+		__cfaabi_sigaction( SIGABRT, sigHandler_term, SA_SIGINFO | SA_ONSTACK | SA_RESETHAND );
+		__cfaabi_sigaction( SIGHUP , sigHandler_term, SA_SIGINFO | SA_ONSTACK | SA_RESETHAND ); // terminal hangup
 	}
 }
@@ -123,8 +142,9 @@
 void exit( int status, const char fmt[], ... ) __attribute__(( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ ));
 void abort( const char fmt[], ... ) __attribute__(( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ ));
+void abort( bool signalAbort, const char fmt[], ... ) __attribute__(( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ ));
 
 extern "C" {
 	void abort( void ) __attribute__(( __nothrow__, __leaf__, __noreturn__ )) {
-		abort( NULL );
+		abort( false, "%s", "" );
 	}
 
@@ -132,5 +152,5 @@
 		va_list argp;
 		va_start( argp, fmt );
-		abort( fmt, argp );
+		abort( false, fmt, argp );
 		va_end( argp );
 	}
@@ -141,65 +161,28 @@
 }
 
-void * kernel_abort    ( void ) __attribute__(( __nothrow__, __leaf__, __weak__ )) { return NULL; }
-void   kernel_abort_msg( void * data, char * buffer, int size ) __attribute__(( __nothrow__, __leaf__, __weak__ )) {}
+void * kernel_abort( void ) __attribute__(( __nothrow__, __leaf__, __weak__ )) { return 0p; }
+void kernel_abort_msg( void * data, char buffer[], int size ) __attribute__(( __nothrow__, __leaf__, __weak__ )) {}
+// See concurrency/kernel.cfa for strong definition used in multi-processor mode.
 int kernel_abort_lastframe( void ) __attribute__(( __nothrow__, __leaf__, __weak__ )) { return 4; }
 
 enum { abort_text_size = 1024 };
 static char abort_text[ abort_text_size ];
-static int abort_lastframe;
-
-void exit( int status, const char fmt[], ... ) __attribute__(( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ )) {
-    va_list args;
-    va_start( args, fmt );
-    vfprintf( stderr, fmt, args );
-    va_end( args );
-	__cabi_libc.exit( status );
-}
-
-void abort( const char fmt[], ... ) __attribute__(( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )) {
-	void * kernel_data = kernel_abort();			// must be done here to lock down kernel
-	int len;
-
-	abort_lastframe = kernel_abort_lastframe();
-	len = snprintf( abort_text, abort_text_size, "Cforall Runtime error (UNIX pid:%ld) ", (long int)getpid() ); // use UNIX pid (versus getPid)
-	__cfaabi_dbg_bits_write( abort_text, len );
-
-	if ( fmt ) {
-		va_list args;
-		va_start( args, fmt );
-
-		len = vsnprintf( abort_text, abort_text_size, fmt, args );
-		va_end( args );
-		__cfaabi_dbg_bits_write( abort_text, len );
-
-		if ( fmt[strlen( fmt ) - 1] != '\n' ) {		// add optional newline if missing at the end of the format text
-			__cfaabi_dbg_bits_write( "\n", 1 );
-		}
-	}
-
-	kernel_abort_msg( kernel_data, abort_text, abort_text_size );
-	__cabi_libc.abort();
-}
-
-static void __cfaabi_backtrace() {
-	enum {
-		Frames = 50,									// maximum number of stack frames
-		Start = 8,										// skip first N stack frames
-	};
+
+static void __cfaabi_backtrace( int start ) {
+	enum { Frames = 50, };								// maximum number of stack frames
+	int last = kernel_abort_lastframe();				// skip last N stack frames
 
 	void * array[Frames];
 	size_t size = backtrace( array, Frames );
-	char ** messages = backtrace_symbols( array, size );
-
-	// find executable name
-	*index( messages[0], '(' ) = '\0';
-	__cfaabi_dbg_bits_print_nolock( "Stack back trace for: %s\n", messages[0]);
-
-	for ( int i = Start; i < size - abort_lastframe && messages != NULL; i += 1 ) {
-		char * name = NULL, * offset_begin = NULL, * offset_end = NULL;
-
-		for ( char * p = messages[i]; *p; ++p ) {
-			//__cfaabi_dbg_bits_print_nolock( "X %s\n", p);
-			// find parantheses and +offset
+	char ** messages = backtrace_symbols( array, size ); // does not demangle names
+
+	*index( messages[0], '(' ) = '\0';					// find executable name
+	__cfaabi_bits_print_nolock( STDERR_FILENO, "Stack back trace for: %s\n", messages[0]);
+
+	for ( unsigned int i = start; i < size - last && messages != 0p; i += 1 ) {
+		char * name = 0p, * offset_begin = 0p, * offset_end = 0p;
+
+		for ( char * p = messages[i]; *p; p += 1 ) {	// find parantheses and +offset
+			//__cfaabi_bits_print_nolock( "X %s\n", p);
 			if ( *p == '(' ) {
 				name = p;
@@ -212,15 +195,14 @@
 		}
 
-		// if line contains symbol print it
-		int frameNo = i - Start;
+		// if line contains symbol, print it
+		int frameNo = i - start;
 		if ( name && offset_begin && offset_end && name < offset_begin ) {
-			// delimit strings
-			*name++ = '\0';
+			*name++ = '\0';								// delimit strings
 			*offset_begin++ = '\0';
 			*offset_end++ = '\0';
 
-			__cfaabi_dbg_bits_print_nolock( "(%i) %s : %s + %s %s\n", frameNo, messages[i], name, offset_begin, offset_end);
+			__cfaabi_bits_print_nolock( STDERR_FILENO, "(%i) %s : %s + %s %s\n", frameNo, messages[i], name, offset_begin, offset_end);
 		} else {										// otherwise, print the whole line
-			__cfaabi_dbg_bits_print_nolock( "(%i) %s\n", frameNo, messages[i] );
+			__cfaabi_bits_print_nolock( STDERR_FILENO, "(%i) %s\n", frameNo, messages[i] );
 		}
 	}
@@ -228,12 +210,58 @@
 }
 
+void exit( int status, const char fmt[], ... ) {
+	va_list args;
+	va_start( args, fmt );
+	vfprintf( stderr, fmt, args );
+	va_end( args );
+	__cabi_libc.exit( status );
+}
+
+void abort( bool signalAbort, const char fmt[], ... ) {
+	void * kernel_data = kernel_abort();				// must be done here to lock down kernel
+	int len;
+
+	signal( SIGABRT, SIG_DFL );							// prevent final "real" abort from recursing to handler
+
+	len = snprintf( abort_text, abort_text_size, "Cforall Runtime error (UNIX pid:%ld) ", (long int)getpid() ); // use UNIX pid (versus getPid)
+	__cfaabi_bits_write( STDERR_FILENO, abort_text, len );
+
+	assert( fmt );
+	va_list args;
+	va_start( args, fmt );
+
+	len = vsnprintf( abort_text, abort_text_size, fmt, args );
+	va_end( args );
+	__cfaabi_bits_write( STDERR_FILENO, abort_text, len );
+
+	if ( fmt[strlen( fmt ) - 1] != '\n' ) {				// add optional newline if missing at the end of the format text
+		__cfaabi_dbg_write( "\n", 1 );
+	}
+
+	kernel_abort_msg( kernel_data, abort_text, abort_text_size );
+	__cfaabi_backtrace( signalAbort ? 4 : 3 );
+
+	__cabi_libc.abort();								// print stack trace in handler
+}
+
+void abort( const char fmt[], ... ) {
+	va_list args;
+	va_start( args, fmt );
+	abort( false, fmt, args );
+	va_end( args );
+}
+
 void sigHandler_segv( __CFA_SIGPARMS__ ) {
-	abort( "Addressing invalid memory at location %p\n"
-			"Possible cause is reading outside the address space or writing to a protected area within the address space with an invalid pointer or subscript.\n",
-			sfp->si_addr );
+		if ( sfp->si_addr == 0p ) {
+			abort( true, "Null pointer (0p) dereference.\n" );
+		} else {
+			abort( true, "%s at memory location %p.\n"
+				   "Possible cause is reading outside the address space or writing to a protected area within the address space with an invalid pointer or subscript.\n",
+				   (sig == SIGSEGV ? "Segment fault" : "Bus error"), sfp->si_addr );
+		}
 }
 
 void sigHandler_ill( __CFA_SIGPARMS__ ) {
-	abort( "Executing illegal instruction at location %p.\n"
+	abort( true, "Executing illegal instruction at location %p.\n"
 			"Possible cause is stack corruption.\n",
 			sfp->si_addr );
@@ -251,18 +279,9 @@
 	  default: msg = "unknown";
 	} // choose
-	abort( "Computation error %s at location %p.\n", msg, sfp->si_addr );
-}
-
-void sigHandler_abrt( __CFA_SIGPARMS__ ) {
-	__cfaabi_backtrace();
-
-	// reset default signal handler
-	__cfaabi_sigdefault( SIGABRT );
-
-	raise( SIGABRT );
+	abort( true, "Computation error %s at location %p.\n", msg, sfp->si_addr );
 }
 
 void sigHandler_term( __CFA_SIGPARMS__ ) {
-	abort( "Application stopped by %s signal.", sig == SIGINT ? "an interrupt (SIGINT)" : "a terminate (SIGTERM)" );
+	abort( true, "Application interrupted by signal: %s.\n", strsignal( sig ) );
 }
 
Index: libcfa/src/iostream.cfa
===================================================================
--- libcfa/src/iostream.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/iostream.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 13 08:07:59 2019
-// Update Count     : 821
+// Last Modified On : Fri Feb  7 18:48:38 2020
+// Update Count     : 825
 //
 
@@ -35,5 +35,5 @@
 forall( dtype ostype | ostream( ostype ) ) {
 	ostype & ?|?( ostype & os, zero_t ) {
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 		fmt( os, "%d", 0n );
 		return os;
@@ -44,5 +44,5 @@
 
 	ostype & ?|?( ostype & os, one_t ) {
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 		fmt( os, "%d", 1n );
 		return os;
@@ -53,5 +53,5 @@
 
 	ostype & ?|?( ostype & os, bool b ) {
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 		fmt( os, "%s", b ? "true" : "false" );
 		return os;
@@ -63,5 +63,5 @@
 	ostype & ?|?( ostype & os, char c ) {
 		fmt( os, "%c", c );
-		if ( c == '\n' ) setNL( os, true );
+		if ( c == '\n' ) $setNL( os, true );
 		return sepOff( os );
 	} // ?|?
@@ -71,5 +71,5 @@
 
 	ostype & ?|?( ostype & os, signed char sc ) {
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 		fmt( os, "%hhd", sc );
 		return os;
@@ -80,5 +80,5 @@
 
 	ostype & ?|?( ostype & os, unsigned char usc ) {
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 		fmt( os, "%hhu", usc );
 		return os;
@@ -89,5 +89,5 @@
 
 	ostype & ?|?( ostype & os, short int si ) {
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 		fmt( os, "%hd", si );
 		return os;
@@ -98,5 +98,5 @@
 
 	ostype & ?|?( ostype & os, unsigned short int usi ) {
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 		fmt( os, "%hu", usi );
 		return os;
@@ -107,5 +107,5 @@
 
 	ostype & ?|?( ostype & os, int i ) {
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 		fmt( os, "%d", i );
 		return os;
@@ -116,5 +116,5 @@
 
 	ostype & ?|?( ostype & os, unsigned int ui ) {
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 		fmt( os, "%u", ui );
 		return os;
@@ -125,5 +125,5 @@
 
 	ostype & ?|?( ostype & os, long int li ) {
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 		fmt( os, "%ld", li );
 		return os;
@@ -134,5 +134,5 @@
 
 	ostype & ?|?( ostype & os, unsigned long int uli ) {
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 		fmt( os, "%lu", uli );
 		return os;
@@ -143,5 +143,5 @@
 
 	ostype & ?|?( ostype & os, long long int lli ) {
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 		fmt( os, "%lld", lli );
 		return os;
@@ -152,5 +152,5 @@
 
 	ostype & ?|?( ostype & os, unsigned long long int ulli ) {
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 		fmt( os, "%llu", ulli );
 		return os;
@@ -175,5 +175,5 @@
 
 	ostype & ?|?( ostype & os, float f ) {
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 		PrintWithDP( os, "%g", f );
 		return os;
@@ -184,5 +184,5 @@
 
 	ostype & ?|?( ostype & os, double d ) {
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 		PrintWithDP( os, "%.*lg", d, DBL_DIG );
 		return os;
@@ -193,5 +193,5 @@
 
 	ostype & ?|?( ostype & os, long double ld ) {
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 		PrintWithDP( os, "%.*Lg", ld, LDBL_DIG );
 		return os;
@@ -202,5 +202,5 @@
 
 	ostype & ?|?( ostype & os, float _Complex fc ) {
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 //		os | crealf( fc ) | nonl;
 		PrintWithDP( os, "%g", crealf( fc ) );
@@ -214,5 +214,5 @@
 
 	ostype & ?|?( ostype & os, double _Complex dc ) {
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 //		os | creal( dc ) | nonl;
 		PrintWithDP( os, "%.*lg", creal( dc ), DBL_DIG );
@@ -226,5 +226,5 @@
 
 	ostype & ?|?( ostype & os, long double _Complex ldc ) {
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 //		os | creall( ldc ) || nonl;
 		PrintWithDP( os, "%.*Lg", creall( ldc ), LDBL_DIG );
@@ -237,5 +237,5 @@
 	} // ?|?
 
-	ostype & ?|?( ostype & os, const char * str ) {
+	ostype & ?|?( ostype & os, const char str[] ) {
 		enum { Open = 1, Close, OpenClose };
 		static const unsigned char mask[256] @= {
@@ -257,28 +257,29 @@
 		// first character IS NOT spacing or closing punctuation => add left separator
 		unsigned char ch = str[0];						// must make unsigned
-		if ( sepPrt( os ) && mask[ ch ] != Close && mask[ ch ] != OpenClose ) {
-			fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) && mask[ ch ] != Close && mask[ ch ] != OpenClose ) {
+			fmt( os, "%s", $sepGetCur( os ) );
 		} // if
 
 		// if string starts line, must reset to determine open state because separator is off
-		sepReset( os );									// reset separator
+		$sepReset( os );								// reset separator
 
 		// last character IS spacing or opening punctuation => turn off separator for next item
 		size_t len = strlen( str );
 		ch = str[len - 1];								// must make unsigned
-		if ( sepPrt( os ) && mask[ ch ] != Open && mask[ ch ] != OpenClose ) {
+		if ( $sepPrt( os ) && mask[ ch ] != Open && mask[ ch ] != OpenClose ) {
 			sepOn( os );
 		} else {
 			sepOff( os );
 		} // if
-		if ( ch == '\n' ) setNL( os, true );			// check *AFTER* sepPrt call above as it resets NL flag
+		if ( ch == '\n' ) $setNL( os, true );			// check *AFTER* $sepPrt call above as it resets NL flag
 		return write( os, str, len );
 	} // ?|?
-	void ?|?( ostype & os, const char * str ) {
+
+	void ?|?( ostype & os, const char str[] ) {
 		(ostype &)(os | str); ends( os );
 	} // ?|?
 
 // 	ostype & ?|?( ostype & os, const char16_t * str ) {
-// 		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+// 		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 // 		fmt( os, "%ls", str );
 // 		return os;
@@ -287,5 +288,5 @@
 // #if ! ( __ARM_ARCH_ISA_ARM == 1 && __ARM_32BIT_STATE == 1 ) // char32_t == wchar_t => ambiguous
 // 	ostype & ?|?( ostype & os, const char32_t * str ) {
-// 		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+// 		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 // 		fmt( os, "%ls", str );
 // 		return os;
@@ -294,5 +295,5 @@
 
 // 	ostype & ?|?( ostype & os, const wchar_t * str ) {
-// 		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+// 		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 // 		fmt( os, "%ls", str );
 // 		return os;
@@ -300,5 +301,5 @@
 
 	ostype & ?|?( ostype & os, const void * p ) {
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 		fmt( os, "%p", p );
 		return os;
@@ -315,6 +316,6 @@
 	void ?|?( ostype & os, ostype & (* manip)( ostype & ) ) {
 		(ostype &)(manip( os ));
-		if ( getPrt( os ) ) ends( os );					// something printed ?
-		setPrt( os, false );							// turn off
+		if ( $getPrt( os ) ) ends( os );				// something printed ?
+		$setPrt( os, false );							// turn off
 	} // ?|?
 
@@ -329,6 +330,6 @@
 	ostype & nl( ostype & os ) {
 		(ostype &)(os | '\n');
-		setPrt( os, false );							// turn off
-		setNL( os, true );
+		$setPrt( os, false );							// turn off
+		$setNL( os, true );
 		flush( os );
 		return sepOff( os );							// prepare for next line
@@ -336,5 +337,5 @@
 
 	ostype & nonl( ostype & os ) {
-		setPrt( os, false );							// turn off
+		$setPrt( os, false );							// turn off
 		return os;
 	} // nonl
@@ -375,7 +376,7 @@
 	ostype & ?|?( ostype & os, T arg, Params rest ) {
 		(ostype &)(os | arg);							// print first argument
-		sepSetCur( os, sepGetTuple( os ) );				// switch to tuple separator
+		$sepSetCur( os, sepGetTuple( os ) );			// switch to tuple separator
 		(ostype &)(os | rest);							// print remaining arguments
-		sepSetCur( os, sepGet( os ) );					// switch to regular separator
+		$sepSetCur( os, sepGet( os ) );					// switch to regular separator
 		return os;
 	} // ?|?
@@ -383,7 +384,7 @@
 		// (ostype &)(?|?( os, arg, rest )); ends( os );
 		(ostype &)(os | arg);							// print first argument
-		sepSetCur( os, sepGetTuple( os ) );				// switch to tuple separator
+		$sepSetCur( os, sepGetTuple( os ) );			// switch to tuple separator
 		(ostype &)(os | rest);							// print remaining arguments
-		sepSetCur( os, sepGet( os ) );					// switch to regular separator
+		$sepSetCur( os, sepGet( os ) );					// switch to regular separator
 		ends( os );
 	} // ?|?
@@ -414,5 +415,5 @@
 forall( dtype ostype | ostream( ostype ) ) { \
 	ostype & ?|?( ostype & os, _Ostream_Manip(T) f ) { \
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) ); \
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) ); \
 \
 		if ( f.base == 'b' || f.base == 'B' ) {			/* bespoke binary format */ \
@@ -513,5 +514,5 @@
 forall( dtype ostype | ostream( ostype ) ) { \
 	ostype & ?|?( ostype & os, _Ostream_Manip(T) f ) { \
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) ); \
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) ); \
 		char fmtstr[sizeof(DFMTP)];						/* sizeof includes '\0' */ \
 		if ( ! f.flags.pc ) memcpy( &fmtstr, DFMTNP, sizeof(DFMTNP) ); \
@@ -536,4 +537,5 @@
 		return os; \
 	} /* ?|? */ \
+\
 	void ?|?( ostype & os, _Ostream_Manip(T) f ) { (ostype &)(os | f); ends( os ); } \
 } // distribution
@@ -555,5 +557,5 @@
 		} // if
 
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 
 		#define CFMTNP "% * "
@@ -571,4 +573,5 @@
 		return os;
 	} // ?|?
+
 	void ?|?( ostype & os, _Ostream_Manip(char) f ) { (ostype &)(os | f); ends( os ); }
 } // distribution
@@ -592,5 +595,5 @@
 		} // if
 
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
 
 		#define SFMTNP "% * "
@@ -616,4 +619,5 @@
 		return os;
 	} // ?|?
+
 	void ?|?( ostype & os, _Ostream_Manip(const char *) f ) { (ostype &)(os | f); ends( os ); }
 } // distribution
@@ -735,5 +739,5 @@
 	} // ?|?
 
-	// istype & ?|?( istype & is, const char * fmt ) {
+	// istype & ?|?( istype & is, const char fmt[] ) {
 	// 	fmt( is, fmt, "" );
 	// 	return is;
Index: libcfa/src/iostream.hfa
===================================================================
--- libcfa/src/iostream.hfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/iostream.hfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 12 12:08:38 2019
-// Update Count     : 334
+// Last Modified On : Fri Feb  7 17:53:52 2020
+// Update Count     : 336
 //
 
@@ -24,14 +24,14 @@
 trait ostream( dtype ostype ) {
 	// private
-	bool sepPrt( ostype & );							// get separator state (on/off)
-	void sepReset( ostype & );							// set separator state to default state
-	void sepReset( ostype &, bool );					// set separator and default state
-	const char * sepGetCur( ostype & );					// get current separator string
-	void sepSetCur( ostype &, const char * );			// set current separator string
-	bool getNL( ostype & );								// check newline
-	void setNL( ostype &, bool );						// saw newline
-	bool getANL( ostype & );							// get auto newline (on/off)
-	bool getPrt( ostype & );							// get fmt called in output cascade
-	void setPrt( ostype &, bool );						// set fmt called in output cascade
+	bool $sepPrt( ostype & );							// get separator state (on/off)
+	void $sepReset( ostype & );							// set separator state to default state
+	void $sepReset( ostype &, bool );					// set separator and default state
+	const char * $sepGetCur( ostype & );				// get current separator string
+	void $sepSetCur( ostype &, const char [] );			// set current separator string
+	bool $getNL( ostype & );							// check newline
+	void $setNL( ostype &, bool );						// saw newline
+	bool $getANL( ostype & );							// get auto newline (on/off)
+	bool $getPrt( ostype & );							// get fmt called in output cascade
+	void $setPrt( ostype &, bool );						// set fmt called in output cascade
 	// public
 	void sepOn( ostype & );								// turn separator state on
@@ -43,14 +43,14 @@
 
 	const char * sepGet( ostype & );					// get separator string
-	void sepSet( ostype &, const char * );				// set separator to string (15 character maximum)
+	void sepSet( ostype &, const char [] );				// set separator to string (15 character maximum)
 	const char * sepGetTuple( ostype & );				// get tuple separator string
-	void sepSetTuple( ostype &, const char * );			// set tuple separator to string (15 character maximum)
+	void sepSetTuple( ostype &, const char [] );		// set tuple separator to string (15 character maximum)
 
 	void ends( ostype & os );							// end of output statement
 	int fail( ostype & );
 	int flush( ostype & );
-	void open( ostype & os, const char * name, const char * mode );
+	void open( ostype & os, const char name[], const char mode[] );
 	void close( ostype & os );
-	ostype & write( ostype &, const char *, size_t );
+	ostype & write( ostype &, const char [], size_t );
 	int fmt( ostype &, const char format[], ... ) __attribute__(( format(printf, 2, 3) ));
 }; // ostream
@@ -113,6 +113,6 @@
 	void ?|?( ostype &, long double _Complex );
 
-	ostype & ?|?( ostype &, const char * );
-	void ?|?( ostype &, const char * );
+	ostype & ?|?( ostype &, const char [] );
+	void ?|?( ostype &, const char [] );
 	// ostype & ?|?( ostype &, const char16_t * );
 #if ! ( __ARM_ARCH_ISA_ARM == 1 && __ARM_32BIT_STATE == 1 ) // char32_t == wchar_t => ambiguous
@@ -256,9 +256,9 @@
 
 static inline {
-	_Ostream_Manip(const char *) bin( const char * s ) { return (_Ostream_Manip(const char *))@{ s, 1, 0, 'b', { .all : 0 } }; }
-	_Ostream_Manip(const char *) oct( const char * s ) { return (_Ostream_Manip(const char *))@{ s, 1, 0, 'o', { .all : 0 } }; }
-	_Ostream_Manip(const char *) hex( const char * s ) { return (_Ostream_Manip(const char *))@{ s, 1, 0, 'x', { .all : 0 } }; }
-	_Ostream_Manip(const char *) wd( unsigned int w, const char * s ) { return (_Ostream_Manip(const char *))@{ s, w, 0, 's', { .all : 0 } }; }
-	_Ostream_Manip(const char *) wd( unsigned int w, unsigned char pc, const char * s ) { return (_Ostream_Manip(const char *))@{ s, w, pc, 's', { .flags.pc : true } }; }
+	_Ostream_Manip(const char *) bin( const char s[] ) { return (_Ostream_Manip(const char *))@{ s, 1, 0, 'b', { .all : 0 } }; }
+	_Ostream_Manip(const char *) oct( const char s[] ) { return (_Ostream_Manip(const char *))@{ s, 1, 0, 'o', { .all : 0 } }; }
+	_Ostream_Manip(const char *) hex( const char s[] ) { return (_Ostream_Manip(const char *))@{ s, 1, 0, 'x', { .all : 0 } }; }
+	_Ostream_Manip(const char *) wd( unsigned int w, const char s[] ) { return (_Ostream_Manip(const char *))@{ s, w, 0, 's', { .all : 0 } }; }
+	_Ostream_Manip(const char *) wd( unsigned int w, unsigned char pc, const char s[] ) { return (_Ostream_Manip(const char *))@{ s, w, pc, 's', { .flags.pc : true } }; }
 	_Ostream_Manip(const char *) & wd( unsigned int w, _Ostream_Manip(const char *) & fmt ) { fmt.wd = w; return fmt; }
 	_Ostream_Manip(const char *) & wd( unsigned int w, unsigned char pc, _Ostream_Manip(const char *) & fmt ) { fmt.wd = w; fmt.pc = pc; fmt.flags.pc = true; return fmt; }
@@ -281,5 +281,5 @@
 	int fail( istype & );
 	int eof( istype & );
-	void open( istype & is, const char * name );
+	void open( istype & is, const char name[] );
 	void close( istype & is );
 	istype & read( istype &, char *, size_t );
@@ -316,5 +316,5 @@
 	istype & ?|?( istype &, long double _Complex & );
 
-//	istype & ?|?( istype &, const char * );
+//	istype & ?|?( istype &, const char [] );
 	istype & ?|?( istype &, char * );
 
@@ -343,12 +343,12 @@
 static inline {
 	_Istream_Cstr skip( unsigned int n ) { return (_Istream_Cstr){ 0p, 0p, n, { .all : 0 } }; }
-	_Istream_Cstr skip( const char * scanset ) { return (_Istream_Cstr){ 0p, scanset, -1, { .all : 0 } }; }
-	_Istream_Cstr incl( const char * scanset, char * s ) { return (_Istream_Cstr){ s, scanset, -1, { .flags.inex : false } }; }
-	_Istream_Cstr & incl( const char * scanset, _Istream_Cstr & fmt ) { fmt.scanset = scanset; fmt.flags.inex = false; return fmt; }
-	_Istream_Cstr excl( const char * scanset, char * s ) { return (_Istream_Cstr){ s, scanset, -1, { .flags.inex : true } }; }
-	_Istream_Cstr & excl( const char * scanset, _Istream_Cstr & fmt ) { fmt.scanset = scanset; fmt.flags.inex = true; return fmt; }
-	_Istream_Cstr ignore( const char * s ) { return (_Istream_Cstr)@{ s, 0p, -1, { .flags.ignore : true } }; }
+	_Istream_Cstr skip( const char scanset[] ) { return (_Istream_Cstr){ 0p, scanset, -1, { .all : 0 } }; }
+	_Istream_Cstr incl( const char scanset[], char * s ) { return (_Istream_Cstr){ s, scanset, -1, { .flags.inex : false } }; }
+	_Istream_Cstr & incl( const char scanset[], _Istream_Cstr & fmt ) { fmt.scanset = scanset; fmt.flags.inex = false; return fmt; }
+	_Istream_Cstr excl( const char scanset[], char * s ) { return (_Istream_Cstr){ s, scanset, -1, { .flags.inex : true } }; }
+	_Istream_Cstr & excl( const char scanset[], _Istream_Cstr & fmt ) { fmt.scanset = scanset; fmt.flags.inex = true; return fmt; }
+	_Istream_Cstr ignore( const char s[] ) { return (_Istream_Cstr)@{ s, 0p, -1, { .flags.ignore : true } }; }
 	_Istream_Cstr & ignore( _Istream_Cstr & fmt ) { fmt.flags.ignore = true; return fmt; }
-	_Istream_Cstr wdi( unsigned int w, char * s ) { return (_Istream_Cstr)@{ s, 0p, w, { .all : 0 } }; }
+	_Istream_Cstr wdi( unsigned int w, char s[] ) { return (_Istream_Cstr)@{ s, 0p, w, { .all : 0 } }; }
 	_Istream_Cstr & wdi( unsigned int w, _Istream_Cstr & fmt ) { fmt.wd = w; return fmt; }
 } // distribution
Index: libcfa/src/math.hfa
===================================================================
--- libcfa/src/math.hfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/math.hfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon Apr 18 23:37:04 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 13 11:02:15 2018
-// Update Count     : 116
+// Last Modified On : Tue Feb  4 10:27:11 2020
+// Update Count     : 117
 //
 
@@ -51,7 +51,7 @@
 static inline long double fdim( long double x, long double y ) { return fdiml( x, y ); }
 
-static inline float nan( const char * tag ) { return nanf( tag ); }
-// extern "C" { double nan( const char * ); }
-static inline long double nan( const char * tag ) { return nanl( tag ); }
+static inline float nan( const char tag[] ) { return nanf( tag ); }
+// extern "C" { double nan( const char [] ); }
+static inline long double nan( const char tag[] ) { return nanl( tag ); }
 
 //---------------------- Exponential ----------------------
Index: libcfa/src/rational.cfa
===================================================================
--- libcfa/src/rational.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/rational.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Wed Apr  6 17:54:28 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 12 18:12:08 2019
-// Update Count     : 184
+// Last Modified On : Sat Feb  8 17:56:36 2020
+// Update Count     : 187
 //
 
@@ -56,4 +56,11 @@
 	} // rational
 
+	void ?{}( Rational(RationalImpl) & r, zero_t ) {
+		r{ (RationalImpl){0}, (RationalImpl){1} };
+	} // rational
+
+	void ?{}( Rational(RationalImpl) & r, one_t ) {
+		r{ (RationalImpl){1}, (RationalImpl){1} };
+	} // rational
 
 	// getter for numerator/denominator
Index: libcfa/src/startup.cfa
===================================================================
--- libcfa/src/startup.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/startup.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,15 +10,15 @@
 // Created On       : Tue Jul 24 16:21:57 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jul 25 16:42:01 2018
-// Update Count     : 11
+// Last Modified On : Tue Feb  4 13:03:18 2020
+// Update Count     : 30
 //
 
+#include <time.h>										// tzset
 #include "startup.hfa"
-#include <unistd.h>
-
 
 extern "C" {
-    static void __cfaabi_appready_startup( void ) __attribute__(( constructor( STARTUP_PRIORITY_APPREADY ) ));
+    void __cfaabi_appready_startup( void ) __attribute__(( constructor( STARTUP_PRIORITY_APPREADY ) ));
     void __cfaabi_appready_startup( void ) {
+		tzset();										// initialize time global variables
 		#ifdef __CFA_DEBUG__
 		extern void heapAppStart();
@@ -27,5 +27,5 @@
     } // __cfaabi_appready_startup
 
-    static void __cfaabi_appready_shutdown( void ) __attribute__(( destructor( STARTUP_PRIORITY_APPREADY ) ));
+    void __cfaabi_appready_shutdown( void ) __attribute__(( destructor( STARTUP_PRIORITY_APPREADY ) ));
     void __cfaabi_appready_shutdown( void ) {
 		#ifdef __CFA_DEBUG__
@@ -41,5 +41,5 @@
 struct __spinlock_t;
 extern "C" {
-	void __cfaabi_dbg_record(struct __spinlock_t & this, const char * prev_name) __attribute__(( weak )) {}
+	void __cfaabi_dbg_record(struct __spinlock_t & this, const char prev_name[]) __attribute__(( weak )) {}
 }
 
Index: libcfa/src/stdhdr/assert.h
===================================================================
--- libcfa/src/stdhdr/assert.h	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/stdhdr/assert.h	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon Jul  4 23:25:26 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jul 31 23:09:32 2017
-// Update Count     : 13
+// Last Modified On : Tue Feb  4 12:58:49 2020
+// Update Count     : 15
 //
 
@@ -27,5 +27,5 @@
 	#define assertf( expr, fmt, ... ) ((expr) ? ((void)0) : __assert_fail_f(__VSTRINGIFY__(expr), __FILE__, __LINE__, __PRETTY_FUNCTION__, fmt, ## __VA_ARGS__ ))
 
-	void __assert_fail_f( const char *assertion, const char *file, unsigned int line, const char *function, const char *fmt, ... ) __attribute__((noreturn, format( printf, 5, 6) ));
+	void __assert_fail_f( const char assertion[], const char file[], unsigned int line, const char function[], const char fmt[], ... ) __attribute__((noreturn, format( printf, 5, 6) ));
 #endif
 
Index: libcfa/src/stdhdr/bfdlink.h
===================================================================
--- libcfa/src/stdhdr/bfdlink.h	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/stdhdr/bfdlink.h	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,11 +10,11 @@
 // Created On       : Tue Jul 18 07:26:04 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Jul 22 13:49:30 2018
-// Update Count     : 4
+// Last Modified On : Fri Feb  7 19:05:08 2020
+// Update Count     : 6
 // 
 
 // include file uses the CFA keyword "with".
 #if ! defined( with )									// nesting ?
-#define with `with`										// make keyword an identifier
+#define with ``with										// make keyword an identifier
 #define __CFA_BFDLINK_H__
 #endif
Index: libcfa/src/stdhdr/hwloc.h
===================================================================
--- libcfa/src/stdhdr/hwloc.h	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/stdhdr/hwloc.h	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,11 +10,11 @@
 // Created On       : Tue Jul 18 07:45:00 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Jul 22 13:49:58 2018
-// Update Count     : 4
+// Last Modified On : Fri Feb  7 19:05:18 2020
+// Update Count     : 6
 // 
 
 // include file uses the CFA keyword "thread".
 #if ! defined( thread )									// nesting ?
-#define thread `thread`									// make keyword an identifier
+#define thread ``thread									// make keyword an identifier
 #define __CFA_HWLOC_H__
 #endif
Index: libcfa/src/stdhdr/krb5.h
===================================================================
--- libcfa/src/stdhdr/krb5.h	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/stdhdr/krb5.h	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,11 +10,11 @@
 // Created On       : Tue Jul 18 07:55:44 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Jul 22 13:50:24 2018
-// Update Count     : 4
+// Last Modified On : Fri Feb  7 19:05:35 2020
+// Update Count     : 6
 // 
 
 // include file uses the CFA keyword "enable".
 #if ! defined( enable )									// nesting ?
-#define enable `enable`									// make keyword an identifier
+#define enable ``enable									// make keyword an identifier
 #define __CFA_KRB5_H__
 #endif
Index: libcfa/src/stdhdr/math.h
===================================================================
--- libcfa/src/stdhdr/math.h	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/stdhdr/math.h	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,11 +10,11 @@
 // Created On       : Mon Jul  4 23:25:26 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Feb 22 18:16:07 2018
-// Update Count     : 13
+// Last Modified On : Fri Feb  7 19:05:27 2020
+// Update Count     : 15
 // 
 
 extern "C" {
 #if ! defined( exception )								// nesting ?
-#define exception `exception`							// make keyword an identifier
+#define exception ``exception							// make keyword an identifier
 #define __CFA_MATH_H__
 #endif
Index: libcfa/src/stdhdr/sys/ucontext.h
===================================================================
--- libcfa/src/stdhdr/sys/ucontext.h	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/stdhdr/sys/ucontext.h	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,10 +10,10 @@
 // Created On       : Thu Feb  8 23:48:16 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Feb  8 23:50:44 2018
-// Update Count     : 4
+// Last Modified On : Fri Feb  7 19:05:41 2020
+// Update Count     : 6
 // 
 
 #if ! defined( ftype )									// nesting ?
-#define ftype `ftype`									// make keyword an identifier
+#define ftype ``ftype									// make keyword an identifier
 #define __CFA_UCONTEXT_H__
 #endif
Index: libcfa/src/stdlib.cfa
===================================================================
--- libcfa/src/stdlib.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/stdlib.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Thu Jan 28 17:10:29 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Oct 22 08:57:52 2019
-// Update Count     : 478
+// Last Modified On : Tue Feb  4 08:27:08 2020
+// Update Count     : 486
 //
 
@@ -30,50 +30,19 @@
 	T * alloc_set( T ptr[], size_t dim, char fill ) {	// realloc array with fill
 		size_t olen = malloc_usable_size( ptr );		// current allocation
-		char * nptr = (char *)realloc( (void *)ptr, dim * sizeof(T) ); // C realloc
+		void * nptr = (void *)realloc( (void *)ptr, dim * sizeof(T) ); // C realloc
 		size_t nlen = malloc_usable_size( nptr );		// new allocation
 		if ( nlen > olen ) {							// larger ?
-			memset( nptr + olen, (int)fill, nlen - olen ); // initialize added storage
+			memset( (char *)nptr + olen, (int)fill, nlen - olen ); // initialize added storage
 		} // if
 		return (T *)nptr;
 	} // alloc_set
 
-	T * alloc_align( T ptr[], size_t align ) {			// aligned realloc array
-		char * nptr;
-		size_t alignment = malloc_alignment( ptr );
-		if ( align != alignment && (uintptr_t)ptr % align != 0 ) {
-			size_t olen = malloc_usable_size( ptr );	// current allocation
-			nptr = (char *)memalign( align, olen );
-			size_t nlen = malloc_usable_size( nptr );	// new allocation
-			size_t lnth = olen < nlen ? olen : nlen;	// min
-			memcpy( nptr, ptr, lnth );					// initialize storage
-			free( ptr );
-		} else {
-			nptr = (char *)ptr;
-		} // if
-		return (T *)nptr;
-	} // alloc_align
-
-	T * alloc_align( T ptr[], size_t align, size_t dim ) { // aligned realloc array
-		char * nptr;
-		size_t alignment = malloc_alignment( ptr );
-		if ( align != alignment ) {
-			size_t olen = malloc_usable_size( ptr );	// current allocation
-			nptr = (char *)memalign( align, dim * sizeof(T) );
-			size_t nlen = malloc_usable_size( nptr );	// new allocation
-			size_t lnth = olen < nlen ? olen : nlen;	// min
-			memcpy( nptr, ptr, lnth );					// initialize storage
-			free( ptr );
-		} else {
-			nptr = (char *)realloc( (void *)ptr, dim * sizeof(T) ); // C realloc
-		} // if
-		return (T *)nptr;
-	} // alloc_align
-
 	T * alloc_align_set( T ptr[], size_t align, char fill ) { // aligned realloc with fill
 		size_t olen = malloc_usable_size( ptr );		// current allocation
-		char * nptr = alloc_align( ptr, align );
+		void * nptr = (void *)realloc( (void *)ptr, align, sizeof(T) ); // CFA realloc
+		// char * nptr = alloc_align( ptr, align );
 		size_t nlen = malloc_usable_size( nptr );		// new allocation
 		if ( nlen > olen ) {							// larger ?
-			memset( nptr + olen, (int)fill, nlen - olen ); // initialize added storage
+			memset( (char *)nptr + olen, (int)fill, nlen - olen ); // initialize added storage
 		} // if
 		return (T *)nptr;
@@ -138,5 +107,5 @@
 //---------------------------------------
 
-float _Complex strto( const char * sptr, char ** eptr ) {
+float _Complex strto( const char sptr[], char ** eptr ) {
 	float re, im;
 	char * eeptr;
@@ -149,5 +118,5 @@
 } // strto
 
-double _Complex strto( const char * sptr, char ** eptr ) {
+double _Complex strto( const char sptr[], char ** eptr ) {
 	double re, im;
 	char * eeptr;
@@ -160,5 +129,5 @@
 } // strto
 
-long double _Complex strto( const char * sptr, char ** eptr ) {
+long double _Complex strto( const char sptr[], char ** eptr ) {
 	long double re, im;
 	char * eeptr;
Index: libcfa/src/stdlib.hfa
===================================================================
--- libcfa/src/stdlib.hfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/stdlib.hfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Thu Jan 28 17:12:35 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Oct 20 22:57:33 2019
-// Update Count     : 390
+// Last Modified On : Tue Feb  4 08:27:01 2020
+// Update Count     : 401
 //
 
@@ -28,4 +28,6 @@
 } // extern "C"
 
+void * realloc( void * oaddr, size_t nalign, size_t size ); // CFA heap
+
 //---------------------------------------
 
@@ -50,6 +52,5 @@
 	} // calloc
 
-	T * realloc( T * ptr, size_t size ) {
-		if ( unlikely( ptr == 0 ) ) return malloc();
+	T * realloc( T * ptr, size_t size ) {				// CFA realloc, eliminate return-type cast
 		return (T *)(void *)realloc( (void *)ptr, size ); // C realloc
 	} // realloc
@@ -59,4 +60,8 @@
 	} // memalign
 
+	T * cmemalign( size_t align, size_t dim  ) {
+		return (T *)cmemalign( align, dim, sizeof(T) );	// CFA cmemalign
+	} // cmemalign
+
 	T * aligned_alloc( size_t align ) {
 		return (T *)aligned_alloc( align, sizeof(T) );	// C aligned_alloc
@@ -79,5 +84,5 @@
 
 	T * alloc( T ptr[], size_t dim ) {					// realloc
-		return realloc( ptr, dim * sizeof(T) );
+		return (T *)(void *)realloc( (void *)ptr, dim * sizeof(T) ); // C realloc
 	} // alloc
 
@@ -118,4 +123,12 @@
 	} // alloc_align
 
+	T * alloc_align( T ptr[], size_t align ) {			// aligned realloc array
+		return (T *)(void *)realloc( (void *)ptr, align, sizeof(T) ); // CFA realloc
+	} // alloc_align
+
+	T * alloc_align( T ptr[], size_t align, size_t dim ) { // aligned realloc array
+		return (T *)(void *)realloc( (void *)ptr, align, dim * sizeof(T) ); // CFA realloc
+	} // alloc_align
+
 	T * alloc_align_set( size_t align, char fill ) {
 		return (T *)memset( (T *)alloc_align( align ), (int)fill, sizeof(T) ); // initialize with fill value
@@ -142,6 +155,4 @@
 
 forall( dtype T | sized(T) ) {
-	T * alloc_align( T ptr[], size_t align );			// realign
-	T * alloc_align( T ptr[], size_t align, size_t dim ); // aligned realloc array
 	T * alloc_align_set( T ptr[], size_t align, size_t dim, char fill ); // aligned realloc array with fill
 } // distribution
@@ -182,35 +193,35 @@
 
 static inline {
-	int strto( const char * sptr, char ** eptr, int base ) { return (int)strtol( sptr, eptr, base ); }
-	unsigned int strto( const char * sptr, char ** eptr, int base ) { return (unsigned int)strtoul( sptr, eptr, base ); }
-	long int strto( const char * sptr, char ** eptr, int base ) { return strtol( sptr, eptr, base ); }
-	unsigned long int strto( const char * sptr, char ** eptr, int base ) { return strtoul( sptr, eptr, base ); }
-	long long int strto( const char * sptr, char ** eptr, int base ) { return strtoll( sptr, eptr, base ); }
-	unsigned long long int strto( const char * sptr, char ** eptr, int base ) { return strtoull( sptr, eptr, base ); }
-
-	float strto( const char * sptr, char ** eptr ) { return strtof( sptr, eptr ); }
-	double strto( const char * sptr, char ** eptr ) { return strtod( sptr, eptr ); }
-	long double strto( const char * sptr, char ** eptr ) { return strtold( sptr, eptr ); }
-} // distribution
-
-float _Complex strto( const char * sptr, char ** eptr );
-double _Complex strto( const char * sptr, char ** eptr );
-long double _Complex strto( const char * sptr, char ** eptr );
+	int strto( const char sptr[], char ** eptr, int base ) { return (int)strtol( sptr, eptr, base ); }
+	unsigned int strto( const char sptr[], char ** eptr, int base ) { return (unsigned int)strtoul( sptr, eptr, base ); }
+	long int strto( const char sptr[], char ** eptr, int base ) { return strtol( sptr, eptr, base ); }
+	unsigned long int strto( const char sptr[], char ** eptr, int base ) { return strtoul( sptr, eptr, base ); }
+	long long int strto( const char sptr[], char ** eptr, int base ) { return strtoll( sptr, eptr, base ); }
+	unsigned long long int strto( const char sptr[], char ** eptr, int base ) { return strtoull( sptr, eptr, base ); }
+
+	float strto( const char sptr[], char ** eptr ) { return strtof( sptr, eptr ); }
+	double strto( const char sptr[], char ** eptr ) { return strtod( sptr, eptr ); }
+	long double strto( const char sptr[], char ** eptr ) { return strtold( sptr, eptr ); }
+} // distribution
+
+float _Complex strto( const char sptr[], char ** eptr );
+double _Complex strto( const char sptr[], char ** eptr );
+long double _Complex strto( const char sptr[], char ** eptr );
 
 static inline {
-	int ato( const char * sptr ) { return (int)strtol( sptr, 0, 10 ); }
-	unsigned int ato( const char * sptr ) { return (unsigned int)strtoul( sptr, 0, 10 ); }
-	long int ato( const char * sptr ) { return strtol( sptr, 0, 10 ); }
-	unsigned long int ato( const char * sptr ) { return strtoul( sptr, 0, 10 ); }
-	long long int ato( const char * sptr ) { return strtoll( sptr, 0, 10 ); }
-	unsigned long long int ato( const char * sptr ) { return strtoull( sptr, 0, 10 ); }
-
-	float ato( const char * sptr ) { return strtof( sptr, 0 ); }
-	double ato( const char * sptr ) { return strtod( sptr, 0 ); }
-	long double ato( const char * sptr ) { return strtold( sptr, 0 ); }
-
-	float _Complex ato( const char * sptr ) { return strto( sptr, NULL ); }
-	double _Complex ato( const char * sptr ) { return strto( sptr, NULL ); }
-	long double _Complex ato( const char * sptr ) { return strto( sptr, NULL ); }
+	int ato( const char sptr[] ) { return (int)strtol( sptr, 0p, 10 ); }
+	unsigned int ato( const char sptr[] ) { return (unsigned int)strtoul( sptr, 0p, 10 ); }
+	long int ato( const char sptr[] ) { return strtol( sptr, 0p, 10 ); }
+	unsigned long int ato( const char sptr[] ) { return strtoul( sptr, 0p, 10 ); }
+	long long int ato( const char sptr[] ) { return strtoll( sptr, 0p, 10 ); }
+	unsigned long long int ato( const char sptr[] ) { return strtoull( sptr, 0p, 10 ); }
+
+	float ato( const char sptr[] ) { return strtof( sptr, 0p ); }
+	double ato( const char sptr[] ) { return strtod( sptr, 0p ); }
+	long double ato( const char sptr[] ) { return strtold( sptr, 0p ); }
+
+	float _Complex ato( const char sptr[] ) { return strto( sptr, 0p ); }
+	double _Complex ato( const char sptr[] ) { return strto( sptr, 0p ); }
+	long double _Complex ato( const char sptr[] ) { return strto( sptr, 0p ); }
 } // distribution
 
Index: libcfa/src/time.cfa
===================================================================
--- libcfa/src/time.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/time.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Tue Mar 27 13:33:14 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 13 08:41:55 2019
-// Update Count     : 65
+// Last Modified On : Tue Feb  4 08:24:18 2020
+// Update Count     : 70
 //
 
@@ -33,6 +33,6 @@
 forall( dtype ostype | ostream( ostype ) ) {
 	ostype & ?|?( ostype & os, Duration dur ) with( dur ) {
-		(ostype &)(os | tv / TIMEGRAN);					// print seconds
-		long int ns = (tv < 0 ? -tv : tv) % TIMEGRAN;	// compute nanoseconds
+		(ostype &)(os | tn / TIMEGRAN);					// print seconds
+		long int ns = (tn < 0 ? -tn : tn) % TIMEGRAN;	// compute nanoseconds
 		if ( ns != 0 ) {								// some ?
 			char buf[16];
@@ -52,39 +52,31 @@
 
 #ifdef __CFA_DEBUG__
-static void tabort( int year, int month, int day, int hour, int min, int sec, int nsec ) {
+static void tabort( int year, int month, int day, int hour, int min, int sec, int64_t nsec ) {
 	abort | "Attempt to create Time( year=" | year | "(>=1970), month=" | month | "(1-12), day=" | day | "(1-31), hour=" | hour | "(0-23), min=" | min | "(0-59), sec=" | sec
-		  | "(0-60), nsec=" | nsec | "(0-999_999_999), which exceeds range 00:00:00 UTC, January 1, 1970 to 03:14:07 UTC, January 19, 2038.";
+		  | "(0-60), nsec=" | nsec | "(0-999_999_999), which is not in the range 00:00:00 UTC, January 1, 1970 to 03:14:07 UTC, January 19, 2038, where month and day have 1 origin.";
 } // tabort
 #endif // __CFA_DEBUG__
 
-void ?{}( Time & time, int year, int month, int day, int hour, int min, int sec, int nsec ) with( time ) {
+void ?{}( Time & time, int year, int month, int day, int hour, int min, int sec, int64_t nsec ) with( time ) {
 	tm tm;
 
-	tm.tm_isdst = -1;									// let mktime determine if alternate timezone is in effect
+	// Values can be in any range (+/-) but result must be in the epoch.
 	tm.tm_year = year - 1900;							// mktime uses 1900 as its starting point
-#ifdef __CFA_DEBUG__
-	if ( month < 1 || 12 < month ) {
-		tabort( year, month, day, hour, min, sec, nsec );
-	} // if
-#endif // __CFA_DEBUG__
+	// Make month in range 1-12 to match with day.
 	tm.tm_mon = month - 1;								// mktime uses range 0-11
-#ifdef __CFA_DEBUG__
-	if ( day < 1 || 31 < day ) {
-		tabort( year, month, day, hour, min, sec, nsec );
-	} // if
-#endif // __CFA_DEBUG__
 	tm.tm_mday = day;									// mktime uses range 1-31
 	tm.tm_hour = hour;
 	tm.tm_min = min;
 	tm.tm_sec = sec;
+	tm.tm_isdst = -1;									// let mktime determine if alternate timezone is in effect
 	time_t epochsec = mktime( &tm );
 #ifdef __CFA_DEBUG__
-	if ( epochsec == (time_t)-1 ) {
+	if ( epochsec <= (time_t)-1 ) {						// MUST BE LESS THAN OR EQUAL!
 		tabort( year, month, day, hour, min, sec, nsec );
 	} // if
 #endif // __CFA_DEBUG__
-	tv = (int64_t)(epochsec) * TIMEGRAN + nsec;			// convert to nanoseconds
+	tn = (int64_t)(epochsec) * TIMEGRAN + nsec;			// convert to nanoseconds
 #ifdef __CFA_DEBUG__
-	if ( tv > 2147483647LL * TIMEGRAN ) {				// between 00:00:00 UTC, January 1, 1970 and 03:14:07 UTC, January 19, 2038.
+	if ( tn > 2147483647LL * TIMEGRAN ) {				// between 00:00:00 UTC, January 1, 1970 and 03:14:07 UTC, January 19, 2038.
 		tabort( year, month, day, hour, min, sec, nsec );
 	} // if
@@ -93,5 +85,5 @@
 
 char * yy_mm_dd( Time time, char * buf ) with( time ) {
-	time_t s = tv / TIMEGRAN;
+	time_t s = tn / TIMEGRAN;
 	tm tm;
 	gmtime_r( &s, &tm );								// tm_mon <= 11, tm_mday <= 31
@@ -108,5 +100,5 @@
 
 char * mm_dd_yy( Time time, char * buf ) with( time ) {
-	time_t s = tv / TIMEGRAN;
+	time_t s = tn / TIMEGRAN;
 	tm tm;
 	gmtime_r( &s, &tm );								// tm_mon <= 11, tm_mday <= 31
@@ -123,5 +115,5 @@
 
 char * dd_mm_yy( Time time, char * buf ) with( time ) {
-	time_t s = tv / TIMEGRAN;
+	time_t s = tn / TIMEGRAN;
 	tm tm;
 	gmtime_r( &s, &tm );								// tm_mon <= 11, tm_mday <= 31
@@ -137,6 +129,6 @@
 } // dd_mm_yy
 
-size_t strftime( char * buf, size_t size, const char * fmt, Time time ) with( time ) {
-	time_t s = tv / TIMEGRAN;
+size_t strftime( char buf[], size_t size, const char fmt[], Time time ) with( time ) {
+	time_t s = tn / TIMEGRAN;
 	tm tm;
 	gmtime_r( &s, &tm );
@@ -147,8 +139,8 @@
 	ostype & ?|?( ostype & os, Time time ) with( time ) {
 		char buf[32];									// at least 26
-		time_t s = tv / TIMEGRAN;
+		time_t s = tn / TIMEGRAN;
 		ctime_r( &s, (char *)&buf );					// 26 characters: "Wed Jun 30 21:49:08 1993\n"
 		buf[24] = '\0';									// remove trailing '\n'
-		long int ns = (tv < 0 ? -tv : tv) % TIMEGRAN;	// compute nanoseconds
+		long int ns = (tn < 0 ? -tn : tn) % TIMEGRAN;	// compute nanoseconds
 		if ( ns == 0 ) {								// none ?
 			(ostype &)(os | buf);						// print date/time/year
Index: libcfa/src/time.hfa
===================================================================
--- libcfa/src/time.hfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/time.hfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Wed Mar 14 23:18:57 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Sep 22 12:25:34 2018
-// Update Count     : 643
+// Last Modified On : Tue Feb  4 08:24:32 2020
+// Update Count     : 654
 //
 
@@ -32,39 +32,39 @@
 	Duration ?=?( Duration & dur, __attribute__((unused)) zero_t ) { return dur{ 0 }; }
 
-	Duration +?( Duration rhs ) with( rhs ) {	return (Duration)@{ +tv }; }
-	Duration ?+?( Duration & lhs, Duration rhs ) { return (Duration)@{ lhs.tv + rhs.tv }; }
+	Duration +?( Duration rhs ) with( rhs ) { return (Duration)@{ +tn }; }
+	Duration ?+?( Duration & lhs, Duration rhs ) { return (Duration)@{ lhs.tn + rhs.tn }; }
 	Duration ?+=?( Duration & lhs, Duration rhs ) { lhs = lhs + rhs; return lhs; }
 
-	Duration -?( Duration rhs ) with( rhs ) { return (Duration)@{ -tv }; }
-	Duration ?-?( Duration & lhs, Duration rhs ) { return (Duration)@{ lhs.tv - rhs.tv }; }
+	Duration -?( Duration rhs ) with( rhs ) { return (Duration)@{ -tn }; }
+	Duration ?-?( Duration & lhs, Duration rhs ) { return (Duration)@{ lhs.tn - rhs.tn }; }
 	Duration ?-=?( Duration & lhs, Duration rhs ) { lhs = lhs - rhs; return lhs; }
 
-	Duration ?*?( Duration lhs, int64_t rhs ) { return (Duration)@{ lhs.tv * rhs }; }
-	Duration ?*?( int64_t lhs, Duration rhs ) { return (Duration)@{ lhs * rhs.tv }; }
+	Duration ?*?( Duration lhs, int64_t rhs ) { return (Duration)@{ lhs.tn * rhs }; }
+	Duration ?*?( int64_t lhs, Duration rhs ) { return (Duration)@{ lhs * rhs.tn }; }
 	Duration ?*=?( Duration & lhs, int64_t rhs ) { lhs = lhs * rhs; return lhs; }
 
-	int64_t ?/?( Duration lhs, Duration rhs ) { return lhs.tv / rhs.tv; }
-	Duration ?/?( Duration lhs, int64_t rhs ) { return (Duration)@{ lhs.tv / rhs }; }
+	int64_t ?/?( Duration lhs, Duration rhs ) { return lhs.tn / rhs.tn; }
+	Duration ?/?( Duration lhs, int64_t rhs ) { return (Duration)@{ lhs.tn / rhs }; }
 	Duration ?/=?( Duration & lhs, int64_t rhs ) { lhs = lhs / rhs; return lhs; }
-	double div( Duration lhs, Duration rhs ) { return (double)lhs.tv / (double)rhs.tv; }
-
-	Duration ?%?( Duration lhs, Duration rhs ) { return (Duration)@{ lhs.tv % rhs.tv }; }
+	double div( Duration lhs, Duration rhs ) { return (double)lhs.tn / (double)rhs.tn; }
+
+	Duration ?%?( Duration lhs, Duration rhs ) { return (Duration)@{ lhs.tn % rhs.tn }; }
 	Duration ?%=?( Duration & lhs, Duration rhs ) { lhs = lhs % rhs; return lhs; }
 
-	bool ?==?( Duration lhs, Duration rhs ) { return lhs.tv == rhs.tv; }
-	bool ?!=?( Duration lhs, Duration rhs ) { return lhs.tv != rhs.tv; }
-	bool ?<? ( Duration lhs, Duration rhs ) { return lhs.tv <  rhs.tv; }
-	bool ?<=?( Duration lhs, Duration rhs ) { return lhs.tv <= rhs.tv; }
-	bool ?>? ( Duration lhs, Duration rhs ) { return lhs.tv >  rhs.tv; }
-	bool ?>=?( Duration lhs, Duration rhs ) { return lhs.tv >= rhs.tv; }
-
-	bool ?==?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tv == 0; }
-	bool ?!=?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tv != 0; }
-	bool ?<? ( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tv <  0; }
-	bool ?<=?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tv <= 0; }
-	bool ?>? ( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tv >  0; }
-	bool ?>=?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tv >= 0; }
-
-	Duration abs( Duration rhs ) { return rhs.tv >= 0 ? rhs : -rhs; }
+	bool ?==?( Duration lhs, Duration rhs ) { return lhs.tn == rhs.tn; }
+	bool ?!=?( Duration lhs, Duration rhs ) { return lhs.tn != rhs.tn; }
+	bool ?<? ( Duration lhs, Duration rhs ) { return lhs.tn <  rhs.tn; }
+	bool ?<=?( Duration lhs, Duration rhs ) { return lhs.tn <= rhs.tn; }
+	bool ?>? ( Duration lhs, Duration rhs ) { return lhs.tn >  rhs.tn; }
+	bool ?>=?( Duration lhs, Duration rhs ) { return lhs.tn >= rhs.tn; }
+
+	bool ?==?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn == 0; }
+	bool ?!=?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn != 0; }
+	bool ?<? ( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn <  0; }
+	bool ?<=?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn <= 0; }
+	bool ?>? ( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn >  0; }
+	bool ?>=?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn >= 0; }
+
+	Duration abs( Duration rhs ) { return rhs.tn >= 0 ? rhs : -rhs; }
 
 	Duration ?`ns( int64_t nsec ) { return (Duration)@{ nsec }; }
@@ -82,15 +82,15 @@
 	Duration ?`w( double weeks ) { return (Duration)@{ weeks * (7LL * 24LL * 60LL * 60LL * TIMEGRAN) }; }
 
-	int64_t ?`ns( Duration dur ) { return dur.tv; }
-	int64_t ?`us( Duration dur ) { return dur.tv / (TIMEGRAN / 1_000_000LL); }
-	int64_t ?`ms( Duration dur ) { return dur.tv / (TIMEGRAN / 1_000LL); }
-	int64_t ?`s( Duration dur ) { return dur.tv / TIMEGRAN; }
-	int64_t ?`m( Duration dur ) { return dur.tv / (60LL * TIMEGRAN); }
-	int64_t ?`h( Duration dur ) { return dur.tv / (60LL * 60LL * TIMEGRAN); }
-	int64_t ?`d( Duration dur ) { return dur.tv / (24LL * 60LL * 60LL * TIMEGRAN); }
-	int64_t ?`w( Duration dur ) { return dur.tv / (7LL * 24LL * 60LL * 60LL * TIMEGRAN); }
-
-	Duration max( Duration lhs, Duration rhs ) { return  (lhs.tv < rhs.tv) ? rhs : lhs;}
-	Duration min( Duration lhs, Duration rhs ) { return !(rhs.tv < lhs.tv) ? lhs : rhs;}
+	int64_t ?`ns( Duration dur ) { return dur.tn; }
+	int64_t ?`us( Duration dur ) { return dur.tn / (TIMEGRAN / 1_000_000LL); }
+	int64_t ?`ms( Duration dur ) { return dur.tn / (TIMEGRAN / 1_000LL); }
+	int64_t ?`s( Duration dur ) { return dur.tn / TIMEGRAN; }
+	int64_t ?`m( Duration dur ) { return dur.tn / (60LL * TIMEGRAN); }
+	int64_t ?`h( Duration dur ) { return dur.tn / (60LL * 60LL * TIMEGRAN); }
+	int64_t ?`d( Duration dur ) { return dur.tn / (24LL * 60LL * 60LL * TIMEGRAN); }
+	int64_t ?`w( Duration dur ) { return dur.tn / (7LL * 24LL * 60LL * 60LL * TIMEGRAN); }
+
+	Duration max( Duration lhs, Duration rhs ) { return  (lhs.tn < rhs.tn) ? rhs : lhs;}
+	Duration min( Duration lhs, Duration rhs ) { return !(rhs.tn < lhs.tn) ? lhs : rhs;}
 } // distribution
 
@@ -143,33 +143,35 @@
 //######################### Time #########################
 
-void ?{}( Time & time, int year, int month = 0, int day = 0, int hour = 0, int min = 0, int sec = 0, int nsec = 0 );
+void ?{}( Time & time, int year, int month = 1, int day = 1, int hour = 0, int min = 0, int sec = 0, int64_t nsec = 0 );
 static inline {
 	Time ?=?( Time & time, __attribute__((unused)) zero_t ) { return time{ 0 }; }
 
-	void ?{}( Time & time, timeval t ) with( time ) { tv = (int64_t)t.tv_sec * TIMEGRAN + t.tv_usec * 1000; }
+	void ?{}( Time & time, timeval t ) with( time ) { tn = (int64_t)t.tv_sec * TIMEGRAN + t.tv_usec * 1000; }
 	Time ?=?( Time & time, timeval t ) with( time ) {
-		tv = (int64_t)t.tv_sec * TIMEGRAN + t.tv_usec * (TIMEGRAN / 1_000_000LL);
+		tn = (int64_t)t.tv_sec * TIMEGRAN + t.tv_usec * (TIMEGRAN / 1_000_000LL);
 		return time;
 	} // ?=?
 
-	void ?{}( Time & time, timespec t ) with( time ) { tv = (int64_t)t.tv_sec * TIMEGRAN + t.tv_nsec; }
+	void ?{}( Time & time, timespec t ) with( time ) { tn = (int64_t)t.tv_sec * TIMEGRAN + t.tv_nsec; }
 	Time ?=?( Time & time, timespec t ) with( time ) {
-		tv = (int64_t)t.tv_sec * TIMEGRAN + t.tv_nsec;
+		tn = (int64_t)t.tv_sec * TIMEGRAN + t.tv_nsec;
 		return time;
 	} // ?=?
 
-	Time ?+?( Time & lhs, Duration rhs ) { return (Time)@{ lhs.tv + rhs.tv }; }
+	Time ?+?( Time & lhs, Duration rhs ) { return (Time)@{ lhs.tn + rhs.tn }; }
 	Time ?+?( Duration lhs, Time rhs ) { return rhs + lhs; }
 	Time ?+=?( Time & lhs, Duration rhs ) { lhs = lhs + rhs; return lhs; }
 
-	Duration ?-?( Time lhs, Time rhs ) { return (Duration)@{ lhs.tv - rhs.tv }; }
-	Time ?-?( Time lhs, Duration rhs ) { return (Time)@{ lhs.tv - rhs.tv }; }
+	Duration ?-?( Time lhs, Time rhs ) { return (Duration)@{ lhs.tn - rhs.tn }; }
+	Time ?-?( Time lhs, Duration rhs ) { return (Time)@{ lhs.tn - rhs.tn }; }
 	Time ?-=?( Time & lhs, Duration rhs ) { lhs = lhs - rhs; return lhs; }
-	bool ?==?( Time lhs, Time rhs ) { return lhs.tv == rhs.tv; }
-	bool ?!=?( Time lhs, Time rhs ) { return lhs.tv != rhs.tv; }
-	bool ?<?( Time lhs, Time rhs ) { return lhs.tv < rhs.tv; }
-	bool ?<=?( Time lhs, Time rhs ) { return lhs.tv <= rhs.tv; }
-	bool ?>?( Time lhs, Time rhs ) { return lhs.tv > rhs.tv; }
-	bool ?>=?( Time lhs, Time rhs ) { return lhs.tv >= rhs.tv; }
+	bool ?==?( Time lhs, Time rhs ) { return lhs.tn == rhs.tn; }
+	bool ?!=?( Time lhs, Time rhs ) { return lhs.tn != rhs.tn; }
+	bool ?<?( Time lhs, Time rhs ) { return lhs.tn < rhs.tn; }
+	bool ?<=?( Time lhs, Time rhs ) { return lhs.tn <= rhs.tn; }
+	bool ?>?( Time lhs, Time rhs ) { return lhs.tn > rhs.tn; }
+	bool ?>=?( Time lhs, Time rhs ) { return lhs.tn >= rhs.tn; }
+
+	int64_t ?`ns( Time t ) { return t.tn; }
 } // distribution
 
@@ -189,11 +191,11 @@
 } // dmy
 
-size_t strftime( char * buf, size_t size, const char * fmt, Time time );
+size_t strftime( char buf[], size_t size, const char fmt[], Time time );
 
 //------------------------- timeval (cont) -------------------------
 
 static inline void ?{}( timeval & t, Time time ) with( t, time ) {
-	tv_sec = tv / TIMEGRAN;								// seconds
-	tv_usec = tv % TIMEGRAN / (TIMEGRAN / 1_000_000LL);	// microseconds
+	tv_sec = tn / TIMEGRAN;								// seconds
+	tv_usec = tn % TIMEGRAN / (TIMEGRAN / 1_000_000LL);	// microseconds
 } // ?{}
 
@@ -201,6 +203,6 @@
 
 static inline void ?{}( timespec & t, Time time ) with( t, time ) {
-	tv_sec = tv / TIMEGRAN;								// seconds
-	tv_nsec = tv % TIMEGRAN;							// nanoseconds
+	tv_sec = tn / TIMEGRAN;								// seconds
+	tv_nsec = tn % TIMEGRAN;							// nanoseconds
 } // ?{}
 
Index: libcfa/src/time_t.hfa
===================================================================
--- libcfa/src/time_t.hfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ libcfa/src/time_t.hfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Tue Apr 10 14:42:03 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Apr 13 07:51:47 2018
-// Update Count     : 6
+// Last Modified On : Sun Jan  5 08:22:46 2020
+// Update Count     : 7
 //
 
@@ -20,9 +20,9 @@
 
 struct Duration {										// private
-	int64_t tv;											// nanoseconds
+	int64_t tn;											// nanoseconds
 }; // Duration
 
-static inline void ?{}( Duration & dur ) with( dur ) { tv = 0; }
-static inline void ?{}( Duration & dur, __attribute__((unused)) zero_t ) with( dur ) { tv = 0; }
+static inline void ?{}( Duration & dur ) with( dur ) { tn = 0; }
+static inline void ?{}( Duration & dur, __attribute__((unused)) zero_t ) with( dur ) { tn = 0; }
 
 
@@ -30,9 +30,9 @@
 
 struct Time {											// private
-	uint64_t tv;										// nanoseconds since UNIX epoch
+	uint64_t tn;										// nanoseconds since UNIX epoch
 }; // Time
 
-static inline void ?{}( Time & time ) with( time ) { tv = 0; }
-static inline void ?{}( Time & time, __attribute__((unused)) zero_t ) with( time ) { tv = 0; }
+static inline void ?{}( Time & time ) with( time ) { tn = 0; }
+static inline void ?{}( Time & time, __attribute__((unused)) zero_t ) with( time ) { tn = 0; }
 
 // Local Variables: //
Index: longrun_tests/Makefile.in
===================================================================
--- longrun_tests/Makefile.in	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ longrun_tests/Makefile.in	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -486,6 +486,5 @@
 LTCFACOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=compile $(CFACC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(CFAFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(AM_CFLAGS) $(CFAFLAGS) $(CFLAGS)
 
 AM_V_CFA = $(am__v_CFA_@AM_V@)
@@ -493,12 +492,4 @@
 am__v_CFA_0 = @echo "  CFA     " $@;
 am__v_CFA_1 = 
-AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
-am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
-am__v_JAVAC_0 = @echo "  JAVAC   " $@;
-am__v_JAVAC_1 = 
-AM_V_GOC = $(am__v_GOC_@AM_V@)
-am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
-am__v_GOC_0 = @echo "  GOC     " $@;
-am__v_GOC_1 = 
 UPPCC = u++
 UPPCOMPILE = $(UPPCC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_UPPFLAGS) $(UPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -507,4 +498,20 @@
 am__v_UPP_0 = @echo "  UPP     " $@;
 am__v_UPP_1 = 
+AM_V_GOC = $(am__v_GOC_@AM_V@)
+am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
+am__v_GOC_0 = @echo "  GOC     " $@;
+am__v_GOC_1 = 
+AM_V_RUST = $(am__v_RUST_@AM_V@)
+am__v_RUST_ = $(am__v_RUST_@AM_DEFAULT_V@)
+am__v_RUST_0 = @echo "  RUST     " $@;
+am__v_RUST_1 = 
+AM_V_NODEJS = $(am__v_NODEJS_@AM_V@)
+am__v_NODEJS_ = $(am__v_NODEJS_@AM_DEFAULT_V@)
+am__v_NODEJS_0 = @echo "  NODEJS     " $@;
+am__v_NODEJS_1 = 
+AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
+am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
+am__v_JAVAC_0 = @echo "  JAVAC   " $@;
+am__v_JAVAC_1 = 
 repeats = 10
 max_time = 600
Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/AST/Convert.cpp	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Thu May 09 15::37::05 2019
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 25 22:21:46 2019
-// Update Count     : 13
+// Last Modified On : Wed Dec 11 21:39:32 2019
+// Update Count     : 33
 //
 
@@ -245,5 +245,5 @@
 		auto decl = new StructDecl(
 			node->name,
-			node->kind,
+			(AggregateDecl::Aggregate)node->kind,
 			get<Attribute>().acceptL( node->attributes ),
 			LinkageSpec::Spec( node->linkage.val )
@@ -675,19 +675,6 @@
 
 	const ast::Expr * visit( const ast::KeywordCastExpr * node ) override final {
-		KeywordCastExpr::Target castTarget = KeywordCastExpr::NUMBER_OF_TARGETS;
-		switch (node->target) {
-			case ast::KeywordCastExpr::Coroutine:
-				castTarget = KeywordCastExpr::Coroutine;
-				break;
-			case ast::KeywordCastExpr::Thread:
-				castTarget = KeywordCastExpr::Thread;
-				break;
-			case ast::KeywordCastExpr::Monitor:
-				castTarget = KeywordCastExpr::Monitor;
-				break;
-			default:
-				break;
-		}
-		assert ( castTarget < KeywordCastExpr::NUMBER_OF_TARGETS );
+		AggregateDecl::Aggregate castTarget = (AggregateDecl::Aggregate)node->target;
+		assert( AggregateDecl::Generator <= castTarget && castTarget <= AggregateDecl::Thread );
 		auto expr = visitBaseExpr( node,
 			new KeywordCastExpr(
@@ -887,5 +874,5 @@
 		auto expr = visitBaseExpr( node,
 			new AsmExpr(
-				get<Expression>().accept1(node->inout),
+				new std::string(node->inout),
 				get<Expression>().accept1(node->constraint),
 				get<Expression>().accept1(node->operand)
@@ -1236,5 +1223,5 @@
 				cv( node ),
 				node->name,
-				node->kind == ast::TypeVar::Ftype,
+				node->kind == ast::TypeDecl::Ftype,
 				get<Attribute>().acceptL( node->attributes )
 			};
@@ -1504,5 +1491,5 @@
 			old->location,
 			old->name,
-			old->kind,
+			(ast::AggregateDecl::Aggregate)old->kind,
 			GET_ACCEPT_V(attributes, Attribute),
 			{ old->linkage.val }
@@ -1591,5 +1578,5 @@
 			{ old->storageClasses.val },
 			GET_ACCEPT_1(base, Type),
-			(ast::TypeVar::Kind)(unsigned)old->kind,
+			(ast::TypeDecl::Kind)(unsigned)old->kind,
 			old->sized,
 			GET_ACCEPT_1(init, Type)
@@ -2045,20 +2032,7 @@
 	}
 
-	virtual void visit( const KeywordCastExpr * old) override final {
-		ast::KeywordCastExpr::Target castTarget = ast::KeywordCastExpr::NUMBER_OF_TARGETS;
-		switch (old->target) {
-			case KeywordCastExpr::Coroutine:
-				castTarget = ast::KeywordCastExpr::Coroutine;
-				break;
-			case KeywordCastExpr::Thread:
-				castTarget = ast::KeywordCastExpr::Thread;
-				break;
-			case KeywordCastExpr::Monitor:
-				castTarget = ast::KeywordCastExpr::Monitor;
-				break;
-			default:
-				break;
-		}
-		assert ( castTarget < ast::KeywordCastExpr::NUMBER_OF_TARGETS );
+	virtual void visit( const KeywordCastExpr * old ) override final {
+		ast::AggregateDecl::Aggregate castTarget = (ast::AggregateDecl::Aggregate)old->target;
+		assert( ast::AggregateDecl::Generator <= castTarget && castTarget <= ast::AggregateDecl::Thread );
 		this->node = visitBaseExpr( old,
 			new ast::KeywordCastExpr(
@@ -2258,5 +2232,5 @@
 			new ast::AsmExpr(
 				old->location,
-				GET_ACCEPT_1(inout, Expr),
+				old->inout,
 				GET_ACCEPT_1(constraint, Expr),
 				GET_ACCEPT_1(operand, Expr)
@@ -2587,5 +2561,5 @@
 			ty = new ast::TypeInstType{
 				old->name,
-				old->isFtype ? ast::TypeVar::Ftype : ast::TypeVar::Dtype,
+				old->isFtype ? ast::TypeDecl::Ftype : ast::TypeDecl::Dtype,
 				cv( old ),
 				GET_ACCEPT_V( attributes, Attribute )
Index: src/AST/Decl.cpp
===================================================================
--- src/AST/Decl.cpp	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/AST/Decl.cpp	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Aaron B. Moss
 // Created On       : Thu May 9 10:00:00 2019
-// Last Modified By : Aaron B. Moss
-// Last Modified On : Thu May 9 10:00:00 2019
-// Update Count     : 1
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Dec 13 16:23:15 2019
+// Update Count     : 20
 //
 
@@ -18,5 +18,4 @@
 #include <cassert>             // for assert, strict_dynamic_cast
 #include <iostream>
-#include <string>
 #include <unordered_map>
 
@@ -27,5 +26,4 @@
 #include "Node.hpp"            // for readonly
 #include "Type.hpp"            // for readonly
-#include "Parser/ParseNode.h"  // for DeclarationNode
 
 namespace ast {
@@ -56,16 +54,15 @@
 // --- TypeDecl
 
-std::string TypeDecl::typeString() const {
-	static const std::string kindNames[] = { "object type", "function type", "tuple type" };
-	assertf( sizeof(kindNames)/sizeof(kindNames[0]) == DeclarationNode::NoTypeClass-1,
-		"typeString: kindNames is out of sync." );
-	assertf( kind < sizeof(kindNames)/sizeof(kindNames[0]), "TypeDecl's kind is out of bounds." );
-	return (sized ? "sized " : "") + kindNames[ kind ];
+const char * TypeDecl::typeString() const {
+	static const char * kindNames[] = { "sized data type", "sized object type", "sized function type", "sized tuple type" };
+	static_assert( sizeof(kindNames)/sizeof(kindNames[0]) == TypeDecl::NUMBER_OF_KINDS, "typeString: kindNames is out of sync." );
+	assertf( kind < TypeDecl::NUMBER_OF_KINDS, "TypeDecl kind is out of bounds." );
+	return sized ? kindNames[ kind ] : &kindNames[ kind ][ sizeof("sized") ]; // sizeof includes '\0'
 }
 
-std::string TypeDecl::genTypeString() const {
-	static const std::string kindNames[] = { "dtype", "ftype", "ttype" };
-	assertf( sizeof(kindNames)/sizeof(kindNames[0]) == DeclarationNode::NoTypeClass-1, "genTypeString: kindNames is out of sync." );
-	assertf( kind < sizeof(kindNames)/sizeof(kindNames[0]), "TypeDecl's kind is out of bounds." );
+const char * TypeDecl::genTypeString() const {
+	static const char * kindNames[] = { "dtype", "otype", "ftype", "ttype" };
+	static_assert( sizeof(kindNames)/sizeof(kindNames[0]) == TypeDecl::NUMBER_OF_KINDS, "genTypeString: kindNames is out of sync." );
+	assertf( kind < TypeDecl::NUMBER_OF_KINDS, "TypeDecl kind is out of bounds." );
 	return kindNames[ kind ];
 }
@@ -73,4 +70,13 @@
 std::ostream & operator<< ( std::ostream & out, const TypeDecl::Data & data ) {
 	return out << data.kind << ", " << data.isComplete;
+}
+
+// --- AggregateDecl
+
+// These must harmonize with the corresponding AggregateDecl::Aggregate enumerations.
+static const char * aggregateNames[] = { "struct", "union", "enum", "exception", "trait", "generator", "coroutine", "monitor", "thread", "NoAggregateName" };
+
+const char * AggregateDecl::aggrString( AggregateDecl::Aggregate aggr ) {
+	return aggregateNames[aggr];
 }
 
Index: src/AST/Decl.hpp
===================================================================
--- src/AST/Decl.hpp	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/AST/Decl.hpp	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Aaron B. Moss
 // Created On       : Thu May 9 10:00:00 2019
-// Last Modified By : Aaron B. Moss
-// Last Modified On : Thu May 9 10:00:00 2019
-// Update Count     : 1
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Dec 13 17:38:33 2019
+// Update Count     : 29
 //
 
@@ -20,4 +20,5 @@
 #include <unordered_map>
 #include <vector>
+#include <algorithm>
 
 #include "FunctionSpec.hpp"
@@ -27,7 +28,7 @@
 #include "ParseNode.hpp"
 #include "StorageClasses.hpp"
-#include "TypeVar.hpp"
 #include "Visitor.hpp"
-#include "Parser/ParseNode.h"  // for DeclarationNode::Aggregate
+#include "Common/utility.h"
+#include "Common/SemanticError.h"						// error_str
 
 // Must be included in *all* AST classes; should be #undef'd at the end of the file
@@ -125,5 +126,5 @@
 	std::vector< ptr<Expr> > withExprs;
 
-	FunctionDecl( const CodeLocation & loc, const std::string &name, FunctionType * type,
+	FunctionDecl( const CodeLocation & loc, const std::string & name, FunctionType * type,
 		CompoundStmt * stmts, Storage::Classes storage = {}, Linkage::Spec linkage = Linkage::C,
 		std::vector<ptr<Attribute>>&& attrs = {}, Function::Specs fs = {})
@@ -136,5 +137,5 @@
 	bool has_body() const { return stmts; }
 
-	const DeclWithType * accept( Visitor &v ) const override { return v.visit( this ); }
+	const DeclWithType * accept( Visitor & v ) const override { return v.visit( this ); }
 private:
 	FunctionDecl * clone() const override { return new FunctionDecl( *this ); }
@@ -154,5 +155,5 @@
 
 	/// Produces a name for the kind of alias
-	virtual std::string typeString() const = 0;
+	virtual const char * typeString() const = 0;
 
 private:
@@ -163,6 +164,8 @@
 /// Cforall type variable: `dtype T`
 class TypeDecl final : public NamedTypeDecl {
-public:
-	TypeVar::Kind kind;
+  public:
+	enum Kind { Dtype, Otype, Ftype, Ttype, NUMBER_OF_KINDS };
+
+	Kind kind;
 	bool sized;
 	ptr<Type> init;
@@ -170,27 +173,25 @@
 	/// Data extracted from a type decl
 	struct Data {
-		TypeVar::Kind kind;
+		Kind kind;
 		bool isComplete;
 
-		Data() : kind( (TypeVar::Kind)-1 ), isComplete( false ) {}
+		Data() : kind( NUMBER_OF_KINDS ), isComplete( false ) {}
 		Data( const TypeDecl * d ) : kind( d->kind ), isComplete( d->sized ) {}
-		Data( TypeVar::Kind k, bool c ) : kind( k ), isComplete( c ) {}
+		Data( Kind k, bool c ) : kind( k ), isComplete( c ) {}
 		Data( const Data & d1, const Data & d2 )
-		: kind( d1.kind ), isComplete( d1.isComplete || d2.isComplete ) {}
-
-		bool operator== ( const Data & o ) const {
-			return kind == o.kind && isComplete == o.isComplete;
-		}
-		bool operator!= ( const Data & o ) const { return !(*this == o); }
+			: kind( d1.kind ), isComplete( d1.isComplete || d2.isComplete ) {}
+
+		bool operator==( const Data & o ) const { return kind == o.kind && isComplete == o.isComplete; }
+		bool operator!=( const Data & o ) const { return !(*this == o); }
 	};
 
-	TypeDecl( const CodeLocation& loc, const std::string& name, Storage::Classes storage, Type* b,
-		TypeVar::Kind k, bool s, Type* i = nullptr )
-	: NamedTypeDecl( loc, name, storage, b ), kind( k ), sized( k == TypeVar::Ttype || s ),
-	  init( i ) {}
-
-	std::string typeString() const override;
+	TypeDecl( const CodeLocation & loc, const std::string & name, Storage::Classes storage, Type * b,
+			  Kind k, bool s, Type * i = nullptr )
+		: NamedTypeDecl( loc, name, storage, b ), kind( k ), sized( k == Ttype || s ),
+		init( i ) {}
+
+	const char * typeString() const override;
 	/// Produces a name for generated code
-	std::string genTypeString() const;
+	const char * genTypeString() const;
 
 	/// convenience accessor to match Type::isComplete()
@@ -198,5 +199,5 @@
 
 	const Decl * accept( Visitor & v ) const override { return v.visit( this ); }
-private:
+  private:
 	TypeDecl * clone() const override { return new TypeDecl{ *this }; }
 	MUTATE_FRIEND
@@ -212,5 +213,5 @@
 	: NamedTypeDecl( loc, name, storage, b, spec ) {}
 
-	std::string typeString() const override { return "typedef"; }
+	const char * typeString() const override { return "typedef"; }
 
 	const Decl * accept( Visitor & v ) const override { return v.visit( this ); }
@@ -223,4 +224,7 @@
 class AggregateDecl : public Decl {
 public:
+	enum Aggregate { Struct, Union, Enum, Exception, Trait, Generator, Coroutine, Monitor, Thread, NoAggregate };
+	static const char * aggrString( Aggregate aggr );
+
 	std::vector<ptr<Decl>> members;
 	std::vector<ptr<TypeDecl>> params;
@@ -237,5 +241,5 @@
 
 	/// Produces a name for the kind of aggregate
-	virtual std::string typeString() const = 0;
+	virtual const char * typeString() const = 0;
 
 private:
@@ -247,18 +251,18 @@
 class StructDecl final : public AggregateDecl {
 public:
-	DeclarationNode::Aggregate kind;
+	Aggregate kind;
 
 	StructDecl( const CodeLocation& loc, const std::string& name,
-		DeclarationNode::Aggregate kind = DeclarationNode::Struct,
+		Aggregate kind = Struct,
 		std::vector<ptr<Attribute>>&& attrs = {}, Linkage::Spec linkage = Linkage::Cforall )
 	: AggregateDecl( loc, name, std::move(attrs), linkage ), kind( kind ) {}
 
-	bool is_coroutine() { return kind == DeclarationNode::Coroutine; }
-	bool is_monitor() { return kind == DeclarationNode::Monitor; }
-	bool is_thread() { return kind == DeclarationNode::Thread; }
-
-	const Decl * accept( Visitor & v ) const override { return v.visit( this ); }
-
-	std::string typeString() const override { return "struct"; }
+	bool is_coroutine() { return kind == Coroutine; }
+	bool is_monitor() { return kind == Monitor; }
+	bool is_thread() { return kind == Thread; }
+
+	const Decl * accept( Visitor & v ) const override { return v.visit( this ); }
+
+	const char * typeString() const override { return aggrString( kind ); }
 
 private:
@@ -276,5 +280,5 @@
 	const Decl * accept( Visitor& v ) const override { return v.visit( this ); }
 
-	std::string typeString() const override { return "union"; }
+	const char * typeString() const override { return aggrString( Union ); }
 
 private:
@@ -295,5 +299,5 @@
 	const Decl * accept( Visitor & v ) const override { return v.visit( this ); }
 
-	std::string typeString() const override { return "enum"; }
+	const char * typeString() const override { return aggrString( Enum ); }
 
 private:
@@ -314,5 +318,5 @@
 	const Decl * accept( Visitor & v ) const override { return v.visit( this ); }
 
-	std::string typeString() const override { return "trait"; }
+	const char * typeString() const override { return "trait"; }
 
 private:
@@ -340,10 +344,10 @@
 	ptr<AsmStmt> stmt;
 
-	AsmDecl( const CodeLocation & loc, AsmStmt *stmt )
+	AsmDecl( const CodeLocation & loc, AsmStmt * stmt )
 	: Decl( loc, "", {}, {} ), stmt(stmt) {}
 
-	const AsmDecl * accept( Visitor &v ) const override { return v.visit( this ); }
-private:
-	AsmDecl *clone() const override { return new AsmDecl( *this ); }
+	const AsmDecl * accept( Visitor & v ) const override { return v.visit( this ); }
+private:
+	AsmDecl * clone() const override { return new AsmDecl( *this ); }
 	MUTATE_FRIEND
 };
@@ -357,5 +361,5 @@
 	: Decl( loc, "", {}, {} ), cond( condition ), msg( msg ) {}
 
-	const StaticAssertDecl * accept( Visitor &v ) const override { return v.visit( this ); }
+	const StaticAssertDecl * accept( Visitor & v ) const override { return v.visit( this ); }
 private:
 	StaticAssertDecl * clone() const override { return new StaticAssertDecl( *this ); }
Index: src/AST/Expr.cpp
===================================================================
--- src/AST/Expr.cpp	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/AST/Expr.cpp	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Aaron B. Moss
 // Created On       : Wed May 15 17:00:00 2019
-// Last Modified By : Andrew Beach
+// Last Modified By : Peter A. Buhr
 // Created On       : Thr Jun 13 13:38:00 2019
-// Update Count     : 2
+// Update Count     : 6
 //
 
@@ -141,13 +141,6 @@
 // --- KeywordCastExpr
 
-const std::string & KeywordCastExpr::targetString() const {
-	static const std::string targetStrs[] = {
-		"coroutine", "thread", "monitor"
-	};
-	static_assert(
-		(sizeof(targetStrs) / sizeof(targetStrs[0])) == ((unsigned long)NUMBER_OF_TARGETS),
-		"Each KeywordCastExpr::Target should have a corresponding string representation"
-	);
-	return targetStrs[(unsigned long)target];
+const char * KeywordCastExpr::targetString() const {
+	return AggregateDecl::aggrString( target );
 }
 
Index: src/AST/Expr.hpp
===================================================================
--- src/AST/Expr.hpp	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/AST/Expr.hpp	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Aaron B. Moss
 // Created On       : Fri May 10 10:30:00 2019
-// Last Modified By : Aaron B. Moss
+// Last Modified By : Peter A. Buhr
 // Created On       : Fri May 10 10:30:00 2019
-// Update Count     : 1
+// Update Count     : 7
 //
 
@@ -26,4 +26,5 @@
 #include "Fwd.hpp"        // for UniqueId
 #include "Label.hpp"
+#include "Decl.hpp"
 #include "ParseNode.hpp"
 #include "Visitor.hpp"
@@ -300,11 +301,11 @@
 public:
 	ptr<Expr> arg;
-	enum Target { Coroutine, Thread, Monitor, NUMBER_OF_TARGETS } target;
-
-	KeywordCastExpr( const CodeLocation & loc, const Expr * a, Target t )
+	ast::AggregateDecl::Aggregate target;
+
+	KeywordCastExpr( const CodeLocation & loc, const Expr * a, ast::AggregateDecl::Aggregate t )
 	: Expr( loc ), arg( a ), target( t ) {}
 
 	/// Get a name for the target type
-	const std::string& targetString() const;
+	const char * targetString() const;
 
 	const Expr * accept( Visitor & v ) const override { return v.visit( this ); }
@@ -556,9 +557,9 @@
 class AsmExpr final : public Expr {
 public:
-	ptr<Expr> inout;
+	std::string inout;
 	ptr<Expr> constraint;
 	ptr<Expr> operand;
 
-	AsmExpr( const CodeLocation & loc, const Expr * io, const Expr * con, const Expr * op )
+	AsmExpr( const CodeLocation & loc, const std::string & io, const Expr * con, const Expr * op )
 	: Expr( loc ), inout( io ), constraint( con ), operand( op ) {}
 
Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/AST/Pass.impl.hpp	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -1300,5 +1300,4 @@
 			maybe_accept( node, &AsmExpr::result );
 		}
-		maybe_accept( node, &AsmExpr::inout      );
 		maybe_accept( node, &AsmExpr::constraint );
 		maybe_accept( node, &AsmExpr::operand    );
Index: src/AST/Print.cpp
===================================================================
--- src/AST/Print.cpp	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/AST/Print.cpp	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -1011,5 +1011,5 @@
 		os << "Asm Expression:" << endl;
 		++indent;
-		if ( node->inout ) node->inout->accept( *this );
+		if ( !node->inout.empty() ) os << "[" << node->inout << "] ";
 		if ( node->constraint ) node->constraint->accept( *this );
 		if ( node->operand ) node->operand->accept( *this );
@@ -1359,5 +1359,5 @@
 		preprint( node );
 		os << "instance of type " << node->name
-		   << " (" << (node->kind == ast::TypeVar::Ftype ? "" : "not ") << "function type)";
+		   << " (" << (node->kind == ast::TypeDecl::Ftype ? "" : "not ") << "function type)";
 		print( node->params );
 
Index: src/AST/Type.cpp
===================================================================
--- src/AST/Type.cpp	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/AST/Type.cpp	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Aaron B. Moss
 // Created On       : Mon May 13 15:00:00 2019
-// Last Modified By : Aaron B. Moss
-// Last Modified On : Mon May 13 15:00:00 2019
-// Update Count     : 1
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sun Dec 15 16:56:28 2019
+// Update Count     : 4
 //
 
@@ -48,5 +48,7 @@
 // --- BasicType
 
-const char *BasicType::typeNames[] = {
+// GENERATED START, DO NOT EDIT
+// GENERATED BY BasicTypes-gen.cc
+const char * BasicType::typeNames[] = {
 	"_Bool",
 	"char",
@@ -86,8 +88,5 @@
 	"_Float128x _Complex",
 };
-static_assert(
-	sizeof(BasicType::typeNames)/sizeof(BasicType::typeNames[0]) == BasicType::NUMBER_OF_BASIC_TYPES,
-	"Each basic type name should have a corresponding kind enum value"
-);
+// GENERATED END
 
 // --- FunctionType
Index: src/AST/Type.hpp
===================================================================
--- src/AST/Type.hpp	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/AST/Type.hpp	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Aaron B. Moss
 // Created On       : Thu May 9 10:00:00 2019
-// Last Modified By : Aaron B. Moss
-// Last Modified On : Thu May 9 10:00:00 2019
-// Update Count     : 1
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Dec 11 21:56:46 2019
+// Update Count     : 5
 //
 
@@ -26,5 +26,4 @@
 #include "Fwd.hpp"
 #include "Node.hpp"          // for Node, ptr, ptr_base
-#include "TypeVar.hpp"
 #include "Visitor.hpp"
 
@@ -423,10 +422,10 @@
 public:
 	readonly<TypeDecl> base;
-	TypeVar::Kind kind;
+	TypeDecl::Kind kind;
 
 	TypeInstType( const std::string& n, const TypeDecl * b, CV::Qualifiers q = {},
 		std::vector<ptr<Attribute>> && as = {} )
 	: ReferenceToType( n, q, std::move(as) ), base( b ), kind( b->kind ) {}
-	TypeInstType( const std::string& n, TypeVar::Kind k, CV::Qualifiers q = {},
+	TypeInstType( const std::string& n, TypeDecl::Kind k, CV::Qualifiers q = {},
 		std::vector<ptr<Attribute>> && as = {} )
 	: ReferenceToType( n, q, std::move(as) ), base(), kind( k ) {}
Index: src/AST/TypeEnvironment.cpp
===================================================================
--- src/AST/TypeEnvironment.cpp	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/AST/TypeEnvironment.cpp	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Aaron B. Moss
 // Created On       : Wed May 29 11:00:00 2019
-// Last Modified By : Aaron B. Moss
-// Last Modified On : Wed May 29 11:00:00 2019
-// Update Count     : 1
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Dec 11 21:49:13 2019
+// Update Count     : 4
 //
 
@@ -240,5 +240,5 @@
 		return true;
 	} else if ( auto typeInst = dynamic_cast< const TypeInstType * >( type ) ) {
-		return typeInst->kind == TypeVar::Ftype;
+		return typeInst->kind == TypeDecl::Ftype;
 	} else return false;
 }
@@ -248,5 +248,5 @@
 	bool tyVarCompatible( const TypeDecl::Data & data, const Type * type ) {
 		switch ( data.kind ) {
-		  case TypeVar::Dtype:
+		  case TypeDecl::Dtype:
 			// to bind to an object type variable, the type must not be a function type.
 			// if the type variable is specified to be a complete type then the incoming
@@ -254,7 +254,7 @@
 			// xxx - should this also check that type is not a tuple type and that it's not a ttype?
 			return ! isFtype( type ) && ( ! data.isComplete || type->isComplete() );
-		  case TypeVar::Ftype:
+		  case TypeDecl::Ftype:
 			return isFtype( type );
-		  case TypeVar::Ttype:
+		  case TypeDecl::Ttype:
 			// ttype unifies with any tuple type
 			return dynamic_cast< const TupleType * >( type ) || Tuples::isTtype( type );
Index: src/AST/TypeEnvironment.hpp
===================================================================
--- src/AST/TypeEnvironment.hpp	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/AST/TypeEnvironment.hpp	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Aaron B. Moss
 // Created On       : Wed May 29 11:00:00 2019
-// Last Modified By : Aaron B. Moss
-// Last Modified On : Wed May 29 11:00:00 2019
-// Update Count     : 1
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Dec 11 21:55:54 2019
+// Update Count     : 3
 //
 
@@ -28,5 +28,4 @@
 #include "Type.hpp"
 #include "TypeSubstitution.hpp"
-#include "TypeVar.hpp"
 #include "Common/Indenter.h"
 #include "ResolvExpr/WidenMode.h"
@@ -107,5 +106,5 @@
 	/// Singleton class constructor from substitution
 	EqvClass( const std::string & v, const Type * b )
-	: vars{ v }, bound( b ), allowWidening( false ), data( TypeVar::Dtype, false ) {}
+	: vars{ v }, bound( b ), allowWidening( false ), data( TypeDecl::Dtype, false ) {}
 
 	/// Single-var constructor (strips qualifiers from bound type)
Index: c/AST/TypeVar.hpp
===================================================================
--- src/AST/TypeVar.hpp	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ 	(revision )
@@ -1,34 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// TypeVar.hpp --
-//
-// Author           : Aaron B. Moss
-// Created On       : Wed May 15 15:00:00 2019
-// Last Modified By : Aaron B. Moss
-// Last Modified On : Wed May 15 15:00:00 2019
-// Update Count     : 1
-//
-
-#pragma once
-
-namespace ast {
-
-namespace TypeVar {
-
-/// type variable variants.
-/// `otype` is treated as a constrainted `dtype`
-enum Kind { Dtype, Ftype, Ttype, NUMBER_OF_KINDS };
-
-}
-
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: src/AST/module.mk
===================================================================
--- src/AST/module.mk	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/AST/module.mk	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,7 +10,7 @@
 ## Author           : Thierry Delisle
 ## Created On       : Thu May 09 16:05:36 2019
-## Last Modified By :
-## Last Modified On :
-## Update Count     :
+## Last Modified By : Peter A. Buhr
+## Last Modified On : Sat Dec 14 07:29:10 2019
+## Update Count     : 3
 ###############################################################################
 
@@ -34,6 +34,4 @@
 	AST/TypeSubstitution.cpp
 
-
-
 SRC += $(SRC_AST)
 SRCDEMANGLE += $(SRC_AST)
Index: src/BasicTypes-gen.cc
===================================================================
--- src/BasicTypes-gen.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/BasicTypes-gen.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -273,8 +273,8 @@
 
 
-	#define Type TOP_SRCDIR "src/SynTree/Type.h"
-	resetInput( file, Type, buffer, code, str );
-
-	if ( (start = str.find( STARTMK )) == string::npos ) Abort( "start", Type );
+	#define TypeH TOP_SRCDIR "src/SynTree/Type.h"
+	resetInput( file, TypeH, buffer, code, str );
+
+	if ( (start = str.find( STARTMK )) == string::npos ) Abort( "start", TypeH );
 	start += sizeof( STARTMK );							// includes newline
 	code << str.substr( 0, start );
@@ -289,16 +289,37 @@
 	code << "\t";										// indentation for end marker
 
-	if ( (start = str.find( ENDMK, start + 1 )) == string::npos ) Abort( "end", Type );
-	code << str.substr( start );
-
-	output( file, Type, code );
+	if ( (start = str.find( ENDMK, start + 1 )) == string::npos ) Abort( "end", TypeH );
+	code << str.substr( start );
+
+	output( file, TypeH, code );
+	// cout << code.str();
+
+
+	#define TypeC TOP_SRCDIR "src/SynTree/Type.cc"
+	resetInput( file, TypeC, buffer, code, str );
+
+	if ( (start = str.find( STARTMK )) == string::npos ) Abort( "start", TypeC );
+	start += sizeof( STARTMK );							// includes newline
+	code << str.substr( 0, start );
+
+	code << BYMK << endl;
+	code << "const char * BasicType::typeNames[] = {" << endl;
+	for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) {
+		code << "\t\"" << graph[r].type << "\"," << endl;
+	} // for	
+	code << "};" << endl;
+
+	if ( (start = str.find( ENDMK, start + 1 )) == string::npos ) Abort( "end", TypeC );
+	code << str.substr( start );
+
+	output( file, TypeC, code );
 	// cout << code.str();
 
 
 	// TEMPORARY DURING CHANGE OVER
-	#define TypeAST TOP_SRCDIR "src/AST/Type.hpp"
-	resetInput( file, TypeAST, buffer, code, str );
-
-	if ( (start = str.find( STARTMK )) == string::npos ) Abort( "start", TypeAST );
+	#define TypeH_AST TOP_SRCDIR "src/AST/Type.hpp"
+	resetInput( file, TypeH_AST, buffer, code, str );
+
+	if ( (start = str.find( STARTMK )) == string::npos ) Abort( "start", TypeH_AST );
 	start += sizeof( STARTMK );							// includes newline
 	code << str.substr( 0, start );
@@ -313,8 +334,29 @@
 	code << "\t";										// indentation for end marker
 
-	if ( (start = str.find( ENDMK, start + 1 )) == string::npos ) Abort( "end", TypeAST );
-	code << str.substr( start );
-
-	output( file, TypeAST, code );
+	if ( (start = str.find( ENDMK, start + 1 )) == string::npos ) Abort( "end", TypeH_AST );
+	code << str.substr( start );
+
+	output( file, TypeH_AST, code );
+	// cout << code.str();
+
+
+	#define TypeC_AST TOP_SRCDIR "src/AST/Type.cpp"
+	resetInput( file, TypeC_AST, buffer, code, str );
+
+	if ( (start = str.find( STARTMK )) == string::npos ) Abort( "start", TypeC_AST );
+	start += sizeof( STARTMK );							// includes newline
+	code << str.substr( 0, start );
+
+	code << BYMK << endl;
+	code << "const char * BasicType::typeNames[] = {" << endl;
+	for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) {
+		code << "\t\"" << graph[r].type << "\"," << endl;
+	} // for	
+	code << "};" << endl;
+
+	if ( (start = str.find( ENDMK, start + 1 )) == string::npos ) Abort( "end", TypeC_AST );
+	code << str.substr( start );
+
+	output( file, TypeC_AST, code );
 	// cout << code.str();
 
Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/CodeGen/CodeGenerator.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Oct 19 19:30:38 2019
-// Update Count     : 506
+// Last Modified On : Fri Dec 13 23:13:28 2019
+// Update Count     : 508
 //
 #include "CodeGenerator.h"
@@ -23,5 +23,5 @@
 #include "InitTweak/InitTweak.h"     // for getPointerBase
 #include "OperatorTable.h"           // for OperatorInfo, operatorLookup
-#include "Parser/LinkageSpec.h"      // for Spec, Intrinsic
+#include "SynTree/LinkageSpec.h"     // for Spec, Intrinsic
 #include "SynTree/Attribute.h"       // for Attribute
 #include "SynTree/BaseSyntaxNode.h"  // for BaseSyntaxNode
@@ -786,12 +786,12 @@
 
 	void CodeGenerator::postvisit( AsmExpr * asmExpr ) {
-		if ( asmExpr->get_inout() ) {
+		if ( !asmExpr->inout.empty() ) {
 			output << "[ ";
-			asmExpr->get_inout()->accept( *visitor );
+			output << asmExpr->inout;
 			output << " ] ";
 		} // if
-		asmExpr->get_constraint()->accept( *visitor );
+		asmExpr->constraint->accept( *visitor );
 		output << " ( ";
-		asmExpr->get_operand()->accept( *visitor );
+		asmExpr->operand->accept( *visitor );
 		output << " )";
 	}
Index: src/CodeGen/FixMain.h
===================================================================
--- src/CodeGen/FixMain.h	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/CodeGen/FixMain.h	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Thr Jan 12 14:11:09 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 21 22:16:59 2017
-// Update Count     : 1
+// Last Modified On : Fri Dec 13 23:12:21 2019
+// Update Count     : 3
 //
 
@@ -19,5 +19,5 @@
 #include <memory>
 
-#include "Parser/LinkageSpec.h"
+#include "SynTree/LinkageSpec.h"
 
 class FunctionDecl;
Index: src/CodeGen/FixNames.cc
===================================================================
--- src/CodeGen/FixNames.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/CodeGen/FixNames.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Wed Jun 28 15:26:00 2017
-// Update Count     : 20
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Dec 13 23:39:14 2019
+// Update Count     : 21
 //
 
@@ -22,6 +22,6 @@
 #include "Common/SemanticError.h"  // for SemanticError
 #include "FixMain.h"               // for FixMain
-#include "Parser/LinkageSpec.h"    // for Cforall, isMangled
 #include "SymTab/Mangler.h"        // for Mangler
+#include "SynTree/LinkageSpec.h"   // for Cforall, isMangled
 #include "SynTree/Constant.h"      // for Constant
 #include "SynTree/Declaration.h"   // for FunctionDecl, ObjectDecl, Declarat...
Index: src/CodeGen/Generate.cc
===================================================================
--- src/CodeGen/Generate.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/CodeGen/Generate.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Fri Aug 18 15:39:00 2017
-// Update Count     : 7
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Dec 13 23:38:56 2019
+// Update Count     : 8
 //
 #include "Generate.h"
@@ -22,5 +22,5 @@
 #include "GenType.h"                 // for genPrettyType
 #include "Common/PassVisitor.h"      // for PassVisitor
-#include "Parser/LinkageSpec.h"      // for isBuiltin, isGeneratable
+#include "SynTree/LinkageSpec.h"     // for isBuiltin, isGeneratable
 #include "SynTree/BaseSyntaxNode.h"  // for BaseSyntaxNode
 #include "SynTree/Declaration.h"     // for Declaration
Index: src/CodeGen/module.mk
===================================================================
--- src/CodeGen/module.mk	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/CodeGen/module.mk	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -11,6 +11,6 @@
 ## Created On       : Mon Jun  1 17:49:17 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Tue Jun  2 11:17:02 2015
-## Update Count     : 3
+## Last Modified On : Sat Dec 14 07:29:42 2019
+## Update Count     : 4
 ###############################################################################
 
@@ -24,5 +24,4 @@
 	CodeGen/OperatorTable.cc
 
-
 SRC += $(SRC_CODEGEN) CodeGen/Generate.cc CodeGen/FixNames.cc
 SRCDEMANGLE += $(SRC_CODEGEN)
Index: src/CodeTools/DeclStats.cc
===================================================================
--- src/CodeTools/DeclStats.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/CodeTools/DeclStats.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Aaron Moss
 // Created On       : Wed Jan 31 16:40:00 2016
-// Last Modified By : Aaron Moss
-// Last Modified On : Wed Jan 31 16:40:00 2016
-// Update Count     : 1
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Dec 13 23:39:33 2019
+// Update Count     : 2
 //
 
@@ -26,5 +26,5 @@
 #include "Common/VectorMap.h"      // for VectorMap
 #include "GenPoly/GenPoly.h"       // for hasPolyBase
-#include "Parser/LinkageSpec.h"    // for ::NoOfSpecs, Spec
+#include "SynTree/LinkageSpec.h"   // for ::NoOfSpecs, Spec
 #include "SynTree/Declaration.h"   // for FunctionDecl, TypeDecl, Declaration
 #include "SynTree/Expression.h"    // for UntypedExpr, Expression
Index: src/Common/Debug.h
===================================================================
--- src/Common/Debug.h	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/Common/Debug.h	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Rob Schluntz
 // Created On       : Fri Sep 1 11:09:14 2017
-// Last Modified By : Rob Schluntz
-// Last Modified On : Fri Sep 1 11:09:36 2017
-// Update Count     : 2
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Dec 13 23:39:42 2019
+// Update Count     : 3
 //
 
@@ -21,5 +21,5 @@
 
 #include "CodeGen/Generate.h"
-#include "Parser/LinkageSpec.h"
+#include "SynTree/LinkageSpec.h"
 #include "SynTree/Declaration.h"
 
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/Common/PassVisitor.impl.h	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -2452,5 +2452,4 @@
 
 	indexerScopedAccept( node->result    , *this );
-	maybeAccept_impl   ( node->inout     , *this );
 	maybeAccept_impl   ( node->constraint, *this );
 	maybeAccept_impl   ( node->operand   , *this );
@@ -2464,5 +2463,4 @@
 
 	indexerScopedAccept( node->result    , *this );
-	maybeAccept_impl   ( node->inout     , *this );
 	maybeAccept_impl   ( node->constraint, *this );
 	maybeAccept_impl   ( node->operand   , *this );
@@ -2477,5 +2475,4 @@
 	indexerScopedMutate( node->env       , *this );
 	indexerScopedMutate( node->result    , *this );
-	maybeMutate_impl   ( node->inout     , *this );
 	maybeMutate_impl   ( node->constraint, *this );
 	maybeMutate_impl   ( node->operand   , *this );
@@ -3305,5 +3302,5 @@
 	VISIT_START( node );
 
-	indexerAddStruct( node->name );
+	indexerAddUnion( node->name );
 
 	{
@@ -3320,5 +3317,5 @@
 	VISIT_START( node );
 
-	indexerAddStruct( node->name );
+	indexerAddUnion( node->name );
 
 	{
@@ -3335,5 +3332,5 @@
 	MUTATE_START( node );
 
-	indexerAddStruct( node->name );
+	indexerAddUnion( node->name );
 
 	{
Index: src/Common/SemanticError.cc
===================================================================
--- src/Common/SemanticError.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/Common/SemanticError.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -149,21 +149,27 @@
 // Helpers
 namespace ErrorHelpers {
+	Colors colors = Colors::Auto;
+
+	static inline bool with_colors() {
+		return colors == Colors::Auto ? isatty( STDERR_FILENO ) : bool(colors);
+	}
+
 	const std::string & error_str() {
-		static std::string str = isatty( STDERR_FILENO ) ? "\e[31merror:\e[39m " : "error: ";
+		static std::string str = with_colors() ? "\e[31merror:\e[39m " : "error: ";
 		return str;
 	}
 
 	const std::string & warning_str() {
-		static std::string str = isatty( STDERR_FILENO ) ? "\e[95mwarning:\e[39m " : "warning: ";
+		static std::string str = with_colors() ? "\e[95mwarning:\e[39m " : "warning: ";
 		return str;
 	}
 
 	const std::string & bold_ttycode() {
-		static std::string str = isatty( STDERR_FILENO ) ? "\e[1m" : "";
+		static std::string str = with_colors() ? "\e[1m" : "";
 		return str;
 	}
 
 	const std::string & reset_font_ttycode() {
-		static std::string str = isatty( STDERR_FILENO ) ? "\e[0m" : "";
+		static std::string str = with_colors() ? "\e[0m" : "";
 		return str;
 	}
Index: src/Common/SemanticError.h
===================================================================
--- src/Common/SemanticError.h	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/Common/SemanticError.h	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -97,4 +97,12 @@
 // Helpers
 namespace ErrorHelpers {
+	enum class Colors {
+		Never = false,
+		Always = true,
+		Auto,
+	};
+
+	extern Colors colors;
+
 	const std::string & error_str();
 	const std::string & warning_str();
Index: src/Common/Stats/Time.h
===================================================================
--- src/Common/Stats/Time.h	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/Common/Stats/Time.h	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,5 +9,5 @@
 // Author           : Thierry Delisle
 // Created On       : Fri Mar 01 15:14:11 2019
-// Last Modified By :
+// Last Modified By : Andrew Beach
 // Last Modified On :
 // Update Count     :
@@ -41,4 +41,10 @@
 				f();
 			}
+
+			template<typename ret_t = void, typename func_t, typename... arg_t>
+			inline ret_t TimeCall(
+					const char *, func_t func, arg_t&&... arg) {
+				return func(std::forward<arg_t>(arg)...);
+			}
 #		else
 			void StartGlobal();
@@ -59,4 +65,11 @@
 				func();
 			}
+
+			template<typename ret_t = void, typename func_t, typename... arg_t>
+			inline ret_t TimeCall(
+					const char * name, func_t func, arg_t&&... arg) {
+				BlockGuard guard(name);
+				return func(std::forward<arg_t>(arg)...);
+			}
 #		endif
 	}
Index: src/Concurrency/Keywords.cc
===================================================================
--- src/Concurrency/Keywords.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/Concurrency/Keywords.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -11,5 +11,5 @@
 // Last Modified By :
 // Last Modified On :
-// Update Count     : 5
+// Update Count     : 10
 //
 
@@ -24,5 +24,5 @@
 #include "CodeGen/OperatorTable.h" // for isConstructor
 #include "InitTweak/InitTweak.h"   // for getPointerBase
-#include "Parser/LinkageSpec.h"    // for Cforall
+#include "SynTree/LinkageSpec.h"   // for Cforall
 #include "SynTree/Constant.h"      // for Constant
 #include "SynTree/Declaration.h"   // for StructDecl, FunctionDecl, ObjectDecl
@@ -53,5 +53,5 @@
 	  public:
 
-	  	ConcurrentSueKeyword( std::string&& type_name, std::string&& field_name, std::string&& getter_name, std::string&& context_error, bool needs_main, KeywordCastExpr::Target cast_target ) :
+	  	ConcurrentSueKeyword( std::string&& type_name, std::string&& field_name, std::string&& getter_name, std::string&& context_error, bool needs_main, AggregateDecl::Aggregate cast_target ) :
 		  type_name( type_name ), field_name( field_name ), getter_name( getter_name ), context_error( context_error ), needs_main( needs_main ), cast_target( cast_target ) {}
 
@@ -59,4 +59,5 @@
 
 		Declaration * postmutate( StructDecl * decl );
+		DeclarationWithType * postmutate( FunctionDecl * decl );
 
 		void handle( StructDecl * );
@@ -75,7 +76,8 @@
 		const std::string context_error;
 		bool needs_main;
-		KeywordCastExpr::Target cast_target;
-
-		StructDecl* type_decl = nullptr;
+		AggregateDecl::Aggregate cast_target;
+
+		StructDecl   * type_decl = nullptr;
+		FunctionDecl * dtor_decl = nullptr;
 	};
 
@@ -97,7 +99,7 @@
 			"__thrd",
 			"get_thread",
-			"thread keyword requires threads to be in scope, add #include <thread.hfa>",
+			"thread keyword requires threads to be in scope, add #include <thread.hfa>\n",
 			true,
-			KeywordCastExpr::Thread
+			AggregateDecl::Thread
 		)
 		{}
@@ -129,7 +131,7 @@
 			"__cor",
 			"get_coroutine",
-			"coroutine keyword requires coroutines to be in scope, add #include <coroutine.hfa>",
+			"coroutine keyword requires coroutines to be in scope, add #include <coroutine.hfa>\n",
 			true,
-			KeywordCastExpr::Coroutine
+			AggregateDecl::Coroutine
 		)
 		{}
@@ -161,7 +163,7 @@
 			"__mon",
 			"get_monitor",
-			"monitor keyword requires monitors to be in scope, add #include <monitor.hfa>",
+			"monitor keyword requires monitors to be in scope, add #include <monitor.hfa>\n",
 			false,
-			KeywordCastExpr::Monitor
+			AggregateDecl::Monitor
 		)
 		{}
@@ -284,19 +286,31 @@
 	}
 
+	DeclarationWithType * ConcurrentSueKeyword::postmutate( FunctionDecl * decl ) {
+		if( !type_decl ) return decl;
+		if( !CodeGen::isDestructor( decl->name ) ) return decl;
+
+		auto params = decl->type->parameters;
+		if( params.size() != 1 ) return decl;
+
+		auto type = dynamic_cast<ReferenceType*>( params.front()->get_type() );
+		if( !type ) return decl;
+
+		auto stype = dynamic_cast<StructInstType*>( type->base );
+		if( !stype ) return decl;
+		if( stype->baseStruct != type_decl ) return decl;
+
+		if( !dtor_decl ) dtor_decl = decl;
+		return decl;
+	}
+
 	Expression * ConcurrentSueKeyword::postmutate( KeywordCastExpr * cast ) {
 		if ( cast_target == cast->target ) {
 			// convert (thread &)t to (thread_desc &)*get_thread(t), etc.
 			if( !type_decl ) SemanticError( cast, context_error );
-			Expression * arg = cast->arg;
-			cast->arg = nullptr;
-			delete cast;
-			return new CastExpr(
-				UntypedExpr::createDeref(
-					new UntypedExpr( new NameExpr( getter_name ), { arg } )
-				),
-				new ReferenceType(
-					noQualifiers,
-					new StructInstType( noQualifiers, type_decl ) )
-				);
+			if( !dtor_decl ) SemanticError( cast, context_error );
+			assert( cast->result == nullptr );
+			cast->set_result( new ReferenceType( noQualifiers, new StructInstType( noQualifiers, type_decl ) ) );
+			cast->concrete_target.field  = field_name;
+			cast->concrete_target.getter = getter_name;
 		}
 		return cast;
@@ -308,4 +322,5 @@
 
 		if( !type_decl ) SemanticError( decl, context_error );
+		if( !dtor_decl ) SemanticError( decl, context_error );
 
 		FunctionDecl * func = forwardDeclare( decl );
@@ -701,5 +716,5 @@
 				new UntypedExpr(
 					new NameExpr( "__thrd_start" ),
-					{ new VariableExpr( param ) }
+					{ new VariableExpr( param ), new NameExpr("main") }
 				)
 			)
Index: src/Concurrency/Waitfor.cc
===================================================================
--- src/Concurrency/Waitfor.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/Concurrency/Waitfor.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -11,5 +11,5 @@
 // Last Modified By :
 // Last Modified On :
-// Update Count     : 7
+// Update Count     : 12
 //
 
@@ -23,9 +23,10 @@
 #include "Common/PassVisitor.h"    // for PassVisitor
 #include "Common/SemanticError.h"  // for SemanticError
+#include "Common/UniqueName.h"	   // for UniqueName
 #include "Common/utility.h"        // for deleteAll, map_range
 #include "CodeGen/OperatorTable.h" // for isConstructor
 #include "InitTweak/InitTweak.h"   // for getPointerBase
-#include "Parser/LinkageSpec.h"    // for Cforall
 #include "ResolvExpr/Resolver.h"   // for findVoidExpression
+#include "SynTree/LinkageSpec.h"   // for Cforall
 #include "SynTree/Constant.h"      // for Constant
 #include "SynTree/Declaration.h"   // for StructDecl, FunctionDecl, ObjectDecl
@@ -41,8 +42,8 @@
 void foo() {
 	while( true ) {
-		when( a < 1 ) waitfor( f, a ) { bar(); }
+		when( a < 1 ) waitfor( f : a ) { bar(); }
 		or timeout( swagl() );
-		or waitfor( g, a ) { baz(); }
-		or waitfor( ^?{}, a ) { break; }
+		or waitfor( g : a ) { baz(); }
+		or waitfor( ^?{} : a ) { break; }
 		or waitfor( ^?{} ) { break; }
 	}
Index: src/ControlStruct/ExceptTranslate.cc
===================================================================
--- src/ControlStruct/ExceptTranslate.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/ControlStruct/ExceptTranslate.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Wed Jun 14 16:49:00 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 13 18:15:29 2019
-// Update Count     : 11
+// Last Modified On : Fri Dec 13 23:40:15 2019
+// Update Count     : 12
 //
 
@@ -24,5 +24,5 @@
 #include "Common/SemanticError.h"     // for SemanticError
 #include "Common/utility.h"           // for CodeLocation
-#include "Parser/LinkageSpec.h"       // for Cforall
+#include "SynTree/LinkageSpec.h"      // for Cforall
 #include "SynTree/Attribute.h"        // for Attribute
 #include "SynTree/Constant.h"         // for Constant
Index: src/ControlStruct/LabelFixer.cc
===================================================================
--- src/ControlStruct/LabelFixer.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/ControlStruct/LabelFixer.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Rodolfo G. Esteves
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Mar 11 22:26:02 2019
-// Update Count     : 159
+// Last Modified By : Andrew Beach
+// Last Modified On : Tue Jan 21 10:32:00 2020
+// Update Count     : 160
 //
 
@@ -21,5 +21,5 @@
 #include "ControlStruct/LabelGenerator.h"  // for LabelGenerator
 #include "LabelFixer.h"
-#include "MLEMutator.h"                    // for MLEMutator
+#include "MLEMutator.h"                    // for MultiLevelExitMutator
 #include "SynTree/Declaration.h"           // for FunctionDecl
 #include "SynTree/Expression.h"            // for NameExpr, Expression, Unty...
@@ -44,6 +44,7 @@
 
 	void LabelFixer::postvisit( FunctionDecl * functionDecl ) {
-		PassVisitor<MLEMutator> mlemut( resolveJumps(), generator );
-		functionDecl->acceptMutator( mlemut );
+		PassVisitor<MultiLevelExitMutator> mlem( resolveJumps(), generator );
+		// We start in the body so we can stop when we hit another FunctionDecl.
+		maybeMutate( functionDecl->statements, mlem );
 	}
 
@@ -75,11 +76,9 @@
 
 
-	// sets the definition of the labelTable entry to be the provided statement for every label in the list
-	// parameter. Happens for every kind of statement
+	// Sets the definition of the labelTable entry to be the provided statement for every label in
+	// the list parameter. Happens for every kind of statement.
 	Label LabelFixer::setLabelsDef( std::list< Label > & llabel, Statement * definition ) {
 		assert( definition != 0 );
 		assert( llabel.size() > 0 );
-
-		Entry * e = new Entry( definition );
 
 		for ( std::list< Label >::iterator i = llabel.begin(); i != llabel.end(); i++ ) {
@@ -87,18 +86,22 @@
 			l.set_statement( definition ); // attach statement to the label to be used later
 			if ( labelTable.find( l ) == labelTable.end() ) {
-				// all labels on this statement need to use the same entry, so this should only be created once
+				// All labels on this statement need to use the same entry,
+				// so this should only be created once.
 				// undefined and unused until now, add an entry
-				labelTable[ l ] =  e;
+				labelTable[ l ] = new Entry( definition );
 			} else if ( labelTable[ l ]->defined() ) {
 				// defined twice, error
-				SemanticError( l.get_statement()->location, "Duplicate definition of label: " + l.get_name() );
-			}	else {
+				SemanticError( l.get_statement()->location,
+					"Duplicate definition of label: " + l.get_name() );
+			} else {
 				// used previously, but undefined until now -> link with this entry
+				// Question: Is changing objects important?
 				delete labelTable[ l ];
-				labelTable[ l ] = e;
+				labelTable[ l ] = new Entry( definition );
 			} // if
 		} // for
 
-		// produce one of the labels attached to this statement to be temporarily used as the canonical label
+		// Produce one of the labels attached to this statement to be temporarily used as the
+		// canonical label.
 		return labelTable[ llabel.front() ]->get_label();
 	}
Index: src/ControlStruct/MLEMutator.cc
===================================================================
--- src/ControlStruct/MLEMutator.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/ControlStruct/MLEMutator.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Rodolfo G. Esteves
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Oct 22 17:22:44 2019
-// Update Count     : 220
+// Last Modified By : Andrew Beach
+// Last Modified On : Wed Jan 22 11:50:00 2020
+// Update Count     : 223
 //
 
@@ -33,22 +33,40 @@
 
 namespace ControlStruct {
-	MLEMutator::~MLEMutator() {
+	MultiLevelExitMutator::~MultiLevelExitMutator() {
 		delete targetTable;
 		targetTable = 0;
 	}
 	namespace {
-		bool isLoop( const MLEMutator::Entry & e ) { return dynamic_cast< WhileStmt * >( e.get_controlStructure() ) || dynamic_cast< ForStmt * >( e.get_controlStructure() ); }
-		bool isSwitch( const MLEMutator::Entry & e ) { return dynamic_cast< SwitchStmt *>( e.get_controlStructure() ); }
-
-		bool isBreakTarget( const MLEMutator::Entry & e ) { return isLoop( e ) || isSwitch( e ) || dynamic_cast< CompoundStmt *>( e.get_controlStructure() ); }
-		bool isContinueTarget( const MLEMutator::Entry & e ) { return isLoop( e ); }
-		bool isFallthroughTarget( const MLEMutator::Entry & e ) { return dynamic_cast< CaseStmt *>( e.get_controlStructure() );; }
-		bool isFallthroughDefaultTarget( const MLEMutator::Entry & e ) { return isSwitch( e ); }
+		bool isLoop( const MultiLevelExitMutator::Entry & e ) {
+			return dynamic_cast< WhileStmt * >( e.get_controlStructure() )
+				|| dynamic_cast< ForStmt * >( e.get_controlStructure() );
+		}
+		bool isSwitch( const MultiLevelExitMutator::Entry & e ) {
+			return dynamic_cast< SwitchStmt *>( e.get_controlStructure() );
+		}
+
+		bool isBreakTarget( const MultiLevelExitMutator::Entry & e ) {
+			return isLoop( e ) || isSwitch( e )
+				|| dynamic_cast< CompoundStmt *>( e.get_controlStructure() );
+		}
+		bool isContinueTarget( const MultiLevelExitMutator::Entry & e ) {
+			return isLoop( e );
+		}
+		bool isFallthroughTarget( const MultiLevelExitMutator::Entry & e ) {
+			return dynamic_cast< CaseStmt *>( e.get_controlStructure() );
+		}
+		bool isFallthroughDefaultTarget( const MultiLevelExitMutator::Entry & e ) {
+			return isSwitch( e );
+		}
 	} // namespace
+
+	void MultiLevelExitMutator::premutate( FunctionDecl * ) {
+		visit_children = false;
+	}
 
 	// break labels have to come after the statement they break out of, so mutate a statement, then if they inform us
 	// through the breakLabel field tha they need a place to jump to on a break statement, add the break label to the
 	// body of statements
-	void MLEMutator::fixBlock( std::list< Statement * > &kids, bool caseClause ) {
+	void MultiLevelExitMutator::fixBlock( std::list< Statement * > &kids, bool caseClause ) {
 		SemanticErrorException errors;
 
@@ -81,5 +99,5 @@
 	}
 
-	void MLEMutator::premutate( CompoundStmt *cmpndStmt ) {
+	void MultiLevelExitMutator::premutate( CompoundStmt *cmpndStmt ) {
 		visit_children = false;
 		bool labeledBlock = !(cmpndStmt->labels.empty());
@@ -118,9 +136,11 @@
 			}
 		}
-		assertf( false, "Could not find label '%s' on statement %s", originalTarget.get_name().c_str(), toString( stmt ).c_str() );
-	}
-
-
-	Statement *MLEMutator::postmutate( BranchStmt *branchStmt ) throw ( SemanticErrorException ) {
+		assertf( false, "Could not find label '%s' on statement %s",
+			originalTarget.get_name().c_str(), toString( stmt ).c_str() );
+	}
+
+
+	Statement *MultiLevelExitMutator::postmutate( BranchStmt *branchStmt )
+			throw ( SemanticErrorException ) {
 		std::string originalTarget = branchStmt->originalTarget;
 
@@ -230,13 +250,11 @@
 	}
 
-	Statement *MLEMutator::mutateLoop( Statement *bodyLoop, Entry &e ) {
+	Statement *MultiLevelExitMutator::mutateLoop( Statement *bodyLoop, Entry &e ) {
+		// only generate these when needed
+		if( !e.isContUsed() && !e.isBreakUsed() ) return bodyLoop;
+
 		// ensure loop body is a block
-		CompoundStmt *newBody;
-		if ( ! (newBody = dynamic_cast<CompoundStmt *>( bodyLoop )) ) {
-			newBody = new CompoundStmt();
-			newBody->get_kids().push_back( bodyLoop );
-		} // if
-
-		// only generate these when needed
+		CompoundStmt * newBody = new CompoundStmt();
+		newBody->get_kids().push_back( bodyLoop );
 
 		if ( e.isContUsed() ) {
@@ -255,5 +273,5 @@
 
 	template< typename LoopClass >
-	void MLEMutator::prehandleLoopStmt( LoopClass * loopStmt ) {
+	void MultiLevelExitMutator::prehandleLoopStmt( LoopClass * loopStmt ) {
 		// remember this as the most recent enclosing loop, then mutate the body of the loop -- this will determine
 		// whether brkLabel and contLabel are used with branch statements and will recursively do the same to nested
@@ -266,5 +284,5 @@
 
 	template< typename LoopClass >
-	Statement * MLEMutator::posthandleLoopStmt( LoopClass * loopStmt ) {
+	Statement * MultiLevelExitMutator::posthandleLoopStmt( LoopClass * loopStmt ) {
 		assert( ! enclosingControlStructures.empty() );
 		Entry &e = enclosingControlStructures.back();
@@ -277,21 +295,21 @@
 	}
 
-	void MLEMutator::premutate( WhileStmt * whileStmt ) {
+	void MultiLevelExitMutator::premutate( WhileStmt * whileStmt ) {
 		return prehandleLoopStmt( whileStmt );
 	}
 
-	void MLEMutator::premutate( ForStmt * forStmt ) {
+	void MultiLevelExitMutator::premutate( ForStmt * forStmt ) {
 		return prehandleLoopStmt( forStmt );
 	}
 
-	Statement * MLEMutator::postmutate( WhileStmt * whileStmt ) {
+	Statement * MultiLevelExitMutator::postmutate( WhileStmt * whileStmt ) {
 		return posthandleLoopStmt( whileStmt );
 	}
 
-	Statement * MLEMutator::postmutate( ForStmt * forStmt ) {
+	Statement * MultiLevelExitMutator::postmutate( ForStmt * forStmt ) {
 		return posthandleLoopStmt( forStmt );
 	}
 
-	void MLEMutator::premutate( IfStmt * ifStmt ) {
+	void MultiLevelExitMutator::premutate( IfStmt * ifStmt ) {
 		// generate a label for breaking out of a labeled if
 		bool labeledBlock = !(ifStmt->get_labels().empty());
@@ -303,5 +321,5 @@
 	}
 
-	Statement * MLEMutator::postmutate( IfStmt * ifStmt ) {
+	Statement * MultiLevelExitMutator::postmutate( IfStmt * ifStmt ) {
 		bool labeledBlock = !(ifStmt->get_labels().empty());
 		if ( labeledBlock ) {
@@ -313,5 +331,5 @@
 	}
 
-	void MLEMutator::premutate( TryStmt * tryStmt ) {
+	void MultiLevelExitMutator::premutate( TryStmt * tryStmt ) {
 		// generate a label for breaking out of a labeled if
 		bool labeledBlock = !(tryStmt->get_labels().empty());
@@ -323,5 +341,5 @@
 	}
 
-	Statement * MLEMutator::postmutate( TryStmt * tryStmt ) {
+	Statement * MultiLevelExitMutator::postmutate( TryStmt * tryStmt ) {
 		bool labeledBlock = !(tryStmt->get_labels().empty());
 		if ( labeledBlock ) {
@@ -333,5 +351,20 @@
 	}
 
-	void MLEMutator::premutate( CaseStmt *caseStmt ) {
+	void MultiLevelExitMutator::premutate( FinallyStmt * ) {
+		GuardAction([this, old = std::move(enclosingControlStructures)]() {
+			enclosingControlStructures = std::move(old);
+		});
+		enclosingControlStructures = std::list<Entry>();
+		GuardValue( inFinally );
+		inFinally = true;
+	}
+
+	void MultiLevelExitMutator::premutate( ReturnStmt *returnStmt ) {
+		if ( inFinally ) {
+			SemanticError( returnStmt->location, "'return' may not appear in a finally clause" );
+		}
+	}
+
+	void MultiLevelExitMutator::premutate( CaseStmt *caseStmt ) {
 		visit_children = false;
 
@@ -372,5 +405,5 @@
 	}
 
-	void MLEMutator::premutate( SwitchStmt *switchStmt ) {
+	void MultiLevelExitMutator::premutate( SwitchStmt *switchStmt ) {
 		// generate a label for breaking out of a labeled switch
 		Label brkLabel = generator->newLabel("switchBreak", switchStmt);
@@ -398,5 +431,5 @@
 	}
 
-	Statement * MLEMutator::postmutate( SwitchStmt * switchStmt ) {
+	Statement * MultiLevelExitMutator::postmutate( SwitchStmt * switchStmt ) {
 		Entry &e = enclosingControlStructures.back();
 		assert ( e == switchStmt );
Index: src/ControlStruct/MLEMutator.h
===================================================================
--- src/ControlStruct/MLEMutator.h	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/ControlStruct/MLEMutator.h	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Rodolfo G. Esteves
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Oct 22 17:22:47 2019
-// Update Count     : 45
+// Last Modified By : Andrew Beach
+// Last Modified On : Wed Jan 22 11:50:00 2020
+// Update Count     : 48
 //
 
@@ -30,9 +30,13 @@
 	class LabelGenerator;
 
-	class MLEMutator : public WithVisitorRef<MLEMutator>, public WithShortCircuiting, public WithGuards {
+	class MultiLevelExitMutator : public WithVisitorRef<MultiLevelExitMutator>,
+			public WithShortCircuiting, public WithGuards {
 	  public:
 		class Entry;
-		MLEMutator( std::map<Label, Statement *> *t, LabelGenerator *gen = 0 ) : targetTable( t ), breakLabel(std::string("")), generator( gen ) {}
-		~MLEMutator();
+		MultiLevelExitMutator( std::map<Label, Statement *> *t, LabelGenerator *gen = 0 ) :
+			targetTable( t ), breakLabel(std::string("")), generator( gen ) {}
+		~MultiLevelExitMutator();
+
+		void premutate( FunctionDecl * );
 
 		void premutate( CompoundStmt *cmpndStmt );
@@ -47,6 +51,8 @@
 		void premutate( SwitchStmt *switchStmt );
 		Statement * postmutate( SwitchStmt *switchStmt );
+		void premutate( ReturnStmt *returnStmt );
 		void premutate( TryStmt *tryStmt );
 		Statement * postmutate( TryStmt *tryStmt );
+		void premutate( FinallyStmt *finallyStmt );
 
 		Statement *mutateLoop( Statement *bodyLoop, Entry &e );
@@ -110,4 +116,5 @@
 		Label breakLabel;
 		LabelGenerator *generator;
+		bool inFinally = false;
 
 		template< typename LoopClass >
Index: src/GenPoly/Box.cc
===================================================================
--- src/GenPoly/Box.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/GenPoly/Box.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jun 21 15:49:59 2017
-// Update Count     : 346
+// Last Modified On : Fri Dec 13 23:40:34 2019
+// Update Count     : 347
 //
 
@@ -37,5 +37,4 @@
 #include "InitTweak/InitTweak.h"         // for getFunctionName, isAssignment
 #include "Lvalue.h"                      // for generalizedLvalue
-#include "Parser/LinkageSpec.h"          // for C, Spec, Cforall, Intrinsic
 #include "ResolvExpr/TypeEnvironment.h"  // for EqvClass
 #include "ResolvExpr/typeops.h"          // for typesCompatible
@@ -44,4 +43,5 @@
 #include "SymTab/Indexer.h"              // for Indexer
 #include "SymTab/Mangler.h"              // for Mangler
+#include "SynTree/LinkageSpec.h"         // for C, Spec, Cforall, Intrinsic
 #include "SynTree/Attribute.h"           // for Attribute
 #include "SynTree/Constant.h"            // for Constant
Index: src/GenPoly/Lvalue.cc
===================================================================
--- src/GenPoly/Lvalue.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/GenPoly/Lvalue.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Mar 17 09:11:18 2017
-// Update Count     : 5
+// Last Modified On : Fri Dec 13 23:14:38 2019
+// Update Count     : 7
 //
 
@@ -17,4 +17,5 @@
 #include <string>                        // for string
 
+#include "Common/UniqueName.h"
 #include "Common/PassVisitor.h"
 #include "GenPoly.h"                     // for isPolyType
@@ -22,9 +23,9 @@
 
 #include "InitTweak/InitTweak.h"
-#include "Parser/LinkageSpec.h"          // for Spec, isBuiltin, Intrinsic
 #include "ResolvExpr/TypeEnvironment.h"  // for AssertionSet, OpenVarSet
 #include "ResolvExpr/Unify.h"            // for unify
 #include "ResolvExpr/typeops.h"
 #include "SymTab/Indexer.h"              // for Indexer
+#include "SynTree/LinkageSpec.h"         // for Spec, isBuiltin, Intrinsic
 #include "SynTree/Declaration.h"         // for Declaration, FunctionDecl
 #include "SynTree/Expression.h"          // for Expression, ConditionalExpr
@@ -60,5 +61,5 @@
 		}
 
-		struct ReferenceConversions final : public WithStmtsToAdd {
+		struct ReferenceConversions final : public WithStmtsToAdd, public WithGuards {
 			Expression * postmutate( CastExpr * castExpr );
 			Expression * postmutate( AddressExpr * addrExpr );
@@ -71,4 +72,14 @@
 
 		struct FixIntrinsicResult final : public WithGuards {
+			enum {
+				NoSkip,
+				Skip,
+				SkipInProgress
+			} skip = NoSkip;
+
+			void premutate( AsmExpr * ) { GuardValue( skip ); skip = Skip; }
+			void premutate( ApplicationExpr * ) { GuardValue( skip ); skip = (skip == Skip) ? SkipInProgress : NoSkip; }
+
+
 			Expression * postmutate( ApplicationExpr * appExpr );
 			void premutate( FunctionDecl * funcDecl );
@@ -162,5 +173,5 @@
 
 		Expression * FixIntrinsicResult::postmutate( ApplicationExpr * appExpr ) {
-			if ( isIntrinsicReference( appExpr ) ) {
+			if ( skip != SkipInProgress && isIntrinsicReference( appExpr ) ) {
 				// eliminate reference types from intrinsic applications - now they return lvalues
 				ReferenceType * result = strict_dynamic_cast< ReferenceType * >( appExpr->result );
Index: src/GenPoly/Specialize.cc
===================================================================
--- src/GenPoly/Specialize.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/GenPoly/Specialize.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 16 07:53:59 2017
-// Update Count     : 31
+// Last Modified On : Fri Dec 13 23:40:49 2019
+// Update Count     : 32
 //
 
@@ -27,8 +27,8 @@
 #include "GenPoly.h"                     // for getFunctionType
 #include "InitTweak/InitTweak.h"         // for isIntrinsicCallExpr
-#include "Parser/LinkageSpec.h"          // for C
 #include "ResolvExpr/FindOpenVars.h"     // for findOpenVars
 #include "ResolvExpr/TypeEnvironment.h"  // for OpenVarSet, AssertionSet
 #include "Specialize.h"
+#include "SynTree/LinkageSpec.h"         // for C
 #include "SynTree/Attribute.h"           // for Attribute
 #include "SynTree/Declaration.h"         // for FunctionDecl, DeclarationWit...
Index: src/InitTweak/FixGlobalInit.cc
===================================================================
--- src/InitTweak/FixGlobalInit.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/InitTweak/FixGlobalInit.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 04 15:14:56 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 16 07:53:11 2017
-// Update Count     : 18
+// Last Modified On : Fri Dec 13 23:41:10 2019
+// Update Count     : 19
 //
 
@@ -23,5 +23,5 @@
 #include "Common/UniqueName.h"     // for UniqueName
 #include "InitTweak.h"             // for isIntrinsicSingleArgCallStmt
-#include "Parser/LinkageSpec.h"    // for C
+#include "SynTree/LinkageSpec.h"   // for C
 #include "SynTree/Attribute.h"     // for Attribute
 #include "SynTree/Constant.h"      // for Constant
Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/InitTweak/FixInit.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Wed Jan 13 16:29:30 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 13 18:15:56 2019
-// Update Count     : 76
+// Last Modified On : Fri Dec 13 23:41:27 2019
+// Update Count     : 77
 //
 #include "FixInit.h"
@@ -38,5 +38,4 @@
 #include "GenPoly/GenPoly.h"           // for getFunctionType
 #include "InitTweak.h"                 // for getFunctionName, getCallArg
-#include "Parser/LinkageSpec.h"        // for C, Spec, Cforall, isBuiltin
 #include "ResolvExpr/Resolver.h"       // for findVoidExpression
 #include "ResolvExpr/typeops.h"        // for typesCompatible
@@ -44,4 +43,5 @@
 #include "SymTab/Indexer.h"            // for Indexer
 #include "SymTab/Mangler.h"            // for Mangler
+#include "SynTree/LinkageSpec.h"       // for C, Spec, Cforall, isBuiltin
 #include "SynTree/Attribute.h"         // for Attribute
 #include "SynTree/Constant.h"          // for Constant
Index: src/InitTweak/GenInit.cc
===================================================================
--- src/InitTweak/GenInit.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/InitTweak/GenInit.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Mar 17 09:12:36 2017
-// Update Count     : 183
+// Last Modified On : Fri Dec 13 23:15:10 2019
+// Update Count     : 184
 //
 #include "GenInit.h"
@@ -34,8 +34,8 @@
 #include "GenPoly/ScopedSet.h"         // for ScopedSet, ScopedSet<>::const_iter...
 #include "InitTweak.h"                 // for isConstExpr, InitExpander, checkIn...
-#include "Parser/LinkageSpec.h"        // for isOverridable, C
 #include "ResolvExpr/Resolver.h"
 #include "SymTab/Autogen.h"            // for genImplicitCall
 #include "SymTab/Mangler.h"            // for Mangler
+#include "SynTree/LinkageSpec.h"       // for isOverridable, C
 #include "SynTree/Declaration.h"       // for ObjectDecl, DeclarationWithType
 #include "SynTree/Expression.h"        // for VariableExpr, UntypedExpr, Address...
Index: src/InitTweak/InitTweak.cc
===================================================================
--- src/InitTweak/InitTweak.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/InitTweak/InitTweak.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Fri May 13 11:26:36 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 25 22:21:48 2019
-// Update Count     : 7
+// Last Modified On : Fri Dec 13 23:15:52 2019
+// Update Count     : 8
 //
 
@@ -33,8 +33,8 @@
 #include "GenPoly/GenPoly.h"       // for getFunctionType
 #include "InitTweak.h"
-#include "Parser/LinkageSpec.h"    // for Spec, isBuiltin, Intrinsic
 #include "ResolvExpr/typeops.h"    // for typesCompatibleIgnoreQualifiers
 #include "SymTab/Autogen.h"
 #include "SymTab/Indexer.h"        // for Indexer
+#include "SynTree/LinkageSpec.h"   // for Spec, isBuiltin, Intrinsic
 #include "SynTree/Attribute.h"     // for Attribute
 #include "SynTree/Constant.h"      // for Constant
Index: src/MakeLibCfa.cc
===================================================================
--- src/MakeLibCfa.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/MakeLibCfa.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 10:33:33 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Feb 17 21:08:09 2019
-// Update Count     : 41
+// Last Modified On : Fri Dec 13 23:41:40 2019
+// Update Count     : 42
 //
 
@@ -23,5 +23,5 @@
 #include "Common/SemanticError.h"   // for SemanticError
 #include "Common/UniqueName.h"      // for UniqueName
-#include "Parser/LinkageSpec.h"     // for Spec, Intrinsic, C
+#include "SynTree/LinkageSpec.h"    // for Spec, Intrinsic, C
 #include "SynTree/Declaration.h"    // for FunctionDecl, ObjectDecl, Declara...
 #include "SynTree/Expression.h"     // for NameExpr, UntypedExpr, VariableExpr
Index: src/Makefile.in
===================================================================
--- src/Makefile.in	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/Makefile.in	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -212,31 +212,31 @@
 	SymTab/Indexer.$(OBJEXT) SymTab/Mangler.$(OBJEXT) \
 	SymTab/ManglerCommon.$(OBJEXT) SymTab/Validate.$(OBJEXT)
-am__objects_7 = SynTree/Type.$(OBJEXT) SynTree/VoidType.$(OBJEXT) \
-	SynTree/BasicType.$(OBJEXT) SynTree/PointerType.$(OBJEXT) \
-	SynTree/ArrayType.$(OBJEXT) SynTree/ReferenceType.$(OBJEXT) \
-	SynTree/FunctionType.$(OBJEXT) \
-	SynTree/ReferenceToType.$(OBJEXT) SynTree/TupleType.$(OBJEXT) \
-	SynTree/TypeofType.$(OBJEXT) SynTree/AttrType.$(OBJEXT) \
-	SynTree/VarArgsType.$(OBJEXT) SynTree/ZeroOneType.$(OBJEXT) \
-	SynTree/Constant.$(OBJEXT) SynTree/Expression.$(OBJEXT) \
-	SynTree/TupleExpr.$(OBJEXT) SynTree/CommaExpr.$(OBJEXT) \
-	SynTree/TypeExpr.$(OBJEXT) SynTree/ApplicationExpr.$(OBJEXT) \
-	SynTree/AddressExpr.$(OBJEXT) SynTree/Statement.$(OBJEXT) \
-	SynTree/CompoundStmt.$(OBJEXT) SynTree/DeclStmt.$(OBJEXT) \
+am__objects_7 = SynTree/AddressExpr.$(OBJEXT) \
+	SynTree/AggregateDecl.$(OBJEXT) \
+	SynTree/ApplicationExpr.$(OBJEXT) SynTree/ArrayType.$(OBJEXT) \
+	SynTree/AttrType.$(OBJEXT) SynTree/Attribute.$(OBJEXT) \
+	SynTree/BasicType.$(OBJEXT) SynTree/CommaExpr.$(OBJEXT) \
+	SynTree/CompoundStmt.$(OBJEXT) SynTree/Constant.$(OBJEXT) \
+	SynTree/DeclReplacer.$(OBJEXT) SynTree/DeclStmt.$(OBJEXT) \
 	SynTree/Declaration.$(OBJEXT) \
 	SynTree/DeclarationWithType.$(OBJEXT) \
-	SynTree/ObjectDecl.$(OBJEXT) SynTree/FunctionDecl.$(OBJEXT) \
-	SynTree/AggregateDecl.$(OBJEXT) \
-	SynTree/NamedTypeDecl.$(OBJEXT) SynTree/TypeDecl.$(OBJEXT) \
-	SynTree/Initializer.$(OBJEXT) \
-	SynTree/TypeSubstitution.$(OBJEXT) SynTree/Attribute.$(OBJEXT) \
-	SynTree/DeclReplacer.$(OBJEXT)
+	SynTree/Expression.$(OBJEXT) SynTree/FunctionDecl.$(OBJEXT) \
+	SynTree/FunctionType.$(OBJEXT) SynTree/Initializer.$(OBJEXT) \
+	SynTree/LinkageSpec.$(OBJEXT) SynTree/NamedTypeDecl.$(OBJEXT) \
+	SynTree/ObjectDecl.$(OBJEXT) SynTree/PointerType.$(OBJEXT) \
+	SynTree/ReferenceToType.$(OBJEXT) \
+	SynTree/ReferenceType.$(OBJEXT) SynTree/Statement.$(OBJEXT) \
+	SynTree/TupleExpr.$(OBJEXT) SynTree/TupleType.$(OBJEXT) \
+	SynTree/Type.$(OBJEXT) SynTree/TypeDecl.$(OBJEXT) \
+	SynTree/TypeExpr.$(OBJEXT) SynTree/TypeSubstitution.$(OBJEXT) \
+	SynTree/TypeofType.$(OBJEXT) SynTree/VarArgsType.$(OBJEXT) \
+	SynTree/VoidType.$(OBJEXT) SynTree/ZeroOneType.$(OBJEXT)
 am__objects_8 = CompilationState.$(OBJEXT) $(am__objects_1) \
 	$(am__objects_2) Concurrency/Keywords.$(OBJEXT) \
 	$(am__objects_3) $(am__objects_4) GenPoly/GenPoly.$(OBJEXT) \
 	GenPoly/Lvalue.$(OBJEXT) InitTweak/GenInit.$(OBJEXT) \
-	InitTweak/InitTweak.$(OBJEXT) Parser/LinkageSpec.$(OBJEXT) \
-	$(am__objects_5) $(am__objects_6) SymTab/Demangle.$(OBJEXT) \
-	$(am__objects_7) Tuples/TupleAssignment.$(OBJEXT) \
+	InitTweak/InitTweak.$(OBJEXT) $(am__objects_5) \
+	$(am__objects_6) SymTab/Demangle.$(OBJEXT) $(am__objects_7) \
+	Tuples/TupleAssignment.$(OBJEXT) \
 	Tuples/TupleExpansion.$(OBJEXT) Tuples/Explode.$(OBJEXT) \
 	Tuples/Tuples.$(OBJEXT) Validate/HandleAttributes.$(OBJEXT) \
@@ -261,10 +261,10 @@
 	InitTweak/GenInit.$(OBJEXT) InitTweak/FixInit.$(OBJEXT) \
 	InitTweak/FixGlobalInit.$(OBJEXT) \
-	InitTweak/InitTweak.$(OBJEXT) Parser/parser.$(OBJEXT) \
-	Parser/lex.$(OBJEXT) Parser/TypedefTable.$(OBJEXT) \
-	Parser/ParseNode.$(OBJEXT) Parser/DeclarationNode.$(OBJEXT) \
-	Parser/ExpressionNode.$(OBJEXT) Parser/StatementNode.$(OBJEXT) \
-	Parser/InitializerNode.$(OBJEXT) Parser/TypeData.$(OBJEXT) \
-	Parser/LinkageSpec.$(OBJEXT) Parser/parserutility.$(OBJEXT) \
+	InitTweak/InitTweak.$(OBJEXT) Parser/DeclarationNode.$(OBJEXT) \
+	Parser/ExpressionNode.$(OBJEXT) \
+	Parser/InitializerNode.$(OBJEXT) Parser/ParseNode.$(OBJEXT) \
+	Parser/StatementNode.$(OBJEXT) Parser/TypeData.$(OBJEXT) \
+	Parser/TypedefTable.$(OBJEXT) Parser/lex.$(OBJEXT) \
+	Parser/parser.$(OBJEXT) Parser/parserutility.$(OBJEXT) \
 	$(am__objects_5) ResolvExpr/AlternativePrinter.$(OBJEXT) \
 	$(am__objects_6) $(am__objects_7) \
@@ -559,12 +559,12 @@
 	InitTweak/GenInit.cc InitTweak/FixInit.cc \
 	InitTweak/FixGlobalInit.cc InitTweak/InitTweak.cc \
-	Parser/parser.yy Parser/lex.ll Parser/TypedefTable.cc \
-	Parser/ParseNode.cc Parser/DeclarationNode.cc \
-	Parser/ExpressionNode.cc Parser/StatementNode.cc \
-	Parser/InitializerNode.cc Parser/TypeData.cc \
-	Parser/LinkageSpec.cc Parser/parserutility.cc \
-	$(SRC_RESOLVEXPR) ResolvExpr/AlternativePrinter.cc \
-	$(SRC_SYMTAB) $(SRC_SYNTREE) Tuples/TupleAssignment.cc \
-	Tuples/TupleExpansion.cc Tuples/Explode.cc Tuples/Tuples.cc \
+	Parser/DeclarationNode.cc Parser/ExpressionNode.cc \
+	Parser/InitializerNode.cc Parser/ParseNode.cc \
+	Parser/StatementNode.cc Parser/TypeData.cc \
+	Parser/TypedefTable.cc Parser/lex.ll Parser/parser.yy \
+	Parser/parserutility.cc $(SRC_RESOLVEXPR) \
+	ResolvExpr/AlternativePrinter.cc $(SRC_SYMTAB) $(SRC_SYNTREE) \
+	Tuples/TupleAssignment.cc Tuples/TupleExpansion.cc \
+	Tuples/Explode.cc Tuples/Tuples.cc \
 	Validate/HandleAttributes.cc Validate/FindSpecialDecls.cc \
 	Virtual/ExpandCasts.cc
@@ -572,8 +572,7 @@
 	Concurrency/Keywords.cc $(SRC_COMMON) $(SRC_CONTROLSTRUCT) \
 	GenPoly/GenPoly.cc GenPoly/Lvalue.cc InitTweak/GenInit.cc \
-	InitTweak/InitTweak.cc Parser/LinkageSpec.cc $(SRC_RESOLVEXPR) \
-	$(SRC_SYMTAB) SymTab/Demangle.cc $(SRC_SYNTREE) \
-	Tuples/TupleAssignment.cc Tuples/TupleExpansion.cc \
-	Tuples/Explode.cc Tuples/Tuples.cc \
+	InitTweak/InitTweak.cc $(SRC_RESOLVEXPR) $(SRC_SYMTAB) \
+	SymTab/Demangle.cc $(SRC_SYNTREE) Tuples/TupleAssignment.cc \
+	Tuples/TupleExpansion.cc Tuples/Explode.cc Tuples/Tuples.cc \
 	Validate/HandleAttributes.cc Validate/FindSpecialDecls.cc
 MAINTAINERCLEANFILES = ${libdir}/${notdir ${cfa_cpplib_PROGRAMS}}
@@ -663,38 +662,39 @@
 
 SRC_SYNTREE = \
-      SynTree/Type.cc \
-      SynTree/VoidType.cc \
+      SynTree/AddressExpr.cc \
+      SynTree/AggregateDecl.cc \
+      SynTree/ApplicationExpr.cc \
+      SynTree/ArrayType.cc \
+      SynTree/AttrType.cc \
+      SynTree/Attribute.cc \
       SynTree/BasicType.cc \
-      SynTree/PointerType.cc \
-      SynTree/ArrayType.cc \
-      SynTree/ReferenceType.cc \
-      SynTree/FunctionType.cc \
-      SynTree/ReferenceToType.cc \
-      SynTree/TupleType.cc \
-      SynTree/TypeofType.cc \
-      SynTree/AttrType.cc \
-      SynTree/VarArgsType.cc \
-      SynTree/ZeroOneType.cc \
+      SynTree/CommaExpr.cc \
+      SynTree/CompoundStmt.cc \
       SynTree/Constant.cc \
-      SynTree/Expression.cc \
-      SynTree/TupleExpr.cc \
-      SynTree/CommaExpr.cc \
-      SynTree/TypeExpr.cc \
-      SynTree/ApplicationExpr.cc \
-      SynTree/AddressExpr.cc \
-      SynTree/Statement.cc \
-      SynTree/CompoundStmt.cc \
+      SynTree/DeclReplacer.cc \
       SynTree/DeclStmt.cc \
       SynTree/Declaration.cc \
       SynTree/DeclarationWithType.cc \
+      SynTree/Expression.cc \
+      SynTree/FunctionDecl.cc \
+      SynTree/FunctionType.cc \
+      SynTree/Initializer.cc \
+      SynTree/LinkageSpec.cc \
+      SynTree/NamedTypeDecl.cc \
       SynTree/ObjectDecl.cc \
-      SynTree/FunctionDecl.cc \
-      SynTree/AggregateDecl.cc \
-      SynTree/NamedTypeDecl.cc \
+      SynTree/PointerType.cc \
+      SynTree/ReferenceToType.cc \
+      SynTree/ReferenceType.cc \
+      SynTree/Statement.cc \
+      SynTree/TupleExpr.cc \
+      SynTree/TupleType.cc \
+      SynTree/Type.cc \
       SynTree/TypeDecl.cc \
-      SynTree/Initializer.cc \
+      SynTree/TypeExpr.cc \
       SynTree/TypeSubstitution.cc \
-      SynTree/Attribute.cc \
-      SynTree/DeclReplacer.cc
+      SynTree/TypeofType.cc \
+      SynTree/VarArgsType.cc \
+      SynTree/VoidType.cc \
+      SynTree/ZeroOneType.cc
 
 
@@ -869,12 +869,4 @@
 InitTweak/InitTweak.$(OBJEXT): InitTweak/$(am__dirstamp) \
 	InitTweak/$(DEPDIR)/$(am__dirstamp)
-Parser/$(am__dirstamp):
-	@$(MKDIR_P) Parser
-	@: > Parser/$(am__dirstamp)
-Parser/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) Parser/$(DEPDIR)
-	@: > Parser/$(DEPDIR)/$(am__dirstamp)
-Parser/LinkageSpec.$(OBJEXT): Parser/$(am__dirstamp) \
-	Parser/$(DEPDIR)/$(am__dirstamp)
 ResolvExpr/$(am__dirstamp):
 	@$(MKDIR_P) ResolvExpr
@@ -957,71 +949,73 @@
 	@$(MKDIR_P) SynTree/$(DEPDIR)
 	@: > SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/AddressExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/AggregateDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/ApplicationExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/ArrayType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/AttrType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/Attribute.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/BasicType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/CommaExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/CompoundStmt.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/Constant.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/DeclReplacer.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/DeclStmt.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/Declaration.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/DeclarationWithType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/Expression.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/FunctionDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/FunctionType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/Initializer.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/LinkageSpec.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/NamedTypeDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/ObjectDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/PointerType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/ReferenceToType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/ReferenceType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/Statement.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/TupleExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/TupleType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
 SynTree/Type.$(OBJEXT): SynTree/$(am__dirstamp) \
 	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/TypeDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/TypeExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/TypeSubstitution.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/TypeofType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/VarArgsType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
 SynTree/VoidType.$(OBJEXT): SynTree/$(am__dirstamp) \
 	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/BasicType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/PointerType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/ArrayType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/ReferenceType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/FunctionType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/ReferenceToType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/TupleType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/TypeofType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/AttrType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/VarArgsType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
 SynTree/ZeroOneType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/Constant.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/Expression.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/TupleExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/CommaExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/TypeExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/ApplicationExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/AddressExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/Statement.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/CompoundStmt.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/DeclStmt.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/Declaration.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/DeclarationWithType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/ObjectDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/FunctionDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/AggregateDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/NamedTypeDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/TypeDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/Initializer.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/TypeSubstitution.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/Attribute.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/DeclReplacer.$(OBJEXT): SynTree/$(am__dirstamp) \
 	SynTree/$(DEPDIR)/$(am__dirstamp)
 Tuples/$(am__dirstamp):
@@ -1140,24 +1134,30 @@
 InitTweak/FixGlobalInit.$(OBJEXT): InitTweak/$(am__dirstamp) \
 	InitTweak/$(DEPDIR)/$(am__dirstamp)
+Parser/$(am__dirstamp):
+	@$(MKDIR_P) Parser
+	@: > Parser/$(am__dirstamp)
+Parser/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) Parser/$(DEPDIR)
+	@: > Parser/$(DEPDIR)/$(am__dirstamp)
+Parser/DeclarationNode.$(OBJEXT): Parser/$(am__dirstamp) \
+	Parser/$(DEPDIR)/$(am__dirstamp)
+Parser/ExpressionNode.$(OBJEXT): Parser/$(am__dirstamp) \
+	Parser/$(DEPDIR)/$(am__dirstamp)
+Parser/InitializerNode.$(OBJEXT): Parser/$(am__dirstamp) \
+	Parser/$(DEPDIR)/$(am__dirstamp)
+Parser/ParseNode.$(OBJEXT): Parser/$(am__dirstamp) \
+	Parser/$(DEPDIR)/$(am__dirstamp)
+Parser/StatementNode.$(OBJEXT): Parser/$(am__dirstamp) \
+	Parser/$(DEPDIR)/$(am__dirstamp)
+Parser/TypeData.$(OBJEXT): Parser/$(am__dirstamp) \
+	Parser/$(DEPDIR)/$(am__dirstamp)
+Parser/TypedefTable.$(OBJEXT): Parser/$(am__dirstamp) \
+	Parser/$(DEPDIR)/$(am__dirstamp)
+Parser/lex.$(OBJEXT): Parser/$(am__dirstamp) \
+	Parser/$(DEPDIR)/$(am__dirstamp)
 Parser/parser.hh: Parser/parser.cc
 	@if test ! -f $@; then rm -f Parser/parser.cc; else :; fi
 	@if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) Parser/parser.cc; else :; fi
 Parser/parser.$(OBJEXT): Parser/$(am__dirstamp) \
-	Parser/$(DEPDIR)/$(am__dirstamp)
-Parser/lex.$(OBJEXT): Parser/$(am__dirstamp) \
-	Parser/$(DEPDIR)/$(am__dirstamp)
-Parser/TypedefTable.$(OBJEXT): Parser/$(am__dirstamp) \
-	Parser/$(DEPDIR)/$(am__dirstamp)
-Parser/ParseNode.$(OBJEXT): Parser/$(am__dirstamp) \
-	Parser/$(DEPDIR)/$(am__dirstamp)
-Parser/DeclarationNode.$(OBJEXT): Parser/$(am__dirstamp) \
-	Parser/$(DEPDIR)/$(am__dirstamp)
-Parser/ExpressionNode.$(OBJEXT): Parser/$(am__dirstamp) \
-	Parser/$(DEPDIR)/$(am__dirstamp)
-Parser/StatementNode.$(OBJEXT): Parser/$(am__dirstamp) \
-	Parser/$(DEPDIR)/$(am__dirstamp)
-Parser/InitializerNode.$(OBJEXT): Parser/$(am__dirstamp) \
-	Parser/$(DEPDIR)/$(am__dirstamp)
-Parser/TypeData.$(OBJEXT): Parser/$(am__dirstamp) \
 	Parser/$(DEPDIR)/$(am__dirstamp)
 Parser/parserutility.$(OBJEXT): Parser/$(am__dirstamp) \
@@ -1270,5 +1270,4 @@
 @AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/ExpressionNode.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/InitializerNode.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/LinkageSpec.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/ParseNode.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/StatementNode.Po@am__quote@
@@ -1329,4 +1328,5 @@
 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/FunctionType.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/Initializer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/LinkageSpec.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/NamedTypeDecl.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/ObjectDecl.Po@am__quote@
Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/Parser/DeclarationNode.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 12:34:05 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 25 22:17:10 2019
-// Update Count     : 1116
+// Last Modified On : Mon Dec 16 15:32:22 2019
+// Update Count     : 1133
 //
 
@@ -24,6 +24,6 @@
 #include "Common/UniqueName.h"     // for UniqueName
 #include "Common/utility.h"        // for maybeClone, maybeBuild, CodeLocation
-#include "Parser/LinkageSpec.h"    // for Spec, linkageName, Cforall
 #include "Parser/ParseNode.h"      // for DeclarationNode, ExpressionNode
+#include "SynTree/LinkageSpec.h"   // for Spec, linkageName, Cforall
 #include "SynTree/Attribute.h"     // for Attribute
 #include "SynTree/Declaration.h"   // for TypeDecl, ObjectDecl, Declaration
@@ -47,6 +47,4 @@
 const char * DeclarationNode::signednessNames[] = { "signed", "unsigned", "NoSignednessNames" };
 const char * DeclarationNode::lengthNames[] = { "short", "long", "long long", "NoLengthNames" };
-const char * DeclarationNode::aggregateNames[] = { "struct", "union", "trait", "coroutine", "monitor", "thread", "NoAggregateNames" };
-const char * DeclarationNode::typeClassNames[] = { "otype", "dtype", "ftype", "NoTypeClassNames" };
 const char * DeclarationNode::builtinTypeNames[] = { "__builtin_va_list", "__auto_type", "zero_t", "one_t", "NoBuiltinTypeNames" };
 
@@ -59,5 +57,5 @@
 
 //	variable.name = nullptr;
-	variable.tyClass = NoTypeClass;
+	variable.tyClass = TypeDecl::NUMBER_OF_KINDS;
 	variable.assertions = nullptr;
 	variable.initializer = nullptr;
@@ -135,5 +133,5 @@
 
 	if ( linkage != LinkageSpec::Cforall ) {
-		os << LinkageSpec::linkageName( linkage ) << " ";
+		os << LinkageSpec::name( linkage ) << " ";
 	} // if
 
@@ -267,5 +265,5 @@
 }
 
-DeclarationNode * DeclarationNode::newAggregate( Aggregate kind, const string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body ) {
+DeclarationNode * DeclarationNode::newAggregate( AggregateDecl::Aggregate kind, const string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body ) {
 	DeclarationNode * newnode = new DeclarationNode;
 	newnode->type = new TypeData( TypeData::Aggregate );
@@ -313,5 +311,5 @@
 } // DeclarationNode::newFromTypeGen
 
-DeclarationNode * DeclarationNode::newTypeParam( TypeClass tc, const string * name ) {
+DeclarationNode * DeclarationNode::newTypeParam( TypeDecl::Kind tc, const string * name ) {
 	DeclarationNode * newnode = new DeclarationNode;
 	newnode->type = nullptr;
@@ -328,5 +326,5 @@
 	newnode->type = new TypeData( TypeData::Aggregate );
 	newnode->type->aggregate.name = name;
-	newnode->type->aggregate.kind = Trait;
+	newnode->type->aggregate.kind = AggregateDecl::Trait;
 	newnode->type->aggregate.params = params;
 	newnode->type->aggregate.fields = asserts;
@@ -338,5 +336,5 @@
 	newnode->type = new TypeData( TypeData::AggregateInst );
 	newnode->type->aggInst.aggregate = new TypeData( TypeData::Aggregate );
-	newnode->type->aggInst.aggregate->aggregate.kind = Trait;
+	newnode->type->aggInst.aggregate->aggregate.kind = AggregateDecl::Trait;
 	newnode->type->aggInst.aggregate->aggregate.name = name;
 	newnode->type->aggInst.params = params;
@@ -671,5 +669,5 @@
 
 DeclarationNode * DeclarationNode::addAssertions( DeclarationNode * assertions ) {
-	if ( variable.tyClass != NoTypeClass ) {
+	if ( variable.tyClass != TypeDecl::NUMBER_OF_KINDS ) {
 	  	if ( variable.assertions ) {
 	  		variable.assertions->appendList( assertions );
@@ -876,5 +874,5 @@
 
 DeclarationNode * DeclarationNode::addTypeInitializer( DeclarationNode * init ) {
-	assertf( variable.tyClass != NoTypeClass, "Called addTypeInitializer on something that isn't a type variable." );
+	assertf( variable.tyClass != TypeDecl::NUMBER_OF_KINDS, "Called addTypeInitializer on something that isn't a type variable." );
 	variable.initializer = init;
 	return this;
@@ -1075,10 +1073,10 @@
 	} // if
 
-	if ( variable.tyClass != NoTypeClass ) {
+	if ( variable.tyClass != TypeDecl::NUMBER_OF_KINDS ) {
 		// otype is internally converted to dtype + otype parameters
 		static const TypeDecl::Kind kindMap[] = { TypeDecl::Dtype, TypeDecl::Dtype, TypeDecl::Ftype, TypeDecl::Ttype };
-		assertf( sizeof(kindMap)/sizeof(kindMap[0]) == NoTypeClass, "DeclarationNode::build: kindMap is out of sync." );
+		static_assert( sizeof(kindMap)/sizeof(kindMap[0]) == TypeDecl::NUMBER_OF_KINDS, "DeclarationNode::build: kindMap is out of sync." );
 		assertf( variable.tyClass < sizeof(kindMap)/sizeof(kindMap[0]), "Variable's tyClass is out of bounds." );
-		TypeDecl * ret = new TypeDecl( *name, Type::StorageClasses(), nullptr, kindMap[ variable.tyClass ], variable.tyClass == Otype, variable.initializer ? variable.initializer->buildType() : nullptr );
+		TypeDecl * ret = new TypeDecl( *name, Type::StorageClasses(), nullptr, kindMap[ variable.tyClass ], variable.tyClass == TypeDecl::Otype, variable.initializer ? variable.initializer->buildType() : nullptr );
 		buildList( variable.assertions, ret->get_assertions() );
 		return ret;
Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/Parser/ExpressionNode.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:17:07 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Aug  4 20:57:55 2019
-// Update Count     : 978
+// Last Modified On : Wed Dec 18 21:14:58 2019
+// Update Count     : 981
 //
 
@@ -265,5 +265,5 @@
 	static const BasicType::Kind kind[2][12] = {
 		{ BasicType::Float, BasicType::Double, BasicType::LongDouble, BasicType::uuFloat80, BasicType::uuFloat128, BasicType::uFloat16, BasicType::uFloat32, BasicType::uFloat32x, BasicType::uFloat64, BasicType::uFloat64x, BasicType::uFloat128, BasicType::uFloat128x },
-		{ BasicType::FloatComplex, BasicType::DoubleComplex, BasicType::LongDoubleComplex, (BasicType::Kind)-1, (BasicType::Kind)-1, BasicType::uFloat16Complex, BasicType::uFloat32Complex, BasicType::uFloat32xComplex, BasicType::uFloat64Complex, BasicType::uFloat64xComplex, BasicType::uFloat128Complex, BasicType::uFloat128xComplex },
+		{ BasicType::FloatComplex, BasicType::DoubleComplex, BasicType::LongDoubleComplex, BasicType::NUMBER_OF_BASIC_TYPES, BasicType::NUMBER_OF_BASIC_TYPES, BasicType::uFloat16Complex, BasicType::uFloat32Complex, BasicType::uFloat32xComplex, BasicType::uFloat64Complex, BasicType::uFloat64xComplex, BasicType::uFloat128Complex, BasicType::uFloat128xComplex },
 	};
 
@@ -374,5 +374,5 @@
 
 Expression * build_field_name_FLOATING_DECIMALconstant( const string & str ) {
-	if ( str[str.size()-1] != '.' ) SemanticError( yylloc, "invalid tuple index " + str );
+	if ( str[str.size() - 1] != '.' ) SemanticError( yylloc, "invalid tuple index " + str );
 	Expression * ret = build_constantInteger( *new string( str.substr( 0, str.size()-1 ) ) );
 	delete &str;
@@ -434,5 +434,5 @@
 } // build_cast
 
-Expression * build_keyword_cast( KeywordCastExpr::Target target, ExpressionNode * expr_node ) {
+Expression * build_keyword_cast( AggregateDecl::Aggregate target, ExpressionNode * expr_node ) {
 	return new KeywordCastExpr( maybeMoveBuild< Expression >(expr_node), target );
 }
Index: c/Parser/LinkageSpec.cc
===================================================================
--- src/Parser/LinkageSpec.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ 	(revision )
@@ -1,67 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// LinkageSpec.cc --
-//
-// Author           : Rodolfo G. Esteves
-// Created On       : Sat May 16 13:22:09 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Thr Spt 12 15:59:00 2018
-// Update Count     : 26
-//
-
-#include <memory>
-#include <string>
-#include <cassert>
-using namespace std;
-
-#include "LinkageSpec.h"
-#include "Common/SemanticError.h"
-
-namespace LinkageSpec {
-
-Spec linkageUpdate( CodeLocation location, Spec old_spec, const string * cmd ) {
-	assert( cmd );
-	unique_ptr<const string> guard( cmd ); // allocated by lexer
-	if ( *cmd == "\"Cforall\"" ) {
-		old_spec.is_mangled = true;
-		return old_spec;
-	} else if ( *cmd == "\"C\"" ) {
-		old_spec.is_mangled = false;
-		return old_spec;
-	} else {
-		SemanticError( location, "Invalid linkage specifier " + *cmd );
-	} // if
-}
-
-std::string linkageName( Spec linkage ) {
-    switch ( linkage ) {
-    case Intrinsic:
-        return "intrinsic";
-    case C:
-        return "C";
-    case Cforall:
-        return "Cforall";
-    case AutoGen:
-        return "autogenerated cfa";
-    case Compiler:
-        return "compiler built-in";
-    case BuiltinCFA:
-        return "cfa built-in";
-    case BuiltinC:
-        return "c built-in";
-    default:
-        return "<unnamed linkage spec>";
-    }
-}
-
-} // LinkageSpec
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: c/Parser/LinkageSpec.h
===================================================================
--- src/Parser/LinkageSpec.h	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ 	(revision )
@@ -1,79 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// LinkageSpec.h --
-//
-// Author           : Rodolfo G. Esteves
-// Created On       : Sat May 16 13:24:28 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jul 10 16:02:34 2019
-// Update Count     : 18
-//
-
-#pragma once
-
-#include <string>
-
-#include "Common/CodeLocation.h"
-
-namespace LinkageSpec {
-	// All linkage specs are some combination of these flags:
-	enum { Mangle = 1 << 0, Generate = 1 << 1, Overrideable = 1 << 2, Builtin = 1 << 3, GccBuiltin = 1 << 4, NoOfSpecs = 1 << 5, };
-
-	union Spec {
-		unsigned int val;
-		struct {
-			bool is_mangled : 1;
-			bool is_generatable : 1;
-			bool is_overridable : 1;
-			bool is_builtin : 1;
-			bool is_gcc_builtin : 1;
-		};
-		constexpr Spec( unsigned int val ) : val( val ) {}
-		constexpr Spec( Spec const & other ) : val( other.val ) {}
-		constexpr Spec & operator=( const Spec & ) = default;
-		// Operators may go here.
-		// Supports == and !=
-		constexpr operator unsigned int() const { return val; }
-	};
-
-
-	Spec linkageUpdate( CodeLocation location, Spec old_spec, const std::string * cmd );
-	/* If cmd = "C" returns a Spec that is old_spec with is_mangled = false
-	 * If cmd = "Cforall" returns old_spec Spec with is_mangled = true
-	 */
-
-	std::string linkageName( Spec );
-
-	// To Update: LinkageSpec::isXyz( cur_spec ) -> cur_spec.is_xyz
-	inline bool isMangled( Spec spec ) { return spec.is_mangled; }
-	inline bool isGeneratable( Spec spec ) { return spec.is_generatable; }
-	inline bool isOverridable( Spec spec ) { return spec.is_overridable; }
-	inline bool isBuiltin( Spec spec ) { return spec.is_builtin; }
-	inline bool isGccBuiltin( Spec spec ) { return spec.is_gcc_builtin; }
-
-	// Pre-defined flag combinations:
-	// C built-in defined in prelude
-	constexpr Spec const Intrinsic = { Mangle | Generate | Overrideable | Builtin };
-	// ordinary
-	constexpr Spec const Cforall = { Mangle | Generate };
-	// not overloadable, not mangled
-	constexpr Spec const C = { Generate };
-	// built by translator (struct assignment)
-	constexpr Spec const AutoGen = { Mangle | Generate | Overrideable };
-	// gcc internal
-	constexpr Spec const Compiler = { Mangle | Builtin | GccBuiltin };
-	// mangled builtins
-	constexpr Spec const BuiltinCFA = { Mangle | Generate | Builtin };
-	// non-mangled builtins
-	constexpr Spec const BuiltinC = { Generate | Builtin };
-};
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/Parser/ParseNode.h	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:28:16 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 25 22:17:10 2019
-// Update Count     : 876
+// Last Modified On : Fri Feb  7 17:56:02 2020
+// Update Count     : 891
 //
 
@@ -28,5 +28,6 @@
 #include "Common/UniqueName.h"     // for UniqueName
 #include "Common/utility.h"        // for maybeClone, maybeBuild
-#include "Parser/LinkageSpec.h"    // for Spec
+#include "SynTree/LinkageSpec.h"   // for Spec
+#include "SynTree/Declaration.h"   // for Aggregate
 #include "SynTree/Expression.h"    // for Expression, ConstantExpr (ptr only)
 #include "SynTree/Label.h"         // for Label
@@ -184,5 +185,5 @@
 
 Expression * build_cast( DeclarationNode * decl_node, ExpressionNode * expr_node );
-Expression * build_keyword_cast( KeywordCastExpr::Target target, ExpressionNode * expr_node );
+Expression * build_keyword_cast( AggregateDecl::Aggregate target, ExpressionNode * expr_node );
 Expression * build_virtual_cast( DeclarationNode * decl_node, ExpressionNode * expr_node );
 Expression * build_fieldSel( ExpressionNode * expr_node, Expression * member );
@@ -217,8 +218,4 @@
 	enum Length { Short, Long, LongLong, NoLength };
 	static const char * lengthNames[];
-	enum Aggregate { Struct, Union, Exception, Trait, Coroutine, Monitor, Thread, NoAggregate };
-	static const char * aggregateNames[];
-	enum TypeClass { Otype, Dtype, Ftype, Ttype, NoTypeClass };
-	static const char * typeClassNames[];
 	enum BuiltinType { Valist, AutoType, Zero, One, NoBuiltinType };
 	static const char * builtinTypeNames[];
@@ -237,10 +234,10 @@
 	static DeclarationNode * newQualifiedType( DeclarationNode *, DeclarationNode * );
 	static DeclarationNode * newFunction( const std::string * name, DeclarationNode * ret, DeclarationNode * param, StatementNode * body );
-	static DeclarationNode * newAggregate( Aggregate kind, const std::string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body );
+	static DeclarationNode * newAggregate( AggregateDecl::Aggregate kind, const std::string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body );
 	static DeclarationNode * newEnum( const std::string * name, DeclarationNode * constants, bool body );
 	static DeclarationNode * newEnumConstant( const std::string * name, ExpressionNode * constant );
 	static DeclarationNode * newName( const std::string * );
 	static DeclarationNode * newFromTypeGen( const std::string *, ExpressionNode * params );
-	static DeclarationNode * newTypeParam( TypeClass, const std::string * );
+	static DeclarationNode * newTypeParam( TypeDecl::Kind, const std::string * );
 	static DeclarationNode * newTrait( const std::string * name, DeclarationNode * params, DeclarationNode * asserts );
 	static DeclarationNode * newTraitUse( const std::string * name, ExpressionNode * params );
@@ -312,5 +309,5 @@
 	struct Variable_t {
 //		const std::string * name;
-		DeclarationNode::TypeClass tyClass;
+		TypeDecl::Kind tyClass;
 		DeclarationNode * assertions;
 		DeclarationNode * initializer;
@@ -452,5 +449,5 @@
 				* out++ = result;
 			} else {
-				assertf(false, "buildList unknown type");
+				SemanticError( cur->location, "type specifier declaration in forall clause is currently unimplemented." );
 			} // if
 		} catch( SemanticErrorException & e ) {
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/Parser/TypeData.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:12:51 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 13 18:16:23 2019
-// Update Count     : 649
+// Last Modified On : Mon Dec 16 07:56:46 2019
+// Update Count     : 662
 //
 
@@ -67,5 +67,5 @@
 	  case Aggregate:
 		// aggregate = new Aggregate_t;
-		aggregate.kind = DeclarationNode::NoAggregate;
+		aggregate.kind = AggregateDecl::NoAggregate;
 		aggregate.name = nullptr;
 		aggregate.params = nullptr;
@@ -345,5 +345,5 @@
 		break;
 	  case Aggregate:
-		os << DeclarationNode::aggregateNames[ aggregate.kind ] << ' ' << *aggregate.name << endl;
+		os << AggregateDecl::aggrString( aggregate.kind ) << ' ' << *aggregate.name << endl;
 		if ( aggregate.params ) {
 			os << string( indent + 2, ' ' ) << "with type parameters" << endl;
@@ -489,5 +489,5 @@
 	for ( typename ForallList::iterator i = outputList.begin(); i != outputList.end(); ++i, n = (DeclarationNode*)n->get_next() ) {
 		TypeDecl * td = static_cast<TypeDecl *>(*i);
-		if ( n->variable.tyClass == DeclarationNode::Otype ) {
+		if ( n->variable.tyClass == TypeDecl::Otype ) {
 			// add assertion parameters to `type' tyvars in reverse order
 			// add dtor:  void ^?{}(T *)
@@ -522,46 +522,45 @@
 	switch ( td->kind ) {
 	  case TypeData::Unknown:
-			// fill in implicit int
-			return new BasicType( buildQualifiers( td ), BasicType::SignedInt );
+		// fill in implicit int
+		return new BasicType( buildQualifiers( td ), BasicType::SignedInt );
 	  case TypeData::Basic:
-			return buildBasicType( td );
+		return buildBasicType( td );
 	  case TypeData::Pointer:
-			return buildPointer( td );
+		return buildPointer( td );
 	  case TypeData::Array:
-			return buildArray( td );
+		return buildArray( td );
 	  case TypeData::Reference:
-			return buildReference( td );
+		return buildReference( td );
 	  case TypeData::Function:
-			return buildFunction( td );
+		return buildFunction( td );
 	  case TypeData::AggregateInst:
-			return buildAggInst( td );
+		return buildAggInst( td );
 	  case TypeData::EnumConstant:
-			// the name gets filled in later -- by SymTab::Validate
-			return new EnumInstType( buildQualifiers( td ), "" );
+		// the name gets filled in later -- by SymTab::Validate
+		return new EnumInstType( buildQualifiers( td ), "" );
 	  case TypeData::SymbolicInst:
-			return buildSymbolicInst( td );
+		return buildSymbolicInst( td );
 	  case TypeData::Tuple:
-			return buildTuple( td );
+		return buildTuple( td );
 	  case TypeData::Typeof:
 	  case TypeData::Basetypeof:
-			return buildTypeof( td );
+		return buildTypeof( td );
 	  case TypeData::Builtin:
-			if (td->builtintype == DeclarationNode::Zero) {
-				return new ZeroType( noQualifiers );
-			}
-			else if (td->builtintype == DeclarationNode::One) {
-				return new OneType( noQualifiers );
-			}
-			else {
-				return new VarArgsType( buildQualifiers( td ) );
-			}
+		switch ( td->builtintype ) {
+		  case DeclarationNode::Zero:
+			return new ZeroType( noQualifiers );
+		  case DeclarationNode::One:
+			return new OneType( noQualifiers );
+		  default:
+			return new VarArgsType( buildQualifiers( td ) );
+		} // switch
 	  case TypeData::GlobalScope:
-			return new GlobalScopeType();
-		case TypeData::Qualified:
-			return new QualifiedType( buildQualifiers( td ), typebuild( td->qualified.parent ), typebuild( td->qualified.child ) );
+		return new GlobalScopeType();
+	  case TypeData::Qualified:
+		return new QualifiedType( buildQualifiers( td ), typebuild( td->qualified.parent ), typebuild( td->qualified.child ) );
 	  case TypeData::Symbolic:
 	  case TypeData::Enum:
 	  case TypeData::Aggregate:
-			assert( false );
+		assert( false );
 	} // switch
 
@@ -768,16 +767,16 @@
 	AggregateDecl * at;
 	switch ( td->aggregate.kind ) {
-	  case DeclarationNode::Struct:
-	  case DeclarationNode::Coroutine:
-	  case DeclarationNode::Monitor:
-	  case DeclarationNode::Thread:
+	  case AggregateDecl::Struct:
+	  case AggregateDecl::Coroutine:
+	  case AggregateDecl::Monitor:
+	  case AggregateDecl::Thread:
 		at = new StructDecl( *td->aggregate.name, td->aggregate.kind, attributes, linkage );
 		buildForall( td->aggregate.params, at->get_parameters() );
 		break;
-	  case DeclarationNode::Union:
+	  case AggregateDecl::Union:
 		at = new UnionDecl( *td->aggregate.name, attributes, linkage );
 		buildForall( td->aggregate.params, at->get_parameters() );
 		break;
-	  case DeclarationNode::Trait:
+	  case AggregateDecl::Trait:
 		at = new TraitDecl( *td->aggregate.name, attributes, linkage );
 		buildList( td->aggregate.params, at->get_parameters() );
@@ -809,14 +808,14 @@
 			  AggregateDecl * typedecl = buildAggregate( type, attributes, linkage );
 			  switch ( type->aggregate.kind ) {
-				case DeclarationNode::Struct:
-				case DeclarationNode::Coroutine:
-				case DeclarationNode::Monitor:
-				case DeclarationNode::Thread:
+				case AggregateDecl::Struct:
+				case AggregateDecl::Coroutine:
+				case AggregateDecl::Monitor:
+				case AggregateDecl::Thread:
 				  ret = new StructInstType( buildQualifiers( type ), (StructDecl *)typedecl );
 				  break;
-				case DeclarationNode::Union:
+				case AggregateDecl::Union:
 				  ret = new UnionInstType( buildQualifiers( type ), (UnionDecl *)typedecl );
 				  break;
-				case DeclarationNode::Trait:
+				case AggregateDecl::Trait:
 				  assert( false );
 				  //ret = new TraitInstType( buildQualifiers( type ), (TraitDecl *)typedecl );
@@ -827,14 +826,14 @@
 		  } else {
 			  switch ( type->aggregate.kind ) {
-				case DeclarationNode::Struct:
-				case DeclarationNode::Coroutine:
-				case DeclarationNode::Monitor:
-				case DeclarationNode::Thread:
+				case AggregateDecl::Struct:
+				case AggregateDecl::Coroutine:
+				case AggregateDecl::Monitor:
+				case AggregateDecl::Thread:
 				  ret = new StructInstType( buildQualifiers( type ), *type->aggregate.name );
 				  break;
-				case DeclarationNode::Union:
+				case AggregateDecl::Union:
 				  ret = new UnionInstType( buildQualifiers( type ), *type->aggregate.name );
 				  break;
-				case DeclarationNode::Trait:
+				case AggregateDecl::Trait:
 				  ret = new TraitInstType( buildQualifiers( type ), *type->aggregate.name );
 				  break;
@@ -863,14 +862,14 @@
 	  case TypeData::Aggregate: {
 		  switch ( type->aggregate.kind ) {
-			case DeclarationNode::Struct:
-			case DeclarationNode::Coroutine:
-			case DeclarationNode::Monitor:
-			case DeclarationNode::Thread:
+			case AggregateDecl::Struct:
+			case AggregateDecl::Coroutine:
+			case AggregateDecl::Monitor:
+			case AggregateDecl::Thread:
 			  ret = new StructInstType( buildQualifiers( type ), *type->aggregate.name );
 			  break;
-			case DeclarationNode::Union:
+			case AggregateDecl::Union:
 			  ret = new UnionInstType( buildQualifiers( type ), *type->aggregate.name );
 			  break;
-			case DeclarationNode::Trait:
+			case AggregateDecl::Trait:
 			  ret = new TraitInstType( buildQualifiers( type ), *type->aggregate.name );
 			  break;
Index: src/Parser/TypeData.h
===================================================================
--- src/Parser/TypeData.h	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/Parser/TypeData.h	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:18:36 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Nov  1 20:56:46 2018
-// Update Count     : 196
+// Last Modified On : Fri Dec 13 23:42:35 2019
+// Update Count     : 199
 //
 
@@ -21,5 +21,5 @@
 
 #include "ParseNode.h"           // for DeclarationNode, DeclarationNode::Ag...
-#include "Parser/LinkageSpec.h"  // for Spec
+#include "SynTree/LinkageSpec.h" // for Spec
 #include "SynTree/Type.h"        // for Type, ReferenceToType (ptr only)
 #include "SynTree/SynTree.h"     // for Visitor Nodes
@@ -30,5 +30,5 @@
 
 	struct Aggregate_t {
-		DeclarationNode::Aggregate kind;
+		AggregateDecl::Aggregate kind;
 		const std::string * name = nullptr;
 		DeclarationNode * params = nullptr;
Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/Parser/lex.ll	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
  * Created On       : Sat Sep 22 08:58:10 2001
  * Last Modified By : Peter A. Buhr
- * Last Modified On : Sun Aug  4 20:53:47 2019
- * Update Count     : 719
+ * Last Modified On : Fri Feb  7 19:02:43 2020
+ * Update Count     : 725
  */
 
@@ -330,6 +330,6 @@
 				/* identifier */
 {identifier}	{ IDENTIFIER_RETURN(); }
-"`"{identifier}"`" {									// CFA
-	yytext[yyleng - 1] = '\0'; yytext += 1;				// SKULLDUGGERY: remove backquotes (ok to shorten?)
+"``"{identifier} {										// CFA
+	yytext[yyleng] = '\0'; yytext += 2;					// SKULLDUGGERY: remove backquotes (ok to shorten?)
 	IDENTIFIER_RETURN();
 }
Index: src/Parser/module.mk
===================================================================
--- src/Parser/module.mk	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/Parser/module.mk	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -11,6 +11,6 @@
 ## Created On       : Sat May 16 15:29:09 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Wed Jun 28 21:58:29 2017
-## Update Count     : 104
+## Last Modified On : Sat Dec 14 07:34:47 2019
+## Update Count     : 107
 ###############################################################################
 
@@ -19,19 +19,15 @@
 AM_YFLAGS = -d -t -v
 
-SRC += Parser/parser.yy \
-       Parser/lex.ll \
-       Parser/TypedefTable.cc \
-       Parser/ParseNode.cc \
+SRC += \
        Parser/DeclarationNode.cc \
        Parser/ExpressionNode.cc \
+       Parser/InitializerNode.cc \
+       Parser/ParseNode.cc \
        Parser/StatementNode.cc \
-       Parser/InitializerNode.cc \
        Parser/TypeData.cc \
-       Parser/LinkageSpec.cc \
+       Parser/TypedefTable.cc \
+       Parser/lex.ll \
+       Parser/parser.yy \
        Parser/parserutility.cc
 
-SRCDEMANGLE += \
-	Parser/LinkageSpec.cc
-
-
 MOSTLYCLEANFILES += Parser/lex.cc Parser/parser.cc Parser/parser.hh Parser/parser.output
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/Parser/parser.yy	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Aug  4 21:48:23 2019
-// Update Count     : 4364
+// Last Modified On : Sat Feb  1 10:04:40 2020
+// Update Count     : 4440
 //
 
@@ -51,8 +51,9 @@
 using namespace std;
 
+#include "SynTree/Declaration.h"
 #include "ParseNode.h"
 #include "TypedefTable.h"
 #include "TypeData.h"
-#include "LinkageSpec.h"
+#include "SynTree/LinkageSpec.h"
 #include "Common/SemanticError.h"						// error_str
 #include "Common/utility.h"								// for maybeMoveBuild, maybeBuild, CodeLo...
@@ -211,5 +212,4 @@
 } // forCtrl
 
-
 bool forall = false, yyy = false;						// aggregate have one or more forall qualifiers ?
 
@@ -237,6 +237,6 @@
 	ExpressionNode * en;
 	DeclarationNode * decl;
-	DeclarationNode::Aggregate aggKey;
-	DeclarationNode::TypeClass tclass;
+	AggregateDecl::Aggregate aggKey;
+	TypeDecl::Kind tclass;
 	StatementNode * sn;
 	WaitForStmt * wfs;
@@ -323,5 +323,5 @@
 %type<op> ptrref_operator				unary_operator				assignment_operator
 %type<en> primary_expression			postfix_expression			unary_expression
-%type<en> cast_expression				exponential_expression		multiplicative_expression	additive_expression
+%type<en> cast_expression_list			cast_expression				exponential_expression		multiplicative_expression	additive_expression
 %type<en> shift_expression				relational_expression		equality_expression
 %type<en> AND_expression				exclusive_OR_expression		inclusive_OR_expression
@@ -365,5 +365,5 @@
 %type<decl> abstract_parameter_declaration
 
-%type<aggKey> aggregate_key
+%type<aggKey> aggregate_key aggregate_data aggregate_control
 %type<decl> aggregate_type aggregate_type_nobody
 
@@ -579,14 +579,4 @@
 	| '(' compound_statement ')'						// GCC, lambda expression
 		{ $$ = new ExpressionNode( new StmtExpr( dynamic_cast< CompoundStmt * >(maybeMoveBuild< Statement >($2) ) ) ); }
-	| constant '`' IDENTIFIER							// CFA, postfix call
-		{ $$ = new ExpressionNode( build_func( new ExpressionNode( build_postfix_name( $3 ) ), $1 ) ); }
-	| string_literal '`' IDENTIFIER						// CFA, postfix call
-		{ $$ = new ExpressionNode( build_func( new ExpressionNode( build_postfix_name( $3 ) ), new ExpressionNode( $1 ) ) ); }
-	| IDENTIFIER '`' IDENTIFIER							// CFA, postfix call
-		{ $$ = new ExpressionNode( build_func( new ExpressionNode( build_postfix_name( $3 ) ), new ExpressionNode( build_varref( $1 ) ) ) ); }
-	| tuple '`' IDENTIFIER								// CFA, postfix call
-		{ $$ = new ExpressionNode( build_func( new ExpressionNode( build_postfix_name( $3 ) ), $1 ) ); }
-	| '(' comma_expression ')' '`' IDENTIFIER			// CFA, postfix call
-		{ $$ = new ExpressionNode( build_func( new ExpressionNode( build_postfix_name( $5 ) ), $2 ) ); }
 	| type_name '.' identifier							// CFA, nested type
 		{ SemanticError( yylloc, "Qualified name is currently unimplemented." ); $$ = nullptr; }
@@ -642,4 +632,10 @@
 	| postfix_expression '(' argument_expression_list ')'
 		{ $$ = new ExpressionNode( build_func( $1, $3 ) ); }
+	| postfix_expression '`' identifier					// CFA, postfix call
+		{ $$ = new ExpressionNode( build_func( new ExpressionNode( build_postfix_name( $3 ) ), $1 ) ); }
+	| constant '`' identifier							// CFA, postfix call
+		{ $$ = new ExpressionNode( build_func( new ExpressionNode( build_postfix_name( $3 ) ), $1 ) ); }
+	| string_literal '`' identifier						// CFA, postfix call
+		{ $$ = new ExpressionNode( build_func( new ExpressionNode( build_postfix_name( $3 ) ), new ExpressionNode( $1 ) ) ); }
 	| postfix_expression '.' identifier
 		{ $$ = new ExpressionNode( build_fieldSel( $1, build_varref( $3 ) ) ); }
@@ -650,4 +646,6 @@
 	| postfix_expression '.' '[' field_name_list ']'	// CFA, tuple field selector
 		{ $$ = new ExpressionNode( build_fieldSel( $1, build_tuple( $4 ) ) ); }
+	| postfix_expression '.' aggregate_control
+		{ $$ = new ExpressionNode( build_keyword_cast( $3, $1 ) ); }
 	| postfix_expression ARROW identifier
 		{ $$ = new ExpressionNode( build_pfieldSel( $1, build_varref( $3 ) ) ); }
@@ -664,5 +662,5 @@
 	| '(' type_no_function ')' '@' '{' initializer_list_opt comma_opt '}' // CFA, explicit C compound-literal
 		{ $$ = new ExpressionNode( build_compoundLiteral( $2, (new InitializerNode( $6, true ))->set_maybeConstructed( false ) ) ); }
-	| '^' primary_expression '{' argument_expression_list '}' // CFA
+	| '^' primary_expression '{' argument_expression_list '}' // CFA, destructor call
 		{
 			Token fn;
@@ -677,5 +675,5 @@
 	| argument_expression
 	| argument_expression_list ',' argument_expression
-		{ $$ = (ExpressionNode *)( $1->set_last( $3 )); }
+		{ $$ = (ExpressionNode *)($1->set_last( $3 )); }
 	;
 
@@ -689,5 +687,5 @@
 field_name_list:										// CFA, tuple field selector
 	field
-	| field_name_list ',' field					{ $$ = (ExpressionNode *)$1->set_last( $3 ); }
+	| field_name_list ',' field					{ $$ = (ExpressionNode *)($1->set_last( $3 )); }
 	;
 
@@ -793,13 +791,6 @@
 	| '(' type_no_function ')' cast_expression
 		{ $$ = new ExpressionNode( build_cast( $2, $4 ) ); }
-		// keyword cast cannot be grouped because of reduction in aggregate_key
-	| '(' GENERATOR '&' ')' cast_expression				// CFA
-		{ $$ = new ExpressionNode( build_keyword_cast( KeywordCastExpr::Coroutine, $5 ) ); }
-	| '(' COROUTINE '&' ')' cast_expression				// CFA
-		{ $$ = new ExpressionNode( build_keyword_cast( KeywordCastExpr::Coroutine, $5 ) ); }
-	| '(' THREAD '&' ')' cast_expression				// CFA
-		{ $$ = new ExpressionNode( build_keyword_cast( KeywordCastExpr::Thread, $5 ) ); }
-	| '(' MONITOR '&' ')' cast_expression				// CFA
-		{ $$ = new ExpressionNode( build_keyword_cast( KeywordCastExpr::Monitor, $5 ) ); }
+	| '(' aggregate_control '&' ')' cast_expression		// CFA
+		{ $$ = new ExpressionNode( build_keyword_cast( $2, $5 ) ); }
 		// VIRTUAL cannot be opt because of look ahead issues
 	| '(' VIRTUAL ')' cast_expression					// CFA
@@ -965,5 +956,5 @@
 		{ $$ = new ExpressionNode( build_tuple( (ExpressionNode *)(new ExpressionNode( nullptr ) )->set_last( $3 ) ) ); }
 	| '[' push assignment_expression pop ',' tuple_expression_list ']'
-		{ $$ = new ExpressionNode( build_tuple( (ExpressionNode *)$3->set_last( $6 ) ) ); }
+		{ $$ = new ExpressionNode( build_tuple( (ExpressionNode *)($3->set_last( $6 ) ) )); }
 	;
 
@@ -971,5 +962,5 @@
 	assignment_expression_opt
 	| tuple_expression_list ',' assignment_expression_opt
-		{ $$ = (ExpressionNode *)$1->set_last( $3 ); }
+		{ $$ = (ExpressionNode *)($1->set_last( $3 )); }
 	;
 
@@ -1195,4 +1186,7 @@
 		{ $$ = forCtrl( $1, new string( DeclarationNode::anonymous.newName() ), new ExpressionNode( build_constantInteger( *new string( "0" ) ) ),
 						OperKinds::LThan, $1->clone(), new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
+	| '=' comma_expression									// CFA
+		{ $$ = forCtrl( $2, new string( DeclarationNode::anonymous.newName() ), new ExpressionNode( build_constantInteger( *new string( "0" ) ) ),
+						OperKinds::LEThan, $2->clone(), new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
 	| comma_expression inclexcl comma_expression		// CFA
 		{ $$ = forCtrl( $1, new string( DeclarationNode::anonymous.newName() ), $1->clone(), $2, $3, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
@@ -1202,4 +1196,7 @@
 		{ $$ = forCtrl( $3, $1, new ExpressionNode( build_constantInteger( *new string( "0" ) ) ),
 						OperKinds::LThan, $3->clone(), new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
+	| comma_expression ';' '=' comma_expression				// CFA
+		{ $$ = forCtrl( $4, $1, new ExpressionNode( build_constantInteger( *new string( "0" ) ) ),
+						OperKinds::LEThan, $4->clone(), new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
 	| comma_expression ';' comma_expression inclexcl comma_expression // CFA
 		{ $$ = forCtrl( $3, $1, $3->clone(), $4, $5, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
@@ -1306,6 +1303,14 @@
 	WAITFOR '(' cast_expression ')'
 		{ $$ = $3; }
-	| WAITFOR '(' cast_expression ',' argument_expression_list ')'
-		{ $$ = (ExpressionNode *)$3->set_last( $5 ); }
+//	| WAITFOR '(' cast_expression ',' argument_expression_list ')'
+//	  	{ $$ = (ExpressionNode *)$3->set_last( $5 ); }
+	| WAITFOR '(' cast_expression_list ':' argument_expression_list ')'
+		{ $$ = (ExpressionNode *)($3->set_last( $5 )); }
+	;
+
+cast_expression_list:
+	cast_expression
+	| cast_expression_list ',' cast_expression
+		{ $$ = (ExpressionNode *)($1->set_last( $3 )); }
 	;
 
@@ -1418,12 +1423,12 @@
 	asm_operand
 	| asm_operands_list ',' asm_operand
-		{ $$ = (ExpressionNode *)$1->set_last( $3 ); }
+		{ $$ = (ExpressionNode *)($1->set_last( $3 )); }
 	;
 
 asm_operand:											// GCC
 	string_literal '(' constant_expression ')'
-		{ $$ = new ExpressionNode( new AsmExpr( maybeMoveBuild< Expression >( (ExpressionNode *)nullptr ), $1, maybeMoveBuild< Expression >( $3 ) ) ); }
-	| '[' constant_expression ']' string_literal '(' constant_expression ')'
-		{ $$ = new ExpressionNode( new AsmExpr( maybeMoveBuild< Expression >( $2 ), $4, maybeMoveBuild< Expression >( $6 ) ) ); }
+		{ $$ = new ExpressionNode( new AsmExpr( nullptr, $1, maybeMoveBuild< Expression >( $3 ) ) ); }
+	| '[' IDENTIFIER ']' string_literal '(' constant_expression ')'
+		{ $$ = new ExpressionNode( new AsmExpr( $2, $4, maybeMoveBuild< Expression >( $6 ) ) ); }
 	;
 
@@ -1434,6 +1439,5 @@
 		{ $$ = new ExpressionNode( $1 ); }
 	| asm_clobbers_list_opt ',' string_literal
-		// set_last returns ParseNode *
-		{ $$ = (ExpressionNode *)$1->set_last( new ExpressionNode( $3 ) ); }
+		{ $$ = (ExpressionNode *)($1->set_last( new ExpressionNode( $3 ) )); }
 	;
 
@@ -2059,18 +2063,26 @@
 
 aggregate_key:
+	aggregate_data
+	| aggregate_control
+	;
+
+aggregate_data:
 	STRUCT
-		{ yyy = true; $$ = DeclarationNode::Struct; }
+		{ yyy = true; $$ = AggregateDecl::Struct; }
 	| UNION
-		{ yyy = true; $$ = DeclarationNode::Union; }
-	| EXCEPTION
-		{ yyy = true; $$ = DeclarationNode::Exception; }
-	| GENERATOR
-		{ yyy = true; $$ = DeclarationNode::Coroutine; }
+		{ yyy = true; $$ = AggregateDecl::Union; }
+	| EXCEPTION											// CFA
+		{ yyy = true; $$ = AggregateDecl::Exception; }
+	;
+
+aggregate_control:										// CFA
+	GENERATOR
+		{ yyy = true; $$ = AggregateDecl::Coroutine; }
 	| COROUTINE
-		{ yyy = true; $$ = DeclarationNode::Coroutine; }
+		{ yyy = true; $$ = AggregateDecl::Coroutine; }
 	| MONITOR
-		{ yyy = true; $$ = DeclarationNode::Monitor; }
+		{ yyy = true; $$ = AggregateDecl::Monitor; }
 	| THREAD
-		{ yyy = true; $$ = DeclarationNode::Thread; }
+		{ yyy = true; $$ = AggregateDecl::Thread; }
 	;
 
@@ -2096,4 +2108,6 @@
 			distInl( $3 );
 		}
+	| INLINE aggregate_control ';'						// CFA
+	   	{ SemanticError( yylloc, "INLINE aggregate control currently unimplemented." ); $$ = nullptr; }
 	| typedef_declaration ';'							// CFA
 	| cfa_field_declaring_list ';'						// CFA, new style field declaration
@@ -2348,5 +2362,5 @@
 	| initializer_list_opt ',' initializer		{ $$ = (InitializerNode *)( $1->set_last( $3 ) ); }
 	| initializer_list_opt ',' designation initializer
-		{ $$ = (InitializerNode *)( $1->set_last( $4->set_designators( $3 ) ) ); }
+		{ $$ = (InitializerNode *)($1->set_last( $4->set_designators( $3 ) )); }
 	;
 
@@ -2370,5 +2384,5 @@
 	designator
 	| designator_list designator
-		{ $$ = (ExpressionNode *)( $1->set_last( $2 ) ); }
+		{ $$ = (ExpressionNode *)($1->set_last( $2 )); }
 	//| designator_list designator						{ $$ = new ExpressionNode( $1, $2 ); }
 	;
@@ -2426,16 +2440,16 @@
 	| type_specifier identifier_parameter_declarator
 	| assertion_list
-		{ $$ = DeclarationNode::newTypeParam( DeclarationNode::Dtype, new string( DeclarationNode::anonymous.newName() ) )->addAssertions( $1 ); }
+		{ $$ = DeclarationNode::newTypeParam( TypeDecl::Dtype, new string( DeclarationNode::anonymous.newName() ) )->addAssertions( $1 ); }
 	;
 
 type_class:												// CFA
 	OTYPE
-		{ $$ = DeclarationNode::Otype; }
+		{ $$ = TypeDecl::Otype; }
 	| DTYPE
-		{ $$ = DeclarationNode::Dtype; }
+		{ $$ = TypeDecl::Dtype; }
 	| FTYPE
-		{ $$ = DeclarationNode::Ftype; }
+		{ $$ = TypeDecl::Ftype; }
 	| TTYPE
-		{ $$ = DeclarationNode::Ttype; }
+		{ $$ = TypeDecl::Ttype; }
 	;
 
@@ -2467,5 +2481,5 @@
 		{ SemanticError( yylloc, toString("Expression generic parameters are currently unimplemented: ", $1->build()) ); $$ = nullptr; }
 	| type_list ',' type
-		{ $$ = (ExpressionNode *)( $1->set_last( new ExpressionNode( new TypeExpr( maybeMoveBuildType( $3 ) ) ) ) ); }
+		{ $$ = (ExpressionNode *)($1->set_last( new ExpressionNode( new TypeExpr( maybeMoveBuildType( $3 ) ) ) )); }
 	| type_list ',' assignment_expression
 		{ SemanticError( yylloc, toString("Expression generic parameters are currently unimplemented: ", $3->build()) ); $$ = nullptr; }
@@ -2578,5 +2592,5 @@
 		{
 			linkageStack.push( linkage );				// handle nested extern "C"/"Cforall"
-			linkage = LinkageSpec::linkageUpdate( yylloc, linkage, $2 );
+			linkage = LinkageSpec::update( yylloc, linkage, $2 );
 		}
 	  '{' up external_definition_list_opt down '}'
Index: src/ResolvExpr/AdjustExprType.cc
===================================================================
--- src/ResolvExpr/AdjustExprType.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/ResolvExpr/AdjustExprType.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 23:41:42 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Mar  2 17:34:53 2016
-// Update Count     : 4
+// Last Modified On : Wed Dec 11 21:43:56 2019
+// Update Count     : 6
 //
 
@@ -133,10 +133,10 @@
 			// replace known function-type-variables with pointer-to-function
 			if ( const ast::EqvClass * eqvClass = tenv.lookup( inst->name ) ) {
-				if ( eqvClass->data.kind == ast::TypeVar::Ftype ) {
+				if ( eqvClass->data.kind == ast::TypeDecl::Ftype ) {
 					return new ast::PointerType{ inst };
 				}
 			} else if ( const ast::NamedTypeDecl * ntDecl = symtab.lookupType( inst->name ) ) {
 				if ( auto tyDecl = dynamic_cast< const ast::TypeDecl * >( ntDecl ) ) {
-					if ( tyDecl->kind == ast::TypeVar::Ftype ) {
+					if ( tyDecl->kind == ast::TypeDecl::Ftype ) {
 						return new ast::PointerType{ inst };
 					}
Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -69,4 +69,5 @@
 		void postvisit( CastExpr * castExpr );
 		void postvisit( VirtualCastExpr * castExpr );
+		void postvisit( KeywordCastExpr * castExpr );
 		void postvisit( UntypedMemberExpr * memberExpr );
 		void postvisit( MemberExpr * memberExpr );
@@ -1255,4 +1256,61 @@
 	}
 
+	void AlternativeFinder::Finder::postvisit( KeywordCastExpr * castExpr ) {
+		assertf( castExpr->get_result(), "Cast target should have been set in Validate." );
+		auto ref = dynamic_cast<ReferenceType*>(castExpr->get_result());
+		assert(ref);
+		auto inst = dynamic_cast<StructInstType*>(ref->base);
+		assert(inst);
+		auto target = inst->baseStruct;
+
+		AlternativeFinder finder( indexer, env );
+
+		auto pick_alternatives = [target, this](AltList & found, bool expect_ref) {
+			for(auto & alt : found) {
+				Type * expr = alt.expr->get_result();
+				if(expect_ref) {
+					auto res = dynamic_cast<ReferenceType*>(expr);
+					if(!res) { continue; }
+					expr = res->base;
+				}
+
+				if(auto insttype = dynamic_cast<TypeInstType*>(expr)) {
+					auto td = alt.env.lookup(insttype->name);
+					if(!td) { continue; }
+					expr = td->type;
+				}
+
+				if(auto base = dynamic_cast<StructInstType*>(expr)) {
+					if(base->baseStruct == target) {
+						alternatives.push_back(
+							std::move(alt)
+						);
+					}
+				}
+			}
+		};
+
+		try {
+			// Attempt 1 : turn (thread&)X into (thread_desc&)X.__thrd
+			// Clone is purely for memory management
+			std::unique_ptr<Expression> tech1 { new UntypedMemberExpr(new NameExpr(castExpr->concrete_target.field), castExpr->arg->clone()) };
+
+			// don't prune here, since it's guaranteed all alternatives will have the same type
+			finder.findWithoutPrune( tech1.get() );
+			pick_alternatives(finder.alternatives, false);
+
+			return;
+		} catch(SemanticErrorException & ) {}
+
+		// Fallback : turn (thread&)X into (thread_desc&)get_thread(X)
+		std::unique_ptr<Expression> fallback { UntypedExpr::createDeref( new UntypedExpr(new NameExpr(castExpr->concrete_target.getter), { castExpr->arg->clone() })) };
+		// don't prune here, since it's guaranteed all alternatives will have the same type
+		finder.findWithoutPrune( fallback.get() );
+
+		pick_alternatives(finder.alternatives, true);
+
+		// Whatever happens here, we have no more fallbacks
+	}
+
 	namespace {
 		/// Gets name from untyped member expression (member must be NameExpr)
Index: src/ResolvExpr/PtrsCastable.cc
===================================================================
--- src/ResolvExpr/PtrsCastable.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/ResolvExpr/PtrsCastable.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 11:48:00 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Mar  2 17:36:18 2016
-// Update Count     : 8
+// Last Modified On : Wed Dec 11 21:48:33 2019
+// Update Count     : 9
 //
 
@@ -176,10 +176,10 @@
 			if ( const ast::NamedTypeDecl * named = symtab.lookupType( inst->name ) ) {
 				if ( auto tyDecl = dynamic_cast< const ast::TypeDecl * >( named ) ) {
-					if ( tyDecl->kind == ast::TypeVar::Ftype ) {
+					if ( tyDecl->kind == ast::TypeDecl::Ftype ) {
 						return -1;
 					}
 				}
 			} else if ( const ast::EqvClass * eqvClass = env.lookup( inst->name ) ) {
-				if ( eqvClass->data.kind == ast::TypeVar::Ftype ) {
+				if ( eqvClass->data.kind == ast::TypeDecl::Ftype ) {
 					return -1;
 				}
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/ResolvExpr/Resolver.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -485,7 +485,4 @@
 		visit_children = false;
 		findVoidExpression( asmExpr->operand, indexer );
-		if ( asmExpr->get_inout() ) {
-			findVoidExpression( asmExpr->inout, indexer );
-		} // if
 	}
 
@@ -1365,9 +1362,4 @@
 		asmExpr = ast::mutate_field(
 			asmExpr, &ast::AsmExpr::operand, findVoidExpression( asmExpr->operand, symtab ) );
-
-		if ( asmExpr->inout ) {
-			asmExpr = ast::mutate_field(
-				asmExpr, &ast::AsmExpr::inout, findVoidExpression( asmExpr->inout, symtab ) );
-		}
 
 		return asmExpr;
Index: src/ResolvExpr/Unify.cc
===================================================================
--- src/ResolvExpr/Unify.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/ResolvExpr/Unify.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 12:27:10 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Wed Sep  4 10:00:00 2019
-// Update Count     : 44
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Dec 13 23:43:05 2019
+// Update Count     : 46
 //
 
@@ -32,5 +32,5 @@
 #include "Common/PassVisitor.h"     // for PassVisitor
 #include "FindOpenVars.h"           // for findOpenVars
-#include "Parser/LinkageSpec.h"     // for C
+#include "SynTree/LinkageSpec.h"    // for C
 #include "SynTree/Constant.h"       // for Constant
 #include "SynTree/Declaration.h"    // for TypeDecl, TypeDecl::Data, Declarati...
@@ -781,5 +781,5 @@
 				if ( const ast::EqvClass * clz = tenv.lookup( typeInst->name ) ) {
 					// expand ttype parameter into its actual type
-					if ( clz->data.kind == ast::TypeVar::Ttype && clz->bound ) {
+					if ( clz->data.kind == ast::TypeDecl::Ttype && clz->bound ) {
 						return clz->bound;
 					}
Index: src/SymTab/Autogen.h
===================================================================
--- src/SymTab/Autogen.h	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/SymTab/Autogen.h	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 21:53:34 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 22 09:50:25 2017
-// Update Count     : 15
+// Last Modified On : Fri Dec 13 16:38:06 2019
+// Update Count     : 16
 //
 
@@ -34,4 +34,5 @@
 #include "SynTree/Expression.h"   // for NameExpr, ConstantExpr, UntypedExpr...
 #include "SynTree/Type.h"         // for Type, ArrayType, Type::Qualifiers
+#include "SynTree/Statement.h"    // for CompoundStmt, DeclStmt, ExprStmt
 
 class CompoundStmt;
Index: src/SymTab/Demangle.cc
===================================================================
--- src/SymTab/Demangle.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/SymTab/Demangle.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Thu Jul 19 12:52:41 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 30 13:46:33 2019
-// Update Count     : 3
+// Last Modified On : Fri Dec 13 14:54:15 2019
+// Update Count     : 4
 //
 
@@ -366,5 +366,5 @@
 				// type variable types
 				for (size_t k = 0; k < TypeDecl::NUMBER_OF_KINDS; ++k) {
-					static const std::string typeVariableNames[] = { "DT", "FT", "TT", };
+					static const std::string typeVariableNames[] = { "DT", "OT", "FT", "TT", };
 					static_assert(
 						sizeof(typeVariableNames)/sizeof(typeVariableNames[0]) == TypeDecl::NUMBER_OF_KINDS,
Index: src/SymTab/Indexer.cc
===================================================================
--- src/SymTab/Indexer.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/SymTab/Indexer.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 21:37:33 2015
-// Last Modified By : Aaron B. Moss
-// Last Modified On : Fri Mar  8 13:55:00 2019
-// Update Count     : 21
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Dec 13 23:43:19 2019
+// Update Count     : 22
 //
 
@@ -31,6 +31,6 @@
 #include "InitTweak/InitTweak.h"   // for isConstructor, isCopyFunction, isC...
 #include "Mangler.h"               // for Mangler
-#include "Parser/LinkageSpec.h"    // for isMangled, isOverridable, Spec
 #include "ResolvExpr/typeops.h"    // for typesCompatible
+#include "SynTree/LinkageSpec.h"   // for isMangled, isOverridable, Spec
 #include "SynTree/Constant.h"      // for Constant
 #include "SynTree/Declaration.h"   // for DeclarationWithType, FunctionDecl
Index: src/SymTab/Mangler.cc
===================================================================
--- src/SymTab/Mangler.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/SymTab/Mangler.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 21:40:29 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 30 13:46:10 2019
-// Update Count     : 26
+// Last Modified On : Fri Dec 13 23:43:49 2019
+// Update Count     : 28
 //
 #include "Mangler.h"
@@ -26,6 +26,6 @@
 #include "Common/SemanticError.h"        // for SemanticError
 #include "Common/utility.h"              // for toString
-#include "Parser/LinkageSpec.h"          // for Spec, isOverridable, AutoGen, Int...
 #include "ResolvExpr/TypeEnvironment.h"  // for TypeEnvironment
+#include "SynTree/LinkageSpec.h"         // for Spec, isOverridable, AutoGen, Int...
 #include "SynTree/Declaration.h"         // for TypeDecl, DeclarationWithType
 #include "SynTree/Expression.h"          // for TypeExpr, Expression, operator<<
@@ -654,5 +654,5 @@
 			// aside from the assert false.
 			assertf(false, "Mangler_new should not visit typedecl: %s", toCString(decl));
-			assertf( decl->kind < ast::TypeVar::Kind::NUMBER_OF_KINDS, "Unhandled type variable kind: %d", decl->kind );
+			assertf( decl->kind < ast::TypeDecl::Kind::NUMBER_OF_KINDS, "Unhandled type variable kind: %d", decl->kind );
 			mangleName << Encoding::typeVariables[ decl->kind ] << ( decl->name.length() ) << decl->name;
 		}
@@ -674,11 +674,11 @@
 					for ( const ast::TypeDecl * decl : ptype->forall ) {
 						switch ( decl->kind ) {
-						case ast::TypeVar::Kind::Dtype:
+						case ast::TypeDecl::Kind::Dtype:
 							dcount++;
 							break;
-						case ast::TypeVar::Kind::Ftype:
+						case ast::TypeDecl::Kind::Ftype:
 							fcount++;
 							break;
-						case ast::TypeVar::Kind::Ttype:
+						case ast::TypeDecl::Kind::Ttype:
 							vcount++;
 							break;
Index: src/SymTab/ManglerCommon.cc
===================================================================
--- src/SymTab/ManglerCommon.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/SymTab/ManglerCommon.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 21:44:03 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Feb 14 17:06:37 2019
-// Update Count     : 26
+// Last Modified On : Fri Dec 13 14:54:38 2019
+// Update Count     : 28
 //
 
@@ -104,4 +104,5 @@
 			const std::string typeVariables[] = {
 				"BD", // dtype
+				"BO", // otype
 				"BF", // ftype
 				"BT", // ttype
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/SymTab/Validate.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 21:50:04 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Wed Aug  7 6:42:00 2019
-// Update Count     : 360
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Dec 13 23:43:34 2019
+// Update Count     : 363
 //
 
@@ -69,9 +69,9 @@
 #include "InitTweak/GenInit.h"         // for fixReturnStatements
 #include "InitTweak/InitTweak.h"       // for isCtorDtorAssign
-#include "Parser/LinkageSpec.h"        // for C
 #include "ResolvExpr/typeops.h"        // for typesCompatible
 #include "ResolvExpr/Resolver.h"       // for findSingleExpression
 #include "ResolvExpr/ResolveTypeof.h"  // for resolveTypeof
 #include "SymTab/Autogen.h"            // for SizeType
+#include "SynTree/LinkageSpec.h"       // for C
 #include "SynTree/Attribute.h"         // for noAttributes, Attribute
 #include "SynTree/Constant.h"          // for Constant
@@ -375,19 +375,14 @@
 			Stats::Heap::newPass("validate-F");
 			Stats::Time::BlockGuard guard("validate-F");
-			Stats::Time::TimeBlock("Fix Object Type", [&]() {
-				FixObjectType::fix( translationUnit );
-			});
-			Stats::Time::TimeBlock("Array Length", [&]() {
-				ArrayLength::computeLength( translationUnit );
-			});
-			Stats::Time::TimeBlock("Find Special Declarations", [&]() {
-				Validate::findSpecialDecls( translationUnit );
-			});
-			Stats::Time::TimeBlock("Fix Label Address", [&]() {
-				mutateAll( translationUnit, labelAddrFixer );
-			});
-			Stats::Time::TimeBlock("Handle Attributes", [&]() {
-				Validate::handleAttributes( translationUnit );
-			});
+			Stats::Time::TimeCall("Fix Object Type",
+				FixObjectType::fix, translationUnit);
+			Stats::Time::TimeCall("Array Length",
+				ArrayLength::computeLength, translationUnit);
+			Stats::Time::TimeCall("Find Special Declarations",
+				Validate::findSpecialDecls, translationUnit);
+			Stats::Time::TimeCall("Fix Label Address",
+				mutateAll<LabelAddressFixer>, translationUnit, labelAddrFixer);
+			Stats::Time::TimeCall("Handle Attributes",
+				Validate::handleAttributes, translationUnit);
 		}
 	}
@@ -1049,5 +1044,5 @@
 		Type * designatorType = tyDecl->base->stripDeclarator();
 		if ( StructInstType * aggDecl = dynamic_cast< StructInstType * >( designatorType ) ) {
-			declsToAddBefore.push_back( new StructDecl( aggDecl->name, DeclarationNode::Struct, noAttributes, tyDecl->linkage ) );
+			declsToAddBefore.push_back( new StructDecl( aggDecl->name, AggregateDecl::Struct, noAttributes, tyDecl->linkage ) );
 		} else if ( UnionInstType * aggDecl = dynamic_cast< UnionInstType * >( designatorType ) ) {
 			declsToAddBefore.push_back( new UnionDecl( aggDecl->name, noAttributes, tyDecl->linkage ) );
Index: src/SynTree/AggregateDecl.cc
===================================================================
--- src/SynTree/AggregateDecl.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/SynTree/AggregateDecl.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 23:56:39 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Fri Aug  4 14:22:00 2017
-// Update Count     : 22
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Mon Dec 16 15:07:20 2019
+// Update Count     : 31
 //
 
@@ -21,7 +21,15 @@
 #include "Common/utility.h"      // for printAll, cloneAll, deleteAll
 #include "Declaration.h"         // for AggregateDecl, TypeDecl, Declaration
-#include "Parser/LinkageSpec.h"  // for Spec, linkageName, Cforall
+#include "Initializer.h"
+#include "LinkageSpec.h"         // for Spec, linkageName, Cforall
 #include "Type.h"                // for Type, Type::StorageClasses
 
+
+// These must harmonize with the corresponding AggregateDecl::Aggregate enumerations.
+static const char * aggregateNames[] = { "struct", "union", "enum", "exception", "trait", "generator", "coroutine", "monitor", "thread", "NoAggregateName" };
+
+const char * AggregateDecl::aggrString( AggregateDecl::Aggregate aggr ) {
+	return aggregateNames[aggr];
+}
 
 AggregateDecl::AggregateDecl( const std::string &name, const std::list< Attribute * > & attributes, LinkageSpec::Spec linkage ) : Parent( name, Type::StorageClasses(), linkage ), body( false ), attributes( attributes ) {
@@ -47,5 +55,5 @@
 	os << typeString() << " " << name << ":";
 	if ( get_linkage() != LinkageSpec::Cforall ) {
-		os << " " << LinkageSpec::linkageName( linkage );
+		os << " " << LinkageSpec::name( linkage );
 	} // if
 	os << " with body " << has_body();
@@ -78,11 +86,11 @@
 }
 
-std::string StructDecl::typeString() const { return "struct"; }
+const char * StructDecl::typeString() const { return aggrString( kind ); }
 
-std::string UnionDecl::typeString() const { return "union"; }
+const char * UnionDecl::typeString() const { return aggrString( Union ); }
 
-std::string EnumDecl::typeString() const { return "enum"; }
+const char * EnumDecl::typeString() const { return aggrString( Enum ); }
 
-std::string TraitDecl::typeString() const { return "trait"; }
+const char * TraitDecl::typeString() const { return aggrString( Trait ); }
 
 bool EnumDecl::valueOf( Declaration * enumerator, long long int & value ) {
Index: src/SynTree/Declaration.cc
===================================================================
--- src/SynTree/Declaration.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/SynTree/Declaration.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Wed Aug  9 14:38:00 2017
-// Update Count     : 25
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Dec 11 16:39:56 2019
+// Update Count     : 36
 //
 
@@ -24,6 +24,8 @@
 #include "SynTree/Statement.h"       // for AsmStmt
 #include "SynTree/SynTree.h"         // for UniqueId
+#include "SynTree/Expression.h"
 #include "Type.h"                    // for Type, Type::StorageClasses
 
+// To canonicalize declarations
 static UniqueId lastUniqueId = 0;
 
Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/SynTree/Declaration.h	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Thr May  2 10:47:00 2019
-// Update Count     : 135
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Dec 13 23:11:22 2019
+// Update Count     : 157
 //
 
@@ -24,6 +24,5 @@
 #include "BaseSyntaxNode.h"      // for BaseSyntaxNode
 #include "Mutator.h"             // for Mutator
-#include "Parser/LinkageSpec.h"  // for Spec, Cforall
-#include "Parser/ParseNode.h"    // for DeclarationNode, DeclarationNode::Ag...
+#include "LinkageSpec.h"         // for Spec, Cforall
 #include "SynTree.h"             // for UniqueId
 #include "SynTree/Type.h"        // for Type, Type::StorageClasses, Type::Fu...
@@ -44,9 +43,9 @@
 	bool extension = false;
 
-	Declaration( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage );
-	Declaration( const Declaration &other );
+	Declaration( const std::string & name, Type::StorageClasses scs, LinkageSpec::Spec linkage );
+	Declaration( const Declaration & other );
 	virtual ~Declaration();
 
-	const std::string &get_name() const { return name; }
+	const std::string & get_name() const { return name; }
 	void set_name( std::string newValue ) { name = newValue; }
 
@@ -59,13 +58,13 @@
 
 	bool get_extension() const { return extension; }
-	Declaration *set_extension( bool exten ) { extension = exten; return this; }
+	Declaration * set_extension( bool exten ) { extension = exten; return this; }
 
 	void fixUniqueId( void );
-	virtual Declaration *clone() const override = 0;
+	virtual Declaration * clone() const override = 0;
 	virtual void accept( Visitor & v ) override = 0;
 	virtual void accept( Visitor & v ) const override = 0;
-	virtual Declaration *acceptMutator( Mutator &m ) override = 0;
-	virtual void print( std::ostream &os, Indenter indent = {} ) const override = 0;
-	virtual void printShort( std::ostream &os, Indenter indent = {} ) const = 0;
+	virtual Declaration * acceptMutator( Mutator & m ) override = 0;
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override = 0;
+	virtual void printShort( std::ostream & os, Indenter indent = {} ) const = 0;
 
 	UniqueId uniqueId;
@@ -81,10 +80,10 @@
 	int scopeLevel = 0;
 
-	Expression *asmName;
+	Expression * asmName;
 	std::list< Attribute * > attributes;
 	bool isDeleted = false;
 
-	DeclarationWithType( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage, const std::list< Attribute * > & attributes, Type::FuncSpecifiers fs );
-	DeclarationWithType( const DeclarationWithType &other );
+	DeclarationWithType( const std::string & name, Type::StorageClasses scs, LinkageSpec::Spec linkage, const std::list< Attribute * > & attributes, Type::FuncSpecifiers fs );
+	DeclarationWithType( const DeclarationWithType & other );
 	virtual ~DeclarationWithType();
 
@@ -97,6 +96,6 @@
 	DeclarationWithType * set_scopeLevel( int newValue ) { scopeLevel = newValue; return this; }
 
-	Expression *get_asmName() const { return asmName; }
-	DeclarationWithType * set_asmName( Expression *newValue ) { asmName = newValue; return this; }
+	Expression * get_asmName() const { return asmName; }
+	DeclarationWithType * set_asmName( Expression * newValue ) { asmName = newValue; return this; }
 
 	std::list< Attribute * >& get_attributes() { return attributes; }
@@ -106,6 +105,6 @@
 	//void set_functionSpecifiers( Type::FuncSpecifiers newValue ) { fs = newValue; }
 
-	virtual DeclarationWithType *clone() const override = 0;
-	virtual DeclarationWithType *acceptMutator( Mutator &m )  override = 0;
+	virtual DeclarationWithType * clone() const override = 0;
+	virtual DeclarationWithType * acceptMutator( Mutator & m )  override = 0;
 
 	virtual Type * get_type() const = 0;
@@ -119,30 +118,30 @@
 	typedef DeclarationWithType Parent;
   public:
-	Type *type;
-	Initializer *init;
-	Expression *bitfieldWidth;
-
-	ObjectDecl( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage, Expression *bitfieldWidth, Type *type, Initializer *init,
+	Type * type;
+	Initializer * init;
+	Expression * bitfieldWidth;
+
+	ObjectDecl( const std::string & name, Type::StorageClasses scs, LinkageSpec::Spec linkage, Expression * bitfieldWidth, Type * type, Initializer * init,
 				const std::list< Attribute * > attributes = std::list< Attribute * >(), Type::FuncSpecifiers fs = Type::FuncSpecifiers() );
-	ObjectDecl( const ObjectDecl &other );
+	ObjectDecl( const ObjectDecl & other );
 	virtual ~ObjectDecl();
 
 	virtual Type * get_type() const override { return type; }
-	virtual void set_type(Type *newType) override { type = newType; }
-
-	Initializer *get_init() const { return init; }
-	void set_init( Initializer *newValue ) { init = newValue; }
-
-	Expression *get_bitfieldWidth() const { return bitfieldWidth; }
-	void set_bitfieldWidth( Expression *newValue ) { bitfieldWidth = newValue; }
+	virtual void set_type(Type * newType) override { type = newType; }
+
+	Initializer * get_init() const { return init; }
+	void set_init( Initializer * newValue ) { init = newValue; }
+
+	Expression * get_bitfieldWidth() const { return bitfieldWidth; }
+	void set_bitfieldWidth( Expression * newValue ) { bitfieldWidth = newValue; }
 
 	static ObjectDecl * newObject( const std::string & name, Type * type, Initializer * init );
 
-	virtual ObjectDecl *clone() const override { return new ObjectDecl( *this ); }
-	virtual void accept( Visitor & v ) override { v.visit( this ); }
-	virtual void accept( Visitor & v ) const override { v.visit( this ); }
-	virtual DeclarationWithType *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
-	virtual void print( std::ostream &os, Indenter indent = {} ) const override;
-	virtual void printShort( std::ostream &os, Indenter indent = {} ) const override;
+	virtual ObjectDecl * clone() const override { return new ObjectDecl( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+	virtual DeclarationWithType * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override;
+	virtual void printShort( std::ostream & os, Indenter indent = {} ) const override;
 };
 
@@ -150,11 +149,11 @@
 	typedef DeclarationWithType Parent;
   public:
-	FunctionType *type;
-	CompoundStmt *statements;
+	FunctionType * type;
+	CompoundStmt * statements;
 	std::list< Expression * > withExprs;
 
-	FunctionDecl( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage, FunctionType *type, CompoundStmt *statements,
+	FunctionDecl( const std::string & name, Type::StorageClasses scs, LinkageSpec::Spec linkage, FunctionType * type, CompoundStmt * statements,
 				  const std::list< Attribute * > attributes = std::list< Attribute * >(), Type::FuncSpecifiers fs = Type::FuncSpecifiers() );
-	FunctionDecl( const FunctionDecl &other );
+	FunctionDecl( const FunctionDecl & other );
 	virtual ~FunctionDecl();
 
@@ -163,17 +162,17 @@
 
 	FunctionType * get_functionType() const { return type; }
-	void set_functionType( FunctionType *newValue ) { type = newValue; }
-	CompoundStmt *get_statements() const { return statements; }
-	void set_statements( CompoundStmt *newValue ) { statements = newValue; }
+	void set_functionType( FunctionType * newValue ) { type = newValue; }
+	CompoundStmt * get_statements() const { return statements; }
+	void set_statements( CompoundStmt * newValue ) { statements = newValue; }
 	bool has_body() const { return NULL != statements; }
 
 	static FunctionDecl * newFunction( const std::string & name, FunctionType * type, CompoundStmt * statements );
 
-	virtual FunctionDecl *clone() const override { return new FunctionDecl( *this ); }
-	virtual void accept( Visitor & v ) override { v.visit( this ); }
-	virtual void accept( Visitor & v ) const override { v.visit( this ); }
-	virtual DeclarationWithType *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
-	virtual void print( std::ostream &os, Indenter indent = {} ) const override;
-	virtual void printShort( std::ostream &os, Indenter indent = {} ) const override;
+	virtual FunctionDecl * clone() const override { return new FunctionDecl( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+	virtual DeclarationWithType * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override;
+	virtual void printShort( std::ostream & os, Indenter indent = {} ) const override;
 };
 
@@ -181,22 +180,22 @@
 	typedef Declaration Parent;
   public:
-	Type *base;
-	std::list< TypeDecl* > parameters;
-	std::list< DeclarationWithType* > assertions;
-
-	NamedTypeDecl( const std::string &name, Type::StorageClasses scs, Type *type );
-	NamedTypeDecl( const NamedTypeDecl &other );
+	Type * base;
+	std::list< TypeDecl * > parameters;
+	std::list< DeclarationWithType * > assertions;
+
+	NamedTypeDecl( const std::string & name, Type::StorageClasses scs, Type * type );
+	NamedTypeDecl( const NamedTypeDecl & other );
 	virtual ~NamedTypeDecl();
 
-	Type *get_base() const { return base; }
-	void set_base( Type *newValue ) { base = newValue; }
-	std::list< TypeDecl* >& get_parameters() { return parameters; }
-	std::list< DeclarationWithType* >& get_assertions() { return assertions; }
-
-	virtual std::string typeString() const = 0;
-
-	virtual NamedTypeDecl *clone() const override = 0;
-	virtual void print( std::ostream &os, Indenter indent = {} ) const override;
-	virtual void printShort( std::ostream &os, Indenter indent = {} ) const override;
+	Type * get_base() const { return base; }
+	void set_base( Type * newValue ) { base = newValue; }
+	std::list< TypeDecl* > & get_parameters() { return parameters; }
+	std::list< DeclarationWithType * >& get_assertions() { return assertions; }
+
+	virtual const char * typeString() const = 0;
+
+	virtual NamedTypeDecl * clone() const override = 0;
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override;
+	virtual void printShort( std::ostream & os, Indenter indent = {} ) const override;
 };
 
@@ -204,26 +203,27 @@
 	typedef NamedTypeDecl Parent;
   public:
-	enum Kind { Dtype, Ftype, Ttype, NUMBER_OF_KINDS };
-
+	enum Kind { Dtype, Otype, Ftype, Ttype, NUMBER_OF_KINDS };
+
+	Kind kind;
+	bool sized;
 	Type * init;
-	bool sized;
 
 	/// Data extracted from a type decl
 	struct Data {
-		TypeDecl::Kind kind;
+		Kind kind;
 		bool isComplete;
 
-		Data() : kind( (TypeDecl::Kind)-1 ), isComplete( false ) {}
-		Data( TypeDecl * typeDecl ) : Data( typeDecl->get_kind(), typeDecl->isComplete() ) {}
+		Data() : kind( NUMBER_OF_KINDS ), isComplete( false ) {}
+		Data( const TypeDecl * typeDecl ) : Data( typeDecl->get_kind(), typeDecl->isComplete() ) {}
 		Data( Kind kind, bool isComplete ) : kind( kind ), isComplete( isComplete ) {}
-		Data( const Data& d1, const Data& d2 )
-		: kind( d1.kind ), isComplete ( d1.isComplete || d2.isComplete ) {}
-
-		bool operator==(const Data & other) const { return kind == other.kind && isComplete == other.isComplete; }
-		bool operator!=(const Data & other) const { return !(*this == other);}
+		Data( const Data & d1, const Data & d2 )
+			: kind( d1.kind ), isComplete( d1.isComplete || d2.isComplete ) {}
+
+		bool operator==( const Data & other ) const { return kind == other.kind && isComplete == other.isComplete; }
+		bool operator!=( const Data & other ) const { return !(*this == other);}
 	};
 
-	TypeDecl( const std::string &name, Type::StorageClasses scs, Type *type, Kind kind, bool sized, Type * init = nullptr );
-	TypeDecl( const TypeDecl &other );
+	TypeDecl( const std::string & name, Type::StorageClasses scs, Type * type, Kind kind, bool sized, Type * init = nullptr );
+	TypeDecl( const TypeDecl & other );
 	virtual ~TypeDecl();
 
@@ -237,14 +237,12 @@
 	TypeDecl * set_sized( bool newValue ) { sized = newValue; return this; }
 
-	virtual std::string typeString() const override;
-	virtual std::string genTypeString() const;
-
-	virtual TypeDecl *clone() const override { return new TypeDecl( *this ); }
-	virtual void accept( Visitor & v ) override { v.visit( this ); }
-	virtual void accept( Visitor & v ) const override { v.visit( this ); }
-	virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
-	virtual void print( std::ostream &os, Indenter indent = {} ) const override;
-
-	Kind kind;
+	virtual const char * typeString() const override;
+	virtual const char * genTypeString() const;
+
+	virtual TypeDecl * clone() const override { return new TypeDecl( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+	virtual Declaration * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override;
 };
 
@@ -252,15 +250,15 @@
 	typedef NamedTypeDecl Parent;
   public:
-	TypedefDecl( const std::string &name, CodeLocation location, Type::StorageClasses scs, Type *type, LinkageSpec::Spec spec = LinkageSpec::Cforall )
+	TypedefDecl( const std::string & name, CodeLocation location, Type::StorageClasses scs, Type * type, LinkageSpec::Spec spec = LinkageSpec::Cforall )
 		: Parent( name, scs, type ) { set_linkage( spec ); this->location = location; }
 
-	TypedefDecl( const TypedefDecl &other ) : Parent( other ) {}
-
-	virtual std::string typeString() const override;
-
-	virtual TypedefDecl *clone() const override { return new TypedefDecl( *this ); }
-	virtual void accept( Visitor & v ) override { v.visit( this ); }
-	virtual void accept( Visitor & v ) const override { v.visit( this ); }
-	virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
+	TypedefDecl( const TypedefDecl & other ) : Parent( other ) {}
+
+	virtual const char * typeString() const override;
+
+	virtual TypedefDecl * clone() const override { return new TypedefDecl( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+	virtual Declaration * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
   private:
 };
@@ -269,4 +267,7 @@
 	typedef Declaration Parent;
   public:
+	enum Aggregate { Struct, Union, Enum, Exception, Trait, Generator, Coroutine, Monitor, Thread, NoAggregate };
+	static const char * aggrString( Aggregate aggr );
+
 	std::list<Declaration*> members;
 	std::list<TypeDecl*> parameters;
@@ -275,6 +276,6 @@
 	AggregateDecl * parent = nullptr;
 
-	AggregateDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall );
-	AggregateDecl( const AggregateDecl &other );
+	AggregateDecl( const std::string & name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall );
+	AggregateDecl( const AggregateDecl & other );
 	virtual ~AggregateDecl();
 
@@ -288,8 +289,8 @@
 	AggregateDecl * set_body( bool body ) { AggregateDecl::body = body; return this; }
 
-	virtual void print( std::ostream &os, Indenter indent = {} ) const override final;
-	virtual void printShort( std::ostream &os, Indenter indent = {} ) const override;
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override final;
+	virtual void printShort( std::ostream & os, Indenter indent = {} ) const override;
   protected:
-	virtual std::string typeString() const = 0;
+	virtual const char * typeString() const = 0;
 };
 
@@ -297,18 +298,18 @@
 	typedef AggregateDecl Parent;
   public:
-	StructDecl( const std::string &name, DeclarationNode::Aggregate kind = DeclarationNode::Struct, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ), kind( kind ) {}
-	StructDecl( const StructDecl &other ) : Parent( other ), kind( other.kind ) {}
-
-	bool is_coroutine() { return kind == DeclarationNode::Coroutine; }
-	bool is_monitor() { return kind == DeclarationNode::Monitor; }
-	bool is_thread() { return kind == DeclarationNode::Thread; }
-
-	virtual StructDecl *clone() const override { return new StructDecl( *this ); }
-	virtual void accept( Visitor & v ) override { v.visit( this ); }
-	virtual void accept( Visitor & v ) const override { v.visit( this ); }
-	virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
-	DeclarationNode::Aggregate kind;
-  private:
-	virtual std::string typeString() const override;
+	StructDecl( const std::string & name, Aggregate kind = Struct, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ), kind( kind ) {}
+	StructDecl( const StructDecl & other ) : Parent( other ), kind( other.kind ) {}
+
+	bool is_coroutine() { return kind == Coroutine; }
+	bool is_monitor() { return kind == Monitor; }
+	bool is_thread() { return kind == Thread; }
+
+	virtual StructDecl * clone() const override { return new StructDecl( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+	virtual Declaration * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
+	Aggregate kind;
+  private:
+	virtual const char * typeString() const override;
 };
 
@@ -316,13 +317,13 @@
 	typedef AggregateDecl Parent;
   public:
-	UnionDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ) {}
-	UnionDecl( const UnionDecl &other ) : Parent( other ) {}
-
-	virtual UnionDecl *clone() const override { return new UnionDecl( *this ); }
-	virtual void accept( Visitor & v ) override { v.visit( this ); }
-	virtual void accept( Visitor & v ) const override { v.visit( this ); }
-	virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
-  private:
-	virtual std::string typeString() const override;
+	UnionDecl( const std::string & name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ) {}
+	UnionDecl( const UnionDecl & other ) : Parent( other ) {}
+
+	virtual UnionDecl * clone() const override { return new UnionDecl( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+	virtual Declaration * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
+  private:
+	virtual const char * typeString() const override;
 };
 
@@ -330,16 +331,16 @@
 	typedef AggregateDecl Parent;
   public:
-	EnumDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ) {}
-	EnumDecl( const EnumDecl &other ) : Parent( other ) {}
+	EnumDecl( const std::string & name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ) {}
+	EnumDecl( const EnumDecl & other ) : Parent( other ) {}
 
 	bool valueOf( Declaration * enumerator, long long int & value );
 
-	virtual EnumDecl *clone() const override { return new EnumDecl( *this ); }
-	virtual void accept( Visitor & v ) override { v.visit( this ); }
-	virtual void accept( Visitor & v ) const override { v.visit( this ); }
-	virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
+	virtual EnumDecl * clone() const override { return new EnumDecl( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+	virtual Declaration * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
   private:
 	std::unordered_map< std::string, long long int > enumValues;
-	virtual std::string typeString() const override;
+	virtual const char * typeString() const override;
 };
 
@@ -347,15 +348,15 @@
 	typedef AggregateDecl Parent;
   public:
-	TraitDecl( const std::string &name, const std::list< Attribute * > & attributes, LinkageSpec::Spec linkage ) : Parent( name, attributes, linkage ) {
+	TraitDecl( const std::string & name, const std::list< Attribute * > & attributes, LinkageSpec::Spec linkage ) : Parent( name, attributes, linkage ) {
 		assertf( attributes.empty(), "attribute unsupported for traits" );
 	}
-	TraitDecl( const TraitDecl &other ) : Parent( other ) {}
-
-	virtual TraitDecl *clone() const override { return new TraitDecl( *this ); }
-	virtual void accept( Visitor & v ) override { v.visit( this ); }
-	virtual void accept( Visitor & v ) const override { v.visit( this ); }
-	virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
-  private:
-	virtual std::string typeString() const override;
+	TraitDecl( const TraitDecl & other ) : Parent( other ) {}
+
+	virtual TraitDecl * clone() const override { return new TraitDecl( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+	virtual Declaration * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
+  private:
+	virtual const char * typeString() const override;
 };
 
@@ -379,19 +380,19 @@
 class AsmDecl : public Declaration {
   public:
-	AsmStmt *stmt;
-
-	AsmDecl( AsmStmt *stmt );
-	AsmDecl( const AsmDecl &other );
+	AsmStmt * stmt;
+
+	AsmDecl( AsmStmt * stmt );
+	AsmDecl( const AsmDecl & other );
 	virtual ~AsmDecl();
 
-	AsmStmt *get_stmt() { return stmt; }
-	void set_stmt( AsmStmt *newValue ) { stmt = newValue; }
-
-	virtual AsmDecl *clone() const override { return new AsmDecl( *this ); }
-	virtual void accept( Visitor & v ) override { v.visit( this ); }
-	virtual void accept( Visitor & v ) const override { v.visit( this ); }
-	virtual AsmDecl *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
-	virtual void print( std::ostream &os, Indenter indent = {} ) const override;
-	virtual void printShort( std::ostream &os, Indenter indent = {} ) const override;
+	AsmStmt * get_stmt() { return stmt; }
+	void set_stmt( AsmStmt * newValue ) { stmt = newValue; }
+
+	virtual AsmDecl * clone() const override { return new AsmDecl( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+	virtual AsmDecl * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override;
+	virtual void printShort( std::ostream & os, Indenter indent = {} ) const override;
 };
 
@@ -408,7 +409,7 @@
 	virtual void accept( Visitor & v ) override { v.visit( this ); }
 	virtual void accept( Visitor & v ) const override { v.visit( this ); }
-	virtual StaticAssertDecl * acceptMutator( Mutator &m )  override { return m.mutate( this ); }
-	virtual void print( std::ostream &os, Indenter indent = {} ) const override;
-	virtual void printShort( std::ostream &os, Indenter indent = {} ) const override;
+	virtual StaticAssertDecl * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override;
+	virtual void printShort( std::ostream & os, Indenter indent = {} ) const override;
 };
 
Index: src/SynTree/DeclarationWithType.cc
===================================================================
--- src/SynTree/DeclarationWithType.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/SynTree/DeclarationWithType.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 16 08:34:35 2017
-// Update Count     : 25
+// Last Modified On : Fri Dec 13 23:45:16 2019
+// Update Count     : 26
 //
 
@@ -20,6 +20,6 @@
 #include "Common/utility.h"      // for cloneAll, deleteAll, maybeClone
 #include "Declaration.h"         // for DeclarationWithType, Declaration
-#include "Parser/LinkageSpec.h"  // for Spec
-#include "SynTree/Expression.h"  // for ConstantExpr
+#include "LinkageSpec.h"         // for Spec
+#include "Expression.h"          // for ConstantExpr
 #include "Type.h"                // for Type, Type::FuncSpecifiers, Type::St...
 
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/SynTree/Expression.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Thr Aug 15 13:43:00 2019
-// Update Count     : 64
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Dec 11 07:55:15 2019
+// Update Count     : 70
 //
 
@@ -22,5 +22,4 @@
 
 #include "Common/utility.h"          // for maybeClone, cloneAll, deleteAll
-#include "Declaration.h"             // for ObjectDecl, DeclarationWithType
 #include "Expression.h"              // for Expression, ImplicitCopyCtorExpr
 #include "InitTweak/InitTweak.h"     // for getCallArg, getPointerBase
@@ -294,5 +293,5 @@
 }
 
-KeywordCastExpr::KeywordCastExpr( Expression * arg, Target target ) : Expression(), arg(arg), target( target ) {
+KeywordCastExpr::KeywordCastExpr( Expression * arg, AggregateDecl::Aggregate target ) : Expression(), arg(arg), target( target ) {
 }
 
@@ -304,13 +303,6 @@
 }
 
-const std::string & KeywordCastExpr::targetString() const {
-	static const std::string targetStrs[] = {
-		"coroutine", "thread", "monitor"
-	};
-	static_assert(
-		(sizeof(targetStrs) / sizeof(targetStrs[0])) == ((unsigned long)NUMBER_OF_TARGETS),
-		"Each KeywordCastExpr::Target should have a corresponding string representation"
-	);
-	return targetStrs[(unsigned long)target];
+const char * KeywordCastExpr::targetString() const {
+	return AggregateDecl::aggrString( target );
 }
 
@@ -527,10 +519,10 @@
 }
 
-AsmExpr::AsmExpr( const AsmExpr & other ) : Expression( other ), inout( maybeClone( other.inout ) ), constraint( maybeClone( other.constraint ) ), operand( maybeClone( other.operand ) ) {}
+AsmExpr::AsmExpr( const AsmExpr & other ) : Expression( other ), inout( other.inout ), constraint( maybeClone( other.constraint ) ), operand( maybeClone( other.operand ) ) {}
 
 
 void AsmExpr::print( std::ostream & os, Indenter indent ) const {
 	os << "Asm Expression: " << std::endl;
-	if ( inout ) inout->print( os, indent+1 );
+	if ( !inout.empty() ) os <<  "[" << inout << "] ";
 	if ( constraint ) constraint->print( os, indent+1 );
 	if ( operand ) operand->print( os, indent+1 );
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/SynTree/Expression.h	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Thr Aug 15 13:46:00 2019
-// Update Count     : 54
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Dec 11 16:50:19 2019
+// Update Count     : 60
 //
 
@@ -28,4 +28,5 @@
 #include "Label.h"                // for Label
 #include "Mutator.h"              // for Mutator
+#include "Declaration.h"          // for Aggregate
 #include "SynTree.h"              // for UniqueId
 #include "Visitor.h"              // for Visitor
@@ -229,13 +230,16 @@
 public:
 	Expression * arg;
-	enum Target {
-		Coroutine, Thread, Monitor, NUMBER_OF_TARGETS
-	} target;
-
-	KeywordCastExpr( Expression * arg, Target target );
+	struct Concrete {
+		std::string field;
+		std::string getter;
+	};
+	AggregateDecl::Aggregate target;
+	Concrete concrete_target;
+
+	KeywordCastExpr( Expression * arg, AggregateDecl::Aggregate target );
 	KeywordCastExpr( const KeywordCastExpr & other );
 	virtual ~KeywordCastExpr();
 
-	const std::string & targetString() const;
+	const char * targetString() const;
 
 	virtual KeywordCastExpr * clone() const override { return new KeywordCastExpr( * this ); }
@@ -575,20 +579,11 @@
 class AsmExpr : public Expression {
   public:
-	Expression * inout;
+	std::string inout;
 	Expression * constraint;
 	Expression * operand;
 
-	AsmExpr( Expression * inout, Expression * constraint, Expression * operand ) : inout( inout ), constraint( constraint ), operand( operand ) {}
+	AsmExpr( const std::string * _inout, Expression * constraint, Expression * operand ) : inout( _inout ? *_inout : "" ), constraint( constraint ), operand( operand ) { delete _inout; }
 	AsmExpr( const AsmExpr & other );
-	virtual ~AsmExpr() { delete inout; delete constraint; delete operand; };
-
-	Expression * get_inout() const { return inout; }
-	void set_inout( Expression * newValue ) { inout = newValue; }
-
-	Expression * get_constraint() const { return constraint; }
-	void set_constraint( Expression * newValue ) { constraint = newValue; }
-
-	Expression * get_operand() const { return operand; }
-	void set_operand( Expression * newValue ) { operand = newValue; }
+	virtual ~AsmExpr() { delete constraint; delete operand; };
 
 	virtual AsmExpr * clone() const override { return new AsmExpr( * this ); }
Index: src/SynTree/FunctionDecl.cc
===================================================================
--- src/SynTree/FunctionDecl.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/SynTree/FunctionDecl.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 16 08:33:41 2017
-// Update Count     : 74
+// Last Modified On : Mon Dec 16 15:11:20 2019
+// Update Count     : 77
 //
 
@@ -23,5 +23,6 @@
 #include "Common/utility.h"      // for maybeClone, printAll
 #include "Declaration.h"         // for FunctionDecl, FunctionDecl::Parent
-#include "Parser/LinkageSpec.h"  // for Spec, linkageName, Cforall
+#include "Expression.h"
+#include "LinkageSpec.h"         // for Spec, linkageName, Cforall
 #include "Statement.h"           // for CompoundStmt
 #include "Type.h"                // for Type, FunctionType, Type::FuncSpecif...
@@ -72,5 +73,5 @@
 	} // if
 	if ( linkage != LinkageSpec::Cforall ) {
-		os << LinkageSpec::linkageName( linkage ) << " ";
+		os << LinkageSpec::name( linkage ) << " ";
 	} // if
 
Index: src/SynTree/LinkageSpec.cc
===================================================================
--- src/SynTree/LinkageSpec.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ src/SynTree/LinkageSpec.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,57 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// LinkageSpec.cc --
+//
+// Author           : Rodolfo G. Esteves
+// Created On       : Sat May 16 13:22:09 2015
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Mon Dec 16 15:02:29 2019
+// Update Count     : 28
+//
+
+#include <cassert>
+#include <memory>   // for unique_ptr
+#include <string>
+using namespace std;
+
+#include "LinkageSpec.h"
+#include "Common/SemanticError.h"
+
+namespace LinkageSpec {
+	Spec update( CodeLocation location, Spec spec, const string * cmd ) {
+		assert( cmd );
+		unique_ptr<const string> guard( cmd ); // allocated by lexer
+		if ( *cmd == "\"Cforall\"" ) {
+			spec.is_mangled = true;
+			return spec;
+		} else if ( *cmd == "\"C\"" ) {
+			spec.is_mangled = false;
+			return spec;
+		} else {
+			SemanticError( location, "Invalid linkage specifier " + *cmd );
+		} // if
+	} // update
+
+	string name( Spec spec ) {
+		switch ( spec ) {
+		  case Intrinsic: return "intrinsic";
+		  case C: return "C";
+		  case Cforall: return "Cforall";
+		  case AutoGen: return "autogenerated cfa";
+		  case Compiler: return "compiler built-in";
+		  case BuiltinCFA: return "cfa built-in";
+		  case BuiltinC: return "c built-in";
+		  default: return "<unnamed linkage spec>";
+		} // siwtch
+	} // name
+} // LinkageSpec
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
Index: src/SynTree/LinkageSpec.h
===================================================================
--- src/SynTree/LinkageSpec.h	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ src/SynTree/LinkageSpec.h	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,85 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// LinkageSpec.h --
+//
+// Author           : Rodolfo G. Esteves
+// Created On       : Sat May 16 13:24:28 2015
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Mon Dec 16 15:03:43 2019
+// Update Count     : 20
+//
+
+#pragma once
+
+#include <string>
+
+#include "Common/CodeLocation.h"
+
+namespace LinkageSpec {
+	// Bitflags for linkage specifiers
+	enum {
+		Mangle = 1 << 0,
+		Generate = 1 << 1,
+		Overrideable = 1 << 2,
+		Builtin = 1 << 3,
+		GccBuiltin = 1 << 4,
+	};
+
+	// Bitflag type for storage classes
+	union Spec {
+		unsigned int val;
+		struct {
+			bool is_mangled : 1;
+			bool is_generatable : 1;
+			bool is_overridable : 1;
+			bool is_builtin : 1;
+			bool is_gcc_builtin : 1;
+		};
+		constexpr Spec( unsigned int val ) : val( val ) {}
+		constexpr Spec( Spec const & other ) : val( other.val ) {}
+		constexpr Spec & operator=( const Spec & ) = default;
+		// Operators may go here.
+		// Supports == and !=
+		constexpr operator unsigned int() const { return val; }
+	};
+
+
+	Spec update( CodeLocation location, Spec spec, const std::string * cmd );
+	// If cmd = "C" returns a Spec that is old_spec with is_mangled = false
+	// If cmd = "Cforall" returns old_spec Spec with is_mangled = true
+
+	std::string name( Spec );
+
+	// To Update: LinkageSpec::isXyz( cur_spec ) -> cur_spec.is_xyz
+	inline bool isMangled( Spec spec ) { return spec.is_mangled; }
+	inline bool isGeneratable( Spec spec ) { return spec.is_generatable; }
+	inline bool isOverridable( Spec spec ) { return spec.is_overridable; }
+	inline bool isBuiltin( Spec spec ) { return spec.is_builtin; }
+	inline bool isGccBuiltin( Spec spec ) { return spec.is_gcc_builtin; }
+
+	// Pre-defined flag combinations:
+	// C built-in defined in prelude
+	constexpr Spec const Intrinsic = { Mangle | Generate | Overrideable | Builtin };
+	// ordinary
+	constexpr Spec const Cforall = { Mangle | Generate };
+	// not overloadable, not mangled
+	constexpr Spec const C = { Generate };
+	// built by translator (struct assignment)
+	constexpr Spec const AutoGen = { Mangle | Generate | Overrideable };
+	// gcc internal
+	constexpr Spec const Compiler = { Mangle | Builtin | GccBuiltin };
+	// mangled builtins
+	constexpr Spec const BuiltinCFA = { Mangle | Generate | Builtin };
+	// non-mangled builtins
+	constexpr Spec const BuiltinC = { Generate | Builtin };
+};
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
Index: src/SynTree/NamedTypeDecl.cc
===================================================================
--- src/SynTree/NamedTypeDecl.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/SynTree/NamedTypeDecl.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Wed Aug  9 13:28:00 2017
-// Update Count     : 14
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Mon Dec 16 15:11:40 2019
+// Update Count     : 17
 //
 
@@ -20,5 +20,5 @@
 #include "Common/utility.h"      // for printAll, cloneAll, deleteAll, maybe...
 #include "Declaration.h"         // for NamedTypeDecl, DeclarationWithType
-#include "Parser/LinkageSpec.h"  // for Spec, Cforall, linkageName
+#include "LinkageSpec.h"         // for Spec, Cforall, linkageName
 #include "Type.h"                // for Type, Type::StorageClasses
 
@@ -44,5 +44,5 @@
 
 	if ( linkage != LinkageSpec::Cforall ) {
-		os << LinkageSpec::linkageName( linkage ) << " ";
+		os << LinkageSpec::name( linkage ) << " ";
 	} // if
 	get_storageClasses().print( os );
@@ -78,5 +78,5 @@
 }
 
-std::string TypedefDecl::typeString() const { return "typedef"; }
+const char * TypedefDecl::typeString() const { return "typedef"; }
 
 // Local Variables: //
Index: src/SynTree/ObjectDecl.cc
===================================================================
--- src/SynTree/ObjectDecl.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/SynTree/ObjectDecl.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 16 08:34:27 2017
-// Update Count     : 59
+// Last Modified On : Mon Dec 16 15:12:03 2019
+// Update Count     : 61
 //
 
@@ -23,5 +23,5 @@
 #include "Expression.h"          // for Expression
 #include "Initializer.h"         // for Initializer
-#include "Parser/LinkageSpec.h"  // for Spec, linkageName, Cforall
+#include "LinkageSpec.h"         // for Spec, linkageName, Cforall
 #include "Type.h"                // for Type, Type::StorageClasses, Type::Fu...
 
@@ -48,5 +48,5 @@
 
 	if ( linkage != LinkageSpec::Cforall ) {
-		os << LinkageSpec::linkageName( linkage ) << " ";
+		os << LinkageSpec::name( linkage ) << " ";
 	} // if
 
Index: src/SynTree/Statement.cc
===================================================================
--- src/SynTree/Statement.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/SynTree/Statement.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Sep  3 20:46:44 2017
-// Update Count     : 68
+// Last Modified By : Andrew Beach
+// Last Modified On : Mon Jan 20 16:03:00 2020
+// Update Count     : 71
 //
 
@@ -46,7 +46,7 @@
 Statement::~Statement() {}
 
-ExprStmt::ExprStmt( Expression *expr ) : Statement(), expr( expr ) {}
-
-ExprStmt::ExprStmt( const ExprStmt &other ) : Statement( other ), expr( maybeClone( other.expr ) ) {}
+ExprStmt::ExprStmt( Expression * expr ) : Statement(), expr( expr ) {}
+
+ExprStmt::ExprStmt( const ExprStmt & other ) : Statement( other ), expr( maybeClone( other.expr ) ) {}
 
 ExprStmt::~ExprStmt() {
@@ -54,5 +54,5 @@
 }
 
-void ExprStmt::print( std::ostream &os, Indenter indent ) const {
+void ExprStmt::print( std::ostream & os, Indenter indent ) const {
 	os << "Expression Statement:" << endl << indent+1;
 	expr->print( os, indent+1 );
@@ -60,5 +60,5 @@
 
 
-AsmStmt::AsmStmt( bool voltile, Expression *instruction, std::list<Expression *> output, std::list<Expression *> input, std::list<ConstantExpr *> clobber, std::list<Label> gotolabels ) : Statement(), voltile( voltile ), instruction( instruction ), output( output ), input( input ), clobber( clobber ), gotolabels( gotolabels ) {}
+AsmStmt::AsmStmt( bool voltile, Expression * instruction, std::list<Expression *> output, std::list<Expression *> input, std::list<ConstantExpr *> clobber, std::list<Label> gotolabels ) : Statement(), voltile( voltile ), instruction( instruction ), output( output ), input( input ), clobber( clobber ), gotolabels( gotolabels ) {}
 
 AsmStmt::AsmStmt( const AsmStmt & other ) : Statement( other ), voltile( other.voltile ), instruction( maybeClone( other.instruction ) ), gotolabels( other.gotolabels ) {
@@ -75,5 +75,5 @@
 }
 
-void AsmStmt::print( std::ostream &os, Indenter indent ) const {
+void AsmStmt::print( std::ostream & os, Indenter indent ) const {
 	os << "Assembler Statement:" << endl;
 	os << indent+1 << "instruction: " << endl << indent;
@@ -96,10 +96,12 @@
 DirectiveStmt::DirectiveStmt( const std::string & directive ) : Statement(), directive( directive ) {}
 
-void DirectiveStmt::print( std::ostream &os, Indenter ) const {
+void DirectiveStmt::print( std::ostream & os, Indenter ) const {
 	os << "GCC Directive:" << directive << endl;
 }
 
 
-const char *BranchStmt::brType[] = { "Goto", "Break", "Continue" };
+const char * BranchStmt::brType[] = {
+	"Goto", "Break", "Continue", "Fall Through", "Fall Through Default",
+};
 
 BranchStmt::BranchStmt( Label target, Type type ) throw ( SemanticErrorException ) :
@@ -111,5 +113,5 @@
 }
 
-BranchStmt::BranchStmt( Expression *computedTarget, Type type ) throw ( SemanticErrorException ) :
+BranchStmt::BranchStmt( Expression * computedTarget, Type type ) throw ( SemanticErrorException ) :
 	Statement(), computedTarget( computedTarget ), type( type ) {
 	if ( type != BranchStmt::Goto || computedTarget == nullptr ) {
@@ -118,5 +120,6 @@
 }
 
-void BranchStmt::print( std::ostream &os, Indenter indent ) const {
+void BranchStmt::print( std::ostream & os, Indenter indent ) const {
+	assert(type < 5);
 	os << "Branch (" << brType[type] << ")" << endl ;
 	if ( target != "" ) os << indent+1 << "with target: " << target << endl;
@@ -125,5 +128,5 @@
 }
 
-ReturnStmt::ReturnStmt( Expression *expr ) : Statement(), expr( expr ) {}
+ReturnStmt::ReturnStmt( Expression * expr ) : Statement(), expr( expr ) {}
 
 ReturnStmt::ReturnStmt( const ReturnStmt & other ) : Statement( other ), expr( maybeClone( other.expr ) ) {}
@@ -133,5 +136,5 @@
 }
 
-void ReturnStmt::print( std::ostream &os, Indenter indent ) const {
+void ReturnStmt::print( std::ostream & os, Indenter indent ) const {
 	os << "Return Statement, returning: ";
 	if ( expr != nullptr ) {
@@ -142,5 +145,5 @@
 }
 
-IfStmt::IfStmt( Expression *condition, Statement *thenPart, Statement *elsePart, std::list<Statement *> initialization ):
+IfStmt::IfStmt( Expression * condition, Statement * thenPart, Statement * elsePart, std::list<Statement *> initialization ):
 	Statement(), condition( condition ), thenPart( thenPart ), elsePart( elsePart ), initialization( initialization ) {}
 
@@ -157,5 +160,5 @@
 }
 
-void IfStmt::print( std::ostream &os, Indenter indent ) const {
+void IfStmt::print( std::ostream & os, Indenter indent ) const {
 	os << "If on condition: " << endl;
 	os << indent+1;
@@ -176,5 +179,5 @@
 	thenPart->print( os, indent+1 );
 
-	if ( elsePart != 0 ) {
+	if ( elsePart != nullptr ) {
 		os << indent << "... else: " << endl;
 		os << indent+1;
@@ -183,5 +186,5 @@
 }
 
-SwitchStmt::SwitchStmt( Expression * condition, const std::list<Statement *> &statements ):
+SwitchStmt::SwitchStmt( Expression * condition, const std::list<Statement *> & statements ):
 	Statement(), condition( condition ), statements( statements ) {
 }
@@ -198,5 +201,5 @@
 }
 
-void SwitchStmt::print( std::ostream &os, Indenter indent ) const {
+void SwitchStmt::print( std::ostream & os, Indenter indent ) const {
 	os << "Switch on condition: ";
 	condition->print( os );
@@ -208,7 +211,7 @@
 }
 
-CaseStmt::CaseStmt( Expression *condition, const std::list<Statement *> &statements, bool deflt ) throw ( SemanticErrorException ) :
+CaseStmt::CaseStmt( Expression * condition, const std::list<Statement *> & statements, bool deflt ) throw ( SemanticErrorException ) :
 	Statement(), condition( condition ), stmts( statements ), _isDefault( deflt ) {
-	if ( isDefault() && condition != 0 ) SemanticError( condition, "default case with condition: " );
+	if ( isDefault() && condition != nullptr ) SemanticError( condition, "default case with condition: " );
 }
 
@@ -229,5 +232,5 @@
 }
 
-void CaseStmt::print( std::ostream &os, Indenter indent ) const {
+void CaseStmt::print( std::ostream & os, Indenter indent ) const {
 	if ( isDefault() ) os << indent << "Default ";
 	else {
@@ -243,5 +246,5 @@
 }
 
-WhileStmt::WhileStmt( Expression *condition, Statement *body, std::list< Statement * > & initialization, bool isDoWhile ):
+WhileStmt::WhileStmt( Expression * condition, Statement * body, std::list< Statement * > & initialization, bool isDoWhile ):
 	Statement(), condition( condition), body( body), initialization( initialization ), isDoWhile( isDoWhile) {
 }
@@ -256,5 +259,5 @@
 }
 
-void WhileStmt::print( std::ostream &os, Indenter indent ) const {
+void WhileStmt::print( std::ostream & os, Indenter indent ) const {
 	os << "While on condition: " << endl ;
 	condition->print( os, indent+1 );
@@ -262,8 +265,8 @@
 	os << indent << "... with body: " << endl;
 
-	if ( body != 0 ) body->print( os, indent+1 );
-}
-
-ForStmt::ForStmt( std::list<Statement *> initialization, Expression *condition, Expression *increment, Statement *body ):
+	if ( body != nullptr ) body->print( os, indent+1 );
+}
+
+ForStmt::ForStmt( std::list<Statement *> initialization, Expression * condition, Expression * increment, Statement * body ):
 	Statement(), initialization( initialization ), condition( condition ), increment( increment ), body( body ) {
 }
@@ -282,5 +285,5 @@
 }
 
-void ForStmt::print( std::ostream &os, Indenter indent ) const {
+void ForStmt::print( std::ostream & os, Indenter indent ) const {
 	Statement::print( os, indent ); // print labels
 
@@ -305,5 +308,5 @@
 	}
 
-	if ( body != 0 ) {
+	if ( body != nullptr ) {
 		os << "\n" << indent << "... with body: \n" << indent+1;
 		body->print( os, indent+1 );
@@ -317,5 +320,5 @@
 }
 
-ThrowStmt::ThrowStmt( const ThrowStmt &other ) :
+ThrowStmt::ThrowStmt( const ThrowStmt & other ) :
 	Statement ( other ), kind( other.kind ), expr( maybeClone( other.expr ) ), target( maybeClone( other.target ) ) {
 }
@@ -326,5 +329,5 @@
 }
 
-void ThrowStmt::print( std::ostream &os, Indenter indent) const {
+void ThrowStmt::print( std::ostream & os, Indenter indent) const {
 	if ( target ) os << "Non-Local ";
 	os << "Throw Statement, raising: ";
@@ -336,9 +339,9 @@
 }
 
-TryStmt::TryStmt( CompoundStmt *tryBlock, std::list<CatchStmt *> &handlers, FinallyStmt *finallyBlock ) :
+TryStmt::TryStmt( CompoundStmt * tryBlock, std::list<CatchStmt *> & handlers, FinallyStmt * finallyBlock ) :
 	Statement(), block( tryBlock ),  handlers( handlers ), finallyBlock( finallyBlock ) {
 }
 
-TryStmt::TryStmt( const TryStmt &other ) : Statement( other ), block( maybeClone( other.block ) ), finallyBlock( maybeClone( other.finallyBlock ) ) {
+TryStmt::TryStmt( const TryStmt & other ) : Statement( other ), block( maybeClone( other.block ) ), finallyBlock( maybeClone( other.finallyBlock ) ) {
 	cloneAll( other.handlers, handlers );
 }
@@ -350,5 +353,5 @@
 }
 
-void TryStmt::print( std::ostream &os, Indenter indent ) const {
+void TryStmt::print( std::ostream & os, Indenter indent ) const {
 	os << "Try Statement" << endl;
 	os << indent << "... with block:" << endl << indent+1;
@@ -363,5 +366,5 @@
 
 	// finally block
-	if ( finallyBlock != 0 ) {
+	if ( finallyBlock != nullptr ) {
 		os << indent << "... and finally:" << endl << indent+1;
 		finallyBlock->print( os, indent+1 );
@@ -369,5 +372,5 @@
 }
 
-CatchStmt::CatchStmt( Kind kind, Declaration *decl, Expression *cond, Statement *body ) :
+CatchStmt::CatchStmt( Kind kind, Declaration * decl, Expression * cond, Statement * body ) :
 	Statement(), kind ( kind ), decl ( decl ), cond ( cond ), body( body ) {
 		assertf( decl, "Catch clause must have a declaration." );
@@ -383,5 +386,5 @@
 }
 
-void CatchStmt::print( std::ostream &os, Indenter indent ) const {
+void CatchStmt::print( std::ostream & os, Indenter indent ) const {
 	os << "Catch " << ((Terminate == kind) ? "Terminate" : "Resume") << " Statement" << endl;
 
@@ -401,5 +404,5 @@
 
 
-FinallyStmt::FinallyStmt( CompoundStmt *block ) : Statement(), block( block ) {
+FinallyStmt::FinallyStmt( CompoundStmt * block ) : Statement(), block( block ) {
 }
 
@@ -411,5 +414,5 @@
 }
 
-void FinallyStmt::print( std::ostream &os, Indenter indent ) const {
+void FinallyStmt::print( std::ostream & os, Indenter indent ) const {
 	os << "Finally Statement" << endl;
 	os << indent << "... with block:" << endl << indent+1;
@@ -458,5 +461,5 @@
 }
 
-void WaitForStmt::print( std::ostream &os, Indenter indent ) const {
+void WaitForStmt::print( std::ostream & os, Indenter indent ) const {
 	os << "Waitfor Statement" << endl;
 	indent += 1;
@@ -514,5 +517,5 @@
 }
 
-void NullStmt::print( std::ostream &os, Indenter indent ) const {
+void NullStmt::print( std::ostream & os, Indenter indent ) const {
 	os << "Null Statement" << endl;
 	Statement::print( os, indent );
@@ -530,5 +533,5 @@
 }
 
-void ImplicitCtorDtorStmt::print( std::ostream &os, Indenter indent ) const {
+void ImplicitCtorDtorStmt::print( std::ostream & os, Indenter indent ) const {
 	os << "Implicit Ctor Dtor Statement" << endl;
 	os << indent << "... with Ctor/Dtor: ";
Index: src/SynTree/Statement.h
===================================================================
--- src/SynTree/Statement.h	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/SynTree/Statement.h	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Mar 12 09:01:53 2019
-// Update Count     : 83
+// Last Modified On : Fri Jan 10 14:13:24 2020
+// Update Count     : 85
 //
 
@@ -257,5 +257,5 @@
 	Statement * body;
 
-	ForStmt( std::list<Statement *> initialization, Expression * condition = 0, Expression * increment = 0, Statement * body = 0 );
+	ForStmt( std::list<Statement *> initialization, Expression * condition = nullptr, Expression * increment = nullptr, Statement * body = nullptr );
 	ForStmt( const ForStmt & other );
 	virtual ~ForStmt();
@@ -357,5 +357,5 @@
 	FinallyStmt * finallyBlock;
 
-	TryStmt( CompoundStmt * tryBlock, std::list<CatchStmt *> & handlers, FinallyStmt * finallyBlock = 0 );
+	TryStmt( CompoundStmt * tryBlock, std::list<CatchStmt *> & handlers, FinallyStmt * finallyBlock = nullptr );
 	TryStmt( const TryStmt & other );
 	virtual ~TryStmt();
Index: src/SynTree/TupleType.cc
===================================================================
--- src/SynTree/TupleType.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/SynTree/TupleType.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb  1 17:10:58 2017
-// Update Count     : 3
+// Last Modified On : Fri Dec 13 23:44:38 2019
+// Update Count     : 4
 //
 
@@ -20,5 +20,5 @@
 #include "Declaration.h"         // for Declaration, ObjectDecl
 #include "Initializer.h"         // for ListInit
-#include "Parser/LinkageSpec.h"  // for Cforall
+#include "LinkageSpec.h"         // for Cforall
 #include "Type.h"                // for TupleType, Type, Type::Qualifiers
 
Index: src/SynTree/Type.cc
===================================================================
--- src/SynTree/Type.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/SynTree/Type.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Aug  4 21:05:07 2019
-// Update Count     : 45
+// Last Modified On : Sun Dec 15 16:52:37 2019
+// Update Count     : 49
 //
 #include "Type.h"
@@ -24,4 +24,6 @@
 using namespace std;
 
+// GENERATED START, DO NOT EDIT
+// GENERATED BY BasicTypes-gen.cc
 const char * BasicType::typeNames[] = {
 	"_Bool",
@@ -45,5 +47,4 @@
 	"float",
 	"float _Complex",
-	//"float _Imaginary",
 	"_Float32x",
 	"_Float32x _Complex",
@@ -52,5 +53,4 @@
 	"double",
 	"double _Complex",
-	//"double _Imaginary",
 	"_Float64x",
 	"_Float64x _Complex",
@@ -61,12 +61,8 @@
 	"long double",
 	"long double _Complex",
-	//"long double _Imaginary",
 	"_Float128x",
 	"_Float128x _Complex",
 };
-static_assert(
-	sizeof(BasicType::typeNames) / sizeof(BasicType::typeNames[0]) == BasicType::NUMBER_OF_BASIC_TYPES,
-	"Each basic type name should have a corresponding kind enum value"
-);
+// GENERATED END
 
 Type::Type( const Qualifiers &tq, const std::list< Attribute * > & attributes ) : tq( tq ), attributes( attributes ) {}
Index: src/SynTree/TypeDecl.cc
===================================================================
--- src/SynTree/TypeDecl.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/SynTree/TypeDecl.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Wed Aug  9 14:35:00 2017
-// Update Count     : 6
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Dec 13 15:26:14 2019
+// Update Count     : 21
 //
 
@@ -21,39 +21,38 @@
 #include "Type.h"            // for Type, Type::StorageClasses
 
-TypeDecl::TypeDecl( const std::string &name, Type::StorageClasses scs, Type *type, Kind kind, bool sized, Type * init ) : Parent( name, scs, type ), init( init ), sized( kind == Ttype || sized ), kind( kind ) {
+TypeDecl::TypeDecl( const std::string & name, Type::StorageClasses scs, Type * type, Kind kind, bool sized, Type * init ) : Parent( name, scs, type ), kind( kind ), sized( kind == Ttype || sized ), init( init ) {
 }
 
-TypeDecl::TypeDecl( const TypeDecl &other ) : Parent( other ), init( maybeClone( other.init ) ), sized( other.sized ), kind( other.kind ) {
+TypeDecl::TypeDecl( const TypeDecl & other ) : Parent( other ), kind( other.kind ), sized( other.sized ), init( maybeClone( other.init ) ) {
 }
 
 TypeDecl::~TypeDecl() {
-  delete init;
+	delete init;
 }
 
-std::string TypeDecl::typeString() const {
-	static const std::string kindNames[] = { "object type", "function type", "tuple type" };
-	assertf( sizeof(kindNames)/sizeof(kindNames[0]) == DeclarationNode::NoTypeClass-1, "typeString: kindNames is out of sync." );
-	assertf( kind < sizeof(kindNames)/sizeof(kindNames[0]), "TypeDecl's kind is out of bounds." );
-	return (isComplete() ? "sized " : "") + kindNames[ kind ];
+const char * TypeDecl::typeString() const {
+	static const char * kindNames[] = { "sized data type", "sized object type", "sized function type", "sized tuple type" };
+	static_assert( sizeof(kindNames)/sizeof(kindNames[0]) == TypeDecl::NUMBER_OF_KINDS, "typeString: kindNames is out of sync." );
+	assertf( kind < TypeDecl::NUMBER_OF_KINDS, "TypeDecl kind is out of bounds." );
+	return isComplete() ? kindNames[ kind ] : &kindNames[ kind ][ sizeof("sized") ]; // sizeof includes '\0'
 }
 
-std::string TypeDecl::genTypeString() const {
-	static const std::string kindNames[] = { "dtype", "ftype", "ttype" };
-	assertf( sizeof(kindNames)/sizeof(kindNames[0]) == DeclarationNode::NoTypeClass-1, "genTypeString: kindNames is out of sync." );
-	assertf( kind < sizeof(kindNames)/sizeof(kindNames[0]), "TypeDecl's kind is out of bounds." );
+const char * TypeDecl::genTypeString() const {
+	static const char * kindNames[] = { "dtype", "otype", "ftype", "ttype" };
+	static_assert( sizeof(kindNames)/sizeof(kindNames[0]) == TypeDecl::NUMBER_OF_KINDS, "genTypeString: kindNames is out of sync." );
+	assertf( kind < TypeDecl::NUMBER_OF_KINDS, "TypeDecl kind is out of bounds." );
 	return kindNames[ kind ];
 }
 
 void TypeDecl::print( std::ostream &os, Indenter indent ) const {
-  NamedTypeDecl::print( os, indent );
-  if ( init ) {
-    os << std::endl << indent << "with type initializer: ";
-    init->print( os, indent + 1 );
-  }
+	NamedTypeDecl::print( os, indent );
+	if ( init ) {
+		os << std::endl << indent << "with type initializer: ";
+		init->print( os, indent + 1 );
+	} // if
 }
 
-
 std::ostream & operator<<( std::ostream & os, const TypeDecl::Data & data ) {
-  return os << data.kind << ", " << data.isComplete;
+	return os << data.kind << ", " << data.isComplete;
 }
 
Index: src/SynTree/module.mk
===================================================================
--- src/SynTree/module.mk	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/SynTree/module.mk	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -11,43 +11,44 @@
 ## Created On       : Mon Jun  1 17:49:17 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Mon Jun  1 17:54:09 2015
-## Update Count     : 1
+## Last Modified On : Sat Dec 14 07:26:43 2019
+## Update Count     : 2
 ###############################################################################
 
 SRC_SYNTREE = \
-      SynTree/Type.cc \
-      SynTree/VoidType.cc \
+      SynTree/AddressExpr.cc \
+      SynTree/AggregateDecl.cc \
+      SynTree/ApplicationExpr.cc \
+      SynTree/ArrayType.cc \
+      SynTree/AttrType.cc \
+      SynTree/Attribute.cc \
       SynTree/BasicType.cc \
-      SynTree/PointerType.cc \
-      SynTree/ArrayType.cc \
-      SynTree/ReferenceType.cc \
-      SynTree/FunctionType.cc \
-      SynTree/ReferenceToType.cc \
-      SynTree/TupleType.cc \
-      SynTree/TypeofType.cc \
-      SynTree/AttrType.cc \
-      SynTree/VarArgsType.cc \
-      SynTree/ZeroOneType.cc \
+      SynTree/CommaExpr.cc \
+      SynTree/CompoundStmt.cc \
       SynTree/Constant.cc \
-      SynTree/Expression.cc \
-      SynTree/TupleExpr.cc \
-      SynTree/CommaExpr.cc \
-      SynTree/TypeExpr.cc \
-      SynTree/ApplicationExpr.cc \
-      SynTree/AddressExpr.cc \
-      SynTree/Statement.cc \
-      SynTree/CompoundStmt.cc \
+      SynTree/DeclReplacer.cc \
       SynTree/DeclStmt.cc \
       SynTree/Declaration.cc \
       SynTree/DeclarationWithType.cc \
+      SynTree/Expression.cc \
+      SynTree/FunctionDecl.cc \
+      SynTree/FunctionType.cc \
+      SynTree/Initializer.cc \
+      SynTree/LinkageSpec.cc \
+      SynTree/NamedTypeDecl.cc \
       SynTree/ObjectDecl.cc \
-      SynTree/FunctionDecl.cc \
-      SynTree/AggregateDecl.cc \
-      SynTree/NamedTypeDecl.cc \
+      SynTree/PointerType.cc \
+      SynTree/ReferenceToType.cc \
+      SynTree/ReferenceType.cc \
+      SynTree/Statement.cc \
+      SynTree/TupleExpr.cc \
+      SynTree/TupleType.cc \
+      SynTree/Type.cc \
       SynTree/TypeDecl.cc \
-      SynTree/Initializer.cc \
+      SynTree/TypeExpr.cc \
       SynTree/TypeSubstitution.cc \
-      SynTree/Attribute.cc \
-      SynTree/DeclReplacer.cc
+      SynTree/TypeofType.cc \
+      SynTree/VarArgsType.cc \
+      SynTree/VoidType.cc \
+      SynTree/ZeroOneType.cc
 
 SRC += $(SRC_SYNTREE)
Index: src/Tuples/TupleAssignment.cc
===================================================================
--- src/Tuples/TupleAssignment.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/Tuples/TupleAssignment.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Mar 17 09:43:03 2017
-// Update Count     : 8
+// Last Modified On : Fri Dec 13 23:45:33 2019
+// Update Count     : 9
 //
 
@@ -34,5 +34,4 @@
 #include "InitTweak/GenInit.h"             // for genCtorInit
 #include "InitTweak/InitTweak.h"           // for getPointerBase, isAssignment
-#include "Parser/LinkageSpec.h"            // for Cforall
 #include "ResolvExpr/Alternative.h"        // for AltList, Alternative
 #include "ResolvExpr/AlternativeFinder.h"  // for AlternativeFinder, simpleC...
@@ -41,4 +40,5 @@
 #include "ResolvExpr/TypeEnvironment.h"    // for TypeEnvironment
 #include "ResolvExpr/typeops.h"            // for combos
+#include "SynTree/LinkageSpec.h"           // for Cforall
 #include "SynTree/Declaration.h"           // for ObjectDecl
 #include "SynTree/Expression.h"            // for Expression, CastExpr, Name...
Index: src/Tuples/TupleExpansion.cc
===================================================================
--- src/Tuples/TupleExpansion.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/Tuples/TupleExpansion.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -9,7 +9,7 @@
 // Author           : Rodolfo G. Esteves
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Fri Jul 19 14:39:00 2019
-// Update Count     : 22
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Dec 13 23:45:51 2019
+// Update Count     : 24
 //
 
@@ -27,5 +27,5 @@
 #include "Common/utility.h"       // for CodeLocation
 #include "InitTweak/InitTweak.h"  // for getFunction
-#include "Parser/LinkageSpec.h"   // for Spec, C, Intrinsic
+#include "SynTree/LinkageSpec.h"  // for Spec, C, Intrinsic
 #include "SynTree/Constant.h"     // for Constant
 #include "SynTree/Declaration.h"  // for StructDecl, DeclarationWithType
@@ -361,5 +361,5 @@
 	const ast::TypeInstType * isTtype( const ast::Type * type ) {
 		if ( const ast::TypeInstType * inst = dynamic_cast< const ast::TypeInstType * >( type ) ) {
-			if ( inst->base && inst->base->kind == ast::TypeVar::Ttype ) {
+			if ( inst->base && inst->base->kind == ast::TypeDecl::Ttype ) {
 				return inst;
 			}
Index: src/cfa.make
===================================================================
--- src/cfa.make	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/cfa.make	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -1,9 +1,6 @@
-
-
 CFACOMPILE = $(CFACC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(CFAFLAGS) $(AM_CFLAGS) $(CFLAGS)
 LTCFACOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=compile $(CFACC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(CFAFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(AM_CFLAGS) $(CFAFLAGS) $(CFLAGS)
 
 AM_V_CFA = $(am__v_CFA_@AM_V@)
@@ -22,14 +19,4 @@
 	$(am__mv) $$depbase.Tpo $$depbase.Plo
 
-AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
-am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
-am__v_JAVAC_0 = @echo "  JAVAC   " $@;
-am__v_JAVAC_1 =
-
-AM_V_GOC = $(am__v_GOC_@AM_V@)
-am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
-am__v_GOC_0 = @echo "  GOC     " $@;
-am__v_GOC_1 =
-
 UPPCC = u++
 UPPCOMPILE = $(UPPCC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_UPPFLAGS) $(UPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -39,2 +26,22 @@
 am__v_UPP_0 = @echo "  UPP     " $@;
 am__v_UPP_1 =
+
+AM_V_GOC = $(am__v_GOC_@AM_V@)
+am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
+am__v_GOC_0 = @echo "  GOC     " $@;
+am__v_GOC_1 =
+
+AM_V_RUST = $(am__v_RUST_@AM_V@)
+am__v_RUST_ = $(am__v_RUST_@AM_DEFAULT_V@)
+am__v_RUST_0 = @echo "  RUST     " $@;
+am__v_RUST_1 =
+
+AM_V_NODEJS = $(am__v_NODEJS_@AM_V@)
+am__v_NODEJS_ = $(am__v_NODEJS_@AM_DEFAULT_V@)
+am__v_NODEJS_0 = @echo "  NODEJS     " $@;
+am__v_NODEJS_1 =
+
+AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
+am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
+am__v_JAVAC_0 = @echo "  JAVAC   " $@;
+am__v_JAVAC_1 =
Index: src/main.cc
===================================================================
--- src/main.cc	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ src/main.cc	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Fri May 15 23:12:02 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Aug 23 06:50:08 2019
-// Update Count     : 607
+// Last Modified On : Sat Feb  8 08:33:50 2020
+// Update Count     : 633
 //
 
@@ -20,5 +20,5 @@
 #include <cstdio>                           // for fopen, FILE, fclose, stdin
 #include <cstdlib>                          // for exit, free, abort, EXIT_F...
-#include <csignal>                         // for signal, SIGABRT, SIGSEGV
+#include <csignal>                          // for signal, SIGABRT, SIGSEGV
 #include <cstring>                          // for index
 #include <fstream>                          // for ofstream
@@ -28,4 +28,7 @@
 #include <list>                             // for list
 #include <string>                           // for char_traits, operator<<
+
+using namespace std;
+
 
 #include "CompilationState.h"
@@ -53,5 +56,4 @@
 #include "InitTweak/GenInit.h"              // for genInit
 #include "MakeLibCfa.h"                     // for makeLibCfa
-#include "Parser/LinkageSpec.h"             // for Spec, Cforall, Intrinsic
 #include "Parser/ParseNode.h"               // for DeclarationNode, buildList
 #include "Parser/TypedefTable.h"            // for TypedefTable
@@ -59,4 +61,5 @@
 #include "ResolvExpr/Resolver.h"            // for resolve
 #include "SymTab/Validate.h"                // for validate
+#include "SynTree/LinkageSpec.h"            // for Spec, Cforall, Intrinsic
 #include "SynTree/Declaration.h"            // for Declaration
 #include "SynTree/Visitor.h"                // for acceptAll
@@ -64,6 +67,4 @@
 #include "Virtual/ExpandCasts.h"            // for expandCasts
 
-
-using namespace std;
 
 static void NewPass( const char * const name ) {
@@ -97,5 +98,5 @@
 static bool waiting_for_gdb = false;					// flag to set cfa-cpp to wait for gdb on start
 
-static std::string PreludeDirector = "";
+static string PreludeDirector = "";
 
 static void parse_cmdline( int argc, char *argv[] );
@@ -104,7 +105,7 @@
 
 static void backtrace( int start ) {					// skip first N stack frames
-	enum { Frames = 50 };
+	enum { Frames = 50, };								// maximum number of stack frames
 	void * array[Frames];
-	int size = ::backtrace( array, Frames );
+	size_t size = ::backtrace( array, Frames );
 	char ** messages = ::backtrace_symbols( array, size ); // does not demangle names
 
@@ -113,7 +114,8 @@
 
 	// skip last 2 stack frames after main
-	for ( int i = start; i < size - 2 && messages != nullptr; i += 1 ) {
+	for ( unsigned int i = start; i < size - 2 && messages != nullptr; i += 1 ) {
 		char * mangled_name = nullptr, * offset_begin = nullptr, * offset_end = nullptr;
-		for ( char *p = messages[i]; *p; ++p ) {        // find parantheses and +offset
+
+		for ( char * p = messages[i]; *p; p += 1 ) {	// find parantheses and +offset
 			if ( *p == '(' ) {
 				mangled_name = p;
@@ -153,16 +155,49 @@
 } // backtrace
 
-static void sigSegvBusHandler( int sig_num ) {
-	cerr << "*CFA runtime error* program cfa-cpp terminated with "
-		 <<	(sig_num == SIGSEGV ? "segment fault" : "bus error")
-		 << "." << endl;
+#define SIGPARMS int sig __attribute__(( unused )), siginfo_t * sfp __attribute__(( unused )), ucontext_t * cxt __attribute__(( unused ))
+
+static void Signal( int sig, void (*handler)(SIGPARMS), int flags ) {
+	struct sigaction act;
+
+	act.sa_sigaction = (void (*)(int, siginfo_t *, void *))handler;
+	act.sa_flags = flags;
+
+	if ( sigaction( sig, &act, nullptr ) == -1 ) {
+	    cerr << "*CFA runtime error* problem installing signal handler, error(" << errno << ") " << strerror( errno ) << endl;
+	    _exit( EXIT_FAILURE );
+	} // if
+} // Signal
+
+static void sigSegvBusHandler( SIGPARMS ) {
+	if ( sfp->si_addr == nullptr ) {
+		cerr << "Null pointer (nullptr) dereference." << endl;
+	} else {
+		cerr << (sig == SIGSEGV ? "Segment fault" : "Bus error") << " at memory location " << sfp->si_addr << "." << endl
+			 << "Possible cause is reading outside the address space or writing to a protected area within the address space with an invalid pointer or subscript." << endl;
+	} // if
 	backtrace( 2 );										// skip first 2 stack frames
-	//_exit( EXIT_FAILURE );
 	abort();											// cause core dump for debugging
 } // sigSegvBusHandler
 
-static void sigAbortHandler( __attribute__((unused)) int sig_num ) {
+static void sigFpeHandler( SIGPARMS ) {
+	const char * msg;
+
+	switch ( sfp->si_code ) {
+	  case FPE_INTDIV: case FPE_FLTDIV: msg = "divide by zero"; break;
+	  case FPE_FLTOVF: msg = "overflow"; break;
+	  case FPE_FLTUND: msg = "underflow"; break;
+	  case FPE_FLTRES: msg = "inexact result"; break;
+	  case FPE_FLTINV: msg = "invalid operation"; break;
+	  default: msg = "unknown";
+	} // choose
+	cerr << "Computation error " << msg << " at location " << sfp->si_addr << endl
+		 << "Possible cause is constant-expression evaluation invalid." << endl;
+	backtrace( 2 );										// skip first 2 stack frames
+	abort();											// cause core dump for debugging
+} // sigFpeHandler
+
+static void sigAbortHandler( SIGPARMS ) {
 	backtrace( 6 );										// skip first 6 stack frames
-	signal( SIGABRT, SIG_DFL);							// reset default signal handler
+	Signal( SIGABRT, (void (*)(SIGPARMS))SIG_DFL, SA_SIGINFO );	// reset default signal handler
 	raise( SIGABRT );									// reraise SIGABRT
 } // sigAbortHandler
@@ -173,11 +208,12 @@
 	list< Declaration * > translationUnit;
 
-	signal( SIGSEGV, sigSegvBusHandler );
-	signal( SIGBUS, sigSegvBusHandler );
-	signal( SIGABRT, sigAbortHandler );
-
-	// std::cout << "main" << std::endl;
+	Signal( SIGSEGV, sigSegvBusHandler, SA_SIGINFO );
+	Signal( SIGBUS, sigSegvBusHandler, SA_SIGINFO );
+	Signal( SIGFPE, sigFpeHandler, SA_SIGINFO );
+	Signal( SIGABRT, sigAbortHandler, SA_SIGINFO );
+
+	// cout << "main" << endl;
 	// for ( int i = 0; i < argc; i += 1 ) {
-	// 	std::cout << '\t' << argv[i] << std::endl;
+	// 	cout << '\t' << argv[i] << endl;
 	// } // for
 
@@ -186,7 +222,7 @@
 
 	if ( waiting_for_gdb ) {
-		std::cerr << "Waiting for gdb" << std::endl;
-		std::cerr << "run :" << std::endl;
-		std::cerr << "  gdb attach " << getpid() << std::endl;
+		cerr << "Waiting for gdb" << endl;
+		cerr << "run :" << endl;
+		cerr << "  gdb attach " << getpid() << endl;
 		raise(SIGSTOP);
 	} // if
@@ -388,13 +424,13 @@
 		return EXIT_FAILURE;
 	} catch ( ... ) {
-		std::exception_ptr eptr = std::current_exception();
+		exception_ptr eptr = current_exception();
 		try {
 			if (eptr) {
-				std::rethrow_exception(eptr);
+				rethrow_exception(eptr);
 			} else {
-				std::cerr << "Exception Uncaught and Unknown" << std::endl;
-			} // if
-		} catch(const std::exception& e) {
-			std::cerr << "Uncaught Exception \"" << e.what() << "\"\n";
+				cerr << "Exception Uncaught and Unknown" << endl;
+			} // if
+		} catch(const exception& e) {
+			cerr << "Uncaught Exception \"" << e.what() << "\"\n";
 		} // try
 		return EXIT_FAILURE;
@@ -407,8 +443,10 @@
 
 
-static const char optstring[] = ":hlLmNnpP:S:twW:D:";
+static const char optstring[] = ":c:ghlLmNnpP:S:twW:D:";
 
 enum { PreludeDir = 128 };
 static struct option long_opts[] = {
+	{ "colors", required_argument, nullptr, 'c' },
+	{ "gdb", no_argument, nullptr, 'g' },
 	{ "help", no_argument, nullptr, 'h' },
 	{ "libcfa", no_argument, nullptr, 'l' },
@@ -422,5 +460,4 @@
 	{ "statistics", required_argument, nullptr, 'S' },
 	{ "tree", no_argument, nullptr, 't' },
-	{ "gdb", no_argument, nullptr, 'g' },
 	{ "", no_argument, nullptr, 0 },					// -w
 	{ "", no_argument, nullptr, 0 },					// -W
@@ -430,19 +467,20 @@
 
 static const char * description[] = {
-	"print help message",								// -h
-	"generate libcfa.c",								// -l
-	"generate line marks",								// -L
-	"do not replace main",								// -m
-	"do not generate line marks",						// -N
-	"do not read prelude",								// -n
+	"diagnostic color: never, always, or auto.",          // -c
+	"wait for gdb to attach",                             // -g
+	"print help message",                                 // -h
+	"generate libcfa.c",                                  // -l
+	"generate line marks",                                // -L
+	"do not replace main",                                // -m
+	"do not generate line marks",                         // -N
+	"do not read prelude",                                // -n
 	"generate prototypes for prelude functions",		// -p
-	"print",											// -P
+	"print",                                              // -P
 	"<directory> prelude directory for debug/nodebug",	// no flag
 	"<option-list> enable profiling information:\n          counters,heap,time,all,none", // -S
-	"building cfa standard lib",									// -t
-	"wait for gdb to attach",									// -g
-	"",													// -w
-	"",													// -W
-	"",													// -D
+	"building cfa standard lib",                          // -t
+	"",                                                   // -w
+	"",                                                   // -W
+	"",                                                   // -D
 }; // description
 
@@ -512,4 +550,13 @@
 	while ( (c = getopt_long( argc, argv, optstring, long_opts, nullptr )) != -1 ) {
 		switch ( c ) {
+		  case 'c':										// diagnostic colors
+			if ( strcmp( optarg, "always" ) == 0 ) {
+				ErrorHelpers::colors = ErrorHelpers::Colors::Always;
+			} else if ( strcmp( optarg, "never" ) == 0 ) {
+				ErrorHelpers::colors = ErrorHelpers::Colors::Never;
+			} else if ( strcmp( optarg, "auto" ) == 0 ) {
+				ErrorHelpers::colors = ErrorHelpers::Colors::Auto;
+			} // if
+			break;
 		  case 'h':										// help message
 			usage( argv );								// no return
Index: tests/.expect/alloc.txt
===================================================================
--- tests/.expect/alloc.txt	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/.expect/alloc.txt	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -30,10 +30,10 @@
 CFA resize array alloc
 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 
-CFA resize array alloc, fill
+CFA resize array alloc
 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 
-CFA resize array alloc, fill
+CFA resize array alloc
 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 
 CFA resize array alloc, fill
-0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 
+0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 
 
 C   memalign 42 42.5
Index: tests/.expect/completeTypeError.txt
===================================================================
--- tests/.expect/completeTypeError.txt	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/.expect/completeTypeError.txt	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,5 +10,5 @@
       Application of
         Variable Expression: *?: forall
-          DT: object type
+          DT: data type
           function
         ... with parameters
@@ -33,5 +33,5 @@
       Application of
         Variable Expression: *?: forall
-          DT: object type
+          DT: data type
           function
         ... with parameters
@@ -87,5 +87,5 @@
 Cost ( 0, 1, 0, 0, 1, -5, 0 ): Application of
             Variable Expression: baz: forall
-              T: sized object type
+              T: sized data type
               ... with assertions
                 ?=?: pointer to function
Index: tests/.expect/gccExtensions.x64.txt
===================================================================
--- tests/.expect/gccExtensions.x64.txt	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/.expect/gccExtensions.x64.txt	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -12,5 +12,5 @@
     asm volatile ( "mov %1, %0\n\t" "add $1, %0" : "=" "r" ( _X3dsti_2 ) :  :  );
     asm volatile ( "mov %1, %0\n\t" "add $1, %0" : "=r" ( _X3dsti_2 ) : "r" ( _X3srci_2 ) :  );
-    asm ( "mov %1, %0\n\t" "add $1, %0" : "=r" ( _X3dsti_2 ), "=r" ( _X3srci_2 ) : [ _X3srci_2 ] "r" ( _X3dsti_2 ) : "r0" );
+    asm ( "mov %1, %0\n\t" "add $1, %0" : "=r" ( _X3dsti_2 ), "=r" ( _X3srci_2 ) : [ src ] "r" ( _X3dsti_2 ) : "r0" );
     L2: L1: asm goto ( "frob %%r5, %1; jc %l[L1]; mov (%2), %%r5" :  : "r" ( _X3srci_2 ), "r" ( (&_X3dsti_2) ) : "r5", "memory" : L1, L2 );
     double _Complex _X2c1Cd_2;
Index: tests/.expect/gccExtensions.x86.txt
===================================================================
--- tests/.expect/gccExtensions.x86.txt	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/.expect/gccExtensions.x86.txt	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -12,5 +12,5 @@
     asm volatile ( "mov %1, %0\n\t" "add $1, %0" : "=" "r" ( _X3dsti_2 ) :  :  );
     asm volatile ( "mov %1, %0\n\t" "add $1, %0" : "=r" ( _X3dsti_2 ) : "r" ( _X3srci_2 ) :  );
-    asm ( "mov %1, %0\n\t" "add $1, %0" : "=r" ( _X3dsti_2 ), "=r" ( _X3srci_2 ) : [ _X3srci_2 ] "r" ( _X3dsti_2 ) : "r0" );
+    asm ( "mov %1, %0\n\t" "add $1, %0" : "=r" ( _X3dsti_2 ), "=r" ( _X3srci_2 ) : [ src ] "r" ( _X3dsti_2 ) : "r0" );
     L2: L1: asm goto ( "frob %%r5, %1; jc %l[L1]; mov (%2), %%r5" :  : "r" ( _X3srci_2 ), "r" ( (&_X3dsti_2) ) : "r5", "memory" : L1, L2 );
     double _Complex _X2c1Cd_2;
Index: tests/.expect/loopctrl.txt
===================================================================
--- tests/.expect/loopctrl.txt	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/.expect/loopctrl.txt	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -6,4 +6,5 @@
 A
 A A A A A A A A A A
+A A A A A A A A A A A
 B B B B B
 C C C C C
@@ -12,4 +13,5 @@
 
 0 1 2 3 4 5 6 7 8 9
+0 1 2 3 4 5 6 7 8 9 10
 1 3 5 7 9
 10 8 6 4 2
@@ -28,4 +30,5 @@
 N N N N N N N N N N
 0 1 2 3 4 5 6 7 8 9
+0 1 2 3 4 5 6 7 8 9 10
 10 9 8 7 6 5 4 3 2 1
 
Index: tests/.expect/rational.txt
===================================================================
--- tests/.expect/rational.txt	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/.expect/rational.txt	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -1,4 +1,4 @@
 constructor
-3/1 4/1 0/1
+3/1 4/1 0/1 0/1 1/1
 1/2 5/7
 2/3 -3/2
Index: tests/.expect/references.txt
===================================================================
--- tests/.expect/references.txt	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/.expect/references.txt	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -36,4 +36,5 @@
 3
 3 9 { 1., 7. }, [1, 2, 3]
+4
 Destructing a Y
 Destructing a Y
Index: tests/.expect/time.txt
===================================================================
--- tests/.expect/time.txt	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/.expect/time.txt	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -18,2 +18,5 @@
 Dividing that by 2 gives 2403.5 seconds
 4807 seconds is 1 hours, 20 minutes, 7 seconds
+2020 Jan  5 14:01:40 (GMT)
+1970 Jan  5 14:00:00 (GMT)
+1973 Jan  2 06:59:00 (GMT)
Index: tests/Makefile.am
===================================================================
--- tests/Makefile.am	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/Makefile.am	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -46,5 +46,5 @@
 
 # adjust CC to current flags
-CC = $(if $(ifeq $(DISTCC_CFA_PATH),yes),distcc $(DISTCC_CFA_PATH),$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS})
+CC = $(if $(DISTCC_CFA_PATH),distcc $(DISTCC_CFA_PATH) ${ARCH_FLAGS},$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS})
 CFACC = $(CC)
 
@@ -53,5 +53,5 @@
 
 # adjusted CC but without the actual distcc call
-CFACCLOCAL = $(if $(DISTCC_CFA_PATH),$(DISTCC_CFA_PATH),$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS})
+CFACCLOCAL = $(if $(DISTCC_CFA_PATH),$(DISTCC_CFA_PATH) ${ARCH_FLAGS},$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS})
 
 PRETTY_PATH=mkdir -p $(dir $(abspath ${@})) && cd ${srcdir} &&
Index: tests/Makefile.in
===================================================================
--- tests/Makefile.in	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/Makefile.in	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -214,5 +214,5 @@
 
 # adjust CC to current flags
-CC = $(if $(ifeq $(DISTCC_CFA_PATH),yes),distcc $(DISTCC_CFA_PATH),$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS})
+CC = $(if $(DISTCC_CFA_PATH),distcc $(DISTCC_CFA_PATH) ${ARCH_FLAGS},$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS})
 CCAS = @CCAS@
 CCASDEPMODE = @CCASDEPMODE@
@@ -358,6 +358,5 @@
 LTCFACOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=compile $(CFACC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(CFAFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(AM_CFLAGS) $(CFAFLAGS) $(CFLAGS)
 
 AM_V_CFA = $(am__v_CFA_@AM_V@)
@@ -365,12 +364,4 @@
 am__v_CFA_0 = @echo "  CFA     " $@;
 am__v_CFA_1 = 
-AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
-am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
-am__v_JAVAC_0 = @echo "  JAVAC   " $@;
-am__v_JAVAC_1 = 
-AM_V_GOC = $(am__v_GOC_@AM_V@)
-am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
-am__v_GOC_0 = @echo "  GOC     " $@;
-am__v_GOC_1 = 
 UPPCC = u++
 UPPCOMPILE = $(UPPCC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_UPPFLAGS) $(UPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -379,4 +370,20 @@
 am__v_UPP_0 = @echo "  UPP     " $@;
 am__v_UPP_1 = 
+AM_V_GOC = $(am__v_GOC_@AM_V@)
+am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
+am__v_GOC_0 = @echo "  GOC     " $@;
+am__v_GOC_1 = 
+AM_V_RUST = $(am__v_RUST_@AM_V@)
+am__v_RUST_ = $(am__v_RUST_@AM_DEFAULT_V@)
+am__v_RUST_0 = @echo "  RUST     " $@;
+am__v_RUST_1 = 
+AM_V_NODEJS = $(am__v_NODEJS_@AM_V@)
+am__v_NODEJS_ = $(am__v_NODEJS_@AM_DEFAULT_V@)
+am__v_NODEJS_0 = @echo "  NODEJS     " $@;
+am__v_NODEJS_1 = 
+AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
+am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
+am__v_JAVAC_0 = @echo "  JAVAC   " $@;
+am__v_JAVAC_1 = 
 debug = yes
 installed = no
@@ -405,5 +412,5 @@
 
 # adjusted CC but without the actual distcc call
-CFACCLOCAL = $(if $(DISTCC_CFA_PATH),$(DISTCC_CFA_PATH),$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS})
+CFACCLOCAL = $(if $(DISTCC_CFA_PATH),$(DISTCC_CFA_PATH) ${ARCH_FLAGS},$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS})
 PRETTY_PATH = mkdir -p $(dir $(abspath ${@})) && cd ${srcdir} &&
 avl_test_SOURCES = avltree/avl_test.cfa avltree/avl0.cfa avltree/avl1.cfa avltree/avl2.cfa avltree/avl3.cfa avltree/avl4.cfa avltree/avl-private.cfa
Index: tests/alloc.cfa
===================================================================
--- tests/alloc.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/alloc.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Wed Feb  3 07:56:22 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Oct 20 21:45:21 2019
-// Update Count     : 391
+// Last Modified On : Fri Nov 22 15:34:19 2019
+// Update Count     : 404
 //
 
@@ -126,5 +126,5 @@
 
 	p = alloc( p, 2 * dim );                            // CFA resize array alloc
-	for ( i; dim ~ 2 * dim ) { p[i] = 0x1010101; }
+	for ( i; dim ~ 2 * dim ) { p[i] = 0x1010101; }		// fill upper part
 	printf( "CFA resize array alloc\n" );
 	for ( i; 2 * dim ) { printf( "%#x ", p[i] ); }
@@ -139,5 +139,5 @@
 
 	p = alloc_set( p, 3 * dim, fill );					// CFA resize array alloc, fill
-	printf( "CFA resize array alloc, fill\n" );
+	printf( "CFA resize array alloc\n" );
 	for ( i; 3 * dim ) { printf( "%#x ", p[i] ); }
 	printf( "\n" );
@@ -145,5 +145,5 @@
 
 	p = alloc_set( p, dim, fill );						// CFA resize array alloc, fill
-	printf( "CFA resize array alloc, fill\n" );
+	printf( "CFA resize array alloc\n" );
 	for ( i; dim ) { printf( "%#x ", p[i] ); }
 	printf( "\n" );
Index: tests/builtins/sync.cfa
===================================================================
--- tests/builtins/sync.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/builtins/sync.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -4,222 +4,160 @@
 void foo() {
 	volatile _Bool * vpB = 0; _Bool vB = 0;
-	volatile char * vp1 = 0; char * rp1 = 0; char v1 = 0;
-	volatile short * vp2 = 0; short * rp2 = 0; short v2 = 0;
-	volatile int * vp4 = 0; int * rp4 = 0; int v4 = 0;
-	volatile long long int * vp8 = 0; long long int * rp8 = 0; long long int v8 = 0;
-	#if defined(__SIZEOF_INT128__)
-	volatile __int128 * vp16 = 0; __int128 * rp16 = 0; __int128 v16 = 0;
+	volatile char * vpc = 0; char * rpc = 0; char vc = 0;
+	volatile short * vps = 0; short * rps = 0; short vs = 0;
+	volatile int * vpi = 0; int * rpi = 0; int vi = 0;
+	volatile long int * vpl = 0; long int * rpl = 0; long int vl = 0;
+	volatile long long int * vpll = 0; long long int * rpll = 0; long long int vll = 0;
+	#if defined(__SIZEOF_INT128__)
+	volatile __int128 * vplll = 0; __int128 * rplll = 0; __int128 vlll = 0;
 	#endif
 	struct type * volatile * vpp = 0; struct type ** rpp = 0; struct type * vp = 0;
 
-	{ char ret; ret = __sync_fetch_and_add(vp1, v1); }
-	{ char ret; ret = __sync_fetch_and_add_1(vp1, v1); }
-	{ short ret; ret = __sync_fetch_and_add(vp2, v2); }
-	{ short ret; ret = __sync_fetch_and_add_2(vp2, v2); }
-	{ int ret; ret = __sync_fetch_and_add(vp4, v4); }
-	{ int ret; ret = __sync_fetch_and_add_4(vp4, v4); }
-	{ long long int ret; ret = __sync_fetch_and_add(vp8, v8); }
-	{ long long int ret; ret = __sync_fetch_and_add_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_fetch_and_add(vp16, v16); }
-	{ __int128 ret; ret = __sync_fetch_and_add_16(vp16, v16); }
-	#endif
-
-	{ char ret; ret = __sync_fetch_and_sub(vp1, v1); }
-	{ char ret; ret = __sync_fetch_and_sub_1(vp1, v1); }
-	{ short ret; ret = __sync_fetch_and_sub(vp2, v2); }
-	{ short ret; ret = __sync_fetch_and_sub_2(vp2, v2); }
-	{ int ret; ret = __sync_fetch_and_sub(vp4, v4); }
-	{ int ret; ret = __sync_fetch_and_sub_4(vp4, v4); }
-	{ long long int ret; ret = __sync_fetch_and_sub(vp8, v8); }
-	{ long long int ret; ret = __sync_fetch_and_sub_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_fetch_and_sub(vp16, v16); }
-	{ __int128 ret; ret = __sync_fetch_and_sub_16(vp16, v16); }
-	#endif
-
-	{ char ret; ret = __sync_fetch_and_or(vp1, v1); }
-	{ char ret; ret = __sync_fetch_and_or_1(vp1, v1); }
-	{ short ret; ret = __sync_fetch_and_or(vp2, v2); }
-	{ short ret; ret = __sync_fetch_and_or_2(vp2, v2); }
-	{ int ret; ret = __sync_fetch_and_or(vp4, v4); }
-	{ int ret; ret = __sync_fetch_and_or_4(vp4, v4); }
-	{ long long int ret; ret = __sync_fetch_and_or(vp8, v8); }
-	{ long long int ret; ret = __sync_fetch_and_or_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_fetch_and_or(vp16, v16); }
-	{ __int128 ret; ret = __sync_fetch_and_or_16(vp16, v16); }
-	#endif
-
-	{ char ret; ret = __sync_fetch_and_and(vp1, v1); }
-	{ char ret; ret = __sync_fetch_and_and_1(vp1, v1); }
-	{ short ret; ret = __sync_fetch_and_and(vp2, v2); }
-	{ short ret; ret = __sync_fetch_and_and_2(vp2, v2); }
-	{ int ret; ret = __sync_fetch_and_and(vp4, v4); }
-	{ int ret; ret = __sync_fetch_and_and_4(vp4, v4); }
-	{ long long int ret; ret = __sync_fetch_and_and(vp8, v8); }
-	{ long long int ret; ret = __sync_fetch_and_and_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_fetch_and_and(vp16, v16); }
-	{ __int128 ret; ret = __sync_fetch_and_and_16(vp16, v16); }
-	#endif
-
-	{ char ret; ret = __sync_fetch_and_xor(vp1, v1); }
-	{ char ret; ret = __sync_fetch_and_xor_1(vp1, v1); }
-	{ short ret; ret = __sync_fetch_and_xor(vp2, v2); }
-	{ short ret; ret = __sync_fetch_and_xor_2(vp2, v2); }
-	{ int ret; ret = __sync_fetch_and_xor(vp4, v4); }
-	{ int ret; ret = __sync_fetch_and_xor_4(vp4, v4); }
-	{ long long int ret; ret = __sync_fetch_and_xor(vp8, v8); }
-	{ long long int ret; ret = __sync_fetch_and_xor_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_fetch_and_xor(vp16, v16); }
-	{ __int128 ret; ret = __sync_fetch_and_xor_16(vp16, v16); }
-	#endif
-
-	{ char ret; ret = __sync_fetch_and_nand(vp1, v1); }
-	{ char ret; ret = __sync_fetch_and_nand_1(vp1, v1); }
-	{ short ret; ret = __sync_fetch_and_nand(vp2, v2); }
-	{ short ret; ret = __sync_fetch_and_nand_2(vp2, v2); }
-	{ int ret; ret = __sync_fetch_and_nand(vp4, v4); }
-	{ int ret; ret = __sync_fetch_and_nand_4(vp4, v4); }
-	{ long long int ret; ret = __sync_fetch_and_nand(vp8, v8); }
-	{ long long int ret; ret = __sync_fetch_and_nand_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_fetch_and_nand(vp16, v16); }
-	{ __int128 ret; ret = __sync_fetch_and_nand_16(vp16, v16); }
-	#endif
-
-	{ char ret; ret = __sync_add_and_fetch(vp1, v1); }
-	{ char ret; ret = __sync_add_and_fetch_1(vp1, v1); }
-	{ short ret; ret = __sync_add_and_fetch(vp2, v2); }
-	{ short ret; ret = __sync_add_and_fetch_2(vp2, v2); }
-	{ int ret; ret = __sync_add_and_fetch(vp4, v4); }
-	{ int ret; ret = __sync_add_and_fetch_4(vp4, v4); }
-	{ long long int ret; ret = __sync_add_and_fetch(vp8, v8); }
-	{ long long int ret; ret = __sync_add_and_fetch_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_add_and_fetch(vp16, v16); }
-	{ __int128 ret; ret = __sync_add_and_fetch_16(vp16, v16); }
-	#endif
-
-	{ char ret; ret = __sync_sub_and_fetch(vp1, v1); }
-	{ char ret; ret = __sync_sub_and_fetch_1(vp1, v1); }
-	{ short ret; ret = __sync_sub_and_fetch(vp2, v2); }
-	{ short ret; ret = __sync_sub_and_fetch_2(vp2, v2); }
-	{ int ret; ret = __sync_sub_and_fetch(vp4, v4); }
-	{ int ret; ret = __sync_sub_and_fetch_4(vp4, v4); }
-	{ long long int ret; ret = __sync_sub_and_fetch(vp8, v8); }
-	{ long long int ret; ret = __sync_sub_and_fetch_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_sub_and_fetch(vp16, v16); }
-	{ __int128 ret; ret = __sync_sub_and_fetch_16(vp16, v16); }
-	#endif
-
-	{ char ret; ret = __sync_or_and_fetch(vp1, v1); }
-	{ char ret; ret = __sync_or_and_fetch_1(vp1, v1); }
-	{ short ret; ret = __sync_or_and_fetch(vp2, v2); }
-	{ short ret; ret = __sync_or_and_fetch_2(vp2, v2); }
-	{ int ret; ret = __sync_or_and_fetch(vp4, v4); }
-	{ int ret; ret = __sync_or_and_fetch_4(vp4, v4); }
-	{ long long int ret; ret = __sync_or_and_fetch(vp8, v8); }
-	{ long long int ret; ret = __sync_or_and_fetch_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_or_and_fetch(vp16, v16); }
-	{ __int128 ret; ret = __sync_or_and_fetch_16(vp16, v16); }
-	#endif
-
-	{ char ret; ret = __sync_and_and_fetch(vp1, v1); }
-	{ char ret; ret = __sync_and_and_fetch_1(vp1, v1); }
-	{ short ret; ret = __sync_and_and_fetch(vp2, v2); }
-	{ short ret; ret = __sync_and_and_fetch_2(vp2, v2); }
-	{ int ret; ret = __sync_and_and_fetch(vp4, v4); }
-	{ int ret; ret = __sync_and_and_fetch_4(vp4, v4); }
-	{ long long int ret; ret = __sync_and_and_fetch(vp8, v8); }
-	{ long long int ret; ret = __sync_and_and_fetch_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_and_and_fetch(vp16, v16); }
-	{ __int128 ret; ret = __sync_and_and_fetch_16(vp16, v16); }
-	#endif
-
-	{ char ret; ret = __sync_xor_and_fetch(vp1, v1); }
-	{ char ret; ret = __sync_xor_and_fetch_1(vp1, v1); }
-	{ short ret; ret = __sync_xor_and_fetch(vp2, v2); }
-	{ short ret; ret = __sync_xor_and_fetch_2(vp2, v2); }
-	{ int ret; ret = __sync_xor_and_fetch(vp4, v4); }
-	{ int ret; ret = __sync_xor_and_fetch_4(vp4, v4); }
-	{ long long int ret; ret = __sync_xor_and_fetch(vp8, v8); }
-	{ long long int ret; ret = __sync_xor_and_fetch_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_xor_and_fetch(vp16, v16); }
-	{ __int128 ret; ret = __sync_xor_and_fetch_16(vp16, v16); }
-	#endif
-
-	{ char ret; ret = __sync_nand_and_fetch(vp1, v1); }
-	{ char ret; ret = __sync_nand_and_fetch_1(vp1, v1); }
-	{ short ret; ret = __sync_nand_and_fetch(vp2, v2); }
-	{ short ret; ret = __sync_nand_and_fetch_2(vp2, v2); }
-	{ int ret; ret = __sync_nand_and_fetch(vp4, v4); }
-	{ int ret; ret = __sync_nand_and_fetch_4(vp4, v4); }
-	{ long long int ret; ret = __sync_nand_and_fetch(vp8, v8); }
-	{ long long int ret; ret = __sync_nand_and_fetch_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_nand_and_fetch(vp16, v16); }
-	{ __int128 ret; ret = __sync_nand_and_fetch_16(vp16, v16); }
-	#endif
-
-	{ _Bool ret; ret = __sync_bool_compare_and_swap(vp1, v1, v1); }
-	{ _Bool ret; ret = __sync_bool_compare_and_swap_1(vp1, v1, v1); }
-	{ _Bool ret; ret = __sync_bool_compare_and_swap(vp2, v2, v2); }
-	{ _Bool ret; ret = __sync_bool_compare_and_swap_2(vp2, v2, v2); }
-	{ _Bool ret; ret = __sync_bool_compare_and_swap(vp4, v4, v4); }
-	{ _Bool ret; ret = __sync_bool_compare_and_swap_4(vp4, v4, v4); }
-	{ _Bool ret; ret = __sync_bool_compare_and_swap(vp8, v8, v8); }
-	{ _Bool ret; ret = __sync_bool_compare_and_swap_8(vp8, v8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ _Bool ret; ret = __sync_bool_compare_and_swap(vp16, v16, v16); }
-	{ _Bool ret; ret = __sync_bool_compare_and_swap_16(vp16, v16,v16); }
+	{ char ret; ret = __sync_fetch_and_add(vpc, vc); }
+	{ short ret; ret = __sync_fetch_and_add(vps, vs); }
+	{ int ret; ret = __sync_fetch_and_add(vpi, vi); }
+	{ long int ret; ret = __sync_fetch_and_add(vpl, vl); }
+	{ long long int ret; ret = __sync_fetch_and_add(vpll, vll); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_fetch_and_add(vplll, vlll); }
+	#endif
+
+	{ char ret; ret = __sync_fetch_and_sub(vpc, vc); }
+	{ short ret; ret = __sync_fetch_and_sub(vps, vs); }
+	{ int ret; ret = __sync_fetch_and_sub(vpi, vi); }
+	{ long int ret; ret = __sync_fetch_and_sub(vpl, vl); }
+	{ long long int ret; ret = __sync_fetch_and_sub(vpll, vll); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_fetch_and_sub(vplll, vlll); }
+	#endif
+
+	{ char ret; ret = __sync_fetch_and_or(vpc, vc); }
+	{ short ret; ret = __sync_fetch_and_or(vps, vs); }
+	{ int ret; ret = __sync_fetch_and_or(vpi, vi); }
+	{ long int ret; ret = __sync_fetch_and_or(vpl, vl); }
+	{ long long int ret; ret = __sync_fetch_and_or(vpll, vll); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_fetch_and_or(vplll, vlll); }
+	#endif
+
+	{ char ret; ret = __sync_fetch_and_and(vpc, vc); }
+	{ short ret; ret = __sync_fetch_and_and(vps, vs); }
+	{ int ret; ret = __sync_fetch_and_and(vpi, vi); }
+	{ long int ret; ret = __sync_fetch_and_and(vpl, vl); }
+	{ long long int ret; ret = __sync_fetch_and_and(vpll, vll); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_fetch_and_and(vplll, vlll); }
+	#endif
+
+	{ char ret; ret = __sync_fetch_and_xor(vpc, vc); }
+	{ short ret; ret = __sync_fetch_and_xor(vps, vs); }
+	{ int ret; ret = __sync_fetch_and_xor(vpi, vi); }
+	{ long int ret; ret = __sync_fetch_and_xor(vpl, vl); }
+	{ long long int ret; ret = __sync_fetch_and_xor(vpll, vll); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_fetch_and_xor(vplll, vlll); }
+	#endif
+
+	{ char ret; ret = __sync_fetch_and_nand(vpc, vc); }
+	{ short ret; ret = __sync_fetch_and_nand(vps, vs); }
+	{ int ret; ret = __sync_fetch_and_nand(vpi, vi); }
+	{ long int ret; ret = __sync_fetch_and_nand(vpl, vl); }
+	{ long long int ret; ret = __sync_fetch_and_nand(vpll, vll); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_fetch_and_nand(vplll, vlll); }
+	{ __int128 ret; ret = __sync_fetch_and_nand_16(vplll, vlll); }
+	#endif
+
+	{ char ret; ret = __sync_add_and_fetch(vpc, vc); }
+	{ short ret; ret = __sync_add_and_fetch(vps, vs); }
+	{ int ret; ret = __sync_add_and_fetch(vpi, vi); }
+	{ long int ret; ret = __sync_add_and_fetch(vpl, vl); }
+	{ long long int ret; ret = __sync_add_and_fetch(vpll, vll); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_add_and_fetch(vplll, vlll); }
+	#endif
+
+	{ char ret; ret = __sync_sub_and_fetch(vpc, vc); }
+	{ short ret; ret = __sync_sub_and_fetch(vps, vs); }
+	{ int ret; ret = __sync_sub_and_fetch(vpi, vi); }
+	{ long int ret; ret = __sync_sub_and_fetch(vpl, vl); }
+	{ long long int ret; ret = __sync_sub_and_fetch(vpll, vll); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_sub_and_fetch(vplll, vlll); }
+	#endif
+
+	{ char ret; ret = __sync_or_and_fetch(vpc, vc); }
+	{ short ret; ret = __sync_or_and_fetch(vps, vs); }
+	{ int ret; ret = __sync_or_and_fetch(vpi, vi); }
+	{ long int ret; ret = __sync_or_and_fetch(vpl, vl); }
+	{ long long int ret; ret = __sync_or_and_fetch(vpll, vll); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_or_and_fetch(vplll, vlll); }
+	#endif
+
+	{ char ret; ret = __sync_and_and_fetch(vpc, vc); }
+	{ short ret; ret = __sync_and_and_fetch(vps, vs); }
+	{ int ret; ret = __sync_and_and_fetch(vpi, vi); }
+	{ long int ret; ret = __sync_and_and_fetch(vpl, vl); }
+	{ long long int ret; ret = __sync_and_and_fetch(vpll, vll); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_and_and_fetch(vplll, vlll); }
+	#endif
+
+	{ char ret; ret = __sync_xor_and_fetch(vpc, vc); }
+	{ short ret; ret = __sync_xor_and_fetch(vps, vs); }
+	{ int ret; ret = __sync_xor_and_fetch(vpi, vi); }
+	{ long int ret; ret = __sync_xor_and_fetch(vpl, vl); }
+	{ long long int ret; ret = __sync_xor_and_fetch(vpll, vll); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_xor_and_fetch(vplll, vlll); }
+	#endif
+
+	{ char ret; ret = __sync_nand_and_fetch(vpc, vc); }
+	{ short ret; ret = __sync_nand_and_fetch(vps, vs); }
+	{ int ret; ret = __sync_nand_and_fetch(vpi, vi); }
+	{ long int ret; ret = __sync_nand_and_fetch(vpl, vl); }
+	{ long long int ret; ret = __sync_nand_and_fetch(vpll, vll); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_nand_and_fetch(vplll, vlll); }
+	#endif
+
+	{ _Bool ret; ret = __sync_bool_compare_and_swap(vpc, vc, vc); }
+	{ _Bool ret; ret = __sync_bool_compare_and_swap(vps, vs, vs); }
+	{ _Bool ret; ret = __sync_bool_compare_and_swap(vpi, vi, vi); }
+	{ _Bool ret; ret = __sync_bool_compare_and_swap(vpl, vl, vl); }
+	{ _Bool ret; ret = __sync_bool_compare_and_swap(vpll, vll, vll); }
+	#if defined(__SIZEOF_INT128__)
+	{ _Bool ret; ret = __sync_bool_compare_and_swap(vplll, vlll, vlll); }
 	#endif
 	{ _Bool ret; ret = __sync_bool_compare_and_swap(vpp, vp, vp); }
 
-	{ char ret; ret = __sync_val_compare_and_swap(vp1, v1, v1); }
-	{ char ret; ret = __sync_val_compare_and_swap_1(vp1, v1, v1); }
-	{ short ret; ret = __sync_val_compare_and_swap(vp2, v2, v2); }
-	{ short ret; ret = __sync_val_compare_and_swap_2(vp2, v2, v2); }
-	{ int ret; ret = __sync_val_compare_and_swap(vp4, v4, v4); }
-	{ int ret; ret = __sync_val_compare_and_swap_4(vp4, v4, v4); }
-	{ long long int ret; ret = __sync_val_compare_and_swap(vp8, v8, v8); }
-	{ long long int ret; ret = __sync_val_compare_and_swap_8(vp8, v8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_val_compare_and_swap(vp16, v16, v16); }
-	{ __int128 ret; ret = __sync_val_compare_and_swap_16(vp16, v16,v16); }
+	{ char ret; ret = __sync_val_compare_and_swap(vpc, vc, vc); }
+	{ short ret; ret = __sync_val_compare_and_swap(vps, vs, vs); }
+	{ int ret; ret = __sync_val_compare_and_swap(vpi, vi, vi); }
+	{ long int ret; ret = __sync_val_compare_and_swap(vpl, vl, vl); }
+	{ long long int ret; ret = __sync_val_compare_and_swap(vpll, vll, vll); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_val_compare_and_swap(vplll, vlll, vlll); }
 	#endif
 	{ struct type * ret; ret = __sync_val_compare_and_swap(vpp, vp, vp); }
 
 
-	{ char ret; ret = __sync_lock_test_and_set(vp1, v1); }
-	{ char ret; ret = __sync_lock_test_and_set_1(vp1, v1); }
-	{ short ret; ret = __sync_lock_test_and_set(vp2, v2); }
-	{ short ret; ret = __sync_lock_test_and_set_2(vp2, v2); }
-	{ int ret; ret = __sync_lock_test_and_set(vp4, v4); }
-	{ int ret; ret = __sync_lock_test_and_set_4(vp4, v4); }
-	{ long long int ret; ret = __sync_lock_test_and_set(vp8, v8); }
-	{ long long int ret; ret = __sync_lock_test_and_set_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_lock_test_and_set(vp16, v16); }
-	{ __int128 ret; ret = __sync_lock_test_and_set_16(vp16, v16); }
-	#endif
-
-	{ __sync_lock_release(vp1); }
-	{ __sync_lock_release_1(vp1); }
-	{ __sync_lock_release(vp2); }
-	{ __sync_lock_release_2(vp2); }
-	{ __sync_lock_release(vp4); }
-	{ __sync_lock_release_4(vp4); }
-	{ __sync_lock_release(vp8); }
-	{ __sync_lock_release_8(vp8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __sync_lock_release(vp16); }
-	{ __sync_lock_release_16(vp16); }
+	{ char ret; ret = __sync_lock_test_and_set(vpc, vc); }
+	{ short ret; ret = __sync_lock_test_and_set(vps, vs); }
+	{ int ret; ret = __sync_lock_test_and_set(vpi, vi); }
+	{ long int ret; ret = __sync_lock_test_and_set(vpl, vl); }
+	{ long long int ret; ret = __sync_lock_test_and_set(vpll, vll); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_lock_test_and_set(vplll, vlll); }
+	#endif
+
+	{ __sync_lock_release(vpc); }
+	{ __sync_lock_release(vps); }
+	{ __sync_lock_release(vpi); }
+	{ __sync_lock_release(vpl); }
+	{ __sync_lock_release(vpll); }
+	#if defined(__SIZEOF_INT128__)
+	{ __sync_lock_release(vplll); }
 	#endif
 
@@ -230,246 +168,186 @@
 
 	{ _Bool ret; ret = __atomic_test_and_set(vpB, vB); }
-	{ _Bool ret; ret = __atomic_test_and_set(vp1, v1); }
+	{ _Bool ret; ret = __atomic_test_and_set(vpc, vc); }
 	{ __atomic_clear(vpB, vB); }
-	{ __atomic_clear(vp1, v1); }
-
-	{ char ret; ret = __atomic_exchange_n(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_exchange_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; __atomic_exchange(vp1, &v1, &ret, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_exchange_n(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_exchange_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; __atomic_exchange(vp2, &v2, &ret, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_exchange_n(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_exchange_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; __atomic_exchange(vp4, &v4, &ret, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_exchange_n(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_exchange_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; __atomic_exchange(vp8, &v8, &ret, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_exchange_n(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_exchange_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; __atomic_exchange(vp16, &v16, &ret, __ATOMIC_SEQ_CST); }
+	{ __atomic_clear(vpc, vc); }
+
+	{ char ret; ret = __atomic_exchange_n(vpc, vc, __ATOMIC_SEQ_CST); }
+	{ char ret; __atomic_exchange(vpc, &vc, &ret, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_exchange_n(vps, vs, __ATOMIC_SEQ_CST); }
+	{ short ret; __atomic_exchange(vps, &vs, &ret, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_exchange_n(vpi, vi, __ATOMIC_SEQ_CST); }
+	{ int ret; __atomic_exchange(vpi, &vi, &ret, __ATOMIC_SEQ_CST); }
+	{ long int ret; ret = __atomic_exchange_n(vpl, vl, __ATOMIC_SEQ_CST); }
+	{ long int ret; __atomic_exchange(vpl, &vl, &ret, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_exchange_n(vpll, vll, __ATOMIC_SEQ_CST); }
+	{ long long int ret; __atomic_exchange(vpll, &vll, &ret, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_exchange_n(vplll, vlll, __ATOMIC_SEQ_CST); }
+	{ __int128 ret; __atomic_exchange(vplll, &vlll, &ret, __ATOMIC_SEQ_CST); }
 	#endif
 	{ struct type * ret; ret = __atomic_exchange_n(vpp, vp, __ATOMIC_SEQ_CST); }
 	{ struct type * ret; __atomic_exchange(vpp, &vp, &ret, __ATOMIC_SEQ_CST); }
 
-	{ char ret; ret = __atomic_load_n(vp1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_load_1(vp1, __ATOMIC_SEQ_CST); }
-	{ char ret; __atomic_load(vp1, &ret, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_load_n(vp2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_load_2(vp2, __ATOMIC_SEQ_CST); }
-	{ short ret; __atomic_load(vp2, &ret, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_load_n(vp4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_load_4(vp4, __ATOMIC_SEQ_CST); }
-	{ int ret; __atomic_load(vp4, &ret, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_load_n(vp8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_load_8(vp8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; __atomic_load(vp8, &ret, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_load_n(vp16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_load_16(vp16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; __atomic_load(vp16, &ret, __ATOMIC_SEQ_CST); }
+	{ char ret; ret = __atomic_load_n(vpc, __ATOMIC_SEQ_CST); }
+	{ char ret; __atomic_load(vpc, &ret, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_load_n(vps, __ATOMIC_SEQ_CST); }
+	{ short ret; __atomic_load(vps, &ret, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_load_n(vpi, __ATOMIC_SEQ_CST); }
+	{ int ret; __atomic_load(vpi, &ret, __ATOMIC_SEQ_CST); }
+	{ long int ret; ret = __atomic_load_n(vpl, __ATOMIC_SEQ_CST); }
+	{ long int ret; __atomic_load(vpl, &ret, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_load_n(vpll, __ATOMIC_SEQ_CST); }
+	{ long long int ret; __atomic_load(vpll, &ret, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_load_n(vplll, __ATOMIC_SEQ_CST); }
+	{ __int128 ret; __atomic_load(vplll, &ret, __ATOMIC_SEQ_CST); }
 	#endif
 	{ struct type * ret; ret = __atomic_load_n(vpp, __ATOMIC_SEQ_CST); }
 	{ struct type * ret; __atomic_load(vpp, &ret, __ATOMIC_SEQ_CST); }
 
-	{ _Bool ret; ret = __atomic_compare_exchange_n(vp1, rp1, v1, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange_1(vp1, rp1, v1, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange(vp1, rp1, &v1, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange_n(vp2, rp2, v2, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange_2(vp2, rp2, v2, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange(vp2, rp2, &v2, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange_n(vp4, rp4, v4, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange_4(vp4, rp4, v4, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange(vp4, rp4, &v4, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange_n(vp8, rp8, v8, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange_8(vp8, rp8, v8, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange(vp8, rp8, &v8, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ _Bool ret; ret = __atomic_compare_exchange_n(vp16, rp16, v16, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange_16(vp16, rp16, v16, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange(vp16, rp16, &v16, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange_n(vpc, rpc, vc, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange(vpc, rpc, &vc, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange_n(vps, rps, vs, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange(vps, rps, &vs, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange_n(vpi, rpi, vi, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange(vpi, rpi, &vi, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange_n(vpl, rpl, vl, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange(vpl, rpl, &vl, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange_n(vpll, rpll, vll, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange(vpll, rpll, &vll, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ _Bool ret; ret = __atomic_compare_exchange_n(vplll, rplll, vlll, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange(vplll, rplll, &vlll, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
 	#endif
 	{ _Bool ret; ret = __atomic_compare_exchange_n(vpp, rpp, vp, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
 	{ _Bool ret; ret = __atomic_compare_exchange(vpp, rpp, &vp, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
 
-	{ __atomic_store_n(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ __atomic_store_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ __atomic_store(vp1, &v1, __ATOMIC_SEQ_CST); }
-	{ __atomic_store_n(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ __atomic_store_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ __atomic_store(vp2, &v2, __ATOMIC_SEQ_CST); }
-	{ __atomic_store_n(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ __atomic_store_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ __atomic_store(vp4, &v4, __ATOMIC_SEQ_CST); }
-	{ __atomic_store_n(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ __atomic_store_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ __atomic_store(vp8, &v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __atomic_store_n(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __atomic_store_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __atomic_store(vp16, &v16, __ATOMIC_SEQ_CST); }
+	{ __atomic_store_n(vpc, vc, __ATOMIC_SEQ_CST); }
+	{ __atomic_store(vpc, &vc, __ATOMIC_SEQ_CST); }
+	{ __atomic_store_n(vps, vs, __ATOMIC_SEQ_CST); }
+	{ __atomic_store(vps, &vs, __ATOMIC_SEQ_CST); }
+	{ __atomic_store_n(vpi, vi, __ATOMIC_SEQ_CST); }
+	{ __atomic_store(vpi, &vi, __ATOMIC_SEQ_CST); }
+	{ __atomic_store_n(vpl, vl, __ATOMIC_SEQ_CST); }
+	{ __atomic_store(vpl, &vl, __ATOMIC_SEQ_CST); }
+	{ __atomic_store_n(vpll, vll, __ATOMIC_SEQ_CST); }
+	{ __atomic_store(vpll, &vll, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __atomic_store_n(vplll, vlll, __ATOMIC_SEQ_CST); }
+	{ __atomic_store(vplll, &vlll, __ATOMIC_SEQ_CST); }
 	#endif
 	{ __atomic_store_n(vpp, vp, __ATOMIC_SEQ_CST); }
 	{ __atomic_store(vpp, &vp, __ATOMIC_SEQ_CST); }
 
-	{ char ret; ret = __atomic_add_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_add_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_add_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_add_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_add_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_add_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_add_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_add_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_add_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_add_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_sub_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_sub_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_sub_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_sub_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_sub_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_sub_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_sub_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_sub_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_sub_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_sub_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_and_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_and_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_and_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_and_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_and_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_and_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_and_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_and_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_and_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_and_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_nand_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_nand_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_nand_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_nand_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_nand_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_nand_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_nand_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_nand_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_nand_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_nand_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_xor_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_xor_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_xor_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_xor_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_xor_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_xor_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_xor_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_xor_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_xor_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_xor_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_or_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_or_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_or_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_or_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_or_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_or_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_or_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_or_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_or_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_or_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_fetch_add(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_fetch_add_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_add(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_add_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_add(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_add_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_add(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_add_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_fetch_add(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_fetch_add_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_fetch_sub(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_fetch_sub_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_sub(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_sub_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_sub(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_sub_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_sub(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_sub_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_fetch_sub(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_fetch_sub_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_fetch_and(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_fetch_and_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_and(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_and_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_and(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_and_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_and(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_and_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_fetch_and(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_fetch_and_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_fetch_nand(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_fetch_nand_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_nand(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_nand_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_nand(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_nand_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_nand(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_nand_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_fetch_nand(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_fetch_nand_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_fetch_xor(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_fetch_xor_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_xor(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_xor_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_xor(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_xor_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_xor(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_xor_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_fetch_xor(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_fetch_xor_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_fetch_or(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_fetch_or_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_or(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_or_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_or(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_or_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_or(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_or_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_fetch_or(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_fetch_or_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ _Bool ret; ret = __atomic_always_lock_free(sizeof(int), vp4); }
-	{ _Bool ret; ret = __atomic_is_lock_free(sizeof(int), vp4); }
+	{ char ret; ret = __atomic_add_fetch(vpc, vc, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_add_fetch(vps, vs, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_add_fetch(vpi, vi, __ATOMIC_SEQ_CST); }
+	{ long int ret; ret = __atomic_add_fetch(vpl, vl, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_add_fetch(vpll, vll, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_add_fetch(vplll, vlll, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_sub_fetch(vpc, vc, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_sub_fetch(vps, vs, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_sub_fetch(vpi, vi, __ATOMIC_SEQ_CST); }
+	{ long int ret; ret = __atomic_sub_fetch(vpl, vl, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_sub_fetch(vpll, vll, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_sub_fetch(vplll, vlll, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_and_fetch(vpc, vc, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_and_fetch(vps, vs, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_and_fetch(vpi, vi, __ATOMIC_SEQ_CST); }
+	{ long int ret; ret = __atomic_and_fetch(vpl, vl, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_and_fetch(vpll, vll, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_and_fetch(vplll, vlll, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_nand_fetch(vpc, vc, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_nand_fetch(vps, vs, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_nand_fetch(vpi, vi, __ATOMIC_SEQ_CST); }
+	{ long int ret; ret = __atomic_nand_fetch(vpl, vl, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_nand_fetch(vpll, vll, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_nand_fetch(vplll, vlll, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_xor_fetch(vpc, vc, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_xor_fetch(vps, vs, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_xor_fetch(vpi, vi, __ATOMIC_SEQ_CST); }
+	{ long int ret; ret = __atomic_xor_fetch(vpl, vl, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_xor_fetch(vpll, vll, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_xor_fetch(vplll, vlll, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_or_fetch(vpc, vc, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_or_fetch(vps, vs, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_or_fetch(vpi, vi, __ATOMIC_SEQ_CST); }
+	{ long int ret; ret = __atomic_or_fetch(vpl, vl, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_or_fetch(vpll, vll, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_or_fetch(vplll, vlll, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_fetch_add(vpc, vc, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_fetch_add(vps, vs, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_fetch_add(vpi, vi, __ATOMIC_SEQ_CST); }
+	{ long int ret; ret = __atomic_fetch_add(vpl, vl, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_fetch_add(vpll, vll, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_fetch_add(vplll, vlll, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_fetch_sub(vpc, vc, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_fetch_sub(vps, vs, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_fetch_sub(vpi, vi, __ATOMIC_SEQ_CST); }
+	{ long int ret; ret = __atomic_fetch_sub(vpl, vl, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_fetch_sub(vpll, vll, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_fetch_sub(vplll, vlll, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_fetch_and(vpc, vc, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_fetch_and(vps, vs, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_fetch_and(vpi, vi, __ATOMIC_SEQ_CST); }
+	{ long int ret; ret = __atomic_fetch_and(vpl, vl, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_fetch_and(vpll, vll, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_fetch_and(vplll, vlll, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_fetch_nand(vpc, vc, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_fetch_nand(vps, vs, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_fetch_nand(vpi, vi, __ATOMIC_SEQ_CST); }
+	{ long int ret; ret = __atomic_fetch_nand(vpl, vl, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_fetch_nand(vpll, vll, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_fetch_nand(vplll, vlll, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_fetch_xor(vpc, vc, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_fetch_xor(vps, vs, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_fetch_xor(vpi, vi, __ATOMIC_SEQ_CST); }
+	{ long int ret; ret = __atomic_fetch_xor(vpl, vl, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_fetch_xor(vpll, vll, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_fetch_xor(vplll, vlll, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_fetch_or(vpc, vc, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_fetch_or(vps, vs, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_fetch_or(vpi, vi, __ATOMIC_SEQ_CST); }
+	{ long int ret; ret = __atomic_fetch_or(vpl, vl, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_fetch_or(vpll, vll, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_fetch_or(vplll, vlll, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ _Bool ret; ret = __atomic_always_lock_free(sizeof(int), vpi); }
+	{ _Bool ret; ret = __atomic_is_lock_free(sizeof(int), vpi); }
 	{ __atomic_thread_fence(__ATOMIC_SEQ_CST); }
 	{ __atomic_signal_fence(__ATOMIC_SEQ_CST); }
Index: tests/concurrent/.expect/keywordErrors.txt
===================================================================
--- tests/concurrent/.expect/keywordErrors.txt	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ tests/concurrent/.expect/keywordErrors.txt	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,6 @@
+concurrent/keywordErrors.cfa:1:1 error: thread keyword requires threads to be in scope, add #include <thread.hfa>
+thread A: with body 1
+
+concurrent/keywordErrors.cfa:6:1 error: thread keyword requires threads to be in scope, add #include <thread.hfa>
+thread B: with body 1
+
Index: tests/concurrent/examples/boundedBufferEXT.cfa
===================================================================
--- tests/concurrent/examples/boundedBufferEXT.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/concurrent/examples/boundedBufferEXT.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Wed Apr 18 22:52:12 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jun 21 08:19:20 2019
-// Update Count     : 14
+// Last Modified On : Thu Jan 16 22:36:34 2020
+// Update Count     : 15
 //
 
@@ -37,5 +37,5 @@
 
 	void insert( Buffer(T) & mutex buffer, T elem ) with( buffer ) {
-		if ( count == BufferSize ) waitfor( remove, buffer );
+		if ( count == BufferSize ) waitfor( remove : buffer );
 		elements[back] = elem;
 		back = ( back + 1 ) % BufferSize;
@@ -44,5 +44,5 @@
 
 	T remove( Buffer(T) & mutex buffer ) with( buffer ) {
-		if ( count == 0 ) waitfor( insert, buffer );
+		if ( count == 0 ) waitfor( insert : buffer );
 		T elem = elements[front];
 		front = ( front + 1 ) % BufferSize;
Index: tests/concurrent/examples/boundedBufferTHREAD.cfa
===================================================================
--- tests/concurrent/examples/boundedBufferTHREAD.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/concurrent/examples/boundedBufferTHREAD.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Wed Apr 18 22:52:12 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jun 21 11:50:12 2019
-// Update Count     : 24
+// Last Modified On : Thu Jan 16 23:09:43 2020
+// Update Count     : 25
 //
 
@@ -44,10 +44,10 @@
 	void main( Buffer & buffer ) with( buffer ) {
 		for () {
-			waitfor( ^?{}, buffer ) {
+			waitfor( ^?{} : buffer ) {
 				break;
-			} or when ( count != 20 ) waitfor( insert, buffer ) {
+			} or when ( count != 20 ) waitfor( insert : buffer ) {
 				back = (back + 1) % 20;
 				count += 1;
-			} or when ( count != 0 ) waitfor( remove, buffer ) {
+			} or when ( count != 0 ) waitfor( remove : buffer ) {
 				front = (front + 1) % 20;
 				count -= 1;
Index: tests/concurrent/examples/gortn.cfa
===================================================================
--- tests/concurrent/examples/gortn.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/concurrent/examples/gortn.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Wed Feb 20 08:02:37 2019
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jun 21 08:25:03 2019
-// Update Count     : 4
+// Last Modified On : Thu Jan 16 22:43:40 2020
+// Update Count     : 5
 // 
 
@@ -26,8 +26,8 @@
 void main( GoRtn & gortn ) with( gortn ) {
 	for () {
-		waitfor( mem1, gortn ) sout | i;
-		or waitfor( mem2, gortn ) sout | f;
-		or waitfor( mem3, gortn ) sout | m.i | m.j;
-		or waitfor( ^?{}, gortn ) break;
+		waitfor( mem1 : gortn ) sout | i;
+		or waitfor( mem2 : gortn ) sout | f;
+		or waitfor( mem3 : gortn ) sout | m.i | m.j;
+		or waitfor( ^?{} : gortn ) break;
 	}
 }
Index: tests/concurrent/keywordErrors.cfa
===================================================================
--- tests/concurrent/keywordErrors.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ tests/concurrent/keywordErrors.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,6 @@
+thread A {};
+
+// This include isn't enough but used to fool the check
+#include <invoke.h>
+
+thread B {};
Index: tests/concurrent/preempt.cfa
===================================================================
--- tests/concurrent/preempt.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/concurrent/preempt.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -36,5 +36,5 @@
 		if( (counter % 7) == this.value ) {
 			__cfaabi_check_preemption();
-			int next = __atomic_add_fetch_4(&counter, 1, __ATOMIC_SEQ_CST);
+			int next = __atomic_add_fetch( &counter, 1, __ATOMIC_SEQ_CST );
 			__cfaabi_check_preemption();
 			if( (next % 100) == 0 ) printf("%d\n", (int)next);
Index: tests/concurrent/signal/wait.cfa
===================================================================
--- tests/concurrent/signal/wait.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/concurrent/signal/wait.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -98,5 +98,5 @@
 	}
 
-	__sync_fetch_and_sub_4( &waiter_left, 1);
+	__atomic_fetch_sub( &waiter_left, 1,  __ATOMIC_SEQ_CST );
 }
 
@@ -109,5 +109,5 @@
 	}
 
-	__sync_fetch_and_sub_4( &waiter_left, 1);
+	__atomic_fetch_sub( &waiter_left, 1,  __ATOMIC_SEQ_CST );
 }
 
@@ -120,5 +120,5 @@
 	}
 
-	__sync_fetch_and_sub_4( &waiter_left, 1);
+	__atomic_fetch_sub( &waiter_left, 1,  __ATOMIC_SEQ_CST );
 }
 
@@ -131,5 +131,5 @@
 	}
 
-	__sync_fetch_and_sub_4( &waiter_left, 1);
+	__atomic_fetch_sub( &waiter_left, 1,  __ATOMIC_SEQ_CST );
 }
 
Index: tests/concurrent/thread.cfa
===================================================================
--- tests/concurrent/thread.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/concurrent/thread.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -7,6 +7,6 @@
 thread Second { semaphore* lock; };
 
-void ?{}( First  & this, semaphore & lock ) { ((thread&)this){"Thread 1"}; this.lock = &lock; }
-void ?{}( Second & this, semaphore & lock ) { ((thread&)this){"Thread 2"}; this.lock = &lock; }
+void ?{}( First  & this, semaphore & lock ) { ((thread&)this){ "Thread 1" }; this.lock = &lock; }
+void ?{}( Second & this, semaphore & lock ) { ((thread&)this){ "Thread 2" }; this.lock = &lock; }
 
 void main(First& this) {
Index: tests/concurrent/waitfor/barge.cfa
===================================================================
--- tests/concurrent/waitfor/barge.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/concurrent/waitfor/barge.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -65,5 +65,5 @@
 		yield(random( 10 ));
 		this.state = WAITFOR;
-		waitfor(do_call, this) {
+		waitfor(do_call : this) {
 			sout | i;
 		}
Index: tests/concurrent/waitfor/dtor.cfa
===================================================================
--- tests/concurrent/waitfor/dtor.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/concurrent/waitfor/dtor.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -47,5 +47,5 @@
 	yield(random( 10 ));
 	set_state( this, MAIN );
-	waitfor( ^?{}, this ) {
+	waitfor( ^?{} : this ) {
 		set_state( this, AFTER );
 	}
Index: tests/concurrent/waitfor/else.cfa
===================================================================
--- tests/concurrent/waitfor/else.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/concurrent/waitfor/else.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -14,9 +14,9 @@
 	sout | "Starting";
 
-	when( false ) waitfor( notcalled, m );
+	when( false ) waitfor( notcalled : m );
 
 	sout | "Step" | i++;
 
-	waitfor( notcalled, m ); or else {
+	waitfor( notcalled : m ); or else {
 		sout | "else called";
 	}
@@ -24,5 +24,5 @@
 	sout | "Step" | i++;
 
-	when( true ) waitfor( notcalled, m ); or when( true ) else {
+	when( true ) waitfor( notcalled : m ); or when( true ) else {
 		sout | "else called";
 	}
@@ -30,5 +30,5 @@
 	sout | "Step" | i++;
 
-	when( false ) waitfor( notcalled, m ); or when( true ) else {
+	when( false ) waitfor( notcalled : m ); or when( true ) else {
 		sout | "else called";
 	}
@@ -36,5 +36,5 @@
 	sout | "Step" | i++;
 
-	when( false ) waitfor( notcalled, m ); or when( false ) else {
+	when( false ) waitfor( notcalled : m ); or when( false ) else {
 		sout | "else called";
 	}
Index: tests/concurrent/waitfor/parse.cfa
===================================================================
--- tests/concurrent/waitfor/parse.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/concurrent/waitfor/parse.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -24,18 +24,18 @@
 
 	//---------------------------------------
-	waitfor( f1, a ) {
+	waitfor( f1 : a ) {
 		1;
 	}
 
 	//---------------------------------------
-	waitfor( f1, a ) {
+	waitfor( f1 : a ) {
 		2;
 	}
-	waitfor( f2, a ) {
+	waitfor( f2 : a ) {
 		3;
 	}
 
 	//---------------------------------------
-	when( 1 < 3 ) waitfor( f2, a, a ) {
+	when( 1 < 3 ) waitfor( f2 : a, a ) {
 		4;
 	}
@@ -45,5 +45,5 @@
 
 	//---------------------------------------
-	when( 2 < 3 ) waitfor( f3, a ) {
+	when( 2 < 3 ) waitfor( f3 : a ) {
 		5;
 	}
@@ -53,5 +53,5 @@
 
 	//---------------------------------------
-	when( 3 < 3 ) waitfor( f3, a, a ) {
+	when( 3 < 3 ) waitfor( f3 : a, a ) {
 		7;
 	}
@@ -64,8 +64,8 @@
 
 	//---------------------------------------
-	when( 6 < 3 ) waitfor( f3, a, a, a ) {
+	when( 6 < 3 ) waitfor( f3 : a, a, a ) {
 		10;
 	}
- 	or when( 7 < 3 ) waitfor( f1, a  ) {
+ 	or when( 7 < 3 ) waitfor( f1 : a  ) {
 		11;
 	}
@@ -75,8 +75,8 @@
 
 	//---------------------------------------
-	when( 8 < 3 ) waitfor( f3, a, a ) {
+	when( 8 < 3 ) waitfor( f3 : a, a ) {
 		13;
 	}
- 	or waitfor( f1, a  ) {
+ 	or waitfor( f1 : a  ) {
 		14;
 	}
@@ -86,8 +86,8 @@
 
 	//---------------------------------------
-	when( 10 < 3 ) waitfor( f1, a ) {
+	when( 10 < 3 ) waitfor( f1 : a ) {
 		16;
 	}
- 	or waitfor( f2, a, a ) {
+ 	or waitfor( f2 : a, a ) {
 		17;
 	}
@@ -100,5 +100,3 @@
 }
 
-int main() {
-
-}
+int main() {}
Index: tests/concurrent/waitfor/parse2.cfa
===================================================================
--- tests/concurrent/waitfor/parse2.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/concurrent/waitfor/parse2.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Wed Aug 30 17:53:29 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Mar 22 13:42:11 2019
-// Update Count     : 3
+// Last Modified On : Thu Jan 16 23:13:37 2020
+// Update Count     : 6
 // 
 
@@ -26,5 +26,5 @@
 	}
 
-	waitfor( x, z ) {
+	waitfor( x : z ) {
 	}
 
@@ -37,5 +37,5 @@
 	or waitfor( y );
 
-	waitfor( x, z );
+	waitfor( x : z );
 	or waitfor( y );
 
@@ -43,5 +43,5 @@
 	or when( true ) waitfor( y );
 
-	when( true ) waitfor( x, z );
+	when( true ) waitfor( x : z );
 	or when( true ) waitfor( y );
 
@@ -50,5 +50,5 @@
 	}
 
-	waitfor( x, z ) {
+	waitfor( x : z ) {
 	} or waitfor( y ) {
 	}
@@ -80,5 +80,5 @@
 	or else;
 
-	when( true ) waitfor( x, z );
+	when( true ) waitfor( x : z );
 	or else;
 
@@ -99,5 +99,5 @@
 	}
 
-	when( true ) waitfor( x, z );
+	when( true ) waitfor( x : z );
 	or else {
 	}
@@ -115,5 +115,5 @@
 	or when( true ) else;
 
-	when( true ) waitfor( x, z );
+	when( true ) waitfor( x : z );
 	or when( true ) else;
 
@@ -134,5 +134,5 @@
 	}
 
-	when( true ) waitfor( x, z );
+	when( true ) waitfor( x : z );
 	or when( true ) else {
 	}
@@ -149,5 +149,5 @@
 	or timeout( 3 );
 
-	waitfor( x, z );
+	waitfor( x : z );
 	or timeout( 3 );
 
@@ -163,5 +163,5 @@
 	}
 
-	when( true ) waitfor( x, z ) {
+	when( true ) waitfor( x : z ) {
 	} or timeout( 3 ) {
 	}
@@ -171,5 +171,5 @@
 	}
 
-	when( true ) waitfor( x, z ) {
+	when( true ) waitfor( x : z ) {
 	} or when ( true ) timeout( 3 ) {
 	}
@@ -229,12 +229,12 @@
 
 	int or, timeout;
-	waitfor( timeout, 7 ) 3;
-	waitfor( timeout, 7 ) 3; or waitfor( timeout, 7 ) 3;
-	when( or ) waitfor( or, ) { 4; } or timeout( 1 ) 3;
-	when( 3 ) waitfor( or, 2 ) 4; or else 4;
-	when( 3 ) waitfor( or, 3 ) 4; or when( or ) timeout( or ) 4; or when( or ) else timeout;
-	when( 3 ) waitfor( or, or ) 3; or when( or ) waitfor( or, timeout ) 4; or else 4;
-	when( 3 ) waitfor( or, or ) 3; or waitfor( or, 9 ) 4; or when( or ) timeout( timeout ) 4;
-	when( 3 ) waitfor( or, 3 ) 3; or waitfor( or, 7 ) or; or timeout( 1 ) or; or when( 3 ) else or;
+	waitfor( timeout : 7 ) 3;
+	waitfor( timeout : 7 ) 3; or waitfor( timeout : 7 ) 3;
+	when( or ) waitfor( or : ) { 4; } or timeout( 1 ) 3;
+	when( 3 ) waitfor( or : 2 ) 4; or else 4;
+	when( 3 ) waitfor( or : 3 ) 4; or when( or ) timeout( or ) 4; or when( or ) else timeout;
+	when( 3 ) waitfor( or : or ) 3; or when( or ) waitfor( or : timeout ) 4; or else 4;
+	when( 3 ) waitfor( or : or ) 3; or waitfor( or : 9 ) 4; or when( or ) timeout( timeout ) 4;
+	when( 3 ) waitfor( or : 3 ) 3; or waitfor( or : 7 ) or; or timeout( 1 ) or; or when( 3 ) else or;
 
 	// test else selection
Index: tests/concurrent/waitfor/recurse.cfa
===================================================================
--- tests/concurrent/waitfor/recurse.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/concurrent/waitfor/recurse.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -66,5 +66,5 @@
 
 	rand_yield();
-	waitfor( call4, this );
+	waitfor( call4 : this );
 	rand_yield();
 
@@ -78,5 +78,5 @@
 
 	rand_yield();
-	waitfor( call3, this );
+	waitfor( call3 : this );
 	rand_yield();
 
@@ -92,5 +92,5 @@
 
 	rand_yield();
-	waitfor( call2, this );
+	waitfor( call2 : this );
 	rand_yield();
 
Index: tests/concurrent/waitfor/statment.cfa
===================================================================
--- tests/concurrent/waitfor/statment.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/concurrent/waitfor/statment.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -101,12 +101,12 @@
 
 	while( !done ) {
-		   waitfor( get_index, this );
-		or waitfor( call1, this ) { sout | "Statement"; if( this.last_val != 1 ) { serr | "Incorrect index: expected" | 1 | "got" | this.last_val; } }
-		or waitfor( call2, this ) { sout | "Statement"; if( this.last_val != 2 ) { serr | "Incorrect index: expected" | 2 | "got" | this.last_val; } }
-		or waitfor( call3, this ) { sout | "Statement"; if( this.last_val != 3 ) { serr | "Incorrect index: expected" | 3 | "got" | this.last_val; } }
-		or waitfor( call4, this ) { sout | "Statement"; if( this.last_val != 4 ) { serr | "Incorrect index: expected" | 4 | "got" | this.last_val; } }
-		or waitfor( call5, this ) { sout | "Statement"; if( this.last_val != 5 ) { serr | "Incorrect index: expected" | 5 | "got" | this.last_val; } }
-		or waitfor( call6, this ) { sout | "Statement"; if( this.last_val != 6 ) { serr | "Incorrect index: expected" | 6 | "got" | this.last_val; } }
-		or waitfor( call7, this ) { sout | "Statement"; if( this.last_val != 7 ) { serr | "Incorrect index: expected" | 7 | "got" | this.last_val; } }
+		   waitfor( get_index : this );
+		or waitfor( call1 : this ) { sout | "Statement"; if( this.last_val != 1 ) { serr | "Incorrect index: expected" | 1 | "got" | this.last_val; } }
+		or waitfor( call2 : this ) { sout | "Statement"; if( this.last_val != 2 ) { serr | "Incorrect index: expected" | 2 | "got" | this.last_val; } }
+		or waitfor( call3 : this ) { sout | "Statement"; if( this.last_val != 3 ) { serr | "Incorrect index: expected" | 3 | "got" | this.last_val; } }
+		or waitfor( call4 : this ) { sout | "Statement"; if( this.last_val != 4 ) { serr | "Incorrect index: expected" | 4 | "got" | this.last_val; } }
+		or waitfor( call5 : this ) { sout | "Statement"; if( this.last_val != 5 ) { serr | "Incorrect index: expected" | 5 | "got" | this.last_val; } }
+		or waitfor( call6 : this ) { sout | "Statement"; if( this.last_val != 6 ) { serr | "Incorrect index: expected" | 6 | "got" | this.last_val; } }
+		or waitfor( call7 : this ) { sout | "Statement"; if( this.last_val != 7 ) { serr | "Incorrect index: expected" | 7 | "got" | this.last_val; } }
 
 		done = true;
Index: tests/concurrent/waitfor/when.cfa
===================================================================
--- tests/concurrent/waitfor/when.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/concurrent/waitfor/when.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -58,10 +58,10 @@
 void arbiter( global_t & mutex this ) {
 	for( int i = 0; i < N; i++ ) {
-		   when( this.last_call == 6 ) waitfor( call1, this ) { if( this.last_call != 1) { serr | "Expected last_call to be 1 got" | this.last_call; } }
-		or when( this.last_call == 1 ) waitfor( call2, this ) { if( this.last_call != 2) { serr | "Expected last_call to be 2 got" | this.last_call; } }
-		or when( this.last_call == 2 ) waitfor( call3, this ) { if( this.last_call != 3) { serr | "Expected last_call to be 3 got" | this.last_call; } }
-		or when( this.last_call == 3 ) waitfor( call4, this ) { if( this.last_call != 4) { serr | "Expected last_call to be 4 got" | this.last_call; } }
-		or when( this.last_call == 4 ) waitfor( call5, this ) { if( this.last_call != 5) { serr | "Expected last_call to be 5 got" | this.last_call; } }
-		or when( this.last_call == 5 ) waitfor( call6, this ) { if( this.last_call != 6) { serr | "Expected last_call to be 6 got" | this.last_call; } }
+		   when( this.last_call == 6 ) waitfor( call1 : this ) { if( this.last_call != 1) { serr | "Expected last_call to be 1 got" | this.last_call; } }
+		or when( this.last_call == 1 ) waitfor( call2 : this ) { if( this.last_call != 2) { serr | "Expected last_call to be 2 got" | this.last_call; } }
+		or when( this.last_call == 2 ) waitfor( call3 : this ) { if( this.last_call != 3) { serr | "Expected last_call to be 3 got" | this.last_call; } }
+		or when( this.last_call == 3 ) waitfor( call4 : this ) { if( this.last_call != 4) { serr | "Expected last_call to be 4 got" | this.last_call; } }
+		or when( this.last_call == 4 ) waitfor( call5 : this ) { if( this.last_call != 5) { serr | "Expected last_call to be 5 got" | this.last_call; } }
+		or when( this.last_call == 5 ) waitfor( call6 : this ) { if( this.last_call != 6) { serr | "Expected last_call to be 6 got" | this.last_call; } }
 
 		sout | this.last_call;
Index: sts/except-0.cfa
===================================================================
--- tests/except-0.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ 	(revision )
@@ -1,247 +1,0 @@
-// Draft of tests for exception handling.
-// Outdated: The integer constant exceptions need to be replaced with virtual
-// exceptions for the new system.
-
-// ERROR: exceptions do not interact with ^?{} properly.
-
-#include <stdio.h>
-#include <stdbool.h>
-
-#include "except-mac.hfa"
-TRIVIAL_EXCEPTION(yin)
-TRIVIAL_EXCEPTION(yang)
-TRIVIAL_EXCEPTION(zen)
-
-
-// Local type to mark exits from scopes. (see ERROR)
-struct signal_exit {
-	const char * area;
-};
-
-void ?{}(signal_exit * this, const char * area) {
-	this->area = area;
-}
-
-void ^?{}(signal_exit * this) {
-	printf("Exiting: %s\n", this->area);
-//	sout | "Exiting:" | this->area;
-}
-
-
-// Mark throws: make sure to only pass in exception types.
-forall(dtype T)
-void terminate(T * except_value) {
-	signal_exit a = {"terminate function"};
-	THROW(except_value);
-	printf("terminate returned\n");
-}
-
-forall(dtype T)
-void resume(T * except_value) {
-	signal_exit a = {"resume function"};
-	THROW_RESUME(except_value);
-	printf("resume returned\n");
-}
-
-// Termination Test: Two handlers: no catch, catch
-void bar() {
-	signal_exit a = {"bar function"};
-	try {
-		terminate(&(zen){});
-	} catch (yin * error) {
-		printf("bar caught exception yin.\n");
-	}
-}
-
-void foo() {
-	signal_exit a = {"foo function"};
-	try {
-		bar();
-	} catch (yang * error) {
-		printf("foo caught exception yang.\n");
-	} catch (zen * error) {
-		printf("foo caught exception zen.\n");
-	}
-}
-
-// Resumption Two Handler Test: no catch, catch.
-void beta() {
-	signal_exit a = {"beta function"};
-	try {
-		zen x;
-		resume(&x);
-	} catchResume (yin * error) {
-		printf("beta caught exception yin\n");
-	}
-}
-
-void alpha() {
-	signal_exit a = {"alpha function"};
-	try {
-		beta();
-	} catchResume (yang * error) {
-		printf("alpha caught exception yang\n");
-	} catchResume (zen * error) {
-		printf("alpha caught exception zen\n");
-	}
-}
-
-// Finally Test:
-void farewell(bool jump) {
-	try {
-		if (jump) {
-			printf("jump out of farewell\n");
-			goto endoffunction;
-		} else {
-			printf("walk out of farewell\n");
-		}
-	} finally {
-		printf("See you next time\n");
-	}
-	endoffunction:
-	printf("leaving farewell\n");
-}
-
-// Resume-to-Terminate Test:
-void fallback() {
-	try {
-		zen x;
-		resume(&x);
-	} catch (zen * error) {
-		printf("fallback caught termination zen\n");
-	}
-}
-
-// Terminate Throw New Exception:
-void terminate_swap() {
-	signal_exit a = {"terminate_swap"};
-	try {
-		yin x;
-		terminate(&x);
-	} catch (yin * error) {
-		yang y;
-		terminate(&y);
-	}
-}
-
-void terminate_swapped() {
-	signal_exit a = {"terminate_swapped"};
-	try {
-		terminate_swap();
-	} catch (yang * error) {
-		printf("terminate_swapped caught exception yang\n");
-	}
-}
-
-// Resume Throw New Exception:
-void resume_swap() {
-	signal_exit a = {"resume_swap"};
-	try {
-		yin x;
-		resume(&x);
-	} catchResume (yin * error) {
-		yang y;
-		resume(&y);
-	}
-}
-
-void resume_swapped() {
-	try {
-		resume_swap();
-	} catchResume (yang * error) {
-		printf("resume_swapped caught exception yang\n");
-	}
-}
-
-// Terminate Rethrow:
-void reterminate() {
-	try {
-		try {
-			zen x;
-			terminate(&x);
-		} catch (zen * error) {
-			printf("reterminate zen caught and "
-			       "will rethrow exception zen\n");
-			throw;
-		}
-	} catch (zen * error) {
-		printf("reterminate 1 caught exception zen\n");
-	}
-}
-
-// Resume Rethrow:
-void reresume() {
-	try {
-		try {
-			zen x;
-			resume(&x);
-		} catchResume (zen * error) {
-			printf("reresume zen caught and rethrows exception zen\n");
-			throwResume;
-		}
-	} catchResume (zen * error) {
-		printf("reresume 1 caught exception zen\n");
-	}
-}
-
-// Terminate-Resume interaction:
-void fum() {
-	// terminate block, call resume
-	try {
-		zen x;
-		resume(&x);
-	} catch (zen * error) {
-		printf("fum caught exception zen\n");
-	}
-}
-
-void foe() {
-	// resume block, call terminate
-	try {
-		zen y;
-		terminate(&y);
-	} catchResume (zen * error) {
-		printf("foe caught exception zen\n");
-	}
-}
-
-void fy() {
-	// terminate block calls fum, call foe
-	try {
-		foe();
-	} catch (zen * error) {
-		printf("fy caught exception zen\n");
-		fum();
-	}
-}
-
-void fee() {
-	// resume block, call fy
-	try {
-		fy();
-	} catchResume (zen * error) {
-		printf("fee caught exception zen\n");
-	}
-}
-
-
-// main: choose which tests to run
-int main(int argc, char * argv[]) {
-	signal_exit a = {"main function"};
-
-	foo(); printf("\n");
-	alpha(); printf("\n");
-	farewell(false); printf("\n");
-	farewell(true); printf("\n");
-	fallback(); printf("\n");
-	terminate_swapped(); printf("\n");
-	resume_swapped(); printf("\n");
-	reterminate(); printf("\n");
-	reresume(); printf("\n");
-	fee(); printf("\n");
-
-	// Uncaught termination test.
-	printf("Throw uncaught.\n");
-	yang z;
-	terminate(&z);
-}
Index: sts/except-1.cfa
===================================================================
--- tests/except-1.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ 	(revision )
@@ -1,81 +1,0 @@
-// Draft memory management test. (remember -fexceptions)
-// Outdated: The integer constant exceptions need to be replaced with virtual
-// exceptions for the new system.
-
-#include <stdio.h>
-
-#include "except-mac.hfa"
-TRIVIAL_EXCEPTION(yin)
-TRIVIAL_EXCEPTION(yang)
-
-int main()
-{
-	try {
-		yin a;
-		THROW(&a);
-	}
-	catch( yin * err ) {
-		printf("First Caught\n");
-		try {
-			yang b;
-			THROW(&b);
-		}
-		catch( yang * err ) {
-			printf("Both Caught\n");
-		}
-	}
-	printf("Part A Complete\n");
-
-	try {
-		try {
-			yang c;
-			THROW(&c);
-		}
-		catch( yang * err ) {
-			printf("First Catch and rethrow\n");
-			throw;
-		}
-	}
-	catch( yang * err ) {
-		printf("Second Catch\n");
-	}
-	printf("Part B Complete\n");
-
-	try {
-		try {
-			yin d;
-			THROW(&d);
-		}
-		catch( yin * err ) {
-			printf("Throw before cleanup\n");
-			yang e;
-			THROW(&e);
-		}
-	}
-	catch( yang * err ) {
-		printf("Catch after cleanup\n");
-	}
-	printf("Part C Complete\n");
-
-	try {
-		try {
-			yin f;
-			THROW(&f);
-		}
-		catch( yin * err ) {
-			printf("Caught initial throw.\n");
-			try {
-				yang g;
-				THROW(&g);
-			}
-			catch( yang * err ) {
-				printf("Caught intermediate throw.\n");
-			}
-			throw;
-		}
-	}
-	catch( yin * err ) {
-		printf("Caught final throw.\n");
-	}
-	printf("Part D Complete\n");
-}
Index: sts/except-2.cfa
===================================================================
--- tests/except-2.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ 	(revision )
@@ -1,92 +1,0 @@
-// New draft of exception tests.
-
-
-#include <stdlib.hfa>
-#include "except-mac.hfa"
-
-TRIVIAL_EXCEPTION(yin)
-TRIVIAL_EXCEPTION(yang)
-
-struct num_error;
-struct num_error_vtable {
-	struct TABLE(BASE_EXCEPT) const * parent;
-	size_t size;
-	void (*copy)(num_error *this, num_error * other);
-	void (*free)(num_error *this);
-	const char * (*msg)(num_error *this);
-	int (*code)(num_error *this);
-};
-extern num_error_vtable INSTANCE(num_error);
-
-struct num_error {
-	struct num_error_vtable const * virtual_table;
-	char * msg;
-	int num;
-};
-
-void num_error_msg(num_error * this) {
-	if ( ! this->msg ) {
-		static const char * base = "Num Error with code: X";
-		this->msg = malloc(22);
-		for (int i = 0 ; (this->msg[i] = base[i]) ; ++i);
-	}
-	this->msg[21] = '0' + this->num;
-	return this->msg;
-}
-void ?{}(num_error * this, int num) {
-	this->virtual_table = &INSTANCE(num_error);
-	this->msg = 0;
-	this->num = num;
-}
-void ?{}(num_error * this, num_error * other) {
-	this->virtual_table = other->virtual_table;
-	this->msg = 0;
-	this->num = other->num;
-}
-void ^?{}(num_error * this) {
-	if( this->msg ) free( this->msg );
-}
-int num_error_code( num_error * this ) {
-	return this->num;
-}
-num_error_vtable _num_error_vtable_instance @= {
-	&INSTANCE(BASE_EXCEPT),
-	sizeof(num_error), ?{}, ^?{},
-	num_error_msg, num_error_code
-};
-
-
-// Test simple throwing, matching and catching.
-void throw_catch() {
-	try {
-		yin black;
-		THROW(&black);
-	} catch ( yin * error ) {
-		printf("throw yin caught.\n");
-	}
-
-	try {
-		yang white;
-		THROW_RESUME(&white);
-		printf("> throwResume returned.\n");
-	} catchResume ( yang * error ) {
-		printf("throwResume yang caught <");
-	}
-
-	try {
-		num_error x = { 2 };
-		THROW(&x);
-	}
-	catch (num_error * error ; 3 == error->virtual_table->code( error ) ) {
-		printf("exception at %p\n", error );
-		printf("Should not be printed.\n");
-	}
-	catch (num_error * error ; 2 == error->virtual_table->code( error ) ) {
-		printf("Should be printed.\n");
-	}
-}
-
-int main (int argc, char * argv[]) {
-	throw_catch();
-	return 0;
-}
Index: sts/except-3.cfa
===================================================================
--- tests/except-3.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ 	(revision )
@@ -1,18 +1,0 @@
-// Test that __attribute__((cleanup(...))) is working.
-
-#include <stdio.h>
-#include "except-mac.hfa"
-TRIVIAL_EXCEPTION(myth)
-
-int main (int argc, char * argv[]) {
-	try {
-		try {
-			printf("throw [");
-			THROW(&(myth){});
-		} finally {
-			printf("] unwind <");
-		}
-	} catch (myth * error) {
-		printf("> catch\n");
-	}
-}
Index: sts/except-mac.hfa
===================================================================
--- tests/except-mac.hfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ 	(revision )
@@ -1,78 +1,0 @@
-// Macros to try and make declaring and using exceptions easier
-// No, these are not part of the language, they replace the virtual system.
-
-// Internal use:
-#define GLUE2(left, right) left##right
-#define GLUE3(left, middle, right) left##middle##right
-
-// The fully (perhaps overly) qualified name of the base exception type:
-#define BASE_EXCEPT __cfaabi_ehm__base_exception_t
-
-// Get the name of the vtable type and vtable instance for an exception type:
-#define TABLE(name) GLUE2(name,_vtable)
-#define INSTANCE(name) GLUE3(_,name,_vtable_instance)
-
-// Throws and the bit of overhead:
-#define THROW(expr) throw ((BASE_EXCEPT *)(expr))
-#define THROW_RESUME(expr) throwResume ((BASE_EXCEPT *)(expr))
-
-
-
-// The following macros are for defining your own new exception types.
-
-// Declare vtable and forward declare the exception type and vtable instance.
-// This should start a new exception declaration.
-// ... argument is the additional vtable fields.
-#define DECLARE_EXCEPT(except_name,parent_name,...) \
-struct except_name; \
-struct TABLE(except_name) { \
-	struct TABLE(parent_name) const * parent; \
-	size_t size; \
-	void (*copy)(except_name *this, except_name * other); \
-	void (*free)(except_name &this); \
-	const char * (*msg)(except_name *this); \
-	__VA_ARGS__ \
-}; \
-extern TABLE(except_name) INSTANCE(except_name);
-
-// The first field of the exception structure should be created with this.
-#define VTABLE_FIELD(except_name) \
-struct TABLE(except_name) const * virtual_table
-
-// In each constructor the vtable must be initialized.
-#define VTABLE_INIT(this_name,except_name) \
-this_name.virtual_table = &INSTANCE(except_name)
-
-// Declare the vtable instance. This should end an exception declaration.
-// ... argument is the remaining vtable field values.
-#define VTABLE_INSTANCE(except_name,parent_name,copy,free,msg,...) \
-TABLE(except_name) INSTANCE(except_name) @= { \
-	&INSTANCE(parent_name), sizeof(except_name), \
-	copy, free, msg, ## __VA_ARGS__ \
-};
-
-// Same, but used declarators for arguments.
-#define VTABLE_INSTANCE_KEY(except_name,parent_name,copy,free,msg,...) \
-TABLE(except_name) INSTANCE(except_name) @= { \
-	.parent : &INSTANCE(parent_name), .size : sizeof(except_name), \
-	.copy : copy, .free : free, .msg : msg, ## __VA_ARGS__ \
-};
-
-
-
-// Declare a trivial exception, one that adds no features:
-#define TRIVIAL_EXCEPTION(name) \
-DECLARE_EXCEPT(name,BASE_EXCEPT,) \
-struct name { \
-	VTABLE_FIELD(name); \
-}; \
-const char * GLUE2(name,_msg)(name * this) { \
-    return #name; \
-} \
-void GLUE2(name,_copy)(name * this, name * other) { \
-    this->virtual_table = other->virtual_table; \
-} \
-void ?{}(name & this) { \
-	VTABLE_INIT(this,name); \
-} \
-VTABLE_INSTANCE(name,BASE_EXCEPT,GLUE2(name,_copy),^?{},GLUE2(name,_msg),)
Index: tests/exceptions/.expect/finally-error.txt
===================================================================
--- tests/exceptions/.expect/finally-error.txt	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ tests/exceptions/.expect/finally-error.txt	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,15 @@
+exceptions/finally-error.cfa:7:1 error: 'break' outside a loop, 'switch', or labelled block
+exceptions/finally-error.cfa:15:1 error: 'break' outside a loop, 'switch', or labelled block
+exceptions/finally-error.cfa:23:1 error: 'break' outside a loop, 'switch', or labelled block
+exceptions/finally-error.cfa:31:1 error: 'continue' target must be an enclosing loop: 
+exceptions/finally-error.cfa:48:1 error: 'break' target must be an enclosing control structure: mainLoop
+exceptions/finally-error.cfa:56:1 error: 'continue' target must be an enclosing loop: mainLoop
+exceptions/finally-error.cfa:65:1 error: 'break' outside a loop, 'switch', or labelled block
+exceptions/finally-error.cfa:76:1 error: 'break' outside a loop, 'switch', or labelled block
+exceptions/finally-error.cfa:87:1 error: 'fallthrough' must be enclosed in a 'switch' or 'choose'
+exceptions/finally-error.cfa:98:1 error: 'break' target must be an enclosing control structure: mainBlock
+exceptions/finally-error.cfa:111:1 error: 'fallthrough' must be enclosed in a 'switch' or 'choose'
+exceptions/finally-error.cfa:124:1 error: 'fallthrough' must be enclosed in a 'switch' or 'choose'
+exceptions/finally-error.cfa:133:1 error: 'return' may not appear in a finally clause
+exceptions/finally-error.cfa:139:1 error: 'return' may not appear in a finally clause
+exceptions/finally-error.cfa:148:1 error: 'break' outside a loop, 'switch', or labelled block
Index: tests/exceptions/except-0.cfa
===================================================================
--- tests/exceptions/except-0.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ tests/exceptions/except-0.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,247 @@
+// Draft of tests for exception handling.
+// Outdated: The integer constant exceptions need to be replaced with virtual
+// exceptions for the new system.
+
+// ERROR: exceptions do not interact with ^?{} properly.
+
+#include <stdio.h>
+#include <stdbool.h>
+
+#include "except-mac.hfa"
+TRIVIAL_EXCEPTION(yin)
+TRIVIAL_EXCEPTION(yang)
+TRIVIAL_EXCEPTION(zen)
+
+
+// Local type to mark exits from scopes. (see ERROR)
+struct signal_exit {
+	const char * area;
+};
+
+void ?{}(signal_exit * this, const char * area) {
+	this->area = area;
+}
+
+void ^?{}(signal_exit * this) {
+	printf("Exiting: %s\n", this->area);
+//	sout | "Exiting:" | this->area;
+}
+
+
+// Mark throws: make sure to only pass in exception types.
+forall(dtype T)
+void terminate(T * except_value) {
+	signal_exit a = {"terminate function"};
+	THROW(except_value);
+	printf("terminate returned\n");
+}
+
+forall(dtype T)
+void resume(T * except_value) {
+	signal_exit a = {"resume function"};
+	THROW_RESUME(except_value);
+	printf("resume returned\n");
+}
+
+// Termination Test: Two handlers: no catch, catch
+void bar() {
+	signal_exit a = {"bar function"};
+	try {
+		terminate(&(zen){});
+	} catch (yin * error) {
+		printf("bar caught exception yin.\n");
+	}
+}
+
+void foo() {
+	signal_exit a = {"foo function"};
+	try {
+		bar();
+	} catch (yang * error) {
+		printf("foo caught exception yang.\n");
+	} catch (zen * error) {
+		printf("foo caught exception zen.\n");
+	}
+}
+
+// Resumption Two Handler Test: no catch, catch.
+void beta() {
+	signal_exit a = {"beta function"};
+	try {
+		zen x;
+		resume(&x);
+	} catchResume (yin * error) {
+		printf("beta caught exception yin\n");
+	}
+}
+
+void alpha() {
+	signal_exit a = {"alpha function"};
+	try {
+		beta();
+	} catchResume (yang * error) {
+		printf("alpha caught exception yang\n");
+	} catchResume (zen * error) {
+		printf("alpha caught exception zen\n");
+	}
+}
+
+// Finally Test:
+void farewell(bool jump) {
+	try {
+		if (jump) {
+			printf("jump out of farewell\n");
+			goto endoffunction;
+		} else {
+			printf("walk out of farewell\n");
+		}
+	} finally {
+		printf("See you next time\n");
+	}
+	endoffunction:
+	printf("leaving farewell\n");
+}
+
+// Resume-to-Terminate Test:
+void fallback() {
+	try {
+		zen x;
+		resume(&x);
+	} catch (zen * error) {
+		printf("fallback caught termination zen\n");
+	}
+}
+
+// Terminate Throw New Exception:
+void terminate_swap() {
+	signal_exit a = {"terminate_swap"};
+	try {
+		yin x;
+		terminate(&x);
+	} catch (yin * error) {
+		yang y;
+		terminate(&y);
+	}
+}
+
+void terminate_swapped() {
+	signal_exit a = {"terminate_swapped"};
+	try {
+		terminate_swap();
+	} catch (yang * error) {
+		printf("terminate_swapped caught exception yang\n");
+	}
+}
+
+// Resume Throw New Exception:
+void resume_swap() {
+	signal_exit a = {"resume_swap"};
+	try {
+		yin x;
+		resume(&x);
+	} catchResume (yin * error) {
+		yang y;
+		resume(&y);
+	}
+}
+
+void resume_swapped() {
+	try {
+		resume_swap();
+	} catchResume (yang * error) {
+		printf("resume_swapped caught exception yang\n");
+	}
+}
+
+// Terminate Rethrow:
+void reterminate() {
+	try {
+		try {
+			zen x;
+			terminate(&x);
+		} catch (zen * error) {
+			printf("reterminate zen caught and "
+			       "will rethrow exception zen\n");
+			throw;
+		}
+	} catch (zen * error) {
+		printf("reterminate 1 caught exception zen\n");
+	}
+}
+
+// Resume Rethrow:
+void reresume() {
+	try {
+		try {
+			zen x;
+			resume(&x);
+		} catchResume (zen * error) {
+			printf("reresume zen caught and rethrows exception zen\n");
+			throwResume;
+		}
+	} catchResume (zen * error) {
+		printf("reresume 1 caught exception zen\n");
+	}
+}
+
+// Terminate-Resume interaction:
+void fum() {
+	// terminate block, call resume
+	try {
+		zen x;
+		resume(&x);
+	} catch (zen * error) {
+		printf("fum caught exception zen\n");
+	}
+}
+
+void foe() {
+	// resume block, call terminate
+	try {
+		zen y;
+		terminate(&y);
+	} catchResume (zen * error) {
+		printf("foe caught exception zen\n");
+	}
+}
+
+void fy() {
+	// terminate block calls fum, call foe
+	try {
+		foe();
+	} catch (zen * error) {
+		printf("fy caught exception zen\n");
+		fum();
+	}
+}
+
+void fee() {
+	// resume block, call fy
+	try {
+		fy();
+	} catchResume (zen * error) {
+		printf("fee caught exception zen\n");
+	}
+}
+
+
+// main: choose which tests to run
+int main(int argc, char * argv[]) {
+	signal_exit a = {"main function"};
+
+	foo(); printf("\n");
+	alpha(); printf("\n");
+	farewell(false); printf("\n");
+	farewell(true); printf("\n");
+	fallback(); printf("\n");
+	terminate_swapped(); printf("\n");
+	resume_swapped(); printf("\n");
+	reterminate(); printf("\n");
+	reresume(); printf("\n");
+	fee(); printf("\n");
+
+	// Uncaught termination test.
+	printf("Throw uncaught.\n");
+	yang z;
+	terminate(&z);
+}
Index: tests/exceptions/except-1.cfa
===================================================================
--- tests/exceptions/except-1.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ tests/exceptions/except-1.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,81 @@
+// Draft memory management test. (remember -fexceptions)
+// Outdated: The integer constant exceptions need to be replaced with virtual
+// exceptions for the new system.
+
+#include <stdio.h>
+
+#include "except-mac.hfa"
+TRIVIAL_EXCEPTION(yin)
+TRIVIAL_EXCEPTION(yang)
+
+int main()
+{
+	try {
+		yin a;
+		THROW(&a);
+	}
+	catch( yin * err ) {
+		printf("First Caught\n");
+		try {
+			yang b;
+			THROW(&b);
+		}
+		catch( yang * err ) {
+			printf("Both Caught\n");
+		}
+	}
+	printf("Part A Complete\n");
+
+	try {
+		try {
+			yang c;
+			THROW(&c);
+		}
+		catch( yang * err ) {
+			printf("First Catch and rethrow\n");
+			throw;
+		}
+	}
+	catch( yang * err ) {
+		printf("Second Catch\n");
+	}
+	printf("Part B Complete\n");
+
+	try {
+		try {
+			yin d;
+			THROW(&d);
+		}
+		catch( yin * err ) {
+			printf("Throw before cleanup\n");
+			yang e;
+			THROW(&e);
+		}
+	}
+	catch( yang * err ) {
+		printf("Catch after cleanup\n");
+	}
+	printf("Part C Complete\n");
+
+	try {
+		try {
+			yin f;
+			THROW(&f);
+		}
+		catch( yin * err ) {
+			printf("Caught initial throw.\n");
+			try {
+				yang g;
+				THROW(&g);
+			}
+			catch( yang * err ) {
+				printf("Caught intermediate throw.\n");
+			}
+			throw;
+		}
+	}
+	catch( yin * err ) {
+		printf("Caught final throw.\n");
+	}
+	printf("Part D Complete\n");
+}
Index: tests/exceptions/except-2.cfa
===================================================================
--- tests/exceptions/except-2.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ tests/exceptions/except-2.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,92 @@
+// New draft of exception tests.
+
+
+#include <stdlib.hfa>
+#include "except-mac.hfa"
+
+TRIVIAL_EXCEPTION(yin)
+TRIVIAL_EXCEPTION(yang)
+
+struct num_error;
+struct num_error_vtable {
+	struct TABLE(BASE_EXCEPT) const * parent;
+	size_t size;
+	void (*copy)(num_error *this, num_error * other);
+	void (*free)(num_error *this);
+	const char * (*msg)(num_error *this);
+	int (*code)(num_error *this);
+};
+extern num_error_vtable INSTANCE(num_error);
+
+struct num_error {
+	struct num_error_vtable const * virtual_table;
+	char * msg;
+	int num;
+};
+
+void num_error_msg(num_error * this) {
+	if ( ! this->msg ) {
+		static const char * base = "Num Error with code: X";
+		this->msg = malloc(22);
+		for (int i = 0 ; (this->msg[i] = base[i]) ; ++i);
+	}
+	this->msg[21] = '0' + this->num;
+	return this->msg;
+}
+void ?{}(num_error * this, int num) {
+	this->virtual_table = &INSTANCE(num_error);
+	this->msg = 0;
+	this->num = num;
+}
+void ?{}(num_error * this, num_error * other) {
+	this->virtual_table = other->virtual_table;
+	this->msg = 0;
+	this->num = other->num;
+}
+void ^?{}(num_error * this) {
+	if( this->msg ) free( this->msg );
+}
+int num_error_code( num_error * this ) {
+	return this->num;
+}
+num_error_vtable _num_error_vtable_instance @= {
+	&INSTANCE(BASE_EXCEPT),
+	sizeof(num_error), ?{}, ^?{},
+	num_error_msg, num_error_code
+};
+
+
+// Test simple throwing, matching and catching.
+void throw_catch() {
+	try {
+		yin black;
+		THROW(&black);
+	} catch ( yin * error ) {
+		printf("throw yin caught.\n");
+	}
+
+	try {
+		yang white;
+		THROW_RESUME(&white);
+		printf("> throwResume returned.\n");
+	} catchResume ( yang * error ) {
+		printf("throwResume yang caught <");
+	}
+
+	try {
+		num_error x = { 2 };
+		THROW(&x);
+	}
+	catch (num_error * error ; 3 == error->virtual_table->code( error ) ) {
+		printf("exception at %p\n", error );
+		printf("Should not be printed.\n");
+	}
+	catch (num_error * error ; 2 == error->virtual_table->code( error ) ) {
+		printf("Should be printed.\n");
+	}
+}
+
+int main (int argc, char * argv[]) {
+	throw_catch();
+	return 0;
+}
Index: tests/exceptions/except-3.cfa
===================================================================
--- tests/exceptions/except-3.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ tests/exceptions/except-3.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,18 @@
+// Test that __attribute__((cleanup(...))) is working.
+
+#include <stdio.h>
+#include "except-mac.hfa"
+TRIVIAL_EXCEPTION(myth)
+
+int main (int argc, char * argv[]) {
+	try {
+		try {
+			printf("throw [");
+			THROW(&(myth){});
+		} finally {
+			printf("] unwind <");
+		}
+	} catch (myth * error) {
+		printf("> catch\n");
+	}
+}
Index: tests/exceptions/except-mac.hfa
===================================================================
--- tests/exceptions/except-mac.hfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ tests/exceptions/except-mac.hfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,78 @@
+// Macros to try and make declaring and using exceptions easier
+// No, these are not part of the language, they replace the virtual system.
+
+// Internal use:
+#define GLUE2(left, right) left##right
+#define GLUE3(left, middle, right) left##middle##right
+
+// The fully (perhaps overly) qualified name of the base exception type:
+#define BASE_EXCEPT __cfaabi_ehm__base_exception_t
+
+// Get the name of the vtable type and vtable instance for an exception type:
+#define TABLE(name) GLUE2(name,_vtable)
+#define INSTANCE(name) GLUE3(_,name,_vtable_instance)
+
+// Throws and the bit of overhead:
+#define THROW(expr) throw ((BASE_EXCEPT *)(expr))
+#define THROW_RESUME(expr) throwResume ((BASE_EXCEPT *)(expr))
+
+
+
+// The following macros are for defining your own new exception types.
+
+// Declare vtable and forward declare the exception type and vtable instance.
+// This should start a new exception declaration.
+// ... argument is the additional vtable fields.
+#define DECLARE_EXCEPT(except_name,parent_name,...) \
+struct except_name; \
+struct TABLE(except_name) { \
+	struct TABLE(parent_name) const * parent; \
+	size_t size; \
+	void (*copy)(except_name *this, except_name * other); \
+	void (*free)(except_name &this); \
+	const char * (*msg)(except_name *this); \
+	__VA_ARGS__ \
+}; \
+extern TABLE(except_name) INSTANCE(except_name);
+
+// The first field of the exception structure should be created with this.
+#define VTABLE_FIELD(except_name) \
+struct TABLE(except_name) const * virtual_table
+
+// In each constructor the vtable must be initialized.
+#define VTABLE_INIT(this_name,except_name) \
+this_name.virtual_table = &INSTANCE(except_name)
+
+// Declare the vtable instance. This should end an exception declaration.
+// ... argument is the remaining vtable field values.
+#define VTABLE_INSTANCE(except_name,parent_name,copy,free,msg,...) \
+TABLE(except_name) INSTANCE(except_name) @= { \
+	&INSTANCE(parent_name), sizeof(except_name), \
+	copy, free, msg, ## __VA_ARGS__ \
+};
+
+// Same, but used declarators for arguments.
+#define VTABLE_INSTANCE_KEY(except_name,parent_name,copy,free,msg,...) \
+TABLE(except_name) INSTANCE(except_name) @= { \
+	.parent : &INSTANCE(parent_name), .size : sizeof(except_name), \
+	.copy : copy, .free : free, .msg : msg, ## __VA_ARGS__ \
+};
+
+
+
+// Declare a trivial exception, one that adds no features:
+#define TRIVIAL_EXCEPTION(name) \
+DECLARE_EXCEPT(name,BASE_EXCEPT,) \
+struct name { \
+	VTABLE_FIELD(name); \
+}; \
+const char * GLUE2(name,_msg)(name * this) { \
+    return #name; \
+} \
+void GLUE2(name,_copy)(name * this, name * other) { \
+    this->virtual_table = other->virtual_table; \
+} \
+void ?{}(name & this) { \
+	VTABLE_INIT(this,name); \
+} \
+VTABLE_INSTANCE(name,BASE_EXCEPT,GLUE2(name,_copy),^?{},GLUE2(name,_msg),)
Index: tests/exceptions/finally-error.cfa
===================================================================
--- tests/exceptions/finally-error.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
+++ tests/exceptions/finally-error.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -0,0 +1,156 @@
+// All of these should be caught as long as the check remains in the same
+// pass. (Although not even all of the checks are in place yet.)
+
+void break_in_finally() {
+	while (true) {
+		try {} finally {
+			break;
+		}
+	}
+}
+
+void for_break_in_finally() {
+	for (10) {
+		try {} finally {
+			break;
+		}
+	}
+}
+
+void do_while_break_in_finally() {
+	do {
+		try {} finally {
+			break;
+		}
+	} while (false);
+}
+
+void continue_in_finally() {
+	while (true) {
+		try {} finally {
+			continue;
+		}
+	}
+}
+
+void goto_in_finally() {
+	while (true) {
+		try {} finally {
+			goto end_of_function;
+		}
+	}
+	end_of_function: {}
+}
+
+void labelled_break_in_finally() {
+	mainLoop: while (true) {
+		try {} finally {
+			break mainLoop;
+		}
+	}
+}
+
+void labelled_continue_in_finally() {
+	mainLoop: while (true) {
+		try {} finally {
+			continue mainLoop;
+		}
+	}
+}
+
+void switch_break_in_finally() {
+	switch (1) {
+	case 1:
+		try {} finally {
+			break;
+		}
+	default:
+		break;
+	}
+}
+
+void choose_break_in_finally() {
+	choose (1) {
+	case 1:
+		try {} finally {
+			break;
+		}
+	default:
+		break;
+	}
+}
+
+void choose_fallthru_in_finally() {
+	choose (1) {
+	case 1:
+		try {} finally {
+			fallthru;
+		}
+	default:
+		break;
+	}
+}
+
+void labelled_choose_break_in_finally() {
+	mainBlock: choose (1) {
+	case 1:
+		try {} finally {
+			break mainBlock;
+		}
+	case 2:
+		break;
+	default:
+		break;
+	}
+}
+
+void labelled_choose_fallthru_in_finally() {
+	mainBlock: choose (1) {
+	case 1:
+		try {} finally {
+			fallthru mainBlock;
+		}
+	case 2:
+		break;
+	default:
+		break;
+	}
+}
+
+void choose_fallthru_default_in_finally() {
+	choose (1) {
+	case 1:
+		try {} finally {
+			fallthru default;
+		}
+	default:
+		break;
+	}
+}
+
+void void_return_in_finally() {
+	try {} finally {
+		return;
+	}
+}
+
+int value_return_in_finally() {
+	try {} finally {
+		return -7;
+	}
+
+}
+
+// Checked in the same place, make sure it does't break.
+void break_in_function() {
+	while (true) {
+		void inner() {
+			break;
+		}
+	}
+}
+
+void main() {
+	// Should not compile.
+	return 1;
+}
Index: tests/expression.cfa
===================================================================
--- tests/expression.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/expression.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -1,51 +1,85 @@
+struct S { int i; };
+void ?{}( S & s, int i ) { s.i = i; }
+int ?`mary( int );
+int ?`mary( S );
+[int] ?`mary( [int, int] );
+int & ?`jane( int & );
+int jack( int );
+
 int main() {
-    struct s { int i; } x, *p = &x;
-    int i = 3;
+    int a[3] = { 0, 0, 0 };
+    S s = { 3 }, * ps = &s;
+    [int] t = { 3 };
+    * [int] pt = &t;
+    int i = 1, j = 2;
 
     // operators
 
-    ! i;
+    !i;
     ~i;
     +i;
     -i;
-    *p;
-    ++p;
-    --p;
-    p++;
-    p--;
+    *ps;
+    ++ps;
+    --ps;
+    ps++;
+    ps--;
 
-    i+i;
-    i-i;
-    i*i;
+    i + j;
+    i - j;
+    i * j;
 
-    i/i;
-    i%i;
-    i^i;
-    i&i;
-    i|i;
-    i<i;
-    i>i;
-    i=i;
+    i / j;
+    i % j;
+    i ^ j;
+    i & j;
+    i | j;
+    i < j;
+    i > j;
+    i = j;
 
-    i==i;
-    i!=i;
-    i<<i;
-    i>>i;
-    i<=i;
-    i>=i;
-    i&&i;
-    i||i;
-    p->i;
-    i*=i;
-    i/=i;
-    i%=i;
-    i+=i;
-    i-=i;
-    i&=i;
-    i|=i;
-    i^=i;
-    i<<=i;
-    i>>=i;
+    i == j;
+    i != j;
+    i << j;
+    i >> j;
+    i <= j;
+    i >= j;
+    i && j;
+    i || j;
+    ps->i;
 
-    i?i:i;
+    i *= j;
+    i /= j;
+    i %= j;
+    i += j;
+    i -= j;
+    i &= j;
+    i |= j;
+    i ^= j;
+    i <<= j;
+    i >>= j;
+
+    i ? i : j;
+
+    // postfix function call
+
+    (3 + 4)`mary;
+    ({3 + 4;})`mary;
+    [3, 4]`mary;
+    3`mary;
+    a[0]`mary;
+    a[0]`mary`mary;
+    s{0}`mary;
+    a[3]`jane++;
+    jack(3)`mary;
+    s.i`mary;
+    t.0`mary;
+    s.[i]`mary;
+    ps->i`mary;
+    pt->0`mary;
+    ps->[i]`mary;
+    i++`mary;
+    i--`mary;
+    (S){2}`mary;
+    (S)@{2}`mary;
 } // main
Index: tests/heap.cfa
===================================================================
--- tests/heap.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/heap.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Tue Nov  6 17:54:56 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 19 08:22:34 2019
-// Update Count     : 19
+// Last Modified On : Sun Nov 24 12:34:51 2019
+// Update Count     : 28
 // 
 
@@ -38,5 +38,6 @@
 	enum { NoOfAllocs = 5000, NoOfMmaps = 10 };
 	char * locns[NoOfAllocs];
-	int i;
+	size_t amount;
+	enum { limit = 64 * 1024 };							// check alignments up to here
 
 	// check alloc/free
@@ -74,5 +75,5 @@
 		size_t s = (i + 1) * 20;
 		char * area = (char *)malloc( s );
-		if ( area == 0 ) abort( "malloc/free out of memory" );
+		if ( area == 0p ) abort( "malloc/free out of memory" );
 		area[0] = '\345'; area[s - 1] = '\345';			// fill first/last
 		area[malloc_usable_size( area ) - 1] = '\345';	// fill ultimate byte
@@ -83,5 +84,5 @@
 		size_t s = i + 1;								// +1 to make initialization simpler
 		locns[i] = (char *)malloc( s );
-		if ( locns[i] == 0 ) abort( "malloc/free out of memory" );
+		if ( locns[i] == 0p ) abort( "malloc/free out of memory" );
 		locns[i][0] = '\345'; locns[i][s - 1] = '\345';	// fill first/last
 		locns[i][malloc_usable_size( locns[i] ) - 1] = '\345'; // fill ultimate byte
@@ -99,5 +100,5 @@
 		size_t s = i + default_mmap_start();			// cross over point
 		char * area = (char *)malloc( s );
-		if ( area == 0 ) abort( "malloc/free out of memory" );
+		if ( area == 0p ) abort( "malloc/free out of memory" );
 		area[0] = '\345'; area[s - 1] = '\345';			// fill first/last
 		area[malloc_usable_size( area ) - 1] = '\345';	// fill ultimate byte
@@ -108,5 +109,5 @@
 		size_t s = i + default_mmap_start();			// cross over point
 		locns[i] = (char *)malloc( s );
-		if ( locns[i] == 0 ) abort( "malloc/free out of memory" );
+		if ( locns[i] == 0p ) abort( "malloc/free out of memory" );
 		locns[i][0] = '\345'; locns[i][s - 1] = '\345';	// fill first/last
 		locns[i][malloc_usable_size( locns[i] ) - 1] = '\345'; // fill ultimate byte
@@ -124,5 +125,5 @@
 		size_t s = (i + 1) * 20;
 		char * area = (char *)calloc( 5, s );
-		if ( area == 0 ) abort( "calloc/free out of memory" );
+		if ( area == 0p ) abort( "calloc/free out of memory" );
 		if ( area[0] != '\0' || area[s - 1] != '\0' ||
 			 area[malloc_usable_size( area ) - 1] != '\0' ||
@@ -136,5 +137,5 @@
 		size_t s = i + 1;
 		locns[i] = (char *)calloc( 5, s );
-		if ( locns[i] == 0 ) abort( "calloc/free out of memory" );
+		if ( locns[i] == 0p ) abort( "calloc/free out of memory" );
 		if ( locns[i][0] != '\0' || locns[i][s - 1] != '\0' ||
 			 locns[i][malloc_usable_size( locns[i] ) - 1] != '\0' ||
@@ -155,5 +156,5 @@
 		size_t s = i + default_mmap_start();			// cross over point
 		char * area = (char *)calloc( 1, s );
-		if ( area == 0 ) abort( "calloc/free out of memory" );
+		if ( area == 0p ) abort( "calloc/free out of memory" );
 		if ( area[0] != '\0' || area[s - 1] != '\0' ) abort( "calloc/free corrupt storage4.1" );
 		if ( area[malloc_usable_size( area ) - 1] != '\0' ) abort( "calloc/free corrupt storage4.2" );
@@ -167,5 +168,5 @@
 		size_t s = i + default_mmap_start();			// cross over point
 		locns[i] = (char *)calloc( 1, s );
-		if ( locns[i] == 0 ) abort( "calloc/free out of memory" );
+		if ( locns[i] == 0p ) abort( "calloc/free out of memory" );
 		if ( locns[i][0] != '\0' || locns[i][s - 1] != '\0' ||
 			 locns[i][malloc_usable_size( locns[i] ) - 1] != '\0' ||
@@ -183,16 +184,14 @@
 	// check memalign/free (sbrk)
 
-	enum { limit = 64 * 1024 };							// check alignments up to here
-
 	for ( a; libAlign() ~= limit ~ a ) {				// generate powers of 2
 		//sout | alignments[a];
 		for ( s; 1 ~ NoOfAllocs ) {						// allocation of size 0 can return null
 			char * area = (char *)memalign( a, s );
-			if ( area == 0 ) abort( "memalign/free out of memory" );
-			//sout | i | " " | area;
+			if ( area == 0p ) abort( "memalign/free out of memory" );
+			//sout | i | area;
 			if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
 				abort( "memalign/free bad alignment : memalign(%d,%d) = %p", (int)a, s, area );
 			} // if
-			area[0] = '\345'; area[s - 1] = '\345';	// fill first/last byte
+			area[0] = '\345'; area[s - 1] = '\345';		// fill first/last byte
 			area[malloc_usable_size( area ) - 1] = '\345'; // fill ultimate byte
 			free( area );
@@ -207,6 +206,6 @@
 			size_t s = i + default_mmap_start();		// cross over point
 			char * area = (char *)memalign( a, s );
-			if ( area == 0 ) abort( "memalign/free out of memory" );
-			//sout | i | " " | area;
+			if ( area == 0p ) abort( "memalign/free out of memory" );
+			//sout | i | area;
 			if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
 				abort( "memalign/free bad alignment : memalign(%d,%d) = %p", (int)a, (int)s, area );
@@ -223,5 +222,5 @@
 		// initial N byte allocation
 		char * area = (char *)calloc( 5, i );
-		if ( area == 0 ) abort( "calloc/realloc/free out of memory" );
+		if ( area == 0p ) abort( "calloc/realloc/free out of memory" );
 		if ( area[0] != '\0' || area[i - 1] != '\0' ||
 			 area[malloc_usable_size( area ) - 1] != '\0' ||
@@ -231,5 +230,5 @@
 		for ( s; i ~ 256 * 1024 ~ 26 ) {				// start at initial memory request
 			area = (char *)realloc( area, s );			// attempt to reuse storage
-			if ( area == 0 ) abort( "calloc/realloc/free out of memory" );
+			if ( area == 0p ) abort( "calloc/realloc/free out of memory" );
 			if ( area[0] != '\0' || area[s - 1] != '\0' ||
 				 area[malloc_usable_size( area ) - 1] != '\0' ||
@@ -245,5 +244,5 @@
 		size_t s = i + default_mmap_start();			// cross over point
 		char * area = (char *)calloc( 1, s );
-		if ( area == 0 ) abort( "calloc/realloc/free out of memory" );
+		if ( area == 0p ) abort( "calloc/realloc/free out of memory" );
 		if ( area[0] != '\0' || area[s - 1] != '\0' ||
 			 area[malloc_usable_size( area ) - 1] != '\0' ||
@@ -253,5 +252,5 @@
 		for ( r; i ~ 256 * 1024 ~ 26 ) {				// start at initial memory request
 			area = (char *)realloc( area, r );			// attempt to reuse storage
-			if ( area == 0 ) abort( "calloc/realloc/free out of memory" );
+			if ( area == 0p ) abort( "calloc/realloc/free out of memory" );
 			if ( area[0] != '\0' || area[r - 1] != '\0' ||
 				 area[malloc_usable_size( area ) - 1] != '\0' ||
@@ -263,10 +262,10 @@
 	// check memalign/realloc/free
 
-	size_t amount = 2;
+	amount = 2;
 	for ( a; libAlign() ~= limit ~ a ) {				// generate powers of 2
 		// initial N byte allocation
 		char * area = (char *)memalign( a, amount );	// aligned N-byte allocation
-		if ( area == 0 ) abort( "memalign/realloc/free out of memory" ); // no storage ?
-		//sout | alignments[a] | " " | area;
+		if ( area == 0p ) abort( "memalign/realloc/free out of memory" ); // no storage ?
+		//sout | alignments[a] | area;
 		if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
 			abort( "memalign/realloc/free bad alignment : memalign(%d,%d) = %p", (int)a, (int)amount, area );
@@ -278,6 +277,6 @@
 			if ( area[0] != '\345' || area[s - 2] != '\345' ) abort( "memalign/realloc/free corrupt storage" );
 			area = (char *)realloc( area, s );			// attempt to reuse storage
-			if ( area == 0 ) abort( "memalign/realloc/free out of memory" ); // no storage ?
-			//sout | i | " " | area;
+			if ( area == 0p ) abort( "memalign/realloc/free out of memory" ); // no storage ?
+			//sout | i | area;
 			if ( (size_t)area % a != 0 ) {				// check for initial alignment
 				abort( "memalign/realloc/free bad alignment %p", area );
@@ -294,6 +293,6 @@
 		for ( s; 1 ~ limit ) {							// allocation of size 0 can return null
 			char * area = (char *)cmemalign( a, 1, s );
-			if ( area == 0 ) abort( "cmemalign/free out of memory" );
-			//sout | i | " " | area;
+			if ( area == 0p ) abort( "cmemalign/free out of memory" );
+			//sout | i | area;
 			if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
 				abort( "cmemalign/free bad alignment : cmemalign(%d,%d) = %p", (int)a, s, area );
@@ -313,6 +312,6 @@
 		// initial N byte allocation
 		char * area = (char *)cmemalign( a, 1, amount ); // aligned N-byte allocation
-		if ( area == 0 ) abort( "cmemalign/realloc/free out of memory" ); // no storage ?
-		//sout | alignments[a] | " " | area;
+		if ( area == 0p ) abort( "cmemalign/realloc/free out of memory" ); // no storage ?
+		//sout | alignments[a] | area;
 		if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
 			abort( "cmemalign/realloc/free bad alignment : cmemalign(%d,%d) = %p", (int)a, (int)amount, area );
@@ -327,6 +326,6 @@
 			if ( area[0] != '\345' || area[s - 2] != '\345' ) abort( "cmemalign/realloc/free corrupt storage2" );
 			area = (char *)realloc( area, s );			// attempt to reuse storage
-			if ( area == 0 ) abort( "cmemalign/realloc/free out of memory" ); // no storage ?
-			//sout | i | " " | area;
+			if ( area == 0p ) abort( "cmemalign/realloc/free out of memory" ); // no storage ?
+			//sout | i | area;
 			if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
 				abort( "cmemalign/realloc/free bad alignment %p", area );
@@ -339,4 +338,65 @@
 		free( area );
 	} // for
+
+	// check memalign/realloc with align/free
+
+	amount = 2;
+	for ( a; libAlign() ~= limit ~ a ) {				// generate powers of 2
+		// initial N byte allocation
+		char * area = (char *)memalign( a, amount );	// aligned N-byte allocation
+		if ( area == 0p ) abort( "memalign/realloc with align/free out of memory" ); // no storage ?
+		//sout | alignments[a] | area | endl;
+		if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
+			abort( "memalign/realloc with align/free bad alignment : memalign(%d,%d) = %p", (int)a, (int)amount, area );
+		} // if
+		area[0] = '\345'; area[amount - 2] = '\345';	// fill first/penultimate byte
+
+		// Do not start this loop index at 0 because realloc of 0 bytes frees the storage.
+		for ( s; amount ~ 256 * 1024 ) {				// start at initial memory request
+			if ( area[0] != '\345' || area[s - 2] != '\345' ) abort( "memalign/realloc/free corrupt storage" );
+			area = (char *)realloc( area, a * 2, s );	// attempt to reuse storage
+			if ( area == 0p ) abort( "memalign/realloc with align/free out of memory" ); // no storage ?
+			//sout | i | area | endl;
+			if ( (size_t)area % a * 2 != 0 ) {			// check for initial alignment
+				abort( "memalign/realloc with align/free bad alignment %p", area );
+			} // if
+			area[s - 1] = '\345';						// fill last byte
+		} // for
+		free( area );
+	} // for
+
+	// check cmemalign/realloc with align/free
+
+	amount = 2;
+	for ( size_t a = libAlign() + libAlign(); a <= limit; a += a ) { // generate powers of 2
+		// initial N byte allocation
+		char *area = (char *)cmemalign( a, 1, amount );	// aligned N-byte allocation
+		if ( area == 0p ) abort( "cmemalign/realloc with align/free out of memory" ); // no storage ?
+		//sout | alignments[a] | area | endl;
+		if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
+			abort( "cmemalign/realloc with align/free bad alignment : cmemalign(%d,%d) = %p", (int)a, (int)amount, area );
+		} // if
+		if ( area[0] != '\0' || area[amount - 1] != '\0' ||
+			 area[malloc_usable_size( area ) - 1] != '\0' ||
+			 ! malloc_zero_fill( area ) ) abort( "cmemalign/realloc with align/free corrupt storage1" );
+		area[0] = '\345'; area[amount - 2] = '\345';	// fill first/penultimate byte
+
+		// Do not start this loop index at 0 because realloc of 0 bytes frees the storage.
+		for ( int s = amount; s < 256 * 1024; s += 1 ) { // start at initial memory request
+			if ( area[0] != '\345' || area[s - 2] != '\345' ) abort( "cmemalign/realloc with align/free corrupt storage2" );
+			area = (char *)realloc( area, a * 2, s );	// attempt to reuse storage
+			if ( area == 0p ) abort( "cmemalign/realloc with align/free out of memory" ); // no storage ?
+			//sout | i | area | endl;
+			if ( (size_t)area % a * 2 != 0 || malloc_alignment( area ) != a * 2 ) { // check for initial alignment
+				abort( "cmemalign/realloc with align/free bad alignment %p %jd %jd", area, malloc_alignment( area ), a * 2 );
+			} // if
+			if ( area[s - 1] != '\0' || area[s - 1] != '\0' ||
+				 area[malloc_usable_size( area ) - 1] != '\0' ||
+				 ! malloc_zero_fill( area ) ) abort( "cmemalign/realloc/free corrupt storage3" );
+			area[s - 1] = '\345';						// fill last byte
+		} // for
+		free( area );
+	} // for
+
 	//sout | "worker" | thisTask() | "successful completion";
 } // Worker main
Index: tests/labelledExit.cfa
===================================================================
--- tests/labelledExit.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/labelledExit.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Wed Aug 10 07:29:39 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Oct 25 17:41:51 2019
-// Update Count     : 7
+// Last Modified On : Wed Feb  5 16:49:48 2020
+// Update Count     : 9
 // 
 
@@ -162,11 +162,11 @@
 
 	// computed goto
-	// {
-	// 	void *array[] = { &&foo, &&bar, &&hack };
-	//   foo: bar: hack:
-	// 	&&foo;
-	// 	&&bar;
-	// 	goto *array[i];
-	// }
+	{
+		void *array[] = { &&foo, &&bar, &&hack };
+	  foo: bar: hack:
+		&&foo;
+		&&bar;
+		goto *array[i];
+	}
 
   Q: if ( i > 5 ) {
Index: tests/linking/withthreads.cfa
===================================================================
--- tests/linking/withthreads.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/linking/withthreads.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -34,4 +34,4 @@
 // Local Variables: //
 // tab-width: 4 //
-// compile-command: "cfa nothreads.cfa" //
+// compile-command: "cfa withthreads.cfa" //
 // End: //
Index: tests/loopctrl.cfa
===================================================================
--- tests/loopctrl.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/loopctrl.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Wed Aug  8 18:32:59 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 12 12:05:05 2019
-// Update Count     : 106
+// Last Modified On : Thu Dec 12 17:55:26 2019
+// Update Count     : 108
 // 
 
@@ -43,4 +43,5 @@
 	for ( 1 ) { sout | "A"; }							sout | nl;
 	for ( 10 ) { sout | "A"; }							sout | nl;
+	for ( = 10 ) { sout | "A"; }						sout | nl;
 	for ( 1 ~= 10 ~ 2 ) { sout | "B"; }					sout | nl;
 	for ( 10 -~= 1 ~ 2 ) { sout | "C"; }				sout | nl;
@@ -49,4 +50,5 @@
 
 	for ( i; 10 ) { sout | i; }							sout | nl;
+	for ( i; = 10 ) { sout | i; }						sout | nl;
 	for ( i; 1 ~= 10 ~ 2 ) { sout | i; }				sout | nl;
 	for ( i; 10 -~= 1 ~ 2 ) { sout | i; }				sout | nl;
@@ -87,4 +89,5 @@
 	for ( N ) { sout | "N"; }							sout | nl;
 	for ( i; N ) { sout | i; }							sout | nl;
+	for ( i; = N ) { sout | i; }						sout | nl;
 	for ( i; N -~ 0 ) { sout | i; }						sout | nl | nl;
 
Index: tests/pybin/tools.py
===================================================================
--- tests/pybin/tools.py	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/pybin/tools.py	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -175,15 +175,14 @@
 
 def which(program):
-    fpath, fname = os.path.split(program)
-    if fpath:
-        if is_exe(program):
-            return program
-    else:
-        for path in os.environ["PATH"].split(os.pathsep):
-            exe_file = os.path.join(path, program)
-            if is_exe(exe_file):
-                return exe_file
-
-    return None
+	fpath, fname = os.path.split(program)
+	if fpath:
+		if is_exe(program):
+			return program
+	else:
+		for path in os.environ["PATH"].split(os.pathsep):
+			exe_file = os.path.join(path, program)
+			if is_exe(exe_file):
+				return exe_file
+	return None
 
 @contextlib.contextmanager
@@ -365,15 +364,16 @@
 
 class Timed:
-    def __enter__(self):
-        self.start = time.time()
-        return self
-
-    def __exit__(self, *args):
-        self.end = time.time()
-        self.duration = self.end - self.start
+	def __enter__(self):
+		self.start = time.time()
+		return self
+
+	def __exit__(self, *args):
+		self.end = time.time()
+		self.duration = self.end - self.start
 
 def timed(src, timeout):
 	expire = time.time() + timeout
 	i = iter(src)
-	while True:
-		yield i.next(max(expire - time.time(), 0))
+	with contextlib.suppress(StopIteration):
+		while True:
+			yield i.next(max(expire - time.time(), 0))
Index: tests/quotedKeyword.cfa
===================================================================
--- tests/quotedKeyword.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/quotedKeyword.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Dec  4 21:45:53 2018
-// Update Count     : 23
+// Last Modified On : Fri Feb  7 19:07:07 2020
+// Update Count     : 25
 //
 
@@ -17,29 +17,29 @@
 
 struct {
-	int `otype`;
-	int `struct`;
+	int ``otype;
+	int ``struct;
 } st = { 10, 10 };
 
-typedef int `forall`;
-`forall` xxx = 10;
+typedef int ``forall;
+``forall xxx = 10;
 
-int `_Alignas`, `_Alignof`, `__alignof`, `__alignof__`, `asm`, `__asm`, `__asm__`, `_At`, `_Atomic`, `__attribute`,
-	`__attribute__`, `auto`, `_Bool`, `break`, `case`, `catch`, `catchResume`, `char`, `choose`, `_Complex`, `__complex`,
-	`__complex__`, `const`, `__const`, `__const__`, `continue`, `default`, `disable`, `do`, `double`, `dtype`, `else`,
-	`enable`, `enum`, `__extension__`, `extern`, `fallthru`, `finally`, `float`, `__float128`, `for`, `forall`, `fortran`,
-	`ftype`, `_Generic`, `goto`, `if`, `_Imaginary`, `__imag`, `__imag__`, `inline`, `__inline`, `__inline__`, `int`,
-	`__int128`, `__label__`, `long`, `lvalue`, `_Noreturn`, `__builtin_offsetof`, `otype`, `register`, `restrict`,
-	`__restrict`, `__restrict__`, `return`, `short`, `signed`, `__signed`, `__signed__`, `sizeof`, `static`,
-	`_Static_assert`, `struct`, `switch`, `_Thread_local`, `throw`, `throwResume`, `trait`, `try`, `typedef`,
-	`typeof`, `__typeof`, `__typeof__`, `union`, `unsigned`, `__builtin_va_list`, `void`, `volatile`, `__volatile`,
-	`__volatile__`, `while`;
+int ``_Alignas, ``_Alignof, ``__alignof, ``__alignof__, ``asm, ``__asm, ``__asm__, ``_At, ``_Atomic, ``__attribute,
+	``__attribute__, ``auto, ``_Bool, ``break, ``case, ``catch, ``catchResume, ``char, ``choose, ``_Complex, ``__complex,
+	``__complex__, ``const, ``__const, ``__const__, ``continue, ``default, ``disable, ``do, ``double, ``dtype, ``else,
+	``enable, ``enum, ``__extension__, ``extern, ``fallthru, ``finally, ``float, ``__float128, ``for, ``forall, ``fortran,
+	``ftype, ``_Generic, ``goto, ``if, ``_Imaginary, ``__imag, ``__imag__, ``inline, ``__inline, ``__inline__, ``int,
+	``__int128, ``__label__, ``long, ``lvalue, ``_Noreturn, ``__builtin_offsetof, ``otype, ``register, ``restrict,
+	``__restrict, ``__restrict__, ``return, ``short, ``signed, ``__signed, ``__signed__, ``sizeof, ``static,
+	``_Static_assert, ``struct, ``switch, ``_Thread_local, ``throw, ``throwResume, ``trait, ``try, ``typedef,
+	``typeof, ``__typeof, ``__typeof__, ``union, ``unsigned, ``__builtin_va_list, ``void, ``volatile, ``__volatile,
+	``__volatile__, ``while;
 
 int main() {
-	int `if` = 0;
-	`catch` = 1;
-	st.`otype` = 2;
-	st.`struct` = 3;
-	`throw` = 4;
-	sout | `catch` + st.`otype` + st.`struct` + `throw`;
+	int ``if = 0;
+	``catch = 1;
+	st.``otype = 2;
+	st.``struct = 3;
+	``throw = 4;
+	sout | ``catch + st.``otype + st.``struct + ``throw;
 }
 
Index: tests/raii/dtor-early-exit.cfa
===================================================================
--- tests/raii/dtor-early-exit.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/raii/dtor-early-exit.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -217,4 +217,12 @@
 }
 
+void i() {
+	// potential loop
+	for() {
+		if(true) continue;
+		int t = 0;
+	}
+}
+
 // TODO: implement __label__ and uncomment these lines
 void computedGoto() {
Index: tests/rational.cfa
===================================================================
--- tests/rational.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/rational.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Mon Mar 28 08:43:12 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Mar 27 07:37:17 2019
-// Update Count     : 80
+// Last Modified On : Sat Feb  8 18:46:23 2020
+// Update Count     : 86
 //
 
@@ -19,25 +19,26 @@
 #include <fstream.hfa>
 
-double convert( int i ) { return (double)i; }
+typedef Rational(int) RatInt;
+double convert( int i ) { return (double)i; }			// used by narrow/widen
 int convert( double d ) { return (int)d; }
 
 int main() {
 	sout | "constructor";
-	Rational(int) a = { 3 }, b = { 4 }, c;
-	sout | a | b | c;
+	RatInt a = { 3 }, b = { 4 }, c, d = 0, e = 1;
+	sout | a | b | c | d | e;
 
-	a = (Rational(int)){ 4, 8 };
-	b = (Rational(int)){ 5, 7 };
+	a = (RatInt){ 4, 8 };
+	b = (RatInt){ 5, 7 };
 	sout | a | b;
-	a = (Rational(int)){ -2, -3 };
-	b = (Rational(int)){ 3, -2 };
+	a = (RatInt){ -2, -3 };
+	b = (RatInt){ 3, -2 };
 	sout | a | b;
-	a = (Rational(int)){ -2, 3 };
-	b = (Rational(int)){ 3, 2 };
+	a = (RatInt){ -2, 3 };
+	b = (RatInt){ 3, 2 };
 	sout | a | b;
 
 	sout | "logical";
-	a = (Rational(int)){ -2 };
-	b = (Rational(int)){ -3, 2 };
+	a = (RatInt){ -2 };
+	b = (RatInt){ -3, 2 };
 	sout | a | b;
 //	sout | a == 1; // FIX ME
@@ -58,9 +59,9 @@
 
 	sout | "conversion";
-	a = (Rational(int)){ 3, 4 };
+	a = (RatInt){ 3, 4 };
 	sout | widen( a );
-	a = (Rational(int)){ 1, 7 };
+	a = (RatInt){ 1, 7 };
 	sout | widen( a );
-	a = (Rational(int)){ 355, 113 };
+	a = (RatInt){ 355, 113 };
 	sout | widen( a );
 	sout | narrow( 0.75, 4 );
@@ -74,5 +75,5 @@
 
 	sout | "more tests";
-	Rational(int) x = { 1, 2 }, y = { 2 };
+	RatInt x = { 1, 2 }, y = { 2 };
 	sout | x - y;
 	sout | x > y;
@@ -80,12 +81,12 @@
 	sout | y | denominator( y, -2 ) | y;
 
-	Rational(int) z = { 0, 5 };
+	RatInt z = { 0, 5 };
 	sout | z;
 
 	sout | x | numerator( x, 0 ) | x;
 
-	x = (Rational(int)){ 1, MAX } + (Rational(int)){ 1, MAX };
+	x = (RatInt){ 1, MAX } + (RatInt){ 1, MAX };
 	sout | x;
-	x = (Rational(int)){ 3, MAX } + (Rational(int)){ 2, MAX };
+	x = (RatInt){ 3, MAX } + (RatInt){ 2, MAX };
 	sout | x;
 
Index: tests/references.cfa
===================================================================
--- tests/references.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/references.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -119,4 +119,14 @@
 		f( 3, a + b, (S){ 1.0, 7.0 }, (int [3]){ 1, 2, 3 } ); // two rvalue to reference
 	}
+
+	{
+		int a = 3;
+		int *p = &a;
+		asm (
+			"incl %[p]\n\t"
+			: [p] "+m" (*p)
+		);
+		printf("%d\n", a);
+	}
 }
 
Index: tests/test.py
===================================================================
--- tests/test.py	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/test.py	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,4 +10,8 @@
 import tempfile
 import time
+
+import os
+import psutil
+import signal
 
 ################################################################################
@@ -221,8 +225,20 @@
 	make('clean', output_file=subprocess.DEVNULL, error=subprocess.DEVNULL)
 
+	# since python prints stacks by default on a interrupt, redo the interrupt handling to be silent
+	def worker_init():
+		def sig_int(signal_num, frame):
+			pass
+
+		signal.signal(signal.SIGINT, sig_int)
+
 	# create the executor for our jobs and handle the signal properly
-	pool = multiprocessing.Pool(jobs)
+	pool = multiprocessing.Pool(jobs, worker_init)
 
 	failed = False
+
+	def stop(x, y):
+		print("Tests interrupted by user", file=sys.stderr)
+		sys.exit(1)
+	signal.signal(signal.SIGINT, stop)
 
 	# for each test to run
Index: tests/time.cfa
===================================================================
--- tests/time.cfa	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tests/time.cfa	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -10,6 +10,6 @@
 // Created On       : Tue Mar 27 17:24:56 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Dec 20 23:09:21 2018
-// Update Count     : 23
+// Last Modified On : Sun Jan  5 18:27:37 2020
+// Update Count     : 34
 //
 
@@ -20,5 +20,4 @@
 	Duration d1 = 3`h, d2 = 2`s, d3 = 3.375`s, d4 = 12`s, d5 = 1`s + 10_000`ns;
 	sout | d1 | d2 | d3 | d4 | d5;
-	int i;
 	d1 = 0;
 	sout | d1 | d2 | d3;
@@ -35,9 +34,9 @@
 	sout | t;
 	t = t + d1;
-	sout | t | t.tv;
+	sout | t | t`ns;
 	Time t1 = (timespec){ 104_414, 10_000_000 };
-	sout | t1 | t1.tv;
-	sout | t - t  | t + d5 | t.tv;
-	char buf[16];
+	sout | t1 | t1`ns;
+	sout | t - t  | t + d5 | t`ns;
+	char buf[64];
 	sout | "yy/mm/dd" | [t, buf]`ymd | nonl;			// shared buf => separate calls
 	sout | "mm/dd/yy" | mm_dd_yy( t, buf ) | nonl;
@@ -46,5 +45,5 @@
 	sout | "dd/yy/mm" | [t, buf]`dmy;
 	Time t2 = { 2001, 7, 4, 0, 0, 1, 0 }, t3 = (timeval){ 994_219_201 };
-	sout | t2 | t2.tv | nl | t3 | t3.tv;
+	sout | t2 | t2`ns | nl | t3 | t3`ns;
 	sout | nl;
 
@@ -63,4 +62,14 @@
 	sout | "Dividing that by 2 gives" | s / 2 | "seconds";
 	sout | s | "seconds is" | s`h | "hours," | (s % 1`h)`m | "minutes," | (s % 1`m)`s | "seconds";
+
+    t1 = (Time){ 2020, 1, 5, 9, 0, 0, 100000000000LL };
+    t2 = (Time){ 1969, 13, 5, 9 };
+    t3 = (Time){ 1970, 25, 366, 48, 120, -120, 60000000000LL };
+    strftime( buf, 128, "%Y %b %e %H:%M:%S (GMT)", t1 );
+    sout | buf;
+    strftime( buf, 128, "%Y %b %e %H:%M:%S (GMT)", t2 );
+    sout | buf;
+    strftime( buf, 128, "%Y %b %e %H:%M:%S (GMT)", t3 );
+    sout | buf;
 } // main
 
Index: tools/catchsig.c
===================================================================
--- tools/catchsig.c	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tools/catchsig.c	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -21,20 +21,20 @@
 	printf("Starting...\n");
 	sig(SIGHUP);
-      sig(SIGINT);
-      sig(SIGQUIT);
-      sig(SIGILL);
-      sig(SIGABRT);
-      sig(SIGFPE);
-      sig(SIGSEGV);
-      sig(SIGPIPE);
-      sig(SIGALRM);
-      sig(SIGTERM);
-      sig(SIGUSR1);
-      sig(SIGUSR2);
-      sig(SIGCHLD);
-      sig(SIGCONT);
-      sig(SIGTSTP);
-      sig(SIGTTIN);
-      sig(SIGTTOU);
+	sig(SIGINT);
+	sig(SIGQUIT);
+	sig(SIGILL);
+	sig(SIGABRT);
+	sig(SIGFPE);
+	sig(SIGSEGV);
+	sig(SIGPIPE);
+	sig(SIGALRM);
+	sig(SIGTERM);
+	sig(SIGUSR1);
+	sig(SIGUSR2);
+	sig(SIGCHLD);
+	sig(SIGCONT);
+	sig(SIGTSTP);
+	sig(SIGTTIN);
+	sig(SIGTTOU);
 	while(1);
 	return 0;
Index: tools/stat.py
===================================================================
--- tools/stat.py	(revision 807a6324f57ec9263b2b6dbf5cea62960a4a85ac)
+++ tools/stat.py	(revision 3b56166e2d00085e18256c8d9253b11989107908)
@@ -17,5 +17,5 @@
 		avg = numpy.mean  (content)
 		std = numpy.std   (content)
-		print "median {0:.1f} avg {1:.1f} stddev {2:.2f}".format( med, avg, std )
+		print "median {0:.1f} avg {1:.1f} stddev {2:.1f}".format( med, avg, std )
 
 
