Index: .gitignore
===================================================================
--- .gitignore	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ .gitignore	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,4 +10,5 @@
 config.py
 stamp-h1
+libtool
 /Makefile
 **/Makefile
@@ -49,5 +50,4 @@
 libcfa/arm-nolib/
 
-
 # generated by bison and lex from parser.yy and lex.ll
 src/Parser/parser.output
Index: Makefile.am
===================================================================
--- Makefile.am	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ Makefile.am	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -11,6 +11,6 @@
 ## Created On       : Sun May 31 22:14:18 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Wed Dec 14 14:20:48 2016
-## Update Count     : 15
+## Last Modified On : Sat Feb  2 16:54:42 2019
+## Update Count     : 21
 ###############################################################################
 
@@ -18,6 +18,5 @@
 ACLOCAL_AMFLAGS  = -I automake
 
-MAINTAINERCLEANFILES = lib/* bin/* tests/.deps/* tests/.out/*
- # order important
+MAINTAINERCLEANFILES = lib/* bin/* tests/.deps/* tests/.out/* # order important
 
 SUBDIRS = driver src . @LIBCFA_TARGET_DIRS@
Index: Makefile.in
===================================================================
--- Makefile.in	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ Makefile.in	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -250,5 +250,4 @@
 distcleancheck_listfiles = find . -type f -print
 ACLOCAL = @ACLOCAL@
-ALLOCA = @ALLOCA@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -396,5 +395,5 @@
 AUTOMAKE_OPTIONS = foreign    # do not require all the GNU file names
 ACLOCAL_AMFLAGS = -I automake
-MAINTAINERCLEANFILES = lib/* bin/* tests/.deps/* tests/.out/*
+MAINTAINERCLEANFILES = lib/* bin/* tests/.deps/* tests/.out/* # order important
 SUBDIRS = driver src . @LIBCFA_TARGET_DIRS@
 noinst_DATA = @LIBCFA_TARGET_MAKEFILES@
@@ -928,5 +927,4 @@
 .PRECIOUS: Makefile
 
- # order important
 
 @LIBCFA_TARGET_MAKEFILES@ : Makefile $(srcdir)/libcfa/configure
Index: automake/cfa.m4
===================================================================
--- automake/cfa.m4	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ automake/cfa.m4	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -80,2 +80,19 @@
 	esac
 ])
+
+# http://git.savannah.gnu.org/gitweb/?p=autoconf-archive.git;a=blob_plain;f=m4/ax_check_compile_flag.m4
+AC_DEFUN([M4CFA_CHECK_COMPILE_FLAG],
+[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
+AS_VAR_PUSHDEF([CACHEVAR],[m4cfa_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
+AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
+	m4cfa_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
+	_AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
+	AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
+		[AS_VAR_SET(CACHEVAR,[yes])],
+		[AS_VAR_SET(CACHEVAR,[no])])
+	_AC_LANG_PREFIX[]FLAGS=$m4cfa_check_save_flags])
+AS_VAR_IF(CACHEVAR,yes,
+	[m4_default([$2], :)],
+	[m4_default([$3], :)])
+AS_VAR_POPDEF([CACHEVAR])dnl
+])dnl M4CFA_CHECK_COMPILE_FLAGS
Index: benchmark/Makefile.am
===================================================================
--- benchmark/Makefile.am	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ benchmark/Makefile.am	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -21,13 +21,34 @@
 include $(top_srcdir)/src/cfa.make
 
-UPPCC = u++
-
 AM_CFLAGS = -O2 -Wall -I$(srcdir) -lrt -pthread
 AM_CFAFLAGS = -quiet -in-tree -nodebug
 AM_UPPFLAGS = -quiet -nodebug -multi
 
-TOOLSDIR = ${abs_top_srcdir}/tools/
-REPEAT   = ${TOOLSDIR}repeat
-STATS    = ${TOOLSDIR}stat.py
+BENCH_V_CC = $(__bench_v_CC_$(__quiet))
+BENCH_V_CFA = $(__bench_v_CFA_$(__quiet))
+BENCH_V_CXX = $(__bench_v_CXX_$(__quiet))
+BENCH_V_GOC = $(__bench_v_GOC_$(__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_GOC_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_GOC_verbose = $(AM_V_GOC)
+__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
 repeats  = 30
 skipcompile = no
@@ -35,10 +56,15 @@
 PRINT_FORMAT = %20s: #Comments needed for spacing
 
-#prevent any tests in parallel
+# Dummy hack tricks
+EXTRA_PROGRAMS = dummy # build but do not install
+dummy_SOURCES = dummyC.c dummyCXX.cpp
+
+dummyC.c:
+	@echo "int main() { return 0; }" > ${@}
+
+dummyCXX.cpp:
+	@echo "int main() { return 0; }" > ${@}
+
 .NOTPARALLEL:
-
-#make sure automake includes the compile rules for C and C++
-EXTRA_PROGRAMS = dummy
-dummy_SOURCES = c.c cxx.cpp
 
 ## =========================================================================================================
@@ -55,5 +81,5 @@
 
 %.runquiet :
-	@+make $(basename $@) CFLAGS="-w"
+	@+make $(basename $@) CFLAGS="-w" __quiet=quiet
 	@taskset -c 1 ./a.out
 	@rm -f a.out
@@ -64,5 +90,5 @@
 
 ${REPEAT} :
-	@+make -C ${TOOLSDIR} repeat
+	@+make -C ${abs_top_builddir}/tools repeat
 
 ## =========================================================================================================
@@ -105,11 +131,11 @@
 ## =========================================================================================================
 loop$(EXEEXT):
-	$(AM_V_CC)$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/loop.c
+	$(BENCH_V_CC)$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/loop.c
 
 function$(EXEEXT):
-	$(AM_V_CC)$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/function.c
+	$(BENCH_V_CC)$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/function.c
 
 fetch_add$(EXEEXT):
-	$(AM_V_CC)$(COMPILE) -DBENCH_N=500000000  $(srcdir)/fetch_add.c
+	$(BENCH_V_CC)$(COMPILE) -DBENCH_N=500000000  $(srcdir)/fetch_add.c
 
 ## =========================================================================================================
@@ -134,8 +160,8 @@
 
 ctxswitch-kos_fibre$(EXEEXT):
-	$(AM_V_CXX)$(CXXCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/kos_fibre.cpp  -I$(LIBFIBRE_DIR) -lfibre
+	$(BENCH_V_CXX)$(CXXCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/kos_fibre.cpp  -I$(LIBFIBRE_DIR) -lfibre
 
 ctxswitch-kos_fibre2$(EXEEXT):
-	$(AM_V_CXX)$(CXXCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/kos_fibre2.cpp -I$(LIBFIBRE_DIR) -lfibre
+	$(BENCH_V_CXX)$(CXXCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/kos_fibre2.cpp -I$(LIBFIBRE_DIR) -lfibre
 endif
 
@@ -143,26 +169,26 @@
 
 ctxswitch-pthread$(EXEEXT):
-	$(AM_V_CC)$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/ctxswitch/pthreads.c
+	$(BENCH_V_CC)$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/ctxswitch/pthreads.c
 
 ctxswitch-cfa_coroutine$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_cor.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_cor.cfa
 
 ctxswitch-cfa_thread$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd.cfa
 
 ctxswitch-cfa_thread2$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd2.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd2.cfa
 
 ctxswitch-upp_coroutine$(EXEEXT):
-	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_cor.cc
+	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_cor.cc
 
 ctxswitch-upp_thread$(EXEEXT):
-	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_thrd.cc
+	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_thrd.cc
 
 ctxswitch-goroutine$(EXEEXT):
-	$(AM_V_GOC)go build -o a.out $(srcdir)/ctxswitch/goroutine.go
+	$(BENCH_V_GOC)go build -o a.out $(srcdir)/ctxswitch/goroutine.go
 
 ctxswitch-java_thread$(EXEEXT):
-	$(AM_V_JAVAC)javac -d $(builddir) $(srcdir)/ctxswitch/JavaThread.java
+	$(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/ctxswitch/JavaThread.java
 	@echo "#!/bin/sh" > a.out
 	@echo "java JavaThread" >> a.out
@@ -182,20 +208,20 @@
 
 mutex-pthread_lock$(EXEEXT):
-	$(AM_V_CC)$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/mutex/pthreads.c
+	$(BENCH_V_CC)$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/mutex/pthreads.c
 
 mutex-upp$(EXEEXT):
-	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/mutex/upp.cc
+	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/mutex/upp.cc
 
 mutex-cfa1$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa1.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa1.cfa
 
 mutex-cfa2$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa2.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa2.cfa
 
 mutex-cfa4$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa4.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa4.cfa
 
 mutex-java_thread$(EXEEXT):
-	$(AM_V_JAVAC)javac -d $(builddir) $(srcdir)/mutex/JavaThread.java
+	$(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/mutex/JavaThread.java
 	@echo "#!/bin/sh" > a.out
 	@echo "java JavaThread" >> a.out
@@ -212,20 +238,20 @@
 
 signal-pthread_cond$(EXEEXT):
-	$(AM_V_CC)$(COMPILE)    -DBENCH_N=500000  $(srcdir)/schedint/pthreads.c
+	$(BENCH_V_CC)$(COMPILE)    -DBENCH_N=500000  $(srcdir)/schedint/pthreads.c
 
 signal-upp$(EXEEXT):
-	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedint/upp.cc
+	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedint/upp.cc
 
 signal-cfa1$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa1.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa1.cfa
 
 signal-cfa2$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa2.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa2.cfa
 
 signal-cfa4$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa4.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa4.cfa
 
 signal-java_thread$(EXEEXT):
-	$(AM_V_JAVAC)javac -d $(builddir) $(srcdir)/schedint/JavaThread.java
+	$(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/schedint/JavaThread.java
 	@echo "#!/bin/sh" > a.out
 	@echo "java JavaThread" >> a.out
@@ -241,14 +267,14 @@
 
 waitfor-upp$(EXEEXT):
-	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedext/upp.cc
+	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedext/upp.cc
 
 waitfor-cfa1$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa1.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa1.cfa
 
 waitfor-cfa2$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa2.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa2.cfa
 
 waitfor-cfa4$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa4.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa4.cfa
 
 ## =========================================================================================================
@@ -264,26 +290,26 @@
 
 creation-cfa_coroutine$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.cfa
 
 creation-cfa_coroutine_eager$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.cfa  -DEAGER
 
 creation-cfa_thread$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_thrd.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_thrd.cfa
 
 creation-upp_coroutine$(EXEEXT):
-	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_cor.cc
+	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_cor.cc
 
 creation-upp_thread$(EXEEXT):
-	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_thrd.cc
+	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_thrd.cc
 
 creation-pthread$(EXEEXT):
-	$(AM_V_CC)$(COMPILE)    -DBENCH_N=250000   $(srcdir)/creation/pthreads.c
+	$(BENCH_V_CC)$(COMPILE)    -DBENCH_N=250000   $(srcdir)/creation/pthreads.c
 
 creation-goroutine$(EXEEXT):
-	$(AM_V_GOC)go build -o a.out $(srcdir)/creation/goroutine.go
+	$(BENCH_V_GOC)go build -o a.out $(srcdir)/creation/goroutine.go
 
 creation-java_thread$(EXEEXT):
-	$(AM_V_JAVAC)javac -d $(builddir) $(srcdir)/creation/JavaThread.java
+	$(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/creation/JavaThread.java
 	@echo "#!/bin/sh" > a.out
 	@echo "java JavaThread" >> a.out
@@ -306,28 +332,28 @@
 
 compile-array$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/array.c
+	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/array.cfa
 
 compile-attributes$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/attributes.cfa
+	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/attributes.cfa
 
 compile-empty$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(srcdir)/compile/empty.c
+	@$(CFACOMPILE) -fsyntax-only -w $(srcdir)/compile/empty.cfa
 
 compile-expression$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/expression.c
+	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/expression.cfa
 
 compile-io$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/io1.c
+	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/io1.cfa
 
 compile-monitor$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/monitor.c
+	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/monitor.cfa
 
 compile-operators$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/operators.c
+	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/operators.cfa
 
 compile-thread$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/thread.c
+	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/thread.cfa
 
 compile-typeof$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/typeof.c
-
+	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/typeof.cfa
+
Index: benchmark/Makefile.in
===================================================================
--- benchmark/Makefile.in	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ benchmark/Makefile.in	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -111,5 +111,5 @@
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
-am_dummy_OBJECTS = c.$(OBJEXT) cxx.$(OBJEXT)
+am_dummy_OBJECTS = dummyC.$(OBJEXT) dummyCXX.$(OBJEXT)
 dummy_OBJECTS = $(am_dummy_OBJECTS)
 dummy_LDADD = $(LDADD)
@@ -200,5 +200,4 @@
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-ALLOCA = @ALLOCA@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -364,4 +363,5 @@
 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)
 AM_V_UPP = $(am__v_UPP_@AM_V@)
@@ -371,16 +371,34 @@
 
 # applies to both programs
-UPPCC = u++
 AM_CFLAGS = -O2 -Wall -I$(srcdir) -lrt -pthread
 AM_CFAFLAGS = -quiet -in-tree -nodebug
 AM_UPPFLAGS = -quiet -nodebug -multi
-TOOLSDIR = ${abs_top_srcdir}/tools/
-REPEAT = ${TOOLSDIR}repeat
-STATS = ${TOOLSDIR}stat.py
+BENCH_V_CC = $(__bench_v_CC_$(__quiet))
+BENCH_V_CFA = $(__bench_v_CFA_$(__quiet))
+BENCH_V_CXX = $(__bench_v_CXX_$(__quiet))
+BENCH_V_GOC = $(__bench_v_GOC_$(__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_GOC_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_GOC_verbose = $(AM_V_GOC)
+__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
 repeats = 30
 skipcompile = no
 TIME_FORMAT = "%E"
 PRINT_FORMAT = %20s: #Comments needed for spacing
-dummy_SOURCES = c.c cxx.cpp
+dummy_SOURCES = dummyC.c dummyCXX.cpp
 CTXSWITCH_DEPEND = loop.run function.run fetch_add.run \
 	ctxswitch-pthread.run ctxswitch-cfa_coroutine.run \
@@ -435,6 +453,6 @@
 	-rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cxx.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummyC.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummyCXX.Po@am__quote@
 
 .c.o:
@@ -706,5 +724,10 @@
 	$(am__mv) $$depbase.Tpo $$depbase.Plo
 
-#prevent any tests in parallel
+dummyC.c:
+	@echo "int main() { return 0; }" > ${@}
+
+dummyCXX.cpp:
+	@echo "int main() { return 0; }" > ${@}
+
 .NOTPARALLEL:
 
@@ -721,5 +744,5 @@
 
 %.runquiet :
-	@+make $(basename $@) CFLAGS="-w"
+	@+make $(basename $@) CFLAGS="-w" __quiet=quiet
 	@taskset -c 1 ./a.out
 	@rm -f a.out
@@ -730,5 +753,5 @@
 
 ${REPEAT} :
-	@+make -C ${TOOLSDIR} repeat
+	@+make -C ${abs_top_builddir}/tools repeat
 
 jenkins$(EXEEXT):
@@ -768,43 +791,43 @@
 
 loop$(EXEEXT):
-	$(AM_V_CC)$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/loop.c
+	$(BENCH_V_CC)$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/loop.c
 
 function$(EXEEXT):
-	$(AM_V_CC)$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/function.c
+	$(BENCH_V_CC)$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/function.c
 
 fetch_add$(EXEEXT):
-	$(AM_V_CC)$(COMPILE) -DBENCH_N=500000000  $(srcdir)/fetch_add.c
+	$(BENCH_V_CC)$(COMPILE) -DBENCH_N=500000000  $(srcdir)/fetch_add.c
 
 @WITH_LIBFIBRE_TRUE@ctxswitch-kos_fibre$(EXEEXT):
-@WITH_LIBFIBRE_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/kos_fibre.cpp  -I$(LIBFIBRE_DIR) -lfibre
+@WITH_LIBFIBRE_TRUE@	$(BENCH_V_CXX)$(CXXCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/kos_fibre.cpp  -I$(LIBFIBRE_DIR) -lfibre
 
 @WITH_LIBFIBRE_TRUE@ctxswitch-kos_fibre2$(EXEEXT):
-@WITH_LIBFIBRE_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/kos_fibre2.cpp -I$(LIBFIBRE_DIR) -lfibre
+@WITH_LIBFIBRE_TRUE@	$(BENCH_V_CXX)$(CXXCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/kos_fibre2.cpp -I$(LIBFIBRE_DIR) -lfibre
 
 ctxswitch$(EXEEXT): $(CTXSWITCH_DEPEND)
 
 ctxswitch-pthread$(EXEEXT):
-	$(AM_V_CC)$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/ctxswitch/pthreads.c
+	$(BENCH_V_CC)$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/ctxswitch/pthreads.c
 
 ctxswitch-cfa_coroutine$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_cor.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_cor.cfa
 
 ctxswitch-cfa_thread$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd.cfa
 
 ctxswitch-cfa_thread2$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd2.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd2.cfa
 
 ctxswitch-upp_coroutine$(EXEEXT):
-	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_cor.cc
+	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_cor.cc
 
 ctxswitch-upp_thread$(EXEEXT):
-	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_thrd.cc
+	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_thrd.cc
 
 ctxswitch-goroutine$(EXEEXT):
-	$(AM_V_GOC)go build -o a.out $(srcdir)/ctxswitch/goroutine.go
+	$(BENCH_V_GOC)go build -o a.out $(srcdir)/ctxswitch/goroutine.go
 
 ctxswitch-java_thread$(EXEEXT):
-	$(AM_V_JAVAC)javac -d $(builddir) $(srcdir)/ctxswitch/JavaThread.java
+	$(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/ctxswitch/JavaThread.java
 	@echo "#!/bin/sh" > a.out
 	@echo "java JavaThread" >> a.out
@@ -823,20 +846,20 @@
 
 mutex-pthread_lock$(EXEEXT):
-	$(AM_V_CC)$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/mutex/pthreads.c
+	$(BENCH_V_CC)$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/mutex/pthreads.c
 
 mutex-upp$(EXEEXT):
-	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/mutex/upp.cc
+	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/mutex/upp.cc
 
 mutex-cfa1$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa1.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa1.cfa
 
 mutex-cfa2$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa2.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa2.cfa
 
 mutex-cfa4$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa4.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa4.cfa
 
 mutex-java_thread$(EXEEXT):
-	$(AM_V_JAVAC)javac -d $(builddir) $(srcdir)/mutex/JavaThread.java
+	$(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/mutex/JavaThread.java
 	@echo "#!/bin/sh" > a.out
 	@echo "java JavaThread" >> a.out
@@ -852,20 +875,20 @@
 
 signal-pthread_cond$(EXEEXT):
-	$(AM_V_CC)$(COMPILE)    -DBENCH_N=500000  $(srcdir)/schedint/pthreads.c
+	$(BENCH_V_CC)$(COMPILE)    -DBENCH_N=500000  $(srcdir)/schedint/pthreads.c
 
 signal-upp$(EXEEXT):
-	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedint/upp.cc
+	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedint/upp.cc
 
 signal-cfa1$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa1.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa1.cfa
 
 signal-cfa2$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa2.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa2.cfa
 
 signal-cfa4$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa4.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa4.cfa
 
 signal-java_thread$(EXEEXT):
-	$(AM_V_JAVAC)javac -d $(builddir) $(srcdir)/schedint/JavaThread.java
+	$(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/schedint/JavaThread.java
 	@echo "#!/bin/sh" > a.out
 	@echo "java JavaThread" >> a.out
@@ -879,14 +902,14 @@
 
 waitfor-upp$(EXEEXT):
-	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedext/upp.cc
+	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedext/upp.cc
 
 waitfor-cfa1$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa1.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa1.cfa
 
 waitfor-cfa2$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa2.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa2.cfa
 
 waitfor-cfa4$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa4.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa4.cfa
 
 creation$(EXEEXT) :\
@@ -901,26 +924,26 @@
 
 creation-cfa_coroutine$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.cfa
 
 creation-cfa_coroutine_eager$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.cfa  -DEAGER
 
 creation-cfa_thread$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_thrd.c
+	$(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_thrd.cfa
 
 creation-upp_coroutine$(EXEEXT):
-	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_cor.cc
+	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_cor.cc
 
 creation-upp_thread$(EXEEXT):
-	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_thrd.cc
+	$(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_thrd.cc
 
 creation-pthread$(EXEEXT):
-	$(AM_V_CC)$(COMPILE)    -DBENCH_N=250000   $(srcdir)/creation/pthreads.c
+	$(BENCH_V_CC)$(COMPILE)    -DBENCH_N=250000   $(srcdir)/creation/pthreads.c
 
 creation-goroutine$(EXEEXT):
-	$(AM_V_GOC)go build -o a.out $(srcdir)/creation/goroutine.go
+	$(BENCH_V_GOC)go build -o a.out $(srcdir)/creation/goroutine.go
 
 creation-java_thread$(EXEEXT):
-	$(AM_V_JAVAC)javac -d $(builddir) $(srcdir)/creation/JavaThread.java
+	$(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/creation/JavaThread.java
 	@echo "#!/bin/sh" > a.out
 	@echo "java JavaThread" >> a.out
@@ -938,29 +961,29 @@
 
 compile-array$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/array.c
+	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/array.cfa
 
 compile-attributes$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/attributes.cfa
+	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/attributes.cfa
 
 compile-empty$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(srcdir)/compile/empty.c
+	@$(CFACOMPILE) -fsyntax-only -w $(srcdir)/compile/empty.cfa
 
 compile-expression$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/expression.c
+	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/expression.cfa
 
 compile-io$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/io1.c
+	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/io1.cfa
 
 compile-monitor$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/monitor.c
+	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/monitor.cfa
 
 compile-operators$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/operators.c
+	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/operators.cfa
 
 compile-thread$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/thread.c
+	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/thread.cfa
 
 compile-typeof$(EXEEXT):
-	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/typeof.c
+	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/typeof.cfa
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
Index: nchmark/compile/empty.c
===================================================================
--- benchmark/compile/empty.c	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ 	(revision )
@@ -1,3 +1,0 @@
-int main() {
-	return 0;
-}
Index: benchmark/compile/empty.cfa
===================================================================
--- benchmark/compile/empty.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ benchmark/compile/empty.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,3 @@
+int main() {
+	return 0;
+}
Index: nchmark/creation/cfa_cor.c
===================================================================
--- benchmark/creation/cfa_cor.c	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ 	(revision )
@@ -1,23 +1,0 @@
-#include <stdio.h>
-#include <coroutine.hfa>
-
-#include "bench.h"
-
-coroutine MyCoroutine {};
-void ?{} (MyCoroutine & this) {
-#ifdef EAGER
-	prime(this);
-#endif
-}
-void main(MyCoroutine & this) {}
-
-int main(int argc, char* argv[]) {
-	BENCH(
-		for (size_t i = 0; i < n; i++) {
-			MyCoroutine m;
-		},
-		result
-	)
-
-	printf("%llu\n", result);
-}
Index: benchmark/creation/cfa_cor.cfa
===================================================================
--- benchmark/creation/cfa_cor.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ benchmark/creation/cfa_cor.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,23 @@
+#include <stdio.h>
+#include <coroutine.hfa>
+
+#include "bench.h"
+
+coroutine MyCoroutine {};
+void ?{} (MyCoroutine & this) {
+#ifdef EAGER
+	prime(this);
+#endif
+}
+void main(MyCoroutine & this) {}
+
+int main(int argc, char* argv[]) {
+	BENCH(
+		for (size_t i = 0; i < n; i++) {
+			MyCoroutine m;
+		},
+		result
+	)
+
+	printf("%llu\n", result);
+}
Index: nchmark/creation/cfa_thrd.c
===================================================================
--- benchmark/creation/cfa_thrd.c	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ 	(revision )
@@ -1,18 +1,0 @@
-#include <stdio.h>
-#include <thread.hfa>
-
-#include "bench.h"
-
-thread MyThread {};
-void main(MyThread & this) {}
-
-int main(int argc, char* argv[]) {
-	BENCH(
-		for (size_t i = 0; i < n; i++) {
-			MyThread m;
-		},
-		result
-	)
-
-	printf("%llu\n", result);
-}
Index: benchmark/creation/cfa_thrd.cfa
===================================================================
--- benchmark/creation/cfa_thrd.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ benchmark/creation/cfa_thrd.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,18 @@
+#include <stdio.h>
+#include <thread.hfa>
+
+#include "bench.h"
+
+thread MyThread {};
+void main(MyThread & this) {}
+
+int main(int argc, char* argv[]) {
+	BENCH(
+		for (size_t i = 0; i < n; i++) {
+			MyThread m;
+		},
+		result
+	)
+
+	printf("%llu\n", result);
+}
Index: nchmark/ctxswitch/cfa_cor.c
===================================================================
--- benchmark/ctxswitch/cfa_cor.c	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ 	(revision )
@@ -1,30 +1,0 @@
-#include <stdio.h>
-#include <kernel.hfa>
-#include <thread.hfa>
-
-#include "bench.h"
-
-coroutine GreatSuspender {};
-
-void ?{}( GreatSuspender & this ) {
-	prime(this);
-}
-
-void main( GreatSuspender & this ) {
-	while( true ) {
-		suspend();
-	}
-}
-
-int main(int argc, char* argv[]) {
-	GreatSuspender s;
-
-	BENCH(
-		for (size_t i = 0; i < n; i++) {
-			resume( s );
-		},
-		result
-	)
-
-	printf("%llu\n", result);
-}
Index: benchmark/ctxswitch/cfa_cor.cfa
===================================================================
--- benchmark/ctxswitch/cfa_cor.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ benchmark/ctxswitch/cfa_cor.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,30 @@
+#include <stdio.h>
+#include <kernel.hfa>
+#include <thread.hfa>
+
+#include "bench.h"
+
+coroutine GreatSuspender {};
+
+void ?{}( GreatSuspender & this ) {
+	prime(this);
+}
+
+void main( GreatSuspender & this ) {
+	while( true ) {
+		suspend();
+	}
+}
+
+int main(int argc, char* argv[]) {
+	GreatSuspender s;
+
+	BENCH(
+		for (size_t i = 0; i < n; i++) {
+			resume( s );
+		},
+		result
+	)
+
+	printf("%llu\n", result);
+}
Index: nchmark/ctxswitch/cfa_thrd.c
===================================================================
--- benchmark/ctxswitch/cfa_thrd.c	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ 	(revision )
@@ -1,15 +1,0 @@
-#include <stdio.h>
-#include <thread.hfa>
-
-#include "bench.h"
-
-int main(int argc, char* argv[]) {
-	BENCH(
-		for (size_t i = 0; i < n; i++) {
-			yield();
-		},
-		result
-	)
-
-	printf("%llu\n", result);
-}
Index: benchmark/ctxswitch/cfa_thrd.cfa
===================================================================
--- benchmark/ctxswitch/cfa_thrd.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ benchmark/ctxswitch/cfa_thrd.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,15 @@
+#include <stdio.h>
+#include <thread.hfa>
+
+#include "bench.h"
+
+int main(int argc, char* argv[]) {
+	BENCH(
+		for (size_t i = 0; i < n; i++) {
+			yield();
+		},
+		result
+	)
+
+	printf("%llu\n", result);
+}
Index: nchmark/ctxswitch/cfa_thrd2.c
===================================================================
--- benchmark/ctxswitch/cfa_thrd2.c	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ 	(revision )
@@ -1,28 +1,0 @@
-#include <stdio.h>
-#include <thread.hfa>
-
-#include "bench.h"
-
-volatile bool done = false;
-
-thread Fibre {};
-
-void main(Fibre & this) {
-	while(!done) {
-		yield();
-	}
-}
-
-int main(int argc, char* argv[]) {
-	Fibre f1;
-  	BENCH(
-		for (size_t i = 0; i < n; i++) {
-			yield();
-		},
-		result
-	)
-
-	printf("%llu\n", result);
-	done = true;
-	return 0;
-}
Index: benchmark/ctxswitch/cfa_thrd2.cfa
===================================================================
--- benchmark/ctxswitch/cfa_thrd2.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ benchmark/ctxswitch/cfa_thrd2.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,28 @@
+#include <stdio.h>
+#include <thread.hfa>
+
+#include "bench.h"
+
+volatile bool done = false;
+
+thread Fibre {};
+
+void main(Fibre & this) {
+	while(!done) {
+		yield();
+	}
+}
+
+int main(int argc, char* argv[]) {
+	Fibre f1;
+  	BENCH(
+		for (size_t i = 0; i < n; i++) {
+			yield();
+		},
+		result
+	)
+
+	printf("%llu\n", result);
+	done = true;
+	return 0;
+}
Index: benchmark/jenkins.sh
===================================================================
--- benchmark/jenkins.sh	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ benchmark/jenkins.sh	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+set -o pipefail
+
+GitNewRef=$1
+Architecture=$2
+Out=$3
+
+make --no-print-directory -C benchmark jenkins githash=${GitNewRef} arch=${Architecture} | tee ${Out}
Index: nchmark/mutex/cfa1.c
===================================================================
--- benchmark/mutex/cfa1.c	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ 	(revision )
@@ -1,19 +1,0 @@
-#include <monitor.hfa>
-#include <stdio.h>
-
-#include "bench.h"
-
-monitor M {};
-void __attribute__((noinline)) call( M & mutex m ) {}
-
-int main(int argc, char* argv[]) {
-	M m;
-	BENCH(
-		for (size_t i = 0; i < n; i++) {
-			call(m);
-		},
-		result
-	)
-
-	printf("%llu\n", result);
-}
Index: benchmark/mutex/cfa1.cfa
===================================================================
--- benchmark/mutex/cfa1.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ benchmark/mutex/cfa1.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,19 @@
+#include <monitor.hfa>
+#include <stdio.h>
+
+#include "bench.h"
+
+monitor M {};
+void __attribute__((noinline)) call( M & mutex m ) {}
+
+int main(int argc, char* argv[]) {
+	M m;
+	BENCH(
+		for (size_t i = 0; i < n; i++) {
+			call(m);
+		},
+		result
+	)
+
+	printf("%llu\n", result);
+}
Index: nchmark/mutex/cfa2.c
===================================================================
--- benchmark/mutex/cfa2.c	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ 	(revision )
@@ -1,19 +1,0 @@
-#include <monitor.hfa>
-#include <stdio.h>
-
-#include "bench.h"
-
-monitor M {};
-void __attribute__((noinline)) call( M & mutex m1, M & mutex m2 ) {}
-
-int main(int argc, char* argv[]) {
-	M m1, m2;
-	BENCH(
-		for (size_t i = 0; i < n; i++) {
-			call(m1, m2);
-		},
-		result
-	)
-
-	printf("%llu\n", result);
-}
Index: benchmark/mutex/cfa2.cfa
===================================================================
--- benchmark/mutex/cfa2.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ benchmark/mutex/cfa2.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,19 @@
+#include <monitor.hfa>
+#include <stdio.h>
+
+#include "bench.h"
+
+monitor M {};
+void __attribute__((noinline)) call( M & mutex m1, M & mutex m2 ) {}
+
+int main(int argc, char* argv[]) {
+	M m1, m2;
+	BENCH(
+		for (size_t i = 0; i < n; i++) {
+			call(m1, m2);
+		},
+		result
+	)
+
+	printf("%llu\n", result);
+}
Index: nchmark/mutex/cfa4.c
===================================================================
--- benchmark/mutex/cfa4.c	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ 	(revision )
@@ -1,20 +1,0 @@
-#include <monitor.hfa>
-#include <stdio.h>
-
-#include "bench.h"
-
-
-monitor M {};
-void __attribute__((noinline)) call( M & mutex m1, M & mutex m2, M & mutex m3, M & mutex m4 ) {}
-
-int main(int argc, char* argv[]) {
-	M m1, m2, m3, m4;
-	BENCH(
-		for (size_t i = 0; i < n; i++) {
-			call(m1, m2, m3, m4);
-		},
-		result
-	)
-
-	printf("%llu\n", result);
-}
Index: benchmark/mutex/cfa4.cfa
===================================================================
--- benchmark/mutex/cfa4.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ benchmark/mutex/cfa4.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,20 @@
+#include <monitor.hfa>
+#include <stdio.h>
+
+#include "bench.h"
+
+
+monitor M {};
+void __attribute__((noinline)) call( M & mutex m1, M & mutex m2, M & mutex m3, M & mutex m4 ) {}
+
+int main(int argc, char* argv[]) {
+	M m1, m2, m3, m4;
+	BENCH(
+		for (size_t i = 0; i < n; i++) {
+			call(m1, m2, m3, m4);
+		},
+		result
+	)
+
+	printf("%llu\n", result);
+}
Index: nchmark/schedext/cfa1.c
===================================================================
--- benchmark/schedext/cfa1.c	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ 	(revision )
@@ -1,44 +1,0 @@
-#include <kernel.hfa>
-#include <monitor.hfa>
-#include <thread.hfa>
-#include <stdio.h>
-
-#include "bench.h"
-
-int argc;
-char** argv;
-volatile int go = 0;
-
-monitor M {};
-M m1;
-
-void __attribute__((noinline)) call( M & mutex a1 ) {}
-
-int  __attribute__((noinline)) wait( M & mutex a1 ) {
-	go = 1;
-	BENCH(
-		for (size_t i = 0; i < n; i++) {
-			waitfor(call, a1);
-		},
-		result
-	)
-
-	printf("%llu\n", result);
-	go = 0;
-	return 0;
-}
-
-thread T {};
-void ^?{}( T & mutex this ) {}
-void main( T & this ) {
-	while(go == 0) { yield(); }
-	while(go == 1) { call(m1); }
-
-}
-
-int main(int margc, char* margv[]) {
-	argc = margc;
-	argv = margv;
-	T t;
-	return wait(m1);
-}
Index: benchmark/schedext/cfa1.cfa
===================================================================
--- benchmark/schedext/cfa1.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ benchmark/schedext/cfa1.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,44 @@
+#include <kernel.hfa>
+#include <monitor.hfa>
+#include <thread.hfa>
+#include <stdio.h>
+
+#include "bench.h"
+
+int argc;
+char** argv;
+volatile int go = 0;
+
+monitor M {};
+M m1;
+
+void __attribute__((noinline)) call( M & mutex a1 ) {}
+
+int  __attribute__((noinline)) wait( M & mutex a1 ) {
+	go = 1;
+	BENCH(
+		for (size_t i = 0; i < n; i++) {
+			waitfor(call, a1);
+		},
+		result
+	)
+
+	printf("%llu\n", result);
+	go = 0;
+	return 0;
+}
+
+thread T {};
+void ^?{}( T & mutex this ) {}
+void main( T & this ) {
+	while(go == 0) { yield(); }
+	while(go == 1) { call(m1); }
+
+}
+
+int main(int margc, char* margv[]) {
+	argc = margc;
+	argv = margv;
+	T t;
+	return wait(m1);
+}
Index: nchmark/schedext/cfa2.c
===================================================================
--- benchmark/schedext/cfa2.c	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ 	(revision )
@@ -1,44 +1,0 @@
-#include <kernel.hfa>
-#include <monitor.hfa>
-#include <thread.hfa>
-#include <stdio.h>
-
-#include "bench.h"
-
-int argc;
-char** argv;
-volatile int go = 0;
-
-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;
-	BENCH(
-		for (size_t i = 0; i < n; i++) {
-			waitfor(call, a1, a2);
-		},
-		result
-	)
-
-	printf("%llu\n", result);
-	go = 0;
-	return 0;
-}
-
-thread T {};
-void ^?{}( T & mutex this ) {}
-void main( T & this ) {
-	while(go == 0) { yield(); }
-	while(go == 1) { call(m1, m2); }
-
-}
-
-int main(int margc, char* margv[]) {
-	argc = margc;
-	argv = margv;
-	T t;
-	return wait(m1, m2);
-}
Index: benchmark/schedext/cfa2.cfa
===================================================================
--- benchmark/schedext/cfa2.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ benchmark/schedext/cfa2.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,44 @@
+#include <kernel.hfa>
+#include <monitor.hfa>
+#include <thread.hfa>
+#include <stdio.h>
+
+#include "bench.h"
+
+int argc;
+char** argv;
+volatile int go = 0;
+
+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;
+	BENCH(
+		for (size_t i = 0; i < n; i++) {
+			waitfor(call, a1, a2);
+		},
+		result
+	)
+
+	printf("%llu\n", result);
+	go = 0;
+	return 0;
+}
+
+thread T {};
+void ^?{}( T & mutex this ) {}
+void main( T & this ) {
+	while(go == 0) { yield(); }
+	while(go == 1) { call(m1, m2); }
+
+}
+
+int main(int margc, char* margv[]) {
+	argc = margc;
+	argv = margv;
+	T t;
+	return wait(m1, m2);
+}
Index: nchmark/schedext/cfa4.c
===================================================================
--- benchmark/schedext/cfa4.c	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ 	(revision )
@@ -1,44 +1,0 @@
-#include <kernel.hfa>
-#include <monitor.hfa>
-#include <thread.hfa>
-#include <stdio.h>
-
-#include "bench.h"
-
-int argc;
-char** argv;
-volatile int go = 0;
-
-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;
-	BENCH(
-		for (size_t i = 0; i < n; i++) {
-			waitfor(call, a1, a2, a3, a4);
-		},
-		result
-	)
-
-	printf("%llu\n", result);
-	go = 0;
-	return 0;
-}
-
-thread T {};
-void ^?{}( T & mutex this ) {}
-void main( T & this ) {
-	while(go == 0) { yield(); }
-	while(go == 1) { call(m1, m2, m3, m4); }
-
-}
-
-int main(int margc, char* margv[]) {
-	argc = margc;
-	argv = margv;
-	T t;
-	return wait(m1, m2, m3, m4);
-}
Index: benchmark/schedext/cfa4.cfa
===================================================================
--- benchmark/schedext/cfa4.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ benchmark/schedext/cfa4.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,44 @@
+#include <kernel.hfa>
+#include <monitor.hfa>
+#include <thread.hfa>
+#include <stdio.h>
+
+#include "bench.h"
+
+int argc;
+char** argv;
+volatile int go = 0;
+
+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;
+	BENCH(
+		for (size_t i = 0; i < n; i++) {
+			waitfor(call, a1, a2, a3, a4);
+		},
+		result
+	)
+
+	printf("%llu\n", result);
+	go = 0;
+	return 0;
+}
+
+thread T {};
+void ^?{}( T & mutex this ) {}
+void main( T & this ) {
+	while(go == 0) { yield(); }
+	while(go == 1) { call(m1, m2, m3, m4); }
+
+}
+
+int main(int margc, char* margv[]) {
+	argc = margc;
+	argv = margv;
+	T t;
+	return wait(m1, m2, m3, m4);
+}
Index: nchmark/schedint/cfa1.c
===================================================================
--- benchmark/schedint/cfa1.c	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ 	(revision )
@@ -1,47 +1,0 @@
-#include <kernel.hfa>
-#include <monitor.hfa>
-#include <thread.hfa>
-#include <stdio.h>
-
-#include "bench.h"
-
-int argc;
-char** argv;
-volatile int go = 0;
-
-condition c;
-monitor M {};
-M m1;
-
-void __attribute__((noinline)) call( M & mutex a1 ) {
-	signal(c);
-}
-
-int  __attribute__((noinline)) wait( M & mutex a1 ) {
-	go = 1;
-	BENCH(
-		for (size_t i = 0; i < n; i++) {
-			wait(c);
-		},
-		result
-	)
-
-	printf("%llu\n", result);
-	go = 0;
-	return 0;
-}
-
-thread T {};
-void ^?{}( T & mutex this ) {}
-void main( T & this ) {
-	while(go == 0) { yield(); }
-	while(go == 1) { call(m1); }
-
-}
-
-int main(int margc, char* margv[]) {
-	argc = margc;
-	argv = margv;
-	T t;
-	return wait(m1);
-}
Index: benchmark/schedint/cfa1.cfa
===================================================================
--- benchmark/schedint/cfa1.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ benchmark/schedint/cfa1.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,47 @@
+#include <kernel.hfa>
+#include <monitor.hfa>
+#include <thread.hfa>
+#include <stdio.h>
+
+#include "bench.h"
+
+int argc;
+char** argv;
+volatile int go = 0;
+
+condition c;
+monitor M {};
+M m1;
+
+void __attribute__((noinline)) call( M & mutex a1 ) {
+	signal(c);
+}
+
+int  __attribute__((noinline)) wait( M & mutex a1 ) {
+	go = 1;
+	BENCH(
+		for (size_t i = 0; i < n; i++) {
+			wait(c);
+		},
+		result
+	)
+
+	printf("%llu\n", result);
+	go = 0;
+	return 0;
+}
+
+thread T {};
+void ^?{}( T & mutex this ) {}
+void main( T & this ) {
+	while(go == 0) { yield(); }
+	while(go == 1) { call(m1); }
+
+}
+
+int main(int margc, char* margv[]) {
+	argc = margc;
+	argv = margv;
+	T t;
+	return wait(m1);
+}
Index: nchmark/schedint/cfa2.c
===================================================================
--- benchmark/schedint/cfa2.c	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ 	(revision )
@@ -1,47 +1,0 @@
-#include <kernel.hfa>
-#include <monitor.hfa>
-#include <thread.hfa>
-#include <stdio.h>
-
-#include "bench.h"
-
-int argc;
-char** argv;
-volatile int go = 0;
-
-condition c;
-monitor M {};
-M m1, m2;
-
-void __attribute__((noinline)) call( M & mutex a1, M & mutex a2 ) {
-	signal(c);
-}
-
-int  __attribute__((noinline)) wait( M & mutex a1, M & mutex a2 ) {
-	go = 1;
-	BENCH(
-		for (size_t i = 0; i < n; i++) {
-			wait(c);
-		},
-		result
-	)
-
-	printf("%llu\n", result);
-	go = 0;
-	return 0;
-}
-
-thread T {};
-void ^?{}( T & mutex this ) {}
-void main( T & this ) {
-	while(go == 0) { yield(); }
-	while(go == 1) { call(m1, m2); }
-
-}
-
-int main(int margc, char* margv[]) {
-	argc = margc;
-	argv = margv;
-	T t;
-	return wait(m1, m2);
-}
Index: benchmark/schedint/cfa2.cfa
===================================================================
--- benchmark/schedint/cfa2.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ benchmark/schedint/cfa2.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,47 @@
+#include <kernel.hfa>
+#include <monitor.hfa>
+#include <thread.hfa>
+#include <stdio.h>
+
+#include "bench.h"
+
+int argc;
+char** argv;
+volatile int go = 0;
+
+condition c;
+monitor M {};
+M m1, m2;
+
+void __attribute__((noinline)) call( M & mutex a1, M & mutex a2 ) {
+	signal(c);
+}
+
+int  __attribute__((noinline)) wait( M & mutex a1, M & mutex a2 ) {
+	go = 1;
+	BENCH(
+		for (size_t i = 0; i < n; i++) {
+			wait(c);
+		},
+		result
+	)
+
+	printf("%llu\n", result);
+	go = 0;
+	return 0;
+}
+
+thread T {};
+void ^?{}( T & mutex this ) {}
+void main( T & this ) {
+	while(go == 0) { yield(); }
+	while(go == 1) { call(m1, m2); }
+
+}
+
+int main(int margc, char* margv[]) {
+	argc = margc;
+	argv = margv;
+	T t;
+	return wait(m1, m2);
+}
Index: nchmark/schedint/cfa4.c
===================================================================
--- benchmark/schedint/cfa4.c	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ 	(revision )
@@ -1,47 +1,0 @@
-#include <kernel.hfa>
-#include <monitor.hfa>
-#include <thread.hfa>
-#include <stdio.h>
-
-#include "bench.h"
-
-int argc;
-char** argv;
-volatile int go = 0;
-
-condition c;
-monitor M {};
-M m1, m2, m3, m4;
-
-void __attribute__((noinline)) call( M & mutex a1, M & mutex a2, M & mutex a3, M & mutex a4 ) {
-	signal(c);
-}
-
-int  __attribute__((noinline)) wait( M & mutex a1, M & mutex a2, M & mutex a3, M & mutex a4 ) {
-	go = 1;
-	BENCH(
-		for (size_t i = 0; i < n; i++) {
-			wait(c);
-		},
-		result
-	)
-
-	printf("%llu\n", result);
-	go = 0;
-	return 0;
-}
-
-thread T {};
-void ^?{}( T & mutex this ) {}
-void main( T & this ) {
-	while(go == 0) { yield(); }
-	while(go == 1) { call(m1, m2, m3, m4); }
-
-}
-
-int main(int margc, char* margv[]) {
-	argc = margc;
-	argv = margv;
-	T t;
-	return wait(m1, m2, m3, m4);
-}
Index: benchmark/schedint/cfa4.cfa
===================================================================
--- benchmark/schedint/cfa4.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ benchmark/schedint/cfa4.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,47 @@
+#include <kernel.hfa>
+#include <monitor.hfa>
+#include <thread.hfa>
+#include <stdio.h>
+
+#include "bench.h"
+
+int argc;
+char** argv;
+volatile int go = 0;
+
+condition c;
+monitor M {};
+M m1, m2, m3, m4;
+
+void __attribute__((noinline)) call( M & mutex a1, M & mutex a2, M & mutex a3, M & mutex a4 ) {
+	signal(c);
+}
+
+int  __attribute__((noinline)) wait( M & mutex a1, M & mutex a2, M & mutex a3, M & mutex a4 ) {
+	go = 1;
+	BENCH(
+		for (size_t i = 0; i < n; i++) {
+			wait(c);
+		},
+		result
+	)
+
+	printf("%llu\n", result);
+	go = 0;
+	return 0;
+}
+
+thread T {};
+void ^?{}( T & mutex this ) {}
+void main( T & this ) {
+	while(go == 0) { yield(); }
+	while(go == 1) { call(m1, m2, m3, m4); }
+
+}
+
+int main(int margc, char* margv[]) {
+	argc = margc;
+	argv = margv;
+	T t;
+	return wait(m1, m2, m3, m4);
+}
Index: configure
===================================================================
--- configure	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ configure	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -637,5 +637,4 @@
 LIBOBJS
 CFA_BACKEND_CC
-ALLOCA
 WITH_LIBFIBRE_FALSE
 WITH_LIBFIBRE_TRUE
@@ -1961,58 +1960,4 @@
 } # ac_fn_cxx_try_link
 
-# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
-# -------------------------------------------
-# Tests whether TYPE exists after having included INCLUDES, setting cache
-# variable VAR accordingly.
-ac_fn_c_check_type ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=no"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof ($2))
-	 return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof (($2)))
-	    return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  eval "$3=yes"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_type
-
 # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
 # -------------------------------------------------------
@@ -2106,32 +2051,25 @@
 } # ac_fn_c_check_header_mongrel
 
-# ac_fn_c_find_intX_t LINENO BITS VAR
-# -----------------------------------
-# Finds a signed integer type with width BITS, setting cache variable VAR
-# accordingly.
-ac_fn_c_find_intX_t ()
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5
-$as_echo_n "checking for int$2_t... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
 if eval \${$3+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   eval "$3=no"
-     # Order is important - never check a type that is potentially smaller
-     # than half of the expected target width.
-     for ac_type in int$2_t 'int' 'long int' \
-	 'long long int' 'short int' 'signed char'; do
-       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-$ac_includes_default
-	     enum { N = $2 / 2 - 1 };
+$4
 int
 main ()
 {
-static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))];
-test_array [0] = 0;
-return test_array [0];
-
+if (sizeof ($2))
+	 return 0;
   ;
   return 0;
@@ -2141,14 +2079,10 @@
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-$ac_includes_default
-	        enum { N = $2 / 2 - 1 };
+$4
 int
 main ()
 {
-static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1)
-		 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))];
-test_array [0] = 0;
-return test_array [0];
-
+if (sizeof (($2)))
+	    return 0;
   ;
   return 0;
@@ -2158,20 +2092,9 @@
 
 else
-  case $ac_type in #(
-  int$2_t) :
-    eval "$3=yes" ;; #(
-  *) :
-    eval "$3=\$ac_type" ;;
-esac
+  eval "$3=yes"
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-       if eval test \"x\$"$3"\" = x"no"; then :
-
-else
-  break
-fi
-     done
 fi
 eval ac_res=\$$3
@@ -2180,59 +2103,5 @@
   eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
 
-} # ac_fn_c_find_intX_t
-
-# ac_fn_c_find_uintX_t LINENO BITS VAR
-# ------------------------------------
-# Finds an unsigned integer type with width BITS, setting cache variable VAR
-# accordingly.
-ac_fn_c_find_uintX_t ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5
-$as_echo_n "checking for uint$2_t... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=no"
-     # Order is important - never check a type that is potentially smaller
-     # than half of the expected target width.
-     for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \
-	 'unsigned long long int' 'unsigned short int' 'unsigned char'; do
-       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)];
-test_array [0] = 0;
-return test_array [0];
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  case $ac_type in #(
-  uint$2_t) :
-    eval "$3=yes" ;; #(
-  *) :
-    eval "$3=\$ac_type" ;;
-esac
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-       if eval test \"x\$"$3"\" = x"no"; then :
-
-else
-  break
-fi
-     done
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_find_uintX_t
+} # ac_fn_c_check_type
 cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
@@ -2667,4 +2536,6 @@
 
 
+# http://git.savannah.gnu.org/gitweb/?p=autoconf-archive.git;a=blob_plain;f=m4/ax_check_compile_flag.m4
+
 
 # don't use the default CFLAGS as they unconditonnaly add -O2
@@ -5183,5 +5054,4 @@
 
 
-	# deprecated
 # These are often not installed and people miss seeing the "no", so stop the configure.
 for ac_prog in 'bison -y' byacc
@@ -16734,35 +16604,4 @@
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
-set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.make <<\_ACEOF
-SHELL = /bin/sh
-all:
-	@echo '@@@%%%=$(MAKE)=@@@%%%'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
-case `${MAKE-make} -f conftest.make 2>/dev/null` in
-  *@@@%%%=?*=@@@%%%*)
-    eval ac_cv_prog_make_${ac_make}_set=yes;;
-  *)
-    eval ac_cv_prog_make_${ac_make}_set=no;;
-esac
-rm -f conftest.make
-fi
-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-  SET_MAKE=
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-  SET_MAKE="MAKE=${MAKE-make}"
-fi
-
 
 # Checks for libraries.
@@ -16819,202 +16658,5 @@
 
 # Checks for header files.
-ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
-if test "x$ac_cv_type_size_t" = xyes; then :
-
-else
-
-cat >>confdefs.h <<_ACEOF
-#define size_t unsigned int
-_ACEOF
-
-fi
-
-# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
-# for constant arguments.  Useless!
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5
-$as_echo_n "checking for working alloca.h... " >&6; }
-if ${ac_cv_working_alloca_h+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <alloca.h>
-int
-main ()
-{
-char *p = (char *) alloca (2 * sizeof (int));
-			  if (p) return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_working_alloca_h=yes
-else
-  ac_cv_working_alloca_h=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5
-$as_echo "$ac_cv_working_alloca_h" >&6; }
-if test $ac_cv_working_alloca_h = yes; then
-
-$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5
-$as_echo_n "checking for alloca... " >&6; }
-if ${ac_cv_func_alloca_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __GNUC__
-# define alloca __builtin_alloca
-#else
-# ifdef _MSC_VER
-#  include <malloc.h>
-#  define alloca _alloca
-# else
-#  ifdef HAVE_ALLOCA_H
-#   include <alloca.h>
-#  else
-#   ifdef _AIX
- #pragma alloca
-#   else
-#    ifndef alloca /* predefined by HP cc +Olibcalls */
-void *alloca (size_t);
-#    endif
-#   endif
-#  endif
-# endif
-#endif
-
-int
-main ()
-{
-char *p = (char *) alloca (1);
-				    if (p) return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_func_alloca_works=yes
-else
-  ac_cv_func_alloca_works=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5
-$as_echo "$ac_cv_func_alloca_works" >&6; }
-
-if test $ac_cv_func_alloca_works = yes; then
-
-$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h
-
-else
-  # The SVR3 libPW and SVR4 libucb both contain incompatible functions
-# that cause trouble.  Some versions do not even contain alloca or
-# contain a buggy version.  If you still want to use their alloca,
-# use ar to extract alloca.o from them instead of compiling alloca.c.
-
-ALLOCA=\${LIBOBJDIR}alloca.$ac_objext
-
-$as_echo "#define C_ALLOCA 1" >>confdefs.h
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5
-$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; }
-if ${ac_cv_os_cray+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#if defined CRAY && ! defined CRAY2
-webecray
-#else
-wenotbecray
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "webecray" >/dev/null 2>&1; then :
-  ac_cv_os_cray=yes
-else
-  ac_cv_os_cray=no
-fi
-rm -f conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5
-$as_echo "$ac_cv_os_cray" >&6; }
-if test $ac_cv_os_cray = yes; then
-  for ac_func in _getb67 GETB67 getb67; do
-    as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-
-cat >>confdefs.h <<_ACEOF
-#define CRAY_STACKSEG_END $ac_func
-_ACEOF
-
-    break
-fi
-
-  done
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5
-$as_echo_n "checking stack direction for C alloca... " >&6; }
-if ${ac_cv_c_stack_direction+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ac_cv_c_stack_direction=0
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$ac_includes_default
-int
-find_stack_direction (int *addr, int depth)
-{
-  int dir, dummy = 0;
-  if (! addr)
-    addr = &dummy;
-  *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
-  dir = depth ? find_stack_direction (addr, depth - 1) : 0;
-  return dir + dummy;
-}
-
-int
-main (int argc, char **argv)
-{
-  return find_stack_direction (0, argc + !argv + 20) < 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ac_cv_c_stack_direction=1
-else
-  ac_cv_c_stack_direction=-1
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5
-$as_echo "$ac_cv_c_stack_direction" >&6; }
-cat >>confdefs.h <<_ACEOF
-#define STACK_DIRECTION $ac_cv_c_stack_direction
-_ACEOF
-
-
-fi
-
-for ac_header in fenv.h float.h inttypes.h libintl.h limits.h malloc.h stddef.h stdlib.h string.h unistd.h
+for ac_header in libintl.h malloc.h unistd.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
@@ -17025,4 +16667,6 @@
 _ACEOF
 
+else
+  echo "Error: Missing required header"; exit 1
 fi
 
@@ -17031,66 +16675,33 @@
 
 # Checks for typedefs, structures, and compiler characteristics.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5
-$as_echo_n "checking for stdbool.h that conforms to C99... " >&6; }
-if ${ac_cv_header_stdbool_h+:} false; then :
+ac_fn_c_check_type "$LINENO" "_Float32" "ac_cv_type__Float32" "
+"
+if test "x$ac_cv_type__Float32" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE__FLOAT32 1
+_ACEOF
+
+
+$as_echo "#define HAVE_KEYWORDS_FLOATXX /**/" >>confdefs.h
+
+fi
+
+
+# Checks for compiler flags.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wcast-function-type" >&5
+$as_echo_n "checking whether C compiler accepts -Wcast-function-type... " >&6; }
+if ${m4cfa_cv_check_cflags___Wcast_function_type+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+
+	m4cfa_check_save_flags=$CFLAGS
+	CFLAGS="$CFLAGS  -Wcast-function-type"
+	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-
-             #include <stdbool.h>
-             #ifndef bool
-              "error: bool is not defined"
-             #endif
-             #ifndef false
-              "error: false is not defined"
-             #endif
-             #if false
-              "error: false is not 0"
-             #endif
-             #ifndef true
-              "error: true is not defined"
-             #endif
-             #if true != 1
-              "error: true is not 1"
-             #endif
-             #ifndef __bool_true_false_are_defined
-              "error: __bool_true_false_are_defined is not defined"
-             #endif
-
-             struct s { _Bool s: 1; _Bool t; } s;
-
-             char a[true == 1 ? 1 : -1];
-             char b[false == 0 ? 1 : -1];
-             char c[__bool_true_false_are_defined == 1 ? 1 : -1];
-             char d[(bool) 0.5 == true ? 1 : -1];
-             /* See body of main program for 'e'.  */
-             char f[(_Bool) 0.0 == false ? 1 : -1];
-             char g[true];
-             char h[sizeof (_Bool)];
-             char i[sizeof s.t];
-             enum { j = false, k = true, l = false * true, m = true * 256 };
-             /* The following fails for
-                HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */
-             _Bool n[m];
-             char o[sizeof n == m * sizeof n[0] ? 1 : -1];
-             char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
-             /* Catch a bug in an HP-UX C compiler.  See
-                http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
-                http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
-              */
-             _Bool q = true;
-             _Bool *pq = &q;
 
 int
 main ()
 {
-
-             bool e = &s;
-             *pq |= q;
-             *pq |= ! q;
-             /* Refer to every declared value, to avoid compiler optimizations.  */
-             return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l
-                     + !m + !n + !o + !p + !q + !pq);
 
   ;
@@ -17099,214 +16710,20 @@
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_stdbool_h=yes
-else
-  ac_cv_header_stdbool_h=no
+  m4cfa_cv_check_cflags___Wcast_function_type=yes
+else
+  m4cfa_cv_check_cflags___Wcast_function_type=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5
-$as_echo "$ac_cv_header_stdbool_h" >&6; }
-   ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default"
-if test "x$ac_cv_type__Bool" = xyes; then :
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE__BOOL 1
-_ACEOF
-
-
-fi
-
-
-if test $ac_cv_header_stdbool_h = yes; then
-
-$as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
-$as_echo_n "checking for inline... " >&6; }
-if ${ac_cv_c_inline+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_c_inline=no
-for ac_kw in inline __inline__ __inline; do
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifndef __cplusplus
-typedef int foo_t;
-static $ac_kw foo_t static_foo () {return 0; }
-$ac_kw foo_t foo () {return 0; }
-#endif
-
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_c_inline=$ac_kw
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  test "$ac_cv_c_inline" != no && break
-done
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
-$as_echo "$ac_cv_c_inline" >&6; }
-
-case $ac_cv_c_inline in
-  inline | yes) ;;
-  *)
-    case $ac_cv_c_inline in
-      no) ac_val=;;
-      *) ac_val=$ac_cv_c_inline;;
-    esac
-    cat >>confdefs.h <<_ACEOF
-#ifndef __cplusplus
-#define inline $ac_val
-#endif
-_ACEOF
-    ;;
-esac
-
-ac_fn_c_find_intX_t "$LINENO" "16" "ac_cv_c_int16_t"
-case $ac_cv_c_int16_t in #(
-  no|yes) ;; #(
-  *)
-
-cat >>confdefs.h <<_ACEOF
-#define int16_t $ac_cv_c_int16_t
-_ACEOF
-;;
-esac
-
-ac_fn_c_find_intX_t "$LINENO" "32" "ac_cv_c_int32_t"
-case $ac_cv_c_int32_t in #(
-  no|yes) ;; #(
-  *)
-
-cat >>confdefs.h <<_ACEOF
-#define int32_t $ac_cv_c_int32_t
-_ACEOF
-;;
-esac
-
-ac_fn_c_find_intX_t "$LINENO" "8" "ac_cv_c_int8_t"
-case $ac_cv_c_int8_t in #(
-  no|yes) ;; #(
-  *)
-
-cat >>confdefs.h <<_ACEOF
-#define int8_t $ac_cv_c_int8_t
-_ACEOF
-;;
-esac
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5
-$as_echo_n "checking for C/C++ restrict keyword... " >&6; }
-if ${ac_cv_c_restrict+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_c_restrict=no
-   # The order here caters to the fact that C++ does not require restrict.
-   for ac_kw in __restrict __restrict__ _Restrict restrict; do
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-typedef int * int_ptr;
-	int foo (int_ptr $ac_kw ip) {
-	return ip[0];
-       }
-int
-main ()
-{
-int s[1];
-	int * $ac_kw t = s;
-	t[0] = 0;
-	return foo(t)
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_c_restrict=$ac_kw
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-     test "$ac_cv_c_restrict" != no && break
-   done
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5
-$as_echo "$ac_cv_c_restrict" >&6; }
-
- case $ac_cv_c_restrict in
-   restrict) ;;
-   no) $as_echo "#define restrict /**/" >>confdefs.h
- ;;
-   *)  cat >>confdefs.h <<_ACEOF
-#define restrict $ac_cv_c_restrict
-_ACEOF
- ;;
- esac
-
-ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
-if test "x$ac_cv_type_size_t" = xyes; then :
-
-else
-
-cat >>confdefs.h <<_ACEOF
-#define size_t unsigned int
-_ACEOF
-
-fi
-
-ac_fn_c_find_uintX_t "$LINENO" "16" "ac_cv_c_uint16_t"
-case $ac_cv_c_uint16_t in #(
-  no|yes) ;; #(
-  *)
-
-
-cat >>confdefs.h <<_ACEOF
-#define uint16_t $ac_cv_c_uint16_t
-_ACEOF
-;;
-  esac
-
-ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t"
-case $ac_cv_c_uint32_t in #(
-  no|yes) ;; #(
-  *)
-
-$as_echo "#define _UINT32_T 1" >>confdefs.h
-
-
-cat >>confdefs.h <<_ACEOF
-#define uint32_t $ac_cv_c_uint32_t
-_ACEOF
-;;
-  esac
-
-ac_fn_c_find_uintX_t "$LINENO" "8" "ac_cv_c_uint8_t"
-case $ac_cv_c_uint8_t in #(
-  no|yes) ;; #(
-  *)
-
-$as_echo "#define _UINT8_T 1" >>confdefs.h
-
-
-cat >>confdefs.h <<_ACEOF
-#define uint8_t $ac_cv_c_uint8_t
-_ACEOF
-;;
-  esac
-
-
-# Checks for library functions.
-for ac_func in memset putenv strchr strtol
-do :
-  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
+	CFLAGS=$m4cfa_check_save_flags
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $m4cfa_cv_check_cflags___Wcast_function_type" >&5
+$as_echo "$m4cfa_cv_check_cflags___Wcast_function_type" >&6; }
+if test "x$m4cfa_cv_check_cflags___Wcast_function_type" = xyes; then :
+
+$as_echo "#define HAVE_CAST_FUNCTION_TYPE /**/" >>confdefs.h
+
+else
+  :
+fi
 
 
Index: configure.ac
===================================================================
--- configure.ac	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ configure.ac	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -178,5 +178,4 @@
 AC_PROG_CC
 AM_PROG_AS
-AM_PROG_CC_C_O	# deprecated
 # These are often not installed and people miss seeing the "no", so stop the configure.
 AC_PROG_YACC
@@ -186,5 +185,4 @@
 AC_PROG_LIBTOOL
 AC_PROG_INSTALL
-AC_PROG_MAKE_SET
 
 # Checks for libraries.
@@ -193,21 +191,11 @@
 
 # Checks for header files.
-AC_FUNC_ALLOCA
-AC_CHECK_HEADERS([fenv.h float.h inttypes.h libintl.h limits.h malloc.h stddef.h stdlib.h string.h unistd.h])
+AC_CHECK_HEADERS([libintl.h malloc.h unistd.h], [], [echo "Error: Missing required header"; exit 1])
 
 # Checks for typedefs, structures, and compiler characteristics.
-AC_HEADER_STDBOOL
-AC_C_INLINE
-AC_TYPE_INT16_T
-AC_TYPE_INT32_T
-AC_TYPE_INT8_T
-AC_C_RESTRICT
-AC_TYPE_SIZE_T
-AC_TYPE_UINT16_T
-AC_TYPE_UINT32_T
-AC_TYPE_UINT8_T
-
-# Checks for library functions.
-AC_CHECK_FUNCS([memset putenv strchr strtol])
+AC_CHECK_TYPES([_Float32], AC_DEFINE([HAVE_KEYWORDS_FLOATXX], [], [Have keywords _FloatXX.]), [], [[]])
+
+# Checks for compiler flags.
+M4CFA_CHECK_COMPILE_FLAG([-Wcast-function-type], AC_DEFINE([HAVE_CAST_FUNCTION_TYPE], [], [Have compiler warning cast-function-type.]))
 
 #==============================================================================
Index: doc/LaTeXmacros/lstlang.sty
===================================================================
--- doc/LaTeXmacros/lstlang.sty	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ doc/LaTeXmacros/lstlang.sty	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -8,6 +8,6 @@
 %% Created On       : Sat May 13 16:34:42 2017
 %% Last Modified By : Peter A. Buhr
-%% Last Modified On : Fri Apr  6 23:44:50 2018
-%% Update Count     : 20
+%% Last Modified On : Tue Jan  8 14:40:33 2019
+%% Update Count     : 21
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
@@ -114,5 +114,5 @@
 		_Alignas, _Alignof, __alignof, __alignof__, asm, __asm, __asm__, __attribute, __attribute__,
 		auto, _Bool, catch, catchResume, choose, _Complex, __complex, __complex__, __const, __const__,
-		coroutine, disable, dtype, enable, __extension__, exception, fallthrough, fallthru, finally,
+		coroutine, disable, dtype, enable, exception, __extension__, fallthrough, fallthru, finally,
 		__float80, float80, __float128, float128, forall, ftype, _Generic, _Imaginary, __imag, __imag__,
 		inline, __inline, __inline__, __int128, int128, __label__, monitor, mutex, _Noreturn, one_t, or,
Index: doc/bibliography/pl.bib
===================================================================
--- doc/bibliography/pl.bib	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ doc/bibliography/pl.bib	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -330,5 +330,5 @@
     contributer	= {pabuhr@plg},
     author	= {Nissim Francez},
-    title	= {Another Advantage of Key word Notation for Parameter Communication with Subprograms},
+    title	= {Another Advantage of Keyword Notation for Parameter Communication with Subprograms},
     journal	= cacm,
     volume	= 20,
@@ -831,6 +831,15 @@
     year	= 2015,
     howpublished= {\href{http://www.boost.org/doc/libs/1_61_0/libs/coroutine/doc/html/index.html}
-		  {{http://www.boost.org/\-doc/\-libs/1\_61\_0/\-libs/\-coroutine/\-doc/\-html/\-index.html}}},
-    optnote	= {Accessed: 2016-09},
+		  {http://www.boost.org/\-doc/\-libs/1\_61\_0/\-libs/\-coroutine/\-doc/\-html/\-index.html}},
+}
+
+@misc{BoostThreads,
+    keywords	= {Boost Thread Library},
+    contributer	= {pabuhr@plg},
+    author	= {Anthony Williams and Vicente J. Botet Escriba},
+    title	= {Boost Thread Library},
+    year	= 2015,
+    howpublished= {\href{https://www.boost.org/doc/libs/1_61_0/doc/html/thread.html}
+		  {https://\-www.boost.org/\-doc/\-libs/\-1\_61\_0/\-doc/\-html/\-thread.html}},
 }
 
@@ -939,5 +948,4 @@
     author	= {{\textsf{C}{$\mathbf{\forall}$} Features}},
     howpublished= {\href{https://plg.uwaterloo.ca/~cforall/features}{https://\-plg.uwaterloo.ca/\-$\sim$cforall/\-features}},
-    optnote	= {Accessed: 2018-01-01},
 }
 
@@ -959,5 +967,4 @@
     year	= 2018,
     howpublished= {\href{https://cforall.uwaterloo.ca/CFAStackEvaluation.zip}{https://cforall.uwaterloo.ca/\-CFAStackEvaluation.zip}},
-    optnote	= {[Accessed May 2018]},
 }
 
@@ -1134,14 +1141,15 @@
 }
 
-@Inproceedings{Tarditi18,
-    keywords = {Checked C},
-    contributer = {a3moss@uwaterloo.ca},
-    author = {Tarditi, David and Elliott, Archibald Samuel and Ruef, Andrew and Hicks, Michael},
-    title = {Checked C: Making C Safe by Extension},
+@inproceedings{Tarditi18,
+    keywords	= {Checked C},
+    contributer	= {a3moss@uwaterloo.ca},
+    author	= {Tarditi, David and Elliott, Archibald Samuel and Ruef, Andrew and Hicks, Michael},
+    title	= {Checked C: Making C Safe by Extension},
+    booktitle	= {2018 IEEE Cybersecurity Development (SecDev)}
     year = {2018},
     month = {September},
+    pages = {53-60},
     publisher = {IEEE},
     url = {https://www.microsoft.com/en-us/research/publication/checkedc-making-c-safe-by-extension/},
-    pages = {53-60},
 }
 
@@ -1314,5 +1322,8 @@
     journal	= sigplan,
     year	= 1986,
-    month	= oct, volume = 21, number = 10, pages = {19-28},
+    month	= oct,
+    volume	= 21,
+    number	= 10,
+    pages	= {19-28},
     note	= {Object Oriented Programming Workshop}
 }
@@ -1479,5 +1490,4 @@
     title	= {concurrent-locking},
     howpublished= {\href{https://github.com/pabuhr/concurrent-locking}{https://\-github.com/\-pabuhr/\-concurrent-locking}},
-    optnote	= {[Accessed April 2017]},
 }
 
@@ -1767,5 +1777,4 @@
     howpublished= {\href{https://www.airs.com/blog/archives/428}
 		  {https://www.airs.com/\-blog/\-archives/\-428}},
-    optnote	= {Accessed: 2018-05},
 }
 
@@ -2956,5 +2965,4 @@
     year	= 2014,
     howpublished= {\href{https://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/C-Extensions.html}{https://\-gcc.gnu.org/\-onlinedocs/\-gcc-4.7.2/\-gcc/\-C\-Extensions.html}},
-    optnote	= {Accessed: 2017-04-02},
 }
 
@@ -3040,4 +3048,14 @@
 }
 
+@manual{WindowsFibers,
+    keywords	= {threads, fibers},
+    contributer	= {pabuhr@plg},
+    author	= {Windows},
+    title	= {Fibers},
+    organization= {Microsoft, Windows Development Center},
+    address	= {\href{https://docs.microsoft.com/en-us/windows/desktop/ProcThread/fibers}{https://\-docs.microsoft.com/\-en-us/\-windows/\-desktop/\-ProcThread/\-fibers}},
+    year	= 2018,
+}
+
 @inproceedings{F-bound,
     keywords	= {},
@@ -3087,4 +3105,14 @@
 }
 
+@manual{Folly,
+    keywords	= {Folly},
+    contributer	= {pabuhr@plg},
+    author	= {Folly},
+    title	= {Facebook Open-source Library},
+    organization= {Facebook},
+    address	= {\href{https://github.com/facebook/folly}{https://\-github.com/\-facebook/\-folly}},
+    year	= 2018,
+}
+
 @manual{Fortran95,
     keywords	= {Fortran 95},
@@ -3107,4 +3135,15 @@
     address	= {\href{https://www.iso.org/standard/50459.html}{https://\-www.iso.org/\-standard/\-50459.html}},
     year	= 2010,
+}
+
+@manual{Fortran18,
+    keywords	= {ISO/IEC Fortran 10},
+    contributer	= {pabuhr@plg},
+    author	= {Fortran18},
+    title	= {Programming Languages -- {Fortran} Part 1:Base Language ISO/IEC 1539-1:2018},
+    edition	= {4rd},
+    publisher	= {International Standard Organization},
+    address	= {\href{https://www.iso.org/standard/72320.html}{https://\-www.iso.org/\-standard/\-72320.html}},
+    year	= 2018,
 }
 
@@ -3356,5 +3395,4 @@
     year	= 2014,
     howpublished= {https://developer.gnome.org/gobject/stable/},
-    optnote	= {Accessed: 2017-04},
 }
 
@@ -3671,4 +3709,16 @@
     year	= {1964},
     publisher	= {ACM}
+}
+
+@phdthesis{Barghi18,
+    keywords	= {concurrency, user threads, actors},
+    contributer	= {pabuhr@plg},
+    author	= {Saman Barghi},
+    title	= {Improving the Performance of User-level Runtime Systems for Concurrent Applications},
+    school	= {School of Computer Science, University of Waterloo},
+    year	= 2018,
+    month	= sep,
+    optaddress	= {Waterloo, Ontario, Canada, N2L 3G1},
+    note	= {\href{https://uwspace.uwaterloo.ca/handle/10012/13935}{https://\-uwspace.uwaterloo.ca/\-handle/\-10012/\-13935}},
 }
 
@@ -3998,4 +4048,25 @@
     year	= 2015,
     edition	= {{J}ava {SE} 8},
+}
+
+@manual{Java11,
+    keywords	= {Java SE 11},
+    contributer	= {pabuhr@plg},
+    author	= {James Gosling and Bill Joy and Guy Steele and Gilad Bracha and Alex Buckley and Daniel Smith},
+    title	= {{Java} Language Specification},
+    publisher	= {Oracle},
+    month	= sep,
+    year	= 2018,
+    edition	= {{J}ava {SE} 11},
+}
+
+@manual{JDK1.1,
+    keywords	= {JDK 1.1},
+    contributer	= {pabuhr@plg},
+    author	= {{Multithreading Models}},
+    title	= {JDK 1.1 for Solaris Developer's Guide},
+    publisher	= {Oracle},
+    address	= {\href{https://docs.oracle.com/cd/E19455-01/806-3461/6jck06gqk/index.html#ch2mt-41}{https://\-docs.oracle.com/\-cd/\-E19455-01/\-806-3461/\-6jck06gqk/\-index.html\#ch2mt-41}},
+    year	= 2010,
 }
 
@@ -4179,4 +4250,15 @@
 }
 
+@manual{libmill,
+    keywords	= {libmill},
+    contributer	= {pabuhr@plg},
+    author	= {libmill},
+    title	= {{G}o-style concurrency in {C}, Version 1.18},
+    organization= {libmill},
+    address	= {\href{http://libmill.org/documentation.html}{http://\-libmill.org/\-documentation.html}},
+    month	= jan,
+    year	= 2017,
+}
+
 @book{Weissman67,
     keywords	= {lisp},
@@ -4224,4 +4306,13 @@
     pages	= {161-169},
     note	= {Proceedings of the {SIGPLAN}~'89 Conference on Programming Language Design and Implementation}
+}
+
+@manual{Lua,
+    keywords	= {Lua},
+    contributer	= {pabuhr@plg},
+    author	= {Lua},
+    title	= {Lua 5.3 Reference Manual},
+    address	= {\href{https://www.lua.org/manual/5.3}{https://\-www.lua.org/\-manual/\-5.3}},
+    year	= 2018,
 }
 
@@ -4566,4 +4657,18 @@
 }
 %    editor	= {Allen Kent and James G. Williams},
+
+@incollection{MPC,
+    keywords	= {user-level threading},
+    contributer	= {pabuhr@plg},
+    author	= {Marc P\'erache and Herv\'e Jourdren and Raymond Namyst},
+    title	= {MPC: A Unified Parallel Runtime for Clusters of {NUMA} Machines},
+    booktitle	= {Euro-Par 2008},
+    pages	= {329-342},
+    publisher	= {Springer},
+    address	= {Berlin, Heidelberg},
+    year	= 2008,
+    volume	= 5168,
+    series	= {Lecture Notes in Computer Science},
+}
 
 @manual{MPI,
@@ -4992,5 +5097,4 @@
     year	= 2014,
     howpublished= {\href{https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC}{https://\-developer.apple.com/\-library/archive/\-documentation/\-Cocoa/\-Conceptual/\-ProgrammingWithObjectiveC}},
-    optnote	= {Accessed: 2018-03}
 }
 
@@ -5002,5 +5106,4 @@
     year	= 2015,
     howpublished= {\href{https://developer.apple.com/library/content/documentation/Xcode/Conceptual/RN-Xcode-Archive/Chapters/xc7_release_notes.html}{https://\-developer.apple.com/\-library/\-content/\-documentation/\-Xcode/\-Conceptual/\-RN-Xcode-Archive/\-Chapters/\-xc7\_release\_notes.html}},
-    optnote	= {Accessed: 2017-04}
 }
 
@@ -5515,5 +5618,4 @@
     year	= 2012,
     howpublished= {\href{http://cs.brown.edu/research/pubs/theses/masters/2012/verch.pdf}{http://cs.brown.edu/\-research/\-pubs/\-theses/\-masters/\-2012/\-verch.pdf}},
-    optnote	= {Accessed: 2013-10-4}
 }
 
@@ -5839,4 +5941,15 @@
     address	= {\href{https://www.iso.org/standard/64029.html}{https://\-www.iso.org/\-standard/\-64029.html}},
     year	= 2014,
+}
+
+@manual{C++17,
+    keywords	= {ISO/IEC C++ 17},
+    contributer	= {pabuhr@plg},
+    key		= {C++17},
+    title	= {{C}{\kern-.1em\hbox{\large\texttt{+\kern-.25em+}}} Programming Language ISO/IEC 14882:2017},
+    edition	= {5th},
+    publisher   = {International Standard Organization},
+    address	= {\href{https://www.iso.org/standard/68564.html}{https://\-www.iso.org/\-standard/\-68564.html}},
+    year	= 2017,
 }
 
@@ -5992,5 +6105,6 @@
     institution	= {Carnegie Mellon University},
     year	= 1991,
-    month	= feb, number = "CMU-CS-91-106",
+    month	= feb,
+    number	= {CMU-CS-91-106},
     annote	= {
         Discusses a typed lambda calculus with
@@ -6049,7 +6163,9 @@
     journal	= sigplan,
     year	= 1988,
-    month	= jul, volume = 23, number = 7, pages = {260-267},
-    note	= {Proceedings of the SIGPLAN '88 Conference on Programming Language
-	 Design and Implementation},
+    month	= jul,
+    volume	= 23,
+    number	= 7,
+    pages	= {260-267},
+    note	= {Proceedings of the SIGPLAN '88 Conference on Programming Language Design and Implementation},
     abstract	= {
         This paper deals with the integration of an efficient asynchronous
@@ -6101,16 +6217,37 @@
 }
 
+@misc{Pthreads,
+    keywords	= {pthreads, C concurrency},
+    contributer	= {pabuhr@plg},
+    key		= {pthreads},
+    title	= {{Pthread}.h, Specifications Issue 7, {IEEE} Std 1003.1-2017},
+    author	= {IEEE and {The Open Group}},
+    year	= 2018,
+    howpublished= {\href{http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/pthread.h.html}
+		  {http://\-pubs.opengroup.org/\-onlinepubs/\-9699919799/\-basedefs/\-pthread.h.html}},
+}
+
 @manual{Python,
     keywords	= {Python},
     contributer	= {pabuhr@plg},
-    title	= {Python Reference Manual, Release 2.5},
-    author	= {Guido van Rossum},
+    author	= {Python},
+    title	= {Python Language Reference, Release 3.7.2},
     organization= {Python Software Foundation},
-    month	= sep,
-    year	= 2006,
-    note	= {Fred L. Drake, Jr., editor},
+    address	= {\href{https://docs.python.org/3/reference/index.html}{https://\-docs.python.org/\-3/\-reference/\-index.html}},
+    year	= 2018,
 }
 
 % Q
+
+@inproceedings{Qthreads,
+    keywords	= {user-level threading},
+    author	= {Kyle B. Wheeler and Richard C. Murphy and Douglas Thain},
+    title	= {Qthreads: An API for Programming with Millions of Lightweight Threads},
+    booktitle	= {International Symposium on Parallel and Distributed Processing},
+    organization= {IEEE},
+    address	= {Miami, FL, USA},
+    month	= apr,
+    year	= 2008,
+}
 
 @article{Grossman06,
@@ -6149,4 +6286,14 @@
 }
 
+@manual{Quasar,
+    keywords	= {Quasar},
+    contributer	= {pabuhr@plg},
+    author	= {Quasar},
+    title	= {Quasar Documentation, Release 0.8.0},
+    organization= {Parallel Universe},
+    address	= {\href{http://docs.paralleluniverse.co/quasar}{http://\-docs.paralleluniverse.co/\-quasar}},
+    year	= 2018,
+}
+
 % R
 
@@ -6262,4 +6409,15 @@
     number	= 10,
     pages	= {27-32},
+}
+
+@article{Hesselink06,
+    author	= {Wim H. Hesselink},
+    title	= {Refinement Verification of the Lazy Caching Algorithm},
+    journal	= acta,
+    year	= 2006,
+    month	= oct,
+    volume	= 43,
+    number	= 3,
+    pages	= {195--222},
 }
 
@@ -6400,4 +6558,14 @@
 }
 
+@manual{Ruby,
+    keywords	= {Ruby},
+    contributer	= {pabuhr@plg},
+    author	= {Ruby},
+    title	= {Ruby Documentation, Release 2.6.0},
+    organization= {Python Software Foundation},
+    address	= {\href{https://www.ruby-lang.org/en/documentation}{https://\-www.ruby-lang.org/\-en/\-documentation}},
+    year	= 2018,
+}
+
 % S
 
@@ -7190,5 +7358,12 @@
     author	= {{TIOBE Index}},
     howpublished= {\href{http://www.tiobe.com/tiobe_index}{http://\-www.tiobe.com/\-tiobe\_index}},
-    optnote	= {Accessed: 2018-09},
+}
+
+@misc{ThreadModel,
+    contributer	= {pabuhr@plg},
+    key		= {ThreadModel},
+    title	= {Thread (computing)},
+    author	= {{Threading Model}},
+    howpublished= {\href{https://en.wikipedia.org/wiki/Thread_(computing)}{https://\-en.wikipedia.org/\-wiki/\-Thread\_(computing)}},
 }
 
@@ -7522,5 +7697,4 @@
     year	= 2017,
     howpublished= {\url{https://wiki.gnome.org/Projects/Vala/Manual}},
-    optnote	= {Accessed: 2017-04}
 }
 
@@ -7696,4 +7870,19 @@
 % Y
 
+@article{Boehm12,
+    keywords	= {memory model, race condition},
+    contributer	= {pabuhr@plg},
+    author	= {Boehm, Hans-J. and Adve, Sarita V.},
+    title	= {You Don'T Know Jack About Shared Variables or Memory Models},
+    journal	= cacm,
+    volume	= 55,
+    number	= 2,
+    month	= feb,
+    year	= 2012,
+    pages	= {48--54},
+    publisher	= {ACM},
+    address	= {New York, NY, USA},
+}
+
 % Z
 
Index: doc/papers/concurrency/Paper.tex
===================================================================
--- doc/papers/concurrency/Paper.tex	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ doc/papers/concurrency/Paper.tex	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -228,5 +228,5 @@
 }
 
-\title{\texorpdfstring{Concurrency in \protect\CFA}{Concurrency in Cforall}}
+\title{\texorpdfstring{Advanced Control-flow in \protect\CFA}{Advanced Control-flow in Cforall}}
 
 \author[1]{Thierry Delisle}
@@ -241,15 +241,14 @@
 
 \abstract[Summary]{
-\CFA is a modern, polymorphic, \emph{non-object-oriented} extension of the C programming language.
-This paper discusses the design of the concurrency and parallelism features in \CFA, and its concurrent runtime-system.
-These features are created from scratch as ISO C lacks concurrency, relying largely on the pthreads library for concurrency.
-Coroutines and lightweight (user) threads are introduced into \CFA;
-as well, monitors are added as a high-level mechanism for mutual exclusion and synchronization.
-A unique contribution of this work is allowing multiple monitors to be safely acquired \emph{simultaneously}.
+\CFA is a modern, polymorphic, non-object-oriented, backwards-compatible extension of the C programming language.
+This paper discusses the advanced control-flow features in \CFA, which include concurrency and parallelism, and its supporting runtime system.
+These features are created from scratch as ISO C's concurrency is low-level and unimplemented, so C programmers continue to rely on the C pthreads library.
+\CFA provides high-level control-flow mechanisms, like coroutines and user-level threads, and monitors for mutual exclusion and synchronization.
+A unique contribution of this work is allowing multiple monitors to be safely acquired \emph{simultaneously} (deadlock free), while integrating this capability with all monitor synchronization mechanisms.
 All features respect the expectations of C programmers, while being fully integrate with the \CFA polymorphic type-system and other language features.
 Experimental results show comparable performance of the new features with similar mechanisms in other concurrent programming-languages.
 }%
 
-\keywords{concurrency, parallelism, coroutines, threads, monitors, runtime, C, Cforall}
+\keywords{coroutines, concurrency, parallelism, threads, monitors, runtime, C, \CFA (Cforall)}
 
 
@@ -262,4 +261,64 @@
 \section{Introduction}
 
+This paper discusses the design of advanced, high-level control-flow extensions (especially concurrency and parallelism) in \CFA and its runtime.
+\CFA is a modern, polymorphic, non-object-oriented\footnote{
+\CFA has features often associated with object-oriented programming languages, such as constructors, destructors, virtuals and simple inheritance.
+However, functions \emph{cannot} be nested in structures, so there is no lexical binding between a structure and set of functions (member/method) implemented by an implicit \lstinline@this@ (receiver) parameter.},
+backwards-compatible extension of the C programming language~\cite{Moss18}.
+Within the \CFA framework, new control-flow features were created from scratch.
+ISO \Celeven defines only a subset of the \CFA extensions, and with respect to concurrency~\cite[\S~7.26]{C11}, the features are largely wrappers for a subset of the pthreads library~\cite{Butenhof97,Pthreads}.
+Furthermore, \Celeven and pthreads concurrency is basic, based on thread fork/join in a function and a few locks, which is low-level and error prone;
+no high-level language concurrency features exist.
+Interestingly, almost a decade after publication of the \Celeven standard, neither gcc-8, clang-8 nor msvc-19 (most recent versions) support the \Celeven include @threads.h@, indicating little interest in the C concurrency approach.
+Finally, while the \Celeven standard does not state a concurrent threading-model, the historical association with pthreads suggests the threading model is kernel-level threading (1:1)~\cite{ThreadModel}.
+
+In contrast, there has been a renewed interest during the past decade in user-level (M:N, green) threading in old and new programming languages.
+As multi-core hardware became available in the 1980/90s, both user and kernel threading were examined.
+Kernel threading was chosen, largely because of its simplicity and fit with the simpler operating systems and hardware architectures at the time, which gave it a performance advantage~\cite{Drepper03}.
+Libraries like pthreads were developed for C, and the Solaris operating-system switched from user (JDK 1.1~\cite{JDK1.1}) to kernel threads.
+As a result, languages like Java, Scala~\cite{Scala}, Objective-C~\cite{obj-c-book}, \CCeleven~\cite{C11}, and C\#~\cite{Csharp} adopted the 1:1 kernel-threading model, with a variety of presentation mechanisms.
+From 2000 onwards, languages like Go~\cite{Go}, Erlang~\cite{Erlang}, Haskell~\cite{Haskell}, D~\cite{D}, and \uC~\cite{uC++,uC++book} have championed the M:N user-threading model, and many user-threading libraries have appeared~\cite{Qthreads,MPC,BoostThreads}, including putting green threads back into Java~\cite{Quasar}.
+The main argument for user-level threading is that they are lighter weight than kernel threads (locking and context switching do not cross the kernel boundary), so there is less restriction on programming styles that encourage large numbers of threads performing smaller work-units to facilitate load balancing by the runtime~\cite{Verch12}.
+As well, user-threading facilitates a simpler concurrency approach using thread objects that leverage sequential patterns versus events with call-backs~\cite{vonBehren03}.
+Finally, performant user-threading implementations (both time and space) are largely competitive with direct kernel-threading implementations, while achieving the programming advantages of high concurrency levels and safety.
+
+A further effort over the past decade is the development of language memory-models to deal with the conflict between certain language features and compiler/hardware optimizations.
+This issue can be rephrased as some features are pervasive (language and runtime) and cannot be safely added via a library to prevent invalidation by sequential optimizations~\cite{Buhr95a,Boehm05}.
+The consequence is that a language must be cognizant of these features and provide sufficient tools to program around any safety issues.
+For example, C created the @volatile@ qualifier to provide correct execution for @setjmp@/@logjmp@ (concurrency came later).
+The simplest solution is to provide a handful of complex qualifiers and functions (e.g., @volatile@ and atomics) allowing programmers to write consistent/race-free programs, often in the sequentially-consistent memory-model~\cite{Boehm12}.
+
+While having a sufficient memory-model allows sound libraries to be constructed, writing these libraries can quickly become awkward and error prone, and using these low-level libraries has the same issues.
+Essentially, using low-level explicit locks is the concurrent equivalent of assembler programming.
+Just as most assembler programming is replaced with programming in a high-level language, explicit locks can be replaced with high-level concurrency constructs in a programming language.
+The goal is to get the compiler to check for correct usage and follow any complex coding conventions implicitly.
+The drawback is that language constructs may preclude certain specialized techniques, therefore introducing inefficiency or inhibiting concurrency.
+For most concurrent programs, these drawbacks are insignificant in comparison to the speed of composition, and subsequent reliability and maintainability of the high-level concurrent program.
+(The same is true for high-level programming versus assembler programming.)
+Only very rarely should it be necessary to drop down to races and/or explicit locks to apply a specialized technique to achieve maximum speed or concurrency.
+As stated, this observation applies to non-concurrent forms of complex control-flow, like exception handling and coroutines.
+
+Adapting the programming language allows matching the control-flow model with the programming-language style, versus adapting to one general (sound) library/paradigm.
+For example, it is possible to provide exceptions, coroutines, monitors, and tasks as specialized types in an object-oriented language, integrating these constructs to allow leveraging the type-system (static type-checking) and all other object-oriented capabilities~\cite{uC++}.
+It is also possible to leverage call/return for blocking communication via new control structures, versus switching to alternative communication paradigms, like channels or message passing.
+As well, user threading is often a complementary feature, allowing light-weight threading to match with low-cost objects, while hiding the application/kernel boundary.
+User threading also allows layering of implicit concurrency models (no explicit thread creation), such executors, data-flow, actors, into a single language, so programmers can chose the model that best fits an algorithm.\footnote{
+All implicit concurrency models have explicit threading in their implementation, and hence, can be build from explicit threading;
+however, the reverse is seldom true, i.e., given implicit concurrency, e.g., actors, it is virtually impossible to create explicit concurrency, e.g., blocking thread objects.}
+Finally, with extended language features and user-level threading it is possible to discretely fold locking and non-blocking I/O multiplexing into the language's I/O libraries, so threading implicitly dovetails with the I/O subsystem.
+
+\CFA embraces language extensions and user-level threading to provide advanced control-flow and concurrency.
+We attempt to show the \CFA extensions and runtime are demonstrably better than those proposed for \CC and other concurrent, imperative programming languages.
+The contributions of this work are:
+\begin{itemize}
+\item
+allowing multiple monitors to be safely acquired \emph{simultaneously} (deadlock free), while seamlessly integrating this capability with all monitor synchronization mechanisms.
+\item
+all control-flow features respect the expectations of C programmers, with statically type-safe interfaces that integrate with the \CFA polymorphic type-system and other language features.
+\item
+experimental results show comparable performance of the new features with similar mechanisms in other concurrent programming-languages.
+\end{itemize}
+
+\begin{comment}
 This paper provides a minimal concurrency \newterm{Application Program Interface} (API) that is simple, efficient and can be used to build other concurrency features.
 While the simplest concurrency system is a thread and a lock, this low-level approach is hard to master.
@@ -281,6 +340,8 @@
 The proposed concurrency API is implemented in a dialect of C, called \CFA (pronounced C-for-all).
 The paper discusses how the language features are added to the \CFA translator with respect to parsing, semantics, and type checking, and the corresponding high-performance runtime-library to implement the concurrent features.
-
-
+\end{comment}
+
+
+\begin{comment}
 \section{\CFA Overview}
 
@@ -551,46 +612,10 @@
 \end{cfa}
 where the return type supplies the type/size of the allocation, which is impossible in most type systems.
-
-
-\section{Concurrency}
-\label{s:Concurrency}
-
-At its core, concurrency is based on multiple call-stacks and scheduling threads executing on these stacks.
-Multiple call stacks (or contexts) and a single thread of execution, called \newterm{coroutining}~\cite{Conway63,Marlin80}, does \emph{not} imply concurrency~\cite[\S~2]{Buhr05a}.
-In coroutining, the single thread is self-scheduling across the stacks, so execution is deterministic, \ie the execution path from input to output is fixed and predictable.
-A \newterm{stackless} coroutine executes on the caller's stack~\cite{Python} but this approach is restrictive, \eg preventing modularization and supporting only iterator/generator-style programming;
-a \newterm{stackful} coroutine executes on its own stack, allowing full generality.
-Only stackful coroutines are a stepping stone to concurrency.
-
-The transition to concurrency, even for execution with a single thread and multiple stacks, occurs when coroutines also context switch to a \newterm{scheduling oracle}, introducing non-determinism from the coroutine perspective~\cite[\S~3]{Buhr05a}.
-Therefore, a minimal concurrency system is possible using coroutines (see Section \ref{coroutine}) in conjunction with a scheduler to decide where to context switch next.
-The resulting execution system now follows a cooperative threading-model, called \newterm{non-preemptive scheduling}.
-
-Because the scheduler is special, it can either be a stackless or stackful coroutine.
-For stackless, the scheduler performs scheduling on the stack of the current coroutine and switches directly to the next coroutine, so there is one context switch.
-For stackful, the current coroutine switches to the scheduler, which performs scheduling, and it then switches to the next coroutine, so there are two context switches.
-A stackful scheduler is often used for simplicity and security.
-
-Regardless of the approach used, a subset of concurrency related challenges start to appear.
-For the complete set of concurrency challenges to occur, the missing feature is \newterm{preemption}, where context switching occurs randomly between any two instructions, often based on a timer interrupt, called \newterm{preemptive scheduling}.
-While a scheduler introduces uncertainty in the order of execution, preemption introduces uncertainty about where context switches occur.
-Interestingly, uncertainty is necessary for the runtime (operating) system to give the illusion of parallelism on a single processor and increase performance on multiple processors.
-The reason is that only the runtime has complete knowledge about resources and how to best utilized them.
-However, the introduction of unrestricted non-determinism results in the need for \newterm{mutual exclusion} and \newterm{synchronization} to restrict non-determinism for correctness;
-otherwise, it is impossible to write meaningful programs.
-Optimal performance in concurrent applications is often obtained by having as much non-determinism as correctness allows.
-
-An important missing feature in C is threading\footnote{While the C11 standard defines a \protect\lstinline@threads.h@ header, it is minimal and defined as optional.
-As such, library support for threading is far from widespread.
-At the time of writing the paper, neither \protect\lstinline@gcc@ nor \protect\lstinline@clang@ support \protect\lstinline@threads.h@ in their standard libraries.}.
-In modern programming languages, a lack of threading is unacceptable~\cite{Sutter05, Sutter05b}, and therefore existing and new programming languages must have tools for writing efficient concurrent programs to take advantage of parallelism.
-As an extension of C, \CFA needs to express these concepts in a way that is as natural as possible to programmers familiar with imperative languages.
-Furthermore, because C is a system-level language, programmers expect to choose precisely which features they need and which cost they are willing to pay.
-Hence, concurrent programs should be written using high-level mechanisms, and only step down to lower-level mechanisms when performance bottlenecks are encountered.
-
-
-\subsection{Coroutines: A Stepping Stone}\label{coroutine}
-
-While the focus of this discussion is concurrency and parallelism, it is important to address coroutines, which are a significant building block of a concurrency system (but not concurrent among themselves).
+\end{comment}
+
+
+\section{Coroutines: A Stepping Stone}\label{coroutine}
+
+Advanced controlWhile the focus of this discussion is concurrency and parallelism, it is important to address coroutines, which are a significant building block of a concurrency system (but not concurrent among themselves).
 Coroutines are generalized routines allowing execution to be temporarily suspended and later resumed.
 Hence, unlike a normal routine, a coroutine may not terminate when it returns to its caller, allowing it to be restarted with the values and execution location present at the point of suspension.
@@ -1060,4 +1085,41 @@
 \end{cquote}
 The combination of these two approaches allows an easy and concise specification to coroutining (and concurrency) for normal users, while more advanced users have tighter control on memory layout and initialization.
+
+
+\section{Concurrency}
+\label{s:Concurrency}
+
+At its core, concurrency is based on multiple call-stacks and scheduling threads executing on these stacks.
+Multiple call stacks (or contexts) and a single thread of execution, called \newterm{coroutining}~\cite{Conway63,Marlin80}, does \emph{not} imply concurrency~\cite[\S~2]{Buhr05a}.
+In coroutining, the single thread is self-scheduling across the stacks, so execution is deterministic, \ie the execution path from input to output is fixed and predictable.
+A \newterm{stackless} coroutine executes on the caller's stack~\cite{Python} but this approach is restrictive, \eg preventing modularization and supporting only iterator/generator-style programming;
+a \newterm{stackful} coroutine executes on its own stack, allowing full generality.
+Only stackful coroutines are a stepping stone to concurrency.
+
+The transition to concurrency, even for execution with a single thread and multiple stacks, occurs when coroutines also context switch to a \newterm{scheduling oracle}, introducing non-determinism from the coroutine perspective~\cite[\S~3]{Buhr05a}.
+Therefore, a minimal concurrency system is possible using coroutines (see Section \ref{coroutine}) in conjunction with a scheduler to decide where to context switch next.
+The resulting execution system now follows a cooperative threading-model, called \newterm{non-preemptive scheduling}.
+
+Because the scheduler is special, it can either be a stackless or stackful coroutine.
+For stackless, the scheduler performs scheduling on the stack of the current coroutine and switches directly to the next coroutine, so there is one context switch.
+For stackful, the current coroutine switches to the scheduler, which performs scheduling, and it then switches to the next coroutine, so there are two context switches.
+A stackful scheduler is often used for simplicity and security.
+
+Regardless of the approach used, a subset of concurrency related challenges start to appear.
+For the complete set of concurrency challenges to occur, the missing feature is \newterm{preemption}, where context switching occurs randomly between any two instructions, often based on a timer interrupt, called \newterm{preemptive scheduling}.
+While a scheduler introduces uncertainty in the order of execution, preemption introduces uncertainty about where context switches occur.
+Interestingly, uncertainty is necessary for the runtime (operating) system to give the illusion of parallelism on a single processor and increase performance on multiple processors.
+The reason is that only the runtime has complete knowledge about resources and how to best utilized them.
+However, the introduction of unrestricted non-determinism results in the need for \newterm{mutual exclusion} and \newterm{synchronization} to restrict non-determinism for correctness;
+otherwise, it is impossible to write meaningful programs.
+Optimal performance in concurrent applications is often obtained by having as much non-determinism as correctness allows.
+
+An important missing feature in C is threading\footnote{While the C11 standard defines a \protect\lstinline@threads.h@ header, it is minimal and defined as optional.
+As such, library support for threading is far from widespread.
+At the time of writing the paper, neither \protect\lstinline@gcc@ nor \protect\lstinline@clang@ support \protect\lstinline@threads.h@ in their standard libraries.}.
+In modern programming languages, a lack of threading is unacceptable~\cite{Sutter05, Sutter05b}, and therefore existing and new programming languages must have tools for writing efficient concurrent programs to take advantage of parallelism.
+As an extension of C, \CFA needs to express these concepts in a way that is as natural as possible to programmers familiar with imperative languages.
+Furthermore, because C is a system-level language, programmers expect to choose precisely which features they need and which cost they are willing to pay.
+Hence, concurrent programs should be written using high-level mechanisms, and only step down to lower-level mechanisms when performance bottlenecks are encountered.
 
 
Index: doc/papers/concurrency/mail
===================================================================
--- doc/papers/concurrency/mail	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ doc/papers/concurrency/mail	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -27,2 +27,415 @@
 
 Software: Practice and Experience Editorial Office
+
+
+
+Date: Wed, 3 Oct 2018 21:25:28 +0000
+From: Richard Jones <onbehalfof@manuscriptcentral.com>
+Reply-To: R.E.Jones@kent.ac.uk
+To: tdelisle@uwaterloo.ca, pabuhr@uwaterloo.ca
+Subject: Software: Practice and Experience - Decision on Manuscript ID
+ SPE-18-0205
+
+03-Oct-2018
+
+Dear Dr Buhr,
+
+Many thanks for submitting SPE-18-0205 entitled "Concurrency in C∀" to Software: Practice and Experience.
+
+In view of the comments of the referees found at the bottom of this letter, I cannot accept your paper for publication in Software: Practice and Experience. I hope that you find the referees' very detailed comments helpful.
+
+Thank you for considering Software: Practice and Experience for the publication of your research.  I hope the outcome of this specific submission will not discourage you from submitting future manuscripts.
+
+Yours sincerely,
+
+
+Prof. Richard Jones
+Editor, Software: Practice and Experience
+R.E.Jones@kent.ac.uk
+
+Referee(s)' Comments to Author:
+
+Reviewing: 1
+
+Comments to the Author
+"Concurrency in Cforall" presents a design and implementation of a set of standard concurrency features, including coroutines, user-space and kernel-space threads, mutexes, monitors, and a scheduler, for a polymorphic derivation of C called Cforall.
+
+Section 2 is an overview of sequential Cforall that does not materially contribute to the paper. A brief syntax explanation where necessary in examples would be plenty.
+
+Section 3 begins with with an extensive discussion of concurrency that also does not materially contribute to the paper. A brief mention of whether a particular approach implements cooperative or preemptive scheduling would be sufficient. Section 3 also makes some unfortunate claims, such as C not having threads -- C does in fact define threads, and this is noted as being true in a footnote, immediately after claiming that it does not. The question remains why the C11 parallelism design is insufficient and in what way this paper proposes to augment it. While I am personally a proponent of parallel programming languages, backing the assertion that all modern languages must have threading with citations from 2005 ignores the massive popularity of modern non-parallel languages (Javascript, node.js, Typescript, Python, Ruby, etc.) and parallel languages that are not thread based, although the authors are clearly aware of such approaches.
+
+Sections 3.1 and 3.2 dicusses assymetric and symmetric coroutines. This also does not seem to materially contribute to a paper that is ostensibly about concurrency in a modern systems programming language. The area of coroutines, continuations, and generators is already well explored in the context of systems languages, including compilation techniques for these constructs that are more advanced than the stack instantiation model discussed in the paper.
+
+Section 3.3 describes threads in Cforall, briefly touching on user-space vs. kernel-space thread implementations without detailing the extensive practical differences. It is unclear how the described interface differes from C++11 threads, as the description seems to center on an RAII style approach to joining in the destructor.
+
+Section 4 briefly touches on a collection of well known synchronisation primitives. Again, this discussion does not materially contribute to the paper.
+
+Section 5 describes monitors, which are a well known and well researched technique. The Cforall implementation is unsurprising. The "multi-acquire semantics" described are not a contribution of this paper, as establishing a stable order for lock acquisition is a well known technique, one example of which is the C++ std::scoped_lock.
+
+Section 6 is a discussion of scheduling that does not appear to be informed by the literature. There is no discussion of work-stealing vs. work-scheduling, static vs. dynamic priorities, priority inversion, or fairness. There is a claim in secion 6.1 for a novel technique, partial signalling, that appears to be a form of dynamic priority, but no comparison is made. In section 6.6, a very brief mention of other synchronisation techniques is made, without reference to current techniques such as array-based locks, CLH or MCS queue locks, RCU and other epoch-based mechanisms, etc. Perhaps these are considered out of scope.
+
+Section 7 discusses parallelism, but does not materially contribute to the paper. It is claimed that preemption is necessary to implement spinning, which is not correct, since two cores can implement a spinning based approach without preemption. It is claimed that with thread pools "concurrency errors return", but no approach to removing concurrency errors with either preemptive or cooperatively scheduled user threads has been proposed in the paper that would not also apply to thread pools.
+
+Section 8 is intended to describe the Cforall runtime structure, but does so in a way that uses terminology in an unfamiliar way. The word cluster is more usually used in distributed systems, but here refers to a process. The term virtual processor is more usually used in hardware virtualisation, but here refers to a kernel thread. The term debug kernel is more usually used in operating systems to refer to kernels that have both debug info and a method for using a debugger in kernel space, but here refers to a debug build of a user-space process. This section does not materially contribute to the paper.
+
+Section 9 is intended to describe the Cforall runtime implementation. It makes some unusual claims, such as C libraries migrating to stack chaining (stack chaining was an experimental GCC feature that has been abandoned, much as it has been abandoned in both Go and Rust).
+
+The performance measurements in section 10 are difficult to evaluate. While I appreciate that comparable concurrency benchmarks are very difficult to write, and the corpus of existing benchmarks primarily boils down to the parallel programs in the Computer Language Benchmark Game, the lack of detail as to what is being measured in these benchmarks (particularly when implemented in other languages) is unfortunate. For example, in table 3, the benchmark appears to measure uncontended lock access, which is not a useful micro-benchmark.
+
+It is not clear what the contributions of this paper are intended to be. A concise listing of the intended contributions would be helpful. Currently, it appears that the paper makes neither PL contributions in terms of novel features in Cforall, nor does it make systems contributions in terms of novel features in the runtime.
+
+
+Reviewing: 2
+
+Comments to the Author
+This article presents the design and rationale behind the concurrency
+features of C-forall, a new low-level programming language.  After an
+introduction that defines a selection of standard terminology, section
+2 gives crucial background on the design of the C-forall language.
+Section 3 then starts the core of the article, discussing the
+language's support for "concurrency" which in this case means
+coroutines and threads; a very brief Section 4 builds on section 3
+with a discussion of lower level synchronizations.  Section 5 the
+presents the main features of concurrency control in C-forall:
+monitors and mutexes. Section 6 then extends monitors with condition
+variables to to support scheduling, and a very brief section 7
+discusses preemption and pooling. Section 8 discusses the runtime
+conceptual model, section 9 gives implementation detail, and section
+10 briefly evaluates C-forall's performance via five concurrent
+micro benchmarks. Finally section 11 concludes the article, and then
+section 12 presents some future work.  
+
+
+At the start of section 7, article lays out its rationale: that while
+"historically, computer performance was about processor speeds" but
+"Now, high-performance applications must care about parallelism,
+which requires concurrency". The doomsayers trumpeting the death of
+Moore's law have been proved correct at last, with CPUs sequential
+performance increasing much more slowly than the number of cores
+within each die. This means programmers --- especially low-level,
+systems programmers --- must somehow manage the essential complexity
+of writing concurrent programs to run in parallel in multiple threads
+across multiple cores. Unfortunately, the most venerable widely used
+systems programming language, C, supports parallelism only via an
+e.g. the threads library.  This article aims to integrate concurrent
+programming mechanisms more closely into a novel low-level C-based
+programming language, C-forall. The article gives an outline of much of
+C-forall, presents a series of concurrency mechanisms, and finally
+some microbenchmark results.  The article is detailed, comprehensive,
+and generally well written in understandable English.
+
+My main concern about the article are indicated by the fact that the
+best summary of the problem the design of concurrent C-forall sets
+out to solve is buried more than halfway through the article in section
+7, as above, and then the best overview of the proposed solution is
+given in the 2nd, 4th and 5th sentence of the conclusion:
+
+   "The approach provides concurrency based on a preemptive M:N
+    user-level threading-system, executing in clusters, which
+    encapsulate scheduling of work on multiple kernel threads
+    providing parallelism... High-level objects (monitor/task) are the
+    core mechanism for mutual exclusion and synchronization. A novel
+    aspect is allowing multiple mutex-objects to be accessed
+    simultaneously reducing the potential for deadlock for this
+    complex scenario."
+
+That is, in my reading of the article, it proceeds bottom up rather
+than top down, and so my main recommendation is to essentially reverse
+the order of the article, proceeding from the problem to be solved,
+the high level architecture of the proposed solutions, and then going
+down to the low-level mechanisms.  My biggest problem reading the
+article was for explanations of why a particular decision was taken,
+or why a particular mechanism may be used --- often this description
+is actually later in the article, but at that point it's too late for
+the reader.  I have tried to point out most of these places in the
+detailed comments below.
+
+My second concern is that the article makes several claims that are
+not really justified by the design or implementation in the article.
+These include claims that this approach meets the expectations of C
+programmers, is minimal, is implemented in itself, etc.  The article
+doesn't generally offer evidence to support these assertions (for many
+of them, that would require empirical studies of programmers, or at
+least corpus studies). The solution here is to talk about motivations
+for the design choices "we made these decisions hoping that C
+programmers would be comfortable" rather than claims of fact "C
+programmers are comfortable".  Again I attempt to point these out below.
+
+* abstract: needs to characterize the work top down, and not make
+  claims "features respect the expectations of C programmers" that
+  are not supported empirically.
+
+* p1 line 14 "integrated"
+
+* introduction needs to introduce the big ideas and scope of the
+  article, not define terms.  Some of the terms / distinctions are
+  non-standard (e.g. the distinction between "concurrency" and
+  "parallelism") and can be avoided by using more specific terms
+  (mutual exclusion, synchronization, parallel execution. etc).
+
+* to me this article introduces novel language features, not just an
+  API.  Similarly, it doesn't talk about any additions "to the
+  language translator" - i.e compiler changes! - rather about language
+  features.
+
+
+* section 2 lines 6-9 why buy this fight against object-orientation?
+  this article doesn't need to make this argument, but needs to do a
+  better job of it if it does (see other comments below)
+
+* sec 2.1 - are these the same as C++. IF so, say so, if not, say why
+  not.
+
+* 2.2 calling it a "with statement" was confusing, given that a with
+  clause can appear in a routine declaration with a shorthand syntax.
+
+* 2.3 again compare with C++ and Java (as well as Ada)
+
+* line 9 "as we will see in section 3"
+
+* 2.4 I really quite like this syntax for operators, destructors not
+  so much.
+
+* 2.5 and many places elsewhere. Always first describe the semantics
+  of your language constructs, then describe their properties, then
+  compare with e.g. related languages (mostly C++ & Java?).  E.g in
+  this case, something like:
+
+  "C-forall includes constructors, which are called to initialize
+  newly allocated objects, and constructors, which are called when
+  objects are deallocated. Constructors and destructors are written as
+  functions returning void, under the special names "?{}" for
+  constructors and "^{}" for destructors: constructors may be
+  overridden, but destructors may not be.  The semantics of C-forall's
+  constructors and destructors are essentially those of C++."
+
+  this problem repeats many times throughout the article and should be
+  fixed everywhere.
+
+
+* 2.6 again, first describe then properties then comparison.
+   in this case, compare e.g. with C++ templates, Java/Ada generics
+   etc.
+
+* why special case forward declarations? It's not 1970 any more.
+
+* what are traits?  structural interfaces (like Go interfaces) or
+  nominal bindings?
+
+* section 3 - lines 2-30, also making very specific global definitions
+  as in the introduction. The article does not need to take on this
+  fight either, rather make clear that this is the conceptual model in
+  C-forall. (If the article starts at the top and works down, that may
+  well follow anyway).
+
+* "in modern programming languages... unacceptable"; "in a
+  system-level language.. concurrent programs should be written with
+  high-level features" - again, no need to take on these fights.
+
+* 3.1 onwards; I found all this "building" up hard to follow.
+  also it's not clear a "minimal" API must separately support
+  coroutines, threads, fibres, etc
+
+* FIG 2B - where's the output?
+  syntax "sout | next(f1) | next(f2) | endl" nowhere explained
+    why not use C++s' << and >>
+
+* FIG 3 be clearer, earlier about the coroutine" constructor syntax
+
+** ensure all figures are placed *after* their first mention in the
+   text. consider interleaving smaller snippets of text rather than
+   just referring to large figures
+
+* sec 3.1 p7 etc,. need more context / comparison e.g. Python
+  generators etc.
+
+* FIGURE 4 is this right?  should there a constructor for Cons taking
+  a Prod?
+
+
+* sec 3.2 order of constructors depends on the language.  more
+  generally, if the article is going to make arguments against OO
+  (e.g. section 2) then the article needs to explain, in detail, why
+  e.g. coroutine, thread, etc *cannot* be classes / objects.
+
+* "type coroutine_t must be an abstract handle.. descriptor and is
+  stack are non-copyable" - too many assumptions in here (and other
+  similar passages) that are not really spelled out in detail.
+
+* p10 line 4 introduces "coroutine" keyword. needs to give its
+  semantics. also needs to introduce and define properties and compare
+  before all the examples using coroutines.
+
+* p10 again, trait semantics need to be better defined 
+
+* 3.3 should be an introduction to this section. Note that section
+  titles are not part of the text of the article.
+
+* what's the difference between "coroutines" and "user threads" (and
+  "fibres?")
+
+* what's a "task type" or an "interface routine"  or "underlying
+  thread"
+
+* section 4 - "... meaningless". nope some semantics are possible
+  e.g. if there's a memory model.
+
+* whatare "call/return based languages"
+
+* p12 - what if a programmer wants to join e.g. "1st of N" or "1st 3 of N"
+  threads rather than all threads in order
+
+* 4.1 p12 13-25, again it's not clear where this is going.  presenting the model
+  top down may hopefully resolve this
+
+* section 4 should be merged e.g. into sec 3 (or 5)
+
+
+
+* section 5 p13 what's "routine" scope. "call/return paradigm"
+
+* thread/ coroutine declarations, traits etc, all look pretty close to
+  inheritance. why wouldn't inheritance work?
+
+* open/closed locks = free/acquired free locks?
+
+* testability?
+
+* p14 lines 14-20 I had trouble following this.  e.g/. what's the
+  difference between "a type that is a monitor" and "a type that looks
+  like a monitor"?  why?
+
+* line 39 - what's an "object-oriented monitor"?    Java?
+    there is no one OO model of such things.
+
+* line 47 significant asset - how do you know?
+
+* how could this e.g. build a reader/writer lock
+
+* *p15 what's the "bank account transfer problem"
+
+*p16 lines6-10  why? explain?
+
+*p17 semantics of arrays of conditions is unclear
+     given e.g. previous comments about arrays of mutexes.
+
+*p18 define "spurious wakeup"
+
+*p18 line 44 - "a number of approaches were examined"?  which
+ approaches? examined by whom?  if this is a novel contribution, needs
+ rather more there, and more comparison with related work 
+
+* FIG 8 consider e.g. sequence diagrams rather than code to show these
+  cases
+
+* 6.2 p19 line 5 "similarly, monitor routines can be added at any
+  time" really?  I thought C-forall was compiled? there's a big
+  difference between "static" and "dynamic" inheritance. which is this
+  closer to?
+
+* line 25 "FIgure 9 (B) shows the monitor implementation"
+   I didn't understand this, especially not as an implementation.
+
+* section 6.6 - if the article is to make claims about completeness,
+  about supporting low and high level operations, then this must be
+  expanded to give enough detail to support that argument
+
+* "truest realization" huh?
+
+* section 7 should be merged into 6 or 8.
+  it's not clear if this is exploring rejected alternatives,
+  out outlining different features offered by C-forall, or what.
+
+
+* sec 7.2 how do the other threads in sections 5 & 6 relate to the
+  user threads, fibres, etc here;
+
+* sec 8.1 I found these sections hard to follow. how is a cluster a
+  "collection of threads and virtual processors... like a virtual
+  machine"? Where do the thread pools from 7.3 fit in?
+
+*  sec 8.3 is out of place, probably unneeded in the paper
+
+* section 9 dives straight into details with no overview.  Section 9
+  seems very detailed, and depends on assumptions or details that are
+  not in the article.
+
+* section 10 covers only microbenchmarks. are there any moderate sized
+  macrobenchmarks that can compare across the different systems?
+  (e.g the Erlang Ring?)
+
+* sec 11 claims that "the entire C-forall runtime system are written
+  in C-forall". The article doesn't
+
+
+* future work should precede conclusion, not follow it
+
+* the article should have a related work section (2-3 pages) comparing
+  the design overall with various competing designs (C++, Java, go,
+  Rust,...)
+
+To encourage accountability, I'm signing my reviews in 2018. For the record, I am James Noble, kjx@ecs.vuw.ac.nz. 
+
+Reviewing: 3
+
+Comments to the Author
+This paper describes the design and implementation of coroutine- and thread-based concurrency in the C-for-all (I will write "C\/") system, a considerably extended form of the C language with many concurrency features.
+
+It first provides an overview of the non-concurrency-related aspects of the host language (references, operator overloading, generics, etc.), then addresses several technical issues around concurrency, including the multi-monitor design, bulk acquiring of locks (including deadlock-avoiding management of acquisition order), solutions to difficult scheduling problems around these, and implementation of monitors in the presence of separate compilation. It also presents empirical data showing the execution times of several microbenchmarks in comparison with other threaded concurrency systems, in support of the claim that the implementation is competitive with them.
+
+Overall the impression I gained is that this is a substantial system into which have gone much thought and effort.
+
+However, the present paper is not written so as to communicate sufficiently clearly the novel practices or experiences that emerged from that effort. This manifests itself in several ways.
+
+The system is described in general, rather than with a focus on novel insights or experiences. It was not until page 18 that I found a statement that hinted at a possible core contribution: "Supporting barging prevention as well as extending internal scheduling to multiple monitors is the main source of complexity in design and implementation of C\/ concurrency." Even then, it is unclear whether such challenges have already been surmounted in prior systems, or what other challenges the paper may also be covering. The most complete list of claims appears to be in the Conclusion (section 11; oddly not the last section), although not everything listed is a novel feature of the work (e.g. N:M threading models are an old idea). This presentation needs to be completely inverted, to focus from the outset on the claimed novel/noteworthy experiences that the work embodies.
+
+The text describing the system's motivation is unconvincing on one point: the claim that library support for threading in C is "far from widespread" (p5, footnote A). The pthreads library API is standardised, albeit not in the C language specification but rather in POSIX -- a widespread standard indeed. (With systems languages, even if the language does not define a feature, it of course does not follow that that feature is not available -- since such languages permit extension of their own runtime and/or toolchain.) Of course, the combination of C and pthreads does not provide close to the full complement of C\/-supported features, so it is easy to make a case for C\/'s targeted "gap in the market". But again, a presentation focused on novel aspects would bring this out and enable the reader to learn from the authors' efforts much more readily.
+
+Certain sections of the text read like a tutorial on concurrency... which is potentially valuable, but does not seem to belong here. For example, much effort is spent introducing the notions of "synchronization" and "mutual exclusion", including the whole of Section 4.2. Presently it is unclear how this content supports the findings/experiences that the paper is detailing.
+
+Similarly, section 8 reads mostly as a basic introduction to user versus kernel threading implementations (including hybrid models such as N:M scheduling), and appears superfluous to this paper. Mixed into this are details of C\/'s specific approach. These could instead be stated directly, with references to handle the unlikely case where the reader is unfamiliar.
+
+I also found the definitions of certain terms through the paper a bit non-standard, for unclear reasons. For example, why "condition lock" rather than the standard "condition variable" (if indeed that is what is intended)? To say that "synchronisation" is about "timing" strikes me as potentially confusing, since in truth synchronisation concerns only relative timing, i.e. ordering. (Even ordering is something of a derived concept -- since of course, most commonly, control over ordering is built atop synchronisation primitives, rather than being provided directly by them.)
+
+The empirical data presented is a reasonable start at characterising the implementation's performance. However, it currently suffers certain flaws.
+
+Firstly, it is not clear what is being claimed. The data cannot really be said to "verify the implementation" (section 10). Presumably the claim is that the system is competitive with other systems offering reasonably high-level concurrency constructs (Java monitors, Go channels, etc.) and/or on low-level facilities (mutexes, coroutines). A claim of this form, emphasising the latter, does eventually appear in the Conclusion, but it needs to be made explicitly during the presentation of the experiments. Shifting the focus towards higher-level features may be a better target, since this appears to be C\/'s main advance over pthreads and similar libraries.
+
+It appears some additional or alternative competitor systems might be a better match. For example, many green-thread or N:M libraries for C exist (libdill/libmill, Marcel, even GNU Pth). It would be instructive to compare with these.
+
+It would help greatly if the "functionally identical" benchmark code that was run on the competing systems were made available somewhere. Omitting it from the main text of the paper is understandable, since it would take too much space, but its details may still have a critical bearing on the results.
+
+In some cases it simply wasn't clear what is being compared. In Table 3, what are "FetchAdd + FetchSub"? I'm guessing this is some open-coded mutex using C++ atomics, but (unless I'm missing something) I cannot see an explanation in the text.
+
+The reports of variance (or, rather, standard deviation) are not always plausible. Is there really no observable variation in three of Table 3's cases? At the least, I would appreciate more detail on the measures taken to reduce run-time variance (e.g. disabling CPU throttling perhaps?).
+
+The text habitually asserts the benefits of C\/'s design without convincing argument. For example, in 2.1, do C\/'s references really reduce "syntactic noise"? I am sympathetic to the problem here, because many design trade-offs simply cannot be evaluated without very large-scale or long-term studies. However, the authors could easily refrain from extrapolating to a grand claim that cannot be substantiated. For example, instead of saying C\/ is "expressive" or "flexible" or "natural", or (say) that fork/join concurrency is "awkward and unnecessary" (p11), it would be preferable simply to give examples of the cases are captured well in the C\/ design (ideally together with any less favourable examples that illustrate the design trade-off in question) and let them speak for themselves.
+
+One thing I found confusing in the presentation of coroutines is that it elides the distinction between "coroutines" (i.e. their definitions) and activations thereof. It would be helpful to make this clearer, since at present this makes some claims/statements hard to understand. For example, much of 3.2 talks about "adding fields", which implies that a coroutine's activation state exists as fields in a structured object -- as, indeed, it does in C\/. This is non-obvious because in a more classical presentation of coroutines, their state would live not in "fields" but in local variables. Similarly, the text also talks about composition of "coroutines" as fields within other "coroutines", and so on, whereas if I understand correctly, these are also activations. (By later on in the text, the "C\/ style" of such constructs is clear, but not at first.)
+
+I was expecting a reference to Adya et al's 2002 Usenix ATC paper, on the topic of "fibers" and cooperative threading generally but also for its illustrative examples of stack ripping (maybe around "linearized code is the bane of device drivers", p7, which seems to be making a similar observation).
+
+Minor comments:
+
+The writing is rather patchy. It has many typos, and also some cases of "not meaning what is said", unclear allusions, etc.. The following is a non-exhaustive list.
+
+- p2 line 7: "C has a notion of objects" -- true, but this is not intended as "object" in anything like the same sense as "object-oriented", so raising it here is somewhere between confusing and meaningless.
+
+- lots of extraneous hyphenation e.g "inheritance-relationships", "critical-section", "mutual-exclusion", "shared-state" (as a general rule, only hyphenate noun phrases when making an adjective out of them)
+
+- p4 "impossible in most type systems" -- this is not a property of the "type system" as usually understood, merely the wider language design
+
+- p17: "release all acquired mutex types in the parameter list" should just say "release all acquired mutexes that are designated in the parameter list" (it is not "types" that are being released or acquired);
+
+- p19: "a class includes an exhaustive list of operations" -- except it is definitively *not* exhaustive, for the reasons given immediately afterwards. I do see the problem here, about separate compilation meaning that the space of functions using a particular type is not bounded at compile time, but that needs to be identified clearly as the problem. (Incidentally, one idea is that perhaps this mapping onto a dense space could be solved at link- or load-time, in preference to run-time indirection.)
+
+- p22: in 6.5, the significance of this design decision ("threads... are monitors") was still not clear to me.
+
+- p22: [user threads are] "the truest realization of concurrency" sounds like unnecessary editorializing (many systems can exist that can also encode all others, without necessarily giving one supremacy... e.g. actors can be used to encode shared-state concurrency).
+
+- p24: on line 19, the necessary feature is not "garbage collection" but precise pointer identification (which is distinct; not all GCs have it, and it has other applications besides GC)
+
+- p24: lines 32-39 are very dense and of unclear significance; an example, including code, would be much clearer.
+
+- p25: "current UNIX systems" seems to mean "Linux", so please say that or give the behaviour or some other modern Unix (I believe Solaris is somewhat different, and possibly the BSDs too). Also, in the explanation of signal dynamics, it would be useful to adopt the quotation's own terminology of "process-directed" signals. Presumably the "internal" thread-directed signals were generated using tgkill()? And presumably the timer expiry signal is left unblocked only on the thread (virtual processor) running the "simulation"? (Calling it a "simulation" is a bit odd, although I realise it is borrowing the concept of a discrete event queue.)
+
Index: driver/Makefile.in
===================================================================
--- driver/Makefile.in	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ driver/Makefile.in	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -187,5 +187,4 @@
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-ALLOCA = @ALLOCA@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
Index: driver/cfa.cc
===================================================================
--- driver/cfa.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ driver/cfa.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Tue Aug 20 13:44:49 2002
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Sep 14 23:02:59 2018
-// Update Count     : 277
+// Last Modified On : Sun Feb 10 08:28:09 2019
+// Update Count     : 281
 //
 
@@ -107,7 +107,8 @@
 	bool link = true;									// linking as well as compiling
 	bool verbose = false;								// -v flag
-	bool quiet = false;									// -quiet flag
-	bool debug = true;									// -debug flag
-	bool help = false;									// -help flag
+	bool quiet = false;								// -quiet flag
+	bool debug = true;								// -debug flag
+	bool nolib = false;								// -nolib flag
+	bool help = false;								// -help flag
 	bool CFA_flag = false;								// -CFA flag
 	bool cpp_flag = false;								// -E or -M flag, preprocessor only
@@ -162,5 +163,7 @@
 				debug = true;							// strip the debug flag
 			} else if ( arg == "-nodebug" ) {
-				debug = false;							// strip the nodebug flag
+				debug = false;							// strip the debug flag
+			} else if ( arg == "-nolib" ) {
+				nolib = true;							// strip the nodebug flag
 			} else if ( arg == "-quiet" ) {
 				quiet = true;							// strip the quiet flag
@@ -366,8 +369,8 @@
 		}  // if
 	} // if
-	const char * config = debug ? "debug": "nodebug";
+	const char * config = nolib ? "nolib" : (debug ? "debug": "nodebug");
 	string libdir = libbase + arch + "-" + config;
 
-	if ( ! dirExists( libdir ) ) {
+	if ( ! nolib && ! dirExists( libdir ) ) {
 		cerr << argv[0] << " internal error, configuration " << config << " not installed." << endl;
 		cerr << "Was looking for " << libdir << endl;
@@ -384,4 +387,9 @@
 	nargs += 1;
 
+	for ( int i = 0; i < nlibs; i += 1 ) {				// copy non-user libraries after all user libraries
+		args[nargs] = libs[i];
+		nargs += 1;
+	} // for
+
 	if ( link ) {
 		args[nargs] = "-Xlinker";
@@ -414,4 +422,6 @@
 		nargs += 1;
 		args[nargs] = "-lrt";
+		nargs += 1;
+		args[nargs] = "-lm";
 		nargs += 1;
 	} // if
@@ -488,4 +498,8 @@
 		args[nargs] = "-Wno-deprecated";
 		nargs += 1;
+#ifdef HAVE_CAST_FUNCTION_TYPE
+		args[nargs] = "-Wno-cast-function-type";
+		nargs += 1;
+#endif // HAVE_CAST_FUNCTION_TYPE
 		if ( ! std_flag ) {								// default c11, if none specified
 			args[nargs] = "-std=gnu11";
@@ -497,6 +511,4 @@
 		nargs += 1;
 		args[nargs] = ( *new string( string("-B") + Bprefix ) ).c_str();
-		nargs += 1;
-		args[nargs] = "-lm";
 		nargs += 1;
 	} else {
@@ -504,9 +516,4 @@
 		exit( EXIT_FAILURE );
 	} // if
-
-	for ( int i = 0; i < nlibs; i += 1 ) {				// copy non-user libraries after all user libraries
-		args[nargs] = libs[i];
-		nargs += 1;
-	} // for
 
 	args[nargs] = NULL;									// terminate with NULL
Index: libcfa/configure
===================================================================
--- libcfa/configure	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ libcfa/configure	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -2382,4 +2382,6 @@
 
 
+# http://git.savannah.gnu.org/gitweb/?p=autoconf-archive.git;a=blob_plain;f=m4/ax_check_compile_flag.m4
+
 
 am__api_version='1.15'
@@ -2968,5 +2970,5 @@
 	"nolib"   )
 		CONFIG_CFLAGS="-O2 -s"
-		CONFIG_CFAFLAGS="-nodebug"
+		CONFIG_CFAFLAGS="-nolib"
 		CONFIG_BUILDLIB="no"
 	;;
Index: libcfa/configure.ac
===================================================================
--- libcfa/configure.ac	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ libcfa/configure.ac	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -56,5 +56,5 @@
 	"nolib"   )
 		CONFIG_CFLAGS="-O2 -s"
-		CONFIG_CFAFLAGS="-nodebug"
+		CONFIG_CFAFLAGS="-nolib"
 		CONFIG_BUILDLIB="no"
 	;;
Index: libcfa/prelude/builtins.c
===================================================================
--- libcfa/prelude/builtins.c	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ libcfa/prelude/builtins.c	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Fri Jul 21 16:21:03 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Aug  5 21:40:38 2018
-// Update Count     : 20
+// Last Modified On : Sun Mar 10 10:52:50 2019
+// Update Count     : 31
 //
 
@@ -26,15 +26,19 @@
 // increment/decrement unification
 
-static inline forall( dtype T | { T& ?+=?( T&, one_t ); } )
-T& ++? ( T& x ) { return x += 1; }
+static inline forall( dtype T | { T & ?+=?( T &, one_t ); } )
+T & ++? ( T & x ) { return x += 1; }
 
-static inline forall( dtype T | sized(T) | { void ?{}( T&, T ); void ^?{}( T& ); T& ?+=?( T&, one_t ); } )
-T& ?++ ( T& x ) { T tmp = x; x += 1; return tmp; }
+static inline forall( dtype T | sized(T) | { void ?{}( T &, T ); void ^?{}( T & ); T & ?+=?( T &, one_t ); } )
+T & ?++ ( T & x ) { T tmp = x; x += 1; return tmp; }
 
-static inline forall( dtype T | { T& ?-=?( T&, one_t ); } )
-T& --? ( T& x ) { return x -= 1; }
+static inline forall( dtype T | { T & ?-=?( T &, one_t ); } )
+T & --? ( T & x ) { return x -= 1; }
 
-static inline forall( dtype T | sized(T) | { void ?{}( T&, T ); void ^?{}( T& ); T& ?-=?( T&, one_t ); } )
-T& ?-- ( T& x ) { T tmp = x; x -= 1; return tmp; }
+static inline forall( dtype T | sized(T) | { void ?{}( T &, T ); void ^?{}( T & ); T & ?-=?( T &, one_t ); } )
+T & ?-- ( T & x ) { T tmp = x; x -= 1; return tmp; }
+
+// universal typed pointer constant
+
+static inline forall( dtype T ) T * intptr( uintptr_t addr ) { return (T *)addr; }
 
 // exponentiation operator implementation
Index: libcfa/prelude/extras.c
===================================================================
--- libcfa/prelude/extras.c	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ libcfa/prelude/extras.c	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -1,3 +1,3 @@
-#include <stddef.h>					// size_t, ptrdiff_t
+#include <stddef.h>					// size_t, ptrdiff_t, intptr_t, uintptr_t
 #include <stdint.h>					// intX_t, uintX_t, where X is 8, 16, 32, 64
 #include <uchar.h>					// char16_t, char32_t
Index: libcfa/prelude/extras.regx
===================================================================
--- libcfa/prelude/extras.regx	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ libcfa/prelude/extras.regx	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -1,4 +1,6 @@
 typedef.* size_t;
 typedef.* ptrdiff_t;
+typedef.* intptr_t;
+typedef.* uintptr_t;
 typedef.* __int8_t;
 typedef.* __int16_t;
Index: libcfa/prelude/prelude-gen.cc
===================================================================
--- libcfa/prelude/prelude-gen.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ libcfa/prelude/prelude-gen.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -1,2 +1,17 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// prelude-gen.cc -- 
+// 
+// Author           : Rob Schluntz and Thierry Delisle
+// Created On       : Sat Feb 16 08:44:58 2019
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Mar  8 16:00:22 2019
+// Update Count     : 26
+// 
+
 #include <algorithm>
 #include <array>
@@ -11,7 +26,7 @@
 	bool hasComparison;
 } basicTypes[] = {
-	// { "char"                  , false, true , },
-	// { "signed char"           , false, true , },
-	// { "unsigned char"         , false, true , },
+	{ "char"                  , false, true , },
+	{ "signed char"           , false, true , },
+	{ "unsigned char"         , false, true , },
 	{ "signed short"          , false, true , },
 	{ "unsigned short"        , false, true , },
@@ -34,5 +49,5 @@
 #if defined(__i386__) || defined(__ia64__) || defined(__x86_64__)
 	{ "__float80"             , true , true , },
-	{ "_Float128"             , true , true , },
+	{ "__float128"            , true , true , },
 #endif
 };
@@ -150,8 +165,8 @@
 	cout << endl;
 
-	cout << "signed int ?==?( zero_t, zero_t ),							?!=?( zero_t, zero_t );" << endl;
-	cout << "signed int ?==?( one_t, one_t ),							?!=?( one_t, one_t );" << endl;
-	cout << "signed int ?==?( _Bool, _Bool ),							?!=?( _Bool, _Bool );" << endl;
-	cout << "signed int	!?( _Bool );" << endl;
+	cout << "signed int ?==?( zero_t, zero_t ),	?!=?( zero_t, zero_t );" << endl;
+	cout << "signed int ?==?( one_t, one_t ),	?!=?( one_t, one_t );" << endl;
+	cout << "signed int ?==?( _Bool, _Bool ),	?!=?( _Bool, _Bool );" << endl;
+	cout << "signed int !?( _Bool );" << endl;
 
 	for (auto op : arithmeticOperators) {
@@ -188,13 +203,15 @@
 	cout << "// Arithmetic Constructors //" << endl;
 	cout << "/////////////////////////////" << endl;
+	cout << endl;
+
 	auto otype = [](const std::string & type, bool do_volatile = false) {
-		cout << "void \t?{} ( " << type << " & );" << endl;
-		cout << "void \t?{} ( " << type << " &, " << type << " );" << endl;
-		cout << type << " \t?=? ( " << type << " &, " << type << " )";
-		if( do_volatile ) {
-			cout << ", \t?=?( volatile " << type << " &, " << type << " )";
+		cout << "void ?{} (" << type << " &);" << endl;
+		cout << "void ?{} (" << type << " &, " << type << ");" << endl;
+		cout << type << "  ?=? (" << type << " &, " << type << ")";
+		if ( do_volatile ) {
+			cout << ",  ?=?(volatile " << type << " &, " << type << ")";
 		}
 		cout << ";" << endl;
-		cout << "void \t^?{}( " << type << " & );" << endl;
+		cout << "void ^?{}( " << type << " & );" << endl;
 	};
 
@@ -202,11 +219,10 @@
 	otype("one_t");
 	otype("_Bool", true);
-	otype("char", true);
-	otype("signed char", true);
-	otype("unsigned char", true);
+	cout << endl;
 
 	for (auto type : basicTypes) {
-		cout << "void  ?{}(" << type.name << " &);" << endl;
-		cout << "void  ?{}(" << type.name << " &, " << type.name << ");" << endl;
+		cout << "void ?{}(" << type.name << " &);" << endl;
+		cout << "void ?{}(" << type.name << " &, " << type.name << ");" << endl;
+		cout << "void ?{}(" << type.name << " &, zero_t);" << endl;
 		cout << "void ^?{}(" << type.name << " &);" << endl;
 		cout << endl;
@@ -217,6 +233,8 @@
 	cout << "// Pointer Constructors //" << endl;
 	cout << "//////////////////////////" << endl;
-	cout << "forall(ftype FT) void  ?{}( FT *&, FT * );" << endl;
-	cout << "forall(ftype FT) void  ?{}( FT * volatile &, FT * );" << endl;
+	cout << endl;
+
+	cout << "forall(ftype FT) void ?{}( FT *&, FT * );" << endl;
+	cout << "forall(ftype FT) void ?{}( FT * volatile &, FT * );" << endl;
 
 	// generate qualifiers
@@ -242,10 +260,10 @@
 		for (auto cvq : qualifiersPair) {
 			for (auto is_vol : { "        ", "volatile" }) {
-				cout << "forall(dtype DT) void  ?{}(" << cvq.first << type << " * " << is_vol << " &, " << cvq.second << "DT *);" << endl;
+				cout << "forall(dtype DT) void ?{}(" << cvq.first << type << " * " << is_vol << " &, " << cvq.second << "DT *);" << endl;
 			}
 		}
 		for (auto cvq : qualifiersSingle) {
 			for (auto is_vol : { "        ", "volatile" }) {
-				cout << "forall(dtype DT) void  ?{}(" << cvq << type << " * " << is_vol << " &);" << endl;
+				cout << "forall(dtype DT) void ?{}(" << cvq << type << " * " << is_vol << " &);" << endl;
 			}
 			for (auto is_vol : { "        ", "volatile" }) {
@@ -269,6 +287,6 @@
 	cout << "forall(ftype FT) FT *			?=?( FT *	   &, zero_t );" << endl;
 	cout << "forall(ftype FT) FT *			?=?( FT * volatile &, zero_t );" << endl;
-	cout << "forall( ftype FT ) void	?{}( FT *	   & );" << endl;
-	cout << "forall( ftype FT ) void	^?{}( FT *	   & );" << endl;
+	cout << "forall(ftype FT) void	?{}( FT *	   & );" << endl;
+	cout << "forall(ftype FT) void	^?{}( FT *	   & );" << endl;
 	cout << endl;
 
@@ -277,11 +295,10 @@
 	cout << "///////////////////////" << endl;
 
-	cout << "forall( ftype FT ) FT *			?=?( FT *&, FT * );" << endl;
-	cout << "forall( ftype FT ) FT *			?=?( FT * volatile &, FT * );" << endl;
-	cout << "forall( ftype FT ) int !?( FT * );" << endl;
-	cout << "forall( ftype FT ) signed int ?==?( FT *, FT * );" << endl;
-	cout << "forall( ftype FT ) signed int ?!=?( FT *, FT * );" << endl;
-	cout << "forall( ftype FT ) FT &		 *?( FT * );" << endl;
-
+	cout << "forall(ftype FT) FT *			?=?( FT *&, FT * );" << endl;
+	cout << "forall(ftype FT) FT *			?=?( FT * volatile &, FT * );" << endl;
+	cout << "forall(ftype FT) int !?( FT * );" << endl;
+	cout << "forall(ftype FT) signed int ?==?( FT *, FT * );" << endl;
+	cout << "forall(ftype FT) signed int ?!=?( FT *, FT * );" << endl;
+	cout << "forall(ftype FT) FT &		 *?( FT * );" << endl;
 
 	for (auto op : pointerOperators) {
@@ -387,2 +404,5 @@
 }
 
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: libcfa/src/Makefile.in
===================================================================
--- libcfa/src/Makefile.in	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ libcfa/src/Makefile.in	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -415,4 +415,5 @@
 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)
 AM_V_UPP = $(am__v_UPP_@AM_V@)
Index: libcfa/src/containers/maybe.cfa
===================================================================
--- libcfa/src/containers/maybe.cfa	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ libcfa/src/containers/maybe.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 24 15:40:00 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 20 15:23:50 2017
-// Update Count     : 2
+// Last Modified On : Sun Feb 17 11:22:03 2019
+// Update Count     : 3
 //
 
@@ -39,5 +39,5 @@
 forall(otype T)
 maybe(T) ?=?(maybe(T) & this, maybe(T) that) {
-	if (this.has_value & that.has_value) {
+	if (this.has_value && that.has_value) {
 		this.value = that.value;
 	} else if (this.has_value) {
Index: libcfa/src/containers/result.cfa
===================================================================
--- libcfa/src/containers/result.cfa	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ libcfa/src/containers/result.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 24 15:40:00 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 20 15:23:58 2017
-// Update Count     : 2
+// Last Modified On : Sun Feb 17 11:24:04 2019
+// Update Count     : 3
 //
 
@@ -48,5 +48,5 @@
 forall(otype T, otype E)
 result(T, E) ?=?(result(T, E) & this, result(T, E) that) {
-	if (this.has_value & that.has_value) {
+	if (this.has_value && that.has_value) {
 		this.value = that.value;
 	} else if (this.has_value) {
Index: libcfa/src/iostream.cfa
===================================================================
--- libcfa/src/iostream.cfa	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ libcfa/src/iostream.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Dec 24 18:33:40 2018
-// Update Count     : 589
+// Last Modified On : Mon Mar  4 20:57:24 2019
+// Update Count     : 593
 //
 
@@ -27,4 +27,22 @@
 
 forall( dtype ostype | ostream( ostype ) ) {
+	ostype & ?|?( ostype & os, zero_t ) {
+		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		fmt( os, "%d", 0n );
+		return os;
+	} // ?|?
+	void ?|?( ostype & os, zero_t z ) {
+		(ostype &)(os | z); nl( os );
+	} // ?|?
+
+	ostype & ?|?( ostype & os, one_t ) {
+		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		fmt( os, "%d", 1n );
+		return os;
+	} // ?|?
+	void ?|?( ostype & os, one_t o ) {
+		(ostype &)(os | o); nl( os );
+	} // ?|?
+
 	ostype & ?|?( ostype & os, bool b ) {
 		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
Index: libcfa/src/iostream.hfa
===================================================================
--- libcfa/src/iostream.hfa	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ libcfa/src/iostream.hfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Dec 24 18:33:40 2018
-// Update Count     : 220
+// Last Modified On : Tue Feb 26 16:57:22 2019
+// Update Count     : 221
 //
 
@@ -62,4 +62,9 @@
 
 forall( dtype ostype | ostream( ostype ) ) {
+	ostype & ?|?( ostype &, zero_t );
+	void ?|?( ostype &, zero_t );
+	ostype & ?|?( ostype &, one_t );
+	void ?|?( ostype &, one_t );
+
 	ostype & ?|?( ostype &, bool );
 	void ?|?( ostype &, bool );
Index: src/BasicTypes-gen.cc
===================================================================
--- src/BasicTypes-gen.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ src/BasicTypes-gen.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,456 @@
+#include <queue>
+#include <iostream>
+#include <iomanip>
+#include <fstream>
+#include <utility>
+#include <string>
+using namespace std;
+#include <assert.h>
+#include <string.h>										// strlen
+#include "config.h"									// configure info
+
+enum Kind {
+	Bool,
+	Char,
+	SignedChar,
+	UnsignedChar,
+	ShortSignedInt,
+	ShortUnsignedInt,
+	SignedInt,
+	UnsignedInt,
+	LongSignedInt,
+	LongUnsignedInt,
+	LongLongSignedInt,
+	LongLongUnsignedInt,
+	SignedInt128,
+	UnsignedInt128,
+	uFloat16,
+	uFloat16Complex,
+	uFloat32,
+	uFloat32Complex,
+	Float,
+	FloatComplex,
+	// FloatImaginary,
+	uFloat32x,
+	uFloat32xComplex,
+	uFloat64,
+	uFloat64Complex,
+	Double,
+	DoubleComplex,
+	// DoubleImaginary,
+	uFloat64x,
+	uFloat64xComplex,
+	uuFloat80,
+	uFloat128,
+	uFloat128Complex,
+	uuFloat128,
+	LongDouble,
+	LongDoubleComplex,
+	// LongDoubleImaginary,
+	uFloat128x,
+	uFloat128xComplex,
+	NUMBER_OF_BASIC_TYPES
+};
+
+enum NumSort {											// floating point types act as both signed and unsigned
+	Signed = 0x1,
+	Unsigned = 0x2,
+	Floating = 0x3
+};
+
+struct Node {
+	Kind basicType;										// basic type
+	const char * name;									// basic-type name
+	const char * abbrev;								// internal abbreviation (documentation only)
+	const char * type;									// actual type name
+	const char * mangled;								// mangled abbreviation
+	NumSort sign;										// is this a signed integral type?
+	int left, middle, right;							// 3-ary tree, -1 => nullptr
+	int rank;											// integral rank (C standard 6.3.1.1.1, extended)
+} graph[NUMBER_OF_BASIC_TYPES] = {
+	{ Bool, "Bool", "B", "_Bool", "b", Signed, Char, SignedChar, -1, 0 }, // root
+
+	{ Char, "Char", "C", "char", "c", Signed, SignedChar, UnsignedChar, ShortSignedInt, 1 },
+	{ SignedChar, "SignedChar", "SC", "signed char", "a", Signed, UnsignedChar, ShortSignedInt, -1, 1 },
+	{ UnsignedChar, "UnsignedChar", "UC", "unsigned char", "h", Unsigned, ShortUnsignedInt, ShortSignedInt, -1, 1 },
+
+	{ ShortSignedInt, "ShortSignedInt", "SI", "signed short int", "s", Signed, ShortUnsignedInt, SignedInt, -1, 2 },
+	{ ShortUnsignedInt, "ShortUnsignedInt", "SUI", "unsigned short int", "t", Unsigned, UnsignedInt, SignedInt, -1, 2 },
+
+	{ SignedInt, "SignedInt", "I", "signed int", "i", Signed, UnsignedInt, LongSignedInt, -1, 3 },
+	{ UnsignedInt, "UnsignedInt", "UI", "unsigned int", "j", Unsigned, LongUnsignedInt, LongSignedInt, -1, 3 },
+
+	{ LongSignedInt, "LongSignedInt", "LI", "signed long int", "l", Signed, LongUnsignedInt, LongLongSignedInt, -1, 4 },
+	{ LongUnsignedInt, "LongUnsignedInt", "LUI", "unsigned long int", "m", Unsigned, LongLongSignedInt, LongLongUnsignedInt, -1, 4 },
+
+	{ LongLongSignedInt, "LongLongSignedInt", "LLI", "signed long long int", "x", Signed, LongLongUnsignedInt, SignedInt128, -1, 5 },
+	{ LongLongUnsignedInt, "LongLongUnsignedInt", "LLUI", "unsigned long long int", "y", Unsigned, SignedInt128, UnsignedInt128, -1, 5 },
+
+	{ SignedInt128, "SignedInt128", "IB", "__int128", "n", Signed, UnsignedInt128, uFloat16, -1, 6 },
+	{ UnsignedInt128, "UnsignedInt128", "UIB", "unsigned __int128", "o", Unsigned, uFloat16, -1, -1, 6 },
+
+	{ uFloat16, "uFloat16", "_FH", "_Float16", "DF16_", Floating, uFloat32, uFloat16Complex, -1, 7 },
+	{ uFloat16Complex, "uFloat16Complex", "_FH", "_Float16 _Complex", "CDF16_", Floating, uFloat32Complex, -1, -1, 7 },
+	{ uFloat32, "uFloat32", "_F", "_Float32", "DF32_", Floating, Float, uFloat32Complex, -1, 8 },
+	{ uFloat32Complex, "uFloat32Complex", "_FC", "_Float32 _Complex", "CDF32_", Floating, FloatComplex, -1, -1, 8 },
+	{ Float, "Float", "F", "float", "f", Floating, uFloat32x, FloatComplex, -1, 9 },
+	{ FloatComplex, "FloatComplex", "FC", "float _Complex", "Cf", Floating, uFloat32xComplex, -1, -1, 9 },
+	// { FloatImaginary, "FloatImaginary", "FI", "float _Imaginary", "If", false, DoubleImaginary, FloatComplex, -1, 9 },
+
+	{ uFloat32x, "uFloat32x", "_FX", "_Float32x", "DF32x_", Floating, uFloat64, uFloat32xComplex, -1, 10 },
+	{ uFloat32xComplex, "uFloat32xComplex", "_FXC", "_Float32x _Complex", "CDF32x_", Floating, uFloat64Complex, -1, -1, 10 },
+	{ uFloat64, "uFloat64", "FD", "_Float64", "DF64_", Floating, Double, uFloat64Complex, -1, 11 },
+	{ uFloat64Complex, "uFloat64Complex", "_FDC", "_Float64 _Complex", "CDF64_", Floating, DoubleComplex, -1, -1, 11 },
+	{ Double, "Double", "D", "double", "d", Floating, uFloat64x, DoubleComplex, -1, 12 },
+	{ DoubleComplex, "DoubleComplex", "DC", "double _Complex", "Cd", Floating, uFloat64xComplex, -1, -1, 12 },
+	// { DoubleImaginary, "DoubleImaginary", "DI", "double _Imaginary", "Id", false, LongDoubleImaginary, DoubleComplex, -1, 12 },
+
+	{ uFloat64x, "uFloat64x", "F80X", "_Float64x", "DF64x_", Floating, uuFloat80, uFloat64xComplex, -1, 13 },
+	{ uFloat64xComplex, "uFloat64xComplex", "_FDXC", "_Float64x _Complex", "CDF64x_", Floating, uFloat128Complex, -1, -1, 13 },
+	{ uuFloat80, "uuFloat80", "F80", "__float80", "Dq", Floating, uFloat128, uFloat64xComplex, -1, 14 },
+	{ uFloat128, "uFloat128", "_FB", "_Float128", "DF128_", Floating, uuFloat128, uFloat128Complex, -1, 15 },
+	{ uFloat128Complex, "uFloat128Complex", "_FLDC", "_Float128 _Complex", "CDF128_", Floating, LongDoubleComplex, -1, -1, 15 },
+	{ uuFloat128, "uuFloat128", "FB", "__float128", "g", Floating, LongDouble, uFloat128Complex, -1, 16 },
+	{ LongDouble, "LongDouble", "LD", "long double", "e", Floating, uFloat128x, LongDoubleComplex, -1, 17 },
+	{ LongDoubleComplex, "LongDoubleComplex", "LDC", "long double _Complex", "Ce", Floating, uFloat128xComplex, -1, -1, 17 },
+	// { LongDoubleImaginary, "LongDoubleImaginary", "LDI", "long double _Imaginary", "Ie", false, LongDoubleComplex, -1, -1, 17 },
+
+	{ uFloat128x, "uFloat128x", "_FBX", "_Float128x", "DF128x_", Floating, uFloat128xComplex, -1, -1, 18 },	
+	{ uFloat128xComplex, "uFloat128xComplex", "_FLDXC", "_Float128x _Complex", "CDF128x_", Floating, -1, -1, -1, 18 }
+}; // graph
+
+static int costMatrix[NUMBER_OF_BASIC_TYPES][NUMBER_OF_BASIC_TYPES];
+static int signMatrix[NUMBER_OF_BASIC_TYPES][NUMBER_OF_BASIC_TYPES];
+static Kind commonTypeMatrix[NUMBER_OF_BASIC_TYPES][NUMBER_OF_BASIC_TYPES];
+
+void generateCosts( int row ) {
+	bool seen[NUMBER_OF_BASIC_TYPES] = { false /*, ... */ };
+	
+	struct el_cost {
+		int i;
+		int path;
+		int sign;
+		
+		el_cost( int i = 0, int p = 0, int s = 0 ) : i(i), path(p), sign(s) {}
+		
+		// reverse the sense for use in largest-on-top priority queue
+		bool operator< (const el_cost& o) const {
+			return path > o.path || (path == o.path && sign > o.sign);
+		}
+	};
+
+	// initialize BFS queue with root of traversal
+	priority_queue< el_cost > q;
+	q.emplace( row, 0, 0 );
+
+	// BFS costs
+	do {
+		// visit cost element
+		int col = q.top().i;
+		// skip if already set
+		if ( seen[col] ) {
+			q.pop();
+			continue;
+		} else {
+			seen[col] = true;
+		} // if
+
+		// otherwise set min-costs into matrix
+		int cost = q.top().path;
+		int scost = q.top().sign;
+		costMatrix[row][col] = cost;
+		signMatrix[row][col] = scost;
+		q.pop();
+
+		// traverse children
+		int i = graph[col].left;
+		if ( i == -1 ) continue;
+		q.emplace( i, cost + 1, scost + ! (graph[col].sign & graph[i].sign) );
+
+		i = graph[col].middle;
+		if ( i == -1 ) continue;
+		q.emplace( i, cost + 1, scost + !(graph[col].sign & graph[i].sign) );
+
+		i = graph[col].right;
+		if ( i == -1 ) continue;
+		q.emplace( i, cost + 1, scost + !(graph[col].sign & graph[i].sign) );
+	} while ( ! q.empty() );
+} // generateCosts
+
+void generateCommonType( int row, int col ) {			// row <= col
+	if ( costMatrix[row][col] >= 0 ) {
+		// safe conversion from row => col
+		commonTypeMatrix[row][col] = commonTypeMatrix[col][row] = graph[col].basicType;
+	} else if ( costMatrix[col][row] >= 0 ) {
+		// safe conversion from col => row
+		commonTypeMatrix[row][col] = commonTypeMatrix[col][row] = graph[row].basicType;
+	} else {
+		// need to find least common ancestor
+		// can cheat a bit here, in that there is always a direct ancestor of the later (col) element
+		int i = graph[col].left;
+		if ( i == -1 ) assert("invalid ancestor assumption");
+		if ( costMatrix[row][i] >= 0 ) {
+			commonTypeMatrix[row][col] = commonTypeMatrix[col][row] = graph[i].basicType;
+			return;
+		} // if
+		
+		i = graph[col].middle;
+		if ( i == -1 ) assert("invalid ancestor assumption");
+		if ( costMatrix[row][i] >= 0 ) {
+			commonTypeMatrix[row][col] = commonTypeMatrix[col][row] = graph[i].basicType;
+			return;
+		} // if
+
+		i = graph[col].right;
+		if ( i == -1 ) assert("invalid ancestor assumption");
+		if ( costMatrix[row][i] >= 0 ) {
+			commonTypeMatrix[row][col] = commonTypeMatrix[col][row] = graph[i].basicType;
+			return;
+		} // if
+
+		assert("invalid ancestor assumption");
+	} // if
+} // generateCommonType
+
+void resetInput( fstream & file, const char * filename, stringstream & buffer, stringstream & code, string & str ) {
+	file.close();
+	buffer.str( "" );
+	code.str( "" );
+	file.open( filename, fstream::in );
+	if ( file.fail() ) {
+		cout << "Internal error, could not open " << filename << " for input." << endl;
+		abort();
+	} // if
+	buffer << file.rdbuf();
+	str = buffer.str();
+} // resetInput
+
+void output( fstream & file, const char * filename, stringstream & code ) {
+	file.close();
+	file.open( filename, fstream::out );
+	if ( file.fail() ) {
+		cout << "Internal error, could not open " << filename << " for output." << endl;
+		abort();
+	} // if
+	file << code.rdbuf();								// overwrite file
+} // output
+
+void Abort( const char * kind, const char * file ) {
+	cerr << "Internal error, could not find " << kind << " of generated code for " << file << endl;
+} // Abort
+
+int main() {
+	for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) { // initialization
+		for ( int c = 0; c < NUMBER_OF_BASIC_TYPES; c += 1 ) {
+			costMatrix[r][c] = -1;
+			signMatrix[r][c] = -1;
+			commonTypeMatrix[r][c] = NUMBER_OF_BASIC_TYPES;
+		} // for
+	} // for
+
+	for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) { // perform breath-first traversal to generate cost graph
+		generateCosts(r);
+	} // for
+
+	for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) { // use cost graph to find nearest-common-ancestor
+		for (int c = r; c < NUMBER_OF_BASIC_TYPES; c += 1 ) {
+			generateCommonType(r, c);
+		} // for
+	} // for
+
+	#define STARTMK "// GENERATED START, DO NOT EDIT"
+	#define ENDMK "// GENERATED END"
+	string BYMK( __FILE__ );
+	string::size_type posn = BYMK.find_last_of( "/" );
+	if ( posn != string::npos ) BYMK.erase( 0, posn - 1); // remove directories
+	BYMK = "// GENERATED BY " + BYMK;
+
+	fstream file;
+	stringstream buffer, code;
+	string str;
+	size_t start, end;
+
+
+	#define Type TOP_SRCDIR "src/SynTree/Type.h"
+	resetInput( file, Type, buffer, code, str );
+
+	if ( (start = str.find( STARTMK )) == string::npos ) Abort( "start", Type );
+	start += sizeof( STARTMK );							// includes newline
+	code << str.substr( 0, start );
+
+	code << "\t" << BYMK << endl;
+	code << "\tenum Kind {" << endl;
+	for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) {
+		code << "\t\t" << graph[r].name << "," << endl;
+	} // for	
+	code << "\t\tNUMBER_OF_BASIC_TYPES" << endl;
+	code << "\t} kind;" << endl;
+	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 );
+	// cout << code.str();
+
+	
+	#define ConversionCost TOP_SRCDIR "src/ResolvExpr/ConversionCost.cc"
+	resetInput( file, ConversionCost, buffer, code, str );
+
+	if ( (start = str.find( STARTMK )) == string::npos ) Abort( "start", ConversionCost );
+	start += sizeof( STARTMK );							// includes newline
+	code << str.substr( 0, start );
+
+	code << "\t" << BYMK << endl;
+	code << "\t/* EXTENDED INTEGRAL RANK HIERARCHY (root to leaves)" << endl;
+	for ( int c = 0; c < NUMBER_OF_BASIC_TYPES; c += 1 ) {
+		code << '\t' << left;
+		if ( graph[c].rank != graph[c + 1].rank ) {
+			code << right << setw(30) << graph[c].type << left;
+		} else if ( graph[c].rank != graph[c + 2].rank ) {
+			code << string( 10, ' ' ) << setw(25) << graph[c].type << setw(25) << graph[c + 1].type;
+			c += 1;
+		} else {
+			code << setw(20) << graph[c].type << setw(20) << graph[c + 1].type << setw(20) << graph[c + 2].type;
+			c += 2;
+		} // if
+		code << endl;
+	} // for
+	code << right << "\t*/" << endl;
+	code << "\t";										// indentation for end marker
+
+	if ( (start = str.find( ENDMK, start + 1 )) == string::npos ) Abort( "end", ConversionCost );
+	if ( (end = str.find( STARTMK, start + 1 )) == string::npos ) Abort( "start", ConversionCost );
+	end += sizeof( STARTMK );
+	code << str.substr( start, end - start );
+	
+	code << "\t" << BYMK << endl;
+	code << "\tstatic const int costMatrix[BasicType::NUMBER_OF_BASIC_TYPES][BasicType::NUMBER_OF_BASIC_TYPES] = { // path length from root to node" << endl
+		 << "\t\t/*         ";
+	for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) { // titles
+		code << setw(5) << graph[r].abbrev;
+	} // for
+	code << " */" << endl;
+	for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) { // costs
+		code << "\t\t/*" << setw(6) << graph[r].abbrev << "*/ {";
+		for ( int c = 0; c < NUMBER_OF_BASIC_TYPES; c += 1 ) {
+			code << setw(4) << costMatrix[r][c] << ",";
+		} // for
+		code << " }," << endl;
+	} // for
+	code << "\t}; // costMatrix" << endl;
+	code << "\t";										// indentation for end marker
+
+	if ( (start = str.find( ENDMK, start + 1 )) == string::npos ) Abort( "end", ConversionCost );
+	if ( (end = str.find( STARTMK, start + 1 )) == string::npos ) Abort( "start", ConversionCost );
+	end += sizeof( STARTMK );
+	code << str.substr( start, end - start );
+
+	code << "\t" << BYMK << endl;
+	code << "\tstatic const int signMatrix[BasicType::NUMBER_OF_BASIC_TYPES][BasicType::NUMBER_OF_BASIC_TYPES] = { // number of sign changes in safe conversion" << endl
+		 << "\t\t/*         ";
+	for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) { // titles
+		code << setw(5) << graph[r].abbrev;
+	} // for
+	code << " */" << endl;
+	for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) { // costs
+		code << "\t\t/*" << setw(6) << graph[r].abbrev << "*/ {";
+		for ( int c = 0; c < NUMBER_OF_BASIC_TYPES; c += 1 ) {
+			code << setw(4) << signMatrix[r][c] << ",";
+		} // for
+		code << " }," << endl;
+	} // for
+	code << "\t}; // signMatrix" << endl;
+	code << "\t";										// indentation for end marker
+
+	if ( (start = str.find( ENDMK, start + 1 )) == string::npos ) Abort( "end", ConversionCost );
+	code << str.substr( start );
+
+	output( file, ConversionCost, code );
+	// cout << code.str();
+
+
+	#define CommonType TOP_SRCDIR "src/ResolvExpr/CommonType.cc"
+	resetInput( file, CommonType, buffer, code, str );
+
+	if ( (start = str.find( STARTMK )) == string::npos ) Abort( "start", CommonType );
+	start += sizeof( STARTMK );							// includes newline
+	code << str.substr( 0, start );
+
+	enum { PER_ROW = 6 };
+	code << "\t" << BYMK << endl;
+	code << "\t#define BT BasicType::" << endl;
+	code << "\tstatic const BasicType::Kind commonTypes[BasicType::NUMBER_OF_BASIC_TYPES][BasicType::NUMBER_OF_BASIC_TYPES] = { // nearest common ancestor" << endl
+	     << "\t\t/*\t\t ";
+	for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) { // titles
+		code << setw(24) << graph[r].abbrev;
+		if ( (r+1) % PER_ROW == 0 ) {
+			code << endl << "\t\t\t\t ";
+		} // if
+	} // for
+	code << "*/" << endl;
+	for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) { // costs
+		code << "\t\t\t\t  {\n\t\t/*" << setw(6) << graph[r].abbrev << "*/";
+		for ( int c = 0; c < NUMBER_OF_BASIC_TYPES; c += 1 ) {
+			string s = string{"BT "} + graph[commonTypeMatrix[r][c]].name;
+			code << setw(23) << s << ",";
+			if ( (c+1) % PER_ROW == 0 ) {
+				code << endl << "\t\t\t\t  ";
+			} // if
+		} // for
+		code << "}," << endl;
+	} // for
+	code << "\t}; // commonTypes" << endl;
+	code << "\t#undef BT" << endl;
+	code << "\t";										// indentation for end marker
+
+	if ( (start = str.find( ENDMK, start + 1 )) == string::npos ) Abort( "end", CommonType );
+	code << str.substr( start );
+
+	output( file, CommonType, code );
+	// cout << code.str();
+
+
+	#define ManglerCommon TOP_SRCDIR "src/SymTab/ManglerCommon.cc"
+	resetInput( file, ManglerCommon, buffer, code, str );
+
+	if ( (start = str.find( STARTMK )) == string::npos ) Abort( "start", ManglerCommon );
+	start += sizeof( STARTMK );							// includes newline
+	code << str.substr( 0, start );
+
+	code << "\t\t\t// GENERATED BY " __FILE__ << endl;
+	code <<
+		"\t\t\t// NOTES ON MANGLING:\n"
+		"\t\t\t// * Itanium spec says that Float80 encodes to \"e\" (like LongDouble), but the distinct lengths cause resolution problems.\n"
+		"\t\t\t// * Float128 is supposed to encode to \"g\", but I wanted it to mangle equal to LongDouble.\n"
+		"\t\t\t// * Mangling for non-standard complex types is by best guess\n"
+		"\t\t\t// * _FloatN is supposed to encode as \"DF\"N\"_\"; modified for same reason as above.\n"
+		"\t\t\t// * unused mangling identifiers:\n"
+		"\t\t\t//   - \"z\" ellipsis\n"
+		"\t\t\t//   - \"Dd\" IEEE 754r 64-bit decimal floating point (borrowed for _Float32x)\n"
+		"\t\t\t//   - \"De\" IEEE 754r 128-bit decimal floating point\n"
+		"\t\t\t//   - \"Df\" IEEE 754r 32-bit decimal floating point\n"
+		"\t\t\t//   - \"Dh\" IEEE 754r 16-bit decimal floating point (borrowed for _Float16)\n"
+		"\t\t\t//   - \"DF\"N\"_\" ISO/IEC TS 18661 N-bit binary floating point (_FloatN)\n"
+		"\t\t\t//   - \"Di\" char32_t\n"
+		"\t\t\t//   - \"Ds\" char16_t\n";
+		
+	code << "\t\t\tconst std::string basicTypes[BasicType::NUMBER_OF_BASIC_TYPES] = {" << endl;
+	for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) {
+		code << "\t\t\t\t\"" << graph[r].mangled << "\"," << setw(9 - strlen(graph[r].mangled)) << ' ' << "// " << graph[r].type << endl;
+	} // for	
+	code << "\t\t\t}; // basicTypes" << endl;
+	code << "\t\t\t";									// indentation for end marker
+
+	if ( (start = str.find( ENDMK, start + 1 )) == string::npos ) Abort( "end", ManglerCommon );
+	code << str.substr( start );
+
+	output( file, ManglerCommon, code );
+	// cout << code.str();
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "g++-8 -Wall -Wextra BasicTypes-gen.cc" //
+// End: //
Index: src/CodeGen/module.mk
===================================================================
--- src/CodeGen/module.mk	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/CodeGen/module.mk	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -18,8 +18,11 @@
 #	ArgTweak/Mutate.cc
 
-SRC +=  CodeGen/Generate.cc \
+SRC_CODEGEN = \
 	CodeGen/CodeGenerator.cc \
+	CodeGen/FixMain.cc \
 	CodeGen/GenType.cc \
-	CodeGen/FixNames.cc \
-	CodeGen/FixMain.cc \
 	CodeGen/OperatorTable.cc
+
+
+SRC += $(SRC_CODEGEN) CodeGen/Generate.cc CodeGen/FixNames.cc
+SRCDEMANGLE += $(SRC_CODEGEN)
Index: c/Common/Heap.cc
===================================================================
--- src/Common/Heap.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ 	(revision )
@@ -1,209 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// Heap.cc --
-//
-// Author           : Thierry Delisle
-// Created On       : Thu May  3 16:16:10 2018
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Fri May  4 17:27:31 2018
-// Update Count     : 28
-//
-
-#include <cassert>
-#include <cmath>
-#include <cstddef>
-#include <cstring>
-#include <iomanip>
-#include <iostream>
-
-//#define WITH_HEAP_STATISTICS
-
-namespace HeapStats {
-#if !defined( WITH_HEAP_STATISTICS )
-	void newPass( const char * const ) {}
-
-	void printStats() {}
-#else
-	struct StatBlock {
-		const char * name  = nullptr;	///< Name of this pass
-		size_t mallocs     = 0;			///< Allocations in this pass
-		size_t frees       = 0;			///< Frees in this pass
-		size_t n_allocs    = 0;			///< Current number of live allocations
-		size_t peak_allocs = 0;			///< Peak number of live allocations this pass
-	};
-
-	StatBlock    passes[100] = {{ "Pre-Parse", 0, 0, 0, 0 }};
-	const size_t passes_size = sizeof(passes) / sizeof(passes[0]);
-	size_t       passes_cnt = 1;
-
-	void newPass( const char * const name ) {
-		passes[passes_cnt].name    = name;
-		passes[passes_cnt].mallocs = 0;
-		passes[passes_cnt].frees   = 0;
-		passes[passes_cnt].n_allocs 
-			= passes[passes_cnt].peak_allocs 
-			= passes[passes_cnt-1].n_allocs;
-		passes_cnt++;
-
-		assertf(passes_cnt < passes_size, "Too many passes for HeapStats, increase the size of the array in Heap.h");
-	}
-
-	void print(size_t value, size_t total) {
-		std::cerr << std::setw(12) << value;
-		std::cerr << "(" << std::setw(3);
-		std::cerr << (value == 0 ? 0 : value * 100 / total);
-		std::cerr << "%) | ";
-	}
-
-	void print(const StatBlock& stat, size_t nc, size_t total_mallocs, size_t total_frees, size_t overall_peak) {
-		std::cerr << std::setw(nc) << stat.name;
-		std::cerr << " | ";
-
-		print(stat.mallocs,     total_mallocs);
-		print(stat.frees,       total_frees  );
-		print(stat.peak_allocs, overall_peak );
-		std::cerr << "\n";
-	}
-
-	void print(char c, size_t nc) {
-		for(size_t i = 0; i < nc; i++) {
-			std::cerr << c;
-		}
-		std::cerr << '\n';
-	}
-
-	void printStats() {
-		size_t nc = 0;
-		size_t total_mallocs = 0;
-		size_t total_frees   = 0;
-		size_t overall_peak  = 0;
-		for(size_t i = 0; i < passes_cnt; i++) {
-			nc = std::max(nc, std::strlen(passes[i].name));
-			total_mallocs += passes[i].mallocs;
-			total_frees   += passes[i].frees;
-			overall_peak = std::max(overall_peak, passes[i].peak_allocs);
-		}
-		size_t nct = nc + 65;
-
-		const char * const title = "Heap Usage Statistic";
-		print('=', nct);
-		for(size_t i = 0; i < (nct - std::strlen(title)) / 2; i++) std::cerr << ' ';
-		std::cerr << title << std::endl;
-		print('-', nct);
-		std::cerr << std::setw(nc) << "Pass";
-		std::cerr << " |       Malloc Count |         Free Count |        Peak Allocs |" << std::endl;
-
-		print('-', nct);
-		for(size_t i = 0; i < passes_cnt; i++) {
-			print(passes[i], nc, total_mallocs, total_frees, overall_peak);
-		}
-		print('-', nct);
-		print({"Sum", total_mallocs, total_frees, 0, overall_peak}, 
-			nc, total_mallocs, total_frees, overall_peak);
-
-	}
-
-#include <stdarg.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <signal.h>
-	extern "C" {
-#include <dlfcn.h>
-#include <execinfo.h>
-	}
-
-//=============================================================================================
-// Interposing helpers
-//=============================================================================================
-
-	typedef void (* generic_fptr_t)(void);
-	generic_fptr_t interpose_symbol( const char * symbol, const char * version ) {
-		const char * error;
-
-		static void * library;
-		if ( ! library ) {
-#if defined( RTLD_NEXT )
-			library = RTLD_NEXT;
-#else
-			// missing RTLD_NEXT => must hard-code library name, assuming libstdc++
-			library = dlopen( "libc.so.6", RTLD_LAZY );
-			error = dlerror();
-			if ( error ) {
-				std::cerr << "interpose_symbol : failed to open libc, " << error << std::endl;
-				abort();
-			}
-#endif // RTLD_NEXT
-		} // if
-
-		generic_fptr_t fptr;
-
-#if defined( _GNU_SOURCE )
-		if ( version ) {
-			fptr = (generic_fptr_t)dlvsym( library, symbol, version );
-		} else {
-			fptr = (generic_fptr_t)dlsym( library, symbol );
-		}
-#else
-		fptr = (generic_fptr_t)dlsym( library, symbol );
-#endif // _GNU_SOURCE
-
-		error = dlerror();
-		if ( error ) {
-			std::cerr << "interpose_symbol : internal error, " << error << std::endl;
-			abort();
-		}
-
-		return fptr;
-	}
-
-	extern "C" {
-		void * malloc( size_t size ) __attribute__((malloc));
-		void * malloc( size_t size ) {
-			static auto __malloc = reinterpret_cast<void * (*)(size_t)>(interpose_symbol( "malloc", nullptr ));
-			if( passes_cnt > 0 ) {
-				passes[passes_cnt - 1].mallocs++;
-				passes[passes_cnt - 1].n_allocs++;
-				passes[passes_cnt - 1].peak_allocs 
-					= std::max(passes[passes_cnt - 1].peak_allocs, passes[passes_cnt - 1].n_allocs);
-			}
-			return __malloc( size );
-		}
-
-		void free( void * ptr ) {
-			static auto __free = reinterpret_cast<void   (*)(void *)>(interpose_symbol( "free", nullptr ));
-			if( passes_cnt > 0 ) {
-				passes[passes_cnt - 1].frees++;
-				passes[passes_cnt - 1].n_allocs--;
-			}
-			return __free( ptr );
-		}
-
-		void * calloc( size_t nelem, size_t size ) {
-			static auto __calloc = reinterpret_cast<void * (*)(size_t, size_t)>(interpose_symbol( "calloc", nullptr ));
-			if( passes_cnt > 0 ) {
-				passes[passes_cnt - 1].mallocs++;
-				passes[passes_cnt - 1].n_allocs++;
-				passes[passes_cnt - 1].peak_allocs 
-					= std::max(passes[passes_cnt - 1].peak_allocs, passes[passes_cnt - 1].n_allocs);
-			}
-			return __calloc( nelem, size );
-		}
-
-		void * realloc( void * ptr, size_t size ) {
-			static auto __realloc = reinterpret_cast<void * (*)(void *, size_t)>(interpose_symbol( "realloc", nullptr ));
-			void * s = __realloc( ptr, size );
-			if ( s != ptr && passes_cnt > 0 ) {			// did realloc get new storage ?
-				passes[passes_cnt - 1].mallocs++;
-				passes[passes_cnt - 1].frees++;
-			} // if
-			return s;
-		}
-	}
-#endif
-}
Index: c/Common/Heap.h
===================================================================
--- src/Common/Heap.h	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ 	(revision )
@@ -1,21 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// Heap.h --
-//
-// Author           : Thierry Delisle
-// Created On       : Thu May  3 16:16:10 2018
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Fri May  4 14:34:08 2018
-// Update Count     : 3
-//
-
-#pragma once
-
-namespace HeapStats {
-	void newPass( const char * const name );
-	void printStats();
-}
Index: src/Common/PassVisitor.cc
===================================================================
--- src/Common/PassVisitor.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ src/Common/PassVisitor.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,18 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2019 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// PassVisitor.cc --
+//
+// Author           : Thierry Delisle
+// Created On       : Fri Mar 03 14:53:53 2019
+// Last Modified By :
+// Last Modified On :
+// Update Count     :
+//
+
+#include "Common/PassVisitor.h"
+
+PassVisitorStats pass_visitor_stats;
Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/Common/PassVisitor.h	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -5,4 +5,5 @@
 #include <stack>
 
+#include "Common/Stats.h"
 #include "Common/utility.h"
 
@@ -426,4 +427,12 @@
 };
 
+#include "Common/Stats.h"
+
+extern struct PassVisitorStats {
+	size_t depth = 0;
+	Stats::Counters::MaxCounter<double> * max = nullptr;
+	Stats::Counters::AverageCounter<double> * avg = nullptr;
+} pass_visitor_stats;
+
 #include "SynTree/TypeSubstitution.h"
 #include "PassVisitor.impl.h"
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/Common/PassVisitor.impl.h	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -67,5 +67,10 @@
 	SemanticErrorException errors;
 
+	pass_visitor_stats.depth++;
+	pass_visitor_stats.max->push(pass_visitor_stats.depth);
+	pass_visitor_stats.avg->push(pass_visitor_stats.depth);
 	for ( std::list< Declaration* >::iterator i = decls.begin(); ; ++i ) {
+
+
 		// splice in new declarations after previous decl
 		if ( !empty( afterDecls ) ) { decls.splice( i, *afterDecls ); }
@@ -83,4 +88,5 @@
 		if ( !empty( beforeDecls ) ) { decls.splice( i, *beforeDecls ); }
 	}
+	pass_visitor_stats.depth--;
 	if ( ! errors.isEmpty() ) {
 		throw errors;
@@ -94,4 +100,7 @@
 	SemanticErrorException errors;
 
+	pass_visitor_stats.depth++;
+	pass_visitor_stats.max->push(pass_visitor_stats.depth);
+	pass_visitor_stats.avg->push(pass_visitor_stats.depth);
 	for ( std::list< Declaration* >::iterator i = decls.begin(); ; ++i ) {
 		// splice in new declarations after previous decl
@@ -109,4 +118,5 @@
 		if ( !empty( beforeDecls ) ) { decls.splice( i, *beforeDecls ); }
 	}
+	pass_visitor_stats.depth--;
 	if ( ! errors.isEmpty() ) {
 		throw errors;
@@ -126,4 +136,8 @@
 	if ( ! visitor.get_visit_children() ) return;
 	SemanticErrorException errors;
+
+	pass_visitor_stats.depth++;
+	pass_visitor_stats.max->push(pass_visitor_stats.depth);
+	pass_visitor_stats.avg->push(pass_visitor_stats.depth);
 	for ( typename Container::iterator i = container.begin(); i != container.end(); ++i ) {
 		try {
@@ -135,4 +149,5 @@
 		}
 	}
+	pass_visitor_stats.depth--;
 	if ( ! errors.isEmpty() ) {
 		throw errors;
@@ -153,4 +168,8 @@
 	if ( ! mutator.get_visit_children() ) return;
 	SemanticErrorException errors;
+
+	pass_visitor_stats.depth++;
+	pass_visitor_stats.max->push(pass_visitor_stats.depth);
+	pass_visitor_stats.avg->push(pass_visitor_stats.depth);
 	for ( typename Container::iterator i = container.begin(); i != container.end(); ++i ) {
 		try {
@@ -163,4 +182,5 @@
 		} // try
 	} // for
+	pass_visitor_stats.depth--;
 	if ( ! errors.isEmpty() ) {
 		throw errors;
@@ -185,4 +205,7 @@
 	DeclList_t* afterDecls  = get_afterDecls();
 
+	pass_visitor_stats.depth++;
+	pass_visitor_stats.max->push(pass_visitor_stats.depth);
+	pass_visitor_stats.avg->push(pass_visitor_stats.depth);
 	for ( std::list< Statement* >::iterator i = statements.begin(); i != statements.end(); ++i ) {
 
@@ -202,4 +225,5 @@
 		if ( !empty( beforeStmts ) ) { statements.splice( i, *beforeStmts ); }
 	}
+	pass_visitor_stats.depth--;
 
 	if ( !empty( afterDecls ) ) { splice( std::back_inserter( statements ), afterDecls); }
Index: src/Common/Stats.h
===================================================================
--- src/Common/Stats.h	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ src/Common/Stats.h	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,49 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2019 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// Stats.h --
+//
+// Author           : Thierry Delisle
+// Created On       : Thu Feb 28 11::27:10 2019
+// Last Modified By :
+// Last Modified On :
+// Update Count     :
+//
+
+#pragma once
+
+// Entry point for compiler analytics.
+/*
+The compiler currently supports 3 times of analytics:
+	 - generic counters
+	 - heap statistics
+	 - timiing statistics
+
+These can be enabled using the --stats option, to which a comma seperated list of options can be passed.
+For more details see Stats.cc
+
+Counters:
+	The counters are a generic tree of counters that print in a 2-column output format.
+	They can count maximums, averages, totals, etc.
+
+	Currently all counters are under the same enable block, this could be changed if needed.
+
+Heap:
+	Measures the total calls malloc and free as the peak number of allocations per pass
+
+Timing:
+	Comming soon
+*/
+
+
+#include "Common/Stats/Counter.h"
+#include "Common/Stats/Heap.h"
+#include "Common/Stats/Time.h"
+
+namespace Stats {
+	void parse_params(const char * const params);
+	void print();
+}
Index: src/Common/Stats/Base.h
===================================================================
--- src/Common/Stats/Base.h	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ src/Common/Stats/Base.h	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,86 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2019 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// Heap.h --
+//
+// Author           : Thierry Delisle
+// Created On       : Fri Mar 03 14:53:53 2019
+// Last Modified By :
+// Last Modified On :
+// Update Count     :
+//
+
+#pragma once
+
+#include <cstdint>
+#include <iostream>
+
+namespace Stats {
+	namespace Base {
+		class TreeImpl;
+
+		struct TreeTop {
+			TreeImpl * head = nullptr;
+			TreeImpl * tail = nullptr;
+
+			inline void append(TreeImpl * node);
+		};
+
+		template<typename func_t>
+		void ForAll(TreeTop & range, std::size_t level, func_t func, bool destroy = false);
+
+		class TreeImpl {
+		public:
+			virtual void print(std::ostream &) = 0;
+
+			const char * const name;
+			TreeImpl(const char * const name) : name(name) {}
+
+		protected:
+			virtual ~TreeImpl() = default;
+
+			TreeImpl * next = nullptr;
+			TreeTop children;
+
+			friend struct TreeTop;
+
+			template<typename func_t>
+			friend void ForAll(TreeTop & range, std::size_t level, func_t func, bool destroy);
+		};
+
+		void TreeTop::append(TreeImpl * node) {
+			if(!head) { head = node; }
+			else      { tail->next = node;}
+			tail = node;
+		}
+
+		template<typename func_t>
+		inline void ForAll(TreeTop & range, std::size_t level, func_t func, bool destroy) {
+			auto it = range.head;
+			while(it) {
+				auto next = it->next;
+				func(it, level);
+				ForAll(it->children, level + 1, func);
+				if(destroy) delete it;
+				it = next;
+			}
+		}
+
+		template<TreeTop & top>
+		class Tree : public TreeImpl {
+		public:
+			Tree(const char * const name) : TreeImpl{name} {
+				top.append(this);
+			}
+
+			Tree(const char * const name, Tree * parent) : TreeImpl{name} {
+				parent->children.append(this);
+			}
+		protected:
+			virtual ~Tree() = default;
+		};
+	}
+}
Index: src/Common/Stats/Counter.cc
===================================================================
--- src/Common/Stats/Counter.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ src/Common/Stats/Counter.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,58 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2019 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// Counter.cc --
+//
+// Author           : Thierry Delisle
+// Created On       : Thu Feb 28 13::27:10 2019
+// Last Modified By :
+// Last Modified On :
+// Update Count     :
+//
+
+#include "Counter.h"
+
+#include <algorithm>
+#include <cstring>
+#include <functional>
+#include <iomanip>
+
+namespace Stats {
+	namespace Counters {
+		void print() {
+			if(!top.head) return;
+			size_t nc = 0;
+			Base::ForAll(top, 0, [&](Base::TreeImpl * node, size_t level) {
+				nc = std::max(nc, (4 * level) + std::strlen(node->name));
+			});
+
+			const char * const title = "Counter Statistic";
+			size_t nct = nc + 14;
+			std::cerr << std::string(nct, '=') << std::endl;
+			std::cerr << std::string((nct - std::strlen(title)) / 2, ' ');
+			std::cerr << title << std::endl;
+			std::cerr << std::string(nct, '-') << std::endl;
+
+
+			Base::ForAll(top, 0, [&](Base::TreeImpl * node, size_t level) {
+				std::cerr << std::string(level * 4, ' ');
+				std::cerr << node->name;
+				std::cerr << std::string(nc - ((level * 4) + std::strlen(node->name)), ' ');
+				std::cerr << " | ";
+				std::cerr << std::setw(9);
+				node->print(std::cerr);
+				std::cerr << " |";
+				std::cerr << '\n';
+			}, true);
+
+			std::cerr << std::string(nct, '-') << std::endl;
+		}
+
+		Base::TreeTop top;
+
+		extern bool enabled;
+	}
+}
Index: src/Common/Stats/Counter.h
===================================================================
--- src/Common/Stats/Counter.h	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ src/Common/Stats/Counter.h	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,144 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2019 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// Counter.h --
+//
+// Author           : Thierry Delisle
+// Created On       : Thu Feb 28 12::05:10 2019
+// Last Modified By :
+// Last Modified On :
+// Update Count     :
+//
+
+#pragma once
+
+#include <cstdint>
+#include <iostream>
+
+#include "Common/Stats/Base.h"
+
+#if defined( NO_STATISTICS )
+	#define NO_COUNTER_STATISTICS
+#endif
+
+namespace Stats {
+	namespace Counters {
+# 		if defined(NO_COUNTERS_STATISTICS)
+
+			static inline void print() {}
+
+			class CounterGroup {
+			public:
+			};
+
+			class SimpleCounter {
+			public:
+				inline void operator++(int) {}
+				inline void operator+=(size_t) {}
+			};
+
+			template<typename T>
+			class AverageCounter {
+			public:
+				inline void push(T value) {}
+			};
+
+			template<typename T>
+			class MaxCounter {
+			public:
+				inline void push(T value) {}
+			};
+
+			template<typename counter_t>
+			counter_t * build(const char * const name) {
+				return nullptr;
+			}
+
+			template<typename counter_t>
+			counter_t * build(const char * const name, Base::Tree<top> * parent) {
+					return nullptr;
+			}
+#		else
+			extern bool enabled;
+
+			extern Base::TreeTop top;
+
+			class CounterGroup : public Base::Tree<top> {
+			public:
+				CounterGroup(const char * const name ) : Base::Tree<top>(name) {}
+				CounterGroup(const char * const name, Base::Tree<top> * parent) : Base::Tree<top>(name, parent) {}
+
+				virtual void print(std::ostream & os) override { os << ""; }
+			protected:
+				virtual ~CounterGroup() = default;
+			};
+
+			class SimpleCounter : public Base::Tree<top> {
+			public:
+				SimpleCounter(const char * const name ) : Base::Tree<top>(name) {}
+				SimpleCounter(const char * const name, Base::Tree<top> * parent) : Base::Tree<top>(name, parent) {}
+
+				virtual void print(std::ostream & os) override { os << count; }
+
+				inline void operator++(int)          { if(!enabled) return; count++;        }
+				inline void operator+=(size_t value) { if(!enabled) return; count += value; }
+
+			protected:
+				virtual ~SimpleCounter() = default;
+
+			private:
+				size_t count = 0;
+			};
+
+			template<typename T>
+			class AverageCounter : public Base::Tree<top> {
+			public:
+				AverageCounter(const char * const name ) : Base::Tree<top>(name), sum{} {}
+				AverageCounter(const char * const name, Base::Tree<top> * parent) : Base::Tree<top>(name, parent), sum{} {}
+
+				virtual void print(std::ostream & os) { os << sum / count; }
+
+				inline void push(T value) { if(!enabled) return; sum += value; count++; }
+
+			protected:
+				virtual ~AverageCounter() = default;
+
+			private:
+				T sum;
+				size_t count = 1;
+			};
+
+			template<typename T>
+			class MaxCounter : public Base::Tree<top> {
+			public:
+				MaxCounter(const char * const name ) : Base::Tree<top>(name), max{} {}
+				MaxCounter(const char * const name, Base::Tree<top> * parent) : Base::Tree<top>(name, parent), max{} {}
+
+				virtual void print(std::ostream & os) { os << max; }
+
+				inline void push(T value) { if(!enabled) return; max = std::max(max, value); }
+
+			protected:
+				virtual ~MaxCounter() = default;
+
+			private:
+				T max;
+			};
+
+			template<typename counter_t>
+			counter_t * build(const char * const name) {
+				if(!enabled) return nullptr;
+				return new counter_t(name);
+			}
+
+			template<typename counter_t>
+			counter_t * build(const char * const name, Base::Tree<top> * parent) {
+				if(!enabled) return nullptr;
+				return new counter_t(name, parent);
+			}
+#		endif
+	}
+}
Index: src/Common/Stats/Heap.cc
===================================================================
--- src/Common/Stats/Heap.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ src/Common/Stats/Heap.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,217 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// Heap.cc --
+//
+// Author           : Thierry Delisle
+// Created On       : Thu May  3 16:16:10 2018
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri May  4 17:27:31 2018
+// Update Count     : 28
+//
+
+#include <cassert>
+#include <cmath>
+#include <cstddef>
+#include <cstring>
+#include <iomanip>
+#include <iostream>
+
+#if defined( NO_STATISTICS )
+	#define NO_HEAP_STATISTICS
+#endif
+
+namespace Stats {
+	namespace Heap {
+#if defined( NO_HEAP_STATISTICS )
+		void newPass( const char * const ) {}
+
+		void print() {}
+#else
+		extern bool enabled;
+
+		struct StatBlock {
+			const char * name  = nullptr;	///< Name of this pass
+			size_t mallocs     = 0;			///< Allocations in this pass
+			size_t frees       = 0;			///< Frees in this pass
+			size_t n_allocs    = 0;			///< Current number of live allocations
+			size_t peak_allocs = 0;			///< Peak number of live allocations this pass
+		};
+
+		StatBlock    passes[100] = {{ "Pre-Parse", 0, 0, 0, 0 }};
+		const size_t passes_size = sizeof(passes) / sizeof(passes[0]);
+		size_t       passes_cnt = 1;
+
+		void newPass( const char * const name ) {
+			passes[passes_cnt].name    = name;
+			passes[passes_cnt].mallocs = 0;
+			passes[passes_cnt].frees   = 0;
+			passes[passes_cnt].n_allocs
+				= passes[passes_cnt].peak_allocs
+				= passes[passes_cnt-1].n_allocs;
+			passes_cnt++;
+
+			assertf(passes_cnt < passes_size, "Too many passes for Stats::Heap, increase the size of the array in Heap.cc");
+		}
+
+		void print(size_t value, size_t total) {
+			std::cerr << std::setw(12) << value;
+			std::cerr << "(" << std::setw(3);
+			std::cerr << (value == 0 ? 0 : value * 100 / total);
+			std::cerr << "%) | ";
+		}
+
+		void print(const StatBlock& stat, size_t nc, size_t total_mallocs, size_t total_frees, size_t overall_peak) {
+			std::cerr << std::setw(nc) << stat.name;
+			std::cerr << " | ";
+
+			print(stat.mallocs,     total_mallocs);
+			print(stat.frees,       total_frees  );
+			print(stat.peak_allocs, overall_peak );
+			std::cerr << "\n";
+		}
+
+		void print(char c, size_t nc) {
+			for(size_t i = 0; i < nc; i++) {
+				std::cerr << c;
+			}
+			std::cerr << '\n';
+		}
+
+		void print() {
+			if(!enabled) return;
+
+			size_t nc = 0;
+			size_t total_mallocs = 0;
+			size_t total_frees   = 0;
+			size_t overall_peak  = 0;
+			for(size_t i = 0; i < passes_cnt; i++) {
+				nc = std::max(nc, std::strlen(passes[i].name));
+				total_mallocs += passes[i].mallocs;
+				total_frees   += passes[i].frees;
+				overall_peak = std::max(overall_peak, passes[i].peak_allocs);
+			}
+			size_t nct = nc + 65;
+
+			const char * const title = "Heap Usage Statistic";
+			print('=', nct);
+			for(size_t i = 0; i < (nct - std::strlen(title)) / 2; i++) std::cerr << ' ';
+			std::cerr << title << std::endl;
+			print('-', nct);
+			std::cerr << std::setw(nc) << "Pass";
+			std::cerr << " |       Malloc Count |         Free Count |        Peak Allocs |" << std::endl;
+
+			print('-', nct);
+			for(size_t i = 0; i < passes_cnt; i++) {
+				print(passes[i], nc, total_mallocs, total_frees, overall_peak);
+			}
+			print('-', nct);
+			print({"Sum", total_mallocs, total_frees, 0, overall_peak},
+				nc, total_mallocs, total_frees, overall_peak);
+
+		}
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <signal.h>
+		extern "C" {
+#include <dlfcn.h>
+#include <execinfo.h>
+		}
+
+	//=============================================================================================
+	// Interposing helpers
+	//=============================================================================================
+
+		typedef void (* generic_fptr_t)(void);
+		generic_fptr_t interpose_symbol( const char * symbol, const char * version ) {
+			const char * error;
+
+			static void * library;
+			if ( ! library ) {
+#				if defined( RTLD_NEXT )
+					library = RTLD_NEXT;
+#				else
+					// missing RTLD_NEXT => must hard-code library name, assuming libstdc++
+					library = dlopen( "libc.so.6", RTLD_LAZY );
+					error = dlerror();
+					if ( error ) {
+						std::cerr << "interpose_symbol : failed to open libc, " << error << std::endl;
+						abort();
+					}
+#				endif // RTLD_NEXT
+			} // if
+
+			generic_fptr_t fptr;
+
+#			if defined( _GNU_SOURCE )
+				if ( version ) {
+					fptr = (generic_fptr_t)dlvsym( library, symbol, version );
+				} else {
+					fptr = (generic_fptr_t)dlsym( library, symbol );
+				}
+#			else
+				fptr = (generic_fptr_t)dlsym( library, symbol );
+#			endif // _GNU_SOURCE
+
+			error = dlerror();
+			if ( error ) {
+				std::cerr << "interpose_symbol : internal error, " << error << std::endl;
+				abort();
+			}
+
+			return fptr;
+		}
+
+		extern "C" {
+			void * malloc( size_t size ) __attribute__((malloc));
+			void * malloc( size_t size ) {
+				static auto __malloc = reinterpret_cast<void * (*)(size_t)>(interpose_symbol( "malloc", nullptr ));
+				if( enabled && passes_cnt > 0 ) {
+					passes[passes_cnt - 1].mallocs++;
+					passes[passes_cnt - 1].n_allocs++;
+					passes[passes_cnt - 1].peak_allocs
+						= std::max(passes[passes_cnt - 1].peak_allocs, passes[passes_cnt - 1].n_allocs);
+				}
+				return __malloc( size );
+			}
+
+			void free( void * ptr ) {
+				static auto __free = reinterpret_cast<void   (*)(void *)>(interpose_symbol( "free", nullptr ));
+				if( enabled && passes_cnt > 0 ) {
+					passes[passes_cnt - 1].frees++;
+					passes[passes_cnt - 1].n_allocs--;
+				}
+				return __free( ptr );
+			}
+
+			void * calloc( size_t nelem, size_t size ) {
+				static auto __calloc = reinterpret_cast<void * (*)(size_t, size_t)>(interpose_symbol( "calloc", nullptr ));
+				if( enabled && passes_cnt > 0 ) {
+					passes[passes_cnt - 1].mallocs++;
+					passes[passes_cnt - 1].n_allocs++;
+					passes[passes_cnt - 1].peak_allocs
+						= std::max(passes[passes_cnt - 1].peak_allocs, passes[passes_cnt - 1].n_allocs);
+				}
+				return __calloc( nelem, size );
+			}
+
+			void * realloc( void * ptr, size_t size ) {
+				static auto __realloc = reinterpret_cast<void * (*)(void *, size_t)>(interpose_symbol( "realloc", nullptr ));
+				void * s = __realloc( ptr, size );
+				if ( enabled && s != ptr && passes_cnt > 0 ) {			// did realloc get new storage ?
+					passes[passes_cnt - 1].mallocs++;
+					passes[passes_cnt - 1].frees++;
+				} // if
+				return s;
+			}
+		}
+#endif
+	}
+}
Index: src/Common/Stats/Heap.h
===================================================================
--- src/Common/Stats/Heap.h	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ src/Common/Stats/Heap.h	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,23 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// Heap.h --
+//
+// Author           : Thierry Delisle
+// Created On       : Thu May  3 16:16:10 2018
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri May  4 14:34:08 2018
+// Update Count     : 3
+//
+
+#pragma once
+
+namespace Stats {
+	namespace Heap {
+		void newPass( const char * const name );
+		void print();
+	}
+}
Index: src/Common/Stats/Stats.cc
===================================================================
--- src/Common/Stats/Stats.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ src/Common/Stats/Stats.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,86 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2019 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// Stats.cc --
+//
+// Author           : Thierry Delisle
+// Created On       : Fri Mar 01 15:45:08 2019
+// Last Modified By :
+// Last Modified On :
+// Update Count     :
+//
+
+#include <iostream>
+#include <sstream>
+#include <string>
+
+
+namespace Stats {
+	namespace Counters {
+		bool enabled = false;
+		void print();
+	}
+
+	namespace Heap {
+		bool enabled = false;
+		void print();
+	}
+
+	namespace Time {
+		bool enabled = false;
+		void print();
+	}
+
+	struct {
+		const char * const opt;
+		bool & enabled;
+	}
+	statistics[] = {
+		{ "counters", Counters::enabled },
+		{ "heap"    , Heap::enabled },
+		{ "time"    , Time::enabled },
+	};
+
+	void set_param(std::string & param) {
+		if(param == "all") {
+			for(auto & stat : statistics) {
+				stat.enabled = true;
+			}
+			return;
+		}
+
+		if(param == "none") {
+			for(auto & stat : statistics) {
+				stat.enabled = false;
+			}
+			return;
+		}
+
+		for(auto & stat : statistics) {
+			if(stat.opt == param) {
+				stat.enabled = true;
+				return;
+			}
+		}
+
+		std::cerr << "Ignoring unknown statistic " << param << std::endl;
+	}
+
+	void parse_params(const char * const params) {
+		std::stringstream ss(params);
+		while(ss.good()) {
+			std::string substr;
+			getline( ss, substr, ',' );
+			set_param(substr);
+		}
+	}
+
+	void print() {
+		Counters::print();
+		Heap::print();
+		Time::print();
+	}
+}
Index: src/Common/Stats/Time.cc
===================================================================
--- src/Common/Stats/Time.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ src/Common/Stats/Time.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,199 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2019 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// Time.cc --
+//
+// Author           : Thierry Delisle
+// Created On       : Mon Mar 04 15:16:07 2019
+// Last Modified By :
+// Last Modified On :
+// Update Count     :
+//
+
+#include "Time.h"
+
+#include <cassert>
+#include <chrono>
+#include <cstdint>
+#include <cstring>
+#include <iostream>
+#include <iomanip>
+#include <stack>
+
+namespace Stats {
+	namespace Time {
+#		if !defined(NO_TIME_STATISTICS)
+			extern bool enabled;
+
+			Base::TreeTop top;
+
+			typedef  std::chrono::time_point<std::chrono::high_resolution_clock> point_t;
+			std::chrono::duration<double> total;
+
+			point_t global_begin;
+
+			int prevl = 0;
+			int currl = 0;
+
+			template<typename T>
+			static inline std::ostream & operator<<(std::ostream & os, const std::chrono::duration<T> & dd) {
+				auto d = std::chrono::duration_cast<std::chrono::milliseconds>(dd);
+				auto minutes = std::chrono::duration_cast<std::chrono::minutes>(d);
+				auto seconds = std::chrono::duration_cast<std::chrono::seconds>(d % std::chrono::minutes(1));
+				auto millis  = std::chrono::duration_cast<std::chrono::milliseconds>(d % std::chrono::seconds(1));
+
+				bool zmin = minutes == minutes.zero();
+				bool zsec = seconds == seconds.zero();
+				bool zmil = millis  == millis .zero();
+
+				if(!zmin) {
+					os << std::setw(4) << minutes.count() << "m";
+				} else {
+					os << std::string(5, ' ');
+				}
+
+				if(!zmin || !zsec) {
+					if(!zmin) os << std::setfill('0');
+					os << std::setw(2) << seconds.count() << "s";
+				} else {
+					os << std::string(3, ' ');
+				}
+				os << std::setfill(' ');
+
+				if(!zmin || !zsec || !zmil) {
+					if(!zmin || !zsec) os << std::setfill('0');
+					os << std::setw(3) << millis .count();
+				} else {
+					os << std::string(4, ' ');
+				}
+				os << std::setfill(' ');
+
+				return os;
+			}
+
+			class TimerNode : public Base::Tree<top> {
+			public:
+				TimerNode(const char * const name )
+					: Base::Tree<top>(name)
+				{}
+
+				TimerNode(const char * const name, Base::Tree<top> * parent)
+					: Base::Tree<top>(name, parent)
+
+				{}
+
+				virtual void print(std::ostream & os) override {
+					if(currl > prevl) {
+						parents.push(last);
+					}
+					for(auto lvl = prevl - currl; lvl > 0; lvl--) {
+						parents.pop();
+					}
+					last = end - begin;
+
+					assert(finished);
+					std::chrono::duration<double> diff = end - begin;
+					os << diff << " | ";
+					if(parents.empty()) {
+						os << "     N/A | ";
+					} else {
+						os << std::setw(7) << std::setprecision(0);
+						os << size_t(100.0 * diff.count() / parents.top().count()) << "% | ";
+					}
+					os << std::setw(5) << std::setprecision(0);
+					os << size_t(100.0 * diff.count() / total.count()) << "% ";
+				}
+
+				void start() {
+					begin = std::chrono::high_resolution_clock::now();
+				}
+
+				void finish() {
+					end = std::chrono::high_resolution_clock::now();
+					finished = true;
+				}
+
+			protected:
+				virtual ~TimerNode() = default;
+
+			private:
+				bool finished = false;
+
+				point_t begin;
+				point_t end;
+
+				static std::chrono::duration<double> last;
+				static std::stack<std::chrono::duration<double>> parents;
+			};
+
+			std::stack<TimerNode *> nodes;
+
+			std::chrono::duration<double> TimerNode::last;
+			std::stack<std::chrono::duration<double>> TimerNode::parents;
+
+			void StartGlobal() {
+				global_begin = std::chrono::high_resolution_clock::now();
+			}
+
+			void StartBlock(const char * const name) {
+				if(!enabled) return;
+				auto node = nodes.empty()
+					? new TimerNode(name)
+					: new TimerNode(name, nodes.top());
+
+				nodes.push(node);
+				node->start();
+			}
+
+			void StopBlock() {
+				if(!enabled) return;
+				nodes.top()->finish();
+				nodes.pop();
+			}
+
+			void print() {
+				if(!top.head) return;
+				auto global_end = std::chrono::high_resolution_clock::now();
+				total = global_end - global_begin;
+
+				size_t nc = 0;
+				Base::ForAll(top, 0, [&](Base::TreeImpl * node, size_t level) {
+					nc = std::max(nc, (4 * level) + std::strlen(node->name));
+				});
+
+				size_t nct = nc + 37;
+				std::cerr << std::string(nct, '=') << std::endl;
+				const char * const title = "Timing Results";
+				std::cerr << std::string((nct - std::strlen(title)) / 2, ' ');
+				std::cerr << title << std::endl;
+				std::cerr << std::string(nct, '-') << std::endl;
+				std::cerr << "Location";
+				std::cerr << std::string(nc - (std::strlen("Location")), ' ');
+				std::cerr << " | ";
+				std::cerr << "       Time | ";
+				std::cerr << "% parent | ";
+				std::cerr << "% total |" << std::endl;
+				std::cerr << std::string(nct, '-') << std::endl;
+
+				Base::ForAll(top, 0, [&](Base::TreeImpl * node, size_t level) {
+					currl = level;
+					std::cerr << std::string(level * 4, ' ');
+					std::cerr << node->name;
+					std::cerr << std::string(nc - ((level * 4) + std::strlen(node->name)), ' ');
+					std::cerr << " | ";
+					node->print(std::cerr);
+					std::cerr << " |";
+					std::cerr << '\n';
+					prevl = level;
+				}, true);
+
+				std::cerr << std::string(nct, '-') << std::endl;
+				std::cerr << "Total " << total << std::endl;
+				std::cerr << std::string(nct, '-') << std::endl;
+			}
+#		endif
+	}
+}
Index: src/Common/Stats/Time.h
===================================================================
--- src/Common/Stats/Time.h	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ src/Common/Stats/Time.h	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,63 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2019 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// Time.h --
+//
+// Author           : Thierry Delisle
+// Created On       : Fri Mar 01 15:14:11 2019
+// Last Modified By :
+// Last Modified On :
+// Update Count     :
+//
+
+#pragma once
+
+#include "Common/Stats/Base.h"
+
+#if defined( NO_STATISTICS )
+	#define NO_TIME_STATISTICS
+#endif
+
+namespace Stats {
+	namespace Time {
+#		if defined(NO_TIME_STATISTICS)
+			inline void StartGlobal() {}
+
+			inline void StartBlock(const char * const) {}
+			inline void StopBlock() {}
+
+			inline void print() {}
+
+			struct BlockGuard {
+				BlockGuard(const char * const) {}
+				~BlockGuard() {}
+			};
+
+			template<typename func_t>
+			inline void TimeBlock(const char *, func_t f) {
+				f();
+			}
+#		else
+			void StartGlobal();
+
+			void StartBlock(const char * const name);
+			void StopBlock();
+
+			void print();
+
+			struct BlockGuard {
+				BlockGuard(const char * const name ) { StartBlock(name); }
+				~BlockGuard() { StopBlock(); }
+			};
+
+			template<typename func_t>
+			inline void TimeBlock(const char * name, func_t func) {
+				BlockGuard guard(name);
+				func();
+			}
+#		endif
+	}
+}
Index: src/Common/module.mk
===================================================================
--- src/Common/module.mk	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/Common/module.mk	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -15,8 +15,15 @@
 ###############################################################################
 
-SRC += Common/SemanticError.cc \
-       Common/UniqueName.cc \
-       Common/DebugMalloc.cc \
-       Common/Assert.cc \
-       Common/Heap.cc \
-       Common/Eval.cc
+SRC_COMMON = \
+      Common/Assert.cc \
+      Common/Eval.cc \
+      Common/PassVisitor.cc \
+      Common/SemanticError.cc \
+      Common/Stats/Counter.cc \
+      Common/Stats/Heap.cc \
+      Common/Stats/Stats.cc \
+      Common/Stats/Time.cc \
+      Common/UniqueName.cc
+
+SRC += $(SRC_COMMON) Common/DebugMalloc.cc
+SRCDEMANGLE += $(SRC_COMMON)
Index: src/Concurrency/Waitfor.cc
===================================================================
--- src/Concurrency/Waitfor.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/Concurrency/Waitfor.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -11,5 +11,5 @@
 // Last Modified By :
 // Last Modified On :
-// Update Count     : 5
+// Update Count     : 7
 //
 
Index: src/Concurrency/module.mk
===================================================================
--- src/Concurrency/module.mk	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/Concurrency/module.mk	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -15,5 +15,5 @@
 ###############################################################################
 
-SRC += Concurrency/Keywords.cc \
-       Concurrency/Waitfor.cc
+SRC += Concurrency/Keywords.cc Concurrency/Waitfor.cc
+SRCDEMANGLE += Concurrency/Keywords.cc
 
Index: src/ControlStruct/ExceptTranslate.cc
===================================================================
--- src/ControlStruct/ExceptTranslate.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/ControlStruct/ExceptTranslate.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -9,7 +9,7 @@
 // Author           : Andrew Beach
 // Created On       : Wed Jun 14 16:49:00 2017
-// Last Modified By : Andrew Beach
-// Last Modified On : Thr Aug 17 17:19:00 2017
-// Update Count     : 9
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Feb 13 18:15:29 2019
+// Update Count     : 11
 //
 
Index: src/ControlStruct/module.mk
===================================================================
--- src/ControlStruct/module.mk	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/ControlStruct/module.mk	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -15,8 +15,12 @@
 ###############################################################################
 
-SRC +=  ControlStruct/LabelGenerator.cc \
+SRC_CONTROLSTRUCT = \
+	ControlStruct/ForExprMutator.cc \
 	ControlStruct/LabelFixer.cc \
+	ControlStruct/LabelGenerator.cc \
 	ControlStruct/MLEMutator.cc \
-	ControlStruct/Mutate.cc \
-	ControlStruct/ForExprMutator.cc \
-	ControlStruct/ExceptTranslate.cc
+	ControlStruct/Mutate.cc
+
+SRC += $(SRC_CONTROLSTRUCT) ControlStruct/ExceptTranslate.cc
+SRCDEMANGLE += $(SRC_CONTROLSTRUCT)
+
Index: src/GenPoly/module.mk
===================================================================
--- src/GenPoly/module.mk	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/GenPoly/module.mk	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -22,2 +22,5 @@
        GenPoly/FindFunction.cc \
        GenPoly/InstantiateGeneric.cc
+
+SRCDEMANGLE += GenPoly/GenPoly.cc GenPoly/Lvalue.cc
+
Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/InitTweak/FixInit.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Wed Jan 13 16:29:30 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jun 21 17:35:05 2017
-// Update Count     : 74
+// Last Modified On : Wed Feb 13 18:15:56 2019
+// Update Count     : 76
 //
 #include "FixInit.h"
Index: src/InitTweak/module.mk
===================================================================
--- src/InitTweak/module.mk	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/InitTweak/module.mk	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -20,2 +20,5 @@
 	InitTweak/InitTweak.cc
 
+SRCDEMANGLE += InitTweak/GenInit.cc \
+	InitTweak/InitTweak.cc
+
Index: src/MakeLibCfa.cc
===================================================================
--- src/MakeLibCfa.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/MakeLibCfa.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sat May 16 10:33:33 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Fri Apr 22 13:54:15 2016
-// Update Count     : 40
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sun Feb 17 21:08:09 2019
+// Update Count     : 41
 //
 
@@ -146,2 +146,6 @@
 	} // namespace
 } // namespace LibCfa
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: src/Makefile.am
===================================================================
--- src/Makefile.am	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/Makefile.am	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,7 +10,7 @@
 ## Author           : Peter A. Buhr
 ## Created On       : Sun May 31 08:51:46 2015
-## Last Modified By : Andrew Beach
-## Last Modified On : Tus Jul 25 10:34:00 2017
-## Update Count     : 76
+## Last Modified By : Peter A. Buhr
+## Last Modified On : Fri Feb 15 09:44:09 2019
+## Update Count     : 97
 ###############################################################################
 
@@ -23,8 +23,8 @@
       CompilationState.cc
 
+SRCDEMANGLE = CompilationState.cc
+
 MAINTAINERCLEANFILES =
 MOSTLYCLEANFILES =
-
-# Is there a way to use a variable for the directory names?
 
 include CodeGen/module.mk
@@ -43,4 +43,11 @@
 include Virtual/module.mk
 
+$(addprefix $(srcdir)/, ResolvExpr/ConversionCost.cc ResolvExpr/CommonType.cc SymTab/ManglerCommon.cc) : $(srcdir)/SynTree/Type.h
+
+$(srcdir)/SynTree/Type.h : BasicTypes-gen.cc
+	${AM_V_GEN}${CXXCOMPILE} $< -o BasicTypes-gen -Wall -Wextra
+	@./BasicTypes-gen
+	@rm BasicTypes-gen
+
 # put into lib for now
 cfa_cpplibdir = $(CFA_LIBDIR)
@@ -55,91 +62,8 @@
 demangler_SOURCES = SymTab/demangler.cc
 
-demangler_LDADD = libdemangle.a     # yywrap
+demangler_LDADD = libdemangle.a -ldl			# yywrap
 
 noinst_LIBRARIES = libdemangle.a
-libdemangle_a_SOURCES = SymTab/Demangle.cc SymTab/ManglerCommon.cc \
-  SynTree/Type.cc \
-  SynTree/VoidType.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/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/DeclStmt.cc \
-  SynTree/Declaration.cc \
-  SynTree/DeclarationWithType.cc \
-  SynTree/ObjectDecl.cc \
-  SynTree/FunctionDecl.cc \
-  SynTree/AggregateDecl.cc \
-  SynTree/NamedTypeDecl.cc \
-  SynTree/TypeDecl.cc \
-  SynTree/Initializer.cc \
-  SynTree/TypeSubstitution.cc \
-  SynTree/Attribute.cc \
-  SynTree/DeclReplacer.cc \
-  CompilationState.cc \
-  CodeGen/CodeGenerator.cc \
-  CodeGen/FixMain.cc \
-  CodeGen/GenType.cc \
-  CodeGen/OperatorTable.cc \
-  Common/Assert.cc \
-  Common/Eval.cc \
-  Common/SemanticError.cc \
-  Common/UniqueName.cc \
-  Concurrency/Keywords.cc \
-  ControlStruct/ForExprMutator.cc \
-  ControlStruct/LabelFixer.cc \
-  ControlStruct/LabelGenerator.cc \
-  ControlStruct/MLEMutator.cc \
-  ControlStruct/Mutate.cc \
-  GenPoly/GenPoly.cc \
-  GenPoly/Lvalue.cc \
-  InitTweak/GenInit.cc \
-  InitTweak/InitTweak.cc \
-  Parser/LinkageSpec.cc \
-  ResolvExpr/AdjustExprType.cc \
-  ResolvExpr/Alternative.cc \
-  ResolvExpr/AlternativeFinder.cc \
-  ResolvExpr/ExplodedActual.cc \
-  ResolvExpr/CastCost.cc \
-  ResolvExpr/CommonType.cc \
-  ResolvExpr/ConversionCost.cc \
-  ResolvExpr/CurrentObject.cc \
-  ResolvExpr/FindOpenVars.cc \
-  ResolvExpr/Occurs.cc \
-  ResolvExpr/PolyCost.cc \
-  ResolvExpr/PtrsAssignable.cc \
-  ResolvExpr/PtrsCastable.cc \
-  ResolvExpr/RenameVars.cc \
-  ResolvExpr/ResolveAssertions.cc \
-  ResolvExpr/Resolver.cc \
-  ResolvExpr/ResolveTypeof.cc \
-  ResolvExpr/SpecCost.cc \
-  ResolvExpr/TypeEnvironment.cc \
-  ResolvExpr/Unify.cc \
-  SymTab/Autogen.cc \
-  SymTab/FixFunction.cc \
-  SymTab/Indexer.cc \
-  SymTab/Mangler.cc \
-  SymTab/Validate.cc \
-  Tuples/Explode.cc \
-  Tuples/TupleAssignment.cc \
-  Tuples/TupleExpansion.cc \
-  Validate/HandleAttributes.cc
+libdemangle_a_SOURCES = $(SRCDEMANGLE)
 
 MAINTAINERCLEANFILES += ${libdir}/${notdir ${cfa_cpplib_PROGRAMS}}
Index: src/Makefile.in
===================================================================
--- src/Makefile.in	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/Makefile.in	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -162,44 +162,24 @@
 libdemangle_a_LIBADD =
 am__dirstamp = $(am__leading_dot)dirstamp
-am_libdemangle_a_OBJECTS = SymTab/Demangle.$(OBJEXT) \
-	SymTab/ManglerCommon.$(OBJEXT) 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) \
-	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) CompilationState.$(OBJEXT) \
-	CodeGen/CodeGenerator.$(OBJEXT) CodeGen/FixMain.$(OBJEXT) \
-	CodeGen/GenType.$(OBJEXT) CodeGen/OperatorTable.$(OBJEXT) \
-	Common/Assert.$(OBJEXT) Common/Eval.$(OBJEXT) \
-	Common/SemanticError.$(OBJEXT) Common/UniqueName.$(OBJEXT) \
-	Concurrency/Keywords.$(OBJEXT) \
-	ControlStruct/ForExprMutator.$(OBJEXT) \
+am__objects_1 = CodeGen/CodeGenerator.$(OBJEXT) \
+	CodeGen/FixMain.$(OBJEXT) CodeGen/GenType.$(OBJEXT) \
+	CodeGen/OperatorTable.$(OBJEXT)
+am__objects_2 = Common/Assert.$(OBJEXT) Common/Eval.$(OBJEXT) \
+	Common/PassVisitor.$(OBJEXT) Common/SemanticError.$(OBJEXT) \
+	Common/Stats/Counter.$(OBJEXT) Common/Stats/Heap.$(OBJEXT) \
+	Common/Stats/Stats.$(OBJEXT) Common/Stats/Time.$(OBJEXT) \
+	Common/UniqueName.$(OBJEXT)
+am__objects_3 = ControlStruct/ForExprMutator.$(OBJEXT) \
 	ControlStruct/LabelFixer.$(OBJEXT) \
 	ControlStruct/LabelGenerator.$(OBJEXT) \
 	ControlStruct/MLEMutator.$(OBJEXT) \
-	ControlStruct/Mutate.$(OBJEXT) GenPoly/GenPoly.$(OBJEXT) \
-	GenPoly/Lvalue.$(OBJEXT) InitTweak/GenInit.$(OBJEXT) \
-	InitTweak/InitTweak.$(OBJEXT) Parser/LinkageSpec.$(OBJEXT) \
-	ResolvExpr/AdjustExprType.$(OBJEXT) \
+	ControlStruct/Mutate.$(OBJEXT)
+am__objects_4 = ResolvExpr/AdjustExprType.$(OBJEXT) \
 	ResolvExpr/Alternative.$(OBJEXT) \
 	ResolvExpr/AlternativeFinder.$(OBJEXT) \
-	ResolvExpr/ExplodedActual.$(OBJEXT) \
 	ResolvExpr/CastCost.$(OBJEXT) ResolvExpr/CommonType.$(OBJEXT) \
 	ResolvExpr/ConversionCost.$(OBJEXT) \
 	ResolvExpr/CurrentObject.$(OBJEXT) \
+	ResolvExpr/ExplodedActual.$(OBJEXT) \
 	ResolvExpr/FindOpenVars.$(OBJEXT) ResolvExpr/Occurs.$(OBJEXT) \
 	ResolvExpr/PolyCost.$(OBJEXT) \
@@ -212,64 +192,9 @@
 	ResolvExpr/SpecCost.$(OBJEXT) \
 	ResolvExpr/TypeEnvironment.$(OBJEXT) \
-	ResolvExpr/Unify.$(OBJEXT) SymTab/Autogen.$(OBJEXT) \
-	SymTab/FixFunction.$(OBJEXT) SymTab/Indexer.$(OBJEXT) \
-	SymTab/Mangler.$(OBJEXT) SymTab/Validate.$(OBJEXT) \
-	Tuples/Explode.$(OBJEXT) Tuples/TupleAssignment.$(OBJEXT) \
-	Tuples/TupleExpansion.$(OBJEXT) \
-	Validate/HandleAttributes.$(OBJEXT)
-libdemangle_a_OBJECTS = $(am_libdemangle_a_OBJECTS)
-am__installdirs = "$(DESTDIR)$(cfa_cpplibdir)"
-PROGRAMS = $(cfa_cpplib_PROGRAMS)
-am__objects_1 = main.$(OBJEXT) MakeLibCfa.$(OBJEXT) \
-	CompilationState.$(OBJEXT) CodeGen/Generate.$(OBJEXT) \
-	CodeGen/CodeGenerator.$(OBJEXT) CodeGen/GenType.$(OBJEXT) \
-	CodeGen/FixNames.$(OBJEXT) CodeGen/FixMain.$(OBJEXT) \
-	CodeGen/OperatorTable.$(OBJEXT) CodeTools/DeclStats.$(OBJEXT) \
-	CodeTools/ResolvProtoDump.$(OBJEXT) \
-	CodeTools/TrackLoc.$(OBJEXT) Concurrency/Keywords.$(OBJEXT) \
-	Concurrency/Waitfor.$(OBJEXT) Common/SemanticError.$(OBJEXT) \
-	Common/UniqueName.$(OBJEXT) Common/DebugMalloc.$(OBJEXT) \
-	Common/Assert.$(OBJEXT) Common/Heap.$(OBJEXT) \
-	Common/Eval.$(OBJEXT) ControlStruct/LabelGenerator.$(OBJEXT) \
-	ControlStruct/LabelFixer.$(OBJEXT) \
-	ControlStruct/MLEMutator.$(OBJEXT) \
-	ControlStruct/Mutate.$(OBJEXT) \
-	ControlStruct/ForExprMutator.$(OBJEXT) \
-	ControlStruct/ExceptTranslate.$(OBJEXT) GenPoly/Box.$(OBJEXT) \
-	GenPoly/GenPoly.$(OBJEXT) GenPoly/ScrubTyVars.$(OBJEXT) \
-	GenPoly/Lvalue.$(OBJEXT) GenPoly/Specialize.$(OBJEXT) \
-	GenPoly/FindFunction.$(OBJEXT) \
-	GenPoly/InstantiateGeneric.$(OBJEXT) \
-	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) \
-	ResolvExpr/AlternativeFinder.$(OBJEXT) \
-	ResolvExpr/Alternative.$(OBJEXT) ResolvExpr/Unify.$(OBJEXT) \
-	ResolvExpr/PtrsAssignable.$(OBJEXT) \
-	ResolvExpr/CommonType.$(OBJEXT) \
-	ResolvExpr/ConversionCost.$(OBJEXT) \
-	ResolvExpr/CastCost.$(OBJEXT) \
-	ResolvExpr/PtrsCastable.$(OBJEXT) \
-	ResolvExpr/AdjustExprType.$(OBJEXT) \
-	ResolvExpr/AlternativePrinter.$(OBJEXT) \
-	ResolvExpr/Resolver.$(OBJEXT) \
-	ResolvExpr/ResolveTypeof.$(OBJEXT) \
-	ResolvExpr/RenameVars.$(OBJEXT) \
-	ResolvExpr/FindOpenVars.$(OBJEXT) \
-	ResolvExpr/PolyCost.$(OBJEXT) ResolvExpr/Occurs.$(OBJEXT) \
-	ResolvExpr/TypeEnvironment.$(OBJEXT) \
-	ResolvExpr/CurrentObject.$(OBJEXT) \
-	ResolvExpr/ExplodedActual.$(OBJEXT) \
-	ResolvExpr/SpecCost.$(OBJEXT) \
-	ResolvExpr/ResolveAssertions.$(OBJEXT) \
+	ResolvExpr/Unify.$(OBJEXT)
+am__objects_5 = SymTab/Autogen.$(OBJEXT) SymTab/FixFunction.$(OBJEXT) \
 	SymTab/Indexer.$(OBJEXT) SymTab/Mangler.$(OBJEXT) \
-	SymTab/ManglerCommon.$(OBJEXT) SymTab/Validate.$(OBJEXT) \
-	SymTab/FixFunction.$(OBJEXT) SymTab/Autogen.$(OBJEXT) \
-	SynTree/Type.$(OBJEXT) SynTree/VoidType.$(OBJEXT) \
+	SymTab/ManglerCommon.$(OBJEXT) SymTab/Validate.$(OBJEXT)
+am__objects_6 = SynTree/Type.$(OBJEXT) SynTree/VoidType.$(OBJEXT) \
 	SynTree/BasicType.$(OBJEXT) SynTree/PointerType.$(OBJEXT) \
 	SynTree/ArrayType.$(OBJEXT) SynTree/ReferenceType.$(OBJEXT) \
@@ -290,10 +215,46 @@
 	SynTree/Initializer.$(OBJEXT) \
 	SynTree/TypeSubstitution.$(OBJEXT) SynTree/Attribute.$(OBJEXT) \
-	SynTree/DeclReplacer.$(OBJEXT) \
+	SynTree/DeclReplacer.$(OBJEXT)
+am__objects_7 = CompilationState.$(OBJEXT) $(am__objects_1) \
+	Concurrency/Keywords.$(OBJEXT) $(am__objects_2) \
+	$(am__objects_3) GenPoly/GenPoly.$(OBJEXT) \
+	GenPoly/Lvalue.$(OBJEXT) InitTweak/GenInit.$(OBJEXT) \
+	InitTweak/InitTweak.$(OBJEXT) Parser/LinkageSpec.$(OBJEXT) \
+	$(am__objects_4) $(am__objects_5) SymTab/Demangle.$(OBJEXT) \
+	$(am__objects_6) Tuples/TupleAssignment.$(OBJEXT) \
+	Tuples/TupleExpansion.$(OBJEXT) Tuples/Explode.$(OBJEXT) \
+	Validate/HandleAttributes.$(OBJEXT)
+am_libdemangle_a_OBJECTS = $(am__objects_7)
+libdemangle_a_OBJECTS = $(am_libdemangle_a_OBJECTS)
+am__installdirs = "$(DESTDIR)$(cfa_cpplibdir)"
+PROGRAMS = $(cfa_cpplib_PROGRAMS)
+am__objects_8 = main.$(OBJEXT) MakeLibCfa.$(OBJEXT) \
+	CompilationState.$(OBJEXT) $(am__objects_1) \
+	CodeGen/Generate.$(OBJEXT) CodeGen/FixNames.$(OBJEXT) \
+	CodeTools/DeclStats.$(OBJEXT) \
+	CodeTools/ResolvProtoDump.$(OBJEXT) \
+	CodeTools/TrackLoc.$(OBJEXT) Concurrency/Keywords.$(OBJEXT) \
+	Concurrency/Waitfor.$(OBJEXT) $(am__objects_2) \
+	Common/DebugMalloc.$(OBJEXT) $(am__objects_3) \
+	ControlStruct/ExceptTranslate.$(OBJEXT) GenPoly/Box.$(OBJEXT) \
+	GenPoly/GenPoly.$(OBJEXT) GenPoly/ScrubTyVars.$(OBJEXT) \
+	GenPoly/Lvalue.$(OBJEXT) GenPoly/Specialize.$(OBJEXT) \
+	GenPoly/FindFunction.$(OBJEXT) \
+	GenPoly/InstantiateGeneric.$(OBJEXT) \
+	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) \
+	$(am__objects_4) ResolvExpr/AlternativePrinter.$(OBJEXT) \
+	$(am__objects_5) $(am__objects_6) \
 	Tuples/TupleAssignment.$(OBJEXT) \
 	Tuples/TupleExpansion.$(OBJEXT) Tuples/Explode.$(OBJEXT) \
 	Validate/HandleAttributes.$(OBJEXT) \
 	Virtual/ExpandCasts.$(OBJEXT)
-am____driver_cfa_cpp_OBJECTS = $(am__objects_1)
+am____driver_cfa_cpp_OBJECTS = $(am__objects_8)
 ___driver_cfa_cpp_OBJECTS = $(am____driver_cfa_cpp_OBJECTS)
 ___driver_cfa_cpp_DEPENDENCIES =
@@ -416,5 +377,4 @@
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-ALLOCA = @ALLOCA@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -564,15 +524,9 @@
 AUTOMAKE_OPTIONS = foreign subdir-objects
 ACLOCAL_AMFLAGS = -I automake
-SRC = main.cc MakeLibCfa.cc CompilationState.cc CodeGen/Generate.cc \
-	CodeGen/CodeGenerator.cc CodeGen/GenType.cc \
-	CodeGen/FixNames.cc CodeGen/FixMain.cc \
-	CodeGen/OperatorTable.cc CodeTools/DeclStats.cc \
+SRC = main.cc MakeLibCfa.cc CompilationState.cc $(SRC_CODEGEN) \
+	CodeGen/Generate.cc CodeGen/FixNames.cc CodeTools/DeclStats.cc \
 	CodeTools/ResolvProtoDump.cc CodeTools/TrackLoc.cc \
-	Concurrency/Keywords.cc Concurrency/Waitfor.cc \
-	Common/SemanticError.cc Common/UniqueName.cc \
-	Common/DebugMalloc.cc Common/Assert.cc Common/Heap.cc \
-	Common/Eval.cc ControlStruct/LabelGenerator.cc \
-	ControlStruct/LabelFixer.cc ControlStruct/MLEMutator.cc \
-	ControlStruct/Mutate.cc ControlStruct/ForExprMutator.cc \
+	Concurrency/Keywords.cc Concurrency/Waitfor.cc $(SRC_COMMON) \
+	Common/DebugMalloc.cc $(SRC_CONTROLSTRUCT) \
 	ControlStruct/ExceptTranslate.cc GenPoly/Box.cc \
 	GenPoly/GenPoly.cc GenPoly/ScrubTyVars.cc GenPoly/Lvalue.cc \
@@ -585,42 +539,111 @@
 	Parser/StatementNode.cc Parser/InitializerNode.cc \
 	Parser/TypeData.cc Parser/LinkageSpec.cc \
-	Parser/parserutility.cc ResolvExpr/AlternativeFinder.cc \
-	ResolvExpr/Alternative.cc ResolvExpr/Unify.cc \
-	ResolvExpr/PtrsAssignable.cc ResolvExpr/CommonType.cc \
-	ResolvExpr/ConversionCost.cc ResolvExpr/CastCost.cc \
-	ResolvExpr/PtrsCastable.cc ResolvExpr/AdjustExprType.cc \
-	ResolvExpr/AlternativePrinter.cc ResolvExpr/Resolver.cc \
-	ResolvExpr/ResolveTypeof.cc ResolvExpr/RenameVars.cc \
-	ResolvExpr/FindOpenVars.cc ResolvExpr/PolyCost.cc \
-	ResolvExpr/Occurs.cc ResolvExpr/TypeEnvironment.cc \
-	ResolvExpr/CurrentObject.cc ResolvExpr/ExplodedActual.cc \
-	ResolvExpr/SpecCost.cc ResolvExpr/ResolveAssertions.cc \
-	SymTab/Indexer.cc SymTab/Mangler.cc SymTab/ManglerCommon.cc \
-	SymTab/Validate.cc SymTab/FixFunction.cc SymTab/Autogen.cc \
-	SynTree/Type.cc SynTree/VoidType.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/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/DeclStmt.cc SynTree/Declaration.cc \
-	SynTree/DeclarationWithType.cc SynTree/ObjectDecl.cc \
-	SynTree/FunctionDecl.cc SynTree/AggregateDecl.cc \
-	SynTree/NamedTypeDecl.cc SynTree/TypeDecl.cc \
-	SynTree/Initializer.cc SynTree/TypeSubstitution.cc \
-	SynTree/Attribute.cc SynTree/DeclReplacer.cc \
+	Parser/parserutility.cc $(SRC_RESOLVEXPR) \
+	ResolvExpr/AlternativePrinter.cc $(SRC_SYMTAB) $(SRC_SYNTREE) \
 	Tuples/TupleAssignment.cc Tuples/TupleExpansion.cc \
 	Tuples/Explode.cc Validate/HandleAttributes.cc \
 	Virtual/ExpandCasts.cc
+SRCDEMANGLE = CompilationState.cc $(SRC_CODEGEN) \
+	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 Validate/HandleAttributes.cc
 MAINTAINERCLEANFILES = ${libdir}/${notdir ${cfa_cpplib_PROGRAMS}}
-MOSTLYCLEANFILES = Parser/parser.hh Parser/parser.output
+MOSTLYCLEANFILES = Parser/lex.cc Parser/parser.cc Parser/parser.hh \
+	Parser/parser.output
+SRC_CODEGEN = \
+	CodeGen/CodeGenerator.cc \
+	CodeGen/FixMain.cc \
+	CodeGen/GenType.cc \
+	CodeGen/OperatorTable.cc
+
+SRC_COMMON = \
+      Common/Assert.cc \
+      Common/Eval.cc \
+      Common/PassVisitor.cc \
+      Common/SemanticError.cc \
+      Common/Stats/Counter.cc \
+      Common/Stats/Heap.cc \
+      Common/Stats/Stats.cc \
+      Common/Stats/Time.cc \
+      Common/UniqueName.cc
+
+SRC_CONTROLSTRUCT = \
+	ControlStruct/ForExprMutator.cc \
+	ControlStruct/LabelFixer.cc \
+	ControlStruct/LabelGenerator.cc \
+	ControlStruct/MLEMutator.cc \
+	ControlStruct/Mutate.cc
+
 BUILT_SOURCES = Parser/parser.hh
 AM_YFLAGS = -d -t -v
-
-# Is there a way to use a variable for the directory names?
+SRC_RESOLVEXPR = \
+      ResolvExpr/AdjustExprType.cc \
+      ResolvExpr/Alternative.cc \
+      ResolvExpr/AlternativeFinder.cc \
+      ResolvExpr/CastCost.cc \
+      ResolvExpr/CommonType.cc \
+      ResolvExpr/ConversionCost.cc \
+      ResolvExpr/CurrentObject.cc \
+      ResolvExpr/ExplodedActual.cc \
+      ResolvExpr/FindOpenVars.cc \
+      ResolvExpr/Occurs.cc \
+      ResolvExpr/PolyCost.cc \
+      ResolvExpr/PtrsAssignable.cc \
+      ResolvExpr/PtrsCastable.cc \
+      ResolvExpr/RenameVars.cc \
+      ResolvExpr/ResolveAssertions.cc \
+      ResolvExpr/Resolver.cc \
+      ResolvExpr/ResolveTypeof.cc \
+      ResolvExpr/SpecCost.cc \
+      ResolvExpr/TypeEnvironment.cc \
+      ResolvExpr/Unify.cc
+
+SRC_SYMTAB = \
+      SymTab/Autogen.cc \
+      SymTab/FixFunction.cc \
+      SymTab/Indexer.cc \
+      SymTab/Mangler.cc \
+      SymTab/ManglerCommon.cc \
+      SymTab/Validate.cc
+
+SRC_SYNTREE = \
+      SynTree/Type.cc \
+      SynTree/VoidType.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/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/DeclStmt.cc \
+      SynTree/Declaration.cc \
+      SynTree/DeclarationWithType.cc \
+      SynTree/ObjectDecl.cc \
+      SynTree/FunctionDecl.cc \
+      SynTree/AggregateDecl.cc \
+      SynTree/NamedTypeDecl.cc \
+      SynTree/TypeDecl.cc \
+      SynTree/Initializer.cc \
+      SynTree/TypeSubstitution.cc \
+      SynTree/Attribute.cc \
+      SynTree/DeclReplacer.cc
+
 
 # put into lib for now
@@ -632,91 +655,7 @@
 ARFLAGS = cr
 demangler_SOURCES = SymTab/demangler.cc
-demangler_LDADD = libdemangle.a     # yywrap
+demangler_LDADD = libdemangle.a -ldl			# yywrap
 noinst_LIBRARIES = libdemangle.a
-libdemangle_a_SOURCES = SymTab/Demangle.cc SymTab/ManglerCommon.cc \
-  SynTree/Type.cc \
-  SynTree/VoidType.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/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/DeclStmt.cc \
-  SynTree/Declaration.cc \
-  SynTree/DeclarationWithType.cc \
-  SynTree/ObjectDecl.cc \
-  SynTree/FunctionDecl.cc \
-  SynTree/AggregateDecl.cc \
-  SynTree/NamedTypeDecl.cc \
-  SynTree/TypeDecl.cc \
-  SynTree/Initializer.cc \
-  SynTree/TypeSubstitution.cc \
-  SynTree/Attribute.cc \
-  SynTree/DeclReplacer.cc \
-  CompilationState.cc \
-  CodeGen/CodeGenerator.cc \
-  CodeGen/FixMain.cc \
-  CodeGen/GenType.cc \
-  CodeGen/OperatorTable.cc \
-  Common/Assert.cc \
-  Common/Eval.cc \
-  Common/SemanticError.cc \
-  Common/UniqueName.cc \
-  Concurrency/Keywords.cc \
-  ControlStruct/ForExprMutator.cc \
-  ControlStruct/LabelFixer.cc \
-  ControlStruct/LabelGenerator.cc \
-  ControlStruct/MLEMutator.cc \
-  ControlStruct/Mutate.cc \
-  GenPoly/GenPoly.cc \
-  GenPoly/Lvalue.cc \
-  InitTweak/GenInit.cc \
-  InitTweak/InitTweak.cc \
-  Parser/LinkageSpec.cc \
-  ResolvExpr/AdjustExprType.cc \
-  ResolvExpr/Alternative.cc \
-  ResolvExpr/AlternativeFinder.cc \
-  ResolvExpr/ExplodedActual.cc \
-  ResolvExpr/CastCost.cc \
-  ResolvExpr/CommonType.cc \
-  ResolvExpr/ConversionCost.cc \
-  ResolvExpr/CurrentObject.cc \
-  ResolvExpr/FindOpenVars.cc \
-  ResolvExpr/Occurs.cc \
-  ResolvExpr/PolyCost.cc \
-  ResolvExpr/PtrsAssignable.cc \
-  ResolvExpr/PtrsCastable.cc \
-  ResolvExpr/RenameVars.cc \
-  ResolvExpr/ResolveAssertions.cc \
-  ResolvExpr/Resolver.cc \
-  ResolvExpr/ResolveTypeof.cc \
-  ResolvExpr/SpecCost.cc \
-  ResolvExpr/TypeEnvironment.cc \
-  ResolvExpr/Unify.cc \
-  SymTab/Autogen.cc \
-  SymTab/FixFunction.cc \
-  SymTab/Indexer.cc \
-  SymTab/Mangler.cc \
-  SymTab/Validate.cc \
-  Tuples/Explode.cc \
-  Tuples/TupleAssignment.cc \
-  Tuples/TupleExpansion.cc \
-  Validate/HandleAttributes.cc
-
+libdemangle_a_SOURCES = $(SRCDEMANGLE)
 all: $(BUILT_SOURCES)
 	$(MAKE) $(AM_MAKEFLAGS) all-am
@@ -757,88 +696,4 @@
 clean-noinstLIBRARIES:
 	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
-SymTab/$(am__dirstamp):
-	@$(MKDIR_P) SymTab
-	@: > SymTab/$(am__dirstamp)
-SymTab/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) SymTab/$(DEPDIR)
-	@: > SymTab/$(DEPDIR)/$(am__dirstamp)
-SymTab/Demangle.$(OBJEXT): SymTab/$(am__dirstamp) \
-	SymTab/$(DEPDIR)/$(am__dirstamp)
-SymTab/ManglerCommon.$(OBJEXT): SymTab/$(am__dirstamp) \
-	SymTab/$(DEPDIR)/$(am__dirstamp)
-SynTree/$(am__dirstamp):
-	@$(MKDIR_P) SynTree
-	@: > SynTree/$(am__dirstamp)
-SynTree/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) SynTree/$(DEPDIR)
-	@: > SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/Type.$(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)
 CodeGen/$(am__dirstamp):
 	@$(MKDIR_P) CodeGen
@@ -855,4 +710,12 @@
 CodeGen/OperatorTable.$(OBJEXT): CodeGen/$(am__dirstamp) \
 	CodeGen/$(DEPDIR)/$(am__dirstamp)
+Concurrency/$(am__dirstamp):
+	@$(MKDIR_P) Concurrency
+	@: > Concurrency/$(am__dirstamp)
+Concurrency/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) Concurrency/$(DEPDIR)
+	@: > Concurrency/$(DEPDIR)/$(am__dirstamp)
+Concurrency/Keywords.$(OBJEXT): Concurrency/$(am__dirstamp) \
+	Concurrency/$(DEPDIR)/$(am__dirstamp)
 Common/$(am__dirstamp):
 	@$(MKDIR_P) Common
@@ -865,16 +728,24 @@
 Common/Eval.$(OBJEXT): Common/$(am__dirstamp) \
 	Common/$(DEPDIR)/$(am__dirstamp)
+Common/PassVisitor.$(OBJEXT): Common/$(am__dirstamp) \
+	Common/$(DEPDIR)/$(am__dirstamp)
 Common/SemanticError.$(OBJEXT): Common/$(am__dirstamp) \
 	Common/$(DEPDIR)/$(am__dirstamp)
+Common/Stats/$(am__dirstamp):
+	@$(MKDIR_P) Common/Stats
+	@: > Common/Stats/$(am__dirstamp)
+Common/Stats/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) Common/Stats/$(DEPDIR)
+	@: > Common/Stats/$(DEPDIR)/$(am__dirstamp)
+Common/Stats/Counter.$(OBJEXT): Common/Stats/$(am__dirstamp) \
+	Common/Stats/$(DEPDIR)/$(am__dirstamp)
+Common/Stats/Heap.$(OBJEXT): Common/Stats/$(am__dirstamp) \
+	Common/Stats/$(DEPDIR)/$(am__dirstamp)
+Common/Stats/Stats.$(OBJEXT): Common/Stats/$(am__dirstamp) \
+	Common/Stats/$(DEPDIR)/$(am__dirstamp)
+Common/Stats/Time.$(OBJEXT): Common/Stats/$(am__dirstamp) \
+	Common/Stats/$(DEPDIR)/$(am__dirstamp)
 Common/UniqueName.$(OBJEXT): Common/$(am__dirstamp) \
 	Common/$(DEPDIR)/$(am__dirstamp)
-Concurrency/$(am__dirstamp):
-	@$(MKDIR_P) Concurrency
-	@: > Concurrency/$(am__dirstamp)
-Concurrency/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) Concurrency/$(DEPDIR)
-	@: > Concurrency/$(DEPDIR)/$(am__dirstamp)
-Concurrency/Keywords.$(OBJEXT): Concurrency/$(am__dirstamp) \
-	Concurrency/$(DEPDIR)/$(am__dirstamp)
 ControlStruct/$(am__dirstamp):
 	@$(MKDIR_P) ControlStruct
@@ -933,14 +804,14 @@
 ResolvExpr/AlternativeFinder.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
 	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
+ResolvExpr/CastCost.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
+	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
+ResolvExpr/CommonType.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
+	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
+ResolvExpr/ConversionCost.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
+	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
+ResolvExpr/CurrentObject.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
+	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
 ResolvExpr/ExplodedActual.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
 	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
-ResolvExpr/CastCost.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
-	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
-ResolvExpr/CommonType.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
-	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
-ResolvExpr/ConversionCost.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
-	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
-ResolvExpr/CurrentObject.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
-	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
 ResolvExpr/FindOpenVars.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
 	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
@@ -967,4 +838,10 @@
 ResolvExpr/Unify.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
 	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
+SymTab/$(am__dirstamp):
+	@$(MKDIR_P) SymTab
+	@: > SymTab/$(am__dirstamp)
+SymTab/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) SymTab/$(DEPDIR)
+	@: > SymTab/$(DEPDIR)/$(am__dirstamp)
 SymTab/Autogen.$(OBJEXT): SymTab/$(am__dirstamp) \
 	SymTab/$(DEPDIR)/$(am__dirstamp)
@@ -975,6 +852,84 @@
 SymTab/Mangler.$(OBJEXT): SymTab/$(am__dirstamp) \
 	SymTab/$(DEPDIR)/$(am__dirstamp)
+SymTab/ManglerCommon.$(OBJEXT): SymTab/$(am__dirstamp) \
+	SymTab/$(DEPDIR)/$(am__dirstamp)
 SymTab/Validate.$(OBJEXT): SymTab/$(am__dirstamp) \
 	SymTab/$(DEPDIR)/$(am__dirstamp)
+SymTab/Demangle.$(OBJEXT): SymTab/$(am__dirstamp) \
+	SymTab/$(DEPDIR)/$(am__dirstamp)
+SynTree/$(am__dirstamp):
+	@$(MKDIR_P) SynTree
+	@: > SynTree/$(am__dirstamp)
+SynTree/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) SynTree/$(DEPDIR)
+	@: > SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/Type.$(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):
 	@$(MKDIR_P) Tuples
@@ -983,9 +938,9 @@
 	@$(MKDIR_P) Tuples/$(DEPDIR)
 	@: > Tuples/$(DEPDIR)/$(am__dirstamp)
-Tuples/Explode.$(OBJEXT): Tuples/$(am__dirstamp) \
-	Tuples/$(DEPDIR)/$(am__dirstamp)
 Tuples/TupleAssignment.$(OBJEXT): Tuples/$(am__dirstamp) \
 	Tuples/$(DEPDIR)/$(am__dirstamp)
 Tuples/TupleExpansion.$(OBJEXT): Tuples/$(am__dirstamp) \
+	Tuples/$(DEPDIR)/$(am__dirstamp)
+Tuples/Explode.$(OBJEXT): Tuples/$(am__dirstamp) \
 	Tuples/$(DEPDIR)/$(am__dirstamp)
 Validate/$(am__dirstamp):
@@ -1070,6 +1025,4 @@
 	Concurrency/$(DEPDIR)/$(am__dirstamp)
 Common/DebugMalloc.$(OBJEXT): Common/$(am__dirstamp) \
-	Common/$(DEPDIR)/$(am__dirstamp)
-Common/Heap.$(OBJEXT): Common/$(am__dirstamp) \
 	Common/$(DEPDIR)/$(am__dirstamp)
 ControlStruct/ExceptTranslate.$(OBJEXT):  \
@@ -1142,4 +1095,5 @@
 	-rm -f CodeTools/*.$(OBJEXT)
 	-rm -f Common/*.$(OBJEXT)
+	-rm -f Common/Stats/*.$(OBJEXT)
 	-rm -f Concurrency/*.$(OBJEXT)
 	-rm -f ControlStruct/*.$(OBJEXT)
@@ -1172,7 +1126,11 @@
 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/DebugMalloc.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/Eval.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/Heap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/PassVisitor.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/SemanticError.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/UniqueName.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@Common/Stats/$(DEPDIR)/Counter.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@Common/Stats/$(DEPDIR)/Heap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@Common/Stats/$(DEPDIR)/Stats.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@Common/Stats/$(DEPDIR)/Time.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Concurrency/$(DEPDIR)/Keywords.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Concurrency/$(DEPDIR)/Waitfor.Po@am__quote@
@@ -1436,4 +1394,6 @@
 	-rm -f Common/$(DEPDIR)/$(am__dirstamp)
 	-rm -f Common/$(am__dirstamp)
+	-rm -f Common/Stats/$(DEPDIR)/$(am__dirstamp)
+	-rm -f Common/Stats/$(am__dirstamp)
 	-rm -f Concurrency/$(DEPDIR)/$(am__dirstamp)
 	-rm -f Concurrency/$(am__dirstamp)
@@ -1473,5 +1433,5 @@
 
 distclean: distclean-am
-	-rm -rf ./$(DEPDIR) CodeGen/$(DEPDIR) CodeTools/$(DEPDIR) Common/$(DEPDIR) Concurrency/$(DEPDIR) ControlStruct/$(DEPDIR) GenPoly/$(DEPDIR) InitTweak/$(DEPDIR) Parser/$(DEPDIR) ResolvExpr/$(DEPDIR) SymTab/$(DEPDIR) SynTree/$(DEPDIR) Tuples/$(DEPDIR) Validate/$(DEPDIR) Virtual/$(DEPDIR)
+	-rm -rf ./$(DEPDIR) CodeGen/$(DEPDIR) CodeTools/$(DEPDIR) Common/$(DEPDIR) Common/Stats/$(DEPDIR) Concurrency/$(DEPDIR) ControlStruct/$(DEPDIR) GenPoly/$(DEPDIR) InitTweak/$(DEPDIR) Parser/$(DEPDIR) ResolvExpr/$(DEPDIR) SymTab/$(DEPDIR) SynTree/$(DEPDIR) Tuples/$(DEPDIR) Validate/$(DEPDIR) Virtual/$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
@@ -1519,5 +1479,5 @@
 
 maintainer-clean: maintainer-clean-am
-	-rm -rf ./$(DEPDIR) CodeGen/$(DEPDIR) CodeTools/$(DEPDIR) Common/$(DEPDIR) Concurrency/$(DEPDIR) ControlStruct/$(DEPDIR) GenPoly/$(DEPDIR) InitTweak/$(DEPDIR) Parser/$(DEPDIR) ResolvExpr/$(DEPDIR) SymTab/$(DEPDIR) SynTree/$(DEPDIR) Tuples/$(DEPDIR) Validate/$(DEPDIR) Virtual/$(DEPDIR)
+	-rm -rf ./$(DEPDIR) CodeGen/$(DEPDIR) CodeTools/$(DEPDIR) Common/$(DEPDIR) Common/Stats/$(DEPDIR) Concurrency/$(DEPDIR) ControlStruct/$(DEPDIR) GenPoly/$(DEPDIR) InitTweak/$(DEPDIR) Parser/$(DEPDIR) ResolvExpr/$(DEPDIR) SymTab/$(DEPDIR) SynTree/$(DEPDIR) Tuples/$(DEPDIR) Validate/$(DEPDIR) Virtual/$(DEPDIR)
 	-rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
@@ -1559,4 +1519,11 @@
 
 
+$(addprefix $(srcdir)/, ResolvExpr/ConversionCost.cc ResolvExpr/CommonType.cc SymTab/ManglerCommon.cc) : $(srcdir)/SynTree/Type.h
+
+$(srcdir)/SynTree/Type.h : BasicTypes-gen.cc
+	${AM_V_GEN}${CXXCOMPILE} $< -o BasicTypes-gen -Wall -Wextra
+	@./BasicTypes-gen
+	@rm BasicTypes-gen
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/Parser/DeclarationNode.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 12:34:05 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Nov  1 20:54:26 2018
-// Update Count     : 1108
+// Last Modified On : Fri Feb  1 16:49:17 2019
+// Update Count     : 1113
 //
 
@@ -41,6 +41,8 @@
 
 // These must harmonize with the corresponding DeclarationNode enumerations.
-const char * DeclarationNode::basicTypeNames[] = { "void", "_Bool", "char", "int", "float", "double", "long double", "int128", "float80", "float128", "NoBasicTypeNames" };
-const char * DeclarationNode::complexTypeNames[] = { "_Complex", "_Imaginary", "NoComplexTypeNames" };
+const char * DeclarationNode::basicTypeNames[] = { "void", "_Bool", "char", "int", "int128",
+												   "float", "double", "long double", "float80", "float128",
+												   "_float16", "_float32", "_float32x", "_float64", "_float64x", "_float128", "_float128x", "NoBasicTypeNames" };
+const char * DeclarationNode::complexTypeNames[] = { "_Complex", "NoComplexTypeNames", "_Imaginary" }; // Imaginary unsupported => parse, but make invisible and print error message
 const char * DeclarationNode::signednessNames[] = { "signed", "unsigned", "NoSignednessNames" };
 const char * DeclarationNode::lengthNames[] = { "short", "long", "long long", "NoLengthNames" };
Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/Parser/ExpressionNode.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:17:07 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jun  4 21:24:45 2018
-// Update Count     : 802
+// Last Modified On : Sun Mar 10 16:10:32 2019
+// Update Count     : 976
 //
 
@@ -51,61 +51,81 @@
 extern const Type::Qualifiers noQualifiers;				// no qualifiers on constants
 
-static inline bool checkH( char c ) { return c == 'h' || c == 'H'; }
-static inline bool checkL( char c ) { return c == 'l' || c == 'L'; }
-static inline bool checkZ( char c ) { return c == 'z' || c == 'Z'; }
-static inline bool checkU( char c ) { return c == 'u' || c == 'U'; }
+// static inline bool checkH( char c ) { return c == 'h' || c == 'H'; }
+// static inline bool checkZ( char c ) { return c == 'z' || c == 'Z'; }
+// static inline bool checkU( char c ) { return c == 'u' || c == 'U'; }
 static inline bool checkF( char c ) { return c == 'f' || c == 'F'; }
 static inline bool checkD( char c ) { return c == 'd' || c == 'D'; }
+static inline bool checkF80( char c ) { return c == 'w' || c == 'W'; }
+static inline bool checkF128( char c ) { return c == 'q' || c == 'Q'; }
+static inline bool checkL( char c ) { return c == 'l' || c == 'L'; }
 static inline bool checkI( char c ) { return c == 'i' || c == 'I'; }
 static inline bool checkB( char c ) { return c == 'b' || c == 'B'; }
 static inline bool checkX( char c ) { return c == 'x' || c == 'X'; }
-
-static const char * lnthsInt[2][6] = {
-	{ "int8_t", "int16_t", "int32_t", "int64_t", "size_t", },
-	{ "uint8_t", "uint16_t", "uint32_t", "uint64_t", "size_t", }
-}; // lnthsInt
-
-static inline void checkLNInt( string & str, int & lnth, int & size ) {
-	string::size_type posn = str.find_first_of( "lL" ), start = posn;
-  if ( posn == string::npos ) return;
-	size = 4;											// assume largest size
-	posn += 1;											// advance to size
-	if ( str[posn] == '8' ) {							// 8
-		lnth = 0;
-	} else if ( str[posn] == '1' ) {
-		posn += 1;
-		if ( str[posn] == '6' ) {						// 16
-			lnth = 1;
+static inline bool checkN( char c ) { return c == 'n' || c == 'N'; }
+
+void lnthSuffix( string & str, int & type, int & ltype ) {
+	string::size_type posn = str.find_last_of( "lL" );
+
+	if ( posn == string::npos ) return;					// no suffix
+	if ( posn == str.length() - 1 ) { type = 3; return; } // no length => long
+
+	string::size_type next = posn + 1;					// advance to length
+	if ( str[next] == '3' ) {							// 32
+		type = ltype = 2;
+	} else if ( str[next] == '6' ) {					// 64
+		type = ltype = 3;
+	} else if ( str[next] == '8' ) {					// 8
+		type = ltype = 1;
+	} else if ( str[next] == '1' ) {
+		if ( str[next + 1] == '6' ) {					// 16
+			type = ltype = 0;
 		} else {										// 128
-			posn += 1;
-			lnth = 5;
-		} // if
-	} else {
-		if ( str[posn] == '3' ) {						// 32
-			lnth = 2;
-		} else if ( str[posn] == '6' ) {				// 64
-			lnth = 3;
-		} else {
-			assertf( false, "internal error, bad integral length %s", str.c_str() );
-		} // if
-		posn += 1;
-	} // if
-	str.erase( start, posn - start + 1 );				// remove length suffix
-} // checkLNInt
+			type = 5; ltype = 6;
+		} // if
+	} // if
+	// remove "lL" for these cases because it may not imply long
+	str.erase( posn );									// remove length
+} // lnthSuffix
+
+void valueToType( unsigned long long int & v, bool dec, int & type, bool & Unsigned ) {
+	// use value to determine type
+	if ( v <= INT_MAX ) {								// signed int
+		type = 2;
+	} else if ( v <= UINT_MAX && ! dec ) {				// unsigned int
+		type = 2;
+		Unsigned = true;								// unsigned
+	} else if ( v <= LONG_MAX ) {						// signed long int
+		type = 3;
+	} else if ( v <= ULONG_MAX && ( ! dec || LONG_MAX == LLONG_MAX ) ) { // signed long int
+		type = 3;
+		Unsigned = true;								// unsigned long int
+	} else if ( v <= LLONG_MAX ) {						// signed long long int
+		type = 4;
+	} else {											// unsigned long long int
+		type = 4;
+		Unsigned = true;								// unsigned long long int
+	} // if
+} // valueToType
 
 Expression * build_constantInteger( string & str ) {
-	static const BasicType::Kind kind[2][6] = {
-		// short (h) must be before char (hh)
+	static const BasicType::Kind kind[2][7] = {
+		// short (h) must be before char (hh) because shorter type has the longer suffix
 		{ BasicType::ShortSignedInt, BasicType::SignedChar, BasicType::SignedInt, BasicType::LongSignedInt, BasicType::LongLongSignedInt, BasicType::SignedInt128, },
 		{ BasicType::ShortUnsignedInt, BasicType::UnsignedChar, BasicType::UnsignedInt, BasicType::LongUnsignedInt, BasicType::LongLongUnsignedInt, BasicType::UnsignedInt128, },
 	};
 
-	bool dec = true, Unsigned = false;					// decimal, unsigned constant
-	int size;											// 0 => short, 1 => char, 2 => int, 3 => long int, 4 => long long int, 5 => int128
-	int lnth = -1;										// literal length
+	static const char * lnthsInt[2][6] = {
+		{ "int16_t",  "int8_t",  "int32_t",  "int64_t",  "size_t",  "uintptr_t", },
+		{ "uint16_t", "uint8_t", "uint32_t", "uint64_t", "size_t",  "uintptr_t", },
+	}; // lnthsInt
 
 	unsigned long long int v;							// converted integral value
 	size_t last = str.length() - 1;						// last subscript of constant
 	Expression * ret;
+	//string fred( str );
+
+	int type = -1;										// 0 => short, 1 => char, 2 => int, 3 => long int, 4 => long long int, 5 => int128
+	int ltype = -1;										// 0 => 16 bits, 1 => 8 bits, 2 => 32 bits, 3 => 64 bits, 4 => size_t, 5 => intptr, 6 => pointer
+	bool dec = true, Unsigned = false;					// decimal, unsigned constant
 
 	// special constants
@@ -119,5 +139,5 @@
 	} // if
 
-	// Cannot be "0"
+	// Cannot be just "0"/"1"; sscanf stops at the suffix, if any; value goes over the wall => always generate
 
 	if ( str[0] == '0' ) {								// radix character ?
@@ -127,99 +147,81 @@
 			//printf( "%llx %llu\n", v, v );
 		} else if ( checkB( str[1] ) ) {				// binary constant ?
-			v = 0;
-			for ( unsigned int i = 2;; i += 1 ) {		// compute value
+			v = 0;										// compute value
+			for ( unsigned int i = 2;; ) {				// ignore prefix
 				if ( str[i] == '1' ) v |= 1;
-			  if ( i == last ) break;
+				i += 1;
+			  if ( i == last - 1 || (str[i] != '0' && str[i] != '1') ) break;
 				v <<= 1;
 			} // for
-			//printf( "%llx %llu\n", v, v );
+			//printf( "%#llx %llu\n", v, v );
 		} else {										// octal constant
 			sscanf( (char *)str.c_str(), "%llo", &v );
-			//printf( "%llo %llu\n", v, v );
+			//printf( "%#llo %llu\n", v, v );
 		} // if
 	} else {											// decimal constant ?
 		sscanf( (char *)str.c_str(), "%llu", &v );
-		//printf( "%llu %llu\n", v, v );
-	} // if
-
-	if ( v <= INT_MAX ) {								// signed int
-		size = 2;
-	} else if ( v <= UINT_MAX && ! dec ) {				// unsigned int
-		size = 2;
-		Unsigned = true;								// unsigned
-	} else if ( v <= LONG_MAX ) {						// signed long int
-		size = 3;
-	} else if ( v <= ULONG_MAX && ( ! dec || LONG_MAX == LLONG_MAX ) ) { // signed long int
-		size = 3;
-		Unsigned = true;								// unsigned long int
-	} else if ( v <= LLONG_MAX ) {						// signed long long int
-		size = 4;
-	} else {											// unsigned long long int
-		size = 4;
-		Unsigned = true;								// unsigned long long int
-	} // if
-
-	// At least one digit in integer constant, so safe to backup while looking for suffix.
-
-	if ( checkU( str[last] ) ) {						// suffix 'u' ?
-		Unsigned = true;
-		if ( checkL( str[last - 1] ) ) {				// suffix 'l' ?
-			size = 3;
-			if ( checkL( str[last - 2] ) ) {			// suffix "ll" ?
-				size = 4;
+		//printf( "%llu\n", v );
+	} // if
+
+	string::size_type posn;
+
+	if ( isdigit( str[last] ) ) {						// no suffix ?
+		lnthSuffix( str, type, ltype );					// could have length suffix
+		if ( type == -1 ) {								// no suffix
+			valueToType( v, dec, type, Unsigned );
+		} // if
+	} else {
+		// At least one digit in integer constant, so safe to backup while looking for suffix.
+
+		posn = str.find_last_of( "pP" );
+		if ( posn != string::npos ) { valueToType( v, dec, type, Unsigned ); ltype = 5; str.erase( posn, 1 ); goto FINI; }
+
+		posn = str.find_last_of( "zZ" );
+		if ( posn != string::npos ) { Unsigned = true; type = 2; ltype = 4; str.erase( posn, 1 ); goto FINI; }
+
+		// 'u' can appear before or after length suffix
+		if ( str.find_last_of( "uU" ) != string::npos ) Unsigned = true;
+
+		posn = str.rfind( "hh" );
+		if ( posn != string::npos ) { type = 1; str.erase( posn, 2 ); goto FINI; }
+
+		posn = str.rfind( "HH" );
+		if ( posn != string::npos ) { type = 1; str.erase( posn, 2 ); goto FINI; }
+
+		posn = str.find_last_of( "hH" );
+		if ( posn != string::npos ) { type = 0; str.erase( posn, 1 ); goto FINI; }
+
+		posn = str.find_last_of( "nN" );
+		if ( posn != string::npos ) { type = 2; str.erase( posn, 1 ); goto FINI; }
+
+		if ( str.rfind( "ll" ) != string::npos || str.rfind( "LL" ) != string::npos ) { type = 4; goto FINI; }
+
+		lnthSuffix( str, type, ltype );					// must be after check for "ll"
+		if ( type == -1 ) {								// only 'u' suffix ?
+			valueToType( v, dec, type, Unsigned );
+		} // if
+	  FINI: ;
+	} // if
+
+	//if ( !( 0 <= type && type <= 6 ) ) { printf( "%s %lu %d %s\n", fred.c_str(), fred.length(), type, str.c_str() ); }
+	assert( 0 <= type && type <= 6 );
+
+	// Constant type is correct for overload resolving.
+	ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[Unsigned][type] ), str, v ) );
+	if ( Unsigned && type < 2 ) {						// hh or h, less than int ?
+		// int i = -1uh => 65535 not -1, so cast is necessary for unsigned, which unfortunately eliminates warnings for large values.
+		ret = new CastExpr( ret, new BasicType( Type::Qualifiers(), kind[Unsigned][type] ), false );
+	} else if ( ltype != -1 ) {							// explicit length ?
+		if ( ltype == 6 ) {								// int128, (int128)constant
+			ret = new CastExpr( ret, new BasicType( Type::Qualifiers(), kind[Unsigned][type] ), false );
+		} else {										// explicit length, (length_type)constant
+			ret = new CastExpr( ret, new TypeInstType( Type::Qualifiers(), lnthsInt[Unsigned][ltype], false ), false );
+			if ( ltype == 5 ) {							// pointer, intptr( (uintptr_t)constant ) 
+				ret = build_func( new ExpressionNode( build_varref( new string( "intptr" ) ) ), new ExpressionNode( ret ) );								  
 			} // if
-		} else if ( checkH( str[last - 1] ) ) {			// suffix 'h' ?
-			size = 0;
-			if ( checkH( str[last - 2] ) ) {			// suffix "hh" ?
-				size = 1;
-			} // if
-			str.erase( last - size - 1, size + 1 );		// remove 'h'/"hh"
-		} else {										// suffix "ln" ?
-			checkLNInt( str, lnth, size );
-		} // if
-	} else if ( checkL( str[ last ] ) ) {				// suffix 'l' ?
-		size = 3;
-		if ( checkL( str[last - 1] ) ) {				// suffix 'll' ?
-			size = 4;
-			if ( checkU( str[last - 2] ) ) {			// suffix 'u' ?
-				Unsigned = true;
-			} // if
-		} else if ( checkU( str[last - 1] ) ) {			// suffix 'u' ?
-			Unsigned = true;
-		} // if
-	} else if ( checkH( str[ last ] ) ) {				// suffix 'h' ?
-		size = 0;
-		if ( checkH( str[last - 1] ) ) {				// suffix "hh" ?
-			size = 1;
-			if ( checkU( str[last - 2] ) ) {			// suffix 'u' ?
-				Unsigned = true;
-			} // if
-		} else if ( checkU( str[last - 1] ) ) {			// suffix 'u' ?
-			Unsigned = true;
-		} // if
-		str.erase( last - size, size + 1 );				// remove 'h'/"hh"
-	} else if ( checkZ( str[last] ) ) {					// suffix 'z' ?
-		lnth = 4;
-		str.erase( last, 1 );							// remove 'z'
-	} else {											// suffix "ln" ?
-		checkLNInt( str, lnth, size );
-	} // if
-
-	assert( 0 <= size && size < 6 );
-	// Constant type is correct for overload resolving.
-	ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[Unsigned][size] ), str, v ) );
-	if ( Unsigned && size < 2 ) {						// hh or h, less than int ?
-		// int i = -1uh => 65535 not -1, so cast is necessary for unsigned, which unfortunately eliminates warnings for large values.
-		ret = new CastExpr( ret, new BasicType( Type::Qualifiers(), kind[Unsigned][size] ), false );
-	} else if ( lnth != -1 ) {							// explicit length ?
-		if ( lnth == 5 ) {								// int128 ?
-			size = 5;
-			ret = new CastExpr( ret, new BasicType( Type::Qualifiers(), kind[Unsigned][size] ), false );
-		} else {
-			ret = new CastExpr( ret, new TypeInstType( Type::Qualifiers(), lnthsInt[Unsigned][lnth], false ), false );
-		} // if
-	} // if
-  CLEANUP:
-
+		} // if
+	} // if
+
+  CLEANUP: ;
 	delete &str;										// created by lex
 	return ret;
@@ -227,37 +229,49 @@
 
 
-static inline void checkLNFloat( string & str, int & lnth, int & size ) {
-	string::size_type posn = str.find_first_of( "lL" ), start = posn;
+static inline void checkFnxFloat( string & str, size_t last, bool & explnth, int & type ) {
+	string::size_type posn;
+	// floating-point constant has minimum of 2 characters, 1. or .1, so safe to look ahead
+	if ( str[1] == 'x' ) {								// hex ?
+		posn = str.find_last_of( "pP" );				// back for exponent (must have)
+		posn = str.find_first_of( "fF", posn + 1 );		// forward for size (fF allowed in hex constant)
+	} else {
+		posn = str.find_last_of( "fF" );				// back for size (fF not allowed)
+	} // if
   if ( posn == string::npos ) return;
-	size = 2;											// assume largest size
-	lnth = 0;
+	explnth = true;
 	posn += 1;											// advance to size
 	if ( str[posn] == '3' ) {							// 32
-		size = 0;
+		if ( str[last] != 'x' ) type = 6;
+		else type = 7;
 	} else if ( str[posn] == '6' ) {					// 64
-		size = 1;
-	} else if ( str[posn] == '8' || str[posn] == '1' ) { // 80, 128
-		size = 2;
-		if ( str[posn] == '1' ) posn += 1;
+		if ( str[last] != 'x' ) type = 8;
+		else type = 9;
+	} else if ( str[posn] == '8' ) {					// 80
+		type = 3;
+	} else if ( str[posn] == '1' ) {					// 16/128
+		if ( str[posn + 1] == '6' ) {					// 16
+			type = 5;
+		} else {										// 128
+			if ( str[last] != 'x' ) type = 10;
+			else type = 11;
+		} // if
 	} else {
 		assertf( false, "internal error, bad floating point length %s", str.c_str() );
 	} // if
-	posn += 1;
-	str.erase( start, posn - start + 1 );				// remove length suffix
-} // checkLNFloat
+} // checkFnxFloat
 
 
 Expression * build_constantFloat( string & str ) {
-	static const BasicType::Kind kind[2][3] = {
-		{ BasicType::Float, BasicType::Double, BasicType::LongDouble },
-		{ BasicType::FloatComplex, BasicType::DoubleComplex, BasicType::LongDoubleComplex },
+	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 },
 	};
 
-	bool complx = false;								// real, complex
-	int size = 1;										// 0 => float, 1 => double, 2 => long double
-	int lnth = -1;										// literal length
-	// floating-point constant has minimum of 2 characters: 1. or .1
+	// floating-point constant has minimum of 2 characters 1. or .1
 	size_t last = str.length() - 1;
 	double v;
+	int type;											// 0 => float, 1 => double, 3 => long double, ...
+	bool complx = false;								// real, complex
+	bool explnth = false;								// explicit literal length
 
 	sscanf( str.c_str(), "%lg", &v );
@@ -269,21 +283,26 @@
 
 	if ( checkF( str[last] ) ) {						// float ?
-		size = 0;
+		type = 0;
 	} else if ( checkD( str[last] ) ) {					// double ?
-		size = 1;
+		type = 1;
 	} else if ( checkL( str[last] ) ) {					// long double ?
-		size = 2;
+		type = 2;
+	} else if ( checkF80( str[last] ) ) {				// __float80 ?
+		type = 3;
+	} else if ( checkF128( str[last] ) ) {				// __float128 ?
+		type = 4;
 	} else {
-		size = 1;										// double (default)
-		checkLNFloat( str, lnth, size );
-	} // if
+		type = 1;										// double (default if no suffix)
+		checkFnxFloat( str, last, explnth, type );
+	} // if
+
 	if ( ! complx && checkI( str[last - 1] ) ) {		// imaginary ?
 		complx = true;
 	} // if
 
-	assert( 0 <= size && size < 3 );
-	Expression * ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[complx][size] ), str, v ) );
-	if ( lnth != -1 ) {									// explicit length ?
-		ret = new CastExpr( ret, new BasicType( Type::Qualifiers(), kind[complx][size] ), false );
+	assert( 0 <= type && type < 12 );
+	Expression * ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[complx][type] ), str, v ) );
+	if ( explnth ) {									// explicit length ?
+		ret = new CastExpr( ret, new BasicType( Type::Qualifiers(), kind[complx][type] ), false );
 	} // if
 
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/Parser/ParseNode.h	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:28:16 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Nov  1 20:54:53 2018
-// Update Count     : 854
+// Last Modified On : Wed Feb 13 17:36:49 2019
+// Update Count     : 867
 //
 
@@ -206,8 +206,10 @@
 class DeclarationNode : public ParseNode {
   public:
-	// These enumerations must harmonize with their names.
-	enum BasicType { Void, Bool, Char, Int, Float, Double, LongDouble, Int128, Float80, Float128, NoBasicType };
+	// These enumerations must harmonize with their names in DeclarationNode.cc.
+	enum BasicType { Void, Bool, Char, Int, Int128,
+					 Float, Double, LongDouble, uuFloat80, uuFloat128,
+					 uFloat16, uFloat32, uFloat32x, uFloat64, uFloat64x, uFloat128, uFloat128x, NoBasicType };
 	static const char * basicTypeNames[];
-	enum ComplexType { Complex, Imaginary, NoComplexType };
+	enum ComplexType { Complex, NoComplexType, Imaginary };	// Imaginary unsupported => parse, but make invisible and print error message
 	static const char * complexTypeNames[];
 	enum Signedness { Signed, Unsigned, NoSignedness };
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/Parser/TypeData.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:12:51 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Nov  2 07:54:26 2018
-// Update Count     : 624
+// Last Modified On : Wed Feb 13 18:16:23 2019
+// Update Count     : 649
 //
 
@@ -666,12 +666,18 @@
 
 	  case DeclarationNode::Float:
-	  case DeclarationNode::Float80:
-	  case DeclarationNode::Float128:
 	  case DeclarationNode::Double:
 	  case DeclarationNode::LongDouble:					// not set until below
-		static BasicType::Kind floattype[3][3] = {
-			{ BasicType::FloatComplex, BasicType::DoubleComplex, BasicType::LongDoubleComplex },
-			{ BasicType::FloatImaginary, BasicType::DoubleImaginary, BasicType::LongDoubleImaginary },
-			{ BasicType::Float, BasicType::Double, BasicType::LongDouble },
+	  case DeclarationNode::uuFloat80:
+	  case DeclarationNode::uuFloat128:
+	  case DeclarationNode::uFloat16:
+	  case DeclarationNode::uFloat32:
+	  case DeclarationNode::uFloat32x:
+	  case DeclarationNode::uFloat64:
+	  case DeclarationNode::uFloat64x:
+	  case DeclarationNode::uFloat128:
+	  case DeclarationNode::uFloat128x:
+		static BasicType::Kind floattype[2][12] = {
+			{ 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::Float, BasicType::Double, BasicType::LongDouble, BasicType::uuFloat80, BasicType::uuFloat128, BasicType::uFloat16, BasicType::uFloat32, BasicType::uFloat32x, BasicType::uFloat64, BasicType::uFloat64x, BasicType::uFloat128, BasicType::uFloat128x, },
 		};
 
@@ -686,18 +692,16 @@
 			genTSError( DeclarationNode::lengthNames[ td->length ], td->basictype );
 		} // if
+		if ( td->complextype == DeclarationNode::Imaginary ) {
+			genTSError( DeclarationNode::complexTypeNames[ td->complextype ], td->basictype );
+		} // if
+		if ( (td->basictype == DeclarationNode::uuFloat80 || td->basictype == DeclarationNode::uuFloat128) && td->complextype == DeclarationNode::Complex ) { // gcc unsupported
+			genTSError( DeclarationNode::complexTypeNames[ td->complextype ], td->basictype );
+		} // if
 		if ( td->length == DeclarationNode::Long ) {
 			const_cast<TypeData *>(td)->basictype = DeclarationNode::LongDouble;
 		} // if
 
-		if ( td->basictype == DeclarationNode::Float80 || td->basictype == DeclarationNode::Float128 ) {
-			// if ( td->complextype != DeclarationNode::NoComplexType ) {
-			// 	genTSError( DeclarationNode::complexTypeNames[ td->complextype ], td->basictype );
-			// }
-			if ( td->basictype == DeclarationNode::Float80 ) ret = BasicType::Float80;
-			else ret = BasicType::Float128;
-			break;
-		}
-
 		ret = floattype[ td->complextype ][ td->basictype - DeclarationNode::Float ];
+		//printf( "XXXX %d %d %d %d\n", td->complextype, td->basictype, DeclarationNode::Float, ret );
 		break;
 
Index: src/Parser/TypeData.h
===================================================================
--- src/Parser/TypeData.h	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/Parser/TypeData.h	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -31,23 +31,23 @@
 	struct Aggregate_t {
 		DeclarationNode::Aggregate kind;
-		const std::string * name;
-		DeclarationNode * params;
-		ExpressionNode * actuals;						// holds actual parameters later applied to AggInst
-		DeclarationNode * fields;
+		const std::string * name = nullptr;
+		DeclarationNode * params = nullptr;
+		ExpressionNode * actuals = nullptr;						// holds actual parameters later applied to AggInst
+		DeclarationNode * fields = nullptr;
 		bool body;
 		bool anon;
 
 		bool tagged;
-		const std::string * parent;
+		const std::string * parent = nullptr;
 	};
 
 	struct AggInst_t {
-		TypeData * aggregate;
-		ExpressionNode * params;
+		TypeData * aggregate = nullptr;
+		ExpressionNode * params = nullptr;
 		bool hoistType;
 	};
 
 	struct Array_t {
-		ExpressionNode * dimension;
+		ExpressionNode * dimension = nullptr;
 		bool isVarLen;
 		bool isStatic;
@@ -55,6 +55,6 @@
 
 	struct Enumeration_t {
-		const std::string * name;
-		DeclarationNode * constants;
+		const std::string * name = nullptr;
+		DeclarationNode * constants = nullptr;
 		bool body;
 		bool anon;
@@ -62,22 +62,22 @@
 
 	struct Function_t {
-		mutable DeclarationNode * params;				// mutables modified in buildKRFunction
-		mutable DeclarationNode * idList;				// old-style
-		mutable DeclarationNode * oldDeclList;
-		StatementNode * body;
-		ExpressionNode * withExprs;						// expressions from function's with_clause
+		mutable DeclarationNode * params = nullptr;				// mutables modified in buildKRFunction
+		mutable DeclarationNode * idList = nullptr;				// old-style
+		mutable DeclarationNode * oldDeclList = nullptr;
+		StatementNode * body = nullptr;
+		ExpressionNode * withExprs = nullptr;						// expressions from function's with_clause
 	};
 
 	struct Symbolic_t {
-		const std::string * name;
+		const std::string * name = nullptr;
 		bool isTypedef;									// false => TYPEGENname, true => TYPEDEFname
-		DeclarationNode * params;
-		ExpressionNode * actuals;
-		DeclarationNode * assertions;
+		DeclarationNode * params = nullptr;
+		ExpressionNode * actuals = nullptr;
+		DeclarationNode * assertions = nullptr;
 	};
 
 	struct Qualified_t {								// qualified type S.T
-		TypeData * parent;
-		TypeData * child;
+		TypeData * parent = nullptr;
+		TypeData * child = nullptr;
 	};
 
@@ -93,5 +93,5 @@
 
 	Type::Qualifiers qualifiers;
-	DeclarationNode * forall;
+	DeclarationNode * forall = nullptr;
 
 	Aggregate_t aggregate;
@@ -102,6 +102,6 @@
 	Symbolic_t symbolic;
 	Qualified_t qualified;
-	DeclarationNode * tuple;
-	ExpressionNode * typeexpr;
+	DeclarationNode * tuple = nullptr;
+	ExpressionNode * typeexpr = nullptr;
 
 	TypeData( Kind k = Unknown );
Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/Parser/lex.ll	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
  * Created On       : Sat Sep 22 08:58:10 2001
  * Last Modified By : Peter A. Buhr
- * Last Modified On : Thu Nov  1 20:57:35 2018
- * Update Count     : 687
+ * Last Modified On : Sun Mar 10 09:13:09 2019
+ * Update Count     : 706
  */
 
@@ -39,4 +39,5 @@
 using namespace std;
 
+#include "config.h"										// configure info
 #include "ParseNode.h"
 #include "TypedefTable.h"
@@ -59,4 +60,10 @@
 #define IDENTIFIER_RETURN()	RETURN_VAL( typedefTable.isKind( yytext ) )
 #define ATTRIBUTE_RETURN()	RETURN_VAL( ATTR_IDENTIFIER )
+
+#ifdef HAVE_KEYWORDS_FLOATXX								// GCC >= 7 => keyword, otherwise typedef
+#define FLOATXX(v) KEYWORD_RETURN(v);
+#else
+#define FLOATXX(v) IDENTIFIER_RETURN();	
+#endif // HAVE_KEYWORDS_FLOATXX
 
 void rm_underscore() {
@@ -92,6 +99,8 @@
 hex_quad {hex}("_"?{hex}){3}
 size_opt (8|16|32|64|128)?
-length ("ll"|"LL"|[lL]{size_opt})|("hh"|"HH"|[hH])
-integer_suffix_opt ("_"?(([uU]({length}?[iI]?)|([iI]{length}))|([iI]({length}?[uU]?)|([uU]{length}))|({length}([iI]?[uU]?)|([uU][iI]))|[zZ]))?
+				// CFA: explicit l8/l16/l32/l64/l128, char 'hh', short 'h', int 'n'
+length ("ll"|"LL"|[lL]{size_opt})|("hh"|"HH"|[hHnN])
+				// CFA: size_t 'z', pointer 'p', which define a sign and length
+integer_suffix_opt ("_"?(([uU]({length}?[iI]?)|([iI]{length}))|([iI]({length}?[uU]?)|([uU]{length}))|({length}([iI]?[uU]?)|([uU][iI]))|[zZ]|[pP]))?
 
 octal_digits ({octal})|({octal}({octal}|"_")*{octal})
@@ -112,6 +121,6 @@
 				// GCC: D (double) and iI (imaginary) suffixes, and DL (long double)
 exponent "_"?[eE]"_"?[+-]?{decimal_digits}
-floating_size 32|64|80|128
-floating_length ([fFdDlL]|[lL]{floating_size})
+floating_size 16|32|32x|64|64x|80|128|128x
+floating_length ([fFdDlLwWqQ]|[fF]{floating_size})
 floating_suffix ({floating_length}?[iI]?)|([iI]{floating_length})
 floating_suffix_opt ("_"?({floating_suffix}|"DL"))?
@@ -240,14 +249,15 @@
 finally			{ KEYWORD_RETURN(FINALLY); }			// CFA
 float			{ KEYWORD_RETURN(FLOAT); }
-_Float32		{ KEYWORD_RETURN(FLOAT); }				// GCC
-_Float32x		{ KEYWORD_RETURN(FLOAT); }				// GCC
-_Float64		{ KEYWORD_RETURN(DOUBLE); }				// GCC
-_Float64x		{ KEYWORD_RETURN(DOUBLE); }				// GCC
-__float80		{ KEYWORD_RETURN(FLOAT80); }			// GCC
-float80			{ KEYWORD_RETURN(FLOAT80); }			// GCC
-_Float128		{ KEYWORD_RETURN(FLOAT128); }			// GCC
-_Float128x		{ KEYWORD_RETURN(FLOAT128); }			// GCC
-__float128		{ KEYWORD_RETURN(FLOAT128); }			// GCC
-float128		{ KEYWORD_RETURN(FLOAT128); }			// GCC
+__float80		{ KEYWORD_RETURN(uuFLOAT80); }			// GCC
+float80			{ KEYWORD_RETURN(uuFLOAT80); }			// GCC
+__float128		{ KEYWORD_RETURN(uuFLOAT128); }			// GCC
+float128		{ KEYWORD_RETURN(uuFLOAT128); }			// GCC
+_Float16		{ FLOATXX(uFLOAT16); }					// GCC
+_Float32		{ FLOATXX(uFLOAT32); }					// GCC
+_Float32x		{ FLOATXX(uFLOAT32X); }					// GCC
+_Float64		{ FLOATXX(uFLOAT64); }					// GCC
+_Float64x		{ FLOATXX(uFLOAT64X); }					// GCC
+_Float128		{ FLOATXX(uFLOAT128); }					// GCC
+_Float128x		{ FLOATXX(uFLOAT128); }					// GCC
 for				{ KEYWORD_RETURN(FOR); }
 forall			{ KEYWORD_RETURN(FORALL); }				// CFA
Index: src/Parser/module.mk
===================================================================
--- src/Parser/module.mk	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/Parser/module.mk	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -31,3 +31,7 @@
        Parser/parserutility.cc
 
-MOSTLYCLEANFILES += Parser/parser.hh Parser/parser.output
+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 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/Parser/parser.yy	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Nov  8 18:08:23 2018
-// Update Count     : 4052
+// Last Modified On : Thu Feb 21 08:45:07 2019
+// Update Count     : 4232
 //
 
@@ -99,10 +99,8 @@
 	// distribute declaration_specifier across all declared variables, e.g., static, const, __attribute__.
 	DeclarationNode * cur = declList, * cl = (new DeclarationNode)->addType( specifier );
-	//cur->addType( specifier );
-	for ( cur = dynamic_cast< DeclarationNode * >( cur->get_next() ); cur != nullptr; cur = dynamic_cast< DeclarationNode * >( cur->get_next() ) ) {
+	for ( cur = dynamic_cast<DeclarationNode *>( cur->get_next() ); cur != nullptr; cur = dynamic_cast<DeclarationNode *>( cur->get_next() ) ) {
 		cl->cloneBaseType( cur );
 	} // for
 	declList->addType( cl );
-//	delete cl;
 	return declList;
 } // distAttr
@@ -193,7 +191,8 @@
 	return new ForCtrl(
 		distAttr( DeclarationNode::newTypeof( type, true ), DeclarationNode::newName( index )->addInitializer( new InitializerNode( start ) ) ),
-		new ExpressionNode( build_binary_val( compop, new ExpressionNode( build_varref( new string( *index ) ) ), comp ) ),
-		new ExpressionNode( build_binary_val( compop == OperKinds::LThan || compop == OperKinds::LEThan ? // choose += or -= for upto/downto
-											  OperKinds::PlusAssn : OperKinds::MinusAssn, new ExpressionNode( build_varref( new string( *index ) ) ), inc ) ) );
+		// NULL comp/inc => leave blank
+		comp ? new ExpressionNode( build_binary_val( compop, new ExpressionNode( build_varref( new string( *index ) ) ), comp ) ) : 0,
+		inc ? new ExpressionNode( build_binary_val( compop == OperKinds::LThan || compop == OperKinds::LEThan ? // choose += or -= for upto/downto
+							OperKinds::PlusAssn : OperKinds::MinusAssn, new ExpressionNode( build_varref( new string( *index ) ) ), inc ) ) : 0 );
 } // forCtrl
 
@@ -201,4 +200,10 @@
 	if ( NameExpr * identifier = dynamic_cast<NameExpr *>(index->get_expr()) ) {
 		return forCtrl( type, new string( identifier->name ), start, compop, comp, inc );
+	} else if ( CommaExpr * commaExpr = dynamic_cast<CommaExpr *>(index->get_expr()) ) {
+		if ( NameExpr * identifier = dynamic_cast<NameExpr *>(commaExpr->arg1 ) ) {
+			return forCtrl( type, new string( identifier->name ), start, compop, comp, inc );
+		} else {
+			SemanticError( yylloc, "Expression disallowed. Only loop-index name allowed" ); return nullptr;
+		} // if
 	} else {
 		SemanticError( yylloc, "Expression disallowed. Only loop-index name allowed" ); return nullptr;
@@ -263,5 +268,6 @@
 %token VOID CHAR SHORT INT LONG FLOAT DOUBLE SIGNED UNSIGNED
 %token BOOL COMPLEX IMAGINARY							// C99
-%token INT128 FLOAT80 FLOAT128							// GCC
+%token INT128 uuFLOAT80 uuFLOAT128						// GCC
+%token uFLOAT16 uFLOAT32 uFLOAT32X uFLOAT64 uFLOAT64X uFLOAT128 // GCC
 %token ZERO_T ONE_T										// CFA
 %token VALIST											// GCC
@@ -324,5 +330,5 @@
 %type<en> argument_expression_list		argument_expression			default_initialize_opt
 %type<ifctl> if_control_expression
-%type<fctl> for_control_expression
+%type<fctl> for_control_expression		for_control_expression_list
 %type<compop> inclexcl
 %type<en> subrange
@@ -984,7 +990,5 @@
 		// labels cannot be identifiers 0 or 1 or ATTR_IDENTIFIER
 	identifier_or_type_name ':' attribute_list_opt statement
-		{
-			$$ = $4->add_label( $1, $3 );
-		}
+		{ $$ = $4->add_label( $1, $3 ); }
 	;
 
@@ -1002,5 +1006,5 @@
 	statement_decl
 	| statement_decl_list statement_decl
-		{ if ( $1 != 0 ) { $1->set_last( $2 ); $$ = $1; } }
+		{ assert( $1 ); $1->set_last( $2 ); $$ = $1; }
 	;
 
@@ -1009,15 +1013,9 @@
 		{ $$ = new StatementNode( $1 ); }
 	| EXTENSION declaration								// GCC
-		{
-			distExt( $2 );
-			$$ = new StatementNode( $2 );
-		}
+		{ distExt( $2 ); $$ = new StatementNode( $2 ); }
 	| function_definition
 		{ $$ = new StatementNode( $1 ); }
 	| EXTENSION function_definition						// GCC
-		{
-			distExt( $2 );
-			$$ = new StatementNode( $2 );
-		}
+		{ distExt( $2 ); $$ = new StatementNode( $2 ); }
 	| statement
 	;
@@ -1026,5 +1024,5 @@
 	statement
 	| statement_list_nodecl statement
-		{ if ( $1 != 0 ) { $1->set_last( $2 ); $$ = $1; } }
+		{ assert( $1 ); $1->set_last( $2 ); $$ = $1; }
 	;
 
@@ -1138,5 +1136,5 @@
 	| DO statement WHILE '(' ')' ';'					// CFA => do while( 1 )
 		{ $$ = new StatementNode( build_do_while( new ExpressionNode( build_constantInteger( *new string( "1" ) ) ), $2 ) ); }
-	| FOR '(' push for_control_expression ')' statement pop
+	| FOR '(' push for_control_expression_list ')' statement pop
 		{ $$ = new StatementNode( build_for( $4, $6 ) ); }
 	| FOR '(' ')' statement								// CFA => for ( ;; )
@@ -1144,25 +1142,37 @@
 	;
 
+for_control_expression_list:
+	for_control_expression
+	| for_control_expression_list ':' for_control_expression
+		{ $$ = $3; }
+	;
+
 for_control_expression:
-	comma_expression									// CFA
+	';' comma_expression_opt ';' comma_expression_opt
+		{ $$ = new ForCtrl( (ExpressionNode * )nullptr, $2, $4 ); }
+	| comma_expression ';' comma_expression_opt ';' comma_expression_opt
+		{ $$ = new ForCtrl( $1, $3, $5 ); }
+	| declaration comma_expression_opt ';' comma_expression_opt // C99, declaration has ';'
+		{ $$ = new ForCtrl( $1, $2, $4 ); }
+	| comma_expression									// CFA
 		{ $$ = 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" ) ) ) ); }
-	| constant_expression inclexcl constant_expression	// CFA
+	| comma_expression inclexcl comma_expression		// CFA
 		{ $$ = forCtrl( $1, new string( DeclarationNode::anonymous.newName() ), $1->clone(), $2, $3, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
-	| constant_expression inclexcl constant_expression '~' constant_expression // CFA
+	| comma_expression inclexcl comma_expression '~' comma_expression // CFA
 		{ $$ = forCtrl( $1, new string( DeclarationNode::anonymous.newName() ), $1->clone(), $2, $3, $5 ); }
 	| comma_expression ';' comma_expression				// CFA
 		{ $$ = forCtrl( $3, $1, new ExpressionNode( build_constantInteger( *new string( "0" ) ) ),
 						OperKinds::LThan, $3->clone(), new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
-	| comma_expression ';' constant_expression inclexcl constant_expression // CFA
+	| comma_expression ';' comma_expression inclexcl comma_expression // CFA
 		{ $$ = forCtrl( $3, $1, $3->clone(), $4, $5, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
-	| comma_expression ';' constant_expression inclexcl constant_expression '~' constant_expression // CFA
+	| comma_expression ';' comma_expression inclexcl comma_expression '~' comma_expression // CFA
 		{ $$ = forCtrl( $3, $1, $3->clone(), $4, $5, $7 ); }
-	| comma_expression ';' comma_expression_opt ';' comma_expression_opt
-		{ $$ = new ForCtrl( $1, $3, $5 ); }
-	| ';' comma_expression_opt ';' comma_expression_opt
-		{ $$ = new ForCtrl( (ExpressionNode * )nullptr, $2, $4 ); }
-	| declaration comma_expression_opt ';' comma_expression_opt // C99, declaration has ';'
-		{ $$ = new ForCtrl( $1, $2, $4 ); }
+	| comma_expression ';' comma_expression '~' '@' '~' comma_expression // CFA
+		{ $$ = forCtrl( $3, $1, $3->clone(), OperKinds::LThan, nullptr, $7 ); }
+	| comma_expression ';' comma_expression ErangeDown '@' '~' comma_expression // CFA
+		{ $$ = forCtrl( $3, $1, $3->clone(), OperKinds::GThan, nullptr, $7 ); }
+	| comma_expression ';' comma_expression '~' '@' '~' '@' // CFA
+		{ $$ = forCtrl( $3, $1, $3->clone(), OperKinds::LThan, nullptr, nullptr ); }
  	;
 
@@ -1771,10 +1781,22 @@
 	| FLOAT
 		{ $$ = DeclarationNode::newBasicType( DeclarationNode::Float ); }
-	| FLOAT80
-		{ $$ = DeclarationNode::newBasicType( DeclarationNode::Float80 ); }
-	| FLOAT128
-		{ $$ = DeclarationNode::newBasicType( DeclarationNode::Float128 ); }
 	| DOUBLE
 		{ $$ = DeclarationNode::newBasicType( DeclarationNode::Double ); }
+	| uuFLOAT80
+		{ $$ = DeclarationNode::newBasicType( DeclarationNode::uuFloat80 ); }
+	| uuFLOAT128
+		{ $$ = DeclarationNode::newBasicType( DeclarationNode::uuFloat128 ); }
+	| uFLOAT16
+		{ $$ = DeclarationNode::newBasicType( DeclarationNode::uFloat16 ); }
+	| uFLOAT32
+		{ $$ = DeclarationNode::newBasicType( DeclarationNode::uFloat32 ); }
+	| uFLOAT32X
+		{ $$ = DeclarationNode::newBasicType( DeclarationNode::uFloat32x ); }
+	| uFLOAT64
+		{ $$ = DeclarationNode::newBasicType( DeclarationNode::uFloat64 ); }
+	| uFLOAT64X
+		{ $$ = DeclarationNode::newBasicType( DeclarationNode::uFloat64x ); }
+	| uFLOAT128
+		{ $$ = DeclarationNode::newBasicType( DeclarationNode::uFloat128 ); }
 	| COMPLEX											// C99
 		{ $$ = DeclarationNode::newComplexType( DeclarationNode::Complex ); }
Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -474,8 +474,11 @@
 		}
 
-		// mark specialization cost of return types
-		for ( DeclarationWithType* returnVal : function->returnVals ) {
-			convCost.decSpec( specCost( returnVal->get_type() ) );
-		}
+		// specialization cost of return types can't be accounted for directly, it disables 
+		// otherwise-identical calls, like this example based on auto-newline in the I/O lib:
+		//
+		//   forall(otype OS) {
+		//     void ?|?(OS&, int);  // with newline
+		//     OS&  ?|?(OS&, int);  // no newline, always chosen due to more specialization
+		//   }
 
 		// mark type variable and specialization cost of forall clause
@@ -483,9 +486,4 @@
 		for ( TypeDecl* td : function->forall ) {
 			convCost.decSpec( td->assertions.size() );
-		}
-
-		// xxx -- replace with new costs in resolver
-		for ( InferredParams::const_iterator assert = appExpr->inferParams.begin(); assert != appExpr->inferParams.end(); ++assert ) {
-			convCost += computeConversionCost( assert->second.actualType, assert->second.formalType, indexer, alt.env );
 		}
 
@@ -1229,5 +1227,5 @@
 				Alternative newAlt{ 
 					restructureCast( alt.expr->clone(), toType, castExpr->isGenerated ), 
-					alt.env, openVars, needAssertions, alt.cost + thisCost, thisCost };
+					alt.env, openVars, needAssertions, alt.cost, alt.cost + thisCost };
 				inferParameters( newAlt, back_inserter( candidates ) );
 			} // if
Index: src/ResolvExpr/CommonType.cc
===================================================================
--- src/ResolvExpr/CommonType.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/ResolvExpr/CommonType.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 06:59:27 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Sep 25 15:18:17 2017
-// Update Count     : 9
+// Last Modified On : Thu Feb 14 17:10:10 2019
+// Update Count     : 24
 //
 
@@ -176,35 +176,308 @@
 	}
 
-	static const BasicType::Kind combinedType[][ BasicType::NUMBER_OF_BASIC_TYPES ] =
-	{
-/* 		Bool		Char	SignedChar	UnsignedChar	ShortSignedInt	ShortUnsignedInt	SignedInt	UnsignedInt	LongSignedInt	LongUnsignedInt	LongLongSignedInt	LongLongUnsignedInt	Float	Double	LongDouble	FloatComplex	DoubleComplex	LongDoubleComplex	FloatImaginary	DoubleImaginary	LongDoubleImaginary   SignedInt128   UnsignedInt128   Float80   Float128 */
-		/* Bool */ 	{ BasicType::Bool,		BasicType::Char,	BasicType::SignedChar,	BasicType::UnsignedChar,	BasicType::ShortSignedInt,	BasicType::ShortUnsignedInt,	BasicType::SignedInt,	BasicType::UnsignedInt,	BasicType::LongSignedInt,	BasicType::LongUnsignedInt,	BasicType::LongLongSignedInt,	BasicType::LongLongUnsignedInt,	BasicType::Float,	BasicType::Double,	BasicType::LongDouble,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::SignedInt128,	BasicType::UnsignedInt128, BasicType::Float80, BasicType::Float128 },
-		/* Char */ 	{ BasicType::Char,		BasicType::Char,	BasicType::UnsignedChar,	BasicType::UnsignedChar,	BasicType::ShortSignedInt,	BasicType::ShortUnsignedInt,	BasicType::SignedInt,	BasicType::UnsignedInt,	BasicType::LongSignedInt,	BasicType::LongUnsignedInt,	BasicType::LongLongSignedInt,	BasicType::LongLongUnsignedInt,	BasicType::Float,	BasicType::Double,	BasicType::LongDouble,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::SignedInt128,	BasicType::UnsignedInt128, BasicType::Float80, BasicType::Float128 },
-		/* SignedChar */ 	{ BasicType::SignedChar,	BasicType::UnsignedChar,	BasicType::SignedChar,	BasicType::UnsignedChar,	BasicType::ShortSignedInt,	BasicType::ShortUnsignedInt,	BasicType::SignedInt,	BasicType::UnsignedInt,	BasicType::LongSignedInt,	BasicType::LongUnsignedInt,	BasicType::LongLongSignedInt,	BasicType::LongLongUnsignedInt,	BasicType::Float,	BasicType::Double,	BasicType::LongDouble,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::SignedInt128,	BasicType::UnsignedInt128, BasicType::Float80, BasicType::Float128 },
-		/* UnsignedChar */ 	{ BasicType::UnsignedChar,	BasicType::UnsignedChar,	BasicType::UnsignedChar,	BasicType::UnsignedChar,	BasicType::ShortSignedInt,	BasicType::ShortUnsignedInt,	BasicType::SignedInt,	BasicType::UnsignedInt,	BasicType::LongSignedInt,	BasicType::LongUnsignedInt,	BasicType::LongLongSignedInt,	BasicType::LongLongUnsignedInt,	BasicType::Float,	BasicType::Double,	BasicType::LongDouble,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::SignedInt128,	BasicType::UnsignedInt128, BasicType::Float80, BasicType::Float128 },
-		/* ShortSignedInt */ 	{ BasicType::ShortSignedInt,	BasicType::ShortSignedInt,	BasicType::ShortSignedInt,	BasicType::ShortSignedInt,	BasicType::ShortSignedInt,	BasicType::ShortUnsignedInt,	BasicType::SignedInt,	BasicType::UnsignedInt,	BasicType::LongSignedInt,	BasicType::LongUnsignedInt,	BasicType::LongLongSignedInt,	BasicType::LongLongUnsignedInt,	BasicType::Float,	BasicType::Double,	BasicType::LongDouble,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::SignedInt128,	BasicType::UnsignedInt128, BasicType::Float80, BasicType::Float128 },
-		/* ShortUnsignedInt */ 	{ BasicType::ShortUnsignedInt,	BasicType::ShortUnsignedInt,	BasicType::ShortUnsignedInt,	BasicType::ShortUnsignedInt,	BasicType::ShortUnsignedInt,	BasicType::ShortUnsignedInt,	BasicType::SignedInt,	BasicType::UnsignedInt,	BasicType::LongSignedInt,	BasicType::LongUnsignedInt,	BasicType::LongLongSignedInt,	BasicType::LongLongUnsignedInt,	BasicType::Float,	BasicType::Double,	BasicType::LongDouble,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::SignedInt128,	BasicType::UnsignedInt128, BasicType::Float80, BasicType::Float128 },
-		/* SignedInt */ 	{ BasicType::SignedInt,		BasicType::SignedInt,	BasicType::SignedInt,	BasicType::SignedInt,	BasicType::SignedInt,	BasicType::SignedInt,	BasicType::SignedInt,	BasicType::UnsignedInt,	BasicType::LongSignedInt,	BasicType::LongUnsignedInt,	BasicType::LongLongSignedInt,	BasicType::LongLongUnsignedInt,	BasicType::Float,	BasicType::Double,	BasicType::LongDouble,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::SignedInt128,	BasicType::UnsignedInt128, BasicType::Float80, BasicType::Float128 },
-		/* UnsignedInt */ 	{ BasicType::UnsignedInt,		BasicType::UnsignedInt,	BasicType::UnsignedInt,	BasicType::UnsignedInt,	BasicType::UnsignedInt,	BasicType::UnsignedInt,	BasicType::UnsignedInt,	BasicType::UnsignedInt,	BasicType::LongUnsignedInt,	BasicType::LongUnsignedInt,	BasicType::LongLongSignedInt,	BasicType::LongLongUnsignedInt,	BasicType::Float,	BasicType::Double,	BasicType::LongDouble,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::SignedInt128,	BasicType::UnsignedInt128, BasicType::Float80, BasicType::Float128 },
-		/* LongSignedInt */ 	{ BasicType::LongSignedInt,		BasicType::LongSignedInt,	BasicType::LongSignedInt,	BasicType::LongSignedInt,	BasicType::LongSignedInt,	BasicType::LongSignedInt,	BasicType::LongSignedInt,	BasicType::LongUnsignedInt,	BasicType::LongSignedInt,	BasicType::LongUnsignedInt,	BasicType::LongLongSignedInt,	BasicType::LongLongUnsignedInt,	BasicType::Float,	BasicType::Double,	BasicType::LongDouble,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::SignedInt128,	BasicType::UnsignedInt128, BasicType::Float80, BasicType::Float128 },
-		/* LongUnsignedInt */ 	{ BasicType::LongUnsignedInt,	BasicType::LongUnsignedInt,	BasicType::LongUnsignedInt,	BasicType::LongUnsignedInt,	BasicType::LongUnsignedInt,	BasicType::LongUnsignedInt,	BasicType::LongUnsignedInt,	BasicType::LongUnsignedInt,	BasicType::LongUnsignedInt,	BasicType::LongUnsignedInt,	BasicType::LongLongSignedInt,	BasicType::LongLongUnsignedInt,	BasicType::Float,	BasicType::Double,	BasicType::LongDouble,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::SignedInt128,	BasicType::UnsignedInt128, BasicType::Float80, BasicType::Float128 },
-		/* LongLongSignedInt */ 	{ BasicType::LongLongSignedInt,	BasicType::LongLongSignedInt,	BasicType::LongLongSignedInt,	BasicType::LongLongSignedInt,	BasicType::LongLongSignedInt,	BasicType::LongLongSignedInt,	BasicType::LongLongSignedInt,	BasicType::LongLongSignedInt,	BasicType::LongLongSignedInt,	BasicType::LongLongSignedInt,	BasicType::LongLongSignedInt,	BasicType::LongLongUnsignedInt,	BasicType::Float,	BasicType::Double,	BasicType::LongDouble,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::SignedInt128,	BasicType::UnsignedInt128, BasicType::Float80, BasicType::Float128 },
-		/* LongLongUnsignedInt */ 	{ BasicType::LongLongUnsignedInt,	BasicType::LongLongUnsignedInt,	BasicType::LongLongUnsignedInt,	BasicType::LongLongUnsignedInt,	BasicType::LongLongUnsignedInt,	BasicType::LongLongUnsignedInt,	BasicType::LongLongUnsignedInt,	BasicType::LongLongUnsignedInt,	BasicType::LongLongUnsignedInt,	BasicType::LongLongUnsignedInt,	BasicType::LongLongUnsignedInt,	BasicType::LongLongUnsignedInt,	BasicType::Float,	BasicType::Double,	BasicType::LongDouble,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::SignedInt128,	BasicType::UnsignedInt128, BasicType::Float80, BasicType::Float128 },
-		/* Float */ 	{ BasicType::Float,	BasicType::Float,	BasicType::Float,	BasicType::Float,	BasicType::Float,	BasicType::Float,	BasicType::Float,	BasicType::Float,	BasicType::Float,	BasicType::Float,	BasicType::Float,	BasicType::Float,	BasicType::Float,	BasicType::Double,	BasicType::LongDouble,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::Float,	BasicType::Float, BasicType::Float80, BasicType::Float128 },
-		/* Double */ 	{ BasicType::Double,	BasicType::Double,	BasicType::Double,	BasicType::Double,	BasicType::Double,	BasicType::Double,	BasicType::Double,	BasicType::Double,	BasicType::Double,	BasicType::Double,	BasicType::Double,	BasicType::Double,	BasicType::Double,	BasicType::Double,	BasicType::LongDouble,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::Double,	BasicType::Double, BasicType::Float80, BasicType::Float128 },
-		/* LongDouble */ 	{ BasicType::LongDouble,		BasicType::LongDouble,	BasicType::LongDouble,	BasicType::LongDouble,	BasicType::LongDouble,	BasicType::LongDouble,	BasicType::LongDouble,	BasicType::LongDouble,	BasicType::LongDouble,	BasicType::LongDouble,	BasicType::LongDouble,	BasicType::LongDouble,	BasicType::LongDouble,	BasicType::LongDouble,	BasicType::LongDouble,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDouble,	BasicType::LongDouble, BasicType::BasicType::LongDouble, BasicType::Float128 },
-		/* FloatComplex */ 	{ BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::FloatComplex,	BasicType::FloatComplex, BasicType::LongDoubleComplex, BasicType::LongDoubleComplex, },
-		/* DoubleComplex */ 	{ BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex, BasicType::LongDoubleComplex, BasicType::LongDoubleComplex },
-		/* LongDoubleComplex */ 	{ BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex, BasicType::LongDoubleComplex, BasicType::LongDoubleComplex, },
-		/* FloatImaginary */ 	{ BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::FloatImaginary,	BasicType::DoubleImaginary,	BasicType::LongDoubleImaginary,	BasicType::FloatImaginary,	BasicType::FloatImaginary, BasicType::LongDoubleImaginary, BasicType::LongDoubleImaginary, },
-		/* DoubleImaginary */ 	{ BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::DoubleComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::DoubleImaginary,	BasicType::DoubleImaginary,	BasicType::LongDoubleImaginary,	BasicType::DoubleImaginary,	BasicType::DoubleImaginary, BasicType::LongDoubleImaginary, BasicType::LongDoubleImaginary, },
-		/* LongDoubleImaginary */ 	{ BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleImaginary,	BasicType::LongDoubleImaginary,	BasicType::LongDoubleImaginary, BasicType::LongDoubleImaginary, BasicType::LongDoubleImaginary, },
-		/* SignedInt128 */ 	{ BasicType::SignedInt128,	BasicType::SignedInt128,	BasicType::SignedInt128,	BasicType::SignedInt128,	BasicType::SignedInt128,	BasicType::SignedInt128,	BasicType::SignedInt128,	BasicType::SignedInt128,	BasicType::SignedInt128,	BasicType::SignedInt128,	BasicType::SignedInt128,	BasicType::SignedInt128,	BasicType::Float,	BasicType::Double,	BasicType::LongDouble,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::SignedInt128,	BasicType::UnsignedInt128, BasicType::Float80, BasicType::Float128, },
-		/* UnsignedInt128 */ 	{ BasicType::UnsignedInt128,	BasicType::UnsignedInt128,	BasicType::UnsignedInt128,	BasicType::UnsignedInt128,	BasicType::UnsignedInt128,	BasicType::UnsignedInt128,	BasicType::UnsignedInt128,	BasicType::UnsignedInt128,	BasicType::UnsignedInt128,	BasicType::UnsignedInt128,	BasicType::UnsignedInt128,	BasicType::UnsignedInt128,	BasicType::Float,	BasicType::Double,	BasicType::LongDouble,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::FloatComplex,	BasicType::DoubleComplex,	BasicType::LongDoubleComplex,	BasicType::UnsignedInt128,	BasicType::UnsignedInt128, BasicType::Float80, BasicType::Float128, },
-		/* Float80 */ 	{ BasicType::Float80,	BasicType::Float80,	BasicType::Float80,	BasicType::Float80,	BasicType::Float80,	BasicType::Float80,	BasicType::Float80,	BasicType::Float80,	BasicType::Float80,	BasicType::Float80,	BasicType::Float80,	BasicType::Float80,	BasicType::Float80,	BasicType::Float80,	BasicType::LongDouble,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::Float80,	BasicType::Float80, BasicType::Float80, BasicType::Float128 },
-		/* Float128 */ 	{ BasicType::Float128,	BasicType::Float128,	BasicType::Float128,	BasicType::Float128,	BasicType::Float128,	BasicType::Float128,	BasicType::Float128,	BasicType::Float128,	BasicType::Float128,	BasicType::Float128,	BasicType::Float128,	BasicType::Float128,	BasicType::Float128,	BasicType::Float128,	BasicType::Float128,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::LongDoubleComplex,	BasicType::Float128,	BasicType::Float128, BasicType::Float128, BasicType::Float128 },
-	};
+	// GENERATED START, DO NOT EDIT
+	// GENERATED BY BasicTypes-gen.cc
+	#define BT BasicType::
+	static const BasicType::Kind commonTypes[BasicType::NUMBER_OF_BASIC_TYPES][BasicType::NUMBER_OF_BASIC_TYPES] = { // nearest common ancestor
+		/*		                        B                       C                      SC                      UC                      SI                     SUI
+				                        I                      UI                      LI                     LUI                     LLI                    LLUI
+				                       IB                     UIB                     _FH                     _FH                      _F                     _FC
+				                        F                      FC                     _FX                    _FXC                      FD                    _FDC
+				                        D                      DC                    F80X                   _FDXC                     F80                     _FB
+				                    _FLDC                      FB                      LD                     LDC                    _FBX                  _FLDXC
+				 */
+				  {
+		/*     B*/                BT Bool,                BT Char,          BT SignedChar,        BT UnsignedChar,      BT ShortSignedInt,    BT ShortUnsignedInt,
+				             BT SignedInt,         BT UnsignedInt,       BT LongSignedInt,     BT LongUnsignedInt,   BT LongLongSignedInt, BT LongLongUnsignedInt,
+				          BT SignedInt128,      BT UnsignedInt128,            BT uFloat16,     BT uFloat16Complex,            BT uFloat32,     BT uFloat32Complex,
+				                 BT Float,        BT FloatComplex,           BT uFloat32x,    BT uFloat32xComplex,            BT uFloat64,     BT uFloat64Complex,
+				                BT Double,       BT DoubleComplex,           BT uFloat64x,    BT uFloat64xComplex,           BT uuFloat80,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*     C*/                BT Char,                BT Char,          BT SignedChar,        BT UnsignedChar,      BT ShortSignedInt,    BT ShortUnsignedInt,
+				             BT SignedInt,         BT UnsignedInt,       BT LongSignedInt,     BT LongUnsignedInt,   BT LongLongSignedInt, BT LongLongUnsignedInt,
+				          BT SignedInt128,      BT UnsignedInt128,            BT uFloat16,     BT uFloat16Complex,            BT uFloat32,     BT uFloat32Complex,
+				                 BT Float,        BT FloatComplex,           BT uFloat32x,    BT uFloat32xComplex,            BT uFloat64,     BT uFloat64Complex,
+				                BT Double,       BT DoubleComplex,           BT uFloat64x,    BT uFloat64xComplex,           BT uuFloat80,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*    SC*/          BT SignedChar,          BT SignedChar,          BT SignedChar,        BT UnsignedChar,      BT ShortSignedInt,    BT ShortUnsignedInt,
+				             BT SignedInt,         BT UnsignedInt,       BT LongSignedInt,     BT LongUnsignedInt,   BT LongLongSignedInt, BT LongLongUnsignedInt,
+				          BT SignedInt128,      BT UnsignedInt128,            BT uFloat16,     BT uFloat16Complex,            BT uFloat32,     BT uFloat32Complex,
+				                 BT Float,        BT FloatComplex,           BT uFloat32x,    BT uFloat32xComplex,            BT uFloat64,     BT uFloat64Complex,
+				                BT Double,       BT DoubleComplex,           BT uFloat64x,    BT uFloat64xComplex,           BT uuFloat80,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*    UC*/        BT UnsignedChar,        BT UnsignedChar,        BT UnsignedChar,        BT UnsignedChar,      BT ShortSignedInt,    BT ShortUnsignedInt,
+				             BT SignedInt,         BT UnsignedInt,       BT LongSignedInt,     BT LongUnsignedInt,   BT LongLongSignedInt, BT LongLongUnsignedInt,
+				          BT SignedInt128,      BT UnsignedInt128,            BT uFloat16,     BT uFloat16Complex,            BT uFloat32,     BT uFloat32Complex,
+				                 BT Float,        BT FloatComplex,           BT uFloat32x,    BT uFloat32xComplex,            BT uFloat64,     BT uFloat64Complex,
+				                BT Double,       BT DoubleComplex,           BT uFloat64x,    BT uFloat64xComplex,           BT uuFloat80,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*    SI*/      BT ShortSignedInt,      BT ShortSignedInt,      BT ShortSignedInt,      BT ShortSignedInt,      BT ShortSignedInt,    BT ShortUnsignedInt,
+				             BT SignedInt,         BT UnsignedInt,       BT LongSignedInt,     BT LongUnsignedInt,   BT LongLongSignedInt, BT LongLongUnsignedInt,
+				          BT SignedInt128,      BT UnsignedInt128,            BT uFloat16,     BT uFloat16Complex,            BT uFloat32,     BT uFloat32Complex,
+				                 BT Float,        BT FloatComplex,           BT uFloat32x,    BT uFloat32xComplex,            BT uFloat64,     BT uFloat64Complex,
+				                BT Double,       BT DoubleComplex,           BT uFloat64x,    BT uFloat64xComplex,           BT uuFloat80,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*   SUI*/    BT ShortUnsignedInt,    BT ShortUnsignedInt,    BT ShortUnsignedInt,    BT ShortUnsignedInt,    BT ShortUnsignedInt,    BT ShortUnsignedInt,
+				             BT SignedInt,         BT UnsignedInt,       BT LongSignedInt,     BT LongUnsignedInt,   BT LongLongSignedInt, BT LongLongUnsignedInt,
+				          BT SignedInt128,      BT UnsignedInt128,            BT uFloat16,     BT uFloat16Complex,            BT uFloat32,     BT uFloat32Complex,
+				                 BT Float,        BT FloatComplex,           BT uFloat32x,    BT uFloat32xComplex,            BT uFloat64,     BT uFloat64Complex,
+				                BT Double,       BT DoubleComplex,           BT uFloat64x,    BT uFloat64xComplex,           BT uuFloat80,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*     I*/           BT SignedInt,           BT SignedInt,           BT SignedInt,           BT SignedInt,           BT SignedInt,           BT SignedInt,
+				             BT SignedInt,         BT UnsignedInt,       BT LongSignedInt,     BT LongUnsignedInt,   BT LongLongSignedInt, BT LongLongUnsignedInt,
+				          BT SignedInt128,      BT UnsignedInt128,            BT uFloat16,     BT uFloat16Complex,            BT uFloat32,     BT uFloat32Complex,
+				                 BT Float,        BT FloatComplex,           BT uFloat32x,    BT uFloat32xComplex,            BT uFloat64,     BT uFloat64Complex,
+				                BT Double,       BT DoubleComplex,           BT uFloat64x,    BT uFloat64xComplex,           BT uuFloat80,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*    UI*/         BT UnsignedInt,         BT UnsignedInt,         BT UnsignedInt,         BT UnsignedInt,         BT UnsignedInt,         BT UnsignedInt,
+				           BT UnsignedInt,         BT UnsignedInt,       BT LongSignedInt,     BT LongUnsignedInt,   BT LongLongSignedInt, BT LongLongUnsignedInt,
+				          BT SignedInt128,      BT UnsignedInt128,            BT uFloat16,     BT uFloat16Complex,            BT uFloat32,     BT uFloat32Complex,
+				                 BT Float,        BT FloatComplex,           BT uFloat32x,    BT uFloat32xComplex,            BT uFloat64,     BT uFloat64Complex,
+				                BT Double,       BT DoubleComplex,           BT uFloat64x,    BT uFloat64xComplex,           BT uuFloat80,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*    LI*/       BT LongSignedInt,       BT LongSignedInt,       BT LongSignedInt,       BT LongSignedInt,       BT LongSignedInt,       BT LongSignedInt,
+				         BT LongSignedInt,       BT LongSignedInt,       BT LongSignedInt,     BT LongUnsignedInt,   BT LongLongSignedInt, BT LongLongUnsignedInt,
+				          BT SignedInt128,      BT UnsignedInt128,            BT uFloat16,     BT uFloat16Complex,            BT uFloat32,     BT uFloat32Complex,
+				                 BT Float,        BT FloatComplex,           BT uFloat32x,    BT uFloat32xComplex,            BT uFloat64,     BT uFloat64Complex,
+				                BT Double,       BT DoubleComplex,           BT uFloat64x,    BT uFloat64xComplex,           BT uuFloat80,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*   LUI*/     BT LongUnsignedInt,     BT LongUnsignedInt,     BT LongUnsignedInt,     BT LongUnsignedInt,     BT LongUnsignedInt,     BT LongUnsignedInt,
+				       BT LongUnsignedInt,     BT LongUnsignedInt,     BT LongUnsignedInt,     BT LongUnsignedInt,   BT LongLongSignedInt, BT LongLongUnsignedInt,
+				          BT SignedInt128,      BT UnsignedInt128,            BT uFloat16,     BT uFloat16Complex,            BT uFloat32,     BT uFloat32Complex,
+				                 BT Float,        BT FloatComplex,           BT uFloat32x,    BT uFloat32xComplex,            BT uFloat64,     BT uFloat64Complex,
+				                BT Double,       BT DoubleComplex,           BT uFloat64x,    BT uFloat64xComplex,           BT uuFloat80,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*   LLI*/   BT LongLongSignedInt,   BT LongLongSignedInt,   BT LongLongSignedInt,   BT LongLongSignedInt,   BT LongLongSignedInt,   BT LongLongSignedInt,
+				     BT LongLongSignedInt,   BT LongLongSignedInt,   BT LongLongSignedInt,   BT LongLongSignedInt,   BT LongLongSignedInt, BT LongLongUnsignedInt,
+				          BT SignedInt128,      BT UnsignedInt128,            BT uFloat16,     BT uFloat16Complex,            BT uFloat32,     BT uFloat32Complex,
+				                 BT Float,        BT FloatComplex,           BT uFloat32x,    BT uFloat32xComplex,            BT uFloat64,     BT uFloat64Complex,
+				                BT Double,       BT DoubleComplex,           BT uFloat64x,    BT uFloat64xComplex,           BT uuFloat80,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*  LLUI*/ BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt,
+				   BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt,
+				          BT SignedInt128,      BT UnsignedInt128,            BT uFloat16,     BT uFloat16Complex,            BT uFloat32,     BT uFloat32Complex,
+				                 BT Float,        BT FloatComplex,           BT uFloat32x,    BT uFloat32xComplex,            BT uFloat64,     BT uFloat64Complex,
+				                BT Double,       BT DoubleComplex,           BT uFloat64x,    BT uFloat64xComplex,           BT uuFloat80,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*    IB*/        BT SignedInt128,        BT SignedInt128,        BT SignedInt128,        BT SignedInt128,        BT SignedInt128,        BT SignedInt128,
+				          BT SignedInt128,        BT SignedInt128,        BT SignedInt128,        BT SignedInt128,        BT SignedInt128,        BT SignedInt128,
+				          BT SignedInt128,      BT UnsignedInt128,            BT uFloat16,     BT uFloat16Complex,            BT uFloat32,     BT uFloat32Complex,
+				                 BT Float,        BT FloatComplex,           BT uFloat32x,    BT uFloat32xComplex,            BT uFloat64,     BT uFloat64Complex,
+				                BT Double,       BT DoubleComplex,           BT uFloat64x,    BT uFloat64xComplex,           BT uuFloat80,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*   UIB*/      BT UnsignedInt128,      BT UnsignedInt128,      BT UnsignedInt128,      BT UnsignedInt128,      BT UnsignedInt128,      BT UnsignedInt128,
+				        BT UnsignedInt128,      BT UnsignedInt128,      BT UnsignedInt128,      BT UnsignedInt128,      BT UnsignedInt128,      BT UnsignedInt128,
+				        BT UnsignedInt128,      BT UnsignedInt128,            BT uFloat16,     BT uFloat16Complex,            BT uFloat32,     BT uFloat32Complex,
+				                 BT Float,        BT FloatComplex,           BT uFloat32x,    BT uFloat32xComplex,            BT uFloat64,     BT uFloat64Complex,
+				                BT Double,       BT DoubleComplex,           BT uFloat64x,    BT uFloat64xComplex,           BT uuFloat80,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*   _FH*/            BT uFloat16,            BT uFloat16,            BT uFloat16,            BT uFloat16,            BT uFloat16,            BT uFloat16,
+				              BT uFloat16,            BT uFloat16,            BT uFloat16,            BT uFloat16,            BT uFloat16,            BT uFloat16,
+				              BT uFloat16,            BT uFloat16,            BT uFloat16,     BT uFloat16Complex,            BT uFloat32,     BT uFloat32Complex,
+				                 BT Float,        BT FloatComplex,           BT uFloat32x,    BT uFloat32xComplex,            BT uFloat64,     BT uFloat64Complex,
+				                BT Double,       BT DoubleComplex,           BT uFloat64x,    BT uFloat64xComplex,           BT uuFloat80,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*   _FH*/     BT uFloat16Complex,     BT uFloat16Complex,     BT uFloat16Complex,     BT uFloat16Complex,     BT uFloat16Complex,     BT uFloat16Complex,
+				       BT uFloat16Complex,     BT uFloat16Complex,     BT uFloat16Complex,     BT uFloat16Complex,     BT uFloat16Complex,     BT uFloat16Complex,
+				       BT uFloat16Complex,     BT uFloat16Complex,     BT uFloat16Complex,     BT uFloat16Complex,     BT uFloat32Complex,     BT uFloat32Complex,
+				          BT FloatComplex,        BT FloatComplex,    BT uFloat32xComplex,    BT uFloat32xComplex,     BT uFloat64Complex,     BT uFloat64Complex,
+				         BT DoubleComplex,       BT DoubleComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat128Complex,
+				      BT uFloat128Complex,    BT uFloat128Complex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,
+				  },
+				  {
+		/*    _F*/            BT uFloat32,            BT uFloat32,            BT uFloat32,            BT uFloat32,            BT uFloat32,            BT uFloat32,
+				              BT uFloat32,            BT uFloat32,            BT uFloat32,            BT uFloat32,            BT uFloat32,            BT uFloat32,
+				              BT uFloat32,            BT uFloat32,            BT uFloat32,     BT uFloat32Complex,            BT uFloat32,     BT uFloat32Complex,
+				                 BT Float,        BT FloatComplex,           BT uFloat32x,    BT uFloat32xComplex,            BT uFloat64,     BT uFloat64Complex,
+				                BT Double,       BT DoubleComplex,           BT uFloat64x,    BT uFloat64xComplex,           BT uuFloat80,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*   _FC*/     BT uFloat32Complex,     BT uFloat32Complex,     BT uFloat32Complex,     BT uFloat32Complex,     BT uFloat32Complex,     BT uFloat32Complex,
+				       BT uFloat32Complex,     BT uFloat32Complex,     BT uFloat32Complex,     BT uFloat32Complex,     BT uFloat32Complex,     BT uFloat32Complex,
+				       BT uFloat32Complex,     BT uFloat32Complex,     BT uFloat32Complex,     BT uFloat32Complex,     BT uFloat32Complex,     BT uFloat32Complex,
+				          BT FloatComplex,        BT FloatComplex,    BT uFloat32xComplex,    BT uFloat32xComplex,     BT uFloat64Complex,     BT uFloat64Complex,
+				         BT DoubleComplex,       BT DoubleComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat128Complex,
+				      BT uFloat128Complex,    BT uFloat128Complex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,
+				  },
+				  {
+		/*     F*/               BT Float,               BT Float,               BT Float,               BT Float,               BT Float,               BT Float,
+				                 BT Float,               BT Float,               BT Float,               BT Float,               BT Float,               BT Float,
+				                 BT Float,               BT Float,               BT Float,        BT FloatComplex,               BT Float,        BT FloatComplex,
+				                 BT Float,        BT FloatComplex,           BT uFloat32x,    BT uFloat32xComplex,            BT uFloat64,     BT uFloat64Complex,
+				                BT Double,       BT DoubleComplex,           BT uFloat64x,    BT uFloat64xComplex,           BT uuFloat80,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*    FC*/        BT FloatComplex,        BT FloatComplex,        BT FloatComplex,        BT FloatComplex,        BT FloatComplex,        BT FloatComplex,
+				          BT FloatComplex,        BT FloatComplex,        BT FloatComplex,        BT FloatComplex,        BT FloatComplex,        BT FloatComplex,
+				          BT FloatComplex,        BT FloatComplex,        BT FloatComplex,        BT FloatComplex,        BT FloatComplex,        BT FloatComplex,
+				          BT FloatComplex,        BT FloatComplex,    BT uFloat32xComplex,    BT uFloat32xComplex,     BT uFloat64Complex,     BT uFloat64Complex,
+				         BT DoubleComplex,       BT DoubleComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat128Complex,
+				      BT uFloat128Complex,    BT uFloat128Complex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,
+				  },
+				  {
+		/*   _FX*/           BT uFloat32x,           BT uFloat32x,           BT uFloat32x,           BT uFloat32x,           BT uFloat32x,           BT uFloat32x,
+				             BT uFloat32x,           BT uFloat32x,           BT uFloat32x,           BT uFloat32x,           BT uFloat32x,           BT uFloat32x,
+				             BT uFloat32x,           BT uFloat32x,           BT uFloat32x,    BT uFloat32xComplex,           BT uFloat32x,    BT uFloat32xComplex,
+				             BT uFloat32x,    BT uFloat32xComplex,           BT uFloat32x,    BT uFloat32xComplex,            BT uFloat64,     BT uFloat64Complex,
+				                BT Double,       BT DoubleComplex,           BT uFloat64x,    BT uFloat64xComplex,           BT uuFloat80,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*  _FXC*/    BT uFloat32xComplex,    BT uFloat32xComplex,    BT uFloat32xComplex,    BT uFloat32xComplex,    BT uFloat32xComplex,    BT uFloat32xComplex,
+				      BT uFloat32xComplex,    BT uFloat32xComplex,    BT uFloat32xComplex,    BT uFloat32xComplex,    BT uFloat32xComplex,    BT uFloat32xComplex,
+				      BT uFloat32xComplex,    BT uFloat32xComplex,    BT uFloat32xComplex,    BT uFloat32xComplex,    BT uFloat32xComplex,    BT uFloat32xComplex,
+				      BT uFloat32xComplex,    BT uFloat32xComplex,    BT uFloat32xComplex,    BT uFloat32xComplex,     BT uFloat64Complex,     BT uFloat64Complex,
+				         BT DoubleComplex,       BT DoubleComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat128Complex,
+				      BT uFloat128Complex,    BT uFloat128Complex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,
+				  },
+				  {
+		/*    FD*/            BT uFloat64,            BT uFloat64,            BT uFloat64,            BT uFloat64,            BT uFloat64,            BT uFloat64,
+				              BT uFloat64,            BT uFloat64,            BT uFloat64,            BT uFloat64,            BT uFloat64,            BT uFloat64,
+				              BT uFloat64,            BT uFloat64,            BT uFloat64,     BT uFloat64Complex,            BT uFloat64,     BT uFloat64Complex,
+				              BT uFloat64,     BT uFloat64Complex,            BT uFloat64,     BT uFloat64Complex,            BT uFloat64,     BT uFloat64Complex,
+				                BT Double,       BT DoubleComplex,           BT uFloat64x,    BT uFloat64xComplex,           BT uuFloat80,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*  _FDC*/     BT uFloat64Complex,     BT uFloat64Complex,     BT uFloat64Complex,     BT uFloat64Complex,     BT uFloat64Complex,     BT uFloat64Complex,
+				       BT uFloat64Complex,     BT uFloat64Complex,     BT uFloat64Complex,     BT uFloat64Complex,     BT uFloat64Complex,     BT uFloat64Complex,
+				       BT uFloat64Complex,     BT uFloat64Complex,     BT uFloat64Complex,     BT uFloat64Complex,     BT uFloat64Complex,     BT uFloat64Complex,
+				       BT uFloat64Complex,     BT uFloat64Complex,     BT uFloat64Complex,     BT uFloat64Complex,     BT uFloat64Complex,     BT uFloat64Complex,
+				         BT DoubleComplex,       BT DoubleComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat128Complex,
+				      BT uFloat128Complex,    BT uFloat128Complex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,
+				  },
+				  {
+		/*     D*/              BT Double,              BT Double,              BT Double,              BT Double,              BT Double,              BT Double,
+				                BT Double,              BT Double,              BT Double,              BT Double,              BT Double,              BT Double,
+				                BT Double,              BT Double,              BT Double,       BT DoubleComplex,              BT Double,       BT DoubleComplex,
+				                BT Double,       BT DoubleComplex,              BT Double,       BT DoubleComplex,              BT Double,       BT DoubleComplex,
+				                BT Double,       BT DoubleComplex,           BT uFloat64x,    BT uFloat64xComplex,           BT uuFloat80,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*    DC*/       BT DoubleComplex,       BT DoubleComplex,       BT DoubleComplex,       BT DoubleComplex,       BT DoubleComplex,       BT DoubleComplex,
+				         BT DoubleComplex,       BT DoubleComplex,       BT DoubleComplex,       BT DoubleComplex,       BT DoubleComplex,       BT DoubleComplex,
+				         BT DoubleComplex,       BT DoubleComplex,       BT DoubleComplex,       BT DoubleComplex,       BT DoubleComplex,       BT DoubleComplex,
+				         BT DoubleComplex,       BT DoubleComplex,       BT DoubleComplex,       BT DoubleComplex,       BT DoubleComplex,       BT DoubleComplex,
+				         BT DoubleComplex,       BT DoubleComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat128Complex,
+				      BT uFloat128Complex,    BT uFloat128Complex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,
+				  },
+				  {
+		/*  F80X*/           BT uFloat64x,           BT uFloat64x,           BT uFloat64x,           BT uFloat64x,           BT uFloat64x,           BT uFloat64x,
+				             BT uFloat64x,           BT uFloat64x,           BT uFloat64x,           BT uFloat64x,           BT uFloat64x,           BT uFloat64x,
+				             BT uFloat64x,           BT uFloat64x,           BT uFloat64x,    BT uFloat64xComplex,           BT uFloat64x,    BT uFloat64xComplex,
+				             BT uFloat64x,    BT uFloat64xComplex,           BT uFloat64x,    BT uFloat64xComplex,           BT uFloat64x,    BT uFloat64xComplex,
+				             BT uFloat64x,    BT uFloat64xComplex,           BT uFloat64x,    BT uFloat64xComplex,           BT uuFloat80,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/* _FDXC*/    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,
+				      BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,
+				      BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,
+				      BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,
+				      BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat64xComplex,    BT uFloat128Complex,
+				      BT uFloat128Complex,    BT uFloat128Complex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,
+				  },
+				  {
+		/*   F80*/           BT uuFloat80,           BT uuFloat80,           BT uuFloat80,           BT uuFloat80,           BT uuFloat80,           BT uuFloat80,
+				             BT uuFloat80,           BT uuFloat80,           BT uuFloat80,           BT uuFloat80,           BT uuFloat80,           BT uuFloat80,
+				             BT uuFloat80,           BT uuFloat80,           BT uuFloat80,    BT uFloat64xComplex,           BT uuFloat80,    BT uFloat64xComplex,
+				             BT uuFloat80,    BT uFloat64xComplex,           BT uuFloat80,    BT uFloat64xComplex,           BT uuFloat80,    BT uFloat64xComplex,
+				             BT uuFloat80,    BT uFloat64xComplex,           BT uuFloat80,    BT uFloat64xComplex,           BT uuFloat80,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*   _FB*/           BT uFloat128,           BT uFloat128,           BT uFloat128,           BT uFloat128,           BT uFloat128,           BT uFloat128,
+				             BT uFloat128,           BT uFloat128,           BT uFloat128,           BT uFloat128,           BT uFloat128,           BT uFloat128,
+				             BT uFloat128,           BT uFloat128,           BT uFloat128,    BT uFloat128Complex,           BT uFloat128,    BT uFloat128Complex,
+				             BT uFloat128,    BT uFloat128Complex,           BT uFloat128,    BT uFloat128Complex,           BT uFloat128,    BT uFloat128Complex,
+				             BT uFloat128,    BT uFloat128Complex,           BT uFloat128,    BT uFloat128Complex,           BT uFloat128,           BT uFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/* _FLDC*/    BT uFloat128Complex,    BT uFloat128Complex,    BT uFloat128Complex,    BT uFloat128Complex,    BT uFloat128Complex,    BT uFloat128Complex,
+				      BT uFloat128Complex,    BT uFloat128Complex,    BT uFloat128Complex,    BT uFloat128Complex,    BT uFloat128Complex,    BT uFloat128Complex,
+				      BT uFloat128Complex,    BT uFloat128Complex,    BT uFloat128Complex,    BT uFloat128Complex,    BT uFloat128Complex,    BT uFloat128Complex,
+				      BT uFloat128Complex,    BT uFloat128Complex,    BT uFloat128Complex,    BT uFloat128Complex,    BT uFloat128Complex,    BT uFloat128Complex,
+				      BT uFloat128Complex,    BT uFloat128Complex,    BT uFloat128Complex,    BT uFloat128Complex,    BT uFloat128Complex,    BT uFloat128Complex,
+				      BT uFloat128Complex,    BT uFloat128Complex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,
+				  },
+				  {
+		/*    FB*/          BT uuFloat128,          BT uuFloat128,          BT uuFloat128,          BT uuFloat128,          BT uuFloat128,          BT uuFloat128,
+				            BT uuFloat128,          BT uuFloat128,          BT uuFloat128,          BT uuFloat128,          BT uuFloat128,          BT uuFloat128,
+				            BT uuFloat128,          BT uuFloat128,          BT uuFloat128,    BT uFloat128Complex,          BT uuFloat128,    BT uFloat128Complex,
+				            BT uuFloat128,    BT uFloat128Complex,          BT uuFloat128,    BT uFloat128Complex,          BT uuFloat128,    BT uFloat128Complex,
+				            BT uuFloat128,    BT uFloat128Complex,          BT uuFloat128,    BT uFloat128Complex,          BT uuFloat128,          BT uuFloat128,
+				      BT uFloat128Complex,          BT uuFloat128,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*    LD*/          BT LongDouble,          BT LongDouble,          BT LongDouble,          BT LongDouble,          BT LongDouble,          BT LongDouble,
+				            BT LongDouble,          BT LongDouble,          BT LongDouble,          BT LongDouble,          BT LongDouble,          BT LongDouble,
+				            BT LongDouble,          BT LongDouble,          BT LongDouble,   BT LongDoubleComplex,          BT LongDouble,   BT LongDoubleComplex,
+				            BT LongDouble,   BT LongDoubleComplex,          BT LongDouble,   BT LongDoubleComplex,          BT LongDouble,   BT LongDoubleComplex,
+				            BT LongDouble,   BT LongDoubleComplex,          BT LongDouble,   BT LongDoubleComplex,          BT LongDouble,          BT LongDouble,
+				     BT LongDoubleComplex,          BT LongDouble,          BT LongDouble,   BT LongDoubleComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*   LDC*/   BT LongDoubleComplex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT LongDoubleComplex,
+				     BT LongDoubleComplex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT LongDoubleComplex,
+				     BT LongDoubleComplex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT LongDoubleComplex,
+				     BT LongDoubleComplex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT LongDoubleComplex,
+				     BT LongDoubleComplex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT LongDoubleComplex,
+				     BT LongDoubleComplex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT LongDoubleComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,
+				  },
+				  {
+		/*  _FBX*/          BT uFloat128x,          BT uFloat128x,          BT uFloat128x,          BT uFloat128x,          BT uFloat128x,          BT uFloat128x,
+				            BT uFloat128x,          BT uFloat128x,          BT uFloat128x,          BT uFloat128x,          BT uFloat128x,          BT uFloat128x,
+				            BT uFloat128x,          BT uFloat128x,          BT uFloat128x,   BT uFloat128xComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				            BT uFloat128x,   BT uFloat128xComplex,          BT uFloat128x,   BT uFloat128xComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				            BT uFloat128x,   BT uFloat128xComplex,          BT uFloat128x,   BT uFloat128xComplex,          BT uFloat128x,          BT uFloat128x,
+				     BT uFloat128xComplex,          BT uFloat128x,          BT uFloat128x,   BT uFloat128xComplex,          BT uFloat128x,   BT uFloat128xComplex,
+				  },
+				  {
+		/*_FLDXC*/   BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,
+				     BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,
+				     BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,
+				     BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,
+				     BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,
+				     BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,   BT uFloat128xComplex,
+				  },
+	}; // commonTypes
+	#undef BT
+	// GENERATED END
 	static_assert(
-		sizeof(combinedType)/sizeof(combinedType[0][0]) == BasicType::NUMBER_OF_BASIC_TYPES*BasicType::NUMBER_OF_BASIC_TYPES,
+		sizeof(commonTypes)/sizeof(commonTypes[0][0]) == BasicType::NUMBER_OF_BASIC_TYPES*BasicType::NUMBER_OF_BASIC_TYPES,
 		"Each basic type kind should have a corresponding row in the combined type matrix"
 	);
@@ -218,5 +491,5 @@
 	void CommonType::postvisit( BasicType *basicType ) {
 		if ( BasicType *otherBasic = dynamic_cast< BasicType* >( type2 ) ) {
-			BasicType::Kind newType = combinedType[ basicType->get_kind() ][ otherBasic->get_kind() ];
+			BasicType::Kind newType = commonTypes[ basicType->get_kind() ][ otherBasic->get_kind() ];
 			if ( ( ( newType == basicType->get_kind() && basicType->get_qualifiers() >= otherBasic->get_qualifiers() ) || widenFirst ) && ( ( newType == otherBasic->get_kind() && basicType->get_qualifiers() <= otherBasic->get_qualifiers() ) || widenSecond ) ) {
 				result = new BasicType( basicType->get_qualifiers() | otherBasic->get_qualifiers(), newType );
@@ -224,5 +497,5 @@
 		} else if ( dynamic_cast< EnumInstType * > ( type2 ) || dynamic_cast< ZeroType* >( type2 ) || dynamic_cast< OneType* >( type2 ) ) {
 			// use signed int in lieu of the enum/zero/one type
-			BasicType::Kind newType = combinedType[ basicType->get_kind() ][ BasicType::SignedInt ];
+			BasicType::Kind newType = commonTypes[ basicType->get_kind() ][ BasicType::SignedInt ];
 			if ( ( ( newType == basicType->get_kind() && basicType->get_qualifiers() >= type2->get_qualifiers() ) || widenFirst ) && ( ( newType != basicType->get_kind() && basicType->get_qualifiers() <= type2->get_qualifiers() ) || widenSecond ) ) {
 				result = new BasicType( basicType->get_qualifiers() | type2->get_qualifiers(), newType );
Index: src/ResolvExpr/ConversionCost.cc
===================================================================
--- src/ResolvExpr/ConversionCost.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/ResolvExpr/ConversionCost.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 07:06:19 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Sep 25 15:43:34 2017
-// Update Count     : 10
+// Last Modified On : Thu Feb 14 17:04:31 2019
+// Update Count     : 23
 //
 
@@ -28,12 +28,13 @@
 
 namespace ResolvExpr {
-	const Cost Cost::zero =      Cost{  0,  0,  0,  0,  0,  0 };
-	const Cost Cost::infinity =  Cost{ -1, -1, -1, -1,  1, -1 };
-	const Cost Cost::unsafe =    Cost{  1,  0,  0,  0,  0,  0 };
-	const Cost Cost::poly =      Cost{  0,  1,  0,  0,  0,  0 };
-	const Cost Cost::safe =      Cost{  0,  0,  1,  0,  0,  0 };
-	const Cost Cost::var =       Cost{  0,  0,  0,  1,  0,  0 };
-	const Cost Cost::spec =      Cost{  0,  0,  0,  0, -1,  0 };
-	const Cost Cost::reference = Cost{  0,  0,  0,  0,  0,  1 };
+	const Cost Cost::zero =      Cost{  0,  0,  0,  0,  0,  0,  0 };
+	const Cost Cost::infinity =  Cost{ -1, -1, -1, -1, -1,  1, -1 };
+	const Cost Cost::unsafe =    Cost{  1,  0,  0,  0,  0,  0,  0 };
+	const Cost Cost::poly =      Cost{  0,  1,  0,  0,  0,  0,  0 };
+	const Cost Cost::safe =      Cost{  0,  0,  1,  0,  0,  0,  0 };
+	const Cost Cost::sign =      Cost{  0,  0,  0,  1,  0,  0,  0 };
+	const Cost Cost::var =       Cost{  0,  0,  0,  0,  1,  0,  0 };
+	const Cost Cost::spec =      Cost{  0,  0,  0,  0,  0, -1,  0 };
+	const Cost Cost::reference = Cost{  0,  0,  0,  0,  0,  0,  1 };
 
 #if 0
@@ -42,4 +43,5 @@
 #define PRINT(x)
 #endif
+
 	Cost conversionCost( Type *src, Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ) {
 		if ( TypeInstType *destAsTypeInst = dynamic_cast< TypeInstType* >( dest ) ) {
@@ -179,91 +181,122 @@
 	}
 
-/*
-            Old
-            ===
-           Double
-             |
-           Float
-             |
-           ULong
-           /   \
-        UInt    Long
-           \   /
-            Int
-             |
-           Ushort
-             |
-           Short
-             |
-           Uchar
-           /   \
-        Schar   Char
-
-                                New
-                                ===
-                       +-----LongDoubleComplex--+
-           LongDouble--+          |             +-LongDoubleImag
-             |         +---DoubleComplex---+         |
-           Double------+        |          +----DoubleImag
-             |           +-FloatComplex-+            |
-           Float---------+              +-------FloatImag
-             |
-          ULongLong
-             |
-          LongLong
-             |
-           ULong
-           /   \
-        UInt    Long
-           \   /
-            Int
-             |
-           Ushort
-             |
-           Short
-             |
-           Uchar
-           /   \
-        Schar   Char
-           \   /
-            Bool
-*/
-
-	static const int costMatrix[][ BasicType::NUMBER_OF_BASIC_TYPES ] = {
-	/* Src \ Dest:	Bool	Char	SChar	UChar	Short	UShort	Int 	UInt	Long	ULong	LLong	ULLong	Float	Double	LDbl	FCplex	DCplex	LDCplex	FImag	DImag	LDImag	I128,	U128, F80, F128 */
-		/* Bool */ 	{ 0,	1,		1,		2,		3,		4,		5,		6,		6,		7,		8,		9,		12,		13,		14,		12,		13,		14,		-1,		-1,		-1,		10,		11,	  14,   15},
-		/* Char */ 	{ -1,	0,		-1,		1,		2,		3,		4,		5,		5,		6,		7,		8,		11,		12,		13,		11,		12,		13,		-1,		-1,		-1,		9,		10,	  13,   14},
-		/* SChar */ { -1,	-1,		0,		1,		2,		3,		4,		5,		5,		6,		7,		8,		11,		12,		13,		11,		12,		13,		-1,		-1,		-1,		9,		10,	  13,   14},
-		/* UChar */ { -1,	-1,		-1,		0,		1,		2,		3,		4,		4,		5,		6,		7,		10,		11,		12,		10,		11,		12,		-1,		-1,		-1,		8,		9,	  12,   13},
-		/* Short */ { -1,	-1,		-1,		-1,		0,		1,		2,		3,		3,		4,		5,		6,		9,		10,		11,		9,		10,		11,		-1,		-1,		-1,		7,		8,	  11,   12},
-		/* UShort */{ -1,	-1,		-1,		-1,		-1,		0,		1,		2,		2,		3,		4,		5,		8,		9,		10,		8,		9,		10,		-1,		-1,		-1,		6,		7,	  10,   11},
-		/* Int */ 	{ -1,	-1,		-1,		-1,		-1,		-1,		0,		1,		1,		2,		3,		4,		7,		8,		9,		7,		8,		9,		-1,		-1,		-1,		5,		6,	  9,    10},
-		/* UInt */ 	{ -1,	-1,		-1,		-1,		-1,		-1,		-1,		0,		-1,		1,		2,		3,		6,		7,		8,		6,		7,		8,		-1,		-1,		-1,		4,		5,	  8,    9},
-		/* Long */ 	{ -1,	-1,		-1,		-1,		-1,		-1,		-1,		-1,		0,		1,		2,		3,		6,		7,		8,		6,		7,		8,		-1,		-1,		-1,		4,		5,	  8,    9},
-		/* ULong */ { -1,	-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		0,		1,		2,		5,		6,		7,		5,		6,		7,		-1,		-1,		-1,		3,		4,	  7,    8},
-		/* LLong */ { -1,	-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		0,		1,		4,		5,		6,		4,		5,		6,		-1,		-1,		-1,		2,		3,	  6,    7},
-		/* ULLong */{ -1,	-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		0,		3,		4,		5,		3,		4,		5,		-1,		-1,		-1,		1,		2,	  5,    6},
-
-		/* Float */ { -1,	-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		0,		1,		2,		1,		2,		3,		-1,		-1,		-1,		-1,		-1,	  2,    3},
-		/* Double */{ -1,	-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		0,		1,		-1,		1,		2,		-1,		-1,		-1,		-1,		-1,	  1,    2},
-		/* LDbl */ 	{ -1,	-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		0,		-1,		-1,		1,		-1,		-1,		-1,		-1,		-1,	  -1,   1},
-		/* FCplex */{ -1,	-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		0,		1,		2,		-1,		-1,		-1,		-1,		-1,	  -1,   -1},
-		/* DCplex */{ -1,	-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		0,		1,		-1,		-1,		-1,		-1,		-1,	  -1,   -1},
-		/* LDCplex */{ -1,	-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		0,		-1,		-1,		-1,		-1,		-1,	  -1,   -1},
-		/* FImag */ { -1,	-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		1,		2,		3,		0,		1,		2,		-1,		-1,	  -1,   -1},
-		/* DImag */ { -1,	-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		1,		2,		-1,		0,		1,		-1,		-1,	  -1,   -1},
-		/* LDImag */{ -1,	-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		1,		-1,		-1,		0,		-1,		-1,	  -1,   -1},
-
-		/* I128 */  { -1,	-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		2,		3,		4,		3,		4,		5,		-1,		-1,		-1,		0,		1,	  4,    4},
-		/* U128 */  { -1,	-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		1,		2,		3,		2,		3,		4,		-1,		-1,		-1,		-1,		0,	  3,    3},
-
-		/* F80 */ 	{ -1,	-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		1,		-1,		-1,		1,		-1,		-1,		-1,		-1,		-1,	  0,    1},
-		/* F128 */ 	{ -1,	-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		-1,		1,		-1,		-1,		-1,		-1,		-1,	  -1,   0},
-	};
+	// GENERATED START, DO NOT EDIT
+	// GENERATED BY BasicTypes-gen.cc
+	/* EXTENDED INTEGRAL RANK HIERARCHY (root to leaves)
+	                         _Bool
+	char                signed char         unsigned char       
+	          signed short int         unsigned short int       
+	          signed int               unsigned int             
+	          signed long int          unsigned long int        
+	          signed long long int     unsigned long long int   
+	          __int128                 unsigned __int128        
+	          _Float16                 _Float16 _Complex        
+	          _Float32                 _Float32 _Complex        
+	          float                    float _Complex           
+	          _Float32x                _Float32x _Complex       
+	          _Float64                 _Float64 _Complex        
+	          double                   double _Complex          
+	          _Float64x                _Float64x _Complex       
+	                     __float80
+	          _Float128                _Float128 _Complex       
+	                    __float128
+	          long double              long double _Complex     
+	          _Float128x               _Float128x _Complex      
+	*/
+	// GENERATED END
+
+	// GENERATED START, DO NOT EDIT
+	// GENERATED BY BasicTypes-gen.cc
+	static const int costMatrix[BasicType::NUMBER_OF_BASIC_TYPES][BasicType::NUMBER_OF_BASIC_TYPES] = { // path length from root to node
+		/*             B    C   SC   UC   SI  SUI    I   UI   LI  LUI  LLI LLUI   IB  UIB  _FH  _FH   _F  _FC    F   FC  _FX _FXC   FD _FDC    D   DC F80X_FDXC  F80  _FB_FLDC   FB   LD  LDC _FBX_FLDXC */
+		/*     B*/ {   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  11,  12,  12,  13,  13,  14,  14,  15,  15,  16,  17,  16,  18,  17, },
+		/*     C*/ {  -1,   0,   1,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  11,  12,  12,  13,  13,  14,  14,  15,  16,  15,  17,  16, },
+		/*    SC*/ {  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  11,  12,  12,  13,  13,  14,  14,  15,  16,  15,  17,  16, },
+		/*    UC*/ {  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  11,  12,  12,  13,  13,  14,  14,  15,  16,  15,  17,  16, },
+		/*    SI*/ {  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  11,  12,  12,  13,  13,  14,  15,  14,  16,  15, },
+		/*   SUI*/ {  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  11,  12,  12,  13,  13,  14,  15,  14,  16,  15, },
+		/*     I*/ {  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  11,  12,  12,  13,  14,  13,  15,  14, },
+		/*    UI*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  11,  12,  12,  13,  14,  13,  15,  14, },
+		/*    LI*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  11,  12,  13,  12,  14,  13, },
+		/*   LUI*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  11,  12,  13,  12,  14,  13, },
+		/*   LLI*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  12,  11,  13,  12, },
+		/*  LLUI*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  12,  11,  13,  12, },
+		/*    IB*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  11,  10,  12,  11, },
+		/*   UIB*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  11,  10,  12,  11, },
+		/*   _FH*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,  10,   9,  11,  10, },
+		/*   _FH*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   1,  -1,   2,  -1,   3,  -1,   4,  -1,   5,  -1,   6,  -1,  -1,   7,  -1,  -1,   8,  -1,   9, },
+		/*    _F*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   9,   8,  10,   9, },
+		/*   _FC*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   1,  -1,   2,  -1,   3,  -1,   4,  -1,   5,  -1,  -1,   6,  -1,  -1,   7,  -1,   8, },
+		/*     F*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   8,   7,   9,   8, },
+		/*    FC*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   1,  -1,   2,  -1,   3,  -1,   4,  -1,  -1,   5,  -1,  -1,   6,  -1,   7, },
+		/*   _FX*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   7,   6,   8,   7, },
+		/*  _FXC*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   1,  -1,   2,  -1,   3,  -1,  -1,   4,  -1,  -1,   5,  -1,   6, },
+		/*    FD*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   6,   5,   7,   6, },
+		/*  _FDC*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   1,  -1,   2,  -1,  -1,   3,  -1,  -1,   4,  -1,   5, },
+		/*     D*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   5,   4,   6,   5, },
+		/*    DC*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   1,  -1,  -1,   2,  -1,  -1,   3,  -1,   4, },
+		/*  F80X*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   4,   3,   5,   4, },
+		/* _FDXC*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,  -1,   1,  -1,  -1,   2,  -1,   3, },
+		/*   F80*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   1,   0,   1,   2,   2,   3,   3,   4,   4, },
+		/*   _FB*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3, },
+		/* _FLDC*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,  -1,   1,  -1,   2, },
+		/*    FB*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   1,   0,   1,   2,   2,   3, },
+		/*    LD*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2, },
+		/*   LDC*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   1, },
+		/*  _FBX*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1, },
+		/*_FLDXC*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0, },
+	}; // costMatrix
+	// GENERATED END
 	static_assert(
 		sizeof(costMatrix)/sizeof(costMatrix[0][0]) == BasicType::NUMBER_OF_BASIC_TYPES*BasicType::NUMBER_OF_BASIC_TYPES,
-		"Each basic type kind should have a corresponding row in the cost matrix"
+		"Missing row in the cost matrix"
 	);
 
+	// GENERATED START, DO NOT EDIT
+	// GENERATED BY BasicTypes-gen.cc
+	static const int signMatrix[BasicType::NUMBER_OF_BASIC_TYPES][BasicType::NUMBER_OF_BASIC_TYPES] = { // number of sign changes in safe conversion
+		/*             B    C   SC   UC   SI  SUI    I   UI   LI  LUI  LLI LLUI   IB  UIB  _FH  _FH   _F  _FC    F   FC  _FX _FXC   FD _FDC    D   DC F80X_FDXC  F80  _FB_FLDC   FB   LD  LDC _FBX_FLDXC */
+		/*     B*/ {   0,   0,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, },
+		/*     C*/ {  -1,   0,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, },
+		/*    SC*/ {  -1,  -1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, },
+		/*    UC*/ {  -1,  -1,  -1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, },
+		/*    SI*/ {  -1,  -1,  -1,  -1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, },
+		/*   SUI*/ {  -1,  -1,  -1,  -1,  -1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, },
+		/*     I*/ {  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, },
+		/*    UI*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, },
+		/*    LI*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, },
+		/*   LUI*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, },
+		/*   LLI*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, },
+		/*  LLUI*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, },
+		/*    IB*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, },
+		/*   UIB*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, },
+		/*   _FH*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, },
+		/*   _FH*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   0,  -1,   0,  -1,   0,  -1,   0,  -1,   0,  -1,   0,  -1,  -1,   0,  -1,  -1,   0,  -1,   0, },
+		/*    _F*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, },
+		/*   _FC*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   0,  -1,   0,  -1,   0,  -1,   0,  -1,   0,  -1,  -1,   0,  -1,  -1,   0,  -1,   0, },
+		/*     F*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, },
+		/*    FC*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   0,  -1,   0,  -1,   0,  -1,   0,  -1,  -1,   0,  -1,  -1,   0,  -1,   0, },
+		/*   _FX*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, },
+		/*  _FXC*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   0,  -1,   0,  -1,   0,  -1,  -1,   0,  -1,  -1,   0,  -1,   0, },
+		/*    FD*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, },
+		/*  _FDC*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   0,  -1,   0,  -1,  -1,   0,  -1,  -1,   0,  -1,   0, },
+		/*     D*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, },
+		/*    DC*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   0,  -1,  -1,   0,  -1,  -1,   0,  -1,   0, },
+		/*  F80X*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, },
+		/* _FDXC*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,  -1,   0,  -1,  -1,   0,  -1,   0, },
+		/*   F80*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0,   0,   0,   0,   0,   0, },
+		/*   _FB*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0,   0,   0,   0, },
+		/* _FLDC*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,  -1,   0,  -1,   0, },
+		/*    FB*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0,   0,   0, },
+		/*    LD*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0, },
+		/*   LDC*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   0, },
+		/*  _FBX*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0, },
+		/*_FLDXC*/ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0, },
+	}; // signMatrix
+	// GENERATED END
+	static_assert(
+		sizeof(signMatrix)/sizeof(signMatrix[0][0]) == BasicType::NUMBER_OF_BASIC_TYPES*BasicType::NUMBER_OF_BASIC_TYPES,
+		"Missing row in the sign matrix"
+	);
 
 	void ConversionCost::postvisit( VoidType * ) {
@@ -279,4 +312,5 @@
 				cost = Cost::zero;
 				cost.incSafe( tableResult );
+				cost.incSign( signMatrix[ basicType->get_kind() ][ destAsBasic->get_kind() ] );
 			} // if
 		} else if ( dynamic_cast< EnumInstType *>( dest ) ) {
@@ -300,5 +334,5 @@
 					// types are the same, except otherPointer has more qualifiers
 					cost = Cost::safe;
-				}
+				} // if
 			} else {
 				int assignResult = ptrsAssignable( pointerType->base, destAsPtr->base, env );
@@ -422,8 +456,9 @@
 				cost = Cost::zero;
 				cost.incSafe( tableResult + 1 );
-			}
+				cost.incSign( signMatrix[ BasicType::SignedInt ][ destAsBasic->get_kind() ] );
+			} // if
 		} else if ( dynamic_cast< PointerType* >( dest ) ) {
 			cost = Cost::safe;
-		}
+		} // if
 	}
 
@@ -439,6 +474,7 @@
 				cost = Cost::zero;
 				cost.incSafe( tableResult + 1 );
-			}
-		}
+				cost.incSign( signMatrix[ BasicType::SignedInt ][ destAsBasic->get_kind() ] );
+			} // if
+		} // if
 	}
 } // namespace ResolvExpr
Index: src/ResolvExpr/Cost.h
===================================================================
--- src/ResolvExpr/Cost.h	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/ResolvExpr/Cost.h	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 09:39:50 2015
-// Last Modified By : Aaron B. Moss
-// Last Modified On : Fri Oct 05 14:32:00 2018
-// Update Count     : 7
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu Feb  7 20:54:29 2019
+// Update Count     : 8
 //
 
@@ -21,11 +21,11 @@
 	class Cost {
 	  private:
-		Cost( int unsafeCost, int polyCost, int safeCost, int varCost, int specCost,
-			int referenceCost );
-
+		Cost( int unsafeCost, int polyCost, int safeCost, int signCost,
+			int varCost, int specCost, int referenceCost );
 	  public:
 		Cost & incUnsafe( int inc = 1 );
 		Cost & incPoly( int inc = 1 );
 		Cost & incSafe( int inc = 1 );
+		Cost & incSign( int inc = 1 );
 		Cost & incVar( int inc = 1 );
 		Cost & decSpec( int inc = 1 );
@@ -35,4 +35,5 @@
 		int get_polyCost() const { return polyCost; }
 		int get_safeCost() const { return safeCost; }
+		int get_signCost() const { return signCost; }
 		int get_varCost() const { return varCost; }
 		int get_specCost() const { return specCost; }
@@ -40,5 +41,4 @@
 
 		Cost operator+( const Cost &other ) const;
-		Cost operator-( const Cost &other ) const;
 		Cost &operator+=( const Cost &other );
 		bool operator<( const Cost &other ) const;
@@ -55,4 +55,5 @@
 		static const Cost poly;
 		static const Cost safe;
+		static const Cost sign;
 		static const Cost var;
 		static const Cost spec;
@@ -63,4 +64,5 @@
 		int polyCost;       ///< Count of parameters and return values bound to some poly type
 		int safeCost;       ///< Safe (widening) conversions
+		int signCost;       ///< Count of safe sign conversions
 		int varCost;        ///< Count of polymorphic type variables
 		int specCost;       ///< Polymorphic type specializations (type assertions), negative cost
@@ -68,8 +70,8 @@
 	};
 
-	inline Cost::Cost( int unsafeCost, int polyCost, int safeCost, int varCost, int specCost, 
-			int referenceCost ) 
-		: unsafeCost( unsafeCost ), polyCost( polyCost ), safeCost( safeCost ), varCost( varCost ), 
-		  specCost( specCost ), referenceCost( referenceCost ) {}
+	inline Cost::Cost( int unsafeCost, int polyCost, int safeCost, int signCost,
+			int varCost, int specCost, int referenceCost )
+		: unsafeCost( unsafeCost ), polyCost( polyCost ), safeCost( safeCost ), signCost( signCost ),
+		  varCost( varCost ), specCost( specCost ), referenceCost( referenceCost ) {}
 
 	inline Cost & Cost::incUnsafe( int inc ) {
@@ -88,4 +90,10 @@
 		if ( *this == infinity ) return *this;
 		safeCost += inc;
+		return *this;
+	}
+
+	inline Cost & Cost::incSign( int inc ) {
+		if ( *this == infinity ) return *this;
+		signCost += inc;
 		return *this;
 	}
@@ -111,16 +119,8 @@
 	inline Cost Cost::operator+( const Cost &other ) const {
 		if ( *this == infinity || other == infinity ) return infinity;
-		return Cost{ 
-			unsafeCost + other.unsafeCost, polyCost + other.polyCost, safeCost + other.safeCost, 
-			varCost + other.varCost, specCost + other.specCost, 
+		return Cost{
+			unsafeCost + other.unsafeCost, polyCost + other.polyCost, safeCost + other.safeCost,
+			signCost + other.signCost, varCost + other.varCost, specCost + other.specCost,
 			referenceCost + other.referenceCost };
-	}
-
-	inline Cost Cost::operator-( const Cost &other ) const {
-		if ( *this == infinity || other == infinity ) return infinity;
-		return Cost{ 
-			unsafeCost - other.unsafeCost, polyCost - other.polyCost, safeCost - other.safeCost, 
-			varCost - other.varCost, specCost - other.specCost, 
-			referenceCost - other.referenceCost };
 	}
 
@@ -134,4 +134,5 @@
 		polyCost += other.polyCost;
 		safeCost += other.safeCost;
+		signCost += other.signCost;
 		varCost += other.varCost;
 		specCost += other.specCost;
@@ -156,4 +157,8 @@
 		} else if ( safeCost < other.safeCost ) {
 			return true;
+		} else if ( signCost > other.signCost ) {
+			return false;
+		} else if ( signCost < other.signCost ) {
+			return true;
 		} else if ( varCost > other.varCost ) {
 			return false;
@@ -180,4 +185,5 @@
 		c = polyCost - other.polyCost; if ( c ) return c;
 		c = safeCost - other.safeCost; if ( c ) return c;
+		c = signCost - other.signCost; if ( c ) return c;
 		c = varCost - other.varCost; if ( c ) return c;
 		c = specCost - other.specCost; if ( c ) return c;
@@ -189,4 +195,5 @@
 			&& polyCost == other.polyCost
 			&& safeCost == other.safeCost
+			&& signCost == other.signCost
 			&& varCost == other.varCost
 			&& specCost == other.specCost
@@ -199,6 +206,7 @@
 
 	inline std::ostream &operator<<( std::ostream &os, const Cost &cost ) {
-		return os << "( " << cost.unsafeCost << ", " << cost.polyCost << ", " 
-		          << cost.safeCost << ", " << cost.varCost << ", " << cost.specCost << ", "
+		return os << "( " << cost.unsafeCost << ", " << cost.polyCost << ", "
+		          << cost.safeCost << ", " << cost.signCost << ", "
+				  << cost.varCost << ", " << cost.specCost << ", "
 		          << cost.referenceCost << " )";
 	}
Index: src/ResolvExpr/ResolveAssertions.cc
===================================================================
--- src/ResolvExpr/ResolveAssertions.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/ResolvExpr/ResolveAssertions.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -20,4 +20,5 @@
 #include <list>                     // for list
 #include <memory>                   // for unique_ptr
+#include <string>
 #include <unordered_map>            // for unordered_map, unordered_multimap
 #include <utility>                  // for move
@@ -55,8 +56,26 @@
 	using CandidateList = std::vector<AssnCandidate>;
 
+	/// Unique identifier for a yet-to-be-resolved assertion
+	struct AssnId {
+		DeclarationWithType* decl;  ///< Declaration of assertion
+		AssertionSetValue info;     ///< Information about assertion
+
+		AssnId(DeclarationWithType* decl, const AssertionSetValue& info) : decl(decl), info(info) {}
+	};
+
+	/// Cached assertion items
+	struct AssnCacheItem {
+		CandidateList matches;         ///< Possible matches for this assertion
+		std::vector<AssnId> deferIds;  ///< Deferred assertions which resolve to this item
+
+		AssnCacheItem( CandidateList&& m ) : matches(std::move(m)), deferIds() {}
+	};
+
+	/// Cache of resolved assertions
+	using AssnCache = std::unordered_map<std::string, AssnCacheItem>;
+
 	/// Reference to single deferred item
 	struct DeferRef {
-		const DeclarationWithType* decl;
-		const AssertionSetValue& info;
+		const AssnCacheItem& item;
 		const AssnCandidate& match;
 	};
@@ -65,17 +84,23 @@
 	/// Acts like indexed list of DeferRef
 	struct DeferItem {
-		DeclarationWithType* decl;
-		AssertionSetValue info;
-		CandidateList matches;
-
-		DeferItem( DeclarationWithType* decl, const AssertionSetValue& info, 
-			CandidateList&& matches )
-		: decl(decl), info(info), matches(std::move(matches)) {}
-
-		bool empty() const { return matches.empty(); }
-
-		CandidateList::size_type size() const { return matches.size(); }
-
-		DeferRef operator[] ( unsigned i ) const { return { decl, info, matches[i] }; }
+		const AssnCache* cache;     ///< Cache storing assertion item
+		std::string key;            ///< Key into cache
+		
+		DeferItem( const AssnCache& cache, const std::string& key ) : cache(&cache), key(key) {}
+
+		bool empty() const { return cache->at(key).matches.empty(); }
+
+		CandidateList::size_type size() const { return cache->at(key).matches.size(); }
+
+		DeferRef operator[] ( unsigned i ) const {
+			const AssnCacheItem& item = cache->at(key);
+			return { item, item.matches[i] };
+		}
+
+		// sortable by key
+		// TODO look into optimizing combination process with other sort orders (e.g. by number 
+		// of matches in candidate)
+		bool operator< ( const DeferItem& o ) const { return key < o.key; }
+		bool operator== ( const DeferItem& o ) const { return key == o.key; }
 	};
 
@@ -152,5 +177,6 @@
 				for ( const auto& assn : x.assns ) {
 					k += computeConversionCost( 
-						assn.match.adjType, assn.decl->get_type(), indexer, x.env );
+						assn.match.adjType, assn.item.deferIds[0].decl->get_type(), indexer, 
+						x.env );
 				}
 				it = cache.emplace_hint( it, &x, k );
@@ -208,22 +234,11 @@
 				candidate->get_uniqueId(), match.adjType->clone(), decl->get_type()->clone(), 
 				varExpr };
-
-		// // follow the current assertion's ID chain to find the correct set of inferred parameters 
-		// // to add the candidate o (i.e. the set of inferred parameters belonging to the entity 
-		// // which requested the assertion parameter)
-		// InferredParams* inferParams = &alt.expr->inferParams;
-		// for ( UniqueId id : info.idChain ) {
-		// 	inferParams = (*inferParams)[ id ].inferParams.get();
-		// }
-
-		// (*inferParams)[ decl->get_uniqueId() ] = ParamEntry{
-		// 		candidate->get_uniqueId(), match.adjType, decl->get_type()->clone(), varExpr };
 	}
 
 	/// Adds a captured assertion to the symbol table
 	void addToIndexer( AssertionSet &assertSet, SymTab::Indexer &indexer ) {
-		for ( AssertionSet::iterator i = assertSet.begin(); i != assertSet.end(); ++i ) {
-			if ( i->second.isUsed ) {
-				indexer.addId( i->first );
+		for ( auto&  i : assertSet ) {
+			if ( i.second.isUsed ) {
+				indexer.addId( i.first );
 			}
 		}
@@ -234,48 +249,54 @@
 
 	/// Resolve a single assertion, in context
-	bool resolveAssertion( AssertionItem& assn, ResnState& resn ) {
+	bool resolveAssertion( AssertionItem& assn, ResnState& resn, AssnCache& cache ) {
 		// skip unused assertions
 		if ( ! assn.info.isUsed ) return true;
 
-		// lookup candidates for this assertion
-		std::list< SymTab::Indexer::IdData > candidates;
-		resn.indexer.lookupId( assn.decl->name, candidates );
-
-		// find the candidates that unify with the desired type
-		CandidateList matches;
-		for ( const auto& cdata : candidates ) {
-			DeclarationWithType* candidate = cdata.id;
-
-			// build independent unification context for candidate
-			AssertionSet have, newNeed;
-			TypeEnvironment newEnv{ resn.alt.env };
-			OpenVarSet newOpenVars{ resn.alt.openVars };
-			Type* adjType = candidate->get_type()->clone();
-			adjustExprType( adjType, newEnv, resn.indexer );
-			renameTyVars( adjType );
-
-			// keep unifying candidates
-			if ( unify( assn.decl->get_type(), adjType, newEnv, newNeed, have, newOpenVars, 
-					resn.indexer ) ) {
-				// set up binding slot for recursive assertions
-				UniqueId crntResnSlot = 0;
-				if ( ! newNeed.empty() ) {
-					crntResnSlot = ++globalResnSlot;
-					for ( auto& a : newNeed ) {
-						a.second.resnSlot = crntResnSlot;
+		// check cache for this assertion
+		std::string assnKey = SymTab::Mangler::mangleAssnKey( assn.decl, resn.alt.env );
+		auto it = cache.find( assnKey );
+
+		// attempt to resolve assertion if this is the first time seen
+		if ( it == cache.end() ) {
+			// lookup candidates for this assertion
+			std::list< SymTab::Indexer::IdData > candidates;
+			resn.indexer.lookupId( assn.decl->name, candidates );
+
+			// find the candidates that unify with the desired type
+			CandidateList matches;
+			for ( const auto& cdata : candidates ) {
+				DeclarationWithType* candidate = cdata.id;
+
+				// build independent unification context for candidate
+				AssertionSet have, newNeed;
+				TypeEnvironment newEnv{ resn.alt.env };
+				OpenVarSet newOpenVars{ resn.alt.openVars };
+				Type* adjType = candidate->get_type()->clone();
+				adjustExprType( adjType, newEnv, resn.indexer );
+				renameTyVars( adjType );
+
+				// keep unifying candidates
+				if ( unify( assn.decl->get_type(), adjType, newEnv, newNeed, have, newOpenVars, 
+						resn.indexer ) ) {
+					// set up binding slot for recursive assertions
+					UniqueId crntResnSlot = 0;
+					if ( ! newNeed.empty() ) {
+						crntResnSlot = ++globalResnSlot;
+						for ( auto& a : newNeed ) {
+							a.second.resnSlot = crntResnSlot;
+						}
 					}
-				}
-				// // set up idChain on new assertions
-				// for ( auto& a : newNeed ) {
-				// 	a.second.idChain = assn.info.idChain;
-				// 	a.second.idChain.push_back( assn.decl->get_uniqueId() );
-				// }
-
-				matches.emplace_back( cdata, adjType, std::move(newEnv), std::move(have), 
-					std::move(newNeed), std::move(newOpenVars), crntResnSlot );
-			} else {
-				delete adjType;
+
+					matches.emplace_back( cdata, adjType, std::move(newEnv), std::move(have), 
+						std::move(newNeed), std::move(newOpenVars), crntResnSlot );
+				} else {
+					delete adjType;
+				}
 			}
-		}
+
+			it = cache.emplace_hint( it, assnKey, AssnCacheItem{ std::move(matches) } );
+		}
+
+		CandidateList& matches = it->second.matches;
 
 		// break if no suitable assertion
@@ -284,5 +305,6 @@
 		// defer if too many suitable assertions
 		if ( matches.size() > 1 ) {
-			resn.deferred.emplace_back( assn.decl, assn.info, std::move(matches) );
+			it->second.deferIds.emplace_back( assn.decl, assn.info );
+			resn.deferred.emplace_back( cache, assnKey );
 			return true;
 		}
@@ -292,6 +314,6 @@
 		addToIndexer( match.have, resn.indexer );
 		resn.newNeed.insert( match.need.begin(), match.need.end() );
-		resn.alt.env = std::move(match.env);
-		resn.alt.openVars = std::move(match.openVars);
+		resn.alt.env = match.env;
+		resn.alt.openVars = match.openVars;
 
 		bindAssertion( assn.decl, assn.info, resn.alt, match, resn.inferred );
@@ -354,4 +376,5 @@
 		ResnList resns{ ResnState{ alt, root_indexer } };
 		ResnList new_resns{};
+		AssnCache assnCache;
 
 		// resolve assertions in breadth-first-order up to a limited number of levels deep
@@ -362,5 +385,5 @@
 				for ( auto& assn : resn.need ) {
 					// fail early if any assertion is not resolvable
-					if ( ! resolveAssertion( assn, resn ) ) goto nextResn;
+					if ( ! resolveAssertion( assn, resn, assnCache ) ) goto nextResn;
 				}
 
@@ -373,4 +396,8 @@
 					}
 				} else {
+					// only resolve each deferred assertion once
+					std::sort( resn.deferred.begin(), resn.deferred.end() );
+					auto last = std::unique( resn.deferred.begin(), resn.deferred.end() );
+					resn.deferred.erase( last, resn.deferred.end() );
 					// resolve deferred assertions by mutual compatibility
 					std::vector<CandidateEnvMerger::OutType> compatible = filterCombos(
@@ -380,10 +407,4 @@
 					CandidateCost coster{ resn.indexer };
 					std::sort( compatible.begin(), compatible.end(), coster );
-					// // sort by cost if pruning
-					// if ( pruneAssertions ) {
-					// 	auto lmin = sort_mins( compatible.begin(), compatible.end(), 
-					// 		CandidateCost{resn.indexer} );
-					// 	compatible.erase( lmin, compatible.end() );
-					// }
 
 					// keep map of detected options
@@ -408,5 +429,9 @@
 							new_resn.newNeed.insert( match.need.begin(), match.need.end() );
 
-							bindAssertion( r.decl, r.info, new_resn.alt, match, new_resn.inferred );
+							// for each deferred assertion with the same form
+							for ( AssnId id : r.item.deferIds ) {
+								bindAssertion( 
+									id.decl, id.info, new_resn.alt, match, new_resn.inferred );
+							}
 						}
 
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/ResolvExpr/Resolver.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 12:17:01 2015
-// Last Modified By : Aaron B. Moss
-// Last Modified On : Fri Oct 05 09:43:00 2018
-// Update Count     : 214
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Feb 19 18:09:56 2019
+// Update Count     : 240
 //
 
@@ -53,7 +53,7 @@
 		}
 
-		void previsit( FunctionDecl *functionDecl );
-		void postvisit( FunctionDecl *functionDecl );
-		void previsit( ObjectDecl *objectDecll );
+		void previsit( FunctionDecl * functionDecl );
+		void postvisit( FunctionDecl * functionDecl );
+		void previsit( ObjectDecl * objectDecll );
 		void previsit( EnumDecl * enumDecl );
 		void previsit( StaticAssertDecl * assertDecl );
@@ -62,21 +62,21 @@
 		void previsit( PointerType * at );
 
-		void previsit( ExprStmt *exprStmt );
-		void previsit( AsmExpr *asmExpr );
-		void previsit( AsmStmt *asmStmt );
-		void previsit( IfStmt *ifStmt );
-		void previsit( WhileStmt *whileStmt );
-		void previsit( ForStmt *forStmt );
-		void previsit( SwitchStmt *switchStmt );
-		void previsit( CaseStmt *caseStmt );
-		void previsit( BranchStmt *branchStmt );
-		void previsit( ReturnStmt *returnStmt );
-		void previsit( ThrowStmt *throwStmt );
-		void previsit( CatchStmt *catchStmt );
+		void previsit( ExprStmt * exprStmt );
+		void previsit( AsmExpr * asmExpr );
+		void previsit( AsmStmt * asmStmt );
+		void previsit( IfStmt * ifStmt );
+		void previsit( WhileStmt * whileStmt );
+		void previsit( ForStmt * forStmt );
+		void previsit( SwitchStmt * switchStmt );
+		void previsit( CaseStmt * caseStmt );
+		void previsit( BranchStmt * branchStmt );
+		void previsit( ReturnStmt * returnStmt );
+		void previsit( ThrowStmt * throwStmt );
+		void previsit( CatchStmt * catchStmt );
 		void previsit( WaitForStmt * stmt );
 
-		void previsit( SingleInit *singleInit );
-		void previsit( ListInit *listInit );
-		void previsit( ConstructorInit *ctorInit );
+		void previsit( SingleInit * singleInit );
+		void previsit( ListInit * listInit );
+		void previsit( ConstructorInit * ctorInit );
 	  private:
 		typedef std::list< Initializer * >::iterator InitIterator;
@@ -104,5 +104,5 @@
 	}
 
-	void resolveDecl( Declaration * decl, const SymTab::Indexer &indexer ) {
+	void resolveDecl( Declaration * decl, const SymTab::Indexer & indexer ) {
 		PassVisitor<Resolver> resolver( indexer );
 		maybeAccept( decl, resolver );
@@ -148,5 +148,5 @@
 		};
 
-		void finishExpr( Expression *&expr, const TypeEnvironment &env, TypeSubstitution * oldenv = nullptr ) {
+		void finishExpr( Expression *& expr, const TypeEnvironment & env, TypeSubstitution * oldenv = nullptr ) {
 			expr->env = oldenv ? oldenv->clone() : new TypeSubstitution;
 			env.makeSubstitution( *expr->env );
@@ -279,22 +279,22 @@
 
 	// used in resolveTypeof
-	Expression * resolveInVoidContext( Expression *expr, const SymTab::Indexer &indexer ) {
+	Expression * resolveInVoidContext( Expression * expr, const SymTab::Indexer & indexer ) {
 		TypeEnvironment env;
 		return resolveInVoidContext( expr, indexer, env );
 	}
 
-	Expression * resolveInVoidContext( Expression *expr, const SymTab::Indexer &indexer, TypeEnvironment &env ) {
+	Expression * resolveInVoidContext( Expression * expr, const SymTab::Indexer & indexer, TypeEnvironment & env ) {
 		// it's a property of the language that a cast expression has either 1 or 0 interpretations; if it has 0
 		// interpretations, an exception has already been thrown.
 		assertf( expr, "expected a non-null expression." );
 
-		static CastExpr untyped( nullptr ); // cast to void
-		untyped.location = expr->location;
+		CastExpr * untyped = new CastExpr( expr ); // cast to void
+		untyped->location = expr->location;
 
 		// set up and resolve expression cast to void
-		untyped.arg = expr;
 		Alternative choice;
-		findUnfinishedKindExpression( &untyped, choice, indexer, "", standardAlternativeFilter, ResolvMode::withAdjustment() );
+		findUnfinishedKindExpression( untyped, choice, indexer, "", standardAlternativeFilter, ResolvMode::withAdjustment() );
 		CastExpr * castExpr = strict_dynamic_cast< CastExpr * >( choice.expr );
+		assert( castExpr );
 		env = std::move( choice.env );
 
@@ -304,9 +304,9 @@
 
 		// unlink the arg so that it isn't deleted twice at the end of the program
-		untyped.arg = nullptr;
+		untyped->arg = nullptr;
 		return ret;
 	}
 
-	void findVoidExpression( Expression *& untyped, const SymTab::Indexer &indexer ) {
+	void findVoidExpression( Expression *& untyped, const SymTab::Indexer & indexer ) {
 		resetTyVarRenaming();
 		TypeEnvironment env;
@@ -317,5 +317,5 @@
 	}
 
-	void findSingleExpression( Expression *&untyped, const SymTab::Indexer &indexer ) {
+	void findSingleExpression( Expression *& untyped, const SymTab::Indexer & indexer ) {
 		findKindExpression( untyped, indexer, "", standardAlternativeFilter );
 	}
@@ -336,5 +336,5 @@
 			if ( dynamic_cast< EnumInstType * >( type ) ) {
 				return true;
-			} else if ( BasicType *bt = dynamic_cast< BasicType * >( type ) ) {
+			} else if ( BasicType * bt = dynamic_cast< BasicType * >( type ) ) {
 				return bt->isInteger();
 			} else if ( dynamic_cast< ZeroType* >( type ) != nullptr || dynamic_cast< OneType* >( type ) != nullptr ) {
@@ -345,5 +345,5 @@
 		}
 
-		void findIntegralExpression( Expression *& untyped, const SymTab::Indexer &indexer ) {
+		void findIntegralExpression( Expression *& untyped, const SymTab::Indexer & indexer ) {
 			findKindExpression( untyped, indexer, "condition", isIntegralType );
 		}
@@ -401,5 +401,5 @@
 	}
 
-	void Resolver::previsit( ObjectDecl *objectDecl ) {
+	void Resolver::previsit( ObjectDecl * objectDecl ) {
 		// To handle initialization of routine pointers, e.g., int (*fp)(int) = foo(), means that 
 		// class-variable initContext is changed multiple time because the LHS is analysed twice. 
@@ -431,5 +431,5 @@
 	}
 
-	void Resolver::previsit( FunctionDecl *functionDecl ) {
+	void Resolver::previsit( FunctionDecl * functionDecl ) {
 #if 0
 		std::cerr << "resolver visiting functiondecl ";
@@ -441,5 +441,5 @@
 	}
 
-	void Resolver::postvisit( FunctionDecl *functionDecl ) {
+	void Resolver::postvisit( FunctionDecl * functionDecl ) {
 		// default value expressions have an environment which shouldn't be there and trips up 
 		// later passes.
@@ -466,5 +466,5 @@
 	}
 
-	void Resolver::previsit( ExprStmt *exprStmt ) {
+	void Resolver::previsit( ExprStmt * exprStmt ) {
 		visit_children = false;
 		assertf( exprStmt->expr, "ExprStmt has null Expression in resolver" );
@@ -472,5 +472,5 @@
 	}
 
-	void Resolver::previsit( AsmExpr *asmExpr ) {
+	void Resolver::previsit( AsmExpr * asmExpr ) {
 		visit_children = false;
 		findVoidExpression( asmExpr->operand, indexer );
@@ -480,5 +480,5 @@
 	}
 
-	void Resolver::previsit( AsmStmt *asmStmt ) {
+	void Resolver::previsit( AsmStmt * asmStmt ) {
 		visit_children = false;
 		acceptAll( asmStmt->get_input(), *visitor );
@@ -486,13 +486,13 @@
 	}
 
-	void Resolver::previsit( IfStmt *ifStmt ) {
+	void Resolver::previsit( IfStmt * ifStmt ) {
 		findIntegralExpression( ifStmt->condition, indexer );
 	}
 
-	void Resolver::previsit( WhileStmt *whileStmt ) {
+	void Resolver::previsit( WhileStmt * whileStmt ) {
 		findIntegralExpression( whileStmt->condition, indexer );
 	}
 
-	void Resolver::previsit( ForStmt *forStmt ) {
+	void Resolver::previsit( ForStmt * forStmt ) {
 		if ( forStmt->condition ) {
 			findIntegralExpression( forStmt->condition, indexer );
@@ -504,5 +504,5 @@
 	}
 
-	void Resolver::previsit( SwitchStmt *switchStmt ) {
+	void Resolver::previsit( SwitchStmt * switchStmt ) {
 		GuardValue( currentObject );
 		findIntegralExpression( switchStmt->condition, indexer );
@@ -511,5 +511,5 @@
 	}
 
-	void Resolver::previsit( CaseStmt *caseStmt ) {
+	void Resolver::previsit( CaseStmt * caseStmt ) {
 		if ( caseStmt->condition ) {
 			std::list< InitAlternative > initAlts = currentObject.getOptions();
@@ -530,5 +530,5 @@
 	}
 
-	void Resolver::previsit( BranchStmt *branchStmt ) {
+	void Resolver::previsit( BranchStmt * branchStmt ) {
 		visit_children = false;
 		// must resolve the argument for a computed goto
@@ -541,5 +541,5 @@
 	}
 
-	void Resolver::previsit( ReturnStmt *returnStmt ) {
+	void Resolver::previsit( ReturnStmt * returnStmt ) {
 		visit_children = false;
 		if ( returnStmt->expr ) {
@@ -548,5 +548,5 @@
 	}
 
-	void Resolver::previsit( ThrowStmt *throwStmt ) {
+	void Resolver::previsit( ThrowStmt * throwStmt ) {
 		visit_children = false;
 		// TODO: Replace *exception type with &exception type.
@@ -560,5 +560,5 @@
 	}
 
-	void Resolver::previsit( CatchStmt *catchStmt ) {
+	void Resolver::previsit( CatchStmt * catchStmt ) {
 		if ( catchStmt->cond ) {
 			findSingleExpression( catchStmt->cond, new BasicType( noQualifiers, BasicType::Bool ), indexer );
@@ -724,10 +724,10 @@
 
 						}
-						catch( SemanticErrorException &e ) {
+						catch( SemanticErrorException & e ) {
 							errors.append( e );
 						}
 					}
 				}
-				catch( SemanticErrorException &e ) {
+				catch( SemanticErrorException & e ) {
 					errors.append( e );
 				}
@@ -781,5 +781,5 @@
 	}
 
-	void Resolver::previsit( SingleInit *singleInit ) {
+	void Resolver::previsit( SingleInit * singleInit ) {
 		visit_children = false;
 		// resolve initialization using the possibilities as determined by the currentObject cursor
@@ -813,5 +813,5 @@
 				if ( PointerType * pt = dynamic_cast< PointerType *>( newExpr->get_result() ) ) {
 					if ( isCharType( pt->get_base() ) ) {
-						if ( CastExpr *ce = dynamic_cast< CastExpr * >( newExpr ) ) {
+						if ( CastExpr * ce = dynamic_cast< CastExpr * >( newExpr ) ) {
 							// strip cast if we're initializing a char[] with a char *, 
 							// e.g.  char x[] = "hello";
@@ -893,5 +893,5 @@
 	}
 
-	void Resolver::previsit( ConstructorInit *ctorInit ) {
+	void Resolver::previsit( ConstructorInit * ctorInit ) {
 		visit_children = false;
 		// xxx - fallback init has been removed => remove fallbackInit function and remove complexity from FixInit and remove C-init from ConstructorInit
Index: src/ResolvExpr/Resolver.h
===================================================================
--- src/ResolvExpr/Resolver.h	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/ResolvExpr/Resolver.h	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 12:18:34 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 22 09:36:57 2017
-// Update Count     : 3
+// Last Modified On : Mon Feb 18 20:40:38 2019
+// Update Count     : 4
 //
 
@@ -29,9 +29,9 @@
 	/// Checks types and binds syntactic constructs to typed representations
 	void resolve( std::list< Declaration * > translationUnit );
-	void resolveDecl( Declaration *, const SymTab::Indexer &indexer );
-	Expression *resolveInVoidContext( Expression * expr, const SymTab::Indexer &indexer );
-	void findVoidExpression( Expression *& untyped, const SymTab::Indexer &indexer );
-	void findSingleExpression( Expression *& untyped, const SymTab::Indexer &indexer );
-	void findSingleExpression( Expression *& untyped, Type * type, const SymTab::Indexer &indexer );
+	void resolveDecl( Declaration *, const SymTab::Indexer & indexer );
+	Expression *resolveInVoidContext( Expression * expr, const SymTab::Indexer & indexer );
+	void findVoidExpression( Expression *& untyped, const SymTab::Indexer & indexer );
+	void findSingleExpression( Expression *& untyped, const SymTab::Indexer & indexer );
+	void findSingleExpression( Expression *& untyped, Type * type, const SymTab::Indexer & indexer );
 	void resolveCtorInit( ConstructorInit * ctorInit, const SymTab::Indexer & indexer );
 	void resolveStmtExpr( StmtExpr * stmtExpr, const SymTab::Indexer & indexer );
Index: src/ResolvExpr/module.mk
===================================================================
--- src/ResolvExpr/module.mk	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/ResolvExpr/module.mk	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -15,23 +15,26 @@
 ###############################################################################
 
-SRC += ResolvExpr/AlternativeFinder.cc \
-       ResolvExpr/Alternative.cc \
-       ResolvExpr/Unify.cc \
-       ResolvExpr/PtrsAssignable.cc \
-       ResolvExpr/CommonType.cc \
-       ResolvExpr/ConversionCost.cc \
-       ResolvExpr/CastCost.cc \
-       ResolvExpr/PtrsCastable.cc \
-       ResolvExpr/AdjustExprType.cc \
-       ResolvExpr/AlternativePrinter.cc \
-       ResolvExpr/Resolver.cc \
-       ResolvExpr/ResolveTypeof.cc \
-       ResolvExpr/RenameVars.cc \
-       ResolvExpr/FindOpenVars.cc \
-       ResolvExpr/PolyCost.cc \
-       ResolvExpr/Occurs.cc \
-       ResolvExpr/TypeEnvironment.cc \
-       ResolvExpr/CurrentObject.cc \
-       ResolvExpr/ExplodedActual.cc \
-       ResolvExpr/SpecCost.cc \
-       ResolvExpr/ResolveAssertions.cc
+SRC_RESOLVEXPR = \
+      ResolvExpr/AdjustExprType.cc \
+      ResolvExpr/Alternative.cc \
+      ResolvExpr/AlternativeFinder.cc \
+      ResolvExpr/CastCost.cc \
+      ResolvExpr/CommonType.cc \
+      ResolvExpr/ConversionCost.cc \
+      ResolvExpr/CurrentObject.cc \
+      ResolvExpr/ExplodedActual.cc \
+      ResolvExpr/FindOpenVars.cc \
+      ResolvExpr/Occurs.cc \
+      ResolvExpr/PolyCost.cc \
+      ResolvExpr/PtrsAssignable.cc \
+      ResolvExpr/PtrsCastable.cc \
+      ResolvExpr/RenameVars.cc \
+      ResolvExpr/ResolveAssertions.cc \
+      ResolvExpr/Resolver.cc \
+      ResolvExpr/ResolveTypeof.cc \
+      ResolvExpr/SpecCost.cc \
+      ResolvExpr/TypeEnvironment.cc \
+      ResolvExpr/Unify.cc
+
+SRC += $(SRC_RESOLVEXPR) ResolvExpr/AlternativePrinter.cc
+SRCDEMANGLE += $(SRC_RESOLVEXPR)
Index: src/ResolvExpr/typeops.h
===================================================================
--- src/ResolvExpr/typeops.h	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/ResolvExpr/typeops.h	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 07:28:22 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 22 09:36:18 2017
-// Update Count     : 3
+// Last Modified On : Fri Feb  8 09:30:34 2019
+// Update Count     : 4
 //
 
@@ -101,5 +101,5 @@
 
 	// in CommonType.cc
-	Type *commonType( Type *type1, Type *type2, bool widenFirst, bool widenSecond, const SymTab::Indexer &indexer, TypeEnvironment &env, const OpenVarSet &openVars );
+	Type * commonType( Type *type1, Type *type2, bool widenFirst, bool widenSecond, const SymTab::Indexer &indexer, TypeEnvironment &env, const OpenVarSet &openVars );
 
 	// in PolyCost.cc
Index: src/SymTab/Indexer.cc
===================================================================
--- src/SymTab/Indexer.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/SymTab/Indexer.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -26,4 +26,5 @@
 #include "Common/SemanticError.h"  // for SemanticError
 #include "Common/utility.h"        // for cloneAll
+#include "Common/Stats/Counter.h" // for counters
 #include "GenPoly/GenPoly.h"
 #include "InitTweak/InitTweak.h"   // for isConstructor, isCopyFunction, isC...
@@ -41,4 +42,41 @@
 
 namespace SymTab {
+
+	// Statistics block
+	namespace {
+
+		static inline auto stats_idtable() {
+			using namespace Stats::Counters;
+			static auto group = build<CounterGroup>("IdTable");
+			static struct {
+				SimpleCounter * find;
+				AverageCounter<double> * size;
+				AverageCounter<double> * key;
+			} ret = {
+				.find = build<SimpleCounter>("Find calls", group),
+				.size = build<AverageCounter<double>>("Average Size", group),
+				.key  = build<AverageCounter<double>>("Average Key Size", group),
+			};
+			return ret;
+		}
+
+		static inline auto stats_indexers() {
+			using namespace Stats::Counters;
+			static auto group   = build<CounterGroup>("Indexers");
+			static struct {
+				SimpleCounter * count;
+				AverageCounter<double> * size;
+				AverageCounter<double> * depth_a;
+				MaxCounter<size_t> * depth_m;
+			} ret = {
+				.count   = build<SimpleCounter>("Count", group),
+				.size    = build<AverageCounter<double>>("Average Size", group),
+				.depth_a = build<AverageCounter<double>>("Average Depth", group),
+				.depth_m = build<MaxCounter<size_t>>("Max Depth", group),
+			};
+			return ret;
+		}
+	}
+
 	std::ostream & operator<<( std::ostream & out, const Indexer::IdData & data ) {
 		return out << "(" << data.id << "," << data.baseExpr << ")";
@@ -197,7 +235,11 @@
 	}
 
-	Indexer::Indexer() : tables( 0 ), scope( 0 ) {}
-
-	Indexer::Indexer( const Indexer &that ) : doDebug( that.doDebug ), tables( newRef( that.tables ) ), scope( that.scope ) {}
+	Indexer::Indexer() : tables( 0 ), scope( 0 ) {
+		(*stats_indexers().count)++;
+	}
+
+	Indexer::Indexer( const Indexer &that ) : doDebug( that.doDebug ), tables( newRef( that.tables ) ), scope( that.scope ) {
+		(*stats_indexers().count)++;
+	}
 
 	Indexer::Indexer( Indexer &&that ) : doDebug( that.doDebug ), tables( that.tables ), scope( that.scope ) {
@@ -206,4 +248,13 @@
 
 	Indexer::~Indexer() {
+		if(tables) {
+			stats_indexers().size->push( tables->idTable.size() );
+			size_t depth = 1;
+			for( auto crnt = tables->base.tables; crnt; crnt = crnt->base.tables ) {
+				++depth;
+			}
+			stats_indexers().depth_a->push( depth );
+			stats_indexers().depth_m->push( depth );
+		}
 		deleteRef( tables );
 	}
@@ -237,4 +288,7 @@
 		while ( searchTables ) {
 
+			(*stats_idtable().find)++;
+			stats_idtable().key->push( id.size() );
+			stats_idtable().size->push( searchTables->idTable.size() );
 			IdTable::const_iterator decls = searchTables->idTable.find( id );
 			if ( decls != searchTables->idTable.end() ) {
@@ -313,4 +367,7 @@
 		if ( tables->scope < scope ) return nullptr;
 
+		(*stats_idtable().find)++;
+		stats_idtable().key->push( id.size() );
+		stats_idtable().size->push( tables->idTable.size() );
 		IdTable::const_iterator decls = tables->idTable.find( id );
 		if ( decls != tables->idTable.end() ) {
@@ -331,4 +388,7 @@
 		if ( tables->scope < scope ) return false;
 
+		(*stats_idtable().find)++;
+		stats_idtable().key->push( id.size() );
+		stats_idtable().size->push( tables->idTable.size() );
 		IdTable::const_iterator decls = tables->idTable.find( id );
 		if ( decls != tables->idTable.end() ) {
@@ -347,4 +407,7 @@
 		if ( tables->scope < scope ) return false;
 
+		(*stats_idtable().find)++;
+		stats_idtable().key->push( id.size() );
+		stats_idtable().size->push( tables->idTable.size() );
 		IdTable::const_iterator decls = tables->idTable.find( id );
 		if ( decls != tables->idTable.end() ) {
Index: src/SymTab/Mangler.cc
===================================================================
--- src/SymTab/Mangler.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/SymTab/Mangler.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -15,19 +15,20 @@
 #include "Mangler.h"
 
-#include <algorithm>                // for copy, transform
-#include <cassert>                  // for assert, assertf
-#include <functional>               // for const_mem_fun_t, mem_fun
-#include <iterator>                 // for ostream_iterator, back_insert_ite...
-#include <list>                     // for _List_iterator, list, _List_const...
-#include <string>                   // for string, char_traits, operator<<
-
-#include "CodeGen/OperatorTable.h"  // for OperatorInfo, operatorLookup
+#include <algorithm>                     // for copy, transform
+#include <cassert>                       // for assert, assertf
+#include <functional>                    // for const_mem_fun_t, mem_fun
+#include <iterator>                      // for ostream_iterator, back_insert_ite...
+#include <list>                          // for _List_iterator, list, _List_const...
+#include <string>                        // for string, char_traits, operator<<
+
+#include "CodeGen/OperatorTable.h"       // for OperatorInfo, operatorLookup
 #include "Common/PassVisitor.h"
-#include "Common/SemanticError.h"   // for SemanticError
-#include "Common/utility.h"         // for toString
-#include "Parser/LinkageSpec.h"     // for Spec, isOverridable, AutoGen, Int...
-#include "SynTree/Declaration.h"    // for TypeDecl, DeclarationWithType
-#include "SynTree/Expression.h"     // for TypeExpr, Expression, operator<<
-#include "SynTree/Type.h"           // for Type, ReferenceToType, Type::Fora...
+#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/Declaration.h"         // for TypeDecl, DeclarationWithType
+#include "SynTree/Expression.h"          // for TypeExpr, Expression, operator<<
+#include "SynTree/Type.h"                // for Type, ReferenceToType, Type::Fora...
 
 namespace SymTab {
@@ -37,4 +38,5 @@
 			struct Mangler : public WithShortCircuiting, public WithVisitorRef<Mangler>, public WithGuards {
 				Mangler( bool mangleOverridable, bool typeMode, bool mangleGenericParams );
+				Mangler( const ResolvExpr::TypeEnvironment& env );
 				Mangler( const Mangler & ) = delete;
 
@@ -65,7 +67,8 @@
 			  private:
 				std::ostringstream mangleName;  ///< Mangled name being constructed
-				typedef std::map< std::string, std::pair< int, int > > VarMapType;
+				typedef std::map< std::string, std::pair< std::string, int > > VarMapType;
 				VarMapType varNums;             ///< Map of type variables to indices
 				int nextVarNum;                 ///< Next type variable index
+				const ResolvExpr::TypeEnvironment* env;  ///< optional environment for substitutions
 				bool isTopLevel;                ///< Is the Mangler at the top level
 				bool mangleOverridable;         ///< Specially mangle overridable built-in methods
@@ -75,4 +78,10 @@
 				bool inQualifiedType = false;   ///< Add start/end delimiters around qualified type
 
+			  public:
+				Mangler( bool mangleOverridable, bool typeMode, bool mangleGenericParams, 
+					int nextVarNum, const ResolvExpr::TypeEnvironment* env, 
+					const VarMapType& varNums );
+
+			  private:
 				void mangleDecl( DeclarationWithType *declaration );
 				void mangleRef( ReferenceToType *refType, std::string prefix );
@@ -100,7 +109,27 @@
 		}
 
+		std::string mangleAssnKey( DeclarationWithType* decl, 
+				const ResolvExpr::TypeEnvironment& env ) {
+			PassVisitor<Mangler> mangler( env );
+			maybeAccept( decl, mangler );
+			return mangler.pass.get_mangleName();
+		}
+
 		namespace {
 			Mangler::Mangler( bool mangleOverridable, bool typeMode, bool mangleGenericParams )
-				: nextVarNum( 0 ), isTopLevel( true ), mangleOverridable( mangleOverridable ), typeMode( typeMode ), mangleGenericParams( mangleGenericParams ) {}
+				: nextVarNum( 0 ), env(nullptr), isTopLevel( true ), 
+				mangleOverridable( mangleOverridable ), typeMode( typeMode ), 
+				mangleGenericParams( mangleGenericParams ) {}
+			
+			Mangler::Mangler( const ResolvExpr::TypeEnvironment& env )
+				: nextVarNum( 0 ), env( &env ), isTopLevel( true ), mangleOverridable( false ),
+				typeMode( false ), mangleGenericParams( true ) {}
+			
+			Mangler::Mangler( bool mangleOverridable, bool typeMode, bool mangleGenericParams, 
+				int nextVarNum, const ResolvExpr::TypeEnvironment* env, 
+				const VarMapType& varNums )
+				: varNums( varNums ), nextVarNum( nextVarNum ), env( env ), isTopLevel( false ), 
+				mangleOverridable( mangleOverridable ), typeMode( typeMode ), 
+				mangleGenericParams( mangleGenericParams ) {}
 
 			void Mangler::mangleDecl( DeclarationWithType * declaration ) {
@@ -329,12 +358,27 @@
 							assert( false );
 						} // switch
-						varNums[ (*i)->name ] = std::pair< int, int >( nextVarNum++, (int)(*i)->get_kind() );
+						std::string varName;
+						// replace type with substitution name if environment is available and bound
+						if ( env ) {
+							const ResolvExpr::EqvClass* varClass = env->lookup( (*i)->name );
+							if ( varClass && varClass->type ) {
+								PassVisitor<Mangler> sub_mangler(
+									mangleOverridable, typeMode, mangleGenericParams, nextVarNum, 
+									env, varNums );
+								varClass->type->accept( sub_mangler );
+								varName = std::string{"%"} + sub_mangler.pass.get_mangleName();
+							}
+						}
+						// otherwise just give type numeric name
+						if ( varName.empty() ) {
+							varName = std::to_string( nextVarNum++ );
+						}
+						varNums[ (*i)->name ] = std::make_pair( varName, (int)(*i)->get_kind() );
 						for ( std::list< DeclarationWithType* >::iterator assert = (*i)->assertions.begin(); assert != (*i)->assertions.end(); ++assert ) {
-							PassVisitor<Mangler> sub_mangler( mangleOverridable, typeMode, mangleGenericParams );
-							sub_mangler.pass.nextVarNum = nextVarNum;
-							sub_mangler.pass.isTopLevel = false;
-							sub_mangler.pass.varNums = varNums;
+							PassVisitor<Mangler> sub_mangler( 
+								mangleOverridable, typeMode, mangleGenericParams, nextVarNum, env, 
+								varNums );
 							(*assert)->accept( sub_mangler );
-							assertionNames.push_back( sub_mangler.pass.mangleName.str() );
+							assertionNames.push_back( sub_mangler.pass.get_mangleName() );
 							acount++;
 						} // for
Index: src/SymTab/Mangler.h
===================================================================
--- src/SymTab/Mangler.h	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/SymTab/Mangler.h	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -31,4 +31,8 @@
 // * Currently name compression is not implemented.
 
+namespace ResolvExpr {
+	class TypeEnvironment;
+}
+
 namespace SymTab {
 	namespace Mangler {
@@ -40,4 +44,7 @@
 		/// Mangle ignoring generic type parameters
 		std::string mangleConcrete( Type* ty );
+		/// Mangle for assertion key
+		std::string mangleAssnKey( DeclarationWithType* decl, 
+			const ResolvExpr::TypeEnvironment& env );
 
 		namespace Encoding {
Index: src/SymTab/ManglerCommon.cc
===================================================================
--- src/SymTab/ManglerCommon.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/SymTab/ManglerCommon.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 21:44:03 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 22 09:45:30 2017
-// Update Count     : 15
+// Last Modified On : Thu Feb 14 17:06:37 2019
+// Update Count     : 26
 //
 
@@ -23,40 +23,59 @@
 			const std::string manglePrefix = "_X";
 
-			const std::string basicTypes[] = {
-				"b",  // Bool
-				"c",  // Char
-				"a",  // SignedChar
-				"h",  // UnsignedChar
-				"s",  // ShortSignedInt
-				"t",  // ShortUnsignedInt
-				"i",  // SignedInt
-				"j",  // UnsignedInt
-				"l",  // LongSignedInt
-				"m",  // LongUnsignedInt
-				"x",  // LongLongSignedInt
-				"y",  // LongLongUnsignedInt
-				"f",  // Float
-				"d",  // Double
-				"e",  // LongDouble
-				"Cf", // FloatComplex
-				"Cd", // DoubleComplex
-				"Ce", // LongDoubleComplex
-				// Note: imaginary is not an overloadable type in C++
-				"If", // FloatImaginary
-				"Id", // DoubleImaginary
-				"Ie", // LongDoubleImaginary
-				"n",  // SignedInt128
-				"o",  // UnsignedInt128
-				"Dq",  // Float80 -- TODO: itanium says Float80 and LongDouble both encode to "e", but doing this causes problems with constructing long double, because the cost tables are incorrect
-				"g",  // Float128
-				// "z",	// ellipsis
-				// "Dd" // # IEEE 754r decimal floating point (64 bits)
-				// "De" // # IEEE 754r decimal floating point (128 bits)
-				// "Df" // # IEEE 754r decimal floating point (32 bits)
-				// "Dh" // # IEEE 754r half-precision floating point (16 bits)
-				// "DF"N_ // # ISO/IEC TS 18661 binary floating point type _FloatN (N bits)
-				// "Di" // char32_t
-				// "Ds" // char16_t
-			};
+			// GENERATED START, DO NOT EDIT
+			// GENERATED BY BasicTypes-gen.cc
+			// NOTES ON MANGLING:
+			// * Itanium spec says that Float80 encodes to "e" (like LongDouble), but the distinct lengths cause resolution problems.
+			// * Float128 is supposed to encode to "g", but I wanted it to mangle equal to LongDouble.
+			// * Mangling for non-standard complex types is by best guess
+			// * _FloatN is supposed to encode as "DF"N"_"; modified for same reason as above.
+			// * unused mangling identifiers:
+			//   - "z" ellipsis
+			//   - "Dd" IEEE 754r 64-bit decimal floating point (borrowed for _Float32x)
+			//   - "De" IEEE 754r 128-bit decimal floating point
+			//   - "Df" IEEE 754r 32-bit decimal floating point
+			//   - "Dh" IEEE 754r 16-bit decimal floating point (borrowed for _Float16)
+			//   - "DF"N"_" ISO/IEC TS 18661 N-bit binary floating point (_FloatN)
+			//   - "Di" char32_t
+			//   - "Ds" char16_t
+			const std::string basicTypes[BasicType::NUMBER_OF_BASIC_TYPES] = {
+				"b",        // _Bool
+				"c",        // char
+				"a",        // signed char
+				"h",        // unsigned char
+				"s",        // signed short int
+				"t",        // unsigned short int
+				"i",        // signed int
+				"j",        // unsigned int
+				"l",        // signed long int
+				"m",        // unsigned long int
+				"x",        // signed long long int
+				"y",        // unsigned long long int
+				"n",        // __int128
+				"o",        // unsigned __int128
+				"DF16_",    // _Float16
+				"CDF16_",   // _Float16 _Complex
+				"DF32_",    // _Float32
+				"CDF32_",   // _Float32 _Complex
+				"f",        // float
+				"Cf",       // float _Complex
+				"DF32x_",   // _Float32x
+				"CDF32x_",  // _Float32x _Complex
+				"DF64_",    // _Float64
+				"CDF64_",   // _Float64 _Complex
+				"d",        // double
+				"Cd",       // double _Complex
+				"DF64x_",   // _Float64x
+				"CDF64x_",  // _Float64x _Complex
+				"Dq",       // __float80
+				"DF128_",   // _Float128
+				"CDF128_",  // _Float128 _Complex
+				"g",        // __float128
+				"e",        // long double
+				"Ce",       // long double _Complex
+				"DF128x_",  // _Float128x
+				"CDF128x_", // _Float128x _Complex
+			}; // basicTypes
+			// GENERATED END
 			static_assert(
 				sizeof(basicTypes)/sizeof(basicTypes[0]) == BasicType::NUMBER_OF_BASIC_TYPES,
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/SymTab/Validate.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -49,4 +49,5 @@
 #include "CodeGen/OperatorTable.h"     // for isCtorDtor, isCtorDtorAssign
 #include "ControlStruct/Mutate.h"      // for ForExprMutator
+#include "Common/Stats.h"              // for Stats::Heap
 #include "Common/PassVisitor.h"        // for PassVisitor, WithDeclsToAdd
 #include "Common/ScopedMap.h"          // for ScopedMap
@@ -303,29 +304,87 @@
 		PassVisitor<FixQualifiedTypes> fixQual;
 
-		acceptAll( translationUnit, hoistDecls );
-		ReplaceTypedef::replaceTypedef( translationUnit );
-		ReturnTypeFixer::fix( translationUnit ); // must happen before autogen
-		acceptAll( translationUnit, epc ); // must happen before VerifyCtorDtorAssign, because void return objects should not exist; before LinkReferenceToTypes because it is an indexer and needs correct types for mangling
-		acceptAll( translationUnit, lrt ); // must happen before autogen, because sized flag needs to propagate to generated functions
-		mutateAll( translationUnit, fixQual ); // must happen after LinkReferenceToTypes, because aggregate members are accessed
-		HoistStruct::hoistStruct( translationUnit ); // must happen after EliminateTypedef, so that aggregate typedefs occur in the correct order
-		EliminateTypedef::eliminateTypedef( translationUnit ); //
-		acceptAll( translationUnit, genericParams );  // check as early as possible - can't happen before LinkReferenceToTypes
-		VerifyCtorDtorAssign::verify( translationUnit );  // must happen before autogen, because autogen examines existing ctor/dtors
-		ReturnChecker::checkFunctionReturns( translationUnit );
-		InitTweak::fixReturnStatements( translationUnit ); // must happen before autogen
-		Concurrency::applyKeywords( translationUnit );
-		acceptAll( translationUnit, fpd ); // must happen before autogenerateRoutines, after Concurrency::applyKeywords because uniqueIds must be set on declaration before resolution
-		ControlStruct::hoistControlDecls( translationUnit );  // hoist initialization out of for statements; must happen before autogenerateRoutines
-		autogenerateRoutines( translationUnit ); // moved up, used to be below compoundLiteral - currently needs EnumAndPointerDecay
-		Concurrency::implementMutexFuncs( translationUnit );
-		Concurrency::implementThreadStarter( translationUnit );
-		mutateAll( translationUnit, compoundliteral );
-		ResolvExpr::resolveWithExprs( translationUnit ); // must happen before FixObjectType because user-code is resolved and may contain with variables
-		FixObjectType::fix( translationUnit );
-		ArrayLength::computeLength( translationUnit );
-		acceptAll( translationUnit, finder ); // xxx - remove this pass soon
-		mutateAll( translationUnit, labelAddrFixer );
-		Validate::handleAttributes( translationUnit );
+		{
+			Stats::Heap::newPass("validate-A");
+			Stats::Time::BlockGuard guard("validate-A");
+			acceptAll( translationUnit, hoistDecls );
+			ReplaceTypedef::replaceTypedef( translationUnit );
+			ReturnTypeFixer::fix( translationUnit ); // must happen before autogen
+			acceptAll( translationUnit, epc ); // must happen before VerifyCtorDtorAssign, because void return objects should not exist; before LinkReferenceToTypes because it is an indexer and needs correct types for mangling
+		}
+		{
+			Stats::Heap::newPass("validate-B");
+			Stats::Time::BlockGuard guard("validate-B");
+			Stats::Time::TimeBlock("Link Reference To Types", [&]() {
+				acceptAll( translationUnit, lrt ); // must happen before autogen, because sized flag needs to propagate to generated functions
+			});
+			Stats::Time::TimeBlock("Fix Qualified Types", [&]() {
+				mutateAll( translationUnit, fixQual ); // must happen after LinkReferenceToTypes, because aggregate members are accessed
+			});
+			Stats::Time::TimeBlock("Hoist Structs", [&]() {
+				HoistStruct::hoistStruct( translationUnit ); // must happen after EliminateTypedef, so that aggregate typedefs occur in the correct order
+			});
+			Stats::Time::TimeBlock("Eliminate Typedefs", [&]() {
+				EliminateTypedef::eliminateTypedef( translationUnit ); //
+			});
+		}
+		{
+			Stats::Heap::newPass("validate-C");
+			Stats::Time::BlockGuard guard("validate-C");
+			acceptAll( translationUnit, genericParams );  // check as early as possible - can't happen before LinkReferenceToTypes
+			VerifyCtorDtorAssign::verify( translationUnit );  // must happen before autogen, because autogen examines existing ctor/dtors
+			ReturnChecker::checkFunctionReturns( translationUnit );
+			InitTweak::fixReturnStatements( translationUnit ); // must happen before autogen
+		}
+		{
+			Stats::Heap::newPass("validate-D");
+			Stats::Time::BlockGuard guard("validate-D");
+			Stats::Time::TimeBlock("Apply Concurrent Keywords", [&]() {
+				Concurrency::applyKeywords( translationUnit );
+			});
+			Stats::Time::TimeBlock("Forall Pointer Decay", [&]() {
+				acceptAll( translationUnit, fpd ); // must happen before autogenerateRoutines, after Concurrency::applyKeywords because uniqueIds must be set on declaration before resolution
+			});
+			Stats::Time::TimeBlock("Hoist Control Declarations", [&]() {
+				ControlStruct::hoistControlDecls( translationUnit );  // hoist initialization out of for statements; must happen before autogenerateRoutines
+			});
+			Stats::Time::TimeBlock("Generate Autogen routines", [&]() {
+				autogenerateRoutines( translationUnit ); // moved up, used to be below compoundLiteral - currently needs EnumAndPointerDecay
+			});
+		}
+		{
+			Stats::Heap::newPass("validate-E");
+			Stats::Time::BlockGuard guard("validate-E");
+			Stats::Time::TimeBlock("Implement Mutex Func", [&]() {
+				Concurrency::implementMutexFuncs( translationUnit );
+			});
+			Stats::Time::TimeBlock("Implement Thread Start", [&]() {
+				Concurrency::implementThreadStarter( translationUnit );
+			});
+			Stats::Time::TimeBlock("Compound Literal", [&]() {
+				mutateAll( translationUnit, compoundliteral );
+			});
+			Stats::Time::TimeBlock("Resolve With Expressions", [&]() {
+				ResolvExpr::resolveWithExprs( translationUnit ); // must happen before FixObjectType because user-code is resolved and may contain with variables
+			});
+		}
+		{
+			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", [&]() {
+				acceptAll( translationUnit, finder ); // xxx - remove this pass soon
+			});
+			Stats::Time::TimeBlock("Fix Label Address", [&]() {
+				mutateAll( translationUnit, labelAddrFixer );
+			});
+			Stats::Time::TimeBlock("Handle Attributes", [&]() {
+				Validate::handleAttributes( translationUnit );
+			});
+		}
 	}
 
Index: src/SymTab/module.mk
===================================================================
--- src/SymTab/module.mk	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/SymTab/module.mk	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -15,8 +15,12 @@
 ###############################################################################
 
-SRC += SymTab/Indexer.cc \
-       SymTab/Mangler.cc \
-       SymTab/ManglerCommon.cc \
-       SymTab/Validate.cc \
-       SymTab/FixFunction.cc \
-       SymTab/Autogen.cc
+SRC_SYMTAB = \
+      SymTab/Autogen.cc \
+      SymTab/FixFunction.cc \
+      SymTab/Indexer.cc \
+      SymTab/Mangler.cc \
+      SymTab/ManglerCommon.cc \
+      SymTab/Validate.cc
+
+SRC += $(SRC_SYMTAB)
+SRCDEMANGLE += $(SRC_SYMTAB) SymTab/Demangle.cc
Index: src/SynTree/AddressExpr.cc
===================================================================
--- src/SynTree/AddressExpr.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/SynTree/AddressExpr.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 23:54:44 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Tue Apr 26 12:35:13 2016
-// Update Count     : 6
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu Feb 28 13:13:38 2019
+// Update Count     : 10
 //
 
@@ -47,6 +47,9 @@
 		} else {
 			// taking address of non-lvalue -- must be a reference, loses one layer of reference
-			ReferenceType * refType = strict_dynamic_cast< ReferenceType * >( arg->result );
-			set_result( addrType( refType->base ) );
+			if ( ReferenceType * refType = dynamic_cast< ReferenceType * >( arg->result ) ) {
+				set_result( addrType( refType->base ) );
+			} else {
+				SemanticError( arg->result, "Attempt to take address of non-lvalue expression: " );
+			} // if
 		}
 		// result of & is never an lvalue
Index: src/SynTree/BasicType.cc
===================================================================
--- src/SynTree/BasicType.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/SynTree/BasicType.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Sep 25 14:14:03 2017
-// Update Count     : 11
+// Last Modified On : Thu Jan 31 21:37:36 2019
+// Update Count     : 12
 //
 
@@ -30,4 +30,6 @@
 
 bool BasicType::isInteger() const {
+	return kind <= UnsignedInt128;
+#if 0
 	switch ( kind ) {
 	  case Bool:
@@ -63,4 +65,5 @@
 	assert( false );
 	return false;
+#endif
 }
 
Index: src/SynTree/Constant.cc
===================================================================
--- src/SynTree/Constant.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/SynTree/Constant.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -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 Spt 28 14:49:00 2018
-// Update Count     : 30
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Feb 13 18:11:22 2019
+// Update Count     : 32
 //
 
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/SynTree/Expression.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 25 14:15:47 2017
-// Update Count     : 54
+// Last Modified On : Tue Feb 19 18:10:55 2019
+// Update Count     : 60
 //
 
@@ -33,5 +33,5 @@
 #include "GenPoly/Lvalue.h"
 
-void printInferParams( const InferredParams & inferParams, std::ostream &os, Indenter indent, int level ) {
+void printInferParams( const InferredParams & inferParams, std::ostream & os, Indenter indent, int level ) {
 	if ( ! inferParams.empty() ) {
 		os << indent << "with inferred parameters " << level << ":" << std::endl;
@@ -47,5 +47,5 @@
 Expression::Expression() : result( 0 ), env( 0 ) {}
 
-Expression::Expression( const Expression &other ) : BaseSyntaxNode( other ), result( maybeClone( other.result ) ), env( maybeClone( other.env ) ), extension( other.extension ), inferParams( other.inferParams ), resnSlots( other.resnSlots ) {}
+Expression::Expression( const Expression & other ) : BaseSyntaxNode( other ), result( maybeClone( other.result ) ), env( maybeClone( other.env ) ), extension( other.extension ), inferParams( other.inferParams ), resnSlots( other.resnSlots ) {}
 
 void Expression::spliceInferParams( Expression * other ) {
@@ -62,5 +62,5 @@
 }
 
-void Expression::print( std::ostream &os, Indenter indent ) const {
+void Expression::print( std::ostream & os, Indenter indent ) const {
 	printInferParams( inferParams, os, indent+1, 0 );
 
@@ -79,10 +79,10 @@
 }
 
-ConstantExpr::ConstantExpr( const ConstantExpr &other) : Expression( other ), constant( other.constant ) {
+ConstantExpr::ConstantExpr( const ConstantExpr & other) : Expression( other ), constant( other.constant ) {
 }
 
 ConstantExpr::~ConstantExpr() {}
 
-void ConstantExpr::print( std::ostream &os, Indenter indent ) const {
+void ConstantExpr::print( std::ostream & os, Indenter indent ) const {
 	os << "constant expression " ;
 	constant.print( os );
@@ -124,5 +124,5 @@
 }
 
-VariableExpr::VariableExpr( const VariableExpr &other ) : Expression( other ), var( other.var ) {
+VariableExpr::VariableExpr( const VariableExpr & other ) : Expression( other ), var( other.var ) {
 }
 
@@ -137,5 +137,5 @@
 }
 
-void VariableExpr::print( std::ostream &os, Indenter indent ) const {
+void VariableExpr::print( std::ostream & os, Indenter indent ) const {
 	os << "Variable Expression: ";
 	var->printShort(os, indent);
@@ -143,15 +143,15 @@
 }
 
-SizeofExpr::SizeofExpr( Expression *expr_ ) :
+SizeofExpr::SizeofExpr( Expression * expr_ ) :
 		Expression(), expr(expr_), type(0), isType(false) {
 	set_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );
 }
 
-SizeofExpr::SizeofExpr( Type *type_ ) :
+SizeofExpr::SizeofExpr( Type * type_ ) :
 		Expression(), expr(0), type(type_), isType(true) {
 	set_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );
 }
 
-SizeofExpr::SizeofExpr( const SizeofExpr &other ) :
+SizeofExpr::SizeofExpr( const SizeofExpr & other ) :
 	Expression( other ), expr( maybeClone( other.expr ) ), type( maybeClone( other.type ) ), isType( other.isType ) {
 }
@@ -162,5 +162,5 @@
 }
 
-void SizeofExpr::print( std::ostream &os, Indenter indent) const {
+void SizeofExpr::print( std::ostream & os, Indenter indent) const {
 	os << "Sizeof Expression on: ";
 	if (isType) type->print(os, indent+1);
@@ -169,15 +169,15 @@
 }
 
-AlignofExpr::AlignofExpr( Expression *expr_ ) :
+AlignofExpr::AlignofExpr( Expression * expr_ ) :
 		Expression(), expr(expr_), type(0), isType(false) {
 	set_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );
 }
 
-AlignofExpr::AlignofExpr( Type *type_ ) :
+AlignofExpr::AlignofExpr( Type * type_ ) :
 		Expression(), expr(0), type(type_), isType(true) {
 	set_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );
 }
 
-AlignofExpr::AlignofExpr( const AlignofExpr &other ) :
+AlignofExpr::AlignofExpr( const AlignofExpr & other ) :
 	Expression( other ), expr( maybeClone( other.expr ) ), type( maybeClone( other.type ) ), isType( other.isType ) {
 }
@@ -188,5 +188,5 @@
 }
 
-void AlignofExpr::print( std::ostream &os, Indenter indent) const {
+void AlignofExpr::print( std::ostream & os, Indenter indent) const {
 	os << "Alignof Expression on: ";
 	if (isType) type->print(os, indent+1);
@@ -195,5 +195,5 @@
 }
 
-UntypedOffsetofExpr::UntypedOffsetofExpr( Type *type, const std::string &member ) :
+UntypedOffsetofExpr::UntypedOffsetofExpr( Type * type, const std::string & member ) :
 		Expression(), type(type), member(member) {
 	assert( type );
@@ -201,5 +201,5 @@
 }
 
-UntypedOffsetofExpr::UntypedOffsetofExpr( const UntypedOffsetofExpr &other ) :
+UntypedOffsetofExpr::UntypedOffsetofExpr( const UntypedOffsetofExpr & other ) :
 	Expression( other ), type( maybeClone( other.type ) ), member( other.member ) {}
 
@@ -208,5 +208,5 @@
 }
 
-void UntypedOffsetofExpr::print( std::ostream &os, Indenter indent) const {
+void UntypedOffsetofExpr::print( std::ostream & os, Indenter indent) const {
 	os << "Untyped Offsetof Expression on member " << member << " of ";
 	type->print(os, indent+1);
@@ -214,5 +214,5 @@
 }
 
-OffsetofExpr::OffsetofExpr( Type *type, DeclarationWithType *member ) :
+OffsetofExpr::OffsetofExpr( Type * type, DeclarationWithType * member ) :
 		Expression(), type(type), member(member) {
 	assert( member );
@@ -221,5 +221,5 @@
 }
 
-OffsetofExpr::OffsetofExpr( const OffsetofExpr &other ) :
+OffsetofExpr::OffsetofExpr( const OffsetofExpr & other ) :
 	Expression( other ), type( maybeClone( other.type ) ), member( other.member ) {}
 
@@ -228,5 +228,5 @@
 }
 
-void OffsetofExpr::print( std::ostream &os, Indenter indent) const {
+void OffsetofExpr::print( std::ostream & os, Indenter indent) const {
 	os << "Offsetof Expression on member " << member->name << " of ";
 	type->print(os, indent+1);
@@ -234,14 +234,14 @@
 }
 
-OffsetPackExpr::OffsetPackExpr( StructInstType *type ) : Expression(), type( type ) {
+OffsetPackExpr::OffsetPackExpr( StructInstType * type ) : Expression(), type( type ) {
 	assert( type );
 	set_result( new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), 0, false, false ) );
 }
 
-OffsetPackExpr::OffsetPackExpr( const OffsetPackExpr &other ) : Expression( other ), type( maybeClone( other.type ) ) {}
+OffsetPackExpr::OffsetPackExpr( const OffsetPackExpr & other ) : Expression( other ), type( maybeClone( other.type ) ) {}
 
 OffsetPackExpr::~OffsetPackExpr() { delete type; }
 
-void OffsetPackExpr::print( std::ostream &os, Indenter indent ) const {
+void OffsetPackExpr::print( std::ostream & os, Indenter indent ) const {
 	os << "Offset pack expression on ";
 	type->print(os, indent+1);
@@ -249,13 +249,13 @@
 }
 
-AttrExpr::AttrExpr( Expression *attr, Expression *expr_ ) :
+AttrExpr::AttrExpr( Expression * attr, Expression * expr_ ) :
 		Expression(), attr( attr ), expr(expr_), type(0), isType(false) {
 }
 
-AttrExpr::AttrExpr( Expression *attr, Type *type_ ) :
+AttrExpr::AttrExpr( Expression * attr, Type * type_ ) :
 		Expression(), attr( attr ), expr(0), type(type_), isType(true) {
 }
 
-AttrExpr::AttrExpr( const AttrExpr &other ) :
+AttrExpr::AttrExpr( const AttrExpr & other ) :
 		Expression( other ), attr( maybeClone( other.attr ) ), expr( maybeClone( other.expr ) ), type( maybeClone( other.type ) ), isType( other.isType ) {
 }
@@ -267,5 +267,5 @@
 }
 
-void AttrExpr::print( std::ostream &os, Indenter indent) const {
+void AttrExpr::print( std::ostream & os, Indenter indent) const {
 	os << "Attr ";
 	attr->print( os, indent+1);
@@ -278,13 +278,13 @@
 }
 
-CastExpr::CastExpr( Expression *arg, Type *toType, bool isGenerated ) : Expression(), arg(arg), isGenerated( isGenerated ) {
+CastExpr::CastExpr( Expression * arg, Type * toType, bool isGenerated ) : arg(arg), isGenerated( isGenerated ) {
 	set_result(toType);
 }
 
-CastExpr::CastExpr( Expression *arg, bool isGenerated ) : Expression(), arg(arg), isGenerated( isGenerated ) {
+CastExpr::CastExpr( Expression * arg, bool isGenerated ) : arg(arg), isGenerated( isGenerated ) {
 	set_result( new VoidType( Type::Qualifiers() ) );
 }
 
-CastExpr::CastExpr( const CastExpr &other ) : Expression( other ), arg( maybeClone( other.arg ) ), isGenerated( other.isGenerated ) {
+CastExpr::CastExpr( const CastExpr & other ) : Expression( other ), arg( maybeClone( other.arg ) ), isGenerated( other.isGenerated ) {
 }
 
@@ -293,6 +293,6 @@
 }
 
-void CastExpr::print( std::ostream &os, Indenter indent ) const {
-	os << "Cast of:" << std::endl << indent+1;
+void CastExpr::print( std::ostream & os, Indenter indent ) const {
+	os << (isGenerated ? "Generated " : "Explicit ") << "Cast of:" << std::endl << indent+1;
 	arg->print(os, indent+1);
 	os << std::endl << indent << "... to:";
@@ -306,8 +306,8 @@
 }
 
-KeywordCastExpr::KeywordCastExpr( Expression *arg, Target target ) : Expression(), arg(arg), target( target ) {
-}
-
-KeywordCastExpr::KeywordCastExpr( const KeywordCastExpr &other ) : Expression( other ), arg( maybeClone( other.arg ) ), target( other.target ) {
+KeywordCastExpr::KeywordCastExpr( Expression * arg, Target target ) : Expression(), arg(arg), target( target ) {
+}
+
+KeywordCastExpr::KeywordCastExpr( const KeywordCastExpr & other ) : Expression( other ), arg( maybeClone( other.arg ) ), target( other.target ) {
 }
 
@@ -327,5 +327,5 @@
 }
 
-void KeywordCastExpr::print( std::ostream &os, Indenter indent ) const {
+void KeywordCastExpr::print( std::ostream & os, Indenter indent ) const {
 	os << "Keyword Cast of:" << std::endl << indent+1;
 	arg->print(os, indent+1);
@@ -335,9 +335,9 @@
 }
 
-VirtualCastExpr::VirtualCastExpr( Expression *arg_, Type *toType ) : Expression(), arg(arg_) {
+VirtualCastExpr::VirtualCastExpr( Expression * arg_, Type * toType ) : Expression(), arg(arg_) {
 	set_result(toType);
 }
 
-VirtualCastExpr::VirtualCastExpr( const VirtualCastExpr &other ) : Expression( other ), arg( maybeClone( other.arg ) ) {
+VirtualCastExpr::VirtualCastExpr( const VirtualCastExpr & other ) : Expression( other ), arg( maybeClone( other.arg ) ) {
 }
 
@@ -346,5 +346,5 @@
 }
 
-void VirtualCastExpr::print( std::ostream &os, Indenter indent ) const {
+void VirtualCastExpr::print( std::ostream & os, Indenter indent ) const {
 	os << "Virtual Cast of:" << std::endl << indent+1;
 	arg->print(os, indent+1);
@@ -359,10 +359,10 @@
 }
 
-UntypedMemberExpr::UntypedMemberExpr( Expression * member, Expression *aggregate ) :
+UntypedMemberExpr::UntypedMemberExpr( Expression * member, Expression * aggregate ) :
 		Expression(), member(member), aggregate(aggregate) {
 	assert( aggregate );
 }
 
-UntypedMemberExpr::UntypedMemberExpr( const UntypedMemberExpr &other ) :
+UntypedMemberExpr::UntypedMemberExpr( const UntypedMemberExpr & other ) :
 		Expression( other ), member( maybeClone( other.member ) ), aggregate( maybeClone( other.aggregate ) ) {
 }
@@ -373,5 +373,5 @@
 }
 
-void UntypedMemberExpr::print( std::ostream &os, Indenter indent ) const {
+void UntypedMemberExpr::print( std::ostream & os, Indenter indent ) const {
 	os << "Untyped Member Expression, with field: " << std::endl << indent+1;
 	member->print(os, indent+1 );
@@ -381,5 +381,5 @@
 }
 
-MemberExpr::MemberExpr( DeclarationWithType *member, Expression *aggregate ) :
+MemberExpr::MemberExpr( DeclarationWithType * member, Expression * aggregate ) :
 		Expression(), member(member), aggregate(aggregate) {
 	assert( member );
@@ -395,5 +395,5 @@
 }
 
-MemberExpr::MemberExpr( const MemberExpr &other ) :
+MemberExpr::MemberExpr( const MemberExpr & other ) :
 		Expression( other ), member( other.member ), aggregate( maybeClone( other.aggregate ) ) {
 }
@@ -404,5 +404,5 @@
 }
 
-void MemberExpr::print( std::ostream &os, Indenter indent ) const {
+void MemberExpr::print( std::ostream & os, Indenter indent ) const {
 	os << "Member Expression, with field:" << std::endl;
 	os << indent+1;
@@ -413,8 +413,8 @@
 }
 
-UntypedExpr::UntypedExpr( Expression *function, const std::list<Expression *> &args ) :
+UntypedExpr::UntypedExpr( Expression * function, const std::list<Expression *> & args ) :
 		Expression(), function(function), args(args) {}
 
-UntypedExpr::UntypedExpr( const UntypedExpr &other ) :
+UntypedExpr::UntypedExpr( const UntypedExpr & other ) :
 		Expression( other ), function( maybeClone( other.function ) ) {
 	cloneAll( other.args, args );
@@ -455,5 +455,5 @@
 
 
-void UntypedExpr::print( std::ostream &os, Indenter indent ) const {
+void UntypedExpr::print( std::ostream & os, Indenter indent ) const {
 	os << "Applying untyped:" << std::endl;
 	os << indent+1;
@@ -469,20 +469,20 @@
 }
 
-NameExpr::NameExpr( const NameExpr &other ) : Expression( other ), name( other.name ) {
+NameExpr::NameExpr( const NameExpr & other ) : Expression( other ), name( other.name ) {
 }
 
 NameExpr::~NameExpr() {}
 
-void NameExpr::print( std::ostream &os, Indenter indent ) const {
+void NameExpr::print( std::ostream & os, Indenter indent ) const {
 	os << "Name: " << get_name();
 	Expression::print( os, indent );
 }
 
-LogicalExpr::LogicalExpr( Expression *arg1_, Expression *arg2_, bool andp ) :
+LogicalExpr::LogicalExpr( Expression * arg1_, Expression * arg2_, bool andp ) :
 		Expression(), arg1(arg1_), arg2(arg2_), isAnd(andp) {
 	set_result( new BasicType( Type::Qualifiers(), BasicType::SignedInt ) );
 }
 
-LogicalExpr::LogicalExpr( const LogicalExpr &other ) :
+LogicalExpr::LogicalExpr( const LogicalExpr & other ) :
 		Expression( other ), arg1( maybeClone( other.arg1 ) ), arg2( maybeClone( other.arg2 ) ), isAnd( other.isAnd ) {
 }
@@ -493,5 +493,5 @@
 }
 
-void LogicalExpr::print( std::ostream &os, Indenter indent )const {
+void LogicalExpr::print( std::ostream & os, Indenter indent )const {
 	os << "Short-circuited operation (" << (isAnd ? "and" : "or") << ") on: ";
 	arg1->print(os);
@@ -504,5 +504,5 @@
 		Expression(), arg1(arg1), arg2(arg2), arg3(arg3) {}
 
-ConditionalExpr::ConditionalExpr( const ConditionalExpr &other ) :
+ConditionalExpr::ConditionalExpr( const ConditionalExpr & other ) :
 		Expression( other ), arg1( maybeClone( other.arg1 ) ), arg2( maybeClone( other.arg2 ) ), arg3( maybeClone( other.arg3 ) ) {
 }
@@ -514,5 +514,5 @@
 }
 
-void ConditionalExpr::print( std::ostream &os, Indenter indent ) const {
+void ConditionalExpr::print( std::ostream & os, Indenter indent ) const {
 	os << "Conditional expression on: " << std::endl << indent+1;
 	arg1->print( os, indent+1 );
@@ -527,5 +527,5 @@
 
 
-void AsmExpr::print( std::ostream &os, Indenter indent ) const {
+void AsmExpr::print( std::ostream & os, Indenter indent ) const {
 	os << "Asm Expression: " << std::endl;
 	if ( inout ) inout->print( os, indent+1 );
@@ -555,5 +555,5 @@
 }
 
-void ImplicitCopyCtorExpr::print( std::ostream &os, Indenter indent ) const {
+void ImplicitCopyCtorExpr::print( std::ostream & os, Indenter indent ) const {
 	os <<  "Implicit Copy Constructor Expression: " << std::endl << indent+1;
 	callExpr->print( os, indent+1 );
@@ -581,5 +581,5 @@
 }
 
-void ConstructorExpr::print( std::ostream &os, Indenter indent ) const {
+void ConstructorExpr::print( std::ostream & os, Indenter indent ) const {
 	os <<  "Constructor Expression: " << std::endl << indent+1;
 	callExpr->print( os, indent + 2 );
@@ -594,5 +594,5 @@
 }
 
-CompoundLiteralExpr::CompoundLiteralExpr( const CompoundLiteralExpr &other ) : Expression( other ), initializer( other.initializer->clone() ) {}
+CompoundLiteralExpr::CompoundLiteralExpr( const CompoundLiteralExpr & other ) : Expression( other ), initializer( other.initializer->clone() ) {}
 
 CompoundLiteralExpr::~CompoundLiteralExpr() {
@@ -600,5 +600,5 @@
 }
 
-void CompoundLiteralExpr::print( std::ostream &os, Indenter indent ) const {
+void CompoundLiteralExpr::print( std::ostream & os, Indenter indent ) const {
 	os << "Compound Literal Expression: " << std::endl << indent+1;
 	result->print( os, indent+1 );
@@ -608,7 +608,7 @@
 }
 
-RangeExpr::RangeExpr( Expression *low, Expression *high ) : low( low ), high( high ) {}
-RangeExpr::RangeExpr( const RangeExpr &other ) : Expression( other ), low( other.low->clone() ), high( other.high->clone() ) {}
-void RangeExpr::print( std::ostream &os, Indenter indent ) const {
+RangeExpr::RangeExpr( Expression * low, Expression * high ) : low( low ), high( high ) {}
+RangeExpr::RangeExpr( const RangeExpr & other ) : Expression( other ), low( other.low->clone() ), high( other.high->clone() ) {}
+void RangeExpr::print( std::ostream & os, Indenter indent ) const {
 	os << "Range Expression: ";
 	low->print( os, indent );
@@ -618,8 +618,8 @@
 }
 
-StmtExpr::StmtExpr( CompoundStmt *statements ) : statements( statements ) {
+StmtExpr::StmtExpr( CompoundStmt * statements ) : statements( statements ) {
 	computeResult();
 }
-StmtExpr::StmtExpr( const StmtExpr &other ) : Expression( other ), statements( other.statements->clone() ) {
+StmtExpr::StmtExpr( const StmtExpr & other ) : Expression( other ), statements( other.statements->clone() ) {
 	cloneAll( other.returnDecls, returnDecls );
 	cloneAll( other.dtors, dtors );
@@ -650,5 +650,5 @@
 	}
 }
-void StmtExpr::print( std::ostream &os, Indenter indent ) const {
+void StmtExpr::print( std::ostream & os, Indenter indent ) const {
 	os << "Statement Expression: " << std::endl << indent+1;
 	statements->print( os, indent+1 );
@@ -666,5 +666,5 @@
 
 long long UniqueExpr::count = 0;
-UniqueExpr::UniqueExpr( Expression *expr, long long idVal ) : expr( expr ), object( nullptr ), var( nullptr ), id( idVal ) {
+UniqueExpr::UniqueExpr( Expression * expr, long long idVal ) : expr( expr ), object( nullptr ), var( nullptr ), id( idVal ) {
 	assert( expr );
 	assert( count != -1 );
@@ -674,5 +674,5 @@
 	}
 }
-UniqueExpr::UniqueExpr( const UniqueExpr &other ) : Expression( other ), expr( maybeClone( other.expr ) ), object( maybeClone( other.object ) ), var( maybeClone( other.var ) ), id( other.id ) {
+UniqueExpr::UniqueExpr( const UniqueExpr & other ) : Expression( other ), expr( maybeClone( other.expr ) ), object( maybeClone( other.object ) ), var( maybeClone( other.var ) ), id( other.id ) {
 }
 UniqueExpr::~UniqueExpr() {
@@ -681,5 +681,5 @@
 	delete var;
 }
-void UniqueExpr::print( std::ostream &os, Indenter indent ) const {
+void UniqueExpr::print( std::ostream & os, Indenter indent ) const {
 	os << "Unique Expression with id:" << id << std::endl << indent+1;
 	expr->print( os, indent+1 );
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/SynTree/Expression.h	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Sep  3 19:23:46 2017
-// Update Count     : 48
+// Last Modified On : Mon Feb 18 18:29:51 2019
+// Update Count     : 49
 //
 
@@ -195,5 +195,5 @@
   public:
 	Expression * arg;
-	bool isGenerated = true; // whether this cast appeared in the source program
+	bool isGenerated = true; // cast generated implicitly by code generation or explicit in program
 
 	CastExpr( Expression * arg, bool isGenerated = true );
Index: src/SynTree/Type.cc
===================================================================
--- src/SynTree/Type.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/SynTree/Type.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jun 22 10:17:19 2018
-// Update Count     : 39
+// Last Modified On : Thu Jan 31 21:54:16 2019
+// Update Count     : 43
 //
 #include "Type.h"
@@ -25,4 +25,5 @@
 
 const char *BasicType::typeNames[] = {
+#if 0
 	"_Bool",
 	"char",
@@ -49,5 +50,59 @@
 	"unsigned __int128",
 	"__float80",
-	"__float128"
+	"__float128",
+	"_Float16",
+	"_Float32",
+	"_Float32x",
+	"_Float64",
+	"_Float64x",
+	"_Float128",
+	"_Float128x",
+	"_Float16 _Complex",
+	"_Float32 _Complex",
+	"_Float32x _Complex",
+	"_Float64 _Complex",
+	"_Float64x _Complex",
+	"_Float128 _Complex",
+	"_Float128x _Complex",
+#endif
+	"_Bool",
+	"char",
+	"signed char",
+	"unsigned char",
+	"signed short int",
+	"unsigned short int",
+	"signed int",
+	"unsigned int",
+	"signed long int",
+	"unsigned long int",
+	"signed long long int",
+	"unsigned long long int",
+	"__int128",
+	"unsigned __int128",
+	"_Float16",
+	"_Float16 _Complex",
+	"_Float32",
+	"_Float32 _Complex",
+	"float",
+	"float _Complex",
+	//"float _Imaginary",
+	"_Float32x",
+	"_Float32x _Complex",
+	"_Float64",
+	"_Float64 _Complex",
+	"double",
+	"double _Complex",
+	//"double _Imaginary",
+	"_Float64x",
+	"_Float64x _Complex",
+	"__float80",
+	"_Float128",
+	"_Float128 _Complex",
+	"__float128",
+	"long double",
+	"long double _Complex",
+	//"long double _Imaginary",
+	"_Float128x",
+	"_Float128x _Complex",
 };
 static_assert(
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/SynTree/Type.h	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Sep 25 14:14:01 2017
-// Update Count     : 154
+// Last Modified On : Thu Feb 14 17:11:24 2019
+// Update Count     : 169
 //
 
@@ -207,4 +207,6 @@
 class BasicType : public Type {
   public:
+	// GENERATED START, DO NOT EDIT
+	// GENERATED BY BasicTypes-gen.cc
 	enum Kind {
 		Bool,
@@ -220,19 +222,31 @@
 		LongLongSignedInt,
 		LongLongUnsignedInt,
-		Float,
-		Double,
-		LongDouble,
-		FloatComplex,
-		DoubleComplex,
-		LongDoubleComplex,
-		FloatImaginary,
-		DoubleImaginary,
-		LongDoubleImaginary,
 		SignedInt128,
 		UnsignedInt128,
-		Float80,
-		Float128,
+		uFloat16,
+		uFloat16Complex,
+		uFloat32,
+		uFloat32Complex,
+		Float,
+		FloatComplex,
+		uFloat32x,
+		uFloat32xComplex,
+		uFloat64,
+		uFloat64Complex,
+		Double,
+		DoubleComplex,
+		uFloat64x,
+		uFloat64xComplex,
+		uuFloat80,
+		uFloat128,
+		uFloat128Complex,
+		uuFloat128,
+		LongDouble,
+		LongDoubleComplex,
+		uFloat128x,
+		uFloat128xComplex,
 		NUMBER_OF_BASIC_TYPES
 	} kind;
+	// GENERATED END
 
 	static const char *typeNames[];						// string names for basic types, MUST MATCH with Kind
Index: src/SynTree/module.mk
===================================================================
--- src/SynTree/module.mk	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/SynTree/module.mk	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -15,37 +15,40 @@
 ###############################################################################
 
-SRC += SynTree/Type.cc \
-       SynTree/VoidType.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/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/DeclStmt.cc \
-       SynTree/Declaration.cc \
-       SynTree/DeclarationWithType.cc \
-       SynTree/ObjectDecl.cc \
-       SynTree/FunctionDecl.cc \
-       SynTree/AggregateDecl.cc \
-       SynTree/NamedTypeDecl.cc \
-       SynTree/TypeDecl.cc \
-       SynTree/Initializer.cc \
-       SynTree/TypeSubstitution.cc \
-       SynTree/Attribute.cc \
-       SynTree/DeclReplacer.cc
+SRC_SYNTREE = \
+      SynTree/Type.cc \
+      SynTree/VoidType.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/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/DeclStmt.cc \
+      SynTree/Declaration.cc \
+      SynTree/DeclarationWithType.cc \
+      SynTree/ObjectDecl.cc \
+      SynTree/FunctionDecl.cc \
+      SynTree/AggregateDecl.cc \
+      SynTree/NamedTypeDecl.cc \
+      SynTree/TypeDecl.cc \
+      SynTree/Initializer.cc \
+      SynTree/TypeSubstitution.cc \
+      SynTree/Attribute.cc \
+      SynTree/DeclReplacer.cc
 
+SRC += $(SRC_SYNTREE)
+SRCDEMANGLE += $(SRC_SYNTREE)
Index: src/Tuples/TupleExpansion.cc
===================================================================
--- src/Tuples/TupleExpansion.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/Tuples/TupleExpansion.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -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 17:35:04 2017
-// Update Count     : 19
+// Last Modified On : Wed Feb 13 18:14:12 2019
+// Update Count     : 21
 //
 
Index: src/Tuples/module.mk
===================================================================
--- src/Tuples/module.mk	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/Tuples/module.mk	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -15,5 +15,4 @@
 ###############################################################################
 
-SRC += 	Tuples/TupleAssignment.cc \
-	Tuples/TupleExpansion.cc \
-	Tuples/Explode.cc
+SRC += Tuples/TupleAssignment.cc Tuples/TupleExpansion.cc Tuples/Explode.cc
+SRCDEMANGLE += Tuples/TupleAssignment.cc Tuples/TupleExpansion.cc Tuples/Explode.cc
Index: src/Validate/module.mk
===================================================================
--- src/Validate/module.mk	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/Validate/module.mk	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -16,2 +16,3 @@
 
 SRC += Validate/HandleAttributes.cc
+SRCDEMANGLE += Validate/HandleAttributes.cc
Index: src/cfa.make
===================================================================
--- src/cfa.make	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/cfa.make	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -32,5 +32,5 @@
 am__v_GOC_1 =
 
-
+UPPCC = u++
 UPPCOMPILE = $(UPPCC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_UPPFLAGS) $(UPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_CFLAGS) $(CFLAGS)
 
Index: src/config.h.in
===================================================================
--- src/config.h.in	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/config.h.in	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -52,36 +52,18 @@
 #undef CFA_VERSION_SHORT
 
-/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
-   systems. This function is required for `alloca.c' support on those systems.
-   */
-#undef CRAY_STACKSEG_END
-
-/* Define to 1 if using `alloca.c'. */
-#undef C_ALLOCA
-
-/* Define to 1 if you have `alloca', as a function or macro. */
-#undef HAVE_ALLOCA
-
-/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
-   */
-#undef HAVE_ALLOCA_H
+/* Have compiler warning cast-function-type. */
+#undef HAVE_CAST_FUNCTION_TYPE
 
 /* Define to 1 if you have the <dlfcn.h> header file. */
 #undef HAVE_DLFCN_H
 
-/* Define to 1 if you have the <fenv.h> header file. */
-#undef HAVE_FENV_H
-
-/* Define to 1 if you have the <float.h> header file. */
-#undef HAVE_FLOAT_H
-
 /* Define to 1 if you have the <inttypes.h> header file. */
 #undef HAVE_INTTYPES_H
 
+/* Have keywords _FloatXX. */
+#undef HAVE_KEYWORDS_FLOATXX
+
 /* Define to 1 if you have the <libintl.h> header file. */
 #undef HAVE_LIBINTL_H
-
-/* Define to 1 if you have the <limits.h> header file. */
-#undef HAVE_LIMITS_H
 
 /* Define to 1 if you have the <malloc.h> header file. */
@@ -91,16 +73,4 @@
 #undef HAVE_MEMORY_H
 
-/* Define to 1 if you have the `memset' function. */
-#undef HAVE_MEMSET
-
-/* Define to 1 if you have the `putenv' function. */
-#undef HAVE_PUTENV
-
-/* Define to 1 if stdbool.h conforms to C99. */
-#undef HAVE_STDBOOL_H
-
-/* Define to 1 if you have the <stddef.h> header file. */
-#undef HAVE_STDDEF_H
-
 /* Define to 1 if you have the <stdint.h> header file. */
 #undef HAVE_STDINT_H
@@ -109,7 +79,4 @@
 #undef HAVE_STDLIB_H
 
-/* Define to 1 if you have the `strchr' function. */
-#undef HAVE_STRCHR
-
 /* Define to 1 if you have the <strings.h> header file. */
 #undef HAVE_STRINGS_H
@@ -117,7 +84,4 @@
 /* Define to 1 if you have the <string.h> header file. */
 #undef HAVE_STRING_H
-
-/* Define to 1 if you have the `strtol' function. */
-#undef HAVE_STRTOL
 
 /* Define to 1 if you have the <sys/stat.h> header file. */
@@ -130,6 +94,6 @@
 #undef HAVE_UNISTD_H
 
-/* Define to 1 if the system has the type `_Bool'. */
-#undef HAVE__BOOL
+/* Define to 1 if the system has the type `_Float32'. */
+#undef HAVE__FLOAT32
 
 /* Define to the sub-directory where libtool stores uninstalled libraries. */
@@ -157,12 +121,4 @@
 #undef PACKAGE_VERSION
 
-/* If using the C implementation of alloca, define if you know the
-   direction of stack growth for your system; otherwise it will be
-   automatically deduced at runtime.
-	STACK_DIRECTION > 0 => grows toward higher addresses
-	STACK_DIRECTION < 0 => grows toward lower addresses
-	STACK_DIRECTION = 0 => direction of growth unknown */
-#undef STACK_DIRECTION
-
 /* Define to 1 if you have the ANSI C header files. */
 #undef STDC_HEADERS
@@ -180,59 +136,2 @@
    `char[]'. */
 #undef YYTEXT_POINTER
-
-/* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,
-   <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
-   #define below would cause a syntax error. */
-#undef _UINT32_T
-
-/* Define for Solaris 2.5.1 so the uint8_t typedef from <sys/synch.h>,
-   <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
-   #define below would cause a syntax error. */
-#undef _UINT8_T
-
-/* Define to `__inline__' or `__inline' if that's what the C compiler
-   calls it, or to nothing if 'inline' is not supported under any name.  */
-#ifndef __cplusplus
-#undef inline
-#endif
-
-/* Define to the type of a signed integer type of width exactly 16 bits if
-   such a type exists and the standard includes do not define it. */
-#undef int16_t
-
-/* Define to the type of a signed integer type of width exactly 32 bits if
-   such a type exists and the standard includes do not define it. */
-#undef int32_t
-
-/* Define to the type of a signed integer type of width exactly 8 bits if such
-   a type exists and the standard includes do not define it. */
-#undef int8_t
-
-/* Define to the equivalent of the C99 'restrict' keyword, or to
-   nothing if this is not supported.  Do not define if restrict is
-   supported directly.  */
-#undef restrict
-/* Work around a bug in Sun C++: it does not support _Restrict or
-   __restrict__, even though the corresponding Sun C compiler ends up with
-   "#define restrict _Restrict" or "#define restrict __restrict__" in the
-   previous line.  Perhaps some future version of Sun C++ will work with
-   restrict; if so, hopefully it defines __RESTRICT like Sun C does.  */
-#if defined __SUNPRO_CC && !defined __RESTRICT
-# define _Restrict
-# define __restrict__
-#endif
-
-/* Define to `unsigned int' if <sys/types.h> does not define. */
-#undef size_t
-
-/* Define to the type of an unsigned integer type of width exactly 16 bits if
-   such a type exists and the standard includes do not define it. */
-#undef uint16_t
-
-/* Define to the type of an unsigned integer type of width exactly 32 bits if
-   such a type exists and the standard includes do not define it. */
-#undef uint32_t
-
-/* Define to the type of an unsigned integer type of width exactly 8 bits if
-   such a type exists and the standard includes do not define it. */
-#undef uint8_t
Index: src/main.cc
===================================================================
--- src/main.cc	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ src/main.cc	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Fri May 15 23:12:02 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jun  6 15:51:47 2018
-// Update Count     : 498
+// Last Modified On : Sat Feb 16 09:14:04 2019
+// Update Count     : 500
 //
 
@@ -37,5 +37,5 @@
 #include "CodeTools/TrackLoc.h"             // for fillLocations
 #include "Common/CompilerError.h"           // for CompilerError
-#include "Common/Heap.h"
+#include "Common/Stats.h"
 #include "Common/PassVisitor.h"
 #include "Common/SemanticError.h"           // for SemanticError
@@ -65,8 +65,21 @@
 using namespace std;
 
-#define PASS(name, pass)                   \
+
+void NewPass(const char * const name) {
+	Stats::Heap::newPass(name);
+	using namespace Stats::Counters;
+	static auto pass_visitor_group = build<CounterGroup>("Pass Visitor");
+	auto pass = build<CounterGroup>(name, pass_visitor_group);
+	pass_visitor_stats.depth = 0;
+	pass_visitor_stats.avg = build<AverageCounter<double>>("Average Depth", pass);
+	pass_visitor_stats.max = build<MaxCounter<double>>("Max Depth", pass);
+}
+
+#define PASS(name, pass)                  \
 	if ( errorp ) { cerr << name << endl; } \
-	HeapStats::newPass(name);               \
-	pass;
+	NewPass(name);                          \
+	Stats::Time::StartBlock(name);          \
+	pass;                                   \
+	Stats::Time::StopBlock();
 
 LinkageSpec::Spec linkage = LinkageSpec::Cforall;
@@ -142,5 +155,5 @@
 	backtrace( 6 );										// skip first 6 stack frames
 	signal( SIGABRT, SIG_DFL);							// reset default signal handler
-    raise( SIGABRT );									// reraise SIGABRT
+		raise( SIGABRT );									// reraise SIGABRT
 } // sigAbortHandler
 
@@ -148,6 +161,6 @@
 int main( int argc, char * argv[] ) {
 	FILE * input;										// use FILE rather than istream because yyin is FILE
-	ostream *output = & cout;
-	const char *filename = nullptr;
+	ostream * output = & cout;
+	const char * filename = nullptr;
 	list< Declaration * > translationUnit;
 
@@ -181,4 +194,8 @@
 		} // if
 
+		Stats::Time::StartGlobal();
+		NewPass("Parse");
+		Stats::Time::StartBlock("Parse");
+
 		// read in the builtins, extras, and the prelude
 		if ( ! nopreludep ) {							// include gcc builtins
@@ -231,7 +248,8 @@
 		// works okay for now.
 		CodeTools::fillLocations( translationUnit );
+		Stats::Time::StopBlock();
 
 		// add the assignment statement after the initialization of a type parameter
-		PASS( "validate", SymTab::validate( translationUnit, symtabp ) );
+		PASS( "Validate", SymTab::validate( translationUnit, symtabp ) );
 		if ( symtabp ) {
 			deleteAll( translationUnit );
@@ -250,8 +268,8 @@
 		} // if
 
-		PASS( "fixLabels", ControlStruct::fixLabels( translationUnit ) );
-		PASS( "fixNames", CodeGen::fixNames( translationUnit ) );
-		PASS( "genInit", InitTweak::genInit( translationUnit ) );
-		PASS( "expandMemberTuples" , Tuples::expandMemberTuples( translationUnit ) );
+		PASS( "Fix Labels", ControlStruct::fixLabels( translationUnit ) );
+		PASS( "Fix Names", CodeGen::fixNames( translationUnit ) );
+		PASS( "Gen Init", InitTweak::genInit( translationUnit ) );
+		PASS( "Expand Member Tuples" , Tuples::expandMemberTuples( translationUnit ) );
 		if ( libcfap ) {
 			// generate the bodies of cfa library functions
@@ -277,5 +295,5 @@
 		}
 
-		PASS( "resolve", ResolvExpr::resolve( translationUnit ) );
+		PASS( "Resolve", ResolvExpr::resolve( translationUnit ) );
 		if ( exprp ) {
 			dump( translationUnit );
@@ -284,5 +302,5 @@
 
 		// fix ObjectDecl - replaces ConstructorInit nodes
-		PASS( "fixInit", InitTweak::fix( translationUnit, buildingLibrary() ) );
+		PASS( "Fix Init", InitTweak::fix( translationUnit, buildingLibrary() ) );
 		if ( ctorinitp ) {
 			dump ( translationUnit );
@@ -290,13 +308,13 @@
 		} // if
 
-		PASS( "expandUniqueExpr", Tuples::expandUniqueExpr( translationUnit ) ); // xxx - is this the right place for this? want to expand ASAP so tha, sequent passes don't need to worry about double-visiting a unique expr - needs to go after InitTweak::fix so that copy constructed return declarations are reused
-
-		PASS( "translateEHM" , ControlStruct::translateEHM( translationUnit ) );
-
-		PASS( "generateWaitfor" , Concurrency::generateWaitFor( translationUnit ) );
-
-		PASS( "convertSpecializations",  GenPoly::convertSpecializations( translationUnit ) ); // needs to happen before tuple types are expanded
-
-		PASS( "expandTuples", Tuples::expandTuples( translationUnit ) ); // xxx - is this the right place for this?
+		PASS( "Expand Unique Expr", Tuples::expandUniqueExpr( translationUnit ) ); // xxx - is this the right place for this? want to expand ASAP so tha, sequent passes don't need to worry about double-visiting a unique expr - needs to go after InitTweak::fix so that copy constructed return declarations are reused
+
+		PASS( "Translate EHM" , ControlStruct::translateEHM( translationUnit ) );
+
+		PASS( "Gen Waitfor" , Concurrency::generateWaitFor( translationUnit ) );
+
+		PASS( "Convert Specializations",  GenPoly::convertSpecializations( translationUnit ) ); // needs to happen before tuple types are expanded
+
+		PASS( "Expand Tuples", Tuples::expandTuples( translationUnit ) ); // xxx - is this the right place for this?
 
 		if ( tuplep ) {
@@ -305,12 +323,12 @@
 		}
 
-		PASS( "virtual expandCasts", Virtual::expandCasts( translationUnit ) ); // Must come after translateEHM
-
-		PASS( "instantiateGenerics", GenPoly::instantiateGeneric( translationUnit ) );
+		PASS( "Virtual Expand Casts", Virtual::expandCasts( translationUnit ) ); // Must come after translateEHM
+
+		PASS( "Instantiate Generics", GenPoly::instantiateGeneric( translationUnit ) );
 		if ( genericsp ) {
 			dump( translationUnit );
 			return 0;
 		}
-		PASS( "convertLvalue", GenPoly::convertLvalue( translationUnit ) );
+		PASS( "Convert L-Value", GenPoly::convertLvalue( translationUnit ) );
 
 
@@ -319,5 +337,5 @@
 			return 0;
 		} // if
-		PASS( "box", GenPoly::box( translationUnit ) );
+		PASS( "Box", GenPoly::box( translationUnit ) );
 
 		if ( bcodegenp ) {
@@ -331,5 +349,5 @@
 
 		CodeTools::fillLocations( translationUnit );
-		PASS( "codegen", CodeGen::generate( translationUnit, *output, ! noprotop, prettycodegenp, true, linemarks ) );
+		PASS( "Code Gen", CodeGen::generate( translationUnit, *output, ! noprotop, prettycodegenp, true, linemarks ) );
 
 		CodeGen::FixMain::fix( *output, (PreludeDirector + "/bootloader.c").c_str() );
@@ -371,5 +389,5 @@
 			}
 		} catch(const std::exception& e) {
-			std::cerr << "Unaught Exception \"" << e.what() << "\"\n";
+			std::cerr << "Uncaught Exception \"" << e.what() << "\"\n";
 		}
 		return 1;
@@ -377,10 +395,11 @@
 
 	deleteAll( translationUnit );
-	if(!libcfap && !treep) HeapStats::printStats();
+	Stats::print();
+
 	return 0;
 } // main
 
 void parse_cmdline( int argc, char * argv[], const char *& filename ) {
-	enum { Ast, Bbox, Bresolver, CtorInitFix, DeclStats, Expr, ExprAlt, Grammar, LibCFA, Linemarks, Nolinemarks, Nopreamble, Parse, PreludeDir, Prototypes, Resolver, ResolvProto, Symbol, Tree, TupleExpansion, Validate, };
+	enum { Ast, Bbox, Bresolver, CtorInitFix, DeclStats, Expr, ExprAlt, Grammar, LibCFA, Linemarks, Nolinemarks, Nopreamble, Parse, PreludeDir, Prototypes, Resolver, ResolvProto, Stats, Symbol, Tree, TupleExpansion, Validate};
 
 	static struct option long_opts[] = {
@@ -402,4 +421,5 @@
 		{ "resolver", no_argument, 0, Resolver },
 		{ "resolv-proto", no_argument, 0, ResolvProto },
+		{ "stats", required_argument, 0, Stats },
 		{ "symbol", no_argument, 0, Symbol },
 		{ "tree", no_argument, 0, Tree },
@@ -416,97 +436,100 @@
 	while ( (c = getopt_long( argc, argv, "abBcCdefgGlLmnNpqrRstTvwW:yzZD:F:", long_opts, &long_index )) != -1 ) {
 		switch ( c ) {
-		  case Ast:
-		  case 'a':										// dump AST
+			case Ast:
+			case 'a':										// dump AST
 			astp = true;
 			break;
-		  case Bresolver:
-		  case 'b':										// print before resolver steps
+			case Bresolver:
+			case 'b':										// print before resolver steps
 			bresolvep = true;
 			break;
-		  case 'B':										// print before box steps
+			case 'B':										// print before box steps
 			bboxp = true;
 			break;
-		  case CtorInitFix:
-		  case 'c':										// print after constructors and destructors are replaced
+			case CtorInitFix:
+			case 'c':										// print after constructors and destructors are replaced
 			ctorinitp = true;
 			break;
-		  case 'C':										// print before code generation
+			case 'C':										// print before code generation
 			bcodegenp = true;
 			break;
-		  case DeclStats:
-		  case 'd':
-		    declstatsp = true;
-			break;
-		  case Expr:
-		  case 'e':										// dump AST after expression analysis
+			case DeclStats:
+			case 'd':
+				declstatsp = true;
+			break;
+			case Expr:
+			case 'e':										// dump AST after expression analysis
 			exprp = true;
 			break;
-		  case ExprAlt:
-		  case 'f':										// print alternatives for expressions
+			case ExprAlt:
+			case 'f':										// print alternatives for expressions
 			expraltp = true;
 			break;
-		  case Grammar:
-		  case 'g':										// bison debugging info (grammar rules)
+			case Grammar:
+			case 'g':										// bison debugging info (grammar rules)
 			yydebug = true;
 			break;
-		  case 'G':										// dump AST after instantiate generics
+			case 'G':										// dump AST after instantiate generics
 			genericsp = true;
 			break;
-		  case LibCFA:
-		  case 'l':										// generate libcfa.c
+			case LibCFA:
+			case 'l':										// generate libcfa.c
 			libcfap = true;
 			break;
-		  case Linemarks:
-		  case 'L':										// print lines marks
+			case Linemarks:
+			case 'L':										// print lines marks
 			linemarks = true;
 			break;
-		  case Nopreamble:
-		  case 'n':										// do not read preamble
+			case Nopreamble:
+			case 'n':										// do not read preamble
 			nopreludep = true;
 			break;
-		  case Nolinemarks:
-		  case 'N':										// suppress line marks
+			case Nolinemarks:
+			case 'N':										// suppress line marks
 			linemarks = false;
 			break;
-		  case Prototypes:
-		  case 'p':										// generate prototypes for preamble functions
+			case Prototypes:
+			case 'p':										// generate prototypes for preamble functions
 			noprotop = true;
 			break;
-		  case PreludeDir:
-		  	PreludeDirector = optarg;
-			break;
-		  case 'm':										// don't replace the main
-		  	nomainp = true;
-			break;
-		  case Parse:
-		  case 'q':										// dump parse tree
+			case PreludeDir:
+				PreludeDirector = optarg;
+			break;
+			case 'm':										// don't replace the main
+				nomainp = true;
+			break;
+			case Parse:
+			case 'q':										// dump parse tree
 			parsep = true;
 			break;
-		  case Resolver:
-		  case 'r':										// print resolver steps
+			case Resolver:
+			case 'r':										// print resolver steps
 			resolvep = true;
 			break;
-		  case 'R':										// dump resolv-proto instance
+			case 'R':										// dump resolv-proto instance
 			resolvprotop = true;
 			break;
-		  case Symbol:
-		  case 's':										// print symbol table events
+			case Stats:
+				Stats::parse_params(optarg);
+			break;
+			case Symbol:
+			case 's':										// print symbol table events
 			symtabp = true;
 			break;
-		  case Tree:
-		  case 't':										// build in tree
+			case Tree:
+			case 't':										// build in tree
 			treep = true;
 			break;
-		  case TupleExpansion:
-		  case 'T':										// print after tuple expansion
+			case TupleExpansion:
+			case 'T':										// print after tuple expansion
 			tuplep = true;
 			break;
-		  case 'v':										// dump AST after decl validation pass
+			case 'v':										// dump AST after decl validation pass
 			validp = true;
 			break;
-		  case 'w':
+			case 'w':
 			Wsuppress = true;
 			break;
-		  case 'W':
+			case 'W':
 			if ( strcmp( optarg, "all" ) == 0 ) {
 				SemanticWarning_EnableAll();
@@ -525,8 +548,8 @@
 			} // if
 			break;
-		  case 'y':										// dump AST on error
+			case 'y':										// dump AST on error
 			errorp = true;
 			break;
-		  case 'z':										// dump as codegen rather than AST
+			case 'z':										// dump as codegen rather than AST
 			codegenp = true;
 			break;
@@ -534,10 +557,10 @@
 			prettycodegenp = true;
 			break;
-		  case 'D':										// ignore -Dxxx
-			break;
-		  case 'F':										// source file-name without suffix
+			case 'D':										// ignore -Dxxx
+			break;
+			case 'F':										// source file-name without suffix
 			filename = optarg;
 			break;
-		  case '?':
+			case '?':
 			if ( optopt ) {								// short option ?
 				assertf( false, "Unknown option: -%c\n", (char)optopt );
@@ -548,5 +571,5 @@
 				__attribute__((fallthrough));
 			#endif
-		  default:
+			default:
 			abort();
 		} // switch
Index: tests/.expect/castError.txt
===================================================================
--- tests/.expect/castError.txt	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/.expect/castError.txt	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -1,8 +1,8 @@
-castError.cfa:7:1 error: Cannot choose between 3 alternatives for expression
-Cast of:
+castError.cfa:21:1 error: Cannot choose between 3 alternatives for expression
+Explicit Cast of:
   Name: f
 ... to:
   char Alternatives are:
-Cost ( 1, 0, 0, 0, 0, 0 ): Cast of:
+Cost ( 1, 0, 0, 0, 0, 0, 0 ): Explicit Cast of:
      Variable Expression: f: function
        accepting unspecified arguments
@@ -16,5 +16,5 @@
  Environment:
 
-Cost ( 1, 0, 0, 0, 0, 0 ): Cast of:
+Cost ( 1, 0, 0, 0, 0, 0, 0 ): Explicit Cast of:
      Variable Expression: f: double
    ... to:
@@ -25,5 +25,5 @@
  Environment:
 
-Cost ( 1, 0, 0, 0, 0, 0 ): Cast of:
+Cost ( 1, 0, 0, 0, 0, 0, 0 ): Explicit Cast of:
      Variable Expression: f: signed int
    ... to:
@@ -35,2 +35,29 @@
 
 
+castError.cfa:26:1 error: Cannot choose between 2 alternatives for expression
+Generated Cast of:
+  Comma Expression:
+    constant expression (3 3: signed int)
+    Name: v
+... to: nothing Alternatives are:
+Cost ( 0, 0, 2, 0, 0, 0, 0 ): Generated Cast of:
+     Comma Expression:
+       constant expression (3 3: signed int)
+       Variable Expression: v: unsigned char
+   ... to: nothing
+ (types:
+   void 
+ )
+ Environment:
+
+Cost ( 0, 0, 2, 0, 0, 0, 0 ): Generated Cast of:
+     Comma Expression:
+       constant expression (3 3: signed int)
+       Variable Expression: v: signed short int
+   ... to: nothing
+ (types:
+   void 
+ )
+ Environment:
+
+
Index: tests/.expect/completeTypeError.txt
===================================================================
--- tests/.expect/completeTypeError.txt	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/.expect/completeTypeError.txt	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -45,5 +45,5 @@
 
 Alternatives with failing assertions are:
-Cost ( 0, 1, 0, 1, -5, 0 ): Application of
+Cost ( 0, 1, 0, 0, 1, -5, 0 ): Application of
      Variable Expression: baz: forall
        T: sized object type
@@ -87,5 +87,5 @@
    void 
  )
- Environment:( _73_0_T ) -> instance of type T (not function type) (no widening)
+ Environment:( _74_0_T ) -> instance of type T (not function type) (no widening)
 
 
Index: tests/.expect/declarationSpecifier.x64.txt
===================================================================
--- tests/.expect/declarationSpecifier.x64.txt	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/.expect/declarationSpecifier.x64.txt	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -689,5 +689,5 @@
 signed int _X4mainFi_iPPKc__1(signed int _X4argci_1, const char **_X4argvPPKc_1){
     __attribute__ ((unused)) signed int _X12_retval_maini_1;
-    ((void)(_X12_retval_maini_1=((signed int )0)) /* ?{} */);
+    ((void)(_X12_retval_maini_1=0) /* ?{} */);
     return _X12_retval_maini_1;
     ((void)(_X12_retval_maini_1=0) /* ?{} */);
Index: tests/.expect/declarationSpecifier.x86.txt
===================================================================
--- tests/.expect/declarationSpecifier.x86.txt	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/.expect/declarationSpecifier.x86.txt	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -689,5 +689,5 @@
 signed int _X4mainFi_iPPKc__1(signed int _X4argci_1, const char **_X4argvPPKc_1){
     __attribute__ ((unused)) signed int _X12_retval_maini_1;
-    ((void)(_X12_retval_maini_1=((signed int )0)) /* ?{} */);
+    ((void)(_X12_retval_maini_1=0) /* ?{} */);
     return _X12_retval_maini_1;
     ((void)(_X12_retval_maini_1=0) /* ?{} */);
Index: tests/.expect/gccExtensions.x64.txt
===================================================================
--- tests/.expect/gccExtensions.x64.txt	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/.expect/gccExtensions.x64.txt	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -162,5 +162,5 @@
     signed int _X2m2A0A0i_2[((unsigned long int )10)][((unsigned long int )10)];
     signed int _X2m3A0A0i_2[((unsigned long int )10)][((unsigned long int )10)];
-    ((void)(_X12_retval_maini_1=((signed int )0)) /* ?{} */);
+    ((void)(_X12_retval_maini_1=0) /* ?{} */);
     return _X12_retval_maini_1;
     ((void)(_X12_retval_maini_1=0) /* ?{} */);
Index: tests/.expect/gccExtensions.x86.txt
===================================================================
--- tests/.expect/gccExtensions.x86.txt	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/.expect/gccExtensions.x86.txt	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -162,5 +162,5 @@
     signed int _X2m2A0A0i_2[((unsigned int )10)][((unsigned int )10)];
     signed int _X2m3A0A0i_2[((unsigned int )10)][((unsigned int )10)];
-    ((void)(_X12_retval_maini_1=((signed int )0)) /* ?{} */);
+    ((void)(_X12_retval_maini_1=0) /* ?{} */);
     return _X12_retval_maini_1;
     ((void)(_X12_retval_maini_1=0) /* ?{} */);
Index: tests/.expect/io1.txt
===================================================================
--- tests/.expect/io1.txt	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/.expect/io1.txt	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -1,6 +1,6 @@
 9 6 28 0 7 1 2
-1 2 3
-123
-123
+0 1 2 3
+0123
+0123
 
 opening delimiters
Index: tests/.expect/loopctrl.txt
===================================================================
--- tests/.expect/loopctrl.txt	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/.expect/loopctrl.txt	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -19,4 +19,8 @@
 10 8 6 4 2
 
+2 4 6 8 10
+2.1 3.8 5.5 7.2 8.9
+10 8 6 4 2 0
+12.1 10.4 8.7 7 5.3 3.6
 
 N N N N N N N N N N
@@ -24,7 +28,5 @@
 10 9 8 7 6 5 4 3 2 1
 
-
 3 6 9
-
 
 (0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)
Index: tests/.expect/sum.txt
===================================================================
--- tests/.expect/sum.txt	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/.expect/sum.txt	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -1,2 +1,4 @@
+sum from 5 to 15 is 95, check 95
+sum from 5 to 15 is 95, check 95
 sum from 5 to 15 is 95, check 95
 sum from 5 to 15 is 95, check 95
Index: tests/Makefile.in
===================================================================
--- tests/Makefile.in	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/Makefile.in	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -186,5 +186,4 @@
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-ALLOCA = @ALLOCA@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -350,4 +349,5 @@
 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)
 AM_V_UPP = $(am__v_UPP_@AM_V@)
Index: tests/abort.cfa
===================================================================
--- tests/abort.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ tests/abort.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,18 @@
+#include <stdlib.h>
+
+int level3() {
+	abort();
+	return 0;
+}
+
+int level2() {
+	return level3();
+}
+
+int level1() {
+	return level2();
+}
+
+int main() {
+	return level1();
+}
Index: tests/array.cfa
===================================================================
--- tests/array.cfa	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/array.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -1,3 +1,18 @@
-//Testing array declarations
+//                               -*- Mode: C -*- 
+// 
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// array.cfa -- test array declarations
+// 
+// Author           : Peter A. Buhr
+// Created On       : Tue Feb 19 21:18:06 2019
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Feb 19 21:18:46 2019
+// Update Count     : 1
+// 
+
 int a1[];
 //int a2[*];
@@ -34,7 +49,8 @@
 }
 
-//Dummy main
-int main(int argc, char const *argv[])
-{
-	return 0;
-}
+int main() {}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa array.cfa" //
+// End: //
Index: tests/castError.cfa
===================================================================
--- tests/castError.cfa	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/castError.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -1,3 +1,17 @@
-//Testing some of the invalid casts of chars
+// 
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// castError.cfa -- test invalid casts
+// 
+// Author           : Peter A. Buhr
+// Created On       : Tue Feb 19 21:15:39 2019
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Feb 19 21:16:44 2019
+// Update Count     : 1
+// 
+
 int f;
 
@@ -7,9 +21,14 @@
 	(char)f;
 	(int(*)())f;
+
+	unsigned char v;
+	short int v;
+	3, v;		// implicit void cast
 }
 
-//Dummy main
-int main(int argc, char const *argv[])
-{
-	return 0;
-}
+int main() {}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa castError.cfa" //
+// End: //
Index: tests/concurrent/examples/.expect/gortn.txt
===================================================================
--- tests/concurrent/examples/.expect/gortn.txt	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ tests/concurrent/examples/.expect/gortn.txt	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,3 @@
+0
+2.5
+1 2
Index: tests/concurrent/examples/boundedBufferEXT.cfa
===================================================================
--- tests/concurrent/examples/boundedBufferEXT.cfa	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/concurrent/examples/boundedBufferEXT.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -1,3 +1,5 @@
 //
+// Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
+// 
 // The contents of this file are covered under the licence agreement in the
 // file "LICENCE" distributed with Cforall.
@@ -8,9 +10,9 @@
 // Created On       : Wed Apr 18 22:52:12 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Dec 11 21:55:02 2018
-// Update Count     : 9
+// Last Modified On : Wed Feb 20 08:36:45 2019
+// Update Count     : 11
 //
 
-#include <stdlib.hfa>										// random
+#include <stdlib.hfa>									// random
 #include <fstream.hfa>
 #include <kernel.hfa>
Index: tests/concurrent/examples/boundedBufferINT.cfa
===================================================================
--- tests/concurrent/examples/boundedBufferINT.cfa	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/concurrent/examples/boundedBufferINT.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -1,3 +1,5 @@
 //
+// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
+// 
 // The contents of this file are covered under the licence agreement in the
 // file "LICENCE" distributed with Cforall.
@@ -8,9 +10,9 @@
 // Created On       : Mon Oct 30 12:45:13 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Dec 11 21:55:45 2018
-// Update Count     : 84
+// Last Modified On : Wed Feb 20 08:37:24 2019
+// Update Count     : 87
 //
 
-#include <stdlib.hfa>										// random
+#include <stdlib.hfa>									// random
 #include <fstream.hfa>
 #include <kernel.hfa>
Index: tests/concurrent/examples/datingService.cfa
===================================================================
--- tests/concurrent/examples/datingService.cfa	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/concurrent/examples/datingService.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -1,3 +1,5 @@
 //
+// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
+// 
 // The contents of this file are covered under the licence agreement in the
 // file "LICENCE" distributed with Cforall.
@@ -8,9 +10,9 @@
 // Created On       : Mon Oct 30 12:56:20 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Dec 11 21:55:34 2018
-// Update Count     : 28
+// Last Modified On : Wed Feb 20 08:37:12 2019
+// Update Count     : 30
 //
 
-#include <stdlib.hfa>										// random
+#include <stdlib.hfa>									// random
 #include <fstream.hfa>
 #include <kernel.hfa>
Index: tests/concurrent/examples/gortn.cfa
===================================================================
--- tests/concurrent/examples/gortn.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ tests/concurrent/examples/gortn.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,43 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2019 University of Waterloo
+// 
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// gortn.cfa -- compare waitfor and go channels
+// 
+// Author           : Peter A. Buhr
+// Created On       : Wed Feb 20 08:02:37 2019
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Feb 20 08:35:55 2019
+// Update Count     : 3
+// 
+
+#include <fstream.hfa>
+#include <thread.hfa>
+
+struct Msg { int i, j; };
+thread Gortn { int i;  float f;  Msg m; };
+void ^?{}( Gortn & mutex ) {}
+void mem1( Gortn & mutex gortn, int i ) { gortn.i = i; }
+void mem2( Gortn & mutex gortn, float f ) { gortn.f = f; }
+void mem3( Gortn & mutex gortn, Msg m ) { gortn.m = m; }
+
+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;
+	}
+}
+int main() {
+	Gortn gortn;										// start thread
+	mem1( gortn, 0 );
+	mem2( gortn, 2.5 );
+	mem3( gortn, (Msg){ 1, 2} );
+} // wait for completion
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: tests/concurrent/examples/matrixSum.cfa
===================================================================
--- tests/concurrent/examples/matrixSum.cfa	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/concurrent/examples/matrixSum.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -1,3 +1,2 @@
-//                               -*- Mode: C -*-
 //
 // Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
@@ -11,6 +10,6 @@
 // Created On       : Mon Oct  9 08:29:28 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Dec 11 21:54:55 2018
-// Update Count     : 15
+// Last Modified On : Wed Feb 20 08:37:53 2019
+// Update Count     : 16
 //
 
Index: tests/concurrent/examples/quickSort.cfa
===================================================================
--- tests/concurrent/examples/quickSort.cfa	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/concurrent/examples/quickSort.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -1,2 +1,4 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
 //
 // The contents of this file are covered under the licence agreement in the
@@ -9,6 +11,6 @@
 // Created On       : Wed Dec  6 12:15:52 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Dec 22 08:44:27 2018
-// Update Count     : 168
+// Last Modified On : Wed Feb 20 08:38:24 2019
+// Update Count     : 169
 //
 
Index: tests/io1.cfa
===================================================================
--- tests/io1.cfa	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/io1.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Wed Mar  2 16:56:02 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Dec 21 16:02:55 2018
-// Update Count     : 114
+// Last Modified On : Mon Mar  4 21:42:47 2019
+// Update Count     : 115
 //
 
@@ -19,7 +19,7 @@
 	int x = 3, y = 5, z = 7;
 	sout | x * 3 | y + 1 | z << 2 | x == y | (x | y) | (x || y) | (x > z ? 1 : 2);
-	sout | 1 | 2 | 3;
-	sout | '1' | '2' | '3';
-	sout | 1 | "" | 2 | "" | 3;
+	sout | 0 | 1 | 2 | 3;
+	sout | '0' | '1' | '2' | '3';
+	sout | 0 | "" | 1 | "" | 2 | "" | 3;
 	sout | nl;
 
Index: tests/literals.cfa
===================================================================
--- tests/literals.cfa	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/literals.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,10 +10,10 @@
 // Created On       : Sat Sep  9 16:34:38 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Dec  4 21:44:01 2018
-// Update Count     : 139
-//
-
+// Last Modified On : Tue Feb 12 08:07:39 2019
+// Update Count     : 224
+//
+
+#include <features.h>									// __GNUC_PREREQ
 #ifdef __CFA__
-#include <stdint.h>
 #include <fstream.hfa>
 
@@ -151,4 +151,48 @@
 	-0X0123456789.0123456789P-09;  -0X0123456789.0123456789P-09f;  -0X0123456789.0123456789P-09l;  -0X0123456789.0123456789P-09F;  -0X0123456789.0123456789P-09L;
 
+#if defined(__GNUC__) && __GNUC_PREREQ(7,0)				// gcc version >= 7
+// floating with length, gcc f16/f128x unsupported and no prelude code for any _FloatXXx, so they work by conversion to long double
+
+	/*  0123456789.f16; */   0123456789.f32;   0123456789.f32x;   0123456789.f64;   0123456789.f64x;   0123456789.W;   0123456789.f128;   0123456789.q;  /*  0123456789.f128x; */
+	/* +0123456789.f16; */  +0123456789.f32;  +0123456789.f32x;  +0123456789.f64;  +0123456789.f64x;  +0123456789.w;  +0123456789.f128;  +0123456789.Q;  /* +0123456789.f128x; */
+	/* -0123456789.f16; */  -0123456789.f32;  -0123456789.f32x;  -0123456789.f64;  -0123456789.f64x;  -0123456789.W;  -0123456789.f128;  -0123456789.q;  /* -0123456789.f128x; */
+
+	/*  0123456789.e09F16; */    0123456789.e09F32;    0123456789.e09F32x;    0123456789.e09F64;    0123456789.e09F64x;    0123456789.e09W;    0123456789.e09F128;    0123456789.e09q;   /*  .0123456789e09q; */
+	/* +0123456789.e+09F16; */  +0123456789.e+09F32;  +0123456789.e+09F32x;  +0123456789.e+09F64;  +0123456789.e+09F64x;  +0123456789.e+09w;  +0123456789.e+09F128;  +0123456789.e+09Q;  /* +.0123456789E+09Q; */
+	/* -0123456789.e-09F16; */  -0123456789.e-09F32;  -0123456789.e-09F32x;  -0123456789.e-09F64;  -0123456789.e-09F64x;  -0123456789.e-09W;  -0123456789.e-09F128;  -0123456789.e-09q;  /* -.0123456789E-09q; */
+
+	/*  .0123456789e09F16; */    .0123456789e09F32;    .0123456789e09F32x;    .0123456789e09F64;    .0123456789e09F64x;    .0123456789e09W;    .0123456789e09F128;    .0123456789e09q;   /*  .0123456789e09q; */
+	/* +.0123456789e+09F16; */  +.0123456789e+09F32;  +.0123456789e+09F32x;  +.0123456789e+09F64;  +.0123456789e+09F64x;  +.0123456789e+09w;  +.0123456789e+09F128;  +.0123456789e+09Q;  /* +.0123456789E+09Q; */
+	/* -.0123456789e-09F16; */  -.0123456789e-09F32;  -.0123456789e-09F32x;  -.0123456789e-09F64;  -.0123456789e-09F64x;  -.0123456789e-09W;  -.0123456789e-09F128;  -.0123456789e-09q;  /* -.0123456789E-09q; */
+
+	/*  0123456789.0123456789F16; */   0123456789.0123456789F32;   0123456789.0123456789F32x;   0123456789.0123456789F64;   0123456789.0123456789F64x;   0123456789.0123456789W;   0123456789.0123456789F128;   0123456789.0123456789q;  /*  0123456789.0123456789q; */
+	/* +0123456789.0123456789F16; */  +0123456789.0123456789F32;  +0123456789.0123456789F32x;  +0123456789.0123456789F64;  +0123456789.0123456789F64x;  +0123456789.0123456789w;  +0123456789.0123456789F128;  +0123456789.0123456789Q;  /* +0123456789.0123456789Q; */
+	/* -0123456789.0123456789F16; */  -0123456789.0123456789F32;  -0123456789.0123456789F32x;  -0123456789.0123456789F64;  -0123456789.0123456789F64x;  -0123456789.0123456789W;  -0123456789.0123456789F128;  -0123456789.0123456789q;  /* -0123456789.0123456789q; */
+
+	/*  0123456789.0123456789E09F16; */    0123456789.0123456789E09F32;    0123456789.0123456789E09F32x;    0123456789.0123456789E09F64;    0123456789.0123456789E09F64x;    0123456789.0123456789E09W;    0123456789.0123456789E09F128;    0123456789.0123456789E09q;   /*  0123456789.0123456789E09q; */
+	/* +0123456789.0123456789E+09F16; */  +0123456789.0123456789E+09F32;  +0123456789.0123456789E+09F32x;  +0123456789.0123456789E+09F64;  +0123456789.0123456789E+09F64x;  +0123456789.0123456789E+09w;  +0123456789.0123456789E+09F128;  +0123456789.0123456789E+09Q;  /* +0123456789.0123456789E+09Q; */
+	/* -0123456789.0123456789E-09F16; */  -0123456789.0123456789E-09F32;  -0123456789.0123456789E-09F32x;  -0123456789.0123456789E-09F64;  -0123456789.0123456789E-09F64x;  -0123456789.0123456789E-09W;  -0123456789.0123456789E-09F128;  -0123456789.0123456789E-09q;  /* -0123456789.0123456789E-09q; */
+
+	/*  0x123456789.p09f16; */    0x123456789.p09f32;    0x123456789.p09f32x;    0x123456789.p09f64;    0x123456789.p09f64x;    0x123456789.p09W;    0x123456789.p09f128;    0x123456789.p09q;   /*  0x123456789.p09f128x; */
+	/* +0x123456789.P+09f16; */  +0x123456789.P+09f32;  +0x123456789.P+09f32x;  +0x123456789.P+09f64;  +0x123456789.P+09f64x;  +0x123456789.P+09w;  +0x123456789.P+09f128;  +0x123456789.P+09Q;  /* +0x123456789.P+09f128x; */
+	/* -0x123456789.P-09f16; */  -0x123456789.P-09f32;  -0x123456789.P-09f32x;  -0x123456789.P-09f64;  -0x123456789.P-09f64x;  -0x123456789.P-09W;  -0x123456789.P-09f128;  -0x123456789.P-09q;  /* -0x123456789.P-09f128x; */
+
+	/*  0x123456789.p09F16; */    0x123456789.p09F32;    0x123456789.p09F32x;    0x123456789.p09F64;    0x123456789.p09F64x;    0x123456789.p09W;    0x123456789.p09F128;    0x123456789.p09q;   /*  .0123456789p09q; */
+	/* +0x123456789.p+09F16; */  +0x123456789.p+09F32;  +0x123456789.p+09F32x;  +0x123456789.p+09F64;  +0x123456789.p+09F64x;  +0x123456789.p+09w;  +0x123456789.p+09F128;  +0x123456789.p+09Q;  /* +.0123456789p+09Q; */
+	/* -0x123456789.p-09F16; */  -0x123456789.p-09F32;  -0x123456789.p-09F32x;  -0x123456789.p-09F64;  -0x123456789.p-09F64x;  -0x123456789.p-09W;  -0x123456789.p-09F128;  -0x123456789.p-09q;  /* -.0123456789P-09q; */
+
+	/*  0X.0123456789p09F16; */    0X.0123456789p09F32;    0X.0123456789p09F32x;    0X.0123456789p09F64;    0X.0123456789p09F64x;    0X.0123456789p09W;    0X.0123456789p09F128;    0X.0123456789p09q;   /*  0X.0123456789p09q; */
+	/* +0X.0123456789p+09F16; */  +0X.0123456789p+09F32;  +0X.0123456789p+09F32x;  +0X.0123456789p+09F64;  +0X.0123456789p+09F64x;  +0X.0123456789p+09w;  +0X.0123456789p+09F128;  +0X.0123456789p+09Q;  /* +0X.0123456789p+09Q; */
+	/* -0X.0123456789p-09F16; */  -0X.0123456789p-09F32;  -0X.0123456789p-09F32x;  -0X.0123456789p-09F64;  -0X.0123456789p-09F64x;  -0X.0123456789p-09W;  -0X.0123456789p-09F128;  -0X.0123456789p-09q;  /* -0X.0123456789P-09q; */
+
+	/*  0x123456789.0123456789P09F16; */    0x123456789.0123456789P09F32;    0x123456789.0123456789P09F32x;    0x123456789.0123456789P09F64;    0x123456789.0123456789P09F64x;    0x123456789.0123456789P09W;    0x123456789.0123456789P09F128;    0x123456789.0123456789P09q;   /*  0x123456789.0123456789P09q; */
+	/* +0x123456789.0123456789P+09F16; */  +0x123456789.0123456789P+09F32;  +0x123456789.0123456789P+09F32x;  +0x123456789.0123456789P+09F64;  +0x123456789.0123456789P+09F64x;  +0x123456789.0123456789P+09w;  +0x123456789.0123456789P+09F128;  +0x123456789.0123456789P+09Q;  /* +0x123456789.0123456789P+09Q; */
+	/* -0x123456789.0123456789p-09F16; */  -0x123456789.0123456789p-09F32;  -0x123456789.0123456789p-09F32x;  -0x123456789.0123456789p-09F64;  -0x123456789.0123456789p-09F64x;  -0x123456789.0123456789p-09W;  -0x123456789.0123456789p-09F128;  -0x123456789.0123456789p-09q;  /* -0x123456789.0123456789p-09q; */
+
+	/*  0x123456789.0123456789P09F16; */    0x123456789.0123456789P09F32;    0x123456789.0123456789P09F32x;    0x123456789.0123456789P09F64;    0x123456789.0123456789P09F64x;    0x123456789.0123456789P09W;    0x123456789.0123456789P09F128;    0x123456789.0123456789P09q;   /*  0x123456789.0123456789P09q; */
+	/* +0x123456789.0123456789p+09F16; */  +0x123456789.0123456789p+09F32;  +0x123456789.0123456789p+09F32x;  +0x123456789.0123456789p+09F64;  +0x123456789.0123456789p+09F64x;  +0x123456789.0123456789p+09w;  +0x123456789.0123456789p+09F128;  +0x123456789.0123456789p+09Q;  /* +0x123456789.0123456789p+09Q; */
+	/* -0x123456789.0123456789P-09F16; */  -0x123456789.0123456789P-09F32;  -0x123456789.0123456789P-09F32x;  -0x123456789.0123456789P-09F64;  -0x123456789.0123456789P-09F64x;  -0x123456789.0123456789P-09W;  -0x123456789.0123456789P-09F128;  -0x123456789.0123456789P-09q;  /* -0x123456789.0123456789P-09q; */
+#endif // __GNUC_PREREQ(7,0)
+
 #ifdef __CFA__
 // fixed-size length
@@ -167,5 +211,5 @@
 	// octal
 	 01234567_l8;   01234567_l16;   01234567_l32;   01234567_l64;   01234567_l8u;   01234567_ul16;   01234567_l32u;   01234567_ul64;
-	+01234567_l8;  +01234567_l16;  +01234567_l32;  +01234567_l64;  +01234567_l8u;  +01234567_ul16;  +01234567_l32u;  +01234567_ul64;
+	+01234567_l8;  +01234567_l16;  +01234567_l32;  +01234567_l64;  +01234567_ul8;  +01234567_ul16;  +01234567_l32u;  +01234567_ul64;
 	-01234567_l8;  -01234567_l16;  -01234567_l32;  -01234567_l64;  -01234567_l8u;  -01234567_ul16;  -01234567_l32u;  -01234567_ul64;
 
@@ -203,30 +247,4 @@
 	+0X0123456789ABCDEF_l8;  +0X0123456789ABCDEF_l16;  +0X0123456789ABCDEFl32;  +0X0123456789ABCDEFl64;  +0X0123456789ABCDEF_ul8;  +0X0123456789ABCDEF_l16u;  +0X0123456789ABCDEFul32;  +0X0123456789ABCDEFl64u;
 	-0X0123456789ABCDEF_l8;  -0X0123456789ABCDEF_l16;  -0X0123456789ABCDEFl32;  -0X0123456789ABCDEFl64;  -0X0123456789ABCDEF_ul8;  -0X0123456789ABCDEF_l16u;  -0X0123456789ABCDEFul32;  -0X0123456789ABCDEFl64u;
-
-	// floating
-	 0123456789.l32;   0123456789.l64;   0123456789.l80;   0123456789.l128;
-	+0123456789.l32;  +0123456789.l64;  +0123456789.l80;  +0123456789.l128;
-	-0123456789.l32;  -0123456789.l64;  -0123456789.l80;  -0123456789.l128;
-
-	 0123456789.e09L32;    0123456789.e09L64;    0123456789.e09L80;    0123456789.e09L128;
-	+0123456789.e+09L32;  +0123456789.e+09L64;  +0123456789.e+09L80;  +0123456789.e+09L128;
-	-0123456789.e-09L32;  -0123456789.e-09L64;  -0123456789.e-09L80;  -0123456789.e-09L128;
-
-	 .0123456789e09L32;    .0123456789e09L64;    .0123456789e09L80;    .0123456789e09L128;
-	+.0123456789E+09L32;  +.0123456789E+09L64;  +.0123456789E+09L80;  +.0123456789E+09L128;
-	-.0123456789E-09L32;  -.0123456789E-09L64;  -.0123456789E-09L80;  -.0123456789E-09L128;
-
-	 0123456789.0123456789L32;       0123456789.0123456789L64;       0123456789.0123456789L80;       0123456789.0123456789L128;
-	+0123456789.0123456789E09L32;   +0123456789.0123456789E09L64;   +0123456789.0123456789E09L80;   +0123456789.0123456789E09L128;
-	-0123456789.0123456789E+09L32;  -0123456789.0123456789E+09L64;  -0123456789.0123456789E+09L80;  -0123456789.0123456789E+09L128;
-	 0123456789.0123456789E-09L32;   0123456789.0123456789E-09L64;   0123456789.0123456789E-09L80;   0123456789.0123456789E-09L128;
-
-	 0x0123456789.p09l32;   0x0123456789.p09l64;   0x0123456789.p09l80;   0x0123456789.p09l128;
-	+0x0123456789.p09l32;  +0x0123456789.p09l64;  +0x0123456789.p09l80;  +0x0123456789.p09l128;
-	-0x0123456789.p09l32;  -0x0123456789.p09l64;  -0x0123456789.p09l80;  -0x0123456789.p09l128;
-
-	 0x0123456789.p+09l32;   0x0123456789.p+09L64;   0x0123456789.p+09L80;   0x0123456789.p+09L128;
-	+0x0123456789.p-09l32;  +0x0123456789.p-09L64;  +0x0123456789.p-09L80;  +0x0123456789.p-09L128;
-	-0x.0123456789p09l32;   -0x.0123456789p09L64;   -0x.0123456789p09L80;   -0x.0123456789p09L128;
 
 // char, short, int suffix overloading
Index: tests/loopctrl.cfa
===================================================================
--- tests/loopctrl.cfa	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/loopctrl.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Wed Aug  8 18:32:59 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Dec 23 23:00:29 2018
-// Update Count     : 79
+// Last Modified On : Thu Feb 21 08:54:47 2019
+// Update Count     : 86
 // 
 
@@ -54,15 +54,33 @@
 	for ( i; 5.5 -~ 0.5 ) { sout | i; }					sout | nl;
 	for ( ui; 2u ~= 10u ~ 2u ) { sout | ui; }			sout | nl;
-	for ( ui; 10u -~= 2u ~ 2u ) { sout | ui; }			sout | nl | nl | nl;
+	for ( ui; 10u -~= 2u ~ 2u ) { sout | ui; }			sout | nl | nl;
 
+	for ( i; 2 ~ @ ~ 2 ) {
+	  if ( i > 10 ) break;
+		sout | i;
+	}													sout | nl;
+	for ( i; 2.1 ~ @ ~ @ ) {
+	  if ( i > 10.5 ) break;
+		sout | i;
+		i += 1.7;
+	}													sout | nl;
+	for ( i; 10 -~ @ ~ 2 ) {
+	  if ( i < 0 ) break;
+		sout | i;
+	}													sout | nl;
+	for ( i; 12.1 ~ @ ~ @ ) {
+	  if ( i < 2.5 ) break;
+		sout | i;
+		i -= 1.7;
+	}													sout | nl | nl;
+	
 	enum { N = 10 };
 	for ( N ) { sout | "N"; }							sout | nl;
 	for ( i; N ) { sout | i; }							sout | nl;
-	for ( i; N -~ 0 ) { sout | i; }						sout | nl | nl | nl;
+	for ( i; N -~ 0 ) { sout | i; }						sout | nl | nl;
 
 	const int start = 3, comp = 10, inc = 2;
 	for ( i; start ~ comp ~ inc + 1 ) { sout | i; }		sout | nl | nl;
 
-	sout | nl;
 	for ( S s = (S){0}; s < (S){10,10}; s += (S){1} ) { sout | s; } sout | nl;
 	for ( s; (S){10,10} ) { sout | s; } sout | nl;
Index: tests/numericConstants.cfa
===================================================================
--- tests/numericConstants.cfa	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/numericConstants.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 24 22:10:36 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 17:59:53 2018
-// Update Count     : 3
+// Last Modified On : Tue Feb  5 08:58:16 2019
+// Update Count     : 5
 // 
 
@@ -67,4 +67,4 @@
 // Local Variables: //
 // tab-width: 4 //
-// compile-command: "cfa minmax.cfa" //
+// compile-command: "cfa numericConstants.cfa" //
 // End: //
Index: tests/preempt_longrun/Makefile.in
===================================================================
--- tests/preempt_longrun/Makefile.in	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/preempt_longrun/Makefile.in	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -334,5 +334,4 @@
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-ALLOCA = @ALLOCA@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
Index: tests/pybin/print-core.gdb
===================================================================
--- tests/pybin/print-core.gdb	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
+++ tests/pybin/print-core.gdb	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -0,0 +1,4 @@
+echo -----\n
+where
+echo -----\n
+info threads
Index: tests/pybin/tools.py
===================================================================
--- tests/pybin/tools.py	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/pybin/tools.py	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -3,11 +3,13 @@
 import __main__
 import argparse
+import fileinput
 import multiprocessing
 import os
 import re
+import resource
 import signal
 import stat
 import sys
-import fileinput
+import time
 
 from pybin import settings
@@ -131,7 +133,21 @@
 
     return None
+
+def run(exe, output, input):
+	ret, _ = sh("timeout %d %s > %s 2>&1" % (settings.timeout.single, exe, output), input = input)
+	return ret
+
 ################################################################################
 #               file handling
 ################################################################################
+# move a file
+def mv(source, dest):
+	ret, _ = sh("mv %s %s" % (source, dest))
+	return ret
+
+# cat one file into the other
+def cat(source, dest):
+	ret, _ = sh("cat %s > %s" % (source, dest))
+	return ret
 
 # helper function to replace patterns in a file
@@ -230,4 +246,8 @@
 		signal.signal(signal.SIGINT, signal.SIG_IGN)
 
+
+# enable core dumps for all the test children
+resource.setrlimit(resource.RLIMIT_CORE, (resource.RLIM_INFINITY, resource.RLIM_INFINITY))
+
 ################################################################################
 #               misc
@@ -251,2 +271,27 @@
 	else:
 		print(text)
+
+
+def coreInfo(path):
+	cmd   = os.path.join(settings.SRCDIR, "pybin/print-core.gdb")
+	if not os.path.isfile(cmd):
+		return 1, "ERR Printing format for core dumps not found"
+
+	dname = os.path.dirname(path)
+	core  = os.path.join(dname, "core" )
+	if not os.path.isfile(path):
+		return 1, "ERR Executable path is wrong"
+
+	if not os.path.isfile(core):
+		return 1, "ERR No core dump"
+
+	return sh("gdb -n %s %s -batch -x %s" % (path, core, cmd), print2stdout=False)
+
+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
Index: tests/raii/.expect/ctor-autogen-ERR1.txt
===================================================================
--- tests/raii/.expect/ctor-autogen-ERR1.txt	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/raii/.expect/ctor-autogen-ERR1.txt	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -1,3 +1,3 @@
-raii/ctor-autogen.cfa:102:1 error: Unique best alternative includes deleted identifier in Cast of:
+raii/ctor-autogen.cfa:102:1 error: Unique best alternative includes deleted identifier in Generated Cast of:
   Application of
     Deleted Expression
@@ -27,9 +27,9 @@
 
             ... to arguments
-              Cast of:
+              Generated Cast of:
                 Member Expression, with field:
                   x: signed int
                 ... from aggregate:
-                  Cast of:
+                  Generated Cast of:
                     Variable Expression: m: reference to instance of struct Managed with body 1
                   ... to:
@@ -37,5 +37,5 @@
               ... to:
                 reference to signed int
-              Cast of:
+              Generated Cast of:
                 constant expression (0 0: zero_t)
               ... to:
@@ -48,5 +48,5 @@
 
   ... to arguments
-    Cast of:
+    Generated Cast of:
       Variable Expression: x: instance of struct Managed with body 1
     ... to:
Index: tests/sum.cfa
===================================================================
--- tests/sum.cfa	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/sum.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -11,12 +11,10 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Dec 23 23:00:38 2018
-// Update Count     : 287
+// Last Modified On : Wed Feb 20 08:32:46 2019
+// Update Count     : 329
 //
 
 #include <fstream.hfa>
 #include <stdlib.hfa>
-
-void ?{}( int & c, zero_t ) { c = 0; }					// not in prelude
 
 trait sumable( otype T ) {
@@ -36,25 +34,30 @@
 } // sum
 
-// Not in prelude.
-unsigned char ?+?( unsigned char t1, unsigned char t2 ) { return (int)t1 + t2; } // cast forces integer addition, otherwise recursion
-unsigned char ?+=?( unsigned char & t1, unsigned char t2 ) { t1 = t1 + t2; return t1; }
-unsigned char ++?( unsigned char & t ) { t += 1; return t; }
-unsigned char ?++( unsigned char & t ) { unsigned char temp = t; t += 1; return temp; }
-
-// Not in prelude.
-void ?{}( unsigned char & c, zero_t ) { c = 0; }
-void ?{}( float & f, zero_t ) { f = 0.0; }
-void ?{}( double & d, zero_t ) { d = 0.0; }
-
 int main( void ) {
 	const int low = 5, High = 15, size = High - low;
 
-	unsigned char s = 0, a[size], v = (char)low;
-	for ( int i = 0; i < size; i += 1, v += 1 ) {
+	signed char s = 0, a[size], v = (char)low;
+	for ( int i = 0; i < size; i += 1, v += 1hh ) {
 		s += v;
 		a[i] = v;
 	} // for
 	sout | "sum from" | low | "to" | High | "is"
-		 | sum( size, (unsigned char *)a ) | ", check" | (int)s;
+		 | sum( size, (signed char *)a ) | ", check" | (signed char)s;
+
+	unsigned char s = 0, a[size], v = low;
+	for ( int i = 0; i < size; i += 1, v += 1hhu ) {
+		s += (unsigned char)v;
+		a[i] = (unsigned char)v;
+	} // for
+	sout | "sum from" | low | "to" | High | "is"
+		 | sum( size, (unsigned char *)a ) | ", check" | (unsigned char)s;
+
+	short int s = 0, a[size], v = low;
+	for ( int i = 0; i < size; i += 1, v += 1h ) {
+	 	s += (short int)v;
+	 	a[i] = (short int)v;
+	} // for
+	sout | "sum from" | low | "to" | High | "is"
+		 | sum( size, (short int *)a ) | ", check" | (short int)s;
 
 	int s = 0, a[size], v = low;
Index: tests/test.py
===================================================================
--- tests/test.py	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/test.py	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -121,11 +121,12 @@
 #               running test functions
 ################################################################################
-# fix the absolute paths in the output
-def fixoutput( fname ):
-	if not is_ascii(fname):
-		return
-
-	file_replace(fname, "%s/" % settings.SRCDIR, "")
-
+def success(val):
+	return val == 0 or settings.dry_run
+
+def isExe(file):
+	return settings.dry_run or fileIsExecutable(file)
+
+def noRule(file, target):
+	return not settings.dry_run and fileContainsOnly(file, "make: *** No rule to make target `%s'.  Stop." % target)
 
 # logic to run a single test and return the result (No handling of printing or other test framework logic)
@@ -143,39 +144,27 @@
 
 	# build, skipping to next test on error
-	before = time.time()
-	make_ret, _ = make( test.target(),
-		redirects  = "2> %s 1> /dev/null" % out_file,
-		error_file = err_file
-	)
-	after = time.time()
-
-	comp_dur = after - before
-
+	with Timed() as comp_dur:
+		make_ret, _ = make( test.target(), 	redirects  = ("2> %s 1> /dev/null" % out_file), error_file = err_file )
+
+	# if the make command succeds continue otherwise skip to diff
 	run_dur = None
-
-	# if the make command succeds continue otherwise skip to diff
-	if make_ret == 0 or settings.dry_run:
-		before = time.time()
-		if settings.dry_run or fileIsExecutable(exe_file) :
-			# run test
-			retcode, _ = sh("timeout %d %s > %s 2>&1" % (settings.timeout.single, exe_file, out_file), input = in_file)
-		else :
-			# simply cat the result into the output
-			retcode, _ = sh("cat %s > %s" % (exe_file, out_file))
-
-		after = time.time()
-		run_dur = after - before
+	if success(make_ret):
+		with Timed() as run_dur:
+			if isExe(exe_file):
+				# run test
+				retcode = run(exe_file, out_file, in_file)
+			else :
+				# simply cat the result into the output
+				retcode = cat(exe_file, out_file)
 	else:
-		retcode, _ = sh("mv %s %s" % (err_file, out_file))
-
-
-	if retcode == 0:
-		# fixoutput(out_file)
+		retcode = mv(err_file, out_file)
+
+	if success(retcode):
 		if settings.generating :
 			# if we are ounly generating the output we still need to check that the test actually exists
-			if not settings.dry_run and fileContainsOnly(out_file, "make: *** No rule to make target `%s'.  Stop." % test.target()) :
-				retcode = 1;
+			if noRule(out_file, test.target()) :
+				retcode = 1
 				error = "\t\tNo make target for test %s!" % test.target()
-				sh("rm %s" % out_file, False)
+				rm(out_file)
 			else:
 				error = None
@@ -188,9 +177,13 @@
 			error = myfile.read()
 
+		ret, info = coreInfo(exe_file)
+		error = error + info
+
+
 
 	# clean the executable
-	sh("rm -f %s > /dev/null 2>&1" % test.target())
-
-	return retcode, error, [comp_dur, run_dur]
+	rm(exe_file)
+
+	return retcode, error, [comp_dur.duration, run_dur.duration if run_dur else None]
 
 # run a single test and handle the errors, outputs, printing, exception handling, etc.
@@ -199,5 +192,5 @@
 	with SignalHandling():
 		# print formated name
-		name_txt = "%20s  " % t.name
+		name_txt = "%24s  " % t.name
 
 		retcode, error, duration = run_single_test(t)
@@ -263,4 +256,5 @@
 	allTests = listTests( options.include, options.exclude )
 
+
 	# if user wants all tests than no other treatement of the test list is required
 	if options.all or options.list or options.list_comp or options.include :
Index: tests/warnings/.expect/self-assignment.txt
===================================================================
--- tests/warnings/.expect/self-assignment.txt	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/warnings/.expect/self-assignment.txt	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -1,11 +1,11 @@
-warnings/self-assignment.cfa:29:1 warning: self assignment of expression: Cast of:
+warnings/self-assignment.cfa:29:1 warning: self assignment of expression: Generated Cast of:
   Variable Expression: j: signed int
 ... to:
   reference to signed int
-warnings/self-assignment.cfa:30:1 warning: self assignment of expression: Cast of:
+warnings/self-assignment.cfa:30:1 warning: self assignment of expression: Generated Cast of:
   Variable Expression: s: instance of struct S with body 1
 ... to:
   reference to instance of struct S with body 1
-warnings/self-assignment.cfa:31:1 warning: self assignment of expression: Cast of:
+warnings/self-assignment.cfa:31:1 warning: self assignment of expression: Generated Cast of:
   Member Expression, with field:
     i: signed int
@@ -14,5 +14,5 @@
 ... to:
   reference to signed int
-warnings/self-assignment.cfa:32:1 warning: self assignment of expression: Cast of:
+warnings/self-assignment.cfa:32:1 warning: self assignment of expression: Generated Cast of:
   Member Expression, with field:
     i: signed int
Index: tests/warnings/self-assignment.cfa
===================================================================
--- tests/warnings/self-assignment.cfa	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tests/warnings/self-assignment.cfa	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -9,26 +9,26 @@
 // Author           : Rob Schluntz
 // Created On       : Thu Mar 1 13:53:57 2018
-// Last Modified By : Rob Schluntz
-// Last Modified On : Thu Mar 1 13:53:57 2018
-// Update Count     : 2
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Feb 20 07:56:17 2019
+// Update Count     : 3
 //
 
 struct S {
-  int i;
+	int i;
 };
 
 struct T {
-  S s;
+	S s;
 };
 
 int main() {
-  int j = 0;
-  S s = { 0 };
-  T t = { { 0 } };
+	int j = 0;
+	S s = { 0 };
+	T t = { { 0 } };
 
-  j = j;
-  s = s;
-  s.i = s.i;
-  t.s.i = t.s.i;
+	j = j;
+	s = s;
+	s.i = s.i;
+	t.s.i = t.s.i;
 }
 
Index: tools/Makefile.in
===================================================================
--- tools/Makefile.in	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tools/Makefile.in	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -194,5 +194,4 @@
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-ALLOCA = @ALLOCA@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
Index: tools/PrettyGitLogs.sh
===================================================================
--- tools/PrettyGitLogs.sh	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tools/PrettyGitLogs.sh	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -3,12 +3,14 @@
 set -e
 
-GIT_UPDATE="$1/GIT_UPDATE"
-GIT_LOG="$1/GIT_LOG"
-GIT_DIFF="$1/GIT_DIFF"
+GIT="git --git-dir=$1/.git"
+
+GIT_UPDATE="$2/GIT_UPDATE"
+GIT_LOG="$2/GIT_LOG"
+GIT_DIFF="$2/GIT_DIFF"
 
 rm -f ${GIT_UPDATE}  ${GIT_LOG}  ${GIT_DIFF}
 
-GitOldRef=$2
-GitNewRef=$3
+GitOldRef=$3
+GitNewRef=$4
 
 
Index: tools/prettyprinter/Makefile.in
===================================================================
--- tools/prettyprinter/Makefile.in	(revision 9d9a451e2d760eaa92e6087809f4576f400b3843)
+++ tools/prettyprinter/Makefile.in	(revision 53bb8f1f8cae8a384c5024ab0caed57d27778a0d)
@@ -223,5 +223,4 @@
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-ALLOCA = @ALLOCA@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
