Index: src/tests/.expect/forctrl.txt
===================================================================
--- src/tests/.expect/forctrl.txt	(revision 8f346611c50954b97c8215e458a76af7fba93860)
+++ src/tests/.expect/forctrl.txt	(revision 8f346611c50954b97c8215e458a76af7fba93860)
@@ -0,0 +1,14 @@
+empty
+empty
+empty
+X X X X X X X X X X
+Y Y Y Y Y
+Z Z Z Z Z
+0 1 2 3 4 5 6 7 8 9
+0 1 2 3 4 5 6 7 8 9
+0.5 1.5 2.5 3.5 4.5
+2 4 6 8 10
+3 6 9
+(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)
+(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)
+(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)
Index: src/tests/alloc.c
===================================================================
--- src/tests/alloc.c	(revision 3b2b37f2005f0335e652c16b01b2ebacd4c47a7e)
+++ src/tests/alloc.c	(revision 8f346611c50954b97c8215e458a76af7fba93860)
@@ -10,6 +10,6 @@
 // Created On       : Wed Feb  3 07:56:22 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 26 20:58:05 2018
-// Update Count     : 334
+// Last Modified On : Thu Aug  9 06:21:35 2018
+// Update Count     : 337
 //
 
@@ -62,5 +62,5 @@
 	p = (int *)calloc( dim, sizeof( *p ) );				// C array calloc, type unsafe
 	printf( "C   array calloc, fill 0\n" );
-	for ( int i = 0; i < dim; i += 1 ) { printf( "%#x ", p[i] ); }
+	for ( i; dim ) { printf( "%#x ", p[i] ); }
 	printf( "\n" );
 	free( p );
@@ -68,12 +68,12 @@
 	p = calloc( dim );                                  // CFA array calloc, type safe
 	printf( "CFA array calloc, fill 0\n" );
-	for ( int i = 0; i < dim; i += 1 ) { printf( "%#x ", p[i] ); }
+	for ( i; dim ) { printf( "%#x ", p[i] ); }
 	printf( "\n" );
 	free( p );
 
 	p = alloc( dim );                                   // CFA array alloc, type safe
-	for ( int i = 0; i < dim; i += 1 ) { p[i] = 0xdeadbeef; }
+	for ( i; dim ) { p[i] = 0xdeadbeef; }
 	printf( "CFA array alloc, no fill\n" );
-	for ( int i = 0; i < dim; i += 1 ) { printf( "%#x ", p[i] ); }
+	for ( i; dim ) { printf( "%#x ", p[i] ); }
 	printf( "\n" );
 	free( p );
@@ -81,5 +81,5 @@
 	p = alloc( 2 * dim, fill );                         // CFA array alloc, fill
 	printf( "CFA array alloc, fill %#hhx\n", fill );
-	for ( int i = 0; i < 2 * dim; i += 1 ) { printf( "%#x ", p[i] ); }
+	for ( i; 2 * dim ) { printf( "%#x ", p[i] ); }
 	printf( "\n" );
 	// do not free
@@ -90,13 +90,13 @@
 
 	p = (int *)realloc( p, dim * sizeof(*p) );			// C realloc
-	for ( int i = 0; i < dim; i += 1 ) { p[i] = 0xdeadbeef; }
+	for ( i; dim ) { p[i] = 0xdeadbeef; }
 	printf( "C   realloc\n" );
-	for ( int i = 0; i < dim; i += 1 ) { printf( "%#x ", p[i] ); }
+	for ( i; dim ) { printf( "%#x ", p[i] ); }
 	printf( "\n" );
 
 	p = realloc( p, 2 * dim * sizeof(*p) );             // CFA realloc
-	for ( int i = dim; i < 2 * dim; i += 1 ) { p[i] = 0x1010101; }
+	for ( i; dim ~ 2 * dim ) { p[i] = 0x1010101; }
 	printf( "CFA realloc\n" );
-	for ( int i = 0; i < 2 * dim; i += 1 ) { printf( "%#x ", p[i] ); }
+	for ( i; 2 * dim ) { printf( "%#x ", p[i] ); }
 	printf( "\n" );
 	// do not free
@@ -107,18 +107,18 @@
 
 	p = alloc( p, dim );                                // CFA resize array alloc
-	for ( int i = 0; i < dim; i += 1 ) { p[i] = 0xdeadbeef; }
+	for ( i; dim ) { p[i] = 0xdeadbeef; }
 	printf( "CFA resize alloc\n" );
-	for ( int i = 0; i < dim; i += 1 ) { printf( "%#x ", p[i] ); }
+	for ( i; dim ) { printf( "%#x ", p[i] ); }
 	printf( "\n" );
 
 	p = alloc( p, 2 * dim );                            // CFA resize array alloc
-	for ( int i = dim; i < 2 * dim; i += 1 ) { p[i] = 0x1010101; }
+	for ( i; dim ~ 2 * dim ) { p[i] = 0x1010101; }
 	printf( "CFA resize array alloc\n" );
-	for ( int i = 0; i < 2 * dim; i += 1 ) { printf( "%#x ", p[i] ); }
+	for ( i; 2 * dim ) { printf( "%#x ", p[i] ); }
 	printf( "\n" );
 
 	p = alloc( p, dim );                                // CFA array alloc
 	printf( "CFA resize array alloc\n" );
-	for ( int i = 0; i < dim; i += 1 ) { printf( "%#x ", p[i] ); }
+	for ( i; dim ) { printf( "%#x ", p[i] ); }
 	printf( "\n" );
 
@@ -128,15 +128,15 @@
 	p = alloc( p, dim, fill );                          // CFA array alloc, fill
 	printf( "CFA resize array alloc, fill\n" );
-	for ( int i = 0; i < dim; i += 1 ) { printf( "%#x ", p[i] ); }
+	for ( i; dim ) { printf( "%#x ", p[i] ); }
 	printf( "\n" );
 
 	p = alloc( p, 2 * dim, fill );                      // CFA array alloc, fill
 	printf( "CFA resize array alloc, fill\n" );
-	for ( int i = 0; i < 2 * dim; i += 1 ) { printf( "%#x ", p[i] ); }
+	for ( i; 2 * dim ) { printf( "%#x ", p[i] ); }
 	printf( "\n" );
 
 	p = alloc( p, dim, fill );                          // CFA array alloc, fill
 	printf( "CFA resize array alloc, fill\n" );
-	for ( int i = 0; i < dim; i += 1 ) { printf( "%#x ", p[i] );; }
+	for ( i; dim ) { printf( "%#x ", p[i] );; }
 	printf( "\n" );
 	free( p );
@@ -193,7 +193,7 @@
 	stp = align_alloc( Alignment, dim );                // CFA array memalign
 	assert( (uintptr_t)stp % Alignment == 0 );
-	for ( int i = 0; i < dim; i += 1 ) { stp[i] = (Struct){ 42, 42.5 }; }
+	for ( i; dim ) { stp[i] = (Struct){ 42, 42.5 }; }
 	printf( "CFA array align_alloc\n" );
-	for ( int i = 0; i < dim; i += 1 ) { printf( "%d %g, ", stp[i].x, stp[i].y ); }
+	for ( i; dim ) { printf( "%d %g, ", stp[i].x, stp[i].y ); }
 	printf( "\n" );
 	free( stp );
@@ -202,5 +202,5 @@
 	assert( (uintptr_t)stp % Alignment == 0 );
 	printf( "CFA array align_alloc, fill\n" );
-	for ( int i = 0; i < dim; i += 1 ) { printf( "%#x %a, ", stp[i].x, stp[i].y ); }
+	for ( i; dim ) { printf( "%#x %a, ", stp[i].x, stp[i].y ); }
 	printf( "\n" );
 	free( stp );
@@ -221,10 +221,10 @@
 	amemset( sta, fill, dim );							// CFA array memset, type safe
 	printf( "CFA array memset\n" );
-	for ( int i = 0; i < dim; i += 1 ) { printf( "%#x %a, ", sta[i].x, sta[i].y ); }
+	for ( i; dim ) { printf( "%#x %a, ", sta[i].x, sta[i].y ); }
 	printf( "\n" );
 
 	amemcpy( sta1, sta, dim );							// CFA array memcpy, type safe
 	printf( "CFA array memcpy\n" );
-	for ( int i = 0; i < dim; i += 1 ) { printf( "%#x %a, ", sta1[i].x, sta1[i].y ); }
+	for ( i; dim ) { printf( "%#x %a, ", sta1[i].x, sta1[i].y ); }
 	printf( "\n" );
 
@@ -241,8 +241,8 @@
 	stp = anew( dim, 42, 42.5 );
 	printf( "CFA array new initialize\n" );
-	for ( int i = 0; i < dim; i += 1 ) { printf( "%d %g, ", stp[i].x, stp[i].y ); }
+	for ( i; dim ) { printf( "%d %g, ", stp[i].x, stp[i].y ); }
 	printf( "\n" );
 	stp1 = anew( dim, 42, 42.5 );
-	for ( int i = 0; i < dim; i += 1 ) { printf( "%d %g, ", stp1[i].x, stp1[i].y ); }
+	for ( i; dim ) { printf( "%d %g, ", stp1[i].x, stp1[i].y ); }
 	printf( "\n" );
 	adelete( dim, stp, dim, stp1 );
Index: src/tests/concurrent/examples/matrixSum.c
===================================================================
--- src/tests/concurrent/examples/matrixSum.c	(revision 3b2b37f2005f0335e652c16b01b2ebacd4c47a7e)
+++ src/tests/concurrent/examples/matrixSum.c	(revision 8f346611c50954b97c8215e458a76af7fba93860)
@@ -11,6 +11,6 @@
 // Created On       : Mon Oct  9 08:29:28 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri May 25 09:34:27 2018
-// Update Count     : 10
+// Last Modified On : Thu Aug  9 09:17:30 2018
+// Update Count     : 13
 // 
 
@@ -30,5 +30,5 @@
 void main( Adder & adder ) with( adder ) {				// thread starts here
 	subtotal = 0;
-	for ( int c = 0; c < cols; c += 1 ) {
+	for ( c; cols ) {
 		subtotal += row[c];
 	} // for
@@ -36,19 +36,19 @@
 
 int main() {
-	const int rows = 10, cols = 1000;
+	/* const */ int rows = 10, cols = 1000;
 	int matrix[rows][cols], subtotals[rows], total = 0;
 	processor p;										// add kernel thread
 
-	for ( int r = 0; r < rows; r += 1 ) {
-		for ( int c = 0; c < cols; c += 1 ) {
+	for ( r; rows ) {
+		for ( c; cols ) {
 			matrix[r][c] = 1;
 		} // for
 	} // for
 	Adder * adders[rows];
-	for ( int r = 0; r < rows; r += 1 ) {				// start threads to sum 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 ( int r = 0; r < rows; r += 1 ) {				// wait for threads to finish
+	for ( r; rows ) {									// wait for threads to finish
 		delete( adders[r] );
 		total += subtotals[r];							// total subtotals
Index: src/tests/forctrl.c
===================================================================
--- src/tests/forctrl.c	(revision 8f346611c50954b97c8215e458a76af7fba93860)
+++ src/tests/forctrl.c	(revision 8f346611c50954b97c8215e458a76af7fba93860)
@@ -0,0 +1,55 @@
+// 
+// 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.
+// 
+// forctrl.c -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Wed Aug  8 18:32:59 2018
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu Aug  9 07:50:48 2018
+// Update Count     : 5
+// 
+
+#include <fstream>
+
+struct S { int i, j; };
+void ?{}( S & s ) { s.[i, j] = 0; }
+void ?{}( S & s, int i ) { s.[i, j] = [i, 0]; }
+void ?{}( S & s, int i, int j ) { s.[i, j] = [i, j]; }
+void ?{}( S & s, zero_t ) { s.[i, j] = 0; }
+void ?{}( S & s, one_t ) { s.[i, j] = 1; }
+S ?+?( S t1, S t2 ) { return (S){ t1.i + t2.i, t1.j + t2.j }; }
+int ?<?( S t1, S t2 ) { return t1.i < t2.i && t1.j < t2.j; }
+S ?=?( S & t1, S t2 ) { t1.i = t2.i; t1.j = t2.j; return t1; }
+S ?+=?( S & t1, S t2 ) { t1 = t1 + t2; return t1; }
+S ?+=?( S & t1, one_t ) { t1 = t1 + (S){1}; return t1; }
+ofstream & ?|?( ofstream & os, S v ) { return os | '(' | v.i | v.j | ')'; }
+
+int main() {
+	while () { sout | "empty"; break; }		sout | endl;
+	do { sout | "empty"; break; } while ();	sout | endl;
+	for () { sout | "empty"; break; }		sout | endl;
+	for ( 10 ) { sout | "X"; }				sout | endl;
+	for ( 0.5 ~ 5.5 ) { sout | "Y"; }		sout | endl;
+	for ( 2 ~= 10 ~ 2 ) { sout | "Z"; }		sout | endl;
+	for ( i; 10 ) { sout | i; }				sout | endl;
+	for ( j; 10 ) { sout | j; }				sout | endl;
+	for ( i; 0.5 ~ 5.5 ) { sout | i; }		sout | endl;
+	for ( i; 2 ~= 10 ~ 2 ) { sout | i; }	sout | endl;
+	for ( ui; 2u ~= 10u ~ 2u ) { sout | ui; } sout | endl;
+	int start = 3, comp = 10, inc = 2;
+	for ( i; start ~ comp ~ inc + 1 ) { sout | i; } 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;
+	for ( s; (S){0} ~ (S){10,10} ) { sout | s; } sout | endl;
+	for ( s; (S){0} ~ (S){10,10} ~ (S){1} ) { sout | s; } sout | endl;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa forctrl.c" //
+// End: //
Index: src/tests/searchsort.c
===================================================================
--- src/tests/searchsort.c	(revision 3b2b37f2005f0335e652c16b01b2ebacd4c47a7e)
+++ src/tests/searchsort.c	(revision 8f346611c50954b97c8215e458a76af7fba93860)
@@ -10,6 +10,6 @@
 // Created On       : Thu Feb  4 18:17:50 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jan  2 08:01:17 2018
-// Update Count     : 100
+// Last Modified On : Thu Aug  9 07:54:57 2018
+// Update Count     : 101
 // 
 
@@ -24,5 +24,5 @@
 	int iarr[size];
 
-	for ( unsigned int i = 0; i < size; i += 1 ) {
+	for ( i; 0u ~ size ) {
 		iarr[i] = size - i;
 		sout | iarr[i] | ", ";
@@ -32,9 +32,9 @@
 	// ascending sort/search by changing < to >
 	qsort( iarr, size );
-	for ( unsigned int i = 0; i < size; i += 1 ) {
+	for ( i; 0u ~ size ) {
 		sout | iarr[i] | ", ";
 	} // for
 	sout | endl;
-	for ( unsigned int i = 0; i < size; i += 1 ) {		// C version
+	for ( i; 0u ~ size ) {		// C version
 		int key = size - i;
 		int * v = bsearch( &key, iarr, size, sizeof( iarr[0] ), comp );
@@ -43,10 +43,10 @@
 	sout | endl;
 
-	for ( unsigned int i = 0; i < size; i += 1 ) {
+	for ( i; 0u ~ size ) {
 		int * v = bsearch( size - i, iarr, size );
 		sout | size - i | ':' | *v | ", ";
 	} // for
 	sout | endl;
-	for ( unsigned int i = 0; i < size; i += 1 ) {
+	for ( i; 0u ~ size ) {
 		unsigned int posn = bsearch( size - i, iarr, size );
 		sout | size - i | ':' | iarr[posn] | ", ";
@@ -55,5 +55,5 @@
 
 	// descending sort/search by changing < to >
-	for ( unsigned int i = 0; i < size; i += 1 ) {
+	for ( i; 0u ~ size ) {
 		iarr[i] = i + 1;
 		sout | iarr[i] | ", ";
@@ -63,14 +63,14 @@
 		int ?<?( int x, int y ) { return x > y; }
 		qsort( iarr, size );
-		for ( unsigned int i = 0; i < size; i += 1 ) {
+		for ( i; 0u ~ size ) {
 			sout | iarr[i] | ", ";
 		} // for
 		sout | endl;
-		for ( unsigned int i = 0; i < size; i += 1 ) {
+		for ( i; 0u ~ size ) {
 			int * v = bsearch( size - i, iarr, size );
 			sout | size - i | ':' | *v | ", ";
 		} // for
 		sout | endl;
-		for ( unsigned int i = 0; i < size; i += 1 ) {
+		for ( i; 0u ~ size ) {
 			unsigned int posn = bsearch( size - i, iarr, size );
 			sout | size - i | ':' | iarr[posn] | ", ";
@@ -80,5 +80,5 @@
 
 	double darr[size];
-	for ( unsigned int i = 0; i < size; i += 1 ) {
+	for ( i; 0u ~ size ) {
 		darr[i] = size - i + 0.5;
 		sout | darr[i] | ", ";
@@ -86,14 +86,14 @@
 	sout | endl;
 	qsort( darr, size );
-	for ( unsigned int i = 0; i < size; i += 1 ) {
+	for ( i; 0u ~ size ) {
 		sout | darr[i] | ", ";
 	} // for
 	sout | endl;
-	for ( unsigned int i = 0; i < size; i += 1 ) {
+	for ( i; 0u ~ size ) {
 		double * v = bsearch( size - i + 0.5, darr, size );
 		sout | size - i + 0.5 | ':' | *v | ", ";
 	} // for
 	sout | endl;
-	for ( unsigned int i = 0; i < size; i += 1 ) {
+	for ( i; 0u ~ size ) {
 		unsigned int posn = bsearch( size - i + 0.5, darr, size );
 		sout | size - i + 0.5 | ':' | darr[posn] | ", ";
@@ -104,5 +104,5 @@
 	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 ( unsigned int i = 0; i < size; i += 1 ) {
+	for ( i; 0u ~ size ) {
 		sarr[i].i = size - i;
 		sarr[i].j = size - i + 1;
@@ -111,9 +111,9 @@
 	sout | endl;
 	qsort( sarr, size );
-	for ( unsigned int i = 0; i < size; i += 1 ) {
+	for ( i; 0u ~ size ) {
 		sout | sarr[i] | ", ";
 	} // for
 	sout | endl;
-	for ( unsigned int i = 0; i < size; i += 1 ) {
+	for ( i; 0u ~ size ) {
 		S temp = { size - i, size - i + 1 };
 		S * v = bsearch( temp, sarr, size );
@@ -121,5 +121,5 @@
 	} // for
 	sout | endl;
-	for ( unsigned int i = 0; i < size; i += 1 ) {
+	for ( i; 0u ~ size ) {
 		S temp = { size - i, size - i + 1 };
 		unsigned int posn = bsearch( temp, sarr, size );
@@ -129,14 +129,14 @@
 	{
 		unsigned int getKey( const S & s ) { return s.j; }
-		for ( unsigned int i = 0; i < size; i += 1 ) {
+		for ( i; 0u ~ size ) {
 			sout | sarr[i] | ", ";
 		} // for
 		sout | endl;
-		for ( unsigned int i = 0; i < size; i += 1 ) {
+		for ( i; 0u ~ size ) {
 			S * v = bsearch( size - i + 1, sarr, size );
 			sout | size - i + 1 | ':' | *v | ", ";
 		} // for
 		sout | endl;
-		for ( unsigned int i = 0; i < size; i += 1 ) {
+		for ( i; 0u ~ size ) {
 			unsigned int posn = bsearch( size - i + 1, sarr, size );
 			sout | size - i + 1 | ':' | sarr[posn] | ", ";
