Index: doc/user/user.tex
===================================================================
--- doc/user/user.tex	(revision ce12e2b15f088274daa97c991566ae160ca9a8fa)
+++ doc/user/user.tex	(revision 7dc2e57b4088e703e1c32cd55391795911dca0ff)
@@ -11,6 +11,6 @@
 %% Created On       : Wed Apr  6 14:53:29 2016
 %% Last Modified By : Peter A. Buhr
-%% Last Modified On : Tue Jun 25 08:51:33 2019
-%% Update Count     : 3871
+%% Last Modified On : Sat Jul 13 18:36:18 2019
+%% Update Count     : 3876
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
@@ -2697,4 +2697,7 @@
 \subsection{Expressions}
 
+% Change order of expression evaluation.
+% http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r2.pdf
+
 Multiple-return-value functions provide \CFA with a new syntax for expressing a combination of expressions in the return statement and a combination of types in a function signature.
 These notions are generalized to provide \CFA with \newterm{tuple expression}s and \newterm{tuple type}s.
@@ -3506,14 +3509,13 @@
 
 \item
-A separator does not appear before or after a null (empty) C string.
+A separator does not appear before or after a null (empty) C string, which is a local mechanism to disable insertion of the separator character.
 \begin{cfa}
 sout | 1 | "" | 2 | "" | 3;
 123
 \end{cfa}
-which is a local mechanism to disable insertion of the separator character.
 
 \item
 {\lstset{language=CFA,deletedelim=**[is][]{¢}{¢}}
-A seperator does not appear before a C string starting with the (extended) \Index*{ASCII}\index{ASCII!extended} characters: \lstinline[basicstyle=\tt]@,.;!?)]}%¢»@
+A separator does not appear before a C string starting with the (extended) \Index*{ASCII}\index{ASCII!extended} characters: \lstinline[basicstyle=\tt]@,.;!?)]}%¢»@, where \lstinline[basicstyle=\tt]@»@ is a closing citation mark.
 \begin{cfa}[belowskip=0pt]
 sout | 1 | ", x" | 2 | ". x" | 3 | "; x" | 4 | "! x" | 5 | "? x" | 6 | "% x"
@@ -3523,8 +3525,7 @@
 1®,® x 2®.® x 3®;® x 4®!® x 5®?® x 6®%® x 7§\color{red}\textcent§ x 8®»® x 9®)® x 10®]® x 11®}® x
 \end{cfa}}%
-where \lstinline[basicstyle=\tt]@»@ is a closing citation mark.
-
-\item
-A separator does not appear after a C string ending with the (extended) \Index*{ASCII}\index{ASCII!extended} characters: \lstinline[mathescape=off,basicstyle=\tt]@([{=$£¥¡¿«@
+
+\item
+A separator does not appear after a C string ending with the (extended) \Index*{ASCII}\index{ASCII!extended} characters: \lstinline[mathescape=off,basicstyle=\tt]@([{=$£¥¡¿«@, where \lstinline[basicstyle=\tt]@¡¿@ are inverted opening exclamation and question marks, and \lstinline[basicstyle=\tt]@«@ is an opening citation mark.
 %$
 \begin{cfa}[mathescape=off]
@@ -3537,5 +3538,4 @@
 \end{cfa}
 %$
-where \lstinline[basicstyle=\tt]@¡¿@ are inverted opening exclamation and question marks, and \lstinline[basicstyle=\tt]@«@ is an opening citation mark.
 
 \item
@@ -3651,5 +3651,5 @@
 The tuple separator also responses to being turned on and off.
 \begin{cfa}[belowskip=0pt]
-sout | t1 | sepOff | t2; §\C{// locally turn on/off implicit separator}§
+sout | t1 | sepOff | t2; §\C{// turn off implicit separator for the next item}§
 \end{cfa}
 \begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt]
@@ -3675,5 +3675,5 @@
 \subsection{Newline Manipulators}
 
-The following \Index{manipulator} controls \Index{newline separation} for input and output.
+The following \Index{manipulators} control \Index{newline separation} for input and output.
 
 For input:
@@ -3773,5 +3773,6 @@
 
 \item
-\Indexc{nobase}( integer )\index{manipulator!nobase@©nobase©} do not precede ©bin©, ©oct©, ©hex© with ©0b©/©0B©, ©0©, or ©0x©/©0X©. Printing the base is the default.
+\Indexc{nobase}( integer )\index{manipulator!nobase@©nobase©} do not precede ©bin©, ©oct©, ©hex© with ©0b©/©0B©, ©0©, or ©0x©/©0X©.
+Printing the base is the default.
 \begin{cfa}[belowskip=0pt]
 sout | nobase( bin( 27 ) ) | nobase( oct( 27 ) ) | nobase( hex( 27 ) );
Index: libcfa/src/bits/debug.cfa
===================================================================
--- libcfa/src/bits/debug.cfa	(revision ce12e2b15f088274daa97c991566ae160ca9a8fa)
+++ libcfa/src/bits/debug.cfa	(revision 7dc2e57b4088e703e1c32cd55391795911dca0ff)
@@ -9,7 +9,7 @@
 // Author           : Thierry Delisle
 // Created On       : Thu Mar 30 12:30:01 2017
-// Last Modified By :
-// Last Modified On :
-// Update Count     : 1
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sun Jul 14 22:17:35 2019
+// Update Count     : 4
 //
 
@@ -23,5 +23,5 @@
 }
 
-enum { buffer_size = 512 };
+enum { buffer_size = 4096 };
 static char buffer[ buffer_size ];
 
Index: libcfa/src/fstream.cfa
===================================================================
--- libcfa/src/fstream.cfa	(revision ce12e2b15f088274daa97c991566ae160ca9a8fa)
+++ libcfa/src/fstream.cfa	(revision 7dc2e57b4088e703e1c32cd55391795911dca0ff)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 12 12:03:53 2019
-// Update Count     : 344
+// Last Modified On : Sun Jul 14 11:51:10 2019
+// Update Count     : 347
 //
 
@@ -119,5 +119,5 @@
 	#ifdef __CFA_DEBUG__
 	if ( file == 0 ) {
-		abort( IO_MSG "open output file \"%s\", %s", name, strerror( errno ) );
+		abort | IO_MSG "open output file \"" | name | "\"" | nl | strerror( errno );
 	} // if
 	#endif // __CFA_DEBUG__
@@ -133,5 +133,5 @@
 
 	if ( fclose( (FILE *)(os.file) ) == EOF ) {
-		abort( IO_MSG "close output %s", strerror( errno ) );
+		abort | IO_MSG "close output" | nl | strerror( errno );
 	} // if
 } // close
@@ -139,9 +139,9 @@
 ofstream & write( ofstream & os, const char * data, size_t size ) {
 	if ( fail( os ) ) {
-		abort( "attempt write I/O on failed stream\n" );
+		abort | IO_MSG "attempt write I/O on failed stream";
 	} // if
 
 	if ( fwrite( data, 1, size, (FILE *)(os.file) ) != size ) {
-		abort( IO_MSG "write %s", strerror( errno ) );
+		abort | IO_MSG "write" | nl | strerror( errno );
 	} // if
 	return os;
@@ -154,5 +154,5 @@
 	if ( len == EOF ) {
 		if ( ferror( (FILE *)(os.file) ) ) {
-			abort( "invalid write\n" );
+			abort | IO_MSG "invalid write";
 		} // if
 	} // if
@@ -211,5 +211,5 @@
 	#ifdef __CFA_DEBUG__
 	if ( file == 0 ) {
-		abort( IO_MSG "open input file \"%s\", %s\n", name, strerror( errno ) );
+		abort | IO_MSG "open input file \"" | name | "\"" | nl | strerror( errno );
 	} // if
 	#endif // __CFA_DEBUG__
@@ -225,5 +225,5 @@
 
 	if ( fclose( (FILE *)(is.file) ) == EOF ) {
-		abort( IO_MSG "close input %s", strerror( errno ) );
+		abort | IO_MSG "close input" | nl | strerror( errno );
 	} // if
 } // close
@@ -231,9 +231,9 @@
 ifstream & read( ifstream & is, char * data, size_t size ) {
 	if ( fail( is ) ) {
-		abort( "attempt read I/O on failed stream\n" );
+		abort | IO_MSG "attempt read I/O on failed stream";
 	} // if
 
 	if ( fread( data, size, 1, (FILE *)(is.file) ) == 0 ) {
-		abort( IO_MSG "read %s", strerror( errno ) );
+		abort | IO_MSG "read" | nl | strerror( errno );
 	} // if
 	return is;
@@ -242,9 +242,9 @@
 ifstream &ungetc( ifstream & is, char c ) {
 	if ( fail( is ) ) {
-		abort( "attempt ungetc I/O on failed stream\n" );
+		abort | IO_MSG "attempt ungetc I/O on failed stream";
 	} // if
 
 	if ( ungetc( c, (FILE *)(is.file) ) == EOF ) {
-		abort( IO_MSG "ungetc %s", strerror( errno ) );
+		abort | IO_MSG "ungetc" | nl | strerror( errno );
 	} // if
 	return is;
@@ -258,5 +258,5 @@
 	if ( len == EOF ) {
 		if ( ferror( (FILE *)(is.file) ) ) {
-			abort( "invalid read\n" );
+			abort | IO_MSG "invalid read";
 		} // if
 	} // if
Index: libcfa/src/gmp.hfa
===================================================================
--- libcfa/src/gmp.hfa	(revision ce12e2b15f088274daa97c991566ae160ca9a8fa)
+++ libcfa/src/gmp.hfa	(revision 7dc2e57b4088e703e1c32cd55391795911dca0ff)
@@ -10,6 +10,6 @@
 // Created On       : Tue Apr 19 08:43:43 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 12 12:02:55 2019
-// Update Count     : 26
+// Last Modified On : Sat Jul 13 15:25:05 2019
+// Update Count     : 27
 //
 
@@ -43,5 +43,5 @@
 	Int ?=?( Int & lhs, long int rhs ) { mpz_set_si( lhs.mpz, rhs ); return lhs; }
 	Int ?=?( Int & lhs, unsigned long int rhs ) { mpz_set_ui( lhs.mpz, rhs ); return lhs; }
-	Int ?=?( Int & lhs, const char * rhs ) { if ( mpz_set_str( lhs.mpz, rhs, 0 ) ) { printf( "invalid string conversion\n" ); abort(); } return lhs; }
+	Int ?=?( Int & lhs, const char * rhs ) { if ( mpz_set_str( lhs.mpz, rhs, 0 ) ) { abort | "invalid string conversion"; } return lhs; }
 
 	char ?=?( char & lhs, Int rhs ) { char val = mpz_get_si( rhs.mpz ); lhs = val; return lhs; }
Index: libcfa/src/interpose.cfa
===================================================================
--- libcfa/src/interpose.cfa	(revision ce12e2b15f088274daa97c991566ae160ca9a8fa)
+++ libcfa/src/interpose.cfa	(revision 7dc2e57b4088e703e1c32cd55391795911dca0ff)
@@ -10,6 +10,6 @@
 // Created On       : Wed Mar 29 16:10:31 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat May  5 11:37:35 2018
-// Update Count     : 111
+// Last Modified On : Sun Jul 14 22:57:16 2019
+// Update Count     : 116
 //
 
@@ -81,9 +81,9 @@
 //=============================================================================================
 
-void sigHandler_segv ( __CFA_SIGPARMS__ );
-void sigHandler_ill  ( __CFA_SIGPARMS__ );
-void sigHandler_fpe  ( __CFA_SIGPARMS__ );
-void sigHandler_abort( __CFA_SIGPARMS__ );
-void sigHandler_term ( __CFA_SIGPARMS__ );
+void sigHandler_segv( __CFA_SIGPARMS__ );
+void sigHandler_ill ( __CFA_SIGPARMS__ );
+void sigHandler_fpe ( __CFA_SIGPARMS__ );
+void sigHandler_abrt( __CFA_SIGPARMS__ );
+void sigHandler_term( __CFA_SIGPARMS__ );
 
 struct {
@@ -110,5 +110,5 @@
 		__cfaabi_sigaction( SIGILL , sigHandler_ill  , SA_SIGINFO );
 		__cfaabi_sigaction( SIGFPE , sigHandler_fpe  , SA_SIGINFO );
-		__cfaabi_sigaction( SIGABRT, sigHandler_abort, SA_SIGINFO | SA_RESETHAND);
+		__cfaabi_sigaction( SIGABRT, sigHandler_abrt, SA_SIGINFO | SA_RESETHAND);
 		__cfaabi_sigaction( SIGTERM, sigHandler_term , SA_SIGINFO );
 		__cfaabi_sigaction( SIGINT , sigHandler_term , SA_SIGINFO );
@@ -204,9 +204,7 @@
 			if ( *p == '(' ) {
 				name = p;
-			}
-			else if ( *p == '+' ) {
+			} else if ( *p == '+' ) {
 				offset_begin = p;
-			}
-			else if ( *p == ')' ) {
+			} else if ( *p == ')' ) {
 				offset_end = p;
 				break;
@@ -223,7 +221,5 @@
 
 			__cfaabi_dbg_bits_print_nolock( "(%i) %s : %s + %s %s\n", frameNo, messages[i], name, offset_begin, offset_end);
-		}
-		// otherwise, print the whole line
-		else {
+		} else {										// otherwise, print the whole line
 			__cfaabi_dbg_bits_print_nolock( "(%i) %s\n", frameNo, messages[i] );
 		}
@@ -258,5 +254,5 @@
 }
 
-void sigHandler_abort( __CFA_SIGPARMS__ ) {
+void sigHandler_abrt( __CFA_SIGPARMS__ ) {
 	__cfaabi_backtrace();
 
Index: libcfa/src/iostream.cfa
===================================================================
--- libcfa/src/iostream.cfa	(revision ce12e2b15f088274daa97c991566ae160ca9a8fa)
+++ libcfa/src/iostream.cfa	(revision 7dc2e57b4088e703e1c32cd55391795911dca0ff)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 12 12:04:13 2019
-// Update Count     : 819
+// Last Modified On : Sat Jul 13 08:07:59 2019
+// Update Count     : 821
 //
 
@@ -499,5 +499,5 @@
 				if ( ! f.flags.left ) { \
 					buf[i] = '.'; buf[i + 1] = '\0'; \
-					if ( buf[0] == ' ' ) bufbeg = 1; /* decimal point within width */ \
+					if ( buf[0] == ' ' ) bufbeg = 1;	/* decimal point within width */ \
 				} else { \
 					for ( i = 0; i < len && buf[i] != ' '; i += 1 ); /* trailing blank ? */ \
@@ -546,5 +546,5 @@
 forall( dtype ostype | ostream( ostype ) ) {
 	ostype & ?|?( ostype & os, _Ostream_Manip(char) f ) {
-		if ( f.base != 'c' ) {								// bespoke binary/octal/hex format
+		if ( f.base != 'c' ) {							// bespoke binary/octal/hex format
 			_Ostream_Manip(unsigned char) fmtuc @= { f.val, f.wd, f.pc, f.base, {'\0'} };
 			fmtuc.flags.pc = f.flags.pc;
@@ -558,7 +558,7 @@
 
 		#define CFMTNP "% * "
-		char fmtstr[sizeof(CFMTNP)];						// sizeof includes '\0'
+		char fmtstr[sizeof(CFMTNP)];					// sizeof includes '\0'
 		memcpy( &fmtstr, CFMTNP, sizeof(CFMTNP) );
-		int star = 1;										// position before first '*'
+		int star = 1;									// position before first '*'
 
 		// Insert flags into spaces before '*', from right to left.
@@ -566,5 +566,5 @@
 		fmtstr[star] = '%';
 
-		fmtstr[sizeof(CFMTNP)-2] = f.base;					// sizeof includes '\0'
+		fmtstr[sizeof(CFMTNP)-2] = f.base;				// sizeof includes '\0'
 		// printf( "%d %s\n", f.wd, &fmtstr[star] );
 		fmt( os, &fmtstr[star], f.wd, f.val );
@@ -631,5 +631,5 @@
 		else {
 			fprintf( stderr, "invalid Boolean constant\n" );
-			abort();
+			abort();									// cannot use abort stream
 		} // if
 		return is;
@@ -639,5 +639,5 @@
 		char temp;
 		for () {
-			fmt( is, "%c", &temp );							// must pass pointer through varg to fmt
+			fmt( is, "%c", &temp );						// must pass pointer through varg to fmt
 			// do not overwrite parameter with newline unless appropriate
 			if ( temp != '\n' || getANL( is ) ) { c = temp; break; }
@@ -773,5 +773,5 @@
 	if ( ! f.s ) {
 		// printf( "skip %s %d\n", f.scanset, f.wd );
-		if ( f.wd == -1 ) fmt( is, f.scanset, "" ); // no input arguments
+		if ( f.wd == -1 ) fmt( is, f.scanset, "" );		// no input arguments
 		else for ( f.wd ) fmt( is, "%*c" );
 		return is;
Index: libcfa/src/rational.cfa
===================================================================
--- libcfa/src/rational.cfa	(revision ce12e2b15f088274daa97c991566ae160ca9a8fa)
+++ libcfa/src/rational.cfa	(revision 7dc2e57b4088e703e1c32cd55391795911dca0ff)
@@ -10,6 +10,6 @@
 // Created On       : Wed Apr  6 17:54:28 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 12 12:02:36 2019
-// Update Count     : 183
+// Last Modified On : Fri Jul 12 18:12:08 2019
+// Update Count     : 184
 //
 
@@ -35,5 +35,5 @@
 	static RationalImpl simplify( RationalImpl & n, RationalImpl & d ) {
 		if ( d == (RationalImpl){0} ) {
-			abort( "Invalid rational number construction: denominator cannot be equal to 0.\n" );
+			abort | "Invalid rational number construction: denominator cannot be equal to 0.";
 		} // exit
 		if ( d < (RationalImpl){0} ) { d = -d; n = -n; } // move sign to numerator
Index: libcfa/src/time.cfa
===================================================================
--- libcfa/src/time.cfa	(revision ce12e2b15f088274daa97c991566ae160ca9a8fa)
+++ libcfa/src/time.cfa	(revision 7dc2e57b4088e703e1c32cd55391795911dca0ff)
@@ -10,10 +10,10 @@
 // Created On       : Tue Mar 27 13:33:14 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 12 12:03:19 2019
-// Update Count     : 59
+// Last Modified On : Sat Jul 13 08:41:55 2019
+// Update Count     : 65
 //
 
 #include "time.hfa"
-#include "iostream.hfa"
+#include "fstream.hfa"
 #include <stdio.h>										// snprintf
 #include <assert.h>
@@ -52,6 +52,8 @@
 
 #ifdef __CFA_DEBUG__
-#define CreateFmt "Attempt to create Time( year=%d (>=1970), month=%d (1-12), day=%d (1-31), hour=%d (0-23), min=%d (0-59), sec=%d (0-60), nsec=%d (0-999_999_999), " \
-	"which exceeds range 00:00:00 UTC, January 1, 1970 to 03:14:07 UTC, January 19, 2038."
+static void tabort( int year, int month, int day, int hour, int min, int sec, int nsec ) {
+	abort | "Attempt to create Time( year=" | year | "(>=1970), month=" | month | "(1-12), day=" | day | "(1-31), hour=" | hour | "(0-23), min=" | min | "(0-59), sec=" | sec
+		  | "(0-60), nsec=" | nsec | "(0-999_999_999), which exceeds range 00:00:00 UTC, January 1, 1970 to 03:14:07 UTC, January 19, 2038.";
+} // tabort
 #endif // __CFA_DEBUG__
 
@@ -63,5 +65,5 @@
 #ifdef __CFA_DEBUG__
 	if ( month < 1 || 12 < month ) {
-		abort( CreateFmt, year, month, day, hour, (int)min, sec, nsec );
+		tabort( year, month, day, hour, min, sec, nsec );
 	} // if
 #endif // __CFA_DEBUG__
@@ -69,5 +71,5 @@
 #ifdef __CFA_DEBUG__
 	if ( day < 1 || 31 < day ) {
-		abort( CreateFmt, year, month, day, hour, (int)min, sec, nsec );
+		tabort( year, month, day, hour, min, sec, nsec );
 	} // if
 #endif // __CFA_DEBUG__
@@ -79,5 +81,5 @@
 #ifdef __CFA_DEBUG__
 	if ( epochsec == (time_t)-1 ) {
-		abort( CreateFmt, year, month, day, hour, (int)min, sec, nsec );
+		tabort( year, month, day, hour, min, sec, nsec );
 	} // if
 #endif // __CFA_DEBUG__
@@ -85,5 +87,5 @@
 #ifdef __CFA_DEBUG__
 	if ( tv > 2147483647LL * TIMEGRAN ) {				// between 00:00:00 UTC, January 1, 1970 and 03:14:07 UTC, January 19, 2038.
-		abort( CreateFmt, year, month, day, hour, (int)min, sec, nsec );
+		tabort( year, month, day, hour, min, sec, nsec );
 	} // if
 #endif // __CFA_DEBUG__
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision ce12e2b15f088274daa97c991566ae160ca9a8fa)
+++ src/Parser/parser.yy	(revision 7dc2e57b4088e703e1c32cd55391795911dca0ff)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue May 28 17:06:37 2019
-// Update Count     : 4354
+// Last Modified On : Sun Jul 14 07:54:30 2019
+// Update Count     : 4355
 //
 
@@ -678,5 +678,7 @@
 
 argument_expression_list:
-	argument_expression
+	// empty
+		{ $$ = nullptr; }
+	| argument_expression
 	| argument_expression_list ',' argument_expression
 		{ $$ = (ExpressionNode *)( $1->set_last( $3 )); }
@@ -684,7 +686,5 @@
 
 argument_expression:
-	// empty
-		{ $$ = nullptr; }
-	| '@'												// CFA, default parameter
+	'@'													// CFA, default parameter
 		{ SemanticError( yylloc, "Default parameter for argument is currently unimplemented." ); $$ = nullptr; }
 	 	// { $$ = new ExpressionNode( build_constantInteger( *new string( "2" ) ) ); }
Index: tests/math1.cfa
===================================================================
--- tests/math1.cfa	(revision ce12e2b15f088274daa97c991566ae160ca9a8fa)
+++ tests/math1.cfa	(revision 7dc2e57b4088e703e1c32cd55391795911dca0ff)
@@ -10,6 +10,6 @@
 // Created On       : Fri Apr 22 14:59:21 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 12 12:04:56 2019
-// Update Count     : 111
+// Last Modified On : Sun Jul 14 10:16:45 2019
+// Update Count     : 112
 //
 
@@ -33,5 +33,5 @@
 	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 | "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( "" );
