Index: libcfa/src/collections/string.cfa
===================================================================
--- libcfa/src/collections/string.cfa	(revision 2ad5e1d5996fdfe78dd1fb1f12986716f0ad92c0)
+++ libcfa/src/collections/string.cfa	(revision 7b84d3e33b25c329b604d8f94b46e5d209acf210)
@@ -10,6 +10,6 @@
 // Created On       : Fri Sep 03 11:00:00 2021
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Sep  2 12:05:57 2023
-// Update Count     : 206
+// Last Modified On : Wed Oct 18 21:52:09 2023
+// Update Count     : 208
 //
 
@@ -138,5 +138,5 @@
 
 void ?|?( ifstream & in, _Istream_Sstr f ) {
-    (ifstream &)(in | f); ends( in );
+    (ifstream &)(in | f);
 }
 
Index: libcfa/src/collections/string_res.cfa
===================================================================
--- libcfa/src/collections/string_res.cfa	(revision 2ad5e1d5996fdfe78dd1fb1f12986716f0ad92c0)
+++ libcfa/src/collections/string_res.cfa	(revision 7b84d3e33b25c329b604d8f94b46e5d209acf210)
@@ -10,6 +10,6 @@
 // Created On       : Fri Sep 03 11:00:00 2021
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Aug 14 18:06:01 2023
-// Update Count     : 12
+// Last Modified On : Wed Oct 18 21:54:54 2023
+// Update Count     : 15
 //
 
@@ -253,5 +253,5 @@
 
 void ?|?( ifstream & in, string_res & this ) {
-    (ifstream &)(in | this); ends( in );
+    (ifstream &)(in | this);
 }
 
@@ -297,5 +297,5 @@
 
 void ?|?( ifstream & in, _Istream_Rstr f ) {
-    (ifstream &)(in | f); ends( in );
+    (ifstream &)(in | f);
 }
 
Index: libcfa/src/fstream.cfa
===================================================================
--- libcfa/src/fstream.cfa	(revision 2ad5e1d5996fdfe78dd1fb1f12986716f0ad92c0)
+++ libcfa/src/fstream.cfa	(revision 7b84d3e33b25c329b604d8f94b46e5d209acf210)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Aug 18 10:41:17 2023
-// Update Count     : 541
+// Last Modified On : Wed Oct 18 22:05:54 2023
+// Update Count     : 549
 //
 
@@ -230,6 +230,4 @@
 void nlOff( ifstream & os ) { os.nlOnOff$ = false; }
 
-void ends( ifstream & is ) {}
-
 bool eof( ifstream & is ) { return feof( (FILE *)(is.file$) ) != 0; }
 
@@ -311,4 +309,5 @@
 	} // if
 	va_end( args );
+//	if ( len == 0 ) throw ExceptionInst( missing_data );
 	return len;
 } // fmt
Index: libcfa/src/fstream.hfa
===================================================================
--- libcfa/src/fstream.hfa	(revision 2ad5e1d5996fdfe78dd1fb1f12986716f0ad92c0)
+++ libcfa/src/fstream.hfa	(revision 7b84d3e33b25c329b604d8f94b46e5d209acf210)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Aug 18 10:41:15 2023
-// Update Count     : 258
+// Last Modified On : Wed Oct 18 20:30:12 2023
+// Update Count     : 261
 //
 
@@ -117,16 +117,14 @@
 void nlOn( ifstream & );
 void nlOff( ifstream & );
-void ends( ifstream & );
 int fmt( ifstream &, const char format[], ... ) __attribute__(( format(scanf, 2, 3) ));
+ifstream & ungetc( ifstream & is, char c );
+bool eof( ifstream & is );
 
 bool fail( ifstream & is );
 void clear( ifstream & );
-bool eof( ifstream & is );
 void open( ifstream & is, const char name[], const char mode[] ); // FIX ME: use default = "r"
 void open( ifstream & is, const char name[] );
 void close( ifstream & is );
-
 ifstream & read( ifstream & is, char data[], size_t size );
-ifstream & ungetc( ifstream & is, char c );
 
 void ?{}( ifstream & is );
Index: libcfa/src/iostream.cfa
===================================================================
--- libcfa/src/iostream.cfa	(revision 2ad5e1d5996fdfe78dd1fb1f12986716f0ad92c0)
+++ libcfa/src/iostream.cfa	(revision 7b84d3e33b25c329b604d8f94b46e5d209acf210)
@@ -1,3 +1,2 @@
-
 //
 // Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
@@ -11,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Oct  8 12:10:21 2023
-// Update Count     : 1564
+// Last Modified On : Thu Oct 19 21:10:10 2023
+// Update Count     : 1801
 //
 
@@ -785,5 +784,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( bool & )
 
 	istype & ?|?( istype & is, char & c ) {
@@ -797,5 +795,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( char & )
 
 	istype & ?|?( istype & is, signed char & sc ) {
@@ -803,5 +800,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( signed char & )
 
 	istype & ?|?( istype & is, unsigned char & usc ) {
@@ -809,5 +805,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( unsigned char & )
 
 	istype & ?|?( istype & is, short int & si ) {
@@ -815,5 +810,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( short int & )
 
 	istype & ?|?( istype & is, unsigned short int & usi ) {
@@ -821,5 +815,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( unsigned short int & )
 
 	istype & ?|?( istype & is, int & i ) {
@@ -827,5 +820,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( int & )
 
 	istype & ?|?( istype & is, unsigned int & ui ) {
@@ -833,5 +825,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( unsigned int & )
 
 	istype & ?|?( istype & is, long int & li ) {
@@ -839,5 +830,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( long int & )
 
 	istype & ?|?( istype & is, unsigned long int & ulli ) {
@@ -845,5 +835,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( unsigned long int & )
 
 	istype & ?|?( istype & is, long long int & lli ) {
@@ -851,5 +840,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( long long int & )
 
 	istype & ?|?( istype & is, unsigned long long int & ulli ) {
@@ -857,5 +845,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( unsigned long long int & )
 
 	#if defined( __SIZEOF_INT128__ )
@@ -863,5 +850,4 @@
 		return (istype &)(is | (unsigned int128 &)llli);
 	} // ?|?
-	ISTYPE_VOID_IMPL( int128 & )
 
 	istype & ?|?( istype & is, unsigned int128 & ullli ) {
@@ -880,5 +866,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( unsigned int128 & )
 	#endif // __SIZEOF_INT128__
 
@@ -887,5 +872,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( float & )
 
 	istype & ?|?( istype & is, double & d ) {
@@ -893,5 +877,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( double & )
 
 	istype & ?|?( istype & is, long double & ld ) {
@@ -899,5 +882,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( long double & )
 
 	istype & ?|?( istype & is, float _Complex & fc ) {
@@ -907,5 +889,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( float _Complex & )
 
 	istype & ?|?( istype & is, double _Complex & dc ) {
@@ -915,5 +896,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( double _Complex & )
 
 	istype & ?|?( istype & is, long double _Complex & ldc ) {
@@ -923,5 +903,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( long double _Complex & )
 
 	istype & ?|?( istype & is, const char fmt[] ) {
@@ -929,5 +908,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( const char * )
 
 	// manipulators
@@ -937,5 +915,5 @@
 
 	void ?|?( istype & is, istype & (* manip)( istype & ) ) {
-		manip( is ); ends( is );
+		manip( is );
 	} // ?|?
 
@@ -966,94 +944,108 @@
 			char fmtstr[ sizeof("%*[]") + nscanset ];
 			int pos = 0;
-			fmtstr[pos] = '%';                  pos += 1;
-			fmtstr[pos] = '*';                  pos += 1;
-			fmtstr[pos] = '[';                  pos += 1;
+			strcpy( &fmtstr[pos], "%*[" );  pos += 3;
 			strcpy( &fmtstr[pos], f.scanset );  pos += nscanset;
-			fmtstr[pos] = ']';                  pos += 1;
-			fmtstr[pos] = '\0';
-			fmt( is, fmtstr, (void*)0 );  // last arg is dummy: suppress gcc warning
-		}
-		else for ( f.wd ) fmt( is, "%*c" );
+			strcpy( &fmtstr[pos], "]" );
+			fmt( is, fmtstr, "" );						// skip scanset
+		} else {
+			char ch;
+//			fprintf( stderr, "skip " );
+			for ( f.wd ) {								// skip N characters
+			  if ( eof( is ) ) break;
+				fmt( is, "%c", &ch );
+//				fprintf( stderr, "`%c' ", ch );
+			} // for
+		} // if
 		return is;
 	}
-	ISTYPE_VOID_IMPL( _Istream_Cskip )
 
 	istype & ?|?( istype & is, _Istream_Cstr f ) {
-		const char * scanset = f.scanset;
+		const char * scanset;
+		size_t nscanset = 0;
 		if ( f.flags.delimiter ) scanset = f.delimiter;	// getline ?
-
-		size_t len = 0;
-		if ( scanset ) len = strlen( scanset );
-		char fmtstr[len + 16];
-		int start = 1;
+		else scanset = f.scanset;
+		if ( scanset ) nscanset = strlen( scanset );
+
+		char fmtstr[nscanset + 32];						// storage for scanset and format codes
 		fmtstr[0] = '%';
-		if ( f.flags.ignore ) { fmtstr[1] = '*'; start += 1; }
-		// no maximum width necessary because text ignored => width is read width
-		if ( f.wd != -1 ) {
+
+		int pos = 1;
+		int args;
+		bool check = true;
+
+		if ( f.flags.ignore ) { check = false; fmtstr[1] = '*'; pos += 1; }
+		int rwd = f.wd;
+		if ( f.wd != -1 ) {								// => just ignore versus ignore with width
 			// wd is buffer bytes available (for input chars + null terminator)
 			// rwd is count of input chars
-			int rwd;
-			if (f.flags.rwd) {
-				verify (f.wd >= 0);
-				rwd = f.wd;
+			// no maximum width necessary because text ignored => width is read width
+			if ( f.flags.rwd ) check = false;
+			else rwd = f.wd - 1;
+			pos += sprintf( &fmtstr[pos], "%d", rwd );
+		} // if
+
+		if ( ! scanset ) {								// %s, %*s, %ws, %*ws
+//			fprintf( stderr, "cstr %s\n", f.s );
+			strcpy( &fmtstr[pos], "s%n" );
+			int len = 0;								// may not be set in fmt
+			if ( f.flags.ignore ) args = fmt( is, fmtstr, &len ); // no string argument for '*'
+			else args = fmt( is, fmtstr, f.s, &len );
+//			fprintf( stderr, "cstr %s %d %d %d %s\n", fmtstr, args, len, f.wd, f.s );
+			if ( check && len >= rwd && ! eof( is ) ) {	// might not fit
+				char peek;
+				fmt( is, "%c", &peek );					// check for whitespace terminator
+//				fprintf( stderr, "peek %d '%c'\n", args, peek );
+				if ( ! eof( is ) ) {
+					ungetc( is, peek );
+					if ( ! isspace( peek ) ) throw ExceptionInst( cstring_length );
+				} // if
+			} // if
+		} else {
+			if ( f.flags.delimiter ) {					// getline
+//				fprintf( stderr, "getline\n" );
+				sprintf( &fmtstr[pos], "[%s%s]%%n", f.flags.inex ? "^" : "", scanset );
+//				fprintf( stderr, "getline %s %d\n", fmtstr, f.wd );
+				int len = 0;							// may not be set in fmt
+				if ( f.flags.ignore ) args = fmt( is, fmtstr, &len ); // no string argument for '*'
+				else args = fmt( is, fmtstr, f.s, &len );
+//				fprintf( stderr, "getline %s %d %d %d\n", fmtstr, args, f.wd, eof( is ) );
+				if ( check && len == rwd && ! eof( is ) ) {	// might not fit
+					char peek;
+					fmt( is, "%c", &peek );				// check for delimiter
+//					fprintf( stderr, "peek %d '%c'\n", args, peek );
+					if ( ! eof( is ) ) {
+						if ( peek != f.delimiter[0] ) {
+							ungetc( is, peek );
+							throw ExceptionInst( cstring_length );
+						} // if
+					} // if
+				} else fmt( is, "%*c" );				//  remove delimiter
 			} else {
-				verify (f.wd >= 1);
-				rwd = f.wd - 1;
+				// incl %[xxx],  %*[xxx],  %w[xxx],  %*w[xxx]
+				// excl %[^xxx], %*[^xxx], %w[^xxx], %*w[^xxx]
+				sprintf( &fmtstr[pos], "[%s%s]%%n", f.flags.inex ? "^" : "", scanset );
+//				fprintf( stderr, "incl/excl %s %d\n", fmtstr, f.wd );
+				int len = 0;							// may not be set in fmt
+				if ( f.flags.ignore ) args = fmt( is, fmtstr, &len ); // no string argument for '*'
+				else args = fmt( is, fmtstr, f.s, &len );
+//				fprintf( stderr, "incl/excl %s \"%s\" %d %d %d %d %d %c\n", fmtstr, f.s, args, f.wd, len, eof( is ), check, f.s[f.wd] );
+				if ( check && len == rwd && ! eof( is ) ) {	// might not fit
+//					fprintf( stderr, "overflow\n" );
+					char peek;
+					fmt( is, "%c", &peek );				// check for whitespace terminator
+//					fprintf( stderr, "peek %d '%c'\n", args, peek );
+					if ( ! eof( is ) ) {
+						ungetc( is, peek );
+						if ( f.flags.inex ^ strchr( f.scanset, peek ) != 0p ) throw ExceptionInst( cstring_length );
+					} // if
+				} // if
 			} // if
-			start += sprintf( &fmtstr[start], "%d", rwd );
-		}
-
-		if ( ! scanset ) {
-			// %s, %*s, %ws, %*ws
-			fmtstr[start] = 's'; fmtstr[start + 1] = '\0';
-			// printf( "cstr %s\n", fmtstr );
-		} else {
-			// incl %[xxx],  %*[xxx],  %w[xxx],  %*w[xxx]
-			// excl %[^xxx], %*[^xxx], %w[^xxx], %*w[^xxx]
-			fmtstr[start] = '['; start += 1;
-			if ( f.flags.inex ) { fmtstr[start] = '^'; start += 1; }
-			strcpy( &fmtstr[start], scanset );			// copy includes '\0'
-			len += start;
-			fmtstr[len] = ']'; fmtstr[len + 1] = '\0';
-			// printf( "incl/excl %s\n", fmtstr );
-		} // if
-
-		int check = f.wd - 2;
-		if (! f.flags.ignore ) {
-			if ( ! f.flags.rwd ) f.s[check] = '\0';		// insert sentinel
-		}
-		len = fmt( is, fmtstr, f.s );
-		//fprintf( stderr, "KK %s %zd %d %c %s\n", fmtstr, len, check, f.s[check], f.s );
-
-		if ( ! f.flags.ignore && ! f.flags.rwd && f.s[check] != '\0' ) { // sentinel overwritten ?
-			// buffer filled, but would we have kept going?
-			if ( ! eof( is ) ) {
-				char peek;
-				fmt( is, "%c", &peek );
-				ungetc( is, peek );
-				bool hasMore;
-				if (f.flags.delimiter) { // getline
-					hasMore = (peek != f.delimiter[0]);
-				} else if (f.scanset) { // incl/excl
-					bool peekMatch = strchr(f.scanset, peek) != 0p;
-					hasMore = f.flags.inex ? (!peekMatch) : (peekMatch);
-				} else { // %s
-					hasMore = !isspace(peek);
-				}
-				if (hasMore) throw (cstring_length){ &cstring_length_vt };
-			} // if
-		} // if
-
-		if ( f.flags.delimiter ) {						// getline ?
-			if ( len == 0 ) f.s[0] = '\0';				// empty read => argument unchanged => set empty
-			if ( ! eof( is ) ) {						// ignore delimiter, may not be present because of width
-				char delimiter;
-				fmt( is, "%c", &delimiter );
-				if ( delimiter != f.delimiter[0] ) ungetc( is, delimiter );
-			} // if
-		} //if
-		return is;
-	} // ?|?
-	ISTYPE_VOID_IMPL( _Istream_Cstr )
+		} // if
+		if ( args == 1 && eof( is ) ) {					// data but scan ended at EOF
+//			fprintf( stderr, "clear\n" );
+			clear( is );								// => reset EOF => detect again on next read
+		} // if
+		return is;
+	} // ?|?
 
 	istype & ?|?( istype & is, _Istream_Char f ) {
@@ -1061,5 +1053,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( _Istream_Char )
 } // distribution
 
@@ -1078,5 +1069,4 @@
 		return is; \
 	} /* ?|? */ \
-	ISTYPE_VOID_IMPL( _Istream_Manip(T) ) \
 } // distribution
 
@@ -1106,5 +1096,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( _Istream_Manip(float _Complex) )
 
 	istype & ?|?( istype & is, _Istream_Manip(double _Complex) dc ) {
@@ -1117,5 +1106,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( _Istream_Manip(double _Complex) )
 
 	istype & ?|?( istype & is, _Istream_Manip(long double _Complex) ldc ) {
@@ -1128,5 +1116,4 @@
 		return is;
 	} // ?|?
-	ISTYPE_VOID_IMPL( _Istream_Manip(long double _Complex) )
 } // distribution
 
Index: libcfa/src/iostream.hfa
===================================================================
--- libcfa/src/iostream.hfa	(revision 2ad5e1d5996fdfe78dd1fb1f12986716f0ad92c0)
+++ libcfa/src/iostream.hfa	(revision 7b84d3e33b25c329b604d8f94b46e5d209acf210)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Oct  8 12:02:55 2023
-// Update Count     : 568
+// Last Modified On : Wed Oct 18 21:21:20 2023
+// Update Count     : 583
 //
 
@@ -306,10 +306,4 @@
 // *********************************** istream ***********************************
 
-#define ISTYPE_VOID( T ) void ?|?( istype &, T )
-#define ISTYPE_VOID_IMPL( T ) \
-	void ?|?( istype & is, T t ) { \
-		(istype &)(is | t); ends( is ); \
-	} // ?|?
-
 forall( istype & )
 trait basic_istream {
@@ -320,8 +314,8 @@
 	void nlOn( istype & );								// read newline
 	void nlOff( istype & );								// scan newline
-	void ends( istype & os );							// end of output statement
 	int fmt( istype &, const char format[], ... ) __attribute__(( format(scanf, 2, 3) ));
 	istype & ungetc( istype &, char );
 	bool eof( istype & );
+	void clear( istype & );
 }; // basic_istream
 
@@ -329,5 +323,5 @@
 trait istream {
 	bool fail( istype & );
-	void clear( istype & );
+	void open( istype & is, const char name[], const char mode[] );
 	void open( istype & is, const char name[] );
 	void close( istype & is );
@@ -342,56 +336,34 @@
 forall( istype & | basic_istream( istype ) ) {
 	istype & ?|?( istype &, bool & );
-	ISTYPE_VOID( bool & );
 
 	istype & ?|?( istype &, char & );
-	ISTYPE_VOID( char & );
 	istype & ?|?( istype &, signed char & );
-	ISTYPE_VOID( signed char & );
 	istype & ?|?( istype &, unsigned char & );
-	ISTYPE_VOID( unsigned char & );
 
 	istype & ?|?( istype &, short int & );
-	ISTYPE_VOID( short int & );
 	istype & ?|?( istype &, unsigned short int & );
-	ISTYPE_VOID( unsigned short int & );
 	istype & ?|?( istype &, int & );
-	ISTYPE_VOID( int & );
 	istype & ?|?( istype &, unsigned int & );
-	ISTYPE_VOID( unsigned int & );
 	istype & ?|?( istype &, long int & );
-	ISTYPE_VOID( long int & );
 	istype & ?|?( istype &, unsigned long int & );
-	ISTYPE_VOID( unsigned long int & );
 	istype & ?|?( istype &, long long int & );
-	ISTYPE_VOID( long long int & );
 	istype & ?|?( istype &, unsigned long long int & );
-	ISTYPE_VOID( unsigned long long int & );
 	#if defined( __SIZEOF_INT128__ )
 	istype & ?|?( istype &, int128 & );
-	ISTYPE_VOID( int128 & );
 	istype & ?|?( istype &, unsigned int128 & );
-	ISTYPE_VOID( unsigned int128 & );
 	#endif // __SIZEOF_INT128__
 
 	istype & ?|?( istype &, float & );
-	ISTYPE_VOID( float & );
 	istype & ?|?( istype &, double & );
-	ISTYPE_VOID( double & );
 	istype & ?|?( istype &, long double & );
-	ISTYPE_VOID( long double & );
 
 	istype & ?|?( istype &, float _Complex & );
-	ISTYPE_VOID( float _Complex & );
 	istype & ?|?( istype &, double _Complex & );
-	ISTYPE_VOID( double _Complex & );
 	istype & ?|?( istype &, long double _Complex & );
-	ISTYPE_VOID( long double _Complex & );
 
 	istype & ?|?( istype &, const char [] );
-	ISTYPE_VOID( const char [] );
 
 	// manipulators
 	istype & ?|?( istype &, istype & (*)( istype & ) );
-	ISTYPE_VOID( istype & (*)( istype & ) );
 	istype & nl( istype & is );
 	istype & nlOn( istype & );
@@ -402,7 +374,9 @@
 
 ExceptionDecl( cstring_length );
+ExceptionDecl( missing_data );
 
 // *********************************** manipulators ***********************************
 
+// skip does not compose with other C string manipulators.
 struct _Istream_Cskip {
 	const char * scanset;
@@ -416,5 +390,4 @@
 forall( istype & | basic_istream( istype ) ) {
 	istype & ?|?( istype & is, _Istream_Cskip f );
-	ISTYPE_VOID( _Istream_Cskip );
 }
 
@@ -458,5 +431,4 @@
 forall( istype & | basic_istream( istype ) ) {
 	istype & ?|?( istype & is, _Istream_Cstr f );
-	ISTYPE_VOID( _Istream_Cstr );
 }
 
@@ -471,5 +443,4 @@
 forall( istype & | basic_istream( istype ) ) {
 	istype & ?|?( istype & is, _Istream_Char f );
-	ISTYPE_VOID( _Istream_Char );
 }
 
@@ -490,5 +461,4 @@
 forall( istype & | basic_istream( istype ) ) { \
 	istype & ?|?( istype & is, _Istream_Manip(T) f ); \
-	ISTYPE_VOID( _Istream_Manip(T) ); \
 } // ?|?
 
Index: tests/concurrency/waituntil/channel_close.cfa
===================================================================
--- tests/concurrency/waituntil/channel_close.cfa	(revision 2ad5e1d5996fdfe78dd1fb1f12986716f0ad92c0)
+++ tests/concurrency/waituntil/channel_close.cfa	(revision 7b84d3e33b25c329b604d8f94b46e5d209acf210)
@@ -26,10 +26,10 @@
         for( ;; ) {
             if ( useAnd ) {
-                waituntil( (in << A) ) { assert( A_removes == in ); A_removes++; removes++; }
-                and waituntil( (in2 << B) ) { assert( B_removes == in2 ); B_removes++; removes++; }
+                waituntil( (in << A) ) { __atomic_thread_fence( __ATOMIC_SEQ_CST ); assert( A_removes == in ); A_removes++; removes++; }
+                and waituntil( (in2 << B) ) { __atomic_thread_fence( __ATOMIC_SEQ_CST ); assert( B_removes == in2 ); B_removes++; removes++; }
                 continue;
             }
-            waituntil( (in << A) ) { assert( A_removes == in ); A_removes++; removes++; }
-            or waituntil( (in << B) ) { assert( B_removes == in ); B_removes++; removes++; }
+            waituntil( (in << A) ) { __atomic_thread_fence( __ATOMIC_SEQ_CST ); assert( A_removes == in ); A_removes++; removes++; }
+            or waituntil( (in << B) ) { __atomic_thread_fence( __ATOMIC_SEQ_CST ); ( B_removes == in ); B_removes++; removes++; }
         }
     } catchResume ( channel_closed * e ) {} // continue to remove until would block
@@ -37,10 +37,10 @@
     try {
         for( ;; )
-            waituntil( (in << A) ) { assert( A_removes == in ); A_removes++; removes++; }
+            waituntil( (in << A) ) { __atomic_thread_fence( __ATOMIC_SEQ_CST ); assert( A_removes == in ); A_removes++; removes++; }
     } catchResume ( channel_closed * e ) {} // continue to remove until would block
     catch ( channel_closed * e ) {} 
     try {
         for( ;; )
-            waituntil( (in << B) ) { assert( B_removes == in ); B_removes++; removes++; }
+            waituntil( (in << B) ) { __atomic_thread_fence( __ATOMIC_SEQ_CST ); assert( B_removes == in ); B_removes++; removes++; }
     } catchResume ( channel_closed * e ) {} // continue to remove until would block
     catch ( channel_closed * e ) {} 
Index: tests/genericUnion.cfa
===================================================================
--- tests/genericUnion.cfa	(revision 2ad5e1d5996fdfe78dd1fb1f12986716f0ad92c0)
+++ tests/genericUnion.cfa	(revision 7b84d3e33b25c329b604d8f94b46e5d209acf210)
@@ -10,11 +10,12 @@
 // 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
+// Last Modified On : Fri Oct 20 09:13:26 2023
+// Update Count     : 15
 // 
 
+#include <fstream.hfa>
 #include <limits.hfa>
 
-forall(T)
+forall( T )
 union ByteView {
 	T val;
@@ -23,24 +24,25 @@
 
 forall(T)
-void print(ByteView(T) x) {
-	for (int i = 0; i < sizeof(int); i++) {				// want to change to sizeof(T)
-		printf("%02x", x.bytes[i] & 0xff);
+void print( ByteView(T) x ) {
+	for ( i; sizeof(int) ) {							// want to change to sizeof(T)
+		sout | nobase( pad0( wd( 2, hex( x.bytes[i] & 0xff ) ) ) ) | nosep;
 	}
 }
 
 forall(T)
-void f(ByteView(T) x, T val) {
-	print(x);
-	printf(" ");
+void f( ByteView(T) x, T val ) {
+	print( x );
+	sout | " ";
 	x.val = val;
-	print(x);
-	printf("\n");
+	print( x );
+	sout | nl;
 }
 
 int main() {
+	sout | nlOff;
 	ByteView(unsigned) u = { 0 };
 	ByteView(int) i = { 0 };
-	f(u, MAX);
-	f(i, -1);
+	f( u, MAX );
+	f( i, -1 );
 }
 
