Index: tests/.expect/array-ERR1.txt
===================================================================
--- tests/.expect/array-ERR1.txt	(revision 108b2c75260d5b15cab02e847700d0ca68637ebe)
+++ tests/.expect/array-ERR1.txt	(revision 81e768d1c7e5b625cf5e14ca13ea80c649602ad5)
@@ -1,3 +1,3 @@
-array.cfa:119:25: warning: Preprocessor started
+array.cfa:125:25: warning: Preprocessor started
 array.cfa:40:22: error: '[*]' not allowed in other than function prototype scope
 array.cfa:46:24: error: '[*]' not allowed in other than function prototype scope
@@ -5,2 +5,4 @@
 array.cfa:52:16: error: array size missing in '_X2a1A0i_2'
 array.cfa:53:26: error: '[*]' not allowed in other than function prototype scope
+array.cfa: At top level:
+array.cfa:64:1: error: '[*]' not allowed in other than function prototype scope
Index: tests/.expect/array-ERR2.txt
===================================================================
--- tests/.expect/array-ERR2.txt	(revision 108b2c75260d5b15cab02e847700d0ca68637ebe)
+++ tests/.expect/array-ERR2.txt	(revision 81e768d1c7e5b625cf5e14ca13ea80c649602ad5)
@@ -1,2 +1,2 @@
-array.cfa:119:25: warning: Preprocessor started
-array.cfa:109:32: error: syntax error, unexpected STATIC before token "static"
+array.cfa:125:25: warning: Preprocessor started
+array.cfa:117:32: error: syntax error, unexpected STATIC before token "static"
Index: tests/.expect/array-ERR3.txt
===================================================================
--- tests/.expect/array-ERR3.txt	(revision 108b2c75260d5b15cab02e847700d0ca68637ebe)
+++ tests/.expect/array-ERR3.txt	(revision 81e768d1c7e5b625cf5e14ca13ea80c649602ad5)
@@ -1,2 +1,2 @@
-array.cfa:119:25: warning: Preprocessor started
-array.cfa:110:32: error: syntax error, unexpected ']' before token "]"
+array.cfa:125:25: warning: Preprocessor started
+array.cfa:118:32: error: syntax error, unexpected ']' before token "]"
Index: tests/.expect/array.txt
===================================================================
--- tests/.expect/array.txt	(revision 108b2c75260d5b15cab02e847700d0ca68637ebe)
+++ tests/.expect/array.txt	(revision 81e768d1c7e5b625cf5e14ca13ea80c649602ad5)
@@ -1,1 +1,1 @@
-array.cfa:119:25: warning: Preprocessor started
+array.cfa:125:25: warning: Preprocessor started
Index: tests/.expect/functions.arm64.txt
===================================================================
--- tests/.expect/functions.arm64.txt	(revision 108b2c75260d5b15cab02e847700d0ca68637ebe)
+++ tests/.expect/functions.arm64.txt	(revision 81e768d1c7e5b625cf5e14ca13ea80c649602ad5)
@@ -310,6 +310,6 @@
     __attribute__ ((unused)) const struct _conc__tuple2_3 _X10_retval_f5KT2PiKi_1;
 }
-signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(signed int (*__anonymous_object42)(void), signed int *(*__anonymous_object43)(void), signed int **(*__anonymous_object44)(void), signed int *const *(*__anonymous_object45)(void), signed int *const *const (*__anonymous_object46)(void), signed int *__anonymous_object47, signed int __anonymous_object48[10], signed int **__anonymous_object49, signed int *__anonymous_object50[10], signed int ***__anonymous_object51, signed int **__anonymous_object52[10], signed int *const **__anonymous_object53, signed int *const *__anonymous_object54[10], signed int *const *const *__anonymous_object55, signed int *const *const __anonymous_object56[10]);
-signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(__attribute__ ((unused)) signed int (*__anonymous_object57)(void), __attribute__ ((unused)) signed int *(*__anonymous_object58)(void), __attribute__ ((unused)) signed int **(*__anonymous_object59)(void), __attribute__ ((unused)) signed int *const *(*__anonymous_object60)(void), __attribute__ ((unused)) signed int *const *const (*__anonymous_object61)(void), __attribute__ ((unused)) signed int *__anonymous_object62, __attribute__ ((unused)) signed int __anonymous_object63[10], __attribute__ ((unused)) signed int **__anonymous_object64, __attribute__ ((unused)) signed int *__anonymous_object65[10], __attribute__ ((unused)) signed int ***__anonymous_object66, __attribute__ ((unused)) signed int **__anonymous_object67[10], __attribute__ ((unused)) signed int *const **__anonymous_object68, __attribute__ ((unused)) signed int *const *__anonymous_object69[10], __attribute__ ((unused)) signed int *const *const *__anonymous_object70, __attribute__ ((unused)) signed int *const *const __anonymous_object71[10]){
+signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(signed int (*__anonymous_object42)(void), signed int *(*__anonymous_object43)(void), signed int **(*__anonymous_object44)(void), signed int *const *(*__anonymous_object45)(void), signed int *const *const (*__anonymous_object46)(void), signed int *__anonymous_object47, signed int __anonymous_object48[((unsigned long int )10)], signed int **__anonymous_object49, signed int *__anonymous_object50[((unsigned long int )10)], signed int ***__anonymous_object51, signed int **__anonymous_object52[((unsigned long int )10)], signed int *const **__anonymous_object53, signed int *const *__anonymous_object54[((unsigned long int )10)], signed int *const *const *__anonymous_object55, signed int *const *const __anonymous_object56[((unsigned long int )10)]);
+signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(__attribute__ ((unused)) signed int (*__anonymous_object57)(void), __attribute__ ((unused)) signed int *(*__anonymous_object58)(void), __attribute__ ((unused)) signed int **(*__anonymous_object59)(void), __attribute__ ((unused)) signed int *const *(*__anonymous_object60)(void), __attribute__ ((unused)) signed int *const *const (*__anonymous_object61)(void), __attribute__ ((unused)) signed int *__anonymous_object62, __attribute__ ((unused)) signed int __anonymous_object63[((unsigned long int )10)], __attribute__ ((unused)) signed int **__anonymous_object64, __attribute__ ((unused)) signed int *__anonymous_object65[((unsigned long int )10)], __attribute__ ((unused)) signed int ***__anonymous_object66, __attribute__ ((unused)) signed int **__anonymous_object67[((unsigned long int )10)], __attribute__ ((unused)) signed int *const **__anonymous_object68, __attribute__ ((unused)) signed int *const *__anonymous_object69[((unsigned long int )10)], __attribute__ ((unused)) signed int *const *const *__anonymous_object70, __attribute__ ((unused)) signed int *const *const __anonymous_object71[((unsigned long int )10)]){
     __attribute__ ((unused)) signed int _X9_retval_fi_1;
 }
Index: tests/.expect/functions.x64.txt
===================================================================
--- tests/.expect/functions.x64.txt	(revision 108b2c75260d5b15cab02e847700d0ca68637ebe)
+++ tests/.expect/functions.x64.txt	(revision 81e768d1c7e5b625cf5e14ca13ea80c649602ad5)
@@ -310,6 +310,6 @@
     __attribute__ ((unused)) const struct _conc__tuple2_3 _X10_retval_f5KT2PiKi_1;
 }
-signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(signed int (*__anonymous_object42)(void), signed int *(*__anonymous_object43)(void), signed int **(*__anonymous_object44)(void), signed int *const *(*__anonymous_object45)(void), signed int *const *const (*__anonymous_object46)(void), signed int *__anonymous_object47, signed int __anonymous_object48[10], signed int **__anonymous_object49, signed int *__anonymous_object50[10], signed int ***__anonymous_object51, signed int **__anonymous_object52[10], signed int *const **__anonymous_object53, signed int *const *__anonymous_object54[10], signed int *const *const *__anonymous_object55, signed int *const *const __anonymous_object56[10]);
-signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(__attribute__ ((unused)) signed int (*__anonymous_object57)(void), __attribute__ ((unused)) signed int *(*__anonymous_object58)(void), __attribute__ ((unused)) signed int **(*__anonymous_object59)(void), __attribute__ ((unused)) signed int *const *(*__anonymous_object60)(void), __attribute__ ((unused)) signed int *const *const (*__anonymous_object61)(void), __attribute__ ((unused)) signed int *__anonymous_object62, __attribute__ ((unused)) signed int __anonymous_object63[10], __attribute__ ((unused)) signed int **__anonymous_object64, __attribute__ ((unused)) signed int *__anonymous_object65[10], __attribute__ ((unused)) signed int ***__anonymous_object66, __attribute__ ((unused)) signed int **__anonymous_object67[10], __attribute__ ((unused)) signed int *const **__anonymous_object68, __attribute__ ((unused)) signed int *const *__anonymous_object69[10], __attribute__ ((unused)) signed int *const *const *__anonymous_object70, __attribute__ ((unused)) signed int *const *const __anonymous_object71[10]){
+signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(signed int (*__anonymous_object42)(void), signed int *(*__anonymous_object43)(void), signed int **(*__anonymous_object44)(void), signed int *const *(*__anonymous_object45)(void), signed int *const *const (*__anonymous_object46)(void), signed int *__anonymous_object47, signed int __anonymous_object48[((unsigned long int )10)], signed int **__anonymous_object49, signed int *__anonymous_object50[((unsigned long int )10)], signed int ***__anonymous_object51, signed int **__anonymous_object52[((unsigned long int )10)], signed int *const **__anonymous_object53, signed int *const *__anonymous_object54[((unsigned long int )10)], signed int *const *const *__anonymous_object55, signed int *const *const __anonymous_object56[((unsigned long int )10)]);
+signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(__attribute__ ((unused)) signed int (*__anonymous_object57)(void), __attribute__ ((unused)) signed int *(*__anonymous_object58)(void), __attribute__ ((unused)) signed int **(*__anonymous_object59)(void), __attribute__ ((unused)) signed int *const *(*__anonymous_object60)(void), __attribute__ ((unused)) signed int *const *const (*__anonymous_object61)(void), __attribute__ ((unused)) signed int *__anonymous_object62, __attribute__ ((unused)) signed int __anonymous_object63[((unsigned long int )10)], __attribute__ ((unused)) signed int **__anonymous_object64, __attribute__ ((unused)) signed int *__anonymous_object65[((unsigned long int )10)], __attribute__ ((unused)) signed int ***__anonymous_object66, __attribute__ ((unused)) signed int **__anonymous_object67[((unsigned long int )10)], __attribute__ ((unused)) signed int *const **__anonymous_object68, __attribute__ ((unused)) signed int *const *__anonymous_object69[((unsigned long int )10)], __attribute__ ((unused)) signed int *const *const *__anonymous_object70, __attribute__ ((unused)) signed int *const *const __anonymous_object71[((unsigned long int )10)]){
     __attribute__ ((unused)) signed int _X9_retval_fi_1;
 }
Index: tests/.expect/functions.x86.txt
===================================================================
--- tests/.expect/functions.x86.txt	(revision 108b2c75260d5b15cab02e847700d0ca68637ebe)
+++ tests/.expect/functions.x86.txt	(revision 81e768d1c7e5b625cf5e14ca13ea80c649602ad5)
@@ -310,6 +310,6 @@
     __attribute__ ((unused)) const struct _conc__tuple2_3 _X10_retval_f5KT2PiKi_1;
 }
-signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(signed int (*__anonymous_object42)(void), signed int *(*__anonymous_object43)(void), signed int **(*__anonymous_object44)(void), signed int *const *(*__anonymous_object45)(void), signed int *const *const (*__anonymous_object46)(void), signed int *__anonymous_object47, signed int __anonymous_object48[10], signed int **__anonymous_object49, signed int *__anonymous_object50[10], signed int ***__anonymous_object51, signed int **__anonymous_object52[10], signed int *const **__anonymous_object53, signed int *const *__anonymous_object54[10], signed int *const *const *__anonymous_object55, signed int *const *const __anonymous_object56[10]);
-signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(__attribute__ ((unused)) signed int (*__anonymous_object57)(void), __attribute__ ((unused)) signed int *(*__anonymous_object58)(void), __attribute__ ((unused)) signed int **(*__anonymous_object59)(void), __attribute__ ((unused)) signed int *const *(*__anonymous_object60)(void), __attribute__ ((unused)) signed int *const *const (*__anonymous_object61)(void), __attribute__ ((unused)) signed int *__anonymous_object62, __attribute__ ((unused)) signed int __anonymous_object63[10], __attribute__ ((unused)) signed int **__anonymous_object64, __attribute__ ((unused)) signed int *__anonymous_object65[10], __attribute__ ((unused)) signed int ***__anonymous_object66, __attribute__ ((unused)) signed int **__anonymous_object67[10], __attribute__ ((unused)) signed int *const **__anonymous_object68, __attribute__ ((unused)) signed int *const *__anonymous_object69[10], __attribute__ ((unused)) signed int *const *const *__anonymous_object70, __attribute__ ((unused)) signed int *const *const __anonymous_object71[10]){
+signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(signed int (*__anonymous_object42)(void), signed int *(*__anonymous_object43)(void), signed int **(*__anonymous_object44)(void), signed int *const *(*__anonymous_object45)(void), signed int *const *const (*__anonymous_object46)(void), signed int *__anonymous_object47, signed int __anonymous_object48[((unsigned long int )10)], signed int **__anonymous_object49, signed int *__anonymous_object50[((unsigned long int )10)], signed int ***__anonymous_object51, signed int **__anonymous_object52[((unsigned long int )10)], signed int *const **__anonymous_object53, signed int *const *__anonymous_object54[((unsigned long int )10)], signed int *const *const *__anonymous_object55, signed int *const *const __anonymous_object56[((unsigned long int )10)]);
+signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(__attribute__ ((unused)) signed int (*__anonymous_object57)(void), __attribute__ ((unused)) signed int *(*__anonymous_object58)(void), __attribute__ ((unused)) signed int **(*__anonymous_object59)(void), __attribute__ ((unused)) signed int *const *(*__anonymous_object60)(void), __attribute__ ((unused)) signed int *const *const (*__anonymous_object61)(void), __attribute__ ((unused)) signed int *__anonymous_object62, __attribute__ ((unused)) signed int __anonymous_object63[((unsigned long int )10)], __attribute__ ((unused)) signed int **__anonymous_object64, __attribute__ ((unused)) signed int *__anonymous_object65[((unsigned long int )10)], __attribute__ ((unused)) signed int ***__anonymous_object66, __attribute__ ((unused)) signed int **__anonymous_object67[((unsigned long int )10)], __attribute__ ((unused)) signed int *const **__anonymous_object68, __attribute__ ((unused)) signed int *const *__anonymous_object69[((unsigned long int )10)], __attribute__ ((unused)) signed int *const *const *__anonymous_object70, __attribute__ ((unused)) signed int *const *const __anonymous_object71[((unsigned long int )10)]){
     __attribute__ ((unused)) signed int _X9_retval_fi_1;
 }
Index: tests/.expect/tuplearray.txt
===================================================================
--- tests/.expect/tuplearray.txt	(revision 108b2c75260d5b15cab02e847700d0ca68637ebe)
+++ tests/.expect/tuplearray.txt	(revision 81e768d1c7e5b625cf5e14ca13ea80c649602ad5)
@@ -9,2 +9,12 @@
 1, 2
 1, 2
+2, 4
+2, 4
+2, 4
+2, 4
+2, 4
+2, 4
+2, 4
+2, 4
+2, 4
+2, 4
Index: tests/.expect/typedefRedef-ERR1.txt
===================================================================
--- tests/.expect/typedefRedef-ERR1.txt	(revision 108b2c75260d5b15cab02e847700d0ca68637ebe)
+++ tests/.expect/typedefRedef-ERR1.txt	(revision 81e768d1c7e5b625cf5e14ca13ea80c649602ad5)
@@ -1,4 +1,6 @@
-typedefRedef.cfa:75:25: warning: Compiled
+typedefRedef.cfa:87:25: warning: Compiled
 typedefRedef.cfa:4:1 error: Cannot redefine typedef Foo
 typedefRedef.cfa:31:1 error: Cannot redefine typedef ARR
-typedefRedef.cfa:65:1 error: Cannot redefine typedef ARR
+typedefRedef.cfa:37:1 error: Cannot redefine typedef ARRSa
+typedefRedef.cfa:43:1 error: Cannot redefine typedef ARRSb
+typedefRedef.cfa:77:1 error: Cannot redefine typedef ARR
Index: tests/.expect/typedefRedef.txt
===================================================================
--- tests/.expect/typedefRedef.txt	(revision 108b2c75260d5b15cab02e847700d0ca68637ebe)
+++ tests/.expect/typedefRedef.txt	(revision 81e768d1c7e5b625cf5e14ca13ea80c649602ad5)
@@ -1,1 +1,1 @@
-typedefRedef.cfa:75:25: warning: Compiled
+typedefRedef.cfa:87:25: warning: Compiled
Index: tests/array-collections/.expect/c-dependent.txt
===================================================================
--- tests/array-collections/.expect/c-dependent.txt	(revision 81e768d1c7e5b625cf5e14ca13ea80c649602ad5)
+++ tests/array-collections/.expect/c-dependent.txt	(revision 81e768d1c7e5b625cf5e14ca13ea80c649602ad5)
@@ -0,0 +1,5 @@
+bound_ptr_allow 999: 1.1 1.2 1.3
+bound_ar_allow 41:
+1.1 1.2 1.3
+2.1 2.2 2.3
+3.1 3.2 3.3
Index: tests/array-collections/c-dependent.cfa
===================================================================
--- tests/array-collections/c-dependent.cfa	(revision 81e768d1c7e5b625cf5e14ca13ea80c649602ad5)
+++ tests/array-collections/c-dependent.cfa	(revision 81e768d1c7e5b625cf5e14ca13ea80c649602ad5)
@@ -0,0 +1,36 @@
+void iota1( int n, float * a, float base ) {
+    for (i; n) {
+        a[i] = base + 0.1f * (float)(i + 1);
+    }
+}
+
+void f__bound_ptr_allow( int n, float a[n] ) {
+    printf( "bound_ptr_allow %d: %.1f %.1f %.1f\n", n, a[0], a[1], a[2] );
+}
+void bound_ptr_allow() {
+    float a[42];
+    iota1( 42, a, 1.0 );
+    f__bound_ptr_allow( 999, a );
+}
+
+void f__bound_ar_allow( int n, float a[][n + 1] ) {
+    printf( "bound_ar_allow %d:\n", n );
+    printf( "%.1f %.1f %.1f\n", a[0][0], a[0][1], a[0][2] );
+    printf( "%.1f %.1f %.1f\n", a[1][0], a[1][1], a[1][2] );
+    printf( "%.1f %.1f %.1f\n", a[2][0], a[2][1], a[2][2] );
+}
+void bound_ar_allow() {
+    float a[3][42];
+    iota1( 42, a[0], 1.0 );
+    iota1( 42, a[1], 2.0 );
+    iota1( 42, a[2], 3.0 );
+    f__bound_ar_allow( 41, a );
+}
+
+
+int main() {
+    bound_ptr_allow();
+    bound_ar_allow();
+
+    return 0;
+}
Index: tests/array.cfa
===================================================================
--- tests/array.cfa	(revision 108b2c75260d5b15cab02e847700d0ca68637ebe)
+++ tests/array.cfa	(revision 81e768d1c7e5b625cf5e14ca13ea80c649602ad5)
@@ -57,4 +57,12 @@
     }
 
+    int fred2(int n,
+        int a1[],
+E1(     int a2[*],   )
+        int a4[3],
+        int T[3],
+        int a5[n]
+    ) {}
+
     int mary( int T[3],                                 // same as: int *T
               int p1[const 3],                          // same as: int const *p1
@@ -110,8 +118,6 @@
 E3( int fm4( int r, int c, int m[][] );            )    // m's immediate element type is incomplete
     int fm5x( int, int, int[*][*] );                    // same as fm1 decl
-                                                        #ifndef __cforall
-    int fm5y( int r, int c, int m[r][c] ) {}            // BUG 276: CFA chokes but should accept
-                                                        // C: same as fm1 defn
-                                                        #endif
+    int fm5y( int r, int c, int m[r][c] ) {}            // same as fm1 defn
+
 
 
Index: tests/tuplearray.cfa
===================================================================
--- tests/tuplearray.cfa	(revision 108b2c75260d5b15cab02e847700d0ca68637ebe)
+++ tests/tuplearray.cfa	(revision 81e768d1c7e5b625cf5e14ca13ea80c649602ad5)
@@ -20,7 +20,9 @@
 [void] bar12( * [3][10] [int,int] f );
 
-//[void] foo( size_t size, [size] [int,int] f ) {
-[void] foo( size_t size, [10] [int,int] f ) {
-	for ( i; size ) f[i] = [1, 2];
+[void] foo1( [10] [int,int] f ) {
+	for ( i; 10 ) f[i] = [1, 2];
+}
+[void] foo2( size_t size, [size] [int,int] f ) {
+	for ( i; size ) f[i] = [2, 4];
 }
 
@@ -29,5 +31,8 @@
 //	[int,int] arr[10];	// unimplemented
 
-	foo( 10, arr );
+	foo1( arr );
+	for ( i; 10 ) sout | arr[i];
+
+	foo2( 10, arr );
 	for ( i; 10 ) sout | arr[i];
 }
Index: tests/typedefRedef.cfa
===================================================================
--- tests/typedefRedef.cfa	(revision 108b2c75260d5b15cab02e847700d0ca68637ebe)
+++ tests/typedefRedef.cfa	(revision 81e768d1c7e5b625cf5e14ca13ea80c649602ad5)
@@ -30,4 +30,16 @@
 // if a typedef has an array dimension, it can only be redefined to the same dimension
 typedef int ARR[2];
+#endif
+
+typedef [ float[], char[], int[] ] ARRSa;
+typedef [ float[], char[], int[] ] ARRSa;
+#ifdef ERR1
+typedef [ float[], char[2], int[] ] ARRSa;
+#endif
+
+typedef int ARRSb[][1][2][3];
+typedef int ARRSb[][1][2][3];
+#ifdef ERR1
+typedef int ARRSb[][1][2][99];
 #endif
 
