Index: INSTALL
===================================================================
--- INSTALL	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ INSTALL	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -22,9 +22,2 @@
   it is important not to put quotes around the directory path; Cforall may
   appear to build, but the installed version may not work properly.
-
---with-backend-compiler=PROGRAM specifies the installed path of gcc.  It
-  defaults to the first command named 'gcc' in the current PATH.
-
-cfa-cc itself is built with the version of g++ specified by the environment
-variable CXX.  If CXX is unset, cfa-cc is built using the first command named
-'g++' in the current PATH.
Index: Jenkins/TestRegen
===================================================================
--- Jenkins/TestRegen	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ Jenkins/TestRegen	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -70,8 +70,8 @@
 	//escapes the sandbox
 	//Also specify the compiler by hand
-	sh "./configure CXX=clang++ --host=${arch} --with-backend-compiler=gcc-6 --prefix=${install_dir} --enable-silent-rules --quiet"
+	sh "./configure CXX=clang++ CC=gcc-6 --host=${arch} --enable-silent-rules --quiet"
 
 	//Compile the project
-	sh 'make -j 8 --no-print-directory install'
+	sh 'make -j 8 --no-print-directory'
 
 	//Regenerate the desired tests
Index: Jenkinsfile
===================================================================
--- Jenkinsfile	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ Jenkinsfile	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -118,5 +118,5 @@
 			}
 
-			sh "${SrcDir}/configure CXX=${Settings.Compiler.cpp_cc} ${Settings.Architecture.flags} ${targets} --with-backend-compiler=${Settings.Compiler.cfa_cc} --quiet"
+			sh "${SrcDir}/configure CXX=${Settings.Compiler.CXX} CC=${Settings.Compiler.CC} ${Settings.Architecture.flags} ${targets} --quiet"
 
 			//Compile the project
@@ -239,12 +239,12 @@
 //Description of a compiler (Must be serializable since pipelines are persistent)
 class CC_Desc implements Serializable {
-	public String cc_name
-	public String cpp_cc
-	public String cfa_cc
-
-	CC_Desc(String cc_name, String cpp_cc, String cfa_cc) {
-		this.cc_name = cc_name
-		this.cpp_cc = cpp_cc
-		this.cfa_cc = cfa_cc
+	public String name
+	public String CXX
+	public String CC
+
+	CC_Desc(String name, String CXX, String CC) {
+		this.name = name
+		this.CXX = CXX
+		this.CC = CC
 	}
 }
@@ -315,7 +315,7 @@
 
 		def full = param.RunAllTests ? " (Full)" : ""
-		this.DescShort = "${ this.Compiler.cc_name }:${ this.Architecture.name }${full}"
-
-		this.DescLong = """Compiler 	         : ${ this.Compiler.cc_name } (${ this.Compiler.cpp_cc }/${ this.Compiler.cfa_cc })
+		this.DescShort = "${ this.Compiler.name }:${ this.Architecture.name }${full}"
+
+		this.DescLong = """Compiler 	         : ${ this.Compiler.name } (${ this.Compiler.CXX }/${ this.Compiler.CC })
 Architecture            : ${ this.Architecture.name }
 Arc Flags               : ${ this.Architecture.flags }
Index: Makefile.am
===================================================================
--- Makefile.am	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ Makefile.am	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -16,5 +16,5 @@
 
 AUTOMAKE_OPTIONS = foreign    # do not require all the GNU file names
-BACKEND_CC = @BACKEND_CC@     # C compiler used to compile Cforall programs, versus C++ compiler used to build cfa command
+ACLOCAL_AMFLAGS  = -I automake
 
 MAINTAINERCLEANFILES = lib/* bin/* tests/.deps/* tests/.out/*
Index: Makefile.in
===================================================================
--- Makefile.in	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ Makefile.in	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -94,6 +94,10 @@
 subdir = .
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/automake/cfa.m4 \
-	$(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/automake/libtool.m4 \
+	$(top_srcdir)/automake/ltoptions.m4 \
+	$(top_srcdir)/automake/ltsugar.m4 \
+	$(top_srcdir)/automake/ltversion.m4 \
+	$(top_srcdir)/automake/lt~obsolete.m4 \
+	$(top_srcdir)/automake/cfa.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -198,8 +202,9 @@
 	$(top_srcdir)/automake/config.sub \
 	$(top_srcdir)/automake/install-sh \
+	$(top_srcdir)/automake/ltmain.sh \
 	$(top_srcdir)/automake/missing $(top_srcdir)/src/config.h.in \
 	INSTALL README automake/compile automake/config.guess \
 	automake/config.sub automake/depcomp automake/install-sh \
-	automake/missing automake/ylwrap
+	automake/ltmain.sh automake/missing automake/ylwrap
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 distdir = $(PACKAGE)-$(VERSION)
@@ -248,9 +253,9 @@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BACKEND_CC = @BACKEND_CC@     # C compiler used to compile Cforall programs, versus C++ compiler used to build cfa command
 BUILD_IN_TREE_FLAGS = @BUILD_IN_TREE_FLAGS@
 CC = @CC@
@@ -272,4 +277,5 @@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
+CXXCPP = @CXXCPP@
 CXXDEPMODE = @CXXDEPMODE@
 CXXFLAGS = @CXXFLAGS@
@@ -277,5 +283,8 @@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
 DRIVER_DIR = @DRIVER_DIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
@@ -283,4 +292,5 @@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
+FGREP = @FGREP@
 GREP = @GREP@
 HOST_FLAGS = @HOST_FLAGS@
@@ -290,4 +300,5 @@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LEX = @LEX@
@@ -298,8 +309,18 @@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -311,4 +332,5 @@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -322,6 +344,8 @@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -371,4 +395,5 @@
 top_srcdir = @top_srcdir@
 AUTOMAKE_OPTIONS = foreign    # do not require all the GNU file names
+ACLOCAL_AMFLAGS = -I automake
 MAINTAINERCLEANFILES = lib/* bin/* tests/.deps/* tests/.out/*
 SUBDIRS = driver src . @LIBCFA_TARGET_DIRS@
@@ -428,4 +453,13 @@
 distclean-hdr:
 	-rm -f config.h stamp-h1
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool config.lt
 install-man1: $(man1_MANS)
 	@$(NORMAL_INSTALL)
@@ -803,10 +837,11 @@
 clean: clean-recursive
 
-clean-am: clean-generic mostlyclean-am
+clean-am: clean-generic clean-libtool mostlyclean-am
 
 distclean: distclean-recursive
 	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
 	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-hdr distclean-tags
+distclean-am: clean-am distclean-generic distclean-hdr \
+	distclean-libtool distclean-tags
 
 dvi: dvi-recursive
@@ -858,5 +893,5 @@
 mostlyclean: mostlyclean-recursive
 
-mostlyclean-am: mostlyclean-generic
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
 
 pdf: pdf-recursive
@@ -876,17 +911,18 @@
 .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
 	am--refresh check check-am clean clean-cscope clean-generic \
-	cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
-	dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \
-	distcheck distclean distclean-generic distclean-hdr \
-	distclean-tags distcleancheck distdir distuninstallcheck dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-man install-man1 \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	installdirs-am maintainer-clean maintainer-clean-generic \
-	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \
-	tags-am uninstall uninstall-am uninstall-man uninstall-man1
+	clean-libtool cscope cscopelist-am ctags ctags-am dist \
+	dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \
+	dist-xz dist-zip distcheck distclean distclean-generic \
+	distclean-hdr distclean-libtool distclean-tags distcleancheck \
+	distdir distuninstallcheck dvi dvi-am html html-am info \
+	info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-man1 install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+	uninstall-am uninstall-man uninstall-man1
 
 .PRECIOUS: Makefile
Index: aclocal.m4
===================================================================
--- aclocal.m4	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ aclocal.m4	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -1171,2 +1171,7 @@
 ]) # _AM_PROG_TAR
 
+m4_include([automake/libtool.m4])
+m4_include([automake/ltoptions.m4])
+m4_include([automake/ltsugar.m4])
+m4_include([automake/ltversion.m4])
+m4_include([automake/lt~obsolete.m4])
Index: automake/cfa.m4
===================================================================
--- automake/cfa.m4	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ automake/cfa.m4	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -73,4 +73,5 @@
 		"arm"        ) cannon_arch_name="arm";;
 		"ARM"        ) cannon_arch_name="arm";;
+		"armv7l"     ) cannon_arch_name="arm";;
 		*)
 		>&2 echo "Unkown architecture " $arch_name;
Index: automake/libtool.m4
===================================================================
--- automake/libtool.m4	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ automake/libtool.m4	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,1 @@
+/usr/share/aclocal/libtool.m4
Index: automake/ltmain.sh
===================================================================
--- automake/ltmain.sh	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ automake/ltmain.sh	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,1 @@
+/usr/share/libtool/build-aux/ltmain.sh
Index: automake/ltoptions.m4
===================================================================
--- automake/ltoptions.m4	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ automake/ltoptions.m4	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,1 @@
+/usr/share/aclocal/ltoptions.m4
Index: automake/ltsugar.m4
===================================================================
--- automake/ltsugar.m4	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ automake/ltsugar.m4	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,1 @@
+/usr/share/aclocal/ltsugar.m4
Index: automake/ltversion.m4
===================================================================
--- automake/ltversion.m4	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ automake/ltversion.m4	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,1 @@
+/usr/share/aclocal/ltversion.m4
Index: automake/lt~obsolete.m4
===================================================================
--- automake/lt~obsolete.m4	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ automake/lt~obsolete.m4	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,1 @@
+/usr/share/aclocal/lt~obsolete.m4
Index: benchmark/Makefile.am
===================================================================
--- benchmark/Makefile.am	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ benchmark/Makefile.am	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -16,10 +16,10 @@
 
 AUTOMAKE_OPTIONS = foreign    # do not require all the GNU file names
+ACLOCAL_AMFLAGS  = -I automake
 
 # applies to both programs
 include $(top_srcdir)/src/cfa.make
 
-UPPCC = u++
-UPPCOMPILE = $(UPPCC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_UPPFLAGS) $(UPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_CFLAGS) $(CFLAGS)
+
 
 AM_CFLAGS = -O2 -Wall -I$(srcdir) -lrt -pthread
@@ -35,6 +35,6 @@
 PRINT_FORMAT = %20s: #Comments needed for spacing
 
+# Dummy hack tricks
 EXTRA_PROGRAMS = dummy # build but do not install
-
 dummy_SOURCES = dummyC.c dummyCXX.cpp
 
@@ -47,6 +47,5 @@
 .NOTPARALLEL:
 
-noinst_PROGRAMS =
-
+## =========================================================================================================
 all : ctxswitch$(EXEEXT) mutex$(EXEEXT) signal$(EXEEXT) waitfor$(EXEEXT) creation$(EXEEXT)
 
@@ -58,5 +57,5 @@
 	@${STATS} .result.log
 	@echo "------------------------------------------------------"
-	@rm -f a.out .result.log
+	@rm -f a.out .result.log *.class
 
 %.runquiet :
@@ -111,11 +110,11 @@
 ## =========================================================================================================
 loop$(EXEEXT):
-	$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/loop.c
+	$(AM_V_CC)$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/loop.c
 
 function$(EXEEXT):
-	$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/function.c
+	$(AM_V_CC)$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/function.c
 
 fetch_add$(EXEEXT):
-	$(COMPILE) -DBENCH_N=500000000  $(srcdir)/fetch_add.c
+	$(AM_V_CC)$(COMPILE) -DBENCH_N=500000000  $(srcdir)/fetch_add.c
 
 ## =========================================================================================================
@@ -140,8 +139,8 @@
 
 ctxswitch-kos_fibre$(EXEEXT):
-	@$(CXXCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/kos_fibre.cpp  -I$(LIBFIBRE_DIR) -lfibre
+	$(AM_V_CXX)$(CXXCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/kos_fibre.cpp  -I$(LIBFIBRE_DIR) -lfibre
 
 ctxswitch-kos_fibre2$(EXEEXT):
-	@$(CXXCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/kos_fibre2.cpp -I$(LIBFIBRE_DIR) -lfibre
+	$(AM_V_CXX)$(CXXCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/kos_fibre2.cpp -I$(LIBFIBRE_DIR) -lfibre
 endif
 
@@ -149,26 +148,26 @@
 
 ctxswitch-pthread$(EXEEXT):
-	@$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/ctxswitch/pthreads.c
+	$(AM_V_CC)$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/ctxswitch/pthreads.c
 
 ctxswitch-cfa_coroutine$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_cor.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_cor.cfa
 
 ctxswitch-cfa_thread$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd.cfa
 
 ctxswitch-cfa_thread2$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd2.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd2.cfa
 
 ctxswitch-upp_coroutine$(EXEEXT):
-	@$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_cor.cc
+	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_cor.cc
 
 ctxswitch-upp_thread$(EXEEXT):
-	@$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_thrd.cc
+	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_thrd.cc
 
 ctxswitch-goroutine$(EXEEXT):
-	@go build -o a.out $(srcdir)/ctxswitch/goroutine.go
+	$(AM_V_GOC)go build -o a.out $(srcdir)/ctxswitch/goroutine.go
 
 ctxswitch-java_thread$(EXEEXT):
-	@javac -d . $(srcdir)/ctxswitch/JavaThread.java
+	$(AM_V_JAVAC)javac -d $(builddir) $(srcdir)/ctxswitch/JavaThread.java
 	@echo "#!/bin/sh" > a.out
 	@echo "java JavaThread" >> a.out
@@ -188,20 +187,20 @@
 
 mutex-pthread_lock$(EXEEXT):
-	@$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/mutex/pthreads.c
+	$(AM_V_CC)$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/mutex/pthreads.c
 
 mutex-upp$(EXEEXT):
-	@$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/mutex/upp.cc
+	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/mutex/upp.cc
 
 mutex-cfa1$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa1.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa1.cfa
 
 mutex-cfa2$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa2.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa2.cfa
 
 mutex-cfa4$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa4.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa4.cfa
 
 mutex-java_thread$(EXEEXT):
-	@javac -d . $(srcdir)/mutex/JavaThread.java
+	$(AM_V_JAVAC)javac -d $(builddir) $(srcdir)/mutex/JavaThread.java
 	@echo "#!/bin/sh" > a.out
 	@echo "java JavaThread" >> a.out
@@ -218,20 +217,20 @@
 
 signal-pthread_cond$(EXEEXT):
-	@$(COMPILE)    -DBENCH_N=500000  $(srcdir)/schedint/pthreads.c
+	$(AM_V_CC)$(COMPILE)    -DBENCH_N=500000  $(srcdir)/schedint/pthreads.c
 
 signal-upp$(EXEEXT):
-	@$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedint/upp.cc
+	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedint/upp.cc
 
 signal-cfa1$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa1.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa1.cfa
 
 signal-cfa2$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa2.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa2.cfa
 
 signal-cfa4$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa4.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa4.cfa
 
 signal-java_thread$(EXEEXT):
-	@javac -d . $(srcdir)/schedint/JavaThread.java
+	$(AM_V_JAVAC)javac -d $(builddir) $(srcdir)/schedint/JavaThread.java
 	@echo "#!/bin/sh" > a.out
 	@echo "java JavaThread" >> a.out
@@ -247,14 +246,14 @@
 
 waitfor-upp$(EXEEXT):
-	@$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedext/upp.cc
+	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedext/upp.cc
 
 waitfor-cfa1$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa1.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa1.cfa
 
 waitfor-cfa2$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa2.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa2.cfa
 
 waitfor-cfa4$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa4.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa4.cfa
 
 ## =========================================================================================================
@@ -270,26 +269,26 @@
 
 creation-cfa_coroutine$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.cfa
 
 creation-cfa_coroutine_eager$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.cfa -DEAGER
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.cfa  -DEAGER
 
 creation-cfa_thread$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_thrd.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_thrd.cfa
 
 creation-upp_coroutine$(EXEEXT):
-	@$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_cor.cc
+	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_cor.cc
 
 creation-upp_thread$(EXEEXT):
-	@$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_thrd.cc
+	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_thrd.cc
 
 creation-pthread$(EXEEXT):
-	@$(COMPILE)    -DBENCH_N=250000   $(srcdir)/creation/pthreads.c
+	$(AM_V_CC)$(COMPILE)    -DBENCH_N=250000   $(srcdir)/creation/pthreads.c
 
 creation-goroutine$(EXEEXT):
-	@go build -o a.out $(srcdir)/creation/goroutine.go
+	$(AM_V_GOC)go build -o a.out $(srcdir)/creation/goroutine.go
 
 creation-java_thread$(EXEEXT):
-	@javac -d . $(srcdir)/creation/JavaThread.java
+	$(AM_V_JAVAC)javac -d $(builddir) $(srcdir)/creation/JavaThread.java
 	@echo "#!/bin/sh" > a.out
 	@echo "java JavaThread" >> a.out
@@ -312,28 +311,28 @@
 
 compile-array$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/array.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/array.cfa
 
 compile-attributes$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/attributes.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/attributes.cfa
 
 compile-empty$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(srcdir)/compile/empty.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(srcdir)/compile/empty.cfa
 
 compile-expression$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/expression.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/expression.cfa
 
 compile-io$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/io1.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/io1.cfa
 
 compile-monitor$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/monitor.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/monitor.cfa
 
 compile-operators$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/operators.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/operators.cfa
 
 compile-thread$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/thread.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/thread.cfa
 
 compile-typeof$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/typeof.cfa
-
+	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/typeof.cfa
+
Index: benchmark/Makefile.in
===================================================================
--- benchmark/Makefile.in	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ benchmark/Makefile.in	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -17,5 +17,4 @@
 ######################## -*- Mode: Makefile-Automake -*- ######################
 ###############################################################################
-
 VPATH = @srcdir@
 am__is_gnu_make = { \
@@ -93,5 +92,4 @@
 host_triplet = @host@
 EXTRA_PROGRAMS = dummy$(EXEEXT)
-noinst_PROGRAMS =
 @WITH_LIBFIBRE_TRUE@am__append_1 = \
 @WITH_LIBFIBRE_TRUE@	ctxswitch-kos_fibre.run	 \
@@ -100,6 +98,10 @@
 subdir = benchmark
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/automake/cfa.m4 \
-	$(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/automake/libtool.m4 \
+	$(top_srcdir)/automake/ltoptions.m4 \
+	$(top_srcdir)/automake/ltsugar.m4 \
+	$(top_srcdir)/automake/ltversion.m4 \
+	$(top_srcdir)/automake/lt~obsolete.m4 \
+	$(top_srcdir)/automake/cfa.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -109,8 +111,11 @@
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
-PROGRAMS = $(noinst_PROGRAMS)
 am_dummy_OBJECTS = dummyC.$(OBJEXT) dummyCXX.$(OBJEXT)
 dummy_OBJECTS = $(am_dummy_OBJECTS)
 dummy_LDADD = $(LDADD)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
 AM_V_P = $(am__v_P_@AM_V@)
 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
@@ -131,4 +136,8 @@
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
 AM_V_CC = $(am__v_CC_@AM_V@)
 am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
@@ -136,5 +145,7 @@
 am__v_CC_1 = 
 CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
 AM_V_CCLD = $(am__v_CCLD_@AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
@@ -143,4 +154,8 @@
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
 AM_V_CXX = $(am__v_CXX_@AM_V@)
 am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
@@ -148,6 +163,7 @@
 am__v_CXX_1 = 
 CXXLD = $(CXX)
-CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
-	-o $@
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
 am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
@@ -187,9 +203,9 @@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BACKEND_CC = @BACKEND_CC@
 BUILD_IN_TREE_FLAGS = @BUILD_IN_TREE_FLAGS@
 CC = @CC@
@@ -211,4 +227,5 @@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
+CXXCPP = @CXXCPP@
 CXXDEPMODE = @CXXDEPMODE@
 CXXFLAGS = @CXXFLAGS@
@@ -216,5 +233,8 @@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
 DRIVER_DIR = @DRIVER_DIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
@@ -222,4 +242,5 @@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
+FGREP = @FGREP@
 GREP = @GREP@
 HOST_FLAGS = @HOST_FLAGS@
@@ -229,4 +250,5 @@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LEX = @LEX@
@@ -237,8 +259,18 @@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -250,4 +282,5 @@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -261,6 +294,8 @@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -310,4 +345,5 @@
 top_srcdir = @top_srcdir@
 AUTOMAKE_OPTIONS = foreign    # do not require all the GNU file names
+ACLOCAL_AMFLAGS = -I automake
 CFACOMPILE = $(CFACC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(CFAFLAGS) $(AM_CFLAGS) $(CFLAGS)
 LTCFACOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
@@ -320,8 +356,20 @@
 am__v_CFA_0 = @echo "  CFA     " $@;
 am__v_CFA_1 = 
-
-# applies to both programs
+AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
+am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
+am__v_JAVAC_0 = @echo "  JAVAC   " $@;
+am__v_JAVAC_1 = 
+AM_V_GOC = $(am__v_GOC_@AM_V@)
+am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
+am__v_GOC_0 = @echo "  GOC     " $@;
+am__v_GOC_1 = 
 UPPCC = u++
 UPPCOMPILE = $(UPPCC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_UPPFLAGS) $(UPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_UPP = $(am__v_UPP_@AM_V@)
+am__v_UPP_ = $(am__v_UPP_@AM_DEFAULT_V@)
+am__v_UPP_0 = @echo "  UPP     " $@;
+am__v_UPP_1 = 
+
+# applies to both programs
 AM_CFLAGS = -O2 -Wall -I$(srcdir) -lrt -pthread
 AM_CFAFLAGS = -quiet -in-tree -nodebug
@@ -377,7 +425,4 @@
 $(am__aclocal_m4_deps):
 
-clean-noinstPROGRAMS:
-	-test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
-
 dummy$(EXEEXT): $(dummy_OBJECTS) $(dummy_DEPENDENCIES) $(EXTRA_dummy_DEPENDENCIES) 
 	@rm -f dummy$(EXEEXT)
@@ -409,4 +454,12 @@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
+.c.lo:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
 .cpp.o:
 @am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@@ -424,4 +477,18 @@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
 
 ID: $(am__tagged_files)
@@ -509,5 +576,5 @@
 check-am: all-am
 check: check-am
-all-am: Makefile $(PROGRAMS)
+all-am: Makefile
 installdirs:
 install: install-am
@@ -543,5 +610,5 @@
 clean: clean-am
 
-clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am
+clean-am: clean-generic clean-libtool mostlyclean-am
 
 distclean: distclean-am
@@ -598,5 +665,6 @@
 mostlyclean: mostlyclean-am
 
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
 
 pdf: pdf-am
@@ -613,15 +681,15 @@
 
 .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
-	clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \
-	distclean-compile distclean-generic distclean-tags distdir dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-man install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
-	uninstall-am
+	clean-libtool cscopelist-am ctags ctags-am distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am
 
 .PRECIOUS: Makefile
@@ -655,5 +723,5 @@
 	@${STATS} .result.log
 	@echo "------------------------------------------------------"
-	@rm -f a.out .result.log
+	@rm -f a.out .result.log *.class
 
 %.runquiet :
@@ -705,43 +773,43 @@
 
 loop$(EXEEXT):
-	$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/loop.c
+	$(AM_V_CC)$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/loop.c
 
 function$(EXEEXT):
-	$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/function.c
+	$(AM_V_CC)$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/function.c
 
 fetch_add$(EXEEXT):
-	$(COMPILE) -DBENCH_N=500000000  $(srcdir)/fetch_add.c
+	$(AM_V_CC)$(COMPILE) -DBENCH_N=500000000  $(srcdir)/fetch_add.c
 
 @WITH_LIBFIBRE_TRUE@ctxswitch-kos_fibre$(EXEEXT):
-@WITH_LIBFIBRE_TRUE@	@$(CXXCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/kos_fibre.cpp  -I$(LIBFIBRE_DIR) -lfibre
+@WITH_LIBFIBRE_TRUE@	$(AM_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@	@$(CXXCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/kos_fibre2.cpp -I$(LIBFIBRE_DIR) -lfibre
+@WITH_LIBFIBRE_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/kos_fibre2.cpp -I$(LIBFIBRE_DIR) -lfibre
 
 ctxswitch$(EXEEXT): $(CTXSWITCH_DEPEND)
 
 ctxswitch-pthread$(EXEEXT):
-	@$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/ctxswitch/pthreads.c
+	$(AM_V_CC)$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/ctxswitch/pthreads.c
 
 ctxswitch-cfa_coroutine$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_cor.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_cor.cfa
 
 ctxswitch-cfa_thread$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd.cfa
 
 ctxswitch-cfa_thread2$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd2.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd2.cfa
 
 ctxswitch-upp_coroutine$(EXEEXT):
-	@$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_cor.cc
+	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_cor.cc
 
 ctxswitch-upp_thread$(EXEEXT):
-	@$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_thrd.cc
+	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_thrd.cc
 
 ctxswitch-goroutine$(EXEEXT):
-	@go build -o a.out $(srcdir)/ctxswitch/goroutine.go
+	$(AM_V_GOC)go build -o a.out $(srcdir)/ctxswitch/goroutine.go
 
 ctxswitch-java_thread$(EXEEXT):
-	@javac -d . $(srcdir)/ctxswitch/JavaThread.java
+	$(AM_V_JAVAC)javac -d $(builddir) $(srcdir)/ctxswitch/JavaThread.java
 	@echo "#!/bin/sh" > a.out
 	@echo "java JavaThread" >> a.out
@@ -760,20 +828,20 @@
 
 mutex-pthread_lock$(EXEEXT):
-	@$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/mutex/pthreads.c
+	$(AM_V_CC)$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/mutex/pthreads.c
 
 mutex-upp$(EXEEXT):
-	@$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/mutex/upp.cc
+	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/mutex/upp.cc
 
 mutex-cfa1$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa1.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa1.cfa
 
 mutex-cfa2$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa2.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa2.cfa
 
 mutex-cfa4$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa4.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa4.cfa
 
 mutex-java_thread$(EXEEXT):
-	@javac -d . $(srcdir)/mutex/JavaThread.java
+	$(AM_V_JAVAC)javac -d $(builddir) $(srcdir)/mutex/JavaThread.java
 	@echo "#!/bin/sh" > a.out
 	@echo "java JavaThread" >> a.out
@@ -789,20 +857,20 @@
 
 signal-pthread_cond$(EXEEXT):
-	@$(COMPILE)    -DBENCH_N=500000  $(srcdir)/schedint/pthreads.c
+	$(AM_V_CC)$(COMPILE)    -DBENCH_N=500000  $(srcdir)/schedint/pthreads.c
 
 signal-upp$(EXEEXT):
-	@$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedint/upp.cc
+	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedint/upp.cc
 
 signal-cfa1$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa1.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa1.cfa
 
 signal-cfa2$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa2.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa2.cfa
 
 signal-cfa4$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa4.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa4.cfa
 
 signal-java_thread$(EXEEXT):
-	@javac -d . $(srcdir)/schedint/JavaThread.java
+	$(AM_V_JAVAC)javac -d $(builddir) $(srcdir)/schedint/JavaThread.java
 	@echo "#!/bin/sh" > a.out
 	@echo "java JavaThread" >> a.out
@@ -816,14 +884,14 @@
 
 waitfor-upp$(EXEEXT):
-	@$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedext/upp.cc
+	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedext/upp.cc
 
 waitfor-cfa1$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa1.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa1.cfa
 
 waitfor-cfa2$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa2.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa2.cfa
 
 waitfor-cfa4$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa4.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa4.cfa
 
 creation$(EXEEXT) :\
@@ -838,26 +906,26 @@
 
 creation-cfa_coroutine$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.cfa
 
 creation-cfa_coroutine_eager$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.cfa -DEAGER
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.cfa  -DEAGER
 
 creation-cfa_thread$(EXEEXT):
-	@$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_thrd.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_thrd.cfa
 
 creation-upp_coroutine$(EXEEXT):
-	@$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_cor.cc
+	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_cor.cc
 
 creation-upp_thread$(EXEEXT):
-	@$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_thrd.cc
+	$(AM_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_thrd.cc
 
 creation-pthread$(EXEEXT):
-	@$(COMPILE)    -DBENCH_N=250000   $(srcdir)/creation/pthreads.c
+	$(AM_V_CC)$(COMPILE)    -DBENCH_N=250000   $(srcdir)/creation/pthreads.c
 
 creation-goroutine$(EXEEXT):
-	@go build -o a.out $(srcdir)/creation/goroutine.go
+	$(AM_V_GOC)go build -o a.out $(srcdir)/creation/goroutine.go
 
 creation-java_thread$(EXEEXT):
-	@javac -d . $(srcdir)/creation/JavaThread.java
+	$(AM_V_JAVAC)javac -d $(builddir) $(srcdir)/creation/JavaThread.java
 	@echo "#!/bin/sh" > a.out
 	@echo "java JavaThread" >> a.out
@@ -875,29 +943,29 @@
 
 compile-array$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/array.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/array.cfa
 
 compile-attributes$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/attributes.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/attributes.cfa
 
 compile-empty$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(srcdir)/compile/empty.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(srcdir)/compile/empty.cfa
 
 compile-expression$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/expression.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/expression.cfa
 
 compile-io$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/io1.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/io1.cfa
 
 compile-monitor$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/monitor.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/monitor.cfa
 
 compile-operators$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/operators.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/operators.cfa
 
 compile-thread$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/thread.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/thread.cfa
 
 compile-typeof$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/typeof.cfa
+	$(AM_V_CFA)$(CFACOMPILE) -fsyntax-only -w $(testdir)/typeof.cfa
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
Index: benchmark/Monitor.c
===================================================================
--- benchmark/Monitor.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ benchmark/Monitor.c	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -29,4 +29,4 @@
 	EndTime = Time();
 
-	sout | ( EndTime - StartTime ) / N | endl;
+	sout | ( EndTime - StartTime ) / N;
 }
Index: benchmark/c.c
===================================================================
--- benchmark/c.c	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ benchmark/c.c	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,1 @@
+int main() { return 0; }
Index: benchmark/cxx.cpp
===================================================================
--- benchmark/cxx.cpp	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ benchmark/cxx.cpp	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,1 @@
+void dummy() {}
Index: configure
===================================================================
--- configure	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ configure	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -199,4 +199,12 @@
   eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
   test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+
+  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
 test \$(( 1 + 1 )) = 2 || exit 1"
   if (eval "$as_required") 2>/dev/null; then :
@@ -557,4 +565,6 @@
 as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
 
+SHELL=${CONFIG_SHELL-/bin/sh}
+
 
 test -n "$DJDIR" || exec 7<&0 </dev/null
@@ -626,11 +636,32 @@
 LTLIBOBJS
 LIBOBJS
+CFA_BACKEND_CC
 ALLOCA
+WITH_LIBFIBRE_FALSE
+WITH_LIBFIBRE_TRUE
+CXXCPP
+CPP
+LT_SYS_LIBRARY_PATH
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+RANLIB
+ac_ct_AR
+AR
+DLLTOOL
+OBJDUMP
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
 EGREP
 GREP
-CPP
-WITH_LIBFIBRE_FALSE
-WITH_LIBFIBRE_TRUE
-RANLIB
+SED
+LIBTOOL
 LEXLIB
 LEX_OUTPUT_ROOT
@@ -687,6 +718,4 @@
 CFA_INCDIR
 CFA_PREFIX
-CFA_BACKEND_CC
-BACKEND_CC
 DOendif
 DOifskipcompile
@@ -763,7 +792,14 @@
 enable_silent_rules
 with_cfa_name
-with_backend_compiler
 with_target_hosts
 enable_dependency_tracking
+enable_shared
+enable_static
+with_pic
+enable_fast_install
+with_aix_soname
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
 '
       ac_precious_vars='build_alias
@@ -782,5 +818,7 @@
 YACC
 YFLAGS
-CPP'
+LT_SYS_LIBRARY_PATH
+CPP
+CXXCPP'
 
 
@@ -1418,4 +1456,9 @@
   --disable-dependency-tracking
                           speeds up one-time build
+  --enable-shared[=PKGS]  build shared libraries [default=yes]
+  --enable-static[=PKGS]  build static libraries [default=yes]
+  --enable-fast-install[=PKGS]
+                          optimize for fast installation [default=yes]
+  --disable-libtool-lock  avoid locking (might break parallel builds)
 
 Optional Packages:
@@ -1423,6 +1466,13 @@
   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
   --with-cfa-name=NAME     NAME too which cfa will be installed
-  --with-backend-compiler=PROGRAM     PROGRAM that performs the final code compilation (must be gcc-compatible)
   --with-target-hosts=HOSTS     HOSTS comma seperated list of hosts to build for, format ARCH:debug|nodebug|nolib
+  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
+                          both]
+  --with-aix-soname=aix|svr4|both
+                          shared library versioning (aka "SONAME") variant to
+                          provide on AIX, [default=aix].
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --with-sysroot[=DIR]    Search for dependent libraries within DIR (or the
+                          compiler's sysroot if not specified).
 
 Some influential environment variables:
@@ -1444,5 +1494,8 @@
               This script will default YFLAGS to the empty string to avoid a
               default value of `-d' given by some make applications.
+  LT_SYS_LIBRARY_PATH
+              User-defined run-time library search path.
   CPP         C preprocessor
+  CXXCPP      C++ preprocessor
 
 Use these variables to override the choices made by `configure' or to help
@@ -1648,9 +1701,9 @@
 } # ac_fn_c_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 ()
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
@@ -1660,36 +1713,13 @@
   $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;
-}
+#include <$2>
 _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
+else
+  eval "$3=no"
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
@@ -1700,5 +1730,5 @@
   eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
 
-} # ac_fn_c_check_type
+} # ac_fn_c_check_header_compile
 
 # ac_fn_c_try_cpp LINENO
@@ -1781,35 +1811,4 @@
 } # ac_fn_c_try_run
 
-# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists and can be compiled using the include files in
-# INCLUDES, setting the cache variable VAR accordingly.
-ac_fn_c_check_header_compile ()
-{
-  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
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-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_header_compile
-
 # ac_fn_c_check_func LINENO FUNC VAR
 # ----------------------------------
@@ -1878,4 +1877,141 @@
 
 } # ac_fn_c_check_func
+
+# ac_fn_cxx_try_cpp LINENO
+# ------------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_cpp
+
+# ac_fn_cxx_try_link LINENO
+# -------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # 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
@@ -2480,4 +2616,5 @@
 
 
+
 #AC_CONFIG_SRCDIR([src/main.cc])
 ac_config_headers="$ac_config_headers config.h:src/config.h.in"
@@ -3166,69 +3303,4 @@
 
 #==============================================================================
-# backend compiler implementation
-
-# Check whether --with-backend-compiler was given.
-if test "${with_backend_compiler+set}" = set; then :
-  withval=$with_backend_compiler; backendcompiler=$withval
-else
-  backendcompiler=""
-fi
-
-if test "x$backendcompiler" != "x"; then
-       BACKEND_CC=${backendcompiler}
-else
-       # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_BACKEND_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $BACKEND_CC in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_BACKEND_CC="$BACKEND_CC" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_BACKEND_CC="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-  ;;
-esac
-fi
-BACKEND_CC=$ac_cv_path_BACKEND_CC
-if test -n "$BACKEND_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BACKEND_CC" >&5
-$as_echo "$BACKEND_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-       # check gcc installed
-       if test "x$BACKEND_CC" = "x"; then
-               as_fn_error $? "some version of gcc is needed. Get it at ftp://ftp.gnu.org" "$LINENO" 5
-               exit 1
-       fi
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define CFA_BACKEND_CC "${BACKEND_CC}"
-_ACEOF
-
-
-
-#==============================================================================
 # Installation paths
 
@@ -3478,4 +3550,5 @@
 		"arm"        ) cannon_arch_name="arm";;
 		"ARM"        ) cannon_arch_name="arm";;
+		"armv7l"     ) cannon_arch_name="arm";;
 		*)
 		>&2 echo "Unkown architecture " $arch_name;
@@ -3518,4 +3591,5 @@
 		"arm"        ) cannon_arch_name="arm";;
 		"ARM"        ) cannon_arch_name="arm";;
+		"armv7l"     ) cannon_arch_name="arm";;
 		*)
 		>&2 echo "Unkown architecture " $arch_name;
@@ -5316,318 +5390,178 @@
 fi
 if test "${LEX}" = "lex" ; then echo "Error: flex required." ; exit 1 ; fi
-
-{ $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 :
+case `pwd` in
+  *\ * | *\	*)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.6'
+macro_revision='2.4.6'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO ""
+}
+
+case $ECHO in
+  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} 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
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_RANLIB+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
   done
 IFS=$as_save_IFS
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
-  ac_ct_RANLIB=$RANLIB
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_RANLIB"; then
-  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_RANLIB="ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
   fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_RANLIB" = x; then
-    RANLIB=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    RANLIB=$ac_ct_RANLIB
-  fi
-else
-  RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-
-# Checks for libraries.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fibre::yield in -lfibre" >&5
-$as_echo_n "checking for Fibre::yield in -lfibre... " >&6; }
-if ${ac_cv_lib_fibre_Fibre__yield+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lfibre  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char Fibre::yield ();
-int
-main ()
-{
-return Fibre::yield ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_fibre_Fibre__yield=yes
-else
-  ac_cv_lib_fibre_Fibre__yield=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_fibre_Fibre__yield" >&5
-$as_echo "$ac_cv_lib_fibre_Fibre__yield" >&6; }
-if test "x$ac_cv_lib_fibre_Fibre__yield" = xyes; then :
-  HAVE_LIBFIBRE=1
-else
-  HAVE_LIBFIBRE=0
-fi
-
- if test "$HAVE_LIBFIBRE" -eq 1; then
-  WITH_LIBFIBRE_TRUE=
-  WITH_LIBFIBRE_FALSE='#'
-else
-  WITH_LIBFIBRE_TRUE='#'
-  WITH_LIBFIBRE_FALSE=
-fi
-
-
-# Checks for header files.
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-  if ${ac_cv_prog_CPP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-      # Double quotes because CPP needs to be expanded
-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-  break
-fi
-
-    done
-    ac_cv_prog_CPP=$CPP
-
-fi
-  CPP=$ac_cv_prog_CPP
-else
-  ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
 
 
@@ -5762,4 +5696,3253 @@
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if ${ac_cv_path_FGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     if test -z "$FGREP"; then
+  ac_path_FGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in fgrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_FGREP" || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_FGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_FGREP"; then
+    as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_FGREP=$FGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return, which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD=$ac_prog
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test yes = "$with_gnu_ld"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD=$ac_dir/$ac_prog
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test no != "$with_gnu_ld" && break
+	;;
+      *)
+	test yes != "$with_gnu_ld" && break
+	;;
+      esac
+    fi
+  done
+  IFS=$lt_save_ifs
+else
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi
+fi
+
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if ${lt_cv_path_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM=$NM
+else
+  lt_nm_to_check=${ac_tool_prefix}nm
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS=$lt_save_ifs
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm=$ac_dir/$lt_tmp_nm
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the 'sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+	case $build_os in
+	mingw*) lt_bad_file=conftest.nm/nofile ;;
+	*) lt_bad_file=/dev/null ;;
+	esac
+	case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+	*$lt_bad_file* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break 2
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break 2
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS=$lt_save_ifs
+  done
+  : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test no != "$lt_cv_path_NM"; then
+  NM=$lt_cv_path_NM
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in dumpbin "link -dump"
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DUMPBIN"; then
+  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$DUMPBIN" && break
+  done
+fi
+if test -z "$DUMPBIN"; then
+  ac_ct_DUMPBIN=$DUMPBIN
+  for ac_prog in dumpbin "link -dump"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DUMPBIN"; then
+  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_DUMPBIN" && break
+done
+
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
+fi
+
+    case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols -headers"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+
+  if test : != "$DUMPBIN"; then
+    NM=$DUMPBIN
+  fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if ${lt_cv_nm_interface+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+  cat conftest.out >&5
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if ${lt_cv_sys_max_cmd_len+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+    i=0
+  teststring=ABCD
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len" && \
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test X`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test 17 != "$i" # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+
+fi
+
+if test -n "$lt_cv_sys_max_cmd_len"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
+if ${lt_cv_to_host_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+$as_echo "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
+if ${lt_cv_to_tool_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if ${lt_cv_ld_reload_flag+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test yes != "$GCC"; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test yes = "$GCC"; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJDUMP=$ac_ct_OBJDUMP
+  fi
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if ${lt_cv_deplibs_check_method+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# 'unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  if ( file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd* | bitrig*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+os2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DLLTOOL"; then
+  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+  ac_ct_DLLTOOL=$DLLTOOL
+  # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DLLTOOL"; then
+  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DLLTOOL" = x; then
+    DLLTOOL="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DLLTOOL=$ac_ct_DLLTOOL
+  fi
+else
+  DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
+if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh;
+  # decide which one to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd=$ECHO
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ar
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$AR" && break
+  done
+fi
+if test -z "$AR"; then
+  ac_ct_AR=$AR
+  for ac_prog in ar
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_AR="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_AR" && break
+done
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+fi
+
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+$as_echo_n "checking for archiver @FILE support... " >&6; }
+if ${lt_cv_ar_at_file+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ar_at_file=no
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+      if test 0 -eq "$ac_status"; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	if test 0 -ne "$ac_status"; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+$as_echo "$lt_cv_ar_at_file" >&6; }
+
+if test no = "$lt_cv_ar_at_file"; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  bitrig* | openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if ${lt_cv_sys_global_symbol_pipe+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*)
+  if test ia64 = "$host_cpu"; then
+    symcode='[ABCDEGRST]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
+
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  # Gets list of data symbols to import.
+  lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+  # Adjust the below global symbol transforms to fixup imported variables.
+  lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+  lt_c_name_hook=" -e 's/^I .* \(.*\)$/  {\"\1\", (void *) 0},/p'"
+  lt_c_name_lib_hook="\
+  -e 's/^I .* \(lib.*\)$/  {\"\1\", (void *) 0},/p'\
+  -e 's/^I .* \(.*\)$/  {\"lib\1\", (void *) 0},/p'"
+else
+  # Disable hooks by default.
+  lt_cv_sys_global_symbol_to_import=
+  lt_cdecl_hook=
+  lt_c_name_hook=
+  lt_c_name_lib_hook=
+fi
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/  {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"lib\1\", (void *) \&\1},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function,
+    # D for any global variable and I for any imported variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK '"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+"     /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+"     /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+"     {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+"     s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS=conftstm.$ac_objext
+	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest$ac_exeext; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test yes = "$pipe_works"; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+$as_echo_n "checking for sysroot... " >&6; }
+
+# Check whether --with-sysroot was given.
+if test "${with_sysroot+set}" = set; then :
+  withval=$with_sysroot;
+else
+  with_sysroot=no
+fi
+
+
+lt_sysroot=
+case $with_sysroot in #(
+ yes)
+   if test yes = "$GCC"; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
+$as_echo "$with_sysroot" >&6; }
+   as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+   ;;
+esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+$as_echo "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
+$as_echo_n "checking for a working dd... " >&6; }
+if ${ac_cv_path_lt_DD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+if test -z "$lt_DD"; then
+  ac_path_lt_DD_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in dd; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_lt_DD" || continue
+if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi
+      $ac_path_lt_DD_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_lt_DD"; then
+    :
+  fi
+else
+  ac_cv_path_lt_DD=$lt_DD
+fi
+
+rm -f conftest.i conftest2.i conftest.out
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
+$as_echo "$ac_cv_path_lt_DD" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
+$as_echo_n "checking how to truncate binary pipes... " >&6; }
+if ${lt_cv_truncate_bin+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
+$as_echo "$lt_cv_truncate_bin" >&6; }
+
+
+
+
+
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then :
+  enableval=$enable_libtool_lock;
+fi
+
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out what ABI is being produced by ac_compile, and set mode
+  # options accordingly.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE=32
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE=64
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    if test yes = "$lt_cv_prog_gnu_ld"; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+mips64*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    emul=elf
+    case `/usr/bin/file conftest.$ac_objext` in
+      *32-bit*)
+	emul="${emul}32"
+	;;
+      *64-bit*)
+	emul="${emul}64"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *MSB*)
+	emul="${emul}btsmip"
+	;;
+      *LSB*)
+	emul="${emul}ltsmip"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *N32*)
+	emul="${emul}n32"
+	;;
+    esac
+    LD="${LD-ld} -m $emul"
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.  Note that the listed cases only cover the
+  # situations where additional linker options are needed (such as when
+  # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+  # vice versa); the common cases where no linker options are needed do
+  # not appear in the list.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    case `/usr/bin/file conftest.o` in
+	      *x86-64*)
+		LD="${LD-ld} -m elf32_x86_64"
+		;;
+	      *)
+		LD="${LD-ld} -m elf_i386"
+		;;
+	    esac
+	    ;;
+	  powerpc64le-*linux*)
+	    LD="${LD-ld} -m elf32lppclinux"
+	    ;;
+	  powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  powerpcle-*linux*)
+	    LD="${LD-ld} -m elf64lppc"
+	    ;;
+	  powerpc-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS=$CFLAGS
+  CFLAGS="$CFLAGS -belf"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if ${lt_cv_cc_needs_belf+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_cc_needs_belf=yes
+else
+  lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+  if test yes != "$lt_cv_cc_needs_belf"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS=$SAVE_CFLAGS
+  fi
+  ;;
+*-*solaris*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*|x86_64-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD=${LD-ld}_sol2
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks=$enable_libtool_lock
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$MANIFEST_TOOL"; then
+  ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+$as_echo "$MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+  # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_MANIFEST_TOOL"; then
+  ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_MANIFEST_TOOL" = x; then
+    MANIFEST_TOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+  fi
+else
+  MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if ${lt_cv_path_mainfest_tool+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&5
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+$as_echo "$lt_cv_path_mainfest_tool" >&6; }
+if test yes != "$lt_cv_path_mainfest_tool"; then
+  MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+  case $host_os in
+    rhapsody* | darwin*)
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DSYMUTIL"; then
+  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+  ac_ct_DSYMUTIL=$DSYMUTIL
+  # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DSYMUTIL"; then
+  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DSYMUTIL" = x; then
+    DSYMUTIL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DSYMUTIL=$ac_ct_DSYMUTIL
+  fi
+else
+  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NMEDIT"; then
+  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+  ac_ct_NMEDIT=$NMEDIT
+  # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_NMEDIT"; then
+  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_NMEDIT="nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_NMEDIT" = x; then
+    NMEDIT=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    NMEDIT=$ac_ct_NMEDIT
+  fi
+else
+  NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LIPO"; then
+  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+  ac_ct_LIPO=$LIPO
+  # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_LIPO"; then
+  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_LIPO="lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_LIPO" = x; then
+    LIPO=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    LIPO=$ac_ct_LIPO
+  fi
+else
+  LIPO="$ac_cv_prog_LIPO"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL"; then
+  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+  ac_ct_OTOOL=$OTOOL
+  # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL"; then
+  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OTOOL="otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL" = x; then
+    OTOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL=$ac_ct_OTOOL
+  fi
+else
+  OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL64"; then
+  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+  ac_ct_OTOOL64=$OTOOL64
+  # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL64"; then
+  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OTOOL64="otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL64" = x; then
+    OTOOL64=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL64=$ac_ct_OTOOL64
+  fi
+else
+  OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if ${lt_cv_apple_cc_single_mod+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_apple_cc_single_mod=no
+      if test -z "$LT_MULTI_MODULE"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&5
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&5
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if ${lt_cv_ld_exported_symbols_list+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_ld_exported_symbols_list=yes
+else
+  lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+	LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if ${lt_cv_ld_force_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+      echo "$AR cru libconftest.a conftest.o" >&5
+      $AR cru libconftest.a conftest.o 2>&5
+      echo "$RANLIB libconftest.a" >&5
+      $RANLIB libconftest.a 2>&5
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&5
+      elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&5
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
+    case $host_os in
+    rhapsody* | darwin1.[012])
+      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+	10.[012][,.]*)
+	  _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test yes = "$lt_cv_apple_cc_single_mod"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test yes = "$lt_cv_ld_exported_symbols_list"; then
+      _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
+    fi
+    if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
 $as_echo_n "checking for ANSI C header files... " >&6; }
@@ -5891,4 +9074,7749 @@
 
 
+for ac_header in dlfcn.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+func_stripname_cnf ()
+{
+  case $2 in
+  .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;;
+  *)  func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;;
+  esac
+} # func_stripname_cnf
+
+
+
+
+
+# Set options
+
+
+
+        enable_dlopen=no
+
+
+  enable_win32_dll=no
+
+
+            # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+  enableval=$enable_shared; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac
+else
+  enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+  # Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then :
+  enableval=$enable_static; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac
+else
+  enable_static=yes
+fi
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+  withval=$with_pic; lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for lt_pkg in $withval; do
+	IFS=$lt_save_ifs
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac
+else
+  pic_mode=default
+fi
+
+
+
+
+
+
+
+
+  # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then :
+  enableval=$enable_fast_install; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+  shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[5-9]*,yes)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
+$as_echo_n "checking which variant of shared library versioning to provide... " >&6; }
+
+# Check whether --with-aix-soname was given.
+if test "${with_aix_soname+set}" = set; then :
+  withval=$with_aix_soname; case $withval in
+    aix|svr4|both)
+      ;;
+    *)
+      as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
+      ;;
+    esac
+    lt_cv_with_aix_soname=$with_aix_soname
+else
+  if ${lt_cv_with_aix_soname+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_with_aix_soname=aix
+fi
+
+    with_aix_soname=$lt_cv_with_aix_soname
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
+$as_echo "$with_aix_soname" >&6; }
+  if test aix != "$with_aix_soname"; then
+    # For the AIX way of multilib, we name the shared archive member
+    # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+    # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+    # the AIX toolchain works better with OBJECT_MODE set (default 32).
+    if test 64 = "${OBJECT_MODE-32}"; then
+      shared_archive_member_spec=shr_64
+    else
+      shared_archive_member_spec=shr
+    fi
+  fi
+  ;;
+*)
+  with_aix_soname=aix
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS=$ltmain
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}"; then
+   setopt NO_GLOB_SUBST
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if ${lt_cv_objdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
+
+
+
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test set != "${COLLECT_NAMES+set}"; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+old_CC=$CC
+old_CFLAGS=$CFLAGS
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/${ac_tool_prefix}file"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
+  ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/file"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
+  ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC=$CC
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test yes = "$GCC"; then
+  case $cc_basename in
+  nvcc*)
+    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+  *)
+    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+  esac
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"  ## exclude from sc_useless_quotes_in_assignment
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+
+
+
+
+
+  lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+  if test yes = "$GCC"; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
+            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static='$wl-static'
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      lt_prog_compiler_wl='-Xlinker '
+      if test -n "$lt_prog_compiler_pic"; then
+        lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      else
+	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      case $cc_basename in
+      nagfor*)
+        # NAG Fortran compiler
+        lt_prog_compiler_wl='-Wl,-Wl,,'
+        lt_prog_compiler_pic='-PIC'
+        lt_prog_compiler_static='-Bstatic'
+        ;;
+      esac
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static='$wl-static'
+	;;
+      esac
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='$wl-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+      case $cc_basename in
+      # old Intel for x86_64, which still supported -KPIC.
+      ecc*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-KPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='--shared'
+	lt_prog_compiler_static='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	lt_prog_compiler_wl='-Wl,-Wl,,'
+	lt_prog_compiler_pic='-PIC'
+	lt_prog_compiler_static='-Bstatic'
+	;;
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fpic'
+	lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-qpic'
+	lt_prog_compiler_static='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Wl,'
+	  ;;
+        *Intel*\ [CF]*Compiler*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fPIC'
+	  lt_prog_compiler_static='-static'
+	  ;;
+	*Portland\ Group*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fpic'
+	  lt_prog_compiler_static='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic='-Kconform_pic'
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms that do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
+    ;;
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+$as_echo "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"  ## exclude from sc_useless_quotes_in_assignment
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works"; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works=no
+   save_LDFLAGS=$LDFLAGS
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works"; then
+    :
+else
+    lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test no = "$hard_links"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  runpath_var=
+  allow_undefined_flag=
+  always_export_symbols=no
+  archive_cmds=
+  archive_expsym_cmds=
+  compiler_needs_object=no
+  enable_shared_with_static_runtimes=no
+  export_dynamic_flag_spec=
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic=no
+  hardcode_direct=no
+  hardcode_direct_absolute=no
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_separator=
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  inherit_rpath=no
+  link_all_deplibs=unknown
+  module_cmds=
+  module_expsym_cmds=
+  old_archive_from_new_cmds=
+  old_archive_from_expsyms_cmds=
+  thread_safe_flag_spec=
+  whole_archive_flag_spec=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ' (' and ')$', so one must not match beginning or
+  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+  # as well as any symbol that contains 'd'.
+  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test yes != "$GCC"; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd* | bitrig*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs=no
+    ;;
+  esac
+
+  ld_shlibs=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test yes = "$with_gnu_ld"; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test yes = "$lt_use_gnu_ld_interface"; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='$wl'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+    export_dynamic_flag_spec='$wl--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+    else
+      whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test ia64 != "$host_cpu"; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      export_dynamic_flag_spec='$wl--export-all-symbols'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file, use it as
+	# is; otherwise, prepend EXPORTS...
+	archive_expsym_cmds='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+          cp $export_symbols $output_objdir/$soname.def;
+        else
+          echo EXPORTS > $output_objdir/$soname.def;
+          cat $export_symbols >> $output_objdir/$soname.def;
+        fi~
+        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    haiku*)
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+      link_all_deplibs=yes
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      shrext_cmds=.dll
+      archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      enable_shared_with_static_runtimes=yes
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+      export_dynamic_flag_spec='$wl-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test linux-dietlibc = "$host_os"; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test no = "$tmp_diet"
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec=
+	  tmp_sharedflag='--shared' ;;
+        nagfor*)                        # NAGFOR 5.3
+          tmp_sharedflag='-Wl,-shared' ;;
+	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  compiler_needs_object=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  compiler_needs_object=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+
+        if test yes = "$supports_anon_versioning"; then
+          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+            cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+            echo "local: *; };" >> $output_objdir/$libname.ver~
+            $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	tcc*)
+	  export_dynamic_flag_spec='-rdynamic'
+	  ;;
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test yes = "$supports_anon_versioning"; then
+	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+              echo "local: *; };" >> $output_objdir/$libname.ver~
+              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        ld_shlibs=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    ld_shlibs=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+    esac
+
+    if test no = "$ld_shlibs"; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test ia64 = "$host_cpu"; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to GNU nm, but means don't demangle to AIX nm.
+	# Without the "-l" option, or with the "-B" option, AIX nm treats
+	# weak defined symbols like other global defined symbols, whereas
+	# GNU nm marks them as "W".
+	# While the 'weak' keyword is ignored in the Export File, we need
+	# it in the Import File for the 'aix-soname' feature, so we have
+	# to replace the "-B" option with "-P" for AIX nm.
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# have runtime linking enabled, and use it for executables.
+	# For shared libraries, we enable/disable runtime linking
+	# depending on the kind of the shared library created -
+	# when "with_aix_soname,aix_use_runtimelinking" is:
+	# "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "aix,yes"  lib.so          shared, rtl:yes, for executables
+	#            lib.a           static archive
+	# "both,no"  lib.so.V(shr.o) shared, rtl:yes
+	#            lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a(lib.so.V) shared, rtl:no
+	# "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a           static archive
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	    # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	    # so we don't have lib.a shared libs to link our executables.
+	    # We have to force runtime linking in this case.
+	    aix_use_runtimelinking=yes
+	    LDFLAGS="$LDFLAGS -Wl,-brtl"
+	  fi
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_direct_absolute=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      file_list_spec='$wl-f,'
+      case $with_aix_soname,$aix_use_runtimelinking in
+      aix,*) ;; # traditional, no import file
+      svr4,* | *,yes) # use import file
+	# The Import File defines what to hardcode.
+	hardcode_direct=no
+	hardcode_direct_absolute=no
+	;;
+      esac
+
+      if test yes = "$GCC"; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`$CC -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  hardcode_direct=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L=yes
+	  hardcode_libdir_flag_spec='-L$libdir'
+	  hardcode_libdir_separator=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test yes = "$aix_use_runtimelinking"; then
+	  shared_flag="$shared_flag "'$wl-G'
+	fi
+	# Need to ensure runtime linking is disabled for the traditional
+	# shared library, or the linker may eventually find shared libraries
+	# /with/ Import File - we do not want to mix them.
+	shared_flag_aix='-shared'
+	shared_flag_svr4='-shared $wl-G'
+      else
+	# not using gcc
+	if test ia64 = "$host_cpu"; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag='$wl-G'
+	  else
+	    shared_flag='$wl-bM:SRE'
+	  fi
+	  shared_flag_aix='$wl-bM:SRE'
+	  shared_flag_svr4='$wl-G'
+	fi
+      fi
+
+      export_dynamic_flag_spec='$wl-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=/usr/lib:/lib
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+        hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+      else
+	if test ia64 = "$host_cpu"; then
+	  hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag="-z nodefs"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=/usr/lib:/lib
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+	 hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag=' $wl-bernotok'
+	  allow_undefined_flag=' $wl-berok'
+	  if test yes = "$with_gnu_ld"; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    whole_archive_flag_spec='$convenience'
+	  fi
+	  archive_cmds_need_lc=yes
+	  archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	  # -brtl affects multiple linker settings, -berok does not and is overridden later
+	  compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+	  if test svr4 != "$with_aix_soname"; then
+	    # This is similar to how AIX traditionally builds its shared libraries.
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	  fi
+	  if test aix != "$with_aix_soname"; then
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+	  else
+	    # used by -dlpreopen to get the symbols
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	  fi
+	  archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	always_export_symbols=yes
+	file_list_spec='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=.dll
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	archive_expsym_cmds='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+            cp "$export_symbols" "$output_objdir/$soname.def";
+            echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+          else
+            $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+          fi~
+          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+          linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+	enable_shared_with_static_runtimes=yes
+	exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	old_postinstall_cmds='chmod 644 $oldlib'
+	postlink_cmds='lt_outputfile="@OUTPUT@"~
+          lt_tool_outputfile="@TOOL_OUTPUT@"~
+          case $lt_outputfile in
+            *.exe|*.EXE) ;;
+            *)
+              lt_outputfile=$lt_outputfile.exe
+              lt_tool_outputfile=$lt_tool_outputfile.exe
+              ;;
+          esac~
+          if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+            $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+            $RM "$lt_outputfile.manifest";
+          fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=.dll
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	old_archive_from_new_cmds='true'
+	# FIXME: Should let the user specify the lib program.
+	old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	enable_shared_with_static_runtimes=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc=no
+  hardcode_direct=no
+  hardcode_automatic=yes
+  hardcode_shlibpath_var=unsupported
+  if test yes = "$lt_cv_ld_force_load"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec=''
+  fi
+  link_all_deplibs=yes
+  allow_undefined_flag=$_lt_dar_allow_undefined
+  case $cc_basename in
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test yes = "$_lt_dar_can_shared"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+
+  else
+  ld_shlibs=no
+  fi
+
+      ;;
+
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    hpux9*)
+      if test yes = "$GCC"; then
+	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='$wl-E'
+      ;;
+
+    hpux10*)
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test no = "$with_gnu_ld"; then
+	hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+	hardcode_libdir_separator=:
+	hardcode_direct=yes
+	hardcode_direct_absolute=yes
+	export_dynamic_flag_spec='$wl-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if ${lt_cv_prog_compiler__b+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler__b=no
+   save_LDFLAGS=$LDFLAGS
+   LDFLAGS="$LDFLAGS -b"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler__b=yes
+       fi
+     else
+       lt_cv_prog_compiler__b=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
+
+if test yes = "$lt_cv_prog_compiler__b"; then
+    archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+	  ;;
+	esac
+      fi
+      if test no = "$with_gnu_ld"; then
+	hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+	hardcode_libdir_separator=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct=no
+	  hardcode_shlibpath_var=no
+	  ;;
+	*)
+	  hardcode_direct=yes
+	  hardcode_direct_absolute=yes
+	  export_dynamic_flag_spec='$wl-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  save_LDFLAGS=$LDFLAGS
+	   LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_irix_exported_symbol=yes
+else
+  lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+           LDFLAGS=$save_LDFLAGS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+	if test yes = "$lt_cv_irix_exported_symbol"; then
+          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
+	fi
+	link_all_deplibs=no
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+      hardcode_libdir_separator=:
+      inherit_rpath=yes
+      link_all_deplibs=yes
+      ;;
+
+    linux*)
+      case $cc_basename in
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	ld_shlibs=yes
+	archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      esac
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd* | bitrig*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct=yes
+	hardcode_shlibpath_var=no
+	hardcode_direct_absolute=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+	  export_dynamic_flag_spec='$wl-E'
+	else
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+	fi
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      shrext_cmds=.dll
+      archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      enable_shared_with_static_runtimes=yes
+      ;;
+
+    osf3*)
+      if test yes = "$GCC"; then
+	allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+      hardcode_libdir_separator=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test yes = "$GCC"; then
+	allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+	archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_separator=:
+      ;;
+
+    solaris*)
+      no_undefined_flag=' -z defs'
+      if test yes = "$GCC"; then
+	wlarc='$wl'
+	archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='$wl'
+	  archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands '-z linker_flag'.  GCC discards it without '$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test yes = "$GCC"; then
+	  whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs=yes
+      ;;
+
+    sunos4*)
+      if test sequent = "$host_vendor"; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds='$CC -r -o $output$reload_objs'
+	  hardcode_direct=no
+        ;;
+	motorola)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag='$wl-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
+
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We CANNOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='$wl-z,text'
+      allow_undefined_flag='$wl-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='$wl-R,$libdir'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='$wl-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      ld_shlibs=no
+      ;;
+    esac
+
+    if test sni = "$host_vendor"; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec='$wl-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test no = "$ld_shlibs" && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
+
+  if test yes,yes = "$GCC,$enable_shared"; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl
+	  pic_flag=$lt_prog_compiler_pic
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag
+	  allow_undefined_flag=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc=no
+	  else
+	    lt_cv_archive_cmds_need_lc=yes
+	  fi
+	  allow_undefined_flag=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+if test yes = "$GCC"; then
+  case $host_os in
+    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+    *) lt_awk_arg='/^libraries:/' ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
+    *) lt_sed_strip_eq='s|=/|/|g' ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary...
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  # ...but if some path component already ends with the multilib dir we assume
+  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+  case "$lt_multi_os_dir; $lt_search_path_spec " in
+  "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+    lt_multi_os_dir=
+    ;;
+  esac
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+    elif test -n "$lt_multi_os_dir"; then
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS = " "; FS = "/|\n";} {
+  lt_foo = "";
+  lt_count = 0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo = "/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[lt_foo]++; }
+  if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's|/\([A-Za-z]:\)|\1|g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='$libname$release$shared_ext$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test ia64 = "$host_cpu"; then
+    # AIX 5 supports IA64
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a(lib.so.V)'
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='$libname$shared_ext'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec=$LIB
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+    fi
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test yes = "$lt_cv_prog_gnu_ld"; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  hardcode_libdir_flag_spec='-L$libdir'
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd* | bitrig*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec=/usr/lib
+  need_lib_prefix=no
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
+  else
+    need_version=yes
+  fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+os2*)
+  libname_spec='$name'
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test yes = "$with_gnu_ld"; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec; then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=sco
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test yes = "$with_gnu_ld"; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+   test -n "$runpath_var" ||
+   test yes = "$hardcode_automatic"; then
+
+  # We can hardcode non-existent directories.
+  if test no != "$hardcode_direct" &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" &&
+     test no != "$hardcode_minus_L"; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test relink = "$hardcode_action" ||
+   test yes = "$inherit_rpath"; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+  if test yes != "$enable_dlopen"; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen=load_add_on
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen=LoadLibrary
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+    # if libdl is installed we need to link against it
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else
+
+    lt_cv_dlopen=dyld
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+
+fi
+
+    ;;
+
+  tpf*)
+    # Don't try to run any link tests for TPF.  We know it's impossible
+    # because TPF is a cross-compiler, and we know how we open DSOs.
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=no
+    ;;
+
+  *)
+    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes; then :
+  lt_cv_dlopen=shl_load
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if ${ac_cv_lib_dld_shl_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_shl_load=yes
+else
+  ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
+  lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
+else
+  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes; then :
+  lt_cv_dlopen=dlopen
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if ${ac_cv_lib_svld_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_svld_dlopen=yes
+else
+  ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if ${ac_cv_lib_dld_dld_link+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_dld_link=yes
+else
+  ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
+  lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+    ;;
+  esac
+
+  if test no = "$lt_cv_dlopen"; then
+    enable_dlopen=no
+  else
+    enable_dlopen=yes
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS=$CPPFLAGS
+    test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS=$LDFLAGS
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS=$LIBS
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test yes = "$cross_compiling"; then :
+  lt_cv_dlopen_self=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+    if test yes = "$lt_cv_dlopen_self"; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self_static+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test yes = "$cross_compiling"; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+    fi
+
+    CPPFLAGS=$save_CPPFLAGS
+    LDFLAGS=$save_LDFLAGS
+    LIBS=$save_LIBS
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP"; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    fi
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+  # Report what library types will actually be built
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+  test no = "$can_build_shared" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test yes = "$enable_shared" && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[4-9]*)
+    if test ia64 != "$host_cpu"; then
+      case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+      yes,aix,yes) ;;			# shared object as lib.so file only
+      yes,svr4,*) ;;			# shared object as lib.so archive member only
+      yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+      esac
+    fi
+    ;;
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+  # Make sure either enable_shared or enable_static is yes.
+  test yes = "$enable_shared" || enable_static=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC=$lt_save_CC
+
+      if test -n "$CXX" && ( test no != "$CXX" &&
+    ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+    (test g++ != "$CXX"))); then
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+  if ${ac_cv_prog_CXXCPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+$as_echo "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+else
+  _lt_caught_CXX_error=yes
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+compiler_needs_object_CXX=no
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_direct_absolute_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+inherit_rpath_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+reload_flag_CXX=$reload_flag
+reload_cmds_CXX=$reload_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_caught_CXX_error"; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+  # save warnings/boilerplate of simple test code
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  compiler_CXX=$CC
+  func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test yes = "$GXX"; then
+      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+    else
+      lt_prog_compiler_no_builtin_flag_CXX=
+    fi
+
+    if test yes = "$GXX"; then
+      # Set up default GNU C++ configuration
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return, which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD=$ac_prog
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test yes = "$with_gnu_ld"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD=$ac_dir/$ac_prog
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test no != "$with_gnu_ld" && break
+	;;
+      *)
+	test yes != "$with_gnu_ld" && break
+	;;
+      esac
+    fi
+  done
+  IFS=$lt_save_ifs
+else
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi
+fi
+
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test yes = "$with_gnu_ld"; then
+        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+
+        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+        export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='$wl'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+        else
+          whole_archive_flag_spec_CXX=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+    ld_shlibs_CXX=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+      aix[4-9]*)
+        if test ia64 = "$host_cpu"; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # have runtime linking enabled, and use it for executables.
+          # For shared libraries, we enable/disable runtime linking
+          # depending on the kind of the shared library created -
+          # when "with_aix_soname,aix_use_runtimelinking" is:
+          # "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "aix,yes"  lib.so          shared, rtl:yes, for executables
+          #            lib.a           static archive
+          # "both,no"  lib.so.V(shr.o) shared, rtl:yes
+          #            lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a(lib.so.V) shared, rtl:no
+          # "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a           static archive
+          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	      # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	      # so we don't have lib.a shared libs to link our executables.
+	      # We have to force runtime linking in this case.
+	      aix_use_runtimelinking=yes
+	      LDFLAGS="$LDFLAGS -Wl,-brtl"
+	    fi
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        archive_cmds_CXX=''
+        hardcode_direct_CXX=yes
+        hardcode_direct_absolute_CXX=yes
+        hardcode_libdir_separator_CXX=':'
+        link_all_deplibs_CXX=yes
+        file_list_spec_CXX='$wl-f,'
+        case $with_aix_soname,$aix_use_runtimelinking in
+        aix,*) ;;	# no import file
+        svr4,* | *,yes) # use import file
+          # The Import File defines what to hardcode.
+          hardcode_direct_CXX=no
+          hardcode_direct_absolute_CXX=no
+          ;;
+        esac
+
+        if test yes = "$GXX"; then
+          case $host_os in aix4.[012]|aix4.[012].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`$CC -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    hardcode_direct_CXX=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    hardcode_minus_L_CXX=yes
+	    hardcode_libdir_flag_spec_CXX='-L$libdir'
+	    hardcode_libdir_separator_CXX=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag=$shared_flag' $wl-G'
+	  fi
+	  # Need to ensure runtime linking is disabled for the traditional
+	  # shared library, or the linker may eventually find shared libraries
+	  # /with/ Import File - we do not want to mix them.
+	  shared_flag_aix='-shared'
+	  shared_flag_svr4='-shared $wl-G'
+        else
+          # not using gcc
+          if test ia64 = "$host_cpu"; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test yes = "$aix_use_runtimelinking"; then
+	      shared_flag='$wl-G'
+	    else
+	      shared_flag='$wl-bM:SRE'
+	    fi
+	    shared_flag_aix='$wl-bM:SRE'
+	    shared_flag_svr4='$wl-G'
+          fi
+        fi
+
+        export_dynamic_flag_spec_CXX='$wl-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        always_export_symbols_CXX=yes
+	if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          # The "-G" linker flag allows undefined symbols.
+          no_undefined_flag_CXX='-bernotok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=/usr/lib:/lib
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+          hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
+
+          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+        else
+          if test ia64 = "$host_cpu"; then
+	    hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib'
+	    allow_undefined_flag_CXX="-z nodefs"
+	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=/usr/lib:/lib
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+	    hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    no_undefined_flag_CXX=' $wl-bernotok'
+	    allow_undefined_flag_CXX=' $wl-berok'
+	    if test yes = "$with_gnu_ld"; then
+	      # We only use this code for GNU lds that support --whole-archive.
+	      whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
+	    else
+	      # Exported symbols can be pulled into shared objects from archives
+	      whole_archive_flag_spec_CXX='$convenience'
+	    fi
+	    archive_cmds_need_lc_CXX=yes
+	    archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	    # -brtl affects multiple linker settings, -berok does not and is overridden later
+	    compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+	    if test svr4 != "$with_aix_soname"; then
+	      # This is similar to how AIX traditionally builds its shared
+	      # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	    fi
+	    if test aix != "$with_aix_soname"; then
+	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+	    else
+	      # used by -dlpreopen to get the symbols
+	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	    fi
+	    archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  allow_undefined_flag_CXX=unsupported
+	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	else
+	  ld_shlibs_CXX=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  ld_shlibs_CXX=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+	case $GXX,$cc_basename in
+	,cl* | no,cl*)
+	  # Native MSVC
+	  # hardcode_libdir_flag_spec is actually meaningless, as there is
+	  # no search path for DLLs.
+	  hardcode_libdir_flag_spec_CXX=' '
+	  allow_undefined_flag_CXX=unsupported
+	  always_export_symbols_CXX=yes
+	  file_list_spec_CXX='@'
+	  # Tell ltmain to make .lib files, not .a files.
+	  libext=lib
+	  # Tell ltmain to make .dll files, not .so files.
+	  shrext_cmds=.dll
+	  # FIXME: Setting linknames here is a bad hack.
+	  archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	  archive_expsym_cmds_CXX='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+              cp "$export_symbols" "$output_objdir/$soname.def";
+              echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+            else
+              $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+            fi~
+            $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+            linknames='
+	  # The linker will not automatically build a static lib if we build a DLL.
+	  # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
+	  enable_shared_with_static_runtimes_CXX=yes
+	  # Don't use ranlib
+	  old_postinstall_cmds_CXX='chmod 644 $oldlib'
+	  postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
+            lt_tool_outputfile="@TOOL_OUTPUT@"~
+            case $lt_outputfile in
+              *.exe|*.EXE) ;;
+              *)
+                lt_outputfile=$lt_outputfile.exe
+                lt_tool_outputfile=$lt_tool_outputfile.exe
+                ;;
+            esac~
+            func_to_tool_file "$lt_outputfile"~
+            if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+              $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+              $RM "$lt_outputfile.manifest";
+            fi'
+	  ;;
+	*)
+	  # g++
+	  # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+	  # as there is no search path for DLLs.
+	  hardcode_libdir_flag_spec_CXX='-L$libdir'
+	  export_dynamic_flag_spec_CXX='$wl--export-all-symbols'
+	  allow_undefined_flag_CXX=unsupported
+	  always_export_symbols_CXX=no
+	  enable_shared_with_static_runtimes_CXX=yes
+
+	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file, use it as
+	    # is; otherwise, prepend EXPORTS...
+	    archive_expsym_cmds_CXX='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+              cp $export_symbols $output_objdir/$soname.def;
+            else
+              echo EXPORTS > $output_objdir/$soname.def;
+              cat $export_symbols >> $output_objdir/$soname.def;
+            fi~
+            $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	  else
+	    ld_shlibs_CXX=no
+	  fi
+	  ;;
+	esac
+	;;
+      darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc_CXX=no
+  hardcode_direct_CXX=no
+  hardcode_automatic_CXX=yes
+  hardcode_shlibpath_var_CXX=unsupported
+  if test yes = "$lt_cv_ld_force_load"; then
+    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec_CXX=''
+  fi
+  link_all_deplibs_CXX=yes
+  allow_undefined_flag_CXX=$_lt_dar_allow_undefined
+  case $cc_basename in
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test yes = "$_lt_dar_can_shared"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+       if test yes != "$lt_cv_apple_cc_single_mod"; then
+      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+      archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
+    fi
+
+  else
+  ld_shlibs_CXX=no
+  fi
+
+	;;
+
+      os2*)
+	hardcode_libdir_flag_spec_CXX='-L$libdir'
+	hardcode_minus_L_CXX=yes
+	allow_undefined_flag_CXX=unsupported
+	shrext_cmds=.dll
+	archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  prefix_cmds="$SED"~
+	  if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	    prefix_cmds="$prefix_cmds -e 1d";
+	  fi~
+	  prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	  cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+	enable_shared_with_static_runtimes_CXX=yes
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        ld_shlibs_CXX=no
+        ;;
+
+      freebsd-elf*)
+        archive_cmds_need_lc_CXX=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        ld_shlibs_CXX=yes
+        ;;
+
+      haiku*)
+        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+        link_all_deplibs_CXX=yes
+        ;;
+
+      hpux9*)
+        hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
+        hardcode_libdir_separator_CXX=:
+        export_dynamic_flag_spec_CXX='$wl-E'
+        hardcode_direct_CXX=yes
+        hardcode_minus_L_CXX=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            ld_shlibs_CXX=no
+            ;;
+          aCC*)
+            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test yes = "$GXX"; then
+              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              ld_shlibs_CXX=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test no = "$with_gnu_ld"; then
+	  hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
+	  hardcode_libdir_separator_CXX=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      export_dynamic_flag_spec_CXX='$wl-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            hardcode_direct_CXX=no
+            hardcode_shlibpath_var_CXX=no
+            ;;
+          *)
+            hardcode_direct_CXX=yes
+            hardcode_direct_absolute_CXX=yes
+            hardcode_minus_L_CXX=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+          *)
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
+	        case $host_cpu in
+	          hppa*64*)
+	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      ld_shlibs_CXX=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[3-9]*)
+	hardcode_direct_CXX=no
+	hardcode_shlibpath_var_CXX=no
+	hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	export_dynamic_flag_spec_CXX='$wl-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	      else
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
+	      fi
+	    fi
+	    link_all_deplibs_CXX=yes
+	    ;;
+        esac
+        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+        hardcode_libdir_separator_CXX=:
+        inherit_rpath_CXX=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    archive_cmds_need_lc_CXX=no
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+	    whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
+	      prelink_cmds_CXX='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+	      old_archive_cmds_CXX='tpldir=Template.dir~
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+                $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+                $RANLIB $oldlib'
+	      archive_cmds_CXX='tpldir=Template.dir~
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	      archive_expsym_cmds_CXX='tpldir=Template.dir~
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 and above use weak symbols
+	      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+	    whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname  -o $lib $wl-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+	    hardcode_libdir_separator_CXX=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    ;;
+	  xl* | mpixl* | bgxl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+	    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    if test yes = "$supports_anon_versioning"; then
+	      archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
+                cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+                echo "local: *; };" >> $output_objdir/$libname.ver~
+                $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      no_undefined_flag_CXX=' -zdefs'
+	      archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
+	      hardcode_libdir_flag_spec_CXX='-R$libdir'
+	      whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	      compiler_needs_object_CXX=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='func_echo_all'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  hardcode_libdir_flag_spec_CXX='-R$libdir'
+	  hardcode_direct_CXX=yes
+	  hardcode_shlibpath_var_CXX=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        ld_shlibs_CXX=yes
+	;;
+
+      openbsd* | bitrig*)
+	if test -f /usr/libexec/ld.so; then
+	  hardcode_direct_CXX=yes
+	  hardcode_shlibpath_var_CXX=no
+	  hardcode_direct_absolute_CXX=yes
+	  archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+	    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+	    export_dynamic_flag_spec_CXX='$wl-E'
+	    whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=func_echo_all
+	else
+	  ld_shlibs_CXX=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	    hardcode_libdir_separator_CXX=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
+	        archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+		;;
+	      *)
+	        allow_undefined_flag_CXX=' -expect_unresolved \*'
+	        archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	        archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+                  echo "-hidden">> $lib.exp~
+                  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+                  $RM $lib.exp'
+	        hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+		;;
+	    esac
+
+	    hardcode_libdir_separator_CXX=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+	  *)
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
+	      case $host in
+	        osf3*)
+	          archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+		  ;;
+	        *)
+	          archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+	      hardcode_libdir_separator_CXX=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      ld_shlibs_CXX=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            archive_cmds_need_lc_CXX=yes
+	    no_undefined_flag_CXX=' -zdefs'
+	    archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+              $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    hardcode_libdir_flag_spec_CXX='-R$libdir'
+	    hardcode_shlibpath_var_CXX=no
+	    case $host_os in
+	      solaris2.[0-5] | solaris2.[0-5].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands '-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    link_all_deplibs_CXX=yes
+
+	    output_verbose_link_cmd='func_echo_all'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      no_undefined_flag_CXX=' $wl-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+                  $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require '-G' NOT '-shared' on this
+	        # platform.
+	        archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+                  $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      fi
+
+	      hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir'
+	      case $host_os in
+		solaris2.[0-5] | solaris2.[0-5].*) ;;
+		*)
+		  whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag_CXX='$wl-z,text'
+      archive_cmds_need_lc_CXX=no
+      hardcode_shlibpath_var_CXX=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We CANNOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	no_undefined_flag_CXX='$wl-z,text'
+	allow_undefined_flag_CXX='$wl-z,nodefs'
+	archive_cmds_need_lc_CXX=no
+	hardcode_shlibpath_var_CXX=no
+	hardcode_libdir_flag_spec_CXX='$wl-R,$libdir'
+	hardcode_libdir_separator_CXX=':'
+	link_all_deplibs_CXX=yes
+	export_dynamic_flag_spec_CXX='$wl-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
+              '"$old_archive_cmds_CXX"
+	    reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
+              '"$reload_cmds_CXX"
+	    ;;
+	  *)
+	    archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+    esac
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+    test no = "$ld_shlibs_CXX" && can_build_shared=no
+
+    GCC_CXX=$GXX
+    LD_CXX=$LD
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    # Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+
+cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case $prev$p in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test x-L = "$p" ||
+          test x-R = "$p"; then
+	 prev=$p
+	 continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test no = "$pre_test_object_deps_done"; then
+	 case $prev in
+	 -L | -R)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$compiler_lib_search_path_CXX"; then
+	     compiler_lib_search_path_CXX=$prev$p
+	   else
+	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$postdeps_CXX"; then
+	   postdeps_CXX=$prev$p
+	 else
+	   postdeps_CXX="${postdeps_CXX} $prev$p"
+	 fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test no = "$pre_test_object_deps_done"; then
+	 if test -z "$predep_objects_CXX"; then
+	   predep_objects_CXX=$p
+	 else
+	   predep_objects_CXX="$predep_objects_CXX $p"
+	 fi
+       else
+	 if test -z "$postdep_objects_CXX"; then
+	   postdep_objects_CXX=$p
+	 else
+	   postdep_objects_CXX="$postdep_objects_CXX $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix[3-9]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  predep_objects_CXX=
+  postdep_objects_CXX=
+  postdeps_CXX=
+  ;;
+esac
+
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+ compiler_lib_search_dirs_CXX=
+if test -n "${compiler_lib_search_path_CXX}"; then
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'`
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+
+  # C++ specific cases for pic, static, wl, etc.
+  if test yes = "$GXX"; then
+    lt_prog_compiler_wl_CXX='-Wl,'
+    lt_prog_compiler_static_CXX='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_CXX='-Bstatic'
+      fi
+      lt_prog_compiler_pic_CXX='-fPIC'
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic_CXX='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
+            lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static_CXX='$wl-static'
+	;;
+      esac
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_CXX='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      lt_prog_compiler_pic_CXX=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static_CXX=
+      ;;
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_CXX=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	lt_prog_compiler_pic_CXX='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic_CXX='-fPIC -shared'
+      ;;
+    *)
+      lt_prog_compiler_pic_CXX='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[4-9]*)
+	# All AIX code is PIC.
+	if test ia64 = "$host_cpu"; then
+	  # AIX 5 now supports IA64 processor
+	  lt_prog_compiler_static_CXX='-Bstatic'
+	else
+	  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+	# This hack is so that the source file can tell whether it is being
+	# built for inclusion in a dll (and should export symbols for example).
+	lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+	    if test ia64 != "$host_cpu"; then
+	      lt_prog_compiler_pic_CXX='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      lt_prog_compiler_pic_CXX='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    lt_prog_compiler_pic_CXX='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64, which still supported -KPIC.
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-fPIC'
+	    lt_prog_compiler_static_CXX='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-fpic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
+	    # IBM XL 8.0, 9.0 on PPC and BlueGene
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-qpic'
+	    lt_prog_compiler_static_CXX='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      lt_prog_compiler_pic_CXX='-KPIC'
+	      lt_prog_compiler_static_CXX='-Bstatic'
+	      lt_prog_compiler_wl_CXX='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    lt_prog_compiler_pic_CXX='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd* | netbsdelf*-gnu)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        lt_prog_compiler_pic_CXX='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    lt_prog_compiler_wl_CXX='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    lt_prog_compiler_pic_CXX='-pic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	lt_prog_compiler_can_build_shared_CXX=no
+	;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms that do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_CXX=
+    ;;
+  *)
+    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; }
+lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works_CXX=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"  ## exclude from sc_useless_quotes_in_assignment
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works_CXX=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then
+    case $lt_prog_compiler_pic_CXX in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+     esac
+else
+    lt_prog_compiler_pic_CXX=
+     lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works_CXX=no
+   save_LDFLAGS=$LDFLAGS
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works_CXX=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works_CXX=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then
+    :
+else
+    lt_prog_compiler_static_CXX=
+fi
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test no = "$hard_links"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  case $host_os in
+  aix[4-9]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+    # Without the "-l" option, or with the "-B" option, AIX nm treats
+    # weak defined symbols like other global defined symbols, whereas
+    # GNU nm marks them as "W".
+    # While the 'weak' keyword is ignored in the Export File, we need
+    # it in the Import File for the 'aix-soname' feature, so we have
+    # to replace the "-B" option with "-P" for AIX nm.
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+    else
+      export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    export_symbols_cmds_CXX=$ltdll_cmds
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*)
+      exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+      ;;
+    esac
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs_CXX=no
+    ;;
+  *)
+    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+test no = "$ld_shlibs_CXX" && can_build_shared=no
+
+with_gnu_ld_CXX=$with_gnu_ld
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_CXX=yes
+
+  if test yes,yes = "$GCC,$enable_shared"; then
+    case $archive_cmds_CXX in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl_CXX
+	  pic_flag=$lt_prog_compiler_pic_CXX
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+	  allow_undefined_flag_CXX=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc_CXX=no
+	  else
+	    lt_cv_archive_cmds_need_lc_CXX=yes
+	  fi
+	  allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
+      archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='$libname$release$shared_ext$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test ia64 = "$host_cpu"; then
+    # AIX 5 supports IA64
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a(lib.so.V)'
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='$libname$shared_ext'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec=$LIB
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+    fi
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test yes = "$lt_cv_prog_gnu_ld"; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  hardcode_libdir_flag_spec_CXX='-L$libdir'
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd* | bitrig*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec=/usr/lib
+  need_lib_prefix=no
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
+  else
+    need_version=yes
+  fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+os2*)
+  libname_spec='$name'
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test yes = "$with_gnu_ld"; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec; then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=sco
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test yes = "$with_gnu_ld"; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" ||
+   test -n "$runpath_var_CXX" ||
+   test yes = "$hardcode_automatic_CXX"; then
+
+  # We can hardcode non-existent directories.
+  if test no != "$hardcode_direct_CXX" &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" &&
+     test no != "$hardcode_minus_L_CXX"; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_CXX=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_CXX=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_CXX=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
+$as_echo "$hardcode_action_CXX" >&6; }
+
+if test relink = "$hardcode_action_CXX" ||
+   test yes = "$inherit_rpath_CXX"; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test yes != "$_lt_caught_CXX_error"
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+        ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+
+{ $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.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fibre::yield in -lfibre" >&5
+$as_echo_n "checking for Fibre::yield in -lfibre... " >&6; }
+if ${ac_cv_lib_fibre_Fibre__yield+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lfibre  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char Fibre::yield ();
+int
+main ()
+{
+return Fibre::yield ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_fibre_Fibre__yield=yes
+else
+  ac_cv_lib_fibre_Fibre__yield=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_fibre_Fibre__yield" >&5
+$as_echo "$ac_cv_lib_fibre_Fibre__yield" >&6; }
+if test "x$ac_cv_lib_fibre_Fibre__yield" = xyes; then :
+  HAVE_LIBFIBRE=1
+else
+  HAVE_LIBFIBRE=0
+fi
+
+ if test "$HAVE_LIBFIBRE" -eq 1; then
+  WITH_LIBFIBRE_TRUE=
+  WITH_LIBFIBRE_FALSE='#'
+else
+  WITH_LIBFIBRE_TRUE='#'
+  WITH_LIBFIBRE_FALSE=
+fi
+
+
+# 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 :
@@ -6381,4 +17309,13 @@
 fi
 done
+
+
+#==============================================================================
+# backend compiler implementation
+
+cat >>confdefs.h <<_ACEOF
+#define CFA_BACKEND_CC "${CC}"
+_ACEOF
+
 
 
@@ -7125,4 +18062,385 @@
 AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
 
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
+predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
+postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
+predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
+postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
+LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
+reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
+reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
+GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
+predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
+postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
+nm_file_list_spec \
+lt_cv_truncate_bin \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib \
+compiler_lib_search_dirs \
+predep_objects \
+postdep_objects \
+predeps \
+postdeps \
+compiler_lib_search_path \
+LD_CXX \
+reload_flag_CXX \
+compiler_CXX \
+lt_prog_compiler_no_builtin_flag_CXX \
+lt_prog_compiler_pic_CXX \
+lt_prog_compiler_wl_CXX \
+lt_prog_compiler_static_CXX \
+lt_cv_prog_compiler_c_o_CXX \
+export_dynamic_flag_spec_CXX \
+whole_archive_flag_spec_CXX \
+compiler_needs_object_CXX \
+with_gnu_ld_CXX \
+allow_undefined_flag_CXX \
+no_undefined_flag_CXX \
+hardcode_libdir_flag_spec_CXX \
+hardcode_libdir_separator_CXX \
+exclude_expsyms_CXX \
+include_expsyms_CXX \
+file_list_spec_CXX \
+compiler_lib_search_dirs_CXX \
+predep_objects_CXX \
+postdep_objects_CXX \
+predeps_CXX \
+postdeps_CXX \
+compiler_lib_search_path_CXX; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path \
+reload_cmds_CXX \
+old_archive_cmds_CXX \
+old_archive_from_new_cmds_CXX \
+old_archive_from_expsyms_cmds_CXX \
+archive_cmds_CXX \
+archive_expsym_cmds_CXX \
+module_cmds_CXX \
+module_expsym_cmds_CXX \
+export_symbols_cmds_CXX \
+prelink_cmds_CXX \
+postlink_cmds_CXX; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+   setopt NO_GLOB_SUBST
+fi
+
+
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    RM='$RM'
+    ofile='$ofile'
+
+
+
+
+
+
 _ACEOF
 
@@ -7135,4 +18453,5 @@
     "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h:src/config.h.in" ;;
     "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
     "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
     "driver/Makefile") CONFIG_FILES="$CONFIG_FILES driver/Makefile" ;;
@@ -7865,4 +19184,714 @@
 }
  ;;
+    "libtool":C)
+
+    # See if we are running on zsh, and set the options that allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}"; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile=${ofile}T
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the  same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags='CXX '
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and where our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects
+postdep_objects=$lt_postdep_objects
+predeps=$lt_predeps
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+    cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+
+    cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: CXX
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_CXX
+reload_cmds=$lt_reload_cmds_CXX
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_CXX
+
+# A language specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_CXX
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_CXX
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_CXX
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_CXX
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_CXX
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_CXX
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_CXX
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_CXX
+postdep_objects=$lt_postdep_objects_CXX
+predeps=$lt_predeps_CXX
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# ### END LIBTOOL TAG CONFIG: CXX
+_LT_EOF
+
+ ;;
 
   esac
Index: configure.ac
===================================================================
--- configure.ac	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ configure.ac	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -5,4 +5,5 @@
 AC_INIT([cfa-cc],[1.0.0.0],[cforall@plg.uwaterloo.ca])
 AC_CONFIG_AUX_DIR([automake])
+AC_CONFIG_MACRO_DIRS([automake])
 #AC_CONFIG_SRCDIR([src/main.cc])
 AC_CONFIG_HEADERS([config.h:src/config.h.in])
@@ -55,21 +56,4 @@
 AC_SUBST([DOendif])
 AM_SUBST_NOTMAKE([DOendif])
-
-#==============================================================================
-# backend compiler implementation
-AC_ARG_WITH(backend-compiler,
-       [  --with-backend-compiler=PROGRAM     PROGRAM that performs the final code compilation (must be gcc-compatible) ],
-       backendcompiler=$withval, backendcompiler="")
-if test "x$backendcompiler" != "x"; then
-       BACKEND_CC=${backendcompiler}
-else
-       AC_PATH_PROG(BACKEND_CC, gcc, [])       # check gcc installed
-       if test "x$BACKEND_CC" = "x"; then
-               AC_MSG_ERROR(some version of gcc is needed. Get it at ftp://ftp.gnu.org)
-               exit 1
-       fi
-fi
-AC_DEFINE_UNQUOTED(CFA_BACKEND_CC, "${BACKEND_CC}", [Location of include files.])
-AC_SUBST(CFA_BACKEND_CC)
 
 #==============================================================================
@@ -200,7 +184,7 @@
 AC_PROG_LEX
 if test "${LEX}" = "lex" ; then echo "Error: flex required." ; exit 1 ; fi
+AC_PROG_LIBTOOL
 AC_PROG_INSTALL
 AC_PROG_MAKE_SET
-AC_PROG_RANLIB
 
 # Checks for libraries.
@@ -228,4 +212,9 @@
 
 #==============================================================================
+# backend compiler implementation
+AC_DEFINE_UNQUOTED(CFA_BACKEND_CC, "${CC}", [Backend compiler to use.])
+AC_SUBST(CFA_BACKEND_CC)
+
+#==============================================================================
 AC_CONFIG_FILES([
 	Makefile
Index: doc/papers/concurrency/Paper.tex
===================================================================
--- doc/papers/concurrency/Paper.tex	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ doc/papers/concurrency/Paper.tex	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -686,5 +686,5 @@
 	Fib f1, f2;
 	for ( int i = 1; i <= 10; i += 1 ) {
-		sout | next( f1 ) | next( f2 ) | endl;
+		sout | next( f1 ) | next( f2 );
 	}
 }
@@ -772,10 +772,10 @@
 			sout | "  ";               // separator
 		}
-		sout | endl;
+		sout | nl;
 	}
 }
 void ?{}( Format & fmt ) { `resume( fmt );` }
 void ^?{}( Format & fmt ) with( fmt ) {
-	if ( g != 0 || b != 0 ) sout | endl;
+	if ( g != 0 || b != 0 ) sout | nl;
 }
 void format( Format & fmt ) {
@@ -855,11 +855,11 @@
 	for ( int i = 0; i < N; i += 1 ) {
 		int p1 = random( 100 ), p2 = random( 100 );
-		sout | p1 | " " | p2 | endl;
+		sout | p1 | " " | p2;
 		int status = delivery( c, p1, p2 );
-		sout | " $" | money | endl | status | endl;
+		sout | " $" | money | nl | status;
 		receipt += 1;
 	}
 	stop( c );
-	sout | "prod stops" | endl;
+	sout | "prod stops";
 }
 int payment( Prod & prod, int money ) {
@@ -895,11 +895,11 @@
 	int money = 1, receipt;
 	for ( ; ! done; ) {
-		sout | p1 | " " | p2 | endl | " $" | money | endl;
+		sout | p1 | " " | p2 | nl | " $" | money;
 		status += 1;
 		receipt = payment( p, money );
-		sout | " #" | receipt | endl;
+		sout | " #" | receipt;
 		money += 1;
 	}
-	sout | "cons stops" | endl;
+	sout | "cons stops";
 }
 int delivery( Cons & cons, int p1, int p2 ) {
@@ -1099,5 +1099,5 @@
 
 void main(foo & this) {
-	sout | "Hello World!" | endl;
+	sout | "Hello World!";
 }
 \end{cfa}
@@ -1124,5 +1124,5 @@
 
 void hello(/*unused*/ int) {
-	sout | "Hello World!" | endl;
+	sout | "Hello World!";
 }
 
@@ -1141,9 +1141,9 @@
 thread World {};
 void main( World & this ) {
-	sout | "World!" | endl;
+	sout | "World!";
 }
 int main() {
 	World w`[10]`;							$\C{// implicit forks after creation}$
-	sout | "Hello " | endl;					$\C{// "Hello " and 10 "World!" printed concurrently}$
+	sout | "Hello ";					$\C{// "Hello " and 10 "World!" printed concurrently}$
 }											$\C{// implicit joins before destruction}$
 \end{cfa}
@@ -1193,5 +1193,5 @@
 		total += subtotals[r];				$\C{// total subtotal}$
     }
-    sout | total | endl;
+    sout | total;
 }
 \end{cfa}
@@ -2192,5 +2192,5 @@
 	BENCH(
 		for ( size_t i = 0; i < N; i += 1 ) { @resume( c );@ } )
-	sout | result`ns | endl;
+	sout | result`ns;
 }
 \end{cfa}
@@ -2205,5 +2205,5 @@
 	BENCH(
 		for ( size_t i = 0; i < N; i += 1 ) { @yield();@ } )
-	sout | result`ns | endl;
+	sout | result`ns;
 }
 \end{cfa}
@@ -2244,5 +2244,5 @@
 int main() {
 	BENCH( for( size_t i = 0; i < N; i += 1 ) { @do_call( m1/*, m2, m3, m4*/ );@ } )
-	sout | result`ns | endl;
+	sout | result`ns;
 }
 \end{cfa}
@@ -2305,5 +2305,5 @@
 	BENCH( for ( size_t i = 0; i < N; i += 1 ) { @wait( c );@ } );
 	go = 0;	// stop other thread
-	sout | result`ns | endl;
+	sout | result`ns;
 }
 int main() {
@@ -2356,5 +2356,5 @@
 	BENCH( for ( size_t i = 0; i < N; i += 1 ) { @waitfor( do_call, m );@ } )
 	go = 0;	// stop other thread
-	sout | result`ns | endl;
+	sout | result`ns;
 }
 int main() {
@@ -2391,5 +2391,5 @@
 int main() {
 	BENCH( for ( size_t i = 0; i < N; i += 1 ) { @MyThread m;@ } )
-	sout | result`ns | endl;
+	sout | result`ns;
 }
 \end{cfa}
Index: doc/proposals/flags.md
===================================================================
--- doc/proposals/flags.md	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ doc/proposals/flags.md	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -60,6 +60,6 @@
 	```
 	FunFlags f = some_val();
-	if ( f ) { sout | "f has some flag(s) set" | endl; }
-	if ( f & FOO ) { sout | "f has FOO set" | endl; }
+	if ( f ) { sout | "f has some flag(s) set"; }
+	if ( f & FOO ) { sout | "f has FOO set"; }
 	f |= FOO; // set FOO
 	f -= FOO; // unset FOO
@@ -88,5 +88,5 @@
 	```
 	FunFlags f = some_val();
-	if ( f.FOO ) { sout | "f has FOO set" | endl; }
+	if ( f.FOO ) { sout | "f has FOO set"; }
 	f.FOO = true;    // set FOO
 	f.FOO = false;   // unset FOO
Index: doc/proposals/vtable.md
===================================================================
--- doc/proposals/vtable.md	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ doc/proposals/vtable.md	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,181 @@
+Proposal For Use of Virtual Tables
+==================================
+
+This is an adaptation of the earlier virtual proposal, updating it with new
+ideas, re-framing it and laying out more design decisions. It should
+eventually replace the earlier proposal, but not all features and syntax have
+been converted to the new design.
+
+The basic concept of a virtual table (vtable) is the same here as in most
+other languages. They will mostly contain function pointers although they
+should be able to store anything that goes into a trait.
+
+Trait Instances
+---------------
+
+Currently traits are completely abstract. Data types might implement a trait
+but traits are not themselves data types. This will change that and allow
+instances of traits to be created from instances of data types that implement
+the trait.
+
+    trait combiner(otype T) {
+		void combine(T&, int);
+	};
+
+    struct summation {
+		int sum;
+	};
+
+	void ?{}( struct summation & this ) {
+		this.sum = 0;
+	}
+
+    void combine( struct summation & this, int num ) {
+		this.sum = this.sum + num;
+	}
+
+	trait combiner obj = struct summation{};
+	combine(obj, 5);
+
+As with `struct` (and `union` and `enum`), `trait` might be optional when
+using the trait as a type name. A trait may be used in assertion list as
+before.
+
+Internally a trait object is a pair of pointers. One to an underlying object
+and the other to the vtable. All calls on an trait are implemented by looking
+up the matching function pointer and passing the underlying object and the
+remaining arguments to it.
+
+Trait objects can be moved by moving the pointers. Almost all other operations
+require some functions to be implemented on the underlying type. Depending on
+what is in the virtual table a trait type could be a dtype or otype.
+
+Hierarchy
+---------
+
+Virtual tables by them selves are not quite enough to implement the planned
+hierarchy system. An addition of type ids, implemented as pointers which
+point to your parent's type id, is required to actually create the shape of
+the hierarchy. However vtables would allow behaviour to be carried with the
+tree.
+
+The hierarchy would be a tree of types, of traits and structs. Currently we do
+not support structural extension, so traits form the internal nodes and
+structures the leaf nodes.
+
+The syntax is undecided but it will include a clause like `virtual (PARENT)`
+on trait and struct definitions. It marks out all types in a hierarchy.
+PARENT may be omitted, if it is this type is the root of a hierarchy. Otherwise
+it is the name of the type that is this type's parent in the hierarchy.
+
+Traits define a trait instance type that implements all assertions in this
+trait and its parents up until the root of the hierarchy. Each trait then
+defines a vtable type. Structures will also have a vtable type but it should
+be the same as their parent's.
+
+Trait objects within the tree can be statically cast to a parent type. Casts
+from a parent type to a child type are conditional, they check to make sure
+the underlying instance is an instance of the child type, or an instance of
+one of its children. The type then is recoverable at run-time.
+
+As with regular trait objects, calling a function on a trait object will cause
+a look-up on the the virtual table. The casting rules make sure anything that
+can be cast to a trait type will have all the function implementations for
+that trait.
+
+Converting from a concrete type (structures at the edge of the hierarchy) to
+an abstract type works the same as with normal trait objects, the underlying
+object is packaged with a virtual table pointer. Converting back to an abstract
+type requires confirming the underlying type matches, but then simply extracts
+the pointer to it.
+
+### Inline vtables
+Since the structures here are usually made to be turned into trait objects
+it might be worth it to have fields on them to store the virtual table
+pointer. This would have to be declared on the trait as an assertion, but if
+it is the trait object could be a single pointer.
+
+It is trivial to do if the field with the virtual table pointer is fixed.
+Otherwise some trickery with pointing to the field and storing the offset in
+the virtual table to recover the main object would have to be used.
+
+### Virtual Tables as Types
+Here we consider encoding plus the implementation of functions on it. Which
+is to say in the type hierarchy structures aren't concrete types anymore,
+instead they are parent types to vtables, which combine the encoding and
+implementation.
+
+Resolution Scope
+----------------
+
+What is the scope of a resolution? When are the functions in a vtable decided
+and how broadly is this applied?
+
+### Type Level:
+Each structure has a single resolution for all of the functions in the
+virtual trait. This is how many languages that implement this or similar
+features do it.
+
+The main thing CFA would need to do it this way is some single point where
+the type declaration, including the functions that satisfy the trait, are
+all defined. Currently there are many points where this can happen, not all
+of them will have the same definitions and no way to select one over the
+other.
+
+Some syntax would have to be added. All resolutions can be found at compile
+time and a single vtable created for each type at compilation time.
+
+### Explicit Resolution Points:
+Slightly looser than the above, there are explicit points where the vtables
+are resolved, but there is no limit on the number of resolution points that
+might be provided. Each time a object is bound to a trait, one of the
+resolutions is selected. This might be the most flexible option.
+
+An syntax would have to be provided as above. There may also be the option
+to name resolution points so that you can choose between them. This also
+could come with the ability to forward declare them.
+
+Especially if they are not named, these resolution points should be able to
+appear in functions, where the scoping rules can be used to select one.
+However this also means that stack-allocated functions can end up in the
+vtable.
+
+### Site Based Resolution:
+Every place in code where the binding of a vtable to an object occurs has
+its own resolution. Syntax-wise this is the simplest as it should be able
+to use just the existing declarations and the conversion to trait object.
+It also is very close to the current polymorphic resolution rules.
+
+This works as the explicit resolution points except the resolution points
+are implicit and their would be no selection of which resolution to use. The
+closest (current) resolution is always selected.
+
+This could easily lead to an explosion of vtables as it has the most fine
+grained resolution the number of bindings in a single scope (that produces
+the same binding) could be quite high. Merging identical vtables might help
+reduce that.
+
+Vtable Lifetime Issues
+----------------------
+
+Vtables interact badly with the thunk issue. Conceptually vtables are static
+like type/function data they carry, as those decisions are made by the
+resolver at compile time.
+
+Stack allocated functions interact badly with this because they are not
+static. There are several ways to try to resolve this, however without a
+general solution most can only buy time.
+
+Filling in some fields of a static vtable could cause issues on a recursive
+call. And then we are still limited by the lifetime of the stack functions, as
+the vtable with stale pointers is still a problem.
+
+Dynamically allocated vtables introduces memory management overhead and
+requires some way to differentiate between dynamic and statically allocated
+tables. The stale function pointer problem continues unless those becomes
+dynamically allocated as well which gives us the same costs again.
+
+Stack allocating the vtable seems like the best issue. The vtable's lifetime
+is now the limiting factor but it should be effectively the same as the
+shortest lifetime of a function assigned to it. However this still limits the
+lifetime "implicitly" and returns to the original problem with thunks.
Index: doc/theses/lynn_tran_SE499/Bibliography.bib
===================================================================
--- doc/theses/lynn_tran_SE499/Bibliography.bib	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ doc/theses/lynn_tran_SE499/Bibliography.bib	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,90 @@
+@misc{Reference2,
+    Abstract = {The C language is like a carving knife: simple, sharp, and extremely useful in skilled hands. Like any sharp tool, C can injure people who don't know how to handle it.},
+	Author = {Andrew Koenig},
+	Title = {Pitfalls of {C}},
+    Url = {http://www.math.pku.edu.cn/teachers/qiuzy/c/reading/pitfall.htm},
+    Year = {2001}
+}
+
+@manual{Reference3,
+	Title = {GDB: The GNU Project Debugger},
+    Url = {https://www.gnu.org/software/gdb/},
+    Year = {2018}
+}
+
+@manual{Reference4,
+	Title = {Extending GDB},
+    Url =
+    {https://sourceware.org/gdb/onlinedocs/gdb/Extending-GDB.html#Extending-GDB},
+    Year = {2018}
+}
+
+@manual{Reference5,
+	Title = {GDB Internals Manual},
+    Url = {https://sourceware.org/gdb/wiki/Internals},
+    Year = {2018}
+}
+
+@manual{Reference6,
+	Title = {Compiling for Debugging},
+    Url = {https://sourceware.org/gdb/onlinedocs/gdb/Compilation.html#Compilation},
+    Year = {2018}
+}
+
+@misc{Reference7,
+	Title = {{DWARF Debugging Standard}},
+    Url = {http://dwarfstd.org/},
+    Year = {2007}
+}
+
+@misc{Reference8,
+	Title = {{DWARF}},
+    Url = {https://en.wikipedia.org/wiki/DWARF},
+	Year = {2017}
+}
+
+@misc{Reference9,
+	Title = {{Name Mangling}},
+    Url = {https://en.wikipedia.org/wiki/Name_mangling},
+	Year = {2018}
+}
+
+@techreport{Reference10,
+	Author = {Peter A. Buhr},
+    Institution = {School of Computer Science, University of Waterloo},
+	Month = {January},
+	Title = {{$\mu$C++ Annotated Reference Manual}},
+	Url = {https://plg.uwaterloo.ca/~usystem/pub/uSystem/uC++.pdf},
+	Year = {2006}
+}
+
+@misc{Reference11,
+	Title = {{Selecting A Frame}},
+    Url = {ftp://ftp.gnu.org/old-gnu/Manuals/gdb/html_chapter/gdb_7.html#SEC44},
+    Year = {2002}
+}
+
+@misc{Reference12,
+	Title = {{Examining the Stack}},
+    Url = {ftp://ftp.gnu.org/old-gnu/Manuals/gdb/html_chapter/gdb_7.html},
+    Year = {2002}
+}
+
+@misc{Reference13,
+	Title = {{C$\mathbf{\forall} $ Language}},
+    Url = {https://cforall.uwaterloo.ca},
+    Year = {2017}
+}
+
+@misc{Reference14,
+	Title = {{KOS}},
+    Url = {https://cs.uwaterloo.ca/~mkarsten/kos.html},
+    Year = {2018}
+}
+
+@misc{Reference15,
+	Title = {{Continuing and Stepping}},
+    Url =
+    {https://sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html},
+    Year = {2018}
+}
Index: doc/theses/lynn_tran_SE499/Chapters/CFA.tex
===================================================================
--- doc/theses/lynn_tran_SE499/Chapters/CFA.tex	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ doc/theses/lynn_tran_SE499/Chapters/CFA.tex	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,100 @@
+\chapter{\CFA} \label{CFA}
+
+\section{Introduction}
+Similar to \CC, C is a popular programming language especially in systems
+programming. For example, the Windows NT and Linux kernel are written in C, and they are the foundation of many higher level
+and popular projects. Therefore, it is unlikely that the programming language C is
+going to disappear any time soon.
+
+However, C has inherent problems in syntax, semantics and many
+more \cite{Reference2}. Even though \CC is meant to fix these problems, \CC has many
+irreversible legacy design choices, and newer versions of \CC require significantly more effort to convert C-based projects into \CC.
+
+To solve this problem, the programming language \CFA is being created at the University of Waterloo. The goal
+of the language is to extend C with modern language features that many new
+languages have, such as Rust and Go. Hence, the \CFA extension provides a
+backward-compatible version of C, while fixing existing problems known in C and
+modernizing the language at the same time.
+
+\section{Overloading}
+Overloading is when a compiler permits a name to have multiple meanings. All
+programming languages allow simple overloading of operators on basic types such
+as the \verb|+| operator (add) on integer and floating-point types. Most programming languages extend
+overloading of operators to user-defined types and/or general function
+overloading. \CFA also supports overloading of variables and the literals \verb|0/1|.
+
+\subsection{Variable}
+Variables in the same block are allowed to have the same name but different
+types. An assignment to a new variable uses that variable's type to infer the
+required type, and that type is used to select a variable containing the appropriate type.
+
+\begin{lstlisting}[numbers=left, xleftmargin=3.0ex, style=C++nokeyword, caption={Overloading variables in \CFA}, label={CFA-overload-var}]
+short int MAX = SHRT_MAX;
+int MAX = INT_MAX;
+double MAX = DBL_MAX;
+
+// select variable MAX based on its left-hand type
+short int s = MAX;      // s = SHRT_MAX
+int s = MAX;            // s = INT_MAX
+double s = MAX;         // s = DBL_MAX
+\end{lstlisting}
+
+The listing \ref{CFA-overload-var} shows that when variable overloading exists
+in the same scope, the variable is selected based on the left side of
+initialization/assignment and operands of the right side of the expression. For
+instance, the first assignment to variable \verb|s| at line 6, which is type short int,
+selects the MAX with the same type.
+
+\subsection{Function}
+Functions in the same block can be overloaded depending on the number and type of
+parameters and returns.
+
+\begin{lstlisting}[numbers=left, xleftmargin=3.0ex, style=C++nokeyword, caption={Overloading routines in \CFA},
+label={CFA-overload-func}]
+void f(<@\textcolor{red}{void}@>);              // (1)
+void f(<@\textcolor{red}{char}@>);              // (2)
+<@\textcolor{red}{char}@> f(void);              // (3)
+<@\textcolor{red}{[int,double]}@> f();           // (4)
+
+f();                      // pick (1)
+f('a');                   // pick (2)
+char s = f('a');          // pick (3)
+[int, double] s = f();    // pick (4)
+\end{lstlisting}
+
+The listing \ref{CFA-overload-func} shows that when many functions are overloaded in
+the same scope, a function is selected based on the combination of its return type and its
+arguments. For instance, from line 1-4, four different types of a function called
+\verb|f| are declared. For the call \verb|f('a')|, the function selected is the
+one on line 2, if the call voids the result. However, if the call assigns to a
+char, then the routine on line 3 is selected. This example can be seen on lines
+7-8.
+
+\subsection{Operator}
+An operator name is denoted with \verb|?| for the operand and any standard C
+operator. Operator names within the same block can be overloaded depending on
+the number and type of parameters and returns. However, operators \verb|&&|,
+\verb-||-, \verb|?:| cannot be overloaded because short-circuit semantics
+cannot be preserved.
+
+
+\begin{lstlisting}[style=C++nokeyword, caption={Overloading operators in \CFA},
+label={CFA-overload-ops}]
+int <@\textcolor{red}{++?}@>(int op);           // unary prefix increment
+int <@\textcolor{red}{?++}@>(int op);           // unary postfix increment
+int <@\textcolor{red}{?+?}@>(int op1, int op2); // unary postfix increment
+
+struct S { double x, double y }
+
+// overload operator plus-assignment
+S <@\textcolor{red}{?+?}@>(S a, S b) {
+    return (S) {a.x + b.x, a.y + b.y};
+}
+
+S a, b, c;
+a + b + c;
+\end{lstlisting}
+
+The listing \ref{CFA-overload-ops} shows that operator overloading is permitted
+similar to \CC. However, the difference is that the operator name is
+denoted with \verb|?| instead, and operator selection uses the return type.
Index: doc/theses/lynn_tran_SE499/Chapters/Conclusion.tex
===================================================================
--- doc/theses/lynn_tran_SE499/Chapters/Conclusion.tex	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ doc/theses/lynn_tran_SE499/Chapters/Conclusion.tex	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,10 @@
+\chapter{Conclusion}
+New GDB extensions are created to support information display and touring among
+\uC user tasks, and new hooks are added to the GNU Debugger to support a
+\CFA demangler. The GDB extensions are implemented using the Python API, and
+the hooks to add debugging support for \CFA are implemented using \uC. For
+the GDB extensions, writing Python extensions is easier and more robust.
+Furthermore, GDB provides sufficient hooks to make it possible for a new
+language to leverage existing infrastructure and codebase to add debugging
+support. The result provides significantly new capabilities for examining and
+debugging both \uC and \CFA programs.
Index: doc/theses/lynn_tran_SE499/Chapters/Demangler.tex
===================================================================
--- doc/theses/lynn_tran_SE499/Chapters/Demangler.tex	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ doc/theses/lynn_tran_SE499/Chapters/Demangler.tex	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,195 @@
+\chapter{\CFA Demangler} \label{demangler}
+
+\section{Introduction}
+While \CFA is a translator for additional features that C does not support,
+all the extensions compiled down to C code.  As a result, the executable file
+marks the DWARF tag \verb|DW_AT_language| with the fixed hexadecimal value for
+the C language. Because it is possible to have one frame in C code and another
+frame in Assembly code, GDB encodes a language flag for each frame. \CFA adds
+to this list, as it is essential to know when a stack frame contains mangled
+names versus C and assembler unmangled names. Thus, GDB must be told \CFA is a
+distinct source-language.
+
+\section{Design Constraints}
+Most GDB targets use the DWARF format.  The GDB DWARF reader initializes all
+the appropriate information read from the DIE structures in object or
+executable files, as mentioned in Chapter \ref{GDB}. However, GDB currently
+does not understand the new DWARF language-code assigned to the language \CFA,
+so the DWARF reader must be updated to recognize \CFA.
+
+Additionally, when a user enters a name into GDB, GDB needs to lookup if the
+name exists in the program. However, different languages may have different
+hierarchical structure for dynamic scope, so an implementation for nonlocal
+symbol lookup is required, so an appropriate name lookup routine must be added.
+
+\section{Implementation}
+Most of the implementation work discussed below is from reading GDB's internals
+wiki page and understanding how other languages are supported in GDB \cite{Reference5}.
+
+A new entry is added to GDB's list of language definition in
+\verb|gdb/defs.h|. Hence, a new instance of type \verb|struct language_def|
+must be created to add a language definition for \CFA. This instance is the
+entry point for new functions that are only applicable to \CFA. These new
+functions are invoked by GDB during debugging if there are operations that are
+applicable specifically to \CFA. For instance, \CFA can implement its own
+symbol lookup function for non-local variables because \CFA can have a
+different scope hierarchy. The final step for registering \CFA in GDB, as a
+new source language, is adding the instance of type \verb|struct language_def|
+into the list of language definitions, which is found in
+\verb|gdb/language.h|. This setup is shown in listing \ref{cfa-lang-def}.
+
+\begin{figure}
+\begin{lstlisting}[style=C++, caption={Language definition declaration for
+\CFA}, label={cfa-lang-def}, basicstyle=\small]
+// In gdb/language.h
+extern const struct language_defn cforall_language_defn;
+
+// In gdb/language.c
+static const struct language_defn *languages[] = {
+    &unknown_language_defn,
+    &auto_language_defn,
+    &c_language_defn,
+    ...
+    &cforall_language_defn,
+    ...
+ }
+
+// In gdb/cforall-lang.c
+extern const struct language_defn cforall_language_defn = {
+    "cforall",                      /* Language name */
+    "CForAll",                      /* Natural name */
+    language_cforall,
+    range_check_off,
+    case_sensitive_on,
+    ...
+    cp_lookup_symbol_nonlocal,      /* lookup_symbol_nonlocal */
+    ...
+    cforall_demangle,               /* Language specific demangler */
+    cforall_sniff_from_mangled_name,
+    ..
+}
+\end{lstlisting}
+\end{figure}
+
+The next step is updating the DWARF reader, so the reader can translate the
+DWARF code to an enum value defined above. However, this assumes that the
+language has an assigned language code.  The language code is a hexadecimal
+literal value assigned to a particular language, which is maintained by
+GCC. For \CFA, the hexadecimal value \verb|0x0025| is added to
+\verb|include/dwarf2.h| to denote \CFA, which is shown in listing
+\ref{cfa-dwarf}.
+\begin{lstlisting}[style=C++, caption={DWARF language code for \CFA},
+label={cfa-dwarf}, basicstyle=\small]
+// In include/dwarf2.h
+enum dwarf_source_language { // Source language names and codes.
+    DW_LANG_C89 = 0x0001,
+    ...
+    DW_LANG_CForAll = 0x0025,
+}
+\end{lstlisting}
+
+Once the demangler implementation goes into the \verb|libiberty| directory
+along with other demanglers, the demangler can be called by updating the
+language definition defined in listing \ref{cfa-lang-def} with the entry point
+of the \CFA demangler, and adding a check if the current demangling style is
+\verb|CFORALL_DEMANGLING| as seen in listing \ref{cfa-demangler}. GDB then
+automatically invokes this \CFA demangler when GDB detects the source language
+is \CFA. In addition to the automatic invocation of the demangler, GDB provides
+an option to manually set which demangling style to use in the command line
+interface.  This option can be turned on for \CFA in GDB by adding a new enum
+value for \CFA in the list of demangling styles along with setting the
+appropriate mask for this style in \verb|include/demangle.h|. After doing this
+step, users can now choose if they want to use the \CFA demangler in GDB by
+calling \verb|set demangle-style <language>|, where the language name is
+defined by the preprocessor macro \verb|CFORALL_DEMANGLING_STYLE_STRING| in
+listing \ref{cfa-demangler-style}.
+
+\begin{figure}
+\begin{lstlisting}[style=C++, caption={libiberty setup for the \CFA demangler},
+label={cfa-demangler}, basicstyle=\small]
+// In libiberty/cplus-dem.c
+const struct demangler_engine libiberty_demanglers[] = {
+    {
+        NO_DEMANGLING_STYLE_STRING,
+        no_demangling,
+        "Demangling disabled"
+    },
+    ...
+    {
+        CFORALL_DEMANGLING_STYLE_STRING,
+        cforall_demangling,
+        "Cforall style demangling"
+    },
+}
+...
+char * cplus_demangle(const char *mangled, int options) {
+    ...
+    /* The V3 ABI demangling is implemented elsewhere.  */
+    if (GNU_V3_DEMANGLING || RUST_DEMANGLING || AUTO_DEMANGLING) { ... }
+    ...
+    if (CFORALL_DEMANGLING) {
+        ret = cforall_demangle (mangled, options);
+        if (ret) { return ret; }
+    }
+}
+\end{lstlisting}
+
+\begin{lstlisting}[style=C++, caption={Setup \CFA demangler style},
+label={cfa-demangler-style}, basicstyle=\small]
+// In gdb/demangle.h
+#define DMGL_CFORALL (1 << 18)
+...
+/* If none are set, use 'current_demangling_style' as the default. */
+#define DMGL_STYLE_MASK
+(DMGL_AUTO|DMGL_GNU|DMGL_LUCID|DMGL_ARM|DMGL_HP|DMGL_EDG|DMGL_GNU_V3
+|DMGL_JAVA|DMGL_GNAT|DMGL_DLANG|DMGL_RUST|DMGL_CFORALL)
+...
+extern enum demangling_styles {
+    no_demangling = -1,
+    unknown_demangling = 0,
+    ...
+    cforall_demangling = DMGL_CFORALL
+} current_demangling_style;
+...
+#define CFORALL_DEMANGLING_STYLE_STRING  "cforall"
+...
+#define CFORALL_DEMANGLING (((int)CURRENT_DEMANGLING_STYLE)&DMGL_CFORALL)
+\end{lstlisting}
+\end{figure}
+
+However, the setup for the \CFA demangler above does not demangle mangled
+symbols during symbol-table lookup while the program is in progress. Therefore,
+additional work needs to be done in \verb|gdb/symtab.c|. Prior to looking up
+the symbol, GDB attempts to demangle the name of the symbol, which can either
+be a mangled or unmangled name, to see if it can detect the language, and select
+the appropriate demangler to demangle the symbol. This work enables invocation
+of the \CFA demangler during symbol lookup.
+\begin{lstlisting}[style=C++, caption={\CFA demangler setup for symbol lookup},
+label={cfa-symstab-setup}, basicstyle=\small]
+// In gdb/symtab.c
+const char * demangle_for_lookup ( const char *name, enum language lang,
+                                   demangle_result_storage &storage ) {
+    /* When using C++, D, or Go, demangle the name before doing a
+       lookup to use the binary search. */
+    if (lang == language_cplus) {
+        char *demangled_name = gdb_demangle(name, DMGL_ANSI|DMGL_PARAMS);
+        if (demangled_name != NULL)
+            return storage.set_malloc_ptr (demangled_name);
+    }
+    ...
+    else if (lang == language_cforall) {
+        char *demangled_name = cforall_demangle (name, 0);
+        if (demangled_name != NULL)
+            return storage.set_malloc_ptr (demangled_name);
+    }
+    ...
+}
+\end{lstlisting}
+
+\section{Result}
+The addition of hooks throughout GDB enables the invocation of the new \CFA
+demangler during symbol lookup and during the usage of \verb|binutils| tools
+such as \verb|objdump| and \verb|nm|. Additionally, these \verb|binutils| tools
+also understand \CFA because of the addition of the \CFA language code.
+However, as the language develops, symbol lookup for non-local variables must
+be implemented to produce the correct output.
Index: doc/theses/lynn_tran_SE499/Chapters/Extensions.tex
===================================================================
--- doc/theses/lynn_tran_SE499/Chapters/Extensions.tex	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ doc/theses/lynn_tran_SE499/Chapters/Extensions.tex	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,368 @@
+\chapter{Extending GDB for \uC}
+
+\section{Introduction}
+A sequential program has a single call stack. A debugger knows about this call stack and provides
+commands to walk up/down the call frames to examine the values of local variables, as well as global
+variables. A concurrent program has multiple call stacks (for coroutines/tasks), so a debugger must
+be extended to locate these stacks for examination, similar to a sequential stack.  For example,
+when a concurrent program deadlocks, looking at the task's call stack can locate the resource and
+the blocking cycle that resulted in the deadlock. Hence, it is very useful to display the call stack
+of each task to know where it is executing and what values it is currently computing. Because each
+programming language's concurrency is different, GDB has to be specifically extended for \uC.
+
+\section{Design Constraints}
+As mentioned in Chapter \ref{GDB}, there are several ways to extend GDB. However, there are a few
+design constraints on the selected mechanism. All the functions implemented should maintain similar
+functionality to existing GDB commands. In addition to functional requirements, usability and
+flexibility are requirements for this project. These final requirements enable developers to be
+productive quickly and do more with the extensions. The extensions created for \uC are simple to use
+and versatile.
+
+The following new GDB command are all implemented through the Python API for GDB.  Python is a
+scripting language with built-in data structures and functions that enables the development of more
+complex operations and saves time on development.
+
+\section{\uC source-code example}
+Listing \ref{uC-src-code} shows a \uC program that implicitly creates two clusters, system and user,
+which implicitly have a processor (kernel thread) and processor task. The program explicitly creates
+three additional processors and ten tasks on the user cluster.
+
+\begin{figure}
+\begin{lstlisting}[numbers=left, xleftmargin=4.0ex, style=C++, caption={\uC source code used for GDB commands},label={uC-src-code}, basicstyle=\small]
+_Task T {
+    const int tid;
+    std::string name;
+
+    void f(int param) {
+        if ( param != 0 ) f( param - 1 );	// recursion
+	for ( volatile size_t i = 0; i < 100000000; i += 1 ); // delay
+        int x = 3;
+        std::string y = "example";
+    }						// breakpoint
+    void main() {
+	if ( tid != 0 )				// T0 goes first
+	    for ( volatile size_t i = 0; i < 1000000000; i += 1 ) // delay
+		if ( i % 10000000 == 0 ) yield(); // execute other tasks
+        f(3);
+    }
+  public:
+    T(const int tid) : tid( tid ) {
+        name = "T" + std::to_string(tid);
+        setName(name.c_str());
+    }
+};
+int main() {
+    uProcessor procs[3];			// extra processors
+    const int numTasks = 10;
+    T * tasks[numTasks];			// extra tasks
+    // allocate tasks with different names
+    for (int id = 0; id < numTasks; id += 1) {
+        tasks[id] = new T(id);
+    }
+    // deallocate tasks
+    for (int id = 0; id < numTasks; id += 1) {
+        delete tasks[id];
+    }
+}
+\end{lstlisting}
+\end{figure}
+
+\section{Existing User-defined GDB Commands}
+Listing \ref{uC-callstack} shows the GDB output at the base case of the recursion for one of the
+tasks created in the \uC program in listing \ref{uC-src-code}.  The task is stopped at line 10. The
+backtrace shows the three calls to function \verb|f|, started in the task's \verb|main|. The top two
+frames (5 and 6) are administrative frames from \uC. The values of the argument and local variables
+are printed.
+\begin{lstlisting}[caption={Call stack of function \texttt{a} in the \uC
+program from listing \ref{uC-src-code}}, label={uC-callstack}, basicstyle=\small\tt]
+(gdb) backtrace
+#0  T::f (this=0xa4f950, param=0) at test.cc:10
+#1  0x000000000041e509 in T::f (this=0xa4f950, param=1) at test.cc:6
+#2  0x000000000041e509 in T::f (this=0xa4f950, param=2) at test.cc:6
+#3  0x000000000041e509 in T::f (this=0xa4f950, param=3) at test.cc:6
+#4  0x000000000041e654 in T::main (this=0xa4f950) at test.cc:15
+#5  0x0000000000428de2 in ...::invokeTask (This=...) at ...
+#6  0x0000000000000000 in ?? ()
+(gdb) info args
+this = 0xa4f950
+param = 0
+(gdb) info locals
+x = 3
+y = "example"
+\end{lstlisting}
+
+\subsection{Listing all clusters in a \uC program}
+Listing \ref{clusters-command} shows the new command \verb|clusters| to list all program clusters
+along with their associated address.  The output shows the two \uC implicitly created clusters.
+\begin{lstlisting}[caption={clusters command}, label={clusters-command}, basicstyle=\small\tt]
+(gdb) clusters
+                Name           Address
+       systemCluster          0x65a300
+         userCluster          0x7ca300
+\end{lstlisting}
+
+\subsection{Listing all processors in a cluster}
+Listing \ref{cluster-procs} shows the new command \verb|processors|, which requires a cluster
+argument to show all the processors in that cluster. In particular, this example shows that there
+are four processors in the \verb|userCluster|, with their associated address, PID, preemption and
+spin.
+\begin{lstlisting}[caption={processors command}, label={cluster-procs}, basicstyle=\small\tt]
+(gdb) processors
+           Address                 PID          Preemption                Spin
+          0x7ccc30             8421504                  10                1000
+          0x8c9b50             9478272                  10                1000
+          0x8c9d10            10002560                  10                1000
+          0x8c9ed0            10530944                  10                1000
+\end{lstlisting}
+
+\subsection{Listing all tasks in all clusters}
+Listing \ref{tasks} shows the new command \verb|task| with the \verb|all| argument to list all the
+tasks in a \uC program at this point in the execution snapshot.  The internal \uC threads
+(implicitly created) are numbered with negative identifiers, while those created by the application
+are numbered with zero/positive. The \verb|*| indicates the \uC thread (\verb|T0|) that encountered
+the breakpoint at line 10. GDB stops all execution and the states of the other threads are ready,
+running, or blocked. If the argument \verb|all| is removed, only internal information about the
+\verb|userCluster| and its implicitly created threads is printed, which is sufficient for most
+applications.
+\begin{lstlisting}[caption={task command for displaying all tasks for all clusters}, label={tasks}, basicstyle=\footnotesize\tt]
+(gdb) task all
+        Cluster Name           Address
+       systemCluster          0x65a300
+  ID           Task Name           Address                    State
+  -1      uProcessorTask          0x6c99c0       uBaseTask::Blocked
+  -2         uSystemTask          0x789f40       uBaseTask::Blocked
+         userCluster          0x7ca300
+  ID           Task Name           Address                    State
+  -1      uProcessorTask          0x80ced0       uBaseTask::Blocked
+  -2           uBootTask          0x659dd0       uBaseTask::Blocked
+   0                main    0x7fffffffe490       uBaseTask::Blocked
+  -3      uProcessorTask          0x90e810       uBaseTask::Blocked
+  -4      uProcessorTask          0x98ee00       uBaseTask::Blocked
+  -5      uProcessorTask          0xa0f3f0       uBaseTask::Blocked
+ * 1                  T0          0xa4f950       uBaseTask::Running
+   2                  T1          0xa8fce0       uBaseTask::Running
+   3                  T2          0xad0070       uBaseTask::Running
+   4                  T3          0xb10400         uBaseTask::Ready
+   5                  T4          0xb50790         uBaseTask::Ready
+   6                  T5          0xb90b20         uBaseTask::Ready
+   7                  T6          0xbd0eb0         uBaseTask::Ready
+   8                  T7          0xc11240         uBaseTask::Ready
+   9                  T8          0xc515d0       uBaseTask::Running
+  10                  T9          0xc91960         uBaseTask::Ready
+\end{lstlisting}
+
+\subsection{Listing all tasks in a cluster}
+Listing \ref{cluster-tasks} shows the new command \verb|task| with a cluster argument to list only
+the names of the tasks on that cluster.  In this version of the command \verb|task|, the associated
+address for each task and its state is displayed.
+\begin{lstlisting}[caption={task command for displaying all tasks in a cluster}, label={cluster-tasks}, basicstyle=\small\tt]
+(gdb) task systemCluster
+  ID           Task Name           Address                    State
+  -1      uProcessorTask          0x6c99c0       uBaseTask::Blocked
+  -2         uSystemTask          0x789f40       uBaseTask::Blocked
+\end{lstlisting}
+
+\section{Changing Stacks}
+The next extension for displaying information is writing new commands that allow stepping from one
+\uC task to another. Each switching remembers the task tour in a LIFO way. This semantics means push
+and pop commands are needed. The push is performed by the \verb|task| command with a task argument.
+The pop is performed by the new command \verb|prevtask| or shorthand \verb|prev|.
+
+\subsection{Task Switching}
+The task argument for pushing is a relative id within a cluster or absolute address on any
+cluster. For instance, to switch from any task to task \verb|T2| seen in listing \ref{tasks}, the
+first command in listing \ref{task-addr-arguments} uses relative id (3) implicitly from the
+\verb|userCluster|, the second command uses an absolute address (\verb|0xad0070|), and the third
+command uses relative id (3) with the explicit \verb|userCluster|. Core functionality of these
+approaches is the same. Finally, the \verb|prevtask| command is used to unwind the stack until it is
+empty.
+\begin{lstlisting}[caption={task command arguments}, label={task-addr-arguments}, basicstyle=\small\tt]
+(gdb) task 3
+(gdb) task 0xad0070
+(gdb) task 3 userCluster
+(gdb) prevtask
+...
+(gdb) prev
+...
+(gdb) prev
+...
+(gdb) prev
+empty stack
+\end{lstlisting}
+
+
+\subsection{Switching Implementation}
+To implement the task tour, it is necessary to store the context information for every context
+switching. This requirement means the \verb|task| command needs to store this information every time
+it is invoked.
+
+\begin{figure}
+    \centering
+    \includegraphics[width=8cm]{uContext_stack}
+    \caption{Machine context (uMachContext) for each task}
+    \label{machine-context}
+
+\vspace*{0.5in}
+
+\begin{lstlisting}[style=Python, caption={Abridged \texttt{push\_task} source code}, label={pushtask-code}, basicstyle=\small\tt]
+# get GDB type of uContext_t *
+uContext_t_ptr_type = gdb.lookup_type('UPP::uMachContext::uContext_t').pointer()
+
+# retrieve the context object from a task and cast it to the type uContext_t *
+task_context = task['context'].cast(uContext_t_ptr_type)
+
+# the offset where sp would be starting from uSwitch function
+sp_address_offset = 48
+# lookup the value of stack pointer (sp), frame pointer (fp),
+# program counter (pc)
+xsp = task_context['SP'] + sp_address_offset
+xfp = task_context['FP']
+if not gdb.lookup_symbol('uSwitch'):
+    print('uSwitch symbol is unavailable')
+    return
+
+# This value is calculated here because we always here when the task is in
+# blocked state
+xpc = get_addr(gdb.parse_and_eval('uSwitch').address + 28)
+# must switch back to frame-0 to set 'pc' register with the value of xpc
+gdb.execute('select-frame 0')
+
+# retrieve register values and push sp, fp, pc into a global stack
+global STACK
+sp = gdb.parse_and_eval('$sp')
+fp = gdb.parse_and_eval('$fp')
+pc = gdb.parse_and_eval('$pc')
+stack_info = StackInfo(sp = sp, fp = fp, pc = pc)
+STACK.append(stack_info)
+
+# update registers for new task
+gdb.execute('set $rsp={}'.format(xsp))
+gdb.execute('set $rbp={}'.format(xfp))
+gdb.execute('set $pc={}'.format(xpc))
+\end{lstlisting}
+\end{figure}
+
+Figure \ref{machine-context} shows a task points to a structure containing a \verb|uContext_t| data
+structure, storing the stack and frame pointer, and the stack pointer. Listing \ref{pushtask-code}
+shows these pointers are copied into an instance of the Python tuple \verb|StackInfo| for every
+level of task switching. This tuple also stores information about the program counter that is
+calculated from the address of the \verb|uSwitch| assembly function because a task always stops in
+\verb|uSwitch| when its state is blocked.  Similarly, switching commands retrieve this context
+information but from the task that a user wants to switch to, and sets the equivalent registers to
+the new values.
+
+To push using the \verb|task| command, the value of the hardware stack pointer \verb|rsp| register,
+frame pointer \verb|rbp| register, and program counter register \verb|pc| are copied from the
+blocked task's save-area to the Python stack.  To pop using the \verb|prevtask| command, the three
+registers are moved from the Python stack to the appropriate hardware registers. Popping an empty
+stack prints a warning.
+
+Note, for tasks running when a breakpoint is encountered, the task's save-area is out-of-date; i.e.,
+the save area is only updated on a context switch, and a running task's stack represents the current
+unstored state for that task, which will be stored at the next context switch. Hence, to examine
+running tasks, it is necessary to use the GDB \verb|info threads| and \verb|thread| commands to
+examine and then step onto running tasks.
+
+Listing \ref{rr-tasks} shows how to examine ready and running tasks. Task \verb|T3| is ready (see
+Listing \ref{tasks}) because it was forced to context switch because of a time-slice preemption.
+Switching to \verb|T3|, which is relative id 4, and listing its the backtrace (stack frames) shows
+frames 0--6, which are the execution sequence for a time-slice preemption (and can be ignored), and
+frames 7--9, which are the frames at the point of preemption.  Frame 7 shows \verb|T3| is at line 14
+in the test program (see Listing \ref{uC-src-code}). Switching to running task \verb|T1|, which is
+relative id 2 (see Listing \ref{tasks}), and listing its backtrace shows a similar backtrace to
+ready task \verb|T3|. However, this backtrace contains stale information.  The GDB command
+\verb|info threads| shows the status of each kernel thread in the application, which represents the
+true location of each running thread. By observation, it can be seen that thread 2 is executing task
+\verb|0xa8fce0|, which is task \verb|T1|. Switching to kernel thread 2 via GDB command
+\verb|thread 2| and listing its backtrace show that task \verb|T1| is current executing at line 13
+in the test program.
+
+\begin{figure}
+\begin{lstlisting}[numbers=left, xleftmargin=3.0ex, caption={Examine ready/running tasks}, label={rr-tasks}, basicstyle=\footnotesize\tt]
+(gdb) task 4
+#0  T::f (this=0xa4f950, param=0) at test.cc:10
+(gdb) backtrace
+#0  uSwitch () at /u0/usystem/software/u++-7.0.0/src/kernel/uSwitch-x86_64.S:64
+#1  0x000000000042bd5c in uBaseCoroutine::taskCxtSw (this=0x8c9d28) ...
+#2  0x000000000042fff4 in UPP::uProcessorKernel::scheduleInternal ...
+#3  0x000000000042d4b6 in uBaseTask::uYieldInvoluntary ...
+#4  0x000000000042172f in uKernelModule::rollForward ...
+#5  0x000000000042f4fe in UPP::uSigHandlerModule::sigAlrmHandler ...
+#6  <signal handler called>
+#7  0x000000000041e620 in T::main (`this=0xb10400`) at test.cc:14
+#8  0x0000000000428de2 in UPP::uMachContext::invokeTask (This=...) ...
+#9  0x0000000000000000 in ?? ()
+(gdb) task 2
+(gdb) backtrace
+#0  uSwitch () at /u0/usystem/software/u++-7.0.0/src/kernel/uSwitch-x86_64.S:64
+#1  0x000000000042bd70 in uBaseCoroutine::taskCxtSw (this=0x8c9b68) ...
+#2  0x000000000042fff4 in UPP::uProcessorKernel::scheduleInternal ...
+#3  0x000000000042d4b6 in uBaseTask::uYieldInvoluntary ...
+#4  0x000000000042172f in uKernelModule::rollForward ...
+#5  0x000000000042f50c in UPP::uSigHandlerModule::sigAlrmHandler ...
+#6  <signal handler called>
+#7  0x000000000041e620 in T::main (`this=0xa8fce0`) at test.cc:14
+#8  0x0000000000428de2 in UPP::uMachContext::invokeTask (This=...) ...
+#9  0x0000000000000000 in ?? ()
+(gdb) info threads
+  Id Target Id                           Frame 
+  1  Thread 0x7ffff7fc8780 (LWP 7425) "a.out" 0x00007ffff6d74826 in ...
+  2  Thread 0x808080 (LWP 7923) "a.out"  0x41e5fc in T::main `(this=0xa8fce0`) at test.cc:13
+* 3  Thread 0x90a080 (LWP 7926) "a.out"  uSwitch () ...
+  4  Thread 0x98a080 (LWP 7929) "a.out"  T::main (this=0xad0070) at test.cc:14
+  5  Thread 0xa0b080 (LWP 7931) "a.out"  0x41e629 in T::main (this=0xc515d0) at test.cc:14
+(gdb) thread 2
+#1  0x000000000041e509 in T::f (this=0xa4f950, param=1) at test.cc:6
+6	        if ( param != 0 ) f( param - 1 );	// recursion
+[Switching to thread 2 (Thread 0x808080 (LWP 7923))]
+#0  0x000000000041e5fc in T::main (`this=0xa8fce0`) at test.cc:13
+13		    for ( volatile size_t i = 0; i < 1000000000; i += 1 ) // delay
+(gdb) backtrace
+#0  0x000000000041e5fc in T::main (`this=0xa8fce0`) at test.cc:13
+#1  0x0000000000428de2 in UPP::uMachContext::invokeTask (This=...) ...
+#2  0x0000000000000000 in ?? ()
+\end{lstlisting}
+\end{figure}
+
+\subsection{Continuing Implementation}
+When a breakpoint or error is encountered, all concurrent execution stops.  The state of the program
+can now be examined and changed; after which the program may be continued. Continuation must always
+occur from the top of the stack (current call) for each task, and at the specific task where GDB
+stopped execution.
+
+However, during a task tour, the new GDB commands change the notion of the task where execution
+stopped to make it possible to walk other stacks.  Hence, it is a requirement for continuation that
+the task walk always return to frame-0 of the original stopped task before any program continuation
+\cite{Reference11}.
+
+% For every new function call, a new stack frame is created and the values of all the registers are
+% changed for that frame. Therefore, in order to see the true value of hardware registers, innermost
+% frame that is frame-0 must be selected \cite{Reference11}. However, it is possible to not be in
+% frame-0, so prior to setting these values, the command must switch back to the innermost
+% (currently executing) frame first.
+
+To provide for this requirement, the original stop task is implicitly remembered, and there is a new
+\verb|reset| command that \emph{must} be explicitly executed before any continuation to restore the
+locate state.  To prevent errors from forgetting to call the \verb|reset| command, additional hooks
+are added to the existing built-in GDB continuation commands to implicitly call \verb|reset|. The
+following list of these commands results from GDB documentation \cite{Reference15} and similar work
+done for KOS \cite{Reference14}.
+\begin{lstlisting}[caption={Built-in GDB commands that allow continuation of a program}, label={continue-cmds}, basicstyle=\small\tt]
+continue,next,nexti,step,stepi,finish,advance,jump,signal,until,run,thread,
+reverse-next,reverse-step,reverse-stepi,reverse-continue,reverse-finish
+\end{lstlisting}
+
+% These hooks call a new command called \verb|reset| prior to executing the command to enable
+% continuation of a program to ensure that the program's context is automatically switched back to
+% the context of the task that initiates the first context switch. The \verb|reset| command behaves
+% as same as the command \verb|prevtask|, however, it goes back directly to where the task is when
+% the program last stops, which is the first task in the task tour.
+
+\section{Result}
+The current implementation successfully allows users to display a snapshot of \uC execution with
+respect to clusters, processors, and tasks. With this information it is possible to tour the call
+stacks of the tasks to see execution locations and data values. Additionally, users are allowed to
+continue the execution where the program last pauses assuming that the program has not crashed. The
+continuation of execution is done by automatically reversing the task walk from any existing GDB
+commands such as \verb|continue|, or a user can manually reverse the task walk using the command
+\verb|prevtask| and then continue.
Index: doc/theses/lynn_tran_SE499/Chapters/GDB.tex
===================================================================
--- doc/theses/lynn_tran_SE499/Chapters/GDB.tex	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ doc/theses/lynn_tran_SE499/Chapters/GDB.tex	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,73 @@
+\chapter{GNU Debugger} \label{GDB}
+
+\section{Introduction}
+The GNU Project Debugger is a program that allows examination of what is going on
+inside another program while it executes, or examines the state of a program
+after it crashed \cite{Reference3}.
+
+\section{Debug Information}
+In order to allow effective inspection of program state, the
+debugger requires debugging information for a program. Debugging
+information is a collection of data generated by a compiler and/or an assembler
+program. This information is optional as it is only required for compilation,
+and hence, it is normally not present during program execution when debugging
+occurs. When requested, debugging information is stored in an object file, and it describes
+information such as the type of each variable or function and
+the correspondence between source line numbers and addresses in the executable
+code \cite{Reference6}. Debugging information is requested via the \verb|-g|
+flag during the compilation stage of the
+program.
+
+The debugging information must be written out in a canonical format for
+debuggers to read. DWARF is one of the supported debugging data formats, and its architecture is
+independent and applicable to any language, operating system, or processor \cite{Reference7}. This format uses a data structure called DIE to represent
+each variable, type, function, etc. A DIE is a pair: tag
+and its attribute \cite{Reference8}.
+
+\section{Stack-Frame Information}
+A stack frame, or frame for short, is a collection of all data associated with
+one function call. A frame consists of parameters received from the function call, local variables declared in that
+function, and the address where the
+function returns. The frame-pointer register stores the address of a frame,
+during execution of a call. A call stack can have many frames \cite{Reference12}.
+
+\section{Extending GDB}
+GDB provides three mechanisms for extending itself. The first is
+composition of GDB commands, the second is using the Python GDB API, and the third is defining new aliases for existing commands.
+
+\section{Symbol Handling}
+Symbols are a key part of GDB's operation. Symbols can be variables, functions and
+types. GDB has three kinds of symbol tables:
+\begin{itemize}
+    \item \textcolor{ForestGreen}{Full symbol-tables (symtabs)}: These contain the main information
+        about symbols and addresses
+    \item \textcolor{ForestGreen} {Partial symbol-tables (psymtabs)}: These contain enough information to
+        know when to read the corresponding part of the full symbol-table.
+    \item \textcolor{ForestGreen}{Minimal symbol-tables (msymtabs)}: These
+        contain information extracted from non-debugging symbols.
+\end{itemize}
+
+Debugging information for a large program can be very large, and reading all of
+these symbols can be a performance bottleneck in GDB, affecting the user
+experience. The solution is to lazily construct partial symbol-tables consisting of
+only selected symbols, and then eagerly expand them to full symbol-tables when
+necessary.
+The psymtabs is constructed by doing a quick pass over the executable file's
+debugging information.
+
+\section{Name Demangling in GDB}
+The library \verb|libiberty| provides many functions and features that can be
+divided into three groups:
+\begin{itemize}
+    \item \textcolor{ForestGreen}{Supplemental functions}: additional functions
+        that may be missing in
+        the underlying operating system.
+    \item \textcolor{ForestGreen}{Replacement functions}: simple and unified equivalent functions for
+        commonly used standard functions.
+    \item \textcolor{ForestGreen}{Extensions}: additional functions beyond the standard.
+\end{itemize}
+
+In particular, this library provides the \CC demangler that is used in GDB and
+by \uC. A new
+demangler can also be added in this library, which is what Rust did, and what
+is necessary for \CFA.
Index: doc/theses/lynn_tran_SE499/Chapters/Introduction.tex
===================================================================
--- doc/theses/lynn_tran_SE499/Chapters/Introduction.tex	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ doc/theses/lynn_tran_SE499/Chapters/Introduction.tex	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,67 @@
+\chapter{Introduction} \label{introduction}
+Computer programming languages provide humans a means to instruct computers to
+perform a particular task. New programming languages are
+invented to simplify the task, or provide additional features, enhance
+performance, and improve developer productivity.
+
+A crucial companion tool to a programming language is a debugger. A debugger is a productivity tool to aid developers in testing
+and finding bugs in a program. By definition, a debugger executes
+any program written in one of a supported set of languages and allows developers
+to stop, monitor and examine state in the program for further investigation.
+
+Specifically, this report talks about how to add GNU Debugger (GDB) support for the
+concurrent programming-languages \uC and \CFA.
+Both languages provide an $M$:$N$ concurrency model, where $M$ user-level threads
+execute on $N$ kernel-level threads.
+Often debuggers either do not know about concurrency or only provide a simple
+understanding of concurrency provided by the operating system (kernel threads).
+For \CFA, new hooks are also added to allow GDB to understand that
+\CFA is a new source language that requires invocation of a demangler for
+variable and function names.
+
+Because \uC is a translator, all the code written in \uC is eventually
+compiled down to \CC code. This transformation gives \uC an advantage with
+GDB because GDB already understands \CC. However, since \uC introduced new objects
+and high-level execution constructs into the language, GDB does not understand
+these objects or the runtime environment. One objective of this
+project is to write new GDB extensions to understand concurrency among tasks, a new high-level execution construct that is discussed more in Chapter \ref{uC}.
+
+Additionally, if a programming language provides overloading functionality,
+which allows functions or variables in the same scope with the
+same identifier, then each of these entities must be assigned a unique name, otherwise,
+there are name collisions.
+
+However, uniquely numbering (naming) overloads is impossible with separate
+compilation, because the compiler does not have access to all translation
+units. Therefore, it is necessary to adopt a scheme related to the overloading
+mechanism for unique naming. For example, if a language uses the number and
+types of function parameters to disambiguate function names, than the number
+and parameter types are encoded into the name:
+\begin{lstlisting}[basicstyle=\normalfont\tt]
+void f( int i, double d, char c );  // f_3_i_d_c
+void f( int i, char c );            // f_2_i_c
+\end{lstlisting}
+Here, the mangled names for \lstinline@f@ contain the number of parameters and a code for
+each parameter type. For a complex type-system, the type codes become
+correspondingly complex, e.g., a generic structure. These names are now unique
+across all translation units.
+
+Unfortunately, a debugger only has access to the mangled names in a compiled
+translation units, versus the unmangled names in the program.  Therefore, the
+debugger can only look up mangled names versus original program names, which
+makes debugging extremely difficult for programmers. To solve this program, the
+language must provide the debugger with a "demangled" so it can convert
+mangled names back to program names, and correspondingly retrieve the type of
+the name~\cite{Reference9}.
+
+\CFA, a new language being developed at the University of Waterloo, has
+overloading, so names resolved by the debugger are mangled names. Therefore,
+another objective of this project is to add a \CFA demangler to GDB.
+
+% Name mangling is a technique used in compilers to resolve this
+% problem. This technique provides a mechanism to encode additional information in the
+% name of a function, or a variable to supply more semantic information from
+% compiler to debugger \cite{Reference9}. \CFA, a new language being developed at the University of
+% Waterloo, has overloading, so names resolved from
+% the debugger are mangled names. As with early versions of \CC, it is not user-friendly to debug a program using
+% mangled names. Therefore, another objective of this project is to add a \CFA demangler in GDB.
Index: doc/theses/lynn_tran_SE499/Chapters/uCPP.tex
===================================================================
--- doc/theses/lynn_tran_SE499/Chapters/uCPP.tex	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ doc/theses/lynn_tran_SE499/Chapters/uCPP.tex	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,46 @@
+\chapter{\uC} \label{uC}
+
+\section{Introduction}
+\uC \cite{Reference10} extends the \CC programming language with new
+mechanisms to
+facilitate control flow, and adds new objects to enable lightweight concurrency
+on uniprocessor and parallel execution on multiprocessor computers. Concurrency has tasks
+that can context switch, which is a control transfer from one execution state to
+another that is different from a function call. Tasks are selected to run on a
+processor from a ready queue of available tasks, and tasks may need to wait for an occurrence of an event.
+
+\section{Tasks}
+A \textcolor{ForestGreen}{task} behaves like a class object, but it maintains its own
+thread and execution state, which is the state information required to allow
+independent execution. A task provides mutual exclusion by default for calls to its
+public members. Public members allow communication among tasks.
+
+\section{\uC Runtime Structure}
+\uC introduces two new runtime entities for controlling concurrent execution:
+\begin{itemize}
+    \item Cluster
+    \item Virtual processor
+\end{itemize}
+
+\subsection{Cluster}
+A cluster is a group of tasks and virtual processors (discussed next) that
+execute tasks. The objective of a cluster is to control the amount of possible
+parallelism among tasks, which is only feasible if there are multiple
+hardware processors (cores).
+
+At the start of a \uC program, two clusters are created. One is the system
+cluster and the other is the user cluster. The system cluster has a processor
+that only performs management work such as error detection and correction from
+user clusters, if an execution in a user cluster results in errors, and cleans
+up at shutdown. The user cluster manages and executes user tasks on its
+processors. The benefits of clusters are maximizing utilization of processors
+and minimizing runtime through a scheduler that is appropriate for a particular
+workload. Tasks and virtual processors may be migrated among clusters.
+
+\subsection{Virtual Processor}
+A virtual processor is a software emulation of a processor that executes
+threads. Kernel threads are used to implement a virtual processor, which are
+scheduled for execution on a hardware processor by the underlying operating
+system. The operating system distributes kernel threads across a number of
+processors assuming that the program runs on a multiprocessor architecture. The
+usage of kernel threads enables parallel execution in \uC.
Index: doc/theses/lynn_tran_SE499/LICENSE
===================================================================
--- doc/theses/lynn_tran_SE499/LICENSE	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ doc/theses/lynn_tran_SE499/LICENSE	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
Index: doc/theses/lynn_tran_SE499/SE499-master/.gdbinit
===================================================================
--- doc/theses/lynn_tran_SE499/SE499-master/.gdbinit	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ doc/theses/lynn_tran_SE499/SE499-master/.gdbinit	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,41 @@
+handle SIGALRM nostop noprint pass
+handle SIGUSR1 nostop noprint pass
+source utils-gdb.gdb
+source utils-gdb.py
+break test.cc:10
+# echo (gdb) run\n
+# run
+# echo (gdb) backtrace\n
+# backtrace
+# echo (gdb) info args\n
+# info args
+# echo (gdb) info local\n
+# info local
+# echo (gdb) clusters\n
+# clusters
+# echo (gdb) processors\n
+# processors
+# echo (gdb) task all\n
+# task all
+# echo (gdb) task systemCluster\n
+# task systemCluster
+# echo (gdb) task 3\n
+# task 3
+# echo (gdb) task 0xad0070\n
+# task 0xad0070
+# echo (gdb) task 3 userCluster\n
+# task 3 userCluster
+# echo (gdb) info threads\n
+# info threads
+# echo (gdb) thread 2\n
+# thread 2
+# echo (gdb) backtrace\n
+# backtrace
+# echo (gdb) task 6\n
+# task 6
+# echo (gdb) backtrace\n
+# backtrace
+# echo (gdb) prev\n
+# prev
+# echo (gdb) backtrace\n
+# backtrace
Index: doc/theses/lynn_tran_SE499/SE499-master/README.md
===================================================================
--- doc/theses/lynn_tran_SE499/SE499-master/README.md	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ doc/theses/lynn_tran_SE499/SE499-master/README.md	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,26 @@
+# SE499
+## How to use the extension
+* Compile utils-gdb.cpp
+* Ensure utils-gdb.py is in the same folder as the object file of utils.cpp
+* Run Makefile with -single flag if it's uniprocessor and with -multi if it's
+  multiprocessor
+    Ex: `make multi`
+* Run `gdb ./utils`
+* Verify that the python extension was properly loaded `info auto-load`. The
+  command should indicate the utils-gdb.py extension was loaded as a script
+* Run the program and call any of the commands as wish
+
+Or simplier solution:
+* Run gdb and then call command `source utils-gdb.py`
+
+## List of commands
+* clusters
+* processors <cluster_name>
+* task
+* task <cluster_name>
+* task <task_address>
+* task <task_name>
+* task <cluster_name> <task_id>
+* poptask
+
+https://github.com/lynnt/SE499
Index: doc/theses/lynn_tran_SE499/SE499-master/test.cc
===================================================================
--- doc/theses/lynn_tran_SE499/SE499-master/test.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ doc/theses/lynn_tran_SE499/SE499-master/test.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,39 @@
+_Task T {
+    const int tid;
+    std::string name;
+
+    void f(int param) {
+        if ( param != 0 ) f( param - 1 );	// recursion
+	for ( volatile size_t i = 0; i < 100000000; i += 1 ); // delay
+        int x = 3;
+        std::string y = "example";
+    }						// breakpoint
+    void main() {
+	if ( tid != 0 )				// T0 goes first
+	    for ( volatile size_t i = 0; i < 1000000000; i += 1 ) // delay
+		if ( i % 10000000 == 0 ) yield(); // execute other tasks
+        f(3);
+    }
+  public:
+    T(const int tid) : tid( tid ) {
+        name = "T" + std::to_string(tid);
+        setName(name.c_str());
+    }
+};
+int main() {
+    uProcessor procs[3];			// extra processors
+    const int numTasks = 10;
+    T * tasks[numTasks];			// extra tasks
+    // allocate tasks with different names
+    for (int id = 0; id < numTasks; id += 1) {
+        tasks[id] = new T(id);
+    }
+    // deallocate tasks
+    for (int id = 0; id < numTasks; id += 1) {
+        delete tasks[id];
+    }
+}
+
+// Local Variables: //
+// compile-command: "u++-work test.cc -g -multi" //
+// End: //
Index: doc/theses/lynn_tran_SE499/SE499-master/utils-gdb.gdb
===================================================================
--- doc/theses/lynn_tran_SE499/SE499-master/utils-gdb.gdb	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ doc/theses/lynn_tran_SE499/SE499-master/utils-gdb.gdb	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,75 @@
+# 'server' keyword disables confirmation dialog when re-loading/re-defining
+# 'reset' restores the registers to the stack values at breakpoint to allow the movement commands to work correctly
+server define hook-continue
+reset
+end
+
+server define hook-next
+reset
+end
+
+server define hook-nexti
+reset
+end
+
+server define hook-step
+reset
+end
+
+server define hook-stepi
+reset
+end
+
+server define hook-finish
+reset
+end
+
+server define hook-advance
+reset
+end
+
+server define hook-jump
+reset
+end
+
+server define hook-signal
+reset
+end
+
+server define hook-until
+reset
+end
+
+server define hook-reverse-next
+reset
+end
+
+server define hook-reverse-step
+reset
+end
+
+server define hook-reverse-stepi
+reset
+end
+
+server define hook-reverse-continue
+reset
+end
+
+server define hook-reverse-finish
+reset
+end
+
+server define hook-run
+reset
+end
+
+server define hookpost-run
+# After recompile and 'run', the python global variables are lost, so the python macros must be reloaded.
+# However, this reloads the macros even when there has not been a recompile, but it is very fast.
+source utils-gdb.py
+end
+
+server define hook-thread
+reset
+end
Index: doc/theses/lynn_tran_SE499/SE499-master/utils-gdb.py
===================================================================
--- doc/theses/lynn_tran_SE499/SE499-master/utils-gdb.py	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ doc/theses/lynn_tran_SE499/SE499-master/utils-gdb.py	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,620 @@
+# 
+# Copyright (C) Lynn Tran, Jiachen Zhang 2018
+# 
+# utils-gdb.py -- 
+# 
+# Author           : Lynn Tran
+# Created On       : Mon Oct 1 22:06:09 2018
+# Last Modified By : Peter A. Buhr
+# Last Modified On : Thu Dec 20 22:11:23 2018
+# Update Count     : 5
+# 
+
+"""
+To run this extension, the python name has to be as same as one of the loaded library
+Additionally, the file must exist in a folder which is in gdb's safe path
+"""
+import collections
+import gdb
+
+# set these signal handlers with some settings (nostop, noprint, pass)
+gdb.execute('handle SIGALRM nostop noprint pass')
+gdb.execute('handle SIGUSR1 nostop noprint pass')
+
+# GDB types for various structures/types in uC++
+uCluster_ptr_type = gdb.lookup_type('uCluster').pointer()
+uClusterDL_ptr_type = gdb.lookup_type('uClusterDL').pointer()
+uBaseTask_ptr_type = gdb.lookup_type('uBaseTask').pointer()
+uBaseTaskDL_ptr_type = gdb.lookup_type('uBaseTaskDL').pointer()
+int_ptr_type = gdb.lookup_type('int').pointer()
+
+# A named tuple representing information about a stack
+StackInfo = collections.namedtuple('StackInfo', 'sp fp pc')
+
+# A global variable to keep track of stack information as one context switches
+# from one task to another task
+STACK = []
+
+# A global variable to keep all system task name
+SysTask_Name = ["uLocalDebuggerReader", "uLocalDebugger", "uProcessorTask", "uBootTask", "uSystemTask", 
+"uProcessorTask", "uPthread", "uProfiler"]
+
+def get_addr(addr):
+    """
+    NOTE: sketchy solution to retrieve address. There is a better solution...
+    @addr: str of an address that can be in a format 0xfffff <type of the object
+    at this address>
+    Return: str of just the address
+    """
+    str_addr = str(addr)
+    ending_addr_index = str_addr.find('<')
+    if ending_addr_index == -1:
+        return str(addr)
+    return str_addr[:ending_addr_index].strip()
+
+def print_usage(msg):
+    """
+    Print out usage message
+    @msg: str
+    """
+    print('Usage: ' + msg)
+
+def get_argv_list(args):
+    """
+    Split the argument list in string format, where each argument is separated
+    by whitespace delimiter, to a list of arguments like argv
+    @args: str of arguments
+    Return:
+        [] if args is an empty string
+        list if args is not empty
+    """
+    # parse the string format of arguments and return a list of arguments
+    argv = args.split(' ')
+    if len(argv) == 1 and argv[0] == '':
+        return []
+    return argv
+
+def get_cluster_root():
+    """
+    Return: gdb.Value of globalClusters.root (is an address)
+    """
+    cluster_root = gdb.parse_and_eval('uKernelModule::globalClusters.root')
+    if cluster_root.address == 0x0:
+        print('No clusters, program terminated')
+    return cluster_root
+
+def lookup_cluster_by_name(cluster_name):
+    """
+    Look up a cluster given its ID
+    @cluster_name: str
+    Return: gdb.Value
+    """
+    cluster_root = get_cluster_root()
+    if cluster_root.address == 0x0:
+        return cluster_root.address
+
+    # lookup for the task associated with the id
+    cluster = 0x0
+    curr = cluster_root
+    while True:
+        if curr['cluster_']['name'].string() == cluster_name:
+            cluster = curr['cluster_'].address
+            break
+        curr = curr['next'].cast(uClusterDL_ptr_type)
+        if curr == cluster_root:
+            break
+
+    if cluster == 0x0:
+        print("Cannot find a cluster with the name: {}.".format(cluster_name))
+    return cluster
+
+############################ COMMAND IMPLEMENTATION #########################
+
+class Clusters(gdb.Command):
+    """Print out the list of available clusters"""
+    usage_msg = 'cluster'
+    def __init__(self):
+        super(Clusters, self).__init__('clusters', gdb.COMMAND_USER)
+
+    def invoke(self, arg, from_tty):
+        """
+        Iterate through a circular linked list of clusters and print out its
+        name along with address associated to each cluster
+        @arg: str
+        @from_tty: bool
+        """
+        argv = get_argv_list(arg)
+        if len(argv) != 0:
+            print_usage(self.usage_msg)
+            return
+
+        cluster_root = get_cluster_root()
+        if cluster_root.address == 0x0:
+            return
+        curr = cluster_root
+        print('{:>20}{:>18}'.format('Name', 'Address'))
+
+        while True:
+            print('{:>20}{:>18}'.format(curr['cluster_']['name'].string(),
+                                        str(curr['cluster_'].reference_value())[1:]))
+            curr = curr['next'].cast(uClusterDL_ptr_type)
+            if curr == cluster_root:
+                break
+
+class ClusterProcessors(gdb.Command):
+    """Display a list of all info about all available processors on a particular cluster"""
+    usage_msg = 'processors <cluster_name>'
+    def __init__(self):
+        super(ClusterProcessors, self).__init__('processors', gdb.COMMAND_USER)
+
+    def invoke(self, arg, from_tty):
+        """
+        Iterate through a circular linked list of tasks and print out all
+        info about each processor in that cluster
+        @arg: str
+        @from_tty: bool
+        """
+        argv = get_argv_list(arg)
+        if len(argv) > 1:
+            print_usage(self.usage_msg)
+            return
+
+        if len(argv) == 0:
+            cluster_address = lookup_cluster_by_name("userCluster")
+        else:
+            cluster_address = lookup_cluster_by_name(argv[0])
+
+        if cluster_address == 0x0:
+            return
+
+        processor_root = cluster_address.cast(uCluster_ptr_type)['processorsOnCluster']['root']
+        if processor_root.address == 0x0:
+            print('There are no processors for cluster at address: {}'.format(cluster_address))
+            return
+
+        uProcessorDL_ptr_type = gdb.lookup_type('uProcessorDL').pointer()
+        print('{:>18}{:>20}{:>20}{:>20}'.format('Address', 'PID', 'Preemption', 'Spin'))
+        curr = processor_root
+
+        while True:
+            processor = curr['processor_']
+            print('{:>18}{:>20}{:>20}{:>20}'.format(get_addr(processor.address),
+                        str(processor['pid']), str(processor['preemption']),
+                        str(processor['spin'])))
+
+            curr = curr['next'].cast(uProcessorDL_ptr_type)
+            if curr == processor_root:
+                break
+
+class Task(gdb.Command):
+    usage_msg = """
+    task                            : print userCluster tasks, application tasks only
+    task <clusterName>              : print cluster tasks, application tasks only
+    task all                        : print all clusters, all tasks
+    task <id>                       : context switch to task id on userCluster
+    task 0x<address>	            : context switch to task on any cluster
+    task <id> <clusterName>         : context switch to task on specified cluster
+    """
+    def __init__(self):
+        # The first parameter of the line below is the name of the command. You
+        # can call it 'uc++ task'
+        super(Task, self).__init__('task', gdb.COMMAND_USER)
+
+    ############################ AUXILIARY FUNCTIONS #########################
+
+    def print_tasks_by_cluster_all(self, cluster_address):
+        """
+        Display a list of all info about all available tasks on a particular cluster
+        @cluster_address: gdb.Value
+        """
+        cluster_address = cluster_address.cast(uCluster_ptr_type)
+        task_root = cluster_address['tasksOnCluster']['root']
+
+        if task_root.address == 0x0:
+            print('There are no tasks for cluster at address: {}'.format(cluster_address))
+            return
+
+        print('{:>4}{:>20}{:>18}{:>25}'.format('ID', 'Task Name', 'Address', 'State'))
+        curr = task_root
+        task_id = 0
+        systask_id = -1
+
+        btstr = gdb.execute('bt', to_string = True)
+        break_addr = btstr.splitlines()[0].split('this=',1)[1].split(',')[0].split(')')[0]
+
+        while True:
+            global SysTask_Name
+            if (curr['task_']['name'].string() in SysTask_Name):
+                if str(curr['task_'].reference_value())[1:] == break_addr:
+                    print(
+                            ('{:>4}{:>20}{:>18}{:>25}'.format('* '+str(systask_id), curr['task_']['name'].string(),
+                            str(curr['task_'].reference_value())[1:],
+                            str(curr['task_']['state']))
+                        )
+                    )
+                else:
+                    print(
+                            ('{:>4}{:>20}{:>18}{:>25}'.format(systask_id, curr['task_']['name'].string(),
+                            str(curr['task_'].reference_value())[1:],
+                            str(curr['task_']['state']))
+                        )
+                    )
+                systask_id -= 1
+            else:
+                if str(curr['task_'].reference_value())[1:] == break_addr:
+                    print('{:>4}{:>20}{:>18}{:>25}'.format('* '+str(task_id), curr['task_']['name'].string(),
+                                                           str(curr['task_'].reference_value())[1:],
+                                                           str(curr['task_']['state']))
+                    )
+                else:
+                    print('{:>4}{:>20}{:>18}{:>25}'.format(task_id, curr['task_']['name'].string(),
+                                                           str(curr['task_'].reference_value())[1:],
+                                                           str(curr['task_']['state']))
+                    )
+                task_id += 1
+
+            curr = curr['next'].cast(uBaseTaskDL_ptr_type)
+            if curr == task_root:
+                break
+
+    def print_tasks_by_cluster_address_all(self, cluster_address):
+        """
+        Display a list of all info about all available tasks on a particular cluster
+        @cluster_address: str
+        """
+        # Iterate through a circular linked list of tasks and print out its
+        # name along with address associated to each cluster
+
+        # convert hex string to hex number
+        try:
+            hex_addr = int(cluster_address, 16)
+        except:
+            print_usage(self.usage_msg)
+            return
+
+        cluster_address = gdb.Value(hex_addr)
+        self.print_tasks_by_cluster_all(cluster_address)
+
+    def print_tasks_by_cluster_address(self, cluster_address):
+        """
+        Display a list of limited info about all available tasks on a particular cluster
+        @cluster_address: str
+        """
+        # Iterate through a circular linked list of tasks and print out its
+        # name along with address associated to each cluster
+
+        # convert hex string to hex number
+        try:
+            hex_addr = int(cluster_address, 16)
+        except:
+            print_usage(self.usage_msg)
+            return
+
+        cluster_address = gdb.Value(hex_addr).cast(uCluster_ptr_type)
+        task_root = cluster_address['tasksOnCluster']['root']
+
+        if task_root.address == 0x0:
+            print('There are no tasks for cluster at address: {}'.format(cluster_address))
+            return
+
+        print('{:>4}{:>20}{:>18}{:>25}'.format('ID', 'Task Name', 'Address', 'State'))
+        curr = task_root
+        task_id = 0
+        btstr = gdb.execute('bt', to_string = True)
+        break_addr = btstr.splitlines()[0].split('this=',1)[1].split(',')[0].split(')')[0]
+
+        while True:
+            global SysTask_Name
+            if (curr['task_']['name'].string() not in SysTask_Name):
+                if str(curr['task_'].reference_value())[1:] == break_addr:            
+                    print(
+                        ('{:>4}{:>20}{:>18}{:>25}'.format('* '+str(task_id), curr['task_']['name'].string(),
+                        str(curr['task_'].reference_value())[1:],
+                        str(curr['task_']['state']))
+                    )
+                )
+                else:
+                    print('{:>4}{:>20}{:>18}{:>25}'.format(task_id, curr['task_']['name'].string(),
+                                                           str(curr['task_'].reference_value())[1:],
+                                                           str(curr['task_']['state']))
+                    )
+
+                curr = curr['next'].cast(uBaseTaskDL_ptr_type)
+                task_id += 1
+                if curr == task_root:
+                    break
+            else:
+                curr = curr['next'].cast(uBaseTaskDL_ptr_type)
+                if curr == task_root:
+                    break
+
+    ############################ COMMAND FUNCTIONS #########################
+
+    def print_user_tasks(self):
+        """Iterate only userCluster, print only tasks and main""" 
+
+        cluster_address = lookup_cluster_by_name("userCluster")
+        if cluster_address == 0x0:
+            return
+
+        self.print_tasks_by_cluster_address(str(cluster_address))
+
+
+    def print_all_tasks(self):
+        """Iterate through each cluster, iterate through all tasks and  print out info about all the tasks
+        in those clusters"""
+        cluster_root = get_cluster_root()
+        if cluster_root.address == 0x0:
+            return
+
+        curr = cluster_root
+        print('{:>20}{:>18}'.format('Cluster Name', 'Address'))
+
+        while True:
+            addr = str(curr['cluster_'].reference_value())[1:]
+            print('{:>20}{:>18}'.format(curr['cluster_']['name'].string(), addr))
+
+            self.print_tasks_by_cluster_address_all(addr)
+            curr = curr['next'].cast(uClusterDL_ptr_type)
+            if curr == cluster_root:
+                break
+
+    def pushtask_by_address(self, task_address):
+        """Change to a new task by switching to a different stack and manually
+        adjusting sp, fp and pc
+        @task_address: str
+            2 supported format:
+                in hex format
+                    <hex_address>: literal hexadecimal address
+                    Ex: 0xffffff
+                in name of the pointer to the task
+                    "task_name": pointer of the variable name of the cluster
+                        Ex: T* s -> task_name = s
+            Return: gdb.value of the cluster's address
+        """
+        # Task address has a format "task_address", which implies that it is the
+        # name of the variable, and it needs to be evaluated
+        if task_address.startswith('"') and task_address.endswith('"'):
+            task = gdb.parse_and_eval(task_address.replace('"', ''))
+        else:
+        # Task address format does not include the quotation marks, which implies
+        # that it is a hex address
+            # convert hex string to hex number
+            try:
+                hex_addr = int(task_address, 16)
+            except:
+                print_usage(self.usage_msg)
+                return
+            task_address = gdb.Value(hex_addr)
+            task = task_address.cast(uBaseTask_ptr_type)
+
+        uContext_t_ptr_type = gdb.lookup_type('UPP::uMachContext::uContext_t').pointer()
+
+        task_state = task['state']
+        if task_state == gdb.parse_and_eval('uBaseTask::Terminate'):
+            print('Cannot switch to a terminated thread')
+            return
+        task_context = task['context'].cast(uContext_t_ptr_type)
+
+        # lookup for sp,fp and uSwitch
+        xsp = task_context['SP'] + 48
+        xfp = task_context['FP']
+        if not gdb.lookup_symbol('uSwitch'):
+            print('uSwitch symbol is unavailable')
+            return
+
+        # convert string so we can strip out the address
+        xpc = get_addr(gdb.parse_and_eval('uSwitch').address + 28)
+        # must be at frame 0 to set pc register
+        gdb.execute('select-frame 0')
+
+        # push sp, fp, pc into a global stack
+        global STACK
+        sp = gdb.parse_and_eval('$sp')
+        fp = gdb.parse_and_eval('$fp')
+        pc = gdb.parse_and_eval('$pc')
+        stack_info = StackInfo(sp = sp, fp = fp, pc = pc)
+        STACK.append(stack_info)
+
+        # update registers for new task
+        gdb.execute('set $rsp={}'.format(xsp))
+        gdb.execute('set $rbp={}'.format(xfp))
+        gdb.execute('set $pc={}'.format(xpc))
+
+    def pushtask_by_id(self, task_id, cluster_name):
+        """
+        @cluster_name: str
+        @task_id: str
+        """
+        try:
+            task_id = int(task_id)
+        except:
+            print_usage(self.usage_msg)
+            return
+
+        # retrieve the address associated with the cluster name
+        cluster_address = lookup_cluster_by_name(cluster_name)
+        if cluster_address == 0x0:
+            return
+
+        task_root = cluster_address.cast(uCluster_ptr_type)['tasksOnCluster']['root']
+        if task_root.address == 0x0:
+            print('There are no tasks on this cluster')
+            return
+
+        user_id = 0
+        task_addr = None
+        systask_id = -1 # system search id starts with negative
+
+        # lookup for the task associated with the id
+        global SysTask_Name
+        if (task_id >= 0 and cluster_name == "systemCluster"):
+            print('internal error: systemCluster does not have ID >= 0')
+            return
+        #id is a system task
+        elif task_id < 0:
+            curr = task_root
+            rootflag = False
+            while (curr['task_']['name'].string() not in SysTask_Name):
+                curr = curr['next'].cast(uBaseTaskDL_ptr_type)
+                if curr == task_root:
+                    rootflag = True
+                    break
+            if rootflag == False:
+                if task_id == systask_id:
+                    task_addr = str(curr['task_'].address)
+                else:
+                    while True:
+                        curr = curr['next'].cast(uBaseTaskDL_ptr_type)
+
+                        if (curr['task_']['name'].string() in SysTask_Name):
+                            systask_id -= 1
+                            if curr == task_root:
+                                break
+                            if task_id == systask_id:
+                                task_addr = str(curr['task_'].address)
+                                break
+
+                        if curr == task_root:
+                            break
+        #id is a user task
+        else:
+            curr = task_root
+            rootflag = False
+            while (curr['task_']['name'].string() in SysTask_Name):
+                curr = curr['next'].cast(uBaseTaskDL_ptr_type)
+                if curr == task_root:
+                    rootflag = True
+                    break
+            if rootflag == False:
+                if task_id == user_id:
+                    task_addr = str(curr['task_'].address)
+                else:
+                    while True:
+                        curr = curr['next'].cast(uBaseTaskDL_ptr_type)
+
+                        if (curr['task_']['name'].string() not in SysTask_Name):
+                            user_id += 1
+                            if curr == task_root:
+                                break
+                            if task_id == user_id:
+                                task_addr = str(curr['task_'].address)
+                                break
+
+                        if curr == task_root:
+                            break
+
+        if not task_addr:
+            print("Cannot find task ID: {}. Only have {} tasks".format(task_id,user_id))
+        else:
+            self.pushtask_by_address(task_addr)
+
+    def print_tasks_by_cluster_name(self, cluster_name):
+        """
+        Print out all the tasks available in the specified cluster
+        @cluster_name: str
+        """
+        cluster_address = lookup_cluster_by_name(cluster_name)
+        if cluster_address == 0x0:
+            return
+
+        self.print_tasks_by_cluster_all(cluster_address)
+
+    def invoke(self, arg, from_tty):
+        """
+        @arg: str
+        @from_tty: bool
+        """
+        argv = get_argv_list(arg)
+        if len(argv) == 0:
+            # print tasks
+            self.print_user_tasks() # only tasks and main
+        elif len(argv) == 1:
+            # push task
+            if argv[0].isdigit():
+                self.pushtask_by_id(argv[0], "userCluster") # by id, userCluster
+            elif argv[0].startswith('0x') or argv[0].startswith('0X'):
+                self.pushtask_by_address(argv[0]) # by address, any cluster
+            # print tasks
+            elif argv[0] == 'all':
+                self.print_all_tasks() # all tasks, all clusters
+            else:
+                self.print_tasks_by_cluster_name(argv[0]) # all tasks, specified cluster
+        elif len(argv) == 2:
+            # push task
+            self.pushtask_by_id(argv[0], argv[1]) # by id, specified cluster
+        else:
+            print('parse error')
+            print_usage(self.usage_msg)
+
+class PrevTask(gdb.Command):
+    """Switch back to previous task on the stack"""
+    usage_msg = 'prevtask <task_address>'
+
+    def __init__(self):
+        super(PrevTask, self).__init__('prevtask', gdb.COMMAND_USER)
+
+    def invoke(self, arg, from_tty):
+        """
+        @arg: str
+        @from_tty: bool
+        """
+        global STACK
+        if len(STACK) != 0:
+            # must be at frame 0 to set pc register
+            gdb.execute('select-frame 0')
+
+            # pop stack
+            stack_info = STACK.pop()
+            pc = get_addr(stack_info.pc)
+            sp = stack_info.sp
+            fp = stack_info.fp
+
+            # pop sp, fp, pc from global stack
+            gdb.execute('set $pc = {}'.format(pc))
+            gdb.execute('set $rbp = {}'.format(fp))
+            gdb.execute('set $sp = {}'.format(sp))
+
+            # must be at C++ frame to access C++ vars
+            gdb.execute('frame 1')
+        else:
+            print('empty stack')
+
+class ResetOriginFrame(gdb.Command):
+    """Reset to the origin frame prior to continue execution again"""
+    usage_msg = 'resetOriginFrame'
+    def __init__(self):
+        super(ResetOriginFrame, self).__init__('reset', gdb.COMMAND_USER)
+
+    def invoke(self, arg, from_tty):
+        """
+        @arg: str
+        @from_tty: bool
+        """
+        global STACK
+        if len(STACK) != 0:
+            stack_info = STACK.pop(0)
+            STACK.clear()
+            pc = get_addr(stack_info.pc)
+            sp = stack_info.sp
+            fp = stack_info.fp
+
+            # pop sp, fp, pc from global stack
+            gdb.execute('set $pc = {}'.format(pc))
+            gdb.execute('set $rbp = {}'.format(fp))
+            gdb.execute('set $sp = {}'.format(sp))
+
+            # must be at C++ frame to access C++ vars
+            gdb.execute('frame 1')
+        #else:
+            #print('reset: empty stack') #probably does not have to print msg
+
+Clusters()
+ClusterProcessors()
+PrevTask()
+ResetOriginFrame()
+Task()
+
+# Local Variables: #
+# mode: Python #
+# End: #
Index: doc/theses/lynn_tran_SE499/SE499-master/utils.cpp
===================================================================
--- doc/theses/lynn_tran_SE499/SE499-master/utils.cpp	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ doc/theses/lynn_tran_SE499/SE499-master/utils.cpp	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,38 @@
+#include <string>
+
+_Task T {
+    std::string name;
+    void a(int param) {
+        int x = 3;
+        std::string y = "example";
+        while(1);
+    }
+    void main() {
+        a(5);
+    }
+  public:
+    T( const int tid) {
+        name = "T" + std::to_string(tid);
+        setName( name.c_str() );
+    }
+};
+
+T* global_ptr_S;
+uCluster* global_cluster;
+
+int main() {
+    uProcessor p[3];
+    const int n = 10;
+    T* tasks[n];
+    uCluster fred( "fred"  );
+    global_cluster = &fred;
+
+    for (int i = 0; i < n; i += 1) {
+        tasks[i] = new T(i);
+        global_ptr_S = tasks[1];
+    }
+
+    for (int i = 0; i < n; i += 1) {
+        delete tasks[i];
+    }
+} // main
Index: doc/theses/lynn_tran_SE499/Thesis.cls
===================================================================
--- doc/theses/lynn_tran_SE499/Thesis.cls	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ doc/theses/lynn_tran_SE499/Thesis.cls	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,419 @@
+%%
+%% This is file `Thesis.cls', based on 'ECSthesis.cls', by Steve R. Gunn
+%% generated with the docstrip utility.
+%%
+%% Created by Steve R. Gunn, modified by Sunil Patel: www.sunilpatel.co.uk
+\NeedsTeXFormat{LaTeX2e}[1996/12/01]
+\ProvidesClass{Thesis}
+              [2007/22/02 v1.0
+   LaTeX document class]
+\def\baseclass{book}
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{\baseclass}}
+\def\@checkoptions#1#2{
+  \edef\@curroptions{\@ptionlist{\@currname.\@currext}}
+  \@tempswafalse
+  \@tfor\@this:=#2\do{
+    \@expandtwoargs\in@{,\@this,}{,\@curroptions,}
+    \ifin@ \@tempswatrue \@break@tfor \fi}
+  \let\@this\@empty
+  \if@tempswa \else \PassOptionsToClass{#1}{\baseclass}\fi
+}
+\@checkoptions{11pt}{{10pt}{11pt}{12pt}}
+\PassOptionsToClass{legalpaper}{\baseclass}
+\ProcessOptions\relax
+\LoadClass{\baseclass}
+\newcommand\bhrule{\typeout{------------------------------------------------------------------------------}}
+
+\newcommand\Declaration[1]{
+\btypeout{Declaration of Authorship}
+\addtotoc{Declaration of Authorship}
+\thispagestyle{plain}
+\null\vfil
+%\vskip 60\p@
+\begin{center}{\huge\bf Declaration of Authorship\par}\end{center}
+%\vskip 60\p@
+{\normalsize #1}
+\vfil\vfil\null
+%\cleardoublepage
+}
+\newcommand\btypeout[1]{\bhrule\typeout{\space #1}\bhrule}
+\def\today{\ifcase\month\or
+  January\or February\or March\or April\or May\or June\or
+  July\or August\or September\or October\or November\or December\fi
+  \space \number\year}
+\usepackage{setspace}
+%\onehalfspacing
+% TODO: please turn this back on
+\doublespacing
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{2.0ex plus0.5ex minus0.2ex}
+\iffalse
+\usepackage{vmargin}
+\setmarginsrb           { 1.5in}  % left margin
+                        { 0.6in}  % top margin
+                        { 1.0in}  % right margin
+                        { 0.8in}  % bottom margin
+                        {  20pt}  % head height
+                        {0.25in}  % head sep
+                        {   9pt}  % foot height
+                        { 0.3in}  % foot sep
+\fi
+\raggedbottom
+\setlength{\topskip}{1\topskip \@plus 5\p@}
+\doublehyphendemerits=10000       % No consecutive line hyphens.
+\brokenpenalty=10000              % No broken words across columns/pages.
+\widowpenalty=9999                % Almost no widows at bottom of page.
+\clubpenalty=9999                 % Almost no orphans at top of page.
+\interfootnotelinepenalty=9999    % Almost never break footnotes.
+\usepackage{geometry}
+\geometry{
+      letterpaper,
+        left=1.0in,top=0.5in,right=1.0in,bottom=0.5in,footskip=1cm,
+          headheight=20pt,headsep=0.25in,%footheight=9pt,
+            includeheadfoot
+}
+\usepackage{fancyhdr}
+\lhead[\rm\thepage]{\fancyplain{}{\sl{\rightmark}}}
+\rhead[\fancyplain{}{\sl{\leftmark}}]{\rm\thepage}
+\chead{}\lfoot{}\rfoot{}\cfoot{}
+\pagestyle{fancy}
+\renewcommand{\chaptermark}[1]{\btypeout{\thechapter\space #1}\markboth{\@chapapp\ \thechapter\ #1}{\@chapapp\ \thechapter\ #1}}
+\renewcommand{\sectionmark}[1]{}
+\renewcommand{\subsectionmark}[1]{}
+\def\cleardoublepage{\clearpage\if@twoside \ifodd\c@page\else
+\hbox{}
+\thispagestyle{empty}
+\newpage
+\if@twocolumn\hbox{}\newpage\fi\fi\fi}
+\usepackage{amsmath,amsfonts,amssymb,amscd,amsthm,xspace}
+\theoremstyle{plain}
+\newtheorem{example}{Example}[chapter]
+\newtheorem{theorem}{Theorem}[chapter]
+\newtheorem{corollary}[theorem]{Corollary}
+\newtheorem{lemma}[theorem]{Lemma}
+\newtheorem{proposition}[theorem]{Proposition}
+\newtheorem{axiom}[theorem]{Axiom}
+\theoremstyle{definition}
+\newtheorem{definition}[theorem]{Definition}
+\theoremstyle{remark}
+\newtheorem{remark}[theorem]{Remark}
+\usepackage[centerlast,small,sc]{caption}
+\setlength{\captionmargin}{20pt}
+\newcommand{\fref}[1]{Figure~\ref{#1}}
+\newcommand{\tref}[1]{Table~\ref{#1}}
+\newcommand{\eref}[1]{Equation~\ref{#1}}
+\newcommand{\cref}[1]{Chapter~\ref{#1}}
+\newcommand{\sref}[1]{Section~\ref{#1}}
+\newcommand{\aref}[1]{Appendix~\ref{#1}}
+\renewcommand{\topfraction}{0.85}
+\renewcommand{\bottomfraction}{.85}
+\renewcommand{\textfraction}{0.1}
+\renewcommand{\dbltopfraction}{.85}
+\renewcommand{\floatpagefraction}{0.75}
+\renewcommand{\dblfloatpagefraction}{.75}
+\setcounter{topnumber}{9}
+\setcounter{bottomnumber}{9}
+\setcounter{totalnumber}{20}
+\setcounter{dbltopnumber}{9}
+\usepackage{graphicx}
+\usepackage{epstopdf}
+\usepackage[scriptsize]{subfigure}
+\usepackage{booktabs}
+\usepackage{rotating}
+\usepackage{listings}
+\usepackage{lstpatch}
+\lstset{captionpos=b,
+        frame=tb,
+        basicstyle=\scriptsize\ttfamily,
+        showstringspaces=false,
+        keepspaces=true}
+\lstset{escapeinside={<@}{@>}}
+\lstdefinestyle{matlab} {
+        language=Matlab,
+        keywordstyle=\color{blue},
+        commentstyle=\color[rgb]{0.13,0.55,0.13}\em,
+        stringstyle=\color[rgb]{0.7,0,0} }
+\usepackage[pdfpagemode={UseOutlines},bookmarks=true,bookmarksopen=true,
+   bookmarksopenlevel=0,bookmarksnumbered=true,hypertexnames=false,
+   colorlinks,linkcolor={blue},citecolor={blue},urlcolor={red},
+   pdfstartview={FitV},unicode,breaklinks=true]{hyperref}
+\pdfstringdefDisableCommands{
+   \let\\\space
+}
+\lstdefinestyle{C++nokeyword} {
+        language=C++,
+        basicstyle=\linespread{1}\ttfamily,
+        %numbers=left,
+        stepnumber=1,
+        firstnumber=1,
+        %keywordstyle=\color{blue}\ttfamily,
+        stringstyle=\color{red}\ttfamily,
+        commentstyle=\color{ForestGreen}\ttfamily,
+}
+\lstdefinestyle{C++} {
+        language=C++,
+        basicstyle=\linespread{1}\ttfamily,
+        %numbers=left,
+        stepnumber=1,
+        firstnumber=1,
+        keywordstyle=\color{blue}\ttfamily,
+        stringstyle=\color{red}\ttfamily,
+        commentstyle=\color{ForestGreen}\ttfamily,
+}
+\lstdefinestyle{Python} {
+        language=Python,
+        basicstyle=\linespread{1}\ttfamily,
+        %numbers=left,
+        stepnumber=1,
+        firstnumber=1,
+        keywordstyle=\color{blue}\ttfamily,
+        stringstyle=\color{red}\ttfamily,
+        commentstyle=\color{ForestGreen}\ttfamily,
+}
+
+\newcommand*{\supervisor}[1]{\def\supname{#1}}
+\newcommand*{\emails}[1]{\def\supname{#1}}
+\newcommand*{\examiner}[1]{\def\examname{#1}}
+\newcommand*{\degree}[1]{\def\degreename{#1}}
+\newcommand*{\authors}[1]{\def\authornames{#1}}
+\newcommand*{\addresses}[1]{\def\addressnames{#1}}
+\newcommand*{\university}[1]{\def\univname{#1}}
+\newcommand*{\UNIVERSITY}[1]{\def\UNIVNAME{#1}}
+\newcommand*{\department}[1]{\def\deptname{#1}}
+\newcommand*{\DEPARTMENT}[1]{\def\DEPTNAME{#1}}
+\newcommand*{\group}[1]{\def\groupname{#1}}
+\newcommand*{\GROUP}[1]{\def\GROUPNAME{#1}}
+\newcommand*{\faculty}[1]{\def\facname{#1}}
+\newcommand*{\FACULTY}[1]{\def\FACNAME{#1}}
+\newcommand*{\subject}[1]{\def\subjectname{#1}}
+\newcommand*{\keywords}[1]{\def\keywordnames{#1}}
+\supervisor  {}
+\emails  {tmltran@uwaterloo.ca}
+\examiner    {}
+\degree      {}
+\authors     {}
+\university  {\texorpdfstring{\href{University Web Site URL Here (include http://)}
+                {University Name}}
+                {University Name}}
+\UNIVERSITY  {\texorpdfstring{\href{https://www.uwaterloo.ca}
+                {UNIVERSITY OF WATERLOO}}
+                {UNIVERSITY OF WATERLOO}}
+\department  {\texorpdfstring{\href{Department or School Web Site URL Here (include http://)}
+                {Software Engineering Department}}
+                {Software Engineering Department}}
+\DEPARTMENT  {\texorpdfstring{\href{Department or School Web Site URL Here (include http://)}
+                {SOFTWARE ENGINEERING DEPARTMENT}}
+                {SOFTWARE ENGINEERING DEPARTMENT}}
+\group       {\texorpdfstring{\href{Research Group Web Site URL Here (include http://)}
+                {Research Group Name}}
+                {Research Group Name}}
+\GROUP       {\texorpdfstring{\href{Research Group Web Site URL Here (include http://)}
+                {RESEARCH GROUP NAME (IN BLOCK CAPITALS)}}
+                {RESEARCH GROUP NAME (IN BLOCK CAPITALS)}}
+\faculty     {\texorpdfstring{\href{Faculty Web Site URL Here (include http://)}
+                {Faculty of Mathematics and Faculty of Engineering}}
+                {Faculty of Mathematics and Faculty of Engineering}}
+\FACULTY     {\texorpdfstring{\href{Faculty Web Site URL Here (include http://)}
+                {FACULTY NAME (IN BLOCK CAPITALS)}}
+                {FACULTY NAME (IN BLOCK CAPITALS)}}
+\addresses   {}
+\subject     {}
+\keywords    {}
+\renewcommand\maketitle{
+  \btypeout{Title page}
+  \hypersetup{pdftitle={\@title}}
+  \hypersetup{pdfsubject=\subjectname}
+  \hypersetup{pdfauthor=\authornames}
+  \hypersetup{pdfkeywords=\keywordnames}
+  \thispagestyle{empty}
+  \begin{titlepage}
+    \let\footnotesize\small
+    \let\footnoterule\relax
+    \let \footnote \thanks
+    \setcounter{footnote}{0}
+    \null\vfil
+    \vskip 60\p@
+    \begin{center}
+      \setlength{\parskip}{0pt}
+      {\large\textbf{\UNIVNAME}\par}
+      \vfill
+      {\huge \bf \@title \par}
+      \vfill
+      {\LARGE by \par}
+      \smallskip
+      {\LARGE \authornames \par}
+      \vfill
+      \bigskip
+      \bigskip
+      {\large in the \par}
+      {\large \facname \par}
+      {\large \deptname \par}
+      \bigskip
+      \bigskip
+      \bigskip
+      {\Large \@date \par}
+      \bigskip
+    \end{center}
+    \par
+    \@thanks
+    \vfil\null
+  \end{titlepage}
+  \setcounter{footnote}{0}%
+  \global\let\thanks\relax
+  \global\let\maketitle\relax
+  \global\let\@thanks\@empty
+  \global\let\@author\@empty
+  \global\let\@date\@empty
+  \global\let\@title\@empty
+  \global\let\title\relax
+  \global\let\author\relax
+  \global\let\date\relax
+  \global\let\and\relax
+  \cleardoublepage
+}
+\newenvironment{preface}
+{
+  \btypeout{Preface}
+  \thispagestyle{empty}
+  \null\vfil
+  \begin{center}
+    \setlength{\parskip}{0pt}
+    %{\normalsize \UNIVNAME \par}
+    %\bigskip
+    {\huge{\textit{Preface}} \par}
+    %\bigskip
+    %{\normalsize \facname \par}
+    %{\normalsize \deptname \par}
+    %\bigskip
+    %{\normalsize\bf \@title \par}
+    %\medskip
+    %{\normalsize by \authornames \par}
+    %\bigskip
+  \end{center}
+}
+{
+  \vfil\vfil\vfil\null
+  \cleardoublepage
+}
+\addtocounter{secnumdepth}{1}
+\setcounter{tocdepth}{6}
+\newcounter{dummy}
+\newcommand\addtotoc[1]{
+\refstepcounter{dummy}
+\addcontentsline{toc}{chapter}{#1}}
+\renewcommand\tableofcontents{
+\btypeout{Table of Contents}
+\begin{spacing}{1}{
+    \setlength{\parskip}{1pt}
+    \if@twocolumn
+      \@restonecoltrue\onecolumn
+    \else
+      \@restonecolfalse
+    \fi
+    \chapter*{\contentsname
+        \@mkboth{
+           \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}
+    \@starttoc{toc}
+    \if@restonecol\twocolumn\fi
+   \cleardoublepage
+}\end{spacing}
+}
+\renewcommand\listoffigures{
+\btypeout{List of Figures}
+\addtotoc{List of Figures}
+\begin{spacing}{1}{
+    \setlength{\parskip}{1pt}
+    \if@twocolumn
+      \@restonecoltrue\onecolumn
+    \else
+      \@restonecolfalse
+    \fi
+    \chapter*{\listfigurename
+      \@mkboth{\MakeUppercase\listfigurename}
+              {\MakeUppercase\listfigurename}}
+    \@starttoc{lof}
+    \if@restonecol\twocolumn\fi
+    \cleardoublepage
+}\end{spacing}
+}
+\renewcommand\listoftables{
+\btypeout{List of Tables}
+\addtotoc{List of Tables}
+\begin{spacing}{1}{
+    \setlength{\parskip}{1pt}
+    \if@twocolumn
+      \@restonecoltrue\onecolumn
+    \else
+      \@restonecolfalse
+    \fi
+    \chapter*{\listtablename
+      \@mkboth{
+          \MakeUppercase\listtablename}{\MakeUppercase\listtablename}}
+    \@starttoc{lot}
+    \if@restonecol\twocolumn\fi
+    \cleardoublepage
+}\end{spacing}
+}
+\newcommand\listsymbolname{Abbreviations}
+\usepackage{longtable}
+\newcommand\listofsymbols[2]{
+\btypeout{\listsymbolname}
+\addtotoc{\listsymbolname}
+    \chapter*{\listsymbolname
+      \@mkboth{
+          \MakeUppercase\listsymbolname}{\MakeUppercase\listsymbolname}}
+\begin{longtable}[c]{#1}#2\end{longtable}\par
+    \cleardoublepage
+}
+\newcommand\listconstants{Physical Constants}
+\usepackage{longtable}
+\newcommand\listofconstants[2]{
+\btypeout{\listconstants}
+\addtotoc{\listconstants}
+    \chapter*{\listconstants
+      \@mkboth{
+          \MakeUppercase\listconstants}{\MakeUppercase\listconstants}}
+\begin{longtable}[c]{#1}#2\end{longtable}\par
+    \cleardoublepage
+}
+\newcommand\listnomenclature{Symbols}
+\usepackage{longtable}
+\newcommand\listofnomenclature[2]{
+\btypeout{\listnomenclature}
+\addtotoc{\listnomenclature}
+    \chapter*{\listnomenclature
+      \@mkboth{
+          \MakeUppercase\listnomenclature}{\MakeUppercase\listnomenclature}}
+\begin{longtable}[c]{#1}#2\end{longtable}\par
+    \cleardoublepage
+}
+\newcommand\acknowledgements[1]{
+\btypeout{Acknowledgements}
+\addtotoc{Acknowledgements}
+\thispagestyle{plain}
+\begin{center}{\huge{\textit{Acknowledgements}} \par}\end{center}
+{\normalsize #1}
+\vfil\vfil\null
+
+}
+\newcommand\dedicatory[1]{
+\btypeout{Dedicatory}
+\thispagestyle{plain}
+\null\vfil
+\vskip 60\p@
+\begin{center}{\Large \sl #1}\end{center}
+\vfil\null
+\cleardoublepage
+}
+\renewcommand\backmatter{
+  \if@openright
+    \cleardoublepage
+  \else
+    \clearpage
+  \fi
+  \addtotoc{\bibname}
+  \btypeout{\bibname}
+  \@mainmatterfalse}
+\endinput
+%%
+%% End of file `Thesis.cls'.
Index: doc/theses/lynn_tran_SE499/lstpatch.sty
===================================================================
--- doc/theses/lynn_tran_SE499/lstpatch.sty	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ doc/theses/lynn_tran_SE499/lstpatch.sty	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,1 @@
+%%%% This is file `lstpatch.sty', generated manually.%%%% (w)(c) 2004 Carsten Heinz%%%% This file may be distributed under the terms of the LaTeX Project Public%% License from CTAN archives in directory  macros/latex/base/lppl.txt.%% Either version 1.0 or, at your option, any later version.%%%% Send comments and ideas on the package, error reports and additional%% programming languages to <cheinz@gmx.de>.%%%% This patch file will remove the following bugs from the listings package.%% Each item contains the bug finder with date of report and first bug fix%% version, a short description of the problem, and the reason for the bug%% in parenthesis.%%%%  1) Frank Atanassow, 2004/10/07, 1.3b%%%%     space after mathescape is not preserved%%     (\lst@newlines>0)%%%%  2) Benjamin Lings, 2004/10/15, 1.3b (2004/10/17)%%%%     \usepackage{xy,listings} yields:%%     "Forbidden control sequence found while scanning use of \lst@lExtend"%%     (xy-pic correctly resets catcode of ^^L (to active), which is \outer)%%%%%% The following features are added to the base package.%%%% 1.3a (2004/09/07)%%%%  a) H I G H L Y   E X P E R I M E N T A L%%%%     Use the options%%        rangeprefix=<prefix for begin and end of range>%%        rangesuffix=<suffix for begin and end of range>%%%%        rangebeginprefix=<prefix for begin of range>%%        rangebeginsuffix=<suffix for begin of range>%%%%        rangeendprefix=<prefix for end of range>%%        rangeendsuffix=<suffix for end of range>%%%%        includerangemarker=true|false%%     together with%%        firstline=<begin marker>%%        lastline=<end marker>%%     or%%        linerange={<begin marker 1>-<end marker 1>,%%                   <begin marker 2>-<end marker 2>, ...}%%     The according markers in the source code are%%           <prefix><marker><suffix>%%     for begin respectively end of range. Moreover, one can use%%        includerangemarker=true|false%%     to show or hide the range markers in the output.%%%% 1.3b (2004/10/17)%%%%  b) multicols=<number> (requires loaded multicol package)%%%%\lst@CheckVersion{1.3}{\typeout{^^J%    ***^^J%    *** This is a patch for listings 1.3, but you're using^^J%    *** version \lst@version.^^J%    ***^^J    *** Patch file not loaded.^^J%    ***^^J}%    \endinput}\def\fileversion{1.3b}\def\filedate{2004/10/17}\ProvidesFile{lstpatch.sty}[\filedate\space\fileversion\space (Carsten Heinz)]%% 0) Insert % after #1.\def\@@xbitor #1{\@tempcntb \count#1%   \ifnum \@tempcnta =\z@   \else     \divide\@tempcntb\@tempcnta     \ifodd\@tempcntb \@testtrue\fi   \fi}%% 1) Reset \lst@newlines at end of escape.\def\lstpatch@escape{%\gdef\lst@Escape##1##2##3##4{%    \lst@CArgX ##1\relax\lst@CDefX        {}%        {\lst@ifdropinput\else         \lst@TrackNewLines\lst@OutputLostSpace \lst@XPrintToken         \lst@InterruptModes         \lst@EnterMode{\lst@TeXmode}{\lst@modetrue}%         \ifx\^^M##2%             \lst@CArg ##2\relax\lst@ActiveCDefX                 {}%                 {\lst@escapeend ##4\lst@LeaveAllModes\lst@ReenterModes}%                 {\lst@MProcessListing}%         \else             \lst@CArg ##2\relax\lst@ActiveCDefX                 {}%                 {\lst@escapeend ##4\lst@LeaveAllModes\lst@ReenterModes                  \lst@newlines\z@ \lst@whitespacefalse}%                 {}%         \fi         ##3\lst@escapebegin         \fi}%        {}}%}%% 2) Deactivate \outer definition of ^^L temporarily (inside and outside%    of \lst@ScanChars) and restore \catcode at end of package.\begingroup \catcode12=\active\let^^L\@empty\gdef\lst@ScanChars{%  \let\lsts@ssL^^L%  \def^^L{\par}%    \lst@GetChars\lst@RestoreOrigCatcodes\@ne {128}%  \let^^L\lsts@ssL    \lst@GetChars\lst@RestoreOrigExtendedCatcodes{128}{256}}\endgroup\lst@lAddTo\lst@RestoreCatcodes{\catcode12\active}%% a) Let's start with the options:\lst@Key{rangeprefix}\relax{\def\lst@rangebeginprefix{#1}%                            \def\lst@rangeendprefix{#1}}\lst@Key{rangesuffix}\relax{\def\lst@rangebeginsuffix{#1}%                            \def\lst@rangeendsuffix{#1}}\lst@Key{rangebeginprefix}{}{\def\lst@rangebeginprefix{#1}}\lst@Key{rangebeginsuffix}{}{\def\lst@rangebeginsuffix{#1}}\lst@Key{rangeendprefix}{}{\def\lst@rangeendprefix{#1}}\lst@Key{rangeendsuffix}{}{\def\lst@rangeendsuffix{#1}}\lst@Key{includerangemarker}{true}[t]{\lstKV@SetIf{#1}\lst@ifincluderangemarker}%%    The key is a redefinition of \lst@GLI@ checking for numbers.\def\lst@GLI@#1-#2-#3\@nil{%    \lst@IfNumber{#1}%    {\ifx\@empty#1\@empty         \let\lst@firstline\@ne     \else         \def\lst@firstline{#1\relax}%     \fi     \ifx\@empty#3\@empty         \def\lst@lastline{9999999\relax}%     \else         \ifx\@empty#2\@empty             \let\lst@lastline\lst@firstline         \else             \def\lst@lastline{#2\relax}%         \fi     \fi}%%%    If we've found a general marker, we set firstline and lastline to 9999999.%    This prevents (almost) anything to be printed for now.    {\def\lst@firstline{9999999\relax}%     \let\lst@lastline\lst@firstline%%    We add the prefixes and suffixes to the markers.     \let\lst@rangebegin\lst@rangebeginprefix     \lst@AddTo\lst@rangebegin{#1}\lst@Extend\lst@rangebegin\lst@rangebeginsuffix     \ifx\@empty#3\@empty         \let\lst@rangeend\lst@rangeendprefix         \lst@AddTo\lst@rangeend{#1}\lst@Extend\lst@rangeend\lst@rangeendsuffix     \else         \ifx\@empty#2\@empty             \let\lst@rangeend\@empty         \else             \let\lst@rangeend\lst@rangeendprefix             \lst@AddTo\lst@rangeend{#2}\lst@Extend\lst@rangeend\lst@rangeendsuffix         \fi     \fi%    The following definition will be executed in the SelectCharTable hook%    and here right now if we are already processing a listing.     \global\def\lst@DefRange{\expandafter\lst@CArgX\lst@rangebegin\relax\lst@DefRangeB}%     \ifnum\lst@mode=\lst@Pmode \expandafter\lst@DefRange \fi}}%    \lst@DefRange is not inserted via a hook anymore. Instead it is now called%    directly from \lst@SelectCharTable. This was necessary to get rid of an%    interference with the escape-to-LaTeX-feature. The bug was reported by%    \lsthelper{Michael~Bachmann}{2004/07/21}{Keine label-Referenzierung%    m\"oglich...}. Another chance is due to the same bug: \lst@DefRange is%    redefined globally when the begin of code is found, see below. The bug was%    reported by \lsthelper{Tobias~Rapp}{2004/04/06}{undetected end of range if%    listing crosses page break} \lsthelper{Markus~Luisser}{2004/08/13}{Bug mit%    'linerangemarker' in umgebrochenen listings}%\lst@AddToHook{SelectCharTable}{\lst@DefRange}\lst@AddToHookExe{DeInit}{\global\let\lst@DefRange\@empty}%%    Actually defining the marker (via \lst@GLI@, \lst@DefRange, \lst@CArgX as%    seen above) is similar to \lst@DefDelimB---except that we unfold the first%    parameter and use different <execute>, <pre>, and <post> statements.\def\lst@DefRangeB#1#2{\lst@DefRangeB@#1#2}\def\lst@DefRangeB@#1#2#3#4{%    \lst@CDef{#1{#2}{#3}}#4{}%    {\lst@ifincluderangemarker         \lst@LeaveMode         \let#1#4%         \lst@DefRangeEnd         \lst@InitLstNumber     \else         \@tempcnta\lst@lineno \advance\@tempcnta\@ne         \edef\lst@firstline{\the\@tempcnta\relax}%         \gdef\lst@OnceAtEOL{\let#1#4\lst@DefRangeEnd}%         \lst@InitLstNumber     \fi	 \global\let\lst@DefRange\lst@DefRangeEnd     \lst@CArgEmpty}%    \@empty}%% Modify labels and define |\lst@InitLstNumber| used above.% \lsthelper{Omair-Inam~Abdul-Matin}{2004/05/10}{experimental linerange% feature does not work with firstnumber}\def\lstpatch@labels{%\gdef\lst@SetFirstNumber{%    \ifx\lst@firstnumber\@undefined        \@tempcnta 0\csname\@lst no@\lst@intname\endcsname\relax        \ifnum\@tempcnta=\z@ \else            \lst@nololtrue            \advance\@tempcnta\lst@advancenumber            \edef\lst@firstnumber{\the\@tempcnta\relax}%        \fi    \fi}%}\lst@AddToAtTop\lsthk@PreInit    {\ifx\lst@firstnumber\@undefined         \def\lst@firstnumber{\lst@lineno}%     \fi}\def\lst@InitLstNumber{%     \global\c@lstnumber\lst@firstnumber     \global\advance\c@lstnumber\lst@advancenumber     \global\advance\c@lstnumber-\lst@advancelstnum     \ifx \lst@firstnumber\c@lstnumber         \global\advance\c@lstnumber-\lst@advancelstnum     \fi}%%    The end-marker is defined if and only if it's not empty. The definition is%    similar to \lst@DefDelimE---with the above exceptions and except that we%    define the re-entry point \lst@DefRangeE@@ as it is defined in the new%    version of \lst@MProcessListing above.\def\lst@DefRangeEnd{%    \ifx\lst@rangeend\@empty\else        \expandafter\lst@CArgX\lst@rangeend\relax\lst@DefRangeE    \fi}\def\lst@DefRangeE#1#2{\lst@DefRangeE@#1#2}\def\lst@DefRangeE@#1#2#3#4{%    \lst@CDef{#1#2{#3}}#4{}%    {\let#1#4%     \edef\lst@lastline{\the\lst@lineno\relax}%     \lst@DefRangeE@@}%    \@empty}\def\lst@DefRangeE@@#1\@empty{%    \lst@ifincluderangemarker        #1\lst@XPrintToken    \fi    \lst@LeaveModeToPmode    \lst@BeginDropInput{\lst@Pmode}}%\def\lst@LeaveModeToPmode{%    \ifnum\lst@mode=\lst@Pmode        \expandafter\lsthk@EndGroup    \else        \expandafter\egroup\expandafter\lst@LeaveModeToPmode    \fi}%%    Eventually we shouldn't forget to install \lst@OnceAtEOL, which must%    also be called in \lst@MSkipToFirst.\lst@AddToHook{EOL}{\lst@OnceAtEOL\global\let\lst@OnceAtEOL\@empty}\gdef\lst@OnceAtEOL{}% Init\def\lst@MSkipToFirst{%    \global\advance\lst@lineno\@ne    \ifnum \lst@lineno=\lst@firstline        \def\lst@next{\lst@LeaveMode \global\lst@newlines\z@        \lst@OnceAtEOL \global\let\lst@OnceAtEOL\@empty        \lst@InitLstNumber % Added to work with modified \lsthk@PreInit.        \lsthk@InitVarsBOL        \lst@BOLGobble}%        \expandafter\lst@next    \fi}\def\lst@SkipToFirst{%    \ifnum \lst@lineno<\lst@firstline        \def\lst@next{\lst@BeginDropInput\lst@Pmode        \lst@Let{13}\lst@MSkipToFirst        \lst@Let{10}\lst@MSkipToFirst}%        \expandafter\lst@next    \else        \expandafter\lst@BOLGobble    \fi}%%    Finally the service macro \lst@IfNumber:\def\lst@IfNumber#1{%    \ifx\@empty#1\@empty        \let\lst@next\@firstoftwo    \else        \lst@IfNumber@#1\@nil    \fi    \lst@next}\def\lst@IfNumber@#1#2\@nil{%    \let\lst@next\@secondoftwo    \ifnum`#1>47\relax \ifnum`#1>57\relax\else        \let\lst@next\@firstoftwo    \fi\fi}%% b) The following is known to fail with some keys.\lst@Key{multicols}{}{\@tempcnta=0#1\relax\def\lst@multicols{#1}}\def\lst@Init#1{%    \begingroup    \ifx\lst@float\relax\else        \edef\@tempa{\noexpand\lst@beginfloat{lstlisting}[\lst@float]}%        \expandafter\@tempa    \fi% chmod begin    \ifx\lst@multicols\@empty\else        \edef\lst@next{\noexpand\multicols{\lst@multicols}}        \expandafter\lst@next    \fi% chmod end    \ifhmode\ifinner \lst@boxtrue \fi\fi    \lst@ifbox        \lsthk@BoxUnsafe        \hbox to\z@\bgroup             $\if t\lst@boxpos \vtop        \else \if b\lst@boxpos \vbox        \else \vcenter \fi\fi        \bgroup \par\noindent    \else        \lst@ifdisplaystyle            \lst@EveryDisplay            \par\penalty-50\relax            \vspace\lst@aboveskip        \fi    \fi    \normalbaselines    \abovecaptionskip\lst@abovecaption\relax    \belowcaptionskip\lst@belowcaption\relax    \lst@MakeCaption t%    \lsthk@PreInit \lsthk@Init    \lst@ifdisplaystyle        \global\let\lst@ltxlabel\@empty        \if@inlabel            \lst@ifresetmargins                \leavevmode            \else                \xdef\lst@ltxlabel{\the\everypar}%                \lst@AddTo\lst@ltxlabel{%                    \global\let\lst@ltxlabel\@empty                    \everypar{\lsthk@EveryLine\lsthk@EveryPar}}%            \fi        \fi        \everypar\expandafter{\lst@ltxlabel                              \lsthk@EveryLine\lsthk@EveryPar}%    \else        \everypar{}\let\lst@NewLine\@empty    \fi    \lsthk@InitVars \lsthk@InitVarsBOL    \lst@Let{13}\lst@MProcessListing    \let\lst@Backslash#1%    \lst@EnterMode{\lst@Pmode}{\lst@SelectCharTable}%    \lst@InitFinalize}\def\lst@DeInit{%    \lst@XPrintToken \lst@EOLUpdate    \global\advance\lst@newlines\m@ne    \lst@ifshowlines        \lst@DoNewLines    \else        \setbox\@tempboxa\vbox{\lst@DoNewLines}%    \fi    \lst@ifdisplaystyle \par\removelastskip \fi    \lsthk@ExitVars\everypar{}\lsthk@DeInit\normalbaselines\normalcolor    \lst@MakeCaption b%    \lst@ifbox        \egroup $\hss \egroup        \vrule\@width\lst@maxwidth\@height\z@\@depth\z@    \else        \lst@ifdisplaystyle            \par\penalty-50\vspace\lst@belowskip        \fi    \fi% chmod begin    \ifx\lst@multicols\@empty\else        \def\lst@next{\global\let\@checkend\@gobble                      \endmulticols                      \global\let\@checkend\lst@@checkend}        \expandafter\lst@next    \fi% chmod end    \ifx\lst@float\relax\else        \expandafter\lst@endfloat    \fi    \endgroup}\let\lst@@checkend\@checkend%%\endinput%%%% End of file `lstpatch.sty'.
Index: doc/theses/lynn_tran_SE499/se499-report.tex
===================================================================
--- doc/theses/lynn_tran_SE499/se499-report.tex	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ doc/theses/lynn_tran_SE499/se499-report.tex	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,204 @@
+% https://github.com/lynnt/SE499-report
+
+%% ----------------------------------------------------------------
+%% Thesis.tex -- MAIN FILE (the one that you compile with LaTeX)
+%% ---------------------------------------------------------------- 
+
+% Set up the document
+\documentclass[legalpaper, 11pt, oneside]{Thesis}  % Use the "Thesis" style, based on the ECS Thesis style by Steve Gunn
+\graphicspath{Figures/}  % Location of the graphics files (set up for graphics to be in PDF format)
+
+% Include any extra LaTeX packages required
+\usepackage{times}
+\usepackage[square, numbers, comma, sort&compress]{natbib}  % Use the "Natbib" style for the references in the Bibliography
+\usepackage{verbatim}  % Needed for the "comment" environment to make LaTeX comments
+\usepackage{vector}  % Allows "\bvec{}" and "\buvec{}" for "blackboard" style bold vectors in maths
+\usepackage[pagewise]{lineno}
+\usepackage{listings}
+
+\usepackage{etoolbox} % for robustify
+\usepackage[dvipsnames]{xcolor}
+\usepackage{listings}
+\lstset{moredelim=**[is][\color{red}]{`}{`}}
+\hypersetup{urlcolor=blue, colorlinks=true}  % Colours hyperlinks in blue, but this can be distracting if there are many links.
+%\urlstyle{sf}
+%% ----------------------------------------------------------------
+\newcommand{\CFAIcon}{\textsf{C}\raisebox{\depth}{\rotatebox{180}{\textsf{A}}}\xspace} % Cforall symbolic name
+\newcommand{\CFA}{\protect\CFAIcon}		% safe for section/caption
+\newcommand{\CC}{\textrm{C}\kern-.1em\hbox{+\kern-.25em+}\xspace} % C++ symbolic name
+\newcommand{\uC}{$\mu$\CC}
+
+
+\begin{document}
+\frontmatter      % Begin Roman style (i, ii, iii, iv...) page numbering
+%\linenumbers    % TODO: remove this please
+% Set up the Title Page
+\title{GNU Debugger support for \uC and \CFA}
+\authors  {\texorpdfstring
+            {\href{tmltran@uwaterloo.ca}{Thi My Linh Tran}}
+            {Thi My Linh Tran}
+            }
+\emails{tmltran@uwaterloo.ca}
+\addresses  {\groupname\\\deptname\\\univname}  % Do not change this here, instead these must be set in the "Thesis.cls" file, please look through it instead
+\date       {\today}
+\subject    {}
+\keywords   {}
+\maketitle
+\setcounter{page}{2}
+%% ----------------------------------------------------------------
+
+\setstretch{1.3}  % It is better to have smaller font and larger line spacing than the other way round
+
+% Define the page headers using the FancyHdr package and set up for one-sided printing
+\fancyhead{}  % Clears all page headers and footers
+\rhead{\thepage}  % Sets the right side header to show the page number
+\lhead{}  % Clears the left side page header
+
+%  Reduce size of section titles
+\makeatletter
+\renewcommand\section{\@startsection{section}{1}{\z@}{-1.0ex \@plus -1ex \@minus -.2ex}{1.0ex \@plus .2ex}{\normalfont\large\bfseries}}
+\renewcommand\subsection{\@startsection{subsection}{2}{\z@}{-1.0ex \@plus -1ex \@minus -.2ex}{1.0ex \@plus .2ex}{\normalfont\normalsize\bfseries}}
+\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}{-1.0ex \@plus -1ex \@minus -.2ex}{1.0ex \@plus .2ex}{\normalfont\normalsize\bfseries}}
+\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}{-2.0ex \@plus -1ex \@minus -.2ex}{-1em}{\normalfont\normalsize\bfseries}}
+\makeatother
+
+\lstset{numberstyle=\scriptsize\sffamily}
+
+\pagestyle{fancy}  % Finally, use the "fancy" page style to implement the FancyHdr headers
+
+%% ----------------------------------------------------------------
+% The Abstract Page
+\addtotoc{Preface}  % Add the "Abstract" page entry to the Contents
+\preface{
+\addtocontents{toc}{\vspace{1em}}  % Add a gap in the Contents, for aesthetics
+
+The goal of this work is to add GNU Debugger support for the language \uC and \CFA. To
+achieve this goal for \uC, new extensions are written to provide additional
+support for high-level constructs that are unknown to the GNU Debugger. In addition to the work done for
+\uC, many hooks are added in the GNU Debugger to enable the addition of a \CFA
+demangler.
+
+This report assumes the reader has basic knowledge of compiler construction.
+Background knowledge about how the GNU Debugger works and specific features of \uC and
+\CFA
+are provided in the report.
+}
+
+\clearpage  % Abstract ended, start a new page
+%% ----------------------------------------------------------------
+
+\setstretch{1.3}  % Reset the line-spacing to 1.3 for body text (if it has changed)
+
+% The Acknowledgements page, for thanking everyone
+\acknowledgements{
+\addtocontents{toc}{\vspace{1em}}  % Add a gap in the Contents, for aesthetics
+
+I would like to thank Professor Peter Buhr and Thierry
+Delisle for their guidance throughout the development of this project. The
+GNU Debugger's internal manual \cite{Reference5} is used as a guide for the development of
+adding a demangler for \CFA, and \CFA's main page \cite{Reference13} for
+background knowledge and examples.
+}
+\clearpage  % End of the Acknowledgements
+%% ----------------------------------------------------------------
+
+\pagestyle{fancy}  %The page style headers have been "empty" all this time, now use the "fancy" headers as defined before to bring them back
+
+
+%% ----------------------------------------------------------------
+\lhead{\emph{Contents}}  % Set the left side page header to "Contents"
+\addcontentsline{toc}{chapter}{Listings}
+\tableofcontents  % Write out the Table of Contents
+
+%% ----------------------------------------------------------------
+%\lhead{\emph{List of Figures}}  % Set the left side page header to "List if Figures"
+%\listoffigures  % Write out the List of Figures
+
+%% ----------------------------------------------------------------
+%\lhead{\emph{List of Tables}}  % Set the left side page header to "List of Tables"
+%\listoftables  % Write out the List of Tables
+
+%% ----------------------------------------------------------------
+\lhead{\emph{List of Listings}}  % Set the left side page header to "List of Listings"
+\lstlistoflistings
+
+%% ----------------------------------------------------------------
+\setstretch{1.5}  % Set the line spacing to 1.5, this makes the following tables easier to read
+%\clearpage  % Start a new page
+%\lhead{\emph{Abbreviations}}  % Set the left side page header to "Abbreviations"
+%\listofsymbols{ll}  % Include a list of Abbreviations (a table of two columns)
+%{
+% \textbf{Acronym} & \textbf{W}hat (it) \textbf{S}tands \textbf{F}or \\
+%\textbf{LAH} & \textbf{L}ist \textbf{A}bbreviations \textbf{H}ere \\
+%\textbf{GDB} & GNU Debugger \\
+%\textbf{API} & Application Programming Interface \\
+%}
+
+%% ----------------------------------------------------------------
+\clearpage  % Start a new page
+%% ----------------------------------------------------------------
+% End of the pre-able, contents and lists of things
+% Begin the Dedication page
+
+\setstretch{1.3}  % Return the line spacing back to 1.3
+
+\addtocontents{toc}{\vspace{2em}}  % Add a gap in the Contents, for aesthetics
+
+
+%% ----------------------------------------------------------------
+\mainmatter	  % Begin normal, numeric (1,2,3...) page numbering
+\pagestyle{fancy}  % Return the page headers back to the "fancy" style
+
+% Include the chapters of the thesis, as separate files
+% Just uncomment the lines as you write the chapters
+
+\lhead{\emph{Introduction}}  % Set the left side page header to "Abbreviations"
+\input{Chapters/Introduction} % Introduction
+% Background
+\clearpage  % Start a new page
+\lhead{\emph{\uC}}  % Set the left side page header to "Abbreviations"
+\input{Chapters/uCPP}
+\clearpage  %Start a new page
+\lhead{\emph{GNU Debugger}}  % Set the left side page header to "Abbreviations"
+\input{Chapters/GDB}
+\clearpage  %Start a new page
+\lhead{\emph{\CFA}}  % Set the left side page header to "Abbreviations"
+\input{Chapters/CFA}
+\clearpage  %Start a new page
+
+% Real work done
+
+\lhead{\emph{GNU Debugger Extensions for \uC}}  % Set the left side page header to "Abbreviations"
+\input{Chapters/Extensions}
+\clearpage  %Start a new page
+\lhead{\emph{\CFA Demangler}}  % Set the left side page header to "Abbreviations"
+\input{Chapters/Demangler}
+\clearpage  %Start a new page
+
+\lhead{\emph{Conclusion}}  % Set the left side page header to "Abbreviations"
+\input{Chapters/Conclusion} % Conclusion
+
+%% ----------------------------------------------------------------
+% Now begin the Appendices, including them as separate files
+
+\addtocontents{toc}{\vspace{2em}} % Add a gap in the Contents, for aesthetics
+
+\appendix % Cue to tell LaTeX that the following 'chapters' are Appendices
+
+%\input{Appendices/AppendixA}	% Appendix Title
+
+%\input{Appendices/AppendixB} % Appendix Title
+
+%\input{Appendices/AppendixC} % Appendix Title
+
+\addtocontents{toc}{\vspace{2em}}  % Add a gap in the Contents, for aesthetics
+\backmatter
+
+%% ----------------------------------------------------------------
+\label{Bibliography}
+\lhead{\emph{Bibliography}}  % Change the left side page header to "Bibliography"
+\bibliographystyle{unsrtnat}  % Use the "unsrtnat" BibTeX style for formatting the Bibliography
+\bibliography{Bibliography}  % The references (bibliography) information are stored in the file named "Bibliography.bib"
+
+\end{document}  % The End
+%% ----------------------------------------------------------------
Index: doc/theses/lynn_tran_SE499/vector.sty
===================================================================
--- doc/theses/lynn_tran_SE499/vector.sty	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ doc/theses/lynn_tran_SE499/vector.sty	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,1 @@
+%%%% This is file `vector.sty',%% generated with the docstrip utility.%%%% The original source files were:%%%% vector.dtx  (with options: `package')%% %% Copyright (C) 1994 by Nick Efford%% %% This file is distributed in the hope that it will be useful,%% but WITHOUT ANY WARRANTY; without even the implied warranty of%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.%% \NeedsTeXFormat{LaTeX2e}\ProvidesPackage{vector}[1994/09/16 v1.0 vector macros for LaTeX2e (nde)]\RequirePackage{ifthen}\RequirePackage{calc}\newboolean{@wavy}\DeclareOption{wavy}{\setboolean{@wavy}{true}}\ProcessOptions\newcommand{\bvec}[1]{\ensuremath{\mathbf{#1}}}\newcommand{\buvec}[1]{\ensuremath{\mathbf{\hat{#1}}}}\newcommand{\svec}[1]{\ensuremath{\mathsf{#1}}}\newcommand{\suvec}[1]{\ensuremath{\mathsf{\hat{#1}}}}\ifthenelse{\boolean{@wavy}}{%  \PackageInfo{vector}{wavy underlining selected}  \newcommand{\undertilde}[1]{\mathord{\vtop{\ialign{##\crcr    $\hfil\displaystyle{#1}\hfil$\crcr\noalign{\kern1.5pt\nointerlineskip}    $\hfil\tilde{}\hfil$\crcr\noalign{\kern1.5pt}}}}}  \newcommand{\uvec}[1]{\ensuremath{\undertilde{#1}}}  \newcommand{\uuvec}[1]{\ensuremath{\hat{\undertilde{#1}}}}}{%  \newcommand{\uvec}[1]{\ensuremath{\underline{#1}}}  \newcommand{\uuvec}[1]{\ensuremath{\hat{\underline{#1}}}}}\def\first@element{1}\newcommand{\firstelement}[1]{\def\first@element{#1}}\newcommand{\irvec}[2][n]{\ensuremath{{#2}_{\first@element},\ldots,{#2}_{#1}}}\newcommand{\icvec}[2][n]{%  \begin{array}{c}    {#2}_{\first@element}\\ \vdots\\ {#2}_{#1}  \end{array}}\newcounter{vec@elem}\newcommand{\rvec}[3]{%  \ensuremath{%    \ifthenelse{#3 > #2}{%      \setcounter{vec@elem}{#2}      \whiledo{\value{vec@elem} < #3}%        {{#1}_{\thevec@elem}, \stepcounter{vec@elem}}%      {#1}_{#3}}{{#1}_{#2}}}}\newcommand{\cvec}[3]{%  \ifthenelse{#3 > #2}{%    \setcounter{vec@elem}{#2}    \begin{array}{c}      \whiledo{\value{vec@elem} < #3}%        {{#1}_{\thevec@elem} \\ \stepcounter{vec@elem}}%      {#1}_{#3}    \end{array}}{{#1}_{#2}}}\endinput%%%% End of file `vector.sty'.
Index: doc/user/user.tex
===================================================================
--- doc/user/user.tex	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ doc/user/user.tex	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -11,6 +11,6 @@
 %% Created On       : Wed Apr  6 14:53:29 2016
 %% Last Modified By : Peter A. Buhr
-%% Last Modified On : Wed Nov  7 17:00:49 2018
-%% Update Count     : 3399
+%% Last Modified On : Tue Dec 11 23:19:26 2018
+%% Update Count     : 3400
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
@@ -178,5 +178,5 @@
 int main( void ) {
 	int x = 0, y = 1, z = 2;
-	®sout | x | y | z | endl;®§\indexc{sout}§
+	®sout | x | y | z;®§\indexc{sout}§
 }
 \end{cfa}
@@ -513,5 +513,5 @@
 Floating exponentiation\index{exponentiation!floating} is performed using \Index{logarithm}s\index{exponentiation!logarithm}, so the base cannot be negative.
 \begin{cfa}
-sout | 2 ®\® 8u | 4 ®\® 3u | -4 ®\® 3u | 4 ®\® -3 | -4 ®\® -3 | 4.0 ®\® 2.1 | (1.0f+2.0fi) ®\® (3.0f+2.0fi) | endl;
+sout | 2 ®\® 8u | 4 ®\® 3u | -4 ®\® 3u | 4 ®\® -3 | -4 ®\® -3 | 4.0 ®\® 2.1 | (1.0f+2.0fi) ®\® (3.0f+2.0fi);
 256 64 -64 0.015625 -0.015625 18.3791736799526 0.264715-1.1922i
 \end{cfa}
@@ -591,27 +591,27 @@
 &
 \begin{cfa}
-sout | endl;
-sout | endl;
-sout | endl;
-sout | "zero" | endl;
-sout | endl;
-sout | endl;
-sout | endl;
-sout | endl;
-sout | endl;
-sout | endl;
-sout | endl;
-sout | endl;
-sout | endl;
-sout | endl;
-sout | endl;
-sout | endl;
-sout | endl | endl;
-
-sout | endl;
-sout | endl;
-sout | endl | endl;
-
-sout | endl;
+sout | nl;
+sout | nl;
+sout | nl;
+sout | "zero" | nl;
+sout | nl;
+sout | nl;
+sout | nl;
+sout | nl;
+sout | nl;
+sout | nl;
+sout | nl;
+sout | nl;
+sout | nl;
+sout | nl;
+sout | nl;
+sout | nl;
+sout | nl | nl;
+
+sout | nl;
+sout | nl;
+sout | nl | nl;
+
+sout | nl;
 \end{cfa}
 &
@@ -2459,5 +2459,5 @@
 	int bar( int p ) {
 		®i® += 1;				§\C{// dependent on local variable}§
-		sout | ®i® | endl;
+		sout | ®i®;
 	}
 	return bar;					§\C{// undefined because of local dependence}§
@@ -2465,5 +2465,5 @@
 int main() {
 	* [int]( int ) fp = foo();	§\C{// int (* fp)( int )}§
-	sout | fp( 3 ) | endl;
+	sout | fp( 3 );
 }
 \end{cfa}
@@ -3231,5 +3231,5 @@
 \begin{cfa}
 int x = 1, y = 2, z = 3;
-sout | x ®|® y ®|® z | endl;
+sout | x ®|® y ®|® z;
 \end{cfa}
 &
@@ -3252,5 +3252,5 @@
 \begin{cfa}
 [int, [ int, int ] ] t1 = [ 1, [ 2, 3 ] ], t2 = [ 4, [ 5, 6 ] ];
-sout | t1 | t2 | endl;					§\C{// print tuples}§
+sout | t1 | t2;						§\C{// print tuples}§
 \end{cfa}
 \begin{cfa}[showspaces=true,aboveskip=0pt]
@@ -3264,5 +3264,5 @@
 &
 \begin{cfa}
-sout | x * 3 | y + 1 | z << 2 | x == y | (x | y) | (x || y) | (x > z ? 1 : 2) | endl;
+sout | x * 3 | y + 1 | z << 2 | x == y | (x | y) | (x || y) | (x > z ? 1 : 2);
 \end{cfa}
 \\
@@ -3290,5 +3290,5 @@
 A separator does not appear at the start or end of a line.
 \begin{cfa}[belowskip=0pt]
-sout | 1 | 2 | 3 | endl;
+sout | 1 | 2 | 3;
 \end{cfa}
 \begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt]
@@ -3299,5 +3299,5 @@
 A separator does not appear before or after a character literal or variable.
 \begin{cfa}
-sout | '1' | '2' | '3' | endl;
+sout | '1' | '2' | '3';
 123
 \end{cfa}
@@ -3306,5 +3306,5 @@
 A separator does not appear before or after a null (empty) C string.
 \begin{cfa}
-sout | 1 | "" | 2 | "" | 3 | endl;
+sout | 1 | "" | 2 | "" | 3;
 123
 \end{cfa}
@@ -3316,5 +3316,5 @@
 \begin{cfa}[mathescape=off]
 sout | "x (" | 1 | "x [" | 2 | "x {" | 3 | "x =" | 4 | "x $" | 5 | "x £" | 6 | "x ¥"
-		| 7 | "x ¡" | 8 | "x ¿" | 9 | "x «" | 10 | endl;
+		| 7 | "x ¡" | 8 | "x ¿" | 9 | "x «" | 10;
 \end{cfa}
 %$
@@ -3330,5 +3330,5 @@
 \begin{cfa}[belowskip=0pt]
 sout | 1 | ", x" | 2 | ". x" | 3 | "; x" | 4 | "! x" | 5 | "? x" | 6 | "% x"
-		| 7 | "¢ x" | 8 | "» x" | 9 | ") x" | 10 | "] x" | 11 | "} x" | endl;
+		| 7 | "¢ x" | 8 | "» x" | 9 | ") x" | 10 | "] x" | 11 | "} x";
 \end{cfa}
 \begin{cfa}[basicstyle=\tt,showspaces=true,aboveskip=0pt,belowskip=0pt]
@@ -3340,5 +3340,5 @@
 A seperator does not appear before or after a C string begining/ending with the \Index*{ASCII} quote or whitespace characters: \lstinline[basicstyle=\tt,showspaces=true]@`'": \t\v\f\r\n@
 \begin{cfa}[belowskip=0pt]
-sout | "x`" | 1 | "`x'" | 2 | "'x\"" | 3 | "\"x:" | 4 | ":x " | 5 | " x\t" | 6 | "\tx" | endl;
+sout | "x`" | 1 | "`x'" | 2 | "'x\"" | 3 | "\"x:" | 4 | ":x " | 5 | " x\t" | 6 | "\tx";
 \end{cfa}
 \begin{cfa}[basicstyle=\tt,showspaces=true,showtabs=true,aboveskip=0pt,belowskip=0pt]
@@ -3349,5 +3349,5 @@
 If a space is desired before or after one of the special string start/end characters, simply insert a space.
 \begin{cfa}[belowskip=0pt]
-sout | "x (§\color{red}\texttt{\textvisiblespace}§" | 1 | "§\color{red}\texttt{\textvisiblespace}§) x" | 2 | "§\color{red}\texttt{\textvisiblespace}§, x" | 3 | "§\color{red}\texttt{\textvisiblespace}§:x:§\color{red}\texttt{\textvisiblespace}§" | 4 | endl;
+sout | "x (§\color{red}\texttt{\textvisiblespace}§" | 1 | "§\color{red}\texttt{\textvisiblespace}§) x" | 2 | "§\color{red}\texttt{\textvisiblespace}§, x" | 3 | "§\color{red}\texttt{\textvisiblespace}§:x:§\color{red}\texttt{\textvisiblespace}§" | 4;
 \end{cfa}
 \begin{cfa}[basicstyle=\tt,showspaces=true,showtabs=true,aboveskip=0pt,belowskip=0pt]
@@ -3366,5 +3366,5 @@
 \begin{cfa}[mathescape=off,belowskip=0pt]
 sepSet( sout, ", $" );						§\C{// set separator from " " to ", \$"}§
-sout | 1 | 2 | 3 | " \"" | ®sep® | "\"" | endl;
+sout | 1 | 2 | 3 | " \"" | ®sep® | "\"";
 \end{cfa}
 %$
@@ -3375,5 +3375,5 @@
 \begin{cfa}[belowskip=0pt]
 sepSet( sout, " " );						§\C{// reset separator to " "}§
-sout | 1 | 2 | 3 | " \"" | ®sepGet( sout )® | "\"" | endl;
+sout | 1 | 2 | 3 | " \"" | ®sepGet( sout )® | "\"";
 \end{cfa}
 \begin{cfa}[showspaces=true,aboveskip=0pt]
@@ -3385,5 +3385,5 @@
 strcpy( store, sepGet( sout ) );			  §\C{// copy current separator}§
 sepSet( sout, "_" );						§\C{// change separator to underscore}§
-sout | 1 | 2 | 3 | endl;
+sout | 1 | 2 | 3;
 \end{cfa}
 \begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt]
@@ -3392,5 +3392,5 @@
 \begin{cfa}[belowskip=0pt]
 sepSet( sout, store );						§\C{// change separator back to original}§
-sout | 1 | 2 | 3 | endl;
+sout | 1 | 2 | 3;
 \end{cfa}
 \begin{cfa}[showspaces=true,aboveskip=0pt]
@@ -3403,5 +3403,5 @@
 \begin{cfa}[belowskip=0pt]
 sepSetTuple( sout, " " );					§\C{// set tuple separator from ", " to " "}§
-sout | t1 | t2 | " \"" | ®sepTuple® | "\"" | endl;
+sout | t1 | t2 | " \"" | ®sepTuple® | "\"";
 \end{cfa}
 \begin{cfa}[showspaces=true,aboveskip=0pt]
@@ -3410,5 +3410,5 @@
 \begin{cfa}[belowskip=0pt]
 sepSetTuple( sout, ", " );					§\C{// reset tuple separator to ", "}§
-sout | t1 | t2 | " \"" | ®sepGetTuple( sout )® | "\"" | endl;
+sout | t1 | t2 | " \"" | ®sepGetTuple( sout )® | "\"";
 \end{cfa}
 \begin{cfa}[showspaces=true,aboveskip=0pt]
@@ -3420,5 +3420,5 @@
 Manipulators \Indexc{sepDisable}\index{manipulator!sepDisable@©sepDisable©} and \Indexc{sepEnable}\index{manipulator!sepEnable@©sepEnable©} \emph{globally} toggle printing the separator, \ie the seperator is adjusted with respect to all subsequent printed items.
 \begin{cfa}[belowskip=0pt]
-sout | sepDisable | 1 | 2 | 3 | endl;		§\C{// globally turn off implicit separator}§
+sout | sepDisable | 1 | 2 | 3;			§\C{// globally turn off implicit separator}§
 \end{cfa}
 \begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt]
@@ -3426,5 +3426,5 @@
 \end{cfa}
 \begin{cfa}[belowskip=0pt]
-sout | sepEnable | 1 | 2 | 3 | endl;		§\C{// globally turn on implicit separator}§
+sout | sepEnable | 1 | 2 | 3;		§\C{// globally turn on implicit separator}§
 \end{cfa}
 \begin{cfa}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
@@ -3435,5 +3435,5 @@
 Manipulators \Indexc{sepOn}\index{manipulator!sepOn@©sepOn©} and \Indexc{sepOff}\index{manipulator!sepOff@©sepOff©} \emph{locally} toggle printing the separator, \ie the seperator is adjusted only with respect to the next printed item.
 \begin{cfa}[belowskip=0pt]
-sout | 1 | sepOff | 2 | 3 | endl;			§\C{// locally turn off implicit separator}§
+sout | 1 | sepOff | 2 | 3;			§\C{// locally turn off implicit separator}§
 \end{cfa}
 \begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt]
@@ -3441,5 +3441,5 @@
 \end{cfa}
 \begin{cfa}[belowskip=0pt]
-sout | sepDisable | 1 | sepOn | 2 | 3 | endl; §\C{// locally turn on implicit separator}§
+sout | sepDisable | 1 | sepOn | 2 | 3; §\C{// locally turn on implicit separator}§
 \end{cfa}
 \begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt]
@@ -3448,5 +3448,5 @@
 The tuple separator also responses to being turned on and off.
 \begin{cfa}[belowskip=0pt]
-sout | t1 | sepOff | t2 | endl;				§\C{// locally turn on/off implicit separator}§
+sout | t1 | sepOff | t2;				§\C{// locally turn on/off implicit separator}§
 \end{cfa}
 \begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt]
@@ -3456,5 +3456,5 @@
 use ©sep© to accomplish this functionality.
 \begin{cfa}[belowskip=0pt]
-sout | sepOn | 1 | 2 | 3 | sepOn | endl ;	§\C{// sepOn does nothing at start/end of line}§
+sout | sepOn | 1 | 2 | 3 | sepOn;	§\C{// sepOn does nothing at start/end of line}§
 \end{cfa}
 \begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt]
@@ -3462,5 +3462,5 @@
 \end{cfa}
 \begin{cfa}[belowskip=0pt]
-sout | sep | 1 | 2 | 3 | sep | endl ;		§\C{// use sep to print separator at start/end of line}§
+sout | sep | 1 | 2 | 3 | sep ;		§\C{// use sep to print separator at start/end of line}§
 \end{cfa}
 \begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt]
@@ -3475,45 +3475,45 @@
 int main( void ) {
 	int x = 1, y = 2, z = 3;
-	sout | x | y | z | endl;
+	sout | x | y | z;
 	[int, [ int, int ] ] t1 = [ 1, [ 2, 3 ] ], t2 = [ 4, [ 5, 6 ] ];
-	sout | t1 | t2 | endl;						// print tuples
-	sout | x * 3 | y + 1 | z << 2 | x == y | (x | y) | (x || y) | (x > z ? 1 : 2) | endl;
-	sout | 1 | 2 | 3 | endl;
-	sout | '1' | '2' | '3' | endl;
-	sout | 1 | "" | 2 | "" | 3 | endl;
+	sout | t1 | t2;						// print tuples
+	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 | "x (" | 1 | "x [" | 2 | "x {" | 3 | "x =" | 4 | "x $" | 5 | "x £" | 6 | "x ¥"
-		| 7 | "x ¡" | 8 | "x ¿" | 9 | "x «" | 10 | endl;
+		| 7 | "x ¡" | 8 | "x ¿" | 9 | "x «" | 10;
 	sout | 1 | ", x" | 2 | ". x" | 3 | "; x" | 4 | "! x" | 5 | "? x" | 6 | "% x"
-		| 7 | "¢ x" | 8 | "» x" | 9 | ") x" | 10 | "] x" | 11 | "} x" | endl;
-	sout | "x`" | 1 | "`x'" | 2 | "'x\"" | 3 | "\"x:" | 4 | ":x " | 5 | " x\t" | 6 | "\tx" | endl;
-	sout | "x ( " | 1 | " ) x" | 2 | " , x" | 3 | " :x: " | 4 | endl;
+		| 7 | "¢ x" | 8 | "» x" | 9 | ") x" | 10 | "] x" | 11 | "} x";
+	sout | "x`" | 1 | "`x'" | 2 | "'x\"" | 3 | "\"x:" | 4 | ":x " | 5 | " x\t" | 6 | "\tx";
+	sout | "x ( " | 1 | " ) x" | 2 | " , x" | 3 | " :x: " | 4;
 
 	sepSet( sout, ", $" );						// set separator from " " to ", $"
-	sout | 1 | 2 | 3 | " \"" | sep | "\"" | endl;
+	sout | 1 | 2 | 3 | " \"" | sep | "\"";
 	sepSet( sout, " " );						// reset separator to " "
-	sout | 1 | 2 | 3 | " \"" | sepGet( sout ) | "\"" | endl;
+	sout | 1 | 2 | 3 | " \"" | sepGet( sout ) | "\"";
 
 	char store[sepSize];
 	strcpy( store, sepGet( sout ) );
 	sepSet( sout, "_" );
-	sout | 1 | 2 | 3 | endl;
+	sout | 1 | 2 | 3;
 	sepSet( sout, store );
-	sout | 1 | 2 | 3 | endl;
+	sout | 1 | 2 | 3;
 
 	sepSetTuple( sout, " " );					// set tuple separator from ", " to " "
-	sout | t1 | t2 | " \"" | sepTuple | "\"" | endl;
+	sout | t1 | t2 | " \"" | sepTuple | "\"";
 	sepSetTuple( sout, ", " );					// reset tuple separator to ", "
-	sout | t1 | t2 | " \"" | sepGetTuple( sout ) | "\"" | endl;
-
-	sout | sepDisable | 1 | 2 | 3 | endl;		// globally turn off implicit separator
-	sout | sepEnable | 1 | 2 | 3 | endl;		// globally turn on implicit separator
-
-	sout | 1 | sepOff | 2 | 3 | endl;			// locally turn on implicit separator
-	sout | sepDisable | 1 | sepOn | 2 | 3 | endl; // globally turn off implicit separator
+	sout | t1 | t2 | " \"" | sepGetTuple( sout ) | "\"";
+
+	sout | sepDisable | 1 | 2 | 3;		// globally turn off implicit separator
+	sout | sepEnable | 1 | 2 | 3;		// globally turn on implicit separator
+
+	sout | 1 | sepOff | 2 | 3;			// locally turn on implicit separator
+	sout | sepDisable | 1 | sepOn | 2 | 3; // globally turn off implicit separator
 	sout | sepEnable;
-	sout | t1 | sepOff | t2 | endl;				// locally turn on/off implicit separator
-
-	sout | sepOn | 1 | 2 | 3 | sepOn | endl ;	// sepOn does nothing at start/end of line
-	sout | sep | 1 | 2 | 3 | sep | endl ;		// use sep to print separator at start/end of line
+	sout | t1 | sepOff | t2;				// locally turn on/off implicit separator
+
+	sout | sepOn | 1 | 2 | 3 | sepOn ;	// sepOn does nothing at start/end of line
+	sout | sep | 1 | 2 | 3 | sep ;		// use sep to print separator at start/end of line
 }
 
@@ -4180,5 +4180,5 @@
 	Fibonacci f1, f2;
 	for ( int i = 1; i <= 10; i += 1 ) {
-		sout | next( &f1 ) | ' ' | next( &f2 ) | endl;
+		sout | next( &f1 ) | ' ' | next( &f2 );
 	} // for
 }
@@ -4246,5 +4246,5 @@
 		MyThread f[4];
 	}
-	sout | global.value | endl;
+	sout | global.value;
 }
 \end{cfa}
@@ -4324,5 +4324,5 @@
 void main( First * this ) {
 	for ( int i = 0; i < 10; i += 1 ) {
-		sout | "First : Suspend No." | i + 1 | endl;
+		sout | "First : Suspend No." | i + 1;
 		yield();
 	}
@@ -4333,5 +4333,5 @@
 	wait( this->lock );
 	for ( int i = 0; i < 10; i += 1 ) {
-		sout | "Second : Suspend No." | i + 1 | endl;
+		sout | "Second : Suspend No." | i + 1;
 		yield();
 	}
@@ -4340,5 +4340,5 @@
 int main( void ) {
 	signal_once lock;
-	sout | "User main begin" | endl;
+	sout | "User main begin";
 	{
 		processor p;
@@ -4348,5 +4348,5 @@
 		}
 	}
-	sout | "User main end" | endl;
+	sout | "User main end";
 }
 \end{cfa}
@@ -5045,5 +5045,5 @@
 void ?{}( Line * l ) {
 	l->lnth = 0.0;
-	sout | "default" | endl;
+	sout | "default";
 }
 
@@ -5052,5 +5052,5 @@
 void ?{}( Line * l, float lnth ) {
 	l->lnth = lnth;
-	sout | "lnth" | l->lnth | endl;
+	sout | "lnth" | l->lnth;
 
 }
@@ -5058,5 +5058,5 @@
 // destructor
 void ^?() {
-	sout | "destroyed" | endl;
+	sout | "destroyed";
 	l.lnth = 0.0;
 }
@@ -5804,5 +5804,5 @@
 In particular, output of ©char© variable now print a character rather than the decimal ASCII value of the character.
 \begin{cfa}
-sout | 'x' | " " | (int)'x' | endl;
+sout | 'x' | " " | (int)'x';
 x 120
 \end{cfa}
@@ -7034,11 +7034,11 @@
 #include <gmp>§\indexc{gmp}§
 int main( void ) {
-	sout | "Factorial Numbers" | endl;
+	sout | "Factorial Numbers";
 	Int fact = 1;
 
-	sout | 0 | fact | endl;
+	sout | 0 | fact;
 	for ( unsigned int i = 1; i <= 40; i += 1 ) {
 		fact *= i;
-		sout | i | fact | endl;
+		sout | i | fact;
 	}
 }
Index: doc/working/exception/impl/Makefile
===================================================================
--- doc/working/exception/impl/Makefile	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ doc/working/exception/impl/Makefile	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,26 @@
+CFLAGS = -fexceptions -Wall -Werror -g
+CC = gcc
+
+all: except-pic except-pdc
+
+clean:
+	rm -fv except-pic except-pdc *.o *.so
+
+pic.s: test.c Makefile
+	$(CC) $(CFLAGS) -fPIC -S -o $@ $<
+
+pdc.s: test.c Makefile
+	$(CC) $(CFLAGS) -S -o $@ $<
+
+except-pdc: test-main.c exception.c
+	$(CC) $(CFLAGS) -o $@ $^
+
+exception.s: exception.c
+	$(CC) $(CFLAGS) -S -o $@ -fPIC $^
+
+libexcept.so: exception.c
+	$(CC) $(CFLAGS) -shared -o $@ -fPIC $^
+
+except-pic: test-main.c libexcept.so
+	$(CC) $(CFLAGS) -o $@ $< -L. -lexcept
+
Index: doc/working/exception/impl/exception.c
===================================================================
--- doc/working/exception/impl/exception.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ doc/working/exception/impl/exception.c	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -243,5 +243,5 @@
 
 					// Get a function pointer from the relative offset and call it
-					// _Unwind_Reason_Code (*matcher)() = (_Unwind_Reason_Code (*)())lsd_info.LPStart + imatcher;					
+					// _Unwind_Reason_Code (*matcher)() = (_Unwind_Reason_Code (*)())lsd_info.LPStart + imatcher;
 
 					_Unwind_Reason_Code (*matcher)() =
@@ -320,7 +320,13 @@
 	// on how the assembly works.
 	// Setup the personality routine
+	#if defined(__PIC__)
+	asm volatile (".cfi_personality 0x9b,CFA.ref.__gcfa_personality_v0");
+	// Setup the exception table
+	asm volatile (".cfi_lsda 0x1b, .LLSDACFA2");
+	#else
 	asm volatile (".cfi_personality 0x3,__gcfa_personality_v0");
 	// Setup the exception table
 	asm volatile (".cfi_lsda 0x3, .LLSDACFA2");
+	#endif
 
 	// Label which defines the start of the area for which the handler is setup
@@ -356,4 +362,39 @@
 // Some more works need to be done if we want to have a single
 // call to the try routine
+#if defined(__PIC__)
+asm (
+	//HEADER
+	".LFECFA1:\n"
+	"	.globl	__gcfa_personality_v0\n"
+	"	.section	.gcc_except_table,\"a\",@progbits\n"
+	".LLSDACFA2:\n"							//TABLE header
+	"	.byte	0xff\n"
+	"	.byte	0xff\n"
+	"	.byte	0x1\n"
+	"	.uleb128 .LLSDACSECFA2-.LLSDACSBCFA2\n"		// BODY length
+	// Body uses language specific data and therefore could be modified arbitrarily
+	".LLSDACSBCFA2:\n"						// BODY start
+	"	.uleb128 .TRYSTART-__try_terminate\n"		// Handled area start  (relative to start of function)
+	"	.uleb128 .TRYEND-.TRYSTART\n"				// Handled area length
+	"	.uleb128 .CATCH-__try_terminate\n"			// Handler landing pad adress  (relative to start of function)
+	"	.uleb128 1\n"						// Action code, gcc seems to use always 0
+	".LLSDACSECFA2:\n"						// BODY end
+	"	.text\n"							// TABLE footer
+	"	.size	__try_terminate, .-__try_terminate\n"
+);
+
+// Somehow this piece of helps with the resolution of debug symbols.
+__attribute__((unused)) static const int dummy = 0;
+asm (
+	"	.hidden	CFA.ref.__gcfa_personality_v0\n"	// Declare an new hidden symbol
+	"	.weak	CFA.ref.__gcfa_personality_v0\n"
+	"	.section	.data.rel.local.CFA.ref.__gcfa_personality_v0,\"awG\",@progbits,CFA.ref.__gcfa_personality_v0,comdat\n"	// No clue what this does specifically
+	"	.align 8\n"
+	"	.type CFA.ref.__gcfa_personality_v0, @object\n"	// Type of our hidden symbol (it's not actually the function itself)
+	"	.size CFA.ref.__gcfa_personality_v0, 8\n"		// Size of our hidden symbol
+	"CFA.ref.__gcfa_personality_v0:\n"
+	"	.quad __gcfa_personality_v0\n"
+);
+#else
 asm (
 	//HEADER
@@ -375,5 +416,4 @@
 	"	.text\n"							// TABLE footer
 	"	.size	__try_terminate, .-__try_terminate\n"
-	"	.ident	\"GCC: (Ubuntu 6.2.0-3ubuntu11~16.04) 6.2.0 20160901\"\n"
-//	"	.section	.note.GNU-stack,\"x\",@progbits\n"
 );
+#endif
Index: c/working/exception/impl/nopic.s
===================================================================
--- doc/working/exception/impl/nopic.s	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,104 +1,0 @@
-	.file	"test.c"
-	.text
-	.globl	clean
-	.type	clean, @function
-clean:
-.LFB0:
-	.cfi_startproc
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset 6, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register 6
-	movq	%rdi, -8(%rbp)
-	nop
-	popq	%rbp
-	.cfi_def_cfa 7, 8
-	ret
-	.cfi_endproc
-.LFE0:
-	.size	clean, .-clean
-	.globl	foo
-	.type	foo, @function
-foo:
-.LFB1:
-	.cfi_startproc
-	.cfi_personality 0x3,__gcc_personality_v0
-	.cfi_lsda 0x3,.LLSDA1
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset 6, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register 6
-	pushq	%r13
-	pushq	%r12
-	pushq	%rbx
-	subq	$40, %rsp
-	.cfi_offset 13, -24
-	.cfi_offset 12, -32
-	.cfi_offset 3, -40
-	movl	%edi, -52(%rbp)
-	movq	%fs:40, %rax
-	movq	%rax, -40(%rbp)
-	xorl	%eax, %eax
-	movl	-52(%rbp), %eax
-	movl	%eax, %edi
-.LEHB0:
-	call	bar
-.LEHE0:
-	movl	%eax, %r13d
-	movl	$0, %r12d
-.L7:
-	leaq	-44(%rbp), %rax
-	movq	%rax, %rdi
-	call	clean
-	cmpl	$1, %r12d
-	je	.L4
-	movl	%r13d, %eax
-	movq	-40(%rbp), %rdx
-	xorq	%fs:40, %rdx
-	je	.L8
-	jmp	.L10
-.L9:
-	movq	%rax, %rbx
-	movl	$1, %r12d
-	jmp	.L7
-.L4:
-	movq	%rbx, %rax
-	movq	%rax, %rdi
-.LEHB1:
-	call	_Unwind_Resume
-.LEHE1:
-.L10:
-	call	__stack_chk_fail
-.L8:
-	addq	$40, %rsp
-	popq	%rbx
-	popq	%r12
-	popq	%r13
-	popq	%rbp
-	.cfi_def_cfa 7, 8
-	ret
-	.cfi_endproc
-.LFE1:
-	.globl	__gcc_personality_v0
-	.section	.gcc_except_table,"a",@progbits
-.LLSDA1:
-	.byte	0xff
-	.byte	0xff
-	.byte	0x1
-	.uleb128 .LLSDACSE1-.LLSDACSB1
-.LLSDACSB1:
-	.uleb128 .LEHB0-.LFB1
-	.uleb128 .LEHE0-.LEHB0
-	.uleb128 .L9-.LFB1
-	.uleb128 0
-	.uleb128 .LEHB1-.LFB1
-	.uleb128 .LEHE1-.LEHB1
-	.uleb128 0
-	.uleb128 0
-.LLSDACSE1:
-	.text
-	.size	foo, .-foo
-	.ident	"GCC: (Ubuntu 7.3.0-21ubuntu1~16.04) 7.3.0"
-	.section	.note.GNU-stack,"",@progbits
Index: doc/working/exception/impl/pdc.s
===================================================================
--- doc/working/exception/impl/pdc.s	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ doc/working/exception/impl/pdc.s	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,104 @@
+	.file	"test.c"
+	.text
+	.globl	clean
+	.type	clean, @function
+clean:
+.LFB0:
+	.cfi_startproc
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset 6, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register 6
+	movq	%rdi, -8(%rbp)
+	nop
+	popq	%rbp
+	.cfi_def_cfa 7, 8
+	ret
+	.cfi_endproc
+.LFE0:
+	.size	clean, .-clean
+	.globl	foo
+	.type	foo, @function
+foo:
+.LFB1:
+	.cfi_startproc
+	.cfi_personality 0x3,__gcc_personality_v0
+	.cfi_lsda 0x3,.LLSDA1
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset 6, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register 6
+	pushq	%r13
+	pushq	%r12
+	pushq	%rbx
+	subq	$40, %rsp
+	.cfi_offset 13, -24
+	.cfi_offset 12, -32
+	.cfi_offset 3, -40
+	movl	%edi, -52(%rbp)
+	movq	%fs:40, %rax
+	movq	%rax, -40(%rbp)
+	xorl	%eax, %eax
+	movl	-52(%rbp), %eax
+	movl	%eax, %edi
+.LEHB0:
+	call	bar
+.LEHE0:
+	movl	%eax, %r13d
+	movl	$0, %r12d
+.L7:
+	leaq	-44(%rbp), %rax
+	movq	%rax, %rdi
+	call	clean
+	cmpl	$1, %r12d
+	je	.L4
+	movl	%r13d, %eax
+	movq	-40(%rbp), %rdx
+	xorq	%fs:40, %rdx
+	je	.L8
+	jmp	.L10
+.L9:
+	movq	%rax, %rbx
+	movl	$1, %r12d
+	jmp	.L7
+.L4:
+	movq	%rbx, %rax
+	movq	%rax, %rdi
+.LEHB1:
+	call	_Unwind_Resume
+.LEHE1:
+.L10:
+	call	__stack_chk_fail
+.L8:
+	addq	$40, %rsp
+	popq	%rbx
+	popq	%r12
+	popq	%r13
+	popq	%rbp
+	.cfi_def_cfa 7, 8
+	ret
+	.cfi_endproc
+.LFE1:
+	.globl	__gcc_personality_v0
+	.section	.gcc_except_table,"a",@progbits
+.LLSDA1:
+	.byte	0xff
+	.byte	0xff
+	.byte	0x1
+	.uleb128 .LLSDACSE1-.LLSDACSB1
+.LLSDACSB1:
+	.uleb128 .LEHB0-.LFB1
+	.uleb128 .LEHE0-.LEHB0
+	.uleb128 .L9-.LFB1
+	.uleb128 0
+	.uleb128 .LEHB1-.LFB1
+	.uleb128 .LEHE1-.LEHB1
+	.uleb128 0
+	.uleb128 0
+.LLSDACSE1:
+	.text
+	.size	foo, .-foo
+	.ident	"GCC: (Ubuntu 7.4.0-1ubuntu1~16.04~ppa1) 7.4.0"
+	.section	.note.GNU-stack,"",@progbits
Index: doc/working/exception/impl/pic.s
===================================================================
--- doc/working/exception/impl/pic.s	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ doc/working/exception/impl/pic.s	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -1,8 +1,11 @@
 	.file	"test.c"
 	.text
+.Ltext0:
 	.globl	clean
 	.type	clean, @function
 clean:
 .LFB0:
+	.file 1 "test.c"
+	.loc 1 1 0
 	.cfi_startproc
 	pushq	%rbp
@@ -12,4 +15,5 @@
 	.cfi_def_cfa_register 6
 	movq	%rdi, -8(%rbp)
+	.loc 1 1 0
 	nop
 	popq	%rbp
@@ -23,4 +27,5 @@
 foo:
 .LFB1:
+	.loc 1 4 0
 	.cfi_startproc
 	.cfi_personality 0x9b,DW.ref.__gcc_personality_v0
@@ -39,7 +44,9 @@
 	.cfi_offset 3, -40
 	movl	%edi, -52(%rbp)
+	.loc 1 4 0
 	movq	%fs:40, %rax
 	movq	%rax, -40(%rbp)
 	xorl	%eax, %eax
+	.loc 1 6 0
 	movl	-52(%rbp), %eax
 	movl	%eax, %edi
@@ -50,4 +57,5 @@
 	movl	$0, %r12d
 .L7:
+	.loc 1 5 0
 	leaq	-44(%rbp), %rax
 	movq	%rax, %rdi
@@ -56,5 +64,7 @@
 	cmpl	$1, %r12d
 	je	.L4
+	.loc 1 6 0
 	movl	%r13d, %eax
+	.loc 1 7 0
 	movq	-40(%rbp), %rdx
 	xorq	%fs:40, %rdx
@@ -64,4 +74,5 @@
 	movq	%rax, %rbx
 	movl	$1, %r12d
+	.loc 1 5 0
 	jmp	.L7
 .L4:
@@ -71,4 +82,5 @@
 .LEHE1:
 .L10:
+	.loc 1 7 0
 	call	__stack_chk_fail@PLT
 .L8:
@@ -101,7 +113,222 @@
 	.text
 	.size	foo, .-foo
+.Letext0:
+	.section	.debug_info,"",@progbits
+.Ldebug_info0:
+	.long	0x9c
+	.value	0x4
+	.long	.Ldebug_abbrev0
+	.byte	0x8
+	.uleb128 0x1
+	.long	.LASF0
+	.byte	0xc
+	.long	.LASF1
+	.long	.LASF2
+	.quad	.Ltext0
+	.quad	.Letext0-.Ltext0
+	.long	.Ldebug_line0
+	.uleb128 0x2
+	.string	"foo"
+	.byte	0x1
+	.byte	0x4
+	.long	0x68
+	.quad	.LFB1
+	.quad	.LFE1-.LFB1
+	.uleb128 0x1
+	.byte	0x9c
+	.long	0x68
+	.uleb128 0x3
+	.string	"x"
+	.byte	0x1
+	.byte	0x4
+	.long	0x68
+	.uleb128 0x3
+	.byte	0x91
+	.sleb128 -68
+	.uleb128 0x4
+	.string	"i"
+	.byte	0x1
+	.byte	0x5
+	.long	0x68
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -60
+	.byte	0
+	.uleb128 0x5
+	.byte	0x4
+	.byte	0x5
+	.string	"int"
+	.uleb128 0x6
+	.long	.LASF3
+	.byte	0x1
+	.byte	0x1
+	.quad	.LFB0
+	.quad	.LFE0-.LFB0
+	.uleb128 0x1
+	.byte	0x9c
+	.long	0x99
+	.uleb128 0x3
+	.string	"p"
+	.byte	0x1
+	.byte	0x1
+	.long	0x99
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -24
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.long	0x68
+	.byte	0
+	.section	.debug_abbrev,"",@progbits
+.Ldebug_abbrev0:
+	.uleb128 0x1
+	.uleb128 0x11
+	.byte	0x1
+	.uleb128 0x25
+	.uleb128 0xe
+	.uleb128 0x13
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x1b
+	.uleb128 0xe
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x10
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x2
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2116
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x4
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x5
+	.uleb128 0x24
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3e
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0x8
+	.byte	0
+	.byte	0
+	.uleb128 0x6
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2117
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x7
+	.uleb128 0xf
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.byte	0
+	.section	.debug_aranges,"",@progbits
+	.long	0x2c
+	.value	0x2
+	.long	.Ldebug_info0
+	.byte	0x8
+	.byte	0
+	.value	0
+	.value	0
+	.quad	.Ltext0
+	.quad	.Letext0-.Ltext0
+	.quad	0
+	.quad	0
+	.section	.debug_line,"",@progbits
+.Ldebug_line0:
+	.section	.debug_str,"MS",@progbits,1
+.LASF0:
+	.string	"GNU C11 7.4.0 -mtune=generic -march=x86-64 -g -fexceptions -fPIC -fstack-protector-strong"
+.LASF2:
+	.string	"/home/tdelisle/workspace/cforall/main/doc/working/exception/impl"
+.LASF1:
+	.string	"test.c"
+.LASF3:
+	.string	"clean"
 	.hidden	DW.ref.__gcc_personality_v0
 	.weak	DW.ref.__gcc_personality_v0
-	.section	.data.DW.ref.__gcc_personality_v0,"awG",@progbits,DW.ref.__gcc_personality_v0,comdat
+	.section	.data.rel.local.DW.ref.__gcc_personality_v0,"awG",@progbits,DW.ref.__gcc_personality_v0,comdat
 	.align 8
 	.type	DW.ref.__gcc_personality_v0, @object
@@ -109,4 +336,4 @@
 DW.ref.__gcc_personality_v0:
 	.quad	__gcc_personality_v0
-	.ident	"GCC: (Ubuntu 7.3.0-21ubuntu1~16.04) 7.3.0"
+	.ident	"GCC: (Ubuntu 7.4.0-1ubuntu1~16.04~ppa1) 7.4.0"
 	.section	.note.GNU-stack,"",@progbits
Index: driver/Makefile.am
===================================================================
--- driver/Makefile.am	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ driver/Makefile.am	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -16,4 +16,5 @@
 
 AUTOMAKE_OPTIONS = foreign    # do not require all the GNU file names
+ACLOCAL_AMFLAGS  = -I automake
 
 # applies to both programs
Index: driver/Makefile.in
===================================================================
--- driver/Makefile.in	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ driver/Makefile.in	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -96,6 +96,10 @@
 subdir = driver
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/automake/cfa.m4 \
-	$(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/automake/libtool.m4 \
+	$(top_srcdir)/automake/ltoptions.m4 \
+	$(top_srcdir)/automake/ltsugar.m4 \
+	$(top_srcdir)/automake/ltversion.m4 \
+	$(top_srcdir)/automake/lt~obsolete.m4 \
+	$(top_srcdir)/automake/cfa.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -110,4 +114,8 @@
 as_OBJECTS = $(am_as_OBJECTS)
 as_LDADD = $(LDADD)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
 am_cc1_OBJECTS = cc1.$(OBJEXT)
 cc1_OBJECTS = $(am_cc1_OBJECTS)
@@ -134,4 +142,8 @@
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
 AM_V_CXX = $(am__v_CXX_@AM_V@)
 am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
@@ -139,6 +151,7 @@
 am__v_CXX_1 = 
 CXXLD = $(CXX)
-CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
-	-o $@
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
 am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
@@ -177,9 +190,9 @@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BACKEND_CC = @BACKEND_CC@
 BUILD_IN_TREE_FLAGS = @BUILD_IN_TREE_FLAGS@
 CC = @CC@
@@ -201,4 +214,5 @@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
+CXXCPP = @CXXCPP@
 CXXDEPMODE = @CXXDEPMODE@
 CXXFLAGS = @CXXFLAGS@
@@ -206,5 +220,8 @@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
 DRIVER_DIR = @DRIVER_DIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
@@ -212,4 +229,5 @@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
+FGREP = @FGREP@
 GREP = @GREP@
 HOST_FLAGS = @HOST_FLAGS@
@@ -219,4 +237,5 @@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LEX = @LEX@
@@ -227,8 +246,18 @@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -240,4 +269,5 @@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -251,6 +281,8 @@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -300,4 +332,5 @@
 top_srcdir = @top_srcdir@
 AUTOMAKE_OPTIONS = foreign    # do not require all the GNU file names
+ACLOCAL_AMFLAGS = -I automake
 
 # applies to both programs
@@ -313,5 +346,5 @@
 
 .SUFFIXES:
-.SUFFIXES: .cc .o .obj
+.SUFFIXES: .cc .lo .o .obj
 $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	@for dep in $?; do \
@@ -353,4 +386,5 @@
 	sed 's/$(EXEEXT)$$//' | \
 	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
 	  ; then echo "$$p"; echo "$$p"; else :; fi; \
 	done | \
@@ -367,6 +401,6 @@
 	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
 	    test -z "$$files" || { \
-	      echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(cc1libdir)$$dir'"; \
-	      $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(cc1libdir)$$dir" || exit $$?; \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(cc1libdir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(cc1libdir)$$dir" || exit $$?; \
 	    } \
 	; done
@@ -384,8 +418,20 @@
 
 clean-cc1libPROGRAMS:
-	-test -z "$(cc1lib_PROGRAMS)" || rm -f $(cc1lib_PROGRAMS)
+	@list='$(cc1lib_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
 
 clean-noinstPROGRAMS:
-	-test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
 
 as$(EXEEXT): $(as_OBJECTS) $(as_DEPENDENCIES) $(EXTRA_as_DEPENDENCIES) 
@@ -426,4 +472,18 @@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
 
 ID: $(am__tagged_files)
@@ -549,6 +609,6 @@
 clean: clean-am
 
-clean-am: clean-cc1libPROGRAMS clean-generic clean-noinstPROGRAMS \
-	mostlyclean-am
+clean-am: clean-cc1libPROGRAMS clean-generic clean-libtool \
+	clean-noinstPROGRAMS mostlyclean-am
 
 distclean: distclean-am
@@ -606,5 +666,6 @@
 mostlyclean: mostlyclean-am
 
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
 
 pdf: pdf-am
@@ -622,15 +683,16 @@
 
 .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
-	clean-cc1libPROGRAMS clean-generic clean-noinstPROGRAMS \
-	cscopelist-am ctags ctags-am distclean distclean-compile \
-	distclean-generic distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-cc1libPROGRAMS \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-exec-hook install-html \
-	install-html-am install-info install-info-am install-man \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+	clean-cc1libPROGRAMS clean-generic clean-libtool \
+	clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-cc1libPROGRAMS install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-exec-hook install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
 	tags tags-am uninstall uninstall-am uninstall-cc1libPROGRAMS \
 	uninstall-hook
Index: driver/as.cc
===================================================================
--- driver/as.cc	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ driver/as.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -1,11 +1,11 @@
-// 
+//
 // Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
 //
 // The contents of this file are covered under the licence agreement in the
 // file "LICENCE" distributed with Cforall.
-// 
+//
 // as.c -- map assembler file, scan for debug information. If found, expand file by one character and insert Cforall
 //         language code on the N line from the start of the debug information.
-// 
+//
 // Author           : Peter A. Buhr
 // Created On       : Wed Aug  1 10:49:42 2018
@@ -13,5 +13,5 @@
 // Last Modified On : Sat Sep  8 08:40:16 2018
 // Update Count     : 97
-// 
+//
 
 #include <cstdio>										// perror
@@ -45,5 +45,5 @@
 
 	if ( size ) {										// cannot map 0 sized file
-		char * start = (char *)mmap( NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 );
+		char * start = (char *)mmap( NULL, size + 2, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 );
 		if ( start == (void *)-1 ) { perror( "mmap" ); exit( EXIT_FAILURE ); };
 
@@ -65,5 +65,5 @@
 		} // if
 
-		if ( munmap( start, size ) ) { perror( "munmap" ); exit( EXIT_FAILURE ); }; // update on disk
+		if ( munmap( start, size + 2 ) ) { perror( "munmap" ); exit( EXIT_FAILURE ); }; // update on disk
 	} // if
 
Index: examples/ArrayN.c
===================================================================
--- examples/ArrayN.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ examples/ArrayN.c	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -7,11 +7,9 @@
 
 forall(otype index_t)
-index_t offset_to_index(unsigned offset, index_t size)
-{
+index_t offset_to_index(unsigned offset, index_t size) {
     return [offset / size.0, offset % size.1];
 }
 
-int main(int argc, char* argv[])
-{
+int main(int argc, char* argv[]) {
     unsigned x = 0, y = 0, i = 0;
     unsigned sx = 4, sy = 4;
@@ -20,5 +18,5 @@
     [x, y] = offset_to_index(6, [sx, sy]);
 
-    sout | x | ' ' | y | endl;
+    sout | x | ' ' | y;
 
     return 0;
Index: examples/gc_no_raii/src/internal/collector.c
===================================================================
--- examples/gc_no_raii/src/internal/collector.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ examples/gc_no_raii/src/internal/collector.c	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -38,10 +38,10 @@
 void* gc_allocate(size_t target_size)
 {
-	// sout | "Allocating " | target_size | " bytes" | endl;
+	// sout | "Allocating " | target_size | " bytes";
 
 	size_t size = gc_compute_size(target_size + sizeof(gc_object_header));
 
-	// sout | "Object header size: " | sizeof(gc_object_header) | " bytes" | endl;
-	// sout | "Actual allocation size: " | size | " bytes" | endl;
+	// sout | "Object header size: " | sizeof(gc_object_header) | " bytes";
+	// sout | "Actual allocation size: " | size | " bytes";
 
 	check(size < POOL_SIZE_BYTES);
Index: examples/gc_no_raii/src/internal/state.h
===================================================================
--- examples/gc_no_raii/src/internal/state.h	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ examples/gc_no_raii/src/internal/state.h	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -38,5 +38,5 @@
 static inline bool gc_needs_collect(gc_state* state)
 {
-	// sout | "Used Space: " | state->used_space | " bytes" | endl;
+	// sout | "Used Space: " | state->used_space | " bytes";
 	return state->used_space * 2 > state->total_space;
 }
Index: examples/gc_no_raii/src/tools/print.h
===================================================================
--- examples/gc_no_raii/src/tools/print.h	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ examples/gc_no_raii/src/tools/print.h	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -5,5 +5,5 @@
 // #include <fstream.hfa>
 //
-// #define DEBUG_OUT(x) sout | x | endl;
+// #define DEBUG_OUT(x) sout | x;
 //
 // #else
Index: examples/multicore.c
===================================================================
--- examples/multicore.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ examples/multicore.c	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -15,5 +15,5 @@
 
 int main(int argc, char* argv[]) {
-	// sout | "User main begin" | endl;
+	// sout | "User main begin";
 	{
 		processor p;
@@ -22,4 +22,4 @@
 		}
 	}
-	// sout | "User main end" | endl;
+	// sout | "User main end";
 }
Index: examples/prolog.c
===================================================================
--- examples/prolog.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ examples/prolog.c	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,13 +10,13 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Mar  8 22:09:39 2016
-// Update Count     : 5
+// Last Modified On : Tue Dec 11 23:27:19 2018
+// Update Count     : 6
 //
 
 #include <fstream.hfa>
 
-void printResult( int x ) { sout | "int" | endl; }
-void printResult( double x ) { sout | "double" | endl; }
-void printResult( char * x ) { sout | "char*" | endl; }
+void printResult( int x ) { sout | "int"; }
+void printResult( double x ) { sout | "double"; }
+void printResult( char * x ) { sout | "char*"; }
 
 void is_arithmetic( int x ) {}
Index: examples/quad.c
===================================================================
--- examples/quad.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ examples/quad.c	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Mar  8 22:07:02 2016
-// Update Count     : 8
+// Last Modified On : Tue Dec 11 23:26:58 2018
+// Update Count     : 9
 //
 
@@ -28,5 +28,5 @@
 int main() {
 	int N = 2;
-	sout | "result of quad of" | N | "is" | quad( N ) | endl;
+	sout | "result of quad of" | N | "is" | quad( N );
 }
 
Index: examples/square.c
===================================================================
--- examples/square.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ examples/square.c	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Mar  8 22:05:48 2016
-// Update Count     : 27
+// Last Modified On : Tue Dec 11 23:28:24 2018
+// Update Count     : 28
 //
 
@@ -23,5 +23,5 @@
 int main() {
 #if 0
-	sout | "result of squaring 9 is " | endl;
+	sout | "result of squaring 9 is ";
 
 	// char does not have multiplication.
@@ -30,7 +30,7 @@
 	} // ?*?
 	char c = 9;
-	sout | "char\t\t\t" | square( c ) | endl;
+	sout | "char\t\t\t" | square( c );
 
-	sout | square( s ) | endl;
+	sout | square( s );
 #endif
 	short s = 9;
@@ -38,29 +38,29 @@
 #if 0
 	signed int i = 9;
-	sout | "signed int\t\t" | square( i ) | endl;
+	sout | "signed int\t\t" | square( i );
 
 	unsigned int ui = 9;
-	sout | "unsigned int\t\t" | square( ui ) | endl;
+	sout | "unsigned int\t\t" | square( ui );
 
 	long int li = 9;
-	sout | "signed long int\t\t" | square( li ) | endl;
+	sout | "signed long int\t\t" | square( li );
 
 	unsigned long int uli = 9;
-	sout | "unsigned long int\t" | square( uli ) | endl;
+	sout | "unsigned long int\t" | square( uli );
 
 	signed long long int lli = 9;
-	sout | "signed long long int\t" | square( lli ) | endl;
+	sout | "signed long long int\t" | square( lli );
 
 	unsigned long long int ulli = 9;
-	sout | "unsigned long long int\t" | square( ulli ) | endl;
+	sout | "unsigned long long int\t" | square( ulli );
 
 	float f = 9.0;
-	sout | "float\t\t\t" | square( f ) | endl;
+	sout | "float\t\t\t" | square( f );
 
 	double d = 9.0;
-	sout | "double\t\t\t" | square( d ) | endl;
+	sout | "double\t\t\t" | square( d );
 
 	long double ld = 9.0;
-	sout | "long double\t\t" | square( ld ) | endl;
+	sout | "long double\t\t" | square( ld );
 #endif
 } // main
Index: examples/twice.c
===================================================================
--- examples/twice.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ examples/twice.c	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Oct 19 21:52:57 2017
-// Update Count     : 46
+// Last Modified On : Tue Dec 11 23:28:08 2018
+// Update Count     : 47
 //
 
@@ -28,5 +28,5 @@
 
 int main( void ) {
-	sout | twice( ' ' ) | ' ' | twice( (signed char)0 ) | twice( (int)1 ) | twice( 3.2 ) | endl;
+	sout | twice( ' ' ) | ' ' | twice( (signed char)0 ) | twice( (int)1 ) | twice( 3.2 );
 }
 
Index: examples/wrapper/src/main.c
===================================================================
--- examples/wrapper/src/main.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ examples/wrapper/src/main.c	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -1,25 +1,16 @@
 #include "pointer.h"
 
-wrapper_t make_copy(wrapper_t copy)
-{
+wrapper_t make_copy(wrapper_t copy) {
 	return copy;
 }
 
-int main(int argc, char const *argv[])
-{
+int main(int argc, char const *argv[]) {
 	wrapper_t p = wrap(6);
-
-	sout | endl | "test started" | endl;
-
+	sout | nl | "test started";
 	wrapper_t p2 = p;
-
 	clear(&p);
-
 	p = p2;
-
 	wrapper_t p3 = make_copy(p2);
-
-	sout | endl | "test ended" | endl;
-
+	sout | nl | "test ended";
 	return 0;
 }
Index: examples/wrapper/src/pointer.h
===================================================================
--- examples/wrapper/src/pointer.h	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ examples/wrapper/src/pointer.h	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -34,5 +34,5 @@
 void ?{}(content_t* this)
 {
-	sout | "Constructing content" | endl;
+	sout | "Constructing content";
 	this->count = 0;
 }
@@ -40,5 +40,5 @@
 void ^?{}(content_t* this)
 {
-	sout | "Destroying content" | endl;
+	sout | "Destroying content";
 }
 
@@ -53,5 +53,5 @@
 void ?{}(wrapper_t* this)
 {
-	sout | "Constructing empty ref pointer" | endl | endl;
+	sout | "Constructing empty ref pointer" | nl;
 	this->ptr = NULL;
 }
@@ -59,8 +59,8 @@
 void ?{}(wrapper_t* this, wrapper_t rhs)
 {
-	sout | "Constructing ref pointer from copy" | endl;
+	sout | "Constructing ref pointer from copy";
 	this->ptr = rhs.ptr;
 	this->ptr->count++;
-	sout | "Reference is " | this->ptr->count | endl | endl;
+	sout | "Reference is " | this->ptr->count | nl;
 }
 
@@ -69,12 +69,12 @@
 	if(this->ptr)
 	{
-		sout | "Destroying ref pointer" | endl;
+		sout | "Destroying ref pointer";
 		this->ptr->count--;
-		sout | "Reference is " | this->ptr->count | endl | endl;
+		sout | "Reference is " | this->ptr->count | nl;
 		if(!this->ptr->count) delete(this->ptr);
 	}
 	else
 	{
-		sout | "Destroying empty ref pointer" | endl | endl;
+		sout | "Destroying empty ref pointer" | nl;
 	}
 }
@@ -82,14 +82,14 @@
 wrapper_t ?=?(wrapper_t* this, wrapper_t rhs)
 {
-	sout | "Setting ref pointer" | endl;
+	sout | "Setting ref pointer";
 	if(this->ptr)
 	{
 		this->ptr->count--;
-		sout | "Reference is " | this->ptr->count | endl | endl;
+		sout | "Reference is " | this->ptr->count | nl;
 		if(!this->ptr->count) delete(this->ptr);
 	}
 	this->ptr = rhs.ptr;
 	this->ptr->count++;
-	sout | "Reference is " | this->ptr->count | endl | endl;
+	sout | "Reference is " | this->ptr->count | nl;
 }
 
@@ -98,13 +98,13 @@
 	this->ptr = c;
 	this->ptr->count++;
-	sout | "Setting ref pointer" | endl;
-	sout | "Reference is " | this->ptr->count | endl | endl;
+	sout | "Setting ref pointer";
+	sout | "Reference is " | this->ptr->count | nl;
 }
 
 void clear(wrapper_t* this)
 {
-	sout | "Clearing ref pointer" | endl;
+	sout | "Clearing ref pointer";
 	this->ptr->count--;
-	sout | "Reference is " | this->ptr->count | endl | endl;
+	sout | "Reference is " | this->ptr->count | nl;
 	if(!this->ptr->count) delete(this->ptr);
 	this->ptr = NULL;
Index: examples/zero_one.c
===================================================================
--- examples/zero_one.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ examples/zero_one.c	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -3,15 +3,15 @@
 void foo(zero_t o)
 {
-	sout | "It's a Zero!" | endl;
+	sout | "It's a Zero!";
 }
 
 void foo(one_t o)
 {
-	sout | "It's a One!" | endl;
+	sout | "It's a One!";
 }
 
 void foo(int o)
 {
-	sout | "It's a Number!" | endl;
+	sout | "It's a Number!";
 }
 
Index: libcfa/configure
===================================================================
--- libcfa/configure	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ libcfa/configure	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -2970,4 +2970,7 @@
 		CONFIG_CFAFLAGS="-nodebug"
 		CONFIG_BUILDLIB="no"
+	;;
+	*)
+	as_fn_error $? "'Invalid value $CONFIGURATION for \$CONFIGURATION'" "$LINENO" 5
 	;;
 esac
@@ -16773,4 +16776,5 @@
 
 
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
Index: libcfa/configure.ac
===================================================================
--- libcfa/configure.ac	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ libcfa/configure.ac	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -59,4 +59,7 @@
 		CONFIG_BUILDLIB="no"
 	;;
+	*)
+	AC_MSG_ERROR('Invalid value $CONFIGURATION for \$CONFIGURATION')
+	;;
 esac
 
@@ -81,4 +84,5 @@
 AC_PROG_CC
 AM_PROG_AS
+AC_PROG_LIBTOOL
 AC_PROG_INSTALL
 AC_PROG_MAKE_SET
Index: libcfa/src/Makefile.am
===================================================================
--- libcfa/src/Makefile.am	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ libcfa/src/Makefile.am	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -68,5 +68,5 @@
 libdeps = $(join \
 	$(addsuffix $(DEPDIR)/ , $(dir $(libobjs) ) ), \
-	$(notdir ${libobjs:.lo=.Po}) \
+	$(notdir ${libobjs:.lo=.Plo}) \
 )
 
@@ -74,9 +74,9 @@
 
 prelude.o : prelude.cfa extras.cf gcc-builtins.cf builtins.cf @CFACC@ @CFACPP@
-	${AM_V_GEN}@CFACC@ ${AM_CFLAGS} ${CFLAGS} -quiet -in-tree -XCFA -l ${<} -c -o ${@}
+	${AM_V_GEN}@CFACC@ ${AM_CFLAGS} ${CFLAGS} -quiet -in-tree @CONFIG_CFAFLAGS@ -XCFA -l ${<} -c -o ${@}
 
 prelude.lo: prelude.cfa extras.cf gcc-builtins.cf builtins.cf @CFACC@ @CFACPP@
 	${AM_V_GEN}$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile \
-	@CFACC@ ${AM_CFLAGS} ${CFLAGS} -quiet -in-tree -XCFA -l ${<} -c -o ${@}
+	@CFACC@ ${AM_CFLAGS} ${CFLAGS} -quiet -in-tree @CONFIG_CFAFLAGS@ -XCFA -l ${<} -c -o ${@}
 
 
Index: libcfa/src/Makefile.in
===================================================================
--- libcfa/src/Makefile.in	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ libcfa/src/Makefile.in	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -407,4 +407,17 @@
 am__v_CFA_0 = @echo "  CFA     " $@;
 am__v_CFA_1 = 
+AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
+am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
+am__v_JAVAC_0 = @echo "  JAVAC   " $@;
+am__v_JAVAC_1 = 
+AM_V_GOC = $(am__v_GOC_@AM_V@)
+am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
+am__v_GOC_0 = @echo "  GOC     " $@;
+am__v_GOC_1 = 
+UPPCOMPILE = $(UPPCC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_UPPFLAGS) $(UPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_UPP = $(am__v_UPP_@AM_V@)
+am__v_UPP_ = $(am__v_UPP_@AM_DEFAULT_V@)
+am__v_UPP_0 = @echo "  UPP     " $@;
+am__v_UPP_1 = 
 lib_LTLIBRARIES = libcfa.la
 
@@ -453,5 +466,5 @@
 libdeps = $(join \
 	$(addsuffix $(DEPDIR)/ , $(dir $(libobjs) ) ), \
-	$(notdir ${libobjs:.lo=.Po}) \
+	$(notdir ${libobjs:.lo=.Plo}) \
 )
 
@@ -912,9 +925,9 @@
 
 prelude.o : prelude.cfa extras.cf gcc-builtins.cf builtins.cf @CFACC@ @CFACPP@
-	${AM_V_GEN}@CFACC@ ${AM_CFLAGS} ${CFLAGS} -quiet -in-tree -XCFA -l ${<} -c -o ${@}
+	${AM_V_GEN}@CFACC@ ${AM_CFLAGS} ${CFLAGS} -quiet -in-tree @CONFIG_CFAFLAGS@ -XCFA -l ${<} -c -o ${@}
 
 prelude.lo: prelude.cfa extras.cf gcc-builtins.cf builtins.cf @CFACC@ @CFACPP@
 	${AM_V_GEN}$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile \
-	@CFACC@ ${AM_CFLAGS} ${CFLAGS} -quiet -in-tree -XCFA -l ${<} -c -o ${@}
+	@CFACC@ ${AM_CFLAGS} ${CFLAGS} -quiet -in-tree @CONFIG_CFAFLAGS@ -XCFA -l ${<} -c -o ${@}
 
 #----------------------------------------------------------------------------------------------------------------
Index: libcfa/src/bits/locks.hfa
===================================================================
--- libcfa/src/bits/locks.hfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ libcfa/src/bits/locks.hfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -37,19 +37,7 @@
 #endif
 
-#if defined( __i386 ) || defined( __x86_64 ) || defined( __ARM_ARCH )
-	// Intel recommendation
-	#define __ALIGN__ __attribute__(( aligned (128) ))
-#elif defined( __sparc )
-	#define __ALIGN__ CALIGN
-#else
-	#error unsupported architecture
-#endif
-
 struct __spinlock_t {
 	// Wrap in struct to prevent false sharing with debug info
-	struct {
-		// Align lock on 128-bit boundary
-		__ALIGN__ volatile bool lock;
-	};
+	volatile bool lock;
 	#ifdef __CFA_DEBUG__
 		// previous function to acquire the lock
@@ -58,5 +46,5 @@
 		void* prev_thrd;
 	#endif
-} __ALIGN__;
+};
 
 #ifdef __cforall
Index: libcfa/src/concurrency/CtxSwitch-arm.S
===================================================================
--- libcfa/src/concurrency/CtxSwitch-arm.S	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ libcfa/src/concurrency/CtxSwitch-arm.S	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,62 @@
+	@ 32 bit ARM context switch
+	@ This function assumes that r9 has no special meaning on the platform it's
+	@ being built on.
+	@ If r9 is special, uncomment the following line and it will be left alone
+
+	@ #define R9_SPECIAL
+
+	#define PTR_BYTE        4
+	#define SP_OFFSET       ( 0 * PTR_BYTE )
+	#define FP_OFFSET       ( 1 * PTR_BYTE )
+	#define PC_OFFSET       ( 2 * PTR_BYTE )
+
+	.text
+	.align  2
+	.global CtxSwitch
+	.type   CtxSwitch, %function
+
+CtxSwitch:
+	@ save callee-saved registers: r4-r8, r10, r11, r13(sp) (plus r9 depending on platform specification)
+	@ I've seen reference to 31 registers on 64-bit, if this is the case, more need to be saved
+	@ save thread state registers: r14(lr)
+	@ r12(ip) is intra-procedure-call scratch register, does not need saving between function calls
+
+	#ifdef R9_SPECIAL
+	stmfd r13!, {r4-r8,r10,r11,r14}
+	#else
+	stmfd r13!, {r4-r11,r14}
+	#endif // R9_SPECIAL
+
+	@ save floating point registers: s16-s31
+	vstmdb r13!, {s16-s31}
+
+	@ save frame pointer and stack pointer to outgoing datastructure
+	str sp, [r0, #SP_OFFSET]
+	str fp, [r0, #FP_OFFSET]
+
+	@ restore frame pointer and stack pointer from incoming datastructure
+	ldr fp, [r1, #FP_OFFSET]
+	ldr sp, [r1, #SP_OFFSET]
+
+	@ restore floating point registers: s16-s31
+	vldm r13!, {s16-s31}
+	@ restore r14(lr)
+	@ restore 64-bit extra registers?
+	@ restore callee-saved registers: r4-r8, r10, r11, r13
+
+	#ifdef R9_SPECIAL
+	ldmfd r13!, {r4-r8,r10,r11,r15}
+	#else
+	ldmfd r13!, {r4-r11,r14}    @ loading r14 back into r15 returns
+
+	mov r15, r14
+	#endif // R9_SPECIAL
+	
+	.text
+	.align  2
+	.global CtxInvokeStub
+	.type   CtxInvokeStub, %function
+
+CtxInvokeStub:
+        ldmfd r13!, {r0-r1}
+	mov r15, r1
Index: bcfa/src/concurrency/CtxSwitch-armv7l.S
===================================================================
--- libcfa/src/concurrency/CtxSwitch-armv7l.S	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,62 +1,0 @@
-	@ 32 bit ARM context switch
-	@ This function assumes that r9 has no special meaning on the platform it's
-	@ being built on.
-	@ If r9 is special, uncomment the following line and it will be left alone
-
-	@ #define R9_SPECIAL
-
-	#define PTR_BYTE        4
-	#define SP_OFFSET       ( 0 * PTR_BYTE )
-	#define FP_OFFSET       ( 1 * PTR_BYTE )
-	#define PC_OFFSET       ( 2 * PTR_BYTE )
-
-	.text
-	.align  2
-	.global CtxSwitch
-	.type   CtxSwitch, %function
-
-CtxSwitch:
-	@ save callee-saved registers: r4-r8, r10, r11, r13(sp) (plus r9 depending on platform specification)
-	@ I've seen reference to 31 registers on 64-bit, if this is the case, more need to be saved
-	@ save thread state registers: r14(lr)
-	@ r12(ip) is intra-procedure-call scratch register, does not need saving between function calls
-
-	#ifdef R9_SPECIAL
-	stmfd r13!, {r4-r8,r10,r11,r14}
-	#else
-	stmfd r13!, {r4-r11,r14}
-	#endif // R9_SPECIAL
-
-	@ save floating point registers: s16-s31
-	vstmdb r13!, {s16-s31}
-
-	@ save frame pointer and stack pointer to outgoing datastructure
-	str sp, [r0, #SP_OFFSET]
-	str fp, [r0, #FP_OFFSET]
-
-	@ restore frame pointer and stack pointer from incoming datastructure
-	ldr fp, [r1, #FP_OFFSET]
-	ldr sp, [r1, #SP_OFFSET]
-
-	@ restore floating point registers: s16-s31
-	vldm r13!, {s16-s31}
-	@ restore r14(lr)
-	@ restore 64-bit extra registers?
-	@ restore callee-saved registers: r4-r8, r10, r11, r13
-
-	#ifdef R9_SPECIAL
-	ldmfd r13!, {r4-r8,r10,r11,r15}
-	#else
-	ldmfd r13!, {r4-r11,r14}    @ loading r14 back into r15 returns
-
-	mov r15, r14
-	#endif // R9_SPECIAL
-	
-	.text
-	.align  2
-	.global CtxInvokeStub
-	.type   CtxInvokeStub, %function
-
-CtxInvokeStub:
-        ldmfd r13!, {r0-r1}
-	mov r15, r1
Index: libcfa/src/concurrency/coroutine.cfa
===================================================================
--- libcfa/src/concurrency/coroutine.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ libcfa/src/concurrency/coroutine.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -22,4 +22,8 @@
 #include <string.h>
 #include <unistd.h>
+// use this define to make unwind.h play nice, definetely a hack
+#define HIDE_EXPORTS
+#include <unwind.h>
+#undef HIDE_EXPORTS
 #include <sys/mman.h>
 }
@@ -29,4 +33,12 @@
 #define __CFA_INVOKE_PRIVATE__
 #include "invoke.h"
+
+extern "C" {
+      void _CtxCoroutine_Unwind(struct _Unwind_Exception * storage) __attribute__ ((__noreturn__));
+      static void _CtxCoroutine_UnwindCleanup(_Unwind_Reason_Code, struct _Unwind_Exception *) __attribute__ ((__noreturn__));
+      static void _CtxCoroutine_UnwindCleanup(_Unwind_Reason_Code, struct _Unwind_Exception *) {
+            abort();
+      }
+}
 
 //-----------------------------------------------------------------------------
@@ -67,7 +79,26 @@
       starter = NULL;
       last = NULL;
-}
-
-void ^?{}(coroutine_desc& this) {}
+      cancellation = NULL;
+}
+
+void ^?{}(coroutine_desc& this) {
+      if(this.state != Halted) {
+            coroutine_desc * src = TL_GET( this_coroutine );
+            coroutine_desc * dst = &this;
+
+            struct _Unwind_Exception storage;
+            storage.exception_class = -1;
+            storage.exception_cleanup = _CtxCoroutine_UnwindCleanup;
+            this.cancellation = &storage;
+            this.last = src;
+
+	      // not resuming self ?
+	      if ( src == dst ) {
+		      abort( "Attempt by coroutine %.256s (%p) to terminate itself.\n", src->name, src );
+            }
+
+	      CoroutineCtxSwitch( src, dst );
+      }
+}
 
 // Part of the Public API
@@ -105,4 +136,8 @@
       // Safety note : This could cause some false positives due to preemption
       verify( TL_GET( preemption_state.enabled ) || TL_GET( this_processor )->do_terminate );
+
+      if( unlikely(src->cancellation != NULL) ) {
+            _CtxCoroutine_Unwind(src->cancellation);
+      }
 } //ctxSwitchDirect
 
@@ -162,17 +197,20 @@
       }
 
-      void __leave_coroutine(void) {
+      void __leave_coroutine() {
             coroutine_desc * src = TL_GET( this_coroutine ); // optimization
-
-            assertf( src->starter != 0,
+            coroutine_desc * starter = src->cancellation != 0 ? src->last : src->starter;
+
+            src->state = Halted;
+
+            assertf( starter != 0,
                   "Attempt to suspend/leave coroutine \"%.256s\" (%p) that has never been resumed.\n"
                   "Possible cause is a suspend executed in a member called by a coroutine user rather than by the coroutine main.",
                   src->name, src );
-            assertf( src->starter->state != Halted,
+            assertf( starter->state != Halted,
                   "Attempt by coroutine \"%.256s\" (%p) to suspend/leave back to terminated coroutine \"%.256s\" (%p).\n"
                   "Possible cause is terminated coroutine's main routine has already returned.",
-                  src->name, src, src->starter->name, src->starter );
-
-            CoroutineCtxSwitch( src, src->starter );
+                  src->name, src, starter->name, starter );
+
+            CoroutineCtxSwitch( src, starter );
       }
 }
Index: libcfa/src/concurrency/invoke.c
===================================================================
--- libcfa/src/concurrency/invoke.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ libcfa/src/concurrency/invoke.c	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -17,4 +17,5 @@
 #include <stdlib.h>
 #include <stdio.h>
+#include <unwind.h>
 
 #include "invoke.h"
@@ -50,9 +51,33 @@
 	main( this );
 
-	cor->state = Halted;
-
 	//Final suspend, should never return
 	__leave_coroutine();
 	__cabi_abort( "Resumed dead coroutine" );
+}
+
+static _Unwind_Reason_Code _CtxCoroutine_UnwindStop(
+	__attribute((__unused__)) int version,
+	_Unwind_Action actions,
+	__attribute((__unused__)) _Unwind_Exception_Class exceptionClass,
+	__attribute((__unused__)) struct _Unwind_Exception * unwind_exception,
+	__attribute((__unused__)) struct _Unwind_Context * context,
+	__attribute((__unused__)) void * param
+) {
+	if( actions & _UA_END_OF_STACK  ) {
+		// We finished unwinding the coroutine,
+		// leave it
+		__leave_coroutine();
+		__cabi_abort( "Resumed dead coroutine" );
+	}
+	if( actions & _UA_CLEANUP_PHASE ) return _URC_NO_REASON;
+
+	return _URC_FATAL_PHASE2_ERROR;
+}
+
+void _CtxCoroutine_Unwind(struct _Unwind_Exception * storage) __attribute__ ((__noreturn__));
+void _CtxCoroutine_Unwind(struct _Unwind_Exception * storage) {
+	_Unwind_Reason_Code ret = _Unwind_ForcedUnwind( storage, _CtxCoroutine_UnwindStop, NULL );
+	printf("UNWIND ERROR %d after force unwind\n", ret);
+	abort();
 }
 
Index: libcfa/src/concurrency/invoke.h
===================================================================
--- libcfa/src/concurrency/invoke.h	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ libcfa/src/concurrency/invoke.h	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -80,12 +80,27 @@
 
 	struct coroutine_desc {
-		struct coStack_t stack;							// stack information of the coroutine
-		const char * name;								// textual name for coroutine/task, initialized by uC++ generated code
-		int errno_;										// copy of global UNIX variable errno
-		enum coroutine_state state;						// current execution status for coroutine
-		struct coroutine_desc * starter;				// first coroutine to resume this one
-		struct coroutine_desc * last;					// last coroutine to resume this one
-	};
-
+		// stack information of the coroutine
+		struct coStack_t stack;
+
+		// textual name for coroutine/task, initialized by uC++ generated code
+		const char * name;
+
+		// copy of global UNIX variable errno
+		int errno_;
+
+		// current execution status for coroutine
+		enum coroutine_state state;
+		// first coroutine to resume this one
+		struct coroutine_desc * starter;
+
+		// last coroutine to resume this one
+		struct coroutine_desc * last;
+
+		// If non-null stack must be unwound with this exception
+		struct _Unwind_Exception * cancellation;
+
+	};
+
+	// struct which calls the monitor is accepting
 	struct __waitfor_mask_t {
 		// the index of the accepted function, -1 if none
Index: libcfa/src/fstream.cfa
===================================================================
--- libcfa/src/fstream.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ libcfa/src/fstream.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Aug 10 18:19:40 2018
-// Update Count     : 284
+// Last Modified On : Mon Dec 24 18:33:38 2018
+// Update Count     : 304
 //
 
@@ -20,5 +20,4 @@
 #include <stdarg.h>										// varargs
 #include <string.h>										// strlen
-#include <stdbool.h>									// true/false
 #include <float.h>										// DBL_DIG, LDBL_DIG
 #include <complex.h>									// creal, cimag
@@ -27,8 +26,10 @@
 #define IO_MSG "I/O error: "
 
-void ?{}( ofstream & os, void * file, bool sepDefault, bool sepOnOff, const char * separator, const char * tupleSeparator ) {
+void ?{}( ofstream & os, void * file, bool sepDefault, bool sepOnOff, bool nlOnOff, bool prt, const char * separator, const char * tupleSeparator ) {
 	os.file = file;
 	os.sepDefault = sepDefault;
 	os.sepOnOff = sepOnOff;
+	os.nlOnOff = nlOnOff;
+	os.prt = prt;
 	sepSet( os, separator );
 	sepSetCur( os, sepGet( os ) );
@@ -44,4 +45,7 @@
 bool getNL( ofstream & os ) { return os.sawNL; }
 void setNL( ofstream & os, bool state ) { os.sawNL = state; }
+bool getANL( ofstream & os ) { return os.nlOnOff; }
+bool getPrt( ofstream & os ) { return os.prt; }
+void setPrt( ofstream & os, bool state ) { os.prt = state; }
 
 // public
@@ -72,4 +76,7 @@
 } // sepEnable
 
+void nlOn( ofstream & os ) { os.nlOnOff = true; }
+void nlOff( ofstream & os ) { os.nlOnOff = false; }
+
 const char * sepGet( ofstream & os ) { return os.separator; }
 void sepSet( ofstream & os, const char * s ) {
@@ -103,5 +110,5 @@
 	} // if
 	#endif // __CFA_DEBUG__
-	(os){ file, true, false, " ", ", " };
+	(os){ file, true, false, true, false, " ", ", " };
 } // open
 
@@ -143,11 +150,12 @@
 	va_end( args );
 
+	setPrt( os, true );									// called in output cascade
 	sepReset( os );										// reset separator
 	return len;
 } // fmt
 
-static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_), true, false, " ", ", " };
+static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_), true, false, true, false, " ", ", " };
 ofstream & sout = soutFile;
-static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_), true, false, " ", ", " };
+static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_), true, false, true, false, " ", ", " };
 ofstream & serr = serrFile;
 
Index: libcfa/src/fstream.hfa
===================================================================
--- libcfa/src/fstream.hfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ libcfa/src/fstream.hfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Aug 11 13:54:27 2018
-// Update Count     : 132
+// Last Modified On : Mon Dec 24 18:33:41 2018
+// Update Count     : 149
 //
 
@@ -23,4 +23,6 @@
 	bool sepDefault;
 	bool sepOnOff;
+	bool nlOnOff;
+	bool prt;											// print text
 	bool sawNL;
 	const char * sepCur;
@@ -37,4 +39,7 @@
 bool getNL( ofstream & );
 void setNL( ofstream &, bool );
+bool getANL( ofstream & );
+bool getPrt( ofstream & );
+void setPrt( ofstream &, bool );
 
 // public
@@ -43,4 +48,6 @@
 bool sepDisable( ofstream & );
 bool sepEnable( ofstream & );
+void nlOn( ofstream & );
+void nlOff( ofstream & );
 
 const char * sepGet( ofstream & );
@@ -55,5 +62,5 @@
 void close( ofstream & );
 ofstream & write( ofstream &, const char * data, size_t size );
-int fmt( ofstream &, const char fmt[], ... );
+int fmt( ofstream &, const char format[], ... );
 
 void ?{}( ofstream & os );
@@ -76,5 +83,5 @@
 ifstream & read( ifstream & is, char * data, size_t size );
 ifstream & ungetc( ifstream & is, char c );
-int fmt( ifstream &, const char fmt[], ... );
+int fmt( ifstream &, const char format[], ... );
 
 void ?{}( ifstream & is );
Index: libcfa/src/gmp.hfa
===================================================================
--- libcfa/src/gmp.hfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ libcfa/src/gmp.hfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Tue Apr 19 08:43:43 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Dec  7 09:10:41 2017
-// Update Count     : 21
+// Last Modified On : Tue Dec  4 23:25:51 2018
+// Update Count     : 22
 //
 
@@ -262,11 +262,16 @@
 } // ?|?
 
-static inline forall( dtype ostype | ostream( ostype ) )
-ostype & ?|?( ostype & os, Int mp ) {
-	if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
-	gmp_printf( "%Zd", mp.mpz );
-	sepOn( os );
- 	return os;
-} // ?|?
+static inline forall( dtype ostype | ostream( ostype ) ) {
+	ostype & ?|?( ostype & os, Int mp ) {
+		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		gmp_printf( "%Zd", mp.mpz );
+		sepOn( os );
+		return os;
+	} // ?|?
+
+	void ?|?( ostype & os, Int mp ) {
+		(ostype)(os | mp); if ( getANL( os ) ) nl( os );
+	} // ?|?
+} // distribution
 
 // Local Variables: //
Index: libcfa/src/iostream.cfa
===================================================================
--- libcfa/src/iostream.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ libcfa/src/iostream.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Nov  2 07:17:05 2018
-// Update Count     : 474
+// Last Modified On : Mon Dec 24 18:33:40 2018
+// Update Count     : 589
 //
 
@@ -19,5 +19,5 @@
 #include <stdio.h>
 #include <stdbool.h>									// true/false
-//#include <string.h>										// strlen, strcmp
+//#include <string.h>									// strlen, strcmp
 extern int strcmp (const char *__s1, const char *__s2) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
 extern size_t strlen (const char *__s) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
@@ -32,22 +32,33 @@
 		return os;
 	} // ?|?
-
-	ostype & ?|?( ostype & os, char ch ) {
-		fmt( os, "%c", ch );
-		if ( ch == '\n' ) setNL( os, true );
-		sepOff( os );
-		return os;
-	} // ?|?
-
-	ostype & ?|?( ostype & os, signed char c ) {
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
-		fmt( os, "%hhd", c );
-		return os;
-	} // ?|?
-
-	ostype & ?|?( ostype & os, unsigned char c ) {
-		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
-		fmt( os, "%hhu", c );
-		return os;
+	void ?|?( ostype & os, bool b ) {
+		(ostype &)(os | b); nl( os );
+	} // ?|?
+
+	ostype & ?|?( ostype & os, char c ) {
+		fmt( os, "%c", c );
+		if ( c == '\n' ) setNL( os, true );
+		return sepOff( os );
+	} // ?|?
+	void ?|?( ostype & os, char c ) {
+		(ostype &)(os | c); nl( os );
+	} // ?|?
+
+	ostype & ?|?( ostype & os, signed char sc ) {
+		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		fmt( os, "%hhd", sc );
+		return os;
+	} // ?|?
+	void ?|?( ostype & os, signed char sc ) {
+		(ostype &)(os | sc); nl( os );
+	} // ?|?
+
+	ostype & ?|?( ostype & os, unsigned char usc ) {
+		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
+		fmt( os, "%hhu", usc );
+		return os;
+	} // ?|?
+	void ?|?( ostype & os, unsigned char usc ) {
+		(ostype &)(os | usc); nl( os );
 	} // ?|?
 
@@ -57,4 +68,7 @@
 		return os;
 	} // ?|?
+	void & ?|?( ostype & os, short int si ) {
+		(ostype &)(os | si); nl( os );
+	} // ?|?
 
 	ostype & ?|?( ostype & os, unsigned short int usi ) {
@@ -63,4 +77,7 @@
 		return os;
 	} // ?|?
+	void & ?|?( ostype & os, unsigned short int usi ) {
+		(ostype &)(os | usi); nl( os );
+	} // ?|?
 
 	ostype & ?|?( ostype & os, int i ) {
@@ -69,4 +86,7 @@
 		return os;
 	} // ?|?
+	void & ?|?( ostype & os, int i ) {
+		(ostype &)(os | i); nl( os );
+	} // ?|?
 
 	ostype & ?|?( ostype & os, unsigned int ui ) {
@@ -75,4 +95,7 @@
 		return os;
 	} // ?|?
+	void & ?|?( ostype & os, unsigned int ui ) {
+		(ostype &)(os | ui); nl( os );
+	} // ?|?
 
 	ostype & ?|?( ostype & os, long int li ) {
@@ -81,4 +104,7 @@
 		return os;
 	} // ?|?
+	void & ?|?( ostype & os, long int li ) {
+		(ostype &)(os | li); nl( os );
+	} // ?|?
 
 	ostype & ?|?( ostype & os, unsigned long int uli ) {
@@ -87,4 +113,7 @@
 		return os;
 	} // ?|?
+	void & ?|?( ostype & os, unsigned long int uli ) {
+		(ostype &)(os | uli); nl( os );
+	} // ?|?
 
 	ostype & ?|?( ostype & os, long long int lli ) {
@@ -93,4 +122,7 @@
 		return os;
 	} // ?|?
+	void & ?|?( ostype & os, long long int lli ) {
+		(ostype &)(os | lli); nl( os );
+	} // ?|?
 
 	ostype & ?|?( ostype & os, unsigned long long int ulli ) {
@@ -99,4 +131,7 @@
 		return os;
 	} // ?|?
+	void & ?|?( ostype & os, unsigned long long int ulli ) {
+		(ostype &)(os | ulli); nl( os );
+	} // ?|?
 
 	ostype & ?|?( ostype & os, float f ) {
@@ -105,4 +140,7 @@
 		return os;
 	} // ?|?
+	void & ?|?( ostype & os, float f ) {
+		(ostype &)(os | f); nl( os );
+	} // ?|?
 
 	ostype & ?|?( ostype & os, double d ) {
@@ -111,4 +149,7 @@
 		return os;
 	} // ?|?
+	void & ?|?( ostype & os, double d ) {
+		(ostype &)(os | d); nl( os );
+	} // ?|?
 
 	ostype & ?|?( ostype & os, long double ld ) {
@@ -117,4 +158,7 @@
 		return os;
 	} // ?|?
+	void & ?|?( ostype & os, long double ld ) {
+		(ostype &)(os | ld); nl( os );
+	} // ?|?
 
 	ostype & ?|?( ostype & os, float _Complex fc ) {
@@ -123,4 +167,7 @@
 		return os;
 	} // ?|?
+	void & ?|?( ostype & os, float _Complex fc ) {
+		(ostype &)(os | fc); nl( os );
+	} // ?|?
 
 	ostype & ?|?( ostype & os, double _Complex dc ) {
@@ -129,4 +176,7 @@
 		return os;
 	} // ?|?
+	void & ?|?( ostype & os, double _Complex dc ) {
+		(ostype &)(os | dc); nl( os );
+	} // ?|?
 
 	ostype & ?|?( ostype & os, long double _Complex ldc ) {
@@ -134,4 +184,7 @@
 		fmt( os, "%.*Lg%+.*Lgi", LDBL_DIG, creall( ldc ), LDBL_DIG, cimagl( ldc ) );
 		return os;
+	} // ?|?
+	void & ?|?( ostype & os, long double _Complex ldc ) {
+		(ostype &)(os | ldc); nl( os );
 	} // ?|?
 
@@ -174,4 +227,7 @@
 		return write( os, str, len );
 	} // ?|?
+	void ?|?( ostype & os, const char * str ) {
+		(ostype &)(os | str); nl( os );
+	} // ?|?
 
 // 	ostype & ?|?( ostype & os, const char16_t * str ) {
@@ -200,75 +256,109 @@
 		return os;
 	} // ?|?
-
+	void ?|?( ostype & os, const void * p ) {
+		(ostype &)(os | p); nl( os );
+	} // ?|?
 
 	// manipulators
 	ostype & ?|?( ostype & os, ostype & (* manip)( ostype & ) ) {
-		return manip( os );
+		(ostype &)(manip( os ));
+		return os;
+	} // ?|?
+	void ?|?( ostype & os, ostype & (* manip)( ostype & ) ) {
+		(ostype &)(manip( os ));
+		if ( getPrt( os ) ) nl( os );					// something printed ?
+		setPrt( os, false );							// turn off
 	} // ?|?
 
 	ostype & sep( ostype & os ) {
-		os | sepGet( os );
-		return os;
+		return (ostype &)(os | sepGet( os ));
 	} // sep
 
 	ostype & sepTuple( ostype & os ) {
-		os | sepGetTuple( os );
-		return os;
+		return os | sepGetTuple( os );
 	} // sepTuple
 
-	ostype & endl( ostype & os ) {
-		os | '\n';
+	ostype & nl( ostype & os ) {
+		(ostype &)(os | '\n');
+		setPrt( os, false );							// turn off
 		setNL( os, true );
 		flush( os );
-		sepOff( os );									// prepare for next line
-		return os;
-	} // endl
+		return sepOff( os );							// prepare for next line
+	} // nl
+
+	void nl( ostype & os ) {
+		if ( getANL( os ) ) (ostype &)(nl( os ));		// implementation only
+		else setPrt( os, false );						// turn off
+	} // nl
+
+	ostype & nonl( ostype & os ) {
+		setPrt( os, false );							// turn off
+		return os;
+	} // nonl
 
 	ostype & sepOn( ostype & os ) {
-		sepOn( os );
+		sepOn( os );									// call void returning
 		return os;
 	} // sepOn
 
 	ostype & sepOff( ostype & os ) {
-		sepOff( os );
+		sepOff( os );									// call void returning
 		return os;
 	} // sepOff
 
 	ostype & sepEnable( ostype & os ) {
-		sepEnable( os );
+		sepEnable( os );								// call void returning
 		return os;
 	} // sepEnable
 
 	ostype & sepDisable( ostype & os ) {
-		sepDisable( os );
+		sepDisable( os );								// call void returning
 		return os;
 	} // sepDisable
+
+	ostype & nlOn( ostype & os ) {
+		nlOn( os );										// call void returning
+		return os;
+	} // nlOn
+
+	ostype & nlOff( ostype & os ) {
+		nlOff( os );									// call void returning
+		return os;
+	} // nlOff
 } // distribution
 
-
 // tuples
-forall( dtype ostype, otype T, ttype Params | writeable( T, ostype ) | { ostype & ?|?( ostype &, Params ); } )
-ostype & ?|?( ostype & os, T arg, Params rest ) {
-	os | arg;											// print first argument
-	sepSetCur( os, sepGetTuple( os ) );					// switch to tuple separator
-	os | rest;											// print remaining arguments
-	sepSetCur( os, sepGet( os ) );						// switch to regular separator
-	return os;
-} // ?|?
+forall( dtype ostype, otype T, ttype Params | writeable( T, ostype ) | { ostype & ?|?( ostype &, Params ); } ) {
+	ostype & ?|?( ostype & os, T arg, Params rest ) {
+		(ostype &)(os | arg);							// print first argument
+		sepSetCur( os, sepGetTuple( os ) );				// switch to tuple separator
+		(ostype &)(os | rest);							// print remaining arguments
+		sepSetCur( os, sepGet( os ) );					// switch to regular separator
+		return os;
+	} // ?|?
+	void ?|?( ostype & os, T arg, Params rest ) {
+		// (ostype &)(?|?( os, arg, rest )); nl( os );
+		(ostype &)(os | arg);							// print first argument
+		sepSetCur( os, sepGetTuple( os ) );				// switch to tuple separator
+		(ostype &)(os | rest);							// print remaining arguments
+		sepSetCur( os, sepGet( os ) );					// switch to regular separator
+		nl( os );
+	} // ?|?
+} // distribution
 
 //---------------------------------------
 
 // writes the range [begin, end) to the given stream
-forall( dtype ostype, otype elt_type | writeable( elt_type, ostype ), otype iterator_type | iterator( iterator_type, elt_type ) )
-void write( iterator_type begin, iterator_type end, ostype & os ) {
-	void print( elt_type i ) { os | i; }
-	for_each( begin, end, print );
-} // ?|?
-
-forall( dtype ostype, otype elt_type | writeable( elt_type, ostype ), otype iterator_type | iterator( iterator_type, elt_type ) )
-void write_reverse( iterator_type begin, iterator_type end, ostype & os ) {
-	void print( elt_type i ) { os | i; }
-	for_each_reverse( begin, end, print );
-} // ?|?
+forall( dtype ostype, otype elt_type | writeable( elt_type, ostype ), otype iterator_type | iterator( iterator_type, elt_type ) ) {
+	void write( iterator_type begin, iterator_type end, ostype & os ) {
+		void print( elt_type i ) { os | i; }
+		for_each( begin, end, print );
+	} // ?|?
+
+	void write_reverse( iterator_type begin, iterator_type end, ostype & os ) {
+		void print( elt_type i ) { os | i; }
+		for_each_reverse( begin, end, print );
+	} // ?|?
+} // distribution
 
 //---------------------------------------
@@ -386,8 +476,8 @@
 	} // ?|?
 
-	istype & endl( istype & is ) {
+	istype & nl( istype & is ) {
 		fmt( is, "%*[ \t\f\n\r\v]" );					// ignore whitespace
 		return is;
-	} // endl
+	} // nl
 } // distribution
 
Index: libcfa/src/iostream.hfa
===================================================================
--- libcfa/src/iostream.hfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ libcfa/src/iostream.hfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Aug 11 08:22:49 2018
-// Update Count     : 156
+// Last Modified On : Mon Dec 24 18:33:40 2018
+// Update Count     : 220
 //
 
@@ -20,16 +20,21 @@
 trait ostream( dtype ostype ) {
 	// private
-	bool sepPrt( ostype & );							// return separator state (on/off)
+	bool sepPrt( ostype & );							// get separator state (on/off)
 	void sepReset( ostype & );							// set separator state to default state
 	void sepReset( ostype &, bool );					// set separator and default state
 	const char * sepGetCur( ostype & );					// get current separator string
 	void sepSetCur( ostype &, const char * );			// set current separator string
-	bool getNL( ostype & );							// check newline
+	bool getNL( ostype & );								// check newline
 	void setNL( ostype &, bool );						// saw newline
+	bool getANL( ostype & );							// get auto newline (on/off)
+	bool getPrt( ostype & );							// get fmt called in output cascade
+	void setPrt( ostype &, bool );						// set fmt called in output cascade
 	// public
 	void sepOn( ostype & );								// turn separator state on
 	void sepOff( ostype & );							// turn separator state off
 	bool sepDisable( ostype & );						// set default state to off, and return previous state
-	bool sepEnable( ostype & );						// set default state to on, and return previous state
+	bool sepEnable( ostype & );							// set default state to on, and return previous state
+	void nlOn( ostype & );								// turn auto-newline state on
+	void nlOff( ostype & );								// turn auto-newline state off
 
 	const char * sepGet( ostype & );					// get separator string
@@ -43,5 +48,5 @@
 	void close( ostype & os );
 	ostype & write( ostype &, const char *, size_t );
-	int fmt( ostype &, const char fmt[], ... );
+	int fmt( ostype &, const char format[], ... );
 }; // ostream
 
@@ -58,27 +63,46 @@
 forall( dtype ostype | ostream( ostype ) ) {
 	ostype & ?|?( ostype &, bool );
+	void ?|?( ostype &, bool );
 
 	ostype & ?|?( ostype &, char );
+	void ?|?( ostype &, char );
 	ostype & ?|?( ostype &, signed char );
+	void ?|?( ostype &, signed char );
 	ostype & ?|?( ostype &, unsigned char );
+	void ?|?( ostype &, unsigned char );
 
 	ostype & ?|?( ostype &, short int );
+	void ?|?( ostype &, short int );
 	ostype & ?|?( ostype &, unsigned short int );
+	void ?|?( ostype &, unsigned short int );
 	ostype & ?|?( ostype &, int );
+	void ?|?( ostype &, int );
 	ostype & ?|?( ostype &, unsigned int );
+	void ?|?( ostype &, unsigned int );
 	ostype & ?|?( ostype &, long int );
+	void ?|?( ostype &, long int );
 	ostype & ?|?( ostype &, long long int );
+	void ?|?( ostype &, long long int );
 	ostype & ?|?( ostype &, unsigned long int );
+	void ?|?( ostype &, unsigned long int );
 	ostype & ?|?( ostype &, unsigned long long int );
+	void ?|?( ostype &, unsigned long long int );
 
 	ostype & ?|?( ostype &, float ); // FIX ME: should not be required
+	void ?|?( ostype &, float ); // FIX ME: should not be required
 	ostype & ?|?( ostype &, double );
+	void ?|?( ostype &, double );
 	ostype & ?|?( ostype &, long double );
+	void ?|?( ostype &, long double );
 
 	ostype & ?|?( ostype &, float _Complex );
+	void ?|?( ostype &, float _Complex );
 	ostype & ?|?( ostype &, double _Complex );
+	void ?|?( ostype &, double _Complex );
 	ostype & ?|?( ostype &, long double _Complex );
+	void ?|?( ostype &, long double _Complex );
 
 	ostype & ?|?( ostype &, const char * );
+	void ?|?( ostype &, const char * );
 	// ostype & ?|?( ostype &, const char16_t * );
 #if ! ( __ARM_ARCH_ISA_ARM == 1 && __ARM_32BIT_STATE == 1 ) // char32_t == wchar_t => ambiguous
@@ -87,8 +111,12 @@
 	// ostype & ?|?( ostype &, const wchar_t * );
 	ostype & ?|?( ostype &, const void * );
+	void ?|?( ostype &, const void * );
 
 	// manipulators
 	ostype & ?|?( ostype &, ostype & (*)( ostype & ) );
-	ostype & endl( ostype & );
+	void ?|?( ostype &, ostype & (*)( ostype & ) );
+	ostype & nl( ostype & );
+	void nl( ostype & );
+	ostype & nonl( ostype & );
 	ostype & sep( ostype & );
 	ostype & sepTuple( ostype & );
@@ -97,16 +125,19 @@
 	ostype & sepDisable( ostype & );
 	ostype & sepEnable( ostype & );
+	ostype & nlOn( ostype & );
+	ostype & nlOff( ostype & );
 } // distribution
 
 // tuples
-forall( dtype ostype, otype T, ttype Params | writeable( T, ostype ) | { ostype & ?|?( ostype &, Params ); } )
-ostype & ?|?( ostype & os, T arg, Params rest );
+forall( dtype ostype, otype T, ttype Params | writeable( T, ostype ) | { ostype & ?|?( ostype &, Params ); } ) {
+	ostype & ?|?( ostype & os, T arg, Params rest );
+	void ?|?( ostype & os, T arg, Params rest );
+} // distribution
 
 // writes the range [begin, end) to the given stream
-forall( dtype ostype, otype elt_type | writeable( elt_type, ostype ), otype iterator_type | iterator( iterator_type, elt_type ) )
-void write( iterator_type begin, iterator_type end, ostype & os );
-
-forall( dtype ostype, otype elt_type | writeable( elt_type, ostype ), otype iterator_type | iterator( iterator_type, elt_type ) )
-void write_reverse( iterator_type begin, iterator_type end, ostype & os );
+forall( dtype ostype, otype elt_type | writeable( elt_type, ostype ), otype iterator_type | iterator( iterator_type, elt_type ) ) {
+	void write( iterator_type begin, iterator_type end, ostype & os );
+	void write_reverse( iterator_type begin, iterator_type end, ostype & os );
+} // distribution
 
 //---------------------------------------
@@ -119,5 +150,5 @@
 	istype & read( istype &, char *, size_t );
 	istype & ungetc( istype &, char );
-	int fmt( istype &, const char fmt[], ... );
+	int fmt( istype &, const char format[], ... );
 }; // istream
 
@@ -152,5 +183,5 @@
 	// manipulators
 	istype & ?|?( istype &, istype & (*)( istype & ) );
-	istype & endl( istype & is );
+	istype & nl( istype & is );
 } // distribution
 
@@ -164,9 +195,12 @@
 
 
-#include <time_t.hfa>										// Duration (constructors) / Time (constructors)
-
-forall( dtype ostype | ostream( ostype ) ) ostype & ?|?( ostype & os, Duration dur );
-forall( dtype ostype | ostream( ostype ) ) ostype & ?|?( ostype & os, Time time );
-
+#include <time_t.hfa>									// Duration (constructors) / Time (constructors)
+
+forall( dtype ostype | ostream( ostype ) ) {
+	ostype & ?|?( ostype & os, Duration dur );
+	void ?|?( ostype & os, Duration dur );
+	ostype & ?|?( ostype & os, Time time );
+	void ?|?( ostype & os, Time time );
+} // distribution
 
 // Local Variables: //
Index: libcfa/src/rational.cfa
===================================================================
--- libcfa/src/rational.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ libcfa/src/rational.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Wed Apr  6 17:54:28 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jun  2 09:24:33 2018
-// Update Count     : 162
+// Last Modified On : Sun Dec 23 22:56:49 2018
+// Update Count     : 170
 //
 
@@ -35,5 +35,5 @@
 	static RationalImpl simplify( RationalImpl & n, RationalImpl & d ) {
 		if ( d == (RationalImpl){0} ) {
-			serr | "Invalid rational number construction: denominator cannot be equal to 0." | endl;
+			serr | "Invalid rational number construction: denominator cannot be equal to 0.";
 			exit( EXIT_FAILURE );
 		} // exit
@@ -175,8 +175,13 @@
 	} // ?|?
 
-	forall( dtype ostype | ostream( ostype ) | { ostype & ?|?( ostype &, RationalImpl ); } )
-	ostype & ?|?( ostype & os, Rational(RationalImpl ) r ) {
-		return os | r.numerator | '/' | r.denominator;
-	} // ?|?
+	forall( dtype ostype | ostream( ostype ) | { ostype & ?|?( ostype &, RationalImpl ); } ) {
+		ostype & ?|?( ostype & os, Rational(RationalImpl) r ) {
+			return os | r.numerator | '/' | r.denominator;
+		} // ?|?
+
+		void ?|?( ostype & os, Rational(RationalImpl) r ) {
+			(ostype &)(os | r); nl( os );
+		} // ?|?
+	} // distribution
 } // distribution
 
Index: libcfa/src/rational.hfa
===================================================================
--- libcfa/src/rational.hfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ libcfa/src/rational.hfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -12,6 +12,6 @@
 // Created On       : Wed Apr  6 17:56:25 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jun  2 09:10:01 2018
-// Update Count     : 105
+// Last Modified On : Tue Dec  4 23:07:46 2018
+// Update Count     : 106
 //
 
@@ -92,6 +92,8 @@
 	istype & ?|?( istype &, Rational(RationalImpl) & );
 
-	forall( dtype ostype | ostream( ostype ) | { ostype & ?|?( ostype &, RationalImpl ); } )
-	ostype & ?|?( ostype &, Rational(RationalImpl ) );
+	forall( dtype ostype | ostream( ostype ) | { ostype & ?|?( ostype &, RationalImpl ); } ) {
+		ostype & ?|?( ostype &, Rational(RationalImpl) );
+		void ?|?( ostype &, Rational(RationalImpl) );
+	} // distribution
 } // distribution
 
Index: libcfa/src/stdlib.hfa
===================================================================
--- libcfa/src/stdlib.hfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ libcfa/src/stdlib.hfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Thu Jan 28 17:12:35 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 27 07:21:36 2018
-// Update Count     : 345
+// Last Modified On : Mon Dec 17 15:37:45 2018
+// Update Count     : 346
 //
 
@@ -178,5 +178,5 @@
 
 static inline {
-	int ato( const char * sptr ) {return (int)strtol( sptr, 0, 10 ); }
+	int ato( const char * sptr ) { return (int)strtol( sptr, 0, 10 ); }
 	unsigned int ato( const char * sptr ) { return (unsigned int)strtoul( sptr, 0, 10 ); }
 	long int ato( const char * sptr ) { return strtol( sptr, 0, 10 ); }
Index: libcfa/src/time.cfa
===================================================================
--- libcfa/src/time.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ libcfa/src/time.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Tue Mar 27 13:33:14 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun May  6 22:26:00 2018
-// Update Count     : 37
+// Last Modified On : Sun Dec 23 22:57:48 2018
+// Update Count     : 57
 //
 
@@ -31,14 +31,19 @@
 
 
-forall( dtype ostype | ostream( ostype ) )
-ostype & ?|?( ostype & os, Duration dur ) with( dur ) {
-	os | tv / TIMEGRAN;									// print seconds
-	long int ns = (tv < 0 ? -tv : tv) % TIMEGRAN;		// compute nanoseconds
-	if ( ns != 0 ) {									// some ?
-		char buf[16];
-		os | nanomsd( ns, buf );						// print nanoseconds
-	} // if
-	return os;
-} // ?|?
+forall( dtype ostype | ostream( ostype ) ) {
+	ostype & ?|?( ostype & os, Duration dur ) with( dur ) {
+		(ostype &)(os | tv / TIMEGRAN);					// print seconds
+		long int ns = (tv < 0 ? -tv : tv) % TIMEGRAN;	// compute nanoseconds
+		if ( ns != 0 ) {								// some ?
+			char buf[16];
+			(ostype &)(os | nanomsd( ns, buf ));			// print nanoseconds
+		} // if
+		return os;
+	} // ?|?
+
+	void ?|?( ostype & os, Duration dur ) with( dur ) {
+		(ostype &)(os | dur); nl( os );
+	} // ?|?
+} // distribution
 
 
@@ -137,22 +142,26 @@
 } // strftime
 
-forall( dtype ostype | ostream( ostype ) )
-ostype & ?|?( ostype & os, Time time ) with( time ) {
-	char buf[32];										// at least 26
-	time_t s = tv / TIMEGRAN;
-    ctime_r( &s, (char *)&buf );						// 26 characters: "Wed Jun 30 21:49:08 1993\n"
-	buf[24] = '\0';										// remove trailing '\n'
-	long int ns = (tv < 0 ? -tv : tv) % TIMEGRAN;		// compute nanoseconds
-	if ( ns == 0 ) {									// none ?
-		os | buf;										// print date/time/year
-	} else {
-		buf[19] = '\0';									// truncate to "Wed Jun 30 21:49:08"
-		os | buf;										// print date/time
-		char buf2[16];
-		nanomsd( ns, buf2 );							// compute nanoseconds
-		os | buf2 | ' ' | &buf[20];						// print nanoseconds and year
-	} // if
-	return os;
-} // ?|?
+forall( dtype ostype | ostream( ostype ) ) {
+	ostype & ?|?( ostype & os, Time time ) with( time ) {
+		char buf[32];									// at least 26
+		time_t s = tv / TIMEGRAN;
+		ctime_r( &s, (char *)&buf );					// 26 characters: "Wed Jun 30 21:49:08 1993\n"
+		buf[24] = '\0';									// remove trailing '\n'
+		long int ns = (tv < 0 ? -tv : tv) % TIMEGRAN;	// compute nanoseconds
+		if ( ns == 0 ) {								// none ?
+			(ostype &)(os | buf);							// print date/time/year
+		} else {
+			buf[19] = '\0';								// truncate to "Wed Jun 30 21:49:08"
+			char buf2[16];
+			nanomsd( ns, buf2 );						// compute nanoseconds
+			(ostype &)(os | buf | buf2 | ' ' | &buf[20]);	// print date/time, nanoseconds and year
+		} // if
+		return os;
+	} // ?|?
+
+	void ?|?( ostype & os, Time time ) with( time ) {
+		(ostype &)(os | time); nl( os );
+	} // ?|?
+} // distribution
 
 // Local Variables: //
Index: src/CodeTools/ResolvProtoDump.cc
===================================================================
--- src/CodeTools/ResolvProtoDump.cc	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/CodeTools/ResolvProtoDump.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -51,10 +51,10 @@
 
 		/// Child constructor
-		ProtoDump(const ProtoDump* p, Type* r) 
+		ProtoDump(const ProtoDump* p, Type* r)
 			: decls(), exprs(), subs(), closed(p->closed), parent(p), rtnType(r) {}
 
 		// Fix copy issues
-		ProtoDump(const ProtoDump& o) 
-			: decls(o.decls), exprs(o.exprs), subs(o.subs), closed(o.closed), parent(o.parent), 
+		ProtoDump(const ProtoDump& o)
+			: decls(o.decls), exprs(o.exprs), subs(o.subs), closed(o.closed), parent(o.parent),
 			  rtnType(maybeClone(o.rtnType.get())) {}
 		ProtoDump( ProtoDump&& ) = default;
@@ -69,8 +69,8 @@
 			parent = o.parent;
 			rtnType.reset( maybeClone(o.rtnType.get()) );
-			
+
 			return *this;
 		}
-		ProtoDump& operator= (ProtoDump&&) = default;
+		ProtoDump& operator= (ProtoDump&&) = delete;
 
 	private:
@@ -96,5 +96,5 @@
 			subs.emplace_back( std::move(sub.pass) );
 		}
-	
+
 		/// Whether lists should be separated, terminated, or preceded by their separator
 		enum septype { separated, terminated, preceded };
@@ -102,5 +102,5 @@
 		/// builds space-separated list of types
 		template<typename V>
-		static void build( V& visitor, const std::list< Type* >& tys, std::stringstream& ss, 
+		static void build( V& visitor, const std::list< Type* >& tys, std::stringstream& ss,
 				septype mode = separated ) {
 			if ( tys.empty() ) return;
@@ -121,5 +121,5 @@
 		/// builds list of types wrapped as tuple type
 		template<typename V>
-		static void buildAsTuple( V& visitor, const std::list< Type* >& tys, 
+		static void buildAsTuple( V& visitor, const std::list< Type* >& tys,
 				std::stringstream& ss ) {
 			switch ( tys.size() ) {
@@ -162,5 +162,5 @@
 			if ( name.compare( 0, 10, "_operator_" ) == 0 ) {
 				ss << name.substr(10);
-			} else if ( name.compare( "_constructor" ) == 0 
+			} else if ( name.compare( "_constructor" ) == 0
 					|| name.compare( "_destructor" ) == 0 ) {
 				ss << name.substr(1);
@@ -173,5 +173,5 @@
 
 		/// replaces operators with resolv-proto names
-		static void rp_name( const std::string& name, std::stringstream& ss, 
+		static void rp_name( const std::string& name, std::stringstream& ss,
 				std::string&& pre = "" ) {
 			// safety check for anonymous names
@@ -187,6 +187,6 @@
 				op_name( info.outputName, ss );
 				return;
-			} 
-			
+			}
+
 			// replace retval names
 			if ( name.compare( 0, 8, "_retval_" ) == 0 ) {
@@ -195,7 +195,7 @@
 				return;
 			}
-			
+
 			// default to just name, with first character in lowercase
-			ss << pre 
+			ss << pre
 			   << (char)std::tolower( static_cast<unsigned char>(name[0]) )
 			   << (name.c_str() + 1);
@@ -221,5 +221,5 @@
 			// strip trailing "_generic_" from autogen names (avoids some user-generation issues)
 			char generic[] = "_generic_"; size_t n_generic = sizeof(generic) - 1;
-			if ( stripped.size() >= n_generic 
+			if ( stripped.size() >= n_generic
 					&& stripped.substr( stripped.size() - n_generic ) == generic ) {
 				stripped.resize( stripped.size() - n_generic );
@@ -237,5 +237,5 @@
 			unsigned depth;                                 ///< Depth of nesting from root type
 
-			TypePrinter( const std::unordered_set<std::string>& closed, std::stringstream& ss ) 
+			TypePrinter( const std::unordered_set<std::string>& closed, std::stringstream& ss )
 				: ss(ss), closed(closed), depth(0) {}
 
@@ -337,5 +337,5 @@
 			}
 		};
-	
+
 		/// builds description of function
 		void build( const std::string& name, FunctionType* fnTy, std::stringstream& ss ) {
@@ -350,5 +350,5 @@
 			for ( TypeDecl* tyvar : fnTy->forall ) {
 				for ( DeclarationWithType* assn : tyvar->assertions ) {
-					ss << " | "; 
+					ss << " | ";
 					build( assn->name, assn->get_type(), ss );
 				}
@@ -360,5 +360,5 @@
 			// ignore top-level references
 			Type *norefs = ty->stripReferences();
-			
+
 			// fall back to function declaration if function type
 			if ( PointerType* pTy = dynamic_cast< PointerType* >(norefs) ) {
@@ -409,5 +409,5 @@
 			std::stringstream& ss;                          ///< Output to print to
 
-			ExprPrinter( const std::unordered_set<std::string>& closed, std::stringstream& ss ) 
+			ExprPrinter( const std::unordered_set<std::string>& closed, std::stringstream& ss )
 				: closed(closed), ss(ss) {}
 
@@ -476,5 +476,5 @@
 				visit_children = false;
 			}
-			
+
 			/// Member access handled as function from aggregate to member
 			void previsit( UntypedMemberExpr* expr ) {
@@ -662,5 +662,5 @@
 					}
 				}
-				
+
 				// add named parameters and returns to local scope
 				body.pass.addAll( decl->type->returnVals );
@@ -679,9 +679,9 @@
 		void previsit( StructDecl* sd ) { addAggregateFields(sd); }
 		void previsit( UnionDecl* ud ) { addAggregateFields(ud); }
-		
+
 		void previsit( EnumDecl* ed ) {
-			std::unique_ptr<Type> eType = 
+			std::unique_ptr<Type> eType =
 				std::make_unique<BasicType>( Type::Qualifiers{}, BasicType::SignedInt );
-			
+
 			// add field names directly to enclosing scope
 			for ( Declaration* member : ed->members ) {
Index: src/Common/FilterCombos.h
===================================================================
--- src/Common/FilterCombos.h	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ src/Common/FilterCombos.h	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,103 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// FilterCombos.h --
+//
+// Author           : Aaron B. Moss
+// Created On       : Mon Jul 23 16:05:00 2018
+// Last Modified By : Aaron B. Moss
+// Last Modified On : Mon Jul 23 16:05:00 2018
+// Update Count     : 1
+//
+
+#pragma once
+
+#include <vector>
+
+/// Type of index vector for combinations
+typedef std::vector<unsigned> Indices;
+
+/// Combo iterator that simply collects values into a vector, marking all values as valid.
+/// Prefer combos in typeops.h to use of IntoVectorComboIter with filterCombos
+/// @param T	The element type of the vector.
+template<typename T>
+class IntoVectorComboIter {
+	std::vector<T> crnt_combo;
+public:
+	/// Outputs a vector of T
+	using OutType = std::vector<T>;
+
+	/// Adds the element to the current combination, always returning true for valid.
+	bool append( const T& x ) {
+		crnt_combo.push_back( x );
+		return true;
+	}
+
+	/// Removes the last element of the current combination.
+	void backtrack() { crnt_combo.pop_back(); }
+
+	/// Returns a copy of the current combination.
+	OutType finalize() { return crnt_combo; }
+};
+
+/// Filters combinations from qs by the given combo iterator. If the iterator rejects some prefix 
+/// of a combination, it will not accept any combination with that prefix.
+/// qs should not be empty
+template<typename Q, typename ComboIter>
+auto filterCombos( const std::vector<Q>& qs, ComboIter&& iter )
+		-> std::vector<typename ComboIter::OutType> {
+    unsigned n = qs.size();  // number of queues to combine
+
+	std::vector<typename ComboIter::OutType> out;  // filtered output
+	for ( auto& q : qs ) if ( q.empty() ) return out;  // return empty if any empty queue
+
+	Indices inds;
+	inds.reserve( n );
+	inds.push_back( 0 );
+
+	while (true) {
+		unsigned i = inds.size() - 1;
+
+		// iterate or keep successful match
+		if ( iter.append( qs[i][inds.back()] ) ) {
+			if ( i + 1 == n ) {
+				// keep successful match of entire combination and continue iterating final place
+				out.push_back( iter.finalize() );
+				iter.backtrack();
+			} else {
+				// try to extend successful prefix
+				inds.push_back( 0 );
+				continue;
+			}
+		}
+
+		// move to next combo
+		++inds.back();
+		if ( inds.back() < qs[i].size() ) continue;
+		
+		// Otherwise done with the current row.
+		// At this point, an invalid prefix is stored in inds and iter is in a state looking at 
+		// all but the final value in inds. Now backtrack to next prefix:
+		inds.pop_back();
+		while ( ! inds.empty() ) {
+			// try the next value at the previous index
+			++inds.back();
+			iter.backtrack();
+			if ( inds.back() < qs[inds.size()-1].size() ) break;
+			// if the previous index is finished, backtrack out
+			inds.pop_back();
+		}
+
+		// Done if backtracked the entire array
+		if ( inds.empty() ) return out;
+	}
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
Index: src/Common/utility.h
===================================================================
--- src/Common/utility.h	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/Common/utility.h	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -26,4 +26,5 @@
 #include <string>
 #include <type_traits>
+#include <utility>
 
 #include <cassert>
@@ -462,4 +463,38 @@
 std::pair<long long int, bool> eval(Expression * expr);
 
+// -----------------------------------------------------------------------------
+/// Reorders the input range in-place so that the minimal-value elements according to the 
+/// comparator are in front; 
+/// returns the iterator after the last minimal-value element.
+template<typename Iter, typename Compare>
+Iter sort_mins( Iter begin, Iter end, Compare& lt ) {
+	if ( begin == end ) return end;
+	
+	Iter min_pos = begin;
+	for ( Iter i = begin + 1; i != end; ++i ) {
+		if ( lt( *i, *min_pos ) ) {
+			// new minimum cost; swap into first position
+			min_pos = begin;
+			std::iter_swap( min_pos, i );
+		} else if ( ! lt( *min_pos, *i ) ) {
+			// duplicate minimum cost; swap into next minimum position
+			++min_pos;
+			std::iter_swap( min_pos, i );
+		}
+	}
+	return ++min_pos;
+}
+
+template<typename Iter, typename Compare>
+inline Iter sort_mins( Iter begin, Iter end, Compare&& lt ) {
+	return sort_mins( begin, end, lt );
+}
+
+/// sort_mins defaulted to use std::less
+template<typename Iter>
+inline Iter sort_mins( Iter begin, Iter end ) {
+	return sort_mins( begin, end, std::less<typename std::iterator_traits<Iter>::value_type>{} );
+}
+
 // Local Variables: //
 // tab-width: 4 //
Index: src/GenPoly/Box.cc
===================================================================
--- src/GenPoly/Box.cc	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/GenPoly/Box.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -798,6 +798,6 @@
 			for ( Type::ForallList::iterator tyVar = functionType->get_forall().begin(); tyVar != functionType->get_forall().end(); ++tyVar ) {
 				for ( std::list< DeclarationWithType *>::iterator assert = (*tyVar)->assertions.begin(); assert != (*tyVar)->assertions.end(); ++assert ) {
-					InferredParams::const_iterator inferParam = appExpr->get_inferParams().find( (*assert)->get_uniqueId() );
-					assertf( inferParam != appExpr->get_inferParams().end(), "addInferredParams missing inferred parameter: %s in: %s", toString( *assert ).c_str(), toString( appExpr ).c_str() );
+					InferredParams::const_iterator inferParam = appExpr->inferParams.find( (*assert)->get_uniqueId() );
+					assertf( inferParam != appExpr->inferParams.end(), "addInferredParams missing inferred parameter: %s in: %s", toString( *assert ).c_str(), toString( appExpr ).c_str() );
 					Expression *newExpr = inferParam->second.expr->clone();
 					addCast( newExpr, (*assert)->get_type(), tyVars );
Index: src/GenPoly/Specialize.cc
===================================================================
--- src/GenPoly/Specialize.cc	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/GenPoly/Specialize.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -245,5 +245,5 @@
 		appExpr->env = TypeSubstitution::newFromExpr( appExpr, env );
 		if ( inferParams ) {
-			appExpr->get_inferParams() = *inferParams;
+			appExpr->inferParams = *inferParams;
 		} // if
 
@@ -284,5 +284,5 @@
 		std::list< Expression* >::iterator actual;
 		for ( formal = function->get_parameters().begin(), actual = appExpr->get_args().begin(); formal != function->get_parameters().end() && actual != appExpr->get_args().end(); ++formal, ++actual ) {
-			*actual = doSpecialization( (*formal)->get_type(), *actual, &appExpr->get_inferParams() );
+			*actual = doSpecialization( (*formal)->get_type(), *actual, &appExpr->inferParams );
 		}
 	}
@@ -295,6 +295,6 @@
 			// alternatively, if order starts to matter then copy appExpr's inferParams and pass them to handleExplicitParams.
 			handleExplicitParams( appExpr );
-			for ( InferredParams::iterator inferParam = appExpr->get_inferParams().begin(); inferParam != appExpr->get_inferParams().end(); ++inferParam ) {
-				inferParam->second.expr = doSpecialization( inferParam->second.formalType, inferParam->second.expr, inferParam->second.inferParams.get() );
+			for ( InferredParams::iterator inferParam = appExpr->inferParams.begin(); inferParam != appExpr->inferParams.end(); ++inferParam ) {
+				inferParam->second.expr = doSpecialization( inferParam->second.formalType, inferParam->second.expr, &inferParam->second.expr->inferParams );
 			}
 		}
Index: src/Makefile.am
===================================================================
--- src/Makefile.am	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/Makefile.am	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -17,4 +17,5 @@
 # create object files in directory with source files
 AUTOMAKE_OPTIONS = foreign subdir-objects
+ACLOCAL_AMFLAGS  = -I automake
 
 SRC = main.cc \
@@ -126,6 +127,8 @@
   ResolvExpr/PtrsCastable.cc \
   ResolvExpr/RenameVars.cc \
+  ResolvExpr/ResolveAssertions.cc \
   ResolvExpr/Resolver.cc \
   ResolvExpr/ResolveTypeof.cc \
+  ResolvExpr/SpecCost.cc \
   ResolvExpr/TypeEnvironment.cc \
   ResolvExpr/Unify.cc \
Index: src/Makefile.in
===================================================================
--- src/Makefile.in	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/Makefile.in	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -141,6 +141,10 @@
 subdir = src
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/automake/cfa.m4 \
-	$(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/automake/libtool.m4 \
+	$(top_srcdir)/automake/ltoptions.m4 \
+	$(top_srcdir)/automake/ltsugar.m4 \
+	$(top_srcdir)/automake/ltversion.m4 \
+	$(top_srcdir)/automake/lt~obsolete.m4 \
+	$(top_srcdir)/automake/cfa.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -151,5 +155,4 @@
 CONFIG_CLEAN_VPATH_FILES =
 LIBRARIES = $(noinst_LIBRARIES)
-AR = ar
 AM_V_AR = $(am__v_AR_@AM_V@)
 am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
@@ -203,6 +206,9 @@
 	ResolvExpr/PtrsAssignable.$(OBJEXT) \
 	ResolvExpr/PtrsCastable.$(OBJEXT) \
-	ResolvExpr/RenameVars.$(OBJEXT) ResolvExpr/Resolver.$(OBJEXT) \
+	ResolvExpr/RenameVars.$(OBJEXT) \
+	ResolvExpr/ResolveAssertions.$(OBJEXT) \
+	ResolvExpr/Resolver.$(OBJEXT) \
 	ResolvExpr/ResolveTypeof.$(OBJEXT) \
+	ResolvExpr/SpecCost.$(OBJEXT) \
 	ResolvExpr/TypeEnvironment.$(OBJEXT) \
 	ResolvExpr/Unify.$(OBJEXT) SymTab/Autogen.$(OBJEXT) \
@@ -259,11 +265,14 @@
 	ResolvExpr/TypeEnvironment.$(OBJEXT) \
 	ResolvExpr/CurrentObject.$(OBJEXT) \
-	ResolvExpr/ExplodedActual.$(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) SynTree/BasicType.$(OBJEXT) \
-	SynTree/PointerType.$(OBJEXT) SynTree/ArrayType.$(OBJEXT) \
-	SynTree/ReferenceType.$(OBJEXT) SynTree/FunctionType.$(OBJEXT) \
+	ResolvExpr/ExplodedActual.$(OBJEXT) \
+	ResolvExpr/SpecCost.$(OBJEXT) \
+	ResolvExpr/ResolveAssertions.$(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) \
+	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) \
@@ -289,4 +298,8 @@
 ___driver_cfa_cpp_OBJECTS = $(am____driver_cfa_cpp_OBJECTS)
 ___driver_cfa_cpp_DEPENDENCIES =
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
 am_demangler_OBJECTS = SymTab/demangler.$(OBJEXT)
 demangler_OBJECTS = $(am_demangler_OBJECTS)
@@ -310,4 +323,8 @@
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
 AM_V_CXX = $(am__v_CXX_@AM_V@)
 am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
@@ -315,6 +332,7 @@
 am__v_CXX_1 = 
 CXXLD = $(CXX)
-CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
-	-o $@
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
 am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
@@ -322,4 +340,6 @@
 am__v_CXXLD_1 = 
 LEXCOMPILE = $(LEX) $(AM_LFLAGS) $(LFLAGS)
+LTLEXCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(LEX) $(AM_LFLAGS) $(LFLAGS)
 AM_V_LEX = $(am__v_LEX_@AM_V@)
 am__v_LEX_ = $(am__v_LEX_@AM_DEFAULT_V@)
@@ -330,4 +350,6 @@
 		   -e s/c++$$/h++/ -e s/c$$/h/
 YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS)
+LTYACCCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(YACC) $(AM_YFLAGS) $(YFLAGS)
 AM_V_YACC = $(am__v_YACC_@AM_V@)
 am__v_YACC_ = $(am__v_YACC_@AM_DEFAULT_V@)
@@ -336,4 +358,8 @@
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
 AM_V_CC = $(am__v_CC_@AM_V@)
 am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
@@ -341,5 +367,7 @@
 am__v_CC_1 = 
 CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
 AM_V_CCLD = $(am__v_CCLD_@AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
@@ -391,9 +419,9 @@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BACKEND_CC = @BACKEND_CC@
 BUILD_IN_TREE_FLAGS = @BUILD_IN_TREE_FLAGS@
 CC = @CC@
@@ -415,4 +443,5 @@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
+CXXCPP = @CXXCPP@
 CXXDEPMODE = @CXXDEPMODE@
 CXXFLAGS = @CXXFLAGS@
@@ -420,5 +449,8 @@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
 DRIVER_DIR = @DRIVER_DIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
@@ -426,4 +458,5 @@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
+FGREP = @FGREP@
 GREP = @GREP@
 HOST_FLAGS = @HOST_FLAGS@
@@ -433,4 +466,5 @@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LEX = @LEX@
@@ -441,8 +475,18 @@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -454,4 +498,5 @@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -465,6 +510,8 @@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -516,4 +563,5 @@
 # create object files in directory with source files
 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 \
@@ -547,4 +595,5 @@
 	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 \
@@ -654,6 +703,8 @@
   ResolvExpr/PtrsCastable.cc \
   ResolvExpr/RenameVars.cc \
+  ResolvExpr/ResolveAssertions.cc \
   ResolvExpr/Resolver.cc \
   ResolvExpr/ResolveTypeof.cc \
+  ResolvExpr/SpecCost.cc \
   ResolvExpr/TypeEnvironment.cc \
   ResolvExpr/Unify.cc \
@@ -672,5 +723,5 @@
 
 .SUFFIXES:
-.SUFFIXES: .cc .ll .o .obj .yy
+.SUFFIXES: .cc .ll .lo .o .obj .yy
 $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/CodeGen/module.mk $(srcdir)/CodeTools/module.mk $(srcdir)/Concurrency/module.mk $(srcdir)/Common/module.mk $(srcdir)/ControlStruct/module.mk $(srcdir)/GenPoly/module.mk $(srcdir)/InitTweak/module.mk $(srcdir)/Parser/module.mk $(srcdir)/ResolvExpr/module.mk $(srcdir)/SymTab/module.mk $(srcdir)/SynTree/module.mk $(srcdir)/Tuples/module.mk $(srcdir)/Validate/module.mk $(srcdir)/Virtual/module.mk $(am__configure_deps)
 	@for dep in $?; do \
@@ -904,7 +955,11 @@
 ResolvExpr/RenameVars.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
 	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
+ResolvExpr/ResolveAssertions.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
+	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
 ResolvExpr/Resolver.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
 	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
 ResolvExpr/ResolveTypeof.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
+	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
+ResolvExpr/SpecCost.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
 	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
 ResolvExpr/TypeEnvironment.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
@@ -957,4 +1012,5 @@
 	sed 's/$(EXEEXT)$$//' | \
 	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
 	  ; then echo "$$p"; echo "$$p"; else :; fi; \
 	done | \
@@ -971,6 +1027,6 @@
 	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
 	    test -z "$$files" || { \
-	      echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(cfa_cpplibdir)$$dir'"; \
-	      $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(cfa_cpplibdir)$$dir" || exit $$?; \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(cfa_cpplibdir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(cfa_cpplibdir)$$dir" || exit $$?; \
 	    } \
 	; done
@@ -988,5 +1044,11 @@
 
 clean-cfa_cpplibPROGRAMS:
-	-test -z "$(cfa_cpplib_PROGRAMS)" || rm -f $(cfa_cpplib_PROGRAMS)
+	@list='$(cfa_cpplib_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
 CodeGen/Generate.$(OBJEXT): CodeGen/$(am__dirstamp) \
 	CodeGen/$(DEPDIR)/$(am__dirstamp)
@@ -1158,6 +1220,8 @@
 @AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/PtrsCastable.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/RenameVars.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/ResolveAssertions.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/ResolveTypeof.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/Resolver.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/SpecCost.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/TypeEnvironment.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/Unify.Po@am__quote@
@@ -1226,4 +1290,12 @@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
+.cc.lo:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
 .ll.cc:
 	$(AM_V_LEX)$(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE)
@@ -1231,4 +1303,11 @@
 .yy.cc:
 	$(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h `echo $@ | $(am__yacc_c2h)` y.output $*.output -- $(YACCCOMPILE)
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+	-rm -rf ../driver/.libs ../driver/_libs
 
 ID: $(am__tagged_files)
@@ -1390,6 +1469,6 @@
 clean: clean-am
 
-clean-am: clean-cfa_cpplibPROGRAMS clean-generic clean-noinstLIBRARIES \
-	mostlyclean-am
+clean-am: clean-cfa_cpplibPROGRAMS clean-generic clean-libtool \
+	clean-noinstLIBRARIES mostlyclean-am
 
 distclean: distclean-am
@@ -1446,5 +1525,6 @@
 mostlyclean: mostlyclean-am
 
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
 
 pdf: pdf-am
@@ -1461,16 +1541,17 @@
 
 .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
-	clean-cfa_cpplibPROGRAMS clean-generic clean-noinstLIBRARIES \
-	cscopelist-am ctags ctags-am distclean distclean-compile \
-	distclean-generic distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am \
-	install-cfa_cpplibPROGRAMS install-data install-data-am \
-	install-dvi install-dvi-am install-exec install-exec-am \
-	install-html install-html-am install-info install-info-am \
-	install-man install-pdf install-pdf-am install-ps \
-	install-ps-am install-strip installcheck installcheck-am \
-	installdirs maintainer-clean maintainer-clean-generic \
-	mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \
-	ps ps-am tags tags-am uninstall uninstall-am \
+	clean-cfa_cpplibPROGRAMS clean-generic clean-libtool \
+	clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-cfa_cpplibPROGRAMS install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am \
 	uninstall-cfa_cpplibPROGRAMS
 
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/Parser/TypeData.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -322,5 +322,5 @@
 			function.params->printList( os, indent + 4 );
 		} else {
-			os << string( indent + 2, ' ' ) << "with no parameters " << endl;
+			os << string( indent + 2, ' ' ) << "with no parameters" << endl;
 		} // if
 		if ( function.idList ) {
@@ -347,17 +347,17 @@
 		os << DeclarationNode::aggregateNames[ aggregate.kind ] << ' ' << *aggregate.name << endl;
 		if ( aggregate.params ) {
-			os << string( indent + 2, ' ' ) << "with type parameters " << endl;
+			os << string( indent + 2, ' ' ) << "with type parameters" << endl;
 			aggregate.params->printList( os, indent + 4 );
 		} // if
 		if ( aggregate.actuals ) {
-			os << string( indent + 2, ' ' ) << "instantiated with actual parameters " << endl;
+			os << string( indent + 2, ' ' ) << "instantiated with actual parameters" << endl;
 			aggregate.actuals->printList( os, indent + 4 );
 		} // if
 		if ( aggregate.fields ) {
-			os << string( indent + 2, ' ' ) << "with members " << endl;
+			os << string( indent + 2, ' ' ) << "with members" << endl;
 			aggregate.fields->printList( os, indent + 4 );
 		} // if
 		if ( aggregate.body ) {
-			os << string( indent + 2, ' ' ) << " with body " << endl;
+			os << string( indent + 2, ' ' ) << " with body" << endl;
 		} // if
 		break;
@@ -370,5 +370,5 @@
 		} // if
 		if ( aggInst.params ) {
-			os << string( indent + 2, ' ' ) << "with parameters " << endl;
+			os << string( indent + 2, ' ' ) << "with parameters" << endl;
 			aggInst.params->printList( os, indent + 2 );
 		} // if
@@ -381,5 +381,5 @@
 		} // if
 		if ( enumeration.body ) {
-			os << string( indent + 2, ' ' ) << " with body " << endl;
+			os << string( indent + 2, ' ' ) << " with body" << endl;
 		} // if
 		break;
@@ -418,5 +418,5 @@
 		os << "tuple ";
 		if ( tuple ) {
-			os << "with members " << endl;
+			os << "with members" << endl;
 			tuple->printList( os, indent + 2 );
 		} // if
@@ -942,5 +942,5 @@
 	assert( td->typeexpr );
 	// assert( td->typeexpr->expr );
-	return new TypeofType{ 
+	return new TypeofType{
 		buildQualifiers( td ), td->typeexpr->build(), td->kind == TypeData::Basetypeof };
 } // buildTypeof
Index: src/ResolvExpr/Alternative.cc
===================================================================
--- src/ResolvExpr/Alternative.cc	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/ResolvExpr/Alternative.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sat May 16 23:44:23 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat May 16 23:54:23 2015
-// Update Count     : 2
+// Last Modified By : Aaron B. Moss
+// Last Modified On : Thu Oct 11 10:55:00 2018
+// Update Count     : 3
 //
 
@@ -20,5 +20,5 @@
 #include <utility>                       // for move
 
-#include "Common/utility.h"              // for maybeClone
+#include "Common/utility.h"              // for cloneAll
 #include "ResolvExpr/Cost.h"             // for Cost, Cost::zero, operator<<
 #include "ResolvExpr/TypeEnvironment.h"  // for TypeEnvironment
@@ -27,14 +27,49 @@
 
 namespace ResolvExpr {
-	Alternative::Alternative() : cost( Cost::zero ), cvtCost( Cost::zero ), expr( nullptr ) {}
+	Alternative::Alternative() 
+	: cost( Cost::zero ), cvtCost( Cost::zero ), expr( nullptr ), env(), openVars(), need() {}
 
-	Alternative::Alternative( Expression *expr, const TypeEnvironment &env, const Cost& cost )
-		: cost( cost ), cvtCost( Cost::zero ), expr( expr ), env( env ) {}
+	Alternative::Alternative( Expression *expr, const TypeEnvironment &env )
+	: cost( Cost::zero ), cvtCost( Cost::zero ), expr( expr ), env( env ), openVars(), need() {}
+	
+	Alternative::Alternative( const Alternative &o, Expression *expr, const Cost &cost ) 
+	: cost( cost ), cvtCost( Cost::zero ), expr( expr ), env( o.env ), openVars( o.openVars ), 
+	  need() { cloneAll( o.need, need ); }
 
-	Alternative::Alternative( Expression *expr, const TypeEnvironment &env, const Cost& cost, const Cost &cvtCost )
-		: cost( cost ), cvtCost( cvtCost ), expr( expr ), env( env ) {}
+	Alternative::Alternative( Expression *expr, const TypeEnvironment &env, 
+		const OpenVarSet& openVars, const AssertionList& oneed, const Cost& cost )
+	: cost( cost ), cvtCost( Cost::zero ), expr( expr ), env( env ), openVars( openVars ), 
+	  need() { cloneAll( oneed, need ); }
 
-	Alternative::Alternative( const Alternative &other ) : cost( other.cost ), cvtCost( other.cvtCost ), expr( maybeClone( other.expr ) ), env( other.env ) {
-	}
+	Alternative::Alternative( Expression *expr, const TypeEnvironment &env, 
+		const OpenVarSet& openVars, const AssertionList& oneed, const Cost& cost, 
+		const Cost &cvtCost )
+	: cost( cost ), cvtCost( cvtCost ), expr( expr ), env( env ), openVars( openVars ), 
+	  need() { cloneAll( oneed, need ); }
+	
+	Alternative::Alternative( Expression *expr, const TypeEnvironment &env, 
+		const OpenVarSet &openVars, const AssertionSet &oneed, const Cost &cost)
+	: cost( cost ), cvtCost( Cost::zero ), expr( expr ), env( env ), openVars( openVars ), 
+	  need() { cloneAll( oneed, need ); }
+	
+	Alternative::Alternative( Expression *expr, const TypeEnvironment &env, 
+		const OpenVarSet &openVars, const AssertionSet &oneed, const Cost &cost, 
+		const Cost& cvtCost )
+	: cost( cost ), cvtCost( cvtCost ), expr( expr ), env( env ), openVars( openVars ), 
+	  need() { cloneAll( oneed, need ); }
+	
+	Alternative::Alternative( Expression *expr, TypeEnvironment &&env, OpenVarSet &&openVars, 
+		AssertionSet &&needSet, const Cost &cost )
+	: cost( cost ), cvtCost( Cost::zero ), expr( expr ), env( std::move(env) ), 
+	  openVars( std::move(openVars) ), need( needSet.begin(), needSet.end() ) {}
+	
+	Alternative::Alternative( Expression *expr, TypeEnvironment &&env, OpenVarSet &&openVars, 
+		AssertionSet &&needSet, const Cost &cost, const Cost &cvtCost )
+	: cost( cost ), cvtCost( cvtCost ), expr( expr ), env( std::move(env) ), 
+	  openVars( std::move(openVars) ), need( needSet.begin(), needSet.end() ) {}
+
+	Alternative::Alternative( const Alternative &other ) 
+	: cost( other.cost ), cvtCost( other.cvtCost ), expr( maybeClone( other.expr ) ), 
+	  env( other.env ), openVars( other.openVars ), need() { cloneAll( other.need, need ); }
 
 	Alternative &Alternative::operator=( const Alternative &other ) {
@@ -45,10 +80,14 @@
 		expr = maybeClone( other.expr );
 		env = other.env;
+		openVars = other.openVars;
+		need.clear();
+		cloneAll( other.need, need );
 		return *this;
 	}
 
-	Alternative::Alternative( Alternative && other ) : cost( other.cost ), cvtCost( other.cvtCost ), expr( other.expr ), env( std::move( other.env ) ) {
-		other.expr = nullptr;
-	}
+	Alternative::Alternative( Alternative && other ) 
+	: cost( other.cost ), cvtCost( other.cvtCost ), expr( other.expr ), 
+	  env( std::move( other.env ) ), openVars( std::move( other.openVars ) ), 
+	  need( std::move( other.need ) ) { other.expr = nullptr; }
 
 	Alternative & Alternative::operator=( Alternative && other ) {
@@ -59,4 +98,6 @@
 		expr = other.expr;
 		env = std::move( other.env );
+		openVars = std::move( other.openVars );
+		need = std::move( other.need );
 		other.expr = nullptr;
 		return *this;
@@ -64,4 +105,5 @@
 
 	Alternative::~Alternative() {
+		for ( AssertionItem& n : need ) { delete n.decl; }
 		delete expr;
 	}
@@ -78,5 +120,5 @@
 			os << "Null expression!" << std::endl;
 		} // if
-		os << indent << "Environment: ";
+		os << indent << "Environment:";
 		env.print( os, indent+1 );
 		os << std::endl;
Index: src/ResolvExpr/Alternative.h
===================================================================
--- src/ResolvExpr/Alternative.h	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/ResolvExpr/Alternative.h	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sat May 16 23:45:43 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 22 09:36:36 2017
-// Update Count     : 3
+// Last Modified By : Aaron B. Moss
+// Last Modified On : Thu Oct 11 10:55:00 2018
+// Update Count     : 4
 //
 
@@ -20,13 +20,68 @@
 
 #include "Cost.h"             // for Cost
-#include "TypeEnvironment.h"  // for TypeEnvironment
+#include "TypeEnvironment.h"  // for TypeEnvironment, AssertionSetValue
+
+#include "Common/utility.h"   // for maybeClone
 
 class Expression;
 
 namespace ResolvExpr {
+	/// One assertion to resolve
+	struct AssertionItem {
+		DeclarationWithType* decl;
+		AssertionSetValue info;
+		
+		AssertionItem() = default;
+		AssertionItem( DeclarationWithType* decl, const AssertionSetValue& info ) 
+		: decl(decl), info(info) {}
+		AssertionItem( const AssertionSet::value_type& e ) : decl(e.first), info(e.second) {}
+		operator AssertionSet::value_type () const { return { decl, info }; }
+
+		// to support cloneAll
+		AssertionItem clone() const { return { maybeClone(decl), info }; }
+	};
+	/// A list of unresolved assertions
+	using AssertionList = std::vector<AssertionItem>;
+
+	/// Clones an assertion list into an assertion set
+	static inline void cloneAll( const AssertionList& src, AssertionSet& dst ) {
+		for ( const AssertionItem& item : src ) {
+			dst.emplace( maybeClone(item.decl), item.info );
+		}
+	}
+
+	/// Clones an assertion set into an assertion list
+	static inline void cloneAll( const AssertionSet& src, AssertionList& dst ) {
+		dst.reserve( dst.size() + src.size() );
+		for ( const auto& entry : src ) {
+			dst.emplace_back( maybeClone(entry.first), entry.second );
+		}
+	}
+
+	/// Clones an assertion list into an assertion list
+	static inline void cloneAll( const AssertionList& src, AssertionList& dst ) {
+		dst.reserve( dst.size() + src.size() );
+		for ( const AssertionItem& item : src ) {
+			dst.emplace_back( maybeClone(item.decl), item.info );
+		}
+	}
+
+	/// One option for resolution of an expression
 	struct Alternative {
 		Alternative();
-		Alternative( Expression *expr, const TypeEnvironment &env, const Cost &cost );
-		Alternative( Expression *expr, const TypeEnvironment &env, const Cost &cost, const Cost &cvtCost );
+		Alternative( Expression *expr, const TypeEnvironment &env );
+		Alternative( const Alternative &o, Expression *expr, const Cost &cost );
+		Alternative( Expression *expr, const TypeEnvironment &env, const OpenVarSet& openVars, 
+			const AssertionList& need, const Cost &cost );
+		Alternative( Expression *expr, const TypeEnvironment &env, const OpenVarSet& openVars, 
+			const AssertionList& need, const Cost &cost, const Cost &cvtCost );
+		Alternative( Expression *expr, const TypeEnvironment &env, const OpenVarSet &openVars, 
+			const AssertionSet &need, const Cost &cost);
+		Alternative( Expression *expr, const TypeEnvironment &env, const OpenVarSet &openVars, 
+			const AssertionSet &need, const Cost &cost, const Cost& cvtCost );
+		Alternative( Expression *expr, TypeEnvironment &&env, OpenVarSet &&openVars, 
+			AssertionSet &&need, const Cost &cost );
+		Alternative( Expression *expr, TypeEnvironment &&env, OpenVarSet &&openVars, 
+			AssertionSet &&need, const Cost &cost, const Cost &cvtCost );
 		Alternative( const Alternative &other );
 		Alternative &operator=( const Alternative &other );
@@ -44,8 +99,13 @@
 		}
 
-		Cost cost;
-		Cost cvtCost;
-		Expression *expr;
-		TypeEnvironment env;
+		/// Sorts by cost
+		bool operator< ( const Alternative& o ) const { return cost < o.cost; }
+
+		Cost cost;            ///< Cost of the whole expression
+		Cost cvtCost;         ///< Cost of conversions to the satisfying expression
+		Expression *expr;     ///< Satisfying expression
+		TypeEnvironment env;  ///< Containing type environment
+		OpenVarSet openVars;  ///< Open variables for environment
+		AssertionList need;   ///< Assertions which need to be resolved
 	};
 
Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -11,5 +11,5 @@
 // Last Modified By : Peter A. Buhr
 // Last Modified On : Thu Nov  1 21:00:56 2018
-// Update Count     : 34
+// Update Count     : 35
 //
 
@@ -34,4 +34,5 @@
 #include "InitTweak/InitTweak.h"   // for getFunctionName
 #include "RenameVars.h"            // for RenameVars, global_renamer
+#include "ResolveAssertions.h"     // for resolveAssertions
 #include "ResolveTypeof.h"         // for resolveTypeof
 #include "Resolver.h"              // for resolveStmtExpr
@@ -102,7 +103,7 @@
 		void addAnonConversions( const Alternative & alt );
 		/// Adds alternatives for member expressions, given the aggregate, conversion cost for that aggregate, and name of the member
-		template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, const std::string & name );
+		template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Alternative &alt, const Cost &newCost, const std::string & name );
 		/// Adds alternatives for member expressions where the left side has tuple type
-		void addTupleMembers( TupleType * tupleType, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member );
+		void addTupleMembers( TupleType *tupleType, Expression *expr, const Alternative &alt, const Cost &newCost, Expression *member );
 		/// Adds alternatives for offsetof expressions, given the base type and name of the member
 		template< typename StructOrUnionType > void addOffsetof( StructOrUnionType *aggInst, const std::string &name );
@@ -113,7 +114,7 @@
 		template<typename OutputIterator>
 		void makeFunctionAlternatives( const Alternative &func, FunctionType *funcType, const ExplodedArgs& args, OutputIterator out );
-		/// Checks if assertion parameters match for a new alternative
+		/// Sets up parameter inference for an output alternative
 		template< typename OutputIterator >
-		void inferParameters( const AssertionSet &need, AssertionSet &have, const Alternative &newAlt, OpenVarSet &openVars, OutputIterator out );
+		void inferParameters( Alternative &newAlt, OutputIterator out );
 	private:
 		AlternativeFinder & altFinder;
@@ -244,8 +245,8 @@
 	}
 
-	void AlternativeFinder::find( Expression *expr, bool adjust, bool prune, bool failFast ) {
+	void AlternativeFinder::find( Expression *expr, ResolvMode mode ) {
 		PassVisitor<Finder> finder( *this );
 		expr->accept( finder );
-		if ( failFast && alternatives.empty() ) {
+		if ( mode.failFast && alternatives.empty() ) {
 			PRINT(
 				std::cerr << "No reasonable alternatives for expression " << expr << std::endl;
@@ -253,5 +254,23 @@
 			SemanticError( expr, "No reasonable alternatives for expression " );
 		}
-		if ( prune ) {
+		if ( mode.resolveAssns || mode.prune ) {
+			// trim candidates just to those where the assertions resolve
+			// - necessary pre-requisite to pruning
+			AltList candidates;
+			for ( unsigned i = 0; i < alternatives.size(); ++i ) {
+				resolveAssertions( alternatives[i], indexer, candidates );
+			}
+			// fail early if none such
+			if ( mode.failFast && candidates.empty() ) {
+				std::ostringstream stream;
+				stream << "No resolvable alternatives for expression " << expr << "\n"
+				       << "Alternatives with failing assertions are:\n";
+				printAlts( alternatives, stream, 1 );
+				SemanticError( expr->location, stream.str() );
+			}
+			// reset alternatives
+			alternatives = std::move( candidates );
+		}
+		if ( mode.prune ) {
 			auto oldsize = alternatives.size();
 			PRINT(
@@ -261,5 +280,5 @@
 			AltList pruned;
 			pruneAlternatives( alternatives.begin(), alternatives.end(), back_inserter( pruned ) );
-			if ( failFast && pruned.empty() ) {
+			if ( mode.failFast && pruned.empty() ) {
 				std::ostringstream stream;
 				AltList winners;
@@ -280,7 +299,7 @@
 		}
 		// adjust types after pruning so that types substituted by pruneAlternatives are correctly adjusted
-		for ( AltList::iterator i = alternatives.begin(); i != alternatives.end(); ++i ) {
-			if ( adjust ) {
-				adjustExprType( i->expr->get_result(), i->env, indexer );
+		if ( mode.adjust ) {
+			for ( Alternative& i : alternatives ) {
+				adjustExprType( i.expr->get_result(), i.env, indexer );
 			}
 		}
@@ -294,13 +313,13 @@
 
 	void AlternativeFinder::findWithAdjustment( Expression *expr ) {
-		find( expr, true );
+		find( expr, ResolvMode::withAdjustment() );
 	}
 
 	void AlternativeFinder::findWithoutPrune( Expression * expr ) {
-		find( expr, true, false );
+		find( expr, ResolvMode::withoutPrune() );
 	}
 
 	void AlternativeFinder::maybeFind( Expression * expr ) {
-		find( expr, true, true, false );
+		find( expr, ResolvMode::withoutFailFast() );
 	}
 
@@ -317,12 +336,12 @@
 
 		if ( StructInstType *structInst = dynamic_cast< StructInstType* >( aggrExpr->result ) ) {
-			addAggMembers( structInst, aggrExpr.get(), alt.cost+Cost::safe, alt.env, "" );
+			addAggMembers( structInst, aggrExpr.get(), alt, alt.cost+Cost::safe, "" );
 		} else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( aggrExpr->result ) ) {
-			addAggMembers( unionInst, aggrExpr.get(), alt.cost+Cost::safe, alt.env, "" );
+			addAggMembers( unionInst, aggrExpr.get(), alt, alt.cost+Cost::safe, "" );
 		} // if
 	}
 
 	template< typename StructOrUnionType >
-	void AlternativeFinder::Finder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, const std::string & name ) {
+	void AlternativeFinder::Finder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Alternative& alt, const Cost &newCost, const std::string & name ) {
 		std::list< Declaration* > members;
 		aggInst->lookup( name, members );
@@ -332,5 +351,5 @@
 				// addAnonAlternatives uses vector::push_back, which invalidates references to existing elements, so
 				// can't construct in place and use vector::back
-				Alternative newAlt( new MemberExpr( dwt, expr->clone() ), env, newCost );
+				Alternative newAlt{ alt, new MemberExpr{ dwt, expr->clone() }, newCost };
 				renameTypes( newAlt.expr );
 				addAnonConversions( newAlt ); // add anonymous member interpretations whenever an aggregate value type is seen as a member expression.
@@ -342,5 +361,5 @@
 	}
 
-	void AlternativeFinder::Finder::addTupleMembers( TupleType * tupleType, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member ) {
+	void AlternativeFinder::Finder::addTupleMembers( TupleType *tupleType, Expression *expr, 			const Alternative &alt, const Cost &newCost, Expression *member ) {
 		if ( ConstantExpr * constantExpr = dynamic_cast< ConstantExpr * >( member ) ) {
 			// get the value of the constant expression as an int, must be between 0 and the length of the tuple type to have meaning
@@ -348,5 +367,6 @@
 			std::string tmp;
 			if ( val >= 0 && (unsigned long long)val < tupleType->size() ) {
-				alternatives.push_back( Alternative( new TupleIndexExpr( expr->clone(), val ), env, newCost ) );
+				alternatives.push_back( Alternative{ 
+					alt, new TupleIndexExpr( expr->clone(), val ), newCost } );
 			} // if
 		} // if
@@ -354,5 +374,5 @@
 
 	void AlternativeFinder::Finder::postvisit( ApplicationExpr *applicationExpr ) {
-		alternatives.push_back( Alternative( applicationExpr->clone(), env, Cost::zero ) );
+		alternatives.push_back( Alternative{ applicationExpr->clone(), env } );
 	}
 
@@ -410,26 +430,26 @@
 	Cost computeApplicationConversionCost( Alternative &alt, const SymTab::Indexer &indexer ) {
 		ApplicationExpr *appExpr = strict_dynamic_cast< ApplicationExpr* >( alt.expr );
-		PointerType *pointer = strict_dynamic_cast< PointerType* >( appExpr->get_function()->get_result() );
-		FunctionType *function = strict_dynamic_cast< FunctionType* >( pointer->get_base() );
+		PointerType *pointer = strict_dynamic_cast< PointerType* >( appExpr->function->result );
+		FunctionType *function = strict_dynamic_cast< FunctionType* >( pointer->base );
 
 		Cost convCost = Cost::zero;
-		std::list< DeclarationWithType* >& formals = function->get_parameters();
+		std::list< DeclarationWithType* >& formals = function->parameters;
 		std::list< DeclarationWithType* >::iterator formal = formals.begin();
-		std::list< Expression* >& actuals = appExpr->get_args();
-
-		for ( std::list< Expression* >::iterator actualExpr = actuals.begin(); actualExpr != actuals.end(); ++actualExpr ) {
-			Type * actualType = (*actualExpr)->get_result();
+		std::list< Expression* >& actuals = appExpr->args;
+
+		for ( Expression*& actualExpr : actuals ) {
+			Type * actualType = actualExpr->result;
 			PRINT(
 				std::cerr << "actual expression:" << std::endl;
-				(*actualExpr)->print( std::cerr, 8 );
+				actualExpr->print( std::cerr, 8 );
 				std::cerr << "--- results are" << std::endl;
 				actualType->print( std::cerr, 8 );
 			)
 			if ( formal == formals.end() ) {
-				if ( function->get_isVarArgs() ) {
+				if ( function->isVarArgs ) {
 					convCost.incUnsafe();
 					PRINT( std::cerr << "end of formals with varargs function: inc unsafe: " << convCost << std::endl; ; )
 					// convert reference-typed expressions to value-typed expressions
-					referenceToRvalueConversion( *actualExpr, convCost );
+					referenceToRvalueConversion( actualExpr, convCost );
 					continue;
 				} else {
@@ -437,13 +457,15 @@
 				}
 			}
-			if ( DefaultArgExpr * def = dynamic_cast< DefaultArgExpr * >( *actualExpr ) ) {
+			if ( DefaultArgExpr * def = dynamic_cast< DefaultArgExpr * >( actualExpr ) ) {
 				// default arguments should be free - don't include conversion cost.
 				// Unwrap them here because they are not relevant to the rest of the system.
-				*actualExpr = def->expr;
+				actualExpr = def->expr;
 				++formal;
 				continue;
 			}
+			// mark conversion cost to formal and also specialization cost of formal type
 			Type * formalType = (*formal)->get_type();
-			convCost += computeExpressionConversionCost( *actualExpr, formalType, indexer, alt.env );
+			convCost += computeExpressionConversionCost( actualExpr, formalType, indexer, alt.env );
+			convCost.decSpec( specCost( formalType ) );
 			++formal; // can't be in for-loop update because of the continue
 		}
@@ -452,5 +474,17 @@
 		}
 
-		for ( InferredParams::const_iterator assert = appExpr->get_inferParams().begin(); assert != appExpr->get_inferParams().end(); ++assert ) {
+		// mark specialization cost of return types
+		for ( DeclarationWithType* returnVal : function->returnVals ) {
+			convCost.decSpec( specCost( returnVal->get_type() ) );
+		}
+
+		// mark type variable and specialization cost of forall clause
+		convCost.incVar( function->forall.size() );
+		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 );
 		}
@@ -466,149 +500,27 @@
 				needAssertions[ *assert ].isUsed = true;
 			}
-///     needAssertions.insert( needAssertions.end(), (*tyvar)->get_assertions().begin(), (*tyvar)->get_assertions().end() );
-		}
-	}
-
-	static const int recursionLimit = /*10*/ 4;  ///< Limit to depth of recursion satisfaction
-
-	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 );
-			}
-		}
-	}
-
-	template< typename ForwardIterator, typename OutputIterator >
-	void inferRecursive( ForwardIterator begin, ForwardIterator end, const Alternative &newAlt, OpenVarSet &openVars, const SymTab::Indexer &decls, const AssertionSet &newNeed, int level, const SymTab::Indexer &indexer, OutputIterator out ) {
-		if ( newAlt.cost == Cost::infinity ) return; // don't proceed down this dead end
-		if ( begin == end ) {
-			if ( newNeed.empty() ) {
-				PRINT(
-					std::cerr << "all assertions satisfied, output alternative: ";
-					newAlt.print( std::cerr );
-					std::cerr << std::endl;
-				);
-				*out++ = newAlt;
-				return;
-			} else if ( level >= recursionLimit ) {
-				SemanticError( newAlt.expr->location, "Too many recursive assertions" );
-			} else {
-				AssertionSet newerNeed;
-				PRINT(
-					std::cerr << "recursing with new set:" << std::endl;
-					printAssertionSet( newNeed, std::cerr, 8 );
-				)
-				inferRecursive( newNeed.begin(), newNeed.end(), newAlt, openVars, decls, newerNeed, level+1, indexer, out );
-				return;
-			}
-		}
-
-		ForwardIterator cur = begin++;
-		if ( ! cur->second.isUsed ) {
-			inferRecursive( begin, end, newAlt, openVars, decls, newNeed, level, indexer, out );
-			return; // xxx - should this continue? previously this wasn't here, and it looks like it should be
-		}
-		DeclarationWithType *curDecl = cur->first;
-
-		PRINT(
-			std::cerr << "inferRecursive: assertion is ";
-			curDecl->print( std::cerr );
-			std::cerr << std::endl;
-		)
-		std::list< SymTab::Indexer::IdData > candidates;
-		decls.lookupId( curDecl->get_name(), candidates );
-///   if ( candidates.empty() ) { std::cerr << "no candidates!" << std::endl; }
-		for ( const auto & data : candidates ) {
-			DeclarationWithType * candidate = data.id;
-			PRINT(
-				std::cerr << "inferRecursive: candidate is ";
-				candidate->print( std::cerr );
-				std::cerr << std::endl;
-			)
-
-			AssertionSet newHave, newerNeed( newNeed );
-			TypeEnvironment newEnv( newAlt.env );
-			OpenVarSet newOpenVars( openVars );
-			Type *adjType = candidate->get_type()->clone();
-			adjustExprType( adjType, newEnv, indexer );
-			renameTyVars( adjType );
-			PRINT(
-				std::cerr << "unifying ";
-				curDecl->get_type()->print( std::cerr );
-				std::cerr << " with ";
-				adjType->print( std::cerr );
-				std::cerr << std::endl;
-			)
-			if ( unify( curDecl->get_type(), adjType, newEnv, newerNeed, newHave, newOpenVars, indexer ) ) {
-				PRINT(
-					std::cerr << "success!" << std::endl;
-				)
-				SymTab::Indexer newDecls( decls );
-				addToIndexer( newHave, newDecls );
-				Alternative newerAlt( newAlt );
-				newerAlt.env = newEnv;
-				assertf( candidate->get_uniqueId(), "Assertion candidate does not have a unique ID: %s", toString( candidate ).c_str() );
-
-				// everything with an empty idChain was pulled in by the current assertion.
-				// add current assertion's idChain + current assertion's ID so that the correct inferParameters can be found.
-				for ( auto & a : newerNeed ) {
-					if ( a.second.idChain.empty() ) {
-						a.second.idChain = cur->second.idChain;
-						a.second.idChain.push_back( curDecl->get_uniqueId() );
-					}
-				}
-
-				Expression *varExpr = data.combine( newerAlt.cvtCost );
-				delete varExpr->get_result();
-				varExpr->set_result( adjType->clone() );
-				PRINT(
-					std::cerr << "satisfying assertion " << curDecl->get_uniqueId() << " ";
-					curDecl->print( std::cerr );
-					std::cerr << " with declaration " << candidate->get_uniqueId() << " ";
-					candidate->print( std::cerr );
-					std::cerr << std::endl;
-				)
-				// follow the current assertion's ID chain to find the correct set of inferred parameters to add the candidate to (i.e. the set of inferred parameters belonging to the entity which requested the assertion parameter).
-				InferredParams * inferParameters = &newerAlt.expr->get_inferParams();
-				for ( UniqueId id : cur->second.idChain ) {
-					inferParameters = (*inferParameters)[ id ].inferParams.get();
-				}
-				// XXX: this is a memory leak, but adjType can't be deleted because it might contain assertions
-				(*inferParameters)[ curDecl->get_uniqueId() ] = ParamEntry( candidate->get_uniqueId(), adjType->clone(), curDecl->get_type()->clone(), varExpr );
-				inferRecursive( begin, end, newerAlt, newOpenVars, newDecls, newerNeed, level, indexer, out );
-			} else {
-				delete adjType;
-			}
-		}
-	}
+		}
+	}
+
+	/// Unique identifier for matching expression resolutions to their requesting expression
+	UniqueId globalResnSlot = 0;
 
 	template< typename OutputIterator >
-	void AlternativeFinder::Finder::inferParameters( const AssertionSet &need, AssertionSet &have, const Alternative &newAlt, OpenVarSet &openVars, OutputIterator out ) {
-//	PRINT(
-//	    std::cerr << "inferParameters: assertions needed are" << std::endl;
-//	    printAll( need, std::cerr, 8 );
-//	    )
-		SymTab::Indexer decls( indexer );
-		// PRINT(
-		// 	std::cerr << "============= original indexer" << std::endl;
-		// 	indexer.print( std::cerr );
-		// 	std::cerr << "============= new indexer" << std::endl;
-		// 	decls.print( std::cerr );
-		// )
-		addToIndexer( have, decls );
-		AssertionSet newNeed;
-		PRINT(
-			std::cerr << "env is: " << std::endl;
-			newAlt.env.print( std::cerr, 0 );
-			std::cerr << std::endl;
-		)
-
-		inferRecursive( need.begin(), need.end(), newAlt, openVars, decls, newNeed, 0, indexer, out );
-//	PRINT(
-//	    std::cerr << "declaration 14 is ";
-//	    Declaration::declFromId
-//	    *out++ = newAlt;
-//	    )
+	void AlternativeFinder::Finder::inferParameters( Alternative &newAlt, OutputIterator out ) {
+		// Set need bindings for any unbound assertions
+		UniqueId crntResnSlot = 0;  // matching ID for this expression's assertions
+		for ( auto& assn : newAlt.need ) {
+			// skip already-matched assertions
+			if ( assn.info.resnSlot != 0 ) continue;
+			// assign slot for expression if needed
+			if ( crntResnSlot == 0 ) { crntResnSlot = ++globalResnSlot; }
+			// fix slot to assertion
+			assn.info.resnSlot = crntResnSlot;
+		}
+		// pair slot to expression
+		if ( crntResnSlot != 0 ) { newAlt.expr->resnSlots.push_back( crntResnSlot ); }
+
+		// add to output list, assertion resolution is deferred
+		*out++ = newAlt;
 	}
 
@@ -951,5 +863,5 @@
 		}
 		// build and validate new alternative
-		Alternative newAlt( appExpr, result.env, cost );
+		Alternative newAlt{ appExpr, result.env, result.openVars, result.need, cost };
 		PRINT(
 			std::cerr << "instantiate function success: " << appExpr << std::endl;
@@ -957,5 +869,5 @@
 			printAssertionSet( result.need, std::cerr, 8 );
 		)
-		inferParameters( result.need, result.have, newAlt, result.openVars, out );
+		inferParameters( newAlt, out );
 	}
 
@@ -1202,5 +1114,5 @@
 
 		// function may return struct or union value, in which case we need to add alternatives
-		// for implicitconversions to each of the anonymous members, must happen after findMinCost
+		// for implicit conversions to each of the anonymous members, must happen after findMinCost
 		// since anon conversions are never the cheapest expression
 		for ( const Alternative & alt : winners ) {
@@ -1234,5 +1146,5 @@
 			if ( isLvalue( alt.expr ) ) {
 				alternatives.push_back(
-					Alternative{ new AddressExpr( alt.expr->clone() ), alt.env, alt.cost } );
+					Alternative{ alt, new AddressExpr( alt.expr->clone() ), alt.cost } );
 			} // if
 		} // for
@@ -1240,5 +1152,5 @@
 
 	void AlternativeFinder::Finder::postvisit( LabelAddressExpr * expr ) {
-		alternatives.push_back( Alternative{ expr->clone(), env, Cost::zero } );
+		alternatives.push_back( Alternative{ expr->clone(), env } );
 	}
 
@@ -1285,6 +1197,7 @@
 		AltList candidates;
 		for ( Alternative & alt : finder.alternatives ) {
-			AssertionSet needAssertions, haveAssertions;
-			OpenVarSet openVars;
+			AssertionSet needAssertions( alt.need.begin(), alt.need.end() );
+			AssertionSet haveAssertions;
+			OpenVarSet openVars{ alt.openVars };
 
 			alt.env.extractOpenVars( openVars );
@@ -1314,8 +1227,8 @@
 				// count one safe conversion for each value that is thrown away
 				thisCost.incSafe( discardedValues );
-				Alternative newAlt( restructureCast( alt.expr->clone(), toType, castExpr->isGenerated ), alt.env,
-					alt.cost, thisCost );
-				inferParameters( needAssertions, haveAssertions, newAlt, openVars,
-					back_inserter( candidates ) );
+				Alternative newAlt{ 
+					restructureCast( alt.expr->clone(), toType, castExpr->isGenerated ), 
+					alt.env, openVars, needAssertions, alt.cost + thisCost, thisCost };
+				inferParameters( newAlt, back_inserter( candidates ) );
 			} // if
 		} // for
@@ -1330,12 +1243,12 @@
 
 	void AlternativeFinder::Finder::postvisit( VirtualCastExpr * castExpr ) {
-		assertf( castExpr->get_result(), "Implicate virtual cast targets not yet supported." );
+		assertf( castExpr->get_result(), "Implicit virtual cast targets not yet supported." );
 		AlternativeFinder finder( indexer, env );
 		// don't prune here, since it's guaranteed all alternatives will have the same type
 		finder.findWithoutPrune( castExpr->get_arg() );
 		for ( Alternative & alt : finder.alternatives ) {
-			alternatives.push_back( Alternative(
-				new VirtualCastExpr( alt.expr->clone(), castExpr->get_result()->clone() ),
-				alt.env, alt.cost ) );
+			alternatives.push_back( Alternative{
+				alt, new VirtualCastExpr{ alt.expr->clone(), castExpr->get_result()->clone() },
+				alt.cost } );
 		}
 	}
@@ -1365,9 +1278,9 @@
 			// find member of the given type
 			if ( StructInstType *structInst = dynamic_cast< StructInstType* >( aggrExpr->get_result() ) ) {
-				addAggMembers( structInst, aggrExpr, cost, agg->env, get_member_name(memberExpr) );
+				addAggMembers( structInst, aggrExpr, *agg, cost, get_member_name(memberExpr) );
 			} else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( aggrExpr->get_result() ) ) {
-				addAggMembers( unionInst, aggrExpr, cost, agg->env, get_member_name(memberExpr) );
+				addAggMembers( unionInst, aggrExpr, *agg, cost, get_member_name(memberExpr) );
 			} else if ( TupleType * tupleType = dynamic_cast< TupleType * >( aggrExpr->get_result() ) ) {
-				addTupleMembers( tupleType, aggrExpr, cost, agg->env, memberExpr->get_member() );
+				addTupleMembers( tupleType, aggrExpr, *agg, cost, memberExpr->get_member() );
 			} // if
 		} // for
@@ -1375,5 +1288,5 @@
 
 	void AlternativeFinder::Finder::postvisit( MemberExpr *memberExpr ) {
-		alternatives.push_back( Alternative( memberExpr->clone(), env, Cost::zero ) );
+		alternatives.push_back( Alternative{ memberExpr->clone(), env } );
 	}
 
@@ -1388,5 +1301,5 @@
 			// addAnonAlternatives uses vector::push_back, which invalidates references to existing elements, so
 			// can't construct in place and use vector::back
-			Alternative newAlt( newExpr, env, Cost::zero, cost );
+			Alternative newAlt{ newExpr, env, OpenVarSet{}, AssertionList{}, Cost::zero, cost };
 			PRINT(
 				std::cerr << "decl is ";
@@ -1406,9 +1319,9 @@
 		// not sufficient to clone here, because variable's type may have changed
 		// since the VariableExpr was originally created.
-		alternatives.push_back( Alternative( new VariableExpr( variableExpr->var ), env, Cost::zero ) );
+		alternatives.push_back( Alternative{ new VariableExpr{ variableExpr->var }, env } );
 	}
 
 	void AlternativeFinder::Finder::postvisit( ConstantExpr *constantExpr ) {
-		alternatives.push_back( Alternative( constantExpr->clone(), env, Cost::zero ) );
+		alternatives.push_back( Alternative{ constantExpr->clone(), env } );
 	}
 
@@ -1416,5 +1329,6 @@
 		if ( sizeofExpr->get_isType() ) {
 			Type * newType = sizeofExpr->get_type()->clone();
-			alternatives.push_back( Alternative( new SizeofExpr( resolveTypeof( newType, indexer ) ), env, Cost::zero ) );
+			alternatives.push_back( Alternative{ 
+				new SizeofExpr{ resolveTypeof( newType, indexer ) }, env } );
 		} else {
 			// find all alternatives for the argument to sizeof
@@ -1430,5 +1344,6 @@
 			Alternative &choice = winners.front();
 			referenceToRvalueConversion( choice.expr, choice.cost );
-			alternatives.push_back( Alternative( new SizeofExpr( choice.expr->clone() ), choice.env, Cost::zero ) );
+			alternatives.push_back( Alternative{ 
+				choice, new SizeofExpr( choice.expr->clone() ), Cost::zero } );
 		} // if
 	}
@@ -1437,5 +1352,6 @@
 		if ( alignofExpr->get_isType() ) {
 			Type * newType = alignofExpr->get_type()->clone();
-			alternatives.push_back( Alternative( new AlignofExpr( resolveTypeof( newType, indexer ) ), env, Cost::zero ) );
+			alternatives.push_back( Alternative{ 
+				new AlignofExpr{ resolveTypeof( newType, indexer ) }, env } );
 		} else {
 			// find all alternatives for the argument to sizeof
@@ -1451,5 +1367,6 @@
 			Alternative &choice = winners.front();
 			referenceToRvalueConversion( choice.expr, choice.cost );
-			alternatives.push_back( Alternative( new AlignofExpr( choice.expr->clone() ), choice.env, Cost::zero ) );
+			alternatives.push_back( Alternative{ 
+				choice, new AlignofExpr{ choice.expr->clone() }, Cost::zero } );
 		} // if
 	}
@@ -1461,5 +1378,6 @@
 		for ( std::list< Declaration* >::const_iterator i = members.begin(); i != members.end(); ++i ) {
 			if ( DeclarationWithType *dwt = dynamic_cast< DeclarationWithType* >( *i ) ) {
-				alternatives.push_back( Alternative( new OffsetofExpr( aggInst->clone(), dwt ), env, Cost::zero ) );
+				alternatives.push_back( Alternative{ 
+					new OffsetofExpr{ aggInst->clone(), dwt }, env } );
 				renameTypes( alternatives.back().expr );
 			} else {
@@ -1480,9 +1398,9 @@
 
 	void AlternativeFinder::Finder::postvisit( OffsetofExpr *offsetofExpr ) {
-		alternatives.push_back( Alternative( offsetofExpr->clone(), env, Cost::zero ) );
+		alternatives.push_back( Alternative{ offsetofExpr->clone(), env } );
 	}
 
 	void AlternativeFinder::Finder::postvisit( OffsetPackExpr *offsetPackExpr ) {
-		alternatives.push_back( Alternative( offsetPackExpr->clone(), env, Cost::zero ) );
+		alternatives.push_back( Alternative{ offsetPackExpr->clone(), env } );
 	}
 
@@ -1504,5 +1422,7 @@
 				Cost cost = Cost::zero;
 				Expression * newExpr = data.combine( cost );
-				alternatives.push_back( Alternative( new AttrExpr( newExpr, argType->clone() ), env, Cost::zero, cost ) );
+				alternatives.push_back( Alternative{ 
+					new AttrExpr{ newExpr, argType->clone() }, env, OpenVarSet{}, 
+					AssertionList{}, Cost::zero, cost } );
 				for ( DeclarationWithType * retVal : function->returnVals ) {
 					alternatives.back().expr->result = retVal->get_type()->clone();
@@ -1543,5 +1463,6 @@
 				Cost cost = Cost::zero;
 				Expression * newExpr = data.combine( cost );
-				alternatives.push_back( Alternative( newExpr, env, Cost::zero, cost ) );
+				alternatives.push_back( Alternative{ 
+					newExpr, env, OpenVarSet{}, AssertionList{}, Cost::zero, cost } );
 				renameTypes( alternatives.back().expr );
 			} // for
@@ -1558,10 +1479,17 @@
 		for ( const Alternative & first : firstFinder.alternatives ) {
 			for ( const Alternative & second : secondFinder.alternatives ) {
-				TypeEnvironment compositeEnv;
-				compositeEnv.simpleCombine( first.env );
+				TypeEnvironment compositeEnv{ first.env };
 				compositeEnv.simpleCombine( second.env );
-
-				LogicalExpr *newExpr = new LogicalExpr( first.expr->clone(), second.expr->clone(), logicalExpr->get_isAnd() );
-				alternatives.push_back( Alternative( newExpr, compositeEnv, first.cost + second.cost ) );
+				OpenVarSet openVars{ first.openVars };
+				mergeOpenVars( openVars, second.openVars );
+				AssertionSet need;
+				cloneAll( first.need, need );
+				cloneAll( second.need, need );
+
+				LogicalExpr *newExpr = new LogicalExpr{ 
+					first.expr->clone(), second.expr->clone(), logicalExpr->get_isAnd() };
+				alternatives.push_back( Alternative{ 
+					newExpr, std::move(compositeEnv), std::move(openVars), 
+					AssertionList( need.begin(), need.end() ), first.cost + second.cost } );
 			}
 		}
@@ -1584,22 +1512,34 @@
 			for ( const Alternative & second : secondFinder.alternatives ) {
 				for ( const Alternative & third : thirdFinder.alternatives ) {
-					TypeEnvironment compositeEnv;
-					compositeEnv.simpleCombine( first.env );
+					TypeEnvironment compositeEnv{ first.env };
 					compositeEnv.simpleCombine( second.env );
 					compositeEnv.simpleCombine( third.env );
-
+					OpenVarSet openVars{ first.openVars };
+					mergeOpenVars( openVars, second.openVars );
+					mergeOpenVars( openVars, third.openVars );
+					AssertionSet need;
+					cloneAll( first.need, need );
+					cloneAll( second.need, need );
+					cloneAll( third.need, need );
+					AssertionSet have;
+					
 					// unify true and false types, then infer parameters to produce new alternatives
-					OpenVarSet openVars;
-					AssertionSet needAssertions, haveAssertions;
-					Alternative newAlt( 0, compositeEnv, first.cost + second.cost + third.cost );
 					Type* commonType = nullptr;
-					if ( unify( second.expr->result, third.expr->result, newAlt.env, needAssertions, haveAssertions, openVars, indexer, commonType ) ) {
-						ConditionalExpr *newExpr = new ConditionalExpr( first.expr->clone(), second.expr->clone(), third.expr->clone() );
+					if ( unify( second.expr->result, third.expr->result, compositeEnv, 
+							need, have, openVars, indexer, commonType ) ) {
+						ConditionalExpr *newExpr = new ConditionalExpr{ 
+							first.expr->clone(), second.expr->clone(), third.expr->clone() };
 						newExpr->result = commonType ? commonType : second.expr->result->clone();
 						// convert both options to the conditional result type
-						newAlt.cost += computeExpressionConversionCost( newExpr->arg2, newExpr->result, indexer, newAlt.env );
-						newAlt.cost += computeExpressionConversionCost( newExpr->arg3, newExpr->result, indexer, newAlt.env );
-						newAlt.expr = newExpr;
-						inferParameters( needAssertions, haveAssertions, newAlt, openVars, back_inserter( alternatives ) );
+						Cost cost = first.cost + second.cost + third.cost;
+						cost += computeExpressionConversionCost( 
+							newExpr->arg2, newExpr->result, indexer, compositeEnv );
+						cost += computeExpressionConversionCost( 
+							newExpr->arg3, newExpr->result, indexer, compositeEnv );
+						// output alternative
+						Alternative newAlt{ 
+							newExpr, std::move(compositeEnv), std::move(openVars), 
+							AssertionList( need.begin(), need.end() ), cost };
+						inferParameters( newAlt, back_inserter( alternatives ) );
 					} // if
 				} // for
@@ -1614,5 +1554,6 @@
 		secondFinder.findWithAdjustment( commaExpr->get_arg2() );
 		for ( const Alternative & alt : secondFinder.alternatives ) {
-			alternatives.push_back( Alternative( new CommaExpr( newFirstArg->clone(), alt.expr->clone() ), alt.env, alt.cost ) );
+			alternatives.push_back( Alternative{ 
+				alt, new CommaExpr{ newFirstArg->clone(), alt.expr->clone() }, alt.cost } );
 		} // for
 		delete newFirstArg;
@@ -1629,16 +1570,23 @@
 		for ( const Alternative & first : firstFinder.alternatives ) {
 			for ( const Alternative & second : secondFinder.alternatives ) {
-				TypeEnvironment compositeEnv;
-				compositeEnv.simpleCombine( first.env );
+				TypeEnvironment compositeEnv{ first.env };
 				compositeEnv.simpleCombine( second.env );
-				OpenVarSet openVars;
-				AssertionSet needAssertions, haveAssertions;
-				Alternative newAlt( 0, compositeEnv, first.cost + second.cost );
+				OpenVarSet openVars{ first.openVars };
+				mergeOpenVars( openVars, second.openVars );
+				AssertionSet need;
+				cloneAll( first.need, need );
+				cloneAll( second.need, need );
+				AssertionSet have;
+
 				Type* commonType = nullptr;
-				if ( unify( first.expr->result, second.expr->result, newAlt.env, needAssertions, haveAssertions, openVars, indexer, commonType ) ) {
-					RangeExpr * newExpr = new RangeExpr( first.expr->clone(), second.expr->clone() );
+				if ( unify( first.expr->result, second.expr->result, compositeEnv, need, have, 
+						openVars, indexer, commonType ) ) {
+					RangeExpr * newExpr = 
+						new RangeExpr{ first.expr->clone(), second.expr->clone() };
 					newExpr->result = commonType ? commonType : first.expr->result->clone();
-					newAlt.expr = newExpr;
-					inferParameters( needAssertions, haveAssertions, newAlt, openVars, back_inserter( alternatives ) );
+					Alternative newAlt{ 
+						newExpr, std::move(compositeEnv), std::move(openVars), 
+						AssertionList( need.begin(), need.end() ), first.cost + second.cost };
+					inferParameters( newAlt, back_inserter( alternatives ) );
 				} // if
 			} // for
@@ -1658,16 +1606,24 @@
 
 			TypeEnvironment compositeEnv;
-			simpleCombineEnvironments( alts.begin(), alts.end(), compositeEnv );
-			alternatives.push_back(
-				Alternative{ new TupleExpr( exprs ), compositeEnv, sumCost( alts ) } );
+			OpenVarSet openVars;
+			AssertionSet need;
+			for ( const Alternative& alt : alts ) {
+				compositeEnv.simpleCombine( alt.env );
+				mergeOpenVars( openVars, alt.openVars );
+				cloneAll( alt.need, need );
+			}
+			
+			alternatives.push_back( Alternative{ 
+				new TupleExpr{ exprs }, std::move(compositeEnv), std::move(openVars), 
+				AssertionList( need.begin(), need.end() ), sumCost( alts ) } );
 		} // for
 	}
 
 	void AlternativeFinder::Finder::postvisit( TupleExpr *tupleExpr ) {
-		alternatives.push_back( Alternative( tupleExpr->clone(), env, Cost::zero ) );
+		alternatives.push_back( Alternative{ tupleExpr->clone(), env } );
 	}
 
 	void AlternativeFinder::Finder::postvisit( ImplicitCopyCtorExpr * impCpCtorExpr ) {
-		alternatives.push_back( Alternative( impCpCtorExpr->clone(), env, Cost::zero ) );
+		alternatives.push_back( Alternative{ impCpCtorExpr->clone(), env } );
 	}
 
@@ -1678,14 +1634,15 @@
 		finder.findWithoutPrune( ctorExpr->get_callExpr() );
 		for ( Alternative & alt : finder.alternatives ) {
-			alternatives.push_back( Alternative( new ConstructorExpr( alt.expr->clone() ), alt.env, alt.cost ) );
+			alternatives.push_back( Alternative{ 
+				alt, new ConstructorExpr( alt.expr->clone() ), alt.cost } );
 		}
 	}
 
 	void AlternativeFinder::Finder::postvisit( TupleIndexExpr *tupleExpr ) {
-		alternatives.push_back( Alternative( tupleExpr->clone(), env, Cost::zero ) );
+		alternatives.push_back( Alternative{ tupleExpr->clone(), env } );
 	}
 
 	void AlternativeFinder::Finder::postvisit( TupleAssignExpr *tupleAssignExpr ) {
-		alternatives.push_back( Alternative( tupleAssignExpr->clone(), env, Cost::zero ) );
+		alternatives.push_back( Alternative{ tupleAssignExpr->clone(), env } );
 	}
 
@@ -1696,5 +1653,5 @@
 			// ensure that the id is passed on to the UniqueExpr alternative so that the expressions are "linked"
 			UniqueExpr * newUnqExpr = new UniqueExpr( alt.expr->clone(), unqExpr->get_id() );
-			alternatives.push_back( Alternative( newUnqExpr, alt.env, alt.cost ) );
+			alternatives.push_back( Alternative{ alt, newUnqExpr, alt.cost } );
 		}
 	}
@@ -1704,5 +1661,5 @@
 		ResolvExpr::resolveStmtExpr( newStmtExpr, indexer );
 		// xxx - this env is almost certainly wrong, and needs to somehow contain the combined environments from all of the statements in the stmtExpr...
-		alternatives.push_back( Alternative( newStmtExpr, env, Cost::zero ) );
+		alternatives.push_back( Alternative{ newStmtExpr, env } );
 	}
 
@@ -1726,19 +1683,27 @@
 			for ( Alternative & alt : finder.get_alternatives() ) {
 				TypeEnvironment newEnv( alt.env );
-				AssertionSet needAssertions, haveAssertions;
-				OpenVarSet openVars;  // find things in env that don't have a "representative type" and claim those are open vars?
+				AssertionSet need;
+				cloneAll( alt.need, need );
+				AssertionSet have;
+				OpenVarSet openVars( alt.openVars );  
+				// xxx - find things in env that don't have a "representative type" and claim 
+				// those are open vars?
 				PRINT(
 					std::cerr << "  @ " << toType << " " << initAlt.designation << std::endl;
 				)
-				// It's possible that a cast can throw away some values in a multiply-valued expression.  (An example is a
-				// cast-to-void, which casts from one value to zero.)  Figure out the prefix of the subexpression results
-				// that are cast directly.  The candidate is invalid if it has fewer results than there are types to cast
-				// to.
+				// It's possible that a cast can throw away some values in a multiply-valued 
+				// expression. (An example is a cast-to-void, which casts from one value to 
+				// zero.)  Figure out the prefix of the subexpression results that are cast 
+				// directly.  The candidate is invalid if it has fewer results than there are 
+				// types to cast to.
 				int discardedValues = alt.expr->result->size() - toType->size();
 				if ( discardedValues < 0 ) continue;
-				// xxx - may need to go into tuple types and extract relevant types and use unifyList. Note that currently, this does not
-				// allow casting a tuple to an atomic type (e.g. (int)([1, 2, 3]))
+				// xxx - may need to go into tuple types and extract relevant types and use 
+				// unifyList. Note that currently, this does not allow casting a tuple to an 
+				// atomic type (e.g. (int)([1, 2, 3]))
+				
 				// unification run for side-effects
-				unify( toType, alt.expr->result, newEnv, needAssertions, haveAssertions, openVars, indexer ); // xxx - do some inspecting on this line... why isn't result bound to initAlt.type??
+				unify( toType, alt.expr->result, newEnv, need, have, openVars, indexer );
+				// xxx - do some inspecting on this line... why isn't result bound to initAlt.type?
 
 				Cost thisCost = castCost( alt.expr->result, toType, indexer, newEnv );
@@ -1746,6 +1711,10 @@
 					// count one safe conversion for each value that is thrown away
 					thisCost.incSafe( discardedValues );
-					Alternative newAlt( new InitExpr( restructureCast( alt.expr->clone(), toType, true ), initAlt.designation->clone() ), newEnv, alt.cost, thisCost );
-					inferParameters( needAssertions, haveAssertions, newAlt, openVars, back_inserter( candidates ) );
+					Alternative newAlt{ 
+						new InitExpr{ 
+							restructureCast( alt.expr->clone(), toType, true ), initAlt.designation->clone() }, 
+						std::move(newEnv), std::move(openVars), 
+						AssertionList( need.begin(), need.end() ), alt.cost, thisCost };
+					inferParameters( newAlt, back_inserter( candidates ) );
 				}
 			}
Index: src/ResolvExpr/AlternativeFinder.h
===================================================================
--- src/ResolvExpr/AlternativeFinder.h	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/ResolvExpr/AlternativeFinder.h	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sat May 16 23:56:12 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Wed Jul 26 11:24:00 2017
-// Update Count     : 4
+// Last Modified By : Aaron B. Moss
+// Last Modified On : Fri Oct -5 10:01:00 2018
+// Update Count     : 5
 //
 
@@ -24,4 +24,5 @@
 #include "ResolvExpr/Cost.h"             // for Cost, Cost::infinity
 #include "ResolvExpr/TypeEnvironment.h"  // for AssertionSet, OpenVarSet
+#include "ResolvMode.h"                  // for ResolvMode
 #include "SynTree/Visitor.h"             // for Visitor
 #include "SynTree/SynTree.h"             // for Visitor Nodes
@@ -68,5 +69,5 @@
 		}
 
-		void find( Expression *expr, bool adjust = false, bool prune = true, bool failFast = true );
+		void find( Expression *expr, ResolvMode mode = ResolvMode{} );
 		/// Calls find with the adjust flag set; adjustment turns array and function types into equivalent pointer types
 		void findWithAdjustment( Expression *expr );
Index: src/ResolvExpr/ConversionCost.cc
===================================================================
--- src/ResolvExpr/ConversionCost.cc	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/ResolvExpr/ConversionCost.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -28,10 +28,12 @@
 
 namespace ResolvExpr {
-	const Cost Cost::zero =      Cost(  0,  0,  0,  0 );
-	const Cost Cost::infinity =  Cost( -1, -1, -1, -1 );
-	const Cost Cost::unsafe =    Cost(  1,  0,  0,  0 );
-	const Cost Cost::poly =      Cost(  0,  1,  0,  0 );
-	const Cost Cost::safe =      Cost(  0,  0,  1,  0 );
-	const Cost Cost::reference = Cost(  0,  0,  0,  1 );
+	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 };
 
 #if 0
Index: src/ResolvExpr/Cost.h
===================================================================
--- src/ResolvExpr/Cost.h	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/ResolvExpr/Cost.h	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 09:39:50 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 22 09:35:55 2017
-// Update Count     : 5
+// Last Modified By : Aaron B. Moss
+// Last Modified On : Fri Oct 05 14:32:00 2018
+// Update Count     : 7
 //
 
@@ -21,5 +21,6 @@
 	class Cost {
 	  private:
-		Cost( int unsafeCost, int polyCost, int safeCost, int referenceCost );
+		Cost( int unsafeCost, int polyCost, int safeCost, int varCost, int specCost,
+			int referenceCost );
 
 	  public:
@@ -27,4 +28,6 @@
 		Cost & incPoly( int inc = 1 );
 		Cost & incSafe( int inc = 1 );
+		Cost & incVar( int inc = 1 );
+		Cost & decSpec( int inc = 1 );
 		Cost & incReference( int inc = 1 );
 
@@ -32,4 +35,6 @@
 		int get_polyCost() const { return polyCost; }
 		int get_safeCost() const { return safeCost; }
+		int get_varCost() const { return varCost; }
+		int get_specCost() const { return specCost; }
 		int get_referenceCost() const { return referenceCost; }
 
@@ -41,4 +46,6 @@
 		bool operator!=( const Cost &other ) const;
 		friend std::ostream &operator<<( std::ostream &os, const Cost &cost );
+		// returns negative for *this < other, 0 for *this == other, positive for *this > other
+		int compare( const Cost &other ) const;
 
 		static const Cost zero;
@@ -48,15 +55,21 @@
 		static const Cost poly;
 		static const Cost safe;
+		static const Cost var;
+		static const Cost spec;
 		static const Cost reference;
+
 	  private:
-		int compare( const Cost &other ) const;
-
-		int unsafeCost;
-		int polyCost;
-		int safeCost;
-		int referenceCost;
+		int unsafeCost;     ///< Unsafe (narrowing) conversions
+		int polyCost;       ///< Count of parameters and return values bound to some poly type
+		int safeCost;       ///< Safe (widening) conversions
+		int varCost;        ///< Count of polymorphic type variables
+		int specCost;       ///< Polymorphic type specializations (type assertions), negative cost
+		int referenceCost;  ///< reference conversions
 	};
 
-	inline Cost::Cost( int unsafeCost, int polyCost, int safeCost, int referenceCost ) : unsafeCost( unsafeCost ), polyCost( polyCost ), safeCost( safeCost ), referenceCost( referenceCost ) {}
+	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::incUnsafe( int inc ) {
@@ -75,4 +88,16 @@
 		if ( *this == infinity ) return *this;
 		safeCost += inc;
+		return *this;
+	}
+
+	inline Cost & Cost::incVar( int inc ) {
+		if ( *this == infinity ) return *this;
+		varCost += inc;
+		return *this;
+	}
+
+	inline Cost& Cost::decSpec( int dec ) {
+		if ( *this == infinity ) return *this;
+		specCost -= dec;
 		return *this;
 	}
@@ -86,10 +111,16 @@
 	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, referenceCost + other.referenceCost );
+		return Cost{ 
+			unsafeCost + other.unsafeCost, polyCost + other.polyCost, safeCost + other.safeCost, 
+			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, referenceCost - other.referenceCost );
+		return Cost{ 
+			unsafeCost - other.unsafeCost, polyCost - other.polyCost, safeCost - other.safeCost, 
+			varCost - other.varCost, specCost - other.specCost, 
+			referenceCost - other.referenceCost };
 	}
 
@@ -103,4 +134,6 @@
 		polyCost += other.polyCost;
 		safeCost += other.safeCost;
+		varCost += other.varCost;
+		specCost += other.specCost;
 		referenceCost += other.referenceCost;
 		return *this;
@@ -123,4 +156,12 @@
 		} else if ( safeCost < other.safeCost ) {
 			return true;
+		} else if ( varCost > other.varCost ) {
+			return false;
+		} else if ( varCost < other.varCost ) {
+			return true;
+		} else if ( specCost > other.specCost ) {
+			return false;
+		} else if ( specCost > other.specCost ) {
+			return true;
 		} else if ( referenceCost > other.referenceCost ) {
 			return false;
@@ -130,4 +171,16 @@
 			return false;
 		} // if
+	}
+
+	inline int Cost::compare( const Cost &other ) const {
+		if ( *this == infinity ) return +1;
+		if ( other == infinity ) return -1;
+
+		int c = unsafeCost - other.unsafeCost; if ( c ) return c;
+		c = polyCost - other.polyCost; if ( c ) return c;
+		c = safeCost - other.safeCost; if ( c ) return c;
+		c = varCost - other.varCost; if ( c ) return c;
+		c = specCost - other.specCost; if ( c ) return c;
+		return referenceCost - other.referenceCost;
 	}
 
@@ -136,4 +189,6 @@
 			&& polyCost == other.polyCost
 			&& safeCost == other.safeCost
+			&& varCost == other.varCost
+			&& specCost == other.specCost
 			&& referenceCost == other.referenceCost;
 	}
@@ -144,6 +199,7 @@
 
 	inline std::ostream &operator<<( std::ostream &os, const Cost &cost ) {
-		os << "( " << cost.unsafeCost << ", " << cost.polyCost << ", " << cost.safeCost << ", " << cost.referenceCost << " )";
-		return os;
+		return os << "( " << cost.unsafeCost << ", " << cost.polyCost << ", " 
+		          << cost.safeCost << ", " << cost.varCost << ", " << cost.specCost << ", "
+		          << cost.referenceCost << " )";
 	}
 } // namespace ResolvExpr
Index: src/ResolvExpr/ResolvMode.h
===================================================================
--- src/ResolvExpr/ResolvMode.h	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ src/ResolvExpr/ResolvMode.h	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,54 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// ResolvMode.h --
+//
+// Author           : Aaron B. Moss
+// Created On       : Mon Jun 11 13:28:00 2018
+// Last Modified By : Aaron B. Moss
+// Last Modified On : Fri Oct 05 13:46:00 2018
+// Update Count     : 2
+//
+
+#pragma once
+
+namespace ResolvExpr {
+	/// Flag set for resolution
+	struct ResolvMode {
+		const bool adjust;			 ///< Adjust array and function types to pointer types? [false]
+		const bool prune;            ///< Prune alternatives to min-cost per return type? [true]
+		const bool failFast;         ///< Fail on no resulting alternatives? [true]
+		const bool resolveAssns;     ///< Resolve assertions? [false]
+
+	private:
+		constexpr ResolvMode(bool a, bool p, bool ff, bool ra) 
+		: adjust(a), prune(p), failFast(ff), resolveAssns(ra) {}
+
+	public:
+		/// Default settings
+		constexpr ResolvMode() : adjust(false), prune(true), failFast(true), resolveAssns(false) {}
+		
+		/// With adjust flag set; turns array and function types into equivalent pointers
+		static constexpr ResolvMode withAdjustment() { return { true, true, true, false }; }
+
+		/// With adjust flag set but prune unset; pruning ensures there is at least one alternative 
+		/// per result type
+		static constexpr ResolvMode withoutPrune() { return { true, false, true, false }; }
+
+		/// With adjust and prune flags set but failFast unset; failFast ensures there is at least 
+		/// one resulting alternative
+		static constexpr ResolvMode withoutFailFast() { return { true, true, false, false }; }
+
+		/// The same mode, but with resolveAssns turned on; for top-level calls
+		ResolvMode atTopLevel() const { return { adjust, prune, failFast, true }; }
+	};
+} // namespace ResolvExpr
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
Index: src/ResolvExpr/ResolveAssertions.cc
===================================================================
--- src/ResolvExpr/ResolveAssertions.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ src/ResolvExpr/ResolveAssertions.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,444 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// ResolveAssertions.cc --
+//
+// Author           : Aaron B. Moss
+// Created On       : Fri Oct 05 13:46:00 2018
+// Last Modified By : Aaron B. Moss
+// Last Modified On : Fri Oct 05 13:46:00 2018
+// Update Count     : 1
+//
+
+#include "ResolveAssertions.h"
+
+#include <algorithm>                // for sort
+#include <cassert>                  // for assertf
+#include <list>                     // for list
+#include <memory>                   // for unique_ptr
+#include <unordered_map>            // for unordered_map, unordered_multimap
+#include <utility>                  // for move
+#include <vector>                   // for vector
+
+#include "Alternative.h"            // for Alternative, AssertionItem, AssertionList
+#include "Common/FilterCombos.h"    // for filterCombos
+#include "Common/utility.h"         // for sort_mins
+#include "ResolvExpr/RenameVars.h"  // for renameTyVars
+#include "SymTab/Indexer.h"         // for Indexer
+#include "SymTab/Mangler.h"         // for Mangler
+#include "SynTree/Expression.h"     // for InferredParams
+#include "TypeEnvironment.h"        // for TypeEnvironment, etc.
+#include "typeops.h"                // for adjustExprType
+#include "Unify.h"                  // for unify
+
+namespace ResolvExpr {
+	/// Unified assertion candidate
+	struct AssnCandidate {
+		SymTab::Indexer::IdData cdata;  ///< Satisfying declaration
+		Type* adjType;                  ///< Satisfying type
+		TypeEnvironment env;            ///< Post-unification environment
+		AssertionSet have;              ///< Post-unification have-set
+		AssertionSet need;              ///< Post-unification need-set
+		OpenVarSet openVars;            ///< Post-unification open-var set
+		UniqueId resnSlot;              ///< Slot for any recursive assertion IDs
+
+		AssnCandidate( const SymTab::Indexer::IdData& cdata, Type* adjType, TypeEnvironment&& env, 
+			AssertionSet&& have, AssertionSet&& need, OpenVarSet&& openVars, UniqueId resnSlot ) 
+		: cdata(cdata), adjType(adjType), env(std::move(env)), have(std::move(have)), 
+			need(std::move(need)), openVars(std::move(openVars)), resnSlot(resnSlot) {}
+	};
+
+	/// List of candidate assertion resolutions
+	using CandidateList = std::vector<AssnCandidate>;
+
+	/// Reference to single deferred item
+	struct DeferRef {
+		const DeclarationWithType* decl;
+		const AssertionSetValue& info;
+		const AssnCandidate& match;
+	};
+
+	/// Wrapper for the deferred items from a single assertion resolution.
+	/// 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] }; }
+	};
+
+	/// List of deferred resolution items
+	using DeferList = std::vector<DeferItem>;
+
+	/// Combo iterator that combines candidates into an output list, merging their environments. 
+	/// Rejects an appended candidate if the environments cannot be merged.
+	class CandidateEnvMerger {
+		/// Current list of merged candidates
+		std::vector<DeferRef> crnt;
+		/// Stack of environments to support backtracking
+		std::vector<TypeEnvironment> envs;
+		/// Stack of open variables to support backtracking
+		std::vector<OpenVarSet> varSets;
+		/// Indexer to use for merges
+		const SymTab::Indexer& indexer;
+	
+	public:
+		/// The merged environment/open variables and the list of candidates
+		struct OutType {
+			TypeEnvironment env;
+			OpenVarSet openVars;
+			std::vector<DeferRef> assns;
+
+			OutType( const TypeEnvironment& env, const OpenVarSet& openVars, 
+				const std::vector<DeferRef>& assns )
+			: env(env), openVars(openVars), assns(assns) {}
+		};
+
+		CandidateEnvMerger( const TypeEnvironment& env, const OpenVarSet& openVars, 
+			const SymTab::Indexer& indexer )
+		: crnt(), envs{ env }, varSets{ openVars }, indexer(indexer) {}
+
+		bool append( DeferRef i ) {
+			TypeEnvironment env = envs.back();
+			OpenVarSet openVars = varSets.back();
+			mergeOpenVars( openVars, i.match.openVars );
+
+			if ( ! env.combine( i.match.env, openVars, indexer ) ) return false;
+
+			crnt.emplace_back( i );
+			envs.emplace_back( env );
+			varSets.emplace_back( openVars );
+			return true;
+		}
+
+		void backtrack() {
+			crnt.pop_back();
+			envs.pop_back();
+			varSets.pop_back();
+		}
+
+		OutType finalize() { return { envs.back(), varSets.back(), crnt }; }
+	};
+
+	/// Comparator for CandidateEnvMerger outputs that sums their costs and caches the stored 
+	/// sums
+	struct CandidateCost {
+		using Element = CandidateEnvMerger::OutType;
+	private:
+		using Memo = std::unordered_map<const Element*, Cost>;
+		mutable Memo cache;              ///< cache of element costs
+		const SymTab::Indexer& indexer;  ///< Indexer for costing
+
+	public:
+		CandidateCost( const SymTab::Indexer& indexer ) : indexer(indexer) {}
+
+		/// reports the cost of an element
+		Cost get( const Element& x ) const {
+			Memo::const_iterator it = cache.find( &x );
+			if ( it == cache.end() ) {
+				Cost k = Cost::zero;
+				for ( const auto& assn : x.assns ) {
+					k += computeConversionCost( 
+						assn.match.adjType, assn.decl->get_type(), indexer, x.env );
+				}
+				it = cache.emplace_hint( it, &x, k );
+			}
+			return it->second;
+		}
+		
+		/// compares elements by cost
+		bool operator() ( const Element& a, const Element& b ) const {
+			return get( a ) < get( b );
+		}
+	};
+
+	/// Set of assertion resolutions, grouped by resolution ID
+	using InferCache = std::unordered_map< UniqueId, InferredParams >;
+
+	/// Flag for state iteration
+	enum IterateFlag { IterateState };
+
+	/// State needed to resolve a set of assertions
+	struct ResnState {
+		Alternative alt;           ///< Alternative assertion is rooted on
+		AssertionList need;        ///< Assertions to find
+		AssertionSet newNeed;      ///< New assertions for current resolutions
+		DeferList deferred;        ///< Deferred matches
+		InferCache inferred;       ///< Cache of already-inferred parameters
+		SymTab::Indexer& indexer;  ///< Name lookup (depends on previous assertions)
+
+		/// Initial resolution state for an alternative
+		ResnState( Alternative& a, SymTab::Indexer& indexer )
+		: alt(a), need(), newNeed(), deferred(), inferred(), indexer(indexer) {
+			need.swap( a.need );
+		}
+
+		/// Updated resolution state with new need-list
+		ResnState( ResnState&& o, IterateFlag )
+		: alt(std::move(o.alt)), need(o.newNeed.begin(), o.newNeed.end()), newNeed(), deferred(), 
+		  inferred(std::move(o.inferred)), indexer(o.indexer) {}
+	};
+
+	/// Binds a single assertion, updating resolution state
+	void bindAssertion( const DeclarationWithType* decl, AssertionSetValue info, Alternative& alt, 
+			AssnCandidate& match, InferCache& inferred ) {
+		
+		DeclarationWithType* candidate = match.cdata.id;
+		assertf( candidate->get_uniqueId(), "Assertion candidate does not have a unique ID: %s", toString( candidate ).c_str() );
+
+		Expression* varExpr = match.cdata.combine( alt.cvtCost );
+		delete varExpr->result;
+		varExpr->result = match.adjType->clone();
+		if ( match.resnSlot ) { varExpr->resnSlots.push_back( match.resnSlot ); }
+
+		// place newly-inferred assertion in proper place in cache
+		inferred[ info.resnSlot ][ decl->get_uniqueId() ] = ParamEntry{
+				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 );
+			}
+		}
+	}
+
+	// in AlternativeFinder.cc; unique ID for assertion resolutions
+	extern UniqueId globalResnSlot;
+
+	/// Resolve a single assertion, in context
+	bool resolveAssertion( AssertionItem& assn, ResnState& resn ) {
+		// 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;
+					}
+				}
+				// // 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;
+			}
+		}
+
+		// break if no suitable assertion
+		if ( matches.empty() ) return false;
+
+		// defer if too many suitable assertions
+		if ( matches.size() > 1 ) {
+			resn.deferred.emplace_back( assn.decl, assn.info, std::move(matches) );
+			return true;
+		}
+
+		// otherwise bind current match in ongoing scope
+		AssnCandidate& match = matches.front();
+		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);
+
+		bindAssertion( assn.decl, assn.info, resn.alt, match, resn.inferred );
+		return true;
+	}
+
+	/// Associates inferred parameters with an expression
+	struct InferMatcher {
+		InferCache& inferred;
+
+		InferMatcher( InferCache& inferred ) : inferred( inferred ) {}
+
+		Expression* postmutate( Expression* expr ) {
+			// defer missing inferred parameters until they are hopefully found later
+			std::vector<UniqueId> missingSlots;
+			// place inferred parameters into resolution slots
+			for ( UniqueId slot : expr->resnSlots ) {
+				// fail if no matching parameters found
+				auto it = inferred.find( slot );
+				if ( it == inferred.end() ) {
+					missingSlots.push_back( slot );
+					continue;
+				}
+				InferredParams& inferParams = it->second;
+				
+				// place inferred parameters into proper place in expression
+				for ( auto& entry : inferParams ) {
+					// recurse on inferParams of resolved expressions
+					entry.second.expr = postmutate( entry.second.expr );
+					// xxx - look at entry.second.inferParams?
+					expr->inferParams[ entry.first ] = entry.second;
+				}
+			}
+
+			// clear resolution slots and return
+			expr->resnSlots.swap( missingSlots );
+			return expr;
+		}
+	};
+
+	void finalizeAssertions( Alternative& alt, InferCache& inferred, AltList& out ) {
+		PassVisitor<InferMatcher> matcher{ inferred };
+		alt.expr = alt.expr->acceptMutator( matcher );
+		out.emplace_back( alt );
+	}
+
+	/// Limit to depth of recursion of assertion satisfaction
+	static const int recursionLimit = /* 10 */ 4;
+
+	void resolveAssertions( Alternative& alt, const SymTab::Indexer& indexer, AltList& out ) {
+		// finish early if no assertions to resolve
+		if ( alt.need.empty() ) {
+			out.emplace_back( alt );
+			return;
+		}
+
+		// build list of possible resolutions
+		using ResnList = std::vector<ResnState>;
+		SymTab::Indexer root_indexer{ indexer };
+		ResnList resns{ ResnState{ alt, root_indexer } };
+		ResnList new_resns{};
+
+		// resolve assertions in breadth-first-order up to a limited number of levels deep
+		for ( unsigned level = 0; level < recursionLimit; ++level ) {
+			// scan over all mutually-compatible resolutions
+			for ( auto& resn : resns ) {
+				// make initial pass at matching assertions
+				for ( auto& assn : resn.need ) {
+					// fail early if any assertion is not resolvable
+					if ( ! resolveAssertion( assn, resn ) ) goto nextResn;
+				}
+
+				if ( resn.deferred.empty() ) {
+					// either add successful match or push back next state
+					if ( resn.newNeed.empty() ) {
+						finalizeAssertions( resn.alt, resn.inferred, out );
+					} else {
+						new_resns.emplace_back( std::move(resn), IterateState );
+					}
+				} else {
+					// resolve deferred assertions by mutual compatibility
+					std::vector<CandidateEnvMerger::OutType> compatible = filterCombos(
+						resn.deferred, 
+						CandidateEnvMerger{ resn.alt.env, resn.alt.openVars, resn.indexer } );
+					// sort by cost
+					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
+					std::unordered_map<std::string, Cost> found;
+					for ( auto& compat : compatible ) {
+						// filter by environment-adjusted result type, keep only cheapest option
+						Type* resType = alt.expr->result->clone();
+						compat.env.apply( resType );
+						// skip if cheaper alternative already processed with same result type
+						Cost resCost = coster.get( compat );
+						auto it = found.emplace( SymTab::Mangler::mangleType( resType ), resCost );
+						delete resType;
+						if ( it.second == false && it.first->second < resCost ) continue;
+
+						// proceed with resolution step
+						ResnState new_resn = resn;
+
+						// add compatible assertions to new resolution state
+						for ( DeferRef r : compat.assns ) {
+							AssnCandidate match = r.match;
+							addToIndexer( match.have, new_resn.indexer );
+							new_resn.newNeed.insert( match.need.begin(), match.need.end() );
+
+							bindAssertion( r.decl, r.info, new_resn.alt, match, new_resn.inferred );
+						}
+
+						// set mutual environment into resolution state
+						new_resn.alt.env = std::move(compat.env);
+						new_resn.alt.openVars = std::move(compat.openVars);
+
+						// either add sucessful match or push back next state
+						if ( new_resn.newNeed.empty() ) {
+							finalizeAssertions( new_resn.alt, new_resn.inferred, out );
+						} else {
+							new_resns.emplace_back( std::move(new_resn), IterateState );
+						}
+					}
+				}
+			nextResn:; }
+
+			// finish or reset for next round
+			if ( new_resns.empty() ) return;
+			resns.swap( new_resns );
+			new_resns.clear();
+		}
+		
+		// exceeded recursion limit if reaches here
+		if ( out.empty() ) {
+			SemanticError( alt.expr->location, "Too many recursive assertions" );
+		}
+	}
+} // namespace ResolvExpr
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
Index: src/ResolvExpr/ResolveAssertions.h
===================================================================
--- src/ResolvExpr/ResolveAssertions.h	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ src/ResolvExpr/ResolveAssertions.h	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,33 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// ResolveAssertions.h --
+//
+// Author           : Aaron B. Moss
+// Created On       : Fri Oct 05 13:46:00 2018
+// Last Modified By : Aaron B. Moss
+// Last Modified On : Fri Oct 05 13:46:00 2018
+// Update Count     : 1
+//
+
+#pragma once
+
+#include "Alternative.h"  // for Alternative, AltList
+
+namespace SymTab {
+	class Indexer;
+}
+
+namespace ResolvExpr {
+	/// Recursively resolves all assertions provided in an alternative; returns true iff succeeds
+	void resolveAssertions( Alternative& alt, const SymTab::Indexer& indexer, AltList& out );
+} // namespace ResolvExpr
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/ResolvExpr/Resolver.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -9,14 +9,13 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 12:17:01 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Feb 17 11:19:40 2018
-// Update Count     : 213
+// Last Modified By : Aaron B. Moss
+// Last Modified On : Fri Oct 05 09:43:00 2018
+// Update Count     : 214
 //
 
-#include <stddef.h>                      // for NULL
 #include <cassert>                       // for strict_dynamic_cast, assert
 #include <memory>                        // for allocator, allocator_traits<...
 #include <tuple>                         // for get
-#include <vector>
+#include <vector>                        // for vector
 
 #include "Alternative.h"                 // for Alternative, AltList
@@ -31,4 +30,5 @@
 #include "ResolvExpr/TypeEnvironment.h"  // for TypeEnvironment
 #include "Resolver.h"
+#include "ResolvMode.h"                  // for ResolvMode
 #include "SymTab/Autogen.h"              // for SizeType
 #include "SymTab/Indexer.h"              // for Indexer
@@ -168,9 +168,15 @@
 
 	namespace {
-		void findUnfinishedKindExpression(Expression * untyped, Alternative & alt, const SymTab::Indexer & indexer, const std::string & kindStr, std::function<bool(const Alternative &)> pred, bool adjust = false, bool prune = true, bool failFast = true) {
+		void findUnfinishedKindExpression(Expression * untyped, Alternative & alt, const SymTab::Indexer & indexer, const std::string & kindStr, std::function<bool(const Alternative &)> pred, ResolvMode mode = ResolvMode{} ) {
 			assertf( untyped, "expected a non-null expression." );
+
+			// xxx - this isn't thread-safe, but should work until we parallelize the resolver
+			static unsigned recursion_level = 0;
+
+			++recursion_level;
 			TypeEnvironment env;
 			AlternativeFinder finder( indexer, env );
-			finder.find( untyped, adjust, prune, failFast );
+			finder.find( untyped, recursion_level == 1 ? mode.atTopLevel() : mode );
+			--recursion_level;
 
 			#if 0
@@ -185,4 +191,5 @@
 			#endif
 
+			// produce filtered list of alternatives
 			AltList candidates;
 			for ( Alternative & alt : finder.get_alternatives() ) {
@@ -192,11 +199,43 @@
 			}
 
-			// xxx - if > 1 alternative with same cost, ignore deleted and pick from remaining
-			// choose the lowest cost expression among the candidates
+			// produce invalid error if no candidates
+			if ( candidates.empty() ) {
+				SemanticError( untyped, toString( "No reasonable alternatives for ", kindStr, (kindStr != "" ? " " : ""), "expression: ") );
+			}
+
+			// search for cheapest candidate
 			AltList winners;
-			findMinCost( candidates.begin(), candidates.end(), back_inserter( winners ) );
-			if ( winners.size() == 0 ) {
-				SemanticError( untyped, toString( "No reasonable alternatives for ", kindStr, (kindStr != "" ? " " : ""), "expression: ") );
-			} else if ( winners.size() != 1 ) {
+			bool seen_undeleted = false;
+			for ( unsigned i = 0; i < candidates.size(); ++i ) {
+				int c = winners.empty() ? -1 : candidates[i].cost.compare( winners.front().cost );
+
+				if ( c > 0 ) continue; // skip more expensive than winner
+
+				if ( c < 0 ) {
+					// reset on new cheapest
+					seen_undeleted = ! findDeletedExpr( candidates[i].expr );
+					winners.clear();
+				} else /* if ( c == 0 ) */ {
+					if ( findDeletedExpr( candidates[i].expr ) ) {
+						// skip deleted expression if already seen one equivalent-cost not
+						if ( seen_undeleted ) continue;
+					} else if ( ! seen_undeleted ) {
+						// replace list of equivalent-cost deleted expressions with one non-deleted
+						winners.clear();
+						seen_undeleted = true;
+					}
+				}
+
+				winners.emplace_back( std::move( candidates[i] ) );
+			}
+
+			// promote alternative.cvtCost to .cost
+			// xxx - I don't know why this is done, but I'm keeping the behaviour from findMinCost
+			for ( Alternative& winner : winners ) {
+				winner.cost = winner.cvtCost;
+			}
+			
+			// produce ambiguous errors, if applicable
+			if ( winners.size() != 1 ) {
 				std::ostringstream stream;
 				stream << "Cannot choose between " << winners.size() << " alternatives for " << kindStr << (kindStr != "" ? " " : "") << "expression\n";
@@ -207,17 +246,23 @@
 			}
 
-			// there is one unambiguous interpretation - move the expression into the with statement
-			Alternative & choice = winners.front();
-			if ( findDeletedExpr( choice.expr ) ) {
+			// single selected choice
+			Alternative& choice = winners.front();
+
+			// fail on only expression deleted
+			if ( ! seen_undeleted ) {
 				SemanticError( untyped->location, choice.expr, "Unique best alternative includes deleted identifier in " );
 			}
+
+			// xxx - check for ambiguous expressions
+			
+			// output selected choice
 			alt = std::move( choice );
 		}
 
 		/// resolve `untyped` to the expression whose alternative satisfies `pred` with the lowest cost; kindStr is used for providing better error messages
-		void findKindExpression(Expression *& untyped, const SymTab::Indexer & indexer, const std::string & kindStr, std::function<bool(const Alternative &)> pred, bool adjust = false, bool prune = true, bool failFast = true) {
+		void findKindExpression(Expression *& untyped, const SymTab::Indexer & indexer, const std::string & kindStr, std::function<bool(const Alternative &)> pred, ResolvMode mode = ResolvMode{}) {
 			if ( ! untyped ) return;
 			Alternative choice;
-			findUnfinishedKindExpression( untyped, choice, indexer, kindStr, pred, adjust, prune, failFast );
+			findUnfinishedKindExpression( untyped, choice, indexer, kindStr, pred, mode );
 			finishExpr( choice.expr, choice.env, untyped->env );
 			delete untyped;
@@ -250,5 +295,5 @@
 		untyped.arg = expr;
 		Alternative choice;
-		findUnfinishedKindExpression( &untyped, choice, indexer, "", standardAlternativeFilter, true );
+		findUnfinishedKindExpression( &untyped, choice, indexer, "", standardAlternativeFilter, ResolvMode::withAdjustment() );
 		CastExpr * castExpr = strict_dynamic_cast< CastExpr * >( choice.expr );
 		env = std::move( choice.env );
@@ -357,9 +402,9 @@
 
 	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. The second analysis changes
-		// initContext because of a function type can contain object declarations in the return and parameter types. So
-		// each value of initContext is retained, so the type on the first analysis is preserved and used for selecting
-		// the RHS.
+		// 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. 
+		// The second analysis changes initContext because of a function type can contain object 
+		// declarations in the return and parameter types. So each value of initContext is 
+		// retained, so the type on the first analysis is preserved and used for selecting the RHS.
 		GuardValue( currentObject );
 		currentObject = CurrentObject( objectDecl->get_type() );
@@ -397,7 +442,8 @@
 
 	void Resolver::postvisit( FunctionDecl *functionDecl ) {
-		// default value expressions have an environment which shouldn't be there and trips up later passes.
-		// xxx - it might be necessary to somehow keep the information from this environment, but I can't currently
-		// see how it's useful.
+		// default value expressions have an environment which shouldn't be there and trips up 
+		// later passes.
+		// xxx - it might be necessary to somehow keep the information from this environment, but I 
+		// can't currently see how it's useful.
 		for ( Declaration * d : functionDecl->type->parameters ) {
 			if ( ObjectDecl * obj = dynamic_cast< ObjectDecl * >( d ) ) {
@@ -749,10 +795,12 @@
 		initExpr->expr = nullptr;
 		std::swap( initExpr->env, newExpr->env );
-		// InitExpr may have inferParams in the case where the expression specializes a function pointer,
-		// and newExpr may already have inferParams of its own, so a simple swap is not sufficient.
+		// InitExpr may have inferParams in the case where the expression specializes a function 
+		// pointer, and newExpr may already have inferParams of its own, so a simple swap is not 
+		// sufficient.
 		newExpr->spliceInferParams( initExpr );
 		delete initExpr;
 
-		// get the actual object's type (may not exactly match what comes back from the resolver due to conversions)
+		// get the actual object's type (may not exactly match what comes back from the resolver 
+		// due to conversions)
 		Type * initContext = currentObject.getCurrentType();
 
@@ -766,5 +814,6 @@
 					if ( isCharType( pt->get_base() ) ) {
 						if ( CastExpr *ce = dynamic_cast< CastExpr * >( newExpr ) ) {
-							// strip cast if we're initializing a char[] with a char *, e.g.  char x[] = "hello";
+							// strip cast if we're initializing a char[] with a char *, 
+							// e.g.  char x[] = "hello";
 							newExpr = ce->get_arg();
 							ce->set_arg( nullptr );
@@ -788,9 +837,10 @@
 		// move cursor into brace-enclosed initializer-list
 		currentObject.enterListInit();
-		// xxx - fix this so that the list isn't copied, iterator should be used to change current element
+		// xxx - fix this so that the list isn't copied, iterator should be used to change current 
+		// element
 		std::list<Designation *> newDesignations;
 		for ( auto p : group_iterate(listInit->get_designations(), listInit->get_initializers()) ) {
-			// iterate designations and initializers in pairs, moving the cursor to the current designated object and resolving
-			// the initializer against that object.
+			// iterate designations and initializers in pairs, moving the cursor to the current 
+			// designated object and resolving the initializer against that object.
 			Designation * des = std::get<0>(p);
 			Initializer * init = std::get<1>(p);
@@ -822,7 +872,7 @@
 		// fall back on C-style initializer
 		delete ctorInit->get_ctor();
-		ctorInit->set_ctor( NULL );
+		ctorInit->set_ctor( nullptr );
 		delete ctorInit->get_dtor();
-		ctorInit->set_dtor( NULL );
+		ctorInit->set_dtor( nullptr );
 		maybeAccept( ctorInit->get_init(), *visitor );
 	}
@@ -867,9 +917,9 @@
 
 		// xxx - todo -- what about arrays?
-		// if ( dtor == NULL && InitTweak::isIntrinsicCallStmt( ctorInit->get_ctor() ) ) {
+		// if ( dtor == nullptr && InitTweak::isIntrinsicCallStmt( ctorInit->get_ctor() ) ) {
 		// 	// can reduce the constructor down to a SingleInit using the
 		// 	// second argument from the ctor call, since
 		// 	delete ctorInit->get_ctor();
-		// 	ctorInit->set_ctor( NULL );
+		// 	ctorInit->set_ctor( nullptr );
 
 		// 	Expression * arg =
Index: src/ResolvExpr/SpecCost.cc
===================================================================
--- src/ResolvExpr/SpecCost.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ src/ResolvExpr/SpecCost.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,119 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// SpecCost.cc --
+//
+// Author           : Aaron B. Moss
+// Created On       : Tue Oct 02 15:50:00 2018
+// Last Modified By : Aaron B. Moss
+// Last Modified On : Tue Oct 02 15:50:00 2018
+// Update Count     : 1
+//
+
+#include <limits>
+#include <list>
+
+#include "Common/PassVisitor.h"
+#include "SynTree/Declaration.h"
+#include "SynTree/Expression.h"
+#include "SynTree/Type.h"
+
+namespace ResolvExpr {
+
+	/// Counts specializations in a type
+	class CountSpecs : public WithShortCircuiting, public WithVisitorRef<CountSpecs> {
+		int count = -1;  ///< specialization count (-1 for none)
+
+	public:
+		int get_count() const { return count >= 0 ? count : 0; }
+
+		// mark specialization of base type
+		void postvisit(PointerType*) { if ( count >= 0 ) ++count; }
+
+		// mark specialization of base type
+		void postvisit(ArrayType*) { if ( count >= 0 ) ++count; }
+
+		// mark specialization of base type
+		void postvisit(ReferenceType*) { if ( count >= 0 ) ++count; }
+
+	private:
+		// takes minimum non-negative count over parameter/return list
+		void takeminover( int& mincount, std::list<DeclarationWithType*>& dwts ) {
+			for ( DeclarationWithType* dwt : dwts ) {
+				count = -1;
+				maybeAccept( dwt->get_type(), *visitor );
+				if ( count != -1 && count < mincount ) mincount = count;
+			}
+		}
+
+	public:
+		// take minimal specialization value over ->returnVals and ->parameters
+		void previsit(FunctionType* fty) {
+			int mincount = std::numeric_limits<int>::max();
+			takeminover( mincount, fty->parameters );
+			takeminover( mincount, fty->returnVals );
+			// add another level to mincount if set
+			count = mincount < std::numeric_limits<int>::max() ? mincount + 1 : -1;
+			// already visited children
+			visit_children = false;
+		}
+	
+	private:
+		// returns minimum non-negative count + 1 over type parameters (-1 if none such)
+		int minover( std::list<Expression*>& parms ) {
+			int mincount = std::numeric_limits<int>::max();
+			for ( Expression* parm : parms ) {
+				count = -1;
+				maybeAccept( parm->result, *visitor );
+				if ( count != -1 && count < mincount ) mincount = count;
+			}
+			return mincount < std::numeric_limits<int>::max() ? mincount + 1 : -1;
+		}
+
+	public:
+		// look for polymorphic parameters
+		void previsit(StructInstType* sty) {
+			count = minover( sty->parameters );
+			visit_children = false;
+		}
+		
+		// look for polymorphic parameters
+		void previsit(UnionInstType* uty) {
+			count = minover( uty->parameters );
+			visit_children = false;
+		}
+
+		// note polymorphic type (which may be specialized)
+		// xxx - maybe account for open/closed type variables
+		void postvisit(TypeInstType*) { count = 0; }
+
+		// take minimal specialization over elements
+		// xxx - maybe don't increment, tuple flattening doesn't necessarily specialize
+		void previsit(TupleType* tty) {
+			int mincount = std::numeric_limits<int>::max();
+			for ( Type* ty : tty->types ) {
+				count = -1;
+				maybeAccept( ty, *visitor );
+				if ( count != -1 && count < mincount ) mincount = count;
+			}
+			count = mincount < std::numeric_limits<int>::max() ? mincount + 1 : -1;
+			visit_children = false;
+		}
+	};
+
+	/// Returns the (negated) specialization cost for a given type
+	int specCost( Type* ty ) {
+		PassVisitor<CountSpecs> counter;
+		maybeAccept( ty, *counter.pass.visitor );
+		return counter.pass.get_count();
+	}
+} // namespace ResolvExpr
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
Index: src/ResolvExpr/TypeEnvironment.cc
===================================================================
--- src/ResolvExpr/TypeEnvironment.cc	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/ResolvExpr/TypeEnvironment.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -120,5 +120,5 @@
 
 	const EqvClass* TypeEnvironment::lookup( const std::string &var ) const {
-		for ( std::list< EqvClass >::const_iterator i = env.begin(); i != env.end(); ++i ) {
+		for ( ClassList::const_iterator i = env.begin(); i != env.end(); ++i ) {
 			if ( i->vars.find( var ) != i->vars.end() ) return &*i;
 		} // for
@@ -168,5 +168,5 @@
 
 	void TypeEnvironment::makeSubstitution( TypeSubstitution &sub ) const {
-		for ( std::list< EqvClass >::const_iterator theClass = env.begin(); theClass != env.end(); ++theClass ) {
+		for ( ClassList::const_iterator theClass = env.begin(); theClass != env.end(); ++theClass ) {
 			for ( std::set< std::string >::const_iterator theVar = theClass->vars.begin(); theVar != theClass->vars.end(); ++theVar ) {
 				if ( theClass->type ) {
@@ -188,6 +188,6 @@
 	}
 
-	std::list< EqvClass >::iterator TypeEnvironment::internal_lookup( const std::string &var ) {
-		for ( std::list< EqvClass >::iterator i = env.begin(); i != env.end(); ++i ) {
+	TypeEnvironment::ClassList::iterator TypeEnvironment::internal_lookup( const std::string &var ) {
+		for ( ClassList::iterator i = env.begin(); i != env.end(); ++i ) {
 			if ( i->vars.count( var ) ) return i;
 		} // for
@@ -199,6 +199,103 @@
 	}
 
+	// xxx -- this should maybe be worrying about iterator invalidation (see resolv-proto)
+	bool TypeEnvironment::mergeBound( EqvClass& to, const EqvClass& from, OpenVarSet& openVars, const SymTab::Indexer& indexer ) {
+		if ( from.type ) {
+			if ( to.type ) {
+				// attempt to unify bound types
+				std::unique_ptr<Type> toType{ to.type->clone() }, fromType{ from.type->clone() };
+				WidenMode widenMode{ to.allowWidening, from.allowWidening };
+				Type* common = nullptr;
+				AssertionSet need, have;
+				if ( unifyInexact( toType.get(), fromType.get(), *this, need, have, openVars, widenMode, indexer, common ) ) {
+					// unifies, set common type if necessary
+					if ( common ) {
+						common->get_qualifiers() = Type::Qualifiers{};
+						to.set_type( common );
+					}
+				} else return false; // cannot unify
+			} else {
+				to.type = from.type->clone();
+			}
+		}
+
+		// unify widening if matches
+		to.allowWidening &= from.allowWidening;
+		return true;
+	}
+
+	// xxx -- this should maybe be worrying about iterator invalidation (see resolv-proto)
+	bool TypeEnvironment::mergeClasses( TypeEnvironment::ClassList::iterator to, TypeEnvironment::ClassList::iterator from, OpenVarSet& openVars, const SymTab::Indexer& indexer ) {
+		EqvClass& r = *to;
+		EqvClass& s = *from;
+
+		// ensure bounds match
+		if ( ! mergeBound( r, s, openVars, indexer ) ) return false;
+
+		// check safely bindable
+		if ( r.type && occursIn( r.type, s.vars.begin(), s.vars.end(), *this ) ) return false;
+		
+		// merge classes in
+		r.vars.insert( s.vars.begin(), s.vars.end() );
+		r.allowWidening &= s.allowWidening;
+		env.erase( from );
+
+		return true;
+	}
+
+	bool TypeEnvironment::combine( const TypeEnvironment& o, OpenVarSet& openVars, const SymTab::Indexer& indexer ) {
+		// short-circuit easy cases
+		if ( o.isEmpty() ) return true;
+		if ( isEmpty() ) {
+			simpleCombine( o );
+			return true;
+		}
+
+		// merge classes
+		for ( auto ct = o.env.begin(); ct != o.env.end(); ++ct ) {
+			const EqvClass& c = *ct;
+
+			// typeclass in local environment bound to c
+			auto rt = env.end();
+
+			// look for first existing bound variable
+			auto vt = c.vars.begin();
+			for ( ; vt != c.vars.end(); ++vt ) {
+				rt = internal_lookup( *vt );
+				if ( rt != env.end() ) break;
+			}
+
+			if ( rt != env.end() ) {  // c needs to be merged into *rt
+				EqvClass& r = *rt;
+				// merge bindings
+				if ( ! mergeBound( r, c, openVars, indexer ) ) return false;
+				// merge previous unbound variables into this class, checking occurs if needed
+				if ( r.type ) for ( auto ut = c.vars.begin(); ut != vt; ++ut ) {
+					if ( occurs( r.type, *ut, *this ) ) return false;
+					r.vars.insert( *ut );
+				} else { r.vars.insert( c.vars.begin(), vt ); }
+				// merge subsequent variables into this class (skipping *vt, already there)
+				while ( ++vt != c.vars.end() ) {
+					auto st = internal_lookup( *vt );
+					if ( st == env.end() ) {
+						// unbound, safe to add if passes occurs
+						if ( r.type && occurs( r.type, *vt, *this ) ) return false;
+						r.vars.insert( *vt );
+					} else if ( st != rt ) {
+						// bound, but not to the same class
+						if ( ! mergeClasses( rt, st, openVars, indexer ) ) return false;
+					}   // ignore bound into the same class
+				}
+			} else {  // no variables in c bound; just copy up
+				env.push_back( c );
+			}
+		}
+
+		// merged all classes
+		return true;
+	}
+
 	void TypeEnvironment::extractOpenVars( OpenVarSet &openVars ) const {
-		for ( std::list< EqvClass >::const_iterator eqvClass = env.begin(); eqvClass != env.end(); ++eqvClass ) {
+		for ( ClassList::const_iterator eqvClass = env.begin(); eqvClass != env.end(); ++eqvClass ) {
 			for ( std::set< std::string >::const_iterator var = eqvClass->vars.begin(); var != eqvClass->vars.end(); ++var ) {
 				openVars[ *var ] = eqvClass->data;
Index: src/ResolvExpr/TypeEnvironment.h
===================================================================
--- src/ResolvExpr/TypeEnvironment.h	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/ResolvExpr/TypeEnvironment.h	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -39,14 +39,16 @@
 	// declarations.
 	//
-	// I've seen a TU go from 54 minutes to 1 minute 34 seconds with the addition of this comparator.
+	// I've seen a TU go from 54 minutes to 1 minute 34 seconds with the addition of this 
+	// comparator.
 	//
 	// Note: since this compares pointers for position, minor changes in the source file that affect
 	// memory layout can alter compilation time in unpredictable ways. For example, the placement
 	// of a line directive can reorder type pointers with respect to each other so that assertions
-	// are seen in different orders, causing a potentially different number of unification calls when
-	// resolving assertions. I've seen a TU go from 36 seconds to 27 seconds by reordering line directives
-	// alone, so it would be nice to fix this comparison so that assertions compare more consistently.
-	// I've tried to modify this to compare on mangle name instead of type as the second comparator, but
-	// this causes some assertions to never be recorded. More investigation is needed.
+	// are seen in different orders, causing a potentially different number of unification calls 
+	// when resolving assertions. I've seen a TU go from 36 seconds to 27 seconds by reordering 
+	// line directives alone, so it would be nice to fix this comparison so that assertions compare 
+	// more consistently. I've tried to modify this to compare on mangle name instead of type as 
+	// the second comparator, but this causes some assertions to never be recorded. More 
+	// investigation is needed.
 	struct AssertCompare {
 		bool operator()( DeclarationWithType * d1, DeclarationWithType * d2 ) const {
@@ -57,12 +59,16 @@
 	};
 	struct AssertionSetValue {
-		bool isUsed;
-		// chain of Unique IDs of the assertion declarations. The first ID in the chain is the ID of an assertion on the current type,
-		// with each successive ID being the ID of an assertion pulled in by the previous ID. The last ID in the chain is
-		// the ID of the assertion that pulled in the current assertion.
-		std::list< UniqueId > idChain;
+		bool isUsed;        ///< True if assertion needs to be resolved
+		UniqueId resnSlot;  ///< ID of slot assertion belongs to
+
+		AssertionSetValue() : isUsed(false), resnSlot(0) {}
 	};
 	typedef std::map< DeclarationWithType*, AssertionSetValue, AssertCompare > AssertionSet;
 	typedef std::map< std::string, TypeDecl::Data > OpenVarSet;
+
+	/// merges one set of open vars into another
+	static inline void mergeOpenVars( OpenVarSet& dst, const OpenVarSet& src ) {
+		for ( const auto& entry : src ) { dst[ entry.first ] = entry.second; }
+	}
 
 	void printAssertionSet( const AssertionSet &, std::ostream &, int indent = 0 );
@@ -91,4 +97,5 @@
 
 	class TypeEnvironment {
+		using ClassList = std::list< EqvClass >;
 	  public:
 		const EqvClass* lookup( const std::string &var ) const;
@@ -103,6 +110,20 @@
 		bool isEmpty() const { return env.empty(); }
 		void print( std::ostream &os, Indenter indent = {} ) const;
-		// void combine( const TypeEnvironment &second, Type *(*combineFunc)( Type*, Type* ) );
+		
+		/// Simply concatenate the second environment onto this one; no safety checks performed
 		void simpleCombine( const TypeEnvironment &second );
+
+	  private:
+		/// Unifies the type bound of to with the type bound of from, returning false if fails
+		bool mergeBound( EqvClass& to, const EqvClass& from, OpenVarSet& openVars, const SymTab::Indexer& indexer );
+
+		/// Merges two type classes from local environment, returning false if fails
+		bool mergeClasses( ClassList::iterator to, ClassList::iterator from, OpenVarSet& openVars, const SymTab::Indexer& indexer );
+
+	  public:
+		/// Merges the second environment with this one, checking compatibility.
+		/// Returns false if fails, but does NOT roll back partial changes.
+		bool combine( const TypeEnvironment& second, OpenVarSet& openVars, const SymTab::Indexer& indexer );
+		
 		void extractOpenVars( OpenVarSet &openVars ) const;
 		TypeEnvironment *clone() const { return new TypeEnvironment( *this ); }
@@ -123,12 +144,12 @@
 		void forbidWidening();
 
-		using iterator = std::list< EqvClass >::const_iterator;
+		using iterator = ClassList::const_iterator;
 		iterator begin() const { return env.begin(); }
 		iterator end() const { return env.end(); }
 
 	  private:
-		std::list< EqvClass > env;
+		ClassList env;
 		
-		std::list< EqvClass >::iterator internal_lookup( const std::string &var );
+		ClassList::iterator internal_lookup( const std::string &var );
 	};
 
Index: src/ResolvExpr/module.mk
===================================================================
--- src/ResolvExpr/module.mk	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/ResolvExpr/module.mk	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -33,3 +33,5 @@
        ResolvExpr/TypeEnvironment.cc \
        ResolvExpr/CurrentObject.cc \
-       ResolvExpr/ExplodedActual.cc
+       ResolvExpr/ExplodedActual.cc \
+       ResolvExpr/SpecCost.cc \
+       ResolvExpr/ResolveAssertions.cc
Index: src/ResolvExpr/typeops.h
===================================================================
--- src/ResolvExpr/typeops.h	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/ResolvExpr/typeops.h	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -72,4 +72,8 @@
 	Cost conversionCost( Type *src, Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env );
 
+	// in AlternativeFinder.cc
+	Cost computeConversionCost( Type *actualType, Type *formalType, 
+		const SymTab::Indexer &indexer, const TypeEnvironment &env );
+
 	// in PtrsAssignable.cc
 	int ptrsAssignable( Type *src, Type *dest, const TypeEnvironment &env );
@@ -102,6 +106,18 @@
 	int polyCost( Type *type, const TypeEnvironment &env, const SymTab::Indexer &indexer );
 
+	// in SpecCost.cc
+	int specCost( Type *type );
+
 	// in Occurs.cc
 	bool occurs( Type *type, std::string varName, const TypeEnvironment &env );
+
+	template<typename Iter> 
+	bool occursIn( Type* ty, Iter begin, Iter end, const TypeEnvironment &env ) {
+		while ( begin != end ) {
+			if ( occurs( ty, *begin, env ) ) return true;
+			++begin;
+		}
+		return false;
+	}
 
 	// in AlternativeFinder.cc
Index: src/SynTree/ApplicationExpr.cc
===================================================================
--- src/SynTree/ApplicationExpr.cc	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/SynTree/ApplicationExpr.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -29,5 +29,5 @@
 
 ParamEntry::ParamEntry( const ParamEntry &other ) :
-		decl( other.decl ), actualType( maybeClone( other.actualType ) ), formalType( maybeClone( other.formalType ) ), expr( maybeClone( other.expr ) ), inferParams( new InferredParams( *other.inferParams ) ) {
+		decl( other.decl ), actualType( maybeClone( other.actualType ) ), formalType( maybeClone( other.formalType ) ), expr( maybeClone( other.expr ) )/*, inferParams( new InferredParams( *other.inferParams ) )*/ {
 }
 
@@ -39,5 +39,5 @@
 	formalType = maybeClone( other.formalType );
 	expr = maybeClone( other.expr );
-	*inferParams = *other.inferParams;
+	// *inferParams = *other.inferParams;
 	return *this;
 }
@@ -50,5 +50,5 @@
 
 ParamEntry::ParamEntry( ParamEntry && other ) :
-		decl( other.decl ), actualType( other.actualType ), formalType( other.formalType ), expr( other.expr ), inferParams( std::move( other.inferParams ) ) {
+		decl( other.decl ), actualType( other.actualType ), formalType( other.formalType ), expr( other.expr )/*, inferParams( std::move( other.inferParams ) )*/ {
 	other.actualType = nullptr;
 	other.formalType = nullptr;
@@ -68,5 +68,5 @@
 	other.formalType = nullptr;
 	other.expr = nullptr;
-	inferParams = std::move( other.inferParams );
+	// inferParams = std::move( other.inferParams );
 	return *this;
 }
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/SynTree/Expression.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -40,5 +40,5 @@
 			Declaration::declFromId( i->second.decl )->printShort( os, indent+1 );
 			os << std::endl;
-			printInferParams( *i->second.inferParams, os, indent+1, level+1 );
+			printInferParams( i->second.expr->inferParams, os, indent+1, level+1 );
 		} // for
 	} // if
@@ -47,6 +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 ) {
-}
+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 ) {
@@ -55,4 +54,5 @@
 		inferParams[p.first] = std::move( p.second );
 	}
+	resnSlots.insert( resnSlots.end(), other->resnSlots.begin(), other->resnSlots.end() );
 }
 
@@ -376,5 +376,5 @@
 	os << "Untyped Member Expression, with field: " << std::endl << indent+1;
 	member->print(os, indent+1 );
-	os << indent << "... from aggregate: " << std::endl << indent+1;
+	os << indent << "... from aggregate:" << std::endl << indent+1;
 	aggregate->print(os, indent+1);
 	Expression::print( os, indent );
@@ -405,8 +405,8 @@
 
 void MemberExpr::print( std::ostream &os, Indenter indent ) const {
-	os << "Member Expression, with field: " << std::endl;
+	os << "Member Expression, with field:" << std::endl;
 	os << indent+1;
 	member->print( os, indent+1 );
-	os << std::endl << indent << "... from aggregate: " << std::endl << indent+1;
+	os << std::endl << indent << "... from aggregate:" << std::endl << indent+1;
 	aggregate->print(os, indent + 1);
 	Expression::print( os, indent );
@@ -456,8 +456,8 @@
 
 void UntypedExpr::print( std::ostream &os, Indenter indent ) const {
-	os << "Applying untyped: " << std::endl;
+	os << "Applying untyped:" << std::endl;
 	os << indent+1;
 	function->print(os, indent+1);
-	os << std::endl << indent << "...to: " << std::endl;
+	os << std::endl << indent << "...to:" << std::endl;
 	printAll(args, os, indent+1);
 	Expression::print( os, indent );
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/SynTree/Expression.h	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -21,4 +21,5 @@
 #include <memory>                 // for allocator, unique_ptr
 #include <string>                 // for string
+#include <vector>                 // for vector
 
 #include "BaseSyntaxNode.h"       // for BaseSyntaxNode
@@ -38,6 +39,6 @@
 /// but subject to decay-to-pointer and type parameter renaming
 struct ParamEntry {
-	ParamEntry(): decl( 0 ), actualType( 0 ), formalType( 0 ), expr( 0 ), inferParams( new InferredParams ) {}
-	ParamEntry( UniqueId decl, Type * actualType, Type * formalType, Expression* expr ): decl( decl ), actualType( actualType ), formalType( formalType ), expr( expr ), inferParams( new InferredParams ) {}
+	ParamEntry(): decl( 0 ), actualType( 0 ), formalType( 0 ), expr( 0 )/*, inferParams( new InferredParams )*/ {}
+	ParamEntry( UniqueId decl, Type * actualType, Type * formalType, Expression* expr ): decl( decl ), actualType( actualType ), formalType( formalType ), expr( expr )/*, inferParams( new InferredParams )*/ {}
 	ParamEntry( const ParamEntry & other );
 	ParamEntry( ParamEntry && other );
@@ -50,5 +51,5 @@
 	Type * formalType;
 	Expression * expr;
-	std::unique_ptr< InferredParams > inferParams;
+	// std::unique_ptr< InferredParams > inferParams;
 };
 
@@ -59,5 +60,8 @@
 	TypeSubstitution * env;
 	bool extension = false;
-	InferredParams inferParams;
+	InferredParams inferParams;       ///< Post-resolution inferred parameter slots
+	std::vector<UniqueId> resnSlots;  ///< Pre-resolution inferred parameter slots
+	
+	// xxx - should turn inferParams+resnSlots into a union to save some memory
 
 	Expression();
@@ -73,6 +77,4 @@
 	bool get_extension() const { return extension; }
 	Expression * set_extension( bool exten ) { extension = exten; return this; }
-
-	InferredParams & get_inferParams() { return inferParams; }
 
 	// move other's inferParams to this
Index: src/SynTree/FunctionDecl.cc
===================================================================
--- src/SynTree/FunctionDecl.cc	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/SynTree/FunctionDecl.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -87,5 +87,5 @@
 
 	if ( statements ) {
-		os << indent << "... with body " << endl << indent+1;
+		os << indent << "... with body" << endl << indent+1;
 		statements->print( os, indent+1 );
 	} // if
Index: src/SynTree/FunctionType.cc
===================================================================
--- src/SynTree/FunctionType.cc	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/SynTree/FunctionType.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -66,7 +66,7 @@
 		os << indent+1 << "accepting unspecified arguments" << endl;
 	} // if
-	os << indent << "... returning ";
+	os << indent << "... returning";
 	if ( returnVals.empty() ) {
-		os << "nothing " << endl;
+		os << " nothing" << endl;
 	} else {
 		os << endl;
Index: src/SynTree/ObjectDecl.cc
===================================================================
--- src/SynTree/ObjectDecl.cc	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/SynTree/ObjectDecl.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -66,5 +66,5 @@
 
 	if ( ! attributes.empty() ) {
-		os << std::endl << indent << "... with attributes: " << std::endl;
+		os << std::endl << indent << "... with attributes:" << std::endl;
 		printAll( attributes, os, indent+1 );
 	}
Index: src/SynTree/ReferenceToType.cc
===================================================================
--- src/SynTree/ReferenceToType.cc	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/SynTree/ReferenceToType.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -93,5 +93,5 @@
 	else {
 		Type::print( os, indent );
-		os << "instance of " << typeString() << " " << name << " with body " << baseStruct->has_body() << " ";
+		os << "instance of " << typeString() << " " << name << " with body " << baseStruct->has_body();
 		if ( ! parameters.empty() ) {
 			os << endl << indent << "... with parameters" << endl;
@@ -136,5 +136,5 @@
 	else {
 		Type::print( os, indent );
-		os << "instance of " << typeString() << " " << name << " with body " << baseUnion->has_body() << " ";
+		os << "instance of " << typeString() << " " << name << " with body " << baseUnion->has_body();
 		if ( ! parameters.empty() ) {
 			os << endl << indent << "... with parameters" << endl;
@@ -160,5 +160,5 @@
 	else {
 		Type::print( os, indent );
-		os << "instance of " << typeString() << " " << name << " with body " << baseEnum->has_body() << " ";
+		os << "instance of " << typeString() << " " << name << " with body " << baseEnum->has_body();
 	} // if
 }
@@ -205,5 +205,5 @@
 
 	Type::print( os, indent );
-	os << "instance of " << typeString() << " " << get_name() << " (" << ( isFtype ? "" : "not" ) << " function type) ";
+	os << "instance of " << typeString() << " " << get_name() << " (" << ( isFtype ? "" : "not" ) << " function type)";
 	if ( ! parameters.empty() ) {
 		os << endl << indent << "... with parameters" << endl;
Index: src/SynTree/Type.cc
===================================================================
--- src/SynTree/Type.cc	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/SynTree/Type.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -118,5 +118,5 @@
 
 void QualifiedType::print( std::ostream & os, Indenter indent ) const {
-	os << "Qualified Type: " << endl;
+	os << "Qualified Type:" << endl;
 	os << indent+1;
 	parent->print( os, indent+1 );
Index: src/Tuples/Explode.h
===================================================================
--- src/Tuples/Explode.h	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/Tuples/Explode.h	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -44,13 +44,15 @@
 	template<typename OutputIterator>
 	void append( OutputIterator out, Expression* expr, const ResolvExpr::TypeEnvironment& env,
+			const ResolvExpr::OpenVarSet& openVars, const ResolvExpr::AssertionList& need, 
 			const ResolvExpr::Cost& cost, const ResolvExpr::Cost& cvtCost ) {
-		*out++ = ResolvExpr::Alternative{ expr, env, cost, cvtCost };
+		*out++ = ResolvExpr::Alternative{ expr, env, openVars, need, cost, cvtCost };
 	}
 
 	/// Append alternative to an ExplodedActual
 	static inline void append( ResolvExpr::ExplodedActual& ea, Expression* expr,
-			const ResolvExpr::TypeEnvironment&, const ResolvExpr::Cost&, const ResolvExpr::Cost& ) {
+			const ResolvExpr::TypeEnvironment&, const ResolvExpr::OpenVarSet&, 
+			const ResolvExpr::AssertionList&, const ResolvExpr::Cost&, const ResolvExpr::Cost& ) {
 		ea.exprs.emplace_back( expr );
-		/// xxx -- merge environment, cost?
+		/// xxx -- merge environment, openVars, need, cost?
 	}
 
@@ -68,5 +70,5 @@
 					// distribute reference cast over all components
 					append( std::forward<Output>(out), distributeReference( alt.release_expr() ),
-						alt.env, alt.cost, alt.cvtCost );
+						alt.env, alt.openVars, alt.need, alt.cost, alt.cvtCost );
 				}
 				// in tuple assignment, still need to handle the other cases, but only if not already handled here (don't want to output too many alternatives)
@@ -102,5 +104,6 @@
 		} else {
 			// atomic (non-tuple) type - output a clone of the expression in a new alternative
-			append( std::forward<Output>(out), expr->clone(), alt.env, alt.cost, alt.cvtCost );
+			append( std::forward<Output>(out), expr->clone(), alt.env, alt.openVars, alt.need,  
+				alt.cost, alt.cvtCost );
 		}
 	}
Index: src/Tuples/TupleAssignment.cc
===================================================================
--- src/Tuples/TupleAssignment.cc	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/Tuples/TupleAssignment.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -62,9 +62,21 @@
 		struct Matcher {
 		  public:
-			Matcher( TupleAssignSpotter &spotter, const ResolvExpr::AltList& lhs, const
-				ResolvExpr::AltList& rhs );
+			Matcher( TupleAssignSpotter &spotter, const ResolvExpr::AltList& lhs, 
+				const ResolvExpr::AltList& rhs );
 			virtual ~Matcher() {}
+			
 			virtual void match( std::list< Expression * > &out ) = 0;
 			ObjectDecl * newObject( UniqueName & namer, Expression * expr );
+
+			void combineState( const ResolvExpr::Alternative& alt ) {
+				compositeEnv.simpleCombine( alt.env );
+				ResolvExpr::mergeOpenVars( openVars, alt.openVars );
+				cloneAll( alt.need, need );
+			}
+
+			void combineState( const ResolvExpr::AltList& alts ) {
+				for ( const ResolvExpr::Alternative& alt : alts ) { combineState( alt ); }
+			}
+			
 			ResolvExpr::AltList lhs, rhs;
 			TupleAssignSpotter &spotter;
@@ -72,4 +84,6 @@
 			std::list< ObjectDecl * > tmpDecls;
 			ResolvExpr::TypeEnvironment compositeEnv;
+			ResolvExpr::OpenVarSet openVars;
+			ResolvExpr::AssertionSet need;
 		};
 
@@ -245,16 +259,18 @@
 		}
 
-		// extract expressions from the assignment alternatives to produce a list of assignments that
-		// together form a single alternative
+		// extract expressions from the assignment alternatives to produce a list of assignments 
+		// that together form a single alternative
 		std::list< Expression *> solved_assigns;
 		for ( ResolvExpr::Alternative & alt : current ) {
 			solved_assigns.push_back( alt.expr->clone() );
-		}
-		// combine assignment environments into combined expression environment
-		simpleCombineEnvironments( current.begin(), current.end(), matcher->compositeEnv );
+			matcher->combineState( alt );
+		}
+		
 		// xxx -- was push_front
-		currentFinder.get_alternatives().push_back( ResolvExpr::Alternative(
-			new TupleAssignExpr(solved_assigns, matcher->tmpDecls), matcher->compositeEnv,
-			ResolvExpr::sumCost( current ) + matcher->baseCost ) );
+		currentFinder.get_alternatives().push_back( ResolvExpr::Alternative{
+			new TupleAssignExpr{ solved_assigns, matcher->tmpDecls }, matcher->compositeEnv, 
+			matcher->openVars, 
+			ResolvExpr::AssertionList( matcher->need.begin(), matcher->need.end() ), 
+			ResolvExpr::sumCost( current ) + matcher->baseCost } );
 	}
 
@@ -263,6 +279,6 @@
 	: lhs(lhs), rhs(rhs), spotter(spotter),
 	  baseCost( ResolvExpr::sumCost( lhs ) + ResolvExpr::sumCost( rhs ) ) {
-		simpleCombineEnvironments( lhs.begin(), lhs.end(), compositeEnv );
-		simpleCombineEnvironments( rhs.begin(), rhs.end(), compositeEnv );
+		combineState( lhs ); 
+		combineState( rhs );
 	}
 
Index: src/cfa.make
===================================================================
--- src/cfa.make	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/cfa.make	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -21,2 +21,20 @@
 	$(LTCFACOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
 	$(am__mv) $$depbase.Tpo $$depbase.Plo
+
+AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
+am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
+am__v_JAVAC_0 = @echo "  JAVAC   " $@;
+am__v_JAVAC_1 =
+
+AM_V_GOC = $(am__v_GOC_@AM_V@)
+am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
+am__v_GOC_0 = @echo "  GOC     " $@;
+am__v_GOC_1 =
+
+UPPCC = u++
+UPPCOMPILE = $(UPPCC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_UPPFLAGS) $(UPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_CFLAGS) $(CFLAGS)
+
+AM_V_UPP = $(am__v_UPP_@AM_V@)
+am__v_UPP_ = $(am__v_UPP_@AM_DEFAULT_V@)
+am__v_UPP_0 = @echo "  UPP     " $@;
+am__v_UPP_1 =
Index: src/config.h.in
===================================================================
--- src/config.h.in	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/config.h.in	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -7,5 +7,5 @@
 #undef CFA_64_CPU
 
-/* Location of include files. */
+/* Backend compiler to use. */
 #undef CFA_BACKEND_CC
 
@@ -67,4 +67,7 @@
 #undef HAVE_ALLOCA_H
 
+/* 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
@@ -129,4 +132,7 @@
 /* Define to 1 if the system has the type `_Bool'. */
 #undef HAVE__BOOL
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+#undef LT_OBJDIR
 
 /* Name of package */
Index: src/main.cc
===================================================================
--- src/main.cc	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ src/main.cc	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -487,5 +487,5 @@
 			resolvep = true;
 			break;
-			case 'R':										// dump resolv-proto instance
+		  case 'R':										// dump resolv-proto instance
 			resolvprotop = true;
 			break;
Index: tests/.expect/alloc-ERROR.txt
===================================================================
--- tests/.expect/alloc-ERROR.txt	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/.expect/alloc-ERROR.txt	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -1,17 +1,17 @@
-alloc.cfa:265:1 error: No reasonable alternatives for expression Applying untyped: 
+alloc.cfa:265:1 error: No reasonable alternatives for expression Applying untyped:
   Name: ?=?
-...to: 
+...to:
   Name: p
-  Applying untyped: 
+  Applying untyped:
     Name: realloc
-  ...to: 
+  ...to:
     Name: stp
-    Applying untyped: 
+    Applying untyped:
       Name: ?*?
-    ...to: 
+    ...to:
       Name: dim
-      Sizeof Expression on: Applying untyped: 
+      Sizeof Expression on: Applying untyped:
           Name: *?
-        ...to: 
+        ...to:
           Name: stp
 
@@ -19,19 +19,19 @@
 
 
-alloc.cfa:266:1 error: No reasonable alternatives for expression Applying untyped: 
+alloc.cfa:266:1 error: No reasonable alternatives for expression Applying untyped:
   Name: ?=?
-...to: 
+...to:
   Name: p
-  Applying untyped: 
+  Applying untyped:
     Name: alloc
-  ...to: 
+  ...to:
     Name: stp
-    Applying untyped: 
+    Applying untyped:
       Name: ?*?
-    ...to: 
+    ...to:
       Name: dim
-      Sizeof Expression on: Applying untyped: 
+      Sizeof Expression on: Applying untyped:
           Name: *?
-        ...to: 
+        ...to:
           Name: stp
 
@@ -39,22 +39,22 @@
 
 
-alloc.cfa:267:1 error: No reasonable alternatives for expression Applying untyped: 
+alloc.cfa:267:1 error: No reasonable alternatives for expression Applying untyped:
   Name: ?=?
-...to: 
+...to:
   Name: p
-  Applying untyped: 
+  Applying untyped:
     Name: memset
-  ...to: 
+  ...to:
     Name: stp
     constant expression (10 10: signed int)
 
 
-alloc.cfa:268:1 error: No reasonable alternatives for expression Applying untyped: 
+alloc.cfa:268:1 error: No reasonable alternatives for expression Applying untyped:
   Name: ?=?
-...to: 
+...to:
   Name: p
-  Applying untyped: 
+  Applying untyped:
     Name: memcpy
-  ...to: 
+  ...to:
     Address of:
       Name: st1
Index: tests/.expect/castError.txt
===================================================================
--- tests/.expect/castError.txt	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/.expect/castError.txt	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -4,8 +4,8 @@
 ... to:
   char Alternatives are:
-Cost ( 1, 0, 0, 0 ): Cast of:
+Cost ( 1, 0, 0, 0, 0, 0 ): Cast of:
      Variable Expression: f: function
        accepting unspecified arguments
-     ... returning nothing 
+     ... returning nothing
 
    ... to:
@@ -14,7 +14,7 @@
    char
  )
- Environment: 
+ Environment:
 
-Cost ( 1, 0, 0, 0 ): Cast of:
+Cost ( 1, 0, 0, 0, 0, 0 ): Cast of:
      Variable Expression: f: double
    ... to:
@@ -23,7 +23,7 @@
    char
  )
- Environment: 
+ Environment:
 
-Cost ( 1, 0, 0, 0 ): Cast of:
+Cost ( 1, 0, 0, 0, 0, 0 ): Cast of:
      Variable Expression: f: signed int
    ... to:
@@ -32,5 +32,5 @@
    char
  )
- Environment: 
+ Environment:
 
 
Index: tests/.expect/completeTypeError.txt
===================================================================
--- tests/.expect/completeTypeError.txt	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/.expect/completeTypeError.txt	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -1,45 +1,92 @@
-completeTypeError.cfa:33:1 error: No reasonable alternatives for expression Applying untyped: 
+completeTypeError.cfa:33:1 error: No reasonable alternatives for expression Applying untyped:
   Name: *?
-...to: 
+...to:
   Name: v
 
-completeTypeError.cfa:34:1 error: No reasonable alternatives for expression Applying untyped: 
+completeTypeError.cfa:34:1 error: No reasonable alternatives for expression Applying untyped:
   Name: *?
-...to: 
+...to:
   Name: y
 
-completeTypeError.cfa:35:1 error: No reasonable alternatives for expression Applying untyped: 
+completeTypeError.cfa:35:1 error: No reasonable alternatives for expression Applying untyped:
   Name: foo
-...to: 
+...to:
   Name: v
 
-completeTypeError.cfa:36:1 error: No reasonable alternatives for expression Applying untyped: 
+completeTypeError.cfa:36:1 error: No reasonable alternatives for expression Applying untyped:
   Name: baz
-...to: 
+...to:
   Name: v
 
-completeTypeError.cfa:37:1 error: No reasonable alternatives for expression Applying untyped: 
+completeTypeError.cfa:37:1 error: No reasonable alternatives for expression Applying untyped:
   Name: quux
-...to: 
+...to:
   Name: v
 
-completeTypeError.cfa:58:1 error: No reasonable alternatives for expression Applying untyped: 
+completeTypeError.cfa:58:1 error: No reasonable alternatives for expression Applying untyped:
   Name: baz
-...to: 
+...to:
   Name: y
 
-completeTypeError.cfa:59:1 error: No reasonable alternatives for expression Applying untyped: 
+completeTypeError.cfa:59:1 error: No reasonable alternatives for expression Applying untyped:
   Name: quux
-...to: 
+...to:
   Name: y
 
-completeTypeError.cfa:60:1 error: No reasonable alternatives for expression Applying untyped: 
+completeTypeError.cfa:60:1 error: No reasonable alternatives for expression Applying untyped:
   Name: *?
-...to: 
+...to:
   Name: y
 
-completeTypeError.cfa:72:1 error: No reasonable alternatives for expression Applying untyped: 
+completeTypeError.cfa:72:1 error: No resolvable alternatives for expression Applying untyped:
   Name: baz
-...to: 
+...to:
   Name: z
 
+Alternatives with failing assertions are:
+Cost ( 0, 1, 0, 1, -5, 0 ): Application of
+     Variable Expression: baz: forall
+       T: sized object type
+       ... with assertions
+         ?=?: pointer to function
+         ... with parameters
+           reference to instance of type T (not function type)
+           instance of type T (not function type)
+         ... returning
+           _retval__operator_assign: instance of type T (not function type)
+           ... with attributes:
+             Attribute with name: unused
+
+
+         ?{}: pointer to function
+         ... with parameters
+           reference to instance of type T (not function type)
+         ... returning nothing
+
+         ?{}: pointer to function
+         ... with parameters
+           reference to instance of type T (not function type)
+           instance of type T (not function type)
+         ... returning nothing
+
+         ^?{}: pointer to function
+         ... with parameters
+           reference to instance of type T (not function type)
+         ... returning nothing
+
+
+       function
+     ... with parameters
+       pointer to instance of type T (not function type)
+     ... returning nothing
+
+   ... to arguments
+     Variable Expression: z: pointer to instance of type T (not function type)
+
+ (types:
+   void 
+ )
+ Environment:( _73_0_T ) -> instance of type T (not function type) (no widening)
+
+
+
Index: tests/.expect/declarationErrors.txt
===================================================================
--- tests/.expect/declarationErrors.txt	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/.expect/declarationErrors.txt	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -6,13 +6,13 @@
 
 declarationErrors.cfa:19:1 error: duplicate static in declaration of x4: static const volatile instance of const volatile struct __anonymous0
-  with members 
+  with members
     i: int 
-   with body 
+   with body
 
 
 declarationErrors.cfa:20:1 error: duplicate const, duplicate static, duplicate volatile in declaration of x5: static const volatile instance of const volatile struct __anonymous1
-  with members 
+  with members
     i: int 
-   with body 
+   with body
 
 
@@ -20,50 +20,50 @@
 
 declarationErrors.cfa:24:1 error: duplicate const in declaration of f01: static inline function
-  with no parameters 
+  with no parameters
   returning const volatile int 
 
 
 declarationErrors.cfa:25:1 error: duplicate volatile in declaration of f02: static inline function
-  with no parameters 
+  with no parameters
   returning const volatile int 
 
 
 declarationErrors.cfa:26:1 error: duplicate const in declaration of f03: static inline function
-  with no parameters 
+  with no parameters
   returning const volatile int 
 
 
 declarationErrors.cfa:27:1 error: duplicate volatile in declaration of f04: static inline function
-  with no parameters 
+  with no parameters
   returning const volatile int 
 
 
 declarationErrors.cfa:28:1 error: duplicate const in declaration of f05: static inline function
-  with no parameters 
+  with no parameters
   returning const volatile int 
 
 
 declarationErrors.cfa:29:1 error: duplicate volatile in declaration of f06: static inline function
-  with no parameters 
+  with no parameters
   returning const volatile int 
 
 
 declarationErrors.cfa:30:1 error: duplicate const in declaration of f07: static inline function
-  with no parameters 
+  with no parameters
   returning const volatile int 
 
 
 declarationErrors.cfa:31:1 error: duplicate const, duplicate volatile in declaration of f08: static inline function
-  with no parameters 
+  with no parameters
   returning const volatile int 
 
 
 declarationErrors.cfa:33:1 error: duplicate const, duplicate volatile in declaration of f09: static inline function
-  with no parameters 
+  with no parameters
   returning const volatile int 
 
 
 declarationErrors.cfa:34:1 error: duplicate const, duplicate _Atomic, duplicate _Atomic, duplicate const, duplicate restrict, duplicate volatile in declaration of f09: static inline function
-  with no parameters 
+  with no parameters
   returning const restrict volatile _Atomic int 
 
Index: tests/.expect/nested-types-ERR2.txt
===================================================================
--- tests/.expect/nested-types-ERR2.txt	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/.expect/nested-types-ERR2.txt	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -1,6 +1,6 @@
 nested-types.cfa:73:1 error: Use of undefined global type Z
 nested-types.cfa:74:1 error: Qualified type requires an aggregate on the left, but has: signed int
-nested-types.cfa:75:1 error: Undefined type in qualified type: Qualified Type: 
-  instance of struct S with body 1 
-  instance of type Z (not function type) 
+nested-types.cfa:75:1 error: Undefined type in qualified type: Qualified Type:
+  instance of struct S with body 1
+  instance of type Z (not function type)
 
Index: tests/.expect/scopeErrors.txt
===================================================================
--- tests/.expect/scopeErrors.txt	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/.expect/scopeErrors.txt	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -3,10 +3,10 @@
 ... with parameters
   double
-... returning 
+... returning
   _retval_butThisIsAnError: double
-  ... with attributes: 
+  ... with attributes:
     Attribute with name: unused
 
-... with body 
+... with body
   CompoundStmt
 
Index: tests/Makefile.am
===================================================================
--- tests/Makefile.am	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/Makefile.am	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -16,4 +16,5 @@
 
 AUTOMAKE_OPTIONS = foreign    # do not require all the GNU file names
+ACLOCAL_AMFLAGS  = -I automake
 
 include $(top_srcdir)/src/cfa.make
@@ -44,7 +45,9 @@
 .PHONY: list .validate
 .INTERMEDIATE: .validate .validate.cfa
-EXTRA_PROGRAMS = avl_test # build but do not install
+EXTRA_PROGRAMS = avl_test .dummy_hack # build but do not install
 
-avl_test_SOURCES = avltree/avl_test.c avltree/avl0.c avltree/avl1.c avltree/avl2.c avltree/avl3.c avltree/avl4.c avltree/avl-private.c
+avl_test_SOURCES = avltree/avl_test.cfa avltree/avl0.cfa avltree/avl1.cfa avltree/avl2.cfa avltree/avl3.cfa avltree/avl4.cfa avltree/avl-private.cfa
+# automake doesn't know we still need C rules so pretend like we have a C program
+_dummy_hack_SOURCES = .dummy_hack.c
 
 #----------------------------------------------------------------------------------------------------------------
@@ -67,5 +70,6 @@
 	@echo "int main() { return 0; }" > ${@}
 
-dummy_hack.c:
+# automake doesn't know we still need C rules so pretend like we have a C program
+.dummy_hack.c:
 	@echo "int main() { return 0; }" > ${@}
 
@@ -76,7 +80,4 @@
 
 # implicit rule so not all test require a rule
-% : %.c $(CFACC)
-	$(PRETTY_PATH) $(CFACOMPILE) $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
-
 % : %.cfa $(CFACC)
 	$(PRETTY_PATH) $(CFACOMPILE) $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
@@ -107,5 +108,5 @@
 
 #builtins
-builtins/sync: builtins/sync.c $(CFACC)
+builtins/sync: builtins/sync.cfa $(CFACC)
 	$(PRETTY_PATH) $(CFACOMPILE) $(shell realpath --relative-to=${srcdir} ${<}) 2> $(abspath ${@}) -fsyntax-only
 
@@ -132,17 +133,17 @@
 
 # Constructor/destructor tests
-raii/dtor-early-exit-ERR1: raii/dtor-early-exit.c $(CFACC)
+raii/dtor-early-exit-ERR1: raii/dtor-early-exit.cfa $(CFACC)
 	$(PRETTY_PATH) $(CFACOMPILE) -DERR1 $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-raii/dtor-early-exit-ERR2: raii/dtor-early-exit.c $(CFACC)
+raii/dtor-early-exit-ERR2: raii/dtor-early-exit.cfa $(CFACC)
 	$(PRETTY_PATH) $(CFACOMPILE) -DERR2 $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-raii/memberCtors-ERR1: raii/memberCtors.c $(CFACC)
+raii/memberCtors-ERR1: raii/memberCtors.cfa $(CFACC)
 	$(PRETTY_PATH) $(CFACOMPILE) -DERR1 $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-raii/ctor-autogen-ERR1: raii/ctor-autogen.c $(CFACC)
+raii/ctor-autogen-ERR1: raii/ctor-autogen.cfa $(CFACC)
 	$(PRETTY_PATH) $(CFACOMPILE) -DERR1 $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
 # Warnings
-warnings/self-assignment: warnings/self-assignment.c $(CFACC)
+warnings/self-assignment: warnings/self-assignment.cfa $(CFACC)
 	$(PRETTY_PATH) $(CFACOMPILE) $(shell realpath --relative-to=${srcdir} ${<}) 2> $(abspath ${@}) -fsyntax-only
Index: tests/Makefile.in
===================================================================
--- tests/Makefile.in	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/Makefile.in	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -91,9 +91,13 @@
 build_triplet = @build@
 host_triplet = @host@
-EXTRA_PROGRAMS = avl_test$(EXEEXT)
+EXTRA_PROGRAMS = avl_test$(EXEEXT) .dummy_hack$(EXEEXT)
 subdir = tests
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/automake/cfa.m4 \
-	$(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/automake/libtool.m4 \
+	$(top_srcdir)/automake/ltoptions.m4 \
+	$(top_srcdir)/automake/ltsugar.m4 \
+	$(top_srcdir)/automake/ltversion.m4 \
+	$(top_srcdir)/automake/lt~obsolete.m4 \
+	$(top_srcdir)/automake/cfa.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -103,4 +107,11 @@
 CONFIG_CLEAN_FILES = config.py
 CONFIG_CLEAN_VPATH_FILES = test.py
+am__dummy_hack_OBJECTS = .dummy_hack.$(OBJEXT)
+_dummy_hack_OBJECTS = $(am__dummy_hack_OBJECTS)
+_dummy_hack_LDADD = $(LDADD)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
 am__dirstamp = $(am__leading_dot)dirstamp
 am_avl_test_OBJECTS = avltree/avl_test.$(OBJEXT) \
@@ -128,4 +139,8 @@
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
 AM_V_CC = $(am__v_CC_@AM_V@)
 am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
@@ -133,11 +148,13 @@
 am__v_CC_1 = 
 CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
 AM_V_CCLD = $(am__v_CCLD_@AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-SOURCES = $(avl_test_SOURCES)
-DIST_SOURCES = $(avl_test_SOURCES)
+SOURCES = $(_dummy_hack_SOURCES) $(avl_test_SOURCES)
+DIST_SOURCES = $(_dummy_hack_SOURCES) $(avl_test_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
@@ -172,9 +189,9 @@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BACKEND_CC = @BACKEND_CC@
 BUILD_IN_TREE_FLAGS = @BUILD_IN_TREE_FLAGS@
 CC = @CFACC@
@@ -196,4 +213,5 @@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
+CXXCPP = @CXXCPP@
 CXXDEPMODE = @CXXDEPMODE@
 CXXFLAGS = @CXXFLAGS@
@@ -201,5 +219,8 @@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
 DRIVER_DIR = @DRIVER_DIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
@@ -207,4 +228,5 @@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
+FGREP = @FGREP@
 GREP = @GREP@
 HOST_FLAGS = @HOST_FLAGS@
@@ -214,4 +236,5 @@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LEX = @LEX@
@@ -222,8 +245,18 @@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -235,4 +268,5 @@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -246,6 +280,8 @@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -295,9 +331,29 @@
 top_srcdir = @top_srcdir@
 AUTOMAKE_OPTIONS = foreign    # do not require all the GNU file names
+ACLOCAL_AMFLAGS = -I automake
 CFACOMPILE = $(CFACC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(CFAFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCFACOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CFACC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(CFAFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+
 AM_V_CFA = $(am__v_CFA_@AM_V@)
 am__v_CFA_ = $(am__v_CFA_@AM_DEFAULT_V@)
 am__v_CFA_0 = @echo "  CFA     " $@;
 am__v_CFA_1 = 
+AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
+am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
+am__v_JAVAC_0 = @echo "  JAVAC   " $@;
+am__v_JAVAC_1 = 
+AM_V_GOC = $(am__v_GOC_@AM_V@)
+am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
+am__v_GOC_0 = @echo "  GOC     " $@;
+am__v_GOC_1 = 
+UPPCC = u++
+UPPCOMPILE = $(UPPCC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_UPPFLAGS) $(UPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_UPP = $(am__v_UPP_@AM_V@)
+am__v_UPP_ = $(am__v_UPP_@AM_DEFAULT_V@)
+am__v_UPP_0 = @echo "  UPP     " $@;
+am__v_UPP_1 = 
 debug = yes
 installed = no
@@ -312,9 +368,11 @@
 	${INSTALL_FLAGS} ${ARCH_FLAGS}
 PRETTY_PATH = cd ${srcdir} &&
-avl_test_SOURCES = avltree/avl_test.c avltree/avl0.c avltree/avl1.c avltree/avl2.c avltree/avl3.c avltree/avl4.c avltree/avl-private.c
+avl_test_SOURCES = avltree/avl_test.cfa avltree/avl0.cfa avltree/avl1.cfa avltree/avl2.cfa avltree/avl3.cfa avltree/avl4.cfa avltree/avl-private.cfa
+# automake doesn't know we still need C rules so pretend like we have a C program
+_dummy_hack_SOURCES = .dummy_hack.c
 all: all-am
 
 .SUFFIXES:
-.SUFFIXES: .c .cfa .o .obj .validate
+.SUFFIXES: .c .cfa .dummy_hack .lo .o .obj .validate
 $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(top_srcdir)/src/cfa.make $(am__configure_deps)
 	@for dep in $?; do \
@@ -349,4 +407,8 @@
 config.py: $(top_builddir)/config.status $(srcdir)/config.py.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+.dummy_hack$(EXEEXT): $(_dummy_hack_OBJECTS) $(_dummy_hack_DEPENDENCIES) $(EXTRA__dummy_hack_DEPENDENCIES) 
+	@rm -f .dummy_hack$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(_dummy_hack_OBJECTS) $(_dummy_hack_LDADD) $(LIBS)
 avltree/$(am__dirstamp):
 	@$(MKDIR_P) avltree
@@ -381,11 +443,5 @@
 	-rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl-private.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl0.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl1.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl2.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl3.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl4.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl_test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/.dummy_hack.Po@am__quote@
 
 .c.o:
@@ -404,4 +460,18 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
 
 ID: $(am__tagged_files)
@@ -525,8 +595,8 @@
 clean: clean-am
 
-clean-am: clean-generic clean-local mostlyclean-am
+clean-am: clean-generic clean-libtool clean-local mostlyclean-am
 
 distclean: distclean-am
-	-rm -rf avltree/$(DEPDIR)
+	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
@@ -574,5 +644,5 @@
 
 maintainer-clean: maintainer-clean-am
-	-rm -rf avltree/$(DEPDIR)
+	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
@@ -580,5 +650,6 @@
 mostlyclean: mostlyclean-am
 
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
 
 pdf: pdf-am
@@ -595,14 +666,15 @@
 
 .PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \
-	clean-generic clean-local cscopelist-am ctags ctags-am \
-	distclean distclean-compile distclean-generic distclean-tags \
-	distdir dvi dvi-am html html-am info info-am install \
-	install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+	clean-generic clean-libtool clean-local cscopelist-am ctags \
+	ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
 	tags tags-am uninstall uninstall-am
 
@@ -615,4 +687,9 @@
 	$(am__mv) $$depbase.Tpo $$depbase.Po
 
+.cfa.lo:
+	$(AM_V_CFA)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+	$(LTCFACOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+	$(am__mv) $$depbase.Tpo $$depbase.Plo
+
 .PHONY: list .validate
 .INTERMEDIATE: .validate .validate.cfa
@@ -637,5 +714,6 @@
 	@echo "int main() { return 0; }" > ${@}
 
-dummy_hack.c:
+# automake doesn't know we still need C rules so pretend like we have a C program
+.dummy_hack.c:
 	@echo "int main() { return 0; }" > ${@}
 
@@ -646,7 +724,4 @@
 
 # implicit rule so not all test require a rule
-% : %.c $(CFACC)
-	$(PRETTY_PATH) $(CFACOMPILE) $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
-
 % : %.cfa $(CFACC)
 	$(PRETTY_PATH) $(CFACOMPILE) $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
@@ -677,5 +752,5 @@
 
 #builtins
-builtins/sync: builtins/sync.c $(CFACC)
+builtins/sync: builtins/sync.cfa $(CFACC)
 	$(PRETTY_PATH) $(CFACOMPILE) $(shell realpath --relative-to=${srcdir} ${<}) 2> $(abspath ${@}) -fsyntax-only
 
@@ -702,18 +777,18 @@
 
 # Constructor/destructor tests
-raii/dtor-early-exit-ERR1: raii/dtor-early-exit.c $(CFACC)
+raii/dtor-early-exit-ERR1: raii/dtor-early-exit.cfa $(CFACC)
 	$(PRETTY_PATH) $(CFACOMPILE) -DERR1 $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-raii/dtor-early-exit-ERR2: raii/dtor-early-exit.c $(CFACC)
+raii/dtor-early-exit-ERR2: raii/dtor-early-exit.cfa $(CFACC)
 	$(PRETTY_PATH) $(CFACOMPILE) -DERR2 $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-raii/memberCtors-ERR1: raii/memberCtors.c $(CFACC)
+raii/memberCtors-ERR1: raii/memberCtors.cfa $(CFACC)
 	$(PRETTY_PATH) $(CFACOMPILE) -DERR1 $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-raii/ctor-autogen-ERR1: raii/ctor-autogen.c $(CFACC)
+raii/ctor-autogen-ERR1: raii/ctor-autogen.cfa $(CFACC)
 	$(PRETTY_PATH) $(CFACOMPILE) -DERR1 $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
 # Warnings
-warnings/self-assignment: warnings/self-assignment.c $(CFACC)
+warnings/self-assignment: warnings/self-assignment.cfa $(CFACC)
 	$(PRETTY_PATH) $(CFACOMPILE) $(shell realpath --relative-to=${srcdir} ${<}) 2> $(abspath ${@}) -fsyntax-only
 
Index: tests/abs.cfa
===================================================================
--- tests/abs.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/abs.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Thu Jan 28 18:26:16 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 17:50:44 2018
-// Update Count     : 54
+// Last Modified On : Tue Dec  4 21:33:15 2018
+// Update Count     : 55
 //
 
@@ -19,14 +19,14 @@
 int main( void ) {
 	signed char ch = -65;
-	sout | "char\t\t\t"					| ch     | "\tabs " | abs( ch ) | endl;
-	sout | "signed int\t\t"				| -65    | "\tabs" | abs( -65 ) | endl;
-	sout | "signed long int\t\t" 		| -65l   | "\tabs" | abs( -65l ) | endl;
-	sout | "signed long long int\t"		| -65ll  | "\tabs" | abs( -65ll ) | endl;
-	sout | "float\t\t\t" 				| -65.0f | "\tabs" | abs( -65.0f ) | endl;
-	sout | "double\t\t\t"				| -65.0  | "\tabs" | abs( -65.0 ) | endl;
-	sout | "long double\t\t"			| -65.0l | "\tabs" | abs( -65.0l ) | endl;
-	sout | "float _Complex\t\t"			| -65.0F-2.0iF | "\tabs" | abs( -65.0F-2.0iF ) | endl;
-	sout | "double _Complex\t\t"		| -65.0D-2.0iD | "\tabs" | abs( -65.0D-2.0iD ) | endl;
-	sout | "long double _Complex\t"		| -65.0L-2.0iL | "\tabs" | abs( -65.0L-2.0iL ) | endl;
+	sout | "char\t\t\t"					| ch     | "\tabs " | abs( ch );
+	sout | "signed int\t\t"				| -65    | "\tabs" | abs( -65 );
+	sout | "signed long int\t\t" 		| -65l   | "\tabs" | abs( -65l );
+	sout | "signed long long int\t"		| -65ll  | "\tabs" | abs( -65ll );
+	sout | "float\t\t\t" 				| -65.0f | "\tabs" | abs( -65.0f );
+	sout | "double\t\t\t"				| -65.0  | "\tabs" | abs( -65.0 );
+	sout | "long double\t\t"			| -65.0l | "\tabs" | abs( -65.0l );
+	sout | "float _Complex\t\t"			| -65.0F-2.0iF | "\tabs" | abs( -65.0F-2.0iF );
+	sout | "double _Complex\t\t"		| -65.0D-2.0iD | "\tabs" | abs( -65.0D-2.0iD );
+	sout | "long double _Complex\t"		| -65.0L-2.0iL | "\tabs" | abs( -65.0L-2.0iL );
 } // main
 
Index: tests/ato.cfa
===================================================================
--- tests/ato.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/ato.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Thu Feb  4 08:10:57 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 17:51:03 2018
-// Update Count     : 91
+// Last Modified On : Tue Dec  4 21:33:53 2018
+// Update Count     : 92
 //
 
@@ -20,100 +20,100 @@
 	const char * sptr = "-123";
 	int i = ato( sptr );
-	sout | i | sptr | endl;
+	sout | i | sptr;
 	sptr = "123";
 	unsigned int ui = ato( sptr );
-	sout | ui | sptr | endl;
+	sout | ui | sptr;
 
 	sptr = "-123";
 	long int li = ato( sptr );
-	sout | li | sptr | endl;
+	sout | li | sptr;
 	sptr = "123";
 	unsigned long int uli = ato( sptr );
-	sout | uli | sptr | endl;
+	sout | uli | sptr;
 
 	sptr = "-123";
 	long long int lli = ato( sptr );
-	sout | lli | sptr | endl;
+	sout | lli | sptr;
 	sptr = "123";
 	unsigned long long int ulli = ato( sptr );
-	sout | ulli | sptr | endl;
+	sout | ulli | sptr;
 
 	sptr = "-123.456";
 	float f = ato( sptr );
-	sout | f | sptr | endl;
+	sout | f | sptr;
 	sptr = "-123.4567890123456";
 	double d = ato( sptr );
-	sout | d | sptr | endl;
+	sout | d | sptr;
 	sptr = "-123.45678901234567890123456789";
 	long double ld = ato( sptr );
-	sout | ld | sptr | endl;
+	sout | ld | sptr;
 
 	sptr = "-123.456-123.456i";
 	float _Complex fc = ato( sptr );
-	sout | fc | sptr | endl;
+	sout | fc | sptr;
 	sptr = "-123.4567890123456+123.4567890123456i";
 	double _Complex dc = ato( sptr );
-	sout | dc | sptr | endl;
+	sout | dc | sptr;
 	sptr = "123.45678901234567890123456789-123.45678901234567890123456789i";
 	long double _Complex ldc = ato( sptr );
-	sout | ldc | sptr | endl;
+	sout | ldc | sptr;
 	sptr = "123.45678901234-123.4567890i";
 	long double _Complex ldc2 = ato( sptr );
-	sout | ldc2 | sptr | endl;
+	sout | ldc2 | sptr;
 
 
 	sptr = "-123";
 	i = strto( sptr, 0, 10 );
-	sout | i | sptr | endl;
+	sout | i | sptr;
 	sptr = "123";
 	ui = strto( sptr, 0, 10 );
-	sout | ui | sptr | endl;
+	sout | ui | sptr;
 
 	sptr = "-123";
 	li = strto( sptr, 0, 10 );
-	sout | li | sptr | endl;
+	sout | li | sptr;
 	sptr = "123";
 	uli = strto( sptr, 0, 10 );
-	sout | uli | sptr | endl;
+	sout | uli | sptr;
 
 	sptr = "-123";
 	lli = strto( sptr, 0, 10 );
-	sout | lli | sptr | endl;
+	sout | lli | sptr;
 	sptr = "123";
 	ulli = strto( sptr, 0, 10 );
-	sout | ulli | sptr | endl;
+	sout | ulli | sptr;
 
 	sptr = "-123.456";
 	f = strto( sptr, 0 );
-	sout | f | sptr | endl;
+	sout | f | sptr;
 	sptr = "-123.4567890123456";
 	d = strto( sptr, 0 );
-	sout | d | sptr | endl;
+	sout | d | sptr;
 	sptr = "-123.45678901234567890123456789";
 	ld = strto( sptr, 0 );
-	sout | ld | sptr | endl;
+	sout | ld | sptr;
 
 	sptr = "-123.456-123.456i";
 	fc = strto( sptr, 0 );
-	sout | fc | sptr | endl;
+	sout | fc | sptr;
 
 	char * eptr = 0;
 	// sptr = "2fred";
 	// fc = strto( sptr, &eptr );
-	// sout | fc | sptr | eptr | endl;
+	// sout | fc | sptr | eptr;
 
 	sptr = "2  3";
 	fc = strto( sptr, &eptr );
-	sout | fc | sptr | eptr | endl;
+	sout | fc | sptr | eptr;
 
 	sptr = "-123.4567890123456+123.4567890123456i";
 	dc = strto( sptr, 0 );
-	sout | dc | sptr | endl;
+	sout | dc | sptr;
 	sptr = "123.45678901234567890123456789-123.45678901234567890123456789i";
 	ldc = strto( sptr, 0 );
-	sout | ldc | sptr | endl;
+	sout | ldc | sptr;
 	sptr = "123.45678901234-123.4567890i";
 	ldc2 = strto( sptr, 0 );
-	sout | ldc2 | sptr | endl;
+	sout | ldc2 | sptr;
 } // main
 
Index: sts/avltree/avl-private.c
===================================================================
--- tests/avltree/avl-private.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,134 +1,0 @@
-#include "avl.h"
-#include "avl-private.h"
-
-// AVL tree specific (internal) operations:
-// rotateLeft, rotateRight, fix
-//
-// AVL tree enhanced height operation
-//
-// calcBalance is a simple computation of height(R) - height(L)
-
-// an AVL tree's height is easy to compute
-// just follow path with the larger balance
-forall(otype K | Comparable(K), otype V)
-int height(tree(K, V) * t){
-  int helper(tree(K, V) * t, int ht){
-    if (empty(t)){
-      return ht;
-    } else if (t->balance > 0){
-      return helper(t->right, 1+ht);
-    } else {
-      // can traverse either branch to find the height
-      // of an AVL tree whose balance is 0
-      return helper(t->left, 1+ht);
-    }
-  }
-  return helper(t, 0);
-}
-
-forall(otype K | Comparable(K), otype V)
-int calcBalance(tree(K, V) * t){
-  int l = height(t->left);
-  int r = height(t->right);
-  t->balance = r-l;
-  return t->balance;
-}
-
-// re-establish the link between parent and child
-forall(otype K | Comparable(K), otype V)
-void relinkToParent(tree(K, V) * t){
-  tree(K, V) * parent = t->parent; // FIX ME!!
-  if (empty(t->parent)){
-    return;
-  } else if (parent->key < t->key){
-    parent->right = t;
-  } else {
-    parent->left = t;
-  }
-}
-
-// rotate left from t
-forall(otype K | Comparable(K), otype V)
-tree(K, V) * rotateLeft(tree(K, V) * t){
-  tree(K, V) * newRoot = t->right;
-  t->right = newRoot->left;
-  newRoot->left = t;
-
-  // swap parents
-  newRoot->parent = t->parent;
-  t->parent = newRoot;
-  if (t->right != NULL) {
-    tree(K, V) * right = t->right; // FIX ME!!
-    right->parent = t;
-  }
-  // re-establish the link between newRoot and its parent
-  relinkToParent(newRoot);
-  return newRoot;
-}
-
-// rotate right from t
-forall(otype K | Comparable(K), otype V)
-tree(K, V) * rotateRight(tree(K, V) * t){
-  tree(K, V) * newRoot = t->left;
-  t->left = newRoot->right;
-  newRoot->right = t;
-
-  // swap parents
-  newRoot->parent = t->parent;
-  t->parent = newRoot;
-  if (t->left != NULL){
-    tree(K, V) * left = t->left; // FIX ME!!
-    left->parent = t;
-  }
-  // re-establish the link between newRoot and its parent
-  relinkToParent(newRoot);
-  return newRoot;
-}
-
-// balances a node that has balance factor -2 or 2
-forall(otype K | Comparable(K), otype V)
-tree(K, V) * fix(tree(K, V) * t){
-  // ensure that t's balance factor is one of
-  // the appropriate values
-  assert(t->balance == 2 || t->balance == -2);
-
-  if (t->balance == -2){
-    tree(K, V) * left = t->left; // FIX ME!!
-    if (left->balance == 1){
-      t->left = rotateLeft(t->left);
-    }
-    return rotateRight(t);
-  } else if (t->balance == 2){
-    tree(K, V) * right = t->right; // FIX ME!!
-    if (right->balance == -1){
-      t->right = rotateRight(t->right);
-    }
-    return rotateLeft(t);
-  } else {
-    // shouldn't ever get here
-    assert((int)0);
-    return t;
-  }
-}
-
-// attempt to fix the tree, if necessary
-forall(otype K | Comparable(K), otype V)
-tree(K, V) * tryFix(tree(K, V) * t){
-  int b = calcBalance(t);
-
-  if (b == -2 || b == 2){
-    t = fix(t);
-  } else {
-    assert(b == 0 || b == 1 || b == -1);
-  }
-  return t;
-}
-
-// sets parent field of c to be p
-forall(otype K | Comparable(K), otype V)
-void setParent(tree(K, V) * c, tree(K, V) * p){
-  if (! empty(c)){
-    c->parent = p;
-  }
-}
-
Index: tests/avltree/avl-private.cfa
===================================================================
--- tests/avltree/avl-private.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/avltree/avl-private.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,134 @@
+#include "avl.h"
+#include "avl-private.h"
+
+// AVL tree specific (internal) operations:
+// rotateLeft, rotateRight, fix
+//
+// AVL tree enhanced height operation
+//
+// calcBalance is a simple computation of height(R) - height(L)
+
+// an AVL tree's height is easy to compute
+// just follow path with the larger balance
+forall(otype K | Comparable(K), otype V)
+int height(tree(K, V) * t){
+  int helper(tree(K, V) * t, int ht){
+    if (empty(t)){
+      return ht;
+    } else if (t->balance > 0){
+      return helper(t->right, 1+ht);
+    } else {
+      // can traverse either branch to find the height
+      // of an AVL tree whose balance is 0
+      return helper(t->left, 1+ht);
+    }
+  }
+  return helper(t, 0);
+}
+
+forall(otype K | Comparable(K), otype V)
+int calcBalance(tree(K, V) * t){
+  int l = height(t->left);
+  int r = height(t->right);
+  t->balance = r-l;
+  return t->balance;
+}
+
+// re-establish the link between parent and child
+forall(otype K | Comparable(K), otype V)
+void relinkToParent(tree(K, V) * t){
+  tree(K, V) * parent = t->parent; // FIX ME!!
+  if (empty(t->parent)){
+    return;
+  } else if (parent->key < t->key){
+    parent->right = t;
+  } else {
+    parent->left = t;
+  }
+}
+
+// rotate left from t
+forall(otype K | Comparable(K), otype V)
+tree(K, V) * rotateLeft(tree(K, V) * t){
+  tree(K, V) * newRoot = t->right;
+  t->right = newRoot->left;
+  newRoot->left = t;
+
+  // swap parents
+  newRoot->parent = t->parent;
+  t->parent = newRoot;
+  if (t->right != NULL) {
+    tree(K, V) * right = t->right; // FIX ME!!
+    right->parent = t;
+  }
+  // re-establish the link between newRoot and its parent
+  relinkToParent(newRoot);
+  return newRoot;
+}
+
+// rotate right from t
+forall(otype K | Comparable(K), otype V)
+tree(K, V) * rotateRight(tree(K, V) * t){
+  tree(K, V) * newRoot = t->left;
+  t->left = newRoot->right;
+  newRoot->right = t;
+
+  // swap parents
+  newRoot->parent = t->parent;
+  t->parent = newRoot;
+  if (t->left != NULL){
+    tree(K, V) * left = t->left; // FIX ME!!
+    left->parent = t;
+  }
+  // re-establish the link between newRoot and its parent
+  relinkToParent(newRoot);
+  return newRoot;
+}
+
+// balances a node that has balance factor -2 or 2
+forall(otype K | Comparable(K), otype V)
+tree(K, V) * fix(tree(K, V) * t){
+  // ensure that t's balance factor is one of
+  // the appropriate values
+  assert(t->balance == 2 || t->balance == -2);
+
+  if (t->balance == -2){
+    tree(K, V) * left = t->left; // FIX ME!!
+    if (left->balance == 1){
+      t->left = rotateLeft(t->left);
+    }
+    return rotateRight(t);
+  } else if (t->balance == 2){
+    tree(K, V) * right = t->right; // FIX ME!!
+    if (right->balance == -1){
+      t->right = rotateRight(t->right);
+    }
+    return rotateLeft(t);
+  } else {
+    // shouldn't ever get here
+    assert((int)0);
+    return t;
+  }
+}
+
+// attempt to fix the tree, if necessary
+forall(otype K | Comparable(K), otype V)
+tree(K, V) * tryFix(tree(K, V) * t){
+  int b = calcBalance(t);
+
+  if (b == -2 || b == 2){
+    t = fix(t);
+  } else {
+    assert(b == 0 || b == 1 || b == -1);
+  }
+  return t;
+}
+
+// sets parent field of c to be p
+forall(otype K | Comparable(K), otype V)
+void setParent(tree(K, V) * c, tree(K, V) * p){
+  if (! empty(c)){
+    c->parent = p;
+  }
+}
+
Index: sts/avltree/avl0.c
===================================================================
--- tests/avltree/avl0.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,11 +1,0 @@
-#include "avl.h"
-
-forall(otype T | Comparable(T))
-int ?==?(T t1, T t2) {
-  return !(t1 < t2) && !(t2 < t1);
-}
-
-forall(otype T | Comparable(T))
-int ?>?(T t1, T t2) {
-  return t2 < t1;
-}
Index: tests/avltree/avl0.cfa
===================================================================
--- tests/avltree/avl0.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/avltree/avl0.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,11 @@
+#include "avl.h"
+
+forall(otype T | Comparable(T))
+int ?==?(T t1, T t2) {
+  return !(t1 < t2) && !(t2 < t1);
+}
+
+forall(otype T | Comparable(T))
+int ?>?(T t1, T t2) {
+  return t2 < t1;
+}
Index: sts/avltree/avl1.c
===================================================================
--- tests/avltree/avl1.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,48 +1,0 @@
-#include "avl.h"
-// #include "cwrap.h"
-#include <stdlib.hfa>
-
-forall(otype K | Comparable(K), otype V)
-void ?{}(tree(K, V) &t, K key, V value){
-  (t.key) { key };
-  (t.value) { value };
-  t.parent = NULL;
-  t.left = NULL;
-  t.right = NULL;
-  t.balance = 0;
-}
-
-forall(otype K, otype V)
-void ^?{}(tree(K, V) & t){
-  delete(t.left);
-  delete(t.right);
-  ^(t.key){};
-  ^(t.value){};
-}
-
-forall(otype K | Comparable(K), otype V)
-tree(K, V) * create(K key, V value) {
-  // infinite loop trying to resolve ... t = malloc();
-  tree(K, V) * t = malloc(sizeof(tree(K,V)));
-  (*t){ key, value };
-  return t;
-}
-
-// // Helper function to print trees
-// forall(otype K | Comparable(K), otype V)
-// void printTree(tree * t, int level){
-//   if (empty(t)){
-//     return;
-//   }
-
-//   printTree(t->left, level+1);
-//   printf("key: %d, value: %s, level: %d\n", t->key, t->value, level);
-//   printTree(t->right, level+1);
-// }
-
-// // inorder traversal of t
-// // prints each key, followed by the value
-// forall(otype K | Comparable(K), otype V)
-// void printTree(tree(K, V) * t){
-//     printTree(t, 0);
-// }
Index: tests/avltree/avl1.cfa
===================================================================
--- tests/avltree/avl1.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/avltree/avl1.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,48 @@
+#include "avl.h"
+// #include "cwrap.h"
+#include <stdlib.hfa>
+
+forall(otype K | Comparable(K), otype V)
+void ?{}(tree(K, V) &t, K key, V value){
+  (t.key) { key };
+  (t.value) { value };
+  t.parent = NULL;
+  t.left = NULL;
+  t.right = NULL;
+  t.balance = 0;
+}
+
+forall(otype K, otype V)
+void ^?{}(tree(K, V) & t){
+  delete(t.left);
+  delete(t.right);
+  ^(t.key){};
+  ^(t.value){};
+}
+
+forall(otype K | Comparable(K), otype V)
+tree(K, V) * create(K key, V value) {
+  // infinite loop trying to resolve ... t = malloc();
+  tree(K, V) * t = malloc(sizeof(tree(K,V)));
+  (*t){ key, value };
+  return t;
+}
+
+// // Helper function to print trees
+// forall(otype K | Comparable(K), otype V)
+// void printTree(tree * t, int level){
+//   if (empty(t)){
+//     return;
+//   }
+
+//   printTree(t->left, level+1);
+//   printf("key: %d, value: %s, level: %d\n", t->key, t->value, level);
+//   printTree(t->right, level+1);
+// }
+
+// // inorder traversal of t
+// // prints each key, followed by the value
+// forall(otype K | Comparable(K), otype V)
+// void printTree(tree(K, V) * t){
+//     printTree(t, 0);
+// }
Index: sts/avltree/avl2.c
===================================================================
--- tests/avltree/avl2.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,84 +1,0 @@
-#include "avl.h"
-#include "avl-private.h"
-
-forall(otype K | Comparable(K), otype V)
-V * find(tree(K, V) * t, K key){
-  if (empty(t)){
-    return NULL;
-  }
-
-  if (t->key == key){
-    return &t->value;
-  } else if (t->key < key){
-    return find(t->right, key);
-  } else {
-    // t->key > key
-    return find(t->left, key);
-  }
-}
-
-forall(otype K | Comparable(K), otype V)
-int empty(tree(K, V) * t){
-  return t == NULL;
-}
-
-// returns the root of the tree
-forall(otype K | Comparable(K), otype V)
-int insert(tree(K, V) ** t, K key, V value) {
-  // handles a non-empty tree
-  // problem if the following signature is used: tries to use an adapter to call helper, but shouldn't
-  // be necessary - seems to be a problem with helper's type variables not being renamed
-  // tree(K, V) * helper(tree(K, V) * t, K key, V value){
-  tree(K, V) * helper(tree(K, V) * t){
-    if (t->key == key){
-      // ran into the same key - uh-oh
-      return NULL;
-    } else if (t->key < key){
-      if (t->right == NULL){
-        t->right = create(key, value);
-        tree(K, V) * right = t->right; // FIX ME!
-        right->parent = t;             // !!!!!!!
-        return t->right;
-      } else {
-        return helper(t->right);
-      }
-    } else {
-      if (t->left == NULL){
-        t->left = create(key, value);
-        tree(K, V) * left = t->left;   // FIX ME!
-        left->parent = t;              // !!!!!!!
-        return t->left;
-      } else {
-        return helper(t->left);
-      }
-    }
-  }
-
-  if (empty(*t)){
-    // be nice and return a new tree
-    *t = create(key, value);
-    return 0;
-  }
-  tree(K, V) * newTree = helper(*t);
-  if (newTree == NULL){
-    // insert error handling code, only possibility
-    // currently is that the key already exists
-    return 99;
-  }
-  // move up the tree, updating balance factors
-  // if the balance factor is -1, 0, or 1 keep going
-  // if the balance factor is -2 or 2, call fix
-  while (newTree->parent != NULL){ // loop until newTree == NULL?
-    newTree = tryFix(newTree);
-    tree(K, V) * parent = newTree->parent;  // FIX ME!!
-    assert(parent->left == newTree ||
-         parent->right == newTree);
-    newTree = newTree->parent;
-  }
-  insert(t, key, value);
-
-  // do it one more time - this is the root
-  newTree = tryFix(newTree);
-  *t = newTree;
-  return 0;
-}
Index: tests/avltree/avl2.cfa
===================================================================
--- tests/avltree/avl2.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/avltree/avl2.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,84 @@
+#include "avl.h"
+#include "avl-private.h"
+
+forall(otype K | Comparable(K), otype V)
+V * find(tree(K, V) * t, K key){
+  if (empty(t)){
+    return NULL;
+  }
+
+  if (t->key == key){
+    return &t->value;
+  } else if (t->key < key){
+    return find(t->right, key);
+  } else {
+    // t->key > key
+    return find(t->left, key);
+  }
+}
+
+forall(otype K | Comparable(K), otype V)
+int empty(tree(K, V) * t){
+  return t == NULL;
+}
+
+// returns the root of the tree
+forall(otype K | Comparable(K), otype V)
+int insert(tree(K, V) ** t, K key, V value) {
+  // handles a non-empty tree
+  // problem if the following signature is used: tries to use an adapter to call helper, but shouldn't
+  // be necessary - seems to be a problem with helper's type variables not being renamed
+  // tree(K, V) * helper(tree(K, V) * t, K key, V value){
+  tree(K, V) * helper(tree(K, V) * t){
+    if (t->key == key){
+      // ran into the same key - uh-oh
+      return NULL;
+    } else if (t->key < key){
+      if (t->right == NULL){
+        t->right = create(key, value);
+        tree(K, V) * right = t->right; // FIX ME!
+        right->parent = t;             // !!!!!!!
+        return t->right;
+      } else {
+        return helper(t->right);
+      }
+    } else {
+      if (t->left == NULL){
+        t->left = create(key, value);
+        tree(K, V) * left = t->left;   // FIX ME!
+        left->parent = t;              // !!!!!!!
+        return t->left;
+      } else {
+        return helper(t->left);
+      }
+    }
+  }
+
+  if (empty(*t)){
+    // be nice and return a new tree
+    *t = create(key, value);
+    return 0;
+  }
+  tree(K, V) * newTree = helper(*t);
+  if (newTree == NULL){
+    // insert error handling code, only possibility
+    // currently is that the key already exists
+    return 99;
+  }
+  // move up the tree, updating balance factors
+  // if the balance factor is -1, 0, or 1 keep going
+  // if the balance factor is -2 or 2, call fix
+  while (newTree->parent != NULL){ // loop until newTree == NULL?
+    newTree = tryFix(newTree);
+    tree(K, V) * parent = newTree->parent;  // FIX ME!!
+    assert(parent->left == newTree ||
+         parent->right == newTree);
+    newTree = newTree->parent;
+  }
+  insert(t, key, value);
+
+  // do it one more time - this is the root
+  newTree = tryFix(newTree);
+  *t = newTree;
+  return 0;
+}
Index: sts/avltree/avl3.c
===================================================================
--- tests/avltree/avl3.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,118 +1,0 @@
-#include "avl.h"
-#include "avl-private.h"
-#include <stdlib.hfa>
-
-// swaps the data within two tree nodes
-forall(otype K | Comparable(K), otype V)
-void node_swap(tree(K, V) * t, tree(K, V) * t2){
-	swap( t->key,  t2->key);
-	swap( t->value, t2->value);
-}
-
-// go left as deep as possible from within the right subtree
-forall(otype K | Comparable(K), otype V)
-tree(K, V) * find_successor(tree(K, V) * t){
-	tree(K, V) * find_successor_helper(tree(K, V) * t){
-		// go left as deep as possible, return the last node
-		if (empty(t->left)){
-			return t;
-		} else {
-			return find_successor_helper(t->left);
-		}
-	}
-	return find_successor_helper(t->right);
-}
-
-// cleanup - don't want to deep delete, so set children to NULL first.
-forall(otype K | Comparable(K), otype V)
-void deleteSingleNode(tree(K, V) * t) {
-	t->left = NULL;
-	t->right = NULL;
-	delete(t);
-}
-
-// does the actual remove operation once we've found the node in question
-forall(otype K | Comparable(K), otype V)
-tree(K, V) * remove_node(tree(K, V) * t){
-	// is the node a leaf?
-	if (empty(t->left) && empty(t->right)){
-		// yes, just delete this node
-		delete(t);
-		return NULL;
-	} else if (empty(t->left)){
-		// if the left is empty, there is only one child -> move right up
-		node_swap(t, t->right);
-		tree(K, V) * tmp = t->right;
-
-		// relink tree
-		t->left = tmp->left;
-		t->right = tmp->right;
-
-		setParent(t->left, t);
-		setParent(t->right, t);
-		deleteSingleNode(tmp);
-		return t;
-	} else if (empty(t->right)){
-		// if the right is empty, there is only one child -> move left up
-		node_swap(t, t->left);
-		tree(K, V) * tmp = t->left;
-
-		// relink tree
-		t->left = tmp->left;
-		t->right = tmp->right;
-
-		setParent(t->left, t);
-		setParent(t->right, t);
-		deleteSingleNode(tmp);
-		return t;
-	} else {
-		// swap with the successor
-		tree(K, V) * s = find_successor(t);
-		tree(K, V) * parent = s->parent;
-
-		if (parent->left == s){
-			parent->left = s->right;
-		} else {
-			assert(parent->right == s);
-			parent->right = s->right;
-		}
-		setParent(s->right, parent);
-		node_swap(t, s);
-		deleteSingleNode(s);
-		return t;
-	}
-}
-
-// finds the node that needs to be removed
-forall(otype K | Comparable(K), otype V)
-tree(K, V) * remove_helper(tree(K, V) * t, K key, int * worked){
-	if (empty(t)){
-		// did not work because key was not found
-		// set the status variable and return
-		*worked = 1;
-	} else if (t->key == key) {
-		t = remove_node(t);
-	} else if (t->key < key){
-		t->right = remove_helper(t->right, key, worked);
-	} else {
-		// t->key > key
-		t->left = remove_helper(t->left, key, worked);
-	}
-	// try to fix after deleting
-	if (! empty(t)) {
-		t = tryFix(t);
-	}
-	return t;
-}
-
-forall(otype K | Comparable(K), otype V)
-int remove(tree(K, V) ** t, K key){
-	int worked = 0;
-	tree(K, V) * newTree = remove_helper(*t, key, &worked);
-	*t = newTree;
-	return worked;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: tests/avltree/avl3.cfa
===================================================================
--- tests/avltree/avl3.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/avltree/avl3.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,118 @@
+#include "avl.h"
+#include "avl-private.h"
+#include <stdlib.hfa>
+
+// swaps the data within two tree nodes
+forall(otype K | Comparable(K), otype V)
+void node_swap(tree(K, V) * t, tree(K, V) * t2){
+	swap( t->key,  t2->key);
+	swap( t->value, t2->value);
+}
+
+// go left as deep as possible from within the right subtree
+forall(otype K | Comparable(K), otype V)
+tree(K, V) * find_successor(tree(K, V) * t){
+	tree(K, V) * find_successor_helper(tree(K, V) * t){
+		// go left as deep as possible, return the last node
+		if (empty(t->left)){
+			return t;
+		} else {
+			return find_successor_helper(t->left);
+		}
+	}
+	return find_successor_helper(t->right);
+}
+
+// cleanup - don't want to deep delete, so set children to NULL first.
+forall(otype K | Comparable(K), otype V)
+void deleteSingleNode(tree(K, V) * t) {
+	t->left = NULL;
+	t->right = NULL;
+	delete(t);
+}
+
+// does the actual remove operation once we've found the node in question
+forall(otype K | Comparable(K), otype V)
+tree(K, V) * remove_node(tree(K, V) * t){
+	// is the node a leaf?
+	if (empty(t->left) && empty(t->right)){
+		// yes, just delete this node
+		delete(t);
+		return NULL;
+	} else if (empty(t->left)){
+		// if the left is empty, there is only one child -> move right up
+		node_swap(t, t->right);
+		tree(K, V) * tmp = t->right;
+
+		// relink tree
+		t->left = tmp->left;
+		t->right = tmp->right;
+
+		setParent(t->left, t);
+		setParent(t->right, t);
+		deleteSingleNode(tmp);
+		return t;
+	} else if (empty(t->right)){
+		// if the right is empty, there is only one child -> move left up
+		node_swap(t, t->left);
+		tree(K, V) * tmp = t->left;
+
+		// relink tree
+		t->left = tmp->left;
+		t->right = tmp->right;
+
+		setParent(t->left, t);
+		setParent(t->right, t);
+		deleteSingleNode(tmp);
+		return t;
+	} else {
+		// swap with the successor
+		tree(K, V) * s = find_successor(t);
+		tree(K, V) * parent = s->parent;
+
+		if (parent->left == s){
+			parent->left = s->right;
+		} else {
+			assert(parent->right == s);
+			parent->right = s->right;
+		}
+		setParent(s->right, parent);
+		node_swap(t, s);
+		deleteSingleNode(s);
+		return t;
+	}
+}
+
+// finds the node that needs to be removed
+forall(otype K | Comparable(K), otype V)
+tree(K, V) * remove_helper(tree(K, V) * t, K key, int * worked){
+	if (empty(t)){
+		// did not work because key was not found
+		// set the status variable and return
+		*worked = 1;
+	} else if (t->key == key) {
+		t = remove_node(t);
+	} else if (t->key < key){
+		t->right = remove_helper(t->right, key, worked);
+	} else {
+		// t->key > key
+		t->left = remove_helper(t->left, key, worked);
+	}
+	// try to fix after deleting
+	if (! empty(t)) {
+		t = tryFix(t);
+	}
+	return t;
+}
+
+forall(otype K | Comparable(K), otype V)
+int remove(tree(K, V) ** t, K key){
+	int worked = 0;
+	tree(K, V) * newTree = remove_helper(*t, key, &worked);
+	*t = newTree;
+	return worked;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: sts/avltree/avl4.c
===================================================================
--- tests/avltree/avl4.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,48 +1,0 @@
-#include "avl.h"
-#include "avl-private.h"
-
-// Perform a shallow copy of src, return the
-// new tree in ret
-forall(otype K | Comparable(K), otype V)
-int copy(tree(K, V) * src, tree(K, V) ** ret){
-  tree(K, V) * helper(tree(K, V) * t, int * worked){
-    if (empty(t)){
-      // given empty tree, return empty tree
-      return NULL;
-    }
-
-    // otherwise, this is not an empty node,
-    // create a new node
-    tree(K, V) * newTree = create(t->key, t->value);
-    if (empty(newTree)) {
-      *worked = 1;
-      return NULL;
-    }
-
-    // recursively copy the left and right branches
-    newTree->left = helper(t->left, worked);
-    newTree->right = helper(t->right, worked);
-
-    setParent(newTree->left, newTree);
-    setParent(newTree->right, newTree);
-    return newTree;
-  }
-
-  int worked = 0;
-  *ret = helper(src, &worked);
-  return worked;
-}
-
-// Apply func to every value element in t, using an in order traversal
-forall(otype K | Comparable(K), otype V)
-void for_each(tree(K, V) * t, int (*func)(V)) {
-  if (t == NULL) {
-    return;
-  }
-  // recursively apply the function to the left,
-  // apply the function to this node,
-  // recursively apply the function to the right
-  for_each(t->left, func);
-  func(t->value);
-  for_each(t->right, func);
-}
Index: tests/avltree/avl4.cfa
===================================================================
--- tests/avltree/avl4.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/avltree/avl4.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,48 @@
+#include "avl.h"
+#include "avl-private.h"
+
+// Perform a shallow copy of src, return the
+// new tree in ret
+forall(otype K | Comparable(K), otype V)
+int copy(tree(K, V) * src, tree(K, V) ** ret){
+  tree(K, V) * helper(tree(K, V) * t, int * worked){
+    if (empty(t)){
+      // given empty tree, return empty tree
+      return NULL;
+    }
+
+    // otherwise, this is not an empty node,
+    // create a new node
+    tree(K, V) * newTree = create(t->key, t->value);
+    if (empty(newTree)) {
+      *worked = 1;
+      return NULL;
+    }
+
+    // recursively copy the left and right branches
+    newTree->left = helper(t->left, worked);
+    newTree->right = helper(t->right, worked);
+
+    setParent(newTree->left, newTree);
+    setParent(newTree->right, newTree);
+    return newTree;
+  }
+
+  int worked = 0;
+  *ret = helper(src, &worked);
+  return worked;
+}
+
+// Apply func to every value element in t, using an in order traversal
+forall(otype K | Comparable(K), otype V)
+void for_each(tree(K, V) * t, int (*func)(V)) {
+  if (t == NULL) {
+    return;
+  }
+  // recursively apply the function to the left,
+  // apply the function to this node,
+  // recursively apply the function to the right
+  for_each(t->left, func);
+  func(t->value);
+  for_each(t->right, func);
+}
Index: sts/avltree/avl_test.c
===================================================================
--- tests/avltree/avl_test.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,52 +1,0 @@
-#include "avl.h"
-#include "avl-private.h"
-#include <stdlib.hfa>
-
-extern "C" {
-  int strcmp(const char *, const char *);
-}
-
-int main(){
-  // operations:
-  // find(tree(K, V) *, K)
-  // int empty(tree(K, V) *);
-  // tree(K, V) * insert(tree(K, V) *, K, V);
-  // int remove(tree(K, V) **, K);
-
-  // int -> int
-  tree(int, int) * imap = create(-1, (int)0);
-  insert(&imap, 12, 13);
-  insert(&imap, 2, 3);
-  assert( height(imap) == 2 );
-
-  printf("%d %d %d\n", *find(imap, 2), *find(imap, 12), *find(imap, -1));
-
-  remove(&imap, -1);
-  delete(imap);
-
-  // int -> char *
-  tree(int, const char *) * smap = create(-1, "baz");
-  insert(&smap, 12, "bar");
-  insert(&smap, 2, "foo");
-  assert( height(smap) == 2 );
-
-  printf("%s %s %s\n", *find(smap, 2), *find(smap, 12), *find(smap, -1));
-
-  remove(&smap, -2);
-  delete(smap);
-
-  // const char* -> const char*
-  int ?<?(const char * a, const char * b) {
-    return strcmp(a, b) < 0;
-  }
-
-  tree(const char *, const char *) * ssmap = create("queso", "cheese");
-  insert(&ssmap, "foo", "bar");
-  insert(&ssmap, "hello", "world");
-  assert( height(ssmap) == 2 );
-
-  printf("%s %s %s\n", *find(ssmap, "hello"), *find(ssmap, "foo"), *find(ssmap, "queso"));
-
-  remove(&ssmap, "foo");
-  delete(ssmap);
-}
Index: tests/avltree/avl_test.cfa
===================================================================
--- tests/avltree/avl_test.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/avltree/avl_test.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,52 @@
+#include "avl.h"
+#include "avl-private.h"
+#include <stdlib.hfa>
+
+extern "C" {
+  int strcmp(const char *, const char *);
+}
+
+int main(){
+  // operations:
+  // find(tree(K, V) *, K)
+  // int empty(tree(K, V) *);
+  // tree(K, V) * insert(tree(K, V) *, K, V);
+  // int remove(tree(K, V) **, K);
+
+  // int -> int
+  tree(int, int) * imap = create(-1, (int)0);
+  insert(&imap, 12, 13);
+  insert(&imap, 2, 3);
+  assert( height(imap) == 2 );
+
+  printf("%d %d %d\n", *find(imap, 2), *find(imap, 12), *find(imap, -1));
+
+  remove(&imap, -1);
+  delete(imap);
+
+  // int -> char *
+  tree(int, const char *) * smap = create(-1, "baz");
+  insert(&smap, 12, "bar");
+  insert(&smap, 2, "foo");
+  assert( height(smap) == 2 );
+
+  printf("%s %s %s\n", *find(smap, 2), *find(smap, 12), *find(smap, -1));
+
+  remove(&smap, -2);
+  delete(smap);
+
+  // const char* -> const char*
+  int ?<?(const char * a, const char * b) {
+    return strcmp(a, b) < 0;
+  }
+
+  tree(const char *, const char *) * ssmap = create("queso", "cheese");
+  insert(&ssmap, "foo", "bar");
+  insert(&ssmap, "hello", "world");
+  assert( height(ssmap) == 2 );
+
+  printf("%s %s %s\n", *find(ssmap, "hello"), *find(ssmap, "foo"), *find(ssmap, "queso"));
+
+  remove(&ssmap, "foo");
+  delete(ssmap);
+}
Index: sts/builtins/sync.c
===================================================================
--- tests/builtins/sync.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,468 +1,0 @@
-#include <stdbool.h>
-#include <stdint.h>
-
-void foo() {
-	volatile _Bool * vpB = 0; _Bool vB = 0;
-	volatile char * vp1 = 0; char * rp1 = 0; char v1 = 0;
-	volatile short * vp2 = 0; short * rp2 = 0; short v2 = 0;
-	volatile int * vp4 = 0; int * rp4 = 0; int v4 = 0;
-	volatile long long int * vp8 = 0; long long int * rp8 = 0; long long int v8 = 0;
-	#if defined(__SIZEOF_INT128__)
-	volatile __int128 * vp16 = 0; __int128 * rp16 = 0; __int128 v16 = 0;
-	#endif
-
-	{ char ret; ret = __sync_fetch_and_add(vp1, v1); }
-	{ char ret; ret = __sync_fetch_and_add_1(vp1, v1); }
-	{ short ret; ret = __sync_fetch_and_add(vp2, v2); }
-	{ short ret; ret = __sync_fetch_and_add_2(vp2, v2); }
-	{ int ret; ret = __sync_fetch_and_add(vp4, v4); }
-	{ int ret; ret = __sync_fetch_and_add_4(vp4, v4); }
-	{ long long int ret; ret = __sync_fetch_and_add(vp8, v8); }
-	{ long long int ret; ret = __sync_fetch_and_add_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_fetch_and_add(vp16, v16); }
-	{ __int128 ret; ret = __sync_fetch_and_add_16(vp16, v16); }
-	#endif
-
-	{ char ret; ret = __sync_fetch_and_sub(vp1, v1); }
-	{ char ret; ret = __sync_fetch_and_sub_1(vp1, v1); }
-	{ short ret; ret = __sync_fetch_and_sub(vp2, v2); }
-	{ short ret; ret = __sync_fetch_and_sub_2(vp2, v2); }
-	{ int ret; ret = __sync_fetch_and_sub(vp4, v4); }
-	{ int ret; ret = __sync_fetch_and_sub_4(vp4, v4); }
-	{ long long int ret; ret = __sync_fetch_and_sub(vp8, v8); }
-	{ long long int ret; ret = __sync_fetch_and_sub_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_fetch_and_sub(vp16, v16); }
-	{ __int128 ret; ret = __sync_fetch_and_sub_16(vp16, v16); }
-	#endif
-
-	{ char ret; ret = __sync_fetch_and_or(vp1, v1); }
-	{ char ret; ret = __sync_fetch_and_or_1(vp1, v1); }
-	{ short ret; ret = __sync_fetch_and_or(vp2, v2); }
-	{ short ret; ret = __sync_fetch_and_or_2(vp2, v2); }
-	{ int ret; ret = __sync_fetch_and_or(vp4, v4); }
-	{ int ret; ret = __sync_fetch_and_or_4(vp4, v4); }
-	{ long long int ret; ret = __sync_fetch_and_or(vp8, v8); }
-	{ long long int ret; ret = __sync_fetch_and_or_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_fetch_and_or(vp16, v16); }
-	{ __int128 ret; ret = __sync_fetch_and_or_16(vp16, v16); }
-	#endif
-
-	{ char ret; ret = __sync_fetch_and_and(vp1, v1); }
-	{ char ret; ret = __sync_fetch_and_and_1(vp1, v1); }
-	{ short ret; ret = __sync_fetch_and_and(vp2, v2); }
-	{ short ret; ret = __sync_fetch_and_and_2(vp2, v2); }
-	{ int ret; ret = __sync_fetch_and_and(vp4, v4); }
-	{ int ret; ret = __sync_fetch_and_and_4(vp4, v4); }
-	{ long long int ret; ret = __sync_fetch_and_and(vp8, v8); }
-	{ long long int ret; ret = __sync_fetch_and_and_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_fetch_and_and(vp16, v16); }
-	{ __int128 ret; ret = __sync_fetch_and_and_16(vp16, v16); }
-	#endif
-
-	{ char ret; ret = __sync_fetch_and_xor(vp1, v1); }
-	{ char ret; ret = __sync_fetch_and_xor_1(vp1, v1); }
-	{ short ret; ret = __sync_fetch_and_xor(vp2, v2); }
-	{ short ret; ret = __sync_fetch_and_xor_2(vp2, v2); }
-	{ int ret; ret = __sync_fetch_and_xor(vp4, v4); }
-	{ int ret; ret = __sync_fetch_and_xor_4(vp4, v4); }
-	{ long long int ret; ret = __sync_fetch_and_xor(vp8, v8); }
-	{ long long int ret; ret = __sync_fetch_and_xor_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_fetch_and_xor(vp16, v16); }
-	{ __int128 ret; ret = __sync_fetch_and_xor_16(vp16, v16); }
-	#endif
-
-	{ char ret; ret = __sync_fetch_and_nand(vp1, v1); }
-	{ char ret; ret = __sync_fetch_and_nand_1(vp1, v1); }
-	{ short ret; ret = __sync_fetch_and_nand(vp2, v2); }
-	{ short ret; ret = __sync_fetch_and_nand_2(vp2, v2); }
-	{ int ret; ret = __sync_fetch_and_nand(vp4, v4); }
-	{ int ret; ret = __sync_fetch_and_nand_4(vp4, v4); }
-	{ long long int ret; ret = __sync_fetch_and_nand(vp8, v8); }
-	{ long long int ret; ret = __sync_fetch_and_nand_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_fetch_and_nand(vp16, v16); }
-	{ __int128 ret; ret = __sync_fetch_and_nand_16(vp16, v16); }
-	#endif
-
-	{ char ret; ret = __sync_add_and_fetch(vp1, v1); }
-	{ char ret; ret = __sync_add_and_fetch_1(vp1, v1); }
-	{ short ret; ret = __sync_add_and_fetch(vp2, v2); }
-	{ short ret; ret = __sync_add_and_fetch_2(vp2, v2); }
-	{ int ret; ret = __sync_add_and_fetch(vp4, v4); }
-	{ int ret; ret = __sync_add_and_fetch_4(vp4, v4); }
-	{ long long int ret; ret = __sync_add_and_fetch(vp8, v8); }
-	{ long long int ret; ret = __sync_add_and_fetch_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_add_and_fetch(vp16, v16); }
-	{ __int128 ret; ret = __sync_add_and_fetch_16(vp16, v16); }
-	#endif
-
-	{ char ret; ret = __sync_sub_and_fetch(vp1, v1); }
-	{ char ret; ret = __sync_sub_and_fetch_1(vp1, v1); }
-	{ short ret; ret = __sync_sub_and_fetch(vp2, v2); }
-	{ short ret; ret = __sync_sub_and_fetch_2(vp2, v2); }
-	{ int ret; ret = __sync_sub_and_fetch(vp4, v4); }
-	{ int ret; ret = __sync_sub_and_fetch_4(vp4, v4); }
-	{ long long int ret; ret = __sync_sub_and_fetch(vp8, v8); }
-	{ long long int ret; ret = __sync_sub_and_fetch_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_sub_and_fetch(vp16, v16); }
-	{ __int128 ret; ret = __sync_sub_and_fetch_16(vp16, v16); }
-	#endif
-
-	{ char ret; ret = __sync_or_and_fetch(vp1, v1); }
-	{ char ret; ret = __sync_or_and_fetch_1(vp1, v1); }
-	{ short ret; ret = __sync_or_and_fetch(vp2, v2); }
-	{ short ret; ret = __sync_or_and_fetch_2(vp2, v2); }
-	{ int ret; ret = __sync_or_and_fetch(vp4, v4); }
-	{ int ret; ret = __sync_or_and_fetch_4(vp4, v4); }
-	{ long long int ret; ret = __sync_or_and_fetch(vp8, v8); }
-	{ long long int ret; ret = __sync_or_and_fetch_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_or_and_fetch(vp16, v16); }
-	{ __int128 ret; ret = __sync_or_and_fetch_16(vp16, v16); }
-	#endif
-
-	{ char ret; ret = __sync_and_and_fetch(vp1, v1); }
-	{ char ret; ret = __sync_and_and_fetch_1(vp1, v1); }
-	{ short ret; ret = __sync_and_and_fetch(vp2, v2); }
-	{ short ret; ret = __sync_and_and_fetch_2(vp2, v2); }
-	{ int ret; ret = __sync_and_and_fetch(vp4, v4); }
-	{ int ret; ret = __sync_and_and_fetch_4(vp4, v4); }
-	{ long long int ret; ret = __sync_and_and_fetch(vp8, v8); }
-	{ long long int ret; ret = __sync_and_and_fetch_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_and_and_fetch(vp16, v16); }
-	{ __int128 ret; ret = __sync_and_and_fetch_16(vp16, v16); }
-	#endif
-
-	{ char ret; ret = __sync_xor_and_fetch(vp1, v1); }
-	{ char ret; ret = __sync_xor_and_fetch_1(vp1, v1); }
-	{ short ret; ret = __sync_xor_and_fetch(vp2, v2); }
-	{ short ret; ret = __sync_xor_and_fetch_2(vp2, v2); }
-	{ int ret; ret = __sync_xor_and_fetch(vp4, v4); }
-	{ int ret; ret = __sync_xor_and_fetch_4(vp4, v4); }
-	{ long long int ret; ret = __sync_xor_and_fetch(vp8, v8); }
-	{ long long int ret; ret = __sync_xor_and_fetch_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_xor_and_fetch(vp16, v16); }
-	{ __int128 ret; ret = __sync_xor_and_fetch_16(vp16, v16); }
-	#endif
-
-	{ char ret; ret = __sync_nand_and_fetch(vp1, v1); }
-	{ char ret; ret = __sync_nand_and_fetch_1(vp1, v1); }
-	{ short ret; ret = __sync_nand_and_fetch(vp2, v2); }
-	{ short ret; ret = __sync_nand_and_fetch_2(vp2, v2); }
-	{ int ret; ret = __sync_nand_and_fetch(vp4, v4); }
-	{ int ret; ret = __sync_nand_and_fetch_4(vp4, v4); }
-	{ long long int ret; ret = __sync_nand_and_fetch(vp8, v8); }
-	{ long long int ret; ret = __sync_nand_and_fetch_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_nand_and_fetch(vp16, v16); }
-	{ __int128 ret; ret = __sync_nand_and_fetch_16(vp16, v16); }
-	#endif
-
-	{ _Bool ret; ret = __sync_bool_compare_and_swap(vp1, v1, v1); }
-	{ _Bool ret; ret = __sync_bool_compare_and_swap_1(vp1, v1, v1); }
-	{ _Bool ret; ret = __sync_bool_compare_and_swap(vp2, v2, v2); }
-	{ _Bool ret; ret = __sync_bool_compare_and_swap_2(vp2, v2, v2); }
-	{ _Bool ret; ret = __sync_bool_compare_and_swap(vp4, v4, v4); }
-	{ _Bool ret; ret = __sync_bool_compare_and_swap_4(vp4, v4, v4); }
-	{ _Bool ret; ret = __sync_bool_compare_and_swap(vp8, v8, v8); }
-	{ _Bool ret; ret = __sync_bool_compare_and_swap_8(vp8, v8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ _Bool ret; ret = __sync_bool_compare_and_swap(vp16, v16, v16); }
-	{ _Bool ret; ret = __sync_bool_compare_and_swap_16(vp16, v16,v16); }
-	#endif
-
-	{ char ret; ret = __sync_val_compare_and_swap(vp1, v1, v1); }
-	{ char ret; ret = __sync_val_compare_and_swap_1(vp1, v1, v1); }
-	{ short ret; ret = __sync_val_compare_and_swap(vp2, v2, v2); }
-	{ short ret; ret = __sync_val_compare_and_swap_2(vp2, v2, v2); }
-	{ int ret; ret = __sync_val_compare_and_swap(vp4, v4, v4); }
-	{ int ret; ret = __sync_val_compare_and_swap_4(vp4, v4, v4); }
-	{ long long int ret; ret = __sync_val_compare_and_swap(vp8, v8, v8); }
-	{ long long int ret; ret = __sync_val_compare_and_swap_8(vp8, v8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_val_compare_and_swap(vp16, v16, v16); }
-	{ __int128 ret; ret = __sync_val_compare_and_swap_16(vp16, v16,v16); }
-	#endif
-
-	{ char ret; ret = __sync_lock_test_and_set(vp1, v1); }
-	{ char ret; ret = __sync_lock_test_and_set_1(vp1, v1); }
-	{ short ret; ret = __sync_lock_test_and_set(vp2, v2); }
-	{ short ret; ret = __sync_lock_test_and_set_2(vp2, v2); }
-	{ int ret; ret = __sync_lock_test_and_set(vp4, v4); }
-	{ int ret; ret = __sync_lock_test_and_set_4(vp4, v4); }
-	{ long long int ret; ret = __sync_lock_test_and_set(vp8, v8); }
-	{ long long int ret; ret = __sync_lock_test_and_set_8(vp8, v8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __sync_lock_test_and_set(vp16, v16); }
-	{ __int128 ret; ret = __sync_lock_test_and_set_16(vp16, v16); }
-	#endif
-
-	{ __sync_lock_release(vp1); }
-	{ __sync_lock_release_1(vp1); }
-	{ __sync_lock_release(vp2); }
-	{ __sync_lock_release_2(vp2); }
-	{ __sync_lock_release(vp4); }
-	{ __sync_lock_release_4(vp4); }
-	{ __sync_lock_release(vp8); }
-	{ __sync_lock_release_8(vp8); }
-	#if defined(__SIZEOF_INT128__)
-	{ __sync_lock_release(vp16); }
-	{ __sync_lock_release_16(vp16); }
-	#endif
-
-	{ __sync_synchronize(); }
-
-
-
-
-	{ _Bool ret; ret = __atomic_test_and_set(vpB, vB); }
-	{ _Bool ret; ret = __atomic_test_and_set(vp1, v1); }
-	{ __atomic_clear(vpB, vB); }
-	{ __atomic_clear(vp1, v1); }
-
-	{ char ret; ret = __atomic_exchange_n(vp1, &v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_exchange_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; __atomic_exchange(vp1, &v1, &ret, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_exchange_n(vp2, &v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_exchange_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; __atomic_exchange(vp2, &v2, &ret, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_exchange_n(vp4, &v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_exchange_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; __atomic_exchange(vp4, &v4, &ret, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_exchange_n(vp8, &v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_exchange_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; __atomic_exchange(vp8, &v8, &ret, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_exchange_n(vp16, &v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_exchange_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; __atomic_exchange(vp16, &v16, &ret, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_load_n(vp1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_load_1(vp1, __ATOMIC_SEQ_CST); }
-	{ char ret; __atomic_load(vp1, &ret, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_load_n(vp2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_load_2(vp2, __ATOMIC_SEQ_CST); }
-	{ short ret; __atomic_load(vp2, &ret, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_load_n(vp4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_load_4(vp4, __ATOMIC_SEQ_CST); }
-	{ int ret; __atomic_load(vp4, &ret, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_load_n(vp8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_load_8(vp8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; __atomic_load(vp8, &ret, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_load_n(vp16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_load_16(vp16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; __atomic_load(vp16, &ret, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ _Bool ret; ret = __atomic_compare_exchange_n(vp1, rp1, v1, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange_1(vp1, rp1, v1, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange(vp1, rp1, &v1, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange_n(vp2, rp2, v2, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange_2(vp2, rp2, v2, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange(vp2, rp2, &v2, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange_n(vp4, rp4, v4, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange_4(vp4, rp4, v4, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange(vp4, rp4, &v4, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange_n(vp8, rp8, v8, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange_8(vp8, rp8, v8, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange(vp8, rp8, &v8, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ _Bool ret; ret = __atomic_compare_exchange_n(vp16, rp16, v16, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange_16(vp16, rp16, v16, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	{ _Bool ret; ret = __atomic_compare_exchange(vp16, rp16, &v16, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ __atomic_store_n(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ __atomic_store_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ __atomic_store(vp1, &v1, __ATOMIC_SEQ_CST); }
-	{ __atomic_store_n(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ __atomic_store_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ __atomic_store(vp2, &v2, __ATOMIC_SEQ_CST); }
-	{ __atomic_store_n(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ __atomic_store_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ __atomic_store(vp4, &v4, __ATOMIC_SEQ_CST); }
-	{ __atomic_store_n(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ __atomic_store_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ __atomic_store(vp8, &v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __atomic_store_n(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __atomic_store_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __atomic_store(vp16, &v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_add_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_add_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_add_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_add_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_add_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_add_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_add_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_add_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_add_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_add_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_sub_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_sub_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_sub_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_sub_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_sub_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_sub_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_sub_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_sub_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_sub_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_sub_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_and_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_and_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_and_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_and_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_and_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_and_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_and_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_and_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_and_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_and_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_nand_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_nand_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_nand_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_nand_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_nand_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_nand_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_nand_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_nand_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_nand_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_nand_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_xor_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_xor_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_xor_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_xor_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_xor_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_xor_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_xor_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_xor_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_xor_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_xor_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_or_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_or_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_or_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_or_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_or_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_or_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_or_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_or_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_or_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_or_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_fetch_add(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_fetch_add_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_add(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_add_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_add(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_add_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_add(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_add_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_fetch_add(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_fetch_add_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_fetch_sub(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_fetch_sub_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_sub(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_sub_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_sub(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_sub_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_sub(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_sub_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_fetch_sub(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_fetch_sub_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_fetch_and(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_fetch_and_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_and(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_and_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_and(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_and_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_and(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_and_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_fetch_and(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_fetch_and_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_fetch_nand(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_fetch_nand_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_nand(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_nand_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_nand(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_nand_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_nand(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_nand_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_fetch_nand(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_fetch_nand_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_fetch_xor(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_fetch_xor_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_xor(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_xor_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_xor(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_xor_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_xor(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_xor_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_fetch_xor(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_fetch_xor_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ char ret; ret = __atomic_fetch_or(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ char ret; ret = __atomic_fetch_or_1(vp1, v1, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_or(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ short ret; ret = __atomic_fetch_or_2(vp2, v2, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_or(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ int ret; ret = __atomic_fetch_or_4(vp4, v4, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_or(vp8, v8, __ATOMIC_SEQ_CST); }
-	{ long long int ret; ret = __atomic_fetch_or_8(vp8, v8, __ATOMIC_SEQ_CST); }
-	#if defined(__SIZEOF_INT128__)
-	{ __int128 ret; ret = __atomic_fetch_or(vp16, v16, __ATOMIC_SEQ_CST); }
-	{ __int128 ret; ret = __atomic_fetch_or_16(vp16, v16, __ATOMIC_SEQ_CST); }
-	#endif
-
-	{ _Bool ret; ret = __atomic_always_lock_free(sizeof(int), vp4); }
-	{ _Bool ret; ret = __atomic_is_lock_free(sizeof(int), vp4); }
-	{ __atomic_thread_fence(__ATOMIC_SEQ_CST); }
-	{ __atomic_signal_fence(__ATOMIC_SEQ_CST); }
-}
-
-int main() {
-	return 0;
-}
Index: tests/builtins/sync.cfa
===================================================================
--- tests/builtins/sync.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/builtins/sync.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,468 @@
+#include <stdbool.h>
+#include <stdint.h>
+
+void foo() {
+	volatile _Bool * vpB = 0; _Bool vB = 0;
+	volatile char * vp1 = 0; char * rp1 = 0; char v1 = 0;
+	volatile short * vp2 = 0; short * rp2 = 0; short v2 = 0;
+	volatile int * vp4 = 0; int * rp4 = 0; int v4 = 0;
+	volatile long long int * vp8 = 0; long long int * rp8 = 0; long long int v8 = 0;
+	#if defined(__SIZEOF_INT128__)
+	volatile __int128 * vp16 = 0; __int128 * rp16 = 0; __int128 v16 = 0;
+	#endif
+
+	{ char ret; ret = __sync_fetch_and_add(vp1, v1); }
+	{ char ret; ret = __sync_fetch_and_add_1(vp1, v1); }
+	{ short ret; ret = __sync_fetch_and_add(vp2, v2); }
+	{ short ret; ret = __sync_fetch_and_add_2(vp2, v2); }
+	{ int ret; ret = __sync_fetch_and_add(vp4, v4); }
+	{ int ret; ret = __sync_fetch_and_add_4(vp4, v4); }
+	{ long long int ret; ret = __sync_fetch_and_add(vp8, v8); }
+	{ long long int ret; ret = __sync_fetch_and_add_8(vp8, v8); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_fetch_and_add(vp16, v16); }
+	{ __int128 ret; ret = __sync_fetch_and_add_16(vp16, v16); }
+	#endif
+
+	{ char ret; ret = __sync_fetch_and_sub(vp1, v1); }
+	{ char ret; ret = __sync_fetch_and_sub_1(vp1, v1); }
+	{ short ret; ret = __sync_fetch_and_sub(vp2, v2); }
+	{ short ret; ret = __sync_fetch_and_sub_2(vp2, v2); }
+	{ int ret; ret = __sync_fetch_and_sub(vp4, v4); }
+	{ int ret; ret = __sync_fetch_and_sub_4(vp4, v4); }
+	{ long long int ret; ret = __sync_fetch_and_sub(vp8, v8); }
+	{ long long int ret; ret = __sync_fetch_and_sub_8(vp8, v8); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_fetch_and_sub(vp16, v16); }
+	{ __int128 ret; ret = __sync_fetch_and_sub_16(vp16, v16); }
+	#endif
+
+	{ char ret; ret = __sync_fetch_and_or(vp1, v1); }
+	{ char ret; ret = __sync_fetch_and_or_1(vp1, v1); }
+	{ short ret; ret = __sync_fetch_and_or(vp2, v2); }
+	{ short ret; ret = __sync_fetch_and_or_2(vp2, v2); }
+	{ int ret; ret = __sync_fetch_and_or(vp4, v4); }
+	{ int ret; ret = __sync_fetch_and_or_4(vp4, v4); }
+	{ long long int ret; ret = __sync_fetch_and_or(vp8, v8); }
+	{ long long int ret; ret = __sync_fetch_and_or_8(vp8, v8); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_fetch_and_or(vp16, v16); }
+	{ __int128 ret; ret = __sync_fetch_and_or_16(vp16, v16); }
+	#endif
+
+	{ char ret; ret = __sync_fetch_and_and(vp1, v1); }
+	{ char ret; ret = __sync_fetch_and_and_1(vp1, v1); }
+	{ short ret; ret = __sync_fetch_and_and(vp2, v2); }
+	{ short ret; ret = __sync_fetch_and_and_2(vp2, v2); }
+	{ int ret; ret = __sync_fetch_and_and(vp4, v4); }
+	{ int ret; ret = __sync_fetch_and_and_4(vp4, v4); }
+	{ long long int ret; ret = __sync_fetch_and_and(vp8, v8); }
+	{ long long int ret; ret = __sync_fetch_and_and_8(vp8, v8); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_fetch_and_and(vp16, v16); }
+	{ __int128 ret; ret = __sync_fetch_and_and_16(vp16, v16); }
+	#endif
+
+	{ char ret; ret = __sync_fetch_and_xor(vp1, v1); }
+	{ char ret; ret = __sync_fetch_and_xor_1(vp1, v1); }
+	{ short ret; ret = __sync_fetch_and_xor(vp2, v2); }
+	{ short ret; ret = __sync_fetch_and_xor_2(vp2, v2); }
+	{ int ret; ret = __sync_fetch_and_xor(vp4, v4); }
+	{ int ret; ret = __sync_fetch_and_xor_4(vp4, v4); }
+	{ long long int ret; ret = __sync_fetch_and_xor(vp8, v8); }
+	{ long long int ret; ret = __sync_fetch_and_xor_8(vp8, v8); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_fetch_and_xor(vp16, v16); }
+	{ __int128 ret; ret = __sync_fetch_and_xor_16(vp16, v16); }
+	#endif
+
+	{ char ret; ret = __sync_fetch_and_nand(vp1, v1); }
+	{ char ret; ret = __sync_fetch_and_nand_1(vp1, v1); }
+	{ short ret; ret = __sync_fetch_and_nand(vp2, v2); }
+	{ short ret; ret = __sync_fetch_and_nand_2(vp2, v2); }
+	{ int ret; ret = __sync_fetch_and_nand(vp4, v4); }
+	{ int ret; ret = __sync_fetch_and_nand_4(vp4, v4); }
+	{ long long int ret; ret = __sync_fetch_and_nand(vp8, v8); }
+	{ long long int ret; ret = __sync_fetch_and_nand_8(vp8, v8); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_fetch_and_nand(vp16, v16); }
+	{ __int128 ret; ret = __sync_fetch_and_nand_16(vp16, v16); }
+	#endif
+
+	{ char ret; ret = __sync_add_and_fetch(vp1, v1); }
+	{ char ret; ret = __sync_add_and_fetch_1(vp1, v1); }
+	{ short ret; ret = __sync_add_and_fetch(vp2, v2); }
+	{ short ret; ret = __sync_add_and_fetch_2(vp2, v2); }
+	{ int ret; ret = __sync_add_and_fetch(vp4, v4); }
+	{ int ret; ret = __sync_add_and_fetch_4(vp4, v4); }
+	{ long long int ret; ret = __sync_add_and_fetch(vp8, v8); }
+	{ long long int ret; ret = __sync_add_and_fetch_8(vp8, v8); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_add_and_fetch(vp16, v16); }
+	{ __int128 ret; ret = __sync_add_and_fetch_16(vp16, v16); }
+	#endif
+
+	{ char ret; ret = __sync_sub_and_fetch(vp1, v1); }
+	{ char ret; ret = __sync_sub_and_fetch_1(vp1, v1); }
+	{ short ret; ret = __sync_sub_and_fetch(vp2, v2); }
+	{ short ret; ret = __sync_sub_and_fetch_2(vp2, v2); }
+	{ int ret; ret = __sync_sub_and_fetch(vp4, v4); }
+	{ int ret; ret = __sync_sub_and_fetch_4(vp4, v4); }
+	{ long long int ret; ret = __sync_sub_and_fetch(vp8, v8); }
+	{ long long int ret; ret = __sync_sub_and_fetch_8(vp8, v8); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_sub_and_fetch(vp16, v16); }
+	{ __int128 ret; ret = __sync_sub_and_fetch_16(vp16, v16); }
+	#endif
+
+	{ char ret; ret = __sync_or_and_fetch(vp1, v1); }
+	{ char ret; ret = __sync_or_and_fetch_1(vp1, v1); }
+	{ short ret; ret = __sync_or_and_fetch(vp2, v2); }
+	{ short ret; ret = __sync_or_and_fetch_2(vp2, v2); }
+	{ int ret; ret = __sync_or_and_fetch(vp4, v4); }
+	{ int ret; ret = __sync_or_and_fetch_4(vp4, v4); }
+	{ long long int ret; ret = __sync_or_and_fetch(vp8, v8); }
+	{ long long int ret; ret = __sync_or_and_fetch_8(vp8, v8); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_or_and_fetch(vp16, v16); }
+	{ __int128 ret; ret = __sync_or_and_fetch_16(vp16, v16); }
+	#endif
+
+	{ char ret; ret = __sync_and_and_fetch(vp1, v1); }
+	{ char ret; ret = __sync_and_and_fetch_1(vp1, v1); }
+	{ short ret; ret = __sync_and_and_fetch(vp2, v2); }
+	{ short ret; ret = __sync_and_and_fetch_2(vp2, v2); }
+	{ int ret; ret = __sync_and_and_fetch(vp4, v4); }
+	{ int ret; ret = __sync_and_and_fetch_4(vp4, v4); }
+	{ long long int ret; ret = __sync_and_and_fetch(vp8, v8); }
+	{ long long int ret; ret = __sync_and_and_fetch_8(vp8, v8); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_and_and_fetch(vp16, v16); }
+	{ __int128 ret; ret = __sync_and_and_fetch_16(vp16, v16); }
+	#endif
+
+	{ char ret; ret = __sync_xor_and_fetch(vp1, v1); }
+	{ char ret; ret = __sync_xor_and_fetch_1(vp1, v1); }
+	{ short ret; ret = __sync_xor_and_fetch(vp2, v2); }
+	{ short ret; ret = __sync_xor_and_fetch_2(vp2, v2); }
+	{ int ret; ret = __sync_xor_and_fetch(vp4, v4); }
+	{ int ret; ret = __sync_xor_and_fetch_4(vp4, v4); }
+	{ long long int ret; ret = __sync_xor_and_fetch(vp8, v8); }
+	{ long long int ret; ret = __sync_xor_and_fetch_8(vp8, v8); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_xor_and_fetch(vp16, v16); }
+	{ __int128 ret; ret = __sync_xor_and_fetch_16(vp16, v16); }
+	#endif
+
+	{ char ret; ret = __sync_nand_and_fetch(vp1, v1); }
+	{ char ret; ret = __sync_nand_and_fetch_1(vp1, v1); }
+	{ short ret; ret = __sync_nand_and_fetch(vp2, v2); }
+	{ short ret; ret = __sync_nand_and_fetch_2(vp2, v2); }
+	{ int ret; ret = __sync_nand_and_fetch(vp4, v4); }
+	{ int ret; ret = __sync_nand_and_fetch_4(vp4, v4); }
+	{ long long int ret; ret = __sync_nand_and_fetch(vp8, v8); }
+	{ long long int ret; ret = __sync_nand_and_fetch_8(vp8, v8); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_nand_and_fetch(vp16, v16); }
+	{ __int128 ret; ret = __sync_nand_and_fetch_16(vp16, v16); }
+	#endif
+
+	{ _Bool ret; ret = __sync_bool_compare_and_swap(vp1, v1, v1); }
+	{ _Bool ret; ret = __sync_bool_compare_and_swap_1(vp1, v1, v1); }
+	{ _Bool ret; ret = __sync_bool_compare_and_swap(vp2, v2, v2); }
+	{ _Bool ret; ret = __sync_bool_compare_and_swap_2(vp2, v2, v2); }
+	{ _Bool ret; ret = __sync_bool_compare_and_swap(vp4, v4, v4); }
+	{ _Bool ret; ret = __sync_bool_compare_and_swap_4(vp4, v4, v4); }
+	{ _Bool ret; ret = __sync_bool_compare_and_swap(vp8, v8, v8); }
+	{ _Bool ret; ret = __sync_bool_compare_and_swap_8(vp8, v8, v8); }
+	#if defined(__SIZEOF_INT128__)
+	{ _Bool ret; ret = __sync_bool_compare_and_swap(vp16, v16, v16); }
+	{ _Bool ret; ret = __sync_bool_compare_and_swap_16(vp16, v16,v16); }
+	#endif
+
+	{ char ret; ret = __sync_val_compare_and_swap(vp1, v1, v1); }
+	{ char ret; ret = __sync_val_compare_and_swap_1(vp1, v1, v1); }
+	{ short ret; ret = __sync_val_compare_and_swap(vp2, v2, v2); }
+	{ short ret; ret = __sync_val_compare_and_swap_2(vp2, v2, v2); }
+	{ int ret; ret = __sync_val_compare_and_swap(vp4, v4, v4); }
+	{ int ret; ret = __sync_val_compare_and_swap_4(vp4, v4, v4); }
+	{ long long int ret; ret = __sync_val_compare_and_swap(vp8, v8, v8); }
+	{ long long int ret; ret = __sync_val_compare_and_swap_8(vp8, v8, v8); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_val_compare_and_swap(vp16, v16, v16); }
+	{ __int128 ret; ret = __sync_val_compare_and_swap_16(vp16, v16,v16); }
+	#endif
+
+	{ char ret; ret = __sync_lock_test_and_set(vp1, v1); }
+	{ char ret; ret = __sync_lock_test_and_set_1(vp1, v1); }
+	{ short ret; ret = __sync_lock_test_and_set(vp2, v2); }
+	{ short ret; ret = __sync_lock_test_and_set_2(vp2, v2); }
+	{ int ret; ret = __sync_lock_test_and_set(vp4, v4); }
+	{ int ret; ret = __sync_lock_test_and_set_4(vp4, v4); }
+	{ long long int ret; ret = __sync_lock_test_and_set(vp8, v8); }
+	{ long long int ret; ret = __sync_lock_test_and_set_8(vp8, v8); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __sync_lock_test_and_set(vp16, v16); }
+	{ __int128 ret; ret = __sync_lock_test_and_set_16(vp16, v16); }
+	#endif
+
+	{ __sync_lock_release(vp1); }
+	{ __sync_lock_release_1(vp1); }
+	{ __sync_lock_release(vp2); }
+	{ __sync_lock_release_2(vp2); }
+	{ __sync_lock_release(vp4); }
+	{ __sync_lock_release_4(vp4); }
+	{ __sync_lock_release(vp8); }
+	{ __sync_lock_release_8(vp8); }
+	#if defined(__SIZEOF_INT128__)
+	{ __sync_lock_release(vp16); }
+	{ __sync_lock_release_16(vp16); }
+	#endif
+
+	{ __sync_synchronize(); }
+
+
+
+
+	{ _Bool ret; ret = __atomic_test_and_set(vpB, vB); }
+	{ _Bool ret; ret = __atomic_test_and_set(vp1, v1); }
+	{ __atomic_clear(vpB, vB); }
+	{ __atomic_clear(vp1, v1); }
+
+	{ char ret; ret = __atomic_exchange_n(vp1, &v1, __ATOMIC_SEQ_CST); }
+	{ char ret; ret = __atomic_exchange_1(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ char ret; __atomic_exchange(vp1, &v1, &ret, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_exchange_n(vp2, &v2, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_exchange_2(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ short ret; __atomic_exchange(vp2, &v2, &ret, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_exchange_n(vp4, &v4, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_exchange_4(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ int ret; __atomic_exchange(vp4, &v4, &ret, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_exchange_n(vp8, &v8, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_exchange_8(vp8, v8, __ATOMIC_SEQ_CST); }
+	{ long long int ret; __atomic_exchange(vp8, &v8, &ret, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_exchange_n(vp16, &v16, __ATOMIC_SEQ_CST); }
+	{ __int128 ret; ret = __atomic_exchange_16(vp16, v16, __ATOMIC_SEQ_CST); }
+	{ __int128 ret; __atomic_exchange(vp16, &v16, &ret, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_load_n(vp1, __ATOMIC_SEQ_CST); }
+	{ char ret; ret = __atomic_load_1(vp1, __ATOMIC_SEQ_CST); }
+	{ char ret; __atomic_load(vp1, &ret, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_load_n(vp2, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_load_2(vp2, __ATOMIC_SEQ_CST); }
+	{ short ret; __atomic_load(vp2, &ret, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_load_n(vp4, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_load_4(vp4, __ATOMIC_SEQ_CST); }
+	{ int ret; __atomic_load(vp4, &ret, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_load_n(vp8, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_load_8(vp8, __ATOMIC_SEQ_CST); }
+	{ long long int ret; __atomic_load(vp8, &ret, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_load_n(vp16, __ATOMIC_SEQ_CST); }
+	{ __int128 ret; ret = __atomic_load_16(vp16, __ATOMIC_SEQ_CST); }
+	{ __int128 ret; __atomic_load(vp16, &ret, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ _Bool ret; ret = __atomic_compare_exchange_n(vp1, rp1, v1, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange_1(vp1, rp1, v1, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange(vp1, rp1, &v1, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange_n(vp2, rp2, v2, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange_2(vp2, rp2, v2, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange(vp2, rp2, &v2, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange_n(vp4, rp4, v4, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange_4(vp4, rp4, v4, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange(vp4, rp4, &v4, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange_n(vp8, rp8, v8, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange_8(vp8, rp8, v8, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange(vp8, rp8, &v8, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ _Bool ret; ret = __atomic_compare_exchange_n(vp16, rp16, v16, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange_16(vp16, rp16, v16, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	{ _Bool ret; ret = __atomic_compare_exchange(vp16, rp16, &v16, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ __atomic_store_n(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ __atomic_store_1(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ __atomic_store(vp1, &v1, __ATOMIC_SEQ_CST); }
+	{ __atomic_store_n(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ __atomic_store_2(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ __atomic_store(vp2, &v2, __ATOMIC_SEQ_CST); }
+	{ __atomic_store_n(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ __atomic_store_4(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ __atomic_store(vp4, &v4, __ATOMIC_SEQ_CST); }
+	{ __atomic_store_n(vp8, v8, __ATOMIC_SEQ_CST); }
+	{ __atomic_store_8(vp8, v8, __ATOMIC_SEQ_CST); }
+	{ __atomic_store(vp8, &v8, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __atomic_store_n(vp16, v16, __ATOMIC_SEQ_CST); }
+	{ __atomic_store_16(vp16, v16, __ATOMIC_SEQ_CST); }
+	{ __atomic_store(vp16, &v16, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_add_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ char ret; ret = __atomic_add_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_add_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_add_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_add_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_add_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_add_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_add_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_add_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
+	{ __int128 ret; ret = __atomic_add_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_sub_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ char ret; ret = __atomic_sub_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_sub_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_sub_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_sub_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_sub_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_sub_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_sub_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_sub_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
+	{ __int128 ret; ret = __atomic_sub_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_and_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ char ret; ret = __atomic_and_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_and_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_and_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_and_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_and_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_and_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_and_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_and_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
+	{ __int128 ret; ret = __atomic_and_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_nand_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ char ret; ret = __atomic_nand_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_nand_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_nand_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_nand_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_nand_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_nand_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_nand_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_nand_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
+	{ __int128 ret; ret = __atomic_nand_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_xor_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ char ret; ret = __atomic_xor_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_xor_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_xor_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_xor_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_xor_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_xor_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_xor_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_xor_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
+	{ __int128 ret; ret = __atomic_xor_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_or_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ char ret; ret = __atomic_or_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_or_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_or_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_or_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_or_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_or_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_or_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_or_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
+	{ __int128 ret; ret = __atomic_or_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_fetch_add(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ char ret; ret = __atomic_fetch_add_1(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_fetch_add(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_fetch_add_2(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_fetch_add(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_fetch_add_4(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_fetch_add(vp8, v8, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_fetch_add_8(vp8, v8, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_fetch_add(vp16, v16, __ATOMIC_SEQ_CST); }
+	{ __int128 ret; ret = __atomic_fetch_add_16(vp16, v16, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_fetch_sub(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ char ret; ret = __atomic_fetch_sub_1(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_fetch_sub(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_fetch_sub_2(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_fetch_sub(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_fetch_sub_4(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_fetch_sub(vp8, v8, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_fetch_sub_8(vp8, v8, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_fetch_sub(vp16, v16, __ATOMIC_SEQ_CST); }
+	{ __int128 ret; ret = __atomic_fetch_sub_16(vp16, v16, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_fetch_and(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ char ret; ret = __atomic_fetch_and_1(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_fetch_and(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_fetch_and_2(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_fetch_and(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_fetch_and_4(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_fetch_and(vp8, v8, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_fetch_and_8(vp8, v8, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_fetch_and(vp16, v16, __ATOMIC_SEQ_CST); }
+	{ __int128 ret; ret = __atomic_fetch_and_16(vp16, v16, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_fetch_nand(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ char ret; ret = __atomic_fetch_nand_1(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_fetch_nand(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_fetch_nand_2(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_fetch_nand(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_fetch_nand_4(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_fetch_nand(vp8, v8, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_fetch_nand_8(vp8, v8, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_fetch_nand(vp16, v16, __ATOMIC_SEQ_CST); }
+	{ __int128 ret; ret = __atomic_fetch_nand_16(vp16, v16, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_fetch_xor(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ char ret; ret = __atomic_fetch_xor_1(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_fetch_xor(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_fetch_xor_2(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_fetch_xor(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_fetch_xor_4(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_fetch_xor(vp8, v8, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_fetch_xor_8(vp8, v8, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_fetch_xor(vp16, v16, __ATOMIC_SEQ_CST); }
+	{ __int128 ret; ret = __atomic_fetch_xor_16(vp16, v16, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ char ret; ret = __atomic_fetch_or(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ char ret; ret = __atomic_fetch_or_1(vp1, v1, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_fetch_or(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ short ret; ret = __atomic_fetch_or_2(vp2, v2, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_fetch_or(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ int ret; ret = __atomic_fetch_or_4(vp4, v4, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_fetch_or(vp8, v8, __ATOMIC_SEQ_CST); }
+	{ long long int ret; ret = __atomic_fetch_or_8(vp8, v8, __ATOMIC_SEQ_CST); }
+	#if defined(__SIZEOF_INT128__)
+	{ __int128 ret; ret = __atomic_fetch_or(vp16, v16, __ATOMIC_SEQ_CST); }
+	{ __int128 ret; ret = __atomic_fetch_or_16(vp16, v16, __ATOMIC_SEQ_CST); }
+	#endif
+
+	{ _Bool ret; ret = __atomic_always_lock_free(sizeof(int), vp4); }
+	{ _Bool ret; ret = __atomic_is_lock_free(sizeof(int), vp4); }
+	{ __atomic_thread_fence(__ATOMIC_SEQ_CST); }
+	{ __atomic_signal_fence(__ATOMIC_SEQ_CST); }
+}
+
+int main() {
+	return 0;
+}
Index: tests/complex.cfa
===================================================================
--- tests/complex.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/complex.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 24 22:07:31 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 17:51:22 2018
-// Update Count     : 3
+// Last Modified On : Tue Dec  4 21:34:21 2018
+// Update Count     : 4
 //
 
@@ -25,5 +25,5 @@
     printf( "x:%g+%gi y:%g+%gi z:%g+%gi\n", creal(x), cimag(x), creal(y), cimag(y), creal(z), cimag(z) );
 #ifdef __CFA__
-    sout | "x:" | x | "y:" | y | "z:" | z | endl;
+    sout | "x:" | x | "y:" | y | "z:" | z;
 #endif // __CFA
     x = 2.1 + 1.3i;
@@ -32,5 +32,5 @@
     printf( "x:%g+%gi y:%g+%gi z:%g+%gi\n", creal(x), cimag(x), creal(y), cimag(y), creal(z), cimag(z) );
 #ifdef __CFA__
-    sout | "x:" | x | "y:" | y | "z:" | z | endl;
+    sout | "x:" | x | "y:" | y | "z:" | z;
 #endif // __CFA
 }
Index: sts/concurrent/coroutineYield.c
===================================================================
--- tests/concurrent/coroutineYield.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,53 +1,0 @@
-#include <fstream.hfa>
-#include <kernel.hfa>
-#include <stdlib.hfa>
-#include <thread.hfa>
-#include <time.hfa>
-
-#define __kick_rate 150000ul
-#include "long_tests.hfa"
-
-#ifndef PREEMPTION_RATE
-#define PREEMPTION_RATE 10`ms
-#endif
-
-Duration default_preemption() {
-	return PREEMPTION_RATE;
-}
-
-#ifdef TEST_LONG
-static const unsigned long N = 600_000ul;
-#else
-static const unsigned long N = 1_000ul;
-#endif
-
-coroutine Coroutine {};
-
-void main(Coroutine& this) {
-	while(true) {
-		#if !defined(TEST_FOREVER)
-			sout | "Coroutine 1" | endl;
-		#endif
-		yield();
-		#if !defined(TEST_FOREVER)
-			sout | "Coroutine 2" | endl;
-		#endif
-		suspend();
-	}
-}
-
-
-int main(int argc, char* argv[]) {
-	Coroutine c;
-	for(int i = 0; TEST(i < N); i++) {
-		#if !defined(TEST_FOREVER)
-			sout | "Thread 1" | endl;
-		#endif
-		resume(c);
-		#if !defined(TEST_FOREVER)
-			sout | "Thread 2" | endl;
-		#endif
-		yield();
-		KICK_WATCHDOG;
-	}
-}
Index: tests/concurrent/coroutineYield.cfa
===================================================================
--- tests/concurrent/coroutineYield.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/concurrent/coroutineYield.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,53 @@
+#include <fstream.hfa>
+#include <kernel.hfa>
+#include <stdlib.hfa>
+#include <thread.hfa>
+#include <time.hfa>
+
+#define __kick_rate 150000ul
+#include "long_tests.hfa"
+
+#ifndef PREEMPTION_RATE
+#define PREEMPTION_RATE 10`ms
+#endif
+
+Duration default_preemption() {
+	return PREEMPTION_RATE;
+}
+
+#ifdef TEST_LONG
+static const unsigned long N = 600_000ul;
+#else
+static const unsigned long N = 1_000ul;
+#endif
+
+coroutine Coroutine {};
+
+void main(Coroutine& this) {
+	while(true) {
+		#if !defined(TEST_FOREVER)
+			sout | "Coroutine 1";
+		#endif
+		yield();
+		#if !defined(TEST_FOREVER)
+			sout | "Coroutine 2";
+		#endif
+		suspend();
+	}
+}
+
+
+int main(int argc, char* argv[]) {
+	Coroutine c;
+	for(int i = 0; TEST(i < N); i++) {
+		#if !defined(TEST_FOREVER)
+			sout | "Thread 1";
+		#endif
+		resume(c);
+		#if !defined(TEST_FOREVER)
+			sout | "Thread 2";
+		#endif
+		yield();
+		KICK_WATCHDOG;
+	}
+}
Index: sts/concurrent/examples/boundedBufferEXT.c
===================================================================
--- tests/concurrent/examples/boundedBufferEXT.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,123 +1,0 @@
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// boundedBufferEXT.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Wed Apr 18 22:52:12 2018
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug 16 08:17:03 2018
-// Update Count     : 8
-//
-
-#include <stdlib.hfa>										// random
-#include <fstream.hfa>
-#include <kernel.hfa>
-#include <thread.hfa>
-#include <unistd.h>										// getpid
-
-//Duration default_preemption() { return 0; }
-
-enum { BufferSize = 50 };
-
-forall( otype T ) {
-	monitor Buffer {
-		int front, back, count;
-		T elements[BufferSize];
-	}; // Buffer
-
-	void ?{}( Buffer(T) & buffer ) with( buffer ) { [front, back, count] = 0; }
-
-	int query( Buffer(T) & buffer ) { return buffer.count; } // read-only, no mutual exclusion
-
-	T remove( Buffer(T) & mutex buffer );				// forward
-
-	void insert( Buffer(T) & mutex buffer, T elem ) with( buffer ) {
-		if ( count == BufferSize ) waitfor( remove, buffer );
-		elements[back] = elem;
-		back = ( back + 1 ) % BufferSize;
-		count += 1;
-	} // insert
-
-	T remove( Buffer(T) & mutex buffer ) with( buffer ) {
-		if ( count == 0 ) waitfor( insert, buffer );
-		T elem = elements[front];
-		front = ( front + 1 ) % BufferSize;
-		count -= 1;
-		return elem;
-	} // remove
-}
-
-const int Sentinel = -1;
-
-thread Producer {
-	Buffer(int) & buffer;
-	unsigned int N;
-};
-void main( Producer & prod ) with( prod ) {
-	for ( int i = 1; i <= N; i += 1 ) {
-		yield( random( 5 ) );
-		insert( buffer, 1 );
-	} // for
-}
-void ?{}( Producer & prod, Buffer(int) * buffer, int N ) {
-	&prod.buffer = buffer;
-	prod.N = N;
-}
-
-thread Consumer {
-	Buffer(int) & buffer;
-	int & sum;											// summation of producer values
-};
-void main( Consumer & cons ) with( cons ) {
-	sum = 0;
-	for () {
-		yield( random( 5 ) );
-		int item = remove( buffer );
-	  if ( item == Sentinel ) break;					// sentinel ?
-		sum += item;
-	} // for
-}
-void ?{}( Consumer & cons, Buffer(int) * buffer, int & sum ) {
-	&cons.buffer = buffer;
-	&cons.sum = &sum;
-}
-
-int main() {
-	Buffer(int) buffer;
-	enum { Prods = 4, Cons = 5 };
-	Producer * prods[Prods];
-	Consumer * cons[Cons];
-	int sums[Cons];
-	int i;
-	processor p;
-
-	//srandom( getpid() );
-	srandom( 1003 );
-
-	for ( i = 0; i < Cons; i += 1 ) {					// create consumers
-		cons[i] = new( &buffer, sums[i] );
-	} // for
-	for ( i = 0; i < Prods; i += 1 ) {					// create producers
-		prods[i] = new( &buffer, 100000 );
-	} // for
-
-	for ( i = 0; i < Prods; i += 1 ) {					// wait for producers to finish
-		delete( prods[i] );
-	} // for
-	for ( i = 0; i < Cons; i += 1 ) {					// generate sentinal values to stop consumers
-		insert( buffer, Sentinel );
-	} // for
-	int sum = 0;
-	for ( i = 0; i < Cons; i += 1 ) {					// wait for consumers to finish
-		delete( cons[i] );
-		sum += sums[i];
-	} // for
-	sout | "total:" | sum | endl;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa boundedBufferEXT.c" //
-// End: //
Index: tests/concurrent/examples/boundedBufferEXT.cfa
===================================================================
--- tests/concurrent/examples/boundedBufferEXT.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/concurrent/examples/boundedBufferEXT.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,123 @@
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// boundedBufferEXT.c --
+//
+// Author           : Peter A. Buhr
+// 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
+//
+
+#include <stdlib.hfa>										// random
+#include <fstream.hfa>
+#include <kernel.hfa>
+#include <thread.hfa>
+#include <unistd.h>										// getpid
+
+//Duration default_preemption() { return 0; }
+
+enum { BufferSize = 50 };
+
+forall( otype T ) {
+	monitor Buffer {
+		int front, back, count;
+		T elements[BufferSize];
+	}; // Buffer
+
+	void ?{}( Buffer(T) & buffer ) with( buffer ) { [front, back, count] = 0; }
+
+	int query( Buffer(T) & buffer ) { return buffer.count; } // read-only, no mutual exclusion
+
+	T remove( Buffer(T) & mutex buffer );				// forward
+
+	void insert( Buffer(T) & mutex buffer, T elem ) with( buffer ) {
+		if ( count == BufferSize ) waitfor( remove, buffer );
+		elements[back] = elem;
+		back = ( back + 1 ) % BufferSize;
+		count += 1;
+	} // insert
+
+	T remove( Buffer(T) & mutex buffer ) with( buffer ) {
+		if ( count == 0 ) waitfor( insert, buffer );
+		T elem = elements[front];
+		front = ( front + 1 ) % BufferSize;
+		count -= 1;
+		return elem;
+	} // remove
+}
+
+const int Sentinel = -1;
+
+thread Producer {
+	Buffer(int) & buffer;
+	unsigned int N;
+};
+void main( Producer & prod ) with( prod ) {
+	for ( int i = 1; i <= N; i += 1 ) {
+		yield( random( 5 ) );
+		insert( buffer, 1 );
+	} // for
+}
+void ?{}( Producer & prod, Buffer(int) * buffer, int N ) {
+	&prod.buffer = buffer;
+	prod.N = N;
+}
+
+thread Consumer {
+	Buffer(int) & buffer;
+	int & sum;											// summation of producer values
+};
+void main( Consumer & cons ) with( cons ) {
+	sum = 0;
+	for () {
+		yield( random( 5 ) );
+		int item = remove( buffer );
+	  if ( item == Sentinel ) break;					// sentinel ?
+		sum += item;
+	} // for
+}
+void ?{}( Consumer & cons, Buffer(int) * buffer, int & sum ) {
+	&cons.buffer = buffer;
+	&cons.sum = &sum;
+}
+
+int main() {
+	Buffer(int) buffer;
+	enum { Prods = 4, Cons = 5 };
+	Producer * prods[Prods];
+	Consumer * cons[Cons];
+	int sums[Cons];
+	int i;
+	processor p;
+
+	//srandom( getpid() );
+	srandom( 1003 );
+
+	for ( i = 0; i < Cons; i += 1 ) {					// create consumers
+		cons[i] = new( &buffer, sums[i] );
+	} // for
+	for ( i = 0; i < Prods; i += 1 ) {					// create producers
+		prods[i] = new( &buffer, 100000 );
+	} // for
+
+	for ( i = 0; i < Prods; i += 1 ) {					// wait for producers to finish
+		delete( prods[i] );
+	} // for
+	for ( i = 0; i < Cons; i += 1 ) {					// generate sentinal values to stop consumers
+		insert( buffer, Sentinel );
+	} // for
+	int sum = 0;
+	for ( i = 0; i < Cons; i += 1 ) {					// wait for consumers to finish
+		delete( cons[i] );
+		sum += sums[i];
+	} // for
+	sout | "total:" | sum;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa boundedBufferEXT.c" //
+// End: //
Index: sts/concurrent/examples/boundedBufferINT.c
===================================================================
--- tests/concurrent/examples/boundedBufferINT.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,124 +1,0 @@
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// boundedBuffer.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Mon Oct 30 12:45:13 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug 16 08:17:58 2018
-// Update Count     : 83
-//
-
-#include <stdlib.hfa>										// random
-#include <fstream.hfa>
-#include <kernel.hfa>
-#include <thread.hfa>
-#include <unistd.h>										// getpid
-
-//Duration default_preemption() { return 0; }
-
-enum { BufferSize = 50 };
-
-forall( otype T ) {
-	monitor Buffer {
-		condition full, empty;
-		int front, back, count;
-		T elements[BufferSize];
-	}; // Buffer
-
-	void ?{}( Buffer(T) & buffer ) with( buffer ) { [front, back, count] = 0; }
-
-	int query( Buffer(T) & buffer ) { return buffer.count; } // read-only, no mutual exclusion
-
-	void insert( Buffer(T) & mutex buffer, T elem ) with( buffer ) {
-		if ( count == BufferSize ) wait( empty );
-		elements[back] = elem;
-		back = ( back + 1 ) % BufferSize;
-		count += 1;
-		signal( full );
-	} // insert
-
-	T remove( Buffer(T) & mutex buffer ) with( buffer ) {
-		if ( count == 0 ) wait( full );
-		T elem = elements[front];
-		front = ( front + 1 ) % BufferSize;
-		count -= 1;
-		signal( empty );
-		return elem;
-	} // remove
-}
-
-const int Sentinel = -1;
-
-thread Producer {
-	Buffer(int) & buffer;
-	unsigned int N;
-};
-void main( Producer & prod ) with( prod ) {
-	for ( int i = 1; i <= N; i += 1 ) {
-		yield( random( 5 ) );
-		insert( buffer, 1 );
-	} // for
-}
-void ?{}( Producer & prod, Buffer(int) * buffer, int N ) {
-	&prod.buffer = buffer;
-	prod.N = N;
-}
-
-thread Consumer {
-	Buffer(int) & buffer;
-	int & sum;											// summation of producer values
-};
-void main( Consumer & cons ) with( cons ) {
-	sum = 0;
-	for () {
-		yield( random( 5 ) );
-		int item = remove( buffer );
-	  if ( item == Sentinel ) break;					// sentinel ?
-		sum += item;
-	} // for
-}
-void ?{}( Consumer & cons, Buffer(int) * buffer, int & sum ) {
-	&cons.buffer = buffer;
-	&cons.sum = &sum;
-}
-
-int main() {
-	Buffer(int) buffer;
-	enum { Prods = 4, Cons = 5 };
-	Producer * prods[Prods];
-	Consumer * cons[Cons];
-	int sums[Cons];
-	int i;
-	processor p;
-
-	//srandom( getpid() );
-	srandom( 1003 );
-
-	for ( i = 0; i < Cons; i += 1 ) {					// create consumers
-		cons[i] = new( &buffer, sums[i] );
-	} // for
-	for ( i = 0; i < Prods; i += 1 ) {					// create producers
-		prods[i] = new( &buffer, 100000 );
-	} // for
-
-	for ( i = 0; i < Prods; i += 1 ) {					// wait for producers to finish
-		delete( prods[i] );
-	} // for
-	for ( i = 0; i < Cons; i += 1 ) {					// generate sentinal values to stop consumers
-		insert( buffer, Sentinel );
-	} // for
-	int sum = 0;
-	for ( i = 0; i < Cons; i += 1 ) {					// wait for consumers to finish
-		delete( cons[i] );
-		sum += sums[i];
-	} // for
-	sout | "total:" | sum | endl;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa boundedBufferINT.c" //
-// End: //
Index: tests/concurrent/examples/boundedBufferINT.cfa
===================================================================
--- tests/concurrent/examples/boundedBufferINT.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/concurrent/examples/boundedBufferINT.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,124 @@
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// boundedBuffer.c --
+//
+// Author           : Peter A. Buhr
+// 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
+//
+
+#include <stdlib.hfa>										// random
+#include <fstream.hfa>
+#include <kernel.hfa>
+#include <thread.hfa>
+#include <unistd.h>										// getpid
+
+//Duration default_preemption() { return 0; }
+
+enum { BufferSize = 50 };
+
+forall( otype T ) {
+	monitor Buffer {
+		condition full, empty;
+		int front, back, count;
+		T elements[BufferSize];
+	}; // Buffer
+
+	void ?{}( Buffer(T) & buffer ) with( buffer ) { [front, back, count] = 0; }
+
+	int query( Buffer(T) & buffer ) { return buffer.count; } // read-only, no mutual exclusion
+
+	void insert( Buffer(T) & mutex buffer, T elem ) with( buffer ) {
+		if ( count == BufferSize ) wait( empty );
+		elements[back] = elem;
+		back = ( back + 1 ) % BufferSize;
+		count += 1;
+		signal( full );
+	} // insert
+
+	T remove( Buffer(T) & mutex buffer ) with( buffer ) {
+		if ( count == 0 ) wait( full );
+		T elem = elements[front];
+		front = ( front + 1 ) % BufferSize;
+		count -= 1;
+		signal( empty );
+		return elem;
+	} // remove
+}
+
+const int Sentinel = -1;
+
+thread Producer {
+	Buffer(int) & buffer;
+	unsigned int N;
+};
+void main( Producer & prod ) with( prod ) {
+	for ( int i = 1; i <= N; i += 1 ) {
+		yield( random( 5 ) );
+		insert( buffer, 1 );
+	} // for
+}
+void ?{}( Producer & prod, Buffer(int) * buffer, int N ) {
+	&prod.buffer = buffer;
+	prod.N = N;
+}
+
+thread Consumer {
+	Buffer(int) & buffer;
+	int & sum;											// summation of producer values
+};
+void main( Consumer & cons ) with( cons ) {
+	sum = 0;
+	for () {
+		yield( random( 5 ) );
+		int item = remove( buffer );
+	  if ( item == Sentinel ) break;					// sentinel ?
+		sum += item;
+	} // for
+}
+void ?{}( Consumer & cons, Buffer(int) * buffer, int & sum ) {
+	&cons.buffer = buffer;
+	&cons.sum = &sum;
+}
+
+int main() {
+	Buffer(int) buffer;
+	enum { Prods = 4, Cons = 5 };
+	Producer * prods[Prods];
+	Consumer * cons[Cons];
+	int sums[Cons];
+	int i;
+	processor p;
+
+	//srandom( getpid() );
+	srandom( 1003 );
+
+	for ( i = 0; i < Cons; i += 1 ) {					// create consumers
+		cons[i] = new( &buffer, sums[i] );
+	} // for
+	for ( i = 0; i < Prods; i += 1 ) {					// create producers
+		prods[i] = new( &buffer, 100000 );
+	} // for
+
+	for ( i = 0; i < Prods; i += 1 ) {					// wait for producers to finish
+		delete( prods[i] );
+	} // for
+	for ( i = 0; i < Cons; i += 1 ) {					// generate sentinal values to stop consumers
+		insert( buffer, Sentinel );
+	} // for
+	int sum = 0;
+	for ( i = 0; i < Cons; i += 1 ) {					// wait for consumers to finish
+		delete( cons[i] );
+		sum += sums[i];
+	} // for
+	sout | "total:" | sum;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa boundedBufferINT.c" //
+// End: //
Index: sts/concurrent/examples/datingService.c
===================================================================
--- tests/concurrent/examples/datingService.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,113 +1,0 @@
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// datingService.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Mon Oct 30 12:56:20 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sun May 27 09:05:18 2018
-// Update Count     : 26
-//
-
-#include <stdlib.hfa>										// random
-#include <fstream.hfa>
-#include <kernel.hfa>
-#include <thread.hfa>
-#include <unistd.h>										// getpid
-
-enum { CompCodes = 20 };								// number of compatibility codes
-
-monitor DatingService {
-	condition Girls[CompCodes], Boys[CompCodes];
-	unsigned int GirlPhoneNo, BoyPhoneNo;
-}; // DatingService
-
-unsigned int girl( DatingService & mutex ds, unsigned int PhoneNo, unsigned int ccode ) with( ds ) {
-	if ( is_empty( Boys[ccode] ) ) {					// no compatible boy ?
-		wait( Girls[ccode] );							// wait for boy
-		GirlPhoneNo = PhoneNo;							// make phone number available
-	} else {
-		GirlPhoneNo = PhoneNo;							// make phone number available
-		signal_block( Boys[ccode] );					// restart boy to set phone number
-	} // if
-	return BoyPhoneNo;
-} // DatingService girl
-
-unsigned int boy( DatingService & mutex ds, unsigned int PhoneNo, unsigned int ccode ) with( ds ) {
-	if ( is_empty( Girls[ccode] ) ) {					// no compatible girl ?
-		wait( Boys[ccode] );							// wait for girl
-		BoyPhoneNo = PhoneNo;							// make phone number available
-	} else {
-		BoyPhoneNo = PhoneNo;							// make phone number available
-		signal_block( Girls[ccode] );					// restart girl to set phone number
-	} // if
-	return GirlPhoneNo;
-} // DatingService boy
-
-unsigned int girlck[CompCodes];
-unsigned int boyck[CompCodes];
-
-thread Girl {
-	DatingService & TheExchange;
-	unsigned int id, ccode;
-}; // Girl
-
-void main( Girl & g ) with( g ) {
-	yield( random( 100 ) );								// don't all start at the same time
-	unsigned int partner = girl( TheExchange, id, ccode );
-	sout | "Girl:" | id | "is dating Boy at" | partner | "with ccode" | ccode | endl;
-	girlck[id] = partner;
-} // Girl main
-
-void ?{}( Girl & g, DatingService * TheExchange, unsigned int id, unsigned int ccode ) {
-	&g.TheExchange = TheExchange;
-	g.id = id;
-	g.ccode = ccode;
-} // Girl ?{}
-
-thread Boy {
-	DatingService &TheExchange;
-	unsigned int id, ccode;
-}; // Boy
-
-void main( Boy & b ) with( b ) {
-	yield( random( 100 ) );								// don't all start at the same time
-	unsigned int partner = boy( TheExchange, id, ccode );
-	sout | " Boy:" | id | "is dating Girl" | partner | "with ccode" | ccode | endl;
-	boyck[id] = partner;
-} // Boy main
-
-void ?{}( Boy & b, DatingService * TheExchange, unsigned int id, unsigned int ccode ) {
-	&b.TheExchange = TheExchange;
-	b.id = id;
-	b.ccode = ccode;
-} // Boy ?{}
-
-int main() {
-	DatingService TheExchange;
-	Girl * girls[CompCodes];
-	Boy  * boys[CompCodes];
-
-	srandom( /*getpid()*/ 103 );
-
-	for ( unsigned int i = 0; i < CompCodes; i += 1 ) {
-		girls[i] = new( &TheExchange, i, i );
-		boys[i]  = new( &TheExchange, i, CompCodes - ( i + 1 ) );
-	} // for
-
-	for ( unsigned int i = 0; i < CompCodes; i += 1 ) {
-		delete( boys[i] );
-		delete( girls[i] );
-	} // for
-
-	for ( unsigned int i = 0; i < CompCodes; i += 1 ) {
-		if ( girlck[ boyck[i] ] != boyck[ girlck[i] ] ) abort();
-	} // for
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa datingService.c" //
-// End: //
Index: tests/concurrent/examples/datingService.cfa
===================================================================
--- tests/concurrent/examples/datingService.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/concurrent/examples/datingService.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,113 @@
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// datingService.c --
+//
+// Author           : Peter A. Buhr
+// 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
+//
+
+#include <stdlib.hfa>										// random
+#include <fstream.hfa>
+#include <kernel.hfa>
+#include <thread.hfa>
+#include <unistd.h>										// getpid
+
+enum { CompCodes = 20 };								// number of compatibility codes
+
+monitor DatingService {
+	condition Girls[CompCodes], Boys[CompCodes];
+	unsigned int GirlPhoneNo, BoyPhoneNo;
+}; // DatingService
+
+unsigned int girl( DatingService & mutex ds, unsigned int PhoneNo, unsigned int ccode ) with( ds ) {
+	if ( is_empty( Boys[ccode] ) ) {					// no compatible boy ?
+		wait( Girls[ccode] );							// wait for boy
+		GirlPhoneNo = PhoneNo;							// make phone number available
+	} else {
+		GirlPhoneNo = PhoneNo;							// make phone number available
+		signal_block( Boys[ccode] );					// restart boy to set phone number
+	} // if
+	sout | "Girl:" | PhoneNo | "is dating Boy at" | BoyPhoneNo | "with ccode" | ccode;
+	return BoyPhoneNo;
+} // DatingService girl
+
+unsigned int boy( DatingService & mutex ds, unsigned int PhoneNo, unsigned int ccode ) with( ds ) {
+	if ( is_empty( Girls[ccode] ) ) {					// no compatible girl ?
+		wait( Boys[ccode] );							// wait for girl
+		BoyPhoneNo = PhoneNo;							// make phone number available
+	} else {
+		BoyPhoneNo = PhoneNo;							// make phone number available
+		signal_block( Girls[ccode] );					// restart girl to set phone number
+	} // if
+	sout | " Boy:" | PhoneNo | "is dating Girl" | GirlPhoneNo | "with ccode" | ccode;
+	return GirlPhoneNo;
+} // DatingService boy
+
+unsigned int girlck[CompCodes];
+unsigned int boyck[CompCodes];
+
+thread Girl {
+	DatingService & TheExchange;
+	unsigned int id, ccode;
+}; // Girl
+
+void main( Girl & g ) with( g ) {
+	yield( random( 100 ) );								// don't all start at the same time
+	unsigned int partner = girl( TheExchange, id, ccode );
+	girlck[id] = partner;
+} // Girl main
+
+void ?{}( Girl & g, DatingService * TheExchange, unsigned int id, unsigned int ccode ) {
+	&g.TheExchange = TheExchange;
+	g.id = id;
+	g.ccode = ccode;
+} // Girl ?{}
+
+thread Boy {
+	DatingService & TheExchange;
+	unsigned int id, ccode;
+}; // Boy
+
+void main( Boy & b ) with( b ) {
+	yield( random( 100 ) );								// don't all start at the same time
+	unsigned int partner = boy( TheExchange, id, ccode );
+	boyck[id] = partner;
+} // Boy main
+
+void ?{}( Boy & b, DatingService * TheExchange, unsigned int id, unsigned int ccode ) {
+	&b.TheExchange = TheExchange;
+	b.id = id;
+	b.ccode = ccode;
+} // Boy ?{}
+
+int main() {
+	DatingService TheExchange;
+	Girl * girls[CompCodes];
+	Boy  * boys[CompCodes];
+
+	srandom( /*getpid()*/ 103 );
+
+	for ( unsigned int i = 0; i < CompCodes; i += 1 ) {
+		girls[i] = new( &TheExchange, i, i );
+		boys[i]  = new( &TheExchange, i, CompCodes - ( i + 1 ) );
+	} // for
+
+	for ( unsigned int i = 0; i < CompCodes; i += 1 ) {
+		delete( boys[i] );
+		delete( girls[i] );
+	} // for
+
+	for ( unsigned int i = 0; i < CompCodes; i += 1 ) {
+		if ( girlck[ boyck[i] ] != boyck[ girlck[i] ] ) abort();
+	} // for
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa datingService.c" //
+// End: //
Index: sts/concurrent/examples/matrixSum.c
===================================================================
--- tests/concurrent/examples/matrixSum.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,62 +1,0 @@
-//                               -*- Mode: C -*-
-//
-// 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.
-//
-// matrixSum.cfa --
-//
-// Author           : Peter A. Buhr
-// Created On       : Mon Oct  9 08:29:28 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 17:51:32 2018
-// Update Count     : 14
-//
-
-#include <fstream.hfa>
-#include <kernel.hfa>
-#include <thread.hfa>
-
-thread Adder {
-	int * row, cols, & subtotal;						// communication
-};
-
-void ?{}( Adder & adder, int row[], int cols, int & subtotal ) {
-	adder.[ row, cols ] = [ row, cols ];				// expression disallowed in multi-member access
-	&adder.subtotal = &subtotal;
-}
-
-void main( Adder & adder ) with( adder ) {				// thread starts here
-	subtotal = 0;
-	for ( c; cols ) {
-		subtotal += row[c];
-	} // for
-}
-
-int main() {
-	/* const */ int rows = 10, cols = 1000;
-	int matrix[rows][cols], subtotals[rows], total = 0;
-	processor p;										// add kernel thread
-
-	for ( r; rows ) {
-		for ( c; cols ) {
-			matrix[r][c] = 1;
-		} // for
-	} // for
-	Adder * adders[rows];
-	for ( r; rows ) {									// start threads to sum rows
-		adders[r] = &(*malloc()){ matrix[r], cols, subtotals[r] };
-//		adders[r] = new( matrix[r], cols, &subtotals[r] );
-	} // for
-	for ( r; rows ) {									// wait for threads to finish
-		delete( adders[r] );
-		total += subtotals[r];							// total subtotals
-	} // for
-	sout | total | endl;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa matrixSum.cfa" //
-// End: //
Index: tests/concurrent/examples/matrixSum.cfa
===================================================================
--- tests/concurrent/examples/matrixSum.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/concurrent/examples/matrixSum.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,62 @@
+//                               -*- Mode: C -*-
+//
+// 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.
+//
+// matrixSum.cfa --
+//
+// Author           : Peter A. Buhr
+// 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
+//
+
+#include <fstream.hfa>
+#include <kernel.hfa>
+#include <thread.hfa>
+
+thread Adder {
+	int * row, cols, & subtotal;						// communication
+};
+
+void ?{}( Adder & adder, int row[], int cols, int & subtotal ) {
+	adder.[ row, cols ] = [ row, cols ];				// expression disallowed in multi-member access
+	&adder.subtotal = &subtotal;
+}
+
+void main( Adder & adder ) with( adder ) {				// thread starts here
+	subtotal = 0;
+	for ( c; cols ) {
+		subtotal += row[c];
+	} // for
+}
+
+int main() {
+	/* const */ int rows = 10, cols = 1000;
+	int matrix[rows][cols], subtotals[rows], total = 0;
+	processor p;										// add kernel thread
+
+	for ( r; rows ) {
+		for ( c; cols ) {
+			matrix[r][c] = 1;
+		} // for
+	} // for
+	Adder * adders[rows];
+	for ( r; rows ) {									// start threads to sum rows
+		adders[r] = &(*malloc()){ matrix[r], cols, subtotals[r] };
+//		adders[r] = new( matrix[r], cols, &subtotals[r] );
+	} // for
+	for ( r; rows ) {									// wait for threads to finish
+		delete( adders[r] );
+		total += subtotals[r];							// total subtotals
+	} // for
+	sout | total;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa matrixSum.cfa" //
+// End: //
Index: sts/concurrent/examples/quickSort.c
===================================================================
--- tests/concurrent/examples/quickSort.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,180 +1,0 @@
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// quickSort.c -- In-place concurrent quick-sort: threads are created to partition to a specific depth, then sequential
-//		recursive-calls are use to sort each partition.
-//
-// Author           : Peter A. Buhr
-// Created On       : Wed Dec  6 12:15:52 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug 16 08:17:41 2018
-// Update Count     : 163
-//
-
-#include <fstream.hfa>
-#include <stdlib.hfa>
-#include <kernel.hfa>
-#include <thread.hfa>
-#include <string.h>										// strcmp
-
-thread Quicksort {
-	int * values;										// communication variables
-	int low, high, depth;
-};
-
-void ?{}( Quicksort & qs, int values[], int size, int depth ) {
-	qs.values = values;  qs.low = 0;  qs.high = size;  qs.depth = depth;
-} // Quicksort
-
-void main( Quicksort & qs ) {							// thread starts here
-	// nested routines: information hiding
-
-	void ?{}( Quicksort & qs, int values[], int low, int high, int depth ) {
-		qs.values = values;  qs.low = low;  qs.high = high;  qs.depth = depth;
-	} // Quicksort
-
-	void sort( int values[], int low, int high, int depth ) {
-		int left, right;								// index to left/right-hand side of the values
-		int pivot;										// pivot value of values
-		int swap;										// temporary
-
-		//verify();										// check for stack overflow due to recursion
-
-		// partition while 2 or more elements in the array
-		if ( low < high ) {
-			pivot = values[low + ( high - low ) / 2];
-			left  = low;
-			right = high;
-
-			// partition: move values less < pivot before the pivot and values > pivot after the pivot
-			do {
-				while ( values[left] < pivot ) left += 1; // changed values[left] < pivot
-				while ( pivot < values[right] ) right -= 1;
-				if ( left <= right ) {
-					swap = values[left];				// interchange values
-					values[left]  = values[right];
-					values[right] = swap;
-					left += 1;
-					right -= 1;
-				} // if
-			} while ( left <= right );
-
-			// restrict number of tasks to slightly greater than number of processors
-			if ( depth > 0 ) {
-				depth -= 1;
-				Quicksort rqs = { values, low, right, depth }; // concurrently sort upper half
-				//Quicksort lqs( values, left, high, depth ); // concurrently sort lower half
-				sort( values, left, high, depth );		// concurrently sort lower half
-			} else {
-				sort( values, low, right, 0 );			// sequentially sort lower half
-				sort( values, left, high, 0 );			// sequentially sort upper half
-			} // if
-		} // if
-	} // sort
-
-	with( qs ) {
-		sort( values, low, high, depth );
-	} // with
-} // main
-
-
-bool convert( int & val, const char * nptr ) {			// convert C string to integer
-	char * eptr;
-	int temp = strto( nptr, &eptr, 10 );				// do not change val on false
-	// true => entire string valid with no extra characters
-	return *nptr != '\0' && *eptr == '\0' ? val = temp, true : false;
-} // convert
-
-void usage( char * argv[] ) {
-	sout | "Usage:" | argv[0] | "( -s unsorted-file [ sorted-file ] | -t size (>= 0) [ depth (>= 0) ] )" | endl;
-	exit( EXIT_FAILURE );								// TERMINATE!
-} // usage
-
-
-int main( int argc, char * argv[] ) {
-	ifstream & unsortedfile = sin;
-	ofstream & sortedfile = sout;						// default value
-	int depth = 0, size;
-
-	if ( argc != 1 ) {									// do not use defaults
-		if ( argc < 2 || argc > 4 ) usage( argv );		// wrong number of options
-		if ( strcmp( argv[1], "-t" ) == 0 ) {			// timing ?
-			&unsortedfile = (ifstream *)0;				// no input
-			choose ( argc ) {
-			  case 4:
-				if ( ! convert( depth, argv[3] ) || depth < 0 ) usage( argv );
-				fallthrough;
-			  case 3:
-				if ( ! convert( size, argv[2] ) || size < 0 ) usage( argv );
-			} // choose
-		} else {										// sort file
-			choose ( argc ) {
-			  case 3:
-				&sortedfile = new( (const char *)argv[2] ); // open the output file
-				if ( fail( sortedfile ) ) {
-					serr | "Error! Could not open sorted output file \"" | argv[2] | "\"" | endl;
-					usage( argv );
-				} // if
-				fallthrough;
-			  case 2:
-				&unsortedfile = new( (const char *)argv[1] ); // open the input file
-				if ( fail( unsortedfile ) ) {
-					serr | "Error! Could not open unsorted input file \"" | argv[1] | "\"" | endl;
-					usage( argv );
-				} // if
-			} // choose
-		} // if
-	} // if
-
-	enum { ValuesPerLine = 22 };						// number of values printed per line
-
-	if ( &unsortedfile ) {								// generate output ?
-		for () {
-			unsortedfile | size;						// read number of elements in the list
-		  if ( eof( unsortedfile ) ) break;
-			int * values = alloc( size );				// values to be sorted, too large to put on stack
-			for ( int counter = 0; counter < size; counter += 1 ) { // read unsorted numbers
-				unsortedfile | values[counter];
-				if ( counter != 0 && counter % ValuesPerLine == 0 ) sortedfile | endl | "  ";
-				sortedfile | values[counter];
-				if ( counter < size - 1 && (counter + 1) % ValuesPerLine != 0 ) sortedfile | ' ';
-			} // for
-			sortedfile | endl;
-			if ( size > 0 ) {							// values to sort ?
-				Quicksort QS = { values, size - 1, 0 }; // sort values
-			} // wait until sort tasks terminate
-			for ( int counter = 0; counter < size; counter += 1 ) { // print sorted list
-				if ( counter != 0 && counter % ValuesPerLine == 0 ) sortedfile | endl | "  ";
-				sortedfile | values[counter];
-				if ( counter < size - 1 && (counter + 1) % ValuesPerLine != 0 ) sortedfile | ' ';
-			} // for
-			sortedfile | endl | endl;
-
-			delete( values );
-		} // for
-		if ( &unsortedfile != &sin ) delete( &unsortedfile ); // close input/output files
-		if ( &sortedfile != &sout ) delete( &sortedfile );
-	} else {
-		processor processors[ (1 << depth) - 1 ] __attribute__(( unused )); // create 2^depth-1 kernel threads
-
-		int * values = alloc( size );				// values to be sorted, too large to put on stack
-		for ( int counter = 0; counter < size; counter += 1 ) { // generate unsorted numbers
-			values[counter] = size - counter;			// descending values
-		} // for
-		{
-			Quicksort QS = { values, size - 1, depth }; // sort values
-		} // wait until sort tasks terminate
-
-		// for ( int counter = 0; counter < size - 1; counter += 1 ) { // check sorting
-		// 	if ( values[counter] > values[counter + 1] ) abort();
-		// } // for
-
-		delete( values );
-	} // if
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa quickSort.c" //
-// End: //
Index: tests/concurrent/examples/quickSort.cfa
===================================================================
--- tests/concurrent/examples/quickSort.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/concurrent/examples/quickSort.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,181 @@
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// quickSort.c -- In-place concurrent quick-sort: threads are created to partition to a specific depth, then sequential
+//		recursive-calls are use to sort each partition.
+//
+// Author           : Peter A. Buhr
+// 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
+//
+
+#include <fstream.hfa>
+#include <stdlib.hfa>
+#include <kernel.hfa>
+#include <thread.hfa>
+#include <string.h>										// strcmp
+
+thread Quicksort {
+	int * values;										// communication variables
+	int low, high, depth;
+};
+
+void ?{}( Quicksort & qs, int values[], int size, int depth ) {
+	qs.values = values;  qs.low = 0;  qs.high = size;  qs.depth = depth;
+} // Quicksort
+
+void main( Quicksort & qs ) {							// thread starts here
+	// nested routines: information hiding
+
+	void ?{}( Quicksort & qs, int values[], int low, int high, int depth ) {
+		qs.values = values;  qs.low = low;  qs.high = high;  qs.depth = depth;
+	} // Quicksort
+
+	void sort( int values[], int low, int high, int depth ) {
+		int left, right;								// index to left/right-hand side of the values
+		int pivot;										// pivot value of values
+		int swap;										// temporary
+
+		//verify();										// check for stack overflow due to recursion
+
+		// partition while 2 or more elements in the array
+		if ( low < high ) {
+			pivot = values[low + ( high - low ) / 2];
+			left  = low;
+			right = high;
+
+			// partition: move values less < pivot before the pivot and values > pivot after the pivot
+			do {
+				while ( values[left] < pivot ) left += 1; // changed values[left] < pivot
+				while ( pivot < values[right] ) right -= 1;
+				if ( left <= right ) {
+					swap = values[left];				// interchange values
+					values[left]  = values[right];
+					values[right] = swap;
+					left += 1;
+					right -= 1;
+				} // if
+			} while ( left <= right );
+
+			// restrict number of tasks to slightly greater than number of processors
+			if ( depth > 0 ) {
+				depth -= 1;
+				Quicksort rqs = { values, low, right, depth }; // concurrently sort upper half
+				//Quicksort lqs( values, left, high, depth ); // concurrently sort lower half
+				sort( values, left, high, depth );		// concurrently sort lower half
+			} else {
+				sort( values, low, right, 0 );			// sequentially sort lower half
+				sort( values, left, high, 0 );			// sequentially sort upper half
+			} // if
+		} // if
+	} // sort
+
+	with( qs ) {
+		sort( values, low, high, depth );
+	} // with
+} // main
+
+
+bool convert( int & val, const char * nptr ) {			// convert C string to integer
+	char * eptr;
+	int temp = strto( nptr, &eptr, 10 );				// do not change val on false
+	// true => entire string valid with no extra characters
+	return *nptr != '\0' && *eptr == '\0' ? val = temp, true : false;
+} // convert
+
+void usage( char * argv[] ) {
+	sout | "Usage:" | argv[0] | "( -s unsorted-file [ sorted-file ] | -t size (>= 0) [ depth (>= 0) ] )";
+	exit( EXIT_FAILURE );								// TERMINATE!
+} // usage
+
+
+int main( int argc, char * argv[] ) {
+	ifstream & unsortedfile = sin;
+	ofstream & sortedfile = sout;						// default value
+	int depth = 0, size;
+
+	if ( argc != 1 ) {									// do not use defaults
+		if ( argc < 2 || argc > 4 ) usage( argv );		// wrong number of options
+		if ( strcmp( argv[1], "-t" ) == 0 ) {			// timing ?
+			&unsortedfile = (ifstream *)0;				// no input
+			choose ( argc ) {
+			  case 4:
+				if ( ! convert( depth, argv[3] ) || depth < 0 ) usage( argv );
+				fallthrough;
+			  case 3:
+				if ( ! convert( size, argv[2] ) || size < 0 ) usage( argv );
+			} // choose
+		} else {										// sort file
+			choose ( argc ) {
+			  case 3:
+				&sortedfile = new( (const char *)argv[2] ); // open the output file
+				if ( fail( sortedfile ) ) {
+					serr | "Error! Could not open sorted output file \"" | argv[2] | "\"";
+					usage( argv );
+				} // if
+				fallthrough;
+			  case 2:
+				&unsortedfile = new( (const char *)argv[1] ); // open the input file
+				if ( fail( unsortedfile ) ) {
+					serr | "Error! Could not open unsorted input file \"" | argv[1] | "\"";
+					usage( argv );
+				} // if
+			} // choose
+		} // if
+	} // if
+	sortedfile | nlOff;									// turn off auto newline
+
+	enum { ValuesPerLine = 22 };						// number of values printed per line
+
+	if ( &unsortedfile ) {								// generate output ?
+		for () {
+			unsortedfile | size;						// read number of elements in the list
+		  if ( eof( unsortedfile ) ) break;
+			int * values = alloc( size );				// values to be sorted, too large to put on stack
+			for ( int counter = 0; counter < size; counter += 1 ) { // read unsorted numbers
+				unsortedfile | values[counter];
+				if ( counter != 0 && counter % ValuesPerLine == 0 ) sortedfile | nl | "  ";
+				sortedfile | values[counter];
+				if ( counter < size - 1 && (counter + 1) % ValuesPerLine != 0 ) sortedfile | ' ';
+			} // for
+			sortedfile | nl;
+			if ( size > 0 ) {							// values to sort ?
+				Quicksort QS = { values, size - 1, 0 }; // sort values
+			} // wait until sort tasks terminate
+			for ( int counter = 0; counter < size; counter += 1 ) { // print sorted list
+				if ( counter != 0 && counter % ValuesPerLine == 0 ) sortedfile | nl | "  ";
+				sortedfile | values[counter];
+				if ( counter < size - 1 && (counter + 1) % ValuesPerLine != 0 ) sortedfile | ' ';
+			} // for
+			sortedfile | nl | nl;
+
+			delete( values );
+		} // for
+		if ( &unsortedfile != &sin ) delete( &unsortedfile ); // close input/output files
+		if ( &sortedfile != &sout ) delete( &sortedfile );
+	} else {
+		processor processors[ (1 << depth) - 1 ] __attribute__(( unused )); // create 2^depth-1 kernel threads
+
+		int * values = alloc( size );				// values to be sorted, too large to put on stack
+		for ( int counter = 0; counter < size; counter += 1 ) { // generate unsorted numbers
+			values[counter] = size - counter;			// descending values
+		} // for
+		{
+			Quicksort QS = { values, size - 1, depth }; // sort values
+		} // wait until sort tasks terminate
+
+		// for ( int counter = 0; counter < size - 1; counter += 1 ) { // check sorting
+		// 	if ( values[counter] > values[counter + 1] ) abort();
+		// } // for
+
+		delete( values );
+	} // if
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa quickSort.c" //
+// End: //
Index: sts/concurrent/monitor.c
===================================================================
--- tests/concurrent/monitor.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,43 +1,0 @@
-#include <fstream.hfa>
-#include <kernel.hfa>
-#include <monitor.hfa>
-#include <thread.hfa>
-
-monitor global_t {
-	int value;
-};
-
-void ?{}(global_t & this) {
-	this.value = 0;
-}
-
-static global_t global;
-
-void increment3( global_t & mutex this ) {
-	this.value += 1;
-}
-
-void increment2( global_t & mutex this ) {
-	increment3( this );
-}
-
-void increment( global_t & mutex this ) {
-	increment2( this );
-}
-
-thread MyThread {};
-
-void main( MyThread & this ) {
-	for(int i = 0; i < 1_000_000; i++) {
-		increment( global );
-	}
-}
-
-int main(int argc, char* argv[]) {
-	assert( global.__mon.entry_queue.tail != NULL );
-	processor p;
-	{
-		MyThread f[4];
-	}
-	sout | global.value | endl;
-}
Index: tests/concurrent/monitor.cfa
===================================================================
--- tests/concurrent/monitor.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/concurrent/monitor.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,43 @@
+#include <fstream.hfa>
+#include <kernel.hfa>
+#include <monitor.hfa>
+#include <thread.hfa>
+
+monitor global_t {
+	int value;
+};
+
+void ?{}(global_t & this) {
+	this.value = 0;
+}
+
+static global_t global;
+
+void increment3( global_t & mutex this ) {
+	this.value += 1;
+}
+
+void increment2( global_t & mutex this ) {
+	increment3( this );
+}
+
+void increment( global_t & mutex this ) {
+	increment2( this );
+}
+
+thread MyThread {};
+
+void main( MyThread & this ) {
+	for(int i = 0; i < 1_000_000; i++) {
+		increment( global );
+	}
+}
+
+int main(int argc, char* argv[]) {
+	assert( global.__mon.entry_queue.tail != NULL );
+	processor p;
+	{
+		MyThread f[4];
+	}
+	sout | global.value;
+}
Index: sts/concurrent/multi-monitor.c
===================================================================
--- tests/concurrent/multi-monitor.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,55 +1,0 @@
-#include <fstream.hfa>
-#include <kernel.hfa>
-#include <monitor.hfa>
-#include <thread.hfa>
-
-static int global12, global23, global13;
-
-monitor monitor_t {};
-
-static monitor_t m1, m2, m3;
-
-void increment( monitor_t & mutex p1, monitor_t & mutex p2, int & value ) {
-	value += 1;
-}
-
-thread MyThread {
-	int target;
-};
-
-void ?{}( MyThread & this, int target ) {
-	this.target = target;
-}
-
-void ^?{}( MyThread & mutex this ) {}
-
-void main( MyThread & this ) {
-	for(int i = 0; i < 1000000; i++) {
-		choose(this.target) {
-			case 0: increment( m1, m2, global12 );
-			case 1: increment( m2, m3, global23 );
-			case 2: increment( m1, m3, global13 );
-		}
-	}
-}
-
-forall(dtype T | sized(T) | { void ^?{}(T & mutex); })
-void delete_mutex(T * x) {
-	^(*x){};
-	free(x);
-}
-
-int main(int argc, char* argv[]) {
-	processor p;
-	{
-		MyThread * f[6];
-		for(int i = 0; i < 6; i++) {
-			f[i] = new(i % 3);
-		}
-
-		for(int i = 0; i < 6; i++) {
-			delete_mutex( f[i] );
-		}
-	}
-	sout | global12 | global23 | global13 | endl;
-}
Index: tests/concurrent/multi-monitor.cfa
===================================================================
--- tests/concurrent/multi-monitor.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/concurrent/multi-monitor.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,55 @@
+#include <fstream.hfa>
+#include <kernel.hfa>
+#include <monitor.hfa>
+#include <thread.hfa>
+
+static int global12, global23, global13;
+
+monitor monitor_t {};
+
+static monitor_t m1, m2, m3;
+
+void increment( monitor_t & mutex p1, monitor_t & mutex p2, int & value ) {
+	value += 1;
+}
+
+thread MyThread {
+	int target;
+};
+
+void ?{}( MyThread & this, int target ) {
+	this.target = target;
+}
+
+void ^?{}( MyThread & mutex this ) {}
+
+void main( MyThread & this ) {
+	for(int i = 0; i < 1000000; i++) {
+		choose(this.target) {
+			case 0: increment( m1, m2, global12 );
+			case 1: increment( m2, m3, global23 );
+			case 2: increment( m1, m3, global13 );
+		}
+	}
+}
+
+forall(dtype T | sized(T) | { void ^?{}(T & mutex); })
+void delete_mutex(T * x) {
+	^(*x){};
+	free(x);
+}
+
+int main(int argc, char* argv[]) {
+	processor p;
+	{
+		MyThread * f[6];
+		for(int i = 0; i < 6; i++) {
+			f[i] = new(i % 3);
+		}
+
+		for(int i = 0; i < 6; i++) {
+			delete_mutex( f[i] );
+		}
+	}
+	sout | global12 | global23 | global13;
+}
Index: sts/concurrent/preempt.c
===================================================================
--- tests/concurrent/preempt.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,59 +1,0 @@
-#include <kernel.hfa>
-#include <thread.hfa>
-#include <time.hfa>
-
-#include "long_tests.hfa"
-
-#ifndef PREEMPTION_RATE
-#define PREEMPTION_RATE 10`ms
-#endif
-
-Duration default_preemption() {
-	return PREEMPTION_RATE;
-}
-
-#ifdef TEST_LONG
-static const unsigned long N = 30_000ul;
-#else
-static const unsigned long N = 500ul;
-#endif
-
-extern void __cfaabi_check_preemption();
-
-static volatile int counter = 0;
-
-thread worker_t {
-	int value;
-};
-
-void ?{}( worker_t & this, int value ) {
-	this.value = value;
-}
-
-void main(worker_t & this) {
-	while(TEST(counter < N)) {
-		__cfaabi_check_preemption();
-		if( (counter % 7) == this.value ) {
-			__cfaabi_check_preemption();
-			int next = __atomic_add_fetch_4(&counter, 1, __ATOMIC_SEQ_CST);
-			__cfaabi_check_preemption();
-			if( (next % 100) == 0 ) printf("%d\n", (int)next);
-			__cfaabi_check_preemption();
-		}
-		__cfaabi_check_preemption();
-		KICK_WATCHDOG;
-	}
-}
-
-int main(int argc, char* argv[]) {
-	processor p;
-	{
-		worker_t w0 = 0;
-		worker_t w1 = 1;
-		worker_t w2 = 2;
-		worker_t w3 = 3;
-		worker_t w4 = 4;
-		worker_t w5 = 5;
-		worker_t w6 = 6;
-	}
-}
Index: tests/concurrent/preempt.cfa
===================================================================
--- tests/concurrent/preempt.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/concurrent/preempt.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,59 @@
+#include <kernel.hfa>
+#include <thread.hfa>
+#include <time.hfa>
+
+#include "long_tests.hfa"
+
+#ifndef PREEMPTION_RATE
+#define PREEMPTION_RATE 10`ms
+#endif
+
+Duration default_preemption() {
+	return PREEMPTION_RATE;
+}
+
+#ifdef TEST_LONG
+static const unsigned long N = 30_000ul;
+#else
+static const unsigned long N = 500ul;
+#endif
+
+extern void __cfaabi_check_preemption();
+
+static volatile int counter = 0;
+
+thread worker_t {
+	int value;
+};
+
+void ?{}( worker_t & this, int value ) {
+	this.value = value;
+}
+
+void main(worker_t & this) {
+	while(TEST(counter < N)) {
+		__cfaabi_check_preemption();
+		if( (counter % 7) == this.value ) {
+			__cfaabi_check_preemption();
+			int next = __atomic_add_fetch_4(&counter, 1, __ATOMIC_SEQ_CST);
+			__cfaabi_check_preemption();
+			if( (next % 100) == 0 ) printf("%d\n", (int)next);
+			__cfaabi_check_preemption();
+		}
+		__cfaabi_check_preemption();
+		KICK_WATCHDOG;
+	}
+}
+
+int main(int argc, char* argv[]) {
+	processor p;
+	{
+		worker_t w0 = 0;
+		worker_t w1 = 1;
+		worker_t w2 = 2;
+		worker_t w3 = 3;
+		worker_t w4 = 4;
+		worker_t w5 = 5;
+		worker_t w6 = 6;
+	}
+}
Index: sts/concurrent/signal/block.c
===================================================================
--- tests/concurrent/signal/block.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,139 +1,0 @@
-//---------------------------------------------------------
-// Barging test
-// Ensures that no barging can occur between :
-//   - the frontend of the signal_block and the signaled thread
-//   - the signaled  threadand the backend of the signal_block
-//---------------------------------------------------------
-
-
-#include <fstream.hfa>
-#include <kernel.hfa>
-#include <monitor.hfa>
-#include <stdlib.hfa>
-#include <thread.hfa>
-#include <time.hfa>
-
-#include "long_tests.hfa"
-
-#ifndef PREEMPTION_RATE
-#define PREEMPTION_RATE 10`ms
-#endif
-
-Duration default_preemption() {
-	return PREEMPTION_RATE;
-}
-
-#ifdef TEST_LONG
-static const unsigned long N = 150_000ul;
-#else
-static const unsigned long N = 5_000ul;
-#endif
-
-enum state_t { WAITED, SIGNAL, BARGE };
-
-monitor global_data_t {
-	thread_desc * last_thread;
-	thread_desc * last_signaller;
-};
-
-void ?{} ( global_data_t & this ) {
-	this.last_thread = NULL;
-	this.last_signaller = NULL;
-}
-
-void ^?{} ( global_data_t & mutex this ) {}
-
-global_data_t globalA, globalB;
-
-condition cond;
-
-volatile bool done;
-
-//------------------------------------------------------------------------------
-void wait_op( global_data_t & mutex a, global_data_t & mutex b, unsigned i ) {
-    wait( cond, (uintptr_t)active_thread() );
-
-	yield( random( 10 ) );
-
-	if(a.last_thread != a.last_signaller || b.last_thread != b.last_signaller ) {
-		sout | "ERROR Barging detected, expected" | a.last_signaller | b.last_signaller | "got" | a.last_thread | b.last_thread | endl;
-		abort();
-	}
-
-	a.last_thread = b.last_thread = active_thread();
-
-	yield( random( 10 ) );
-}
-
-thread Waiter {};
-void main( Waiter & this ) {
-	for( int i = 0; TEST(i < N); i++ ) {
-		wait_op( globalA, globalB, i );
-		KICK_WATCHDOG;
-	}
-}
-
-//------------------------------------------------------------------------------
-void signal_op( global_data_t & mutex a, global_data_t & mutex b ) {
-	yield( random( 10 ) );
-
-	[a.last_thread, b.last_thread, a.last_signaller, b.last_signaller] = active_thread();
-
-	if( !is_empty( cond ) ) {
-
-		thread_desc * next = front( cond );
-
-		if( ! signal_block( cond ) ) {
-			sout | "ERROR expected to be able to signal" | endl;
-			abort();
-		}
-
-		yield( random( 10 ) );
-
-		if(a.last_thread != next || b.last_thread != next) {
-			sout | "ERROR Barging detected, expected" | next | "got" | a.last_thread | b.last_thread | endl;
-			abort();
-		}
-	}
-
-}
-
-thread Signaller {};
-void main( Signaller & this ) {
-	while( !done ) {
-		signal_op( globalA, globalB );
-	}
-}
-
-//------------------------------------------------------------------------------
-void barge_op( global_data_t & mutex a ) {
-	a.last_thread = active_thread();
-}
-
-thread Barger {};
-void main( Barger & this ) {
-	for( unsigned i = 0; !done; i++ ) {
-		//Choose some monitor to barge into with some irregular pattern
-		bool choose_a = (i % 13) > (i % 17);
-		if ( choose_a ) barge_op( globalA );
-		else barge_op( globalB );
-	}
-}
-
-//------------------------------------------------------------------------------
-
-int main(int argc, char* argv[]) {
-	srandom( time( NULL ) );
-	done = false;
-	processor p;
-	{
-		Signaller s[4];
-		Barger b[13];
-		sout | "Starting waiters" | endl;
-		{
-			Waiter w[3];
-		}
-		sout | "Waiters done" | endl;
-		done = true;
-	}
-}
Index: tests/concurrent/signal/block.cfa
===================================================================
--- tests/concurrent/signal/block.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/concurrent/signal/block.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,139 @@
+//---------------------------------------------------------
+// Barging test
+// Ensures that no barging can occur between :
+//   - the frontend of the signal_block and the signaled thread
+//   - the signaled  threadand the backend of the signal_block
+//---------------------------------------------------------
+
+
+#include <fstream.hfa>
+#include <kernel.hfa>
+#include <monitor.hfa>
+#include <stdlib.hfa>
+#include <thread.hfa>
+#include <time.hfa>
+
+#include "long_tests.hfa"
+
+#ifndef PREEMPTION_RATE
+#define PREEMPTION_RATE 10`ms
+#endif
+
+Duration default_preemption() {
+	return PREEMPTION_RATE;
+}
+
+#ifdef TEST_LONG
+static const unsigned long N = 150_000ul;
+#else
+static const unsigned long N = 5_000ul;
+#endif
+
+enum state_t { WAITED, SIGNAL, BARGE };
+
+monitor global_data_t {
+	thread_desc * last_thread;
+	thread_desc * last_signaller;
+};
+
+void ?{} ( global_data_t & this ) {
+	this.last_thread = NULL;
+	this.last_signaller = NULL;
+}
+
+void ^?{} ( global_data_t & mutex this ) {}
+
+global_data_t globalA, globalB;
+
+condition cond;
+
+volatile bool done;
+
+//------------------------------------------------------------------------------
+void wait_op( global_data_t & mutex a, global_data_t & mutex b, unsigned i ) {
+    wait( cond, (uintptr_t)active_thread() );
+
+	yield( random( 10 ) );
+
+	if(a.last_thread != a.last_signaller || b.last_thread != b.last_signaller ) {
+		sout | "ERROR Barging detected, expected" | a.last_signaller | b.last_signaller | "got" | a.last_thread | b.last_thread;
+		abort();
+	}
+
+	a.last_thread = b.last_thread = active_thread();
+
+	yield( random( 10 ) );
+}
+
+thread Waiter {};
+void main( Waiter & this ) {
+	for( int i = 0; TEST(i < N); i++ ) {
+		wait_op( globalA, globalB, i );
+		KICK_WATCHDOG;
+	}
+}
+
+//------------------------------------------------------------------------------
+void signal_op( global_data_t & mutex a, global_data_t & mutex b ) {
+	yield( random( 10 ) );
+
+	[a.last_thread, b.last_thread, a.last_signaller, b.last_signaller] = active_thread();
+
+	if( !is_empty( cond ) ) {
+
+		thread_desc * next = front( cond );
+
+		if( ! signal_block( cond ) ) {
+			sout | "ERROR expected to be able to signal";
+			abort();
+		}
+
+		yield( random( 10 ) );
+
+		if(a.last_thread != next || b.last_thread != next) {
+			sout | "ERROR Barging detected, expected" | next | "got" | a.last_thread | b.last_thread;
+			abort();
+		}
+	}
+
+}
+
+thread Signaller {};
+void main( Signaller & this ) {
+	while( !done ) {
+		signal_op( globalA, globalB );
+	}
+}
+
+//------------------------------------------------------------------------------
+void barge_op( global_data_t & mutex a ) {
+	a.last_thread = active_thread();
+}
+
+thread Barger {};
+void main( Barger & this ) {
+	for( unsigned i = 0; !done; i++ ) {
+		//Choose some monitor to barge into with some irregular pattern
+		bool choose_a = (i % 13) > (i % 17);
+		if ( choose_a ) barge_op( globalA );
+		else barge_op( globalB );
+	}
+}
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char* argv[]) {
+	srandom( time( NULL ) );
+	done = false;
+	processor p;
+	{
+		Signaller s[4];
+		Barger b[13];
+		sout | "Starting waiters";
+		{
+			Waiter w[3];
+		}
+		sout | "Waiters done";
+		done = true;
+	}
+}
Index: sts/concurrent/signal/disjoint.c
===================================================================
--- tests/concurrent/signal/disjoint.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,129 +1,0 @@
-#include <fstream.hfa>
-#include <kernel.hfa>
-#include <monitor.hfa>
-#include <thread.hfa>
-#include <time.hfa>
-
-#include "long_tests.hfa"
-
-#ifndef PREEMPTION_RATE
-#define PREEMPTION_RATE 10`ms
-#endif
-
-Duration default_preemption() {
-	return PREEMPTION_RATE;
-}
-
-#ifdef TEST_LONG
-static const unsigned long N = 300_000ul;
-#else
-static const unsigned long N = 10_000ul;
-#endif
-
-enum state_t { WAIT, SIGNAL, BARGE };
-
-monitor global_t {};
-global_t mut;
-
-monitor global_data_t;
-void ?{}( global_data_t & this );
-void ^?{} ( global_data_t & mutex this );
-
-monitor global_data_t {
-	int counter;
-	state_t state;
-} data;
-
-condition cond;
-
-volatile bool all_done;
-
-void ?{}( global_data_t & this ) {
-	this.counter == 0;
-	this.state = BARGE;
-}
-
-void ^?{} ( global_data_t & mutex this ) {}
-
-//------------------------------------------------------------------------------
-// Barging logic
-void barge( global_data_t & mutex d ) {
-	d.state = BARGE;
-}
-
-thread Barger {};
-
-void main( Barger & this ) {
-	while( !all_done ) {
-		barge( data );
-		yield();
-	}
-}
-
-//------------------------------------------------------------------------------
-// Waiting logic
-bool wait( global_t & mutex m, global_data_t & mutex d ) {
-	wait( cond );
-	if( d.state != SIGNAL ) {
-		sout | "ERROR barging!" | endl;
-	}
-
-	#if !defined(TEST_FOREVER)
-		d.counter++;
-		if( (d.counter % 1000) == 0 ) sout | d.counter | endl;
-	#endif
-
-	return TEST(d.counter < N);
-}
-
-thread Waiter {};
-
-void main( Waiter & this ) {
-	while( wait( mut, data ) ) { KICK_WATCHDOG; yield(); }
-}
-
-
-//------------------------------------------------------------------------------
-// Signalling logic
-void signal( condition & cond, global_t & mutex a, global_data_t & mutex b ) {
-	b.state = SIGNAL;
-	signal( cond );
-}
-
-void logic( global_t & mutex a ) {
-	signal( cond, a, data );
-
-	yield( random( 10 ) );
-
-	//This is technically a mutual exclusion violation but the mutex monitor protects us
-	bool running = TEST(data.counter < N) && data.counter > 0;
-	if( data.state != SIGNAL && running ) {
-		sout | "ERROR Eager signal" | data.state | endl;
-	}
-}
-
-thread Signaller {};
-
-void main( Signaller & this ) {
-	while( !all_done ) {
-		logic( mut );
-		yield();
-	}
-}
-
-//------------------------------------------------------------------------------
-// Main loop
-int main(int argc, char* argv[]) {
-	srandom( time( NULL ) );
-	all_done = false;
-	processor p;
-	{
-		Signaller s;
-		Barger b[17];
-		{
-			Waiter w[4];
-		}
-		sout | "All waiter done" | endl;
-		all_done = true;
-	}
-}
Index: tests/concurrent/signal/disjoint.cfa
===================================================================
--- tests/concurrent/signal/disjoint.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/concurrent/signal/disjoint.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,129 @@
+#include <fstream.hfa>
+#include <kernel.hfa>
+#include <monitor.hfa>
+#include <thread.hfa>
+#include <time.hfa>
+
+#include "long_tests.hfa"
+
+#ifndef PREEMPTION_RATE
+#define PREEMPTION_RATE 10`ms
+#endif
+
+Duration default_preemption() {
+	return PREEMPTION_RATE;
+}
+
+#ifdef TEST_LONG
+static const unsigned long N = 300_000ul;
+#else
+static const unsigned long N = 10_000ul;
+#endif
+
+enum state_t { WAIT, SIGNAL, BARGE };
+
+monitor global_t {};
+global_t mut;
+
+monitor global_data_t;
+void ?{}( global_data_t & this );
+void ^?{} ( global_data_t & mutex this );
+
+monitor global_data_t {
+	int counter;
+	state_t state;
+} data;
+
+condition cond;
+
+volatile bool all_done;
+
+void ?{}( global_data_t & this ) {
+	this.counter == 0;
+	this.state = BARGE;
+}
+
+void ^?{} ( global_data_t & mutex this ) {}
+
+//------------------------------------------------------------------------------
+// Barging logic
+void barge( global_data_t & mutex d ) {
+	d.state = BARGE;
+}
+
+thread Barger {};
+
+void main( Barger & this ) {
+	while( !all_done ) {
+		barge( data );
+		yield();
+	}
+}
+
+//------------------------------------------------------------------------------
+// Waiting logic
+bool wait( global_t & mutex m, global_data_t & mutex d ) {
+	wait( cond );
+	if( d.state != SIGNAL ) {
+		sout | "ERROR barging!";
+	}
+
+	#if !defined(TEST_FOREVER)
+		d.counter++;
+		if( (d.counter % 1000) == 0 ) sout | d.counter;
+	#endif
+
+	return TEST(d.counter < N);
+}
+
+thread Waiter {};
+
+void main( Waiter & this ) {
+	while( wait( mut, data ) ) { KICK_WATCHDOG; yield(); }
+}
+
+
+//------------------------------------------------------------------------------
+// Signalling logic
+void signal( condition & cond, global_t & mutex a, global_data_t & mutex b ) {
+	b.state = SIGNAL;
+	signal( cond );
+}
+
+void logic( global_t & mutex a ) {
+	signal( cond, a, data );
+
+	yield( random( 10 ) );
+
+	//This is technically a mutual exclusion violation but the mutex monitor protects us
+	bool running = TEST(data.counter < N) && data.counter > 0;
+	if( data.state != SIGNAL && running ) {
+		sout | "ERROR Eager signal" | data.state;
+	}
+}
+
+thread Signaller {};
+
+void main( Signaller & this ) {
+	while( !all_done ) {
+		logic( mut );
+		yield();
+	}
+}
+
+//------------------------------------------------------------------------------
+// Main loop
+int main(int argc, char* argv[]) {
+	srandom( time( NULL ) );
+	all_done = false;
+	processor p;
+	{
+		Signaller s;
+		Barger b[17];
+		{
+			Waiter w[4];
+		}
+		sout | "All waiter done";
+		all_done = true;
+	}
+}
Index: sts/concurrent/signal/wait.c
===================================================================
--- tests/concurrent/signal/wait.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,153 +1,0 @@
-//---------------------------------------------------------
-// Multi wait test
-// Ensures that no deadlock from waiting/signalling conditions
-//---------------------------------------------------------
-
-
-#include <fstream.hfa>
-#include <kernel.hfa>
-#include <monitor.hfa>
-#include <stdlib.hfa>
-#include <thread.hfa>
-#include <time.hfa>
-
-#define __kick_rate 12000ul
-#include "long_tests.hfa"
-
-#ifndef PREEMPTION_RATE
-#define PREEMPTION_RATE 10`ms
-#endif
-
-Duration default_preemption() {
-	return PREEMPTION_RATE;
-}
-
-#ifdef TEST_LONG
-static const unsigned long N = 375_000ul;
-#else
-static const unsigned long N = 2_500ul;
-#endif
-
-monitor global_t {};
-
-global_t globalA;
-global_t globalB;
-global_t globalC;
-
-condition condAB, condAC, condBC, condABC;
-
-thread Signaler {};
-thread WaiterAB {};
-thread WaiterAC {};
-thread WaiterBC {};
-thread WaiterABC{};
-
-volatile int waiter_left;
-
-//----------------------------------------------------------------------------------------------------
-// Tools
-void signal( condition & cond, global_t & mutex a, global_t & mutex b ) {
-	signal( cond );
-}
-
-void signal( condition & cond, global_t & mutex a, global_t & mutex b, global_t & mutex c ) {
-	signal( cond );
-}
-
-void wait( condition & cond, global_t & mutex a, global_t & mutex b ) {
-	wait( cond );
-}
-
-void wait( condition & cond, global_t & mutex a, global_t & mutex b, global_t & mutex c ) {
-	wait( cond );
-}
-
-//----------------------------------------------------------------------------------------------------
-// Signaler
-void main( Signaler & this ) {
-
-	while( waiter_left != 0 ) {
-		unsigned action = random( 4 );
-		switch( action ) {
-			case 0:
-				signal( condABC, globalA, globalB, globalC );
-				break;
-			case 1:
-				signal( condAB , globalA, globalB );
-				break;
-			case 2:
-				signal( condBC , globalB, globalC );
-				break;
-			case 3:
-				signal( condAC , globalA, globalC );
-				break;
-			default:
-				sout | "Something went wrong" | endl;
-				abort();
-		}
-		yield();
-	}
-}
-
-//----------------------------------------------------------------------------------------------------
-// Waiter ABC
-void main( WaiterABC & this ) {
-	for( int i = 0; TEST(i < N); i++ ) {
-		wait( condABC, globalA, globalB, globalC );
-		KICK_WATCHDOG;
-	}
-
-	__sync_fetch_and_sub_4( &waiter_left, 1);
-}
-
-//----------------------------------------------------------------------------------------------------
-// Waiter AB
-void main( WaiterAB & this ) {
-	for( int i = 0; TEST(i < N); i++ ) {
-		wait( condAB , globalA, globalB );
-		KICK_WATCHDOG;
-	}
-
-	__sync_fetch_and_sub_4( &waiter_left, 1);
-}
-
-//----------------------------------------------------------------------------------------------------
-// Waiter AC
-void main( WaiterAC & this ) {
-	for( int i = 0; TEST(i < N); i++ ) {
-		wait( condAC , globalA, globalC );
-		KICK_WATCHDOG;
-	}
-
-	__sync_fetch_and_sub_4( &waiter_left, 1);
-}
-
-//----------------------------------------------------------------------------------------------------
-// Waiter BC
-void main( WaiterBC & this ) {
-	for( int i = 0; TEST(i < N); i++ ) {
-		wait( condBC , globalB, globalC );
-		KICK_WATCHDOG;
-	}
-
-	__sync_fetch_and_sub_4( &waiter_left, 1);
-}
-
-//----------------------------------------------------------------------------------------------------
-// Main
-int main(int argc, char* argv[]) {
-	srandom( time( NULL ) );
-	waiter_left = 4;
-	processor p[2];
-	sout | "Starting" | endl;
-	{
-		Signaler  e;
-		{
-			WaiterABC a;
-			WaiterAB  b;
-			WaiterBC  c;
-			WaiterAC  d;
-		}
-	}
-	sout | "Done" | endl;
-}
Index: tests/concurrent/signal/wait.cfa
===================================================================
--- tests/concurrent/signal/wait.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/concurrent/signal/wait.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,153 @@
+//---------------------------------------------------------
+// Multi wait test
+// Ensures that no deadlock from waiting/signalling conditions
+//---------------------------------------------------------
+
+
+#include <fstream.hfa>
+#include <kernel.hfa>
+#include <monitor.hfa>
+#include <stdlib.hfa>
+#include <thread.hfa>
+#include <time.hfa>
+
+#define __kick_rate 12000ul
+#include "long_tests.hfa"
+
+#ifndef PREEMPTION_RATE
+#define PREEMPTION_RATE 10`ms
+#endif
+
+Duration default_preemption() {
+	return PREEMPTION_RATE;
+}
+
+#ifdef TEST_LONG
+static const unsigned long N = 375_000ul;
+#else
+static const unsigned long N = 2_500ul;
+#endif
+
+monitor global_t {};
+
+global_t globalA;
+global_t globalB;
+global_t globalC;
+
+condition condAB, condAC, condBC, condABC;
+
+thread Signaler {};
+thread WaiterAB {};
+thread WaiterAC {};
+thread WaiterBC {};
+thread WaiterABC{};
+
+volatile int waiter_left;
+
+//----------------------------------------------------------------------------------------------------
+// Tools
+void signal( condition & cond, global_t & mutex a, global_t & mutex b ) {
+	signal( cond );
+}
+
+void signal( condition & cond, global_t & mutex a, global_t & mutex b, global_t & mutex c ) {
+	signal( cond );
+}
+
+void wait( condition & cond, global_t & mutex a, global_t & mutex b ) {
+	wait( cond );
+}
+
+void wait( condition & cond, global_t & mutex a, global_t & mutex b, global_t & mutex c ) {
+	wait( cond );
+}
+
+//----------------------------------------------------------------------------------------------------
+// Signaler
+void main( Signaler & this ) {
+
+	while( waiter_left != 0 ) {
+		unsigned action = random( 4 );
+		switch( action ) {
+			case 0:
+				signal( condABC, globalA, globalB, globalC );
+				break;
+			case 1:
+				signal( condAB , globalA, globalB );
+				break;
+			case 2:
+				signal( condBC , globalB, globalC );
+				break;
+			case 3:
+				signal( condAC , globalA, globalC );
+				break;
+			default:
+				sout | "Something went wrong";
+				abort();
+		}
+		yield();
+	}
+}
+
+//----------------------------------------------------------------------------------------------------
+// Waiter ABC
+void main( WaiterABC & this ) {
+	for( int i = 0; TEST(i < N); i++ ) {
+		wait( condABC, globalA, globalB, globalC );
+		KICK_WATCHDOG;
+	}
+
+	__sync_fetch_and_sub_4( &waiter_left, 1);
+}
+
+//----------------------------------------------------------------------------------------------------
+// Waiter AB
+void main( WaiterAB & this ) {
+	for( int i = 0; TEST(i < N); i++ ) {
+		wait( condAB , globalA, globalB );
+		KICK_WATCHDOG;
+	}
+
+	__sync_fetch_and_sub_4( &waiter_left, 1);
+}
+
+//----------------------------------------------------------------------------------------------------
+// Waiter AC
+void main( WaiterAC & this ) {
+	for( int i = 0; TEST(i < N); i++ ) {
+		wait( condAC , globalA, globalC );
+		KICK_WATCHDOG;
+	}
+
+	__sync_fetch_and_sub_4( &waiter_left, 1);
+}
+
+//----------------------------------------------------------------------------------------------------
+// Waiter BC
+void main( WaiterBC & this ) {
+	for( int i = 0; TEST(i < N); i++ ) {
+		wait( condBC , globalB, globalC );
+		KICK_WATCHDOG;
+	}
+
+	__sync_fetch_and_sub_4( &waiter_left, 1);
+}
+
+//----------------------------------------------------------------------------------------------------
+// Main
+int main(int argc, char* argv[]) {
+	srandom( time( NULL ) );
+	waiter_left = 4;
+	processor p[2];
+	sout | "Starting";
+	{
+		Signaler  e;
+		{
+			WaiterABC a;
+			WaiterAB  b;
+			WaiterBC  c;
+			WaiterAC  d;
+		}
+	}
+	sout | "Done";
+}
Index: sts/concurrent/thread.c
===================================================================
--- tests/concurrent/thread.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,40 +1,0 @@
-#include <fstream.hfa>
-#include <kernel.hfa>
-#include <stdlib.hfa>
-#include <thread.hfa>
-
-thread First  { semaphore* lock; };
-thread Second { semaphore* lock; };
-
-void ?{}( First  & this, semaphore & lock ) { ((thread&)this){"Thread 1"}; this.lock = &lock; }
-void ?{}( Second & this, semaphore & lock ) { ((thread&)this){"Thread 2"}; this.lock = &lock; }
-
-void main(First& this) {
-	for(int i = 0; i < 10; i++) {
-		sout | "First : Suspend No." | i + 1 | endl;
-		yield();
-	}
-	V(*this.lock);
-}
-
-void main(Second& this) {
-	P(*this.lock);
-	for(int i = 0; i < 10; i++) {
-		sout | "Second : Suspend No." | i + 1 | endl;
-		yield();
-	}
-}
-
-
-int main(int argc, char* argv[]) {
-	semaphore lock = { 0 };
-	sout | "User main begin" | endl;
-	{
-		processor p;
-		{
-			First  f = { lock };
-			Second s = { lock };
-		}
-	}
-	sout | "User main end" | endl;
-}
Index: tests/concurrent/thread.cfa
===================================================================
--- tests/concurrent/thread.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/concurrent/thread.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,40 @@
+#include <fstream.hfa>
+#include <kernel.hfa>
+#include <stdlib.hfa>
+#include <thread.hfa>
+
+thread First  { semaphore* lock; };
+thread Second { semaphore* lock; };
+
+void ?{}( First  & this, semaphore & lock ) { ((thread&)this){"Thread 1"}; this.lock = &lock; }
+void ?{}( Second & this, semaphore & lock ) { ((thread&)this){"Thread 2"}; this.lock = &lock; }
+
+void main(First& this) {
+	for(int i = 0; i < 10; i++) {
+		sout | "First : Suspend No." | i + 1;
+		yield();
+	}
+	V(*this.lock);
+}
+
+void main(Second& this) {
+	P(*this.lock);
+	for(int i = 0; i < 10; i++) {
+		sout | "Second : Suspend No." | i + 1;
+		yield();
+	}
+}
+
+
+int main(int argc, char* argv[]) {
+	semaphore lock = { 0 };
+	sout | "User main begin";
+	{
+		processor p;
+		{
+			First  f = { lock };
+			Second s = { lock };
+		}
+	}
+	sout | "User main end";
+}
Index: sts/concurrent/waitfor/barge.c
===================================================================
--- tests/concurrent/waitfor/barge.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,92 +1,0 @@
-//---------------------------------------------------------
-// Barging test
-// Ensures that no barging can occur between :
-//   - the frontend of the waitfor and the waited call
-//   - the waited call and the backend of the waitfor
-//---------------------------------------------------------
-
-#include <fstream.hfa>
-#include <kernel.hfa>
-#include <monitor.hfa>
-#include <stdlib.hfa>
-#include <thread.hfa>
-
-#include <stdbool.h>
-
-static const unsigned long N = 5_000ul;
-
-enum state_t { WAITFOR, CALL, BARGE };
-
-monitor global_t {
-	bool done;
-	bool started;
-	state_t state;
-};
-
-void ?{} ( global_t & this ) {
-	this.done = false;
-	this.started = false;
-	this.state = BARGE;
-}
-
-void ^?{} ( global_t & mutex this ) {}
-
-global_t global;
-
-bool barge( global_t & mutex this ) {
-	this.state = BARGE;
-	return !this.done;
-}
-
-thread barger_t {};
-void main( barger_t & this ) {
-	yield();
-	while( barge( global ) ) { yield(random( 10 )); }
-}
-
-bool do_call( global_t & mutex this ) {
-	yield(random( 10 ));
-	if( this.state != WAITFOR && !this.done && this.started ) {
-		serr | "Barging before caller detected" | endl;
-	}
-
-	this.state = CALL;
-	return !this.done;
-}
-
-thread caller_t {};
-void main( caller_t & this ) {
-	while( do_call(global) ) { yield(random( 10 )); }
-}
-
-void do_wait( global_t & mutex this ) {
-	this.started = true;
-	for( int i = 0; i < N; i++) {
-		yield(random( 10 ));
-		this.state = WAITFOR;
-		waitfor(do_call, this) {
-			sout | i | endl;
-		}
-
-		if( this.state != CALL ) {
-			serr | "Barging after caller detected" | endl;
-		}
-	}
-
-	this.done = true;
-}
-
-thread waiter_t{};
-void main( waiter_t & this ) {
-	do_wait(global);
-}
-
-int main() {
-	sout | "Starting" | endl;
-	{
-		barger_t bargers[17];
-		caller_t callers[7];
-		waiter_t waiters;
-	}
-	sout | "Stopping" | endl;
-}
Index: tests/concurrent/waitfor/barge.cfa
===================================================================
--- tests/concurrent/waitfor/barge.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/concurrent/waitfor/barge.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,92 @@
+//---------------------------------------------------------
+// Barging test
+// Ensures that no barging can occur between :
+//   - the frontend of the waitfor and the waited call
+//   - the waited call and the backend of the waitfor
+//---------------------------------------------------------
+
+#include <fstream.hfa>
+#include <kernel.hfa>
+#include <monitor.hfa>
+#include <stdlib.hfa>
+#include <thread.hfa>
+
+#include <stdbool.h>
+
+static const unsigned long N = 5_000ul;
+
+enum state_t { WAITFOR, CALL, BARGE };
+
+monitor global_t {
+	bool done;
+	bool started;
+	state_t state;
+};
+
+void ?{} ( global_t & this ) {
+	this.done = false;
+	this.started = false;
+	this.state = BARGE;
+}
+
+void ^?{} ( global_t & mutex this ) {}
+
+global_t global;
+
+bool barge( global_t & mutex this ) {
+	this.state = BARGE;
+	return !this.done;
+}
+
+thread barger_t {};
+void main( barger_t & this ) {
+	yield();
+	while( barge( global ) ) { yield(random( 10 )); }
+}
+
+bool do_call( global_t & mutex this ) {
+	yield(random( 10 ));
+	if( this.state != WAITFOR && !this.done && this.started ) {
+		serr | "Barging before caller detected";
+	}
+
+	this.state = CALL;
+	return !this.done;
+}
+
+thread caller_t {};
+void main( caller_t & this ) {
+	while( do_call(global) ) { yield(random( 10 )); }
+}
+
+void do_wait( global_t & mutex this ) {
+	this.started = true;
+	for( int i = 0; i < N; i++) {
+		yield(random( 10 ));
+		this.state = WAITFOR;
+		waitfor(do_call, this) {
+			sout | i;
+		}
+
+		if( this.state != CALL ) {
+			serr | "Barging after caller detected";
+		}
+	}
+
+	this.done = true;
+}
+
+thread waiter_t{};
+void main( waiter_t & this ) {
+	do_wait(global);
+}
+
+int main() {
+	sout | "Starting";
+	{
+		barger_t bargers[17];
+		caller_t callers[7];
+		waiter_t waiters;
+	}
+	sout | "Stopping";
+}
Index: sts/concurrent/waitfor/dtor.c
===================================================================
--- tests/concurrent/waitfor/dtor.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,63 +1,0 @@
-//---------------------------------------------------------
-// Barging test
-// Ensures the statement order is reverse when using waitfor ^?{}
-//---------------------------------------------------------
-
-#include <fstream.hfa>
-#include <kernel.hfa>
-#include <monitor.hfa>
-#include <stdlib.hfa>
-#include <thread.hfa>
-
-#include <stdbool.h>
-
-static const unsigned long N = 5_000ul;
-
-enum state_t {
-	CTOR,
-	MAIN,
-	AFTER,
-	END,
-	DTOR
-};
-
-thread dummy_t {
-	state_t state;
-};
-
-static inline void set_state( dummy_t & this, state_t state) {
-	switch(state) {
-		case CTOR  : break;
-		case MAIN  : if( this.state != CTOR  ) { serr | "ERROR Expected state to be CTOR"  | endl; abort(); } this.state = state; break;
-		case AFTER : if( this.state != MAIN  ) { serr | "ERROR Expected state to be MAIN"  | endl; abort(); } this.state = state; break;
-		case END   : if( this.state != AFTER ) { serr | "ERROR Expected state to be AFTER" | endl; abort(); } this.state = state; break;
-		case DTOR  : if( this.state != END   ) { serr | "ERROR Expected state to be END"   | endl; abort(); } this.state = state; break;
-	}
-}
-
-void ^?{}( dummy_t & mutex this ) {
-	set_state( this, DTOR );
-}
-
-void ?{}( dummy_t & this ) {
-	this.state = CTOR;
-}
-
-void main( dummy_t & this ) {
-	yield(random( 10 ));
-	set_state( this, MAIN );
-	waitfor( ^?{}, this ) {
-		set_state( this, AFTER );
-	}
-	set_state( this, END );
-}
-
-int main() {
-	sout | "Starting" | endl;
-	processor p;
-	for( int i = 0; i < N; i++ ){
-		dummy_t dummy[4];
-		yield( random( 100 ) );
-	}
-	sout | "Stopping" | endl;
-}
Index: tests/concurrent/waitfor/dtor.cfa
===================================================================
--- tests/concurrent/waitfor/dtor.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/concurrent/waitfor/dtor.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,63 @@
+//---------------------------------------------------------
+// Barging test
+// Ensures the statement order is reverse when using waitfor ^?{}
+//---------------------------------------------------------
+
+#include <fstream.hfa>
+#include <kernel.hfa>
+#include <monitor.hfa>
+#include <stdlib.hfa>
+#include <thread.hfa>
+
+#include <stdbool.h>
+
+static const unsigned long N = 5_000ul;
+
+enum state_t {
+	CTOR,
+	MAIN,
+	AFTER,
+	END,
+	DTOR
+};
+
+thread dummy_t {
+	state_t state;
+};
+
+static inline void set_state( dummy_t & this, state_t state) {
+	switch(state) {
+		case CTOR  : break;
+		case MAIN  : if( this.state != CTOR  ) { serr | "ERROR Expected state to be CTOR" ; abort(); } this.state = state; break;
+		case AFTER : if( this.state != MAIN  ) { serr | "ERROR Expected state to be MAIN" ; abort(); } this.state = state; break;
+		case END   : if( this.state != AFTER ) { serr | "ERROR Expected state to be AFTER"; abort(); } this.state = state; break;
+		case DTOR  : if( this.state != END   ) { serr | "ERROR Expected state to be END"  ; abort(); } this.state = state; break;
+	}
+}
+
+void ^?{}( dummy_t & mutex this ) {
+	set_state( this, DTOR );
+}
+
+void ?{}( dummy_t & this ) {
+	this.state = CTOR;
+}
+
+void main( dummy_t & this ) {
+	yield(random( 10 ));
+	set_state( this, MAIN );
+	waitfor( ^?{}, this ) {
+		set_state( this, AFTER );
+	}
+	set_state( this, END );
+}
+
+int main() {
+	sout | "Starting";
+	processor p;
+	for( int i = 0; i < N; i++ ){
+		dummy_t dummy[4];
+		yield( random( 100 ) );
+	}
+	sout | "Stopping";
+}
Index: sts/concurrent/waitfor/else.c
===================================================================
--- tests/concurrent/waitfor/else.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,48 +1,0 @@
-#include <fstream.hfa>
-#include <monitor.hfa>
-
-#include <stdbool.h>
-
-monitor M {};
-
-void notcalled( M & mutex m ) {
-	abort();
-}
-
-void test( M & mutex m ) {
-	int i = 0;
-	sout | "Starting" | endl;
-
-	when( false ) waitfor( notcalled, m );
-
-	sout | "Step" | i++ | endl;
-
-	waitfor( notcalled, m ); or else {
-		sout | "else called" | endl;
-	}
-
-	sout | "Step" | i++ | endl;
-
-	when( true ) waitfor( notcalled, m ); or when( true ) else {
-		sout | "else called" | endl;
-	}
-
-	sout | "Step" | i++ | endl;
-
-	when( false ) waitfor( notcalled, m ); or when( true ) else {
-		sout | "else called" | endl;
-	}
-
-	sout | "Step" | i++ | endl;
-
-	when( false ) waitfor( notcalled, m ); or when( false ) else {
-		sout | "else called" | endl;
-	}
-
-	sout | "Done" | endl;
-}
-
-int main() {
-	M m;
-	test(m);
-}
Index: tests/concurrent/waitfor/else.cfa
===================================================================
--- tests/concurrent/waitfor/else.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/concurrent/waitfor/else.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,48 @@
+#include <fstream.hfa>
+#include <monitor.hfa>
+
+#include <stdbool.h>
+
+monitor M {};
+
+void notcalled( M & mutex m ) {
+	abort();
+}
+
+void test( M & mutex m ) {
+	int i = 0;
+	sout | "Starting";
+
+	when( false ) waitfor( notcalled, m );
+
+	sout | "Step" | i++;
+
+	waitfor( notcalled, m ); or else {
+		sout | "else called";
+	}
+
+	sout | "Step" | i++;
+
+	when( true ) waitfor( notcalled, m ); or when( true ) else {
+		sout | "else called";
+	}
+
+	sout | "Step" | i++;
+
+	when( false ) waitfor( notcalled, m ); or when( true ) else {
+		sout | "else called";
+	}
+
+	sout | "Step" | i++;
+
+	when( false ) waitfor( notcalled, m ); or when( false ) else {
+		sout | "else called";
+	}
+
+	sout | "Done";
+}
+
+int main() {
+	M m;
+	test(m);
+}
Index: sts/concurrent/waitfor/parse.c
===================================================================
--- tests/concurrent/waitfor/parse.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,104 +1,0 @@
-//----------------------------------------------------------------------------------------
-//----------------------------------------------------------------------------------------
-//
-//		DEPRECATED TEST
-//		DIFFERS BETWEEN DEBUG AND RELEASE
-//
-//----------------------------------------------------------------------------------------
-//----------------------------------------------------------------------------------------
-
-#include <monitor.hfa>
-
-monitor M {};
-
-M a;
-
-void f1( M & mutex a );
-void f2( M & mutex a );
-void f2( M & mutex a, M & mutex b );
-void f3( M & mutex a );
-void f3( M & mutex a, M & mutex b );
-void f3( M & mutex a, M & mutex b, M & mutex c );
-
-void foo() {
-
-	//---------------------------------------
-	waitfor( f1, a ) {
-		1;
-	}
-
-	//---------------------------------------
-	waitfor( f1, a ) {
-		2;
-	}
-	waitfor( f2, a ) {
-		3;
-	}
-
-	//---------------------------------------
-	when( 1 < 3 ) waitfor( f2, a, a ) {
-		4;
-	}
-	or timeout( 100 ) {
-		5;
-	}
-
-	//---------------------------------------
-	when( 2 < 3 ) waitfor( f3, a ) {
-		5;
-	}
-	or else {
-		6;
-	}
-
-	//---------------------------------------
-	when( 3 < 3 ) waitfor( f3, a, a ) {
-		7;
-	}
-	or when( 4 < 3 ) timeout( 101 ) {
-		8;
-	}
-	or when( 5 < 3 ) else {
-		9;
-	}
-
-	//---------------------------------------
-	when( 6 < 3 ) waitfor( f3, a, a, a ) {
-		10;
-	}
- 	or when( 7 < 3 ) waitfor( f1, a  ) {
-		11;
-	}
-	or else {
-		12;
-	}
-
-	//---------------------------------------
-	when( 8 < 3 ) waitfor( f3, a, a ) {
-		13;
-	}
- 	or waitfor( f1, a  ) {
-		14;
-	}
-	or when( 9 < 3 ) timeout( 102 ) {
-		15;
-	}
-
-	//---------------------------------------
-	when( 10 < 3 ) waitfor( f1, a ) {
-		16;
-	}
- 	or waitfor( f2, a, a ) {
-		17;
-	}
-	or timeout( 103 ) {
-		18;
-	}
-	or when( 11 < 3 ) else {
-		19;
-	}
-}
-
-int main() {
-
-}
Index: tests/concurrent/waitfor/parse.cfa
===================================================================
--- tests/concurrent/waitfor/parse.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/concurrent/waitfor/parse.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,104 @@
+//----------------------------------------------------------------------------------------
+//----------------------------------------------------------------------------------------
+//
+//		DEPRECATED TEST
+//		DIFFERS BETWEEN DEBUG AND RELEASE
+//
+//----------------------------------------------------------------------------------------
+//----------------------------------------------------------------------------------------
+
+#include <monitor.hfa>
+
+monitor M {};
+
+M a;
+
+void f1( M & mutex a );
+void f2( M & mutex a );
+void f2( M & mutex a, M & mutex b );
+void f3( M & mutex a );
+void f3( M & mutex a, M & mutex b );
+void f3( M & mutex a, M & mutex b, M & mutex c );
+
+void foo() {
+
+	//---------------------------------------
+	waitfor( f1, a ) {
+		1;
+	}
+
+	//---------------------------------------
+	waitfor( f1, a ) {
+		2;
+	}
+	waitfor( f2, a ) {
+		3;
+	}
+
+	//---------------------------------------
+	when( 1 < 3 ) waitfor( f2, a, a ) {
+		4;
+	}
+	or timeout( 100 ) {
+		5;
+	}
+
+	//---------------------------------------
+	when( 2 < 3 ) waitfor( f3, a ) {
+		5;
+	}
+	or else {
+		6;
+	}
+
+	//---------------------------------------
+	when( 3 < 3 ) waitfor( f3, a, a ) {
+		7;
+	}
+	or when( 4 < 3 ) timeout( 101 ) {
+		8;
+	}
+	or when( 5 < 3 ) else {
+		9;
+	}
+
+	//---------------------------------------
+	when( 6 < 3 ) waitfor( f3, a, a, a ) {
+		10;
+	}
+ 	or when( 7 < 3 ) waitfor( f1, a  ) {
+		11;
+	}
+	or else {
+		12;
+	}
+
+	//---------------------------------------
+	when( 8 < 3 ) waitfor( f3, a, a ) {
+		13;
+	}
+ 	or waitfor( f1, a  ) {
+		14;
+	}
+	or when( 9 < 3 ) timeout( 102 ) {
+		15;
+	}
+
+	//---------------------------------------
+	when( 10 < 3 ) waitfor( f1, a ) {
+		16;
+	}
+ 	or waitfor( f2, a, a ) {
+		17;
+	}
+	or timeout( 103 ) {
+		18;
+	}
+	or when( 11 < 3 ) else {
+		19;
+	}
+}
+
+int main() {
+
+}
Index: sts/concurrent/waitfor/parse2.c
===================================================================
--- tests/concurrent/waitfor/parse2.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,249 +1,0 @@
-// 
-// 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.
-// 
-// waitfor.c -- 
-// 
-// Author           : Peter A. Buhr
-// Created On       : Wed Aug 30 17:53:29 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Aug 30 17:55:17 2017
-// Update Count     : 2
-// 
-
-#include <stdbool.h>
-
-int fred() {
-	int x, z;
-
-	// test waitfor and when
-
-	waitfor( x );
-
-	waitfor( x ) {
-	}
-
-	waitfor( x, z ) {
-	}
-
-	when( true ) waitfor( x );
-
-	when( true ) waitfor( x ) {
-	}
-
-	waitfor( x );
-	or waitfor( y );
-
-	waitfor( x, z );
-	or waitfor( y );
-
-	when( true ) waitfor( x );
-	or when( true ) waitfor( y );
-
-	when( true ) waitfor( x, z );
-	or when( true ) waitfor( y );
-
-	waitfor( x ) {
-	} or waitfor( y ) {
-	}
-
-	waitfor( x, z ) {
-	} or waitfor( y ) {
-	}
-
-	when( true ) waitfor( x ) {
-	} or when( true ) waitfor( y ) {
-	}
-
-	waitfor( x );
-	or waitfor( y ) {
-	}
-
-	when( true ) waitfor( x );
-	or when( true ) waitfor( y ) {
-	}
-
-	waitfor( x ) {
-	} or waitfor( y );
-
-	when( true ) waitfor( x ) {
-	} or when( true ) waitfor( y );
-
-	// test when, waitfor and else
-
-	waitfor( x );
-	or else;
-
-	when( true ) waitfor( x );
-	or else;
-
-	when( true ) waitfor( x, z );
-	or else;
-
-	waitfor( x ) {
-	} or else {
-	}
-
-	when( true ) waitfor( x ) {
-	} or else {
-	}
-
-	waitfor( x );
-	or else {
-	}
-
-	when( true ) waitfor( x );
-	or else {
-	}
-
-	when( true ) waitfor( x, z );
-	or else {
-	}
-
-	waitfor( x ) {
-	} or else;
-
-	when( true ) waitfor( x ) {
-	} or else;
-
-	waitfor( x );
-	or when( true ) else;
-
-	when( true ) waitfor( x );
-	or when( true ) else;
-
-	when( true ) waitfor( x, z );
-	or when( true ) else;
-
-	waitfor( x ) {
-	} or when( true ) else {
-	}
-
-	when( true ) waitfor( x ) {
-	} or when( true ) else {
-	}
-
-	waitfor( x );
-	or when( true ) else {
-	}
-
-	when( true ) waitfor( x );
-	or when( true ) else {
-	}
-
-	when( true ) waitfor( x, z );
-	or when( true ) else {
-	}
-
-	waitfor( x ) {
-	} or when( true ) else;
-
-	when( true ) waitfor( x ) {
-	} or when( true ) else;
-
-	// test when, waitfor and timeout
-
-	waitfor( x );
-	or timeout( 3 );
-
-	waitfor( x, z );
-	or timeout( 3 );
-
-	when( true ) waitfor( x );
-	or timeout( 3 );
-
-	waitfor( x ) {
-	} or timeout( 3 ) {
-	}
-
-	when( true ) waitfor( x ) {
-	} or timeout( 3 ) {
-	}
-
-	when( true ) waitfor( x, z ) {
-	} or timeout( 3 ) {
-	}
-
-	when( true ) waitfor( x ) {
-	} or when ( true ) timeout( 3 ) {
-	}
-
-	when( true ) waitfor( x, z ) {
-	} or when ( true ) timeout( 3 ) {
-	}
-
-	waitfor( x );
-	or timeout( 3 ) {
-	}
-
-	when( true ) waitfor( x );
-	or timeout( 3 ) {
-	}
-
-	when( true ) waitfor( x );
-	or when( true ) timeout( 3 ) {
-	}
-
-	waitfor( x ) {
-	} or timeout( 3 );
-
-	when( true ) waitfor( x ) {
-	} or timeout( 3 );
-
-	when( true ) waitfor( x ) {
-	} or when( true ) timeout( 3 );
-
-	// test when, waitfor, timeout and else
-
-	waitfor( x ) {
-	} or timeout( 3 ) {
-	} or when( true ) else {}
-
-	when( true ) waitfor( x ) {
-	} or timeout( 3 ) {
-	} or when( true ) else {}
-
-	waitfor( x ) {
-	} or timeout( 3 ) {
-	} or when( true ) else {}
-
-	waitfor( x ) {
-	} or when( true ) timeout( 3 ) {
-	} or when( true ) else {}
-
-	when( true ) waitfor( x ) {
-	} or timeout( 3 ) {
-	} or when( true ) else {}
-
-	waitfor( x ) {
-	} or when( true ) timeout( 3 ) {
-	} or when( true ) else {}
-
-	when( true ) waitfor( x ) {
-	} or when( true ) timeout( 3 ) {
-	} or when( true ) else {}
-
-	// test quasi-keywords "or" and "timeout"
-
-	int or, timeout;
-	waitfor( timeout, 7 ) 3;
-	waitfor( timeout, 7 ) 3; or waitfor( timeout, 7 ) 3;
-	when( or ) waitfor( or, ) { 4; } or timeout( 1 ) 3;
-	when( 3 ) waitfor( or, 2 ) 4; or else 4;
-	when( 3 ) waitfor( or, 3 ) 4; or when( or ) timeout( or ) 4; or when( or ) else timeout;
-	when( 3 ) waitfor( or, or ) 3; or when( or ) waitfor( or, timeout ) 4; or else 4;
-	when( 3 ) waitfor( or, or ) 3; or waitfor( or, 9 ) 4; or when( or ) timeout( timeout ) 4;
-	when( 3 ) waitfor( or, 3 ) 3; or waitfor( or, 7 ) or; or timeout( 1 ) or; or when( 3 ) else or;
-
-	// test else selection
-
-	if ( or > timeout ) waitfor( or ) 3;
-	else waitfor( timeout ) 4;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa waitfor.c" //
-// End: //
Index: tests/concurrent/waitfor/parse2.cfa
===================================================================
--- tests/concurrent/waitfor/parse2.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/concurrent/waitfor/parse2.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,249 @@
+// 
+// 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.
+// 
+// waitfor.c -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Wed Aug 30 17:53:29 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Aug 30 17:55:17 2017
+// Update Count     : 2
+// 
+
+#include <stdbool.h>
+
+int fred() {
+	int x, z;
+
+	// test waitfor and when
+
+	waitfor( x );
+
+	waitfor( x ) {
+	}
+
+	waitfor( x, z ) {
+	}
+
+	when( true ) waitfor( x );
+
+	when( true ) waitfor( x ) {
+	}
+
+	waitfor( x );
+	or waitfor( y );
+
+	waitfor( x, z );
+	or waitfor( y );
+
+	when( true ) waitfor( x );
+	or when( true ) waitfor( y );
+
+	when( true ) waitfor( x, z );
+	or when( true ) waitfor( y );
+
+	waitfor( x ) {
+	} or waitfor( y ) {
+	}
+
+	waitfor( x, z ) {
+	} or waitfor( y ) {
+	}
+
+	when( true ) waitfor( x ) {
+	} or when( true ) waitfor( y ) {
+	}
+
+	waitfor( x );
+	or waitfor( y ) {
+	}
+
+	when( true ) waitfor( x );
+	or when( true ) waitfor( y ) {
+	}
+
+	waitfor( x ) {
+	} or waitfor( y );
+
+	when( true ) waitfor( x ) {
+	} or when( true ) waitfor( y );
+
+	// test when, waitfor and else
+
+	waitfor( x );
+	or else;
+
+	when( true ) waitfor( x );
+	or else;
+
+	when( true ) waitfor( x, z );
+	or else;
+
+	waitfor( x ) {
+	} or else {
+	}
+
+	when( true ) waitfor( x ) {
+	} or else {
+	}
+
+	waitfor( x );
+	or else {
+	}
+
+	when( true ) waitfor( x );
+	or else {
+	}
+
+	when( true ) waitfor( x, z );
+	or else {
+	}
+
+	waitfor( x ) {
+	} or else;
+
+	when( true ) waitfor( x ) {
+	} or else;
+
+	waitfor( x );
+	or when( true ) else;
+
+	when( true ) waitfor( x );
+	or when( true ) else;
+
+	when( true ) waitfor( x, z );
+	or when( true ) else;
+
+	waitfor( x ) {
+	} or when( true ) else {
+	}
+
+	when( true ) waitfor( x ) {
+	} or when( true ) else {
+	}
+
+	waitfor( x );
+	or when( true ) else {
+	}
+
+	when( true ) waitfor( x );
+	or when( true ) else {
+	}
+
+	when( true ) waitfor( x, z );
+	or when( true ) else {
+	}
+
+	waitfor( x ) {
+	} or when( true ) else;
+
+	when( true ) waitfor( x ) {
+	} or when( true ) else;
+
+	// test when, waitfor and timeout
+
+	waitfor( x );
+	or timeout( 3 );
+
+	waitfor( x, z );
+	or timeout( 3 );
+
+	when( true ) waitfor( x );
+	or timeout( 3 );
+
+	waitfor( x ) {
+	} or timeout( 3 ) {
+	}
+
+	when( true ) waitfor( x ) {
+	} or timeout( 3 ) {
+	}
+
+	when( true ) waitfor( x, z ) {
+	} or timeout( 3 ) {
+	}
+
+	when( true ) waitfor( x ) {
+	} or when ( true ) timeout( 3 ) {
+	}
+
+	when( true ) waitfor( x, z ) {
+	} or when ( true ) timeout( 3 ) {
+	}
+
+	waitfor( x );
+	or timeout( 3 ) {
+	}
+
+	when( true ) waitfor( x );
+	or timeout( 3 ) {
+	}
+
+	when( true ) waitfor( x );
+	or when( true ) timeout( 3 ) {
+	}
+
+	waitfor( x ) {
+	} or timeout( 3 );
+
+	when( true ) waitfor( x ) {
+	} or timeout( 3 );
+
+	when( true ) waitfor( x ) {
+	} or when( true ) timeout( 3 );
+
+	// test when, waitfor, timeout and else
+
+	waitfor( x ) {
+	} or timeout( 3 ) {
+	} or when( true ) else {}
+
+	when( true ) waitfor( x ) {
+	} or timeout( 3 ) {
+	} or when( true ) else {}
+
+	waitfor( x ) {
+	} or timeout( 3 ) {
+	} or when( true ) else {}
+
+	waitfor( x ) {
+	} or when( true ) timeout( 3 ) {
+	} or when( true ) else {}
+
+	when( true ) waitfor( x ) {
+	} or timeout( 3 ) {
+	} or when( true ) else {}
+
+	waitfor( x ) {
+	} or when( true ) timeout( 3 ) {
+	} or when( true ) else {}
+
+	when( true ) waitfor( x ) {
+	} or when( true ) timeout( 3 ) {
+	} or when( true ) else {}
+
+	// test quasi-keywords "or" and "timeout"
+
+	int or, timeout;
+	waitfor( timeout, 7 ) 3;
+	waitfor( timeout, 7 ) 3; or waitfor( timeout, 7 ) 3;
+	when( or ) waitfor( or, ) { 4; } or timeout( 1 ) 3;
+	when( 3 ) waitfor( or, 2 ) 4; or else 4;
+	when( 3 ) waitfor( or, 3 ) 4; or when( or ) timeout( or ) 4; or when( or ) else timeout;
+	when( 3 ) waitfor( or, or ) 3; or when( or ) waitfor( or, timeout ) 4; or else 4;
+	when( 3 ) waitfor( or, or ) 3; or waitfor( or, 9 ) 4; or when( or ) timeout( timeout ) 4;
+	when( 3 ) waitfor( or, 3 ) 3; or waitfor( or, 7 ) or; or timeout( 1 ) or; or when( 3 ) else or;
+
+	// test else selection
+
+	if ( or > timeout ) waitfor( or ) 3;
+	else waitfor( timeout ) 4;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa waitfor.c" //
+// End: //
Index: sts/concurrent/waitfor/recurse.c
===================================================================
--- tests/concurrent/waitfor/recurse.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,145 +1,0 @@
-//----------------------------------------------------------------
-// Recursion test
-// Ensures that proper ordering occurs between the nested waitfors
-//-----------------------------------------------------------------
-
-#include <fstream.hfa>
-#include <kernel.hfa>
-#include <monitor.hfa>
-#include <stdlib.hfa>
-#include <thread.hfa>
-
-#include <stdbool.h>
-#include <time.h>
-
-static const unsigned long N = 5_000ul;
-
-static inline void rand_yield() { yield(random( 10 )); }
-
-enum state_t { FIRST, SECOND, THIRD, LAST, STOP };
-void shuffle(enum state_t * array)
-{
-	int i;
-	for (i = 0; i < 4; i++)
-	{
-		int j = random( 4 );
-		enum state_t t = array[j];
-		array[j] = array[i];
-		array[i] = t;
-	}
-}
-
-
-monitor global_t {
-	int counter;
-	volatile bool ready;
-	state_t actions[4];
-};
-
-void ?{} ( global_t & this ) {
-	this.counter = 0;
-	this.ready = false;
-	this.actions[0] = FIRST;
-	this.actions[1] = SECOND;
-	this.actions[2] = THIRD;
-	this.actions[3] = LAST;
-	shuffle( this.actions );
-}
-
-void ^?{} ( global_t & mutex this ) {}
-
-global_t global;
-
-state_t call4( global_t & mutex this, int idx ) {
-	sout | "Last";
-
-	rand_yield();
-	this.counter++;
-	this.ready = false;
-	shuffle( this.actions );
-
-	return this.counter < N ? (state_t)this.actions[idx] : (state_t)STOP;
-}
-
-state_t call3( global_t & mutex this, int idx ) {
-	sout | "3rd";
-
-	rand_yield();
-	waitfor( call4, this );
-	rand_yield();
-
-	sout | "3rd";
-
-	return this.counter < N ? (state_t)this.actions[idx] : (state_t)STOP;
-}
-
-state_t call2( global_t & mutex this, int idx ) {
-	sout | "2nd";
-
-	rand_yield();
-	waitfor( call3, this );
-	rand_yield();
-
-	sout | "2nd";
-
-	return this.counter < N ? (state_t)this.actions[idx] : (state_t)STOP;
-}
-
-state_t call1( global_t & mutex this, int idx ) {
-	this.ready = true;
-
-	sout | this.counter | "1st";
-
-	rand_yield();
-	waitfor( call2, this );
-	rand_yield();
-
-	sout | "1st" | endl;
-
-	return this.counter < N ? (state_t)this.actions[idx] : (state_t)STOP;
-}
-
-thread waiter_t{
-	int     idx;
-	state_t state;
-};
-
-void ^?{} ( waiter_t & mutex this ) {}
-void ?{} ( waiter_t & this ) {}
-
-void ?{}( waiter_t & this, int idx, state_t state ) {
-	this.idx   = idx;
-	this.state = state;
-}
-
-
-void main( waiter_t & this ) {
-	while( this.state != STOP ) {
-		rand_yield();
-
-		switch( this.state ) {
-			case FIRST  :                                     this.state = call1( global, this.idx ); break;
-			case SECOND : while( !global.ready ) { yield(); } this.state = call2( global, this.idx ); break;
-			case THIRD  : while( !global.ready ) { yield(); } this.state = call3( global, this.idx ); break;
-			case LAST   : while( !global.ready ) { yield(); } this.state = call4( global, this.idx ); break;
-			case STOP   : serr | "This should not happen" | endl;
-		}
-	}
-}
-
-static waiter_t * volatile the_threads;
-
-int main() {
-	srandom( time(NULL) );
-	sout | "Starting" | endl;
-	{
-		waiter_t waiters[4] = {
-			{ 0, FIRST  },
-			{ 1, SECOND },
-			{ 2, THIRD  },
-			{ 3, LAST   }
-		};
-		the_threads = waiters;
-	}
-	sout | "Stopping" | endl;
-}
Index: tests/concurrent/waitfor/recurse.cfa
===================================================================
--- tests/concurrent/waitfor/recurse.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/concurrent/waitfor/recurse.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,146 @@
+//----------------------------------------------------------------
+// Recursion test
+// Ensures that proper ordering occurs between the nested waitfors
+//-----------------------------------------------------------------
+
+#include <fstream.hfa>
+#include <kernel.hfa>
+#include <monitor.hfa>
+#include <stdlib.hfa>
+#include <thread.hfa>
+
+#include <stdbool.h>
+#include <time.h>
+
+static const unsigned long N = 5_000ul;
+
+static inline void rand_yield() { yield(random( 10 )); }
+
+enum state_t { FIRST, SECOND, THIRD, LAST, STOP };
+void shuffle(enum state_t * array)
+{
+	int i;
+	for (i = 0; i < 4; i++)
+	{
+		int j = random( 4 );
+		enum state_t t = array[j];
+		array[j] = array[i];
+		array[i] = t;
+	}
+}
+
+
+monitor global_t {
+	int counter;
+	volatile bool ready;
+	state_t actions[4];
+};
+
+void ?{} ( global_t & this ) {
+	this.counter = 0;
+	this.ready = false;
+	this.actions[0] = FIRST;
+	this.actions[1] = SECOND;
+	this.actions[2] = THIRD;
+	this.actions[3] = LAST;
+	shuffle( this.actions );
+}
+
+void ^?{} ( global_t & mutex this ) {}
+
+global_t global;
+
+state_t call4( global_t & mutex this, int idx ) {
+	sout | "Last";
+
+	rand_yield();
+	this.counter++;
+	this.ready = false;
+	shuffle( this.actions );
+
+	return this.counter < N ? (state_t)this.actions[idx] : (state_t)STOP;
+}
+
+state_t call3( global_t & mutex this, int idx ) {
+	sout | "3rd";
+
+	rand_yield();
+	waitfor( call4, this );
+	rand_yield();
+
+	sout | "3rd";
+
+	return this.counter < N ? (state_t)this.actions[idx] : (state_t)STOP;
+}
+
+state_t call2( global_t & mutex this, int idx ) {
+	sout | "2nd";
+
+	rand_yield();
+	waitfor( call3, this );
+	rand_yield();
+
+	sout | "2nd";
+
+	return this.counter < N ? (state_t)this.actions[idx] : (state_t)STOP;
+}
+
+state_t call1( global_t & mutex this, int idx ) {
+	this.ready = true;
+
+	sout | this.counter | "1st";
+
+	rand_yield();
+	waitfor( call2, this );
+	rand_yield();
+
+	sout | "1st" | nl;
+
+	return this.counter < N ? (state_t)this.actions[idx] : (state_t)STOP;
+}
+
+thread waiter_t{
+	int     idx;
+	state_t state;
+};
+
+void ^?{} ( waiter_t & mutex this ) {}
+void ?{} ( waiter_t & this ) {}
+
+void ?{}( waiter_t & this, int idx, state_t state ) {
+	this.idx   = idx;
+	this.state = state;
+}
+
+
+void main( waiter_t & this ) {
+	while( this.state != STOP ) {
+		rand_yield();
+
+		switch( this.state ) {
+			case FIRST  :                                     this.state = call1( global, this.idx ); break;
+			case SECOND : while( !global.ready ) { yield(); } this.state = call2( global, this.idx ); break;
+			case THIRD  : while( !global.ready ) { yield(); } this.state = call3( global, this.idx ); break;
+			case LAST   : while( !global.ready ) { yield(); } this.state = call4( global, this.idx ); break;
+			case STOP   : serr | "This should not happen" | nl;
+		}
+	}
+}
+
+static waiter_t * volatile the_threads;
+
+int main() {
+	srandom( time(NULL) );
+	sout | nlOff;					// turn off auto newline
+	sout | "Starting" | nl;
+	{
+		waiter_t waiters[4] = {
+			{ 0, FIRST  },
+			{ 1, SECOND },
+			{ 2, THIRD  },
+			{ 3, LAST   }
+		};
+		the_threads = waiters;
+	}
+	sout | "Stopping" | nl;
+}
Index: sts/concurrent/waitfor/simple.c
===================================================================
--- tests/concurrent/waitfor/simple.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,85 +1,0 @@
-#include <fstream.hfa>
-#include <kernel.hfa>
-#include <monitor.hfa>
-#include <stdlib.hfa>
-#include <thread.hfa>
-
-#include <time.h>
-
-static const unsigned long N = 500ul;
-
-#ifndef PREEMPTION_RATE
-#define PREEMPTION_RATE 10`ms
-#endif
-
-Duration default_preemption() {
-	return PREEMPTION_RATE;
-}
-
-monitor global_t {};
-
-global_t globalA;
-
-thread Acceptor {};
-thread Acceptee {};
-
-volatile bool done;
-
-//----------------------------------------------------------------------------------------------------
-// Acceptor
-void do_notify( global_t * mutex a );
-
-void do_wait( global_t * mutex a ) {
-	sout | "Waiting to accept" | endl;
-	yield( random( 10 ) );
-
-	sout | "Accepting" | endl;
-
-	__acceptable_t acceptable;
-	acceptable.func          = (fptr_t)do_notify;
-	acceptable.count         = 1;
-	acceptable.monitors      = &a;
-
-	__waitfor_internal( 1, &acceptable );
-
-	sout | "Accepted" | endl;
-	yield( random( 10 ) );
-}
-
-void main( Acceptor* this ) {
-	for( int i = 0; i < N; i++ ) {
-		do_wait( &globalA );
-		sout | i | endl;
-	}
-
-	done = true;
-}
-
-//----------------------------------------------------------------------------------------------------
-// Acceptee
-void do_notify( global_t * mutex a ) {
-
-}
-
-void main( Acceptee* this ) {
-	while( !done ) {
-		yield( random( 10 ) );
-		do_notify( &globalA );
-		yield( random( 10 ) );
-	}
-}
-
-//----------------------------------------------------------------------------------------------------
-// Main
-int main(int argc, char* argv[]) {
-	done = false;
-	srandom( time( NULL ) );
-	printf("%p\n", &globalA);
-	sout | "Starting" | endl;
-	{
-		Acceptor r;
-		Acceptee e[13];
-
-	}
-	sout | "Done" | endl;
-}
Index: tests/concurrent/waitfor/simple.cfa
===================================================================
--- tests/concurrent/waitfor/simple.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/concurrent/waitfor/simple.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,85 @@
+#include <fstream.hfa>
+#include <kernel.hfa>
+#include <monitor.hfa>
+#include <stdlib.hfa>
+#include <thread.hfa>
+
+#include <time.h>
+
+static const unsigned long N = 500ul;
+
+#ifndef PREEMPTION_RATE
+#define PREEMPTION_RATE 10`ms
+#endif
+
+Duration default_preemption() {
+	return PREEMPTION_RATE;
+}
+
+monitor global_t {};
+
+global_t globalA;
+
+thread Acceptor {};
+thread Acceptee {};
+
+volatile bool done;
+
+//----------------------------------------------------------------------------------------------------
+// Acceptor
+void do_notify( global_t * mutex a );
+
+void do_wait( global_t * mutex a ) {
+	sout | "Waiting to accept";
+	yield( random( 10 ) );
+
+	sout | "Accepting";
+
+	__acceptable_t acceptable;
+	acceptable.func          = (fptr_t)do_notify;
+	acceptable.count         = 1;
+	acceptable.monitors      = &a;
+
+	__waitfor_internal( 1, &acceptable );
+
+	sout | "Accepted";
+	yield( random( 10 ) );
+}
+
+void main( Acceptor* this ) {
+	for( int i = 0; i < N; i++ ) {
+		do_wait( &globalA );
+		sout | i;
+	}
+
+	done = true;
+}
+
+//----------------------------------------------------------------------------------------------------
+// Acceptee
+void do_notify( global_t * mutex a ) {
+
+}
+
+void main( Acceptee* this ) {
+	while( !done ) {
+		yield( random( 10 ) );
+		do_notify( &globalA );
+		yield( random( 10 ) );
+	}
+}
+
+//----------------------------------------------------------------------------------------------------
+// Main
+int main(int argc, char* argv[]) {
+	done = false;
+	srandom( time( NULL ) );
+	printf("%p\n", &globalA);
+	sout | "Starting";
+	{
+		Acceptor r;
+		Acceptee e[13];
+
+	}
+	sout | "Done";
+}
Index: sts/concurrent/waitfor/statment.c
===================================================================
--- tests/concurrent/waitfor/statment.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,136 +1,0 @@
-#include <fstream.hfa>
-#include <kernel.hfa>
-#include <monitor.hfa>
-#include <thread.hfa>
-
-#include <stdbool.h>
-
-monitor M {
-	int index;
-	int last_val;
-	int calls[7];
-};
-
-volatile bool start = false;
-
-void ?{}( M & this ) {
-	this.index = 0;
-	this.last_val = 0;
-	for( int i = 0; i < 7; i++ ) {
-		this.calls[i] = 100; //10_000;
-	}
-}
-
-void ^?{} ( M &  mutex this ) {}
-
-int get_index( M & mutex this ) {
-	this.index += 1;
-	return this.index;
-}
-
-bool call1( M & mutex this ) {
-	this.last_val = 1;
-	this.calls[0] -= 1;
-	return this.calls[0] > 0;
-}
-
-bool call2( M & mutex this ) {
-	this.last_val = 2;
-	this.calls[1] -= 1;
-	return this.calls[1] > 0;
-}
-
-bool call3( M & mutex this ) {
-	this.last_val = 3;
-	this.calls[2] -= 1;
-	return this.calls[2] > 0;
-}
-
-bool call4( M & mutex this ) {
-	this.last_val = 4;
-	this.calls[3] -= 1;
-	return this.calls[3] > 0;
-}
-
-bool call5( M & mutex this ) {
-	this.last_val = 5;
-	this.calls[4] -= 1;
-	return this.calls[4] > 0;
-}
-
-bool call6( M & mutex this ) {
-	this.last_val = 6;
-	this.calls[5] -= 1;
-	return this.calls[5] > 0;
-}
-
-bool call7( M & mutex this ) {
-	this.last_val = 7;
-	this.calls[6] -= 1;
-	return this.calls[6] > 0;
-}
-
-M m;
-thread caller{};
-
-bool call( int index ) {
-	switch( index ) {
-		case 1: return call1( m );
-		case 2: return call2( m );
-		case 3: return call3( m );
-		case 4: return call4( m );
-		case 5: return call5( m );
-		case 6: return call6( m );
-		case 7: return call7( m );
-		default :
-			serr | "Incorrect index" | index | endl;
-			abort();
-	}
-}
-
-void main( caller & this ) {
-	int index = get_index( m );
-	while( !start ) yield();
-	while( call( index ) );
-}
-
-void do_wait( M & mutex this ) {
-	bool done = false;
-
-	start = true;
-
-	while( !done ) {
-		   waitfor( get_index, this );
-		or waitfor( call1, this ) { sout | "Statement" | endl; if( this.last_val != 1 ) { serr | "Incorrect index: expected" | 1 | "got" | this.last_val | endl; } }
-		or waitfor( call2, this ) { sout | "Statement" | endl; if( this.last_val != 2 ) { serr | "Incorrect index: expected" | 2 | "got" | this.last_val | endl; } }
-		or waitfor( call3, this ) { sout | "Statement" | endl; if( this.last_val != 3 ) { serr | "Incorrect index: expected" | 3 | "got" | this.last_val | endl; } }
-		or waitfor( call4, this ) { sout | "Statement" | endl; if( this.last_val != 4 ) { serr | "Incorrect index: expected" | 4 | "got" | this.last_val | endl; } }
-		or waitfor( call5, this ) { sout | "Statement" | endl; if( this.last_val != 5 ) { serr | "Incorrect index: expected" | 5 | "got" | this.last_val | endl; } }
-		or waitfor( call6, this ) { sout | "Statement" | endl; if( this.last_val != 6 ) { serr | "Incorrect index: expected" | 6 | "got" | this.last_val | endl; } }
-		or waitfor( call7, this ) { sout | "Statement" | endl; if( this.last_val != 7 ) { serr | "Incorrect index: expected" | 7 | "got" | this.last_val | endl; } }
-
-		done = true;
-		for( int i = 0; i < 7; i++ ) {
-			if( this.calls[i] > 0 ) {
-				done = false;
-				break;
-			}
-		}
-	}
-}
-
-thread waiter{};
-
-void main( waiter & this ) {
-	do_wait( m );
-}
-
-int main() {
-	processor p[2];
-	sout | "Starting" | endl;
-	{
-		caller c[7];
-		waiter w;
-	}
-	sout | "Stopping" | endl;
-}
Index: tests/concurrent/waitfor/statment.cfa
===================================================================
--- tests/concurrent/waitfor/statment.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/concurrent/waitfor/statment.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,136 @@
+#include <fstream.hfa>
+#include <kernel.hfa>
+#include <monitor.hfa>
+#include <thread.hfa>
+
+#include <stdbool.h>
+
+monitor M {
+	int index;
+	int last_val;
+	int calls[7];
+};
+
+volatile bool start = false;
+
+void ?{}( M & this ) {
+	this.index = 0;
+	this.last_val = 0;
+	for( int i = 0; i < 7; i++ ) {
+		this.calls[i] = 100; //10_000;
+	}
+}
+
+void ^?{} ( M &  mutex this ) {}
+
+int get_index( M & mutex this ) {
+	this.index += 1;
+	return this.index;
+}
+
+bool call1( M & mutex this ) {
+	this.last_val = 1;
+	this.calls[0] -= 1;
+	return this.calls[0] > 0;
+}
+
+bool call2( M & mutex this ) {
+	this.last_val = 2;
+	this.calls[1] -= 1;
+	return this.calls[1] > 0;
+}
+
+bool call3( M & mutex this ) {
+	this.last_val = 3;
+	this.calls[2] -= 1;
+	return this.calls[2] > 0;
+}
+
+bool call4( M & mutex this ) {
+	this.last_val = 4;
+	this.calls[3] -= 1;
+	return this.calls[3] > 0;
+}
+
+bool call5( M & mutex this ) {
+	this.last_val = 5;
+	this.calls[4] -= 1;
+	return this.calls[4] > 0;
+}
+
+bool call6( M & mutex this ) {
+	this.last_val = 6;
+	this.calls[5] -= 1;
+	return this.calls[5] > 0;
+}
+
+bool call7( M & mutex this ) {
+	this.last_val = 7;
+	this.calls[6] -= 1;
+	return this.calls[6] > 0;
+}
+
+M m;
+thread caller{};
+
+bool call( int index ) {
+	switch( index ) {
+		case 1: return call1( m );
+		case 2: return call2( m );
+		case 3: return call3( m );
+		case 4: return call4( m );
+		case 5: return call5( m );
+		case 6: return call6( m );
+		case 7: return call7( m );
+		default :
+			serr | "Incorrect index" | index;
+			abort();
+	}
+}
+
+void main( caller & this ) {
+	int index = get_index( m );
+	while( !start ) yield();
+	while( call( index ) );
+}
+
+void do_wait( M & mutex this ) {
+	bool done = false;
+
+	start = true;
+
+	while( !done ) {
+		   waitfor( get_index, this );
+		or waitfor( call1, this ) { sout | "Statement"; if( this.last_val != 1 ) { serr | "Incorrect index: expected" | 1 | "got" | this.last_val; } }
+		or waitfor( call2, this ) { sout | "Statement"; if( this.last_val != 2 ) { serr | "Incorrect index: expected" | 2 | "got" | this.last_val; } }
+		or waitfor( call3, this ) { sout | "Statement"; if( this.last_val != 3 ) { serr | "Incorrect index: expected" | 3 | "got" | this.last_val; } }
+		or waitfor( call4, this ) { sout | "Statement"; if( this.last_val != 4 ) { serr | "Incorrect index: expected" | 4 | "got" | this.last_val; } }
+		or waitfor( call5, this ) { sout | "Statement"; if( this.last_val != 5 ) { serr | "Incorrect index: expected" | 5 | "got" | this.last_val; } }
+		or waitfor( call6, this ) { sout | "Statement"; if( this.last_val != 6 ) { serr | "Incorrect index: expected" | 6 | "got" | this.last_val; } }
+		or waitfor( call7, this ) { sout | "Statement"; if( this.last_val != 7 ) { serr | "Incorrect index: expected" | 7 | "got" | this.last_val; } }
+
+		done = true;
+		for( int i = 0; i < 7; i++ ) {
+			if( this.calls[i] > 0 ) {
+				done = false;
+				break;
+			}
+		}
+	}
+}
+
+thread waiter{};
+
+void main( waiter & this ) {
+	do_wait( m );
+}
+
+int main() {
+	processor p[2];
+	sout | "Starting";
+	{
+		caller c[7];
+		waiter w;
+	}
+	sout | "Stopping";
+}
Index: sts/concurrent/waitfor/when.c
===================================================================
--- tests/concurrent/waitfor/when.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,87 +1,0 @@
-//----------------------------------------------------------------
-// When test
-// Ensures that when clauses on waitfor are respected
-//-----------------------------------------------------------------
-
-#include <fstream.hfa>
-#include <kernel.hfa>
-#include <monitor.hfa>
-#include <stdlib.hfa>
-#include <thread.hfa>
-
-#include <stdbool.h>
-#include <time.h>
-
-static const unsigned long N = 4_998ul;
-
-static inline void rand_yield() { yield(random( 10 )); }
-
-monitor global_t {
-	int last_call;
-	bool done;
-};
-
-void ?{} ( global_t & this ) {
-	this.last_call = 6;
-	this.done = false;
-}
-
-void ^?{} ( global_t & mutex this ) {}
-
-global_t global;
-
-bool call1( global_t & mutex this ) { this.last_call = 1; return this.done; }
-bool call2( global_t & mutex this ) { this.last_call = 2; return this.done; }
-bool call3( global_t & mutex this ) { this.last_call = 3; return this.done; }
-bool call4( global_t & mutex this ) { this.last_call = 4; return this.done; }
-bool call5( global_t & mutex this ) { this.last_call = 5; return this.done; }
-bool call6( global_t & mutex this ) { this.last_call = 6; return this.done; }
-
-thread caller_t{};
-void main( caller_t & this ) {
-	while( true ) {
-		rand_yield();
-		if( call1( global ) ) return;
-		rand_yield();
-		if( call2( global ) ) return;
-		rand_yield();
-		if( call3( global ) ) return;
-		rand_yield();
-		if( call4( global ) ) return;
-		rand_yield();
-		if( call5( global ) ) return;
-		rand_yield();
-		if( call6( global ) ) return;
-	}
-}
-
-void arbiter( global_t & mutex this ) {
-	for( int i = 0; i < N; i++ ) {
-		   when( this.last_call == 6 ) waitfor( call1, this ) { if( this.last_call != 1) { serr | "Expected last_call to be 1 got" | this.last_call | endl; } }
-		or when( this.last_call == 1 ) waitfor( call2, this ) { if( this.last_call != 2) { serr | "Expected last_call to be 2 got" | this.last_call | endl; } }
-		or when( this.last_call == 2 ) waitfor( call3, this ) { if( this.last_call != 3) { serr | "Expected last_call to be 3 got" | this.last_call | endl; } }
-		or when( this.last_call == 3 ) waitfor( call4, this ) { if( this.last_call != 4) { serr | "Expected last_call to be 4 got" | this.last_call | endl; } }
-		or when( this.last_call == 4 ) waitfor( call5, this ) { if( this.last_call != 5) { serr | "Expected last_call to be 5 got" | this.last_call | endl; } }
-		or when( this.last_call == 5 ) waitfor( call6, this ) { if( this.last_call != 6) { serr | "Expected last_call to be 6 got" | this.last_call | endl; } }
-
-		sout | this.last_call | endl;
-	}
-
-	this.done = true;
-}
-
-thread arbiter_t{};
-void main( arbiter_t & this ) {
-	arbiter( global );
-}
-
-int main() {
-	srandom( time(NULL) );
-	sout | "Starting" | endl;
-	{
-		arbiter_t arbiter;
-		caller_t callers[7];
-
-	}
-	sout | "Stopping" | endl;
-}
Index: tests/concurrent/waitfor/when.cfa
===================================================================
--- tests/concurrent/waitfor/when.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/concurrent/waitfor/when.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,87 @@
+//----------------------------------------------------------------
+// When test
+// Ensures that when clauses on waitfor are respected
+//-----------------------------------------------------------------
+
+#include <fstream.hfa>
+#include <kernel.hfa>
+#include <monitor.hfa>
+#include <stdlib.hfa>
+#include <thread.hfa>
+
+#include <stdbool.h>
+#include <time.h>
+
+static const unsigned long N = 4_998ul;
+
+static inline void rand_yield() { yield(random( 10 )); }
+
+monitor global_t {
+	int last_call;
+	bool done;
+};
+
+void ?{} ( global_t & this ) {
+	this.last_call = 6;
+	this.done = false;
+}
+
+void ^?{} ( global_t & mutex this ) {}
+
+global_t global;
+
+bool call1( global_t & mutex this ) { this.last_call = 1; return this.done; }
+bool call2( global_t & mutex this ) { this.last_call = 2; return this.done; }
+bool call3( global_t & mutex this ) { this.last_call = 3; return this.done; }
+bool call4( global_t & mutex this ) { this.last_call = 4; return this.done; }
+bool call5( global_t & mutex this ) { this.last_call = 5; return this.done; }
+bool call6( global_t & mutex this ) { this.last_call = 6; return this.done; }
+
+thread caller_t{};
+void main( caller_t & this ) {
+	while( true ) {
+		rand_yield();
+		if( call1( global ) ) return;
+		rand_yield();
+		if( call2( global ) ) return;
+		rand_yield();
+		if( call3( global ) ) return;
+		rand_yield();
+		if( call4( global ) ) return;
+		rand_yield();
+		if( call5( global ) ) return;
+		rand_yield();
+		if( call6( global ) ) return;
+	}
+}
+
+void arbiter( global_t & mutex this ) {
+	for( int i = 0; i < N; i++ ) {
+		   when( this.last_call == 6 ) waitfor( call1, this ) { if( this.last_call != 1) { serr | "Expected last_call to be 1 got" | this.last_call; } }
+		or when( this.last_call == 1 ) waitfor( call2, this ) { if( this.last_call != 2) { serr | "Expected last_call to be 2 got" | this.last_call; } }
+		or when( this.last_call == 2 ) waitfor( call3, this ) { if( this.last_call != 3) { serr | "Expected last_call to be 3 got" | this.last_call; } }
+		or when( this.last_call == 3 ) waitfor( call4, this ) { if( this.last_call != 4) { serr | "Expected last_call to be 4 got" | this.last_call; } }
+		or when( this.last_call == 4 ) waitfor( call5, this ) { if( this.last_call != 5) { serr | "Expected last_call to be 5 got" | this.last_call; } }
+		or when( this.last_call == 5 ) waitfor( call6, this ) { if( this.last_call != 6) { serr | "Expected last_call to be 6 got" | this.last_call; } }
+
+		sout | this.last_call;
+	}
+
+	this.done = true;
+}
+
+thread arbiter_t{};
+void main( arbiter_t & this ) {
+	arbiter( global );
+}
+
+int main() {
+	srandom( time(NULL) );
+	sout | "Starting";
+	{
+		arbiter_t arbiter;
+		caller_t callers[7];
+
+	}
+	sout | "Stopping";
+}
Index: tests/coroutine/.expect/fmtLines.txt
===================================================================
--- tests/coroutine/.expect/fmtLines.txt	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/coroutine/.expect/fmtLines.txt	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -16,7 +16,7 @@
 difi  ed B  y :   Pete  r A.  
  Buh  r//   Last   Mod  ifie  
-d On   : M  on S  ep 1  8 11  
-:35:  57 2  017/  / Up  date  
- Cou  nt       :   31/  /#in  
+d On   : T  ue D  ec 1  1 23  
+:31:  12 2  018/  / Up  date  
+ Cou  nt       :   32/  /#in  
 clud  e <f  stre  am.h  fa>#  
 incl  ude   <cor  outi  ne.h  
@@ -34,46 +34,45 @@
 t )   {      if   ( fm  t.g   
 != 0   ||   fmt.  b !=   0 )  
- sou  t |   endl  ;}vo  id m  
-ain(   For  mat   & fm  t )   
-{	fo  r (   ;; )   {		  				  
-				  // f  or a  s ma  ny c  
-hara  cter  s		f  or (   fmt  
-.g =   0;   fmt.  g <   5; f  
-mt.g   +=   1 )   {		/  / gr  
-oups   of   5 bl  ocks  			f  
-or (   fmt  .b =   0;   fmt.  
-b <   4; f  mt.b   +=   1 )   
-{	//   blo  cks   of 4   cha  
-ract  ers	  			f  or (   ;;   
-) {	  				  		//   for   new  
-line   cha  ract  ers	  				  
-susp  end(  );		  			i  f (   
-fmt.  ch !  = '\  n' )   bre  
-ak;	  	//   igno  re n  ewli  
-ne		  		}   // f  or		  		so  
-ut |   fmt  .ch;  				  			/  
-/ pr  int   char  acte  r			  
-} //   for  			s  out   | "   
- ";	  				  			/  / pr  int   
-bloc  k se  para  tor	  	} /  
-/ fo  r		s  out   | en  dl;	  
-				  				  // p  rint   gro  
-up s  epar  ator  	} /  / fo  
-r} /  / ma  invo  id p  rt(   
-Form  at &   fmt  , ch  ar c  
-h )   {      fmt  .ch   = ch  
-;      res  ume(   fmt   );}  
- //   prti  nt m  ain(  ) {	  
-Form  at f  mt;	  char   ch;  
-	for   ( ;  ; )   {		s  in |  
- ch;  				  				  		//   rea  
-d on  e ch  arac  ter	    if  
- ( e  of(   sin   ) )   brea  
-k;		  				  	//   eof   ?		p  
-rt(   fmt,   ch   );	}   //   
-for}   //   main  // L  ocal  
- Var  iabl  es:   ////   tab  
--wid  th:   4 //  // c  ompi  
-le-c  omma  nd:   "cfa   fmt  
-Line  s.c"   ///  / En  d: /  
-/
+ sou  t |   nl;}  void   mai  
+n( F  orma  t &   fmt   ) {	  
+for   ( ;;   ) {  				  				  
+		//   for   as   many   cha  
+ract  ers	  	for   ( f  mt.g  
+ = 0  ; fm  t.g   < 5;   fmt  
+.g +  = 1   ) {	  	//   grou  
+ps o  f 5   bloc  ks		  	for  
+ ( f  mt.b   = 0  ; fm  t.b   
+< 4;   fmt  .b +  = 1   ) {	  
+// b  lock  s of   4 c  hara  
+cter  s			  	for   ( ;  ; )   
+{			  				  // f  or n  ewli  
+ne c  hara  cter  s			  		su  
+spen  d();  				  	if   ( fm  
+t.ch   !=   '\n'   ) b  reak  
+;		/  / ig  nore   new  line  
+				  } //   for  				  sout  
+ | f  mt.c  h;		  				  	//   
+prin  t ch  arac  ter	  		}   
+// f  or		  	sou  t |   "  "  
+;			  				  	//   prin  t bl  
+ock   sepa  rato  r		}   //   
+for	  	sou  t |   nl;	  				  
+				  // p  rint   gro  up s  
+epar  ator  	} /  / fo  r} /  
+/ ma  invo  id p  rt(   Form  
+at &   fmt  , ch  ar c  h )   
+{      fmt  .ch   = ch  ;     
+ res  ume(   fmt   );}   //   
+prti  nt m  ain(  ) {	  Form  
+at f  mt;	  char   ch;  	for  
+ ( ;  ; )   {		s  in |   ch;  
+				  				  		//   rea  d on  
+e ch  arac  ter	    if   ( e  
+of(   sin   ) )   brea  k;		  
+				  	//   eof   ?		p  rt(   
+fmt,   ch   );	}   //   for}  
+ //   main  // L  ocal   Var  
+iabl  es:   ////   tab  -wid  
+th:   4 //  // c  ompi  le-c  
+omma  nd:   "cfa   fmt  Line  
+s.c"   ///  / En  d: /  /
Index: tests/coroutine/.in/fmtLines.txt
===================================================================
--- tests/coroutine/.in/fmtLines.txt	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/coroutine/.in/fmtLines.txt	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Sun Sep 17 21:56:15 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Sep 18 11:35:57 2017
-// Update Count     : 31
+// Last Modified On : Tue Dec 11 23:31:12 2018
+// Update Count     : 32
 //
 
@@ -27,5 +27,5 @@
 
 void ^?{}( Format & fmt ) {
-    if ( fmt.g != 0 || fmt.b != 0 ) sout | endl;
+    if ( fmt.g != 0 || fmt.b != 0 ) sout | nl;
 }
 
@@ -42,5 +42,5 @@
 			sout | "  ";								// print block separator
 		} // for
-		sout | endl;									// print group separator
+		sout | nl;									// print group separator
 	} // for
 } // main
Index: sts/coroutine/fibonacci.c
===================================================================
--- tests/coroutine/fibonacci.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,48 +1,0 @@
-//
-// 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.
-//
-// fibonacci.c -- 3-state finite-state machine
-//
-// Author           : Thierry Delisle
-// Created On       : Thu Jun  8 07:29:37 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Aug 18 11:21:58 2018
-// Update Count     : 24
-//
-
-#include <fstream.hfa>
-#include <coroutine.hfa>
-
-coroutine Fibonacci { int fn; };						// used for communication
-
-void main( Fibonacci & fib ) with( fib ) {				// called on first resume
-	int fn1, fn2;										// retained between resumes
-	fn = 0;  fn1 = fn;									// 1st case
-	suspend();											// restart last resume
-	fn = 1;  fn2 = fn1;  fn1 = fn;						// 2nd case
-	suspend();											// restart last resume
-	for () {
-		fn = fn1 + fn2;  fn2 = fn1;  fn1 = fn;			// general case
-		suspend();										// restart last resume
-	} // for
-}
-
-int next( Fibonacci & fib ) with( fib ) {
-	resume( fib );										// restart last suspend
-	return fn;
-}
-
-int main() {
-	Fibonacci f1, f2;
-	for ( 10 ) {										// print N Fibonacci values
-		sout | next( f1 ) | next( f2 ) | endl;
-	} // for
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa fibonacci.c" //
-// End: //
Index: tests/coroutine/fibonacci.cfa
===================================================================
--- tests/coroutine/fibonacci.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/coroutine/fibonacci.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,48 @@
+//
+// 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.
+//
+// fibonacci.c -- 3-state finite-state machine
+//
+// Author           : Thierry Delisle
+// Created On       : Thu Jun  8 07:29:37 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Dec 11 21:57:33 2018
+// Update Count     : 25
+//
+
+#include <fstream.hfa>
+#include <coroutine.hfa>
+
+coroutine Fibonacci { int fn; };						// used for communication
+
+void main( Fibonacci & fib ) with( fib ) {				// called on first resume
+	int fn1, fn2;										// retained between resumes
+	fn = 0;  fn1 = fn;									// 1st case
+	suspend();											// restart last resume
+	fn = 1;  fn2 = fn1;  fn1 = fn;						// 2nd case
+	suspend();											// restart last resume
+	for () {
+		fn = fn1 + fn2;  fn2 = fn1;  fn1 = fn;			// general case
+		suspend();										// restart last resume
+	} // for
+}
+
+int next( Fibonacci & fib ) with( fib ) {
+	resume( fib );										// restart last suspend
+	return fn;
+}
+
+int main() {
+	Fibonacci f1, f2;
+	for ( 10 ) {										// print N Fibonacci values
+		sout | next( f1 ) | next( f2 );
+	} // for
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa fibonacci.c" //
+// End: //
Index: sts/coroutine/fibonacci_1.c
===================================================================
--- tests/coroutine/fibonacci_1.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,45 +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.
-//
-// fibonacci_1.c -- 1-state finite-state machine: precomputed first two states returning f(n - 2)
-//
-// Author           : Peter A. Buhr
-// Created On       : Thu Apr 26 23:20:08 2018
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Aug 18 11:21:02 2018
-// Update Count     : 13
-// 
-
-#include <fstream.hfa>
-#include <coroutine.hfa>
-
-coroutine Fibonacci { int ret; };						// used for communication
-
-void main( Fibonacci & fib ) with( fib ) {				// called on first resume
-	int fn, fn1 = 1, fn2 = 0;							// precompute first two states
-	for () {
-		ret = fn2;
-		fn = fn1 + fn2;  fn2 = fn1;  fn1 = fn;			// general case
-		suspend();										// restart last resume
-	} // for
-}
-
-int next( Fibonacci & fib ) with( fib ) {
-	resume( fib );										// restart last suspend
-	return ret;
-}
-
-int main() {
-	Fibonacci f1, f2;
-	for ( 10 ) {										// print N Fibonacci values
-		sout | next( f1 ) | next( f2 ) | endl;
-	} // for
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa fibonacci_1.c" //
-// End: //
Index: tests/coroutine/fibonacci_1.cfa
===================================================================
--- tests/coroutine/fibonacci_1.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/coroutine/fibonacci_1.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,45 @@
+//
+// 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.
+//
+// fibonacci_1.c -- 1-state finite-state machine: precomputed first two states returning f(n - 2)
+//
+// Author           : Peter A. Buhr
+// Created On       : Thu Apr 26 23:20:08 2018
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Dec 11 21:57:54 2018
+// Update Count     : 14
+// 
+
+#include <fstream.hfa>
+#include <coroutine.hfa>
+
+coroutine Fibonacci { int ret; };						// used for communication
+
+void main( Fibonacci & fib ) with( fib ) {				// called on first resume
+	int fn, fn1 = 1, fn2 = 0;							// precompute first two states
+	for () {
+		ret = fn2;
+		fn = fn1 + fn2;  fn2 = fn1;  fn1 = fn;			// general case
+		suspend();										// restart last resume
+	} // for
+}
+
+int next( Fibonacci & fib ) with( fib ) {
+	resume( fib );										// restart last suspend
+	return ret;
+}
+
+int main() {
+	Fibonacci f1, f2;
+	for ( 10 ) {										// print N Fibonacci values
+		sout | next( f1 ) | next( f2 );
+	} // for
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa fibonacci_1.c" //
+// End: //
Index: sts/coroutine/fmtLines.c
===================================================================
--- tests/coroutine/fmtLines.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,65 +1,0 @@
-//
-// 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.
-//
-// fmtLines.cc -- format characters into blocks of 4 and groups of 5 blocks per line
-//
-// Author           : Peter A. Buhr
-// Created On       : Sun Sep 17 21:56:15 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug 16 08:20:54 2018
-// Update Count     : 45
-//
-
-#include <fstream.hfa>
-#include <coroutine.hfa>
-
-coroutine Format {
-	char ch;											// used for communication
-	int g, b;											// global because used in destructor
-};
-
-void main( Format & fmt ) with( fmt ) {
-	for () {											// for as many characters
-		for ( g; 5 ) {									// groups of 5 blocks
-			for ( b; 4 ) {								// blocks of 4 characters
-				for () {								// for newline characters
-					suspend();
-					if ( ch != '\n' ) break;			// ignore newline
-				} // for
-				sout | ch;								// print character
-			} // for
-			sout | "  ";								// print block separator
-		} // for
-		sout | endl;									// print group separator
-	} // for
-} // main
-
-void ?{}( Format & fmt ) {
-	resume( fmt );										// prime (start) coroutine
-}
-
-void ^?{}( Format & fmt ) with( fmt ) {
-	if ( g != 0 || b != 0 ) sout | endl;
-}
-
-void format( Format & fmt ) {
-	resume( fmt );
-} // prt
-
-int main() {
-	Format fmt;
-
-  eof: for () {											// read until end of file
-		sin | fmt.ch;									// read one character
-	  if ( eof( sin ) ) break eof;						// eof ?
-		format( fmt );									// push character for formatting
-	} // for
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa fmtLines.c" //
-// End: //
Index: tests/coroutine/fmtLines.cfa
===================================================================
--- tests/coroutine/fmtLines.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/coroutine/fmtLines.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,66 @@
+//
+// 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.
+//
+// fmtLines.cc -- format characters into blocks of 4 and groups of 5 blocks per line
+//
+// Author           : Peter A. Buhr
+// Created On       : Sun Sep 17 21:56:15 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sat Dec 22 18:27:00 2018
+// Update Count     : 57
+//
+
+#include <fstream.hfa>
+#include <coroutine.hfa>
+
+coroutine Format {
+	char ch;											// used for communication
+	int g, b;											// global because used in destructor
+};
+
+void main( Format & fmt ) with( fmt ) {
+	for () {											// for as many characters
+		for ( g = 0; g < 5; g += 1 ) {					// groups of 5 blocks
+			for ( b = 0; b < 4; b += 1 ) {				// blocks of 4 characters
+				for () {								// for newline characters
+					suspend();
+				  if ( ch != '\n' ) break;				// ignore newline
+				} // for
+				sout | ch;								// print character
+			} // for
+			sout | "  ";								// print block separator
+		} // for
+		sout | nl;										// print group separator
+	} // for
+} // main
+
+void ?{}( Format & fmt ) {
+	resume( fmt );										// prime (start) coroutine
+}
+
+void ^?{}( Format & fmt ) with( fmt ) {
+	if ( g != 0 || b != 0 ) sout | nl;
+}
+
+void format( Format & fmt ) {
+	resume( fmt );
+} // format
+
+int main() {
+	Format fmt;
+	sout | nlOff;										// turn off auto newline
+
+  eof: for () {											// read until end of file
+		sin | fmt.ch;									// read one character
+	  if ( eof( sin ) ) break eof;						// eof ?
+		format( fmt );									// push character for formatting
+	} // for
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa fmtLines.c" //
+// End: //
Index: sts/coroutine/pingpong.c
===================================================================
--- tests/coroutine/pingpong.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,55 +1,0 @@
-//
-// 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.
-//
-// pingpong.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Wed Sep 20 11:55:23 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Aug 18 11:31:11 2018
-// Update Count     : 28
-//
-
-#include <coroutine.hfa>
-#include <fstream.hfa>
-
-coroutine PingPong {
-	const char * name;
-	/* const */ unsigned int N;
-	PingPong * part;
-};
-
-void ?{}( PingPong & this, const char * name, unsigned int N, PingPong & part ) {
-	this.name = name;
-	this.N = N;
-	this.part = &part;
-}
-void ?{}( PingPong & this, const char * name, unsigned int N ) {
-	this{ name, N, *(PingPong *)0 };
-}
-void cycle( PingPong & pingpong ) {
-	resume( pingpong );
-}
-void partner( PingPong & this, PingPong & part ) {
-	this.part = &part;
-	resume( this );
-}
-void main( PingPong & pingpong ) {						// ping's starter ::main, pong's starter ping
-	for ( pingpong.N ) {								// N ping-pongs
-		sout | pingpong.name | endl;
-		cycle( *pingpong.part );
-	} // for
-}
-int main() {
-	enum { N = 20 };
-	PingPong ping = { "ping", N }, pong = { "pong", N, ping };
-	partner( ping, pong );
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa pingpong.c" //
-// End: //
Index: tests/coroutine/pingpong.cfa
===================================================================
--- tests/coroutine/pingpong.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/coroutine/pingpong.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,56 @@
+//
+// 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.
+//
+// pingpong.c --
+//
+// Author           : Peter A. Buhr
+// Created On       : Wed Sep 20 11:55:23 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Dec 11 21:58:06 2018
+// Update Count     : 29
+//
+
+#include <coroutine.hfa>
+#include <fstream.hfa>
+
+coroutine PingPong {
+	const char * name;
+	/* const */ unsigned int N;
+	PingPong * part;
+};
+
+void ?{}( PingPong & this, const char * name, unsigned int N, PingPong & part ) {
+	(this.__cor){name};
+	this.name = name;
+	this.N = N;
+	this.part = &part;
+}
+void ?{}( PingPong & this, const char * name, unsigned int N ) {
+	this{ name, N, *(PingPong *)0 };
+}
+void cycle( PingPong & pingpong ) {
+	resume( pingpong );
+}
+void partner( PingPong & this, PingPong & part ) {
+	this.part = &part;
+	resume( this );
+}
+void main( PingPong & pingpong ) {						// ping's starter ::main, pong's starter ping
+	for ( pingpong.N ) {								// N ping-pongs
+		sout | pingpong.name;
+		cycle( *pingpong.part );
+	} // for
+}
+int main() {
+	enum { N = 20 };
+	PingPong ping = { "ping", N }, pong = { "pong", N, ping };
+	partner( ping, pong );
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa pingpong.c" //
+// End: //
Index: sts/coroutine/prodcons.c
===================================================================
--- tests/coroutine/prodcons.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,100 +1,0 @@
-//
-// 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.
-//
-// prodcons.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Mon Sep 18 12:23:39 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Aug 18 12:55:10 2018
-// Update Count     : 51
-//
-
-#include <fstream.hfa>
-#include <coroutine.hfa>
-#include <stdlib.hfa>									// random
-#include <unistd.h>										// getpid
-
-coroutine Cons;											// forward
-int delivery( Cons & cons, int p1, int p2 );
-void stop( Cons & cons );
-
-coroutine Prod {
-	Cons * c;
-	int N, money, receipt;
-};
-void main( Prod & prod ) with( prod ) {					// starter ::main
-	// 1st resume starts here
-	for ( i; N ) {										// N pairs of values
-		int p1 = random( 100 );
-		int p2 = random( 100 );
-		sout | p1 | " " | p2 | endl;
-		int status = delivery( *c, p1, p2 );
-		sout | " $" | money | endl;
-		sout | status | endl;
-		receipt += 1;
-	}
-	stop( *c );
-	sout | "prod stops" | endl;
-}
-int payment( Prod & prod, int money ) {
-	prod.money = money;
-	resume( prod );										// main 1st time, then
-	return prod.receipt;								// prod in delivery
-}
-void start( Prod & prod, int N, Cons &c ) {
-	prod.N = N;
-	prod.c = &c;
-	prod.receipt = 0;
-	resume( prod );										// activate main
-}
-
-coroutine Cons {
-	Prod * p;
-	int p1, p2, status;
-	bool done;
-};
-void ?{}( Cons & cons, Prod & p ) {
-	cons.p = &p;
-	cons.status = 0;
-	cons.done = false;
-}
-void ^?{}( Cons & cons ) {}
-void main( Cons & cons ) with( cons ) {					// starter prod
-	// 1st resume starts here
-	int money = 1, receipt;
-	for ( ; ! done; ) {
-		sout | p1 | " " | p2 | endl;
-		sout | " $" | money | endl;
-		status += 1;
-		receipt = payment( *p, money );
-		sout | " #" | receipt | endl;
-		money += 1;
-	}
-	sout | "cons stops" | endl;
-}
-int delivery( Cons & cons, int p1, int p2 ) {
-	cons.p1 = p1;
-	cons.p2 = p2;
-	resume( cons );										// main 1st time, then
-	return cons.status;									// cons in payment
-}
-void stop( Cons & cons ) {
-	cons.done = true;
-	resume( cons );										// activate payment
-}
-int main() {
-	Prod prod;
-	Cons cons = { prod };
-	srandom( /* getpid() */ 103 );						// fixed seed for testing
-	start( prod, 5, cons );
-	sout | "main stops" | endl;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa prodcons.c" //
-// End: //
Index: tests/coroutine/prodcons.cfa
===================================================================
--- tests/coroutine/prodcons.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/coroutine/prodcons.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,94 @@
+//
+// 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.
+//
+// prodcons.c --
+//
+// Author           : Peter A. Buhr
+// Created On       : Mon Sep 18 12:23:39 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Dec 12 23:04:49 2018
+// Update Count     : 53
+//
+
+#include <fstream.hfa>
+#include <coroutine.hfa>
+#include <stdlib.hfa>									// random
+#include <unistd.h>										// getpid
+
+coroutine Cons;											// forward
+int delivery( Cons & cons, int p1, int p2 );
+void stop( Cons & cons );
+
+coroutine Prod {
+	Cons & c;
+	int N, money, receipt;
+};
+void main( Prod & prod ) with( prod ) {					// starter ::main
+	// 1st resume starts here
+	for ( i; N ) {										// N pairs of values
+		int p1 = random( 100 ), p2 = random( 100 );
+		sout | p1 | " " | p2;
+		int status = delivery( c, p1, p2 );
+		sout | " $" | money | nl | status;
+		receipt += 1;
+	}
+	stop( c );
+	sout | "prod stops";
+}
+int payment( Prod & prod, int money ) {
+	prod.money = money;
+	resume( prod );										// main 1st time, then
+	return prod.receipt;								// prod in delivery
+}
+void start( Prod & prod, int N, Cons &c ) {
+	&prod.c = &c;
+	prod.[N, receipt] = [N, 0];
+	resume( prod );										// activate main
+}
+
+coroutine Cons {
+	Prod & p;
+	int p1, p2, status;
+	bool done;
+};
+void ?{}( Cons & cons, Prod & p ) {
+	&cons.p = &p;
+	cons.[status, done ] = [0, false];
+}
+void ^?{}( Cons & cons ) {}
+void main( Cons & cons ) with( cons ) {					// starter prod
+	// 1st resume starts here
+	int money = 1, receipt;
+	for ( ; ! done; ) {
+		sout | p1 | " " | p2 | nl | " $" | money;
+		status += 1;
+		receipt = payment( p, money );
+		sout | " #" | receipt;
+		money += 1;
+	}
+	sout | "cons stops";
+}
+int delivery( Cons & cons, int p1, int p2 ) {
+	cons.[p1, p2] = [p1, p2];
+	resume( cons );										// main 1st time, then
+	return cons.status;									// cons in payment
+}
+void stop( Cons & cons ) {
+	cons.done = true;
+	resume( cons );										// activate payment
+}
+int main() {
+	Prod prod;
+	Cons cons = { prod };
+	srandom( /* getpid() */ 103 );						// fixed seed for testing
+	start( prod, 5, cons );
+	sout | "main stops";
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa prodcons.c" //
+// End: //
Index: sts/coroutine/runningTotal.c
===================================================================
--- tests/coroutine/runningTotal.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,51 +1,0 @@
-//
-// 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.
-//
-// runningTotal.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Wed Dec  6 08:05:27 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug 16 08:22:29 2018
-// Update Count     : 3
-//
-
-#include <fstream.hfa>
-#include <coroutine.hfa>
-
-coroutine RunTotal {									// input numbers and return running total
-	int input, total;									// communication
-};
-
-void ?{}( RunTotal & rntl ) { rntl.total = 0; }
-
-void update( RunTotal & rntl, int input ) with( rntl ) { // helper
-	total += input;										// remember between activations
-	suspend();											// inactivate on stack
-}
-
-void main( RunTotal & rntl ) with( rntl ) {
-	for () {
-		update( rntl, input );
-	} // for
-}
-
-int add( RunTotal & rntl, int input ) {
-	rntl.input = input;									// pass input to coroutine
-	resume( rntl );
-	return rntl.total;									// return total from coroutine
-}
-int main() {
-	RunTotal rntl;
-	for ( i; 10 ) {
-		sout | i | add( rntl, i ) | endl;
-	} // for
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa runningTotal.c" //
-// End: //
Index: tests/coroutine/runningTotal.cfa
===================================================================
--- tests/coroutine/runningTotal.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/coroutine/runningTotal.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,51 @@
+//
+// 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.
+//
+// runningTotal.c --
+//
+// Author           : Peter A. Buhr
+// Created On       : Wed Dec  6 08:05:27 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Dec 11 21:59:00 2018
+// Update Count     : 4
+//
+
+#include <fstream.hfa>
+#include <coroutine.hfa>
+
+coroutine RunTotal {									// input numbers and return running total
+	int input, total;									// communication
+};
+
+void ?{}( RunTotal & rntl ) { rntl.total = 0; }
+
+void update( RunTotal & rntl, int input ) with( rntl ) { // helper
+	total += input;										// remember between activations
+	suspend();											// inactivate on stack
+}
+
+void main( RunTotal & rntl ) with( rntl ) {
+	for () {
+		update( rntl, input );
+	} // for
+}
+
+int add( RunTotal & rntl, int input ) {
+	rntl.input = input;									// pass input to coroutine
+	resume( rntl );
+	return rntl.total;									// return total from coroutine
+}
+int main() {
+	RunTotal rntl;
+	for ( i; 10 ) {
+		sout | i | add( rntl, i );
+	} // for
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa runningTotal.c" //
+// End: //
Index: tests/div.cfa
===================================================================
--- tests/div.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/div.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,10 +10,10 @@
 // Created On       : Tue Aug  8 16:28:43 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 17:53:10 2018
-// Update Count     : 19
+// Last Modified On : Tue Dec  4 21:35:01 2018
+// Update Count     : 20
 //
 
 #include <fstream.hfa>
-#include <stdlib.hfa>										// div
+#include <stdlib.hfa>									// div
 
 struct T { int i; };
@@ -23,9 +23,9 @@
 
 int main( void ) {
-	sout | "div" | div( 13, 5 ) | div( 13L, 5L ) | div( 13LL, 5LL ) | endl;
+	sout | "div" | div( 13, 5 ) | div( 13L, 5L ) | div( 13LL, 5LL );
 	short s1 = 13, s2 = 5;
-	sout | "div" | div( s1, s2 ) | endl;
+	sout | "div" | div( s1, s2 );
 	T t1 = { 13 }, t2 = { 5 };
-	sout | "div" | div( t1, t2 ) | endl;				// polymorphic div
+	sout | "div" | div( t1, t2 );						// polymorphic div
 } // main
 
Index: tests/except-0.cfa
===================================================================
--- tests/except-0.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/except-0.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -25,5 +25,5 @@
 void ^?{}(signal_exit * this) {
 	printf("Exiting: %s\n", this->area);
-//	sout | "Exiting:" | this->area | endl;
+//	sout | "Exiting:" | this->area;
 }
 
Index: tests/fallthrough.cfa
===================================================================
--- tests/fallthrough.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/fallthrough.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Wed Mar 14 10:06:25 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Nov  8 09:09:09 2018
-// Update Count     : 16
+// Last Modified On : Mon Dec 24 11:24:35 2018
+// Update Count     : 22
 //
 
@@ -18,48 +18,48 @@
 void test(int choice) {
 	choose ( choice ) {
-		case 1:
-			sout | "case 1" | endl;
-			fallthru;
-		case 2:
-			sout | "case 2" | endl;
-			fallthru;
-			sout | "did not fallthru" | endl;
-			if ( 7 ) fallthru common2;
-			fallthru common1;
-		case 3:
-			sout | "case 3" | endl;
-			fallthru default;
-			fallthru common1;
-		common1:
-			sout | "common1" | endl;
+	  case 1:
+		sout | "case 1";
+		fallthru;
+	  case 2:
+		sout | "case 2";
+		fallthru;
+		sout | "did not fallthru";
+		if ( 7 ) fallthru common2;
+		fallthru common1;
+	  case 3:
+		sout | "case 3";
+		fallthru default;
+		fallthru common1;
+	  common1:
+		sout | "common1";
 		// break
-		case 4:
-			sout | "case 4" | endl;
-			fallthru common2;
-		case 5:
-			sout | "case 5" | endl;
-			fallthru common2;
-			fallthru default;
-		case 6:
-			sout | "case 6" | endl;
-			fallthru common2;
-		common2:
-			sout | "common2" | endl;
+	  case 4:
+		sout | "case 4";
+		fallthru common2;
+	  case 5:
+		sout | "case 5";
+		fallthru common2;
+		fallthru default;
+	  case 6:
+		sout | "case 6";
+		fallthru common2;
+	  common2:
+		sout | "common2";
 		// break
-		default:
-			sout | "default" | endl;
-			fallthru;
-	}
+	  default:
+		sout | "default";
+		fallthru;
+	} // choose
 
-	sout | endl;
+	sout | nl;
 
 	switch ( choice ) {
 	  case 1:
-		sout | "case 1" | endl;
+		sout | "case 1";
 		switch ( choice ) {
 		  case 1:
-			sout | "case 1" | endl;
+			sout | "case 1";
 			for ( int i = 0; i < 4; i += 1 ) {
-				printf("%d\n", i);
+				sout | i;
 				if ( i == 2 ) fallthru common;
 			} // for
@@ -67,19 +67,19 @@
 		break;
 	  case 5:
-		sout | "case 5" | endl;
+		sout | "case 5";
 		if ( choice == 5 ) {
 			if ( choice != 5 ) {
-				sout | "error" | endl;
+				sout | "error";
 			} else {
-				sout | "check" | endl;
+				sout | "check";
 				fallthru common;
 			} // if
 		} // if
 	  common:
-		printf( "common\n" );
+		sout | "common";
 		fallthru;
 		break;
 	  default:
-		printf( "default\n" );
+		sout | "default";
 		fallthru;
 	} // switch
@@ -93,23 +93,23 @@
 	fallthru default;
 	choose ( 3 ) {
-		case 2:
-			for () {
-				choose ( 2 ) {
-					case 1:
-						// ERROR: default is later, but in a different switch
-						fallthru default;
-						// ERROR: common3 is later, but not at the same level as a case clause
-						fallthru common3;
-				}
-				common3: ;
+	  case 2:
+		for () {
+			choose ( 2 ) {
+			  case 1:
+				// ERROR: default is later, but in a different switch
+				fallthru default;
+				// ERROR: common3 is later, but not at the same level as a case clause
+				fallthru common3;
 			}
-		default:
-		case 1:
-		common4:
-			// ERROR: attempt to jump up with fallthrough
-			if ( 7 ) fallthru common4;
-			// ERROR: attempt to jump up with fallthrough
-			fallthru default;
-	}
+		  common3: ;
+		} // for
+	  default:
+	  case 1:
+	  common4:
+		// ERROR: attempt to jump up with fallthrough
+		if ( 7 ) fallthru common4;
+		// ERROR: attempt to jump up with fallthrough
+		fallthru default;
+	} // choose
 #endif
 }
@@ -117,5 +117,5 @@
 int main() {
 	test( 1 );
-	sout | endl;
+	sout | nl;
 	test( 5 );
 }
Index: tests/fstream_test.cfa
===================================================================
--- tests/fstream_test.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/fstream_test.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 17:53:56 2018
-// Update Count     : 66
+// Last Modified On : Sat Dec 22 09:47:44 2018
+// Update Count     : 68
 //
 
@@ -18,14 +18,14 @@
 int main( void ) {
 	int nombre;
-	sout | "Entrez un nombre, s'il vous plaît:" | endl;
+	sout | "Entrez un nombre, s'il vous plaît:";
 	sin  | nombre;
-	sout | "Vous avez entré" | nombre | endl;
+	sout | "Vous avez entré" | nombre;
 	sout | "le nombre" | nombre | "est"
-		 | (nombre > 0 ? "positif" : nombre == 0 ? "zéro" : "négatif") | endl;
+		 | (nombre > 0 ? "positif" : nombre == 0 ? "zéro" : "négatif");
 
-	sout | "Entrez trois nombres, s'il vous plaît: " | endl;
+	sout | "Entrez trois nombres, s'il vous plaît:";
 	int i, j, k;
 	sin  | i | j | k;
-	sout | "Vous avez entré" | "i:" | "" | i | "j:" | "" | j | "k:" | "" | k | endl;
+	sout | "Vous avez entré" | "i:" | "" | i | "j:" | "" | j | "k:" | "" | k;
 }
 
Index: tests/function-operator.cfa
===================================================================
--- tests/function-operator.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/function-operator.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Fri Aug 25 15:21:11 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug  2 09:27:53 2018
-// Update Count     : 8
+// Last Modified On : Tue Dec  4 21:37:09 2018
+// Update Count     : 9
 //
 
@@ -83,5 +83,5 @@
 // TODO: abstract over (os, T)
 os_wrapper ?=?(os_wrapper & wrapper, int x) {
-	*wrapper.out | x | endl;
+	*wrapper.out | x;
 	return wrapper;
 }
Index: tests/genericUnion.cfa
===================================================================
--- tests/genericUnion.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/genericUnion.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -1,2 +1,17 @@
+// 
+// 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.
+// 
+// genericUnion.cfa -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Tue Dec 25 14:42:46 2018
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Dec 25 14:46:33 2018
+// Update Count     : 2
+// 
+
 #include <limits.hfa>
 
@@ -4,10 +19,10 @@
 union ByteView {
 	T val;
-	char bytes[(sizeof(int))]; // want to change to sizeof(T)
+	char bytes[(sizeof(int))];							// want to change to sizeof(T)
 };
 
 forall(otype T)
 void print(ByteView(T) x) {
-	for (int i = 0; i < sizeof(int); i++) { // want to change to sizeof(T)
+	for (int i = 0; i < sizeof(int); i++) {				// want to change to sizeof(T)
 		printf("%02x", x.bytes[i] & 0xff);
 	}
@@ -29,2 +44,7 @@
 	f(i, -1);
 }
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa genericUnion.cfa" //
+// End: //
Index: tests/gmp.cfa
===================================================================
--- tests/gmp.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/gmp.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Tue Apr 19 08:55:51 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 17:54:34 2018
-// Update Count     : 557
+// Last Modified On : Thu Dec 20 22:41:47 2018
+// Update Count     : 559
 //
 
@@ -19,87 +19,87 @@
 
 int main( void ) {
-	sout | "constructors" | endl;
+	sout | "constructors";
 	short int si = 3;
 	Int x = { "50000000000000000000" }, y = { si }, z = x + y;
-	sout | x | y | z | endl;
-	sout | "x:" | x | "y:" | y | "z:" | z | endl;
+	sout | x | y | z;
+	sout | "x:" | x | "y:" | y | "z:" | z;
 
-	sout | "conversions" | endl;
+	sout | "conversions";
 	y = 'a';
-	sout | "y:" | y | endl;
+	sout | "y:" | y;
 	y = "12345678901234567890123456789";
-	sout | "y:" | y | endl;
+	sout | "y:" | y;
 	y = 100`mp + 100`mp;
-	sout | "y:" | y | endl;
+	sout | "y:" | y;
 	y = -200u`mp + -200u`mp;
-	sout | "y:" | y | endl;
+	sout | "y:" | y;
 	y = "12345678901234567890123456789"`mp + "12345678901234567890123456789"`mp;
-	sout | "y:" | y | endl;
+	sout | "y:" | y;
 	y = si;
-	sout | "y:" | y | endl;
+	sout | "y:" | y;
 	y = -3;
-	sout | "y:" | y | endl;
+	sout | "y:" | y;
 	y += 7;
-	sout | "y:" | y | endl;
+	sout | "y:" | y;
 	y -= 1;
-	sout | "y:" | y | endl;
+	sout | "y:" | y;
 	int b;
 	b = y;
 	si = y;
-	sout | "y:" | y | "b:" | b | "si:" | si | endl;
+	sout | "y:" | y | "b:" | b | "si:" | si;
 
-	sout | "comparison" | endl;
-	sout | x == x | endl;
-	sout | x != x | endl;
-	sout | x < x | endl;
-	sout | x <= x | endl;
-	sout | x > x | endl;
-	sout | x >= x | endl;
+	sout | "comparison";
+	sout | x == x;
+	sout | x != x;
+	sout | x < x;
+	sout | x <= x;
+	sout | x > x;
+	sout | x >= x;
 
-	sout | "arithmetic" | endl;
+	sout | "arithmetic";
 	z = x + y + z;
-	sout | "z:" | z | endl;
+	sout | "z:" | z;
 	z = z = x;
-	sout | "z:" | z | endl;
+	sout | "z:" | z;
 	z = x - y - z;
-	sout | "z:" | z | endl;
+	sout | "z:" | z;
 	z = x * y * z;
-	sout | "z:" | z | endl;
+	sout | "z:" | z;
 	z = x * 3;
-	sout | "z:" | z | endl;
+	sout | "z:" | z;
 	z = 3 * x;
-	sout | "z:" | z | endl;
+	sout | "z:" | z;
 	z = x / 3;
-	sout | "z:" | z | endl;
-	sout | div( x, 3 ) | x / 3 | "," | x % 3 | endl;
+	sout | "z:" | z;
+	sout | div( x, 3 ) | x / 3 | "," | x % 3;
 	[ x, y ] = div( x, 3 );
-	sout | "x:" | x | "y:" | y | endl;
+	sout | "x:" | x | "y:" | y;
 
-	sout | endl;
+	sout | nl;
 
 	sin | x | y | z;
-	sout | x | y | z | endl;
+	sout | x | y | z;
 
-	sout | endl;
+	sout | nl;
 
-	sout | "Fibonacci Numbers" | endl;
+	sout | "Fibonacci Numbers";
 	Int fn, fn1, fn2;
 	fn = (Int){0}; fn1 = fn;							// 1st case
-	sout | (int)0 | fn | endl;
+	sout | (int)0 | fn;
 	fn = 1; fn2 = fn1; fn1 = fn;						// 2nd case
-	sout | 1 | fn | endl;
+	sout | 1 | fn;
 	for ( i; 2u ~= 200 ) {
 		fn = fn1 + fn2; fn2 = fn1; fn1 = fn;			// general case
-		sout | i | fn | endl;
+		sout | i | fn;
 	} // for
 
-	sout | endl;
+	sout | nl;
 
-	sout | "Factorial Numbers" | endl;
+	sout | "Factorial Numbers";
 	Int fact = 1;										// 1st case
-	sout | (int)0 | fact | endl;
+	sout | (int)0 | fact;
 	for ( i; 1u ~= 40u ) {
 		fact *= i;										// general case
-		sout | i | fact | endl;
+		sout | i | fact;
 	} // for
 } // main
Index: tests/heap.cfa
===================================================================
--- tests/heap.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/heap.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Tue Nov  6 17:54:56 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Nov  8 09:03:54 2018
-// Update Count     : 17
+// Last Modified On : Tue Dec 11 21:52:40 2018
+// Update Count     : 18
 // 
 
@@ -45,23 +45,23 @@
 		for ( i; NoOfAllocs ) {
 			locns[i] = alloc( i );
-			//sout | (void *)locns[i] | endl;
+			//sout | (void *)locns[i];
 			for ( k; i ) locns[i][k] = '\345';
 		} // for
-		//sout | (char *)sbrk(0) - start | " bytes" | endl;
+		//sout | (char *)sbrk(0) - start | " bytes";
 
 		for ( i; NoOfAllocs ) {
-			//sout | (void *)locns[i] | endl;
+			//sout | (void *)locns[i];
 			for ( k; i ) if ( locns[i][k] != '\345' ) abort( "new/delete corrupt storage1" );
 			free( locns[i] );
 		} // for
-		//sout | (char *)sbrk(0) - start | " bytes" | endl;
+		//sout | (char *)sbrk(0) - start | " bytes";
 
 		for ( i; NoOfAllocs ) {
 			locns[i] = alloc( i );
-			//sout | (void *)locns[i] | endl;
+			//sout | (void *)locns[i];
 			for ( k; i ) locns[i][k] = '\345';
 		} // for
 		for ( i; NoOfAllocs - 1 -~= 0 ) {
-			//sout | (void *)locns[i] | endl;
+			//sout | (void *)locns[i];
 			for ( k; i ) if ( locns[i][k] != '\345' ) abort( "new/delete corrupt storage2" );
 			free( locns[i] );
@@ -186,9 +186,9 @@
 
 	for ( a; libAlign() ~= limit ~ a ) {				// generate powers of 2
-		//sout | alignments[a] | endl;
+		//sout | alignments[a];
 		for ( s; 1 ~ NoOfAllocs ) {						// allocation of size 0 can return null
 			char * area = (char *)memalign( a, s );
 			if ( area == 0 ) abort( "memalign/free out of memory" );
-			//sout | i | " " | area | endl;
+			//sout | i | " " | area;
 			if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
 				abort( "memalign/free bad alignment : memalign(%d,%d) = %p", (int)a, s, area );
@@ -203,10 +203,10 @@
 
 	for ( a; libAlign() ~= limit ~ a ) {				// generate powers of 2
-		//sout | alignments[a] | endl;
+		//sout | alignments[a];
 		for ( i; 1 ~ NoOfMmaps ) {
 			size_t s = i + default_mmap_start();		// cross over point
 			char * area = (char *)memalign( a, s );
 			if ( area == 0 ) abort( "memalign/free out of memory" );
-			//sout | i | " " | area | endl;
+			//sout | i | " " | area;
 			if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
 				abort( "memalign/free bad alignment : memalign(%d,%d) = %p", (int)a, (int)s, area );
@@ -268,5 +268,5 @@
 		char * area = (char *)memalign( a, amount );	// aligned N-byte allocation
 		if ( area == 0 ) abort( "memalign/realloc/free out of memory" ); // no storage ?
-		//sout | alignments[a] | " " | area | endl;
+		//sout | alignments[a] | " " | area;
 		if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
 			abort( "memalign/realloc/free bad alignment : memalign(%d,%d) = %p", (int)a, (int)amount, area );
@@ -279,5 +279,5 @@
 			area = (char *)realloc( area, s );			// attempt to reuse storage
 			if ( area == 0 ) abort( "memalign/realloc/free out of memory" ); // no storage ?
-			//sout | i | " " | area | endl;
+			//sout | i | " " | area;
 			if ( (size_t)area % a != 0 ) {				// check for initial alignment
 				abort( "memalign/realloc/free bad alignment %p", area );
@@ -291,9 +291,9 @@
 
 	for ( a; libAlign() ~= limit ~ a ) {				// generate powers of 2
-		//sout | alignments[a] | endl;
+		//sout | alignments[a];
 		for ( s; 1 ~ limit ) {							// allocation of size 0 can return null
 			char * area = (char *)cmemalign( a, 1, s );
 			if ( area == 0 ) abort( "cmemalign/free out of memory" );
-			//sout | i | " " | area | endl;
+			//sout | i | " " | area;
 			if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
 				abort( "cmemalign/free bad alignment : cmemalign(%d,%d) = %p", (int)a, s, area );
@@ -314,5 +314,5 @@
 		char * area = (char *)cmemalign( a, 1, amount ); // aligned N-byte allocation
 		if ( area == 0 ) abort( "cmemalign/realloc/free out of memory" ); // no storage ?
-		//sout | alignments[a] | " " | area | endl;
+		//sout | alignments[a] | " " | area;
 		if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
 			abort( "cmemalign/realloc/free bad alignment : cmemalign(%d,%d) = %p", (int)a, (int)amount, area );
@@ -328,5 +328,5 @@
 			area = (char *)realloc( area, s );			// attempt to reuse storage
 			if ( area == 0 ) abort( "cmemalign/realloc/free out of memory" ); // no storage ?
-			//sout | i | " " | area | endl;
+			//sout | i | " " | area;
 			if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
 				abort( "cmemalign/realloc/free bad alignment %p", area );
@@ -339,5 +339,5 @@
 		free( area );
     } // for
-	//sout | "worker" | thisTask() | "successful completion" | endl;
+	//sout | "worker" | thisTask() | "successful completion";
 } // Worker main
 
Index: tests/hello.cfa
===================================================================
--- tests/hello.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/hello.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 17:56:22 2018
-// Update Count     : 16
+// Last Modified On : Tue Dec  4 21:38:39 2018
+// Update Count     : 17
 //
 
@@ -17,16 +17,16 @@
 
 int main() {
-	sout | "Hello world!" | endl;
-	sout | "Bonjour le monde!" | endl;
-	sout | "Hola Mundo!" | endl;
-	sout | "Hallo Welt!" | endl;
-	sout | "Kaixo Mundua!" | endl;
-	sout | "Chào thế giới!" | endl;
-	sout | "Привет мир!" | endl;
-	sout | "שלום עולם!" | endl;
-	sout | "你好，世界!" | endl;
-	sout | "こんにちは世界!" | endl;
-	sout | "안녕하세요 세계!" | endl;
-	sout | "नमस्ते दुनिया!" | endl;
+	sout | "Hello world!";
+	sout | "Bonjour le monde!";
+	sout | "Hola Mundo!";
+	sout | "Hallo Welt!";
+	sout | "Kaixo Mundua!";
+	sout | "Chào thế giới!";
+	sout | "Привет мир!";
+	sout | "שלום עולם!";
+	sout | "你好，世界!";
+	sout | "こんにちは世界!";
+	sout | "안녕하세요 세계!";
+	sout | "नमस्ते दुनिया!";
 }
 
Index: tests/identity.cfa
===================================================================
--- tests/identity.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/identity.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 17:56:54 2018
-// Update Count     : 19
+// Last Modified On : Tue Dec  4 21:38:59 2018
+// Update Count     : 20
 //
 
@@ -22,17 +22,17 @@
 
 int main() {
-	sout | "char\t\t\t"					| identity( 'z' ) | endl;
-	sout | "signed int\t\t"				| identity( 4 ) | endl;
-	sout | "unsigned int\t\t"			| identity( 4u ) | endl;
-	sout | "signed long int\t\t" 		| identity( 4l ) | endl;
-	sout | "unsigned long int\t" 		| identity( 4ul ) | endl;
-	sout | "signed long long int\t"		| identity( 4ll ) | endl;
-	sout | "unsigned long long int\t"	| identity( 4ull ) | endl;
-	sout | "float\t\t\t" 				| identity( 4.1f ) | endl;
-	sout | "double\t\t\t"				| identity( 4.1 ) | endl;
-	sout | "long double\t\t"			| identity( 4.1l ) | endl;
-	sout | "float _Complex\t\t"			| identity( -4.1F-2.0iF ) | endl;
-	sout | "double _Complex\t\t"		| identity( -4.1D-2.0iD ) | endl;
-	sout | "long double _Complex\t"		| identity( -4.1L-2.0iL ) | endl;
+	sout | "char\t\t\t"					| identity( 'z' );
+	sout | "signed int\t\t"				| identity( 4 );
+	sout | "unsigned int\t\t"			| identity( 4u );
+	sout | "signed long int\t\t" 		| identity( 4l );
+	sout | "unsigned long int\t" 		| identity( 4ul );
+	sout | "signed long long int\t"		| identity( 4ll );
+	sout | "unsigned long long int\t"	| identity( 4ull );
+	sout | "float\t\t\t" 				| identity( 4.1f );
+	sout | "double\t\t\t"				| identity( 4.1 );
+	sout | "long double\t\t"			| identity( 4.1l );
+	sout | "float _Complex\t\t"			| identity( -4.1F-2.0iF );
+	sout | "double _Complex\t\t"		| identity( -4.1D-2.0iD );
+	sout | "long double _Complex\t"		| identity( -4.1L-2.0iL );
 }
 
Index: tests/ifwhileCtl.cfa
===================================================================
--- tests/ifwhileCtl.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/ifwhileCtl.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Sat Aug 26 10:13:11 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 17:57:07 2018
-// Update Count     : 22
+// Last Modified On : Tue Dec  4 21:39:18 2018
+// Update Count     : 23
 //
 
@@ -22,42 +22,42 @@
 
 	if ( int x = 1 ) {
-		sout | "x != 0 correct" | endl;
+		sout | "x != 0 correct";
 	} else {
-		sout | "x == 0 incorrect" | endl;
+		sout | "x == 0 incorrect";
 	} // if
 
 	if ( int x = 4, y = 0 ) {
-		sout | "x != 0 && y != 0 incorrect" | endl;
+		sout | "x != 0 && y != 0 incorrect";
 	} else if ( int x = 4, y = 1 ) {
-		sout | "x != 0 && y != 0 correct" | endl;
+		sout | "x != 0 && y != 0 correct";
 	} else {
-		sout | "x == 0 || y == 0 incorrect" | endl;
+		sout | "x == 0 || y == 0 incorrect";
 	} // if
 
 	if ( int x = 5, y = f( x ); x == y ) {
-		sout | "x == y correct" | endl;
+		sout | "x == y correct";
 	} else {
-		sout | "x != y incorrect" | endl;
+		sout | "x != y incorrect";
 	} // if
 
 	if ( struct S { int i; } s = { 3 }; s.i < 4 ) {
 		S s1;
-		sout | "s.i < 4 correct" | endl;
+		sout | "s.i < 4 correct";
 	} else {
 		S s1;
-		sout | "s.i >= 4 incorrect" | endl;
+		sout | "s.i >= 4 incorrect";
 	} // if
 
 	while ( int x = 1 ) {
-		sout | "x != 0 correct" | endl;
+		sout | "x != 0 correct";
 		break;
 	} // while
 
 	while ( int x = 4, y = 0 ) {
-		sout | "x != 0 && y != 0 incorrect" | endl;
+		sout | "x != 0 && y != 0 incorrect";
 	} // while
 
 	while ( int x = 5, y = f( x ); x == y ) {
-		sout | "x == y correct" | endl;
+		sout | "x == y correct";
 		break;
 	} // while
@@ -65,5 +65,5 @@
 	while ( struct S { int i; } s = { 3 }; s.i < 4 ) {
 		S s1;
-		sout | "s.i < 4 correct" | endl;
+		sout | "s.i < 4 correct";
 		break;
 	} // while
Index: tests/io1.cfa
===================================================================
--- tests/io1.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/io1.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Wed Mar  2 16:56:02 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 17:57:17 2018
-// Update Count     : 105
+// Last Modified On : Fri Dec 21 16:02:55 2018
+// Update Count     : 114
 //
 
@@ -18,52 +18,51 @@
 int main() {
 	int x = 3, y = 5, z = 7;
-	sout | x * 3 | y + 1 | z << 2 | x == y | (x | y) | (x || y) | (x > z ? 1 : 2) | endl;
-	sout | 1 | 2 | 3 | endl;
-	sout | '1' | '2' | '3' | endl;
-	sout | 1 | "" | 2 | "" | 3 | endl;
-	sout | endl;
+	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 | nl;
 
-	sout | "opening delimiters" | endl;
-	sout
-		 | "x (" | 1
-		 | "x [" | 2
-		 | "x {" | 3
-		 | "x =" | 4
-		 | "x $" | 5
-		 | "x £" | 6
-		 | "x ¥" | 7
-		 | "x ¡" | 8
-		 | "x ¿" | 9
-		 | "x «" | 10
-		 | endl | endl;
+	sout | nlOff;
+	sout | "opening delimiters" | nl;
+	sout | "x (" | 1;
+	sout | "x [" | 2;
+	sout | "x {" | 3;
+	sout | "x =" | 4;
+	sout | "x $" | 5;
+	sout | "x £" | 6;
+	sout | "x ¥" | 7;
+	sout | "x ¡" | 8;
+	sout | "x ¿" | 9;
+	sout | "x «" | 10;
+	sout | nl | nl;
 
-	sout | "closing delimiters" | endl;
-	sout
-		 | 1 | ", x"
-		 | 2 | ". x"
-		 | 3 | "; x"
-		 | 4 | "! x"
-		 | 5 | "? x"
-		 | 6 | "% x"
-		 | 7 | "¢ x"
-		 | 8 | "» x"
-		 | 9 | ") x"
-		 | 10 | "] x"
-		 | 11 | "} x"
-		 | endl | endl;
+	sout | "closing delimiters" | nl;
+	sout | 1 | ", x";
+	sout | 2 | ". x";
+	sout | 3 | "; x";
+	sout | 4 | "! x";
+	sout | 5 | "? x";
+	sout | 6 | "% x";
+	sout | 7 | "¢ x";
+	sout | 8 | "» x";
+	sout | 9 | ") x";
+	sout | 10 | "] x";
+	sout | 11 | "} x";
+	sout | nl | nl;
 
-	sout | "opening/closing delimiters" | endl;
-	sout
-		 | "x`" | 1 | "`x'" | 2
-		 | "'x\"" | 3 | "\"x:" | 4
-		 | ":x " | 5 | " x\t" | 6
-		 | "\tx\f" | 7 | "\fx\v" | 8
-		 | "\vx\n" | 9 | "\nx\r" | 10
-		 | "\rx"
-		 | endl | endl;
+	sout | "opening/closing delimiters" | nl;
+	sout | "x`" | 1 | "`x'" | 2;
+	sout | "'x\"" | 3 | "\"x:" | 4;
+	sout | ":x " | 5 | " x\t" | 6;
+	sout | "\tx\f" | 7 | "\fx\v" | 8;
+	sout | "\vx\n" | 9 | "\nx\r" | 10;
+	sout | "\rx";
+	sout | nl | nl;
 
-	sout | "override opening/closing delimiters" | endl;
-	sout | "x ( " | 1 | " ) x" | 2 | " , x" | 3 | " :x: " | 4 | endl;
-	sout | endl;
+	sout | nlOn;
+	sout | "override opening/closing delimiters";
+	sout | "x ( " | 1 | " ) x" | 2 | " , x" | 3 | " :x: " | 4;
+	sout | nl;
 }
 
Index: tests/io2.cfa
===================================================================
--- tests/io2.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/io2.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,11 +10,11 @@
 // Created On       : Wed Mar  2 16:56:02 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 17:57:28 2018
-// Update Count     : 104
+// Last Modified On : Fri Dec 21 08:20:14 2018
+// Update Count     : 112
 //
 
 #include <fstream.hfa>
 
- #define xstr(s) str(s)
+#define xstr(s) str(s)
 #define str(s) #s
 
@@ -41,97 +41,96 @@
 	char s1[size], s2[size];
 
-	ifstream in = { xstr(IN_DIR) "io.data" };						// create / open file
+	ifstream in = { xstr(IN_DIR) "io.data" };			// create / open file
 
-	sout | "input bacis types" | endl;
-	in	 | b											// boolean
-		 | c | sc | usc									// character
-		 | si | usi | i | ui | li | uli | lli | ulli	// integral
-		 | f | d | ld									// floating point
-		 | fc | dc | ldc								// floating-point complex
-		 | cstr( s1 ) | cstr( s2, size );				// C string, length unchecked and checked
-	sout | endl;
+	sout | "input bacis types";
+	in	 | b;											// boolean
+	in	 | c | sc | usc;								// character
+	in	 | si | usi | i | ui | li | uli | lli | ulli;	// integral
+	in	 | f | d | ld;									// floating point
+	in	 | fc | dc | ldc;								// floating-point complex
+	in	 | cstr( s1 ) | cstr( s2, size );				// C string, length unchecked and checked
+	sout | nl;
 
-	sout | "output basic types" | endl;
-	sout | b | endl										// boolean
-		 | c | ' ' | sc | ' ' | usc | endl				// character
-		 | si | usi | i | ui | li | uli | lli | ulli | endl // integral
-		 | f | d | ld | endl							// floating point
-		 | fc | dc | ldc | endl;						// complex
-	sout | endl;
+	sout | "output basic types";
+	sout | b;											// boolean
+	sout | c | ' ' | sc | ' ' | usc;					// character
+	sout | si | usi | i | ui | li | uli | lli | ulli;	// integral
+	sout | f | d | ld;									// floating point
+	sout | fc | dc | ldc;								// complex
+	sout | nl;
 
-	sout | "tuples" | endl;
+	sout | "tuples";
 	[int, [ int, int ] ] t1 = [ 1, [ 2, 3 ] ], t2 = [ 4, [ 5, 6 ] ];
-	sout | t1 | t2 | endl;								// print tuple
-	sout | endl;
+	sout | t1 | t2;										// print tuple
+	sout | nl;
 
-	sout | "toggle separator" | endl;
-	sout | f | "" | d | "" | ld | endl					// floating point without separator
-		 | sepDisable | fc | dc | ldc | endl			// complex without separator
-		 | fc | sepOn | dc | ldc | endl					// local separator add
-		 | sepEnable | fc | dc | ldc | endl				// complex with separator
-		 | fc | sepOff | dc | ldc | endl				// local separator removal
-		 | s1 | sepOff | s2 | endl						// local separator removal
-		 | s1 | "" | s2 | endl;							// local separator removal
-	sout | endl;
+	sout | "toggle separator";
+	sout | f | "" | d | "" | ld;						// floating point without separator
+	sout | sepDisable | fc | dc | ldc;					// complex without separator
+	sout | fc | sepOn | dc | ldc;						// local separator add
+	sout | sepEnable | fc | dc | ldc;					// complex with separator
+	sout | fc | sepOff | dc | ldc;						// local separator removal
+	sout | s1 | sepOff | s2;							// local separator removal
+	sout | s1 | "" | s2;								// local separator removal
+	sout | nl;
 
-	sout | "change separator" | endl;
-	sout | "from \"" | sep | "\"";
+	sout | "change separator";
+	sout | "from \"" | sep | "\"" | nonl;
 	sepSet( sout, ", $" );								// change separator, maximum of 15 characters
-	sout | " to \"" | sep | "\"" | endl;
-	sout | f | d | ld | endl
-		 | fc | dc | ldc | endl
-		 | s1 | s2 | endl
-		 | t1 | t2 | endl;								// print tuple
-	sout | endl;
-	sout | "from \"" | sep | "\" ";
+	sout | " to \"" | sep | "\"";
+	sout | f | d | ld;
+	sout | fc | dc | ldc;
+	sout | s1 | s2;
+	sout | t1 | t2;										// print tuple
+	sout | nl;
+	sout | "from \"" | sep | "\" " | nonl;
 	sepSet( sout, " " );								// restore separator
-	sout | "to \"" | sep | "\"" | endl;
-	sout | f | d | ld | endl
-		 | fc | dc | ldc | endl
-		 | s1 | s2 | endl
-		 | t1 | t2 | endl;								// print tuple
-	sout | endl;
+	sout | "to \"" | sep | "\"";
+	sout | f | d | ld;
+	sout | fc | dc | ldc;
+	sout | s1 | s2;
+	sout | t1 | t2;										// print tuple
+	sout | nl;
 
-	sout | "check sepOn/sepOff" | endl;
-	sout | sepOn | 1 | 2 | 3 | sepOn | endl;			// no separator at start/end of line
-	sout | 1 | sepOff | 2 | 3 | endl;					// locally turn off implicit separator
-	sout | sepOn | sepOn | 1 | 2 | 3 | sepOn | sepOff | sepOn | '\n'; // no separator at start/end of line
-	sout | 1 | 2 | 3 | "\n\n" | sepOn;					// no separator at start of next line
-	sout | 1 | 2 | 3 | endl;
-	sout | endl;
+	sout | "check sepOn/sepOff";
+	sout | sepOn | 1 | 2 | 3 | sepOn;					// no separator at start/end of line
+	sout | 1 | sepOff | 2 | 3;							// locally turn off implicit separator
+	sout | sepOn | sepOn | 1 | 2 | 3 | sepOn | sepOff | sepOn | '\n' | nonl; // no separator at start/end of line
+	sout | 1 | 2 | 3 | "\n\n" | sepOn | nonl;					// no separator at start of next line
+	sout | 1 | 2 | 3;
+	sout | nl;
 
-	sout | "check enable/disable" | endl;
-	sout | sepDisable | 1 | 2 | 3 | endl;				// globally turn off implicit separation
-	sout | 1 | sepOn | 2 | 3 | endl;					// locally turn on implicit separator
-	sout | sepEnable | 1 | 2 | 3 | endl | sepDisable;	// globally turn on/off implicit separation
-	sout | 1 | 2 | 3 | endl | sepEnable;				// globally turn on implicit separation
-	sout | 1 | 2 | 3 | sepOn | sepDisable | endl;		// ignore seperate at end of line
-	sout | 1 | 2 | 3 | sepOn | sepEnable | endl;		// separator at end of line
-	sout | 1 | 2 | 3 | endl;
-	sout | endl;
+	sout | "check enable/disable";
+	sout | sepDisable | 1 | 2 | 3;						// globally turn off implicit separation
+	sout | 1 | sepOn | 2 | 3;							// locally turn on implicit separator
+	sout | sepEnable | 1 | 2 | 3 | sepDisable;			// globally turn on/off implicit separation
+	sout | 1 | 2 | 3 | sepEnable;						// globally turn on implicit separation
+	sout | 1 | 2 | 3 | sepOn | sepDisable;				// ignore seperate at end of line
+	sout | 1 | 2 | 3 | sepOn | sepEnable;				// separator at end of line
+	sout | 1 | 2 | 3;
+	sout | nl;
 
-//	sout | fmt( d, "%8.3f" ) || endl;
-//	sout | endl;
+//	sout | fmt( d, "%8.3f" );
 
 	sepSetTuple( sout, " " );							// set tuple separator from ", " to " "
-	sout | t1 | t2 | " \"" | sep | "\"" | endl;
+	sout | t1 | t2 | " \"" | sep | "\"";
 	sepSetTuple( sout, ", " );							// reset tuple separator to ", "
-	sout | t1 | t2 | " \"" | sep | "\"" | endl;
-	sout | t1 | t2 | endl;								// print tuple
-	sout | endl;
+	sout | t1 | t2 | " \"" | sep | "\"";
+	sout | t1 | t2;										// print tuple
+	sout | nl;
 
 	[int, int, const char *, double] t3 = { 3, 4, "a", 7.2 };
-	sout | [ 3, 4, "a", 7.2 ] | endl;
-	sout | t3 | endl;
+	sout | [ 3, 4, "a", 7.2 ];
+	sout | t3;
 	sepSetTuple( sout, " " );
-	sout | t3 | endl;
-	sout | sepOn | t3 | sepDisable | t3 | sepEnable | t3 | endl;
+	sout | t3;
+	sout | sepOn | t3 | sepDisable | t3 | sepEnable | t3;
 	sepSet( sout, "^" );
 	sepSetTuple( sout, "-" );
-	sout | t3 | 3 | 4 | t3 | endl;
+	sout | t3 | 3 | 4 | t3;
 }
 
 // Local Variables: //
 // tab-width: 4 //
-// compile-command: "cfa io2.cfa" //
+// compile-command: "cfa -DIN_DIR=".in/" io2.cfa" //
 // End: //
Index: tests/literals.cfa
===================================================================
--- tests/literals.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/literals.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  9 16:34:38 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 17:58:07 2018
-// Update Count     : 138
+// Last Modified On : Tue Dec  4 21:44:01 2018
+// Update Count     : 139
 //
 
@@ -18,10 +18,10 @@
 #include <fstream.hfa>
 
-void f( char v ) { sout | "char " | v | endl; }
-void f( signed char v ) { sout | "signed char " | v | endl; }
-void f( unsigned char v ) { sout | "unsigned char " | v | endl; }
-void f( signed short v ) { sout | "signed short int" | v | endl; }
-void f( unsigned short v ) { sout | "unsigned short int" | v | endl; }
-void f( size_t v ) { sout | "size_t" | v | endl; }
+void f( char v ) { sout | "char " | v; }
+void f( signed char v ) { sout | "signed char " | v; }
+void f( unsigned char v ) { sout | "unsigned char " | v; }
+void f( signed short v ) { sout | "signed short int" | v; }
+void f( unsigned short v ) { sout | "unsigned short int" | v; }
+void f( size_t v ) { sout | "size_t" | v; }
 #endif // __CFA__
 
Index: tests/loopctrl.cfa
===================================================================
--- tests/loopctrl.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/loopctrl.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Wed Aug  8 18:32:59 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Nov  7 16:54:11 2018
-// Update Count     : 62
+// Last Modified On : Sun Dec 23 23:00:29 2018
+// Update Count     : 79
 // 
 
@@ -32,47 +32,49 @@
 S ?-=?( S & t, one_t ) { t.i -= 1; t.j -= 1; return t; }
 ofstream & ?|?( ofstream & os, S v ) { return os | '(' | v.i | v.j | ')'; }
+void & ?|?( ofstream & os, S v ) { (ofstream &)(os | v); nl( os ); }
 
 int main() {
-	while () { sout | "empty"; break; }			sout | endl;
-	do { sout | "empty"; break; } while ();		sout | endl;
-	for () { sout | "empty"; break; }			sout | endl | endl;
+	sout | nlOff;										// turn off auto newline
+	while () { sout | "empty"; break; }					sout | nl;
+	do { sout | "empty"; break; } while ();				sout | nl;
+	for () { sout | "empty"; break; }					sout | nl | nl;
 
-	for ( 0 ) { sout | "A"; }					sout | "zero" | endl;
-	for ( 1 ) { sout | "A"; }					sout | endl;
-	for ( 10 ) { sout | "A"; }					sout | endl;
-	for ( 1 ~= 10 ~ 2 ) { sout | "B"; }			sout | endl;
-	for ( 10 -~= 1 ~ 2 ) { sout | "C"; }		sout | endl;
-	for ( 0.5 ~ 5.5 ) { sout | "D"; }			sout | endl;
-	for ( 5.5 -~ 0.5 ) { sout | "E"; }			sout | endl | endl;
+	for ( 0 ) { sout | "A"; }							sout | "zero" | nl;
+	for ( 1 ) { sout | "A"; }							sout | nl;
+	for ( 10 ) { sout | "A"; }							sout | nl;
+	for ( 1 ~= 10 ~ 2 ) { sout | "B"; }					sout | nl;
+	for ( 10 -~= 1 ~ 2 ) { sout | "C"; }				sout | nl;
+	for ( 0.5 ~ 5.5 ) { sout | "D"; }					sout | nl;
+	for ( 5.5 -~ 0.5 ) { sout | "E"; }					sout | nl | nl;
 
-	for ( i; 10 ) { sout | i; }					sout | endl;
-	for ( i; 1 ~= 10 ~ 2 ) { sout | i; }		sout | endl;
-	for ( i; 10 -~= 1 ~ 2 ) { sout | i; }		sout | endl;
-	for ( i; 0.5 ~ 5.5 ) { sout | i; }			sout | endl;
-	for ( i; 5.5 -~ 0.5 ) { sout | i; }			sout | endl;
-	for ( ui; 2u ~= 10u ~ 2u ) { sout | ui; }	sout | endl;
-	for ( ui; 10u -~= 2u ~ 2u ) { sout | ui; }	sout | endl | endl | endl;
+	for ( i; 10 ) { sout | i; }							sout | nl;
+	for ( i; 1 ~= 10 ~ 2 ) { sout | i; }				sout | nl;
+	for ( i; 10 -~= 1 ~ 2 ) { sout | i; }				sout | nl;
+	for ( i; 0.5 ~ 5.5 ) { sout | i; }					sout | nl;
+	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;
 
 	enum { N = 10 };
-	for ( N ) { sout | "N"; }					sout | endl;
-	for ( i; N ) { sout | i; }					sout | endl;
-	for ( i; N -~ 0 ) { sout | i; }				sout | endl | endl | endl;
+	for ( N ) { sout | "N"; }							sout | nl;
+	for ( i; N ) { sout | i; }							sout | nl;
+	for ( i; N -~ 0 ) { sout | i; }						sout | nl | nl | nl;
 
 	const int start = 3, comp = 10, inc = 2;
-	for ( i; start ~ comp ~ inc + 1 ) { sout | i; } sout | endl | endl;
+	for ( i; start ~ comp ~ inc + 1 ) { sout | i; }		sout | nl | nl;
 
-	sout | endl;
-	for ( S s = (S){0}; s < (S){10,10}; s += (S){1} ) { sout | s; } sout | endl;
-	for ( s; (S){10,10} ) { sout | s; } sout | endl;
-	sout | endl;
-	for ( s; (S){0} ~ (S){10,10} ) { sout | s; } sout | endl;
-	for ( s; (S){0} ~ (S){10,10} ~ (S){1} ) { sout | s; } sout | endl;
-	for ( s; (S){0} ~= (S){10,10} ) { sout | s; } sout | endl;
-	for ( s; (S){0} ~= (S){10,10} ~ (S){1} ) { sout | s; } sout | endl;
-	sout | endl;
-	for ( s; (S){10,10} -~ (S){0} ) { sout | s; } sout | endl;
-	for ( s; (S){10,10} -~ (S){0} ~ (S){1} ) { sout | s; } sout | endl;
-	for ( s; (S){10,10} -~= (S){0} ) { sout | s; } sout | endl;
-	for ( s; (S){10,10} -~= (S){0} ~ (S){1} ) { sout | s; } sout | endl;
+	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;
+	sout | nl;
+	for ( s; (S){0} ~ (S){10,10} ) { sout | s; }		 sout | nl;
+	for ( s; (S){0} ~ (S){10,10} ~ (S){1} ) { sout | s; } sout | nl;
+	for ( s; (S){0} ~= (S){10,10} ) { sout | s; }		 sout | nl;
+	for ( s; (S){0} ~= (S){10,10} ~ (S){1} ) { sout | s; } sout | nl;
+	sout | nl;
+	for ( s; (S){10,10} -~ (S){0} ) { sout | s; }		 sout | nl;
+	for ( s; (S){10,10} -~ (S){0} ~ (S){1} ) { sout | s; } sout | nl;
+	for ( s; (S){10,10} -~= (S){0} ) { sout | s; }		 sout | nl;
+	for ( s; (S){10,10} -~= (S){0} ~ (S){1} ) { sout | s; } sout | nl;
 }
 
Index: tests/math1.cfa
===================================================================
--- tests/math1.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/math1.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Fri Apr 22 14:59:21 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 17:58:37 2018
-// Update Count     : 86
+// Last Modified On : Wed Dec 12 16:28:49 2018
+// Update Count     : 89
 //
 
@@ -22,30 +22,34 @@
 	long double l;
 
-	sout | "fmod:" | 5.0F % -2.0F | fmod( 5.0F, -2.0F ) | 5.0D % -2.0D | fmod( 5.0D, -2.0D ) | 5.0L % -2.0L | fmod( 5.0L, -2.0L ) | endl;
-	sout | "remainder:" | remainder( 2.0F, 3.0F ) | remainder( 2.0D, 3.0D ) | remainder( 2.0L, 3.0L ) | endl;
+	sout | "fmod:" | 5.0F % -2.0F | fmod( 5.0F, -2.0F ) | 5.0D % -2.0D | nonl;
+	sout | fmod( 5.0D, -2.0D ) | 5.0L % -2.0L | fmod( 5.0L, -2.0L );
+	sout | "remainder:" | remainder( 2.0F, 3.0F ) | remainder( 2.0D, 3.0D ) | remainder( 2.0L, 3.0L );
 	int quot;
 	f = remquo( 3.6F, 0.5F, &quot );
-	sout | "remquo:" | quot | f;
+	sout | "remquo:" | quot | f | nonl;
 	d = remquo( 3.6D, 0.5F, &quot );
-	sout | quot | d;
+	sout | quot | d | nonl;
 	l = remquo( 3.6L, 0.5L, &quot );
-	sout | quot | l | endl;
-	sout | "div:" | div( 3.6F, 0.5F ) | div( 3.6D, 0.5D ) | div( 3.6L, 0.5L ) | endl;
-	sout | "fma:" | fma( 3.0F, -1.0F, 1.0F ) | fma( 3.0D, -1.0D, 1.0D ) | fma( 3.0L, -1.0L, , 1.0L ) | endl;
-	sout | "fdim:" | fdim( 1.0F, -1.0F ) | fdim( 1.0D, -1.0D ) | fdim( 1.0L, -1.0L ) | endl;
-	sout | "nan:" | (float)nan( "" ) | (double)nan( "" ) | (long double)nan( "" ) | endl;
+	sout | quot | l;
+	sout | "div:" | div( 3.6F, 0.5F ) | div( 3.6D, 0.5D ) | div( 3.6L, 0.5L );
+	sout | "fma:" | fma( 3.0F, -1.0F, 1.0F ) | fma( 3.0D, -1.0D, 1.0D ) | fma( 3.0L, -1.0L, , 1.0L );
+	sout | "fdim:" | fdim( 1.0F, -1.0F ) | fdim( 1.0D, -1.0D ) | fdim( 1.0L, -1.0L );
+	sout | "nan:" | (float)nan( "" ) | (double)nan( "" ) | (long double)nan( "" );
 
 	//---------------------- Exponential ----------------------
 
-	sout | "exp:" | exp( 1.0F ) | exp( 1.0D ) | exp( 1.0L ) | exp( 1.0F+1.0FI ) | exp( 1.0D+1.0DI ) | exp( 1.0DL+1.0LI ) | endl;
-	sout | "exp2:" | exp2( 1.0F ) | exp2( 1.0D ) | exp2( 1.0L ) | endl;
-	sout | "expm1:" | expm1( 1.0F ) | expm1( 1.0D ) | expm1( 1.0L ) | endl;
-	sout | "pow:" | pow( 1.0F, 1.0F ) | pow( 1.0D, 1.0D ) | pow( 1.0L, 1.0L ) | pow( 1.0F+1.0FI, 1.0F+1.0FI ) | pow( 1.0D+1.0DI, 1.0D+1.0DI ) | pow( 1.5DL+1.5LI, 1.5DL+1.5LI ) | endl;
+	sout | "exp:" | exp( 1.0F ) | exp( 1.0D ) | exp( 1.0L ) | nonl;
+	sout | exp( 1.0F+1.0FI ) | exp( 1.0D+1.0DI ) | exp( 1.0DL+1.0LI );
+	sout | "exp2:" | exp2( 1.0F ) | exp2( 1.0D ) | exp2( 1.0L );
+	sout | "expm1:" | expm1( 1.0F ) | expm1( 1.0D ) | expm1( 1.0L );
+	sout | "pow:" | pow( 1.0F, 1.0F ) | pow( 1.0D, 1.0D ) | pow( 1.0L, 1.0L ) | nonl;
+	sout | pow( 1.0F+1.0FI, 1.0F+1.0FI ) | pow( 1.0D+1.0DI, 1.0D+1.0DI ) | pow( 1.5DL+1.5LI, 1.5DL+1.5LI );
 
 	int b = 4;
 	unsigned int e = 2;
     b \= e;
-    sout | "\\" | b | b \ e | endl;
-    sout | "\\" | 'a' \ 3u | 2 \ 8u | 4 \ 3u | -4 \ 3u | 4 \ -3 | -4 \ -3 | 4.0 \ 2.1 | (1.0f+2.0fi) \ (3.0f+2.0fi) | endl;
+    sout | "\\" | b | b \ e;
+    sout | "\\" | 'a' \ 3u | 2 \ 8u | 4 \ 3u | -4 \ 3u | nonl;
+	sout | 4 \ -3 | -4 \ -3 | 4.0 \ 2.1 | (1.0f+2.0fi) \ (3.0f+2.0fi);
 } // main
 
Index: tests/math2.cfa
===================================================================
--- tests/math2.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/math2.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Fri Apr 22 14:59:21 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 17:58:55 2018
-// Update Count     : 83
+// Last Modified On : Wed Dec 12 16:11:35 2018
+// Update Count     : 87
 //
 
@@ -24,25 +24,33 @@
 	//---------------------- Logarithm ----------------------
 
-	sout | "log:" | log( 1.0F ) | log( 1.0D ) | log( 1.0L ) | log( 1.0F+1.0FI ) | log( 1.0D+1.0DI ) | log( 1.0DL+1.0LI ) | endl;
-	sout | "log2:" | log2( 8.0F ) | log2( 8.0D ) | log2( 8.0L ) | endl;
-	sout | "log10:" | log10( 100.0F ) | log10( 100.0D ) | log10( 100.0L ) | endl;
-	sout | "log1p:" | log1p( 1.0F ) | log1p( 1.0D ) | log1p( 1.0L ) | endl;
-	sout | "ilogb:" | ilogb( 1.0F ) | ilogb( 1.0D ) | ilogb( 1.0L ) | endl;
-	sout | "logb:" | logb( 8.0F ) | logb( 8.0D ) | logb( 8.0L ) | endl;
+	sout | "log:" | log( 1.0F ) | log( 1.0D ) | log( 1.0L ) | nonl;
+	sout | log( 1.0F+1.0FI ) | log( 1.0D+1.0DI ) | log( 1.0DL+1.0LI );
+	sout | "log2:" | log2( 8.0F ) | log2( 8.0D ) | log2( 8.0L );
+	sout | "log10:" | log10( 100.0F ) | log10( 100.0D ) | log10( 100.0L );
+	sout | "log1p:" | log1p( 1.0F ) | log1p( 1.0D ) | log1p( 1.0L );
+	sout | "ilogb:" | ilogb( 1.0F ) | ilogb( 1.0D ) | ilogb( 1.0L );
+	sout | "logb:" | logb( 8.0F ) | logb( 8.0D ) | logb( 8.0L );
 
-	sout | "sqrt:" | sqrt( 1.0F ) | sqrt( 1.0D ) | sqrt( 1.0L ) | sqrt( 1.0F+1.0FI ) | sqrt( 1.0D+1.0DI ) | sqrt( 1.0DL+1.0LI ) | endl;
-	sout | "cbrt:" | cbrt( 27.0F ) | cbrt( 27.0D ) | cbrt( 27.0L ) | endl;
-	sout | "hypot:" | hypot( 1.0F, -1.0F ) | hypot( 1.0D, -1.0D ) | hypot( 1.0L, -1.0L ) | endl;
+	sout | "sqrt:" | sqrt( 1.0F ) | sqrt( 1.0D ) | sqrt( 1.0L ) | nonl;
+	sout | sqrt( 1.0F+1.0FI ) | sqrt( 1.0D+1.0DI ) | sqrt( 1.0DL+1.0LI );
+	sout | "cbrt:" | cbrt( 27.0F ) | cbrt( 27.0D ) | cbrt( 27.0L );
+	sout | "hypot:" | hypot( 1.0F, -1.0F ) | hypot( 1.0D, -1.0D ) | hypot( 1.0L, -1.0L );
 
 	//---------------------- Trigonometric ----------------------
 
-	sout | "sin:" | sin( 1.0F ) | sin( 1.0D ) | sin( 1.0L ) | sin( 1.0F+1.0FI ) | sin( 1.0D+1.0DI ) | sin( 1.0DL+1.0LI ) | endl;
-	sout | "cos:" | cos( 1.0F ) | cos( 1.0D ) | cos( 1.0L ) | cos( 1.0F+1.0FI ) | cos( 1.0D+1.0DI ) | cos( 1.0DL+1.0LI ) | endl;
-	sout | "tan:" | tan( 1.0F ) | tan( 1.0D ) | tan( 1.0L ) | tan( 1.0F+1.0FI ) | tan( 1.0D+1.0DI ) | tan( 1.0DL+1.0LI ) | endl;
-	sout | "asin:" | asin( 1.0F ) | asin( 1.0D ) | asin( 1.0L ) | asin( 1.0F+1.0FI ) | asin( 1.0D+1.0DI ) | asin( 1.0DL+1.0LI ) | endl;
-	sout | "acos:" | acos( 1.0F ) | acos( 1.0D ) | acos( 1.0L ) | acos( 1.0F+1.0FI ) | acos( 1.0D+1.0DI ) | acos( 1.0DL+1.0LI ) | endl;
-	sout | "atan:" | atan( 1.0F ) | atan( 1.0D ) | atan( 1.0L ) | atan( 1.0F+1.0FI ) | atan( 1.0D+1.0DI ) | atan( 1.0DL+1.0LI ) | endl;
-	sout | "atan2:" | atan2( 1.0F, 1.0F ) | atan2( 1.0D, 1.0D ) | atan2( 1.0L, 1.0L );
-	sout | "atan:" | atan( 1.0F, 1.0F ) | atan( 1.0D, 1.0D ) | atan( 1.0L, 1.0L ) | endl;
+	sout | "sin:" | sin( 1.0F ) | sin( 1.0D ) | sin( 1.0L ) | nonl;
+	sout | sin( 1.0F+1.0FI ) | sin( 1.0D+1.0DI ) | sin( 1.0DL+1.0LI );
+	sout | "cos:" | cos( 1.0F ) | cos( 1.0D ) | cos( 1.0L ) | nonl;
+	sout | cos( 1.0F+1.0FI ) | cos( 1.0D+1.0DI ) | cos( 1.0DL+1.0LI );
+	sout | "tan:" | tan( 1.0F ) | tan( 1.0D ) | tan( 1.0L ) | nonl;
+	sout | tan( 1.0F+1.0FI ) | tan( 1.0D+1.0DI ) | tan( 1.0DL+1.0LI );
+	sout | "asin:" | asin( 1.0F ) | asin( 1.0D ) | asin( 1.0L ) | nonl;
+	sout | asin( 1.0F+1.0FI ) | asin( 1.0D+1.0DI ) | asin( 1.0DL+1.0LI );
+	sout | "acos:" | acos( 1.0F ) | acos( 1.0D ) | acos( 1.0L ) | nonl;
+	sout | acos( 1.0F+1.0FI ) | acos( 1.0D+1.0DI ) | acos( 1.0DL+1.0LI );
+	sout | "atan:" | atan( 1.0F ) | atan( 1.0D ) | atan( 1.0L ) | nonl;
+	sout | atan( 1.0F+1.0FI ) | atan( 1.0D+1.0DI ) | atan( 1.0DL+1.0LI );
+	sout | "atan2:" | atan2( 1.0F, 1.0F ) | atan2( 1.0D, 1.0D ) | atan2( 1.0L, 1.0L ) | nonl;
+	sout | "atan:" | atan( 1.0F, 1.0F ) | atan( 1.0D, 1.0D ) | atan( 1.0L, 1.0L );
 } // main
 
Index: tests/math3.cfa
===================================================================
--- tests/math3.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/math3.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Fri Apr 22 14:59:21 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 17:59:05 2018
-// Update Count     : 83
+// Last Modified On : Wed Dec 12 16:30:41 2018
+// Update Count     : 86
 //
 
@@ -24,24 +24,30 @@
 	//---------------------- Hyperbolic ----------------------
 
-	sout | "sinh:" | sinh( 1.0F ) | sinh( 1.0D ) | sinh( 1.0L ) | sinh( 1.0F+1.0FI ) | sinh( 1.0D+1.0DI ) | sinh( 1.0DL+1.0LI ) | endl;
-	sout | "cosh:" | cosh( 1.0F ) | cosh( 1.0D ) | cosh( 1.0L ) | cosh( 1.0F+1.0FI ) | cosh( 1.0D+1.0DI ) | cosh( 1.0DL+1.0LI ) | endl;
-	sout | "tanh:" | tanh( 1.0F ) | tanh( 1.0D ) | tanh( 1.0L ) | tanh( 1.0F+1.0FI ) | tanh( 1.0D+1.0DI ) | tanh( 1.0DL+1.0LI ) | endl;
-	sout | "acosh:" | acosh( 1.0F ) | acosh( 1.0D ) | acosh( 1.0L ) | acosh( 1.0F+1.0FI ) | acosh( 1.0D+1.0DI ) | acosh( 1.0DL+1.0LI ) | endl;
-	sout | "asinh:" | asinh( 1.0F ) | asinh( 1.0D ) | asinh( 1.0L ) | asinh( 1.0F+1.0FI ) | asinh( 1.0D+1.0DI ) | asinh( 1.0DL+1.0LI ) | endl;
-	sout | "atanh:" | atanh( 1.0F ) | atanh( 1.0D ) | atanh( 1.0L ) | atanh( 1.0F+1.0FI ) | atanh( 1.0D+1.0DI ) | atanh( 1.0DL+1.0LI ) | endl;
+	sout | "sinh:" | sinh( 1.0F ) | sinh( 1.0D ) | sinh( 1.0L ) | nonl;
+	sout | sinh( 1.0F+1.0FI ) | sinh( 1.0D+1.0DI ) | sinh( 1.0DL+1.0LI );
+	sout | "cosh:" | cosh( 1.0F ) | cosh( 1.0D ) | cosh( 1.0L ) | nonl;
+	sout | cosh( 1.0F+1.0FI ) | cosh( 1.0D+1.0DI ) | cosh( 1.0DL+1.0LI );
+	sout | "tanh:" | tanh( 1.0F ) | tanh( 1.0D ) | tanh( 1.0L ) | nonl;
+	sout | tanh( 1.0F+1.0FI ) | tanh( 1.0D+1.0DI ) | tanh( 1.0DL+1.0LI );
+	sout | "acosh:" | acosh( 1.0F ) | acosh( 1.0D ) | acosh( 1.0L ) | nonl;
+	sout | acosh( 1.0F+1.0FI ) | acosh( 1.0D+1.0DI ) | acosh( 1.0DL+1.0LI );
+	sout | "asinh:" | asinh( 1.0F ) | asinh( 1.0D ) | asinh( 1.0L ) | nonl;
+	sout | asinh( 1.0F+1.0FI ) | asinh( 1.0D+1.0DI ) | asinh( 1.0DL+1.0LI );
+	sout | "atanh:" | atanh( 1.0F ) | atanh( 1.0D ) | atanh( 1.0L ) | nonl;
+	sout | atanh( 1.0F+1.0FI ) | atanh( 1.0D+1.0DI ) | atanh( 1.0DL+1.0LI );
 
 	//---------------------- Error / Gamma ----------------------
 
-	sout | "erf:" | erf( 1.0F ) | erf( 1.0D ) | erf( 1.0L ) | endl;
-	sout | "erfc:" | erfc( 1.0F ) | erfc( 1.0D ) | erfc( 1.0L ) | endl;
-	sout | "lgamma:" | lgamma( 4.0F ) | lgamma( 4.0D ) | lgamma( 4.0L ) | endl;
+	sout | "erf:" | erf( 1.0F ) | erf( 1.0D ) | erf( 1.0L );
+	sout | "erfc:" | erfc( 1.0F ) | erfc( 1.0D ) | erfc( 1.0L );
+	sout | "lgamma:" | lgamma( 4.0F ) | lgamma( 4.0D ) | lgamma( 4.0L );
 	int sign;
 	f = lgamma( 4.0F, &sign );
-	sout | "lgamma:" | f | sign;
+	sout | "lgamma:" | f | sign | nonl;
 	d = lgamma( 4.0D, &sign );
-	sout | d | sign;
+	sout | d | sign | nonl;
 	l = lgamma( 4.0L, &sign );
-	sout | l | sign | endl;
-	sout | "tgamma:" | tgamma( 4.0F ) | tgamma( 4.0D ) | tgamma( 4.0L ) | endl;
+	sout | l | sign;
+	sout | "tgamma:" | tgamma( 4.0F ) | tgamma( 4.0D ) | tgamma( 4.0L );
 } // main
 
Index: tests/math4.cfa
===================================================================
--- tests/math4.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/math4.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Thu May 24 20:56:54 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 17:59:14 2018
-// Update Count     : 3
+// Last Modified On : Tue Dec  4 18:15:01 2018
+// Update Count     : 4
 //
 
@@ -24,45 +24,45 @@
 	//---------------------- Nearest Integer ----------------------
 
-	sout | "floor:" | floor( 1.2F ) | floor( 1.2D ) | floor( 1.2L ) | endl;
-	sout | "ceil:" | ceil( 1.6F ) | ceil( 1.6D ) | ceil( 1.6L ) | endl;
-	sout | "trunc:" | trunc( 3.5F ) | trunc( 3.5D ) | trunc( 3.5L ) | endl;
-	sout | "rint:" | (float)rint( 1.5F ) | (double)rint( 1.5D ) | (long double)rint( 1.5L ) | endl;
-	sout | "rint:" | (long int)rint( 1.5F ) | (long int)rint( 1.5D ) | (long int)rint( 1.5L ) | endl;
-	sout | "rint:" | (long long int)rint( 1.5F ) | (long long int)rint( 1.5D ) | (long long int)rint( 1.5L ) | endl;
-	sout | "lrint:" | lrint( 1.5F ) | lrint( 1.5D ) | lrint( 1.5L ) | endl;
-	sout | "llrint:" | llrint( 1.5F ) | llrint( 1.5D ) | llrint( 1.5L ) | endl;
-	sout | "nearbyint:" | nearbyint( 3.5F ) | nearbyint( 3.5D ) | nearbyint( 3.5L ) | endl;
-	sout | "round:" | (float)round( 1.5F ) | (double)round( 1.5D ) | (long double)round( 1.5L ) | endl;
-	sout | "round:" | (long int)round( 1.5F ) | (long int)round( 1.5D ) | (long int)round( 1.5L ) | endl;
-	sout | "round:" | (long long int)round( 1.5F ) | (long long int)round( 1.5D ) | (long long int)round( 1.5L ) | endl;
-	sout | "lround:" | lround( 1.5F ) | lround( 1.5D ) | lround( 1.5L ) | endl;
-	sout | "llround:" | llround( 1.5F ) | llround( 1.5D ) | llround( 1.5L ) | endl;
+	sout | "floor:" | floor( 1.2F ) | floor( 1.2D ) | floor( 1.2L );
+	sout | "ceil:" | ceil( 1.6F ) | ceil( 1.6D ) | ceil( 1.6L );
+	sout | "trunc:" | trunc( 3.5F ) | trunc( 3.5D ) | trunc( 3.5L );
+	sout | "rint:" | (float)rint( 1.5F ) | (double)rint( 1.5D ) | (long double)rint( 1.5L );
+	sout | "rint:" | (long int)rint( 1.5F ) | (long int)rint( 1.5D ) | (long int)rint( 1.5L );
+	sout | "rint:" | (long long int)rint( 1.5F ) | (long long int)rint( 1.5D ) | (long long int)rint( 1.5L );
+	sout | "lrint:" | lrint( 1.5F ) | lrint( 1.5D ) | lrint( 1.5L );
+	sout | "llrint:" | llrint( 1.5F ) | llrint( 1.5D ) | llrint( 1.5L );
+	sout | "nearbyint:" | nearbyint( 3.5F ) | nearbyint( 3.5D ) | nearbyint( 3.5L );
+	sout | "round:" | (float)round( 1.5F ) | (double)round( 1.5D ) | (long double)round( 1.5L );
+	sout | "round:" | (long int)round( 1.5F ) | (long int)round( 1.5D ) | (long int)round( 1.5L );
+	sout | "round:" | (long long int)round( 1.5F ) | (long long int)round( 1.5D ) | (long long int)round( 1.5L );
+	sout | "lround:" | lround( 1.5F ) | lround( 1.5D ) | lround( 1.5L );
+	sout | "llround:" | llround( 1.5F ) | llround( 1.5D ) | llround( 1.5L );
 
 	//---------------------- Manipulation ----------------------
 
-	sout | "copysign:" | copysign( 1.0F, -1.0F ) | copysign( 1.0D, -1.0D ) | copysign( 1.0L, -1.0L ) | endl;
+	sout | "copysign:" | copysign( 1.0F, -1.0F ) | copysign( 1.0D, -1.0D ) | copysign( 1.0L, -1.0L );
 	int exp;
 	f = frexp( 4.0F, &exp );
-	sout | "frexp:" | f | exp;
+	sout | "frexp:" | f | exp | nonl;
 	d = frexp( 4.0D, &exp );
-	sout | d | exp;
+	sout | d | exp | nonl;
 	l = frexp( 4.0L, &exp );
-	sout | l | exp | endl;
-	sout | "ldexp:" | ldexp( 2.0F, 2 ) | ldexp( 2.0D, 2 ) | ldexp( 2.0L, 2 ) | endl;
+	sout | l | exp;
+	sout | "ldexp:" | ldexp( 2.0F, 2 ) | ldexp( 2.0D, 2 ) | ldexp( 2.0L, 2 );
 	float fi;
 	double di;
 	long double ldi;
 	f = modf( 2.3F, &fi );
-	sout | "modf:" | fi | f;
+	sout | "modf:" | fi | f | nonl;
 	d = modf( 2.3D, &di );
-	sout | di | d;
+	sout | di | d | nonl;
 	l = modf( 2.3L, &ldi );
-	sout | ldi | l | endl;
-	sout | "modf:" | modf( 2.3F ) | modf( 2.3D ) | modf( 2.3L ) | endl;
-	sout | "nextafter:" | nextafter( 2.0F, 3.0F ) | nextafter( 2.0D, 3.0D ) | nextafter( 2.0L, 3.0L ) | endl;
-	sout | "nexttoward:" | nexttoward( 2.0F, 3.0F ) | nexttoward( 2.0D, 3.0D ) | nexttoward( 2.0L, 3.0L ) | endl;
+	sout | ldi | l;
+	sout | "modf:" | modf( 2.3F ) | modf( 2.3D ) | modf( 2.3L );
+	sout | "nextafter:" | nextafter( 2.0F, 3.0F ) | nextafter( 2.0D, 3.0D ) | nextafter( 2.0L, 3.0L );
+	sout | "nexttoward:" | nexttoward( 2.0F, 3.0F ) | nexttoward( 2.0D, 3.0D ) | nexttoward( 2.0L, 3.0L );
 
-	sout | "scalbn:" | scalbn( 2.0F, 3 ) | scalbn( 2.0D, 3 ) | scalbn( 2.0L, 3 ) | endl;
-	sout | "scalbln:" | scalbln( 2.0F, 3L ) | scalbln( 2.0D, 3L ) | scalbln( 2.0L, 3L ) | endl;
+	sout | "scalbn:" | scalbn( 2.0F, 3 ) | scalbn( 2.0D, 3 ) | scalbn( 2.0L, 3 );
+	sout | "scalbln:" | scalbln( 2.0F, 3L ) | scalbln( 2.0D, 3L ) | scalbln( 2.0L, 3L );
 } // main
 
Index: tests/minmax.cfa
===================================================================
--- tests/minmax.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/minmax.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 17:59:26 2018
-// Update Count     : 51
+// Last Modified On : Tue Dec  4 21:45:31 2018
+// Update Count     : 52
 //
 
@@ -22,27 +22,27 @@
 	int ?>?( char op1, char op2 ) { return (int)op1 > (int)op2; }
 
-	sout | "char\t\t\t"					| 'z' | ' ' | 'a' | "\tmin " | min( 'z', 'a' ) | endl;
-	sout | "signed int\t\t"				| 4 | 3 | "\tmin" | min( 4, 3 ) | endl;
-	sout | "unsigned int\t\t"			| 4u | 3u | "\tmin" | min( 4u, 3u ) | endl;
-	sout | "signed long int\t\t" 		| 4l | 3l | "\tmin" | min( 4l, 3l ) | endl;
-	sout | "unsigned long int\t" 		| 4ul | 3ul | "\tmin" | min( 4ul, 3ul ) | endl;
-	sout | "signed long long int\t"		| 4ll | 3ll | "\tmin" | min( 4ll, 3ll ) | endl;
-	sout | "unsigned long long int\t"	| 4ull | 3ull | "\tmin" | min( 4ull, 3ull ) | endl;
-	sout | "float\t\t\t" 				| 4.0f | 3.1f | "\tmin" | min( 4.0f, 3.1f ) | endl;
-	sout | "double\t\t\t"				| 4.0 | 3.1 | "\tmin" | min( 4.0, 3.1 ) | endl;
-	sout | "long double\t\t"			| 4.0l | 3.1l | "\tmin" | min( 4.0l, 3.1l ) | endl;
+	sout | "char\t\t\t"					| 'z' | ' ' | 'a' | "\tmin " | min( 'z', 'a' );
+	sout | "signed int\t\t"				| 4 | 3 | "\tmin" | min( 4, 3 );
+	sout | "unsigned int\t\t"			| 4u | 3u | "\tmin" | min( 4u, 3u );
+	sout | "signed long int\t\t" 		| 4l | 3l | "\tmin" | min( 4l, 3l );
+	sout | "unsigned long int\t" 		| 4ul | 3ul | "\tmin" | min( 4ul, 3ul );
+	sout | "signed long long int\t"		| 4ll | 3ll | "\tmin" | min( 4ll, 3ll );
+	sout | "unsigned long long int\t"	| 4ull | 3ull | "\tmin" | min( 4ull, 3ull );
+	sout | "float\t\t\t" 				| 4.0f | 3.1f | "\tmin" | min( 4.0f, 3.1f );
+	sout | "double\t\t\t"				| 4.0 | 3.1 | "\tmin" | min( 4.0, 3.1 );
+	sout | "long double\t\t"			| 4.0l | 3.1l | "\tmin" | min( 4.0l, 3.1l );
 
-	sout | endl;
+	sout | nl;
 
-	sout | "char\t\t\t"					| 'z' | ' ' | 'a' | "\tmax " | max( 'z', 'a' ) | endl;
-	sout | "signed int\t\t"				| 4 | 3 | "\tmax" | max( 4, 3 ) | endl;
-	sout | "unsigned int\t\t"			| 4u | 3u | "\tmax" | max( 4u, 3u ) | endl;
-	sout | "signed long int\t\t" 		| 4l | 3l | "\tmax" | max( 4l, 3l ) | endl;
-	sout | "unsigned long int\t" 		| 4ul | 3ul | "\tmax" | max( 4ul, 3ul ) | endl;
-	sout | "signed long long int\t"		| 4ll | 3ll | "\tmax" | max( 4ll, 3ll ) | endl;
-	sout | "unsigned long long int\t"	| 4ull | 3ull | "\tmax" | max( 4ull, 3ull ) | endl;
-	sout | "float\t\t\t" 				| 4.0f | 3.1f | "\tmax" | max( 4.0f, 3.1f ) | endl;
-	sout | "double\t\t\t"				| 4.0 | 3.1 | "\tmax" | max( 4.0, 3.1 ) | endl;
-	sout | "long double\t\t"			| 4.0l | 3.1l | "\tmax" | max( 4.0l, 3.1l ) | endl;
+	sout | "char\t\t\t"					| 'z' | ' ' | 'a' | "\tmax " | max( 'z', 'a' );
+	sout | "signed int\t\t"				| 4 | 3 | "\tmax" | max( 4, 3 );
+	sout | "unsigned int\t\t"			| 4u | 3u | "\tmax" | max( 4u, 3u );
+	sout | "signed long int\t\t" 		| 4l | 3l | "\tmax" | max( 4l, 3l );
+	sout | "unsigned long int\t" 		| 4ul | 3ul | "\tmax" | max( 4ul, 3ul );
+	sout | "signed long long int\t"		| 4ll | 3ll | "\tmax" | max( 4ll, 3ll );
+	sout | "unsigned long long int\t"	| 4ull | 3ull | "\tmax" | max( 4ull, 3ull );
+	sout | "float\t\t\t" 				| 4.0f | 3.1f | "\tmax" | max( 4.0f, 3.1f );
+	sout | "double\t\t\t"				| 4.0 | 3.1 | "\tmax" | max( 4.0, 3.1 );
+	sout | "long double\t\t"			| 4.0l | 3.1l | "\tmax" | max( 4.0l, 3.1l );
 } // main
 
Index: tests/polymorphism.cfa
===================================================================
--- tests/polymorphism.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/polymorphism.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -9,11 +9,12 @@
 // Author           : Rob Schluntz
 // Created On       : Tue Oct 17 12:19:48 2017
-// Last Modified By : Rob Schluntz
-// Last Modified On : Tue Oct 17 12:21:07 2017
-// Update Count     : 1
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Dec 25 14:40:24 2018
+// Update Count     : 3
 //
 
 #include <assert.h>
 #include <inttypes.h>
+#include <fstream.hfa>
 
 forall(otype T)
@@ -61,14 +62,12 @@
 		int y = 456;
 		int z = f(x, y);
-		printf("%d %d %d\n", x, y, z);
+		sout | x | y | z;
 	}
-
 	{
 		// explicitly specialize function
 		int (*f)(int) = ident;
 		((int(*)(int))ident);
-		printf("%d %d\n", f(5), ((int(*)(int))ident)(5));
+		sout | f(5) | ((int(*)(int))ident)(5);
 	}
-
 	{
 		// test aggregates with polymorphic members
@@ -100,9 +99,9 @@
 
 		void print(x_type x) {
-			printf("%"PRIu32"\n", x);
+			sout | x;
 		}
 
 		void print(y_type y) {
-			printf("%"PRIu64"\n", y);
+			sout | y;
 		}
 
Index: tests/preempt_longrun/Makefile.am
===================================================================
--- tests/preempt_longrun/Makefile.am	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/preempt_longrun/Makefile.am	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -16,4 +16,5 @@
 
 AUTOMAKE_OPTIONS = foreign    # do not require all the GNU file names
+ACLOCAL_AMFLAGS  = -I automake
 
 repeats=10
Index: tests/preempt_longrun/Makefile.in
===================================================================
--- tests/preempt_longrun/Makefile.in	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/preempt_longrun/Makefile.in	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -93,6 +93,10 @@
 subdir = tests/preempt_longrun
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/automake/cfa.m4 \
-	$(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/automake/libtool.m4 \
+	$(top_srcdir)/automake/ltoptions.m4 \
+	$(top_srcdir)/automake/ltsugar.m4 \
+	$(top_srcdir)/automake/ltversion.m4 \
+	$(top_srcdir)/automake/lt~obsolete.m4 \
+	$(top_srcdir)/automake/cfa.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -333,9 +337,9 @@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BACKEND_CC = @BACKEND_CC@
 BUILD_IN_TREE_FLAGS = @BUILD_IN_TREE_FLAGS@
 CC = @CFACC@
@@ -357,4 +361,5 @@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
+CXXCPP = @CXXCPP@
 CXXDEPMODE = @CXXDEPMODE@
 CXXFLAGS = @CXXFLAGS@
@@ -362,5 +367,8 @@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
 DRIVER_DIR = @DRIVER_DIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
@@ -368,4 +376,5 @@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
+FGREP = @FGREP@
 GREP = @GREP@
 HOST_FLAGS = @HOST_FLAGS@
@@ -375,4 +384,5 @@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LEX = @LEX@
@@ -383,8 +393,18 @@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -396,4 +416,5 @@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -407,6 +428,8 @@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -456,4 +479,5 @@
 top_srcdir = @top_srcdir@
 AUTOMAKE_OPTIONS = foreign    # do not require all the GNU file names
+ACLOCAL_AMFLAGS = -I automake
 repeats = 10
 max_time = 600
@@ -503,4 +527,10 @@
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
 tags TAGS:
 
@@ -806,5 +836,5 @@
 clean: clean-am
 
-clean-am: clean-generic clean-local mostlyclean-am
+clean-am: clean-generic clean-libtool clean-local mostlyclean-am
 
 distclean: distclean-am
@@ -858,5 +888,5 @@
 mostlyclean: mostlyclean-am
 
-mostlyclean-am: mostlyclean-generic
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
 
 pdf: pdf-am
@@ -873,13 +903,14 @@
 
 .PHONY: all all-am all-local check check-TESTS check-am clean \
-	clean-generic clean-local cscopelist-am ctags-am distclean \
-	distclean-generic distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic pdf pdf-am ps ps-am recheck tags-am \
+	clean-generic clean-libtool clean-local cscopelist-am ctags-am \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \
 	uninstall uninstall-am
 
Index: tests/pybin/tools.py
===================================================================
--- tests/pybin/tools.py	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/pybin/tools.py	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -79,6 +79,7 @@
 def diff( lhs, rhs ):
 	# diff the output of the files
-	diff_cmd = ("diff --ignore-all-space --text "
-				"--ignore-blank-lines "
+	diff_cmd = ("diff --text "
+#				"--ignore-all-space "
+#				"--ignore-blank-lines "
 				"--old-group-format='\t\tmissing lines :\n"
 				"%%<' \\\n"
@@ -246,7 +247,6 @@
 	if column:
 		cmd = "%s 2> /dev/null" % column
-		print(cmd)
 		proc = Popen(cmd, stdin=PIPE, stderr=None, shell=True)
-		proc.communicate(input=text)
+		proc.communicate(input=text + "\n")
 	else:
 		print(text)
Index: tests/quotedKeyword.cfa
===================================================================
--- tests/quotedKeyword.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/quotedKeyword.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 17:46:20 2018
-// Update Count     : 22
+// Last Modified On : Tue Dec  4 21:45:53 2018
+// Update Count     : 23
 //
 
@@ -41,5 +41,5 @@
 	st.`struct` = 3;
 	`throw` = 4;
-	sout | `catch` + st.`otype` + st.`struct` + `throw` | endl;
+	sout | `catch` + st.`otype` + st.`struct` + `throw`;
 }
 
Index: tests/raii/.expect/ctor-autogen-ERR1.txt
===================================================================
--- tests/raii/.expect/ctor-autogen-ERR1.txt	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/raii/.expect/ctor-autogen-ERR1.txt	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -1,16 +1,16 @@
-raii/ctor-autogen.c: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 Cast of:
   Application of
     Deleted Expression
       Variable Expression: ?{}: static inline function
       ... with parameters
-        _dst: reference to instance of struct Managed with body 1 
+        _dst: reference to instance of struct Managed with body 1
         x: signed int
-      ... returning nothing 
+      ... returning nothing
 
       ... deleted by: ?{}: function
       ... with parameters
-        m: reference to instance of struct Managed with body 1 
-      ... returning nothing 
-      ... with body 
+        m: reference to instance of struct Managed with body 1
+      ... returning nothing
+      ... with body
         CompoundStmt
           Expression Statement:
@@ -20,7 +20,7 @@
                 intrinsic reference to signed int
                 intrinsic signed int
-              ... returning 
+              ... returning
                 _retval__operator_assign: signed int
-                ... with attributes: 
+                ... with attributes:
                   Attribute with name: unused
 
@@ -28,11 +28,11 @@
             ... to arguments
               Cast of:
-                Member Expression, with field: 
+                Member Expression, with field:
                   x: signed int
-                ... from aggregate: 
+                ... from aggregate:
                   Cast of:
-                    Variable Expression: m: reference to instance of struct Managed with body 1 
+                    Variable Expression: m: reference to instance of struct Managed with body 1
                   ... to:
-                    instance of struct Managed with body 1 
+                    instance of struct Managed with body 1
               ... to:
                 reference to signed int
@@ -49,7 +49,7 @@
   ... to arguments
     Cast of:
-      Variable Expression: x: instance of struct Managed with body 1 
+      Variable Expression: x: instance of struct Managed with body 1
     ... to:
-      reference to instance of struct Managed with body 1 
+      reference to instance of struct Managed with body 1
     constant expression (123 123: signed int)
 
Index: tests/raii/.expect/dtor-early-exit-ERR1.txt
===================================================================
--- tests/raii/.expect/dtor-early-exit-ERR1.txt	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/raii/.expect/dtor-early-exit-ERR1.txt	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -1,3 +1,3 @@
-raii/dtor-early-exit.c:150:1 error: jump to label 'L1' crosses initialization of y Branch (Goto)
+raii/dtor-early-exit.cfa:150:1 error: jump to label 'L1' crosses initialization of y Branch (Goto)
   with target: L1
   with original target: L1
Index: tests/raii/.expect/dtor-early-exit-ERR2.txt
===================================================================
--- tests/raii/.expect/dtor-early-exit-ERR2.txt	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/raii/.expect/dtor-early-exit-ERR2.txt	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -1,3 +1,3 @@
-raii/dtor-early-exit.c:214:1 error: jump to label 'L2' crosses initialization of y Branch (Goto)
+raii/dtor-early-exit.cfa:214:1 error: jump to label 'L2' crosses initialization of y Branch (Goto)
   with target: L2
   with original target: L2
Index: tests/raii/.expect/memberCtors-ERR1.txt
===================================================================
--- tests/raii/.expect/memberCtors-ERR1.txt	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/raii/.expect/memberCtors-ERR1.txt	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -1,1 +1,1 @@
-raii/memberCtors.c:71:1 error: in void ?{}(B &b), field a2 used before being constructed
+raii/memberCtors.cfa:71:1 error: in void ?{}(B &b), field a2 used before being constructed
Index: sts/raii/ctor-autogen.c
===================================================================
--- tests/raii/ctor-autogen.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,153 +1,0 @@
-// TODO: add error cases (e.g., use of field constructors for managed types, etc.)
-
-enum Color { R, G, B };
-
-// empty struct/union should have generated ctor/dtors
-union U {};
-struct S {};
-
-struct SimpleUnion {
-	int x;
-	double y;
-	char z;
-};
-
-struct SimpleStruct {
-	int x;
-	double y;
-	char z;
-};
-
-// struct/union with members with generated ctor/dtors should themselves have generated ctor/dtors
-union PopulatedUnion {
-	Color c;
-	U u;
-	S s;
-};
-
-struct PopulatedStruct {
-	Color c;
-	U u;
-	S s;
-};
-
-// dtype-static generic type is otype
-forall(dtype T)
-struct DtypeStaticStruct {
-  T * data;
-  short size;
-};
-
-forall(dtype T)
-union DtypeStaticUnion {
-  T * data;
-  short size;
-};
-
-// dynamic generic type is otype
-forall(otype T)
-struct DynamicStruct {
-	T x;
-};
-
-forall(otype T)
-union DynamicUnion {
-	T x;
-};
-
-// struct/union that contains a generic type is
-struct GenericContainingStruct {
-	DynamicStruct(int) dsi;
-	DynamicStruct(double) dsd;
-	DynamicUnion(int) dui;
-	DynamicUnion(double) dud;
-	DtypeStaticStruct(int) dssi;
-	DtypeStaticStruct(float) dssf;
-	DtypeStaticUnion(int) dsui;
-	DtypeStaticUnion(float) dsuf;
-};
-
-union GenericContainingUnion {
-	DynamicStruct(int) dsi;
-	DynamicStruct(double) dsd;
-	DynamicUnion(int) dui;
-	DynamicUnion(double) dud;
-	DtypeStaticStruct(int) dssi;
-	DtypeStaticStruct(float) dssf;
-	DtypeStaticUnion(int) dsui;
-	DtypeStaticUnion(float) dsuf;
-};
-
-
-forall(otype T)
-T identity(T x) { return x; }
-
-// can identity e if only sized or only the assertion, but the combination breaks...
-// forall(dtype T | sized(T) | { void ?{}(T &); })
-// void identity(T x) {  }
-
-#if ERR1
-// managed type - defines a constructor - can't use field constructors
-struct Managed {
-	int x;
-};
-
-void ?{}(Managed & m) { m.x = 0; }
-
-// managed type since it contains a managed type - can't use field constructors
-struct InheritManaged {
-	Managed m;
-};
-
-Managed x = { 123 }; // error
-Managed y;           // okay
-
-InheritManaged z = { y };  // error?
-#endif
-
-int main() {
-	S s;
-	U u;
-	Color e;
-
-	// identity(R);  Color constant should be Color which is otype
-	identity(e);  // Color should be an otype
-	identity(u);  // U should be an otype
-	identity(s);  // S should be an otype
-
-	SimpleStruct ss;
-	SimpleUnion su;
-
-	identity(ss);
-	identity(su);
-
-	PopulatedStruct ps;
-	PopulatedUnion pu;
-
-	identity(ps); // should recursively be an otype
-	identity(pu); // should recursively be an otype
-
-	DynamicStruct(int) dsi;
-	DynamicStruct(double) dsd;
-	DynamicUnion(int) dui;
-	DynamicUnion(double) dud;
-	DtypeStaticStruct(int) dssi;
-	DtypeStaticStruct(float) dssf;
-	DtypeStaticUnion(int) dsui;
-	DtypeStaticUnion(float) dsuf;
-
-	identity(dsi);
-	identity(dsd);
-	// identity(dui); // xxx - codegen errors in generated thunk _temp3 (Box-pass-generated assignment return-temporary)
-	// identity(dud);
-	identity(dssi);
-	identity(dssf);
-	identity(dsui);
-	identity(dsuf);
-
-	GenericContainingStruct gcs;
-	GenericContainingUnion gcu;
-
-	identity(gcs);
-	identity(gcu);
-}
Index: tests/raii/ctor-autogen.cfa
===================================================================
--- tests/raii/ctor-autogen.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/raii/ctor-autogen.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,153 @@
+// TODO: add error cases (e.g., use of field constructors for managed types, etc.)
+
+enum Color { R, G, B };
+
+// empty struct/union should have generated ctor/dtors
+union U {};
+struct S {};
+
+struct SimpleUnion {
+	int x;
+	double y;
+	char z;
+};
+
+struct SimpleStruct {
+	int x;
+	double y;
+	char z;
+};
+
+// struct/union with members with generated ctor/dtors should themselves have generated ctor/dtors
+union PopulatedUnion {
+	Color c;
+	U u;
+	S s;
+};
+
+struct PopulatedStruct {
+	Color c;
+	U u;
+	S s;
+};
+
+// dtype-static generic type is otype
+forall(dtype T)
+struct DtypeStaticStruct {
+  T * data;
+  short size;
+};
+
+forall(dtype T)
+union DtypeStaticUnion {
+  T * data;
+  short size;
+};
+
+// dynamic generic type is otype
+forall(otype T)
+struct DynamicStruct {
+	T x;
+};
+
+forall(otype T)
+union DynamicUnion {
+	T x;
+};
+
+// struct/union that contains a generic type is
+struct GenericContainingStruct {
+	DynamicStruct(int) dsi;
+	DynamicStruct(double) dsd;
+	DynamicUnion(int) dui;
+	DynamicUnion(double) dud;
+	DtypeStaticStruct(int) dssi;
+	DtypeStaticStruct(float) dssf;
+	DtypeStaticUnion(int) dsui;
+	DtypeStaticUnion(float) dsuf;
+};
+
+union GenericContainingUnion {
+	DynamicStruct(int) dsi;
+	DynamicStruct(double) dsd;
+	DynamicUnion(int) dui;
+	DynamicUnion(double) dud;
+	DtypeStaticStruct(int) dssi;
+	DtypeStaticStruct(float) dssf;
+	DtypeStaticUnion(int) dsui;
+	DtypeStaticUnion(float) dsuf;
+};
+
+
+forall(otype T)
+T identity(T x) { return x; }
+
+// can identity e if only sized or only the assertion, but the combination breaks...
+// forall(dtype T | sized(T) | { void ?{}(T &); })
+// void identity(T x) {  }
+
+#if ERR1
+// managed type - defines a constructor - can't use field constructors
+struct Managed {
+	int x;
+};
+
+void ?{}(Managed & m) { m.x = 0; }
+
+// managed type since it contains a managed type - can't use field constructors
+struct InheritManaged {
+	Managed m;
+};
+
+Managed x = { 123 }; // error
+Managed y;           // okay
+
+InheritManaged z = { y };  // error?
+#endif
+
+int main() {
+	S s;
+	U u;
+	Color e;
+
+	// identity(R);  Color constant should be Color which is otype
+	identity(e);  // Color should be an otype
+	identity(u);  // U should be an otype
+	identity(s);  // S should be an otype
+
+	SimpleStruct ss;
+	SimpleUnion su;
+
+	identity(ss);
+	identity(su);
+
+	PopulatedStruct ps;
+	PopulatedUnion pu;
+
+	identity(ps); // should recursively be an otype
+	identity(pu); // should recursively be an otype
+
+	DynamicStruct(int) dsi;
+	DynamicStruct(double) dsd;
+	DynamicUnion(int) dui;
+	DynamicUnion(double) dud;
+	DtypeStaticStruct(int) dssi;
+	DtypeStaticStruct(float) dssf;
+	DtypeStaticUnion(int) dsui;
+	DtypeStaticUnion(float) dsuf;
+
+	identity(dsi);
+	identity(dsd);
+	// identity(dui); // xxx - codegen errors in generated thunk _temp3 (Box-pass-generated assignment return-temporary)
+	// identity(dud);
+	identity(dssi);
+	identity(dssf);
+	identity(dsui);
+	identity(dsuf);
+
+	GenericContainingStruct gcs;
+	GenericContainingUnion gcu;
+
+	identity(gcs);
+	identity(gcu);
+}
Index: sts/raii/dtor-early-exit.c
===================================================================
--- tests/raii/dtor-early-exit.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,253 +1,0 @@
-//
-// 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.
-//
-// dtor-early-exit.c --
-//
-// Author           : Rob Schluntz
-// Created On       : Wed Aug 17 08:26:25 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Aug 11 07:58:39 2018
-// Update Count     : 8
-//
-
-#include <fstream.hfa>
-#include <stdlib.hfa>
-#include <assert.h>
-
-struct A {
-	const char * name;
-	int * x;
-};
-
-// don't want these called
-void ?{}(A & a) { assert( false ); }
-void ?{}(A & a, const char * name) { a.name = name; sout | "construct " | name | endl; a.x = (int*)malloc(); }
-void ?{}(A & a, const char * name, int * ptr) { assert( false ); }
-
-A ?=?(A & a, A b) {  sout | "assign " | a.name | " " | b.name; return a; }
-void ?{}(A & a, A b) { sout | "copy construct " | b.name | endl; a.x = (int*)malloc(); }
-void ^?{}(A & a) { sout | "destruct " | a.name | endl; free(a.x); }
-
-// test returns
-void f(int i) {
-	sout | "f i=" | i | endl;
-	A x = { "x" };  // construct x
-	{
-		A y = { "y" }; // construct y
-		{
-			A z = { "z" }; // construct z
-			{
-				if (i == 0) return; // destruct x, y, z
-			}
-			if (i == 1) return; // destruct x, y, z
-			// destruct z
-		}
-		if (i == 2) return; // destruct x, y
-		// destruct y
-	}
-	return; // destruct x
-}
-
-// test loops, switch, etc.
-void g() {
-	for (int i = 0; i < 10; i++) {
-		sout | "g for i=" | i | endl;
-		A x = { "x" };
-		// construct x
-		// destruct x
-	}
-	sout | endl;
-	{
-		int i = 0;
-		while (i < 10) {
-			sout | "g while i=" | i | endl;
-			A x = { "x" };
-			// construct x
-			i++;
-			// destruct x
-		}
-	}
-	sout | endl;
-	for (int i = 0; i < 10; i++) {
-		switch(10) {
-			case 0:
-			case 5:
-			case 10: {
-				A y = { "y" };
-				sout | "g switch i=" | i | endl;
-				// construct y
-				break; // destruct y
-			}
-			default: {
-				sout | "g switch i=" | i | endl;
-				A x = { "x" };
-				// construct x
-				break; // destruct x
-			}
-		}
-	}
-	sout | endl;
-	for (int k = 0; k < 2; k++) {
-		sout | "g for k=" | k | endl;
-		L1: for (int i = 0; i < 10; i++) {
-			sout | "g for i=" | i | endl;
-
-			A x = { "x" };
-			if (i == 2) {
-				sout | "continue L1" | endl;
-				continue;  // destruct x
-			} else if (i == 3) {
-				sout | "break L1" | endl;
-				break;  // destruct x
-			}
-
-			L2: for (int j = 0; j < 10; j++) {
-				sout | "g for j=" | j | endl;
-				A y = { "y" };
-				if (j == 0) {
-					sout | "continue L2" | endl;
-					continue; // destruct y - missing because object that needs to be destructed is not a part of this block, it's a part of the for's block
-				} else if (j == 1) {
-					sout | "break L2" | endl;
-					break;  // destruct y
-				} else if (i == 1) {
-					sout | "continue L1" | endl;
-					continue L1; // destruct x,y - note: continue takes you to destructors for block, so only generate destructor for y
-				} else if (k == 1) {
-					sout | "break L1" | endl;
-					break L1;  // destruct x,y
-				}
-			}
-		}
-	}
-
-	sout | endl;
-	L3: if( 3 ) {
-		A w = { "w" };
-		if( 4 ) {
-			A v = { "v" };
-			sout | "break L3" | endl;
-			break L3;
-		}
-	}
-}
-
-// test goto
-void h() {
-	int i = 0;
-	// for each goto G with target label L:
-	// * find all constructed variables alive at G (set S_G)
-	// * find all constructed variables alive at L (set S_L)
-	// * if S_L-S_G is non-empty, error
-	// * emit destructors for all variables in S_G-S_L
-	sout | "h" | endl;
-	{
-		L0: ;
-#ifdef ERR1
-			goto L1; // this is an error in g++ because it skips initialization of y
-#endif
-			A y = { "y" };
-			// S_L1 = { y }
-		L1: sout | "L1" | endl;
-			A x = { "x" };
-			// S_L2 = { y, x }
-		L2: sout | "L2" | endl;
-			if (i == 0) {
-				++i;
-				sout | "goto L1" | endl;
-				// S_G = { y, x }
-				goto L1;  // jump back, destruct b/c before x definition
-				// S_L-S_G = {} => no error
-				// S_G-S_L = { x } => destruct x
-			} else if (i == 1) {
-				++i;
-				sout | "goto L2" | endl;
-				// S_G = { y, x }
-				goto L2;  // jump back, do not destruct
-				// S_L-S_G = {}
-				// S_G-S_L = {} => destruct nothing
-			} else if (i == 2) {
-				++i;
-				sout | "goto L3" | endl;
-				// S_G = { y, x }
-				goto L3;  // jump ahead, do not destruct
-				// S_L-S_G = {}
-				// S_G-S_L = {}
-			} else if (false) {
-				++i;
-				A z = { "z" };
-				sout | "goto L3-2" | endl;
-				// S_G = { z, y, x }
-				goto L3;
-				// S_L-S_G = {}
-				// S_G-S_L = {z} => destruct z
-			} else {
-				++i;
-				sout | "goto L4" | endl;
-				// S_G = { y, x }
-				goto L4;  // jump ahead, destruct b/c left block x was defined in
-				// S_L-S_G = {}
-				// S_G-S_L = { y, x } => destruct y, x
-			}
-			// S_L3 = { y, x }
-		L3: sout | "L3" | endl;
-			sout | "goto L2-2" | endl;
-			// S_G = { y, x }
-			goto L2; // jump back, do not destruct
-			// S_L-S_G = {}
-			// S_G-S_L = {}
-	}
-	// S_L4 = {}
-	L4: sout | "L4" | endl;
-	if (i == 4) {
-		sout | "goto L0" | endl;
-		// S_G = {}
-		goto L0;
-		// S_L-S_G = {}
-		// S_G-S_L = {}
-	}
-#ifdef ERR2
-	// S_G = {}
-	if (i == 5) goto L2; // this is an error in g++ because it skips initialization of y, x
-	// S_L-S_G = { y, x } => non-empty, so error
-#endif
-}
-
-// TODO: implement __label__ and uncomment these lines
-void computedGoto() {
-  // __label__ bar;
-  void *ptr;
-  ptr = &&foo;
-  goto *ptr;
-  assert(false);
-foo: ;
-//   void f() {
-//     ptr = &&bar;
-//     goto *ptr;
-//     assert(false);
-//   }
-//   f();
-//   assert(false);
-// bar: ;
-}
-
-int main() {
-	sepDisable(sout);
-	for (int i = 0; i < 4; i++) {
-		f(i);
-	}
-	sout | endl;
-	g();
-	sout | endl;
-	h();
-
-	computedGoto();
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa dtor-early-exit" //
-// End: //
Index: tests/raii/dtor-early-exit.cfa
===================================================================
--- tests/raii/dtor-early-exit.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/raii/dtor-early-exit.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,253 @@
+//
+// 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.
+//
+// dtor-early-exit.c --
+//
+// Author           : Rob Schluntz
+// Created On       : Wed Aug 17 08:26:25 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Dec 21 08:45:19 2018
+// Update Count     : 10
+//
+
+#include <fstream.hfa>
+#include <stdlib.hfa>
+#include <assert.h>
+
+struct A {
+	const char * name;
+	int * x;
+};
+
+// don't want these called
+void ?{}(A & a) { assert( false ); }
+void ?{}(A & a, const char * name) { a.name = name; sout | "construct " | name; a.x = (int*)malloc(); }
+void ?{}(A & a, const char * name, int * ptr) { assert( false ); }
+
+A ?=?(A & a, A b) {  sout | "assign " | a.name | " " | b.name; return a; }
+void ?{}(A & a, A b) { sout | "copy construct " | b.name; a.x = (int*)malloc(); }
+void ^?{}(A & a) { sout | "destruct " | a.name; free(a.x); }
+
+// test returns
+void f(int i) {
+	sout | "f i=" | i;
+	A x = { "x" };  // construct x
+	{
+		A y = { "y" }; // construct y
+		{
+			A z = { "z" }; // construct z
+			{
+				if (i == 0) return; // destruct x, y, z
+			}
+			if (i == 1) return; // destruct x, y, z
+			// destruct z
+		}
+		if (i == 2) return; // destruct x, y
+		// destruct y
+	}
+	return; // destruct x
+}
+
+// test loops, switch, etc.
+void g() {
+	for (int i = 0; i < 10; i++) {
+		sout | "g for i=" | i;
+		A x = { "x" };
+		// construct x
+		// destruct x
+	}
+	sout | nl;
+	{
+		int i = 0;
+		while (i < 10) {
+			sout | "g while i=" | i;
+			A x = { "x" };
+			// construct x
+			i++;
+			// destruct x
+		}
+	}
+	sout | nl;
+	for (int i = 0; i < 10; i++) {
+		switch(10) {
+			case 0:
+			case 5:
+			case 10: {
+				A y = { "y" };
+				sout | "g switch i=" | i;
+				// construct y
+				break; // destruct y
+			}
+			default: {
+				sout | "g switch i=" | i;
+				A x = { "x" };
+				// construct x
+				break; // destruct x
+			}
+		}
+	}
+	sout | nl;
+	for (int k = 0; k < 2; k++) {
+		sout | "g for k=" | k;
+		L1: for (int i = 0; i < 10; i++) {
+			sout | "g for i=" | i;
+
+			A x = { "x" };
+			if (i == 2) {
+				sout | "continue L1";
+				continue;  // destruct x
+			} else if (i == 3) {
+				sout | "break L1";
+				break;  // destruct x
+			}
+
+			L2: for (int j = 0; j < 10; j++) {
+				sout | "g for j=" | j;
+				A y = { "y" };
+				if (j == 0) {
+					sout | "continue L2";
+					continue; // destruct y - missing because object that needs to be destructed is not a part of this block, it's a part of the for's block
+				} else if (j == 1) {
+					sout | "break L2";
+					break;  // destruct y
+				} else if (i == 1) {
+					sout | "continue L1";
+					continue L1; // destruct x,y - note: continue takes you to destructors for block, so only generate destructor for y
+				} else if (k == 1) {
+					sout | "break L1";
+					break L1;  // destruct x,y
+				}
+			}
+		}
+	}
+
+	sout | nl;
+	L3: if( 3 ) {
+		A w = { "w" };
+		if( 4 ) {
+			A v = { "v" };
+			sout | "break L3";
+			break L3;
+		}
+	}
+}
+
+// test goto
+void h() {
+	int i = 0;
+	// for each goto G with target label L:
+	// * find all constructed variables alive at G (set S_G)
+	// * find all constructed variables alive at L (set S_L)
+	// * if S_L-S_G is non-empty, error
+	// * emit destructors for all variables in S_G-S_L
+	sout | "h";
+	{
+		L0: ;
+#ifdef ERR1
+			goto L1; // this is an error in g++ because it skips initialization of y
+#endif
+			A y = { "y" };
+			// S_L1 = { y }
+		L1: sout | "L1";
+			A x = { "x" };
+			// S_L2 = { y, x }
+		L2: sout | "L2";
+			if (i == 0) {
+				++i;
+				sout | "goto L1";
+				// S_G = { y, x }
+				goto L1;  // jump back, destruct b/c before x definition
+				// S_L-S_G = {} => no error
+				// S_G-S_L = { x } => destruct x
+			} else if (i == 1) {
+				++i;
+				sout | "goto L2";
+				// S_G = { y, x }
+				goto L2;  // jump back, do not destruct
+				// S_L-S_G = {}
+				// S_G-S_L = {} => destruct nothing
+			} else if (i == 2) {
+				++i;
+				sout | "goto L3";
+				// S_G = { y, x }
+				goto L3;  // jump ahead, do not destruct
+				// S_L-S_G = {}
+				// S_G-S_L = {}
+			} else if (false) {
+				++i;
+				A z = { "z" };
+				sout | "goto L3-2";
+				// S_G = { z, y, x }
+				goto L3;
+				// S_L-S_G = {}
+				// S_G-S_L = {z} => destruct z
+			} else {
+				++i;
+				sout | "goto L4";
+				// S_G = { y, x }
+				goto L4;  // jump ahead, destruct b/c left block x was defined in
+				// S_L-S_G = {}
+				// S_G-S_L = { y, x } => destruct y, x
+			}
+			// S_L3 = { y, x }
+		L3: sout | "L3";
+			sout | "goto L2-2";
+			// S_G = { y, x }
+			goto L2; // jump back, do not destruct
+			// S_L-S_G = {}
+			// S_G-S_L = {}
+	}
+	// S_L4 = {}
+	L4: sout | "L4";
+	if (i == 4) {
+		sout | "goto L0";
+		// S_G = {}
+		goto L0;
+		// S_L-S_G = {}
+		// S_G-S_L = {}
+	}
+#ifdef ERR2
+	// S_G = {}
+	if (i == 5) goto L2; // this is an error in g++ because it skips initialization of y, x
+	// S_L-S_G = { y, x } => non-empty, so error
+#endif
+}
+
+// TODO: implement __label__ and uncomment these lines
+void computedGoto() {
+  // __label__ bar;
+  void *ptr;
+  ptr = &&foo;
+  goto *ptr;
+  assert(false);
+foo: ;
+//   void f() {
+//     ptr = &&bar;
+//     goto *ptr;
+//     assert(false);
+//   }
+//   f();
+//   assert(false);
+// bar: ;
+}
+
+int main() {
+	sepDisable(sout);
+	for (int i = 0; i < 4; i++) {
+		f(i);
+	}
+	sout | nl;
+	g();
+	sout | nl;
+	h();
+
+	computedGoto();
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa dtor-early-exit" //
+// End: //
Index: sts/raii/globals.c
===================================================================
--- tests/raii/globals.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,83 +1,0 @@
-#include <fstream.hfa>
-
-struct value_t {
-	int value;
-};
-
-void ?{}( value_t & this ) { this.value = 22; }
-
-//Standard case
-struct g_t {
-	value_t val;
-};
-
-void ?{}( g_t & this ) { (this.val){}; }
-
-g_t g;
-
-//Autogen case
-struct ga_t {
-	value_t val;
-};
-
-ga_t ga;
-
-//Inline case
-struct gi_t;
-void ?{}( gi_t & this );
-
-struct gi_t {
-	value_t val;
-} gi;
-
-void ?{}( gi_t & this ) { (this.val){}; }
-
-//Inline autogen case
-struct gia_t {
-	value_t val;
-} gia;
-
-//Static case
-struct gs_t {
-	value_t val;
-};
-
-void ?{}( gs_t & this ) { (this.val){}; }
-
-static gs_t gs;
-
-//Static autogen case
-struct gsa_t {
-	value_t val;
-};
-
-static gsa_t gsa;
-
-//Static inline case
-struct gsi_t;
-void ?{}( gsi_t & this );
-
-static struct gsi_t {
-	value_t val;
-} gsi;
-
-void ?{}( gsi_t & this ) { (this.val){}; }
-
-//Static inline autogen case
-static struct gsia_t {
-	value_t val;
-} gsia;
-
-int main() {
-	sout | "static\t\tinline\t\tautogen\t\tvalue" | endl;
-
-	sout | "no \t\tno \t\tno \t\t" | g.val.value    | endl;
-	sout | "no \t\tno \t\tyes\t\t" | ga.val.value   | endl;
-	sout | "no \t\tyes\t\tno \t\t" | gi.val.value   | endl;
-	sout | "no \t\tyes\t\tyes\t\t" | gia.val.value  | endl;
-	sout | "yes\t\tno \t\tno \t\t" | gs.val.value   | endl;
-	sout | "yes\t\tno \t\tyes\t\t" | gsa.val.value  | endl;
-	sout | "yes\t\tyes\t\tno \t\t" | gsi.val.value  | endl;
-	sout | "yes\t\tyes\t\tyes\t\t" | gsia.val.value | endl;
-
-}
Index: tests/raii/globals.cfa
===================================================================
--- tests/raii/globals.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/raii/globals.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,83 @@
+#include <fstream.hfa>
+
+struct value_t {
+	int value;
+};
+
+void ?{}( value_t & this ) { this.value = 22; }
+
+//Standard case
+struct g_t {
+	value_t val;
+};
+
+void ?{}( g_t & this ) { (this.val){}; }
+
+g_t g;
+
+//Autogen case
+struct ga_t {
+	value_t val;
+};
+
+ga_t ga;
+
+//Inline case
+struct gi_t;
+void ?{}( gi_t & this );
+
+struct gi_t {
+	value_t val;
+} gi;
+
+void ?{}( gi_t & this ) { (this.val){}; }
+
+//Inline autogen case
+struct gia_t {
+	value_t val;
+} gia;
+
+//Static case
+struct gs_t {
+	value_t val;
+};
+
+void ?{}( gs_t & this ) { (this.val){}; }
+
+static gs_t gs;
+
+//Static autogen case
+struct gsa_t {
+	value_t val;
+};
+
+static gsa_t gsa;
+
+//Static inline case
+struct gsi_t;
+void ?{}( gsi_t & this );
+
+static struct gsi_t {
+	value_t val;
+} gsi;
+
+void ?{}( gsi_t & this ) { (this.val){}; }
+
+//Static inline autogen case
+static struct gsia_t {
+	value_t val;
+} gsia;
+
+int main() {
+	sout | "static\t\tinline\t\tautogen\t\tvalue";
+
+	sout | "no \t\tno \t\tno \t\t" | g.val.value;
+	sout | "no \t\tno \t\tyes\t\t" | ga.val.value;
+	sout | "no \t\tyes\t\tno \t\t" | gi.val.value;
+	sout | "no \t\tyes\t\tyes\t\t" | gia.val.value;
+	sout | "yes\t\tno \t\tno \t\t" | gs.val.value;
+	sout | "yes\t\tno \t\tyes\t\t" | gsa.val.value;
+	sout | "yes\t\tyes\t\tno \t\t" | gsi.val.value;
+	sout | "yes\t\tyes\t\tyes\t\t" | gsia.val.value;
+
+}
Index: sts/raii/init_once.c
===================================================================
--- tests/raii/init_once.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,195 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// init_once.c --
-//
-// Author           : Rob Schluntz
-// Created On       : Tue Jun 14 15:43:35 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul  9 11:30:29 2016
-// Update Count     : 3
-//
-
-// want to ensure ctor/dtor called at most once per object.
-// whole point of ctor/dtor is that you don't know what's in
-// memory when it's first called, so can't rely on member to
-// determine if this is true. instead, keep an array
-// of addresses that have been constructed and remove the element
-// when it's destructed (and vice-versa)
-
-//*** setup
-extern "C" {
-#define NULL 0
-void * malloc(size_t);
-void free(void *);
-#define assert(cond) if (! (cond)) { printf("Assertion failed: (%s) at %s:%d\n", #cond, __FILE__, __LINE__); abort(); }
-void *memset(void *s, int c, size_t n);
-}
-
-// dummy type
-struct init_once { int * x; };
-
-// array and operations
-// const int size = 1024;
-#define size 1024
-struct array {
-	init_once * elems[size];
-	int length;
-};
-void remove(array * arr, init_once * x) {
-	for (int i = 0; i < arr->length; i++) {
-		if ( arr->elems[i] == x ) {
-			arr->elems[i] = arr->elems[--arr->length];
-			return;
-		}
-	}
-}
-void insert(array * arr, init_once * x) {
-	assert( arr->length < size );
-	arr->elems[arr->length++] = x;
-}
-int find(array * arr, init_once * x) {
-	for (int i = 0; i < arr->length; i++) {
-		if ( arr->elems[i] == x ) {
-			return i;
-		}
-	}
-	return -1;
-}
-void ?{}(array & arr) {
-	memset(arr.elems, 0, sizeof(arr.elems));
-	arr.length = 0;
-}
-array constructed;
-array destructed;
-
-void ?{}(init_once & x) {
-	assert( find( &constructed, &x ) == -1 );
-	remove( &destructed, &x );
-	insert( &constructed, &x );
-
-	x.x = (int *)malloc(sizeof(int));
-}
-
-void ?{}(init_once & x, init_once other) {
-	x{};  // reuse default ctor
-}
-
-void ^?{}(init_once & x) {
-	assert( find( &destructed, &x ) == -1 );
-	remove( &constructed, &x );
-	insert( &destructed, &x );
-
-	free(x.x);
-}
-//*** end setup
-
-// test globals
-init_once x;
-init_once y = x;
-
-void static_variable() {
-	static init_once x;
-}
-
-int main() {
-	// local variables
-	init_once x;
-	init_once y = x;
-
-	// block scoped variables
-	{
-		init_once x;
-		init_once y = x;
-	}
-
-	// loop variables
-	for (int i = 0 ; i < 10; i++) {
-		init_once x;
-		init_once y = x;
-	}
-	int i = 0;
-	while (i < 10) {
-		init_once x;
-		init_once y = x;
-		i++;
-	}
-
-	// declared in a switch block with a break
-	for (int i = 0; i < 10; i++) {
-		switch (10) {
-			case 1: {
-				init_once x;
-				init_once y = x;
-				x{}; // ensure this doesn't execute
-				break;
-			}
-			case 10: {
-				init_once x;
-				init_once y = x;
-			} // fall through
-			default: {
-				init_once x;
-				init_once y = x;
-				break;
-			}
-		}
-	}
-
-	// labeled break/continue
-	L3: for (int k = 0; k < 10; k++) {
-		init_once x;
-		init_once y = x;
-		L1: for (int i = 0; i < 10; i++){
-			init_once x;
-			init_once y = x;
-			L2: for (int j = 0; j < 10; j++) {
-				init_once x;
-				init_once y = x;
-
-				if (i == 0) continue L1;
-				if (i == 1) continue L2;
-				if (i == 2) break L2;
-				if (i == 3) break L1;
-				if (i == 4) continue L3;
-				if (i == 9) break L3;
-				// if (i == 5) goto ;
-			}
-		}
-	}
-
-	// labeled break/continue with if
-	LL1: for (int k = 0; k < 10; k++) {
-		init_once x;
-		init_once y = x;
-		LL2: for (int i = 0; i < 10; i++){
-			init_once x;
-			init_once y = x;
-			LL3: if( i < 5) {
-				init_once x;
-				init_once y = x;
-
-				if (i == 0) continue LL2;
-				if (i == 2) break LL3;
-				if (i == 3) break LL2;
-				if (i == 4) continue LL1;
-			} else {
-				if (i == 9) break LL1;
-				// if (i == 5) goto ;
-			}
-		}
-	}
-
-	// function-scoped static variable
-	for (int i = 0; i < 10; i++) {
-		static_variable();
-	}
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa init_once.c" //
-// End: //
Index: tests/raii/init_once.cfa
===================================================================
--- tests/raii/init_once.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/raii/init_once.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,195 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// init_once.c --
+//
+// Author           : Rob Schluntz
+// Created On       : Tue Jun 14 15:43:35 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sat Jul  9 11:30:29 2016
+// Update Count     : 3
+//
+
+// want to ensure ctor/dtor called at most once per object.
+// whole point of ctor/dtor is that you don't know what's in
+// memory when it's first called, so can't rely on member to
+// determine if this is true. instead, keep an array
+// of addresses that have been constructed and remove the element
+// when it's destructed (and vice-versa)
+
+//*** setup
+extern "C" {
+#define NULL 0
+void * malloc(size_t);
+void free(void *);
+#define assert(cond) if (! (cond)) { printf("Assertion failed: (%s) at %s:%d\n", #cond, __FILE__, __LINE__); abort(); }
+void *memset(void *s, int c, size_t n);
+}
+
+// dummy type
+struct init_once { int * x; };
+
+// array and operations
+// const int size = 1024;
+#define size 1024
+struct array {
+	init_once * elems[size];
+	int length;
+};
+void remove(array * arr, init_once * x) {
+	for (int i = 0; i < arr->length; i++) {
+		if ( arr->elems[i] == x ) {
+			arr->elems[i] = arr->elems[--arr->length];
+			return;
+		}
+	}
+}
+void insert(array * arr, init_once * x) {
+	assert( arr->length < size );
+	arr->elems[arr->length++] = x;
+}
+int find(array * arr, init_once * x) {
+	for (int i = 0; i < arr->length; i++) {
+		if ( arr->elems[i] == x ) {
+			return i;
+		}
+	}
+	return -1;
+}
+void ?{}(array & arr) {
+	memset(arr.elems, 0, sizeof(arr.elems));
+	arr.length = 0;
+}
+array constructed;
+array destructed;
+
+void ?{}(init_once & x) {
+	assert( find( &constructed, &x ) == -1 );
+	remove( &destructed, &x );
+	insert( &constructed, &x );
+
+	x.x = (int *)malloc(sizeof(int));
+}
+
+void ?{}(init_once & x, init_once other) {
+	x{};  // reuse default ctor
+}
+
+void ^?{}(init_once & x) {
+	assert( find( &destructed, &x ) == -1 );
+	remove( &constructed, &x );
+	insert( &destructed, &x );
+
+	free(x.x);
+}
+//*** end setup
+
+// test globals
+init_once x;
+init_once y = x;
+
+void static_variable() {
+	static init_once x;
+}
+
+int main() {
+	// local variables
+	init_once x;
+	init_once y = x;
+
+	// block scoped variables
+	{
+		init_once x;
+		init_once y = x;
+	}
+
+	// loop variables
+	for (int i = 0 ; i < 10; i++) {
+		init_once x;
+		init_once y = x;
+	}
+	int i = 0;
+	while (i < 10) {
+		init_once x;
+		init_once y = x;
+		i++;
+	}
+
+	// declared in a switch block with a break
+	for (int i = 0; i < 10; i++) {
+		switch (10) {
+			case 1: {
+				init_once x;
+				init_once y = x;
+				x{}; // ensure this doesn't execute
+				break;
+			}
+			case 10: {
+				init_once x;
+				init_once y = x;
+			} // fall through
+			default: {
+				init_once x;
+				init_once y = x;
+				break;
+			}
+		}
+	}
+
+	// labeled break/continue
+	L3: for (int k = 0; k < 10; k++) {
+		init_once x;
+		init_once y = x;
+		L1: for (int i = 0; i < 10; i++){
+			init_once x;
+			init_once y = x;
+			L2: for (int j = 0; j < 10; j++) {
+				init_once x;
+				init_once y = x;
+
+				if (i == 0) continue L1;
+				if (i == 1) continue L2;
+				if (i == 2) break L2;
+				if (i == 3) break L1;
+				if (i == 4) continue L3;
+				if (i == 9) break L3;
+				// if (i == 5) goto ;
+			}
+		}
+	}
+
+	// labeled break/continue with if
+	LL1: for (int k = 0; k < 10; k++) {
+		init_once x;
+		init_once y = x;
+		LL2: for (int i = 0; i < 10; i++){
+			init_once x;
+			init_once y = x;
+			LL3: if( i < 5) {
+				init_once x;
+				init_once y = x;
+
+				if (i == 0) continue LL2;
+				if (i == 2) break LL3;
+				if (i == 3) break LL2;
+				if (i == 4) continue LL1;
+			} else {
+				if (i == 9) break LL1;
+				// if (i == 5) goto ;
+			}
+		}
+	}
+
+	// function-scoped static variable
+	for (int i = 0; i < 10; i++) {
+		static_variable();
+	}
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa init_once.c" //
+// End: //
Index: sts/raii/memberCtors.c
===================================================================
--- tests/raii/memberCtors.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,91 +1,0 @@
-struct WrappedInt {
-  int x;
-};
-
-void ?{}(WrappedInt & this) {
-  printf("constructing int\n");
-  this.x = 0;
-}
-
-void ?{}(WrappedInt & this, WrappedInt other) {
-  printf("copy constructing int: %d\n", other.x);
-  this.x = other.x;
-}
-
-void ?{}(WrappedInt & this, int x) {
-  printf("constructing int: %d\n", x);
-  this.x = x;
-}
-
-void ^?{}(WrappedInt & this) {
-  printf("destructing int: %d\n", this.x);
-}
-
-void ?=?(WrappedInt & this, int x) {
-  printf("assigning int: %d %d\n", this.x, x);
-  this.x = x;
-}
-
-struct A {
-  WrappedInt x, y, z;
-};
-
-void ?{}(A & a) {
-  // currently must define default ctor, since there's no "= default" syntax
-}
-
-void ?{}(A & a, int x) {
-  printf("begin construct A\n");
-  printf("construct a.x\n");
-  (a.x){ x+999 };
-  printf("assign a.y\n");
-  a.y = 0; // not a constructor - default constructor will be inserted
-  printf("end construct A\n");
-} // z never constructed - will be automatically default constructed
-
-void ?{}(A & this, A other) {
-  printf("begin copy construct A\n");
-  printf("copy construct this.x\n");
-  (this.x){ other.x };
-  printf("assign this.y\n");
-  this.y = other.y; // not a constructor - copy constructor will be inserted
-  printf("end copy construct A\n");
-} // z never constructed - will be automatically copy constructed
-
-A ?=?(A & this, A other) {
-  printf("begin ?=? A\n");
-  this.x = other.x;
-  this.y = other.y;
-  this.z = other.z;
-  printf("end ?=? A\n");
-  return this;
-}
-
-struct B {
-  A a1, a2, a3;
-};
-
-void ?{}(B & b) {
-  printf("begin construct B\n");
-  printf("assign b.a2\n");
-  b.a2 = (A) { 2 };
-  printf("construct b.a1\n");
-  (b.a1){ 1 };
-#ifdef ERR1
-  (b.a2){ b.a3 }; // error, b->a2 was used previously but is explicitly constructed
-#endif
-  printf("end construct B\n");
-} // a2, a3 never constructed - will be automatically default constructed
-
-void ^?{}(B & b) {
-  b.a2 = (A) { 0 };
-  ^(b.a1){};
-} // a2, a3 never destructed - will be automatically destructed
-
-int main() {
-  printf("Before declaration of b1\n");
-  B b1;
-  printf("Before declaration of b2\n");
-  B b2 = b1;
-  printf("End of main\n");
-}
Index: tests/raii/memberCtors.cfa
===================================================================
--- tests/raii/memberCtors.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/raii/memberCtors.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,91 @@
+struct WrappedInt {
+  int x;
+};
+
+void ?{}(WrappedInt & this) {
+  printf("constructing int\n");
+  this.x = 0;
+}
+
+void ?{}(WrappedInt & this, WrappedInt other) {
+  printf("copy constructing int: %d\n", other.x);
+  this.x = other.x;
+}
+
+void ?{}(WrappedInt & this, int x) {
+  printf("constructing int: %d\n", x);
+  this.x = x;
+}
+
+void ^?{}(WrappedInt & this) {
+  printf("destructing int: %d\n", this.x);
+}
+
+void ?=?(WrappedInt & this, int x) {
+  printf("assigning int: %d %d\n", this.x, x);
+  this.x = x;
+}
+
+struct A {
+  WrappedInt x, y, z;
+};
+
+void ?{}(A & a) {
+  // currently must define default ctor, since there's no "= default" syntax
+}
+
+void ?{}(A & a, int x) {
+  printf("begin construct A\n");
+  printf("construct a.x\n");
+  (a.x){ x+999 };
+  printf("assign a.y\n");
+  a.y = 0; // not a constructor - default constructor will be inserted
+  printf("end construct A\n");
+} // z never constructed - will be automatically default constructed
+
+void ?{}(A & this, A other) {
+  printf("begin copy construct A\n");
+  printf("copy construct this.x\n");
+  (this.x){ other.x };
+  printf("assign this.y\n");
+  this.y = other.y; // not a constructor - copy constructor will be inserted
+  printf("end copy construct A\n");
+} // z never constructed - will be automatically copy constructed
+
+A ?=?(A & this, A other) {
+  printf("begin ?=? A\n");
+  this.x = other.x;
+  this.y = other.y;
+  this.z = other.z;
+  printf("end ?=? A\n");
+  return this;
+}
+
+struct B {
+  A a1, a2, a3;
+};
+
+void ?{}(B & b) {
+  printf("begin construct B\n");
+  printf("assign b.a2\n");
+  b.a2 = (A) { 2 };
+  printf("construct b.a1\n");
+  (b.a1){ 1 };
+#ifdef ERR1
+  (b.a2){ b.a3 }; // error, b->a2 was used previously but is explicitly constructed
+#endif
+  printf("end construct B\n");
+} // a2, a3 never constructed - will be automatically default constructed
+
+void ^?{}(B & b) {
+  b.a2 = (A) { 0 };
+  ^(b.a1){};
+} // a2, a3 never destructed - will be automatically destructed
+
+int main() {
+  printf("Before declaration of b1\n");
+  B b1;
+  printf("Before declaration of b2\n");
+  B b2 = b1;
+  printf("End of main\n");
+}
Index: sts/raii/multiDimension.c
===================================================================
--- tests/raii/multiDimension.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,75 +1,0 @@
-struct X {
-  int a;
-  int * ptr;
-};
-
-void ?{}(X & this) {
-  printf("default constructing\n");
-  (this.a){ 123 };
-  this.ptr = (int *)malloc(sizeof(int));
-}
-
-void ?{}(X & this, X other) {
-  printf("copy constructing\n");
-  (this.a){ other.a };
-  this.ptr = (int *)malloc(sizeof(int));
-}
-
-void ?{}(X & this, int a) {
-  printf("constructing with %d\n", a);
-  (this.a){ a };
-  this.ptr = (int *)malloc(sizeof(int));
-}
-
-void ^?{}(X & this) {
-  printf("destructing\n");
-  free(this.ptr);
-}
-
-X ?=?(X & this, X other) {
-  this.a = other.a;
-  return this;
-}
-
-X global[10][10] = {
-  { 1, { 2 }, { 3 }, { 4 }, 5, 6, 7, 8, 9, 10, 11, 12 },
-  { 1, 2, 3, 4 },
-  { { 1234567 } }
-};
-
-X global2[3][3][3] = {
-  {
-    { 1, 2, 3 },
-    { 4, 5, 6 },
-    { 7, 8, 9 },
-    { 10, 11, 12 }
-  },
-  {
-    { 0, 0, 0 }
-  }
-};
-
-int foo() {
-  static X abc[3][3] = {
-    { 11, 22, 33, 44 },
-    { 55, 66 },
-    { 77 },
-    { 88, 99, 1010 }
-  };
-}
-
-// ensure constructed const arrays continue to compile
-const int global[1] = { -2 };
-
-int main() {
-  X abc[4][4] = {
-    { 999, 1111 },
-    { 1, 2, 3, 4, 5 },
-    {},
-    { 0 },
-    { 88 }
-  };
-
-  foo();
-  foo();
-}
Index: tests/raii/multiDimension.cfa
===================================================================
--- tests/raii/multiDimension.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/raii/multiDimension.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,75 @@
+struct X {
+  int a;
+  int * ptr;
+};
+
+void ?{}(X & this) {
+  printf("default constructing\n");
+  (this.a){ 123 };
+  this.ptr = (int *)malloc(sizeof(int));
+}
+
+void ?{}(X & this, X other) {
+  printf("copy constructing\n");
+  (this.a){ other.a };
+  this.ptr = (int *)malloc(sizeof(int));
+}
+
+void ?{}(X & this, int a) {
+  printf("constructing with %d\n", a);
+  (this.a){ a };
+  this.ptr = (int *)malloc(sizeof(int));
+}
+
+void ^?{}(X & this) {
+  printf("destructing\n");
+  free(this.ptr);
+}
+
+X ?=?(X & this, X other) {
+  this.a = other.a;
+  return this;
+}
+
+X global[10][10] = {
+  { 1, { 2 }, { 3 }, { 4 }, 5, 6, 7, 8, 9, 10, 11, 12 },
+  { 1, 2, 3, 4 },
+  { { 1234567 } }
+};
+
+X global2[3][3][3] = {
+  {
+    { 1, 2, 3 },
+    { 4, 5, 6 },
+    { 7, 8, 9 },
+    { 10, 11, 12 }
+  },
+  {
+    { 0, 0, 0 }
+  }
+};
+
+int foo() {
+  static X abc[3][3] = {
+    { 11, 22, 33, 44 },
+    { 55, 66 },
+    { 77 },
+    { 88, 99, 1010 }
+  };
+}
+
+// ensure constructed const arrays continue to compile
+const int global[1] = { -2 };
+
+int main() {
+  X abc[4][4] = {
+    { 999, 1111 },
+    { 1, 2, 3, 4, 5 },
+    {},
+    { 0 },
+    { 88 }
+  };
+
+  foo();
+  foo();
+}
Index: tests/random.cfa
===================================================================
--- tests/random.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/random.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,10 +10,10 @@
 // Created On       : Tue Jul  5 21:29:30 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 18:00:15 2018
-// Update Count     : 20
+// Last Modified On : Tue Dec  4 21:46:25 2018
+// Update Count     : 22
 //
 
 #include <fstream.hfa>
-#include <stdlib.hfa>										// random
+#include <stdlib.hfa>									// random
 #include <unistd.h>										// getpid
 
@@ -24,52 +24,52 @@
 	// test polymorphic calls to random and stream
 	char c = random();
-	sout | c | endl;
+	sout | c;
 	c = random( 'A' );
-	sout | c | endl;
+	sout | c;
 	c = random( 'A', 'Z' );
-	sout | c | endl;
+	sout | c;
 
 	int i = random();
-    sout | i | endl;
+    sout | i;
 	i = random( 10 );
-    sout | i | endl;
+    sout | i;
 	i = random( -10, 20 );
-    sout | i | endl;
+    sout | i;
 
 	unsigned int ui = random();
-    sout | ui | endl;
+    sout | ui;
 	ui = random( 10u );
-    sout | ui | endl;
+    sout | ui;
 	ui = random( 10u, 20u );
-    sout | ui | endl;
+    sout | ui;
 
 	long int li = random();
-    sout | li | endl;
+    sout | li;
 	li = random( 10l );
-    sout | li | endl;
+    sout | li;
 	li = random( -10l, 20l );
-    sout | li | endl;
+    sout | li;
 
 	unsigned long int uli = random();
-    sout | uli | endl;
+    sout | uli;
 	uli = random( 10ul );
-    sout | uli | endl;
+    sout | uli;
 	uli = random( 10ul, 20ul );
-    sout | uli | endl;
+    sout | uli;
 
     float f = random();
-    sout | f | endl;
+    sout | f;
 
     double d = random();
-    sout | d | endl;
+    sout | d;
 
     float _Complex fc = random();
-    sout | fc | endl;
+    sout | fc;
 
     double _Complex dc = random();
-    sout | dc | endl;
+    sout | dc;
 
     long double _Complex ldc = random();
-    sout | ldc | endl;
+    sout | ldc;
 } // main
 
Index: tests/rational.cfa
===================================================================
--- tests/rational.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/rational.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Mon Mar 28 08:43:12 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 18:00:27 2018
-// Update Count     : 68
+// Last Modified On : Tue Dec  4 21:46:42 2018
+// Update Count     : 69
 //
 
@@ -27,71 +27,71 @@
 
 int main() {
-	sout | "constructor" | endl;
+	sout | "constructor";
 	Rational(int) a = { 3 }, b = { 4 }, c;
-	sout | a | b | c | endl;
+	sout | a | b | c;
 
 	a = (Rational(int)){ 4, 8 };
 	b = (Rational(int)){ 5, 7 };
-	sout | a | b | endl;
+	sout | a | b;
 	a = (Rational(int)){ -2, -3 };
 	b = (Rational(int)){ 3, -2 };
-	sout | a | b | endl;
+	sout | a | b;
 	a = (Rational(int)){ -2, 3 };
 	b = (Rational(int)){ 3, 2 };
-	sout | a | b | endl;
+	sout | a | b;
 
-	sout | "logical" | endl;
+	sout | "logical";
 	a = (Rational(int)){ -2 };
 	b = (Rational(int)){ -3, 2 };
-	sout | a | b | endl;
-//	sout | a == 1 | endl; // FIX ME
-	sout | a != b | endl;
-	sout | a <  b | endl;
-	sout | a <= b | endl;
-	sout | a >  b | endl;
-	sout | a >= b | endl;
+	sout | a | b;
+//	sout | a == 1; // FIX ME
+	sout | a != b;
+	sout | a <  b;
+	sout | a <= b;
+	sout | a >  b;
+	sout | a >= b;
 
-	sout | "arithmetic" | endl;
-	sout | a | b | endl;
-	sout | a + b | endl;
-	sout | a - b | endl;
-	sout | a * b | endl;
-	sout | a / b | endl;
+	sout | "arithmetic";
+	sout | a | b;
+	sout | a + b;
+	sout | a - b;
+	sout | a * b;
+	sout | a / b;
 
-	sout | "conversion" | endl;
+	sout | "conversion";
 	a = (Rational(int)){ 3, 4 };
-	sout | widen( a ) | endl;
+	sout | widen( a );
 	a = (Rational(int)){ 1, 7 };
-	sout | widen( a ) | endl;
+	sout | widen( a );
 	a = (Rational(int)){ 355, 113 };
-	sout | widen( a ) | endl;
-	sout | narrow( 0.75, 4 ) | endl;
-	sout | narrow( 0.14285714285714, 16 ) | endl;
-	sout | narrow( 3.14159265358979, 256 ) | endl;
+	sout | widen( a );
+	sout | narrow( 0.75, 4 );
+	sout | narrow( 0.14285714285714, 16 );
+	sout | narrow( 3.14159265358979, 256 );
 
-	sout | "decompose" | endl;
+	sout | "decompose";
 	int n, d;
 //	[n, d] = a;
-//	sout | a | n | d | endl;
+//	sout | a | n | d;
 
-	sout | "more tests" | endl;
+	sout | "more tests";
 	Rational(int) x = { 1, 2 }, y = { 2 };
-	sout | x - y | endl;
-	sout | x > y | endl;
-	sout | x | numerator( x, 2 ) | x | endl;
-	sout | y | denominator( y, -2 ) | y | endl;
+	sout | x - y;
+	sout | x > y;
+	sout | x | numerator( x, 2 ) | x;
+	sout | y | denominator( y, -2 ) | y;
 
 	Rational(int) z = { 0, 5 };
-	sout | z | endl;
+	sout | z;
 
-	sout | x | numerator( x, 0 ) | x | endl;
+	sout | x | numerator( x, 0 ) | x;
 
 	x = (Rational(int)){ 1, MAX } + (Rational(int)){ 1, MAX };
-	sout | x | endl;
+	sout | x;
 	x = (Rational(int)){ 3, MAX } + (Rational(int)){ 2, MAX };
-	sout | x | endl;
+	sout | x;
 
 	sin | a | b;
-	sout | a | b | endl;
+	sout | a | b;
 } // main
 
Index: tests/references.cfa
===================================================================
--- tests/references.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/references.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -9,27 +9,29 @@
 // Author           : Rob Schluntz
 // Created On       : Wed Aug 23 16:11:50 2017
-// Last Modified By : Rob Schluntz
-// Last Modified On : Wed Aug 23 16:12:03
-// Update Count     : 2
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Dec 25 14:31:48 2018
+// Update Count     : 11
 //
 
+#include <fstream.hfa>
+
 struct Y { int i; };
-void ?{}(Y & y) { printf("Default constructing a Y\n"); }
-void ?{}(Y & y, Y other) { printf("Copy constructing a Y\n"); }
-void ^?{}(Y & y) { printf("Destructing a Y\n"); }
-Y ?=?(Y & y, Y other) { printf("Assigning a Y\n"); return y; }
-void ?{}(Y & y, int i) { printf("Value constructing a Y %d\n", i); y.i = i; }
+void ?{}( Y & y ) { sout | "Default constructing a Y"; }
+void ?{}( Y & y, Y other ) { sout | "Copy constructing a Y"; }
+void ^?{}( Y & y ) { sout | "Destructing a Y"; }
+Y ?=?( Y & y, Y other ) { sout | "Assigning a Y"; return y; }
+void ?{}( Y & y, int i ) { sout | "Value constructing a Y" | i; y.i = i; }
 
 struct X { Y & r; Y y; };
-void ?{}(X & x) {
+void ?{}( X & x ) {
 	// ensure that r is not implicitly constructed
 }
-void ?{}(X & x, X other) {
+void ?{}( X & x, X other ) {
 	// ensure that r is not implicitly constructed
 }
-void ^?{}(X & x) {
+void ^?{}( X & x ) {
 	// ensure that r is not implicitly destructed
 }
-X ?=?(X & x, X other) { return x; }
+X ?=?( X & x, X other ) { return x; }
 
 // ensure that generated functions do not implicitly operate on references
@@ -48,42 +50,42 @@
 	int x = 123456, x2 = 789, *p1 = &x, **p2 = &p1, ***p3 = &p2,
 		&r1 = x,    &&r2 = r1,   &&&r3 = r2;
-	***p3 = 3;                          // change x
-	**p3 = &x;                          // change p1
-	*p3 = &p1;                          // change p2
-	int y = 0, z = 11, & ar[3] = { x, y, z };    // initialize array of references
-	// &ar[1] = &z;                        // change reference array element
-	// typeof( ar[1] ) p = 3;              // is int, i.e., the type of referenced object
-	// typeof( &ar[1] ) q = &x;            // is int *, i.e., the type of pointer
+	***p3 = 3;											// change x
+	**p3 = &x;											// change p1
+	*p3 = &p1;											// change p2
+	int y = 0, z = 11, & ar[3] = { x, y, z };			// initialize array of references
+														// &ar[1] = &z;                        // change reference array element
+														// typeof( ar[1] ) p = 3;              // is int, i.e., the type of referenced object
+														// typeof( &ar[1] ) q = &x;            // is int *, i.e., the type of pointer
 	// _Static_assert( sizeof( ar[1] ) == sizeof( int ), "Array type should be int." );   // is true, i.e., the size of referenced object
 	// _Static_assert( sizeof( &ar[1] ) == sizeof( int *), "Address of array should be int *." ); // is true, i.e., the size of a reference
 
-	((int*&)&r3) = &x;                  // change r1, (&*)**r3
+	((int*&)&r3) = &x;									// change r1, (&*)**r3
 	x = 3;
 	// test that basic reference properties are true - r1 should be an alias for x
-	printf("%d %d %d\n", x, r1, &x == &r1);
+	sout | x | r1 | &x == &r1;
 	r1 = 12;
-	printf("%d %d %d\n", x, r1, &x == &r1);
+	sout | x | r1 | &x == &r1;
 
 	// test that functions using basic references work
-	printf("%d %d %d %d\n", toref(&x), toref(p1), toptr(r1) == toptr(x), toptr(r1) == &x);
+	sout | toref( &x ) | toref( p1 ) | toptr( r1 ) == toptr( x ) | toptr( r1 ) == &x;
 
 	changeRef( x );
 	changeRef( y );
 	changeRef( z );
-	printf("%d %d %d\n", x, y, z);
+	sout | x | y | z;
 	changeRef( r1 );
-	printf("%d %d\n", r1, x);
+	sout | r1 | x;
 
-	r3 = 6;                               // change x, ***r3
-	printf("x = %d ; x2 = %d\n", x, x2);  // check that x was changed
-	&r3 = &x2;                            // change r1 to refer to x2, (&*)**r3
-	r3 = 999;                             // modify x2
-	printf("x = %d ; x2 = %d\n", x, x2);  // check that x2 was changed
-	((int**&)&&r3) = p2;                  // change r2, (&(&*)*)*r3, ensure explicit cast to reference works
-	r3 = 12345;                           // modify x
-	printf("x = %d ; x2 = %d\n", x, x2);  // check that x was changed
-	&&&r3 = p3;                           // change r3 to p3, (&(&(&*)*)*)r3
-	((int&)r3) = 22222;                   // modify x, ensure explicit cast to reference works
-	printf("x = %d ; x2 = %d\n", x, x2);  // check that x was changed
+	r3 = 6;												// change x, ***r3
+	sout | "x = " | x | " ; x2 = " | x2;				// check that x was changed
+	&r3 = &x2;											// change r1 to refer to x2, (&*)**r3
+	r3 = 999;											// modify x2
+	sout | "x = " | x | " ; x2 = " | x2;				// check that x2 was changed
+	((int**&)&&r3) = p2;								// change r2, (&(&*)*)*r3, ensure explicit cast to reference works
+	r3 = 12345;											// modify x
+	sout | "x = " | x | " ; x2 = " | x2;				// check that x was changed
+	&&&r3 = p3;											// change r3 to p3, (&(&(&*)*)*)r3
+	((int&)r3) = 22222;									// modify x, ensure explicit cast to reference works
+	sout | "x = " | x | " ; x2 = " | x2;					// check that x was changed
 
 	// test that reference members are not implicitly constructed/destructed/assigned
@@ -102,15 +104,15 @@
 		struct S { double x, y; };
 		void f( int & i, int & j, S & s, int v[] ) {
-			printf("%d %d { %g, %g }, [%d, %d, %d]\n", i, j, s.[x, y], v[0], v[1], v[2]);
+			sout | i | j | "{ " | s.[x, y] | " }," | "[" | v[0] | "," | v[1] | "," | v[2] | "]";
 		}
-		void g(int & i) { printf("%d\n", i); }
-		void h(int &&& i) { printf("%d\n", i); }
+		void g(int & i) { sout | i; }
+		void h(int &&& i) { sout | i; }
 
-		int &&& r = 3;  // rvalue to reference
+		int &&& r = 3;									// rvalue to reference
 		int i = r;
-		printf("%d %d\n", i, r);  // both 3
+		sout | i | r;									// both 3
 
-		g( 3 );          // rvalue to reference
-		h( (int &&&)3 ); // rvalue to reference
+		g( 3 );											// rvalue to reference
+		h( (int &&&)3 );								// rvalue to reference
 
 		int a = 5, b = 4;
Index: tests/searchsort.cfa
===================================================================
--- tests/searchsort.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/searchsort.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,10 +10,10 @@
 // Created On       : Thu Feb  4 18:17:50 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 18:00:38 2018
-// Update Count     : 102
+// Last Modified On : Thu Dec 20 22:49:46 2018
+// Update Count     : 108
 //
 
 #include <fstream.hfa>
-#include <stdlib.hfa>										// bsearch, qsort
+#include <stdlib.hfa>									// bsearch, qsort
 #include <stdlib.h>										// C version of bsearch
 
@@ -21,126 +21,133 @@
 
 int main( void ) {
-	const unsigned int size = 10;
+	const int size = 10;
 	int iarr[size];
 
-	for ( i; 0u ~ size ) {
+	sout | nlOff;										// turn off auto newline
+
+	for ( i; 0 ~ size ) {
 		iarr[i] = size - i;
 		sout | iarr[i] | ", ";
 	} // for
-	sout | endl | endl;
+	sout | nl | nl;
 
 	// ascending sort/search by changing < to >
 	qsort( iarr, size );
-	for ( i; 0u ~ size ) {
+	for ( i; 0 ~ size ) {
 		sout | iarr[i] | ", ";
 	} // for
-	sout | endl;
-	for ( i; 0u ~ size ) {		// C version
+	sout | nl;
+	for ( i; 0 ~ size ) {		// C version
 		int key = size - i;
 		int * v = bsearch( &key, iarr, size, sizeof( iarr[0] ), comp );
 		sout | key | ':' | *v | ", ";
 	} // for
-	sout | endl;
+	sout | nl;
 
-	for ( i; 0u ~ size ) {
+	for ( i; 0 ~ size ) {
 		int * v = bsearch( size - i, iarr, size );
 		sout | size - i | ':' | *v | ", ";
 	} // for
-	sout | endl;
-	for ( i; 0u ~ size ) {
+	sout | nl;
+	for ( i; 0 ~ size ) {
 		unsigned int posn = bsearch( size - i, iarr, size );
 		sout | size - i | ':' | iarr[posn] | ", ";
 	} // for
-	sout | endl | endl;
+	sout | nl | nl;
 
 	// descending sort/search by changing < to >
-	for ( i; 0u ~ size ) {
+	for ( i; 0 ~ size ) {
 		iarr[i] = i + 1;
 		sout | iarr[i] | ", ";
 	} // for
-	sout | endl;
+	sout | nl;
 	{
-		int ?<?( int x, int y ) { return x > y; }
-		qsort( iarr, size );
-		for ( i; 0u ~ size ) {
+		// redefinition of ?<? can't overlap the loop controls:
+		{
+			int (*?<?)(int, int) = ?>?;
+			qsort( iarr, size );
+		}
+		for ( i; 0 ~ size ) {
 			sout | iarr[i] | ", ";
 		} // for
-		sout | endl;
-		for ( i; 0u ~ size ) {
+		sout | nl;
+		for ( i; 0 ~ size ) {
+			int (*?<?)(int, int) = ?>?;
 			int * v = bsearch( size - i, iarr, size );
 			sout | size - i | ':' | *v | ", ";
 		} // for
-		sout | endl;
-		for ( i; 0u ~ size ) {
+		sout | nl;
+		for ( i; 0 ~ size ) {
+			int (*?<?)(int, int) = ?>?;
 			unsigned int posn = bsearch( size - i, iarr, size );
 			sout | size - i | ':' | iarr[posn] | ", ";
 		} // for
 	}
-	sout | endl | endl;
+	sout | nl | nl;
 
 	double darr[size];
-	for ( i; 0u ~ size ) {
+	for ( i; 0 ~ size ) {
 		darr[i] = size - i + 0.5;
 		sout | darr[i] | ", ";
 	} // for
-	sout | endl;
+	sout | nl;
 	qsort( darr, size );
-	for ( i; 0u ~ size ) {
+	for ( i; 0 ~ size ) {
 		sout | darr[i] | ", ";
 	} // for
-	sout | endl;
-	for ( i; 0u ~ size ) {
+	sout | nl;
+	for ( i; 0 ~ size ) {
 		double * v = bsearch( size - i + 0.5, darr, size );
 		sout | size - i + 0.5 | ':' | *v | ", ";
 	} // for
-	sout | endl;
-	for ( i; 0u ~ size ) {
+	sout | nl;
+	for ( i; 0 ~ size ) {
 		unsigned int posn = bsearch( size - i + 0.5, darr, size );
 		sout | size - i + 0.5 | ':' | darr[posn] | ", ";
 	} // for
-	sout | endl | endl;
+	sout | nl | nl;
 
 	struct S { int i, j; } sarr[size];
 	int ?<?( S t1, S t2 ) { return t1.i < t2.i && t1.j < t2.j; }
 	ofstream & ?|?( ofstream & os, S v ) { return os | v.i | ' ' | v.j; }
-	for ( i; 0u ~ size ) {
+	for ( i; 0 ~ size ) {
 		sarr[i].i = size - i;
 		sarr[i].j = size - i + 1;
 		sout | sarr[i] | ", ";
 	} // for
-	sout | endl;
+	sout | nl;
 	qsort( sarr, size );
-	for ( i; 0u ~ size ) {
+	for ( i; 0 ~ size ) {
 		sout | sarr[i] | ", ";
 	} // for
-	sout | endl;
-	for ( i; 0u ~ size ) {
+	sout | nl;
+	for ( i; 0 ~ size ) {
 		S temp = { size - i, size - i + 1 };
 		S * v = bsearch( temp, sarr, size );
 		sout | temp | ':' | *v | ", ";
 	} // for
-	sout | endl;
-	for ( i; 0u ~ size ) {
+	sout | nl;
+	for ( i; 0 ~ size ) {
 		S temp = { size - i, size - i + 1 };
 		unsigned int posn = bsearch( temp, sarr, size );
 		sout | temp | ':' | sarr[posn] | ", ";
 	} // for
-	sout | endl | endl;
+	sout | nl | nl;
 	{
-		unsigned int getKey( const S & s ) { return s.j; }
-		for ( i; 0u ~ size ) {
+		int getKey( const S & s ) { return s.j; }
+		for ( i; 0 ~ size ) {
 			sout | sarr[i] | ", ";
 		} // for
-		sout | endl;
-		for ( i; 0u ~ size ) {
+		sout | nl;
+		for ( i; 0 ~ size ) {
 			S * v = bsearch( size - i + 1, sarr, size );
 			sout | size - i + 1 | ':' | *v | ", ";
 		} // for
-		sout | endl;
-		for ( i; 0u ~ size ) {
+		sout | nl;
+		for ( i; 0 ~ size ) {
 			unsigned int posn = bsearch( size - i + 1, sarr, size );
 			sout | size - i + 1 | ':' | sarr[posn] | ", ";
 		} // for
-		sout | endl | endl;
+		sout | nl | nl;
 	}
 } // main
Index: tests/shortCircuit.cfa
===================================================================
--- tests/shortCircuit.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/shortCircuit.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -1,2 +1,17 @@
+//
+// 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.
+// 
+// shortCircuit.cfa -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Thu Jan 28 18:26:16 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Dec  4 18:26:05 2018
+// Update Count     : 4
+// 
+
 void g( float f ) {}
 void g( int i ) {}
@@ -33,7 +48,6 @@
 }
 
-
-int main(int argc, char const *argv[])
-{
+int main( int argc, char const *argv[] ) {
+	sout | nlOff;
 	test_t true_val, false_val;
 	true_val.x = 1;
@@ -41,15 +55,20 @@
 
 	true_val && false_val;
-	sout | endl;
+	sout | nl;
 
 	true_val || false_val;
-	sout | endl;
+	sout | nl;
 
 	false_val && true_val;
-	sout | endl;
+	sout | nl;
 
 	false_val || true_val;
-	sout | endl;
+	sout | nl;
 
 	return 0;
 }
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa abs.cfa" //
+// End: //
Index: tests/sum.cfa
===================================================================
--- tests/sum.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/sum.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -11,6 +11,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 18:01:10 2018
-// Update Count     : 280
+// Last Modified On : Sun Dec 23 23:00:38 2018
+// Update Count     : 287
 //
 
@@ -56,5 +56,5 @@
 	} // for
 	sout | "sum from" | low | "to" | High | "is"
-		 | sum( size, (unsigned char *)a ) | ", check" | (int)s | endl;
+		 | sum( size, (unsigned char *)a ) | ", check" | (int)s;
 
 	int s = 0, a[size], v = low;
@@ -64,5 +64,5 @@
 	} // for
 	sout | "sum from" | low | "to" | High | "is"
-		 | sum( size, (int *)a ) | ", check" | (int)s | endl;
+		 | sum( size, (int *)a ) | ", check" | (int)s;
 
 	float s = 0.0f, a[size], v = low / 10.0f;
@@ -72,5 +72,5 @@
 	} // for
 	sout | "sum from" | low / 10.0f | "to" | High / 10.0f | "is"
-		 | sum( size, (float *)a ) | ", check" | (float)s | endl;
+		 | sum( size, (float *)a ) | ", check" | (float)s;
 
 	double s = 0.0, a[size], v = low / 10.0;
@@ -80,5 +80,5 @@
 	} // for
 	sout | "sum from" | low / 10.0 | "to" | High / 10.0 | "is"
-		 | sum( size, (double *)a ) | ", check" | (double)s | endl;
+		 | sum( size, (double *)a ) | ", check" | (double)s;
 
 	struct S { int i, j; };
@@ -93,4 +93,5 @@
 	S ?++( S & t ) { S temp = t; t += (S){1}; return temp; }
 	ofstream & ?|?( ofstream & os, S v ) { return os | v.i | v.j; }
+	void ?|?( ofstream & os, S v ) { (ofstream &)(os | v); nl( os ); }
 
 	S s = (S){0}, a[size], v = { low, low };
@@ -100,5 +101,5 @@
 	} // for
 	sout | "sum from" | low | "to" | High | "is"
-		 | sum( size, (S *)a ) | ", check" | (S)s | endl;
+		 | sum( size, (S *)a ) | ", check" | (S)s;
 
 	forall( otype Impl | sumable( Impl ) )
@@ -114,5 +115,5 @@
 	} // for
 	sout | "sum from" | low | "to" | High | "is"
-		 | sum( size, gs.x ) | ", check" | (int)s | endl; // add field array in generic type
+		 | sum( size, gs.x ) | ", check" | (int)s;		// add field array in generic type
 	delete( gs.x );
 } // main
Index: tests/swap.cfa
===================================================================
--- tests/swap.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/swap.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 18:01:23 2018
-// Update Count     : 72
+// Last Modified On : Sun Dec 23 23:00:49 2018
+// Update Count     : 77
 //
 
@@ -19,73 +19,74 @@
 int main( void ) {
 	char c1 = 'a', c2 = 'b';
-	sout | "char\t\t\t" | c1 | ' ' | c2 | "\t\t\tswap ";
+	sout | "char\t\t\t" | c1 | ' ' | c2 | "\t\t\tswap " | nonl;
 	swap( c1, c2 );
-	sout | '\t' | c1 | ' ' | c2 | endl;
+	sout | '\t' | c1 | ' ' | c2;
 
 	signed int i1 = -1, i2 = -2;
-	sout | "signed int\t\t" | i1 | i2 | "\t\t\tswap ";
+	sout | "signed int\t\t" | i1 | i2 | "\t\t\tswap " | nonl;
 	swap( i1, i2 );
-	sout | '\t' | i1 | i2 | endl;
+	sout | '\t' | i1 | i2;
 
 	unsigned int ui1 = 1, ui2 = 2;
-	sout | "unsigned int\t\t" | ui1 | ui2 | "\t\t\tswap ";
+	sout | "unsigned int\t\t" | ui1 | ui2 | "\t\t\tswap " | nonl;
 	swap( ui1, ui2 );
-	sout | '\t' | ui1 | ui2 | endl;
+	sout | '\t' | ui1 | ui2;
 
 	signed long int li1 = -1, li2 = -2;
-	sout | "signed long int\t\t" | li1 | li2 | "\t\t\tswap ";
+	sout | "signed long int\t\t" | li1 | li2 | "\t\t\tswap " | nonl;
 	swap( li1, li2 );
-	sout | '\t' | li1 | li2 | endl;
+	sout | '\t' | li1 | li2;
 
 	unsigned long int uli1 = 1, uli2 = 2;
-	sout | "unsigned long int\t" | uli1 | uli2 | "\t\t\tswap ";
+	sout | "unsigned long int\t" | uli1 | uli2 | "\t\t\tswap " | nonl;
 	swap( uli1, uli2 );
-	sout | '\t' | uli1 | uli2 | endl;
+	sout | '\t' | uli1 | uli2;
 
 	signed long long int lli1 = -1, lli2 = -2;
-	sout | "signed long long int\t" | lli1 | lli2 | "\t\t\tswap ";
+	sout | "signed long long int\t" | lli1 | lli2 | "\t\t\tswap " | nonl;
 	swap( lli1, lli2 );
-	sout | '\t' | lli1 | lli2 | endl;
+	sout | '\t' | lli1 | lli2;
 
 	unsigned long long int ulli1 = 1, ulli2 = 2;
-	sout | "unsigned long long int\t" | ulli1 | ulli2 | "\t\t\tswap ";
+	sout | "unsigned long long int\t" | ulli1 | ulli2 | "\t\t\tswap " | nonl;
 	swap( ulli1, ulli2 );
-	sout | '\t' | ulli1 | ulli2 | endl;
+	sout | '\t' | ulli1 | ulli2;
 
 	float f1 = 1.5, f2 = 2.5;
-	sout | "float\t\t\t" | f1 | f2 | "\t\t\tswap ";
+	sout | "float\t\t\t" | f1 | f2 | "\t\t\tswap " | nonl;
 	swap( f1, f2 );
-	sout | '\t' | f1 | f2 | endl;
+	sout | '\t' | f1 | f2;
 
 	double d1 = 1.5, d2 = 2.5;
-	sout | "double\t\t\t" | d1 | d2 | "\t\t\tswap ";
+	sout | "double\t\t\t" | d1 | d2 | "\t\t\tswap " | nonl;
 	swap( d1, d2 );
-	sout | '\t' | d1 | d2 | endl;
+	sout | '\t' | d1 | d2;
 
 	long double ld1 = 1.5, ld2 = 2.5;
-	sout | "long double\t\t" | ld1 | ld2 | "\t\t\tswap ";
+	sout | "long double\t\t" | ld1 | ld2 | "\t\t\tswap " | nonl;
 	swap( ld1, ld2 );
-	sout | '\t' | ld1 | ld2 | endl;
+	sout | '\t' | ld1 | ld2;
 
 	float _Complex fc1 = 1.5f+1.5if, fc2 = 2.5f+2.5if;
-	sout | "float _Complex\t\t" | fc1 | fc2 | "\tswap ";
+	sout | "float _Complex\t\t" | fc1 | fc2 | "\tswap " | nonl;
 	swap( fc1, fc2 );
-	sout | '\t' | fc1 | fc2 | endl;
+	sout | '\t' | fc1 | fc2;
 
 	double _Complex dc1 = 1.5d+1.5id, dc2 = 2.5d+2.5id;
-	sout | "double _Complex\t\t" | dc1 | dc2 | "\tswap ";
+	sout | "double _Complex\t\t" | dc1 | dc2 | "\tswap " | nonl;
 	swap( dc1, dc2 );
-	sout | '\t' | dc1 | dc2 | endl;
+	sout | '\t' | dc1 | dc2;
 
 	long double _Complex ldc1 = 1.5d+1.5il, ldc2 = 2.5d+2.5il;
-	sout | "long double _Complex\t" | ldc1 | ldc2 | "\tswap ";
+	sout | "long double _Complex\t" | ldc1 | ldc2 | "\tswap " | nonl;
 	swap( ldc1, ldc2 );
-	sout | '\t' | ldc1 | ldc2 | endl;
+	sout | '\t' | ldc1 | ldc2;
 
 	struct S { int i, j; } s1 = { 1, 2 }, s2 = { 2, 1 };
 	ofstream & ?|?( ofstream & os, S s ) { return os | s.i | s.j; }
-	sout | "struct S\t\t" | s1 | "," | s2 | "\t\tswap ";
+	void ?|?( ofstream & os, S s ) { (ofstream &)(os | s.i | s.j); nl( os ); }
+	sout | "struct S\t\t" | s1 | "," | s2 | "\t\tswap " | nonl;
 	swap( s1, s2 );
-	sout | '\t' | s1 | "," | s2 | endl;
+	sout | '\t' | s1 | "," | s2;
 } // main
 
Index: tests/test.py
===================================================================
--- tests/test.py	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/test.py	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -19,5 +19,5 @@
 
 	def matchTest(path):
-		match = re.search("%s\/([\w\/\-_]*).expect\/([\w\-_]+)(\.[\w\-_]+)?\.txt" % settings.SRCDIR, path)
+		match = re.search("^%s\/([\w\/\-_]*).expect\/([\w\-_]+)(\.[\w\-_]+)?\.txt$" % settings.SRCDIR, path)
 		if match :
 			test = Test()
@@ -34,7 +34,4 @@
 # reads the directory ./.expect and indentifies the tests
 def listTests( includes, excludes ):
-	includes = [canonicalPath( i ) for i in includes] if includes else None
-	excludes = [canonicalPath( i ) for i in excludes] if excludes else None
-
 	# tests directly in the .expect folder will always be processed
 	test_list = findTests()
Index: tests/time.cfa
===================================================================
--- tests/time.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/time.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Tue Mar 27 17:24:56 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 18:01:45 2018
-// Update Count     : 17
+// Last Modified On : Thu Dec 20 23:09:21 2018
+// Update Count     : 23
 //
 
@@ -19,48 +19,48 @@
 int main() {
 	Duration d1 = 3`h, d2 = 2`s, d3 = 3.375`s, d4 = 12`s, d5 = 1`s + 10_000`ns;
-	sout | d1 | d2 | d3 | d4 | d5 | endl;
+	sout | d1 | d2 | d3 | d4 | d5;
 	int i;
 	d1 = 0;
-	sout | d1 | d2 | d3 | endl;
+	sout | d1 | d2 | d3;
 	d1 = 7`s;
 	d3 = d2 = d1;
-	sout | d1 | d2 | d3 | endl;
+	sout | d1 | d2 | d3;
 	d1 = d1 + d2;
-	sout | d1 | endl;
-	sout | d1 == 7`s | d1 == d2 | d1 == 0 | endl;
-	sout | div( 7`s, 2`s ) | endl;
-	sout | endl;
+	sout | d1;
+	sout | d1 == 7`s | d1 == d2 | d1 == 0;
+	sout | div( 7`s, 2`s );
+	sout | nl;
 
 	Time t = { 1970, 1, 2, 0, 0, 0, 10_000_000 };
-	sout | t | endl;
+	sout | t;
 	t = t + d1;
-	sout | t | t.tv | endl;
+	sout | t | t.tv;
 	Time t1 = (timespec){ 104_414, 10_000_000 };
-	sout | t1 | t1.tv | endl;
-	sout | t - t  | t + d5 | t.tv | endl;
+	sout | t1 | t1.tv;
+	sout | t - t  | t + d5 | t.tv;
 	char buf[16];
-	sout | "yy/mm/dd" | [t, buf]`ymd;					// shared buf => separate calls
-	sout | "mm/dd/yy" | mm_dd_yy( t, buf );
+	sout | "yy/mm/dd" | [t, buf]`ymd | nonl;			// shared buf => separate calls
+	sout | "mm/dd/yy" | mm_dd_yy( t, buf ) | nonl;
 	strftime( buf, 16, "%D", t );						// %D => mm/dd/yy
-	sout | "mm/dd/yy" | buf;
-	sout | "dd/yy/mm" | [t, buf]`dmy | endl;
+	sout | "mm/dd/yy" | buf | nonl;
+	sout | "dd/yy/mm" | [t, buf]`dmy;
 	Time t2 = { 2001, 7, 4, 0, 0, 1, 0 }, t3 = (timeval){ 994_219_201 };
-	sout | t2 | t2.tv | endl | t3 | t3.tv | endl;
-	sout | endl;
+	sout | t2 | t2.tv | nl | t3 | t3.tv;
+	sout | nl;
 
 	// Clock Newfoundland = { -3.5`h }, PST = { -8`h };	// distance from GMT (UTC)
-	// sout | "Clock Resolution" | getRes() | endl
-	// 	 | "Newfoundland" | getTime( Newfoundland ) | endl
-	// 	 | "local" | getTime() | endl
-	// 	 | "local nsec" | getTimeNsec() | endl
-	// 	 | "PST" | PST() | endl;						// getTime short form
-	// sout | endl;
+	// sout | "Clock Resolution" | getRes()
+	// 	 | "Newfoundland" | getTime( Newfoundland )
+	// 	 | "local" | getTime()
+	// 	 | "local nsec" | getTimeNsec()
+	// 	 | "PST" | PST();								// getTime short form
+	// sout | nl;
 
 	// http://en.cppreference.com/w/cpp/chrono/duration/operator_arith4
 	Duration s = 1`h + 2 * 10`m + 70`s / 10;
-	sout | "1 hour + 2*10 min + 70/10 sec = " | s | "seconds" | endl;
-	sout | "Dividing that by 2 minutes gives" | s / 2`m | endl;
-	sout | "Dividing that by 2 gives" | s / 2 | "seconds\n";
-	sout | s | "seconds is" | s`h | "hours," | (s % 1`h)`m | "minutes," | (s % 1`m)`s | "seconds" | endl;
+	sout | "1 hour + 2*10 min + 70/10 sec = " | s | "seconds";
+	sout | "Dividing that by 2 minutes gives" | s / 2`m;
+	sout | "Dividing that by 2 gives" | s / 2 | "seconds";
+	sout | s | "seconds is" | s`h | "hours," | (s % 1`h)`m | "minutes," | (s % 1`m)`s | "seconds";
 } // main
 
Index: sts/tuple/tupleAssign.c
===================================================================
--- tests/tuple/tupleAssign.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,66 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// tupleAssign.c --
-//
-// Author           : Rob Schluntz
-// Created On       : Tue Nov 15 17:24:32 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Mar  6 21:23:58 2017
-// Update Count     : 34
-//
-
-#include <fstream.hfa>
-
-int main() {
-	{
-		// test multiple assignment and cascading assignment
-		int u = 5, v = 6, x = 10, y = 11;
-		[int, int] z = [100, 200];
-
-		// swap x, y and store the new [x, y] in [u, v] and in z;
-		printf( "u=%d v=%d x=%d y=%d z=[%d, %d]\n", u, v, x, y, z );
-		sout | "u=" | u | "v=" | v | "x=" | x | "y=" | y | "z=[" | z | "]" | endl;
-		z = [u, v] = [x, y] = [y, x];
-		printf( "u=%d v=%d x=%d y=%d z=[%d, %d]\n", u, v, x, y, z );
-		sout | "u=" | u | "v=" | v | "x=" | x | "y=" | y | "z=[" | z | "]" | endl;
-
-		// shuffle elements -- v = z.0, z.0 = z.1, z.1 = u, u = v
-		[v, z, u] = [z, u, v];
-		printf( "u=%d v=%d z=[%d, %d]\n", u, v, z );
-		sout | "u=" | u | "v=" | v | "z=[" | z | "]" | endl;
-
-		// multiple assignment with tuple expression on right
-		z = [111, 222];
-		[u, v] = [123, 456];
-		printf( "u=%d v=%d z=[%d, %d]\n", u, v, z );
-		sout | "u=" | u | "v=" | v | "z=[" | z | "]" | endl;
-	}
-	{
-		// test mass assignment
-		double d = 0.0;
-		int i = 0;
-		char c = '\0';
-		struct X {
-			int z;
-		} x;
-		X ?=?(X & x, double d) { return x; }
-		[int, double, int] t;
-
-		// no conversion from X to integral types, so this serves as a santiy
-		// check that as long as this compiles, ?=?(_, x) is not generated.
-		[t, x, d, i, c, x] = (double)94.12;
-		printf( "d=%lg i=%d c=%c t=[%d, %lg, %d]\n", d, i, (int)c, t );
-		sout | "d=" | d | "i=" | i | "c=" | c | ' ' | "t=[" | t | "]" | endl;
-		[x, c, i, d, x, t] = (double)-94.12;
-		printf( "d=%lg i=%d c=%c t=[%d, %lg, %d]\n", d, i, c, t );
-		sout | "d=" | d | "i=" | i | "c=" | c | ' ' | "t=[" | t | "]" | endl;
-	}
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: tests/tuple/tupleAssign.cfa
===================================================================
--- tests/tuple/tupleAssign.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/tuple/tupleAssign.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,66 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// tupleAssign.c --
+//
+// Author           : Rob Schluntz
+// Created On       : Tue Nov 15 17:24:32 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Dec  4 22:03:48 2018
+// Update Count     : 35
+//
+
+#include <fstream.hfa>
+
+int main() {
+	{
+		// test multiple assignment and cascading assignment
+		int u = 5, v = 6, x = 10, y = 11;
+		[int, int] z = [100, 200];
+
+		// swap x, y and store the new [x, y] in [u, v] and in z;
+		printf( "u=%d v=%d x=%d y=%d z=[%d, %d]\n", u, v, x, y, z );
+		sout | "u=" | u | "v=" | v | "x=" | x | "y=" | y | "z=[" | z | "]";
+		z = [u, v] = [x, y] = [y, x];
+		printf( "u=%d v=%d x=%d y=%d z=[%d, %d]\n", u, v, x, y, z );
+		sout | "u=" | u | "v=" | v | "x=" | x | "y=" | y | "z=[" | z | "]";
+
+		// shuffle elements -- v = z.0, z.0 = z.1, z.1 = u, u = v
+		[v, z, u] = [z, u, v];
+		printf( "u=%d v=%d z=[%d, %d]\n", u, v, z );
+		sout | "u=" | u | "v=" | v | "z=[" | z | "]";
+
+		// multiple assignment with tuple expression on right
+		z = [111, 222];
+		[u, v] = [123, 456];
+		printf( "u=%d v=%d z=[%d, %d]\n", u, v, z );
+		sout | "u=" | u | "v=" | v | "z=[" | z | "]";
+	}
+	{
+		// test mass assignment
+		double d = 0.0;
+		int i = 0;
+		char c = '\0';
+		struct X {
+			int z;
+		} x;
+		X ?=?(X & x, double d) { return x; }
+		[int, double, int] t;
+
+		// no conversion from X to integral types, so this serves as a santiy
+		// check that as long as this compiles, ?=?(_, x) is not generated.
+		[t, x, d, i, c, x] = (double)94.12;
+		printf( "d=%lg i=%d c=%c t=[%d, %lg, %d]\n", d, i, (int)c, t );
+		sout | "d=" | d | "i=" | i | "c=" | c | ' ' | "t=[" | t | "]";
+		[x, c, i, d, x, t] = (double)-94.12;
+		printf( "d=%lg i=%d c=%c t=[%d, %lg, %d]\n", d, i, c, t );
+		sout | "d=" | d | "i=" | i | "c=" | c | ' ' | "t=[" | t | "]";
+	}
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: sts/tuple/tupleCast.c
===================================================================
--- tests/tuple/tupleCast.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,30 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// tupleCast.c --
-//
-// Author           : Rob Schluntz
-// Created On       : Mon Dec 12 15:56:07 2016
-// Last Modified By : Rob Schluntz
-// Last Modified On : Mon Dec 12 15:56:20 2016
-// Update Count     : 2
-//
-
-[char, int, double] f() { printf("ran f\n"); return ['c', 70, 6.28]; }
-
-int main() {
-  [int, char, float] x = [10, 'A', 3.14f];
-  printf("%d %c %g\n", ([int, char, float])x);
-  printf("%d %c\n", ([int, char])x);
-  printf("%d\n", ([int])x);
-  // printf("%d\n", (int)x);
-  printf("%g %g\n", ([double, float])x);
-  printf("%d %c\n", ([int, char])f());
-}
-
-// Local Variables: //
-// tab-width: 2 //
-// End: //
Index: tests/tuple/tupleCast.cfa
===================================================================
--- tests/tuple/tupleCast.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/tuple/tupleCast.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,30 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// tupleCast.c --
+//
+// Author           : Rob Schluntz
+// Created On       : Mon Dec 12 15:56:07 2016
+// Last Modified By : Rob Schluntz
+// Last Modified On : Mon Dec 12 15:56:20 2016
+// Update Count     : 2
+//
+
+[char, int, double] f() { printf("ran f\n"); return ['c', 70, 6.28]; }
+
+int main() {
+  [int, char, float] x = [10, 'A', 3.14f];
+  printf("%d %c %g\n", ([int, char, float])x);
+  printf("%d %c\n", ([int, char])x);
+  printf("%d\n", ([int])x);
+  // printf("%d\n", (int)x);
+  printf("%g %g\n", ([double, float])x);
+  printf("%d %c\n", ([int, char])f());
+}
+
+// Local Variables: //
+// tab-width: 2 //
+// End: //
Index: sts/tuple/tupleFunction.c
===================================================================
--- tests/tuple/tupleFunction.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,98 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// tupleFunction.c --
-//
-// Author           : Rob Schluntz
-// Created On       : Tue Nov 15 17:24:32 2016
-// Last Modified By : Rob Schluntz
-// Last Modified On : Tue Nov 15 17:27:28 2016
-// Update Count     : 3
-//
-
-struct S {
-	int f1, f2;
-	char f3;
-	double f4;
-} v;
-
-[int] foo( [int, int, double, S] x ) {
-	printf("foo([%d, %d, %lg, {%d, %d, %c, %lg}])\n", x.0, x.1, x.2, x.3.[f1, f2, f3, f4]);
-	int a, b;
-	double c;
-	S d;
-	[a, b, c, d] = x;
-	[int, int, double, S] X = x;
-	printf("a=%d b=%d c=%lg d={%d, %d, %c, %lg}\n", a, b, c, d.[f1, f2, f3, f4]);
-	printf("X=[%d, %d, %lg, {%d, %d, %c, %lg}]\n", X.0, X.1, X.2, X.3.[f1, f2, f3, f4]);
-	return b;
-}
-
-[void] bar( [int, double, int] z ) {
-	printf("bar([%d, %lg, %d])\n", z);
-}
-
-[void] baz( int a, double b, int c ) {
-	printf("baz(%d, %lg, %d)\n", a, b, c);
-}
-
-[void] qux( [int, double] n, int m ) {
-	printf("qux([%d, %lg], %d)\n", n, m);
-}
-
-[int, double x, int] quux() {
-	return [3, 5.254, 4];
-}
-[[[int, double, int], [int, double]]] quuux() {
-	return [1, 2, 3, 4, 5];
-}
-
-int main() {
-	[int, double, int] x = [777, 2.76, 8675];
-	int x1 = 123, x3 = 456;
-	double x2 = 999.123;
-
-	printf("foo(...)=%d\n", foo(x1, x3, x2, (S){ 321, 654, 'Q', 3.14 }));
-
-	// call function with tuple parameter using tuple variable arg
-	bar(x);
-
-	// call function with tuple parameter using multiple values
-	bar(x1, x2, x3);
-
-	// call function with multiple parameters using tuple variable arg
-	baz(x);
-
-	// call function with multiple parameters using multiple args
-	baz(x1, x2, x3);
-
-	// call function with multiple parameters, one of which is a tuple using tuple variable arg
-	qux(x);
-
-	// call function with multiple parameters, one of which is a tuple using multiple args
-	qux(x1, x2, x3);
-
-	// call function with multiple return values and assign into a tuple variable
-	x = quux();
-	printf("x=[%d, %lg, %d]\n", x);
-
-	// call function with multiple return values and assign into a tuple expression
-	[x1, x2, x3] = quux();
-	printf("x1=%d x2=%lg x3=%d\n", x1, x2, x3);
-
-	// xxx - tuples of type parameters should come out as generic types?
-	// [x1, x2, x3] = ([(int)x1, (int)x2, (int)x3]) + ([(int)1, (int)2, (int)3]);
-	// ([(int)x1, (int)x2, (int)x3]) + ([(int)1, (int)2, (int)3]);
-	// printf("%d %g %d\n", x1, x2, x3);
-
-	// xxx - comes out the back as a cast, but should come out as a tuple expression of the first n fields cast to each of the result types
-	// ([int, double])x;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
-
Index: tests/tuple/tupleFunction.cfa
===================================================================
--- tests/tuple/tupleFunction.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/tuple/tupleFunction.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,98 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// tupleFunction.c --
+//
+// Author           : Rob Schluntz
+// Created On       : Tue Nov 15 17:24:32 2016
+// Last Modified By : Rob Schluntz
+// Last Modified On : Tue Nov 15 17:27:28 2016
+// Update Count     : 3
+//
+
+struct S {
+	int f1, f2;
+	char f3;
+	double f4;
+} v;
+
+[int] foo( [int, int, double, S] x ) {
+	printf("foo([%d, %d, %lg, {%d, %d, %c, %lg}])\n", x.0, x.1, x.2, x.3.[f1, f2, f3, f4]);
+	int a, b;
+	double c;
+	S d;
+	[a, b, c, d] = x;
+	[int, int, double, S] X = x;
+	printf("a=%d b=%d c=%lg d={%d, %d, %c, %lg}\n", a, b, c, d.[f1, f2, f3, f4]);
+	printf("X=[%d, %d, %lg, {%d, %d, %c, %lg}]\n", X.0, X.1, X.2, X.3.[f1, f2, f3, f4]);
+	return b;
+}
+
+[void] bar( [int, double, int] z ) {
+	printf("bar([%d, %lg, %d])\n", z);
+}
+
+[void] baz( int a, double b, int c ) {
+	printf("baz(%d, %lg, %d)\n", a, b, c);
+}
+
+[void] qux( [int, double] n, int m ) {
+	printf("qux([%d, %lg], %d)\n", n, m);
+}
+
+[int, double x, int] quux() {
+	return [3, 5.254, 4];
+}
+[[[int, double, int], [int, double]]] quuux() {
+	return [1, 2, 3, 4, 5];
+}
+
+int main() {
+	[int, double, int] x = [777, 2.76, 8675];
+	int x1 = 123, x3 = 456;
+	double x2 = 999.123;
+
+	printf("foo(...)=%d\n", foo(x1, x3, x2, (S){ 321, 654, 'Q', 3.14 }));
+
+	// call function with tuple parameter using tuple variable arg
+	bar(x);
+
+	// call function with tuple parameter using multiple values
+	bar(x1, x2, x3);
+
+	// call function with multiple parameters using tuple variable arg
+	baz(x);
+
+	// call function with multiple parameters using multiple args
+	baz(x1, x2, x3);
+
+	// call function with multiple parameters, one of which is a tuple using tuple variable arg
+	qux(x);
+
+	// call function with multiple parameters, one of which is a tuple using multiple args
+	qux(x1, x2, x3);
+
+	// call function with multiple return values and assign into a tuple variable
+	x = quux();
+	printf("x=[%d, %lg, %d]\n", x);
+
+	// call function with multiple return values and assign into a tuple expression
+	[x1, x2, x3] = quux();
+	printf("x1=%d x2=%lg x3=%d\n", x1, x2, x3);
+
+	// xxx - tuples of type parameters should come out as generic types?
+	// [x1, x2, x3] = ([(int)x1, (int)x2, (int)x3]) + ([(int)1, (int)2, (int)3]);
+	// ([(int)x1, (int)x2, (int)x3]) + ([(int)1, (int)2, (int)3]);
+	// printf("%d %g %d\n", x1, x2, x3);
+
+	// xxx - comes out the back as a cast, but should come out as a tuple expression of the first n fields cast to each of the result types
+	// ([int, double])x;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
+
Index: sts/tuple/tupleMember.c
===================================================================
--- tests/tuple/tupleMember.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,61 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// tupleFunction.c --
-//
-// Author           : Rob Schluntz
-// Created On       : Tue Nov 15 17:24:32 2016
-// Last Modified By : Rob Schluntz
-// Last Modified On : Tue Nov 15 17:27:28 2016
-// Update Count     : 3
-//
-
-void f() {
-	printf("called f!\n");
-}
-
-double g(double x, char y, int z) {
-	return z-y+x;
-}
-
-struct V2	{
-	int f2, f3;
-};
-struct V {
-	int f1;
-	V2 i; // temporary
-	// struct V2 {
-	//   int f2, f3;
-	// } i;
-	double f4;
-} v;
-
-V & h() {
-	static V local = { 111, { 222, 333 }, 444.5 };
-	return local;
-}
-
-int main() {
-	struct X {
-		int a;
-		double b;
-		char c;
-	} x = { 10, 12.5, '\x9' };
-
-	// should only call f once
-	printf("g(...)=%lg\n", g((f(), x).[b, c, a]));
-
-	v.[f1, i.[f2, f3], f4].[1.0, 2, 0, 1.1] = [11, 3.14159, 12, 13];
-
-	printf("v.[f1, i.[f2, f3], f4]=[%d, %d, %d, %lg]\n", v.[f1, i.[f2, f3], f4]);
-
-	h().[f1, i.[f2, f3], f4].[1.0, 2, 0, 1.1] = [987, 6.28, 4, 2];
-	printf("v.[f1, i.[f2, f3], f4]=[%d, [%d, %d], %lg]\n", h().[f1, i.[f2, f3], f4]);
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: tests/tuple/tupleMember.cfa
===================================================================
--- tests/tuple/tupleMember.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/tuple/tupleMember.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,61 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// tupleFunction.c --
+//
+// Author           : Rob Schluntz
+// Created On       : Tue Nov 15 17:24:32 2016
+// Last Modified By : Rob Schluntz
+// Last Modified On : Tue Nov 15 17:27:28 2016
+// Update Count     : 3
+//
+
+void f() {
+	printf("called f!\n");
+}
+
+double g(double x, char y, int z) {
+	return z-y+x;
+}
+
+struct V2	{
+	int f2, f3;
+};
+struct V {
+	int f1;
+	V2 i; // temporary
+	// struct V2 {
+	//   int f2, f3;
+	// } i;
+	double f4;
+} v;
+
+V & h() {
+	static V local = { 111, { 222, 333 }, 444.5 };
+	return local;
+}
+
+int main() {
+	struct X {
+		int a;
+		double b;
+		char c;
+	} x = { 10, 12.5, '\x9' };
+
+	// should only call f once
+	printf("g(...)=%lg\n", g((f(), x).[b, c, a]));
+
+	v.[f1, i.[f2, f3], f4].[1.0, 2, 0, 1.1] = [11, 3.14159, 12, 13];
+
+	printf("v.[f1, i.[f2, f3], f4]=[%d, %d, %d, %lg]\n", v.[f1, i.[f2, f3], f4]);
+
+	h().[f1, i.[f2, f3], f4].[1.0, 2, 0, 1.1] = [987, 6.28, 4, 2];
+	printf("v.[f1, i.[f2, f3], f4]=[%d, [%d, %d], %lg]\n", h().[f1, i.[f2, f3], f4]);
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: sts/tuple/tuplePolymorphism.c
===================================================================
--- tests/tuple/tuplePolymorphism.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,74 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// tuplePolymorphism.c --
-//
-// Author           : Rob Schluntz
-// Created On       : Tue Nov 16 10:38:00 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu May 18 18:05:12 2017
-// Update Count     : 4
-//
-
-// packed is needed so that structs are not passed with the same alignment as function arguments
-__attribute__((packed)) struct A {
-	double x;
-	char y;
-	double z;
-};
-
-__attribute__((packed)) struct B {
-	long long x;
-	char y;
-	long long z;
-};
-
-// ensure that f is a viable candidate for g, even though its parameter structure does not exactly match
-[A] f([A, B] x, B y) { printf("%g %c %g %lld %c %lld %lld %c %lld\n", x.0.[x,y,z], x.1.[x,y,z], y.[x,y,z]); return x.0; }
-forall(otype T, otype U | { T f(T, U, U); })
-void g(T x, U y) { f(x, y, y); }
-
-// add two triples
-forall(otype T | { T ?+?(T, T); })
-[T, T, T] ?+?([T, T, T] x, [T, T, T] y) {
-	return [x.0+y.0, x.1+y.1, x.2+y.2];
-}
-
-int main() {
-	int x1 = 123, x3 = 456;
-	double x2 = 999.123;
-
-	int i1 = 111, i3 = 222;
-	double i2 = 333;
-
-	int d1 = 555, d3 = 444;
-	double d2 = 666;
-
-
-	[i1, i2, i3] = ([x1, (int)x2, x3]) + ([9, 2, 3]);
-	[d1, d2, d3] = ([x1, x2, x3]) + ([9, 2, 3]);
-	printf("%d %g %d\n", i1, i2, i3);
-	printf("%d %g %d\n", d1, d2, d3);
-
-	[double, double, double] zzz;
-	zzz = [x1, x2, x3];
-	printf("%g %g %g\n", zzz);
-	[x1, x2, x3] = zzz+zzz;
-	printf("%d %g %d\n", x1, x2, x3);
-
-	// ensure non-matching assertions are specialized correctly
-	g((A){ 1.21, 'x', 10.21}, (B){ 1111LL, 'v', 54385938LL });
-}
-
-forall(otype T)
-[T, T] foo([T, T] y) {
-	[T, T] x;
-	return x;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: tests/tuple/tuplePolymorphism.cfa
===================================================================
--- tests/tuple/tuplePolymorphism.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/tuple/tuplePolymorphism.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,74 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// tuplePolymorphism.c --
+//
+// Author           : Rob Schluntz
+// Created On       : Tue Nov 16 10:38:00 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu May 18 18:05:12 2017
+// Update Count     : 4
+//
+
+// packed is needed so that structs are not passed with the same alignment as function arguments
+__attribute__((packed)) struct A {
+	double x;
+	char y;
+	double z;
+};
+
+__attribute__((packed)) struct B {
+	long long x;
+	char y;
+	long long z;
+};
+
+// ensure that f is a viable candidate for g, even though its parameter structure does not exactly match
+[A] f([A, B] x, B y) { printf("%g %c %g %lld %c %lld %lld %c %lld\n", x.0.[x,y,z], x.1.[x,y,z], y.[x,y,z]); return x.0; }
+forall(otype T, otype U | { T f(T, U, U); })
+void g(T x, U y) { f(x, y, y); }
+
+// add two triples
+forall(otype T | { T ?+?(T, T); })
+[T, T, T] ?+?([T, T, T] x, [T, T, T] y) {
+	return [x.0+y.0, x.1+y.1, x.2+y.2];
+}
+
+int main() {
+	int x1 = 123, x3 = 456;
+	double x2 = 999.123;
+
+	int i1 = 111, i3 = 222;
+	double i2 = 333;
+
+	int d1 = 555, d3 = 444;
+	double d2 = 666;
+
+
+	[i1, i2, i3] = ([x1, (int)x2, x3]) + ([9, 2, 3]);
+	[d1, d2, d3] = ([x1, x2, x3]) + ([9, 2, 3]);
+	printf("%d %g %d\n", i1, i2, i3);
+	printf("%d %g %d\n", d1, d2, d3);
+
+	[double, double, double] zzz;
+	zzz = [x1, x2, x3];
+	printf("%g %g %g\n", zzz);
+	[x1, x2, x3] = zzz+zzz;
+	printf("%d %g %d\n", x1, x2, x3);
+
+	// ensure non-matching assertions are specialized correctly
+	g((A){ 1.21, 'x', 10.21}, (B){ 1111LL, 'v', 54385938LL });
+}
+
+forall(otype T)
+[T, T] foo([T, T] y) {
+	[T, T] x;
+	return x;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: sts/tuple/tupleVariadic.c
===================================================================
--- tests/tuple/tupleVariadic.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,142 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// tuplePolymorphism.c --
-//
-// Author           : Rob Schluntz
-// Created On       : Fri Dec 16 10:25:35 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug  2 09:24:04 2018
-// Update Count     : 6
-//
-
-#include <stdlib.hfa>
-
-void func(void) {
-	printf("called func(void)\n");
-}
-forall(otype T, ttype Params | { void process(T); void func(Params); })
-void func(T arg1, Params p) {
-	process(arg1);
-	func(p);
-}
-void process(int x) {
-	printf("called process(int) %d\n", x);
-}
-void process(double x) {
-	printf("called process(double) %g\n", x);
-}
-
-struct array {
-	int * data;
-	int size;
-};
-
-// xxx - eventually this will be collapsed...x
-void ?{}(array & a) {
-	a.size = 0;
-	a.data = 0;
-	printf("called ?{} with no a\n");
-}
-
-void ?{}(array & a, int a0) {
-	a.size = 1;
-	a.data = (int*)malloc(sizeof(int)*a.size);
-	a.data[0] = a0;
-	printf("called ?{} with a: %d\n", a0);
-}
-
-void ?{}(array & a, int a0, int a1) {
-	a.size = 2;
-	a.data = (int*)malloc(sizeof(int)*a.size);
-	a.data[0] = a0;
-	a.data[1] = a1;
-	printf("called ?{} with a: %d %d\n", a0, a1);
-}
-
-void ?{}(array & a, int a0, int a1, int a2) {
-	a.size = 3;
-	a.data = (int*)malloc(sizeof(int)*a.size);
-	a.data[0] = a0;
-	a.data[1] = a1;
-	a.data[2] = a2;
-	printf("called ?{} with a: %d %d %d\n", a0, a1, a2);
-}
-
-void ^?{}(array & a) {
-	free(a.data);
-}
-
-// test use of a tuple argument
-[void] ?{}(array & a, [int, int, int, int] args) {
-	int a0, a1, a2, a3;
-	[a0, a1, a2, a3] = args;
-	a.size = 4;
-	a.data = (int *)malloc(sizeof(int)*a.size);
-	a.data[0] = a0;
-	a.data[1] = a1;
-	a.data[2] = a2;
-	a.data[3] = a3;
-	printf("called ?{} with a: %d %d %d %d\n", a0, a1, a2, a3);
-}
-
-void print(array * x) {
-	printf("array = { ");
-	for (int i = 0; i < x->size; ++i) {
-		printf("%d, ", x->data[i]);
-	}
-	printf("}\n");
-}
-
-forall(otype T)
-T * copy(T x) {
-	// test calling new inside a polymorphic function
-	return new(x);
-}
-
-forall(ttype T | { void foo(T); }) void bar(T x) {}
-void foo(int) {}
-
-int main() {
-	array * x0 = new();
-	print(x0);
-
-	array * x1 = new(999);
-	print(x1);
-
-	array * x2 = new(123, 456);
-	print(x2);
-
-	array * x3 = new(100, 200, 300);
-	print(x3);
-
-	array * x4 = new(10, 2, 3, 4);
-	print(x4);
-
-	int * ptr = copy(111111);
-	printf("copy=%d\n", *ptr);
-
-	printf("calling func\n");
-	func(3, 2.0, 111, 4.145);
-	printf("finished func\n");
-
-	{
-		// T = [const int] -- this ensures that void(*)(int) satisfies void(*)(const int)
-		const int x;
-		bar(x);
-	}
-
-	delete(ptr);
-	delete(x4);
-	delete(x3);
-	delete(x2);
-	delete(x1);
-	delete(x0);
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: tests/tuple/tupleVariadic.cfa
===================================================================
--- tests/tuple/tupleVariadic.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/tuple/tupleVariadic.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,142 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// tuplePolymorphism.c --
+//
+// Author           : Rob Schluntz
+// Created On       : Fri Dec 16 10:25:35 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu Aug  2 09:24:04 2018
+// Update Count     : 6
+//
+
+#include <stdlib.hfa>
+
+void func(void) {
+	printf("called func(void)\n");
+}
+forall(otype T, ttype Params | { void process(T); void func(Params); })
+void func(T arg1, Params p) {
+	process(arg1);
+	func(p);
+}
+void process(int x) {
+	printf("called process(int) %d\n", x);
+}
+void process(double x) {
+	printf("called process(double) %g\n", x);
+}
+
+struct array {
+	int * data;
+	int size;
+};
+
+// xxx - eventually this will be collapsed...x
+void ?{}(array & a) {
+	a.size = 0;
+	a.data = 0;
+	printf("called ?{} with no a\n");
+}
+
+void ?{}(array & a, int a0) {
+	a.size = 1;
+	a.data = (int*)malloc(sizeof(int)*a.size);
+	a.data[0] = a0;
+	printf("called ?{} with a: %d\n", a0);
+}
+
+void ?{}(array & a, int a0, int a1) {
+	a.size = 2;
+	a.data = (int*)malloc(sizeof(int)*a.size);
+	a.data[0] = a0;
+	a.data[1] = a1;
+	printf("called ?{} with a: %d %d\n", a0, a1);
+}
+
+void ?{}(array & a, int a0, int a1, int a2) {
+	a.size = 3;
+	a.data = (int*)malloc(sizeof(int)*a.size);
+	a.data[0] = a0;
+	a.data[1] = a1;
+	a.data[2] = a2;
+	printf("called ?{} with a: %d %d %d\n", a0, a1, a2);
+}
+
+void ^?{}(array & a) {
+	free(a.data);
+}
+
+// test use of a tuple argument
+[void] ?{}(array & a, [int, int, int, int] args) {
+	int a0, a1, a2, a3;
+	[a0, a1, a2, a3] = args;
+	a.size = 4;
+	a.data = (int *)malloc(sizeof(int)*a.size);
+	a.data[0] = a0;
+	a.data[1] = a1;
+	a.data[2] = a2;
+	a.data[3] = a3;
+	printf("called ?{} with a: %d %d %d %d\n", a0, a1, a2, a3);
+}
+
+void print(array * x) {
+	printf("array = { ");
+	for (int i = 0; i < x->size; ++i) {
+		printf("%d, ", x->data[i]);
+	}
+	printf("}\n");
+}
+
+forall(otype T)
+T * copy(T x) {
+	// test calling new inside a polymorphic function
+	return new(x);
+}
+
+forall(ttype T | { void foo(T); }) void bar(T x) {}
+void foo(int) {}
+
+int main() {
+	array * x0 = new();
+	print(x0);
+
+	array * x1 = new(999);
+	print(x1);
+
+	array * x2 = new(123, 456);
+	print(x2);
+
+	array * x3 = new(100, 200, 300);
+	print(x3);
+
+	array * x4 = new(10, 2, 3, 4);
+	print(x4);
+
+	int * ptr = copy(111111);
+	printf("copy=%d\n", *ptr);
+
+	printf("calling func\n");
+	func(3, 2.0, 111, 4.145);
+	printf("finished func\n");
+
+	{
+		// T = [const int] -- this ensures that void(*)(int) satisfies void(*)(const int)
+		const int x;
+		bar(x);
+	}
+
+	delete(ptr);
+	delete(x4);
+	delete(x3);
+	delete(x2);
+	delete(x1);
+	delete(x0);
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: sts/tuple/tuples.c
===================================================================
--- tests/tuple/tuples.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,32 +1,0 @@
-int a;
-float a;
-int f( int );
-float f( float );
-
-void g() {
-	// selects the same f each time but without a cast would be ambiguous
-	f( (int)a );
-	(int)f( a );
-}
-
-[ int ] p;
-[ int, double ] p;
-[ int, int, int ] p;
-[ int, int, int, int ] p;
-
-[ char ] q;
-[ int, int ] q;
-[ int, int, float ] q;
-[ int, int, int, int ] q;
-
-[ int, int ] r( int, int, int, int );
-
-void s() {
-	r( p, q );
-	r( [ q, p ] );
-	r( r( p, q ), r( q, q ) );
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: tests/tuple/tuples.cfa
===================================================================
--- tests/tuple/tuples.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/tuple/tuples.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,32 @@
+int a;
+float a;
+int f( int );
+float f( float );
+
+void g() {
+	// selects the same f each time but without a cast would be ambiguous
+	f( (int)a );
+	(int)f( a );
+}
+
+[ int ] p;
+[ int, double ] p;
+[ int, int, int ] p;
+[ int, int, int, int ] p;
+
+[ char ] q;
+[ int, int ] q;
+[ int, int, float ] q;
+[ int, int, int, int ] q;
+
+[ int, int ] r( int, int, int, int );
+
+void s() {
+	r( p, q );
+	r( [ q, p ] );
+	r( r( p, q ), r( q, q ) );
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: tests/userLiterals.cfa
===================================================================
--- tests/userLiterals.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/userLiterals.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Wed Sep  6 21:40:50 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 18:02:03 2018
-// Update Count     : 55
+// Last Modified On : Tue Dec  4 22:03:10 2018
+// Update Count     : 56
 //
 
@@ -18,15 +18,15 @@
 #include <uchar.h>
 
-int ?`s( int s ) { sout | "secs" | s | endl; return s; }
-int ?`m( int m ) { sout | "mins" | m | endl; return m * 60; }
-int ?`h( int h ) { sout | "hours" | h | endl; return h * 3600; }
-int ?`_A_( int x ) { sout | "_A_" | x | endl; return x; }
-int ?`__thingy_( int x ) { sout | "_thingy_" | x | endl; return x; }
+int ?`s( int s ) { sout | "secs" | s; return s; }
+int ?`m( int m ) { sout | "mins" | m; return m * 60; }
+int ?`h( int h ) { sout | "hours" | h; return h * 3600; }
+int ?`_A_( int x ) { sout | "_A_" | x; return x; }
+int ?`__thingy_( int x ) { sout | "_thingy_" | x; return x; }
 
-int ?`s( const char * s ) { sout | "secs" | s | endl; return 0; }
-int ?`m( const char16_t * m ) { sout | "mins" | m | endl; return 0;}
-int ?`h( const char32_t * h ) { sout | "hours" | h | endl; return 0; }
-int ?`_A_( const wchar_t * str ) { sout | "_A_" | str | endl; return 0; }
-int ?`__thingy_( const char * str ) { sout | "_thingy_" | str | endl; return 0; }
+int ?`s( const char * s ) { sout | "secs" | s; return 0; }
+int ?`m( const char16_t * m ) { sout | "mins" | m; return 0;}
+int ?`h( const char32_t * h ) { sout | "hours" | h; return 0; }
+int ?`_A_( const wchar_t * str ) { sout | "_A_" | str; return 0; }
+int ?`__thingy_( const char * str ) { sout | "_thingy_" | str; return 0; }
 
 
@@ -46,17 +46,17 @@
 	Weight w, heavy = { 20 };							// 20 stone
 	w = 155`lb;
-	sout | w | endl;
+	sout | w;
 	w = 0b_1111`st;
-	sout | w | endl;
+	sout | w;
 	w = 0_233`lb;										// octal weight (155)
-	sout | w | endl;
+	sout | w;
 	w = 0x_9b_u`kg;
-	sout | w | endl;
+	sout | w;
 	w = 70.3`kg;
-	sout | w | endl;
+	sout | w;
 	w = 11`st + 1`lb;
-	sout | w | endl;
+	sout | w;
 	w = 5`st + 8`kg + 25`lb + heavy;
-	sout | w | endl;
+	sout | w;
 
 //	0`secs;
Index: tests/vector.cfa
===================================================================
--- tests/vector.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/vector.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -10,6 +10,6 @@
 // Created On       : Mon Jul  4 23:36:19 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov  6 18:02:26 2018
-// Update Count     : 28
+// Last Modified On : Tue Dec  4 22:02:39 2018
+// Update Count     : 29
 //
 
@@ -21,5 +21,5 @@
 	do {										\
 		if ( !(x) ) {							\
-			sout | "CHECK failed :" | #x | "at" | __FILE__ | " :" | __LINE__ | endl;	\
+			sout | "CHECK failed :" | #x | "at" | __FILE__ | " :" | __LINE__;	\
 			abort();							\
 		}										\
@@ -31,17 +31,17 @@
 	assert( empty( &iv ) );
 	assert( size( &iv ) == 0 );
-	sout | size( &iv ) | endl;
+	sout | size( &iv );
 
 	push_back( &iv, 1 );
 	assert( size( &iv ) == 1 );
-	sout | size( &iv ) | endl;
+	sout | size( &iv );
 
 	push_back( &iv, 2 );
 	assert( size( &iv ) == 2 );
-	sout | size( &iv ) | endl;
+	sout | size( &iv );
 
 	push_back( &iv, 3 );
 	assert( size( &iv ) == 3 );
-	sout | size( &iv ) | endl;
+	sout | size( &iv );
 
 	assert( !empty( &iv ) );
@@ -58,5 +58,5 @@
 	assert( empty( &iv ) );
 	assert( size( &iv ) == 0 );
-	sout | size( &iv ) | endl;
+	sout | size( &iv );
 }
 
Index: tests/warnings/.expect/self-assignment.txt
===================================================================
--- tests/warnings/.expect/self-assignment.txt	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/warnings/.expect/self-assignment.txt	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -1,25 +1,25 @@
-warnings/self-assignment.c:29:1 warning: self assignment of expression: Cast of:
+warnings/self-assignment.cfa:29:1 warning: self assignment of expression: Cast of:
   Variable Expression: j: signed int
 ... to:
   reference to signed int
-warnings/self-assignment.c:30:1 warning: self assignment of expression: Cast of:
-  Variable Expression: s: instance of struct S with body 1 
+warnings/self-assignment.cfa:30:1 warning: self assignment of expression: 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.c:31:1 warning: self assignment of expression: Cast of:
-  Member Expression, with field: 
+  reference to instance of struct S with body 1
+warnings/self-assignment.cfa:31:1 warning: self assignment of expression: Cast of:
+  Member Expression, with field:
     i: signed int
-  ... from aggregate: 
-    Variable Expression: s: instance of struct S with body 1 
+  ... from aggregate:
+    Variable Expression: s: instance of struct S with body 1
 ... to:
   reference to signed int
-warnings/self-assignment.c:32:1 warning: self assignment of expression: Cast of:
-  Member Expression, with field: 
+warnings/self-assignment.cfa:32:1 warning: self assignment of expression: Cast of:
+  Member Expression, with field:
     i: signed int
-  ... from aggregate: 
-    Member Expression, with field: 
-      s: instance of struct S with body 1 
-    ... from aggregate: 
-      Variable Expression: t: instance of struct T with body 1 
+  ... from aggregate:
+    Member Expression, with field:
+      s: instance of struct S with body 1
+    ... from aggregate:
+      Variable Expression: t: instance of struct T with body 1
 ... to:
   reference to signed int
Index: sts/warnings/self-assignment.c
===================================================================
--- tests/warnings/self-assignment.c	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ 	(revision )
@@ -1,38 +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.
-//
-// self-assignment.c --
-//
-// 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
-//
-
-struct S {
-  int i;
-};
-
-struct T {
-  S s;
-};
-
-int main() {
-  int j = 0;
-  S s = { 0 };
-  T t = { { 0 } };
-
-  j = j;
-  s = s;
-  s.i = s.i;
-  t.s.i = t.s.i;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa dtor-early-exit" //
-// End: //
Index: tests/warnings/self-assignment.cfa
===================================================================
--- tests/warnings/self-assignment.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
+++ tests/warnings/self-assignment.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -0,0 +1,38 @@
+//
+// 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.
+//
+// self-assignment.c --
+//
+// 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
+//
+
+struct S {
+  int i;
+};
+
+struct T {
+  S s;
+};
+
+int main() {
+  int j = 0;
+  S s = { 0 };
+  T t = { { 0 } };
+
+  j = j;
+  s = s;
+  s.i = s.i;
+  t.s.i = t.s.i;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa dtor-early-exit" //
+// End: //
Index: tests/withStatement.cfa
===================================================================
--- tests/withStatement.cfa	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tests/withStatement.cfa	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -9,97 +9,98 @@
 // Author           : Rob Schluntz
 // Created On       : Mon Dec 04 17:41:45 2017
-// Last Modified By : Rob Schluntz
-// Last Modified On : Mon Dec 04 17:45:07 2017
-// Update Count     : 2
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Mon Dec 24 19:08:18 2018
+// Update Count     : 5
 //
 
+#include <fstream.hfa>
+
 struct S {
-  int i;
-  // dynamically allocated member ensures ctor/dtors are called correctly on temporaries
-  int * ptr;
+	int i;
+	// dynamically allocated member ensures ctor/dtors are called correctly on temporaries
+	int * ptr;
 };
 
 // with clause on reference parameter
-void ?{}(S & this, int n) with(this) {
-  i = n;
-  ptr = (int *)malloc(sizeof(int));
+void ?{}( S & this, int n ) with( this ) {
+	i = n;
+	ptr = (int *)malloc( sizeof(int) );
 }
 
-void ?{}(S & this) {
-  this{ 0 };
+void ?{}( S & this ) {
+	this{ 0 };
 }
 
-void ?{}(S & this, S other) {
-  this{ other.i };
+void ?{}( S & this, S other ) {
+	this{ other.i };
 }
 
-S ?=?(S & this, S other) with(this) {
-  i = other.i;
-  *ptr = *other.ptr;
-  return this;
+S ?=?( S & this, S other ) with( this ) {
+	i = other.i;
+	*ptr = *other.ptr;
+	return this;
 }
 
-void ^?{}(S & this) with(this) {
-  free(ptr);
+void ^?{}( S & this ) with( this ) {
+	free( ptr );
 }
 
 struct S2 {
-  S s;
+	S s;
 };
 
-void ?{}(S2 & this, int n) {
-  (this.s){ n };
+void ?{}( S2 & this, int n ) {
+	(this.s){ n };
 }
 
-forall(otype T)
+forall( otype T )
 struct Box {
-  T x;
+	T x;
 };
 
-forall(otype T)
-void ?{}(Box(T) & this) with(this) { // with clause in polymorphic function
-  x{};
+forall( otype T )
+void ?{}( Box(T) & this ) with( this ) { // with clause in polymorphic function
+	x{};
 }
 
-void print(int i) { printf("%d", i); }
+void print( int i ) { sout | i; }
 
-forall(otype T | { void print(T); })
-void foo(T t) {
-  Box(T) b = { t };
-  with(b) {  // with statement in polymorphic function
-    print(x);
-    printf("\n");
-  }
+forall( otype T | { void print( T ); })
+void foo( T t ) {
+	Box( T ) b = { t };
+	with( b ) {  // with statement in polymorphic function
+		print( x );
+	}
 }
 
 // ensure with-statement temporary generation works correctly
 S mk() {
-  printf("called mk\n");
-  return (S) { 444 };
+	sout | "called mk";
+	return (S){ 444 };
 }
 
 // ensure with-statement temporary generation with reference-returning functions works correctly
 S & ref() {
-  static S var = { 123456789 };
-  return var;
+	static S var = { 123456789 };
+	return var;
 }
 
 int main() {
-  S2 s2 = { 12345 };
-  with (s2) {
-    with(s) { // with s2.s
-      printf("%d %d %d\n", i, s.i, s2.s.i);
-      foo(i);  // s.i
-      with(mk()) {
-        printf("%d %d %d\n", i, i, i);
-        with(ref()) {
-          printf("%d %d %d\n", i, i, i);
-        } // with ref()
-        with(ref()) {
-          printf("%d %d %d\n", i, i, i);
-        } // with ref()
-      } // with mk()
-    } // with s
-  } // with s2
+	S2 s2 = { 12345 };
+	with ( s2) {
+		with( s ) { // with s2.s
+			sout | i | s.i | s2.s.i;
+			foo( i );  // s.i
+			with( mk()) {
+				sout | i | i | i;
+				with( ref()) {
+					sout | i | i | i;
+				} // with ref()
+				with( ref()) {
+					sout | i | i | i;
+				} // with ref()
+			} // with mk()
+		} // with s
+	} // with s2
 }
 
Index: tools/Makefile.am
===================================================================
--- tools/Makefile.am	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tools/Makefile.am	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -16,7 +16,7 @@
 
 AUTOMAKE_OPTIONS = foreign    # do not require all the GNU file names
+ACLOCAL_AMFLAGS  = -I automake
 
-CC = @BACKEND_CC@
-AM_CFLAGS = -Wall -Wextra -O2 -g -std=c11
+AM_CFLAGS = -Wall -Wextra -O2 -g
 
 noinst_PROGRAMS = busy catchsig repeat watchdog
Index: tools/Makefile.in
===================================================================
--- tools/Makefile.in	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tools/Makefile.in	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -96,6 +96,10 @@
 subdir = tools
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/automake/cfa.m4 \
-	$(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/automake/libtool.m4 \
+	$(top_srcdir)/automake/ltoptions.m4 \
+	$(top_srcdir)/automake/ltsugar.m4 \
+	$(top_srcdir)/automake/ltversion.m4 \
+	$(top_srcdir)/automake/lt~obsolete.m4 \
+	$(top_srcdir)/automake/cfa.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -109,6 +113,11 @@
 busy_OBJECTS = $(am_busy_OBJECTS)
 busy_LDADD = $(LDADD)
-busy_LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(busy_LDFLAGS) $(LDFLAGS) \
-	-o $@
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+busy_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(busy_LDFLAGS) $(LDFLAGS) -o $@
 am_catchsig_OBJECTS = catchsig.$(OBJEXT)
 catchsig_OBJECTS = $(am_catchsig_OBJECTS)
@@ -138,4 +147,8 @@
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
 AM_V_CC = $(am__v_CC_@AM_V@)
 am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
@@ -143,5 +156,7 @@
 am__v_CC_1 = 
 CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
 AM_V_CCLD = $(am__v_CCLD_@AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
@@ -182,11 +197,11 @@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BACKEND_CC = @BACKEND_CC@
 BUILD_IN_TREE_FLAGS = @BUILD_IN_TREE_FLAGS@
-CC = @BACKEND_CC@
+CC = @CC@
 CCAS = @CCAS@
 CCASDEPMODE = @CCASDEPMODE@
@@ -206,4 +221,5 @@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
+CXXCPP = @CXXCPP@
 CXXDEPMODE = @CXXDEPMODE@
 CXXFLAGS = @CXXFLAGS@
@@ -211,5 +227,8 @@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
 DRIVER_DIR = @DRIVER_DIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
@@ -217,4 +236,5 @@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
+FGREP = @FGREP@
 GREP = @GREP@
 HOST_FLAGS = @HOST_FLAGS@
@@ -224,4 +244,5 @@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LEX = @LEX@
@@ -232,8 +253,18 @@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -245,4 +276,5 @@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -256,6 +288,8 @@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -305,5 +339,6 @@
 top_srcdir = @top_srcdir@
 AUTOMAKE_OPTIONS = foreign    # do not require all the GNU file names
-AM_CFLAGS = -Wall -Wextra -O2 -g -std=c11
+ACLOCAL_AMFLAGS = -I automake
+AM_CFLAGS = -Wall -Wextra -O2 -g
 busy_SOURCES = busy.c
 busy_LDFLAGS = -pthread
@@ -314,5 +349,5 @@
 
 .SUFFIXES:
-.SUFFIXES: .c .o .obj
+.SUFFIXES: .c .lo .o .obj
 $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	@for dep in $?; do \
@@ -346,5 +381,11 @@
 
 clean-noinstPROGRAMS:
-	-test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
 
 busy$(EXEEXT): $(busy_OBJECTS) $(busy_DEPENDENCIES) $(EXTRA_busy_DEPENDENCIES) 
@@ -390,4 +431,18 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
 
 ID: $(am__tagged_files)
@@ -509,5 +564,6 @@
 clean: clean-am
 
-clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am
+clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
+	mostlyclean-am
 
 distclean: distclean-am
@@ -564,5 +620,6 @@
 mostlyclean: mostlyclean-am
 
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
 
 pdf: pdf-am
@@ -579,15 +636,16 @@
 
 .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
-	clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \
-	distclean-compile distclean-generic distclean-tags distdir dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-man install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
+	clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \
+	ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
 	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
-	uninstall-am
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am
 
 .PRECIOUS: Makefile
Index: tools/prettyprinter/Makefile.am
===================================================================
--- tools/prettyprinter/Makefile.am	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tools/prettyprinter/Makefile.am	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -16,4 +16,5 @@
 
 AUTOMAKE_OPTIONS = foreign    # do not require all the GNU file names
+ACLOCAL_AMFLAGS  = -I automake
 
 BUILT_SOURCES = parser.hh
Index: tools/prettyprinter/Makefile.in
===================================================================
--- tools/prettyprinter/Makefile.in	(revision 5e49e477912c55f01edbd8c838b63e99a80722bd)
+++ tools/prettyprinter/Makefile.in	(revision d0c91a64cb77b04d81573acd54c57f238ad61349)
@@ -95,6 +95,10 @@
 subdir = tools/prettyprinter
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/automake/cfa.m4 \
-	$(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/automake/libtool.m4 \
+	$(top_srcdir)/automake/ltoptions.m4 \
+	$(top_srcdir)/automake/ltsugar.m4 \
+	$(top_srcdir)/automake/ltversion.m4 \
+	$(top_srcdir)/automake/lt~obsolete.m4 \
+	$(top_srcdir)/automake/cfa.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
@@ -113,6 +117,11 @@
 am__DEPENDENCIES_1 =
 pretty_DEPENDENCIES = $(am__DEPENDENCIES_1)
-pretty_LINK = $(CXXLD) $(pretty_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+pretty_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(pretty_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 AM_V_P = $(am__v_P_@AM_V@)
 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
@@ -131,10 +140,10 @@
 am__depfiles_maybe = depfiles
 am__mv = mv -f
-AM_V_lt = $(am__v_lt_@AM_V@)
-am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
-am__v_lt_0 = --silent
-am__v_lt_1 = 
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
 AM_V_CXX = $(am__v_CXX_@AM_V@)
 am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
@@ -142,6 +151,7 @@
 am__v_CXX_1 = 
 CXXLD = $(CXX)
-CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
-	-o $@
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
 am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
@@ -149,4 +159,6 @@
 am__v_CXXLD_1 = 
 LEXCOMPILE = $(LEX) $(AM_LFLAGS) $(LFLAGS)
+LTLEXCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(LEX) $(AM_LFLAGS) $(LFLAGS)
 AM_V_LEX = $(am__v_LEX_@AM_V@)
 am__v_LEX_ = $(am__v_LEX_@AM_DEFAULT_V@)
@@ -157,4 +169,6 @@
 		   -e s/c++$$/h++/ -e s/c$$/h/
 YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS)
+LTYACCCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(YACC) $(AM_YFLAGS) $(YFLAGS)
 AM_V_YACC = $(am__v_YACC_@AM_V@)
 am__v_YACC_ = $(am__v_YACC_@AM_DEFAULT_V@)
@@ -163,4 +177,8 @@
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
 AM_V_CC = $(am__v_CC_@AM_V@)
 am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
@@ -168,5 +186,7 @@
 am__v_CC_1 = 
 CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
 AM_V_CCLD = $(am__v_CCLD_@AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
@@ -206,9 +226,9 @@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-BACKEND_CC = @BACKEND_CC@
 BUILD_IN_TREE_FLAGS = @BUILD_IN_TREE_FLAGS@
 CC = @CC@
@@ -230,4 +250,5 @@
 CPPFLAGS = @CPPFLAGS@
 CXX = @CXX@
+CXXCPP = @CXXCPP@
 CXXDEPMODE = @CXXDEPMODE@
 CXXFLAGS = @CXXFLAGS@
@@ -235,5 +256,8 @@
 DEFS = @DEFS@
 DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
 DRIVER_DIR = @DRIVER_DIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
@@ -241,4 +265,5 @@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
+FGREP = @FGREP@
 GREP = @GREP@
 HOST_FLAGS = @HOST_FLAGS@
@@ -248,4 +273,5 @@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
 LDFLAGS = @LDFLAGS@
 LEX = @LEX@
@@ -256,8 +282,18 @@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -269,4 +305,5 @@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -280,6 +317,8 @@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -329,4 +368,5 @@
 top_srcdir = @top_srcdir@
 AUTOMAKE_OPTIONS = foreign    # do not require all the GNU file names
+ACLOCAL_AMFLAGS = -I automake
 BUILT_SOURCES = parser.hh
 AM_YFLAGS = -d -t -v
@@ -346,5 +386,5 @@
 
 .SUFFIXES:
-.SUFFIXES: .cc .ll .o .obj .yy
+.SUFFIXES: .cc .ll .lo .o .obj .yy
 $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	@for dep in $?; do \
@@ -386,4 +426,5 @@
 	sed 's/$(EXEEXT)$$//' | \
 	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
 	  ; then echo "$$p"; echo "$$p"; else :; fi; \
 	done | \
@@ -400,6 +441,6 @@
 	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
 	    test -z "$$files" || { \
-	      echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(tools_prettyprinterdir)$$dir'"; \
-	      $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(tools_prettyprinterdir)$$dir" || exit $$?; \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(tools_prettyprinterdir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(tools_prettyprinterdir)$$dir" || exit $$?; \
 	    } \
 	; done
@@ -417,5 +458,11 @@
 
 clean-tools_prettyprinterPROGRAMS:
-	-test -z "$(tools_prettyprinter_PROGRAMS)" || rm -f $(tools_prettyprinter_PROGRAMS)
+	@list='$(tools_prettyprinter_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
 parser.hh: parser.cc
 	@if test ! -f $@; then rm -f parser.cc; else :; fi
@@ -454,4 +501,12 @@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
+.cc.lo:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
 pretty-lex.o: lex.cc
 @am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pretty_CXXFLAGS) $(CXXFLAGS) -MT pretty-lex.o -MD -MP -MF $(DEPDIR)/pretty-lex.Tpo -c -o pretty-lex.o `test -f 'lex.cc' || echo '$(srcdir)/'`lex.cc
@@ -529,4 +584,10 @@
 .yy.cc:
 	$(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h `echo $@ | $(am__yacc_c2h)` y.output $*.output -- $(YACCCOMPILE)
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
 
 ID: $(am__tagged_files)
@@ -658,6 +719,6 @@
 clean: clean-am
 
-clean-am: clean-generic clean-tools_prettyprinterPROGRAMS \
-	mostlyclean-am
+clean-am: clean-generic clean-libtool \
+	clean-tools_prettyprinterPROGRAMS mostlyclean-am
 
 distclean: distclean-am
@@ -714,5 +775,6 @@
 mostlyclean: mostlyclean-am
 
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
 
 pdf: pdf-am
@@ -729,16 +791,18 @@
 
 .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
-	clean-tools_prettyprinterPROGRAMS cscopelist-am ctags ctags-am \
-	distclean distclean-compile distclean-generic distclean-tags \
-	distdir dvi dvi-am html html-am info info-am install \
-	install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-strip install-tools_prettyprinterPROGRAMS installcheck \
+	clean-libtool clean-tools_prettyprinterPROGRAMS cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip \
+	install-tools_prettyprinterPROGRAMS installcheck \
 	installcheck-am installdirs maintainer-clean \
 	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
-	uninstall-am uninstall-tools_prettyprinterPROGRAMS
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am \
+	uninstall-tools_prettyprinterPROGRAMS
 
 .PRECIOUS: Makefile
