Index: tests/designations.cfa
===================================================================
--- tests/designations.cfa	(revision 72ba5082b1d3f5354d46325f3700f8e2206bc757)
+++ tests/designations.cfa	(revision 8f2f18564057af4bff916d4459831f6f2689928c)
@@ -10,6 +10,6 @@
 // Created On       : Thu Jun 29 15:26:36 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 27 11:46:35 2017
-// Update Count     : 3
+// Last Modified On : Mon Mar 28 22:41:55 2022
+// Update Count     : 15
 //
 
@@ -18,14 +18,16 @@
 // is used for the designation syntax
 #ifdef __cforall
-#define DES :
+#define _ :
+#define AT @
 #else
-int printf(const char *, ...);
-#define DES =
+int printf( const char *, ...);
+#define _ =
+#define AT
 #endif
 
 const int indentAmt = 2;
-void indent(int level) {
-	for (int i = 0; i < level; ++i) {
-		printf(" ");
+void indent( int level ) {
+	for ( int i = 0; i < level; ++i ) {
+		printf( " " );
 	}
 }
@@ -36,7 +38,7 @@
 	int * ptr;
 };
-void printA(struct A a, int level) {
-	indent(level);
-	printf("(A){ %d %d %p }\n", a.x, a.y, a.ptr);
+void printA( struct A a, int level ) {
+	indent( level );
+	printf( "(A){ %d %d %p }\n", a.x, a.y, a.ptr );
 }
 
@@ -45,11 +47,11 @@
 	struct A a0, a1;
 };
-void printB(struct B b, int level) {
-	indent(level);
-	printf("(B){\n");
-	printA(b.a0, level+indentAmt);
-	printA(b.a1, level+indentAmt);
-	indent(level);
-	printf("}\n");
+void printB( struct B b, int level ) {
+	indent( level );
+	printf( "(B){\n" );
+	printA( b.a0, level+indentAmt );
+	printA( b.a1, level+indentAmt );
+	indent( level );
+	printf( "}\n" );
 }
 
@@ -59,12 +61,12 @@
 	struct B b;
 };
-void printC(struct C c, int level) {
-	indent(level);
-	printf("(C){\n");
-	indent(level+indentAmt);
-	printf("(int[]{ %d %d %d }\n", c.arr[0], c.arr[1], c.arr[2]);
-	printB(c.b, level+indentAmt);
-	indent(level);
-	printf("}\n");
+void printC( struct C c, int level ) {
+	indent( level );
+	printf( "(C){\n" );
+	indent( level+indentAmt );
+	printf( "(int[]{ %d %d %d }\n", c.arr[0], c.arr[1], c.arr[2]);
+	printB( c.b, level+indentAmt );
+	indent( level );
+	printf( "}\n" );
 }
 
@@ -75,7 +77,7 @@
 	};
 };
-void printD(struct D d, int level) {
-	indent(level);
-	printf("(D){ %d }\n", d.x);
+void printD( struct D d, int level ) {
+	indent( level);
+	printf( "(D ){ %d }\n", d.x );
 }
 
@@ -99,12 +101,12 @@
     } m;
 };
-struct Fred s1 @= { .m.j : 3 };
-struct Fred s2 @= { .i : { [2] : 2 } };
+struct Fred s1 AT= { .m.j _ 3 };
+struct Fred s2 AT= { .i _ { [2] _ 2 } };
 
 int main() {
 	// simple designation case - starting from beginning of structure, leaves ptr default-initialized (zero)
 	struct A y0 = {
-		.x DES 2,
-		.y DES 3
+		.x _ 2,
+		.y _ 3
 	};
 
@@ -117,5 +119,5 @@
 	// use designation to move to member y, leaving x default-initialized (zero)
 	struct A y2 = {
-		.y DES 3,
+		.y _ 3,
 		0
 	};
@@ -127,9 +129,9 @@
 #endif
 
-	printf("=====A=====\n");
-	printA(y0, 0);
-	printA(y1, 0);
-	printA(y2, 0);
-	printf("=====A=====\n\n");
+	printf( "=====A=====\n" );
+	printA( y0, 0 );
+	printA( y1, 0 );
+	printA( y2, 0 );
+	printf( "=====A=====\n\n" );
 
 	// initialize only first element (z0.a.x), leaving everything else default-initialized (zero), no nested curly-braces
@@ -140,7 +142,7 @@
 		{ 3 }, // z1.a0
 		{ 4 }, // z1.a1
-		.a0 DES { 5 }, // z1.a0
+		.a0 _ { 5 }, // z1.a0
 		{ 6 }, // z1.a1
-		.a0.y DES 2, // z1.a0.y
+		.a0.y _ 2, // z1.a0.y
 		0, // z1.a0.ptr
 	};
@@ -170,12 +172,12 @@
 	};
 
-	printf("=====B=====\n");
-	printB(z0, 0);
-	printB(z1, 0);
-	printB(z2, 0);
-	printB(z3, 0);
-	printB(z5, 0);
-	printB(z6, 0);
-	printf("=====B=====\n\n");
+	printf( "=====B=====\n" );
+	printB( z0, 0 );
+	printB( z1, 0 );
+	printB( z2, 0 );
+	printB( z3, 0 );
+	printB( z5, 0 );
+	printB( z6, 0 );
+	printf( "=====B=====\n\n" );
 
 	// TODO: what about extra things in a nested init? are empty structs skipped??
@@ -188,7 +190,7 @@
 	};
 
-	printf("=====C=====\n");
-	printC(c1, 0);
-	printf("=====C=====\n\n");
+	printf( "=====C=====\n" );
+	printC( c1, 0 );
+	printf( "=====C=====\n\n" );
 
 #if ERROR
@@ -213,5 +215,5 @@
 #endif
 	// array designation
-	int i[2] = { [1] : 3 };
+	int i[2] = { [1] _ 3 };
 	// allowed to have 'too many' initialized lists - essentially they are ignored.
 	int i1 = { 3 };
@@ -219,7 +221,7 @@
 	// doesn't work yet.
 	// designate unnamed object's members
-	// struct D d = { .x DES 3 };
+	// struct D d = { .x _ 3 };
 #if ERROR
-	struct D d1 = { .y DES 3 };
+	struct D d1 = { .y _ 3 };
 #endif
 
@@ -241,20 +243,33 @@
 	// move cursor to e4.b.a0.x and initialize until e3.b.a1.ptr inclusive
 	union E e3 = {
-		.b.a0.x DES 2, 3, 0, 5, 6, 0
-	};
-
-	printf("=====E=====\n");
-	printA(e0.a, 0);
-	printA(e1.a, 0);
-	printA(e2.a, 0);
-	printB(e3.b, 0);
-	printf("=====E=====\n\n");
+		.b.a0.x _ 2, 3, 0, 5, 6, 0
+	};
+
+	printf( "=====E=====\n" );
+	printA( e0.a, 0 );
+	printA( e1.a, 0 );
+	printA( e2.a, 0 );
+	printB( e3.b, 0 );
+	printf( "=====E=====\n\n" );
 
 	// special case of initialization: char[] can be initialized with a string literal
 	const char * str0 = "hello";
 	char str1[] = "hello";
-	const char c1[] = "abc";
-	const char c2[] = { 'a', 'b', 'c' };
-	const char c3[][2] = { { 'a', 'b' }, { 'c', 'd'}, { 'c', 'd'} };
+	const char c2[] = "abc";
+	const char c3[] = { 'a', 'b', 'c' };
+	const char c4[][2] = { { 'a', 'b' }, { 'c', 'd'}, { 'c', 'd'} };
+
+	// more cases
+
+//	int widths[] = { [3 ... 9] _ 1, [10 ... 99] _ 2, [100] _ 3 };
+//	int widths[] = { [3 ~ 9] _ 1, [10 ~ 99] _ 2, [100] _ 3 };
+	struct point { int x, y; };
+	struct point p = { .y _ 5, .x _ 7 };
+	union foo { int i; double d; };
+	union foo f = { .d _ 4 };
+	int v1, v2, v4;
+	int w[6] = { [1] _ v1, v2, [4] _ v4 };
+	int whitespace[256] = { [' '] _ 1, ['\t'] _ 1, ['\v'] _ 1, ['\f'] _ 1, ['\n'] _ 1, ['\r'] _ 1 };
+	struct point ptarray[10] = { [2].y _ 34, [2].x _ 35, [0].x _ 36 };
 }
 
