Index: src/tests/.expect/avl_test.txt
===================================================================
--- src/tests/.expect/avl_test.txt	(revision 1c31f681ccd8499a1803e510a302bdfd289ce990)
+++ src/tests/.expect/avl_test.txt	(revision 1c31f681ccd8499a1803e510a302bdfd289ce990)
@@ -0,0 +1,87 @@
+/usr/local/bin/cfa -DHAVE_CONFIG_H -I. -I../..     -g -Wall -Wno-unused-function  -MT avl_test.o -MD -MP -MF .deps/avl_test.Tpo -c -o avl_test.o `test -f 'avltree/avl_test.c' || echo './'`avltree/avl_test.c
+/usr/local/bin/cfa -DHAVE_CONFIG_H -I. -I../..     -g -Wall -Wno-unused-function  -MT avl0.o -MD -MP -MF .deps/avl0.Tpo -c -o avl0.o `test -f 'avltree/avl0.c' || echo './'`avltree/avl0.c
+/usr/local/bin/cfa -DHAVE_CONFIG_H -I. -I../..     -g -Wall -Wno-unused-function  -MT avl1.o -MD -MP -MF .deps/avl1.Tpo -c -o avl1.o `test -f 'avltree/avl1.c' || echo './'`avltree/avl1.c
+/usr/local/bin/cfa -DHAVE_CONFIG_H -I. -I../..     -g -Wall -Wno-unused-function  -MT avl2.o -MD -MP -MF .deps/avl2.Tpo -c -o avl2.o `test -f 'avltree/avl2.c' || echo './'`avltree/avl2.c
+/usr/local/bin/cfa -DHAVE_CONFIG_H -I. -I../..     -g -Wall -Wno-unused-function  -MT avl3.o -MD -MP -MF .deps/avl3.Tpo -c -o avl3.o `test -f 'avltree/avl3.c' || echo './'`avltree/avl3.c
+/usr/local/bin/cfa -DHAVE_CONFIG_H -I. -I../..     -g -Wall -Wno-unused-function  -MT avl4.o -MD -MP -MF .deps/avl4.Tpo -c -o avl4.o `test -f 'avltree/avl4.c' || echo './'`avltree/avl4.c
+/usr/local/bin/cfa -DHAVE_CONFIG_H -I. -I../..     -g -Wall -Wno-unused-function  -MT avl-private.o -MD -MP -MF .deps/avl-private.Tpo -c -o avl-private.o `test -f 'avltree/avl-private.c' || echo './'`avltree/avl-private.c
+CFA Version 1.0.0 (debug)
+CFA Version 1.0.0 (debug)
+CFA Version 1.0.0 (debug)
+CFA Version 1.0.0 (debug)
+CFA Version 1.0.0 (debug)
+CFA Version 1.0.0 (debug)
+CFA Version 1.0.0 (debug)
+mv -f .deps/avl0.Tpo .deps/avl0.Po
+/tmp/cck003yV.i: In function 'main':
+/tmp/cck003yV.i:1222:24: warning: passing argument 20 of '__create__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__FP5stree_t0t1__1' discards 'const' qualifier from pointer target type [enabled by default]
+     ((void)((*((struct _conc_tree0 **)(&__imap__P5stree_2)))=((_tmp_cp_ret0=__create__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__FP5stree_t0t1__1(_adapterF_Pii__MP, _adapterFi_Pii_P_MP, _adapterFi_ii_M_PP, _adapterF_Pii__MP, _adapterFi_Pii_P_MP, sizeof(int ), __alignof__(int ), sizeof(int ), __alignof__(int ), ((void *(*)(void *, void *))___operator_assign__Fi_Pii_intrinsic___1), ((void (*)(void *))___constructor__F_Pi_intrinsic___1), ((void (*)(void *, void *))___constructor__F_Pii_intrinsic___1), ((void (*)(void *))___destructor__F_Pi_intrinsic___1), ((int (*)(void *, void *))___operator_less__Fi_ii_intrinsic___1), ((void *(*)(void *, void *))___operator_assign__Fi_Pii_intrinsic___1), ((void (*)(void *))___constructor__F_Pi_intrinsic___1), ((void (*)(void *, void *))___constructor__F_Pii_intrinsic___1), ((void (*)(void *))___destructor__F_Pi_intrinsic___1), (&_temp4), (&___constant_zero__Ciintrinsic___1))) , _tmp_cp_ret0)) /* ?{} */);
+                        ^
+/tmp/cck003yV.i:1188:7: note: expected 'void *' but argument is of type 'const int *'
+ void *__create__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__FP5stree_t0t1__1(void (*_adapterF_P2tV2tV__MP)(void (*)(), void *, void *), void (*_adapterF2tV_P2tV2tV_P_MP)(void (*)(), void *, void *, void *), int (*_adapterFi_2tK2tK_M_PP)(void (*)(), void *, void *), void (*_adapterF_P2tK2tK__MP)(void (*)(), void *, void *), void (*_adapterF2tK_P2tK2tK_P_MP)(void (*)(), void *, void *, void *), long unsigned int _sizeof_2tK, long unsigned int _alignof_2tK, long unsigned int _sizeof_2tV, long unsigned int _alignof_2tV, void *(*___operator_assign__PF2tK_P2tK2tK__1)(void *, void *), void (*___constructor__PF_P2tK__1)(void *), void (*___constructor__PF_P2tK2tK__1)(void *, void *), void (*___destructor__PF_P2tK__1)(void *), int (*___operator_less__PFi_2tK2tK__1)(void *, void *), void *(*___operator_assign__PF2tV_P2tV2tV__1)(void *, void *), void (*___constructor__PF_P2tV__1)(void *), void (*___constructor__PF_P2tV2tV__1)(void *, void *), void (*___destructor__PF_P2tV__1)(void *), void *__key__2tK_1, void *__value__2tV_1);
+       ^
+/tmp/cck003yV.i:1229:5: warning: passing argument 19 of '__insert__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0t1__1' from incompatible pointer type [enabled by default]
+     ((void)((_tmp_cp_ret1=__insert__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0t1__1(_adapterF_Pii__MP, _adapterFi_Pii_P_MP, _adapterFi_ii_M_PP, _adapterF_Pii__MP, _adapterFi_Pii_P_MP, sizeof(int ), __alignof__(int ), sizeof(int ), __alignof__(int ), ((void *(*)(void *, void *))___operator_assign__Fi_Pii_intrinsic___1), ((void (*)(void *))___constructor__F_Pi_intrinsic___1), ((void (*)(void *, void *))___constructor__F_Pii_intrinsic___1), ((void (*)(void *))___destructor__F_Pi_intrinsic___1), ((int (*)(void *, void *))___operator_less__Fi_ii_intrinsic___1), ((void *(*)(void *, void *))___operator_assign__Fi_Pii_intrinsic___1), ((void (*)(void *))___constructor__F_Pi_intrinsic___1), ((void (*)(void *, void *))___constructor__F_Pii_intrinsic___1), ((void (*)(void *))___destructor__F_Pi_intrinsic___1), (&__imap__P5stree_2), (&_temp5), (&_temp6))) , _tmp_cp_ret1));
+     ^
+/tmp/cck003yV.i:1191:5: note: expected 'void **' but argument is of type 'struct _conc_tree0 **'
+ int __insert__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0t1__1(void (*_adapterF_P2tV2tV__MP)(void (*)(), void *, void *), void (*_adapterF2tV_P2tV2tV_P_MP)(void (*)(), void *, void *, void *), int (*_adapterFi_2tK2tK_M_PP)(void (*)(), void *, void *), void (*_adapterF_P2tK2tK__MP)(void (*)(), void *, void *), void (*_adapterF2tK_P2tK2tK_P_MP)(void (*)(), void *, void *, void *), long unsigned int _sizeof_2tK, long unsigned int _alignof_2tK, long unsigned int _sizeof_2tV, long unsigned int _alignof_2tV, void *(*___operator_assign__PF2tK_P2tK2tK__1)(void *, void *), void (*___constructor__PF_P2tK__1)(void *), void (*___constructor__PF_P2tK2tK__1)(void *, void *), void (*___destructor__PF_P2tK__1)(void *), int (*___operator_less__PFi_2tK2tK__1)(void *, void *), void *(*___operator_assign__PF2tV_P2tV2tV__1)(void *, void *), void (*___constructor__PF_P2tV__1)(void *), void (*___constructor__PF_P2tV2tV__1)(void *, void *), void (*___destructor__PF_P2tV__1)(void *), void **__t__PP5stree_1, void *__key__2tK_1, void *__value__2tV_1);
+     ^
+/tmp/cck003yV.i:1236:5: warning: passing argument 19 of '__insert__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0t1__1' from incompatible pointer type [enabled by default]
+     ((void)((_tmp_cp_ret2=__insert__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0t1__1(_adapterF_Pii__MP, _adapterFi_Pii_P_MP, _adapterFi_ii_M_PP, _adapterF_Pii__MP, _adapterFi_Pii_P_MP, sizeof(int ), __alignof__(int ), sizeof(int ), __alignof__(int ), ((void *(*)(void *, void *))___operator_assign__Fi_Pii_intrinsic___1), ((void (*)(void *))___constructor__F_Pi_intrinsic___1), ((void (*)(void *, void *))___constructor__F_Pii_intrinsic___1), ((void (*)(void *))___destructor__F_Pi_intrinsic___1), ((int (*)(void *, void *))___operator_less__Fi_ii_intrinsic___1), ((void *(*)(void *, void *))___operator_assign__Fi_Pii_intrinsic___1), ((void (*)(void *))___constructor__F_Pi_intrinsic___1), ((void (*)(void *, void *))___constructor__F_Pii_intrinsic___1), ((void (*)(void *))___destructor__F_Pi_intrinsic___1), (&__imap__P5stree_2), (&_temp7), (&_temp8))) , _tmp_cp_ret2));
+     ^
+/tmp/cck003yV.i:1191:5: note: expected 'void **' but argument is of type 'struct _conc_tree0 **'
+ int __insert__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0t1__1(void (*_adapterF_P2tV2tV__MP)(void (*)(), void *, void *), void (*_adapterF2tV_P2tV2tV_P_MP)(void (*)(), void *, void *, void *), int (*_adapterFi_2tK2tK_M_PP)(void (*)(), void *, void *), void (*_adapterF_P2tK2tK__MP)(void (*)(), void *, void *), void (*_adapterF2tK_P2tK2tK_P_MP)(void (*)(), void *, void *, void *), long unsigned int _sizeof_2tK, long unsigned int _alignof_2tK, long unsigned int _sizeof_2tV, long unsigned int _alignof_2tV, void *(*___operator_assign__PF2tK_P2tK2tK__1)(void *, void *), void (*___constructor__PF_P2tK__1)(void *), void (*___constructor__PF_P2tK2tK__1)(void *, void *), void (*___destructor__PF_P2tK__1)(void *), int (*___operator_less__PFi_2tK2tK__1)(void *, void *), void *(*___operator_assign__PF2tV_P2tV2tV__1)(void *, void *), void (*___constructor__PF_P2tV__1)(void *), void (*___constructor__PF_P2tV2tV__1)(void *, void *), void (*___destructor__PF_P2tV__1)(void *), void **__t__PP5stree_1, void *__key__2tK_1, void *__value__2tV_1);
+     ^
+/tmp/cck003yV.i:1267:5: warning: passing argument 19 of '__remove__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0__1' from incompatible pointer type [enabled by default]
+     ((void)((_tmp_cp_ret9=__remove__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0__1(_adapterF_Pii__MP, _adapterFi_Pii_P_MP, _adapterFi_ii_M_PP, _adapterF_Pii__MP, _adapterFi_Pii_P_MP, sizeof(int ), __alignof__(int ), sizeof(int ), __alignof__(int ), ((void *(*)(void *, void *))___operator_assign__Fi_Pii_intrinsic___1), ((void (*)(void *))___constructor__F_Pi_intrinsic___1), ((void (*)(void *, void *))___constructor__F_Pii_intrinsic___1), ((void (*)(void *))___destructor__F_Pi_intrinsic___1), ((int (*)(void *, void *))___operator_less__Fi_ii_intrinsic___1), ((void *(*)(void *, void *))___operator_assign__Fi_Pii_intrinsic___1), ((void (*)(void *))___constructor__F_Pi_intrinsic___1), ((void (*)(void *, void *))___constructor__F_Pii_intrinsic___1), ((void (*)(void *))___destructor__F_Pi_intrinsic___1), (&__imap__P5stree_2), (&_temp12))) , _tmp_cp_ret9));
+     ^
+/tmp/cck003yV.i:1192:5: note: expected 'void **' but argument is of type 'struct _conc_tree0 **'
+ int __remove__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0__1(void (*_adapterF_P2tV2tV__MP)(void (*)(), void *, void *), void (*_adapterF2tV_P2tV2tV_P_MP)(void (*)(), void *, void *, void *), int (*_adapterFi_2tK2tK_M_PP)(void (*)(), void *, void *), void (*_adapterF_P2tK2tK__MP)(void (*)(), void *, void *), void (*_adapterF2tK_P2tK2tK_P_MP)(void (*)(), void *, void *, void *), long unsigned int _sizeof_2tK, long unsigned int _alignof_2tK, long unsigned int _sizeof_2tV, long unsigned int _alignof_2tV, void *(*___operator_assign__PF2tK_P2tK2tK__1)(void *, void *), void (*___constructor__PF_P2tK__1)(void *), void (*___constructor__PF_P2tK2tK__1)(void *, void *), void (*___destructor__PF_P2tK__1)(void *), int (*___operator_less__PFi_2tK2tK__1)(void *, void *), void *(*___operator_assign__PF2tV_P2tV2tV__1)(void *, void *), void (*___constructor__PF_P2tV__1)(void *), void (*___constructor__PF_P2tV2tV__1)(void *, void *), void (*___destructor__PF_P2tV__1)(void *), void **__t__PP5stree_1, void *__key__2tK_1);
+     ^
+/tmp/cck003yV.i:1324:5: warning: passing argument 19 of '__insert__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0t1__1' from incompatible pointer type [enabled by default]
+     ((void)((_tmp_cp_ret11=__insert__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0t1__1(_adapterF_PPcPc__MP, _adapterFPc_PPcPc_P_MP, _adapterFi_ii_M_PP, _adapterF_Pii__MP, _adapterFi_Pii_P_MP, sizeof(int ), __alignof__(int ), sizeof(char *), __alignof__(char *), ((void *(*)(void *, void *))___operator_assign__Fi_Pii_intrinsic___1), ((void (*)(void *))___constructor__F_Pi_intrinsic___1), ((void (*)(void *, void *))___constructor__F_Pii_intrinsic___1), ((void (*)(void *))___destructor__F_Pi_intrinsic___1), ((int (*)(void *, void *))___operator_less__Fi_ii_intrinsic___1), ((void *(*)(void *, void *))(&_thunk5)), ((void (*)(void *))(&_thunk6)), ((void (*)(void *, void *))(&_thunk7)), ((void (*)(void *))(&_thunk8)), (&__smap__P5stree_2), (&_temp15), (&_temp16))) , _tmp_cp_ret11));
+     ^
+/tmp/cck003yV.i:1191:5: note: expected 'void **' but argument is of type 'struct _conc_tree1 **'
+ int __insert__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0t1__1(void (*_adapterF_P2tV2tV__MP)(void (*)(), void *, void *), void (*_adapterF2tV_P2tV2tV_P_MP)(void (*)(), void *, void *, void *), int (*_adapterFi_2tK2tK_M_PP)(void (*)(), void *, void *), void (*_adapterF_P2tK2tK__MP)(void (*)(), void *, void *), void (*_adapterF2tK_P2tK2tK_P_MP)(void (*)(), void *, void *, void *), long unsigned int _sizeof_2tK, long unsigned int _alignof_2tK, long unsigned int _sizeof_2tV, long unsigned int _alignof_2tV, void *(*___operator_assign__PF2tK_P2tK2tK__1)(void *, void *), void (*___constructor__PF_P2tK__1)(void *), void (*___constructor__PF_P2tK2tK__1)(void *, void *), void (*___destructor__PF_P2tK__1)(void *), int (*___operator_less__PFi_2tK2tK__1)(void *, void *), void *(*___operator_assign__PF2tV_P2tV2tV__1)(void *, void *), void (*___constructor__PF_P2tV__1)(void *), void (*___constructor__PF_P2tV2tV__1)(void *, void *), void (*___destructor__PF_P2tV__1)(void *), void **__t__PP5stree_1, void *__key__2tK_1, void *__value__2tV_1);
+     ^
+/tmp/cck003yV.i:1343:5: warning: passing argument 19 of '__insert__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0t1__1' from incompatible pointer type [enabled by default]
+     ((void)((_tmp_cp_ret12=__insert__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0t1__1(_adapterF_PPcPc__MP, _adapterFPc_PPcPc_P_MP, _adapterFi_ii_M_PP, _adapterF_Pii__MP, _adapterFi_Pii_P_MP, sizeof(int ), __alignof__(int ), sizeof(char *), __alignof__(char *), ((void *(*)(void *, void *))___operator_assign__Fi_Pii_intrinsic___1), ((void (*)(void *))___constructor__F_Pi_intrinsic___1), ((void (*)(void *, void *))___constructor__F_Pii_intrinsic___1), ((void (*)(void *))___destructor__F_Pi_intrinsic___1), ((int (*)(void *, void *))___operator_less__Fi_ii_intrinsic___1), ((void *(*)(void *, void *))(&_thunk9)), ((void (*)(void *))(&_thunk10)), ((void (*)(void *, void *))(&_thunk11)), ((void (*)(void *))(&_thunk12)), (&__smap__P5stree_2), (&_temp17), (&_temp18))) , _tmp_cp_ret12));
+     ^
+/tmp/cck003yV.i:1191:5: note: expected 'void **' but argument is of type 'struct _conc_tree1 **'
+ int __insert__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0t1__1(void (*_adapterF_P2tV2tV__MP)(void (*)(), void *, void *), void (*_adapterF2tV_P2tV2tV_P_MP)(void (*)(), void *, void *, void *), int (*_adapterFi_2tK2tK_M_PP)(void (*)(), void *, void *), void (*_adapterF_P2tK2tK__MP)(void (*)(), void *, void *), void (*_adapterF2tK_P2tK2tK_P_MP)(void (*)(), void *, void *, void *), long unsigned int _sizeof_2tK, long unsigned int _alignof_2tK, long unsigned int _sizeof_2tV, long unsigned int _alignof_2tV, void *(*___operator_assign__PF2tK_P2tK2tK__1)(void *, void *), void (*___constructor__PF_P2tK__1)(void *), void (*___constructor__PF_P2tK2tK__1)(void *, void *), void (*___destructor__PF_P2tK__1)(void *), int (*___operator_less__PFi_2tK2tK__1)(void *, void *), void *(*___operator_assign__PF2tV_P2tV2tV__1)(void *, void *), void (*___constructor__PF_P2tV__1)(void *), void (*___constructor__PF_P2tV2tV__1)(void *, void *), void (*___destructor__PF_P2tV__1)(void *), void **__t__PP5stree_1, void *__key__2tK_1, void *__value__2tV_1);
+     ^
+/tmp/cck003yV.i:1470:5: warning: passing argument 19 of '__remove__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0__1' from incompatible pointer type [enabled by default]
+     ((void)((_tmp_cp_ret19=__remove__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0__1(_adapterF_PPcPc__MP, _adapterFPc_PPcPc_P_MP, _adapterFi_ii_M_PP, _adapterF_Pii__MP, _adapterFi_Pii_P_MP, sizeof(int ), __alignof__(int ), sizeof(char *), __alignof__(char *), ((void *(*)(void *, void *))___operator_assign__Fi_Pii_intrinsic___1), ((void (*)(void *))___constructor__F_Pi_intrinsic___1), ((void (*)(void *, void *))___constructor__F_Pii_intrinsic___1), ((void (*)(void *))___destructor__F_Pi_intrinsic___1), ((int (*)(void *, void *))___operator_less__Fi_ii_intrinsic___1), ((void *(*)(void *, void *))(&_thunk41)), ((void (*)(void *))(&_thunk42)), ((void (*)(void *, void *))(&_thunk43)), ((void (*)(void *))(&_thunk44)), (&__smap__P5stree_2), (&_temp22))) , _tmp_cp_ret19));
+     ^
+/tmp/cck003yV.i:1192:5: note: expected 'void **' but argument is of type 'struct _conc_tree1 **'
+ int __remove__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0__1(void (*_adapterF_P2tV2tV__MP)(void (*)(), void *, void *), void (*_adapterF2tV_P2tV2tV_P_MP)(void (*)(), void *, void *, void *), int (*_adapterFi_2tK2tK_M_PP)(void (*)(), void *, void *), void (*_adapterF_P2tK2tK__MP)(void (*)(), void *, void *), void (*_adapterF2tK_P2tK2tK_P_MP)(void (*)(), void *, void *, void *), long unsigned int _sizeof_2tK, long unsigned int _alignof_2tK, long unsigned int _sizeof_2tV, long unsigned int _alignof_2tV, void *(*___operator_assign__PF2tK_P2tK2tK__1)(void *, void *), void (*___constructor__PF_P2tK__1)(void *), void (*___constructor__PF_P2tK2tK__1)(void *, void *), void (*___destructor__PF_P2tK__1)(void *), int (*___operator_less__PFi_2tK2tK__1)(void *, void *), void *(*___operator_assign__PF2tV_P2tV2tV__1)(void *, void *), void (*___constructor__PF_P2tV__1)(void *), void (*___constructor__PF_P2tV2tV__1)(void *, void *), void (*___destructor__PF_P2tV__1)(void *), void **__t__PP5stree_1, void *__key__2tK_1);
+     ^
+/tmp/cck003yV.i:1567:5: warning: passing argument 19 of '__insert__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0t1__1' from incompatible pointer type [enabled by default]
+     ((void)((_tmp_cp_ret22=__insert__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0t1__1(_adapterF_PPcPc__MP, _adapterFPc_PPcPc_P_MP, _adapterFi_PcPc_M_PP, _adapterF_PPcPc__MP, _adapterFPc_PPcPc_P_MP, sizeof(char *), __alignof__(char *), sizeof(char *), __alignof__(char *), ((void *(*)(void *, void *))(&_thunk58)), ((void (*)(void *))(&_thunk59)), ((void (*)(void *, void *))(&_thunk60)), ((void (*)(void *))(&_thunk61)), ((int (*)(void *, void *))___operator_less__Fi_PcPc__2), ((void *(*)(void *, void *))(&_thunk62)), ((void (*)(void *))(&_thunk63)), ((void (*)(void *, void *))(&_thunk64)), ((void (*)(void *))(&_thunk65)), (&__ssmap__P5stree_2), (&_temp25), (&_temp26))) , _tmp_cp_ret22));
+     ^
+/tmp/cck003yV.i:1191:5: note: expected 'void **' but argument is of type 'struct _conc_tree2 **'
+ int __insert__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0t1__1(void (*_adapterF_P2tV2tV__MP)(void (*)(), void *, void *), void (*_adapterF2tV_P2tV2tV_P_MP)(void (*)(), void *, void *, void *), int (*_adapterFi_2tK2tK_M_PP)(void (*)(), void *, void *), void (*_adapterF_P2tK2tK__MP)(void (*)(), void *, void *), void (*_adapterF2tK_P2tK2tK_P_MP)(void (*)(), void *, void *, void *), long unsigned int _sizeof_2tK, long unsigned int _alignof_2tK, long unsigned int _sizeof_2tV, long unsigned int _alignof_2tV, void *(*___operator_assign__PF2tK_P2tK2tK__1)(void *, void *), void (*___constructor__PF_P2tK__1)(void *), void (*___constructor__PF_P2tK2tK__1)(void *, void *), void (*___destructor__PF_P2tK__1)(void *), int (*___operator_less__PFi_2tK2tK__1)(void *, void *), void *(*___operator_assign__PF2tV_P2tV2tV__1)(void *, void *), void (*___constructor__PF_P2tV__1)(void *), void (*___constructor__PF_P2tV2tV__1)(void *, void *), void (*___destructor__PF_P2tV__1)(void *), void **__t__PP5stree_1, void *__key__2tK_1, void *__value__2tV_1);
+     ^
+/tmp/cck003yV.i:1598:5: warning: passing argument 19 of '__insert__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0t1__1' from incompatible pointer type [enabled by default]
+     ((void)((_tmp_cp_ret23=__insert__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0t1__1(_adapterF_PPcPc__MP, _adapterFPc_PPcPc_P_MP, _adapterFi_PcPc_M_PP, _adapterF_PPcPc__MP, _adapterFPc_PPcPc_P_MP, sizeof(char *), __alignof__(char *), sizeof(char *), __alignof__(char *), ((void *(*)(void *, void *))(&_thunk66)), ((void (*)(void *))(&_thunk67)), ((void (*)(void *, void *))(&_thunk68)), ((void (*)(void *))(&_thunk69)), ((int (*)(void *, void *))___operator_less__Fi_PcPc__2), ((void *(*)(void *, void *))(&_thunk70)), ((void (*)(void *))(&_thunk71)), ((void (*)(void *, void *))(&_thunk72)), ((void (*)(void *))(&_thunk73)), (&__ssmap__P5stree_2), (&_temp27), (&_temp28))) , _tmp_cp_ret23));
+     ^
+/tmp/cck003yV.i:1191:5: note: expected 'void **' but argument is of type 'struct _conc_tree2 **'
+ int __insert__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0t1__1(void (*_adapterF_P2tV2tV__MP)(void (*)(), void *, void *), void (*_adapterF2tV_P2tV2tV_P_MP)(void (*)(), void *, void *, void *), int (*_adapterFi_2tK2tK_M_PP)(void (*)(), void *, void *), void (*_adapterF_P2tK2tK__MP)(void (*)(), void *, void *), void (*_adapterF2tK_P2tK2tK_P_MP)(void (*)(), void *, void *, void *), long unsigned int _sizeof_2tK, long unsigned int _alignof_2tK, long unsigned int _sizeof_2tV, long unsigned int _alignof_2tV, void *(*___operator_assign__PF2tK_P2tK2tK__1)(void *, void *), void (*___constructor__PF_P2tK__1)(void *), void (*___constructor__PF_P2tK2tK__1)(void *, void *), void (*___destructor__PF_P2tK__1)(void *), int (*___operator_less__PFi_2tK2tK__1)(void *, void *), void *(*___operator_assign__PF2tV_P2tV2tV__1)(void *, void *), void (*___constructor__PF_P2tV__1)(void *), void (*___constructor__PF_P2tV2tV__1)(void *, void *), void (*___destructor__PF_P2tV__1)(void *), void **__t__PP5stree_1, void *__key__2tK_1, void *__value__2tV_1);
+     ^
+/tmp/cck003yV.i:1785:5: warning: passing argument 19 of '__remove__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0__1' from incompatible pointer type [enabled by default]
+     ((void)((_tmp_cp_ret30=__remove__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0__1(_adapterF_PPcPc__MP, _adapterFPc_PPcPc_P_MP, _adapterFi_PcPc_M_PP, _adapterF_PPcPc__MP, _adapterFPc_PPcPc_P_MP, sizeof(char *), __alignof__(char *), sizeof(char *), __alignof__(char *), ((void *(*)(void *, void *))(&_thunk118)), ((void (*)(void *))(&_thunk119)), ((void (*)(void *, void *))(&_thunk120)), ((void (*)(void *))(&_thunk121)), ((int (*)(void *, void *))___operator_less__Fi_PcPc__2), ((void *(*)(void *, void *))(&_thunk122)), ((void (*)(void *))(&_thunk123)), ((void (*)(void *, void *))(&_thunk124)), ((void (*)(void *))(&_thunk125)), (&__ssmap__P5stree_2), (&_temp32))) , _tmp_cp_ret30));
+     ^
+/tmp/cck003yV.i:1192:5: note: expected 'void **' but argument is of type 'struct _conc_tree2 **'
+ int __remove__A2_0_0____operator_assign__PFt0_Pt0t0____constructor__PF_Pt0____constructor__PF_Pt0t0____destructor__PF_Pt0____operator_less__PFi_t0t0____operator_assign__PFt1_Pt1t1____constructor__PF_Pt1____constructor__PF_Pt1t1____destructor__PF_Pt1__Fi_PP5street0__1(void (*_adapterF_P2tV2tV__MP)(void (*)(), void *, void *), void (*_adapterF2tV_P2tV2tV_P_MP)(void (*)(), void *, void *, void *), int (*_adapterFi_2tK2tK_M_PP)(void (*)(), void *, void *), void (*_adapterF_P2tK2tK__MP)(void (*)(), void *, void *), void (*_adapterF2tK_P2tK2tK_P_MP)(void (*)(), void *, void *, void *), long unsigned int _sizeof_2tK, long unsigned int _alignof_2tK, long unsigned int _sizeof_2tV, long unsigned int _alignof_2tV, void *(*___operator_assign__PF2tK_P2tK2tK__1)(void *, void *), void (*___constructor__PF_P2tK__1)(void *), void (*___constructor__PF_P2tK2tK__1)(void *, void *), void (*___destructor__PF_P2tK__1)(void *), int (*___operator_less__PFi_2tK2tK__1)(void *, void *), void *(*___operator_assign__PF2tV_P2tV2tV__1)(void *, void *), void (*___constructor__PF_P2tV__1)(void *), void (*___constructor__PF_P2tV2tV__1)(void *, void *), void (*___destructor__PF_P2tV__1)(void *), void **__t__PP5stree_1, void *__key__2tK_1);
+     ^
+mv -f .deps/avl1.Tpo .deps/avl1.Po
+mv -f .deps/avl_test.Tpo .deps/avl_test.Po
+mv -f .deps/avl4.Tpo .deps/avl4.Po
+mv -f .deps/avl2.Tpo .deps/avl2.Po
+mv -f .deps/avl3.Tpo .deps/avl3.Po
+mv -f .deps/avl-private.Tpo .deps/avl-private.Po
+/usr/local/bin/cfa  -g -Wall -Wno-unused-function    -o avl_test avl_test.o avl0.o avl1.o avl2.o avl3.o avl4.o avl-private.o  
+CFA Version 1.0.0 (debug)
+3 13 0
+foo bar baz
+world bar cheese
Index: src/tests/.expect/vector_test.txt
===================================================================
--- src/tests/.expect/vector_test.txt	(revision 1c31f681ccd8499a1803e510a302bdfd289ce990)
+++ src/tests/.expect/vector_test.txt	(revision 1c31f681ccd8499a1803e510a302bdfd289ce990)
@@ -0,0 +1,2 @@
+make: *** No rule to make target `vector_int.c', needed by `vector_int.o'.  Stop.
+/bin/sh: ./vector_test: Is a directory
Index: src/tests/Makefile.am
===================================================================
--- src/tests/Makefile.am	(revision efc1591827fc083d82be64f59cd21ba24b32492d)
+++ src/tests/Makefile.am	(revision 1c31f681ccd8499a1803e510a302bdfd289ce990)
@@ -21,4 +21,4 @@
 noinst_PROGRAMS = fstream_test vector_test avl_test # build but do not install
 fstream_test_SOURCES = fstream_test.c
-vector_test_SOURCES = vector_int.c array.c vector_test.c
+vector_test_SOURCES = vector/vector_int.c vector/array.c vector/vector_test.c
 avl_test_SOURCES = avltree/avl_test.c avltree/avl0.c avltree/avl1.c avltree/avl2.c avltree/avl3.c avltree/avl4.c avltree/avl-private.c
Index: src/tests/array.c
===================================================================
--- src/tests/array.c	(revision efc1591827fc083d82be64f59cd21ba24b32492d)
+++ 	(revision )
@@ -1,41 +1,0 @@
-//
-// 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.
-//
-// array.c --
-//
-// Author           : Richard C. Bilson
-// Created On       : Wed May 27 17:56:53 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Wed Apr 27 17:21:52 2016
-// Update Count     : 3
-//
-
-#include "array.h"
-
-/// forall( otype array_type, elt_type | bounded_array( array_type, elt_type ) )
-/// [ array_iterator begin, array_iterator end ]
-/// get_iterators( array_type array )
-/// {
-///   begin = 0;
-///   end = last( array );
-/// }
-
-// The first element is always at index 0.
-forall( otype array_type, otype elt_type | bounded_array( array_type, elt_type ) )
-elt_type * begin( array_type * array ) {
-	return &array[ 0 ];
-}
-
-// The end iterator should point one past the last element.
-forall( otype array_type, otype elt_type | bounded_array( array_type, elt_type ) )
-elt_type * end( array_type * array ) {
-	return &array[ last( array ) ] + 1;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa array.c" //
-// End: //
Index: src/tests/array.h
===================================================================
--- src/tests/array.h	(revision efc1591827fc083d82be64f59cd21ba24b32492d)
+++ 	(revision )
@@ -1,54 +1,0 @@
-//
-// 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.
-//
-// array.h --
-//
-// Author           : Richard C. Bilson
-// Created On       : Wed May 27 17:56:53 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Wed Apr 27 17:26:04 2016
-// Update Count     : 5
-//
-
-#ifndef ARRAY_H
-#define ARRAY_H
-
-//#include <iterator>
-
-// An array has contiguous elements accessible in any order using integer indicies. The first
-// element has index 0.
-trait array( otype array_type, otype elt_type ) {
-	lvalue elt_type ?[?]( array_type, int );
-};
-
-// A bounded array is an array that carries its maximum index with it.
-trait bounded_array( otype array_type, otype elt_type | array( array_type *, elt_type ) ) {
-	int last( array_type * );
-};
-
-// implement iterator_for
-
-typedef int array_iterator;
-
-/// forall( otype array_type, elt_type | bounded_array( array_type, elt_type ) )
-/// [ array_iterator begin, array_iterator end ] get_iterators( array_type );
-
-
-// A bounded array can be iterated over by using a pointer to the element type. These functions
-// return iterators corresponding to the first element and the one-past-the-end element, STL-style.
-forall( otype array_type, otype elt_type | bounded_array( array_type, elt_type ) )
-elt_type * begin( array_type * array );
-
-// The end iterator should point one past the last element.
-forall( otype array_type, otype elt_type | bounded_array( array_type, elt_type ) )
-elt_type * end( array_type * array );
-
-#endif // ARRAY_H
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa array.c" //
-// End: //
Index: src/tests/runTests.sh
===================================================================
--- src/tests/runTests.sh	(revision efc1591827fc083d82be64f59cd21ba24b32492d)
+++ src/tests/runTests.sh	(revision 1c31f681ccd8499a1803e510a302bdfd289ce990)
@@ -26,40 +26,47 @@
 # current directory named the same; should also be an input file
 # tests/$test.in.txt and expected output tests/$test.out.txt
+# tests="vector_test avl_test"
+#
+# # log file for test output;
+# # reset at the beginning of each run
+# logfile=tests/log.txt
+# touch $logfile && rm $logfile
+#
+# # clean existing build artifacts before run
+# make clean > /dev/null 2>&1
+#
+# ret_val=0
+#
+# for test in $tests; do
+# 	echo -n "    $test" | tee -a $logfile
+#
+# 	# build, skipping to next test on error
+# 	if ! make -j 8 $test > tests/$test.make.txt 2>&1; then
+# 		ret_val=1
+# 		echo -e "\tFAILED with build error:" | tee -a $logfile
+# 		cat tests/$test.make.txt | tee -a $logfile
+# 		continue
+# 	fi
+# 	rm tests/$test.make.txt
+#
+# 	# run, testing against expected output
+# 	./$test < tests/$test.in.txt > tests/$test.run.txt 2>&1
+# 	if ! diff tests/$test.out.txt tests/$test.run.txt > tests/$test.diff.txt; then
+# 		ret_val=1
+# 		echo -e "\tFAILED with output mismatch:" | tee -a $logfile
+# 		cat tests/$test.diff.txt | tee -a $logfile
+# 		continue
+# 	fi
+# 	rm tests/$test.run.txt tests/$test.diff.txt ./$test
+#
+# 	echo -e "\tPASSED" | tee -a $logfile
+# done
+#
+# exit $((ret_val))
+
 tests="vector_test avl_test"
 
-# log file for test output;
-# reset at the beginning of each run
-logfile=tests/log.txt
-touch $logfile && rm $logfile
-
-# clean existing build artifacts before run
-make clean > /dev/null 2>&1
+python test.py ${tests}
 
 ret_val=0
-
-for test in $tests; do
-	echo -n "    $test" | tee -a $logfile
-
-	# build, skipping to next test on error
-	if ! make -j 8 $test > tests/$test.make.txt 2>&1; then
-		ret_val=1
-		echo -e "\tFAILED with build error:" | tee -a $logfile
-		cat tests/$test.make.txt | tee -a $logfile
-		continue
-	fi
-	rm tests/$test.make.txt
-
-	# run, testing against expected output
-	./$test < tests/$test.in.txt > tests/$test.run.txt 2>&1
-	if ! diff tests/$test.out.txt tests/$test.run.txt > tests/$test.diff.txt; then
-		ret_val=1
-		echo -e "\tFAILED with output mismatch:" | tee -a $logfile
-		cat tests/$test.diff.txt | tee -a $logfile
-		continue
-	fi
-	rm tests/$test.run.txt tests/$test.diff.txt ./$test
-
-	echo -e "\tPASSED" | tee -a $logfile
-done
-
 exit $((ret_val))
Index: src/tests/test.py
===================================================================
--- src/tests/test.py	(revision efc1591827fc083d82be64f59cd21ba24b32492d)
+++ src/tests/test.py	(revision 1c31f681ccd8499a1803e510a302bdfd289ce990)
@@ -133,13 +133,4 @@
 		sys.exit(1)
 
-	unkownTests = False
-	for test in options.tests :
-		if not (test in tests) :
-			print("ERROR: unkown test %s" % test)
-			unkownTests = true
-
-	if unkownTests :
-		sys.exit(1)
-
 	if options.generate_expected :
 		generate_expect( options.tests )
Index: src/tests/vector/array.c
===================================================================
--- src/tests/vector/array.c	(revision 1c31f681ccd8499a1803e510a302bdfd289ce990)
+++ src/tests/vector/array.c	(revision 1c31f681ccd8499a1803e510a302bdfd289ce990)
@@ -0,0 +1,41 @@
+//
+// 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.
+//
+// array.c --
+//
+// Author           : Richard C. Bilson
+// Created On       : Wed May 27 17:56:53 2015
+// Last Modified By : Rob Schluntz
+// Last Modified On : Wed Apr 27 17:21:52 2016
+// Update Count     : 3
+//
+
+#include "array.h"
+
+/// forall( otype array_type, elt_type | bounded_array( array_type, elt_type ) )
+/// [ array_iterator begin, array_iterator end ]
+/// get_iterators( array_type array )
+/// {
+///   begin = 0;
+///   end = last( array );
+/// }
+
+// The first element is always at index 0.
+forall( otype array_type, otype elt_type | bounded_array( array_type, elt_type ) )
+elt_type * begin( array_type * array ) {
+	return &array[ 0 ];
+}
+
+// The end iterator should point one past the last element.
+forall( otype array_type, otype elt_type | bounded_array( array_type, elt_type ) )
+elt_type * end( array_type * array ) {
+	return &array[ last( array ) ] + 1;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa array.c" //
+// End: //
Index: src/tests/vector/array.h
===================================================================
--- src/tests/vector/array.h	(revision 1c31f681ccd8499a1803e510a302bdfd289ce990)
+++ src/tests/vector/array.h	(revision 1c31f681ccd8499a1803e510a302bdfd289ce990)
@@ -0,0 +1,54 @@
+//
+// 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.
+//
+// array.h --
+//
+// Author           : Richard C. Bilson
+// Created On       : Wed May 27 17:56:53 2015
+// Last Modified By : Rob Schluntz
+// Last Modified On : Wed Apr 27 17:26:04 2016
+// Update Count     : 5
+//
+
+#ifndef ARRAY_H
+#define ARRAY_H
+
+//#include <iterator>
+
+// An array has contiguous elements accessible in any order using integer indicies. The first
+// element has index 0.
+trait array( otype array_type, otype elt_type ) {
+	lvalue elt_type ?[?]( array_type, int );
+};
+
+// A bounded array is an array that carries its maximum index with it.
+trait bounded_array( otype array_type, otype elt_type | array( array_type *, elt_type ) ) {
+	int last( array_type * );
+};
+
+// implement iterator_for
+
+typedef int array_iterator;
+
+/// forall( otype array_type, elt_type | bounded_array( array_type, elt_type ) )
+/// [ array_iterator begin, array_iterator end ] get_iterators( array_type );
+
+
+// A bounded array can be iterated over by using a pointer to the element type. These functions
+// return iterators corresponding to the first element and the one-past-the-end element, STL-style.
+forall( otype array_type, otype elt_type | bounded_array( array_type, elt_type ) )
+elt_type * begin( array_type * array );
+
+// The end iterator should point one past the last element.
+forall( otype array_type, otype elt_type | bounded_array( array_type, elt_type ) )
+elt_type * end( array_type * array );
+
+#endif // ARRAY_H
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa array.c" //
+// End: //
Index: src/tests/vector/vector_int.c
===================================================================
--- src/tests/vector/vector_int.c	(revision 1c31f681ccd8499a1803e510a302bdfd289ce990)
+++ src/tests/vector/vector_int.c	(revision 1c31f681ccd8499a1803e510a302bdfd289ce990)
@@ -0,0 +1,77 @@
+//
+// 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.
+//
+// vector_int.c --
+//
+// Author           : Richard C. Bilson
+// Created On       : Wed May 27 17:56:53 2015
+// Last Modified By : Rob Schluntz
+// Last Modified On : Wed Apr 27 17:27:12 2016
+// Update Count     : 3
+//
+
+#include "vector_int.h"
+extern "C" {
+#include <stdlib.h>
+#include <assert.h>
+}
+
+#define DEFAULT_CAPACITY 20
+
+void ?{}( vector_int * vec ) {
+	vec { DEFAULT_CAPACITY };
+}
+
+void ?{}( vector_int * vec, int reserve ) {
+	vec->last = -1;
+	vec->capacity = reserve;
+	vec->data = malloc( sizeof( int ) * reserve );
+}
+
+void ?{}( vector_int * vec, vector_int other ) {
+	vec->last = other.last;
+	vec->capacity = other.capacity;
+	vec->data = malloc( sizeof( int ) * other.capacity );
+	for (int i = 0; i < vec->last; i++) {
+		vec->data[i] = other.data[i];
+	}
+}
+
+void ^?{}( vector_int * vec ) {
+	free( vec->data );
+}
+
+void reserve( vector_int *vec, int reserve ) {
+	if ( reserve > vec->capacity ) {
+		vec->data = realloc( vec->data, sizeof( int ) * reserve );
+		vec->capacity = reserve;
+	}
+}
+
+void append( vector_int *vec, int element ) {
+	vec->last++;
+	if ( vec->last == vec->capacity ) {
+		vec->capacity *= 2;
+		vec->data = realloc( vec->data, sizeof( int ) * vec->capacity );
+	}
+	vec->data[ vec->last ] = element;
+}
+
+// implement bounded_array
+
+lvalue int ?[?]( vector_int * vec, int index ) {
+	return vec->data[ index ];
+}
+
+int last( vector_int * vec ) {
+	return vec->last;
+}
+
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa vector_int.c" //
+// End: //
Index: src/tests/vector/vector_int.h
===================================================================
--- src/tests/vector/vector_int.h	(revision 1c31f681ccd8499a1803e510a302bdfd289ce990)
+++ src/tests/vector/vector_int.h	(revision 1c31f681ccd8499a1803e510a302bdfd289ce990)
@@ -0,0 +1,45 @@
+//
+// 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.
+//
+// vector_int.h --
+//
+// Author           : Richard C. Bilson
+// Created On       : Wed May 27 17:56:53 2015
+// Last Modified By : Rob Schluntz
+// Last Modified On : Wed Apr 27 17:26:59 2016
+// Update Count     : 2
+//
+
+#ifndef VECTOR_INT_H
+#define VECTOR_INT_H
+
+// A flexible array, similar to a C++ vector, that holds integers and can be resized dynamically
+
+typedef struct vector_int {
+	int last;											// last used index
+	int capacity;										// last possible index before reallocation
+	int *data;											// array
+} vector_int;
+
+void ?{}( vector_int * );								// allocate vector with default capacity
+void ?{}( vector_int *, int reserve );          // allocate vector with specified capacity
+void ?{}( vector_int * vec, vector_int other ); // copy constructor
+void ^?{}( vector_int * );								// deallocate vector's storage
+
+void reserve( vector_int *vec, int reserve );			// reserve more capacity
+void append( vector_int *vec, int element );			// add element to end of vector, resizing as necessary
+
+// implement bounded_array
+
+lvalue int ?[?]( vector_int * vec, int index );			// access to arbitrary element (does not resize)
+int last( vector_int * vec );								// return last element
+
+#endif // VECTOR_INT_H
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa vector_int.c" //
+// End: //
Index: src/tests/vector/vector_test.c
===================================================================
--- src/tests/vector/vector_test.c	(revision 1c31f681ccd8499a1803e510a302bdfd289ce990)
+++ src/tests/vector/vector_test.c	(revision 1c31f681ccd8499a1803e510a302bdfd289ce990)
@@ -0,0 +1,47 @@
+//
+// 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.
+//
+// vector_test.c --
+//
+// Author           : Richard C. Bilson
+// Created On       : Wed May 27 17:56:53 2015
+// Last Modified By : Rob Schluntz
+// Last Modified On : Wed Apr 27 17:31:27 2016
+// Update Count     : 18
+//
+
+#include <fstream>
+#include <iterator>
+#include "vector_int.h"
+#include "array.h"
+
+int main( void ) {
+	vector_int vec;
+
+	// read in numbers until EOF or error
+	int num;
+
+	sout | "enter N elements and C-d on a separate line:" | endl;
+	for ( ;; ) {
+		sin | &num;
+	  if ( fail( sin ) || eof( sin ) ) break;
+		append( &vec, num );
+	}
+	// write out the numbers
+
+	sout | "Array elements:" | endl;
+	write( begin( &vec ), end( &vec ), sout );
+	sout | endl;
+
+	sout | "Array elements reversed:" | endl;
+	write_reverse( begin( &vec ), end( &vec ), sout );
+	sout | endl;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa vector_test.c vector_int.o array.o" //
+// End: //
Index: src/tests/vector_int.c
===================================================================
--- src/tests/vector_int.c	(revision efc1591827fc083d82be64f59cd21ba24b32492d)
+++ 	(revision )
@@ -1,77 +1,0 @@
-//
-// 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.
-//
-// vector_int.c --
-//
-// Author           : Richard C. Bilson
-// Created On       : Wed May 27 17:56:53 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Wed Apr 27 17:27:12 2016
-// Update Count     : 3
-//
-
-#include "vector_int.h"
-extern "C" {
-#include <stdlib.h>
-#include <assert.h>
-}
-
-#define DEFAULT_CAPACITY 20
-
-void ?{}( vector_int * vec ) {
-	vec { DEFAULT_CAPACITY };
-}
-
-void ?{}( vector_int * vec, int reserve ) {
-	vec->last = -1;
-	vec->capacity = reserve;
-	vec->data = malloc( sizeof( int ) * reserve );
-}
-
-void ?{}( vector_int * vec, vector_int other ) {
-	vec->last = other.last;
-	vec->capacity = other.capacity;
-	vec->data = malloc( sizeof( int ) * other.capacity );
-	for (int i = 0; i < vec->last; i++) {
-		vec->data[i] = other.data[i];
-	}
-}
-
-void ^?{}( vector_int * vec ) {
-	free( vec->data );
-}
-
-void reserve( vector_int *vec, int reserve ) {
-	if ( reserve > vec->capacity ) {
-		vec->data = realloc( vec->data, sizeof( int ) * reserve );
-		vec->capacity = reserve;
-	}
-}
-
-void append( vector_int *vec, int element ) {
-	vec->last++;
-	if ( vec->last == vec->capacity ) {
-		vec->capacity *= 2;
-		vec->data = realloc( vec->data, sizeof( int ) * vec->capacity );
-	}
-	vec->data[ vec->last ] = element;
-}
-
-// implement bounded_array
-
-lvalue int ?[?]( vector_int * vec, int index ) {
-	return vec->data[ index ];
-}
-
-int last( vector_int * vec ) {
-	return vec->last;
-}
-
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa vector_int.c" //
-// End: //
Index: src/tests/vector_int.h
===================================================================
--- src/tests/vector_int.h	(revision efc1591827fc083d82be64f59cd21ba24b32492d)
+++ 	(revision )
@@ -1,45 +1,0 @@
-//
-// 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.
-//
-// vector_int.h --
-//
-// Author           : Richard C. Bilson
-// Created On       : Wed May 27 17:56:53 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Wed Apr 27 17:26:59 2016
-// Update Count     : 2
-//
-
-#ifndef VECTOR_INT_H
-#define VECTOR_INT_H
-
-// A flexible array, similar to a C++ vector, that holds integers and can be resized dynamically
-
-typedef struct vector_int {
-	int last;											// last used index
-	int capacity;										// last possible index before reallocation
-	int *data;											// array
-} vector_int;
-
-void ?{}( vector_int * );								// allocate vector with default capacity
-void ?{}( vector_int *, int reserve );          // allocate vector with specified capacity
-void ?{}( vector_int * vec, vector_int other ); // copy constructor
-void ^?{}( vector_int * );								// deallocate vector's storage
-
-void reserve( vector_int *vec, int reserve );			// reserve more capacity
-void append( vector_int *vec, int element );			// add element to end of vector, resizing as necessary
-
-// implement bounded_array
-
-lvalue int ?[?]( vector_int * vec, int index );			// access to arbitrary element (does not resize)
-int last( vector_int * vec );								// return last element
-
-#endif // VECTOR_INT_H
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa vector_int.c" //
-// End: //
Index: src/tests/vector_test.c
===================================================================
--- src/tests/vector_test.c	(revision efc1591827fc083d82be64f59cd21ba24b32492d)
+++ 	(revision )
@@ -1,47 +1,0 @@
-//
-// 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.
-//
-// vector_test.c --
-//
-// Author           : Richard C. Bilson
-// Created On       : Wed May 27 17:56:53 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Wed Apr 27 17:31:27 2016
-// Update Count     : 18
-//
-
-#include <fstream>
-#include <iterator>
-#include "vector_int.h"
-#include "array.h"
-
-int main( void ) {
-	vector_int vec;
-
-	// read in numbers until EOF or error
-	int num;
-
-	sout | "enter N elements and C-d on a separate line:" | endl;
-	for ( ;; ) {
-		sin | &num;
-	  if ( fail( sin ) || eof( sin ) ) break;
-		append( &vec, num );
-	}
-	// write out the numbers
-
-	sout | "Array elements:" | endl;
-	write( begin( &vec ), end( &vec ), sout );
-	sout | endl;
-
-	sout | "Array elements reversed:" | endl;
-	write_reverse( begin( &vec ), end( &vec ), sout );
-	sout | endl;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa vector_test.c vector_int.o array.o" //
-// End: //
