Index: benchmark/Makefile.am
===================================================================
--- benchmark/Makefile.am	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ benchmark/Makefile.am	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -11,6 +11,6 @@
 ## Created On       : Sun May 31 09:08:15 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Mon Jan 25 22:31:42 2016
-## Update Count     : 25
+## Last Modified On : Tue Nov  6 09:01:23 2018
+## Update Count     : 26
 ###############################################################################
 
@@ -304,5 +304,5 @@
 
 compile-attributes$(EXEEXT):
-	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/attributes.c
+	@$(CFACOMPILE) -fsyntax-only -w $(testdir)/attributes.cfa
 
 compile-empty$(EXEEXT):
Index: doc/bibliography/pl.bib
===================================================================
--- doc/bibliography/pl.bib	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ doc/bibliography/pl.bib	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -21,22 +21,23 @@
 %  toplas: ACM Trans. on Prog. Lang. & Sys.
 %  tcs: Theoretical Computer Science
-@string{ieeepds="IEEE Transactions on Parallel and Distributed Systems"}
-% @string{ieeepds="IEEE Trans. Parallel Distrib. Syst."}
-@string{ieeese="IEEE Transactions on Software Engineering"}
-% @string{ieeese="IEEE Trans. Softw. Eng."}
-@string{spe="Software---\-Practice and Experience"}
-% @string{spe="Softw. Pract. Exp."}
-@string{ccpe="Concurrency and Computation: Practice and Experience"}
-% @string{ccpe="Concurrency Comput: Pract Experience"}
-@string{sigplan="SIGPLAN Notices"}
-% @string{sigplan="SIGPLAN Not."}
-@string{joop="Journal of Object-Oriented Programming"}
-% @string{joop="J. of Object-Oriented Program."}
+
+string{ieeepds="IEEE Transactions on Parallel and Distributed Systems"}
+@string{ieeepds="IEEE Trans. Parallel Distrib. Syst."}
+string{ieeese="IEEE Transactions on Software Engineering"}
+@string{ieeese="IEEE Trans. Softw. Eng."}
+string{spe="Software---\-Practice and Experience"}
+@string{spe="Softw. Pract. Exper."}
+string{ccpe="Concurrency and Computation: Practice and Experience"}
+@string{ccpe="Concurrency Comput.: Pract. Exper."}
+string{sigplan="SIGPLAN Notices"}
+@string{sigplan="SIGPLAN Not."}
+string{joop="Journal of Object-Oriented Programming"}
+@string{joop="J. of Object-Oriented Program."}
 @string{popl="Conference Record of the ACM Symposium on Principles of Programming Languages"}
 @string{osr="Operating Systems Review"}
 @string{pldi="Programming Language Design and Implementation"}
 @string{toplas="Transactions on Programming Languages and Systems"}
-@string{mathann="Mathematische Annalen"}
-% @string{mathann="Math. Ann."}
+string{mathann="Mathematische Annalen"}
+@string{mathann="Math. Ann."}
 
 % A
@@ -566,4 +567,15 @@
 }
 
+@inproceedings {Qin18,
+    author	= {Henry Qin and Qian Li and Jacqueline Speiser and Peter Kraft and John Ousterhout},
+    title	= {Arachne: Core-Aware Thread Management},
+    booktitle	= {13th {USENIX} Symp. on Oper. Sys. Design and Impl. ({OSDI} 18)},
+    year	= {2018},
+    address	= {Carlsbad, CA},
+    pages	= {145-160},
+    publisher	= {{USENIX} Association},
+    note	= {\href{https://www.usenix.org/conference/osdi18/presentation/qin}{https://\-www.usenix.org/\-conference/\-osdi18/\-presentation/\-qin}},
+}
+
 @article{Kessels82,
     keywords	= {concurrency, critical section},
@@ -653,5 +665,6 @@
     author	= {Joung, Yuh-Jzer},
     title	= {Asynchronous group mutual exclusion},
-    journal	= {Distributed Computing},
+    journal	= {Dist. Comput.},
+    optjournal	= {Distributed Computing},
     year	= {2000},
     month	= {Nov},
@@ -796,5 +809,5 @@
 	time computable inheritance hierarchy.
     },
-    comment = {
+    comment	= {
         Classes are predicates; if object {\tt o} is in class {\tt C}, then
 	{\tt C} is true of {\tt o}.  Classes are combined with {\tt :AND},
@@ -950,11 +963,14 @@
 
 @article{Moss18,
-    keywords	= {type systems, tuples, Cforall},
+    keywords	= {type systems, polymorphism, tuples, Cforall},
     contributer	= {pabuhr@plg},
     author	= {Aaron Moss and Robert Schluntz and Peter A. Buhr},
     title	= {\textsf{C}$\mathbf{\forall}$ : Adding Modern Programming Language Features to C},
+    journal	= spe,
+    volume	= 48,
+    number	= 12,
+    month	= dec,
     year	= 2018,
-    month	= aug,
-    journal	= spe,
+    pages	= {2111-2146},
     note	= {\href{http://dx.doi.org/10.1002/spe.2624}{http://\-dx.doi.org/\-10.1002/\-spe.2624}},
 }
@@ -989,5 +1005,8 @@
     journal	= {Dr. Dobb's Journal of Software Tools},
     year	= 1989,
-    month	= feb, volume = 14, number = 2, pages = {45-51},
+    month	= feb,
+    volume	= 14,
+    number	= 2,
+    pages	= {45-51},
     comment	= {
        A light-weight multitasking kernel for MS-DOS.  A task\_control
@@ -1507,13 +1526,13 @@
 }
 
-@techreport{uC++,
+@manual{uC++,
     keywords	= {C++, concurrency, light-weight process, shared memory},
     contributer	= {pabuhr@plg},
+    key		= {uC++},
     author	= {Peter A. Buhr},
     title	= {$\mu${C}{\kern-.1em\hbox{\large\texttt{+\kern-.25em+}}} Annotated Reference Manual, Version 7.0.0},
-    institution	= {School of Computer Science, University of Waterloo},
-    address	= {Waterloo, Ontario, Canada, N2L 3G1},
-    month	= dec,
-    year	= 2017,
+    organization= {University of Waterloo},
+    month	= sep,
+    year	= 2018,
     note	= {\href{https://plg.uwaterloo.ca/~usystem/pub/uSystem/uC++.pdf}{https://\-plg.uwaterloo.ca/\-$\sim$usystem/\-pub/\-uSystem/uC++.pdf}},
 }
@@ -1586,5 +1605,5 @@
     author	= {Sun, Xianda},
     title	= {Concurrent High-performance Persistent Hash Table In {J}ava},
-    school	= {School of Computer Science, University of Waterloo},
+    school	= {School of Computer Sc., University of Waterloo},
     year	= 2015,
     optaddress	= {Waterloo, Ontario, Canada, N2L 3G1},
@@ -1936,20 +1955,18 @@
     note	= {Svensk Standard SS 63 61 14},
     year	= 1987,
-    abstract	= {
-        Standard for the programming language SIMULA.  Written in English.
-    }
+    abstract	= {Standard for the programming language SIMULA. Written in English.}
 }
 
 @article{Galil91,
-  keywords = {union-find},
-  contributer = {a3moss@uwaterloo.ca},
-  title={Data structures and algorithms for disjoint set union problems},
-  author={Galil, Zvi and Italiano, Giuseppe F},
-  journal={ACM Computing Surveys (CSUR)},
-  volume={23},
-  number={3},
-  pages={319--344},
-  year={1991},
-  publisher={ACM}
+    keywords	= {union-find},
+    contributer	= {a3moss@uwaterloo.ca},
+    title	= {Data structures and algorithms for disjoint set union problems},
+    author	= {Galil, Zvi and Italiano, Giuseppe F},
+    journal	= {ACM Computing Surveys (CSUR)},
+    volume	= 23,
+    number	= 3,
+    pages	= {319--344},
+    year	= 1991,
+    publisher	= {ACM},
 }
 
@@ -2094,11 +2111,11 @@
 
 @book{Aho74,
-  keywords = {algorithms, textbook, union-find},
-  contributer = {a3moss@uwaterloo.ca},
-  title = {The Design and Analysis of Computer Algorithms},
-  author = {Aho, Alfred V and Hopcroft, John E and Ullman, Jeffrey D},
-  year = {1974},
-  publisher = {Addison-Wesley},
-  address = {Reading, MA, USA}
+    keywords	= {algorithms, textbook, union-find},
+    contributer	= {a3moss@uwaterloo.ca},
+    title	= {The Design and Analysis of Computer Algorithms},
+    author	= {Aho, Alfred V and Hopcroft, John E and Ullman, Jeffrey D},
+    year	= {1974},
+    publisher	= {Addison-Wesley},
+    address	= {Reading, MA, USA}
 }
 
@@ -2900,19 +2917,19 @@
     month	= oct,
     year	= 1988,
-    pages	= {143--149}
-}
-
-@InProceedings{Patwary10,
-keywords = {union-find},
-contributer = {a3moss@uwaterloo.ca},
-author={Patwary, Md. Mostofa Ali and Blair, Jean and Manne, Fredrik},
-editor={Festa, Paola},
-title={Experiments on Union-Find Algorithms for the Disjoint-Set Data Structure},
-booktitle={Experimental Algorithms},
-year=2010,
-publisher={Springer Berlin Heidelberg},
-address={Berlin, Heidelberg},
-pages={411--423},
-isbn={978-3-642-13193-6}
+    pages	= {143-149}
+}
+
+@inproceedings{Patwary10,
+    keywords	= {union-find},
+    contributer = {a3moss@uwaterloo.ca},
+    author	= {Patwary, Md. Mostofa Ali and Blair, Jean and Manne, Fredrik},
+    editor	= {Festa, Paola},
+    title	= {Experiments on Union-Find Algorithms for the Disjoint-Set Data Structure},
+    booktitle	= {Experimental Algorithms},
+    year	= 2010,
+    publisher	= {Springer Berlin Heidelberg},
+    address	= {Berlin, Heidelberg},
+    pages	= {411--423},
+    isbn	= {978-3-642-13193-6}
 }
 
@@ -3260,6 +3277,6 @@
     keywords	= {Go programming language},
     contributer	= {pabuhr@plg},
+    author	= {Robert Griesemer and Rob Pike and Ken Thompson},
     title	= {{Go} Programming Language},
-    author	= {Robert Griesemer and Rob Pike and Ken Thompson},
     organization= {Google},
     year	= 2009,
@@ -3453,5 +3470,5 @@
     month	= sep,
     publisher	= {John Wiley \& Sons},
-    note	= {\href{https://doi-org.proxy.lib.uwaterloo.ca/10.1002/cpe.4475}{https://\-doi-org.proxy.lib.uwaterloo.ca/\-10.1002/\-cpe.4475}},
+    note	= {\href{https://doi.org/10.1002/cpe.4475}{https://\-doi.org/\-10.1002/\-cpe.4475}},
 }
 
@@ -3594,14 +3611,14 @@
 
 @article{Galler64,
-  keywords={union-find, original},
-  contributer={a3moss@uwaterloo.ca},
-  title={An improved equivalence algorithm},
-  author={Galler, Bernard A and Fisher, Michael J},
-  journal={Communications of the ACM},
-  volume={7},
-  number={5},
-  pages={301--303},
-  year={1964},
-  publisher={ACM}
+    keywords	= {union-find, original},
+    contributer	= {a3moss@uwaterloo.ca},
+    title	= {An improved equivalence algorithm},
+    author	= {Galler, Bernard A and Fisher, Michael J},
+    journal	= {Communications of the ACM},
+    volume	= {7},
+    number	= {5},
+    pages	= {301--303},
+    year	= {1964},
+    publisher	= {ACM}
 }
 
@@ -3948,5 +3965,5 @@
     author	= {Peter A. Buhr and Martin Karsten and Jun Shih},
     title	= {{\small\textsf{KDB}}: A Multi-threaded Debugger for Multi-threaded Applications},
-    booktitle	= {Proceedings of SPDT'96: SIGMETRICS Symposium on Parallel and Distributed Tools},
+    booktitle	= {Proc. of SPDT'96: SIGMETRICS Symp. on Parallel and Distributed Tools},
     publisher	= {ACM Press},
     address	= {Philadelphia, Pennsylvania, U.S.A.},
@@ -5440,12 +5457,12 @@
 
 @inproceedings{Conchon07,
-  keywords = {persistent array, union-find},
-  contributer = {a3moss@uwaterloo.ca},
-  title={A persistent union-find data structure},
-  author={Conchon, Sylvain and Filli{\^a}tre, Jean-Christophe},
-  booktitle={Proceedings of the 2007 workshop on Workshop on ML},
-  pages={37--46},
-  year={2007},
-  organization={ACM}
+    keywords	= {persistent array, union-find},
+    contributer	= {a3moss@uwaterloo.ca},
+    title	= {A persistent union-find data structure},
+    author	= {Conchon, Sylvain and Filli{\^a}tre, Jean-Christophe},
+    booktitle	= {Proceedings of the 2007 workshop on Workshop on ML},
+    pages	= {37--46},
+    year	= {2007},
+    organization= {ACM}
 }
 
@@ -5664,5 +5681,5 @@
     author	= {Peter A. Buhr and Robert Denda},
     title	= {{$\mu$Profiler} : Profiling User-Level Threads in a Shared-Memory Programming Environment},
-    booktitle	= {Proceedings of the Second International Symposium on Computing in Object-Oriented Parallel Environments (ISCOPE'98)},
+    booktitle	= {Proc. of 2nd Inter. Symp. on Computing in Object-Oriented Parallel Environments},
     series	= {Lecture Notes in Computer Science},
     publisher	= {Springer-Verlag},
@@ -6035,5 +6052,5 @@
     issn	= {0164-0925},
     pages	= {429-475},
-    url		= {http://doi.acm.org.proxy.lib.uwaterloo.ca/10.1145/1133651.1133653},
+    url		= {http://doi.acm.org/10.1145/1133651.1133653},
     doi		= {10.1145/1133651.1133653},
     acmid	= {1133653},
@@ -6302,6 +6319,6 @@
     contributer	= {pabuhr@plg},
     key		= {Rust},
-    title	= {The {R}ust Programming Language},
-    address	= {The Rust Project Developers},
+    title	= {{R}ust Programming Language},
+    optaddress	= {Rust Project Developers},
     year	= 2015,
     note	= {\href{https://doc.rust-lang.org/reference.html}{https://\-doc.rust-lang\-.org/\-reference.html}},
@@ -6372,43 +6389,43 @@
 
 @article{Baker78,
- keywords = {Algol display, FUNARG's, Lisp 1.5, deep binding, environment trees, multiprogramming, shallow binding},
- contributer = {a3moss@uwaterloo.ca},
- author = {Baker,Jr., Henry G.},
- title = {Shallow Binding in Lisp 1.5},
- journal = {Commun. ACM},
- issue_date = {July 1978},
- volume = {21},
- number = {7},
- month = jul,
- year = {1978},
- issn = {0001-0782},
- pages = {565--569},
- numpages = {5},
- url = {http://doi.acm.org.proxy.lib.uwaterloo.ca/10.1145/359545.359566},
- doi = {10.1145/359545.359566},
- acmid = {359566},
- publisher = {ACM},
- address = {New York, NY, USA}
+    keywords	= {Algol display, FUNARG's, Lisp 1.5, deep binding, environment trees, multiprogramming, shallow binding},
+    contributer	= {a3moss@uwaterloo.ca},
+    author	= {Baker,Jr., Henry G.},
+    title	= {Shallow Binding in Lisp 1.5},
+    journal	= {Commun. ACM},
+    issue_date	= {July 1978},
+    volume	= 21,
+    number	= 7,
+    month	= jul,
+    year	= 1978,
+    issn	= {0001-0782},
+    pages	= {565--569},
+    numpages	= {5},
+    url		= {http://doi.acm.org/10.1145/359545.359566},
+    doi		= {10.1145/359545.359566},
+    acmid	= {359566},
+    publisher	= {ACM},
+    address	= {New York, NY, USA}
 }
 
 @article{Baker91,
- keywords = {shallow binding, functional arrays},
- contributer = {a3moss@uwaterloo.ca},
- author = {Baker, Henry G.},
- title = {Shallow Binding Makes Functional Arrays Fast},
- journal = {SIGPLAN Not.},
- issue_date = {Aug. 1991},
- volume = {26},
- number = {8},
- month = aug,
- year = {1991},
- issn = {0362-1340},
- pages = {145--147},
- numpages = {3},
- url = {http://doi.acm.org.proxy.lib.uwaterloo.ca/10.1145/122598.122614},
- doi = {10.1145/122598.122614},
- acmid = {122614},
- publisher = {ACM},
- address = {New York, NY, USA},
+    keywords	= {shallow binding, functional arrays},
+    contributer	= {a3moss@uwaterloo.ca},
+    author	= {Baker, Henry G.},
+    title	= {Shallow Binding Makes Functional Arrays Fast},
+    journal	= {SIGPLAN Not.},
+    issue_date	= {Aug. 1991},
+    volume	= 26,
+    number	= 8,
+    month	= aug,
+    year	= 1991,
+    issn	= {0362-1340},
+    pages	= {145--147},
+    numpages	= {3},
+    url		= {http://doi.acm.org/10.1145/122598.122614},
+    doi		= {10.1145/122598.122614},
+    acmid	= {122614},
+    publisher	= {ACM},
+    address	= {New York, NY, USA},
 }
 
@@ -7580,22 +7597,22 @@
 
 @article{Tarjan84,
- keywords = {union-find},
- contributer = {a3moss@uwaterloo.ca},
- author = {Tarjan, Robert E. and van Leeuwen, Jan},
- title = {Worst-case Analysis of Set Union Algorithms},
- journal = {J. ACM},
- issue_date = {April 1984},
- volume = {31},
- number = {2},
- month = mar,
- year = {1984},
- issn = {0004-5411},
- pages = {245--281},
- numpages = {37},
- url = {http://doi.acm.org/10.1145/62.2160},
- doi = {10.1145/62.2160},
- acmid = {2160},
- publisher = {ACM},
- address = {New York, NY, USA},
+    keywords	= {union-find},
+    contributer	= {a3moss@uwaterloo.ca},
+    author	= {Tarjan, Robert E. and van Leeuwen, Jan},
+    title	= {Worst-case Analysis of Set Union Algorithms},
+    journal	= {J. ACM},
+    issue_date	= {April 1984},
+    volume	= 31,
+    number	= 2,
+    month	= mar,
+    year	= 1984,
+    issn	= {0004-5411},
+    pages	= {245--281},
+    numpages	= {37},
+    url		= {http://doi.acm.org/10.1145/62.2160},
+    doi		= {10.1145/62.2160},
+    acmid	= {2160},
+    publisher	= {ACM},
+    address	= {New York, NY, USA},
 } 
 
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ src/Parser/parser.yy	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Nov  1 20:59:49 2018
-// Update Count     : 4030
+// Last Modified On : Sat Nov  3 08:55:10 2018
+// Update Count     : 4032
 //
 
@@ -192,5 +192,5 @@
 	} // if
 	return new ForCtrl(
-		distAttr( DeclarationNode::newTypeof( type ), DeclarationNode::newName( index )->addInitializer( new InitializerNode( start ) ) ),
+		distAttr( DeclarationNode::newTypeof( type, true ), DeclarationNode::newName( index )->addInitializer( new InitializerNode( start ) ) ),
 		new ExpressionNode( build_binary_val( compop, new ExpressionNode( build_varref( new string( *index ) ) ), comp ) ),
 		new ExpressionNode( build_binary_val( compop == OperKinds::LThan || compop == OperKinds::LEThan ? // choose += or -= for upto/downto
Index: tests/.expect/alloc-ERROR.txt
===================================================================
--- tests/.expect/alloc-ERROR.txt	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ tests/.expect/alloc-ERROR.txt	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -1,3 +1,3 @@
-alloc.c:265:1 error: No reasonable alternatives for expression Applying untyped: 
+alloc.cfa:265:1 error: No reasonable alternatives for expression Applying untyped: 
   Name: ?=?
 ...to: 
@@ -19,5 +19,5 @@
 
 
-alloc.c:266:1 error: No reasonable alternatives for expression Applying untyped: 
+alloc.cfa:266:1 error: No reasonable alternatives for expression Applying untyped: 
   Name: ?=?
 ...to: 
@@ -39,5 +39,5 @@
 
 
-alloc.c:267:1 error: No reasonable alternatives for expression Applying untyped: 
+alloc.cfa:267:1 error: No reasonable alternatives for expression Applying untyped: 
   Name: ?=?
 ...to: 
@@ -50,5 +50,5 @@
 
 
-alloc.c:268:1 error: No reasonable alternatives for expression Applying untyped: 
+alloc.cfa:268:1 error: No reasonable alternatives for expression Applying untyped: 
   Name: ?=?
 ...to: 
Index: tests/.expect/castError.txt
===================================================================
--- tests/.expect/castError.txt	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ tests/.expect/castError.txt	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -1,7 +1,7 @@
-castError.c:7:1 error: Cannot choose between 3 alternatives for expression
+castError.cfa:7:1 error: Cannot choose between 3 alternatives for expression
 Cast of:
   Name: f
 ... to:
-  charAlternatives are:
+  char Alternatives are:
 Cost ( 1, 0, 0, 0 ): Cast of:
      Variable Expression: f: function
Index: tests/.expect/completeTypeError.txt
===================================================================
--- tests/.expect/completeTypeError.txt	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ tests/.expect/completeTypeError.txt	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -1,43 +1,43 @@
-completeTypeError.c:33:1 error: No reasonable alternatives for expression Applying untyped: 
+completeTypeError.cfa:33:1 error: No reasonable alternatives for expression Applying untyped: 
   Name: *?
 ...to: 
   Name: v
 
-completeTypeError.c:34:1 error: No reasonable alternatives for expression Applying untyped: 
+completeTypeError.cfa:34:1 error: No reasonable alternatives for expression Applying untyped: 
   Name: *?
 ...to: 
   Name: y
 
-completeTypeError.c:35:1 error: No reasonable alternatives for expression Applying untyped: 
+completeTypeError.cfa:35:1 error: No reasonable alternatives for expression Applying untyped: 
   Name: foo
 ...to: 
   Name: v
 
-completeTypeError.c:36:1 error: No reasonable alternatives for expression Applying untyped: 
+completeTypeError.cfa:36:1 error: No reasonable alternatives for expression Applying untyped: 
   Name: baz
 ...to: 
   Name: v
 
-completeTypeError.c:37:1 error: No reasonable alternatives for expression Applying untyped: 
+completeTypeError.cfa:37:1 error: No reasonable alternatives for expression Applying untyped: 
   Name: quux
 ...to: 
   Name: v
 
-completeTypeError.c:58:1 error: No reasonable alternatives for expression Applying untyped: 
+completeTypeError.cfa:58:1 error: No reasonable alternatives for expression Applying untyped: 
   Name: baz
 ...to: 
   Name: y
 
-completeTypeError.c:59:1 error: No reasonable alternatives for expression Applying untyped: 
+completeTypeError.cfa:59:1 error: No reasonable alternatives for expression Applying untyped: 
   Name: quux
 ...to: 
   Name: y
 
-completeTypeError.c:60:1 error: No reasonable alternatives for expression Applying untyped: 
+completeTypeError.cfa:60:1 error: No reasonable alternatives for expression Applying untyped: 
   Name: *?
 ...to: 
   Name: y
 
-completeTypeError.c:72:1 error: No reasonable alternatives for expression Applying untyped: 
+completeTypeError.cfa:72:1 error: No reasonable alternatives for expression Applying untyped: 
   Name: baz
 ...to: 
Index: tests/.expect/declarationErrors.txt
===================================================================
--- tests/.expect/declarationErrors.txt	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ tests/.expect/declarationErrors.txt	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -1,9 +1,9 @@
-declarationErrors.c:16:1 error: duplicate static in declaration of x1: static const volatile short int 
+declarationErrors.cfa:16:1 error: duplicate static in declaration of x1: static const volatile short int 
 
-declarationErrors.c:17:1 error: conflicting extern & static in declaration of x2: extern const volatile short int 
+declarationErrors.cfa:17:1 error: conflicting extern & static in declaration of x2: extern const volatile short int 
 
-declarationErrors.c:18:1 error: conflicting extern & auto, conflicting extern & static, conflicting extern & static, duplicate extern in declaration of x3: extern const volatile short int 
+declarationErrors.cfa:18:1 error: conflicting extern & auto, conflicting extern & static, conflicting extern & static, duplicate extern in declaration of x3: extern const volatile short int 
 
-declarationErrors.c:19:1 error: duplicate static in declaration of x4: static const volatile instance of const volatile struct __anonymous0
+declarationErrors.cfa:19:1 error: duplicate static in declaration of x4: static const volatile instance of const volatile struct __anonymous0
   with members 
     i: int 
@@ -11,5 +11,5 @@
 
 
-declarationErrors.c:20:1 error: duplicate const, duplicate static, duplicate volatile in declaration of x5: static const volatile instance of const volatile struct __anonymous1
+declarationErrors.cfa:20:1 error: duplicate const, duplicate static, duplicate volatile in declaration of x5: static const volatile instance of const volatile struct __anonymous1
   with members 
     i: int 
@@ -17,52 +17,52 @@
 
 
-declarationErrors.c:22:1 error: duplicate static in declaration of x6: static const volatile Int
+declarationErrors.cfa:22:1 error: duplicate static in declaration of x6: static const volatile Int
 
-declarationErrors.c:24:1 error: duplicate const in declaration of f01: static inline function
+declarationErrors.cfa:24:1 error: duplicate const in declaration of f01: static inline function
   with no parameters 
   returning const volatile int 
 
 
-declarationErrors.c:25:1 error: duplicate volatile in declaration of f02: static inline function
+declarationErrors.cfa:25:1 error: duplicate volatile in declaration of f02: static inline function
   with no parameters 
   returning const volatile int 
 
 
-declarationErrors.c:26:1 error: duplicate const in declaration of f03: static inline function
+declarationErrors.cfa:26:1 error: duplicate const in declaration of f03: static inline function
   with no parameters 
   returning const volatile int 
 
 
-declarationErrors.c:27:1 error: duplicate volatile in declaration of f04: static inline function
+declarationErrors.cfa:27:1 error: duplicate volatile in declaration of f04: static inline function
   with no parameters 
   returning const volatile int 
 
 
-declarationErrors.c:28:1 error: duplicate const in declaration of f05: static inline function
+declarationErrors.cfa:28:1 error: duplicate const in declaration of f05: static inline function
   with no parameters 
   returning const volatile int 
 
 
-declarationErrors.c:29:1 error: duplicate volatile in declaration of f06: static inline function
+declarationErrors.cfa:29:1 error: duplicate volatile in declaration of f06: static inline function
   with no parameters 
   returning const volatile int 
 
 
-declarationErrors.c:30:1 error: duplicate const in declaration of f07: static inline function
+declarationErrors.cfa:30:1 error: duplicate const in declaration of f07: static inline function
   with no parameters 
   returning const volatile int 
 
 
-declarationErrors.c:31:1 error: duplicate const, duplicate volatile in declaration of f08: static inline function
+declarationErrors.cfa:31:1 error: duplicate const, duplicate volatile in declaration of f08: static inline function
   with no parameters 
   returning const volatile int 
 
 
-declarationErrors.c:33:1 error: duplicate const, duplicate volatile in declaration of f09: static inline function
+declarationErrors.cfa:33:1 error: duplicate const, duplicate volatile in declaration of f09: static inline function
   with no parameters 
   returning const volatile int 
 
 
-declarationErrors.c:34:1 error: duplicate const, duplicate _Atomic, duplicate _Atomic, duplicate const, duplicate restrict, duplicate volatile in declaration of f09: static inline function
+declarationErrors.cfa:34:1 error: duplicate const, duplicate _Atomic, duplicate _Atomic, duplicate const, duplicate restrict, duplicate volatile in declaration of f09: static inline function
   with no parameters 
   returning const restrict volatile _Atomic int 
Index: tests/.expect/nested-types-ERR1.txt
===================================================================
--- tests/.expect/nested-types-ERR1.txt	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ tests/.expect/nested-types-ERR1.txt	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -1,1 +1,1 @@
-nested-types.c:70:1 error: Use of undefined type T
+nested-types.cfa:70:1 error: Use of undefined type T
Index: tests/.expect/nested-types-ERR2.txt
===================================================================
--- tests/.expect/nested-types-ERR2.txt	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ tests/.expect/nested-types-ERR2.txt	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -1,5 +1,5 @@
-nested-types.c:73:1 error: Use of undefined global type Z
-nested-types.c:74:1 error: Qualified type requires an aggregate on the left, but has: signed int
-nested-types.c:75:1 error: Undefined type in qualified type: Qualified Type: 
+nested-types.cfa:73:1 error: Use of undefined global type Z
+nested-types.cfa:74:1 error: Qualified type requires an aggregate on the left, but has: signed int
+nested-types.cfa:75:1 error: Undefined type in qualified type: Qualified Type: 
   instance of struct S with body 1 
   instance of type Z (not function type) 
Index: tests/.expect/quotedKeyword.txt
===================================================================
--- tests/.expect/quotedKeyword.txt	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/.expect/quotedKeyword.txt	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,1 @@
+10
Index: sts/.expect/quoted_keyword.txt
===================================================================
--- tests/.expect/quoted_keyword.txt	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,1 +1,0 @@
-10
Index: tests/.expect/scopeErrors.txt
===================================================================
--- tests/.expect/scopeErrors.txt	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ tests/.expect/scopeErrors.txt	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -1,4 +1,4 @@
-scopeErrors.c:2:1 error: duplicate object definition for thisIsAnError: signed int
-scopeErrors.c:20:1 error: duplicate function definition for butThisIsAnError: function
+scopeErrors.cfa:2:1 error: duplicate object definition for thisIsAnError: signed int
+scopeErrors.cfa:20:1 error: duplicate function definition for butThisIsAnError: function
 ... with parameters
   double
Index: tests/.expect/typedefRedef-ERR1.txt
===================================================================
--- tests/.expect/typedefRedef-ERR1.txt	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ tests/.expect/typedefRedef-ERR1.txt	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -1,2 +1,2 @@
-typedefRedef.c:4:1 error: Cannot redefine typedef: Foo
-typedefRedef.c:60:1 error: Cannot redefine typedef: ARR
+typedefRedef.cfa:4:1 error: Cannot redefine typedef: Foo
+typedefRedef.cfa:60:1 error: Cannot redefine typedef: ARR
Index: sts/.expect/user_literals.txt
===================================================================
--- tests/.expect/user_literals.txt	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,25 +1,0 @@
-11.0714285714286
-15
-11.0714285714286
-24.8
-11.248
-11.0714285714286
-28.0657142857143
-secs 1
-secs 23
-mins 23
-hours 23
-_A_ 23
-_thingy_ 1234
-secs 65535
-mins 65535
-hours 65535
-_A_ 65535
-_thingy_ 65535
-secs 10
-hours 10
-mins 10
-_A_ 10
-_thingy_ 10
-secs abc
-_thingy_ abc
Index: sts/.expect/with-statement.txt
===================================================================
--- tests/.expect/with-statement.txt	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,6 +1,0 @@
-12345 12345 12345
-12345
-called mk
-444 444 444
-123456789 123456789 123456789
-123456789 123456789 123456789
Index: sts/KRfunctions.c
===================================================================
--- tests/KRfunctions.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,52 +1,0 @@
-// 
-// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-// 
-// KRfunctions.c -- 
-// 
-// Author           : Peter A. Buhr
-// Created On       : Thu Feb 16 15:23:17 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Aug 20 07:34:17 2017
-// Update Count     : 7
-// 
-
-f0( a, b, c ) const int * b; {}
-f1( a, b, c ) int b __attribute__ (( unused )), * a, c[]; {}
-(f2)( a, b, c ) int a, * b, c[]; {}
-
-struct S { int i; };
-int f3( a, b, c ) struct S a; struct S b; int c[]; { struct S s;}
-int (f4)( a, b, c ) int a, * b, c[]; {}
-int (f5( a, b, c )) int a, * b, c[]; {}
-
-int (* f6( a, b, c ))(int) int a, * b, c[]; {}
-int (* f7( a, b, c ))(int a, int b) int a, * b, c[]; {}
-int * f8( a, b, c ) int a, * b, c[]; {}
-int * const f9( a, b, c ) int b, * a, c[]; {}
-
-int (* (* f10( a, b, c, y ))( int x, int y ) ) int a, * b, c[]; double y; {
-    int *x( int, int );
-    return x;
-}
-
-int (* f11( a, b, c ))[] int a, * b, c[]; {}
-int (* f12( a, b, c ))[][10] int a, * b, c[]; {}
-int ((* f13( a, b, c ))[])[10] int a, * b, c[]; {}
-int (((* f14( a, b, c ))[])[10]) int a, * b, c[]; {}
-f15( a, b, c ) {}
-
-const fred() {
-    int *(*x)( int, int );
-    int a, b;
-    x = f10( 3, &a, &b, 3.5 );
-    const f1( a, b, c ) int a, * b, c[]; {}
-    const f2( int a, int b, int c ) {}
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa KRfunctions.c" //
-// End: //
Index: tests/KRfunctions.cfa
===================================================================
--- tests/KRfunctions.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/KRfunctions.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,52 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// KRfunctions.cfa -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Thu Feb 16 15:23:17 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:50:34 2018
+// Update Count     : 9
+// 
+
+f0( a, b, c ) const int * b; {}
+f1( a, b, c ) int b __attribute__ (( unused )), * a, c[]; {}
+(f2)( a, b, c ) int a, * b, c[]; {}
+
+struct S { int i; };
+int f3( a, b, c ) struct S a; struct S b; int c[]; { struct S s;}
+int (f4)( a, b, c ) int a, * b, c[]; {}
+int (f5( a, b, c )) int a, * b, c[]; {}
+
+int (* f6( a, b, c ))(int) int a, * b, c[]; {}
+int (* f7( a, b, c ))(int a, int b) int a, * b, c[]; {}
+int * f8( a, b, c ) int a, * b, c[]; {}
+int * const f9( a, b, c ) int b, * a, c[]; {}
+
+int (* (* f10( a, b, c, y ))( int x, int y ) ) int a, * b, c[]; double y; {
+    int *x( int, int );
+    return x;
+}
+
+int (* f11( a, b, c ))[] int a, * b, c[]; {}
+int (* f12( a, b, c ))[][10] int a, * b, c[]; {}
+int ((* f13( a, b, c ))[])[10] int a, * b, c[]; {}
+int (((* f14( a, b, c ))[])[10]) int a, * b, c[]; {}
+f15( a, b, c ) {}
+
+const fred() {
+    int *(*x)( int, int );
+    int a, b;
+    x = f10( 3, &a, &b, 3.5 );
+    const f1( a, b, c ) int a, * b, c[]; {}
+    const f2( int a, int b, int c ) {}
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa KRfunctions.cfa" //
+// End: //
Index: tests/Makefile.am
===================================================================
--- tests/Makefile.am	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ tests/Makefile.am	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -11,9 +11,11 @@
 ## Created On       : Sun May 31 09:08:15 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Wed Jun  6 16:42:20 2018
-## Update Count     : 49
+## Last Modified On : Wed Nov  7 12:03:29 2018
+## Update Count     : 59
 ###############################################################################
 
 AUTOMAKE_OPTIONS = foreign    # do not require all the GNU file names
+
+include $(top_srcdir)/src/cfa.make
 
 debug=yes
@@ -45,5 +47,5 @@
 EXTRA_PROGRAMS = fstream_test avl_test # build but do not install
 
-fstream_test_SOURCES = fstream_test.c
+fstream_test_SOURCES = fstream_test.cfa
 
 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
@@ -72,24 +74,25 @@
 
 #----------------------------------------------------------------------------------------------------------------
+
 # implicit rule so not all test require a rule
 % : %.c $(CC)
 	$(PRETTY_PATH) $(COMPILE) $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-declarationSpecifier: declarationSpecifier.c $(CC)
+declarationSpecifier: declarationSpecifier.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -CFA -XCFA -p $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-gccExtensions : gccExtensions.c $(CC)
+gccExtensions : gccExtensions.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -CFA -XCFA -p $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-extension : extension.c $(CC)
+extension : extension.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -CFA -XCFA -p $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-attributes : attributes.c $(CC)
+attributes : attributes.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -CFA -XCFA -p $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-functions: functions.c $(CC)
+functions: functions.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -CFA -XCFA -p $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-KRfunctions : KRfunctions.c $(CC)
+KRfunctions : KRfunctions.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -CFA -XCFA -p $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
@@ -97,5 +100,5 @@
 	$(PRETTY_PATH) $(COMPILE) -CFA -XCFA -p $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-gmp : gmp.c $(CC)
+gmp : gmp.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -lgmp $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
@@ -105,21 +108,22 @@
 
 #------------------------------------------------------------------------------
+
 #To make errors path independent we need to cd into the correct directories
-completeTypeError : completeTypeError.c $(CC)
+completeTypeError : completeTypeError.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -DERR1 $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-typedefRedef-ERR1: typedefRedef.c $(CC)
+typedefRedef-ERR1: typedefRedef.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -DERR1 $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-alloc-ERROR: alloc.c $(CC)
+alloc-ERROR: alloc.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -DERR1 $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-fallthrough-ERROR: fallthrough.c $(CC)
+fallthrough-ERROR: fallthrough.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -DERR1 $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-nested-types-ERR1: nested-types.c $(CC)
+nested-types-ERR1: nested-types.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -DERR1 $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-nested-types-ERR2: nested-types.c $(CC)
+nested-types-ERR2: nested-types.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -DERR2 $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
Index: tests/Makefile.in
===================================================================
--- tests/Makefile.in	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ tests/Makefile.in	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -168,5 +168,6 @@
 CTAGS = ctags
 am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.py.in \
-	$(srcdir)/test.py $(top_srcdir)/automake/depcomp
+	$(srcdir)/test.py $(top_srcdir)/automake/depcomp \
+	$(top_srcdir)/src/cfa.make
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
@@ -297,4 +298,9 @@
 top_srcdir = @top_srcdir@
 AUTOMAKE_OPTIONS = foreign    # do not require all the GNU file names
+CFACOMPILE = $(CFACC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(CFAFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CFA = $(am__v_CFA_@AM_V@)
+am__v_CFA_ = $(am__v_CFA_@AM_DEFAULT_V@)
+am__v_CFA_0 = @echo "  CFA     " $@;
+am__v_CFA_1 = 
 debug = yes
 installed = no
@@ -309,11 +315,11 @@
 	${INSTALL_FLAGS} ${ARCH_FLAGS}
 PRETTY_PATH = cd ${srcdir} &&
-fstream_test_SOURCES = fstream_test.c
+fstream_test_SOURCES = fstream_test.cfa
 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
 all: all-am
 
 .SUFFIXES:
-.SUFFIXES: .c .o .obj .validate
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+.SUFFIXES: .c .cfa .o .obj .validate
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(top_srcdir)/src/cfa.make $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
@@ -335,4 +341,5 @@
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
+$(top_srcdir)/src/cfa.make $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -382,5 +389,4 @@
 	-rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fstream_test.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl-private.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl0.Po@am__quote@
@@ -530,5 +536,5 @@
 
 distclean: distclean-am
-	-rm -rf ./$(DEPDIR) avltree/$(DEPDIR)
+	-rm -rf avltree/$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
@@ -576,5 +582,5 @@
 
 maintainer-clean: maintainer-clean-am
-	-rm -rf ./$(DEPDIR) avltree/$(DEPDIR)
+	-rm -rf avltree/$(DEPDIR)
 	-rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
@@ -612,4 +618,9 @@
 
 
+.cfa.o:
+	$(AM_V_CFA)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+	$(CFACOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+	$(am__mv) $$depbase.Tpo $$depbase.Po
+
 .PHONY: list .validate
 .INTERMEDIATE: .validate .validate.c
@@ -638,24 +649,25 @@
 
 #----------------------------------------------------------------------------------------------------------------
+
 # implicit rule so not all test require a rule
 % : %.c $(CC)
 	$(PRETTY_PATH) $(COMPILE) $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-declarationSpecifier: declarationSpecifier.c $(CC)
+declarationSpecifier: declarationSpecifier.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -CFA -XCFA -p $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-gccExtensions : gccExtensions.c $(CC)
+gccExtensions : gccExtensions.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -CFA -XCFA -p $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-extension : extension.c $(CC)
+extension : extension.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -CFA -XCFA -p $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-attributes : attributes.c $(CC)
+attributes : attributes.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -CFA -XCFA -p $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-functions: functions.c $(CC)
+functions: functions.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -CFA -XCFA -p $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-KRfunctions : KRfunctions.c $(CC)
+KRfunctions : KRfunctions.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -CFA -XCFA -p $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
@@ -663,5 +675,5 @@
 	$(PRETTY_PATH) $(COMPILE) -CFA -XCFA -p $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-gmp : gmp.c $(CC)
+gmp : gmp.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -lgmp $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
@@ -671,21 +683,22 @@
 
 #------------------------------------------------------------------------------
+
 #To make errors path independent we need to cd into the correct directories
-completeTypeError : completeTypeError.c $(CC)
+completeTypeError : completeTypeError.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -DERR1 $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-typedefRedef-ERR1: typedefRedef.c $(CC)
+typedefRedef-ERR1: typedefRedef.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -DERR1 $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-alloc-ERROR: alloc.c $(CC)
+alloc-ERROR: alloc.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -DERR1 $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-fallthrough-ERROR: fallthrough.c $(CC)
+fallthrough-ERROR: fallthrough.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -DERR1 $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-nested-types-ERR1: nested-types.c $(CC)
+nested-types-ERR1: nested-types.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -DERR1 $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
-nested-types-ERR2: nested-types.c $(CC)
+nested-types-ERR2: nested-types.cfa $(CC)
 	$(PRETTY_PATH) $(COMPILE) -DERR2 $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
 
Index: sts/abs.c
===================================================================
--- tests/abs.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,36 +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.
-//
-// abs.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Thu Jan 28 18:26:16 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 22 22:31:03 2017
-// Update Count     : 52
-//
-
-#include <fstream.hfa>
-#include <stdlib.hfa>										// abs
-
-int main( void ) {
-	signed char ch = -65;
-	sout | "char\t\t\t"					| ch     | "\tabs " | abs( ch ) | endl;
-	sout | "signed int\t\t"				| -65    | "\tabs" | abs( -65 ) | endl;
-	sout | "signed long int\t\t" 		| -65l   | "\tabs" | abs( -65l ) | endl;
-	sout | "signed long long int\t"		| -65ll  | "\tabs" | abs( -65ll ) | endl;
-	sout | "float\t\t\t" 				| -65.0f | "\tabs" | abs( -65.0f ) | endl;
-	sout | "double\t\t\t"				| -65.0  | "\tabs" | abs( -65.0 ) | endl;
-	sout | "long double\t\t"			| -65.0l | "\tabs" | abs( -65.0l ) | endl;
-	sout | "float _Complex\t\t"			| -65.0F-2.0iF | "\tabs" | abs( -65.0F-2.0iF ) | endl;
-	sout | "double _Complex\t\t"		| -65.0D-2.0iD | "\tabs" | abs( -65.0D-2.0iD ) | endl;
-	sout | "long double _Complex\t"		| -65.0L-2.0iL | "\tabs" | abs( -65.0L-2.0iL ) | endl;
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa abs.c" //
-// End: //
Index: tests/abs.cfa
===================================================================
--- tests/abs.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/abs.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,36 @@
+//
+// 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.
+//
+// abs.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Thu Jan 28 18:26:16 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:50:44 2018
+// Update Count     : 54
+//
+
+#include <fstream.hfa>
+#include <stdlib.hfa>										// abs
+
+int main( void ) {
+	signed char ch = -65;
+	sout | "char\t\t\t"					| ch     | "\tabs " | abs( ch ) | endl;
+	sout | "signed int\t\t"				| -65    | "\tabs" | abs( -65 ) | endl;
+	sout | "signed long int\t\t" 		| -65l   | "\tabs" | abs( -65l ) | endl;
+	sout | "signed long long int\t"		| -65ll  | "\tabs" | abs( -65ll ) | endl;
+	sout | "float\t\t\t" 				| -65.0f | "\tabs" | abs( -65.0f ) | endl;
+	sout | "double\t\t\t"				| -65.0  | "\tabs" | abs( -65.0 ) | endl;
+	sout | "long double\t\t"			| -65.0l | "\tabs" | abs( -65.0l ) | endl;
+	sout | "float _Complex\t\t"			| -65.0F-2.0iF | "\tabs" | abs( -65.0F-2.0iF ) | endl;
+	sout | "double _Complex\t\t"		| -65.0D-2.0iD | "\tabs" | abs( -65.0D-2.0iD ) | endl;
+	sout | "long double _Complex\t"		| -65.0L-2.0iL | "\tabs" | abs( -65.0L-2.0iL ) | endl;
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa abs.cfa" //
+// End: //
Index: sts/alloc.c
===================================================================
--- tests/alloc.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,275 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// alloc.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Wed Feb  3 07:56:22 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug  9 06:21:35 2018
-// Update Count     : 337
-//
-
-#include <assert.h>
-#include <malloc.h>										// malloc_usable_size
-#include <stdint.h>										// uintptr_t
-#include <stdlib.h>										// posix_memalign
-#include <fstream.hfa>
-#include <stdlib.hfa>										// access C malloc, realloc
-
-int * foo( int * p, int c ) { return p; }
-int * bar( int * p, int c ) { return p; }
-int * baz( int * p, int c ) { return p; }
-
-int main( void ) {
-	size_t dim = 10;
-	char fill = '\xff';
-	int * p;
-
-	// allocation, non-array types
-
-	// int & r = malloc();
-	// r = 0xdeadbeef;
-	// printf( "C   malloc %#x\n", r );
-	// free( &r );
-
-	p = (int *)malloc( sizeof(*p) );					// C malloc, type unsafe
-	*p = 0xdeadbeef;
-	printf( "C   malloc %#x\n", *p );
-	free( p );
-
-	p = malloc();                                       // CFA malloc, type safe
-	*p = 0xdeadbeef;
-	printf( "CFA malloc %#x\n", *p );
-	free( p );
-
-	p = alloc();                                        // CFA alloc, type safe
-	*p = 0xdeadbeef;
-	printf( "CFA alloc %#x\n", *p );
-	free( p );
-
-	p = alloc( fill );                                  // CFA alloc, fill
-	printf( "CFA alloc, fill %08x\n", *p );
-	free( p );
-
-
-	// allocation, array types
-	printf( "\n" );
-
-	p = (int *)calloc( dim, sizeof( *p ) );				// C array calloc, type unsafe
-	printf( "C   array calloc, fill 0\n" );
-	for ( i; dim ) { printf( "%#x ", p[i] ); }
-	printf( "\n" );
-	free( p );
-
-	p = calloc( dim );                                  // CFA array calloc, type safe
-	printf( "CFA array calloc, fill 0\n" );
-	for ( i; dim ) { printf( "%#x ", p[i] ); }
-	printf( "\n" );
-	free( p );
-
-	p = alloc( dim );                                   // CFA array alloc, type safe
-	for ( i; dim ) { p[i] = 0xdeadbeef; }
-	printf( "CFA array alloc, no fill\n" );
-	for ( i; dim ) { printf( "%#x ", p[i] ); }
-	printf( "\n" );
-	free( p );
-
-	p = alloc( 2 * dim, fill );                         // CFA array alloc, fill
-	printf( "CFA array alloc, fill %#hhx\n", fill );
-	for ( i; 2 * dim ) { printf( "%#x ", p[i] ); }
-	printf( "\n" );
-	// do not free
-
-
-	// resize, non-array types
-	printf( "\n" );
-
-	p = (int *)realloc( p, dim * sizeof(*p) );			// C realloc
-	for ( i; dim ) { p[i] = 0xdeadbeef; }
-	printf( "C   realloc\n" );
-	for ( i; dim ) { printf( "%#x ", p[i] ); }
-	printf( "\n" );
-
-	p = realloc( p, 2 * dim * sizeof(*p) );             // CFA realloc
-	for ( i; dim ~ 2 * dim ) { p[i] = 0x1010101; }
-	printf( "CFA realloc\n" );
-	for ( i; 2 * dim ) { printf( "%#x ", p[i] ); }
-	printf( "\n" );
-	// do not free
-
-
-	// resize, array types
-	printf( "\n" );
-
-	p = alloc( p, dim );                                // CFA resize array alloc
-	for ( i; dim ) { p[i] = 0xdeadbeef; }
-	printf( "CFA resize alloc\n" );
-	for ( i; dim ) { printf( "%#x ", p[i] ); }
-	printf( "\n" );
-
-	p = alloc( p, 2 * dim );                            // CFA resize array alloc
-	for ( i; dim ~ 2 * dim ) { p[i] = 0x1010101; }
-	printf( "CFA resize array alloc\n" );
-	for ( i; 2 * dim ) { printf( "%#x ", p[i] ); }
-	printf( "\n" );
-
-	p = alloc( p, dim );                                // CFA array alloc
-	printf( "CFA resize array alloc\n" );
-	for ( i; dim ) { printf( "%#x ", p[i] ); }
-	printf( "\n" );
-
-	free( p );
-	p = 0;
-
-	p = alloc( p, dim, fill );                          // CFA array alloc, fill
-	printf( "CFA resize array alloc, fill\n" );
-	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 ( 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 ( i; dim ) { printf( "%#x ", p[i] );; }
-	printf( "\n" );
-	free( p );
-
-
-	struct Struct { int x; double y; };
-	Struct st, st1, sta[dim], sta1[dim], * stp, * stp1;
-
-	// alignment, non-array types
-	printf( "\n" );
-	enum { Alignment = 128 };
-
-	stp = &(*(Struct*)memalign( Alignment, sizeof( *stp ) ) ){ 42, 42.5 }; // C memalign
-	assert( (uintptr_t)stp % Alignment == 0 );
-	printf( "C   memalign %d %g\n", stp->x, stp->y );
-	free( stp );
-
-	stp = &(*memalign( Alignment )){ 42, 42.5 };          // CFA memalign
-	assert( (uintptr_t)stp % Alignment == 0 );
-	printf( "CFA memalign %d %g\n", stp->x, stp->y );
-	free( stp );
-
-	posix_memalign( (void **)&stp, Alignment, sizeof( *stp ) ); // C posix_memalign
-	*stp = (Struct){ 42, 42.5 };
-	assert( (uintptr_t)stp % Alignment == 0 );
-	printf( "CFA posix_memalign %d %g\n", stp->x, stp->y );
-	free( stp );
-
-	posix_memalign( &stp, Alignment );                  // CFA posix_memalign
-	*stp = (Struct){ 42, 42.5 };
-	assert( (uintptr_t)stp % Alignment == 0 );
-	printf( "CFA posix_memalign %d %g\n", stp->x, stp->y );
-	free( stp );
-
-	stp = &(*aligned_alloc( Alignment )){ 42, 42.5 };     // CFA aligned_alloc
-	assert( (uintptr_t)stp % Alignment == 0 );
-	printf( "CFA aligned_alloc %d %g\n", stp->x, stp->y );
-	free( stp );
-
-	stp = &(*align_alloc( Alignment )){ 42, 42.5 };       // CFA align_alloc
-	assert( (uintptr_t)stp % Alignment == 0 );
-	printf( "CFA align_alloc %d %g\n", stp->x, stp->y );
-	free( stp );
-
-	stp = align_alloc( Alignment, fill );               // CFA memalign, fill
-	assert( (uintptr_t)stp % Alignment == 0 );
-	printf( "CFA align_alloc fill %#x %a\n", stp->x, stp->y );
-	free( stp );
-
-
-	// alignment, array types
-	printf( "\n" );
-
-	stp = align_alloc( Alignment, dim );                // CFA array memalign
-	assert( (uintptr_t)stp % Alignment == 0 );
-	for ( i; dim ) { stp[i] = (Struct){ 42, 42.5 }; }
-	printf( "CFA array align_alloc\n" );
-	for ( i; dim ) { printf( "%d %g, ", stp[i].x, stp[i].y ); }
-	printf( "\n" );
-	free( stp );
-
-	stp = align_alloc( Alignment, dim, fill );          // CFA array memalign, fill
-	assert( (uintptr_t)stp % Alignment == 0 );
-	printf( "CFA array align_alloc, fill\n" );
-	for ( i; dim ) { printf( "%#x %a, ", stp[i].x, stp[i].y ); }
-	printf( "\n" );
-	free( stp );
-
-
-	// data, non-array types
-	printf( "\n" );
-
-	memset( &st, fill );                                // CFA memset, type safe
-	printf( "CFA memset %#x %a\n", st.x, st.y );
-	memcpy( &st1, &st );                                // CFA memcpy, type safe
-	printf( "CFA memcpy %#x %a\n", st1.x, st1.y );
-
-
-	// data, array types
-	printf( "\n" );
-
-	amemset( sta, fill, dim );							// CFA array memset, type safe
-	printf( "CFA array memset\n" );
-	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 ( i; dim ) { printf( "%#x %a, ", sta1[i].x, sta1[i].y ); }
-	printf( "\n" );
-
-
-	// new, non-array types
-	printf( "\n" );
-
-	stp = new( 42, 42.5 );
-	stp1 = new( 42, 42.5 );
-	printf( "CFA new initialize\n%d %g %d %g\n", stp->x, stp->y, stp1->x, stp1->y );
-	delete( stp, stp1 );
-
-	// new, array types
-	stp = anew( dim, 42, 42.5 );
-	printf( "CFA array new initialize\n" );
-	for ( i; dim ) { printf( "%d %g, ", stp[i].x, stp[i].y ); }
-	printf( "\n" );
-	stp1 = anew( dim, 42, 42.5 );
-	for ( i; dim ) { printf( "%d %g, ", stp1[i].x, stp1[i].y ); }
-	printf( "\n" );
-	adelete( dim, stp, dim, stp1 );
-
-	// extras
-	printf( "\n" );
-
-	float * fp = malloc() + 1;
-	printf( "pointer arithmetic %d\n", fp == fp - 1 );
-	free( fp - 1 );
-
-	p = foo( bar( baz( malloc(), 0 ), 0 ), 0 );
-	*p = 0xdeadbeef;
-	printf( "CFA deep malloc %#x\n", *p );
-	free( p );
-
-#ifdef ERR1
-	stp = malloc();
-	printf( "\nSHOULD FAIL\n" );
-	p = realloc( stp, dim * sizeof( *stp ) );
-	p = alloc( stp, dim * sizeof( *stp ) );
-	p = memset( stp, 10 );
-	p = memcpy( &st1, &st );
-#endif
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa alloc.c" //
-// End: //
Index: tests/alloc.cfa
===================================================================
--- tests/alloc.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/alloc.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,275 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// alloc.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Wed Feb  3 07:56:22 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:50:52 2018
+// Update Count     : 339
+//
+
+#include <assert.h>
+#include <malloc.h>										// malloc_usable_size
+#include <stdint.h>										// uintptr_t
+#include <stdlib.h>										// posix_memalign
+#include <fstream.hfa>
+#include <stdlib.hfa>										// access C malloc, realloc
+
+int * foo( int * p, int c ) { return p; }
+int * bar( int * p, int c ) { return p; }
+int * baz( int * p, int c ) { return p; }
+
+int main( void ) {
+	size_t dim = 10;
+	char fill = '\xff';
+	int * p;
+
+	// allocation, non-array types
+
+	// int & r = malloc();
+	// r = 0xdeadbeef;
+	// printf( "C   malloc %#x\n", r );
+	// free( &r );
+
+	p = (int *)malloc( sizeof(*p) );					// C malloc, type unsafe
+	*p = 0xdeadbeef;
+	printf( "C   malloc %#x\n", *p );
+	free( p );
+
+	p = malloc();                                       // CFA malloc, type safe
+	*p = 0xdeadbeef;
+	printf( "CFA malloc %#x\n", *p );
+	free( p );
+
+	p = alloc();                                        // CFA alloc, type safe
+	*p = 0xdeadbeef;
+	printf( "CFA alloc %#x\n", *p );
+	free( p );
+
+	p = alloc( fill );                                  // CFA alloc, fill
+	printf( "CFA alloc, fill %08x\n", *p );
+	free( p );
+
+
+	// allocation, array types
+	printf( "\n" );
+
+	p = (int *)calloc( dim, sizeof( *p ) );				// C array calloc, type unsafe
+	printf( "C   array calloc, fill 0\n" );
+	for ( i; dim ) { printf( "%#x ", p[i] ); }
+	printf( "\n" );
+	free( p );
+
+	p = calloc( dim );                                  // CFA array calloc, type safe
+	printf( "CFA array calloc, fill 0\n" );
+	for ( i; dim ) { printf( "%#x ", p[i] ); }
+	printf( "\n" );
+	free( p );
+
+	p = alloc( dim );                                   // CFA array alloc, type safe
+	for ( i; dim ) { p[i] = 0xdeadbeef; }
+	printf( "CFA array alloc, no fill\n" );
+	for ( i; dim ) { printf( "%#x ", p[i] ); }
+	printf( "\n" );
+	free( p );
+
+	p = alloc( 2 * dim, fill );                         // CFA array alloc, fill
+	printf( "CFA array alloc, fill %#hhx\n", fill );
+	for ( i; 2 * dim ) { printf( "%#x ", p[i] ); }
+	printf( "\n" );
+	// do not free
+
+
+	// resize, non-array types
+	printf( "\n" );
+
+	p = (int *)realloc( p, dim * sizeof(*p) );			// C realloc
+	for ( i; dim ) { p[i] = 0xdeadbeef; }
+	printf( "C   realloc\n" );
+	for ( i; dim ) { printf( "%#x ", p[i] ); }
+	printf( "\n" );
+
+	p = realloc( p, 2 * dim * sizeof(*p) );             // CFA realloc
+	for ( i; dim ~ 2 * dim ) { p[i] = 0x1010101; }
+	printf( "CFA realloc\n" );
+	for ( i; 2 * dim ) { printf( "%#x ", p[i] ); }
+	printf( "\n" );
+	// do not free
+
+
+	// resize, array types
+	printf( "\n" );
+
+	p = alloc( p, dim );                                // CFA resize array alloc
+	for ( i; dim ) { p[i] = 0xdeadbeef; }
+	printf( "CFA resize alloc\n" );
+	for ( i; dim ) { printf( "%#x ", p[i] ); }
+	printf( "\n" );
+
+	p = alloc( p, 2 * dim );                            // CFA resize array alloc
+	for ( i; dim ~ 2 * dim ) { p[i] = 0x1010101; }
+	printf( "CFA resize array alloc\n" );
+	for ( i; 2 * dim ) { printf( "%#x ", p[i] ); }
+	printf( "\n" );
+
+	p = alloc( p, dim );                                // CFA array alloc
+	printf( "CFA resize array alloc\n" );
+	for ( i; dim ) { printf( "%#x ", p[i] ); }
+	printf( "\n" );
+
+	free( p );
+	p = 0;
+
+	p = alloc( p, dim, fill );                          // CFA array alloc, fill
+	printf( "CFA resize array alloc, fill\n" );
+	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 ( 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 ( i; dim ) { printf( "%#x ", p[i] );; }
+	printf( "\n" );
+	free( p );
+
+
+	struct Struct { int x; double y; };
+	Struct st, st1, sta[dim], sta1[dim], * stp, * stp1;
+
+	// alignment, non-array types
+	printf( "\n" );
+	enum { Alignment = 128 };
+
+	stp = &(*(Struct*)memalign( Alignment, sizeof( *stp ) ) ){ 42, 42.5 }; // C memalign
+	assert( (uintptr_t)stp % Alignment == 0 );
+	printf( "C   memalign %d %g\n", stp->x, stp->y );
+	free( stp );
+
+	stp = &(*memalign( Alignment )){ 42, 42.5 };          // CFA memalign
+	assert( (uintptr_t)stp % Alignment == 0 );
+	printf( "CFA memalign %d %g\n", stp->x, stp->y );
+	free( stp );
+
+	posix_memalign( (void **)&stp, Alignment, sizeof( *stp ) ); // C posix_memalign
+	*stp = (Struct){ 42, 42.5 };
+	assert( (uintptr_t)stp % Alignment == 0 );
+	printf( "CFA posix_memalign %d %g\n", stp->x, stp->y );
+	free( stp );
+
+	posix_memalign( &stp, Alignment );                  // CFA posix_memalign
+	*stp = (Struct){ 42, 42.5 };
+	assert( (uintptr_t)stp % Alignment == 0 );
+	printf( "CFA posix_memalign %d %g\n", stp->x, stp->y );
+	free( stp );
+
+	stp = &(*aligned_alloc( Alignment )){ 42, 42.5 };     // CFA aligned_alloc
+	assert( (uintptr_t)stp % Alignment == 0 );
+	printf( "CFA aligned_alloc %d %g\n", stp->x, stp->y );
+	free( stp );
+
+	stp = &(*align_alloc( Alignment )){ 42, 42.5 };       // CFA align_alloc
+	assert( (uintptr_t)stp % Alignment == 0 );
+	printf( "CFA align_alloc %d %g\n", stp->x, stp->y );
+	free( stp );
+
+	stp = align_alloc( Alignment, fill );               // CFA memalign, fill
+	assert( (uintptr_t)stp % Alignment == 0 );
+	printf( "CFA align_alloc fill %#x %a\n", stp->x, stp->y );
+	free( stp );
+
+
+	// alignment, array types
+	printf( "\n" );
+
+	stp = align_alloc( Alignment, dim );                // CFA array memalign
+	assert( (uintptr_t)stp % Alignment == 0 );
+	for ( i; dim ) { stp[i] = (Struct){ 42, 42.5 }; }
+	printf( "CFA array align_alloc\n" );
+	for ( i; dim ) { printf( "%d %g, ", stp[i].x, stp[i].y ); }
+	printf( "\n" );
+	free( stp );
+
+	stp = align_alloc( Alignment, dim, fill );          // CFA array memalign, fill
+	assert( (uintptr_t)stp % Alignment == 0 );
+	printf( "CFA array align_alloc, fill\n" );
+	for ( i; dim ) { printf( "%#x %a, ", stp[i].x, stp[i].y ); }
+	printf( "\n" );
+	free( stp );
+
+
+	// data, non-array types
+	printf( "\n" );
+
+	memset( &st, fill );                                // CFA memset, type safe
+	printf( "CFA memset %#x %a\n", st.x, st.y );
+	memcpy( &st1, &st );                                // CFA memcpy, type safe
+	printf( "CFA memcpy %#x %a\n", st1.x, st1.y );
+
+
+	// data, array types
+	printf( "\n" );
+
+	amemset( sta, fill, dim );							// CFA array memset, type safe
+	printf( "CFA array memset\n" );
+	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 ( i; dim ) { printf( "%#x %a, ", sta1[i].x, sta1[i].y ); }
+	printf( "\n" );
+
+
+	// new, non-array types
+	printf( "\n" );
+
+	stp = new( 42, 42.5 );
+	stp1 = new( 42, 42.5 );
+	printf( "CFA new initialize\n%d %g %d %g\n", stp->x, stp->y, stp1->x, stp1->y );
+	delete( stp, stp1 );
+
+	// new, array types
+	stp = anew( dim, 42, 42.5 );
+	printf( "CFA array new initialize\n" );
+	for ( i; dim ) { printf( "%d %g, ", stp[i].x, stp[i].y ); }
+	printf( "\n" );
+	stp1 = anew( dim, 42, 42.5 );
+	for ( i; dim ) { printf( "%d %g, ", stp1[i].x, stp1[i].y ); }
+	printf( "\n" );
+	adelete( dim, stp, dim, stp1 );
+
+	// extras
+	printf( "\n" );
+
+	float * fp = malloc() + 1;
+	printf( "pointer arithmetic %d\n", fp == fp - 1 );
+	free( fp - 1 );
+
+	p = foo( bar( baz( malloc(), 0 ), 0 ), 0 );
+	*p = 0xdeadbeef;
+	printf( "CFA deep malloc %#x\n", *p );
+	free( p );
+
+#ifdef ERR1
+	stp = malloc();
+	printf( "\nSHOULD FAIL\n" );
+	p = realloc( stp, dim * sizeof( *stp ) );
+	p = alloc( stp, dim * sizeof( *stp ) );
+	p = memset( stp, 10 );
+	p = memcpy( &st1, &st );
+#endif
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa alloc.cfa" //
+// End: //
Index: sts/array.c
===================================================================
--- tests/array.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,40 +1,0 @@
-//Testing array declarations
-int a1[];
-//int a2[*];
-//double a4[3.0];
-
-int m1[][3];
-//int m2[*][*];
-int m4[3][3];
-
-typedef int T;
-
-int fred() {
-//	int a1[];
-//	int a2[*];
-	int a4[3];
-	int T[3];
-}
-
-int mary( int T[3],
-		  int p1[const 3],
-		  int p2[static 3],
-		  int p3[static const 3]
-	) {
-}
-
-int (*tom())[3] {
-}
-
-int (*(jane)())( int T[3],
-				 int p1[const 3],
-				 int p2[static 3],
-				 int p3[static const 3]
-	) {
-}
-
-//Dummy main
-int main(int argc, char const *argv[])
-{
-	return 0;
-}
Index: tests/array.cfa
===================================================================
--- tests/array.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/array.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,40 @@
+//Testing array declarations
+int a1[];
+//int a2[*];
+//double a4[3.0];
+
+int m1[][3];
+//int m2[*][*];
+int m4[3][3];
+
+typedef int T;
+
+int fred() {
+//	int a1[];
+//	int a2[*];
+	int a4[3];
+	int T[3];
+}
+
+int mary( int T[3],
+		  int p1[const 3],
+		  int p2[static 3],
+		  int p3[static const 3]
+	) {
+}
+
+int (*tom())[3] {
+}
+
+int (*(jane)())( int T[3],
+				 int p1[const 3],
+				 int p2[static 3],
+				 int p3[static const 3]
+	) {
+}
+
+//Dummy main
+int main(int argc, char const *argv[])
+{
+	return 0;
+}
Index: sts/ato.c
===================================================================
--- tests/ato.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,123 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// ato.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Thu Feb  4 08:10:57 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Nov 16 18:31:56 2017
-// Update Count     : 89
-//
-
-#include <fstream.hfa>
-#include <stdlib.hfa>										// ato, strto
-
-int main( void ) {
-	const char * sptr = "-123";
-	int i = ato( sptr );
-	sout | i | sptr | endl;
-	sptr = "123";
-	unsigned int ui = ato( sptr );
-	sout | ui | sptr | endl;
-
-	sptr = "-123";
-	long int li = ato( sptr );
-	sout | li | sptr | endl;
-	sptr = "123";
-	unsigned long int uli = ato( sptr );
-	sout | uli | sptr | endl;
-
-	sptr = "-123";
-	long long int lli = ato( sptr );
-	sout | lli | sptr | endl;
-	sptr = "123";
-	unsigned long long int ulli = ato( sptr );
-	sout | ulli | sptr | endl;
-
-	sptr = "-123.456";
-	float f = ato( sptr );
-	sout | f | sptr | endl;
-	sptr = "-123.4567890123456";
-	double d = ato( sptr );
-	sout | d | sptr | endl;
-	sptr = "-123.45678901234567890123456789";
-	long double ld = ato( sptr );
-	sout | ld | sptr | endl;
-
-	sptr = "-123.456-123.456i";
-	float _Complex fc = ato( sptr );
-	sout | fc | sptr | endl;
-	sptr = "-123.4567890123456+123.4567890123456i";
-	double _Complex dc = ato( sptr );
-	sout | dc | sptr | endl;
-	sptr = "123.45678901234567890123456789-123.45678901234567890123456789i";
-	long double _Complex ldc = ato( sptr );
-	sout | ldc | sptr | endl;
-	sptr = "123.45678901234-123.4567890i";
-	long double _Complex ldc2 = ato( sptr );
-	sout | ldc2 | sptr | endl;
-
-
-	sptr = "-123";
-	i = strto( sptr, 0, 10 );
-	sout | i | sptr | endl;
-	sptr = "123";
-	ui = strto( sptr, 0, 10 );
-	sout | ui | sptr | endl;
-
-	sptr = "-123";
-	li = strto( sptr, 0, 10 );
-	sout | li | sptr | endl;
-	sptr = "123";
-	uli = strto( sptr, 0, 10 );
-	sout | uli | sptr | endl;
-
-	sptr = "-123";
-	lli = strto( sptr, 0, 10 );
-	sout | lli | sptr | endl;
-	sptr = "123";
-	ulli = strto( sptr, 0, 10 );
-	sout | ulli | sptr | endl;
-
-	sptr = "-123.456";
-	f = strto( sptr, 0 );
-	sout | f | sptr | endl;
-	sptr = "-123.4567890123456";
-	d = strto( sptr, 0 );
-	sout | d | sptr | endl;
-	sptr = "-123.45678901234567890123456789";
-	ld = strto( sptr, 0 );
-	sout | ld | sptr | endl;
-
-	sptr = "-123.456-123.456i";
-	fc = strto( sptr, 0 );
-	sout | fc | sptr | endl;
-
-	char * eptr = 0;
-	// sptr = "2fred";
-	// fc = strto( sptr, &eptr );
-	// sout | fc | sptr | eptr | endl;
-
-	sptr = "2  3";
-	fc = strto( sptr, &eptr );
-	sout | fc | sptr | eptr | endl;
-
-	sptr = "-123.4567890123456+123.4567890123456i";
-	dc = strto( sptr, 0 );
-	sout | dc | sptr | endl;
-	sptr = "123.45678901234567890123456789-123.45678901234567890123456789i";
-	ldc = strto( sptr, 0 );
-	sout | ldc | sptr | endl;
-	sptr = "123.45678901234-123.4567890i";
-	ldc2 = strto( sptr, 0 );
-	sout | ldc2 | sptr | endl;
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa ato.c" //
-// End: //
Index: tests/ato.cfa
===================================================================
--- tests/ato.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/ato.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,123 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// ato.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Thu Feb  4 08:10:57 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:51:03 2018
+// Update Count     : 91
+//
+
+#include <fstream.hfa>
+#include <stdlib.hfa>										// ato, strto
+
+int main( void ) {
+	const char * sptr = "-123";
+	int i = ato( sptr );
+	sout | i | sptr | endl;
+	sptr = "123";
+	unsigned int ui = ato( sptr );
+	sout | ui | sptr | endl;
+
+	sptr = "-123";
+	long int li = ato( sptr );
+	sout | li | sptr | endl;
+	sptr = "123";
+	unsigned long int uli = ato( sptr );
+	sout | uli | sptr | endl;
+
+	sptr = "-123";
+	long long int lli = ato( sptr );
+	sout | lli | sptr | endl;
+	sptr = "123";
+	unsigned long long int ulli = ato( sptr );
+	sout | ulli | sptr | endl;
+
+	sptr = "-123.456";
+	float f = ato( sptr );
+	sout | f | sptr | endl;
+	sptr = "-123.4567890123456";
+	double d = ato( sptr );
+	sout | d | sptr | endl;
+	sptr = "-123.45678901234567890123456789";
+	long double ld = ato( sptr );
+	sout | ld | sptr | endl;
+
+	sptr = "-123.456-123.456i";
+	float _Complex fc = ato( sptr );
+	sout | fc | sptr | endl;
+	sptr = "-123.4567890123456+123.4567890123456i";
+	double _Complex dc = ato( sptr );
+	sout | dc | sptr | endl;
+	sptr = "123.45678901234567890123456789-123.45678901234567890123456789i";
+	long double _Complex ldc = ato( sptr );
+	sout | ldc | sptr | endl;
+	sptr = "123.45678901234-123.4567890i";
+	long double _Complex ldc2 = ato( sptr );
+	sout | ldc2 | sptr | endl;
+
+
+	sptr = "-123";
+	i = strto( sptr, 0, 10 );
+	sout | i | sptr | endl;
+	sptr = "123";
+	ui = strto( sptr, 0, 10 );
+	sout | ui | sptr | endl;
+
+	sptr = "-123";
+	li = strto( sptr, 0, 10 );
+	sout | li | sptr | endl;
+	sptr = "123";
+	uli = strto( sptr, 0, 10 );
+	sout | uli | sptr | endl;
+
+	sptr = "-123";
+	lli = strto( sptr, 0, 10 );
+	sout | lli | sptr | endl;
+	sptr = "123";
+	ulli = strto( sptr, 0, 10 );
+	sout | ulli | sptr | endl;
+
+	sptr = "-123.456";
+	f = strto( sptr, 0 );
+	sout | f | sptr | endl;
+	sptr = "-123.4567890123456";
+	d = strto( sptr, 0 );
+	sout | d | sptr | endl;
+	sptr = "-123.45678901234567890123456789";
+	ld = strto( sptr, 0 );
+	sout | ld | sptr | endl;
+
+	sptr = "-123.456-123.456i";
+	fc = strto( sptr, 0 );
+	sout | fc | sptr | endl;
+
+	char * eptr = 0;
+	// sptr = "2fred";
+	// fc = strto( sptr, &eptr );
+	// sout | fc | sptr | eptr | endl;
+
+	sptr = "2  3";
+	fc = strto( sptr, &eptr );
+	sout | fc | sptr | eptr | endl;
+
+	sptr = "-123.4567890123456+123.4567890123456i";
+	dc = strto( sptr, 0 );
+	sout | dc | sptr | endl;
+	sptr = "123.45678901234567890123456789-123.45678901234567890123456789i";
+	ldc = strto( sptr, 0 );
+	sout | ldc | sptr | endl;
+	sptr = "123.45678901234-123.4567890i";
+	ldc2 = strto( sptr, 0 );
+	sout | ldc2 | sptr | endl;
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa ato.cfa" //
+// End: //
Index: sts/attributes.c
===================================================================
--- tests/attributes.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,157 +1,0 @@
-// 
-// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-// 
-// attributes.c -- 
-// 
-// Author           : Peter A. Buhr
-// Created On       : Mon Feb  6 16:07:02 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 19 13:50:51 2018
-// Update Count     : 15
-// 
-
-
-// label attribute
-int la() {
-  L: __attribute__(( unused )) 1;
-}
-
-
-// aggregate_name
-struct __attribute__(( unused )) {};
-struct __attribute__(( unused )) Agn1;
-struct __attribute__(( unused )) Agn2 {};
-enum __attribute__(( unused )) { E1 };
-enum __attribute__(( unused )) Agn3;
-enum __attribute__(( packed )) Agn3 { E2 };
-#ifdef __CFA__
-struct __attribute__(( unused )) {} ( int );
-struct __attribute__(( unused )) Agn4 {} ( int );
-#endif // __CFA__
-
-
-// field_declaring_list
-struct Fdl {
-    int f1 __attribute__(( unused ));
-    int __attribute__(( unused )) f2;
-    int __attribute__(( unused )) f3 __attribute__(( unused ));
-    __attribute__(( unused )) int f4;
-    __attribute__(( unused )) int f5 __attribute__(( unused ));
-    __attribute__(( used )) int f6 __attribute__(( packed )), f7 __attribute__(( unused )) __attribute__(( unused )), __attribute__(( used )) f8 __attribute__(( unused ));
-    int ( ( * (f9) __attribute__(( unused )) ) __attribute__(( unused )) );
-};
-
-
-// asm_name_opt
-int f() asm( "xyz" ) __attribute__(( unused ));
-
-
-// variable_declarator
-const __attribute__(( used )) int vd1 __attribute__(( used )), __attribute__(( unused )) vd2;
-const __attribute__(( used )) int __attribute__(( used )) * __attribute__(( used )) vd3 __attribute__(( used )), __attribute__(( unused )) (* __attribute__(( unused )) (vd4)) __attribute__(( used ));
-const __attribute__(( used )) int __attribute__(( used )) vd5[5] __attribute__(( used )), __attribute__(( unused )) ((vd6)[5]) __attribute__(( used ));
-const __attribute__(( used )) int __attribute__(( used )) (* __attribute__(( used )) vd7)() __attribute__(( used )), __attribute__(( unused )) ((* __attribute__(( used )) vd8)()) __attribute__(( used ));
-
-
-// function_declarator
-__attribute__(( unused )) int f1() __attribute__(( used ));
-__attribute__(( unused )) int f1() {}
-__attribute__(( unused )) int * __attribute__(( unused )) * const __attribute__(( unused )) f2() __attribute__(( used ));
-__attribute__(( unused )) int * __attribute__(( unused )) * const __attribute__(( unused )) f2() {}
-__attribute__(( unused )) int (* __attribute__(( unused )) f3(int))[] __attribute__(( used ));
-__attribute__(( unused )) int (* __attribute__(( unused )) f3(int p))[] {}
-__attribute__(( unused )) int (* __attribute__(( unused )) f4())(int) __attribute__(( used ));
-__attribute__(( unused )) int (* __attribute__(( unused )) f4())(int) {}
-
-
-// variable_type_redeclarator
-typedef int t1, t2, t3, t4, t5, t6, t7, t8;
-int vtr() {
-    // redefine typedef name in new scope
-    __attribute__(( unused )) int __attribute__(( unused )) t1 __attribute__(( used ));
-    __attribute__(( unused )) int __attribute__(( unused )) (* (* t2 __attribute__(( unused )) ) __attribute__(( unused )) ) __attribute__(( unused ));
-    __attribute__(( unused )) int __attribute__(( unused )) t3[5] __attribute__(( unused ));
-    __attribute__(( unused )) int __attribute__(( unused )) (* (* __attribute__(( unused )) t4[5]) __attribute__(( unused )) ) __attribute__(( unused ));
-    __attribute__(( unused )) int __attribute__(( unused )) t5() __attribute__(( unused ));
-    __attribute__(( unused )) int __attribute__(( unused )) * __attribute__(( unused )) ((t6))() __attribute__(( unused ));
-}
-
-
-// identifier_parameter_declarator
-int ipd1( __attribute__(( unused )) int __attribute__(( unused )) p __attribute__(( unused )),
-	  __attribute__(( unused )) int __attribute__(( unused )) q __attribute__(( unused )) );
-int ipd1( __attribute__(( unused )) int __attribute__(( unused )) p __attribute__(( unused )),
-	  __attribute__(( unused )) int __attribute__(( unused )) q __attribute__(( unused )) ) {}
-int ipd2( __attribute__(( unused )) int __attribute__(( unused )) * __attribute__(( unused )) p __attribute__(( unused )),
-	  __attribute__(( unused )) int __attribute__(( unused )) (* (q)) __attribute__(( unused )) );
-int ipd2( __attribute__(( unused )) int __attribute__(( unused )) * __attribute__(( unused )) p __attribute__(( unused )),
-	  __attribute__(( unused )) int __attribute__(( unused )) (* (q)) __attribute__(( unused )) ) {}
-int ipd3( __attribute__(( unused )) int __attribute__(( unused )) p[] __attribute__(( unused )),
-	  __attribute__(( unused )) int __attribute__(( unused )) ((q)[]) __attribute__(( unused )) );
-int ipd3( __attribute__(( unused )) int __attribute__(( unused )) p[] __attribute__(( unused )),
-	  __attribute__(( unused )) int __attribute__(( unused )) ((q)[]) __attribute__(( unused )) ) {}
-int ipd4( __attribute__(( unused )) int __attribute__(( unused )) p() __attribute__(( unused )),
-	  __attribute__(( unused )) int __attribute__(( unused )) ((q)()) __attribute__(( unused )) );
-int ipd4( __attribute__(( unused )) int __attribute__(( unused )) p() __attribute__(( unused )),
-	  __attribute__(( unused )) int __attribute__(( unused )) ((q)()) __attribute__(( unused )) ) {}
-
-
-// type_parameter_redeclarator
-typedef int Foo;
-int tpr1( __attribute__(( unused )) int __attribute__(( unused )) Foo __attribute__(( unused )) );
-int tpr2( __attribute__(( unused )) int __attribute__(( unused )) (* __attribute__(( unused )) (* __attribute__(( unused )) Foo) __attribute__(( unused )) ) __attribute__(( unused )) );
-int tpr3( __attribute__(( unused )) int __attribute__(( unused )) Foo[]  __attribute__(( unused )));
-int tpr4( __attribute__(( unused )) int __attribute__(( unused )) ( __attribute__(( unused )) Foo[5] __attribute__(( unused )) ) );
-int tpr5( __attribute__(( unused )) int __attribute__(( unused )) (*Foo)() __attribute__(( unused )) );
-int tpr6( __attribute__(( unused )) int __attribute__(( unused )) Foo() __attribute__(( unused )) );
-int tpr7( __attribute__(( unused )) int __attribute__(( unused )) ( __attribute__(( unused )) Foo( __attribute__(( unused )) int __attribute__(( unused )) ) ) );
-
-
-// abstract_declarator
-int ad() {
-    typeof( int __attribute__(( used )) ) ad1 __attribute__(( unused ));
-    typeof( int __attribute__(( unused )) * __attribute__(( unused )) ) ad2 __attribute__(( unused ));
-    typeof( int __attribute__(( unused )) [5] ) __attribute__(( unused )) ad3 __attribute__(( unused ));
-    typeof( __attribute__(( unused )) int __attribute__(( unused )) (*)[10] __attribute__(( unused )) ) __attribute__(( unused )) ad4 __attribute__(( unused )), ad5 __attribute__(( used ));
-    typeof( __attribute__(( unused )) int __attribute__(( unused )) () __attribute__(( unused )) ) __attribute__(( unused )) ad6 __attribute__(( unused ));
-    sizeof( __attribute__(( unused )) int __attribute__(( unused )) );
-    sizeof( __attribute__(( unused )) int __attribute__(( unused )) (* __attribute__(( unused )) (* __attribute__(( unused )) ) ) );
-    sizeof( __attribute__(( unused )) int __attribute__(( unused )) [5] __attribute__(( unused )) );
-    sizeof( __attribute__(( unused )) int __attribute__(( unused )) (*)[10] __attribute__(( unused )) );
-    sizeof( __attribute__(( unused )) int __attribute__(( unused )) () __attribute__(( unused )) );
-    sizeof( struct { int i; } __attribute__(( unused )) );
-    sizeof( enum { R } __attribute__(( unused )) );
-}
-
-
-// abstract_parameter_declarator
-int apd1( __attribute__(( unused )) int __attribute__(( unused )) * __attribute__(( unused )),
-	__attribute__(( unused )) int __attribute__(( unused )) * __attribute__(( unused )) );
-int apd2( __attribute__(( unused )) int __attribute__(( unused )) (* (* __attribute__(( unused )) ) __attribute__(( unused )) ),
-	__attribute__(( unused )) int __attribute__(( unused )) (* (* __attribute__(( unused )) ) __attribute__(( unused )) ) );
-int apd3( __attribute__(( unused )) int __attribute__(( unused )) ([]) __attribute__(( unused )),
-	__attribute__(( unused )) int __attribute__(( unused )) ([]) __attribute__(( unused )) );
-int apd4( __attribute__(( unused )) int __attribute__(( unused )) ()  __attribute__(( unused )),
-	__attribute__(( unused )) int __attribute__(( unused )) ()  __attribute__(( unused )) );
-int apd5( __attribute__(( unused )) int __attribute__(( unused )) (( __attribute__(( unused )) int )) __attribute__(( unused )),
-	__attribute__(( unused )) int __attribute__(( unused )) ( __attribute__(( unused )) int ) __attribute__(( unused )) );
-int apd6( __attribute__(( unused )) int __attribute__(( unused )) (*)()  __attribute__(( unused )),
-	__attribute__(( unused )) int __attribute__(( unused )) (*)()  __attribute__(( unused )) );
-int apd7( __attribute__(( unused )) int __attribute__(( unused )) ((*)( __attribute__(( unused )) int ) ) __attribute__(( unused )),
-	__attribute__(( unused )) int __attribute__(( unused )) ((*)( __attribute__(( unused )) int ) ) __attribute__(( unused )) );
-
-
-// variable_abstract_declarator
-struct Vad {
-    int __attribute__(( unused ));
-    int __attribute__(( unused )) :4;
-    int __attribute__(( unused )) :4, __attribute__(( unused )) :6;
-};
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa attributes.c" //
-// End: //
Index: tests/attributes.cfa
===================================================================
--- tests/attributes.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/attributes.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,157 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// attributes.cfa -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Mon Feb  6 16:07:02 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:51:12 2018
+// Update Count     : 17
+// 
+
+
+// label attribute
+int la() {
+  L: __attribute__(( unused )) 1;
+}
+
+
+// aggregate_name
+struct __attribute__(( unused )) {};
+struct __attribute__(( unused )) Agn1;
+struct __attribute__(( unused )) Agn2 {};
+enum __attribute__(( unused )) { E1 };
+enum __attribute__(( unused )) Agn3;
+enum __attribute__(( packed )) Agn3 { E2 };
+#ifdef __CFA__
+struct __attribute__(( unused )) {} ( int );
+struct __attribute__(( unused )) Agn4 {} ( int );
+#endif // __CFA__
+
+
+// field_declaring_list
+struct Fdl {
+    int f1 __attribute__(( unused ));
+    int __attribute__(( unused )) f2;
+    int __attribute__(( unused )) f3 __attribute__(( unused ));
+    __attribute__(( unused )) int f4;
+    __attribute__(( unused )) int f5 __attribute__(( unused ));
+    __attribute__(( used )) int f6 __attribute__(( packed )), f7 __attribute__(( unused )) __attribute__(( unused )), __attribute__(( used )) f8 __attribute__(( unused ));
+    int ( ( * (f9) __attribute__(( unused )) ) __attribute__(( unused )) );
+};
+
+
+// asm_name_opt
+int f() asm( "xyz" ) __attribute__(( unused ));
+
+
+// variable_declarator
+const __attribute__(( used )) int vd1 __attribute__(( used )), __attribute__(( unused )) vd2;
+const __attribute__(( used )) int __attribute__(( used )) * __attribute__(( used )) vd3 __attribute__(( used )), __attribute__(( unused )) (* __attribute__(( unused )) (vd4)) __attribute__(( used ));
+const __attribute__(( used )) int __attribute__(( used )) vd5[5] __attribute__(( used )), __attribute__(( unused )) ((vd6)[5]) __attribute__(( used ));
+const __attribute__(( used )) int __attribute__(( used )) (* __attribute__(( used )) vd7)() __attribute__(( used )), __attribute__(( unused )) ((* __attribute__(( used )) vd8)()) __attribute__(( used ));
+
+
+// function_declarator
+__attribute__(( unused )) int f1() __attribute__(( used ));
+__attribute__(( unused )) int f1() {}
+__attribute__(( unused )) int * __attribute__(( unused )) * const __attribute__(( unused )) f2() __attribute__(( used ));
+__attribute__(( unused )) int * __attribute__(( unused )) * const __attribute__(( unused )) f2() {}
+__attribute__(( unused )) int (* __attribute__(( unused )) f3(int))[] __attribute__(( used ));
+__attribute__(( unused )) int (* __attribute__(( unused )) f3(int p))[] {}
+__attribute__(( unused )) int (* __attribute__(( unused )) f4())(int) __attribute__(( used ));
+__attribute__(( unused )) int (* __attribute__(( unused )) f4())(int) {}
+
+
+// variable_type_redeclarator
+typedef int t1, t2, t3, t4, t5, t6, t7, t8;
+int vtr() {
+    // redefine typedef name in new scope
+    __attribute__(( unused )) int __attribute__(( unused )) t1 __attribute__(( used ));
+    __attribute__(( unused )) int __attribute__(( unused )) (* (* t2 __attribute__(( unused )) ) __attribute__(( unused )) ) __attribute__(( unused ));
+    __attribute__(( unused )) int __attribute__(( unused )) t3[5] __attribute__(( unused ));
+    __attribute__(( unused )) int __attribute__(( unused )) (* (* __attribute__(( unused )) t4[5]) __attribute__(( unused )) ) __attribute__(( unused ));
+    __attribute__(( unused )) int __attribute__(( unused )) t5() __attribute__(( unused ));
+    __attribute__(( unused )) int __attribute__(( unused )) * __attribute__(( unused )) ((t6))() __attribute__(( unused ));
+}
+
+
+// identifier_parameter_declarator
+int ipd1( __attribute__(( unused )) int __attribute__(( unused )) p __attribute__(( unused )),
+	  __attribute__(( unused )) int __attribute__(( unused )) q __attribute__(( unused )) );
+int ipd1( __attribute__(( unused )) int __attribute__(( unused )) p __attribute__(( unused )),
+	  __attribute__(( unused )) int __attribute__(( unused )) q __attribute__(( unused )) ) {}
+int ipd2( __attribute__(( unused )) int __attribute__(( unused )) * __attribute__(( unused )) p __attribute__(( unused )),
+	  __attribute__(( unused )) int __attribute__(( unused )) (* (q)) __attribute__(( unused )) );
+int ipd2( __attribute__(( unused )) int __attribute__(( unused )) * __attribute__(( unused )) p __attribute__(( unused )),
+	  __attribute__(( unused )) int __attribute__(( unused )) (* (q)) __attribute__(( unused )) ) {}
+int ipd3( __attribute__(( unused )) int __attribute__(( unused )) p[] __attribute__(( unused )),
+	  __attribute__(( unused )) int __attribute__(( unused )) ((q)[]) __attribute__(( unused )) );
+int ipd3( __attribute__(( unused )) int __attribute__(( unused )) p[] __attribute__(( unused )),
+	  __attribute__(( unused )) int __attribute__(( unused )) ((q)[]) __attribute__(( unused )) ) {}
+int ipd4( __attribute__(( unused )) int __attribute__(( unused )) p() __attribute__(( unused )),
+	  __attribute__(( unused )) int __attribute__(( unused )) ((q)()) __attribute__(( unused )) );
+int ipd4( __attribute__(( unused )) int __attribute__(( unused )) p() __attribute__(( unused )),
+	  __attribute__(( unused )) int __attribute__(( unused )) ((q)()) __attribute__(( unused )) ) {}
+
+
+// type_parameter_redeclarator
+typedef int Foo;
+int tpr1( __attribute__(( unused )) int __attribute__(( unused )) Foo __attribute__(( unused )) );
+int tpr2( __attribute__(( unused )) int __attribute__(( unused )) (* __attribute__(( unused )) (* __attribute__(( unused )) Foo) __attribute__(( unused )) ) __attribute__(( unused )) );
+int tpr3( __attribute__(( unused )) int __attribute__(( unused )) Foo[]  __attribute__(( unused )));
+int tpr4( __attribute__(( unused )) int __attribute__(( unused )) ( __attribute__(( unused )) Foo[5] __attribute__(( unused )) ) );
+int tpr5( __attribute__(( unused )) int __attribute__(( unused )) (*Foo)() __attribute__(( unused )) );
+int tpr6( __attribute__(( unused )) int __attribute__(( unused )) Foo() __attribute__(( unused )) );
+int tpr7( __attribute__(( unused )) int __attribute__(( unused )) ( __attribute__(( unused )) Foo( __attribute__(( unused )) int __attribute__(( unused )) ) ) );
+
+
+// abstract_declarator
+int ad() {
+    typeof( int __attribute__(( used )) ) ad1 __attribute__(( unused ));
+    typeof( int __attribute__(( unused )) * __attribute__(( unused )) ) ad2 __attribute__(( unused ));
+    typeof( int __attribute__(( unused )) [5] ) __attribute__(( unused )) ad3 __attribute__(( unused ));
+    typeof( __attribute__(( unused )) int __attribute__(( unused )) (*)[10] __attribute__(( unused )) ) __attribute__(( unused )) ad4 __attribute__(( unused )), ad5 __attribute__(( used ));
+    typeof( __attribute__(( unused )) int __attribute__(( unused )) () __attribute__(( unused )) ) __attribute__(( unused )) ad6 __attribute__(( unused ));
+    sizeof( __attribute__(( unused )) int __attribute__(( unused )) );
+    sizeof( __attribute__(( unused )) int __attribute__(( unused )) (* __attribute__(( unused )) (* __attribute__(( unused )) ) ) );
+    sizeof( __attribute__(( unused )) int __attribute__(( unused )) [5] __attribute__(( unused )) );
+    sizeof( __attribute__(( unused )) int __attribute__(( unused )) (*)[10] __attribute__(( unused )) );
+    sizeof( __attribute__(( unused )) int __attribute__(( unused )) () __attribute__(( unused )) );
+    sizeof( struct { int i; } __attribute__(( unused )) );
+    sizeof( enum { R } __attribute__(( unused )) );
+}
+
+
+// abstract_parameter_declarator
+int apd1( __attribute__(( unused )) int __attribute__(( unused )) * __attribute__(( unused )),
+	__attribute__(( unused )) int __attribute__(( unused )) * __attribute__(( unused )) );
+int apd2( __attribute__(( unused )) int __attribute__(( unused )) (* (* __attribute__(( unused )) ) __attribute__(( unused )) ),
+	__attribute__(( unused )) int __attribute__(( unused )) (* (* __attribute__(( unused )) ) __attribute__(( unused )) ) );
+int apd3( __attribute__(( unused )) int __attribute__(( unused )) ([]) __attribute__(( unused )),
+	__attribute__(( unused )) int __attribute__(( unused )) ([]) __attribute__(( unused )) );
+int apd4( __attribute__(( unused )) int __attribute__(( unused )) ()  __attribute__(( unused )),
+	__attribute__(( unused )) int __attribute__(( unused )) ()  __attribute__(( unused )) );
+int apd5( __attribute__(( unused )) int __attribute__(( unused )) (( __attribute__(( unused )) int )) __attribute__(( unused )),
+	__attribute__(( unused )) int __attribute__(( unused )) ( __attribute__(( unused )) int ) __attribute__(( unused )) );
+int apd6( __attribute__(( unused )) int __attribute__(( unused )) (*)()  __attribute__(( unused )),
+	__attribute__(( unused )) int __attribute__(( unused )) (*)()  __attribute__(( unused )) );
+int apd7( __attribute__(( unused )) int __attribute__(( unused )) ((*)( __attribute__(( unused )) int ) ) __attribute__(( unused )),
+	__attribute__(( unused )) int __attribute__(( unused )) ((*)( __attribute__(( unused )) int ) ) __attribute__(( unused )) );
+
+
+// variable_abstract_declarator
+struct Vad {
+    int __attribute__(( unused ));
+    int __attribute__(( unused )) :4;
+    int __attribute__(( unused )) :4, __attribute__(( unused )) :6;
+};
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa attributes.cfa" //
+// End: //
Index: sts/cast.c
===================================================================
--- tests/cast.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,18 +1,0 @@
-//Testing some valid casts of chars
-char f;
-
-void f() {
-	char f;
-	double f;
-	(int)f;
-	short f;
-	(int)f;
-	(void(*)())f;
-//	([long, long double, *[]()])([f, f, f]);
-}
-
-//Dummy main
-int main(int argc, char const *argv[])
-{
-	return 0;
-}
Index: tests/cast.cfa
===================================================================
--- tests/cast.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/cast.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,18 @@
+//Testing some valid casts of chars
+char f;
+
+void f() {
+	char f;
+	double f;
+	(int)f;
+	short f;
+	(int)f;
+	(void(*)())f;
+//	([long, long double, *[]()])([f, f, f]);
+}
+
+//Dummy main
+int main(int argc, char const *argv[])
+{
+	return 0;
+}
Index: sts/castError.c
===================================================================
--- tests/castError.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,15 +1,0 @@
-//Testing some of the invalid casts of chars
-int f;
-
-void f() {
-	int f;
-	double f;
-	(char)f;
-	(int(*)())f;
-}
-
-//Dummy main
-int main(int argc, char const *argv[])
-{
-	return 0;
-}
Index: tests/castError.cfa
===================================================================
--- tests/castError.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/castError.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,15 @@
+//Testing some of the invalid casts of chars
+int f;
+
+void f() {
+	int f;
+	double f;
+	(char)f;
+	(int(*)())f;
+}
+
+//Dummy main
+int main(int argc, char const *argv[])
+{
+	return 0;
+}
Index: sts/commentMisc.c
===================================================================
--- tests/commentMisc.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,6 +1,0 @@
-// alternative ANSI99 brackets
-
-int main() <%
-    int x<:10:>;
-%>
-
Index: tests/commentMisc.cfa
===================================================================
--- tests/commentMisc.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/commentMisc.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,6 @@
+// alternative ANSI99 brackets
+
+int main() <%
+    int x<:10:>;
+%>
+
Index: sts/completeTypeError.c
===================================================================
--- tests/completeTypeError.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,73 +1,0 @@
-void foo(int *) {}
-void bar(void *) {}
-forall(otype T) void baz(T *);
-forall(dtype T) void qux(T *);
-forall(dtype T | sized(T)) void quux(T *);
-
-struct A; // incomplete
-struct B {}; // complete
-
-int main() {
-	int *i;
-	void *v;
-
-	A * x;
-	A * y;
-	B * x;
-	B * z;
-
-	// okay
-	*i;
-	*x; // picks B
-	*z;
-	foo(i);
-	bar(i);
-	baz(i);
-	qux(i);
-	quux(i);
-
-	bar(v);
-	qux(v);
-
-	// bad
-	*v;
-	*y;
-	foo(v);
-	baz(v);
-	quux(v);
-}
-
-
-forall(otype T)
-void baz(T * x) {
-	// okay
-	bar(x);
-	baz(x);
-	qux(x);
-	quux(x);
-	*x;
-}
-
-forall(dtype T)
-void qux(T * y) {
-	// okay
-	bar(y);
-	qux(y);
-
-	// bad
-	baz(y);
-	quux(y);
-	*y;
-}
-
-forall(dtype T | sized(T))
-void quux(T * z) {
-	// okay
-	bar(z);
-	qux(z);
-	quux(z);
-	*z;
-
-	// bad
-	baz(z);
-}
Index: tests/completeTypeError.cfa
===================================================================
--- tests/completeTypeError.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/completeTypeError.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,73 @@
+void foo(int *) {}
+void bar(void *) {}
+forall(otype T) void baz(T *);
+forall(dtype T) void qux(T *);
+forall(dtype T | sized(T)) void quux(T *);
+
+struct A; // incomplete
+struct B {}; // complete
+
+int main() {
+	int *i;
+	void *v;
+
+	A * x;
+	A * y;
+	B * x;
+	B * z;
+
+	// okay
+	*i;
+	*x; // picks B
+	*z;
+	foo(i);
+	bar(i);
+	baz(i);
+	qux(i);
+	quux(i);
+
+	bar(v);
+	qux(v);
+
+	// bad
+	*v;
+	*y;
+	foo(v);
+	baz(v);
+	quux(v);
+}
+
+
+forall(otype T)
+void baz(T * x) {
+	// okay
+	bar(x);
+	baz(x);
+	qux(x);
+	quux(x);
+	*x;
+}
+
+forall(dtype T)
+void qux(T * y) {
+	// okay
+	bar(y);
+	qux(y);
+
+	// bad
+	baz(y);
+	quux(y);
+	*y;
+}
+
+forall(dtype T | sized(T))
+void quux(T * z) {
+	// okay
+	bar(z);
+	qux(z);
+	quux(z);
+	*z;
+
+	// bad
+	baz(z);
+}
Index: sts/complex.c
===================================================================
--- tests/complex.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,41 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// complex.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Wed May 24 22:07:31 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Wed May 24 22:08:01 2017
-// Update Count     : 1
-//
-
-#include <stdio.h>
-#include <complex.h>
-#ifdef __CFA__
-#include <fstream.hfa>
-#endif // __CFA
-
-int main( void ) {
-    double _Complex x = 3 + 2i, y = 4 + 5i, z;
-    z = x + y;
-    printf( "x:%g+%gi y:%g+%gi z:%g+%gi\n", creal(x), cimag(x), creal(y), cimag(y), creal(z), cimag(z) );
-#ifdef __CFA__
-    sout | "x:" | x | "y:" | y | "z:" | z | endl;
-#endif // __CFA
-    x = 2.1 + 1.3i;
-    y = 3.2 + 4.5i;
-    z = x + y;
-    printf( "x:%g+%gi y:%g+%gi z:%g+%gi\n", creal(x), cimag(x), creal(y), cimag(y), creal(z), cimag(z) );
-#ifdef __CFA__
-    sout | "x:" | x | "y:" | y | "z:" | z | endl;
-#endif // __CFA
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa complex.c" //
-// End: //
Index: tests/complex.cfa
===================================================================
--- tests/complex.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/complex.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,41 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// complex.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Wed May 24 22:07:31 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:51:22 2018
+// Update Count     : 3
+//
+
+#include <stdio.h>
+#include <complex.h>
+#ifdef __CFA__
+#include <fstream.hfa>
+#endif // __CFA
+
+int main( void ) {
+    double _Complex x = 3 + 2i, y = 4 + 5i, z;
+    z = x + y;
+    printf( "x:%g+%gi y:%g+%gi z:%g+%gi\n", creal(x), cimag(x), creal(y), cimag(y), creal(z), cimag(z) );
+#ifdef __CFA__
+    sout | "x:" | x | "y:" | y | "z:" | z | endl;
+#endif // __CFA
+    x = 2.1 + 1.3i;
+    y = 3.2 + 4.5i;
+    z = x + y;
+    printf( "x:%g+%gi y:%g+%gi z:%g+%gi\n", creal(x), cimag(x), creal(y), cimag(y), creal(z), cimag(z) );
+#ifdef __CFA__
+    sout | "x:" | x | "y:" | y | "z:" | z | endl;
+#endif // __CFA
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa complex.cfa" //
+// End: //
Index: tests/concurrent/coroutineYield.c
===================================================================
--- tests/concurrent/coroutineYield.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ tests/concurrent/coroutineYield.c	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -6,5 +6,5 @@
 
 #define __kick_rate 150000ul
-#include "long_tests.h"
+#include "long_tests.hfa"
 
 #ifndef PREEMPTION_RATE
Index: tests/concurrent/examples/matrixSum.c
===================================================================
--- tests/concurrent/examples/matrixSum.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ tests/concurrent/examples/matrixSum.c	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -6,11 +6,11 @@
 // file "LICENCE" distributed with Cforall.
 //
-// matrixSum.c --
+// matrixSum.cfa --
 //
 // Author           : Peter A. Buhr
 // Created On       : Mon Oct  9 08:29:28 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug  9 09:17:30 2018
-// Update Count     : 13
+// Last Modified On : Tue Nov  6 17:51:32 2018
+// Update Count     : 14
 //
 
@@ -59,4 +59,4 @@
 // Local Variables: //
 // tab-width: 4 //
-// compile-command: "cfa matrixSum.c" //
+// compile-command: "cfa matrixSum.cfa" //
 // End: //
Index: tests/concurrent/preempt.c
===================================================================
--- tests/concurrent/preempt.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ tests/concurrent/preempt.c	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -3,5 +3,5 @@
 #include <time.hfa>
 
-#include "long_tests.h"
+#include "long_tests.hfa"
 
 #ifndef PREEMPTION_RATE
Index: tests/concurrent/signal/block.c
===================================================================
--- tests/concurrent/signal/block.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ tests/concurrent/signal/block.c	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -14,5 +14,5 @@
 #include <time.hfa>
 
-#include "long_tests.h"
+#include "long_tests.hfa"
 
 #ifndef PREEMPTION_RATE
Index: tests/concurrent/signal/disjoint.c
===================================================================
--- tests/concurrent/signal/disjoint.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ tests/concurrent/signal/disjoint.c	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -5,5 +5,5 @@
 #include <time.hfa>
 
-#include "long_tests.h"
+#include "long_tests.hfa"
 
 #ifndef PREEMPTION_RATE
Index: tests/concurrent/signal/wait.c
===================================================================
--- tests/concurrent/signal/wait.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ tests/concurrent/signal/wait.c	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -13,5 +13,5 @@
 
 #define __kick_rate 12000ul
-#include "long_tests.h"
+#include "long_tests.hfa"
 
 #ifndef PREEMPTION_RATE
Index: sts/context.c
===================================================================
--- tests/context.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,19 +1,0 @@
-// trait declaration
-
-trait has_q( otype T ) {
-	T q( T );
-};
-
-forall( otype z | has_q( z ) ) void f() {
-	trait has_r( otype T, otype U ) {
-		T r( T, T (T,U) );
-	};
-
-	extern otype x, y | has_r( x, y );
-}
-
-//Dummy main
-int main(int argc, char const *argv[])
-{
-	return 0;
-}
Index: tests/context.cfa
===================================================================
--- tests/context.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/context.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,19 @@
+// trait declaration
+
+trait has_q( otype T ) {
+	T q( T );
+};
+
+forall( otype z | has_q( z ) ) void f() {
+	trait has_r( otype T, otype U ) {
+		T r( T, T (T,U) );
+	};
+
+	extern otype x, y | has_r( x, y );
+}
+
+//Dummy main
+int main(int argc, char const *argv[])
+{
+	return 0;
+}
Index: sts/counter.c
===================================================================
--- tests/counter.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,40 +1,0 @@
-// 
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-// 
-// counter.c -- 
-// 
-// Author           : Aaron B. Moss
-// Created On       : Thu Feb 22 15:27:00 2018
-// Last Modified By : Aaron B. Moss
-// Last Modified On : Thu Feb 22 15:27:00 2018
-// Update Count     : 1
-// 
-
-// Tests unified increment/decrement builtin functions.
-// Could be extended for other arithmetic unifications
-
-struct counter { int x; };
-
-counter& ?+=?( counter& c, one_t ) { ++c.x; return c; }
-
-counter& ?-=?( counter& c, one_t ) { --c.x; return c; }
-
-int main() {
-    counter c = { 42 };
-    c += 1;
-    ++c;
-    c++;
-    printf("%d\n", c.x);
-    c -= 1;
-    --c;
-    c--;
-    printf("%d\n", c.x);
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa counter.c" //
-// End: //
Index: tests/counter.cfa
===================================================================
--- tests/counter.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/counter.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,40 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// counter.cfa -- 
+// 
+// Author           : Aaron B. Moss
+// Created On       : Thu Feb 22 15:27:00 2018
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:50:23 2018
+// Update Count     : 2
+// 
+
+// Tests unified increment/decrement builtin functions.
+// Could be extended for other arithmetic unifications
+
+struct counter { int x; };
+
+counter& ?+=?( counter& c, one_t ) { ++c.x; return c; }
+
+counter& ?-=?( counter& c, one_t ) { --c.x; return c; }
+
+int main() {
+    counter c = { 42 };
+    c += 1;
+    ++c;
+    c++;
+    printf("%d\n", c.x);
+    c -= 1;
+    --c;
+    c--;
+    printf("%d\n", c.x);
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa counter.cfa" //
+// End: //
Index: sts/declarationErrors.c
===================================================================
--- tests/declarationErrors.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,45 +1,0 @@
-// 
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-// 
-// declarationErrors.c -- 
-// 
-// Author           : Peter A. Buhr
-// Created On       : Wed Aug 17 08:23:43 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Sep  9 22:57:52 2016
-// Update Count     : 31
-// 
-
-static short int volatile static const x1;				// duplicate static
-extern short int static volatile const x2;				// multiple extern & static
-extern short int auto static volatile static extern const x3; // duplicate and multiple storage classes
-struct { int i; } const static volatile static x4;		// duplicate static
-struct { int i; } const static volatile const static volatile x5; // duplicate static & const & volatile
-typedef int Int;
-static Int volatile static const x6;					// duplicate static
-
-const static inline const volatile int f01();			// duplicate const
-volatile inline const volatile static int f02();		// duplicate volatile
-const inline const volatile int static f03();			// duplicate const
-volatile inline static const volatile int f04();		// duplicate volatile
-const static int const inline volatile f05();			// duplicate const
-volatile int static const volatile inline f06();		// duplicate volatile
-const static const int volatile inline f07();			// duplicate const
-volatile static const int inline const volatile f08();	// duplicate volatile
-
-volatile static const int inline const volatile f09();	// duplicate volatile
-_Atomic _Atomic _Atomic volatile restrict static const const int inline restrict const volatile f09();	// duplicate volatile
-
-//Dummy main
-int main(int argc, char const *argv[])
-{
-	return 0;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa declarationErrors.c" //
-// End: //
Index: tests/declarationErrors.cfa
===================================================================
--- tests/declarationErrors.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/declarationErrors.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,45 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// declarationErrors.cfa -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Wed Aug 17 08:23:43 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:52:47 2018
+// Update Count     : 32
+// 
+
+static short int volatile static const x1;				// duplicate static
+extern short int static volatile const x2;				// multiple extern & static
+extern short int auto static volatile static extern const x3; // duplicate and multiple storage classes
+struct { int i; } const static volatile static x4;		// duplicate static
+struct { int i; } const static volatile const static volatile x5; // duplicate static & const & volatile
+typedef int Int;
+static Int volatile static const x6;					// duplicate static
+
+const static inline const volatile int f01();			// duplicate const
+volatile inline const volatile static int f02();		// duplicate volatile
+const inline const volatile int static f03();			// duplicate const
+volatile inline static const volatile int f04();		// duplicate volatile
+const static int const inline volatile f05();			// duplicate const
+volatile int static const volatile inline f06();		// duplicate volatile
+const static const int volatile inline f07();			// duplicate const
+volatile static const int inline const volatile f08();	// duplicate volatile
+
+volatile static const int inline const volatile f09();	// duplicate volatile
+_Atomic _Atomic _Atomic volatile restrict static const const int inline restrict const volatile f09();	// duplicate volatile
+
+//Dummy main
+int main(int argc, char const *argv[])
+{
+	return 0;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa declarationErrors.cfa" //
+// End: //
Index: sts/declarationSpecifier.c
===================================================================
--- tests/declarationSpecifier.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,99 +1,0 @@
-// 
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-// 
-// declarationSpecifier.c -- 
-// 
-// Author           : Peter A. Buhr
-// Created On       : Wed Aug 17 08:21:04 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Aug 17 08:24:33 2016
-// Update Count     : 2
-// 
-
-typedef short int Int;
-
-const short int volatile x1;
-static const short int volatile x2;
-const static short int volatile x3;
-const static volatile short int x4;
-const short int static volatile x5;
-const short int volatile static x6;
-const short volatile int static x7;
-short int volatile static const x8;
-
-const volatile struct { int i; } x10;
-const struct { int i; } volatile x11;
-struct { int i; } const volatile x12;
-static const volatile struct { int i; } x13;
-const static struct { int i; } volatile x14;
-struct { int i; } static const volatile x15;
-struct { int i; } const static volatile x16;
-struct { int i; } const volatile static x17;
-
-const Int volatile x20;
-static const Int volatile x21;
-const static Int volatile x22;
-const static Int volatile x23;
-const Int static volatile x24;
-const Int volatile static x25;
-const volatile Int static x26;
-Int volatile static const x27;
-
-const volatile struct { Int i; } x29;
-const struct { Int i; } volatile x30;
-struct { Int i; } const volatile x31;
-static const volatile struct { Int i; } x32;
-const static struct { Int i; } volatile x33;
-struct { Int i; } static const volatile x34;
-struct { Int i; } const static volatile x35;
-struct { Int i; } const volatile static x36;
-
-static inline const volatile int f11();
-inline const volatile static int f12();
-inline const volatile int static f13();
-inline static const volatile int f14();
-static const inline volatile int f15();
-static const volatile inline int f16();
-static const volatile int inline f17();
-static const int inline volatile f18();
-
-short static inline const volatile int f21();
-inline short const volatile static int f22();
-inline const short volatile int static f23();
-inline static const short volatile int f24();
-static const inline volatile short int f25();
-static const volatile inline int short f26();
-static const volatile int inline short f27();
-static const int inline volatile short f28();
-
-static inline const volatile struct { int i; } f31();
-inline const volatile static struct { int i; } f32();
-inline const volatile struct { int i; } static f33();
-inline static const volatile struct { int i; } f34();
-static const inline volatile struct { int i; } f35();
-static const volatile inline struct { int i; } f36();
-static const volatile struct { int i; } inline f37();
-static const struct { int i; } inline volatile f38();
-
-static inline const volatile Int f41();
-inline const volatile static Int f42();
-inline const volatile Int static f43();
-inline static const volatile Int f44();
-static const inline volatile Int f45();
-static const volatile inline Int f46();
-static const volatile Int inline f47();
-static const Int inline volatile f48();
-
-//Dummy main
-int main(int argc, char const *argv[])
-{
-	return 0;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa declarationSpecifier.c" //
-// End: //
Index: tests/declarationSpecifier.cfa
===================================================================
--- tests/declarationSpecifier.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/declarationSpecifier.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,99 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// declarationSpecifier.cfa -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Wed Aug 17 08:21:04 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:52:59 2018
+// Update Count     : 3
+// 
+
+typedef short int Int;
+
+const short int volatile x1;
+static const short int volatile x2;
+const static short int volatile x3;
+const static volatile short int x4;
+const short int static volatile x5;
+const short int volatile static x6;
+const short volatile int static x7;
+short int volatile static const x8;
+
+const volatile struct { int i; } x10;
+const struct { int i; } volatile x11;
+struct { int i; } const volatile x12;
+static const volatile struct { int i; } x13;
+const static struct { int i; } volatile x14;
+struct { int i; } static const volatile x15;
+struct { int i; } const static volatile x16;
+struct { int i; } const volatile static x17;
+
+const Int volatile x20;
+static const Int volatile x21;
+const static Int volatile x22;
+const static Int volatile x23;
+const Int static volatile x24;
+const Int volatile static x25;
+const volatile Int static x26;
+Int volatile static const x27;
+
+const volatile struct { Int i; } x29;
+const struct { Int i; } volatile x30;
+struct { Int i; } const volatile x31;
+static const volatile struct { Int i; } x32;
+const static struct { Int i; } volatile x33;
+struct { Int i; } static const volatile x34;
+struct { Int i; } const static volatile x35;
+struct { Int i; } const volatile static x36;
+
+static inline const volatile int f11();
+inline const volatile static int f12();
+inline const volatile int static f13();
+inline static const volatile int f14();
+static const inline volatile int f15();
+static const volatile inline int f16();
+static const volatile int inline f17();
+static const int inline volatile f18();
+
+short static inline const volatile int f21();
+inline short const volatile static int f22();
+inline const short volatile int static f23();
+inline static const short volatile int f24();
+static const inline volatile short int f25();
+static const volatile inline int short f26();
+static const volatile int inline short f27();
+static const int inline volatile short f28();
+
+static inline const volatile struct { int i; } f31();
+inline const volatile static struct { int i; } f32();
+inline const volatile struct { int i; } static f33();
+inline static const volatile struct { int i; } f34();
+static const inline volatile struct { int i; } f35();
+static const volatile inline struct { int i; } f36();
+static const volatile struct { int i; } inline f37();
+static const struct { int i; } inline volatile f38();
+
+static inline const volatile Int f41();
+inline const volatile static Int f42();
+inline const volatile Int static f43();
+inline static const volatile Int f44();
+static const inline volatile Int f45();
+static const volatile inline Int f46();
+static const volatile Int inline f47();
+static const Int inline volatile f48();
+
+//Dummy main
+int main(int argc, char const *argv[])
+{
+	return 0;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa declarationSpecifier.cfa" //
+// End: //
Index: sts/designations.c
===================================================================
--- tests/designations.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,263 +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.
-//
-// designations.c --
-//
-// Author           : Rob Schluntz
-// 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
-//
-
-// Note: this test case has been crafted so that it compiles with both cfa and with gcc without any modifications.
-// In particular, since the syntax for designations in Cforall differs from that of C, preprocessor substitution
-// is used for the designation syntax
-#ifdef __cforall
-#define DES :
-#else
-int printf(const char *, ...);
-#define DES =
-#endif
-
-const int indentAmt = 2;
-void indent(int level) {
-	for (int i = 0; i < level; ++i) {
-		printf(" ");
-	}
-}
-
-// A contains fields with different types (int vs. int *)
-struct A {
-	int x, y;
-	int * ptr;
-};
-void printA(struct A a, int level) {
-	indent(level);
-	printf("(A){ %d %d %p }\n", a.x, a.y, a.ptr);
-}
-
-// B contains struct members
-struct B {
-	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");
-}
-
-// C contains an array - tests that after 3 ints, the members of B are initialized.
-struct C {
-	int arr[3];
-	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");
-}
-
-// D contains an unnamed aggregate - tests that this doesn't interfere with initialization.
-struct D {
-	struct {
-		int x;
-	};
-};
-void printD(struct D d, int level) {
-	indent(level);
-	printf("(D){ %d }\n", d.x);
-}
-
-// E tests unions
-union E {
-	struct A a;
-	struct B b;
-	struct C c;
-	struct D d;
-	int i;
-};
-
-struct Fred {
-    double i[3];
-    int j;
-    struct Mary {
-	struct Jane {
-	    double j;
-	} j;
-	double i;
-    } m;
-};
-struct Fred s1 @= { .m.j : 3 };
-struct Fred s2 @= { .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
-	};
-
-	// simple initializaiton case - initialize all elements explicitly with no designations
-	struct A y1 = {
-		2, 3, 0
-	};
-
-
-	// use designation to move to member y, leaving x default-initialized (zero)
-	struct A y2 = {
-		.y DES 3,
-		0
-	};
-
-#if ERROR
-	struct A yErr0 = {
-		{} // error - empty scalar initializer is illegal
-	};
-#endif
-
-	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
-	struct B z0 = { 5 };
-
-	// some nested curly braces, use designation to 'jump around' within structure, leaving some members default-initialized
-	struct B z1 = {
-		{ 3 }, // z1.a0
-		{ 4 }, // z1.a1
-		.a0 DES { 5 }, // z1.a0
-		{ 6 }, // z1.a1
-		.a0.y DES 2, // z1.a0.y
-		0, // z1.a0.ptr
-	};
-
-	// z2.a0.y and z2.a0.ptr default-initialized, everything else explicit
-	struct B z2 = {
-		{ 1 },
-		{ 2, 3, 0 }
-	};
-
-	// initialize every member, omitting nested curly braces
-	struct B z3 = {
-		1, 2, 0, 4, 5, 0
-	};
-
-	// no initializer - legal C, but garbage values - don't print this one
-	struct B z4;
-
-	// no curly braces - initialize with object of same type
-	struct B z5 = z2;
-
-	// z6.a0.y and z6.a0.ptr default-initialized, everything else explicit.
-	// no curly braces on z6.a1 initializers
-	struct B z6 = {
-		{ 1 },
-		2, 3, 0
-	};
-
-	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??
-
-	// test that initializing 'past array bound' correctly moves to next member.
-	struct C c1 = {
-		2, 3, 4,  // arr
-		5, 6, 0,  // b.a0
-		7, 8, 0,  // b.a1
-	};
-
-	printf("=====C=====\n");
-	printC(c1, 0);
-	printf("=====C=====\n\n");
-
-#if ERROR
-	// nested initializer can't refer to same type in C
-	struct C cErr0 = { c1 };
-
-	// must use curly braces to initialize members
-	struct C cErr1 = 2;
-
-	// can't initialize with array compound literal
-	struct C cErr2 = {
-		(int[3]) { 1, 2, 3 }  // error: array initialized from non-constant array expression
-	};
-#endif
-
-#if WARNING
-	// can't initialize array with array - converts to int*
-	int cWarn0_arr[3] = { 1, 2, 3 };
-	struct C cWarn0 = {
-		cWarn0_arr  // warning: initialization makes integer from ptr without cast
-	};
-#endif
-	// array designation
-	int i[2] = { [1] : 3 };
-	// allowed to have 'too many' initialized lists - essentially they are ignored.
-	int i1 = { 3 };
-
-	// doesn't work yet.
-	// designate unnamed object's members
-	// struct D d = { .x DES 3 };
-#if ERROR
-	struct D d1 = { .y DES 3 };
-#endif
-
-	// simple union initialization - initialized first member (e0.a)
-	union E e0 = {
-		y0
-	};
-
-	// simple union initialization - initializes first member (e1.a) - with nested initializer list
-	union E e1 = {
-		{ 2, 3, 0 }
-	};
-
-	// simple union initialization - initializes first member (e2.a) - without nested initializer list
-	union E e2 = {
-		2, 3, 0
-	};
-
-	// 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");
-
-	// 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'} };
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: tests/designations.cfa
===================================================================
--- tests/designations.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/designations.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,263 @@
+//
+// 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.
+//
+// designations.c --
+//
+// Author           : Rob Schluntz
+// 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
+//
+
+// Note: this test case has been crafted so that it compiles with both cfa and with gcc without any modifications.
+// In particular, since the syntax for designations in Cforall differs from that of C, preprocessor substitution
+// is used for the designation syntax
+#ifdef __cforall
+#define DES :
+#else
+int printf(const char *, ...);
+#define DES =
+#endif
+
+const int indentAmt = 2;
+void indent(int level) {
+	for (int i = 0; i < level; ++i) {
+		printf(" ");
+	}
+}
+
+// A contains fields with different types (int vs. int *)
+struct A {
+	int x, y;
+	int * ptr;
+};
+void printA(struct A a, int level) {
+	indent(level);
+	printf("(A){ %d %d %p }\n", a.x, a.y, a.ptr);
+}
+
+// B contains struct members
+struct B {
+	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");
+}
+
+// C contains an array - tests that after 3 ints, the members of B are initialized.
+struct C {
+	int arr[3];
+	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");
+}
+
+// D contains an unnamed aggregate - tests that this doesn't interfere with initialization.
+struct D {
+	struct {
+		int x;
+	};
+};
+void printD(struct D d, int level) {
+	indent(level);
+	printf("(D){ %d }\n", d.x);
+}
+
+// E tests unions
+union E {
+	struct A a;
+	struct B b;
+	struct C c;
+	struct D d;
+	int i;
+};
+
+struct Fred {
+    double i[3];
+    int j;
+    struct Mary {
+	struct Jane {
+	    double j;
+	} j;
+	double i;
+    } m;
+};
+struct Fred s1 @= { .m.j : 3 };
+struct Fred s2 @= { .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
+	};
+
+	// simple initializaiton case - initialize all elements explicitly with no designations
+	struct A y1 = {
+		2, 3, 0
+	};
+
+
+	// use designation to move to member y, leaving x default-initialized (zero)
+	struct A y2 = {
+		.y DES 3,
+		0
+	};
+
+#if ERROR
+	struct A yErr0 = {
+		{} // error - empty scalar initializer is illegal
+	};
+#endif
+
+	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
+	struct B z0 = { 5 };
+
+	// some nested curly braces, use designation to 'jump around' within structure, leaving some members default-initialized
+	struct B z1 = {
+		{ 3 }, // z1.a0
+		{ 4 }, // z1.a1
+		.a0 DES { 5 }, // z1.a0
+		{ 6 }, // z1.a1
+		.a0.y DES 2, // z1.a0.y
+		0, // z1.a0.ptr
+	};
+
+	// z2.a0.y and z2.a0.ptr default-initialized, everything else explicit
+	struct B z2 = {
+		{ 1 },
+		{ 2, 3, 0 }
+	};
+
+	// initialize every member, omitting nested curly braces
+	struct B z3 = {
+		1, 2, 0, 4, 5, 0
+	};
+
+	// no initializer - legal C, but garbage values - don't print this one
+	struct B z4;
+
+	// no curly braces - initialize with object of same type
+	struct B z5 = z2;
+
+	// z6.a0.y and z6.a0.ptr default-initialized, everything else explicit.
+	// no curly braces on z6.a1 initializers
+	struct B z6 = {
+		{ 1 },
+		2, 3, 0
+	};
+
+	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??
+
+	// test that initializing 'past array bound' correctly moves to next member.
+	struct C c1 = {
+		2, 3, 4,  // arr
+		5, 6, 0,  // b.a0
+		7, 8, 0,  // b.a1
+	};
+
+	printf("=====C=====\n");
+	printC(c1, 0);
+	printf("=====C=====\n\n");
+
+#if ERROR
+	// nested initializer can't refer to same type in C
+	struct C cErr0 = { c1 };
+
+	// must use curly braces to initialize members
+	struct C cErr1 = 2;
+
+	// can't initialize with array compound literal
+	struct C cErr2 = {
+		(int[3]) { 1, 2, 3 }  // error: array initialized from non-constant array expression
+	};
+#endif
+
+#if WARNING
+	// can't initialize array with array - converts to int*
+	int cWarn0_arr[3] = { 1, 2, 3 };
+	struct C cWarn0 = {
+		cWarn0_arr  // warning: initialization makes integer from ptr without cast
+	};
+#endif
+	// array designation
+	int i[2] = { [1] : 3 };
+	// allowed to have 'too many' initialized lists - essentially they are ignored.
+	int i1 = { 3 };
+
+	// doesn't work yet.
+	// designate unnamed object's members
+	// struct D d = { .x DES 3 };
+#if ERROR
+	struct D d1 = { .y DES 3 };
+#endif
+
+	// simple union initialization - initialized first member (e0.a)
+	union E e0 = {
+		y0
+	};
+
+	// simple union initialization - initializes first member (e1.a) - with nested initializer list
+	union E e1 = {
+		{ 2, 3, 0 }
+	};
+
+	// simple union initialization - initializes first member (e2.a) - without nested initializer list
+	union E e2 = {
+		2, 3, 0
+	};
+
+	// 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");
+
+	// 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'} };
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: sts/div.c
===================================================================
--- tests/div.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,35 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// div.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Tue Aug  8 16:28:43 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Dec  7 09:06:52 2017
-// Update Count     : 18
-//
-
-#include <fstream.hfa>
-#include <stdlib.hfa>										// div
-
-struct T { int i; };
-T ?/?( T t1, T t2 ) { return t1.i / t2.i; }
-T ?%?( T t1, T t2 ) { return t1.i % t2.i; }
-ofstream & ?|?( ofstream & os, T t ) { return os | t.i; }
-
-int main( void ) {
-	sout | "div" | div( 13, 5 ) | div( 13L, 5L ) | div( 13LL, 5LL ) | endl;
-	short s1 = 13, s2 = 5;
-	sout | "div" | div( s1, s2 ) | endl;
-	T t1 = { 13 }, t2 = { 5 };
-	sout | "div" | div( t1, t2 ) | endl;				// polymorphic div
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa div.c" //
-// End: //
Index: tests/div.cfa
===================================================================
--- tests/div.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/div.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,35 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// div.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Tue Aug  8 16:28:43 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:53:10 2018
+// Update Count     : 19
+//
+
+#include <fstream.hfa>
+#include <stdlib.hfa>										// div
+
+struct T { int i; };
+T ?/?( T t1, T t2 ) { return t1.i / t2.i; }
+T ?%?( T t1, T t2 ) { return t1.i % t2.i; }
+ofstream & ?|?( ofstream & os, T t ) { return os | t.i; }
+
+int main( void ) {
+	sout | "div" | div( 13, 5 ) | div( 13L, 5L ) | div( 13LL, 5LL ) | endl;
+	short s1 = 13, s2 = 5;
+	sout | "div" | div( s1, s2 ) | endl;
+	T t1 = { 13 }, t2 = { 5 };
+	sout | "div" | div( t1, t2 ) | endl;				// polymorphic div
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa div.cfa" //
+// End: //
Index: sts/enum.c
===================================================================
--- tests/enum.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,28 +1,0 @@
-//Testing enum declaration
-enum Colours {
-	Red,
-	Yellow,
-	Pink,
-	Blue,
-	Purple,
-	Orange,
-	Green
-};
-
-enum Colours c1;
-Colours c2;
-
-void f( void ) {
-	enum Fruits {
-		Apple,
-		Banana,
-		Pear,
-		Mango
-	} fruit = Mango;
-	enum Fruits f1;
-	Fruits f2;
-}
-
-//Dummy main
-int main(int argc, char const *argv[]) {
-}
Index: tests/enum.cfa
===================================================================
--- tests/enum.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/enum.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,28 @@
+//Testing enum declaration
+enum Colours {
+	Red,
+	Yellow,
+	Pink,
+	Blue,
+	Purple,
+	Orange,
+	Green
+};
+
+enum Colours c1;
+Colours c2;
+
+void f( void ) {
+	enum Fruits {
+		Apple,
+		Banana,
+		Pear,
+		Mango
+	} fruit = Mango;
+	enum Fruits f1;
+	Fruits f2;
+}
+
+//Dummy main
+int main(int argc, char const *argv[]) {
+}
Index: sts/except-0.c
===================================================================
--- tests/except-0.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,247 +1,0 @@
-// Draft of tests for exception handling.
-// Outdated: The integer constant exceptions need to be replaced with virtual
-// exceptions for the new system.
-
-// ERROR: exceptions do not interact with ^?{} properly.
-
-#include <stdio.h>
-#include <stdbool.h>
-
-#include "except-mac.h"
-TRIVIAL_EXCEPTION(yin)
-TRIVIAL_EXCEPTION(yang)
-TRIVIAL_EXCEPTION(zen)
-
-
-// Local type to mark exits from scopes. (see ERROR)
-struct signal_exit {
-	const char * area;
-};
-
-void ?{}(signal_exit * this, const char * area) {
-	this->area = area;
-}
-
-void ^?{}(signal_exit * this) {
-	printf("Exiting: %s\n", this->area);
-//	sout | "Exiting:" | this->area | endl;
-}
-
-
-// Mark throws: make sure to only pass in exception types.
-forall(dtype T)
-void terminate(T * except_value) {
-	signal_exit a = {"terminate function"};
-	THROW(except_value);
-	printf("terminate returned\n");
-}
-
-forall(dtype T)
-void resume(T * except_value) {
-	signal_exit a = {"resume function"};
-	THROW_RESUME(except_value);
-	printf("resume returned\n");
-}
-
-// Termination Test: Two handlers: no catch, catch
-void bar() {
-	signal_exit a = {"bar function"};
-	try {
-		terminate(&(zen){});
-	} catch (yin * error) {
-		printf("bar caught exception yin.\n");
-	}
-}
-
-void foo() {
-	signal_exit a = {"foo function"};
-	try {
-		bar();
-	} catch (yang * error) {
-		printf("foo caught exception yang.\n");
-	} catch (zen * error) {
-		printf("foo caught exception zen.\n");
-	}
-}
-
-// Resumption Two Handler Test: no catch, catch.
-void beta() {
-	signal_exit a = {"beta function"};
-	try {
-		zen x;
-		resume(&x);
-	} catchResume (yin * error) {
-		printf("beta caught exception yin\n");
-	}
-}
-
-void alpha() {
-	signal_exit a = {"alpha function"};
-	try {
-		beta();
-	} catchResume (yang * error) {
-		printf("alpha caught exception yang\n");
-	} catchResume (zen * error) {
-		printf("alpha caught exception zen\n");
-	}
-}
-
-// Finally Test:
-void farewell(bool jump) {
-	try {
-		if (jump) {
-			printf("jump out of farewell\n");
-			goto endoffunction;
-		} else {
-			printf("walk out of farewell\n");
-		}
-	} finally {
-		printf("See you next time\n");
-	}
-	endoffunction:
-	printf("leaving farewell\n");
-}
-
-// Resume-to-Terminate Test:
-void fallback() {
-	try {
-		zen x;
-		resume(&x);
-	} catch (zen * error) {
-		printf("fallback caught termination zen\n");
-	}
-}
-
-// Terminate Throw New Exception:
-void terminate_swap() {
-	signal_exit a = {"terminate_swap"};
-	try {
-		yin x;
-		terminate(&x);
-	} catch (yin * error) {
-		yang y;
-		terminate(&y);
-	}
-}
-
-void terminate_swapped() {
-	signal_exit a = {"terminate_swapped"};
-	try {
-		terminate_swap();
-	} catch (yang * error) {
-		printf("terminate_swapped caught exception yang\n");
-	}
-}
-
-// Resume Throw New Exception:
-void resume_swap() {
-	signal_exit a = {"resume_swap"};
-	try {
-		yin x;
-		resume(&x);
-	} catchResume (yin * error) {
-		yang y;
-		resume(&y);
-	}
-}
-
-void resume_swapped() {
-	try {
-		resume_swap();
-	} catchResume (yang * error) {
-		printf("resume_swapped caught exception yang\n");
-	}
-}
-
-// Terminate Rethrow:
-void reterminate() {
-	try {
-		try {
-			zen x;
-			terminate(&x);
-		} catch (zen * error) {
-			printf("reterminate zen caught and "
-			       "will rethrow exception zen\n");
-			throw;
-		}
-	} catch (zen * error) {
-		printf("reterminate 1 caught exception zen\n");
-	}
-}
-
-// Resume Rethrow:
-void reresume() {
-	try {
-		try {
-			zen x;
-			resume(&x);
-		} catchResume (zen * error) {
-			printf("reresume zen caught and rethrows exception zen\n");
-			throwResume;
-		}
-	} catchResume (zen * error) {
-		printf("reresume 1 caught exception zen\n");
-	}
-}
-
-// Terminate-Resume interaction:
-void fum() {
-	// terminate block, call resume
-	try {
-		zen x;
-		resume(&x);
-	} catch (zen * error) {
-		printf("fum caught exception zen\n");
-	}
-}
-
-void foe() {
-	// resume block, call terminate
-	try {
-		zen y;
-		terminate(&y);
-	} catchResume (zen * error) {
-		printf("foe caught exception zen\n");
-	}
-}
-
-void fy() {
-	// terminate block calls fum, call foe
-	try {
-		foe();
-	} catch (zen * error) {
-		printf("fy caught exception zen\n");
-		fum();
-	}
-}
-
-void fee() {
-	// resume block, call fy
-	try {
-		fy();
-	} catchResume (zen * error) {
-		printf("fee caught exception zen\n");
-	}
-}
-
-
-// main: choose which tests to run
-int main(int argc, char * argv[]) {
-	signal_exit a = {"main function"};
-
-	foo(); printf("\n");
-	alpha(); printf("\n");
-	farewell(false); printf("\n");
-	farewell(true); printf("\n");
-	fallback(); printf("\n");
-	terminate_swapped(); printf("\n");
-	resume_swapped(); printf("\n");
-	reterminate(); printf("\n");
-	reresume(); printf("\n");
-	fee(); printf("\n");
-
-	// Uncaught termination test.
-	printf("Throw uncaught.\n");
-	yang z;
-	terminate(&z);
-}
Index: tests/except-0.cfa
===================================================================
--- tests/except-0.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/except-0.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,247 @@
+// Draft of tests for exception handling.
+// Outdated: The integer constant exceptions need to be replaced with virtual
+// exceptions for the new system.
+
+// ERROR: exceptions do not interact with ^?{} properly.
+
+#include <stdio.h>
+#include <stdbool.h>
+
+#include "except-mac.hfa"
+TRIVIAL_EXCEPTION(yin)
+TRIVIAL_EXCEPTION(yang)
+TRIVIAL_EXCEPTION(zen)
+
+
+// Local type to mark exits from scopes. (see ERROR)
+struct signal_exit {
+	const char * area;
+};
+
+void ?{}(signal_exit * this, const char * area) {
+	this->area = area;
+}
+
+void ^?{}(signal_exit * this) {
+	printf("Exiting: %s\n", this->area);
+//	sout | "Exiting:" | this->area | endl;
+}
+
+
+// Mark throws: make sure to only pass in exception types.
+forall(dtype T)
+void terminate(T * except_value) {
+	signal_exit a = {"terminate function"};
+	THROW(except_value);
+	printf("terminate returned\n");
+}
+
+forall(dtype T)
+void resume(T * except_value) {
+	signal_exit a = {"resume function"};
+	THROW_RESUME(except_value);
+	printf("resume returned\n");
+}
+
+// Termination Test: Two handlers: no catch, catch
+void bar() {
+	signal_exit a = {"bar function"};
+	try {
+		terminate(&(zen){});
+	} catch (yin * error) {
+		printf("bar caught exception yin.\n");
+	}
+}
+
+void foo() {
+	signal_exit a = {"foo function"};
+	try {
+		bar();
+	} catch (yang * error) {
+		printf("foo caught exception yang.\n");
+	} catch (zen * error) {
+		printf("foo caught exception zen.\n");
+	}
+}
+
+// Resumption Two Handler Test: no catch, catch.
+void beta() {
+	signal_exit a = {"beta function"};
+	try {
+		zen x;
+		resume(&x);
+	} catchResume (yin * error) {
+		printf("beta caught exception yin\n");
+	}
+}
+
+void alpha() {
+	signal_exit a = {"alpha function"};
+	try {
+		beta();
+	} catchResume (yang * error) {
+		printf("alpha caught exception yang\n");
+	} catchResume (zen * error) {
+		printf("alpha caught exception zen\n");
+	}
+}
+
+// Finally Test:
+void farewell(bool jump) {
+	try {
+		if (jump) {
+			printf("jump out of farewell\n");
+			goto endoffunction;
+		} else {
+			printf("walk out of farewell\n");
+		}
+	} finally {
+		printf("See you next time\n");
+	}
+	endoffunction:
+	printf("leaving farewell\n");
+}
+
+// Resume-to-Terminate Test:
+void fallback() {
+	try {
+		zen x;
+		resume(&x);
+	} catch (zen * error) {
+		printf("fallback caught termination zen\n");
+	}
+}
+
+// Terminate Throw New Exception:
+void terminate_swap() {
+	signal_exit a = {"terminate_swap"};
+	try {
+		yin x;
+		terminate(&x);
+	} catch (yin * error) {
+		yang y;
+		terminate(&y);
+	}
+}
+
+void terminate_swapped() {
+	signal_exit a = {"terminate_swapped"};
+	try {
+		terminate_swap();
+	} catch (yang * error) {
+		printf("terminate_swapped caught exception yang\n");
+	}
+}
+
+// Resume Throw New Exception:
+void resume_swap() {
+	signal_exit a = {"resume_swap"};
+	try {
+		yin x;
+		resume(&x);
+	} catchResume (yin * error) {
+		yang y;
+		resume(&y);
+	}
+}
+
+void resume_swapped() {
+	try {
+		resume_swap();
+	} catchResume (yang * error) {
+		printf("resume_swapped caught exception yang\n");
+	}
+}
+
+// Terminate Rethrow:
+void reterminate() {
+	try {
+		try {
+			zen x;
+			terminate(&x);
+		} catch (zen * error) {
+			printf("reterminate zen caught and "
+			       "will rethrow exception zen\n");
+			throw;
+		}
+	} catch (zen * error) {
+		printf("reterminate 1 caught exception zen\n");
+	}
+}
+
+// Resume Rethrow:
+void reresume() {
+	try {
+		try {
+			zen x;
+			resume(&x);
+		} catchResume (zen * error) {
+			printf("reresume zen caught and rethrows exception zen\n");
+			throwResume;
+		}
+	} catchResume (zen * error) {
+		printf("reresume 1 caught exception zen\n");
+	}
+}
+
+// Terminate-Resume interaction:
+void fum() {
+	// terminate block, call resume
+	try {
+		zen x;
+		resume(&x);
+	} catch (zen * error) {
+		printf("fum caught exception zen\n");
+	}
+}
+
+void foe() {
+	// resume block, call terminate
+	try {
+		zen y;
+		terminate(&y);
+	} catchResume (zen * error) {
+		printf("foe caught exception zen\n");
+	}
+}
+
+void fy() {
+	// terminate block calls fum, call foe
+	try {
+		foe();
+	} catch (zen * error) {
+		printf("fy caught exception zen\n");
+		fum();
+	}
+}
+
+void fee() {
+	// resume block, call fy
+	try {
+		fy();
+	} catchResume (zen * error) {
+		printf("fee caught exception zen\n");
+	}
+}
+
+
+// main: choose which tests to run
+int main(int argc, char * argv[]) {
+	signal_exit a = {"main function"};
+
+	foo(); printf("\n");
+	alpha(); printf("\n");
+	farewell(false); printf("\n");
+	farewell(true); printf("\n");
+	fallback(); printf("\n");
+	terminate_swapped(); printf("\n");
+	resume_swapped(); printf("\n");
+	reterminate(); printf("\n");
+	reresume(); printf("\n");
+	fee(); printf("\n");
+
+	// Uncaught termination test.
+	printf("Throw uncaught.\n");
+	yang z;
+	terminate(&z);
+}
Index: sts/except-1.c
===================================================================
--- tests/except-1.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,81 +1,0 @@
-// Draft memory management test. (remember -fexceptions)
-// Outdated: The integer constant exceptions need to be replaced with virtual
-// exceptions for the new system.
-
-#include <stdio.h>
-
-#include "except-mac.h"
-TRIVIAL_EXCEPTION(yin)
-TRIVIAL_EXCEPTION(yang)
-
-int main()
-{
-	try {
-		yin a;
-		THROW(&a);
-	}
-	catch( yin * err ) {
-		printf("First Caught\n");
-		try {
-			yang b;
-			THROW(&b);
-		}
-		catch( yang * err ) {
-			printf("Both Caught\n");
-		}
-	}
-	printf("Part A Complete\n");
-
-	try {
-		try {
-			yang c;
-			THROW(&c);
-		}
-		catch( yang * err ) {
-			printf("First Catch and rethrow\n");
-			throw;
-		}
-	}
-	catch( yang * err ) {
-		printf("Second Catch\n");
-	}
-	printf("Part B Complete\n");
-
-	try {
-		try {
-			yin d;
-			THROW(&d);
-		}
-		catch( yin * err ) {
-			printf("Throw before cleanup\n");
-			yang e;
-			THROW(&e);
-		}
-	}
-	catch( yang * err ) {
-		printf("Catch after cleanup\n");
-	}
-	printf("Part C Complete\n");
-
-	try {
-		try {
-			yin f;
-			THROW(&f);
-		}
-		catch( yin * err ) {
-			printf("Caught initial throw.\n");
-			try {
-				yang g;
-				THROW(&g);
-			}
-			catch( yang * err ) {
-				printf("Caught intermediate throw.\n");
-			}
-			throw;
-		}
-	}
-	catch( yin * err ) {
-		printf("Caught final throw.\n");
-	}
-	printf("Part D Complete\n");
-}
Index: tests/except-1.cfa
===================================================================
--- tests/except-1.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/except-1.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,81 @@
+// Draft memory management test. (remember -fexceptions)
+// Outdated: The integer constant exceptions need to be replaced with virtual
+// exceptions for the new system.
+
+#include <stdio.h>
+
+#include "except-mac.hfa"
+TRIVIAL_EXCEPTION(yin)
+TRIVIAL_EXCEPTION(yang)
+
+int main()
+{
+	try {
+		yin a;
+		THROW(&a);
+	}
+	catch( yin * err ) {
+		printf("First Caught\n");
+		try {
+			yang b;
+			THROW(&b);
+		}
+		catch( yang * err ) {
+			printf("Both Caught\n");
+		}
+	}
+	printf("Part A Complete\n");
+
+	try {
+		try {
+			yang c;
+			THROW(&c);
+		}
+		catch( yang * err ) {
+			printf("First Catch and rethrow\n");
+			throw;
+		}
+	}
+	catch( yang * err ) {
+		printf("Second Catch\n");
+	}
+	printf("Part B Complete\n");
+
+	try {
+		try {
+			yin d;
+			THROW(&d);
+		}
+		catch( yin * err ) {
+			printf("Throw before cleanup\n");
+			yang e;
+			THROW(&e);
+		}
+	}
+	catch( yang * err ) {
+		printf("Catch after cleanup\n");
+	}
+	printf("Part C Complete\n");
+
+	try {
+		try {
+			yin f;
+			THROW(&f);
+		}
+		catch( yin * err ) {
+			printf("Caught initial throw.\n");
+			try {
+				yang g;
+				THROW(&g);
+			}
+			catch( yang * err ) {
+				printf("Caught intermediate throw.\n");
+			}
+			throw;
+		}
+	}
+	catch( yin * err ) {
+		printf("Caught final throw.\n");
+	}
+	printf("Part D Complete\n");
+}
Index: sts/except-2.c
===================================================================
--- tests/except-2.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,92 +1,0 @@
-// New draft of exception tests.
-
-
-#include <stdlib.hfa>
-#include "except-mac.h"
-
-TRIVIAL_EXCEPTION(yin)
-TRIVIAL_EXCEPTION(yang)
-
-struct num_error;
-struct num_error_vtable {
-	struct TABLE(BASE_EXCEPT) const * parent;
-	size_t size;
-	void (*copy)(num_error *this, num_error * other);
-	void (*free)(num_error *this);
-	const char * (*msg)(num_error *this);
-	int (*code)(num_error *this);
-};
-extern num_error_vtable INSTANCE(num_error);
-
-struct num_error {
-	struct num_error_vtable const * virtual_table;
-	char * msg;
-	int num;
-};
-
-void num_error_msg(num_error * this) {
-	if ( ! this->msg ) {
-		static const char * base = "Num Error with code: X";
-		this->msg = malloc(22);
-		for (int i = 0 ; (this->msg[i] = base[i]) ; ++i);
-	}
-	this->msg[21] = '0' + this->num;
-	return this->msg;
-}
-void ?{}(num_error * this, int num) {
-	this->virtual_table = &INSTANCE(num_error);
-	this->msg = 0;
-	this->num = num;
-}
-void ?{}(num_error * this, num_error * other) {
-	this->virtual_table = other->virtual_table;
-	this->msg = 0;
-	this->num = other->num;
-}
-void ^?{}(num_error * this) {
-	if( this->msg ) free( this->msg );
-}
-int num_error_code( num_error * this ) {
-	return this->num;
-}
-num_error_vtable _num_error_vtable_instance @= {
-	&INSTANCE(BASE_EXCEPT),
-	sizeof(num_error), ?{}, ^?{},
-	num_error_msg, num_error_code
-};
-
-
-// Test simple throwing, matching and catching.
-void throw_catch() {
-	try {
-		yin black;
-		THROW(&black);
-	} catch ( yin * error ) {
-		printf("throw yin caught.\n");
-	}
-
-	try {
-		yang white;
-		THROW_RESUME(&white);
-		printf("> throwResume returned.\n");
-	} catchResume ( yang * error ) {
-		printf("throwResume yang caught <");
-	}
-
-	try {
-		num_error x = { 2 };
-		THROW(&x);
-	}
-	catch (num_error * error ; 3 == error->virtual_table->code( error ) ) {
-		printf("exception at %p\n", error );
-		printf("Should not be printed.\n");
-	}
-	catch (num_error * error ; 2 == error->virtual_table->code( error ) ) {
-		printf("Should be printed.\n");
-	}
-}
-
-int main (int argc, char * argv[]) {
-	throw_catch();
-	return 0;
-}
Index: tests/except-2.cfa
===================================================================
--- tests/except-2.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/except-2.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,92 @@
+// New draft of exception tests.
+
+
+#include <stdlib.hfa>
+#include "except-mac.hfa"
+
+TRIVIAL_EXCEPTION(yin)
+TRIVIAL_EXCEPTION(yang)
+
+struct num_error;
+struct num_error_vtable {
+	struct TABLE(BASE_EXCEPT) const * parent;
+	size_t size;
+	void (*copy)(num_error *this, num_error * other);
+	void (*free)(num_error *this);
+	const char * (*msg)(num_error *this);
+	int (*code)(num_error *this);
+};
+extern num_error_vtable INSTANCE(num_error);
+
+struct num_error {
+	struct num_error_vtable const * virtual_table;
+	char * msg;
+	int num;
+};
+
+void num_error_msg(num_error * this) {
+	if ( ! this->msg ) {
+		static const char * base = "Num Error with code: X";
+		this->msg = malloc(22);
+		for (int i = 0 ; (this->msg[i] = base[i]) ; ++i);
+	}
+	this->msg[21] = '0' + this->num;
+	return this->msg;
+}
+void ?{}(num_error * this, int num) {
+	this->virtual_table = &INSTANCE(num_error);
+	this->msg = 0;
+	this->num = num;
+}
+void ?{}(num_error * this, num_error * other) {
+	this->virtual_table = other->virtual_table;
+	this->msg = 0;
+	this->num = other->num;
+}
+void ^?{}(num_error * this) {
+	if( this->msg ) free( this->msg );
+}
+int num_error_code( num_error * this ) {
+	return this->num;
+}
+num_error_vtable _num_error_vtable_instance @= {
+	&INSTANCE(BASE_EXCEPT),
+	sizeof(num_error), ?{}, ^?{},
+	num_error_msg, num_error_code
+};
+
+
+// Test simple throwing, matching and catching.
+void throw_catch() {
+	try {
+		yin black;
+		THROW(&black);
+	} catch ( yin * error ) {
+		printf("throw yin caught.\n");
+	}
+
+	try {
+		yang white;
+		THROW_RESUME(&white);
+		printf("> throwResume returned.\n");
+	} catchResume ( yang * error ) {
+		printf("throwResume yang caught <");
+	}
+
+	try {
+		num_error x = { 2 };
+		THROW(&x);
+	}
+	catch (num_error * error ; 3 == error->virtual_table->code( error ) ) {
+		printf("exception at %p\n", error );
+		printf("Should not be printed.\n");
+	}
+	catch (num_error * error ; 2 == error->virtual_table->code( error ) ) {
+		printf("Should be printed.\n");
+	}
+}
+
+int main (int argc, char * argv[]) {
+	throw_catch();
+	return 0;
+}
Index: sts/except-3.c
===================================================================
--- tests/except-3.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,18 +1,0 @@
-// Test that __attribute__((cleanup(...))) is working.
-
-#include <stdio.h>
-#include "except-mac.h"
-TRIVIAL_EXCEPTION(myth)
-
-int main (int argc, char * argv[]) {
-	try {
-		try {
-			printf("throw [");
-			THROW(&(myth){});
-		} finally {
-			printf("] unwind <");
-		}
-	} catch (myth * error) {
-		printf("> catch\n");
-	}
-}
Index: tests/except-3.cfa
===================================================================
--- tests/except-3.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/except-3.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,18 @@
+// Test that __attribute__((cleanup(...))) is working.
+
+#include <stdio.h>
+#include "except-mac.hfa"
+TRIVIAL_EXCEPTION(myth)
+
+int main (int argc, char * argv[]) {
+	try {
+		try {
+			printf("throw [");
+			THROW(&(myth){});
+		} finally {
+			printf("] unwind <");
+		}
+	} catch (myth * error) {
+		printf("> catch\n");
+	}
+}
Index: sts/except-mac.h
===================================================================
--- tests/except-mac.h	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,78 +1,0 @@
-// Macros to try and make declaring and using exceptions easier
-// No, these are not part of the language, they replace the virtual system.
-
-// Internal use:
-#define GLUE2(left, right) left##right
-#define GLUE3(left, middle, right) left##middle##right
-
-// The fully (perhaps overly) qualified name of the base exception type:
-#define BASE_EXCEPT __cfaabi_ehm__base_exception_t
-
-// Get the name of the vtable type and vtable instance for an exception type:
-#define TABLE(name) GLUE2(name,_vtable)
-#define INSTANCE(name) GLUE3(_,name,_vtable_instance)
-
-// Throws and the bit of overhead:
-#define THROW(expr) throw ((BASE_EXCEPT *)(expr))
-#define THROW_RESUME(expr) throwResume ((BASE_EXCEPT *)(expr))
-
-
-
-// The following macros are for defining your own new exception types.
-
-// Declare vtable and forward declare the exception type and vtable instance.
-// This should start a new exception declaration.
-// ... argument is the additional vtable fields.
-#define DECLARE_EXCEPT(except_name,parent_name,...) \
-struct except_name; \
-struct TABLE(except_name) { \
-	struct TABLE(parent_name) const * parent; \
-	size_t size; \
-	void (*copy)(except_name *this, except_name * other); \
-	void (*free)(except_name &this); \
-	const char * (*msg)(except_name *this); \
-	__VA_ARGS__ \
-}; \
-extern TABLE(except_name) INSTANCE(except_name);
-
-// The first field of the exception structure should be created with this.
-#define VTABLE_FIELD(except_name) \
-struct TABLE(except_name) const * virtual_table
-
-// In each constructor the vtable must be initialized.
-#define VTABLE_INIT(this_name,except_name) \
-this_name.virtual_table = &INSTANCE(except_name)
-
-// Declare the vtable instance. This should end an exception declaration.
-// ... argument is the remaining vtable field values.
-#define VTABLE_INSTANCE(except_name,parent_name,copy,free,msg,...) \
-TABLE(except_name) INSTANCE(except_name) @= { \
-	&INSTANCE(parent_name), sizeof(except_name), \
-	copy, free, msg, ## __VA_ARGS__ \
-};
-
-// Same, but used declarators for arguments.
-#define VTABLE_INSTANCE_KEY(except_name,parent_name,copy,free,msg,...) \
-TABLE(except_name) INSTANCE(except_name) @= { \
-	.parent : &INSTANCE(parent_name), .size : sizeof(except_name), \
-	.copy : copy, .free : free, .msg : msg, ## __VA_ARGS__ \
-};
-
-
-
-// Declare a trivial exception, one that adds no features:
-#define TRIVIAL_EXCEPTION(name) \
-DECLARE_EXCEPT(name,BASE_EXCEPT,) \
-struct name { \
-	VTABLE_FIELD(name); \
-}; \
-const char * GLUE2(name,_msg)(name * this) { \
-    return #name; \
-} \
-void GLUE2(name,_copy)(name * this, name * other) { \
-    this->virtual_table = other->virtual_table; \
-} \
-void ?{}(name & this) { \
-	VTABLE_INIT(this,name); \
-} \
-VTABLE_INSTANCE(name,BASE_EXCEPT,GLUE2(name,_copy),^?{},GLUE2(name,_msg),)
Index: tests/except-mac.hfa
===================================================================
--- tests/except-mac.hfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/except-mac.hfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,78 @@
+// Macros to try and make declaring and using exceptions easier
+// No, these are not part of the language, they replace the virtual system.
+
+// Internal use:
+#define GLUE2(left, right) left##right
+#define GLUE3(left, middle, right) left##middle##right
+
+// The fully (perhaps overly) qualified name of the base exception type:
+#define BASE_EXCEPT __cfaabi_ehm__base_exception_t
+
+// Get the name of the vtable type and vtable instance for an exception type:
+#define TABLE(name) GLUE2(name,_vtable)
+#define INSTANCE(name) GLUE3(_,name,_vtable_instance)
+
+// Throws and the bit of overhead:
+#define THROW(expr) throw ((BASE_EXCEPT *)(expr))
+#define THROW_RESUME(expr) throwResume ((BASE_EXCEPT *)(expr))
+
+
+
+// The following macros are for defining your own new exception types.
+
+// Declare vtable and forward declare the exception type and vtable instance.
+// This should start a new exception declaration.
+// ... argument is the additional vtable fields.
+#define DECLARE_EXCEPT(except_name,parent_name,...) \
+struct except_name; \
+struct TABLE(except_name) { \
+	struct TABLE(parent_name) const * parent; \
+	size_t size; \
+	void (*copy)(except_name *this, except_name * other); \
+	void (*free)(except_name &this); \
+	const char * (*msg)(except_name *this); \
+	__VA_ARGS__ \
+}; \
+extern TABLE(except_name) INSTANCE(except_name);
+
+// The first field of the exception structure should be created with this.
+#define VTABLE_FIELD(except_name) \
+struct TABLE(except_name) const * virtual_table
+
+// In each constructor the vtable must be initialized.
+#define VTABLE_INIT(this_name,except_name) \
+this_name.virtual_table = &INSTANCE(except_name)
+
+// Declare the vtable instance. This should end an exception declaration.
+// ... argument is the remaining vtable field values.
+#define VTABLE_INSTANCE(except_name,parent_name,copy,free,msg,...) \
+TABLE(except_name) INSTANCE(except_name) @= { \
+	&INSTANCE(parent_name), sizeof(except_name), \
+	copy, free, msg, ## __VA_ARGS__ \
+};
+
+// Same, but used declarators for arguments.
+#define VTABLE_INSTANCE_KEY(except_name,parent_name,copy,free,msg,...) \
+TABLE(except_name) INSTANCE(except_name) @= { \
+	.parent : &INSTANCE(parent_name), .size : sizeof(except_name), \
+	.copy : copy, .free : free, .msg : msg, ## __VA_ARGS__ \
+};
+
+
+
+// Declare a trivial exception, one that adds no features:
+#define TRIVIAL_EXCEPTION(name) \
+DECLARE_EXCEPT(name,BASE_EXCEPT,) \
+struct name { \
+	VTABLE_FIELD(name); \
+}; \
+const char * GLUE2(name,_msg)(name * this) { \
+    return #name; \
+} \
+void GLUE2(name,_copy)(name * this, name * other) { \
+    this->virtual_table = other->virtual_table; \
+} \
+void ?{}(name & this) { \
+	VTABLE_INIT(this,name); \
+} \
+VTABLE_INSTANCE(name,BASE_EXCEPT,GLUE2(name,_copy),^?{},GLUE2(name,_msg),)
Index: sts/expression.c
===================================================================
--- tests/expression.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,51 +1,0 @@
-int main() {
-    struct s { int i; } x, *p = &x;
-    int i = 3;
-
-    // operators
-
-    ! i;
-    ~i;
-    +i;
-    -i;
-    *p;
-    ++p;
-    --p;
-    p++;
-    p--;
-
-    i+i;
-    i-i;
-    i*i;
-
-    i/i;
-    i%i;
-    i^i;
-    i&i;
-    i|i;
-    i<i;
-    i>i;
-    i=i;
-
-    i==i;
-    i!=i;
-    i<<i;
-    i>>i;
-    i<=i;
-    i>=i;
-    i&&i;
-    i||i;
-    p->i;
-    i*=i;
-    i/=i;
-    i%=i;
-    i+=i;
-    i-=i;
-    i&=i;
-    i|=i;
-    i^=i;
-    i<<=i;
-    i>>=i;
-
-    i?i:i;
-} // main
Index: tests/expression.cfa
===================================================================
--- tests/expression.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/expression.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,51 @@
+int main() {
+    struct s { int i; } x, *p = &x;
+    int i = 3;
+
+    // operators
+
+    ! i;
+    ~i;
+    +i;
+    -i;
+    *p;
+    ++p;
+    --p;
+    p++;
+    p--;
+
+    i+i;
+    i-i;
+    i*i;
+
+    i/i;
+    i%i;
+    i^i;
+    i&i;
+    i|i;
+    i<i;
+    i>i;
+    i=i;
+
+    i==i;
+    i!=i;
+    i<<i;
+    i>>i;
+    i<=i;
+    i>=i;
+    i&&i;
+    i||i;
+    p->i;
+    i*=i;
+    i/=i;
+    i%=i;
+    i+=i;
+    i-=i;
+    i&=i;
+    i|=i;
+    i^=i;
+    i<<=i;
+    i>>=i;
+
+    i?i:i;
+} // main
Index: sts/extension.c
===================================================================
--- tests/extension.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,59 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// extension.c -- 
-//
-// Author           : Peter A. Buhr
-// Created On       : Mon Jul  4 20:42:43 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Feb  6 15:44:39 2017
-// Update Count     : 46
-//
-
-__extension__ __extension__ int a, b, c;
-__extension__ struct S {
-	__extension__ int a, b, c;
-};
-__extension__ union U {
-	__extension__ int a, b, c;
-};
-__extension__ enum E {
-	R, G, B,
-};
-__extension__ typedef int www; // typedefs are removed => no output
-__extension__ __extension__ int f();
-//__extension__ __extension__ asm( "nop" );
-#ifdef __cforall
-__extension__ __extension__ extern "C" {
- 	int i, j;
- }
-#endif // __cforall
-
-__extension__ int fred( int p ) {
-	__extension__ struct S {
-		__extension__ int a, b, c;
-#ifdef __cforall
-		__extension__ * int x, y, z;
-#endif // __cforall
-	};
-	int i = __extension__ a + __extension__ 3;
-	__extension__ 3;
-	__extension__ a;
-	__extension__ int a, b, c;
-
-	__extension__ a = __extension__ b + __extension__ c;
-	__extension__ fred( 3 );
-	__extension__ int mary( int p ) {}
-	__extension__ sizeof( 3 );
-	__extension__ (3 || 4);
-	__extension__ __alignof__( __extension__ a );
-	__extension__ a || __extension__ b && __extension__ c;
-	__extension__ a > __extension__ b ? __extension__ c : __extension__ c;
-	__extension__ a = __extension__ ( __extension__ b + __extension__ c );
-	__extension__ a, __extension__ b, __extension__ c;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa extension.c" //
-// End: //
Index: tests/extension.cfa
===================================================================
--- tests/extension.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/extension.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,59 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// extension.cfa -- 
+//
+// Author           : Peter A. Buhr
+// Created On       : Mon Jul  4 20:42:43 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:53:21 2018
+// Update Count     : 47
+//
+
+__extension__ __extension__ int a, b, c;
+__extension__ struct S {
+	__extension__ int a, b, c;
+};
+__extension__ union U {
+	__extension__ int a, b, c;
+};
+__extension__ enum E {
+	R, G, B,
+};
+__extension__ typedef int www; // typedefs are removed => no output
+__extension__ __extension__ int f();
+//__extension__ __extension__ asm( "nop" );
+#ifdef __cforall
+__extension__ __extension__ extern "C" {
+ 	int i, j;
+ }
+#endif // __cforall
+
+__extension__ int fred( int p ) {
+	__extension__ struct S {
+		__extension__ int a, b, c;
+#ifdef __cforall
+		__extension__ * int x, y, z;
+#endif // __cforall
+	};
+	int i = __extension__ a + __extension__ 3;
+	__extension__ 3;
+	__extension__ a;
+	__extension__ int a, b, c;
+
+	__extension__ a = __extension__ b + __extension__ c;
+	__extension__ fred( 3 );
+	__extension__ int mary( int p ) {}
+	__extension__ sizeof( 3 );
+	__extension__ (3 || 4);
+	__extension__ __alignof__( __extension__ a );
+	__extension__ a || __extension__ b && __extension__ c;
+	__extension__ a > __extension__ b ? __extension__ c : __extension__ c;
+	__extension__ a = __extension__ ( __extension__ b + __extension__ c );
+	__extension__ a, __extension__ b, __extension__ c;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa extension.cfa" //
+// End: //
Index: sts/fallthrough.c
===================================================================
--- tests/fallthrough.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,124 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// fallthrough.c --
-//
-// Author           : Rob Schluntz
-// Created On       : Wed Mar 14 10:06:25 2018
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug 16 08:21:46 2018
-// Update Count     : 14
-//
-
-void test(int choice) {
-	choose ( choice ) {
-		case 1:
-			printf("case 1\n");
-			fallthru;
-		case 2:
-			printf("case 2\n");
-			fallthru;
-			printf("did not fallthru\n");
-			if ( 7 ) fallthru common2;
-			fallthru common1;
-		case 3:
-			printf("case 3\n");
-			fallthru default;
-			fallthru common1;
-		common1:
-			printf("common1\n");
-		// break
-		case 4:
-			printf("case 4\n");
-			fallthru common2;
-		case 5:
-			printf("case 5\n");
-			fallthru common2;
-			fallthru default;
-		case 6:
-			printf("case 6\n");
-			fallthru common2;
-		common2:
-			printf("common2\n");
-		// break
-		default:
-			printf("default\n");
-			fallthru;
-	}
-
-	printf("\n");
-
-	switch ( choice ) {
-	  case 1:
-		printf("case 1\n");
-		switch ( choice ) {
-		  case 1:
-			printf("case 1\n");
-			for ( int i = 0; i < 4; i += 1 ) {
-				printf("%d\n", i);
-				if ( i == 2 ) fallthru common;
-			} // for
-		} // switch
-		break;
-	  case 5:
-		printf("case 5\n");
-		if ( choice == 5 ) {
-			if ( choice != 5 ) {
-				printf("error\n");
-			} else {
-				printf("check\n");
-				fallthru common;
-			} // if
-		} // if
-	  common:
-		printf( "common\n" );
-		fallthru;
-		break;
-	  default:
-		printf( "default\n" );
-		fallthru;
-	} // switch
-
-#if ERR1
-	// ERROR: fallthrough must be enclosed in switch or choose
-	fallthru;
-	// ERROR: fallthrough must be enclosed in switch or choose
-	fallthru common4;
-	// ERROR: fallthrough must be enclosed in switch or choose
-	fallthru default;
-	choose ( 3 ) {
-		case 2:
-			for () {
-				choose ( 2 ) {
-					case 1:
-						// ERROR: default is later, but in a different switch
-						fallthru default;
-						// ERROR: common3 is later, but not at the same level as a case clause
-						fallthru common3;
-				}
-				common3: ;
-			}
-		default:
-		case 1:
-		common4:
-			// ERROR: attempt to jump up with fallthrough
-			if ( 7 ) fallthru common4;
-			// ERROR: attempt to jump up with fallthrough
-			fallthru default;
-	}
-#endif
-}
-
-int main() {
-	test(1);
-	printf("\n");
-	test(5);
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa fallthrough.c" //
-// End: //
Index: tests/fallthrough.cfa
===================================================================
--- tests/fallthrough.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/fallthrough.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,124 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// fallthrough.cfa --
+//
+// Author           : Rob Schluntz
+// Created On       : Wed Mar 14 10:06:25 2018
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:53:32 2018
+// Update Count     : 15
+//
+
+void test(int choice) {
+	choose ( choice ) {
+		case 1:
+			printf("case 1\n");
+			fallthru;
+		case 2:
+			printf("case 2\n");
+			fallthru;
+			printf("did not fallthru\n");
+			if ( 7 ) fallthru common2;
+			fallthru common1;
+		case 3:
+			printf("case 3\n");
+			fallthru default;
+			fallthru common1;
+		common1:
+			printf("common1\n");
+		// break
+		case 4:
+			printf("case 4\n");
+			fallthru common2;
+		case 5:
+			printf("case 5\n");
+			fallthru common2;
+			fallthru default;
+		case 6:
+			printf("case 6\n");
+			fallthru common2;
+		common2:
+			printf("common2\n");
+		// break
+		default:
+			printf("default\n");
+			fallthru;
+	}
+
+	printf("\n");
+
+	switch ( choice ) {
+	  case 1:
+		printf("case 1\n");
+		switch ( choice ) {
+		  case 1:
+			printf("case 1\n");
+			for ( int i = 0; i < 4; i += 1 ) {
+				printf("%d\n", i);
+				if ( i == 2 ) fallthru common;
+			} // for
+		} // switch
+		break;
+	  case 5:
+		printf("case 5\n");
+		if ( choice == 5 ) {
+			if ( choice != 5 ) {
+				printf("error\n");
+			} else {
+				printf("check\n");
+				fallthru common;
+			} // if
+		} // if
+	  common:
+		printf( "common\n" );
+		fallthru;
+		break;
+	  default:
+		printf( "default\n" );
+		fallthru;
+	} // switch
+
+#if ERR1
+	// ERROR: fallthrough must be enclosed in switch or choose
+	fallthru;
+	// ERROR: fallthrough must be enclosed in switch or choose
+	fallthru common4;
+	// ERROR: fallthrough must be enclosed in switch or choose
+	fallthru default;
+	choose ( 3 ) {
+		case 2:
+			for () {
+				choose ( 2 ) {
+					case 1:
+						// ERROR: default is later, but in a different switch
+						fallthru default;
+						// ERROR: common3 is later, but not at the same level as a case clause
+						fallthru common3;
+				}
+				common3: ;
+			}
+		default:
+		case 1:
+		common4:
+			// ERROR: attempt to jump up with fallthrough
+			if ( 7 ) fallthru common4;
+			// ERROR: attempt to jump up with fallthrough
+			fallthru default;
+	}
+#endif
+}
+
+int main() {
+	test(1);
+	printf("\n");
+	test(5);
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa fallthrough.cfa" //
+// End: //
Index: sts/forall.c
===================================================================
--- tests/forall.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,222 +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.
-// 
-// forall.c -- 
-// 
-// Author           : Peter A. Buhr
-// Created On       : Wed May  9 08:48:15 2018
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 12 16:19:08 2018
-// Update Count     : 30
-// 
-
-void g1() {
-	forall( otype T ) T f( T ) {};
-	void f( int ) {};
-	void h( void (*p)(void) ) {};
-
-	int x;
-	void (*y)(void);
-	char z;
-	float w;
-
-	f( x );
-	f( y );
-	f( z );
-	f( w );
-	h( f( y ) );
-}
-
-void g2() {
-	forall( otype T ) void f( T, T ) {}
-	forall( otype T, otype U ) void f( T, U ) {}
-
-	int x;
-	float y;
-	int *z;
-	float *w;
-
-	f( x, y );
-	f( z, w );
-	f( x, z );
-}
-
-typedef forall ( otype T ) int (* f)( int );
-
-forall( otype T )
-void swap( T left, T right ) {
-	T temp = left;
-	left = right;
-	right = temp;
-}
-
-void ?{}( int & c, zero_t ) { c = 0; }					// not in prelude
-
-trait sumable( otype T ) {
-	void ?{}( T &, zero_t );							// 0 literal constructor
-	T ?+?( T, T );										// assortment of additions
-	T ?+=?( T &, T );
-	T ++?( T & );
-	T ?++( T & );
-}; // sumable
-
-forall( otype T | sumable( T ) )						// use trait
-T sum( size_t size, T a[] ) {
-	T total = 0;										// initialize by 0 constructor
-	for ( size_t i = 0; i < size; i += 1 )
-		total = total + a[i];							// select appropriate +
-	return total;
-} // sum
-
-forall( otype T | { T ?+?( T, T ); T ?++( T & ); [T] ?+=?( T &,T ); } )
-T twice( T t ) {
-	return t + t;
-}
-
-forall( otype T | { int ?<?(T, T); } )
-T min( T t1, T t2 ) {
-	return t1 < t2 ? t1 : t2;
-}
-
-int fred() {
-	int x = 1, y = 2, a[10];
-	float f;
-
-	swap( x, y );
-	twice( x );
-	f = min( 4.0, 3.0 );
-	sum( 10, a );
-}
-
-// Multiple forall
-forall( otype T ) forall( otype S ) struct { int i; };
-forall( otype T ) struct { int i; } forall( otype S );
-struct { int i; } forall( otype T ) forall( otype S );
-forall( otype W ) struct { int i; } forall( otype T ) forall( otype S );
-
-// Distribution
-struct P { int i; };
-forall( otype T ) struct Q { T i; };
-forall( otype T ) struct { int i; };
-struct KK { int i; };
-inline static {
- 	void RT1() {}
-}
-forall( otype T ) {
-	T RT2( T ) {
-		typedef int TD1;
-		struct S1 { T t; };
-	}
-	forall( otype X ) {
-		typedef int TD2;
-		struct S2 {};
-		X RT2( T, X ) {
-			int TD2;
-		}
-	}
-	extern "C" {
-		forall( otype W ) {
-			W RT3( W ) {}
-			struct S3 {};
-		}
-	}
-	void RT4() {
-		forall( otype W ) struct S4 {};
-		typedef int TD3;
-	}
-	static {
-		struct S5 {};
-		void RT5( T ) {
-			struct S6 {};
-			int TD2;
-		}
-	}
-	struct S7 {};
-	typedef int TD4;
-}
-TD2 t2;
-TD4 t4;
-struct Q( int ) t;
-struct S2( int, int ) t;
-struct S5( int ) t;
-struct S7( int ) t;
-
-int i = RT2( 3 );
-double j = RT2( 3, 4.5 );
-
-static inline {
-	forall( otype T ) {
-		int RT6( T p );
-	}
-	forall( otype T, otype U ) {
-		int RT7( T, U );
-	}
-}
-static forall( otype T ) {
-	int RT8( T );
-}
-forall( otype T ) inline static {
-	int RT9( T ) { T t; }
-}
-
-forall( otype T | { T ?+?( T, T ); } ) {
-	forall( otype S | { T ?+?( T, S ); } ) {
-		forall( otype W ) T bar( T t, S s ) { return t + s; }
-		forall( otype W | { W ?+?( T, W ); } ) W baz( T t, S s, W w ) { return t + s + w; }
-		struct W { T t; } (int,int) ww;
-		struct P pp;
-	}
-}
-
-forall( otype T | { T ?+?( T, T ); } ) forall( otype S | { T ?+?( T, S ); } ) 
-struct XW { T t; };
-XW(int,int) xww;
-
-forall( otype T ) struct S { T t; } (int) x, y, z;
-forall( otype T ) struct { T t; } (int) a, b, c;
-
-forall( otype T ) static forall( otype S ) {
-    forall( otype X ) struct U {
-		T x;
-    };
-}
-
-forall( otype T ) {
-	extern "C" {
-		struct SS { T t; };
-		T foo( T ) {}
-	}
-}
-
-SS(int) s;
-W(int,int) w;
-
-int jane() {
-//	int j = bar( 3, 4 );
-	int k = baz( 3, 4, 5 );
-	int i = foo( 3 );
-}
-
-//otype T1 | { void xxx( T1 ); };
-
-// otype T1 | { void ?{}( T1 &, zero_t ); T1 ?+?(T1, T1); T1 ?++(T1); [T1] ?+=?(T1,T1); },
-// 	T2(otype P1, otype P2 ),
-// 	T3 | sumable(T3);
-
-//otype T2(otype P1, otype P2) | sumable( T2( P1,P2 ) ) = struct { P1 i; P2 j; };
-
-// T2(int, int) w1;
-// typedef T2(int, int) w2;
-// w2 g2;
-// otype w3 = T2(int, int);
-// w3 g3;
-
-int main( void ) {}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa forall.c" //
-// End: //
Index: tests/forall.cfa
===================================================================
--- tests/forall.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/forall.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,222 @@
+// 
+// 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.
+// 
+// forall.cfa -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Wed May  9 08:48:15 2018
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:53:43 2018
+// Update Count     : 31
+// 
+
+void g1() {
+	forall( otype T ) T f( T ) {};
+	void f( int ) {};
+	void h( void (*p)(void) ) {};
+
+	int x;
+	void (*y)(void);
+	char z;
+	float w;
+
+	f( x );
+	f( y );
+	f( z );
+	f( w );
+	h( f( y ) );
+}
+
+void g2() {
+	forall( otype T ) void f( T, T ) {}
+	forall( otype T, otype U ) void f( T, U ) {}
+
+	int x;
+	float y;
+	int *z;
+	float *w;
+
+	f( x, y );
+	f( z, w );
+	f( x, z );
+}
+
+typedef forall ( otype T ) int (* f)( int );
+
+forall( otype T )
+void swap( T left, T right ) {
+	T temp = left;
+	left = right;
+	right = temp;
+}
+
+void ?{}( int & c, zero_t ) { c = 0; }					// not in prelude
+
+trait sumable( otype T ) {
+	void ?{}( T &, zero_t );							// 0 literal constructor
+	T ?+?( T, T );										// assortment of additions
+	T ?+=?( T &, T );
+	T ++?( T & );
+	T ?++( T & );
+}; // sumable
+
+forall( otype T | sumable( T ) )						// use trait
+T sum( size_t size, T a[] ) {
+	T total = 0;										// initialize by 0 constructor
+	for ( size_t i = 0; i < size; i += 1 )
+		total = total + a[i];							// select appropriate +
+	return total;
+} // sum
+
+forall( otype T | { T ?+?( T, T ); T ?++( T & ); [T] ?+=?( T &,T ); } )
+T twice( T t ) {
+	return t + t;
+}
+
+forall( otype T | { int ?<?(T, T); } )
+T min( T t1, T t2 ) {
+	return t1 < t2 ? t1 : t2;
+}
+
+int fred() {
+	int x = 1, y = 2, a[10];
+	float f;
+
+	swap( x, y );
+	twice( x );
+	f = min( 4.0, 3.0 );
+	sum( 10, a );
+}
+
+// Multiple forall
+forall( otype T ) forall( otype S ) struct { int i; };
+forall( otype T ) struct { int i; } forall( otype S );
+struct { int i; } forall( otype T ) forall( otype S );
+forall( otype W ) struct { int i; } forall( otype T ) forall( otype S );
+
+// Distribution
+struct P { int i; };
+forall( otype T ) struct Q { T i; };
+forall( otype T ) struct { int i; };
+struct KK { int i; };
+inline static {
+ 	void RT1() {}
+}
+forall( otype T ) {
+	T RT2( T ) {
+		typedef int TD1;
+		struct S1 { T t; };
+	}
+	forall( otype X ) {
+		typedef int TD2;
+		struct S2 {};
+		X RT2( T, X ) {
+			int TD2;
+		}
+	}
+	extern "C" {
+		forall( otype W ) {
+			W RT3( W ) {}
+			struct S3 {};
+		}
+	}
+	void RT4() {
+		forall( otype W ) struct S4 {};
+		typedef int TD3;
+	}
+	static {
+		struct S5 {};
+		void RT5( T ) {
+			struct S6 {};
+			int TD2;
+		}
+	}
+	struct S7 {};
+	typedef int TD4;
+}
+TD2 t2;
+TD4 t4;
+struct Q( int ) t;
+struct S2( int, int ) t;
+struct S5( int ) t;
+struct S7( int ) t;
+
+int i = RT2( 3 );
+double j = RT2( 3, 4.5 );
+
+static inline {
+	forall( otype T ) {
+		int RT6( T p );
+	}
+	forall( otype T, otype U ) {
+		int RT7( T, U );
+	}
+}
+static forall( otype T ) {
+	int RT8( T );
+}
+forall( otype T ) inline static {
+	int RT9( T ) { T t; }
+}
+
+forall( otype T | { T ?+?( T, T ); } ) {
+	forall( otype S | { T ?+?( T, S ); } ) {
+		forall( otype W ) T bar( T t, S s ) { return t + s; }
+		forall( otype W | { W ?+?( T, W ); } ) W baz( T t, S s, W w ) { return t + s + w; }
+		struct W { T t; } (int,int) ww;
+		struct P pp;
+	}
+}
+
+forall( otype T | { T ?+?( T, T ); } ) forall( otype S | { T ?+?( T, S ); } ) 
+struct XW { T t; };
+XW(int,int) xww;
+
+forall( otype T ) struct S { T t; } (int) x, y, z;
+forall( otype T ) struct { T t; } (int) a, b, c;
+
+forall( otype T ) static forall( otype S ) {
+    forall( otype X ) struct U {
+		T x;
+    };
+}
+
+forall( otype T ) {
+	extern "C" {
+		struct SS { T t; };
+		T foo( T ) {}
+	}
+}
+
+SS(int) s;
+W(int,int) w;
+
+int jane() {
+//	int j = bar( 3, 4 );
+	int k = baz( 3, 4, 5 );
+	int i = foo( 3 );
+}
+
+//otype T1 | { void xxx( T1 ); };
+
+// otype T1 | { void ?{}( T1 &, zero_t ); T1 ?+?(T1, T1); T1 ?++(T1); [T1] ?+=?(T1,T1); },
+// 	T2(otype P1, otype P2 ),
+// 	T3 | sumable(T3);
+
+//otype T2(otype P1, otype P2) | sumable( T2( P1,P2 ) ) = struct { P1 i; P2 j; };
+
+// T2(int, int) w1;
+// typedef T2(int, int) w2;
+// w2 g2;
+// otype w3 = T2(int, int);
+// w3 g3;
+
+int main( void ) {}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa forall.cfa" //
+// End: //
Index: sts/fstream_test.c
===================================================================
--- tests/fstream_test.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,35 +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.
-//
-// fstream_test.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Wed May 27 17:56:53 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug 24 11:30:26 2017
-// Update Count     : 65
-//
-
-#include <fstream.hfa>
-
-int main( void ) {
-	int nombre;
-	sout | "Entrez un nombre, s'il vous plaît:" | endl;
-	sin  | nombre;
-	sout | "Vous avez entré" | nombre | endl;
-	sout | "le nombre" | nombre | "est"
-		 | (nombre > 0 ? "positif" : nombre == 0 ? "zéro" : "négatif") | endl;
-
-	sout | "Entrez trois nombres, s'il vous plaît: " | endl;
-	int i, j, k;
-	sin  | i | j | k;
-	sout | "Vous avez entré" | "i:" | "" | i | "j:" | "" | j | "k:" | "" | k | endl;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa fstream_test.c" //
-// End: //
Index: tests/fstream_test.cfa
===================================================================
--- tests/fstream_test.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/fstream_test.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,35 @@
+//
+// 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.
+//
+// fstream_test.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Wed May 27 17:56:53 2015
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:53:56 2018
+// Update Count     : 66
+//
+
+#include <fstream.hfa>
+
+int main( void ) {
+	int nombre;
+	sout | "Entrez un nombre, s'il vous plaît:" | endl;
+	sin  | nombre;
+	sout | "Vous avez entré" | nombre | endl;
+	sout | "le nombre" | nombre | "est"
+		 | (nombre > 0 ? "positif" : nombre == 0 ? "zéro" : "négatif") | endl;
+
+	sout | "Entrez trois nombres, s'il vous plaît: " | endl;
+	int i, j, k;
+	sin  | i | j | k;
+	sout | "Vous avez entré" | "i:" | "" | i | "j:" | "" | j | "k:" | "" | k | endl;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa fstream_test.cfa" //
+// End: //
Index: sts/function-operator.c
===================================================================
--- tests/function-operator.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,177 +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.
-//
-// function-operator.c --
-//
-// Author           : Rob Schluntz
-// Created On       : Fri Aug 25 15:21:11 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug  2 09:27:53 2018
-// Update Count     : 8
-//
-
-#include <fstream.hfa>
-#include <stdlib.hfa>
-
-#define length(array) (sizeof((array))/sizeof((array)[0]))
-#define begin(array) (&array[0]) // there's currently a bug in passing an array to a polymorphic function, so ensure a pointer is passed instead
-#define end(array) (&array[length(array)])
-
-// STL-like Algorithms
-trait Assignable(dtype T, dtype U) { T ?=?(T &, U); };
-trait Copyable(dtype T) { void ?{}(T &, T); };
-trait Destructable(dtype T) { void ^?{}(T &); };
-
-trait Iterator(dtype iter | sized(iter) | Copyable(iter) | Destructable(iter), otype T) {
-	T & *?(iter);
-	iter ++?(iter &);
-	int ?!=?(iter, iter);
-};
-
-forall(otype Tin, dtype Input | Iterator(Input, Tin), otype Tout, dtype Output | Iterator(Output, Tout) | Assignable(Tout, Tin))
-Output copy(Input first, Input last, Output result) {
-	while (first != last) {
-		*result = *first;
-		++result; ++first;
-	}
-	return result;
-}
-
-// test ?()(T *, ...) -- ?() with function call-by-pointer
-forall(otype Tin, dtype Input | Iterator(Input, Tin), otype Tout, dtype Output | Iterator(Output, Tout), otype FuncRet, dtype Func | { FuncRet ?()(Func *, Tin); } | Assignable(Tout, FuncRet))
-Output transform (Input first, Input last, Output result, Func * op) {
-	while (first != last) {
-		*result = op(*first);
-		++result; ++first;
-	}
-	return result;
-}
-
-// test ?()(T, ...) -- ?() with function call-by-value
-forall(dtype Iter, otype T | Iterator(Iter, T), otype Pred | { int ?()(Pred, T); })
-Iter find_if (Iter first, Iter last, Pred pred) {
-	while (first != last) {
-		if (pred(*first)) return first;
-		++first;
-	}
-	return last;
-}
-
-// test ?()(T, ...) -- ?() with function call-by-reference
-forall(otype Generator, otype GenRet | { GenRet ?()(Generator &); }, dtype Iter, otype T| Iterator(Iter, T) | Assignable(T, GenRet))
-void generate(Iter first, Iter last, Generator & gen) {
-	int i = 0;
-	while (first != last) {
-		*first = gen();
-		++first;
-	}
-}
-
-// encapsulate a counter that increments by one every time it is called
-struct Counter { int c; };
-void ?{}(Counter & cnt) { cnt.c = 0; }
-int ?()(Counter & cnt) { return cnt.c++; }
-
-// TODO: abstract over os type with ostream trait; resolver is currently too slow for this to be reasonable, but it does work.
-struct os_wrapper {
-	ofstream * out;
-};
-
-// TODO: abstract over (os, T)
-os_wrapper ?=?(os_wrapper & wrapper, int x) {
-	*wrapper.out | x | endl;
-	return wrapper;
-}
-
-	struct ostream_iterator {
-		os_wrapper * out;
-	};
-void ?{}(ostream_iterator & iter, ofstream * out) {
-	iter.out = new(out);
-}
-// no destructor, memory leak. This is necessary for this to work at the moment, since
-// *? requires its parameter by value and returns a reference.
-
-// implement Iterator
-os_wrapper & *?(ostream_iterator iter) {
-	return *iter.out;
-}
-ostream_iterator ++?(ostream_iterator & iter) {
-	// nothing to do
-	return iter;
-}
-int ?!=?(ostream_iterator i1, ostream_iterator i2) {
-	return i1.out->out != i2.out->out;
-}
-
-forall(otype T | { int ?==?(T, T); })
-struct Equals {
-	T val;
-};
-
-forall(otype T | { int ?==?(T, T); })
-int ?()(Equals(T) eq, T x) {
-	return eq.val == x;
-}
-
-forall(otype T | { T ?*?(T, T); })
-struct Multiply {
-	T val;
-};
-
-forall(otype T | { T ?*?(T, T); })
-T ?()(Multiply(T) * mult, T x) {
-	return mult->val * x;
-}
-
-// TODO: generalize to ttype return; doesn't work yet
-// like std::function
-forall(otype Return, ttype Args)
-struct function {
-	Return (*f)(Args);
-};
-// TODO: missing adapter in these functions
-// // value, reference, pointer operators
-// forall(otype Return, ttype Args) Return ?()(function(Return, Args) func, Args args) { return func.f(args); }
-// forall(otype Return, ttype Args) Return ?()(function(Return, Args) & func, Args args) { return func.f(args); }
-// forall(otype Return, ttype Args) Return ?()(function(Return, Args) * func, Args args) { return func->f(args); }
-
-int main() {
-	// generate for array fill
-	Counter c;
-	int x[10], y[10];
-	generate(begin(x), end(x), c);
-	generate(begin(y), end(y), c);
-
-	// copy for output
-	ostream_iterator out_iter = { &sout };
-	copy(begin(x), end(x), out_iter);
-	copy(begin(y), end(y), out_iter);
-
-	// find_if for searching
-	Equals(int) is5 = { 5 };
-	if (find_if(begin(x), end(x), is5) != end(y)) {
-		printf("Found 5 in x.\n");
-	} else {
-		printf("Did not find 5 in x.\n");
-	}
-	if (find_if(begin(y), end(y), is5) != end(y)) {
-		printf("Found 5 in y.\n");
-	} else {
-		printf("Did not find 5 in y.\n");
-	}
-
-	Multiply(int) times2 = { 2 };
-	transform(begin(x), end(x), begin(x), &times2);
-	copy(begin(x), end(x), out_iter);
-
-	// REMOVE WHEN ?* PROBLEM FIXED.
-	delete(out_iter.out);
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: tests/function-operator.cfa
===================================================================
--- tests/function-operator.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/function-operator.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,177 @@
+//
+// 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.
+//
+// function-operator.c --
+//
+// Author           : Rob Schluntz
+// Created On       : Fri Aug 25 15:21:11 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu Aug  2 09:27:53 2018
+// Update Count     : 8
+//
+
+#include <fstream.hfa>
+#include <stdlib.hfa>
+
+#define length(array) (sizeof((array))/sizeof((array)[0]))
+#define begin(array) (&array[0]) // there's currently a bug in passing an array to a polymorphic function, so ensure a pointer is passed instead
+#define end(array) (&array[length(array)])
+
+// STL-like Algorithms
+trait Assignable(dtype T, dtype U) { T ?=?(T &, U); };
+trait Copyable(dtype T) { void ?{}(T &, T); };
+trait Destructable(dtype T) { void ^?{}(T &); };
+
+trait Iterator(dtype iter | sized(iter) | Copyable(iter) | Destructable(iter), otype T) {
+	T & *?(iter);
+	iter ++?(iter &);
+	int ?!=?(iter, iter);
+};
+
+forall(otype Tin, dtype Input | Iterator(Input, Tin), otype Tout, dtype Output | Iterator(Output, Tout) | Assignable(Tout, Tin))
+Output copy(Input first, Input last, Output result) {
+	while (first != last) {
+		*result = *first;
+		++result; ++first;
+	}
+	return result;
+}
+
+// test ?()(T *, ...) -- ?() with function call-by-pointer
+forall(otype Tin, dtype Input | Iterator(Input, Tin), otype Tout, dtype Output | Iterator(Output, Tout), otype FuncRet, dtype Func | { FuncRet ?()(Func *, Tin); } | Assignable(Tout, FuncRet))
+Output transform (Input first, Input last, Output result, Func * op) {
+	while (first != last) {
+		*result = op(*first);
+		++result; ++first;
+	}
+	return result;
+}
+
+// test ?()(T, ...) -- ?() with function call-by-value
+forall(dtype Iter, otype T | Iterator(Iter, T), otype Pred | { int ?()(Pred, T); })
+Iter find_if (Iter first, Iter last, Pred pred) {
+	while (first != last) {
+		if (pred(*first)) return first;
+		++first;
+	}
+	return last;
+}
+
+// test ?()(T, ...) -- ?() with function call-by-reference
+forall(otype Generator, otype GenRet | { GenRet ?()(Generator &); }, dtype Iter, otype T| Iterator(Iter, T) | Assignable(T, GenRet))
+void generate(Iter first, Iter last, Generator & gen) {
+	int i = 0;
+	while (first != last) {
+		*first = gen();
+		++first;
+	}
+}
+
+// encapsulate a counter that increments by one every time it is called
+struct Counter { int c; };
+void ?{}(Counter & cnt) { cnt.c = 0; }
+int ?()(Counter & cnt) { return cnt.c++; }
+
+// TODO: abstract over os type with ostream trait; resolver is currently too slow for this to be reasonable, but it does work.
+struct os_wrapper {
+	ofstream * out;
+};
+
+// TODO: abstract over (os, T)
+os_wrapper ?=?(os_wrapper & wrapper, int x) {
+	*wrapper.out | x | endl;
+	return wrapper;
+}
+
+	struct ostream_iterator {
+		os_wrapper * out;
+	};
+void ?{}(ostream_iterator & iter, ofstream * out) {
+	iter.out = new(out);
+}
+// no destructor, memory leak. This is necessary for this to work at the moment, since
+// *? requires its parameter by value and returns a reference.
+
+// implement Iterator
+os_wrapper & *?(ostream_iterator iter) {
+	return *iter.out;
+}
+ostream_iterator ++?(ostream_iterator & iter) {
+	// nothing to do
+	return iter;
+}
+int ?!=?(ostream_iterator i1, ostream_iterator i2) {
+	return i1.out->out != i2.out->out;
+}
+
+forall(otype T | { int ?==?(T, T); })
+struct Equals {
+	T val;
+};
+
+forall(otype T | { int ?==?(T, T); })
+int ?()(Equals(T) eq, T x) {
+	return eq.val == x;
+}
+
+forall(otype T | { T ?*?(T, T); })
+struct Multiply {
+	T val;
+};
+
+forall(otype T | { T ?*?(T, T); })
+T ?()(Multiply(T) * mult, T x) {
+	return mult->val * x;
+}
+
+// TODO: generalize to ttype return; doesn't work yet
+// like std::function
+forall(otype Return, ttype Args)
+struct function {
+	Return (*f)(Args);
+};
+// TODO: missing adapter in these functions
+// // value, reference, pointer operators
+// forall(otype Return, ttype Args) Return ?()(function(Return, Args) func, Args args) { return func.f(args); }
+// forall(otype Return, ttype Args) Return ?()(function(Return, Args) & func, Args args) { return func.f(args); }
+// forall(otype Return, ttype Args) Return ?()(function(Return, Args) * func, Args args) { return func->f(args); }
+
+int main() {
+	// generate for array fill
+	Counter c;
+	int x[10], y[10];
+	generate(begin(x), end(x), c);
+	generate(begin(y), end(y), c);
+
+	// copy for output
+	ostream_iterator out_iter = { &sout };
+	copy(begin(x), end(x), out_iter);
+	copy(begin(y), end(y), out_iter);
+
+	// find_if for searching
+	Equals(int) is5 = { 5 };
+	if (find_if(begin(x), end(x), is5) != end(y)) {
+		printf("Found 5 in x.\n");
+	} else {
+		printf("Did not find 5 in x.\n");
+	}
+	if (find_if(begin(y), end(y), is5) != end(y)) {
+		printf("Found 5 in y.\n");
+	} else {
+		printf("Did not find 5 in y.\n");
+	}
+
+	Multiply(int) times2 = { 2 };
+	transform(begin(x), end(x), begin(x), &times2);
+	copy(begin(x), end(x), out_iter);
+
+	// REMOVE WHEN ?* PROBLEM FIXED.
+	delete(out_iter.out);
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: sts/functions.c
===================================================================
--- tests/functions.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,191 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// functions.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Wed Aug 17 08:39:58 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jan 17 22:44:12 2018
-// Update Count     : 12
-//
-
-// ANSI function definitions
-
-void h(void) {}
-
-int f (
-	int (void),
-	int (int),
-	int ((void)),
-	int ((int)),
-	void g(void)
-	) {
-	(* g)();
-	g();
-	g = h;
-}
-
-int f1() {}
-int (f2()) {}
-int (* f3())() {}
-int * ((f4())) {}
-int ((* f5()))() {}
-int * f6() {}
-int * (f7)() {}
-int ** f8() {}
-int * const * (f9)() {}
-int (* f10())[] {}
-int (* f11())[][3] {}
-int ((* f12())[])[3] {}
-
-// "implicit int" otype specifier (not ANSI)
-
-fII1( int i ) {}
-const fII2( int i ) {}
-extern fII3( int i ) {}
-extern const fII4( int i ) {}
-
-* fII5() {}
-const * fII6() {}
-const long * fII7() {}
-static const long * fII8() {}
-const static long * fII9() {}
-
-// K&R function definitions
-
-fO1( i ) int i; {}
-int fO2( i ) int i; {}
-const fO3( i ) int i; {}
-extern fO4( i ) int i; {}
-extern const fO5( i ) int i; {}
-
-// Cforall extensions
-
-// [] f( );
-[int] f( );
-// [] f(int);
-[int] f(int);
-// [] f( ) {}
-[int] f( ) {}
-// [] f(int) {}
-[int] f(int) {}
-
-[int x] f( );
-// [] f(int x);
-//[int x] f(int x);
-//[int x] f( ) {}
-// [] f(int x) {}
-//[int x] f(int x) {}
-
-[int, int x] f( );
-// [] f(int, int x);
-[int, int x] f(int, int x);
-[int, int x] f( ) {}
-// [] f(int, int x) {}
-[int, int x] f(int, int x) {}
-
-[int, int x, int] f( );
-// [] f(int, int x, int);
-[int, int x, int] f(int, int x, int);
-[int, int x, int] f( ) {}
-// [] f(int, int x, int) {}
-[int, int x, int] f(int, int x, int) {}
-
-[int, int x, * int y] f( );
-// [] f(int, int x, * int y);
-[int, int x, * int y] f(int, int x, * int y);
-[int, int x, * int y] f( ) {}
-// [] f(int, int x, * int y) {}
-[int, int x, * int y] f(int, int x, * int y) {}
-
-// function prototypes
-
-[ int ] f11( int ), f12();  // => int f11( int ), f12( void );
-
-const double bar1(), bar2( int ), bar3( double );		// C version
-[const double] foo(), foo( int ), foo( double ) { return 3.0; } // CFA version
-struct S { int i; };
-[S] rtn( int ) {}
-
-
-[int] f(
-	int ( int, int p ),
-	[int](int)
-	) {
-	int (* (* pc)[][10])[][3];
-	* [][10] * [][3] int p;
-	* [] * [int](int) p;
-}
-
-static const int * f1() {}
-static [ * const int ] f2() {}
-static inline [ const * int ] f3() {}
-static inline [ const [ * int, int ] ] f4() {}
-static [ const [ * int, const int ] ] f5() {}
-
-// unnamed parameter
-
-int f(
-	int (),
-
-	int * (),
-	int ** (),
-	int * const * (),
-	int * const * const (),
-
-	int ([]),
-	int ([10]),
-
-	int * ([]),
-	int * ([10]),
-	int ** ([]),
-	int ** ([10]),
-	int * const * ([]),
-	int * const * ([10]),
-	int * const * const ([]),
-	int * const * const ([10])
-	);
-
-int f(
-	int (),
-
-	int * (),
-	int ** (),
-	int * const * (),
-	int * const * const (),
-
-	int ([]),
-	int ([10]),
-
-	int * ([]),
-	int * ([10]),
-	int ** ([]),
-	int ** ([10]),
-	int * const * ([]),
-	int * const * ([10]),
-	int * const * const ([]),
-	int * const * const ([10])
-	) {
-}
-
-typedef int T;
-
-int f( T (* f), T t ) {
-	T (T);
-}
-
-// errors
-
-//int f()[] {}
-//int (f[])() {}
-//int f[]() {}
-//int ((* f15())())[] {}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa functions.c" //
-// End: //
Index: tests/functions.cfa
===================================================================
--- tests/functions.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/functions.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,191 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// functions.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Wed Aug 17 08:39:58 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:54:09 2018
+// Update Count     : 13
+//
+
+// ANSI function definitions
+
+void h(void) {}
+
+int f (
+	int (void),
+	int (int),
+	int ((void)),
+	int ((int)),
+	void g(void)
+	) {
+	(* g)();
+	g();
+	g = h;
+}
+
+int f1() {}
+int (f2()) {}
+int (* f3())() {}
+int * ((f4())) {}
+int ((* f5()))() {}
+int * f6() {}
+int * (f7)() {}
+int ** f8() {}
+int * const * (f9)() {}
+int (* f10())[] {}
+int (* f11())[][3] {}
+int ((* f12())[])[3] {}
+
+// "implicit int" otype specifier (not ANSI)
+
+fII1( int i ) {}
+const fII2( int i ) {}
+extern fII3( int i ) {}
+extern const fII4( int i ) {}
+
+* fII5() {}
+const * fII6() {}
+const long * fII7() {}
+static const long * fII8() {}
+const static long * fII9() {}
+
+// K&R function definitions
+
+fO1( i ) int i; {}
+int fO2( i ) int i; {}
+const fO3( i ) int i; {}
+extern fO4( i ) int i; {}
+extern const fO5( i ) int i; {}
+
+// Cforall extensions
+
+// [] f( );
+[int] f( );
+// [] f(int);
+[int] f(int);
+// [] f( ) {}
+[int] f( ) {}
+// [] f(int) {}
+[int] f(int) {}
+
+[int x] f( );
+// [] f(int x);
+//[int x] f(int x);
+//[int x] f( ) {}
+// [] f(int x) {}
+//[int x] f(int x) {}
+
+[int, int x] f( );
+// [] f(int, int x);
+[int, int x] f(int, int x);
+[int, int x] f( ) {}
+// [] f(int, int x) {}
+[int, int x] f(int, int x) {}
+
+[int, int x, int] f( );
+// [] f(int, int x, int);
+[int, int x, int] f(int, int x, int);
+[int, int x, int] f( ) {}
+// [] f(int, int x, int) {}
+[int, int x, int] f(int, int x, int) {}
+
+[int, int x, * int y] f( );
+// [] f(int, int x, * int y);
+[int, int x, * int y] f(int, int x, * int y);
+[int, int x, * int y] f( ) {}
+// [] f(int, int x, * int y) {}
+[int, int x, * int y] f(int, int x, * int y) {}
+
+// function prototypes
+
+[ int ] f11( int ), f12();  // => int f11( int ), f12( void );
+
+const double bar1(), bar2( int ), bar3( double );		// C version
+[const double] foo(), foo( int ), foo( double ) { return 3.0; } // CFA version
+struct S { int i; };
+[S] rtn( int ) {}
+
+
+[int] f(
+	int ( int, int p ),
+	[int](int)
+	) {
+	int (* (* pc)[][10])[][3];
+	* [][10] * [][3] int p;
+	* [] * [int](int) p;
+}
+
+static const int * f1() {}
+static [ * const int ] f2() {}
+static inline [ const * int ] f3() {}
+static inline [ const [ * int, int ] ] f4() {}
+static [ const [ * int, const int ] ] f5() {}
+
+// unnamed parameter
+
+int f(
+	int (),
+
+	int * (),
+	int ** (),
+	int * const * (),
+	int * const * const (),
+
+	int ([]),
+	int ([10]),
+
+	int * ([]),
+	int * ([10]),
+	int ** ([]),
+	int ** ([10]),
+	int * const * ([]),
+	int * const * ([10]),
+	int * const * const ([]),
+	int * const * const ([10])
+	);
+
+int f(
+	int (),
+
+	int * (),
+	int ** (),
+	int * const * (),
+	int * const * const (),
+
+	int ([]),
+	int ([10]),
+
+	int * ([]),
+	int * ([10]),
+	int ** ([]),
+	int ** ([10]),
+	int * const * ([]),
+	int * const * ([10]),
+	int * const * const ([]),
+	int * const * const ([10])
+	) {
+}
+
+typedef int T;
+
+int f( T (* f), T t ) {
+	T (T);
+}
+
+// errors
+
+//int f()[] {}
+//int (f[])() {}
+//int f[]() {}
+//int ((* f15())())[] {}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa functions.cfa" //
+// End: //
Index: sts/gccExtensions.c
===================================================================
--- tests/gccExtensions.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,123 +1,0 @@
-// 
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-// 
-// gccExtensions.c -- 
-// 
-// Author           : Peter A. Buhr
-// Created On       : Sun Aug 14 17:28:17 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Aug 17 09:26:50 2016
-// Update Count     : 10
-// 
-
-extern int x asm( "xx" );
-
-int main(int argc, char const *argv[]) {
-	// asm extensions
-
-	asm( "nop" );
-	__asm( "nop" );
-	__asm__( "nop" );
-
-	static int y asm( "yy" );
-#ifdef __CFA__
-	static * int z asm( "zz" );							// CFA declaration
-#endif // __CFA__
-
-	int src;
-	int dst;
-
-	asm volatile ( "mov %1, %0\n\t"
-				   "add $1, %0" : : : );
-
-	asm volatile ( "mov %1, %0\n\t"
-				   "add $1, %0"
-				   : "=" "r" (dst));
-
-	asm volatile ( "mov %1, %0\n\t"
-				   "add $1, %0"
-				   : "=r" (dst)
-				   : "r" (src));
-
-	asm ( "mov %1, %0\n\t"
-		  "add $1, %0"
-		  : "=r" (dst), "=r" (src)
-		  : [src] "r" (dst)
-		  : "r0");
-
-  L1: L2:
-	asm goto ( "frob %%r5, %1; jc %l[L1]; mov (%2), %%r5"
-			   : /* No outputs. */
-			   : "r"(src), "r"(&dst)
-			   : "r5", "memory"
-			   : L1, L2 );
-
-	// alternative type/qualifer names
-
-	__complex__ c1;
-	_Complex c2;
-
-	const int i1;
-	__const int i2;
-	__const__ int i3;
-
-	__inline int f1() {}
-	__inline__ int f2() {}
-
-	__signed s1;
-	__signed s2;
-
-	__volatile int v1;
-	__volatile__ int v2;
-
-	// symbol table attributes
-
-	__typeof(s1) t1;
-	__typeof__(s1) t2;
-
-	// strange extension qualifier
-
-	__extension__ const int ex;
-	struct S {
-		__extension__ int a, b, c;
-	};
-	int i = __extension__ 3;
-	__extension__ int a, b, c;
-	__extension__ a, __extension__ b, __extension__ c;
-	__extension__ a = __extension__ b + __extension__ c;
-	__extension__ a = __extension__ ( __extension__ b + __extension__ c );
-
-	// attributes
-
-	__attribute__(()) int a1;
-	const __attribute(()) int a2;
-	const static __attribute(()) int a3;
-	const static int __attribute(()) a4;
-	const static int a5 __attribute(());
-	const static int a6, __attribute(()) a7;
-
-	int * __attribute(()) p1;
-	int (* __attribute(()) p2);
-//	int (__attribute(()) (p3));
-//	int ( __attribute(()) (* __attribute(()) p4));
-
-	struct __attribute(()) s1;
-	struct __attribute(()) s2 { int i; };
-	struct __attribute(()) s3 { int i; } x1, __attribute(()) y1;
-	struct __attribute(()) s4 { int i; } x2, y2 __attribute(());
-
-	int m1 [10] __attribute(());
-	int m2 [10][10] __attribute(());
-	int __attribute(()) m3 [10][10];
-//	int ( __attribute(()) m4 [10] )[10];
-
-	return 0;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa gccExtensions.c" //
-// End: //
Index: tests/gccExtensions.cfa
===================================================================
--- tests/gccExtensions.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/gccExtensions.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,123 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// gccExtensions.cfa -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Sun Aug 14 17:28:17 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:54:20 2018
+// Update Count     : 11
+// 
+
+extern int x asm( "xx" );
+
+int main(int argc, char const *argv[]) {
+	// asm extensions
+
+	asm( "nop" );
+	__asm( "nop" );
+	__asm__( "nop" );
+
+	static int y asm( "yy" );
+#ifdef __CFA__
+	static * int z asm( "zz" );							// CFA declaration
+#endif // __CFA__
+
+	int src;
+	int dst;
+
+	asm volatile ( "mov %1, %0\n\t"
+				   "add $1, %0" : : : );
+
+	asm volatile ( "mov %1, %0\n\t"
+				   "add $1, %0"
+				   : "=" "r" (dst));
+
+	asm volatile ( "mov %1, %0\n\t"
+				   "add $1, %0"
+				   : "=r" (dst)
+				   : "r" (src));
+
+	asm ( "mov %1, %0\n\t"
+		  "add $1, %0"
+		  : "=r" (dst), "=r" (src)
+		  : [src] "r" (dst)
+		  : "r0");
+
+  L1: L2:
+	asm goto ( "frob %%r5, %1; jc %l[L1]; mov (%2), %%r5"
+			   : /* No outputs. */
+			   : "r"(src), "r"(&dst)
+			   : "r5", "memory"
+			   : L1, L2 );
+
+	// alternative type/qualifer names
+
+	__complex__ c1;
+	_Complex c2;
+
+	const int i1;
+	__const int i2;
+	__const__ int i3;
+
+	__inline int f1() {}
+	__inline__ int f2() {}
+
+	__signed s1;
+	__signed s2;
+
+	__volatile int v1;
+	__volatile__ int v2;
+
+	// symbol table attributes
+
+	__typeof(s1) t1;
+	__typeof__(s1) t2;
+
+	// strange extension qualifier
+
+	__extension__ const int ex;
+	struct S {
+		__extension__ int a, b, c;
+	};
+	int i = __extension__ 3;
+	__extension__ int a, b, c;
+	__extension__ a, __extension__ b, __extension__ c;
+	__extension__ a = __extension__ b + __extension__ c;
+	__extension__ a = __extension__ ( __extension__ b + __extension__ c );
+
+	// attributes
+
+	__attribute__(()) int a1;
+	const __attribute(()) int a2;
+	const static __attribute(()) int a3;
+	const static int __attribute(()) a4;
+	const static int a5 __attribute(());
+	const static int a6, __attribute(()) a7;
+
+	int * __attribute(()) p1;
+	int (* __attribute(()) p2);
+//	int (__attribute(()) (p3));
+//	int ( __attribute(()) (* __attribute(()) p4));
+
+	struct __attribute(()) s1;
+	struct __attribute(()) s2 { int i; };
+	struct __attribute(()) s3 { int i; } x1, __attribute(()) y1;
+	struct __attribute(()) s4 { int i; } x2, y2 __attribute(());
+
+	int m1 [10] __attribute(());
+	int m2 [10][10] __attribute(());
+	int __attribute(()) m3 [10][10];
+//	int ( __attribute(()) m4 [10] )[10];
+
+	return 0;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa gccExtensions.cfa" //
+// End: //
Index: sts/genericUnion.c
===================================================================
--- tests/genericUnion.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,30 +1,0 @@
-#include <limits.hfa>
-
-forall(otype T)
-union ByteView {
-	T val;
-	char bytes[(sizeof(int))]; // want to change to sizeof(T)
-};
-
-forall(otype T)
-void print(ByteView(T) x) {
-	for (int i = 0; i < sizeof(int); i++) { // want to change to sizeof(T)
-		printf("%02x", x.bytes[i] & 0xff);
-	}
-}
-
-forall(otype T)
-void f(ByteView(T) x, T val) {
-	print(x);
-	printf(" ");
-	x.val = val;
-	print(x);
-	printf("\n");
-}
-
-int main() {
-	ByteView(unsigned) u = { 0 };
-	ByteView(int) i = { 0 };
-	f(u, MAX);
-	f(i, -1);
-}
Index: tests/genericUnion.cfa
===================================================================
--- tests/genericUnion.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/genericUnion.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,30 @@
+#include <limits.hfa>
+
+forall(otype T)
+union ByteView {
+	T val;
+	char bytes[(sizeof(int))]; // want to change to sizeof(T)
+};
+
+forall(otype T)
+void print(ByteView(T) x) {
+	for (int i = 0; i < sizeof(int); i++) { // want to change to sizeof(T)
+		printf("%02x", x.bytes[i] & 0xff);
+	}
+}
+
+forall(otype T)
+void f(ByteView(T) x, T val) {
+	print(x);
+	printf(" ");
+	x.val = val;
+	print(x);
+	printf("\n");
+}
+
+int main() {
+	ByteView(unsigned) u = { 0 };
+	ByteView(int) i = { 0 };
+	f(u, MAX);
+	f(i, -1);
+}
Index: sts/gmp.c
===================================================================
--- tests/gmp.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,110 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// gmp.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Tue Apr 19 08:55:51 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Aug 18 12:43:13 2018
-// Update Count     : 556
-//
-
-// NOTE: UBUNTU DOES NOT SUPPORT GMP MULTILIB, SO ONLY 64-BIT GMP IS TESTED.
-
-#include <gmp.hfa>
-
-int main( void ) {
-	sout | "constructors" | endl;
-	short int si = 3;
-	Int x = { "50000000000000000000" }, y = { si }, z = x + y;
-	sout | x | y | z | endl;
-	sout | "x:" | x | "y:" | y | "z:" | z | endl;
-
-	sout | "conversions" | endl;
-	y = 'a';
-	sout | "y:" | y | endl;
-	y = "12345678901234567890123456789";
-	sout | "y:" | y | endl;
-	y = 100`mp + 100`mp;
-	sout | "y:" | y | endl;
-	y = -200u`mp + -200u`mp;
-	sout | "y:" | y | endl;
-	y = "12345678901234567890123456789"`mp + "12345678901234567890123456789"`mp;
-	sout | "y:" | y | endl;
-	y = si;
-	sout | "y:" | y | endl;
-	y = -3;
-	sout | "y:" | y | endl;
-	y += 7;
-	sout | "y:" | y | endl;
-	y -= 1;
-	sout | "y:" | y | endl;
-	int b;
-	b = y;
-	si = y;
-	sout | "y:" | y | "b:" | b | "si:" | si | endl;
-
-	sout | "comparison" | endl;
-	sout | x == x | endl;
-	sout | x != x | endl;
-	sout | x < x | endl;
-	sout | x <= x | endl;
-	sout | x > x | endl;
-	sout | x >= x | endl;
-
-	sout | "arithmetic" | endl;
-	z = x + y + z;
-	sout | "z:" | z | endl;
-	z = z = x;
-	sout | "z:" | z | endl;
-	z = x - y - z;
-	sout | "z:" | z | endl;
-	z = x * y * z;
-	sout | "z:" | z | endl;
-	z = x * 3;
-	sout | "z:" | z | endl;
-	z = 3 * x;
-	sout | "z:" | z | endl;
-	z = x / 3;
-	sout | "z:" | z | endl;
-	sout | div( x, 3 ) | x / 3 | "," | x % 3 | endl;
-	[ x, y ] = div( x, 3 );
-	sout | "x:" | x | "y:" | y | endl;
-
-	sout | endl;
-
-	sin | x | y | z;
-	sout | x | y | z | endl;
-
-	sout | endl;
-
-	sout | "Fibonacci Numbers" | endl;
-	Int fn, fn1, fn2;
-	fn = (Int){0}; fn1 = fn;							// 1st case
-	sout | (int)0 | fn | endl;
-	fn = 1; fn2 = fn1; fn1 = fn;						// 2nd case
-	sout | 1 | fn | endl;
-	for ( i; 2u ~= 200 ) {
-		fn = fn1 + fn2; fn2 = fn1; fn1 = fn;			// general case
-		sout | i | fn | endl;
-	} // for
-
-	sout | endl;
-
-	sout | "Factorial Numbers" | endl;
-	Int fact = 1;										// 1st case
-	sout | (int)0 | fact | endl;
-	for ( i; 1u ~= 40u ) {
-		fact *= i;										// general case
-		sout | i | fact | endl;
-	} // for
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa gmp.c -lgmp" //
-// End: //
Index: tests/gmp.cfa
===================================================================
--- tests/gmp.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/gmp.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,110 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// gmp.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Tue Apr 19 08:55:51 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:54:34 2018
+// Update Count     : 557
+//
+
+// NOTE: UBUNTU DOES NOT SUPPORT GMP MULTILIB, SO ONLY 64-BIT GMP IS TESTED.
+
+#include <gmp.hfa>
+
+int main( void ) {
+	sout | "constructors" | endl;
+	short int si = 3;
+	Int x = { "50000000000000000000" }, y = { si }, z = x + y;
+	sout | x | y | z | endl;
+	sout | "x:" | x | "y:" | y | "z:" | z | endl;
+
+	sout | "conversions" | endl;
+	y = 'a';
+	sout | "y:" | y | endl;
+	y = "12345678901234567890123456789";
+	sout | "y:" | y | endl;
+	y = 100`mp + 100`mp;
+	sout | "y:" | y | endl;
+	y = -200u`mp + -200u`mp;
+	sout | "y:" | y | endl;
+	y = "12345678901234567890123456789"`mp + "12345678901234567890123456789"`mp;
+	sout | "y:" | y | endl;
+	y = si;
+	sout | "y:" | y | endl;
+	y = -3;
+	sout | "y:" | y | endl;
+	y += 7;
+	sout | "y:" | y | endl;
+	y -= 1;
+	sout | "y:" | y | endl;
+	int b;
+	b = y;
+	si = y;
+	sout | "y:" | y | "b:" | b | "si:" | si | endl;
+
+	sout | "comparison" | endl;
+	sout | x == x | endl;
+	sout | x != x | endl;
+	sout | x < x | endl;
+	sout | x <= x | endl;
+	sout | x > x | endl;
+	sout | x >= x | endl;
+
+	sout | "arithmetic" | endl;
+	z = x + y + z;
+	sout | "z:" | z | endl;
+	z = z = x;
+	sout | "z:" | z | endl;
+	z = x - y - z;
+	sout | "z:" | z | endl;
+	z = x * y * z;
+	sout | "z:" | z | endl;
+	z = x * 3;
+	sout | "z:" | z | endl;
+	z = 3 * x;
+	sout | "z:" | z | endl;
+	z = x / 3;
+	sout | "z:" | z | endl;
+	sout | div( x, 3 ) | x / 3 | "," | x % 3 | endl;
+	[ x, y ] = div( x, 3 );
+	sout | "x:" | x | "y:" | y | endl;
+
+	sout | endl;
+
+	sin | x | y | z;
+	sout | x | y | z | endl;
+
+	sout | endl;
+
+	sout | "Fibonacci Numbers" | endl;
+	Int fn, fn1, fn2;
+	fn = (Int){0}; fn1 = fn;							// 1st case
+	sout | (int)0 | fn | endl;
+	fn = 1; fn2 = fn1; fn1 = fn;						// 2nd case
+	sout | 1 | fn | endl;
+	for ( i; 2u ~= 200 ) {
+		fn = fn1 + fn2; fn2 = fn1; fn1 = fn;			// general case
+		sout | i | fn | endl;
+	} // for
+
+	sout | endl;
+
+	sout | "Factorial Numbers" | endl;
+	Int fact = 1;										// 1st case
+	sout | (int)0 | fact | endl;
+	for ( i; 1u ~= 40u ) {
+		fact *= i;										// general case
+		sout | i | fact | endl;
+	} // for
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa gmp.cfa -lgmp" //
+// End: //
Index: sts/heap.c
===================================================================
--- tests/heap.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,342 +1,0 @@
-#include <thread.hfa>
-#include <kernel.hfa>										// processor
-#include <stdlib.hfa>										// *allocs
-#include <malloc.h>										// malloc_*
-
-// #include <time.hfa>
-// #define __CFA_DEFAULT_PREEMPTION__ 1000`us
-// //#define __CFA_DEFAULT_PREEMPTION__ 0
-
-// Duration default_preemption() {
-// 	return __CFA_DEFAULT_PREEMPTION__;
-// }
-
-#define __U_DEFAULT_MMAP_START__ (512 * 1024 + 1)
-size_t default_mmap_start() __attribute__(( weak )) {
-    return __U_DEFAULT_MMAP_START__;
-} // default_mmap_start
-
-thread Worker {
-}; // Worker
-
-void main( Worker & ) {
-    enum { NoOfAllocs = 5000, NoOfMmaps = 10 };
-    char *locns[NoOfAllocs];
-    int i;
-
-    // check alloc/free
-
-    for ( int j = 0; j < 40; j += 1 ) {
-		for ( i = 0; i < NoOfAllocs; i += 1 ) {
-			locns[i] = alloc( i );
-			//sout | (void *)locns[i] | endl;
-			for ( int k = 0; k < i; k += 1 ) locns[i][k] = '\345';
-		} // for
-		//sout | (char *)sbrk(0) - start | " bytes" | endl;
-
-		for ( i = 0; i < NoOfAllocs; i += 1 ) {
-			//sout | (void *)locns[i] | endl;
-			for ( int k = 0; k < i; k += 1 ) if ( locns[i][k] != '\345' ) abort( "new/delete corrupt storage1" );
-			free( locns[i] );
-		} // for
-		//sout | (char *)sbrk(0) - start | " bytes" | endl;
-
-		for ( i = 0; i < NoOfAllocs; i += 1 ) {
-			locns[i] = alloc( i );
-			//sout | (void *)locns[i] | endl;
-			for ( int k = 0; k < i; k += 1 ) locns[i][k] = '\345';
-		} // for
-		for ( i = NoOfAllocs - 1; i >=0 ; i -= 1 ) {
-			//sout | (void *)locns[i] | endl;
-			for ( int k = 0; k < i; k += 1 ) if ( locns[i][k] != '\345' ) abort( "new/delete corrupt storage2" );
-			free( locns[i] );
-		} // for
-    } // for
-
-    // check malloc/free (sbrk)
-
-    for ( i = 0; i < NoOfAllocs; i += 1 ) {
-		size_t s = (i + 1) * 20;
-		char *area = (char *)malloc( s );
-		if ( area == 0 ) abort( "malloc/free out of memory" );
-		area[0] = '\345'; area[s - 1] = '\345';			// fill first/last
-		area[malloc_usable_size( area ) - 1] = '\345';	// fill ultimate byte
-		free( area );
-    } // for
-
-    for ( i = 0; i < NoOfAllocs; i += 1 ) {
-		size_t s = i + 1;				// +1 to make initialization simpler
-		locns[i] = (char *)malloc( s );
-		if ( locns[i] == 0 ) abort( "malloc/free out of memory" );
-		locns[i][0] = '\345'; locns[i][s - 1] = '\345';	// fill first/last
-		locns[i][malloc_usable_size( locns[i] ) - 1] = '\345'; // fill ultimate byte
-    } // for
-    for ( i = 0; i < NoOfAllocs; i += 1 ) {
-		size_t s = i + 1;
-		if ( locns[i][0] != '\345' || locns[i][s - 1] != '\345' ||
-			 locns[i][malloc_usable_size( locns[i] ) - 1] != '\345' ) abort( "malloc/free corrupt storage" );
-		free( locns[i] );
-    } // for
-
-    // check malloc/free (mmap)
-
-    for ( i = 0; i < NoOfMmaps; i += 1 ) {
-		size_t s = i + default_mmap_start();				// cross over point
-		char *area = (char *)malloc( s );
-		if ( area == 0 ) abort( "malloc/free out of memory" );
-		area[0] = '\345'; area[s - 1] = '\345';			// fill first/last
-		area[malloc_usable_size( area ) - 1] = '\345';	// fill ultimate byte
-		free( area );
-    } // for
-
-    for ( i = 0; i < NoOfMmaps; i += 1 ) {
-		size_t s = i + default_mmap_start();				// cross over point
-		locns[i] = (char *)malloc( s );
-		if ( locns[i] == 0 ) abort( "malloc/free out of memory" );
-		locns[i][0] = '\345'; locns[i][s - 1] = '\345';	// fill first/last
-		locns[i][malloc_usable_size( locns[i] ) - 1] = '\345'; // fill ultimate byte
-    } // for
-    for ( i = 0; i < NoOfMmaps; i += 1 ) {
-		size_t s = i + default_mmap_start();				// cross over point
-		if ( locns[i][0] != '\345' || locns[i][s - 1] != '\345' ||
-			 locns[i][malloc_usable_size( locns[i] ) - 1] != '\345' ) abort( "malloc/free corrupt storage" );
-		free( locns[i] );
-    } // for
-
-    // check calloc/free (sbrk)
-
-    for ( i = 0; i < NoOfAllocs; i += 1 ) {
-		size_t s = (i + 1) * 20;
-		char *area = (char *)calloc( 5, s );
-		if ( area == 0 ) abort( "calloc/free out of memory" );
-		if ( area[0] != '\0' || area[s - 1] != '\0' ||
-			 area[malloc_usable_size( area ) - 1] != '\0' ||
-			 ! malloc_zero_fill( area ) ) abort( "calloc/free corrupt storage1" );
-		area[0] = '\345'; area[s - 1] = '\345';			// fill first/last
-		area[malloc_usable_size( area ) - 1] = '\345';	// fill ultimate byte
-		free( area );
-    } // for
-
-    for ( i = 0; i < NoOfAllocs; i += 1 ) {
-		size_t s = i + 1;
-		locns[i] = (char *)calloc( 5, s );
-		if ( locns[i] == 0 ) abort( "calloc/free out of memory" );
-		if ( locns[i][0] != '\0' || locns[i][s - 1] != '\0' ||
-			 locns[i][malloc_usable_size( locns[i] ) - 1] != '\0' ||
-			 ! malloc_zero_fill( locns[i] ) ) abort( "calloc/free corrupt storage2" );
-		locns[i][0] = '\345'; locns[i][s - 1] = '\345';	// fill first/last
-		locns[i][malloc_usable_size( locns[i] ) - 1] = '\345'; // fill ultimate byte
-    } // for
-    for ( i = 0; i < NoOfAllocs; i += 1 ) {
-		size_t s = i + 1;
-		if ( locns[i][0] != '\345' || locns[i][s - 1] != '\345' ||
-			 locns[i][malloc_usable_size( locns[i] ) - 1] != '\345' ) abort( "calloc/free corrupt storage3" );
-		free( locns[i] );
-    } // for
-
-    // check calloc/free (mmap)
-
-    for ( i = 0; i < NoOfMmaps; i += 1 ) {
-		size_t s = i + default_mmap_start();				// cross over point
-		char *area = (char *)calloc( 1, s );
-		if ( area == 0 ) abort( "calloc/free out of memory" );
-		if ( area[0] != '\0' || area[s - 1] != '\0' ) abort( "calloc/free corrupt storage4.1" );
-		if ( area[malloc_usable_size( area ) - 1] != '\0' ) abort( "calloc/free corrupt storage4.2" );
-		if ( ! malloc_zero_fill( area ) ) abort( "calloc/free corrupt storage4.3" );
-		area[0] = '\345'; area[s - 1] = '\345';			// fill first/last
-		area[malloc_usable_size( area ) - 1] = '\345';	// fill ultimate byte
-		free( area );
-    } // for
-
-    for ( i = 0; i < NoOfMmaps; i += 1 ) {
-		size_t s = i + default_mmap_start();				// cross over point
-		locns[i] = (char *)calloc( 1, s );
-		if ( locns[i] == 0 ) abort( "calloc/free out of memory" );
-		if ( locns[i][0] != '\0' || locns[i][s - 1] != '\0' ||
-			 locns[i][malloc_usable_size( locns[i] ) - 1] != '\0' ||
-			 ! malloc_zero_fill( locns[i] ) ) abort( "calloc/free corrupt storage5" );
-		locns[i][0] = '\345'; locns[i][s - 1] = '\345';	// fill first/last
-		locns[i][malloc_usable_size( locns[i] ) - 1] = '\345'; // fill ultimate byte
-    } // for
-    for ( i = 0; i < NoOfMmaps; i += 1 ) {
-		size_t s = i + default_mmap_start();				// cross over point
-		if ( locns[i][0] != '\345' || locns[i][s - 1] != '\345' ||
-			 locns[i][malloc_usable_size( locns[i] ) - 1] != '\345' ) abort( "calloc/free corrupt storage6" );
-		free( locns[i] );
-    } // for
-
-    // check memalign/free (sbrk)
-
-    enum { limit = 64 * 1024 };							// check alignments up to here
-
-    for ( size_t a = libAlign(); a <= limit; a += a ) {	// generate powers of 2
-		//sout | alignments[a] | endl;
-		for ( int s = 1; s < NoOfAllocs; s += 1 ) {		// allocation of size 0 can return null
-			char *area = (char *)memalign( a, s );
-			if ( area == 0 ) abort( "memalign/free out of memory" );
-			//sout | i | " " | area | endl;
-			if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
-				abort( "memalign/free bad alignment : memalign(%d,%d) = %p", (int)a, s, area );
-			} // if
-			area[0] = '\345'; area[s - 1] = '\345';	// fill first/last byte
-			area[malloc_usable_size( area ) - 1] = '\345'; // fill ultimate byte
-			free( area );
-		} // for
-    } // for
-
-    // check memalign/free (mmap)
-
-    for ( size_t a = libAlign(); a <= limit; a += a ) {	// generate powers of 2
-		//sout | alignments[a] | endl;
-		for ( i = 1; i < NoOfMmaps; i += 1 ) {
-			size_t s = i + default_mmap_start();			// cross over point
-			char *area = (char *)memalign( a, s );
-			if ( area == 0 ) abort( "memalign/free out of memory" );
-			//sout | i | " " | area | endl;
-			if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
-				abort( "memalign/free bad alignment : memalign(%d,%d) = %p", (int)a, (int)s, area );
-			} // if
-			area[0] = '\345'; area[s - 1] = '\345';		// fill first/last byte
-			area[malloc_usable_size( area ) - 1] = '\345'; // fill ultimate byte
-			free( area );
-		} // for
-    } // for
-
-    // check calloc/realloc/free (sbrk)
-
-    for ( i = 1; i < 10000; i += 12 ) {
-		// initial N byte allocation
-		char *area = (char *)calloc( 5, i );
-		if ( area == 0 ) abort( "calloc/realloc/free out of memory" );
-		if ( area[0] != '\0' || area[i - 1] != '\0' ||
-			 area[malloc_usable_size( area ) - 1] != '\0' ||
-			 ! malloc_zero_fill( area ) ) abort( "calloc/realloc/free corrupt storage1" );
-
-		// Do not start this loop index at 0 because realloc of 0 bytes frees the storage.
-		for ( int s = i; s < 256 * 1024; s += 26 ) {	// start at initial memory request
-			area = (char *)realloc( area, s );			// attempt to reuse storage
-			if ( area == 0 ) abort( "calloc/realloc/free out of memory" );
-			if ( area[0] != '\0' || area[s - 1] != '\0' ||
-				 area[malloc_usable_size( area ) - 1] != '\0' ||
-				 ! malloc_zero_fill( area ) ) abort( "calloc/realloc/free corrupt storage2" );
-		} // for
-		free( area );
-    } // for
-
-    // check calloc/realloc/free (mmap)
-
-    for ( i = 1; i < 1000; i += 12 ) {
-		// initial N byte allocation
-		size_t s = i + default_mmap_start();				// cross over point
-		char *area = (char *)calloc( 1, s );
-		if ( area == 0 ) abort( "calloc/realloc/free out of memory" );
-		if ( area[0] != '\0' || area[s - 1] != '\0' ||
-			 area[malloc_usable_size( area ) - 1] != '\0' ||
-			 ! malloc_zero_fill( area ) ) abort( "calloc/realloc/free corrupt storage1" );
-
-		// Do not start this loop index at 0 because realloc of 0 bytes frees the storage.
-		for ( int r = i; r < 256 * 1024; r += 26 ) {	// start at initial memory request
-			area = (char *)realloc( area, r );		// attempt to reuse storage
-			if ( area == 0 ) abort( "calloc/realloc/free out of memory" );
-			if ( area[0] != '\0' || area[r - 1] != '\0' ||
-				 area[malloc_usable_size( area ) - 1] != '\0' ||
-				 ! malloc_zero_fill( area ) ) abort( "calloc/realloc/free corrupt storage2" );
-		} // for
-		free( area );
-    } // for
-
-    // check memalign/realloc/free
-
-    size_t amount = 2;
-    for ( size_t a = libAlign(); a <= limit; a += a ) {	// generate powers of 2
-		// initial N byte allocation
-		char *area = (char *)memalign( a, amount );		// aligned N-byte allocation
-		if ( area == 0 ) abort( "memalign/realloc/free out of memory" ); // no storage ?
-		//sout | alignments[a] | " " | area | endl;
-		if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
-			abort( "memalign/realloc/free bad alignment : memalign(%d,%d) = %p", (int)a, (int)amount, area );
-		} // if
-		area[0] = '\345'; area[amount - 2] = '\345';	// fill first/penultimate byte
-
-		// Do not start this loop index at 0 because realloc of 0 bytes frees the storage.
-		for ( int s = amount; s < 256 * 1024; s += 1 ) { // start at initial memory request
-			if ( area[0] != '\345' || area[s - 2] != '\345' ) abort( "memalign/realloc/free corrupt storage" );
-			area = (char *)realloc( area, s );			// attempt to reuse storage
-			if ( area == 0 ) abort( "memalign/realloc/free out of memory" ); // no storage ?
-			//sout | i | " " | area | endl;
-			if ( (size_t)area % a != 0 ) {				// check for initial alignment
-				abort( "memalign/realloc/free bad alignment %p", area );
-			} // if
-			area[s - 1] = '\345';						// fill last byte
-		} // for
-		free( area );
-    } // for
-
-    // check cmemalign/free
-
-    for ( size_t a = libAlign(); a <= limit; a += a ) {	// generate powers of 2
-		//sout | alignments[a] | endl;
-		for ( int s = 1; s < limit; s += 1 ) {			// allocation of size 0 can return null
-			char *area = (char *)cmemalign( a, 1, s );
-			if ( area == 0 ) abort( "cmemalign/free out of memory" );
-			//sout | i | " " | area | endl;
-			if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
-				abort( "cmemalign/free bad alignment : cmemalign(%d,%d) = %p", (int)a, s, area );
-			} // if
-			if ( area[0] != '\0' || area[s - 1] != '\0' ||
-				 area[malloc_usable_size( area ) - 1] != '\0' ||
-				 ! malloc_zero_fill( area ) ) abort( "cmemalign/free corrupt storage" );
-			area[0] = '\345'; area[s - 1] = '\345';		// fill first/last byte
-			free( area );
-		} // for
-    } // for
-
-    // check cmemalign/realloc/free
-
-    amount = 2;
-    for ( size_t a = libAlign() + libAlign(); a <= limit; a += a ) { // generate powers of 2
-		// initial N byte allocation
-		char *area = (char *)cmemalign( a, 1, amount );	// aligned N-byte allocation
-		if ( area == 0 ) abort( "cmemalign/realloc/free out of memory" ); // no storage ?
-		//sout | alignments[a] | " " | area | endl;
-		if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
-			abort( "cmemalign/realloc/free bad alignment : cmemalign(%d,%d) = %p", (int)a, (int)amount, area );
-		} // if
-		if ( area[0] != '\0' || area[amount - 1] != '\0' ||
-			 area[malloc_usable_size( area ) - 1] != '\0' ||
-			 ! malloc_zero_fill( area ) ) abort( "cmemalign/realloc/free corrupt storage1" );
-		area[0] = '\345'; area[amount - 2] = '\345';	// fill first/penultimate byte
-
-		// Do not start this loop index at 0 because realloc of 0 bytes frees the storage.
-		for ( int s = amount; s < 256 * 1024; s += 1 ) { // start at initial memory request
-			if ( area[0] != '\345' || area[s - 2] != '\345' ) abort( "cmemalign/realloc/free corrupt storage2" );
-			area = (char *)realloc( area, s );			// attempt to reuse storage
-			if ( area == 0 ) abort( "cmemalign/realloc/free out of memory" ); // no storage ?
-			//sout | i | " " | area | endl;
-			if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
-				abort( "cmemalign/realloc/free bad alignment %p", area );
-			} // if
-			if ( area[s - 1] != '\0' || area[s - 1] != '\0' ||
-				 area[malloc_usable_size( area ) - 1] != '\0' ||
-				 ! malloc_zero_fill( area ) ) abort( "cmemalign/realloc/free corrupt storage3" );
-			area[s - 1] = '\345';						// fill last byte
-		} // for
-		free( area );
-    } // for
-	//sout | "worker" | thisTask() | "successful completion" | endl;
-} // Worker main
-
-int main() {
-    const unsigned int NoOfWorkers = 4;
-    {
-		processor processors[NoOfWorkers - 1] __attribute__(( unused )); // more than one processor
-		Worker workers[NoOfWorkers] __attribute__(( unused ));
-    }
-	// checkFreeOn();
-    // malloc_stats();
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa -nodebug -O2 heap.c" //
-// End: //
Index: tests/heap.cfa
===================================================================
--- tests/heap.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/heap.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,357 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// heap.cfa -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Tue Nov  6 17:54:56 2018
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:55:39 2018
+// Update Count     : 2
+// 
+
+#include <thread.hfa>
+#include <kernel.hfa>										// processor
+#include <stdlib.hfa>										// *allocs
+#include <malloc.h>										// malloc_*
+
+// #include <time.hfa>
+// #define __CFA_DEFAULT_PREEMPTION__ 1000`us
+// //#define __CFA_DEFAULT_PREEMPTION__ 0
+
+// Duration default_preemption() {
+// 	return __CFA_DEFAULT_PREEMPTION__;
+// }
+
+#define __U_DEFAULT_MMAP_START__ (512 * 1024 + 1)
+size_t default_mmap_start() __attribute__(( weak )) {
+    return __U_DEFAULT_MMAP_START__;
+} // default_mmap_start
+
+thread Worker {
+}; // Worker
+
+void main( Worker & ) {
+    enum { NoOfAllocs = 5000, NoOfMmaps = 10 };
+    char *locns[NoOfAllocs];
+    int i;
+
+    // check alloc/free
+
+    for ( int j = 0; j < 40; j += 1 ) {
+		for ( i = 0; i < NoOfAllocs; i += 1 ) {
+			locns[i] = alloc( i );
+			//sout | (void *)locns[i] | endl;
+			for ( int k = 0; k < i; k += 1 ) locns[i][k] = '\345';
+		} // for
+		//sout | (char *)sbrk(0) - start | " bytes" | endl;
+
+		for ( i = 0; i < NoOfAllocs; i += 1 ) {
+			//sout | (void *)locns[i] | endl;
+			for ( int k = 0; k < i; k += 1 ) if ( locns[i][k] != '\345' ) abort( "new/delete corrupt storage1" );
+			free( locns[i] );
+		} // for
+		//sout | (char *)sbrk(0) - start | " bytes" | endl;
+
+		for ( i = 0; i < NoOfAllocs; i += 1 ) {
+			locns[i] = alloc( i );
+			//sout | (void *)locns[i] | endl;
+			for ( int k = 0; k < i; k += 1 ) locns[i][k] = '\345';
+		} // for
+		for ( i = NoOfAllocs - 1; i >=0 ; i -= 1 ) {
+			//sout | (void *)locns[i] | endl;
+			for ( int k = 0; k < i; k += 1 ) if ( locns[i][k] != '\345' ) abort( "new/delete corrupt storage2" );
+			free( locns[i] );
+		} // for
+    } // for
+
+    // check malloc/free (sbrk)
+
+    for ( i = 0; i < NoOfAllocs; i += 1 ) {
+		size_t s = (i + 1) * 20;
+		char *area = (char *)malloc( s );
+		if ( area == 0 ) abort( "malloc/free out of memory" );
+		area[0] = '\345'; area[s - 1] = '\345';			// fill first/last
+		area[malloc_usable_size( area ) - 1] = '\345';	// fill ultimate byte
+		free( area );
+    } // for
+
+    for ( i = 0; i < NoOfAllocs; i += 1 ) {
+		size_t s = i + 1;				// +1 to make initialization simpler
+		locns[i] = (char *)malloc( s );
+		if ( locns[i] == 0 ) abort( "malloc/free out of memory" );
+		locns[i][0] = '\345'; locns[i][s - 1] = '\345';	// fill first/last
+		locns[i][malloc_usable_size( locns[i] ) - 1] = '\345'; // fill ultimate byte
+    } // for
+    for ( i = 0; i < NoOfAllocs; i += 1 ) {
+		size_t s = i + 1;
+		if ( locns[i][0] != '\345' || locns[i][s - 1] != '\345' ||
+			 locns[i][malloc_usable_size( locns[i] ) - 1] != '\345' ) abort( "malloc/free corrupt storage" );
+		free( locns[i] );
+    } // for
+
+    // check malloc/free (mmap)
+
+    for ( i = 0; i < NoOfMmaps; i += 1 ) {
+		size_t s = i + default_mmap_start();				// cross over point
+		char *area = (char *)malloc( s );
+		if ( area == 0 ) abort( "malloc/free out of memory" );
+		area[0] = '\345'; area[s - 1] = '\345';			// fill first/last
+		area[malloc_usable_size( area ) - 1] = '\345';	// fill ultimate byte
+		free( area );
+    } // for
+
+    for ( i = 0; i < NoOfMmaps; i += 1 ) {
+		size_t s = i + default_mmap_start();				// cross over point
+		locns[i] = (char *)malloc( s );
+		if ( locns[i] == 0 ) abort( "malloc/free out of memory" );
+		locns[i][0] = '\345'; locns[i][s - 1] = '\345';	// fill first/last
+		locns[i][malloc_usable_size( locns[i] ) - 1] = '\345'; // fill ultimate byte
+    } // for
+    for ( i = 0; i < NoOfMmaps; i += 1 ) {
+		size_t s = i + default_mmap_start();				// cross over point
+		if ( locns[i][0] != '\345' || locns[i][s - 1] != '\345' ||
+			 locns[i][malloc_usable_size( locns[i] ) - 1] != '\345' ) abort( "malloc/free corrupt storage" );
+		free( locns[i] );
+    } // for
+
+    // check calloc/free (sbrk)
+
+    for ( i = 0; i < NoOfAllocs; i += 1 ) {
+		size_t s = (i + 1) * 20;
+		char *area = (char *)calloc( 5, s );
+		if ( area == 0 ) abort( "calloc/free out of memory" );
+		if ( area[0] != '\0' || area[s - 1] != '\0' ||
+			 area[malloc_usable_size( area ) - 1] != '\0' ||
+			 ! malloc_zero_fill( area ) ) abort( "calloc/free corrupt storage1" );
+		area[0] = '\345'; area[s - 1] = '\345';			// fill first/last
+		area[malloc_usable_size( area ) - 1] = '\345';	// fill ultimate byte
+		free( area );
+    } // for
+
+    for ( i = 0; i < NoOfAllocs; i += 1 ) {
+		size_t s = i + 1;
+		locns[i] = (char *)calloc( 5, s );
+		if ( locns[i] == 0 ) abort( "calloc/free out of memory" );
+		if ( locns[i][0] != '\0' || locns[i][s - 1] != '\0' ||
+			 locns[i][malloc_usable_size( locns[i] ) - 1] != '\0' ||
+			 ! malloc_zero_fill( locns[i] ) ) abort( "calloc/free corrupt storage2" );
+		locns[i][0] = '\345'; locns[i][s - 1] = '\345';	// fill first/last
+		locns[i][malloc_usable_size( locns[i] ) - 1] = '\345'; // fill ultimate byte
+    } // for
+    for ( i = 0; i < NoOfAllocs; i += 1 ) {
+		size_t s = i + 1;
+		if ( locns[i][0] != '\345' || locns[i][s - 1] != '\345' ||
+			 locns[i][malloc_usable_size( locns[i] ) - 1] != '\345' ) abort( "calloc/free corrupt storage3" );
+		free( locns[i] );
+    } // for
+
+    // check calloc/free (mmap)
+
+    for ( i = 0; i < NoOfMmaps; i += 1 ) {
+		size_t s = i + default_mmap_start();				// cross over point
+		char *area = (char *)calloc( 1, s );
+		if ( area == 0 ) abort( "calloc/free out of memory" );
+		if ( area[0] != '\0' || area[s - 1] != '\0' ) abort( "calloc/free corrupt storage4.1" );
+		if ( area[malloc_usable_size( area ) - 1] != '\0' ) abort( "calloc/free corrupt storage4.2" );
+		if ( ! malloc_zero_fill( area ) ) abort( "calloc/free corrupt storage4.3" );
+		area[0] = '\345'; area[s - 1] = '\345';			// fill first/last
+		area[malloc_usable_size( area ) - 1] = '\345';	// fill ultimate byte
+		free( area );
+    } // for
+
+    for ( i = 0; i < NoOfMmaps; i += 1 ) {
+		size_t s = i + default_mmap_start();				// cross over point
+		locns[i] = (char *)calloc( 1, s );
+		if ( locns[i] == 0 ) abort( "calloc/free out of memory" );
+		if ( locns[i][0] != '\0' || locns[i][s - 1] != '\0' ||
+			 locns[i][malloc_usable_size( locns[i] ) - 1] != '\0' ||
+			 ! malloc_zero_fill( locns[i] ) ) abort( "calloc/free corrupt storage5" );
+		locns[i][0] = '\345'; locns[i][s - 1] = '\345';	// fill first/last
+		locns[i][malloc_usable_size( locns[i] ) - 1] = '\345'; // fill ultimate byte
+    } // for
+    for ( i = 0; i < NoOfMmaps; i += 1 ) {
+		size_t s = i + default_mmap_start();				// cross over point
+		if ( locns[i][0] != '\345' || locns[i][s - 1] != '\345' ||
+			 locns[i][malloc_usable_size( locns[i] ) - 1] != '\345' ) abort( "calloc/free corrupt storage6" );
+		free( locns[i] );
+    } // for
+
+    // check memalign/free (sbrk)
+
+    enum { limit = 64 * 1024 };							// check alignments up to here
+
+    for ( size_t a = libAlign(); a <= limit; a += a ) {	// generate powers of 2
+		//sout | alignments[a] | endl;
+		for ( int s = 1; s < NoOfAllocs; s += 1 ) {		// allocation of size 0 can return null
+			char *area = (char *)memalign( a, s );
+			if ( area == 0 ) abort( "memalign/free out of memory" );
+			//sout | i | " " | area | endl;
+			if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
+				abort( "memalign/free bad alignment : memalign(%d,%d) = %p", (int)a, s, area );
+			} // if
+			area[0] = '\345'; area[s - 1] = '\345';	// fill first/last byte
+			area[malloc_usable_size( area ) - 1] = '\345'; // fill ultimate byte
+			free( area );
+		} // for
+    } // for
+
+    // check memalign/free (mmap)
+
+    for ( size_t a = libAlign(); a <= limit; a += a ) {	// generate powers of 2
+		//sout | alignments[a] | endl;
+		for ( i = 1; i < NoOfMmaps; i += 1 ) {
+			size_t s = i + default_mmap_start();			// cross over point
+			char *area = (char *)memalign( a, s );
+			if ( area == 0 ) abort( "memalign/free out of memory" );
+			//sout | i | " " | area | endl;
+			if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
+				abort( "memalign/free bad alignment : memalign(%d,%d) = %p", (int)a, (int)s, area );
+			} // if
+			area[0] = '\345'; area[s - 1] = '\345';		// fill first/last byte
+			area[malloc_usable_size( area ) - 1] = '\345'; // fill ultimate byte
+			free( area );
+		} // for
+    } // for
+
+    // check calloc/realloc/free (sbrk)
+
+    for ( i = 1; i < 10000; i += 12 ) {
+		// initial N byte allocation
+		char *area = (char *)calloc( 5, i );
+		if ( area == 0 ) abort( "calloc/realloc/free out of memory" );
+		if ( area[0] != '\0' || area[i - 1] != '\0' ||
+			 area[malloc_usable_size( area ) - 1] != '\0' ||
+			 ! malloc_zero_fill( area ) ) abort( "calloc/realloc/free corrupt storage1" );
+
+		// Do not start this loop index at 0 because realloc of 0 bytes frees the storage.
+		for ( int s = i; s < 256 * 1024; s += 26 ) {	// start at initial memory request
+			area = (char *)realloc( area, s );			// attempt to reuse storage
+			if ( area == 0 ) abort( "calloc/realloc/free out of memory" );
+			if ( area[0] != '\0' || area[s - 1] != '\0' ||
+				 area[malloc_usable_size( area ) - 1] != '\0' ||
+				 ! malloc_zero_fill( area ) ) abort( "calloc/realloc/free corrupt storage2" );
+		} // for
+		free( area );
+    } // for
+
+    // check calloc/realloc/free (mmap)
+
+    for ( i = 1; i < 1000; i += 12 ) {
+		// initial N byte allocation
+		size_t s = i + default_mmap_start();				// cross over point
+		char *area = (char *)calloc( 1, s );
+		if ( area == 0 ) abort( "calloc/realloc/free out of memory" );
+		if ( area[0] != '\0' || area[s - 1] != '\0' ||
+			 area[malloc_usable_size( area ) - 1] != '\0' ||
+			 ! malloc_zero_fill( area ) ) abort( "calloc/realloc/free corrupt storage1" );
+
+		// Do not start this loop index at 0 because realloc of 0 bytes frees the storage.
+		for ( int r = i; r < 256 * 1024; r += 26 ) {	// start at initial memory request
+			area = (char *)realloc( area, r );		// attempt to reuse storage
+			if ( area == 0 ) abort( "calloc/realloc/free out of memory" );
+			if ( area[0] != '\0' || area[r - 1] != '\0' ||
+				 area[malloc_usable_size( area ) - 1] != '\0' ||
+				 ! malloc_zero_fill( area ) ) abort( "calloc/realloc/free corrupt storage2" );
+		} // for
+		free( area );
+    } // for
+
+    // check memalign/realloc/free
+
+    size_t amount = 2;
+    for ( size_t a = libAlign(); a <= limit; a += a ) {	// generate powers of 2
+		// initial N byte allocation
+		char *area = (char *)memalign( a, amount );		// aligned N-byte allocation
+		if ( area == 0 ) abort( "memalign/realloc/free out of memory" ); // no storage ?
+		//sout | alignments[a] | " " | area | endl;
+		if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
+			abort( "memalign/realloc/free bad alignment : memalign(%d,%d) = %p", (int)a, (int)amount, area );
+		} // if
+		area[0] = '\345'; area[amount - 2] = '\345';	// fill first/penultimate byte
+
+		// Do not start this loop index at 0 because realloc of 0 bytes frees the storage.
+		for ( int s = amount; s < 256 * 1024; s += 1 ) { // start at initial memory request
+			if ( area[0] != '\345' || area[s - 2] != '\345' ) abort( "memalign/realloc/free corrupt storage" );
+			area = (char *)realloc( area, s );			// attempt to reuse storage
+			if ( area == 0 ) abort( "memalign/realloc/free out of memory" ); // no storage ?
+			//sout | i | " " | area | endl;
+			if ( (size_t)area % a != 0 ) {				// check for initial alignment
+				abort( "memalign/realloc/free bad alignment %p", area );
+			} // if
+			area[s - 1] = '\345';						// fill last byte
+		} // for
+		free( area );
+    } // for
+
+    // check cmemalign/free
+
+    for ( size_t a = libAlign(); a <= limit; a += a ) {	// generate powers of 2
+		//sout | alignments[a] | endl;
+		for ( int s = 1; s < limit; s += 1 ) {			// allocation of size 0 can return null
+			char *area = (char *)cmemalign( a, 1, s );
+			if ( area == 0 ) abort( "cmemalign/free out of memory" );
+			//sout | i | " " | area | endl;
+			if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
+				abort( "cmemalign/free bad alignment : cmemalign(%d,%d) = %p", (int)a, s, area );
+			} // if
+			if ( area[0] != '\0' || area[s - 1] != '\0' ||
+				 area[malloc_usable_size( area ) - 1] != '\0' ||
+				 ! malloc_zero_fill( area ) ) abort( "cmemalign/free corrupt storage" );
+			area[0] = '\345'; area[s - 1] = '\345';		// fill first/last byte
+			free( area );
+		} // for
+    } // for
+
+    // check cmemalign/realloc/free
+
+    amount = 2;
+    for ( size_t a = libAlign() + libAlign(); a <= limit; a += a ) { // generate powers of 2
+		// initial N byte allocation
+		char *area = (char *)cmemalign( a, 1, amount );	// aligned N-byte allocation
+		if ( area == 0 ) abort( "cmemalign/realloc/free out of memory" ); // no storage ?
+		//sout | alignments[a] | " " | area | endl;
+		if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
+			abort( "cmemalign/realloc/free bad alignment : cmemalign(%d,%d) = %p", (int)a, (int)amount, area );
+		} // if
+		if ( area[0] != '\0' || area[amount - 1] != '\0' ||
+			 area[malloc_usable_size( area ) - 1] != '\0' ||
+			 ! malloc_zero_fill( area ) ) abort( "cmemalign/realloc/free corrupt storage1" );
+		area[0] = '\345'; area[amount - 2] = '\345';	// fill first/penultimate byte
+
+		// Do not start this loop index at 0 because realloc of 0 bytes frees the storage.
+		for ( int s = amount; s < 256 * 1024; s += 1 ) { // start at initial memory request
+			if ( area[0] != '\345' || area[s - 2] != '\345' ) abort( "cmemalign/realloc/free corrupt storage2" );
+			area = (char *)realloc( area, s );			// attempt to reuse storage
+			if ( area == 0 ) abort( "cmemalign/realloc/free out of memory" ); // no storage ?
+			//sout | i | " " | area | endl;
+			if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
+				abort( "cmemalign/realloc/free bad alignment %p", area );
+			} // if
+			if ( area[s - 1] != '\0' || area[s - 1] != '\0' ||
+				 area[malloc_usable_size( area ) - 1] != '\0' ||
+				 ! malloc_zero_fill( area ) ) abort( "cmemalign/realloc/free corrupt storage3" );
+			area[s - 1] = '\345';						// fill last byte
+		} // for
+		free( area );
+    } // for
+	//sout | "worker" | thisTask() | "successful completion" | endl;
+} // Worker main
+
+int main() {
+    const unsigned int NoOfWorkers = 4;
+    {
+		processor processors[NoOfWorkers - 1] __attribute__(( unused )); // more than one processor
+		Worker workers[NoOfWorkers] __attribute__(( unused ));
+    }
+	// checkFreeOn();
+    // malloc_stats();
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa -nodebug -O2 heap.cfa" //
+// End: //
Index: sts/hello.c
===================================================================
--- tests/hello.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,36 +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.
-//
-// hello.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Wed May 27 17:56:53 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jun  5 08:12:27 2017
-// Update Count     : 15
-//
-
-#include <fstream.hfa>
-
-int main() {
-	sout | "Hello world!" | endl;
-	sout | "Bonjour le monde!" | endl;
-	sout | "Hola Mundo!" | endl;
-	sout | "Hallo Welt!" | endl;
-	sout | "Kaixo Mundua!" | endl;
-	sout | "Chào thế giới!" | endl;
-	sout | "Привет мир!" | endl;
-	sout | "שלום עולם!" | endl;
-	sout | "你好，世界!" | endl;
-	sout | "こんにちは世界!" | endl;
-	sout | "안녕하세요 세계!" | endl;
-	sout | "नमस्ते दुनिया!" | endl;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa hello.c" //
-// End: //
Index: tests/hello.cfa
===================================================================
--- tests/hello.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/hello.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,36 @@
+//
+// 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.
+//
+// hello.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Wed May 27 17:56:53 2015
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:56:22 2018
+// Update Count     : 16
+//
+
+#include <fstream.hfa>
+
+int main() {
+	sout | "Hello world!" | endl;
+	sout | "Bonjour le monde!" | endl;
+	sout | "Hola Mundo!" | endl;
+	sout | "Hallo Welt!" | endl;
+	sout | "Kaixo Mundua!" | endl;
+	sout | "Chào thế giới!" | endl;
+	sout | "Привет мир!" | endl;
+	sout | "שלום עולם!" | endl;
+	sout | "你好，世界!" | endl;
+	sout | "こんにちは世界!" | endl;
+	sout | "안녕하세요 세계!" | endl;
+	sout | "नमस्ते दुनिया!" | endl;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa hello.cfa" //
+// End: //
Index: sts/identFuncDeclarator.c
===================================================================
--- tests/identFuncDeclarator.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,118 +1,0 @@
-// 
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-// 
-// identFuncDeclarator.c -- 
-// 
-// Author           : Peter A. Buhr
-// Created On       : Wed Aug 17 08:36:34 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jan 17 22:39:13 2018
-// Update Count     : 2
-// 
-
-int main() {
-	int f1;
-	int (f2);
-
-	int * f3;
-	int ** f4;
-	int * const * f5;
-	int * const * const f6;
-
-	int * (f7);
-	int ** (f8);
-	int * const * (f9);
-	int * const * const (f10);
-
-	int (* f11);
-	int (** f12);
-	int (* const * f13);
-	int (* const * const f14);
-
-	int f15[2];
-	int f16[10];
-	int (f17[2]);
-	int (f18[10]);
-
-	int * f19[2];
-	int * f20[10];
-	int ** f21[2];
-	int ** f22[10];
-	int * const * f23[2];
-	int * const * f24[10];
-	int * const * const f25[2];
-	int * const * const f26[10];
-
-	int * (f27[2]);
-	int * (f28[10]);
-	int ** (f29[2]);
-	int ** (f30[10]);
-	int * const * (f31[2]);
-	int * const * (f32[10]);
-	int * const * const (f33[2]);
-	int * const * const (f34[10]);
-
-	int (* f35[2]);
-	int (* f36[10]);
-	int (** f37[2]);
-	int (** f38[10]);
-	int (* const * f39[2]);
-	int (* const * f40[10]);
-	int (* const * const f41[2]);
-	int (* const * const f42[10]);
-
-	int f43[2][3];
-	int f44[3][3];
-	int (f45[2])[3];
-	int (f46[3])[3];
-	int ((f47[2]))[3];
-	int ((f48[3]))[3];
-
-	int * f49[2][3];
-	int * f50[3][3];
-	int ** f51[2][3];
-	int ** f52[3][3];
-	int * const * f53[2][3];
-	int * const * f54[3][3];
-	int * const * const f55[2][3];
-	int * const * const f56[3][3];
-
-	int (* f57[2][3]);
-	int (* f58[3][3]);
-	int (** f59[2][3]);
-	int (** f60[3][3]);
-	int (* const * f61[2][3]);
-	int (* const * f62[3][3]);
-	int (* const * const f63[2][3]);
-	int (* const * const f64[3][3]);
-
-	int f65(int);
-	int (f66)(int);
-
-	int * f67(int);
-	int ** f68(int);
-	int * const * f69(int);
-	int * const * const f70(int);
-
-	int * (f71)(int);
-	int ** (f72)(int);
-	int * const * (f73)(int);
-	int * const * const (f74)(int);
-
-	int (* f75)(int);
-	int (** f76)(int);
-	int (* const * f77)(int);
-	int (* const * const f78)(int);
-
-	int (* (* f79)(int))();
-	int (* (* const f80)(int))();
-	int (* const(* const f81)(int))();
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa identFuncDeclarator.c" //
-// End: //
Index: tests/identFuncDeclarator.cfa
===================================================================
--- tests/identFuncDeclarator.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/identFuncDeclarator.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,118 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// identFuncDeclarator.cfa -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Wed Aug 17 08:36:34 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:56:33 2018
+// Update Count     : 3
+// 
+
+int main() {
+	int f1;
+	int (f2);
+
+	int * f3;
+	int ** f4;
+	int * const * f5;
+	int * const * const f6;
+
+	int * (f7);
+	int ** (f8);
+	int * const * (f9);
+	int * const * const (f10);
+
+	int (* f11);
+	int (** f12);
+	int (* const * f13);
+	int (* const * const f14);
+
+	int f15[2];
+	int f16[10];
+	int (f17[2]);
+	int (f18[10]);
+
+	int * f19[2];
+	int * f20[10];
+	int ** f21[2];
+	int ** f22[10];
+	int * const * f23[2];
+	int * const * f24[10];
+	int * const * const f25[2];
+	int * const * const f26[10];
+
+	int * (f27[2]);
+	int * (f28[10]);
+	int ** (f29[2]);
+	int ** (f30[10]);
+	int * const * (f31[2]);
+	int * const * (f32[10]);
+	int * const * const (f33[2]);
+	int * const * const (f34[10]);
+
+	int (* f35[2]);
+	int (* f36[10]);
+	int (** f37[2]);
+	int (** f38[10]);
+	int (* const * f39[2]);
+	int (* const * f40[10]);
+	int (* const * const f41[2]);
+	int (* const * const f42[10]);
+
+	int f43[2][3];
+	int f44[3][3];
+	int (f45[2])[3];
+	int (f46[3])[3];
+	int ((f47[2]))[3];
+	int ((f48[3]))[3];
+
+	int * f49[2][3];
+	int * f50[3][3];
+	int ** f51[2][3];
+	int ** f52[3][3];
+	int * const * f53[2][3];
+	int * const * f54[3][3];
+	int * const * const f55[2][3];
+	int * const * const f56[3][3];
+
+	int (* f57[2][3]);
+	int (* f58[3][3]);
+	int (** f59[2][3]);
+	int (** f60[3][3]);
+	int (* const * f61[2][3]);
+	int (* const * f62[3][3]);
+	int (* const * const f63[2][3]);
+	int (* const * const f64[3][3]);
+
+	int f65(int);
+	int (f66)(int);
+
+	int * f67(int);
+	int ** f68(int);
+	int * const * f69(int);
+	int * const * const f70(int);
+
+	int * (f71)(int);
+	int ** (f72)(int);
+	int * const * (f73)(int);
+	int * const * const (f74)(int);
+
+	int (* f75)(int);
+	int (** f76)(int);
+	int (* const * f77)(int);
+	int (* const * const f78)(int);
+
+	int (* (* f79)(int))();
+	int (* (* const f80)(int))();
+	int (* const(* const f81)(int))();
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa identFuncDeclarator.cfa" //
+// End: //
Index: sts/identParamDeclarator.c
===================================================================
--- tests/identParamDeclarator.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,166 +1,0 @@
-// 
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-// 
-// identParamDeclarator.c -- 
-// 
-// Author           : Peter A. Buhr
-// Created On       : Wed Aug 17 08:37:56 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jan 17 22:36:11 2018
-// Update Count     : 2
-// 
-
-int fred (
-	int f1,
-	int (f2),
-
-	int *f3,
-	int **f4,
-	int * const *f5,
-	int * const * const f6,
-
-	int *(f7),
-	int **(f8),
-	int * const *(f9),
-	int * const * const (f10),
-
-	int (*f11),
-	int (**f12),
-	int (* const *f13),
-	int (* const * const f14),
-
-	int f15[],
-	int f16[10],
-	int (f17[]),
-	int (f18[10]),
-
-	int *f19[],
-	int *f20[10],
-	int **f21[],
-	int **f22[10],
-	int * const *f23[],
-	int * const *f24[10],
-	int * const * const f25[],
-	int * const * const f26[10],
-
-	int *(f27[]),
-	int *(f28[10]),
-	int **(f29[]),
-	int **(f30[10]),
-	int * const *(f31[]),
-	int * const *(f32[10]),
-	int * const * const (f33[]),
-	int * const * const (f34[10]),
-
-	int (*f35[]),
-	int (*f36[10]),
-	int (**f37[]),
-	int (**f38[10]),
-	int (* const *f39[]),
-	int (* const *f40[10]),
-	int (* const * const f41[]),
-	int (* const * const f42[10]),
-
-	int f43[][3],
-	int f44[3][3],
-	int (f45[])[3],
-	int (f46[3])[3],
-	int ((f47[]))[3],
-	int ((f48[3]))[3],
-
-	int *f49[][3],
-	int *f50[3][3],
-	int **f51[][3],
-	int **f52[3][3],
-	int * const *f53[][3],
-	int * const *f54[3][3],
-	int * const * const f55[][3],
-	int * const * const f56[3][3],
-
-	int (*f57[][3]),
-	int (*f58[3][3]),
-	int (**f59[][3]),
-	int (**f60[3][3]),
-	int (* const *f61[][3]),
-	int (* const *f62[3][3]),
-	int (* const * const f63[][3]),
-	int (* const * const f64[3][3]),
-
-	int f65(int),
-	int (f66)(int),
-
-	int *f67(int),
-	int **f68(int),
-	int * const *f69(int),
-	int * const * const f70(int),
-
-	int *(f71)(int),
-	int **(f72)(int),
-	int * const *(f73)(int),
-	int * const * const (f74)(int),
-
-	int (*f75)(int),
-	int (**f76)(int),
-	int (* const *f77)(int),
-	int (* const * const f78)(int),
-
-	int (*(*f79)(int))(),
-	int (*(* const f80)(int))(),
-	int (* const(* const f81)(int))(),
-
-	int f82[const *],
-	int f83[const 3],
-	int f84[static 3],
-	int f85[static const 3],
-
-	int (f86[const *]),
-	int (f87[const 3]),
-	int (f88[static 3]),
-	int (f89[static const 3]),
-
-	int *f90[const *],
-	int *f91[const 3],
-	int **f92[static 3],
-	int * const *f93[static const 3],
-	int * const * const f94[static const 3],
-
-	int *(f95[const *]),
-	int *(f96[const 3]),
-	int **(f97[static 3]),
-	int * const *(f98[static const 3]),
-	int * const * const (f99[static const 3]),
-
-	int f100[const *][3],
-	int f101[const 3][3],
-	int f102[static 3][3],
-	int f103[static const 3][3],
-
-	int (f104[const *][3]),
-	int (f105[const 3][3]),
-	int (f106[static 3][3]),
-	int (f107[static const 3][3]),
-
-	int *f108[const *][3],
-	int *f109[const 3][3],
-	int **f110[static 3][3],
-	int * const *f111[static const 3][3],
-	int * const * const f112[static const 3][3],
-
-	int *(f113[const *][3]),
-	int *(f114[const 3][3]),
-	int **(f115[static 3][3]),
-	int * const *(f116[static const 3][3]),
-	int * const * const (f117[static const 3][3])
-    );
-
-int main( int argc, char const *argv[] ) {				// dummy main
-	return 0;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa identParamDeclarator.c" //
-// End: //
Index: tests/identParamDeclarator.cfa
===================================================================
--- tests/identParamDeclarator.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/identParamDeclarator.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,166 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// identParamDeclarator.cfa -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Wed Aug 17 08:37:56 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:56:44 2018
+// Update Count     : 3
+// 
+
+int fred (
+	int f1,
+	int (f2),
+
+	int *f3,
+	int **f4,
+	int * const *f5,
+	int * const * const f6,
+
+	int *(f7),
+	int **(f8),
+	int * const *(f9),
+	int * const * const (f10),
+
+	int (*f11),
+	int (**f12),
+	int (* const *f13),
+	int (* const * const f14),
+
+	int f15[],
+	int f16[10],
+	int (f17[]),
+	int (f18[10]),
+
+	int *f19[],
+	int *f20[10],
+	int **f21[],
+	int **f22[10],
+	int * const *f23[],
+	int * const *f24[10],
+	int * const * const f25[],
+	int * const * const f26[10],
+
+	int *(f27[]),
+	int *(f28[10]),
+	int **(f29[]),
+	int **(f30[10]),
+	int * const *(f31[]),
+	int * const *(f32[10]),
+	int * const * const (f33[]),
+	int * const * const (f34[10]),
+
+	int (*f35[]),
+	int (*f36[10]),
+	int (**f37[]),
+	int (**f38[10]),
+	int (* const *f39[]),
+	int (* const *f40[10]),
+	int (* const * const f41[]),
+	int (* const * const f42[10]),
+
+	int f43[][3],
+	int f44[3][3],
+	int (f45[])[3],
+	int (f46[3])[3],
+	int ((f47[]))[3],
+	int ((f48[3]))[3],
+
+	int *f49[][3],
+	int *f50[3][3],
+	int **f51[][3],
+	int **f52[3][3],
+	int * const *f53[][3],
+	int * const *f54[3][3],
+	int * const * const f55[][3],
+	int * const * const f56[3][3],
+
+	int (*f57[][3]),
+	int (*f58[3][3]),
+	int (**f59[][3]),
+	int (**f60[3][3]),
+	int (* const *f61[][3]),
+	int (* const *f62[3][3]),
+	int (* const * const f63[][3]),
+	int (* const * const f64[3][3]),
+
+	int f65(int),
+	int (f66)(int),
+
+	int *f67(int),
+	int **f68(int),
+	int * const *f69(int),
+	int * const * const f70(int),
+
+	int *(f71)(int),
+	int **(f72)(int),
+	int * const *(f73)(int),
+	int * const * const (f74)(int),
+
+	int (*f75)(int),
+	int (**f76)(int),
+	int (* const *f77)(int),
+	int (* const * const f78)(int),
+
+	int (*(*f79)(int))(),
+	int (*(* const f80)(int))(),
+	int (* const(* const f81)(int))(),
+
+	int f82[const *],
+	int f83[const 3],
+	int f84[static 3],
+	int f85[static const 3],
+
+	int (f86[const *]),
+	int (f87[const 3]),
+	int (f88[static 3]),
+	int (f89[static const 3]),
+
+	int *f90[const *],
+	int *f91[const 3],
+	int **f92[static 3],
+	int * const *f93[static const 3],
+	int * const * const f94[static const 3],
+
+	int *(f95[const *]),
+	int *(f96[const 3]),
+	int **(f97[static 3]),
+	int * const *(f98[static const 3]),
+	int * const * const (f99[static const 3]),
+
+	int f100[const *][3],
+	int f101[const 3][3],
+	int f102[static 3][3],
+	int f103[static const 3][3],
+
+	int (f104[const *][3]),
+	int (f105[const 3][3]),
+	int (f106[static 3][3]),
+	int (f107[static const 3][3]),
+
+	int *f108[const *][3],
+	int *f109[const 3][3],
+	int **f110[static 3][3],
+	int * const *f111[static const 3][3],
+	int * const * const f112[static const 3][3],
+
+	int *(f113[const *][3]),
+	int *(f114[const 3][3]),
+	int **(f115[static 3][3]),
+	int * const *(f116[static const 3][3]),
+	int * const * const (f117[static const 3][3])
+    );
+
+int main( int argc, char const *argv[] ) {				// dummy main
+	return 0;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa identParamDeclarator.cfa" //
+// End: //
Index: sts/identity.c
===================================================================
--- tests/identity.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,42 +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.
-//
-// identity.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Wed May 27 17:56:53 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jun  8 08:21:32 2017
-// Update Count     : 18
-//
-
-#include <fstream.hfa>
-
-forall( otype T )
-T identity( T t ) {
-	return t;
-}
-
-int main() {
-	sout | "char\t\t\t"					| identity( 'z' ) | endl;
-	sout | "signed int\t\t"				| identity( 4 ) | endl;
-	sout | "unsigned int\t\t"			| identity( 4u ) | endl;
-	sout | "signed long int\t\t" 		| identity( 4l ) | endl;
-	sout | "unsigned long int\t" 		| identity( 4ul ) | endl;
-	sout | "signed long long int\t"		| identity( 4ll ) | endl;
-	sout | "unsigned long long int\t"	| identity( 4ull ) | endl;
-	sout | "float\t\t\t" 				| identity( 4.1f ) | endl;
-	sout | "double\t\t\t"				| identity( 4.1 ) | endl;
-	sout | "long double\t\t"			| identity( 4.1l ) | endl;
-	sout | "float _Complex\t\t"			| identity( -4.1F-2.0iF ) | endl;
-	sout | "double _Complex\t\t"		| identity( -4.1D-2.0iD ) | endl;
-	sout | "long double _Complex\t"		| identity( -4.1L-2.0iL ) | endl;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa identity.c" //
-// End: //
Index: tests/identity.cfa
===================================================================
--- tests/identity.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/identity.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,42 @@
+//
+// 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.
+//
+// identity.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Wed May 27 17:56:53 2015
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:56:54 2018
+// Update Count     : 19
+//
+
+#include <fstream.hfa>
+
+forall( otype T )
+T identity( T t ) {
+	return t;
+}
+
+int main() {
+	sout | "char\t\t\t"					| identity( 'z' ) | endl;
+	sout | "signed int\t\t"				| identity( 4 ) | endl;
+	sout | "unsigned int\t\t"			| identity( 4u ) | endl;
+	sout | "signed long int\t\t" 		| identity( 4l ) | endl;
+	sout | "unsigned long int\t" 		| identity( 4ul ) | endl;
+	sout | "signed long long int\t"		| identity( 4ll ) | endl;
+	sout | "unsigned long long int\t"	| identity( 4ull ) | endl;
+	sout | "float\t\t\t" 				| identity( 4.1f ) | endl;
+	sout | "double\t\t\t"				| identity( 4.1 ) | endl;
+	sout | "long double\t\t"			| identity( 4.1l ) | endl;
+	sout | "float _Complex\t\t"			| identity( -4.1F-2.0iF ) | endl;
+	sout | "double _Complex\t\t"		| identity( -4.1D-2.0iD ) | endl;
+	sout | "long double _Complex\t"		| identity( -4.1L-2.0iL ) | endl;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa identity.cfa" //
+// End: //
Index: sts/ifwhileCtl.c
===================================================================
--- tests/ifwhileCtl.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,75 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// ifwhileCtl.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Sat Aug 26 10:13:11 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jun  6 17:15:09 2018
-// Update Count     : 21
-//
-
-#include <fstream.hfa>
-
-int f( int r ) { return r; }
-
-int main( void ) {
-	int x = 4, y = 3;
-
-	if ( int x = 1 ) {
-		sout | "x != 0 correct" | endl;
-	} else {
-		sout | "x == 0 incorrect" | endl;
-	} // if
-
-	if ( int x = 4, y = 0 ) {
-		sout | "x != 0 && y != 0 incorrect" | endl;
-	} else if ( int x = 4, y = 1 ) {
-		sout | "x != 0 && y != 0 correct" | endl;
-	} else {
-		sout | "x == 0 || y == 0 incorrect" | endl;
-	} // if
-
-	if ( int x = 5, y = f( x ); x == y ) {
-		sout | "x == y correct" | endl;
-	} else {
-		sout | "x != y incorrect" | endl;
-	} // if
-
-	if ( struct S { int i; } s = { 3 }; s.i < 4 ) {
-		S s1;
-		sout | "s.i < 4 correct" | endl;
-	} else {
-		S s1;
-		sout | "s.i >= 4 incorrect" | endl;
-	} // if
-
-	while ( int x = 1 ) {
-		sout | "x != 0 correct" | endl;
-		break;
-	} // while
-
-	while ( int x = 4, y = 0 ) {
-		sout | "x != 0 && y != 0 incorrect" | endl;
-	} // while
-
-	while ( int x = 5, y = f( x ); x == y ) {
-		sout | "x == y correct" | endl;
-		break;
-	} // while
-
-	while ( struct S { int i; } s = { 3 }; s.i < 4 ) {
-		S s1;
-		sout | "s.i < 4 correct" | endl;
-		break;
-	} // while
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa ifwhileCtl.c" //
-// End: //
Index: tests/ifwhileCtl.cfa
===================================================================
--- tests/ifwhileCtl.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/ifwhileCtl.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,75 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// ifwhileCtl.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Sat Aug 26 10:13:11 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:57:07 2018
+// Update Count     : 22
+//
+
+#include <fstream.hfa>
+
+int f( int r ) { return r; }
+
+int main( void ) {
+	int x = 4, y = 3;
+
+	if ( int x = 1 ) {
+		sout | "x != 0 correct" | endl;
+	} else {
+		sout | "x == 0 incorrect" | endl;
+	} // if
+
+	if ( int x = 4, y = 0 ) {
+		sout | "x != 0 && y != 0 incorrect" | endl;
+	} else if ( int x = 4, y = 1 ) {
+		sout | "x != 0 && y != 0 correct" | endl;
+	} else {
+		sout | "x == 0 || y == 0 incorrect" | endl;
+	} // if
+
+	if ( int x = 5, y = f( x ); x == y ) {
+		sout | "x == y correct" | endl;
+	} else {
+		sout | "x != y incorrect" | endl;
+	} // if
+
+	if ( struct S { int i; } s = { 3 }; s.i < 4 ) {
+		S s1;
+		sout | "s.i < 4 correct" | endl;
+	} else {
+		S s1;
+		sout | "s.i >= 4 incorrect" | endl;
+	} // if
+
+	while ( int x = 1 ) {
+		sout | "x != 0 correct" | endl;
+		break;
+	} // while
+
+	while ( int x = 4, y = 0 ) {
+		sout | "x != 0 && y != 0 incorrect" | endl;
+	} // while
+
+	while ( int x = 5, y = f( x ); x == y ) {
+		sout | "x == y correct" | endl;
+		break;
+	} // while
+
+	while ( struct S { int i; } s = { 3 }; s.i < 4 ) {
+		S s1;
+		sout | "s.i < 4 correct" | endl;
+		break;
+	} // while
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa ifwhileCtl.cfa" //
+// End: //
Index: sts/io1.c
===================================================================
--- tests/io1.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,73 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// io1.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Wed Mar  2 16:56:02 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu May 24 21:17:56 2018
-// Update Count     : 104
-//
-
-#include <fstream.hfa>
-
-int main() {
-	int x = 3, y = 5, z = 7;
-	sout | x * 3 | y + 1 | z << 2 | x == y | (x | y) | (x || y) | (x > z ? 1 : 2) | endl;
-	sout | 1 | 2 | 3 | endl;
-	sout | '1' | '2' | '3' | endl;
-	sout | 1 | "" | 2 | "" | 3 | endl;
-	sout | endl;
-
-	sout | "opening delimiters" | endl;
-	sout
-		 | "x (" | 1
-		 | "x [" | 2
-		 | "x {" | 3
-		 | "x =" | 4
-		 | "x $" | 5
-		 | "x £" | 6
-		 | "x ¥" | 7
-		 | "x ¡" | 8
-		 | "x ¿" | 9
-		 | "x «" | 10
-		 | endl | endl;
-
-	sout | "closing delimiters" | endl;
-	sout
-		 | 1 | ", x"
-		 | 2 | ". x"
-		 | 3 | "; x"
-		 | 4 | "! x"
-		 | 5 | "? x"
-		 | 6 | "% x"
-		 | 7 | "¢ x"
-		 | 8 | "» x"
-		 | 9 | ") x"
-		 | 10 | "] x"
-		 | 11 | "} x"
-		 | endl | endl;
-
-	sout | "opening/closing delimiters" | endl;
-	sout
-		 | "x`" | 1 | "`x'" | 2
-		 | "'x\"" | 3 | "\"x:" | 4
-		 | ":x " | 5 | " x\t" | 6
-		 | "\tx\f" | 7 | "\fx\v" | 8
-		 | "\vx\n" | 9 | "\nx\r" | 10
-		 | "\rx"
-		 | endl | endl;
-
-	sout | "override opening/closing delimiters" | endl;
-	sout | "x ( " | 1 | " ) x" | 2 | " , x" | 3 | " :x: " | 4 | endl;
-	sout | endl;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa io1.c" //
-// End: //
Index: tests/io1.cfa
===================================================================
--- tests/io1.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/io1.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,73 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// io1.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Wed Mar  2 16:56:02 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:57:17 2018
+// Update Count     : 105
+//
+
+#include <fstream.hfa>
+
+int main() {
+	int x = 3, y = 5, z = 7;
+	sout | x * 3 | y + 1 | z << 2 | x == y | (x | y) | (x || y) | (x > z ? 1 : 2) | endl;
+	sout | 1 | 2 | 3 | endl;
+	sout | '1' | '2' | '3' | endl;
+	sout | 1 | "" | 2 | "" | 3 | endl;
+	sout | endl;
+
+	sout | "opening delimiters" | endl;
+	sout
+		 | "x (" | 1
+		 | "x [" | 2
+		 | "x {" | 3
+		 | "x =" | 4
+		 | "x $" | 5
+		 | "x £" | 6
+		 | "x ¥" | 7
+		 | "x ¡" | 8
+		 | "x ¿" | 9
+		 | "x «" | 10
+		 | endl | endl;
+
+	sout | "closing delimiters" | endl;
+	sout
+		 | 1 | ", x"
+		 | 2 | ". x"
+		 | 3 | "; x"
+		 | 4 | "! x"
+		 | 5 | "? x"
+		 | 6 | "% x"
+		 | 7 | "¢ x"
+		 | 8 | "» x"
+		 | 9 | ") x"
+		 | 10 | "] x"
+		 | 11 | "} x"
+		 | endl | endl;
+
+	sout | "opening/closing delimiters" | endl;
+	sout
+		 | "x`" | 1 | "`x'" | 2
+		 | "'x\"" | 3 | "\"x:" | 4
+		 | ":x " | 5 | " x\t" | 6
+		 | "\tx\f" | 7 | "\fx\v" | 8
+		 | "\vx\n" | 9 | "\nx\r" | 10
+		 | "\rx"
+		 | endl | endl;
+
+	sout | "override opening/closing delimiters" | endl;
+	sout | "x ( " | 1 | " ) x" | 2 | " , x" | 3 | " :x: " | 4 | endl;
+	sout | endl;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa io1.cfa" //
+// End: //
Index: sts/io2.c
===================================================================
--- tests/io2.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,137 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// io2.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Wed Mar  2 16:56:02 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu May 24 21:17:41 2018
-// Update Count     : 103
-//
-
-#include <fstream.hfa>
-
- #define xstr(s) str(s)
-#define str(s) #s
-
-int main() {
-	_Bool b;											// basic types
-	char c;
-	signed char sc;
-	unsigned char usc;
-	short int si;
-	unsigned short int usi;
-	int i;
-	unsigned int ui;
-	long int li;
-	unsigned long int uli;
-	long long int lli;
-	unsigned long long int ulli;
-	float f;
-	double d;
-	long double ld;
-	float _Complex fc;
-	double _Complex dc;
-	long double _Complex ldc;
-	enum { size = 10 };
-	char s1[size], s2[size];
-
-	ifstream in = { xstr(IN_DIR) "io.data" };						// create / open file
-
-	sout | "input bacis types" | endl;
-	in	 | b											// boolean
-		 | c | sc | usc									// character
-		 | si | usi | i | ui | li | uli | lli | ulli	// integral
-		 | f | d | ld									// floating point
-		 | fc | dc | ldc								// floating-point complex
-		 | cstr( s1 ) | cstr( s2, size );				// C string, length unchecked and checked
-	sout | endl;
-
-	sout | "output basic types" | endl;
-	sout | b | endl										// boolean
-		 | c | ' ' | sc | ' ' | usc | endl				// character
-		 | si | usi | i | ui | li | uli | lli | ulli | endl // integral
-		 | f | d | ld | endl							// floating point
-		 | fc | dc | ldc | endl;						// complex
-	sout | endl;
-
-	sout | "tuples" | endl;
-	[int, [ int, int ] ] t1 = [ 1, [ 2, 3 ] ], t2 = [ 4, [ 5, 6 ] ];
-	sout | t1 | t2 | endl;								// print tuple
-	sout | endl;
-
-	sout | "toggle separator" | endl;
-	sout | f | "" | d | "" | ld | endl					// floating point without separator
-		 | sepDisable | fc | dc | ldc | endl			// complex without separator
-		 | fc | sepOn | dc | ldc | endl					// local separator add
-		 | sepEnable | fc | dc | ldc | endl				// complex with separator
-		 | fc | sepOff | dc | ldc | endl				// local separator removal
-		 | s1 | sepOff | s2 | endl						// local separator removal
-		 | s1 | "" | s2 | endl;							// local separator removal
-	sout | endl;
-
-	sout | "change separator" | endl;
-	sout | "from \"" | sep | "\"";
-	sepSet( sout, ", $" );								// change separator, maximum of 15 characters
-	sout | " to \"" | sep | "\"" | endl;
-	sout | f | d | ld | endl
-		 | fc | dc | ldc | endl
-		 | s1 | s2 | endl
-		 | t1 | t2 | endl;								// print tuple
-	sout | endl;
-	sout | "from \"" | sep | "\" ";
-	sepSet( sout, " " );								// restore separator
-	sout | "to \"" | sep | "\"" | endl;
-	sout | f | d | ld | endl
-		 | fc | dc | ldc | endl
-		 | s1 | s2 | endl
-		 | t1 | t2 | endl;								// print tuple
-	sout | endl;
-
-	sout | "check sepOn/sepOff" | endl;
-	sout | sepOn | 1 | 2 | 3 | sepOn | endl;			// no separator at start/end of line
-	sout | 1 | sepOff | 2 | 3 | endl;					// locally turn off implicit separator
-	sout | sepOn | sepOn | 1 | 2 | 3 | sepOn | sepOff | sepOn | '\n'; // no separator at start/end of line
-	sout | 1 | 2 | 3 | "\n\n" | sepOn;					// no separator at start of next line
-	sout | 1 | 2 | 3 | endl;
-	sout | endl;
-
-	sout | "check enable/disable" | endl;
-	sout | sepDisable | 1 | 2 | 3 | endl;				// globally turn off implicit separation
-	sout | 1 | sepOn | 2 | 3 | endl;					// locally turn on implicit separator
-	sout | sepEnable | 1 | 2 | 3 | endl | sepDisable;	// globally turn on/off implicit separation
-	sout | 1 | 2 | 3 | endl | sepEnable;				// globally turn on implicit separation
-	sout | 1 | 2 | 3 | sepOn | sepDisable | endl;		// ignore seperate at end of line
-	sout | 1 | 2 | 3 | sepOn | sepEnable | endl;		// separator at end of line
-	sout | 1 | 2 | 3 | endl;
-	sout | endl;
-
-//	sout | fmt( d, "%8.3f" ) || endl;
-//	sout | endl;
-
-	sepSetTuple( sout, " " );							// set tuple separator from ", " to " "
-	sout | t1 | t2 | " \"" | sep | "\"" | endl;
-	sepSetTuple( sout, ", " );							// reset tuple separator to ", "
-	sout | t1 | t2 | " \"" | sep | "\"" | endl;
-	sout | t1 | t2 | endl;								// print tuple
-	sout | endl;
-
-	[int, int, const char *, double] t3 = { 3, 4, "a", 7.2 };
-	sout | [ 3, 4, "a", 7.2 ] | endl;
-	sout | t3 | endl;
-	sepSetTuple( sout, " " );
-	sout | t3 | endl;
-	sout | sepOn | t3 | sepDisable | t3 | sepEnable | t3 | endl;
-	sepSet( sout, "^" );
-	sepSetTuple( sout, "-" );
-	sout | t3 | 3 | 4 | t3 | endl;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa io2.c" //
-// End: //
Index: tests/io2.cfa
===================================================================
--- tests/io2.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/io2.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,137 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// io2.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Wed Mar  2 16:56:02 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:57:28 2018
+// Update Count     : 104
+//
+
+#include <fstream.hfa>
+
+ #define xstr(s) str(s)
+#define str(s) #s
+
+int main() {
+	_Bool b;											// basic types
+	char c;
+	signed char sc;
+	unsigned char usc;
+	short int si;
+	unsigned short int usi;
+	int i;
+	unsigned int ui;
+	long int li;
+	unsigned long int uli;
+	long long int lli;
+	unsigned long long int ulli;
+	float f;
+	double d;
+	long double ld;
+	float _Complex fc;
+	double _Complex dc;
+	long double _Complex ldc;
+	enum { size = 10 };
+	char s1[size], s2[size];
+
+	ifstream in = { xstr(IN_DIR) "io.data" };						// create / open file
+
+	sout | "input bacis types" | endl;
+	in	 | b											// boolean
+		 | c | sc | usc									// character
+		 | si | usi | i | ui | li | uli | lli | ulli	// integral
+		 | f | d | ld									// floating point
+		 | fc | dc | ldc								// floating-point complex
+		 | cstr( s1 ) | cstr( s2, size );				// C string, length unchecked and checked
+	sout | endl;
+
+	sout | "output basic types" | endl;
+	sout | b | endl										// boolean
+		 | c | ' ' | sc | ' ' | usc | endl				// character
+		 | si | usi | i | ui | li | uli | lli | ulli | endl // integral
+		 | f | d | ld | endl							// floating point
+		 | fc | dc | ldc | endl;						// complex
+	sout | endl;
+
+	sout | "tuples" | endl;
+	[int, [ int, int ] ] t1 = [ 1, [ 2, 3 ] ], t2 = [ 4, [ 5, 6 ] ];
+	sout | t1 | t2 | endl;								// print tuple
+	sout | endl;
+
+	sout | "toggle separator" | endl;
+	sout | f | "" | d | "" | ld | endl					// floating point without separator
+		 | sepDisable | fc | dc | ldc | endl			// complex without separator
+		 | fc | sepOn | dc | ldc | endl					// local separator add
+		 | sepEnable | fc | dc | ldc | endl				// complex with separator
+		 | fc | sepOff | dc | ldc | endl				// local separator removal
+		 | s1 | sepOff | s2 | endl						// local separator removal
+		 | s1 | "" | s2 | endl;							// local separator removal
+	sout | endl;
+
+	sout | "change separator" | endl;
+	sout | "from \"" | sep | "\"";
+	sepSet( sout, ", $" );								// change separator, maximum of 15 characters
+	sout | " to \"" | sep | "\"" | endl;
+	sout | f | d | ld | endl
+		 | fc | dc | ldc | endl
+		 | s1 | s2 | endl
+		 | t1 | t2 | endl;								// print tuple
+	sout | endl;
+	sout | "from \"" | sep | "\" ";
+	sepSet( sout, " " );								// restore separator
+	sout | "to \"" | sep | "\"" | endl;
+	sout | f | d | ld | endl
+		 | fc | dc | ldc | endl
+		 | s1 | s2 | endl
+		 | t1 | t2 | endl;								// print tuple
+	sout | endl;
+
+	sout | "check sepOn/sepOff" | endl;
+	sout | sepOn | 1 | 2 | 3 | sepOn | endl;			// no separator at start/end of line
+	sout | 1 | sepOff | 2 | 3 | endl;					// locally turn off implicit separator
+	sout | sepOn | sepOn | 1 | 2 | 3 | sepOn | sepOff | sepOn | '\n'; // no separator at start/end of line
+	sout | 1 | 2 | 3 | "\n\n" | sepOn;					// no separator at start of next line
+	sout | 1 | 2 | 3 | endl;
+	sout | endl;
+
+	sout | "check enable/disable" | endl;
+	sout | sepDisable | 1 | 2 | 3 | endl;				// globally turn off implicit separation
+	sout | 1 | sepOn | 2 | 3 | endl;					// locally turn on implicit separator
+	sout | sepEnable | 1 | 2 | 3 | endl | sepDisable;	// globally turn on/off implicit separation
+	sout | 1 | 2 | 3 | endl | sepEnable;				// globally turn on implicit separation
+	sout | 1 | 2 | 3 | sepOn | sepDisable | endl;		// ignore seperate at end of line
+	sout | 1 | 2 | 3 | sepOn | sepEnable | endl;		// separator at end of line
+	sout | 1 | 2 | 3 | endl;
+	sout | endl;
+
+//	sout | fmt( d, "%8.3f" ) || endl;
+//	sout | endl;
+
+	sepSetTuple( sout, " " );							// set tuple separator from ", " to " "
+	sout | t1 | t2 | " \"" | sep | "\"" | endl;
+	sepSetTuple( sout, ", " );							// reset tuple separator to ", "
+	sout | t1 | t2 | " \"" | sep | "\"" | endl;
+	sout | t1 | t2 | endl;								// print tuple
+	sout | endl;
+
+	[int, int, const char *, double] t3 = { 3, 4, "a", 7.2 };
+	sout | [ 3, 4, "a", 7.2 ] | endl;
+	sout | t3 | endl;
+	sepSetTuple( sout, " " );
+	sout | t3 | endl;
+	sout | sepOn | t3 | sepDisable | t3 | sepEnable | t3 | endl;
+	sepSet( sout, "^" );
+	sepSetTuple( sout, "-" );
+	sout | t3 | 3 | 4 | t3 | endl;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa io2.cfa" //
+// End: //
Index: sts/labelledExit.c
===================================================================
--- tests/labelledExit.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,162 +1,0 @@
-// 
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-// 
-// labelledExit.c -- 
-// 
-// Author           : Peter A. Buhr
-// Created On       : Wed Aug 10 07:29:39 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug 16 08:55:39 2018
-// Update Count     : 3
-// 
-
-int foo() {
-  	int i;
-  	int x, y;
-
-  	x = 0; y = 0;
-
-  	// block, labelled exits
-
-  Block: {
-  		if ( x == y ) {
-  			for ( ; i < y; ) {
-  				y += 1;
-  				if ( y < 10 ) break Block;
-  			}
-  		}
-  	}
-
-  	// loops, labelled exits
-
-  w1: while ( y == 10 );
-
-  w2: while ( x < 10 ) {
-  		while (y < 5 ) {
-  			if ( y == 3 ) break w2;
-  		}
-  		x += 1;
-  	}
-
-  A: for ( i = 0; i < 10; i += 1 ) {
-  	  B: for ( i = 0; i < 10; i += 1 ) {
-  		  C: for ( i = 0; i < 10; i += 1 ) {
-  				goto A;
-  				goto B;
-  				goto C;
-  				continue A;
-  				continue B;
-  				continue C;
-  				continue;
-  				break A;
-  				break B;
-  				break C;
-  				break;
-  			}
-  		}
-  	}
-
-  D: for () {
-  		break D;
-  		continue D;
-  	}
-
-  Z : i += 1;
-  	goto Z;
-  X: Y: for () {
-  		i += 1;
-  		if ( i > 5 ) continue X;
-  		if ( i < 5 ) break X;
-  		if ( i < 5 ) break Y;
-  		break;
-  	}
-  XX: for () {
-  	  YY: for () {
-  		  ZZ: for () {
-  				i += 1;
-  				if ( i > 5 ) continue XX;
-  				if ( i < 5 ) continue YY;
-  				if ( i < 5 ) continue ZZ;
-  				if ( i > 5 ) break XX;
-  				if ( i < 5 ) break YY;
-  				if ( i < 5 ) break ZZ;
-  				break;
-  			}
-  		}
-  	}
-
-  	for () ;
-  	for ( int i = 0 ;; ) ;
-  	for (  ; i < 0; ) ;
-  	for (  ; ; i += 1 ) ;
-  L0:  L1:  L2:  L3:  L4:  L5:  L6:  L7:  L8:  L9:
-  L10: L11: L12: L13: L14: L15: L16: L17: L18: L19:
-  L20: L21: L22: L23: L24: L25: L26: L27: L28: L29:
-  L31: L32: L33: L34:
-  	for () {
-  		break L0;
-  	}
-
-  	// switch/choose, labelled exits
-
-  Switch: switch ( i ) {
-  	  default:
-  		i += 1;
-  	  case 0:
-  		i += 1;
-  		break Switch;
-  	  case 1:
-  		switch ( i ) {
-  		  case 0:
-  			break Switch;
-  		  default:
-  			; break;
-  		}
-  	}
-
-  Choose: choose ( i ) {
-  	  default:
-  		i += 1;
-  	  case 0:
-  		i += 1;
-  		break Choose;
-  	  case 1:
-  		choose ( i ) {
-  		  case 0:
-  			break;
-  		  default:
-  			break Choose;
-  		}
-  		fallthru;
-  	  case 2:
-  		i += 1;
-  	}
-
-	// computed goto
-	// {
-	// 	void *array[] = { &&foo, &&bar, &&hack };
-	//   foo: bar: hack:
-	// 	&&foo;
-	// 	&&bar;
-	// 	goto *array[i];
-	// }
-
-  Q: if ( i > 5 ) {
-		i += 1;
-		break Q;
-	}
-	else
-		i += 1;
-}
-
-int main( int argc, char const *argv[] ) {
-	/* code */
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa labelledExit.c" //
-// End: //
Index: tests/labelledExit.cfa
===================================================================
--- tests/labelledExit.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/labelledExit.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,162 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// labelledExit.cfa -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Wed Aug 10 07:29:39 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:57:42 2018
+// Update Count     : 4
+// 
+
+int foo() {
+  	int i;
+  	int x, y;
+
+  	x = 0; y = 0;
+
+  	// block, labelled exits
+
+  Block: {
+  		if ( x == y ) {
+  			for ( ; i < y; ) {
+  				y += 1;
+  				if ( y < 10 ) break Block;
+  			}
+  		}
+  	}
+
+  	// loops, labelled exits
+
+  w1: while ( y == 10 );
+
+  w2: while ( x < 10 ) {
+  		while (y < 5 ) {
+  			if ( y == 3 ) break w2;
+  		}
+  		x += 1;
+  	}
+
+  A: for ( i = 0; i < 10; i += 1 ) {
+  	  B: for ( i = 0; i < 10; i += 1 ) {
+  		  C: for ( i = 0; i < 10; i += 1 ) {
+  				goto A;
+  				goto B;
+  				goto C;
+  				continue A;
+  				continue B;
+  				continue C;
+  				continue;
+  				break A;
+  				break B;
+  				break C;
+  				break;
+  			}
+  		}
+  	}
+
+  D: for () {
+  		break D;
+  		continue D;
+  	}
+
+  Z : i += 1;
+  	goto Z;
+  X: Y: for () {
+  		i += 1;
+  		if ( i > 5 ) continue X;
+  		if ( i < 5 ) break X;
+  		if ( i < 5 ) break Y;
+  		break;
+  	}
+  XX: for () {
+  	  YY: for () {
+  		  ZZ: for () {
+  				i += 1;
+  				if ( i > 5 ) continue XX;
+  				if ( i < 5 ) continue YY;
+  				if ( i < 5 ) continue ZZ;
+  				if ( i > 5 ) break XX;
+  				if ( i < 5 ) break YY;
+  				if ( i < 5 ) break ZZ;
+  				break;
+  			}
+  		}
+  	}
+
+  	for () ;
+  	for ( int i = 0 ;; ) ;
+  	for (  ; i < 0; ) ;
+  	for (  ; ; i += 1 ) ;
+  L0:  L1:  L2:  L3:  L4:  L5:  L6:  L7:  L8:  L9:
+  L10: L11: L12: L13: L14: L15: L16: L17: L18: L19:
+  L20: L21: L22: L23: L24: L25: L26: L27: L28: L29:
+  L31: L32: L33: L34:
+  	for () {
+  		break L0;
+  	}
+
+  	// switch/choose, labelled exits
+
+  Switch: switch ( i ) {
+  	  default:
+  		i += 1;
+  	  case 0:
+  		i += 1;
+  		break Switch;
+  	  case 1:
+  		switch ( i ) {
+  		  case 0:
+  			break Switch;
+  		  default:
+  			; break;
+  		}
+  	}
+
+  Choose: choose ( i ) {
+  	  default:
+  		i += 1;
+  	  case 0:
+  		i += 1;
+  		break Choose;
+  	  case 1:
+  		choose ( i ) {
+  		  case 0:
+  			break;
+  		  default:
+  			break Choose;
+  		}
+  		fallthru;
+  	  case 2:
+  		i += 1;
+  	}
+
+	// computed goto
+	// {
+	// 	void *array[] = { &&foo, &&bar, &&hack };
+	//   foo: bar: hack:
+	// 	&&foo;
+	// 	&&bar;
+	// 	goto *array[i];
+	// }
+
+  Q: if ( i > 5 ) {
+		i += 1;
+		break Q;
+	}
+	else
+		i += 1;
+}
+
+int main( int argc, char const *argv[] ) {
+	/* code */
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa labelledExit.cfa" //
+// End: //
Index: sts/limits.c
===================================================================
--- tests/limits.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,156 +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.
-//
-// limits.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Tue May 10 20:44:20 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar  1 16:21:55 2018
-// Update Count     : 7
-//
-
-#include <limits.hfa>
-
-// Integral Constants
-
-signed char m = MIN;
-unsigned char m = MIN;
-short int m = MIN;
-unsigned short int m = MIN;
-int m = MIN;
-unsigned int m = MIN;
-long int m = MIN;
-unsigned long int m = MIN;
-long long int m = MIN;
-unsigned long long int m = MIN;
-
-signed char M = MAX;
-unsigned char M = MAX;
-short int M = MAX;
-unsigned short int M = MAX;
-int M = MAX;
-unsigned int M = MAX;
-long int M = MAX;
-unsigned long int M = MAX;
-long long int M = MAX;
-unsigned long long int M = MAX;
-
-// Floating-Point Constants
-
-float m = MIN;
-double m = MIN;
-long double m = MIN;
-float _Complex m = MIN;
-double _Complex m = MIN;
-long double _Complex m = MIN;
-
-float M = MAX;
-double M = MAX;
-long double M = MAX;
-float _Complex M = MAX;
-double _Complex M = MAX;
-long double _Complex M = MAX;
-
-float pi = PI;
-float pi_2 = PI_2;
-float pi_4 = PI_4;
-float _1_pi = _1_PI;
-float _2_pi = _2_PI;
-float _2_sqrt_pi = _2_SQRT_PI;
-
-double pi = PI;
-double pi_2 = PI_2;
-double pi_4 = PI_4;
-double _1_pi = _1_PI;
-double _2_pi = _2_PI;
-double _2_SQRT_pi = _2_SQRT_PI;
-
-long double pi = PI;
-long double pi_2 = PI_2;
-long double pi_4 = PI_4;
-long double _1_pi = _1_PI;
-long double _2_pi = _2_PI;
-long double _2_sqrt_pi = _2_SQRT_PI;
-
-float _Complex pi = PI;
-float _Complex pi_2 = PI_2;
-float _Complex pi_4 = PI_4;
-float _Complex _1_pi = _1_PI;
-float _Complex _2_pi = _2_PI;
-float _Complex _2_sqrt_pi = _2_SQRT_PI;
-
-double _Complex pi = PI;
-double _Complex pi_2 = PI_2;
-double _Complex pi_4 = PI_4;
-double _Complex _1_pi = _1_PI;
-double _Complex _2_pi = _2_PI;
-double _Complex _2_sqrt_pi = _2_SQRT_PI;
-
-long double _Complex pi = PI;
-long double _Complex pi_2 = PI_2;
-long double _Complex pi_4 = PI_4;
-long double _Complex _1_pi = _1_PI;
-long double _Complex _2_pi = _2_PI;
-long double _Complex _2_sqrt_pi = _2_SQRT_PI;
-
-float e = E;
-float log2_e = LOG2_E;
-float log10_e = LOG10_E;
-float ln_2 = LN_2;
-float ln_10 = LN_10;
-float sqrt_2 = SQRT_2;
-float _1_sqrt_2 = _1_SQRT_2;
-
-double e = E;
-double log2_e = LOG2_E;
-double log10_e = LOG10_E;
-double ln_2 = LN_2;
-double ln_10 = LN_10;
-double sqrt_2 = SQRT_2;
-double _1_sqrt_2 = _1_SQRT_2;
-
-long double e = E;
-long double log2_e = LOG2_E;
-long double log10_e = LOG10_E;
-long double ln_2 = LN_2;
-long double ln_10 = LN_10;
-long double sqrt_2 = SQRT_2;
-long double _1_sqrt_2 = _1_SQRT_2;
-
-float _Complex e = E;
-float _Complex log2_e = LOG2_E;
-float _Complex log10_e = LOG10_E;
-float _Complex ln_2 = LN_2;
-float _Complex ln_10 = LN_10;
-float _Complex sqrt_2 = SQRT_2;
-float _Complex _1_sqrt_2 = _1_SQRT_2;
-
-double _Complex e = E;
-double _Complex log2_e = LOG2_E;
-double _Complex log10_e = LOG10_E;
-double _Complex ln_2 = LN_2;
-double _Complex ln_10 = LN_10;
-double _Complex sqrt_2 = SQRT_2;
-double _Complex _1_sqrt_2 = _1_SQRT_2;
-
-long double _Complex e = E;
-long double _Complex log2_e = LOG2_E;
-long double _Complex log10_e = LOG10_E;
-long double _Complex ln_2 = LN_2;
-long double _Complex ln_10 = LN_10;
-long double _Complex sqrt_2 = SQRT_2;
-long double _Complex _1_sqrt_2 = _1_SQRT_2;
-
-int main(int argc, char const *argv[]) {
-	//DUMMY
-	return 0;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa limits.c" //
-// End: //
Index: tests/limits.cfa
===================================================================
--- tests/limits.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/limits.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,156 @@
+//
+// 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.
+//
+// limits.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Tue May 10 20:44:20 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:57:55 2018
+// Update Count     : 8
+//
+
+#include <limits.hfa>
+
+// Integral Constants
+
+signed char m = MIN;
+unsigned char m = MIN;
+short int m = MIN;
+unsigned short int m = MIN;
+int m = MIN;
+unsigned int m = MIN;
+long int m = MIN;
+unsigned long int m = MIN;
+long long int m = MIN;
+unsigned long long int m = MIN;
+
+signed char M = MAX;
+unsigned char M = MAX;
+short int M = MAX;
+unsigned short int M = MAX;
+int M = MAX;
+unsigned int M = MAX;
+long int M = MAX;
+unsigned long int M = MAX;
+long long int M = MAX;
+unsigned long long int M = MAX;
+
+// Floating-Point Constants
+
+float m = MIN;
+double m = MIN;
+long double m = MIN;
+float _Complex m = MIN;
+double _Complex m = MIN;
+long double _Complex m = MIN;
+
+float M = MAX;
+double M = MAX;
+long double M = MAX;
+float _Complex M = MAX;
+double _Complex M = MAX;
+long double _Complex M = MAX;
+
+float pi = PI;
+float pi_2 = PI_2;
+float pi_4 = PI_4;
+float _1_pi = _1_PI;
+float _2_pi = _2_PI;
+float _2_sqrt_pi = _2_SQRT_PI;
+
+double pi = PI;
+double pi_2 = PI_2;
+double pi_4 = PI_4;
+double _1_pi = _1_PI;
+double _2_pi = _2_PI;
+double _2_SQRT_pi = _2_SQRT_PI;
+
+long double pi = PI;
+long double pi_2 = PI_2;
+long double pi_4 = PI_4;
+long double _1_pi = _1_PI;
+long double _2_pi = _2_PI;
+long double _2_sqrt_pi = _2_SQRT_PI;
+
+float _Complex pi = PI;
+float _Complex pi_2 = PI_2;
+float _Complex pi_4 = PI_4;
+float _Complex _1_pi = _1_PI;
+float _Complex _2_pi = _2_PI;
+float _Complex _2_sqrt_pi = _2_SQRT_PI;
+
+double _Complex pi = PI;
+double _Complex pi_2 = PI_2;
+double _Complex pi_4 = PI_4;
+double _Complex _1_pi = _1_PI;
+double _Complex _2_pi = _2_PI;
+double _Complex _2_sqrt_pi = _2_SQRT_PI;
+
+long double _Complex pi = PI;
+long double _Complex pi_2 = PI_2;
+long double _Complex pi_4 = PI_4;
+long double _Complex _1_pi = _1_PI;
+long double _Complex _2_pi = _2_PI;
+long double _Complex _2_sqrt_pi = _2_SQRT_PI;
+
+float e = E;
+float log2_e = LOG2_E;
+float log10_e = LOG10_E;
+float ln_2 = LN_2;
+float ln_10 = LN_10;
+float sqrt_2 = SQRT_2;
+float _1_sqrt_2 = _1_SQRT_2;
+
+double e = E;
+double log2_e = LOG2_E;
+double log10_e = LOG10_E;
+double ln_2 = LN_2;
+double ln_10 = LN_10;
+double sqrt_2 = SQRT_2;
+double _1_sqrt_2 = _1_SQRT_2;
+
+long double e = E;
+long double log2_e = LOG2_E;
+long double log10_e = LOG10_E;
+long double ln_2 = LN_2;
+long double ln_10 = LN_10;
+long double sqrt_2 = SQRT_2;
+long double _1_sqrt_2 = _1_SQRT_2;
+
+float _Complex e = E;
+float _Complex log2_e = LOG2_E;
+float _Complex log10_e = LOG10_E;
+float _Complex ln_2 = LN_2;
+float _Complex ln_10 = LN_10;
+float _Complex sqrt_2 = SQRT_2;
+float _Complex _1_sqrt_2 = _1_SQRT_2;
+
+double _Complex e = E;
+double _Complex log2_e = LOG2_E;
+double _Complex log10_e = LOG10_E;
+double _Complex ln_2 = LN_2;
+double _Complex ln_10 = LN_10;
+double _Complex sqrt_2 = SQRT_2;
+double _Complex _1_sqrt_2 = _1_SQRT_2;
+
+long double _Complex e = E;
+long double _Complex log2_e = LOG2_E;
+long double _Complex log10_e = LOG10_E;
+long double _Complex ln_2 = LN_2;
+long double _Complex ln_10 = LN_10;
+long double _Complex sqrt_2 = SQRT_2;
+long double _Complex _1_sqrt_2 = _1_SQRT_2;
+
+int main(int argc, char const *argv[]) {
+	//DUMMY
+	return 0;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa limits.cfa" //
+// End: //
Index: sts/literals.c
===================================================================
--- tests/literals.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,327 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// literals.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Sat Sep  9 16:34:38 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Jul  1 15:12:15 2018
-// Update Count     : 137
-//
-
-#ifdef __CFA__
-#include <stdint.h>
-#include <fstream.hfa>
-
-void f( char v ) { sout | "char " | v | endl; }
-void f( signed char v ) { sout | "signed char " | v | endl; }
-void f( unsigned char v ) { sout | "unsigned char " | v | endl; }
-void f( signed short v ) { sout | "signed short int" | v | endl; }
-void f( unsigned short v ) { sout | "unsigned short int" | v | endl; }
-void f( size_t v ) { sout | "size_t" | v | endl; }
-#endif // __CFA__
-
-//#define ERROR
-
-int main() {
-// integer literals
-
-	// binary
-	 0b01101011;   0b01101011u;   0b01101011l;   0b01101011ll;   0b01101011ul;   0b01101011lu;   0b01101011ull;   0b01101011llu;
-	+0b01101011;  +0b01101011u;  +0b01101011l;  +0b01101011ll;  +0b01101011ul;  +0b01101011lu;  +0b01101011ull;  +0b01101011llu;
-	-0b01101011;  -0b01101011u;  -0b01101011l;  -0b01101011ll;  -0b01101011ul;  -0b01101011lu;  -0b01101011ull;  -0b01101011llu;
-
-	// octal
-	 01234567;   01234567u;   01234567l;   01234567ll;   01234567ul;   01234567lu;   01234567ull;   01234567llu;
-	+01234567;  +01234567u;  +01234567l;  +01234567ll;  +01234567ul;  +01234567lu;  +01234567ull;  +01234567llu;
-	-01234567;  -01234567u;  -01234567l;  -01234567ll;  -01234567ul;  -01234567lu;  -01234567ull;  -01234567llu;
-
-	// decimal
-	 1234567890;   1234567890u;   1234567890l;   1234567890ll;   1234567890ul;   1234567890lu;   1234567890ull;   1234567890llu;
-	+1234567890;  +1234567890u;  +1234567890l;  +1234567890ll;  +1234567890ul;  +1234567890lu;  +1234567890ull;  +1234567890llu;
-	-1234567890;  -1234567890u;  -1234567890l;  -1234567890ll;  -1234567890ul;  -1234567890lu;  -1234567890ull;  -1234567890llu;
-
-	// hexadecimal
-	 0x0123456789abcdef;   0x0123456789abcdefu;   0x0123456789abcdefl;   0x0123456789abcdefll;   0x0123456789abcdeful;   0x0123456789abcdeflu;   0x0123456789abcdefull;   0x0123456789abcdefllu;
-	+0x0123456789abcdef;  +0x0123456789abcdefu;  +0x0123456789abcdefl;  +0x0123456789abcdefll;  +0x0123456789abcdeful;  +0x0123456789abcdeflu;  +0x0123456789abcdefull;  +0x0123456789abcdefllu;
-	-0x0123456789abcdef;  -0x0123456789abcdefu;  -0x0123456789abcdefl;  -0x0123456789abcdefll;  -0x0123456789abcdeful;  -0x0123456789abcdeflu;  -0x0123456789abcdefull;  -0x0123456789abcdefllu;
-
-	 0x0123456789ABCDEF;   0x0123456789ABCDEFu;   0x0123456789ABCDEFl;   0x0123456789ABCDEFll;   0x0123456789ABCDEFul;   0x0123456789ABCDEFlu;   0x0123456789ABCDEFull;   0x0123456789ABCDEFllu;
-	+0x0123456789ABCDEF;  +0x0123456789ABCDEFu;  +0x0123456789ABCDEFl;  +0x0123456789ABCDEFll;  +0x0123456789ABCDEFul;  +0x0123456789ABCDEFlu;  +0x0123456789ABCDEFull;  +0x0123456789ABCDEFllu;
-	-0x0123456789ABCDEF;  -0x0123456789ABCDEFu;  -0x0123456789ABCDEFl;  -0x0123456789ABCDEFll;  -0x0123456789ABCDEFul;  -0x0123456789ABCDEFlu;  -0x0123456789ABCDEFull;  -0x0123456789ABCDEFllu;
-
-	 0X0123456789abcdef;   0X0123456789abcdefu;   0X0123456789abcdefl;   0X0123456789abcdefll;   0X0123456789abcdeful;   0X0123456789abcdeflu;   0X0123456789abcdefull;   0X0123456789abcdefllu;
-	+0X0123456789abcdef;  +0X0123456789abcdefu;  +0X0123456789abcdefl;  +0X0123456789abcdefll;  +0X0123456789abcdeful;  +0X0123456789abcdeflu;  +0X0123456789abcdefull;  +0X0123456789abcdefllu;
-	-0X0123456789abcdef;  -0X0123456789abcdefu;  -0X0123456789abcdefl;  -0X0123456789abcdefll;  -0X0123456789abcdeful;  -0X0123456789abcdeflu;  -0X0123456789abcdefull;  -0X0123456789abcdefllu;
-
-	 0X0123456789ABCDEF;   0X0123456789ABCDEFu;   0X0123456789ABCDEFl;   0X0123456789ABCDEFll;   0X0123456789ABCDEFul;   0X0123456789ABCDEFlu;   0X0123456789ABCDEFull;   0X0123456789ABCDEFllu;
-	+0X0123456789ABCDEF;  +0X0123456789ABCDEFu;  +0X0123456789ABCDEFl;  +0X0123456789ABCDEFll;  +0X0123456789ABCDEFul;  +0X0123456789ABCDEFlu;  +0X0123456789ABCDEFull;  +0X0123456789ABCDEFllu;
-	-0X0123456789ABCDEF;  -0X0123456789ABCDEFu;  -0X0123456789ABCDEFl;  -0X0123456789ABCDEFll;  -0X0123456789ABCDEFul;  -0X0123456789ABCDEFlu;  -0X0123456789ABCDEFull;  -0X0123456789ABCDEFllu;
-
-// decimal floating literals
-
-	 0123456789.;   0123456789.f;   0123456789.l;   0123456789.F;   0123456789.L;   0123456789.DL;
-	+0123456789.;  +0123456789.f;  +0123456789.l;  +0123456789.F;  +0123456789.L;  +0123456789.DL;
-	-0123456789.;  -0123456789.f;  -0123456789.l;  -0123456789.F;  -0123456789.L;  -0123456789.DL;
-
-	 0123456789.e09;   0123456789.e09f;   0123456789.e09l;   0123456789.e09F;   0123456789.e09L;   0123456789.e09DL;
-	+0123456789.e09;  +0123456789.e09f;  +0123456789.e09l;  +0123456789.e09F;  +0123456789.e09L;  +0123456789.e09DL;
-	-0123456789.e09;  -0123456789.e09f;  -0123456789.e09l;  -0123456789.e09F;  -0123456789.e09L;  -0123456789.e09DL;
-
-	 0123456789.e+09;   0123456789.e+09f;   0123456789.e+09l;   0123456789.e+09F;   0123456789.e+09L;   0123456789.e+09DL;
-	+0123456789.e+09;  +0123456789.e+09f;  +0123456789.e+09l;  +0123456789.e+09F;  +0123456789.e+09L;  +0123456789.e+09DL;
-	-0123456789.e+09;  -0123456789.e+09f;  -0123456789.e+09l;  -0123456789.e+09F;  -0123456789.e+09L;  -0123456789.e+09DL;
-
-	 0123456789.e-09;   0123456789.e-09f;   0123456789.e-09l;   0123456789.e-09F;   0123456789.e-09L;   0123456789.e-09DL;
-	+0123456789.e-09;  +0123456789.e-09f;  +0123456789.e-09l;  +0123456789.e-09F;  +0123456789.e-09L;  +0123456789.e-09DL;
-	-0123456789.e-09;  -0123456789.e-09f;  -0123456789.e-09l;  -0123456789.e-09F;  -0123456789.e-09L;  -0123456789.e-09DL;
-
-	 .0123456789;   .0123456789f;   .0123456789l;   .0123456789F;   .0123456789L;   .0123456789DL;
-	+.0123456789;  +.0123456789f;  +.0123456789l;  +.0123456789F;  +.0123456789L;  +.0123456789DL;
-	-.0123456789;  -.0123456789f;  -.0123456789l;  -.0123456789F;  -.0123456789L;  -.0123456789DL;
-
-	 .0123456789e09;   .0123456789e09f;   .0123456789e09l;   .0123456789e09F;   .0123456789e09L;   .0123456789e09DL;
-	+.0123456789e09;  +.0123456789e09f;  +.0123456789e09l;  +.0123456789e09F;  +.0123456789e09L;  +.0123456789e09DL;
-	-.0123456789e09;  -.0123456789e09f;  -.0123456789e09l;  -.0123456789e09F;  -.0123456789e09L;  -.0123456789e09DL;
-
-	 .0123456789E+09;   .0123456789E+09f;   .0123456789E+09l;   .0123456789E+09F;   .0123456789E+09L;   .0123456789E+09DL;
-	+.0123456789E+09;  +.0123456789E+09f;  +.0123456789E+09l;  +.0123456789E+09F;  +.0123456789E+09L;  +.0123456789E+09DL;
-	-.0123456789E+09;  -.0123456789E+09f;  -.0123456789E+09l;  -.0123456789E+09F;  -.0123456789E+09L;  -.0123456789E+09DL;
-
-	 .0123456789E-09;   .0123456789E-09f;   .0123456789E-09l;   .0123456789E-09F;   .0123456789E-09L;   .0123456789E-09DL;
-	-.0123456789E-09;  -.0123456789E-09f;  -.0123456789E-09l;  -.0123456789E-09F;  -.0123456789E-09L;  -.0123456789E-09DL;
-	-.0123456789E-09;  -.0123456789E-09f;  -.0123456789E-09l;  -.0123456789E-09F;  -.0123456789E-09L;  -.0123456789E-09DL;
-
-	 0123456789.0123456789;   0123456789.0123456789f;   0123456789.0123456789l;   0123456789.0123456789F;   0123456789.0123456789L;   0123456789.0123456789DL;
-	+0123456789.0123456789;  +0123456789.0123456789f;  +0123456789.0123456789l;  +0123456789.0123456789F;  +0123456789.0123456789L;  +0123456789.0123456789DL;
-	-0123456789.0123456789;  -0123456789.0123456789f;  -0123456789.0123456789l;  -0123456789.0123456789F;  -0123456789.0123456789L;  -0123456789.0123456789DL;
-
-	 0123456789.0123456789E09;   0123456789.0123456789E09f;   0123456789.0123456789E09l;   0123456789.0123456789E09F;   0123456789.0123456789E09L;   0123456789.0123456789E09DL;
-	+0123456789.0123456789E09;  +0123456789.0123456789E09f;  +0123456789.0123456789E09l;  +0123456789.0123456789E09F;  +0123456789.0123456789E09L;  +0123456789.0123456789E09DL;
-	-0123456789.0123456789E09;  -0123456789.0123456789E09f;  -0123456789.0123456789E09l;  -0123456789.0123456789E09F;  -0123456789.0123456789E09L;  -0123456789.0123456789E09DL;
-
-	 0123456789.0123456789E+09;   0123456789.0123456789E+09f;   0123456789.0123456789E+09l;   0123456789.0123456789E+09F;   0123456789.0123456789E+09L;   0123456789.0123456789E+09DL;
-	+0123456789.0123456789E+09;  +0123456789.0123456789E+09f;  +0123456789.0123456789E+09l;  +0123456789.0123456789E+09F;  +0123456789.0123456789E+09L;  +0123456789.0123456789E+09DL;
-	-0123456789.0123456789E+09;  -0123456789.0123456789E+09f;  -0123456789.0123456789E+09l;  -0123456789.0123456789E+09F;  -0123456789.0123456789E+09L;  -0123456789.0123456789E+09DL;
-
-	 0123456789.0123456789E-09;   0123456789.0123456789E-09f;   0123456789.0123456789E-09l;   0123456789.0123456789E-09F;   0123456789.0123456789E-09L;   0123456789.0123456789E-09DL;
-	+0123456789.0123456789E-09;  +0123456789.0123456789E-09f;  +0123456789.0123456789E-09l;  +0123456789.0123456789E-09F;  +0123456789.0123456789E-09L;  +0123456789.0123456789E-09DL;
-	-0123456789.0123456789E-09;  -0123456789.0123456789E-09f;  -0123456789.0123456789E-09l;  -0123456789.0123456789E-09F;  -0123456789.0123456789E-09L;  -0123456789.0123456789E-09DL;
-
-// hexadecimal floating literals, must have exponent
-
-	 0x0123456789.p09;   0x0123456789.p09f;   0x0123456789.p09l;   0x0123456789.p09F;   0x0123456789.p09L;
-	+0x0123456789.p09;  +0x0123456789.p09f;  +0x0123456789.p09l;  +0x0123456789.p09F;  +0x0123456789.p09L;
-	-0x0123456789.p09;  -0x0123456789.p09f;  -0x0123456789.p09l;  -0x0123456789.p09F;  -0x0123456789.p09L;
-
-	 0x0123456789.p+09;   0x0123456789.p+09f;   0x0123456789.p+09l;   0x0123456789.p+09F;   0x0123456789.p+09L;
-	+0x0123456789.p+09;  +0x0123456789.p+09f;  +0x0123456789.p+09l;  +0x0123456789.p+09F;  +0x0123456789.p+09L;
-	-0x0123456789.p+09;  -0x0123456789.p+09f;  -0x0123456789.p+09l;  -0x0123456789.p+09F;  -0x0123456789.p+09L;
-
-	 0x0123456789.p-09;   0x0123456789.p-09f;   0x0123456789.p-09l;   0x0123456789.p-09F;   0x0123456789.p-09L;
-	+0x0123456789.p-09;  +0x0123456789.p-09f;  +0x0123456789.p-09l;  +0x0123456789.p-09F;  +0x0123456789.p-09L;
-	-0x0123456789.p-09;  -0x0123456789.p-09f;  -0x0123456789.p-09l;  -0x0123456789.p-09F;  -0x0123456789.p-09L;
-
-	 0x.0123456789p09;   0x.0123456789p09f;   0x.0123456789p09l;   0x.0123456789p09F;   0x.0123456789p09L;
-	+0x.0123456789p09;  +0x.0123456789p09f;  +0x.0123456789p09l;  +0x.0123456789p09F;  +0x.0123456789p09L;
-	-0x.0123456789p09;  -0x.0123456789p09f;  -0x.0123456789p09l;  -0x.0123456789p09F;  -0x.0123456789p09L;
-
-	 0x.0123456789p+09;   0x.0123456789p+09f;   0x.0123456789p+09l;   0x.0123456789p+09F;   0x.0123456789p+09L;
-	+0x.0123456789p+09;  +0x.0123456789p+09f;  +0x.0123456789p+09l;  +0x.0123456789p+09F;  +0x.0123456789p+09L;
-	-0x.0123456789p+09;  -0x.0123456789p+09f;  -0x.0123456789p+09l;  -0x.0123456789p+09F;  -0x.0123456789p+09L;
-
-	 0x.0123456789P-09;   0x.0123456789P-09f;   0x.0123456789P-09l;   0x.0123456789P-09F;   0x.0123456789P-09L;
-	+0x.0123456789P-09;  +0x.0123456789P-09f;  +0x.0123456789P-09l;  +0x.0123456789P-09F;  +0x.0123456789P-09L;
-	-0x.0123456789P-09;  -0x.0123456789P-09f;  -0x.0123456789P-09l;  -0x.0123456789P-09F;  -0x.0123456789P-09L;
-
-	 0X0123456789.0123456789P09;   0X0123456789.0123456789P09f;   0X0123456789.0123456789P09l;   0X0123456789.0123456789P09F;   0X0123456789.0123456789P09L;
-	+0X0123456789.0123456789P09;  +0X0123456789.0123456789P09f;  +0X0123456789.0123456789P09l;  +0X0123456789.0123456789P09F;  +0X0123456789.0123456789P09L;
-	-0X0123456789.0123456789P09;  -0X0123456789.0123456789P09f;  -0X0123456789.0123456789P09l;  -0X0123456789.0123456789P09F;  -0X0123456789.0123456789P09L;
-
-	 0X0123456789.0123456789P+09;   0X0123456789.0123456789P+09f;   0X0123456789.0123456789P+09l;   0X0123456789.0123456789P+09F;   0X0123456789.0123456789P+09L;
-	+0X0123456789.0123456789P+09;  +0X0123456789.0123456789P+09f;  +0X0123456789.0123456789P+09l;  +0X0123456789.0123456789P+09F;  +0X0123456789.0123456789P+09L;
-	-0X0123456789.0123456789P+09;  -0X0123456789.0123456789P+09f;  -0X0123456789.0123456789P+09l;  -0X0123456789.0123456789P+09F;  -0X0123456789.0123456789P+09L;
-
-	 0X0123456789.0123456789P-09;   0X0123456789.0123456789P-09f;   0X0123456789.0123456789P-09l;   0X0123456789.0123456789P-09F;   0X0123456789.0123456789P-09L;
-	+0X0123456789.0123456789P-09;  +0X0123456789.0123456789P-09f;  +0X0123456789.0123456789P-09l;  +0X0123456789.0123456789P-09F;  +0X0123456789.0123456789P-09L;
-	-0X0123456789.0123456789P-09;  -0X0123456789.0123456789P-09f;  -0X0123456789.0123456789P-09l;  -0X0123456789.0123456789P-09F;  -0X0123456789.0123456789P-09L;
-
-#ifdef __CFA__
-// fixed-size length
-
-	// binary
-	 0b01101011_l8;   0b01101011_l16;   0b01101011_l32;   0b01101011_l64;   0b01101011_l8u;   0b01101011_ul16;   0b01101011_l32u;   0b01101011_ul64;
-	+0b01101011_l8;  +0b01101011_l16;  +0b01101011_l32;  +0b01101011_l64;  +0b01101011_l8u;  +0b01101011_ul16;  +0b01101011_l32u;  +0b01101011_ul64;
-	-0b01101011_l8;  -0b01101011_l16;  -0b01101011_l32;  -0b01101011_l64;  -0b01101011_l8u;  -0b01101011_ul16;  -0b01101011_l32u;  -0b01101011_ul64;
-
-#ifdef __LP64__ // 64-bit processor
-	0b01101011_l128;   0b01101011_ul128;
-	+0b01101011_l128;  +0b01101011_ul128;
-	-0b01101011_l128;  -0b01101011_ul128;
-#endif // __LP64__
-
-	// octal
-	 01234567_l8;   01234567_l16;   01234567_l32;   01234567_l64;   01234567_l8u;   01234567_ul16;   01234567_l32u;   01234567_ul64;
-	+01234567_l8;  +01234567_l16;  +01234567_l32;  +01234567_l64;  +01234567_l8u;  +01234567_ul16;  +01234567_l32u;  +01234567_ul64;
-	-01234567_l8;  -01234567_l16;  -01234567_l32;  -01234567_l64;  -01234567_l8u;  -01234567_ul16;  -01234567_l32u;  -01234567_ul64;
-
-#ifdef __LP64__ // 64-bit processor
-	01234567_l128;   01234567_ul128;
-	+01234567_l128;  +01234567_ul128;
-	-01234567_l128;  -01234567_ul128;
-#endif // __LP64__
-
-	// decimal
-	 1234567890L8;   1234567890L16;   1234567890l32;   1234567890l64;   1234567890UL8;   1234567890L16U;   1234567890Ul32;   1234567890l64u;
-	+1234567890L8;  +1234567890L16;  +1234567890l32;  +1234567890l64;  +1234567890UL8;  +1234567890L16U;  +1234567890Ul32;  +1234567890l64u;
-	-1234567890L8;  -1234567890L16;  -1234567890l32;  -1234567890l64;  -1234567890UL8;  -1234567890L16U;  -1234567890Ul32;  -1234567890l64u;
-
-#ifdef __LP64__ // 64-bit processor
-	1234567890l128;   1234567890l128u;
-	+1234567890l128;  +1234567890l128u;
-	-1234567890l128;  -1234567890l128u;
-#endif // __LP64__
-
-	// hexadecimal
-	 0x0123456789abcdef_l8;   0x0123456789abcdef_l16;   0x0123456789abcdefl32;   0x0123456789abcdefl64;   0x0123456789abcdef_ul8;   0x0123456789abcdef_l16u;   0x0123456789abcdeful32;   0x0123456789abcdefl64u;
-	+0x0123456789abcdef_l8;  +0x0123456789abcdef_l16;  +0x0123456789abcdefl32;  +0x0123456789abcdefl64;  +0x0123456789abcdef_ul8;  +0x0123456789abcdef_l16u;  +0x0123456789abcdeful32;  +0x0123456789abcdefl64u;
-	-0x0123456789abcdef_l8;  -0x0123456789abcdef_l16;  -0x0123456789abcdefl32;  -0x0123456789abcdefl64;  -0x0123456789abcdef_ul8;  -0x0123456789abcdef_l16u;  -0x0123456789abcdeful32;  -0x0123456789abcdefl64u;
-
-	 0x0123456789ABCDEF_l8;   0x0123456789ABCDEF_l16;   0x0123456789ABCDEFl32;   0x0123456789ABCDEFl64;   0x0123456789ABCDEF_ul8;   0x0123456789ABCDEF_l16u;   0x0123456789ABCDEFul32;   0x0123456789ABCDEFl64u;
-	+0x0123456789ABCDEF_l8;  +0x0123456789ABCDEF_l16;  +0x0123456789ABCDEFl32;  +0x0123456789ABCDEFl64;  +0x0123456789ABCDEF_ul8;  +0x0123456789ABCDEF_l16u;  +0x0123456789ABCDEFul32;  +0x0123456789ABCDEFl64u;
-	-0x0123456789ABCDEF_l8;  -0x0123456789ABCDEF_l16;  -0x0123456789ABCDEFl32;  -0x0123456789ABCDEFl64;  -0x0123456789ABCDEF_ul8;  -0x0123456789ABCDEF_l16u;  -0x0123456789ABCDEFul32;  -0x0123456789ABCDEFl64u;
-
-	 0X0123456789abcdef_l8;   0X0123456789abcdef_l16;   0X0123456789abcdefl32;   0X0123456789abcdefl64;   0X0123456789abcdef_ul8;   0X0123456789abcdef_l16u;   0X0123456789abcdeful32;   0X0123456789abcdefl64u;
-	+0X0123456789abcdef_l8;  +0X0123456789abcdef_l16;  +0X0123456789abcdefl32;  +0X0123456789abcdefl64;  +0X0123456789abcdef_ul8;  +0X0123456789abcdef_l16u;  +0X0123456789abcdeful32;  +0X0123456789abcdefl64u;
-	-0X0123456789abcdef_l8;  -0X0123456789abcdef_l16;  -0X0123456789abcdefl32;  -0X0123456789abcdefl64;  -0X0123456789abcdef_ul8;  -0X0123456789abcdef_l16u;  -0X0123456789abcdeful32;  -0X0123456789abcdefl64u;
-
-	 0X0123456789ABCDEF_l8;   0X0123456789ABCDEF_l16;   0X0123456789ABCDEFl32;   0X0123456789ABCDEFl64;   0X0123456789ABCDEF_ul8;   0X0123456789ABCDEF_l16u;   0X0123456789ABCDEFul32;   0X0123456789ABCDEFl64u;
-	+0X0123456789ABCDEF_l8;  +0X0123456789ABCDEF_l16;  +0X0123456789ABCDEFl32;  +0X0123456789ABCDEFl64;  +0X0123456789ABCDEF_ul8;  +0X0123456789ABCDEF_l16u;  +0X0123456789ABCDEFul32;  +0X0123456789ABCDEFl64u;
-	-0X0123456789ABCDEF_l8;  -0X0123456789ABCDEF_l16;  -0X0123456789ABCDEFl32;  -0X0123456789ABCDEFl64;  -0X0123456789ABCDEF_ul8;  -0X0123456789ABCDEF_l16u;  -0X0123456789ABCDEFul32;  -0X0123456789ABCDEFl64u;
-
-	// floating
-	 0123456789.l32;   0123456789.l64;   0123456789.l80;   0123456789.l128;
-	+0123456789.l32;  +0123456789.l64;  +0123456789.l80;  +0123456789.l128;
-	-0123456789.l32;  -0123456789.l64;  -0123456789.l80;  -0123456789.l128;
-
-	 0123456789.e09L32;    0123456789.e09L64;    0123456789.e09L80;    0123456789.e09L128;
-	+0123456789.e+09L32;  +0123456789.e+09L64;  +0123456789.e+09L80;  +0123456789.e+09L128;
-	-0123456789.e-09L32;  -0123456789.e-09L64;  -0123456789.e-09L80;  -0123456789.e-09L128;
-
-	 .0123456789e09L32;    .0123456789e09L64;    .0123456789e09L80;    .0123456789e09L128;
-	+.0123456789E+09L32;  +.0123456789E+09L64;  +.0123456789E+09L80;  +.0123456789E+09L128;
-	-.0123456789E-09L32;  -.0123456789E-09L64;  -.0123456789E-09L80;  -.0123456789E-09L128;
-
-	 0123456789.0123456789L32;       0123456789.0123456789L64;       0123456789.0123456789L80;       0123456789.0123456789L128;
-	+0123456789.0123456789E09L32;   +0123456789.0123456789E09L64;   +0123456789.0123456789E09L80;   +0123456789.0123456789E09L128;
-	-0123456789.0123456789E+09L32;  -0123456789.0123456789E+09L64;  -0123456789.0123456789E+09L80;  -0123456789.0123456789E+09L128;
-	 0123456789.0123456789E-09L32;   0123456789.0123456789E-09L64;   0123456789.0123456789E-09L80;   0123456789.0123456789E-09L128;
-
-	 0x0123456789.p09l32;   0x0123456789.p09l64;   0x0123456789.p09l80;   0x0123456789.p09l128;
-	+0x0123456789.p09l32;  +0x0123456789.p09l64;  +0x0123456789.p09l80;  +0x0123456789.p09l128;
-	-0x0123456789.p09l32;  -0x0123456789.p09l64;  -0x0123456789.p09l80;  -0x0123456789.p09l128;
-
-	 0x0123456789.p+09l32;   0x0123456789.p+09L64;   0x0123456789.p+09L80;   0x0123456789.p+09L128;
-	+0x0123456789.p-09l32;  +0x0123456789.p-09L64;  +0x0123456789.p-09L80;  +0x0123456789.p-09L128;
-	-0x.0123456789p09l32;   -0x.0123456789p09L64;   -0x.0123456789p09L80;   -0x.0123456789p09L128;
-
-// char, short, int suffix overloading
-
-	f( 'a' );
-	f( 20_hh );
-	f( 21_hhu );
-	f( 22_h );
-	f( 23_uh );
-	f( 24z );
-#endif // __CFA__
-
-// character literals
-
-	' ';  'a';  '"';  '_';
-	'\'';  '\"';  '\?';  '\\';							// simple escape
-	'\a';  '\b';  '\e'; /* GCC */  '\f';  '\n';  '\r';  '\t';  '\v';
-	'\0'; '\377';										// octal escape
-	'\xf';  '\xff';										// hex escape
-
-	u' ';  u'a';  u'"';  u'_';
-	U' ';  U'a';  U'"';  U'_';
-	L' ';  L'a';  L'"';  L'_';
-
-// warnings/errors
-
-#ifdef ERROR
-	'';													// empty character
-	'aa';												// multi-character
-	'a\na';												// multi-character, embedded escape
-	'a\0a';
-	'\xfff';											// hex escape out of range
-	'_\377_';											// multi-character
-	'_\xff_';
-	'\xffff';											// hex escape out of range
-	'a\xff34w';
-	'\xf_f';											// multi-character
-	'\xff_ff';
-#endif // ERROR
-
-// string literals
-
-	" ";  "a";  "'";  '_';  "abcdefghijklmnopqrstuvwxyz";
-	"";  "aa";  "a\na";  "a\0a";  "_\377_";  "_\xff_";  "\xf_f";
-	"\'";  "\"";  "\?";  "\\";							// simple escape
-	"\a";  "\b";  "\e"; /* GCC */  "\f";  "\n";  "\r";  "\t";  "\v";
-	"\0";  "\377";										// octal escape
-	"\xf";  "\xff";										// hex escape
-
-	u8" ";  u8"a";  u8"'";  u'_';  u8"abcdefghijklmnopqrstuvwxyz";
-	u" ";  u"a";  u"'";  u'_';  u"abcdefghijklmnopqrstuvwxyz";
-	U" ";  U"a";  U"'";  U'_';  U"abcdefghijklmnopqrstuvwxyz";
-	L" ";  L"a";  L"'";  L'_';  L"abcdefghijklmnopqrstuvwxyz";
-
-	"\xFF";  u"\xFFFF";  U"\xFFFFFFFF";  L"\xFFFFFFFF";	// maximum size
-
-	// concatenation
-
-	"\x12" "3";											// 2 characters not 1!
-
-	"a" "b" u8"c";
-	"a" u8"b" "c";
-	"a" u8"b" u8"c";
-	u8"a" "b" u8"c";
-	u8"a" u8"b" u8"c";
-
-	"a" "b" u"c";
-	"a" u"b" "c";
-	"a" u"b" u"c";
-	u"a" "b" u"c";
-	u"a" u"b" u"c";
-
-	"a" "b" U"c";
-	"a" U"b" "c";
-	"a" U"b" U"c";
-	U"a" "b" U"c";
-	U"a" U"b" U"c";
-
-	"a" "b" L"c";
-	"a" L"b" "c";
-	"a" L"b" L"c";
-	L"a" "b" L"c";
-	L"a" L"b" L"c";
-
-// warnings/errors
-
-#ifdef ERROR
-	"\xff_ff";
-	"\xfff";				// hex escape out of range
-	"a\xff34w";
-	"\xffff";
-#endif // ERROR
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa literals.c" //
-// End: //
Index: tests/literals.cfa
===================================================================
--- tests/literals.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/literals.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,327 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// literals.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Sat Sep  9 16:34:38 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:58:07 2018
+// Update Count     : 138
+//
+
+#ifdef __CFA__
+#include <stdint.h>
+#include <fstream.hfa>
+
+void f( char v ) { sout | "char " | v | endl; }
+void f( signed char v ) { sout | "signed char " | v | endl; }
+void f( unsigned char v ) { sout | "unsigned char " | v | endl; }
+void f( signed short v ) { sout | "signed short int" | v | endl; }
+void f( unsigned short v ) { sout | "unsigned short int" | v | endl; }
+void f( size_t v ) { sout | "size_t" | v | endl; }
+#endif // __CFA__
+
+//#define ERROR
+
+int main() {
+// integer literals
+
+	// binary
+	 0b01101011;   0b01101011u;   0b01101011l;   0b01101011ll;   0b01101011ul;   0b01101011lu;   0b01101011ull;   0b01101011llu;
+	+0b01101011;  +0b01101011u;  +0b01101011l;  +0b01101011ll;  +0b01101011ul;  +0b01101011lu;  +0b01101011ull;  +0b01101011llu;
+	-0b01101011;  -0b01101011u;  -0b01101011l;  -0b01101011ll;  -0b01101011ul;  -0b01101011lu;  -0b01101011ull;  -0b01101011llu;
+
+	// octal
+	 01234567;   01234567u;   01234567l;   01234567ll;   01234567ul;   01234567lu;   01234567ull;   01234567llu;
+	+01234567;  +01234567u;  +01234567l;  +01234567ll;  +01234567ul;  +01234567lu;  +01234567ull;  +01234567llu;
+	-01234567;  -01234567u;  -01234567l;  -01234567ll;  -01234567ul;  -01234567lu;  -01234567ull;  -01234567llu;
+
+	// decimal
+	 1234567890;   1234567890u;   1234567890l;   1234567890ll;   1234567890ul;   1234567890lu;   1234567890ull;   1234567890llu;
+	+1234567890;  +1234567890u;  +1234567890l;  +1234567890ll;  +1234567890ul;  +1234567890lu;  +1234567890ull;  +1234567890llu;
+	-1234567890;  -1234567890u;  -1234567890l;  -1234567890ll;  -1234567890ul;  -1234567890lu;  -1234567890ull;  -1234567890llu;
+
+	// hexadecimal
+	 0x0123456789abcdef;   0x0123456789abcdefu;   0x0123456789abcdefl;   0x0123456789abcdefll;   0x0123456789abcdeful;   0x0123456789abcdeflu;   0x0123456789abcdefull;   0x0123456789abcdefllu;
+	+0x0123456789abcdef;  +0x0123456789abcdefu;  +0x0123456789abcdefl;  +0x0123456789abcdefll;  +0x0123456789abcdeful;  +0x0123456789abcdeflu;  +0x0123456789abcdefull;  +0x0123456789abcdefllu;
+	-0x0123456789abcdef;  -0x0123456789abcdefu;  -0x0123456789abcdefl;  -0x0123456789abcdefll;  -0x0123456789abcdeful;  -0x0123456789abcdeflu;  -0x0123456789abcdefull;  -0x0123456789abcdefllu;
+
+	 0x0123456789ABCDEF;   0x0123456789ABCDEFu;   0x0123456789ABCDEFl;   0x0123456789ABCDEFll;   0x0123456789ABCDEFul;   0x0123456789ABCDEFlu;   0x0123456789ABCDEFull;   0x0123456789ABCDEFllu;
+	+0x0123456789ABCDEF;  +0x0123456789ABCDEFu;  +0x0123456789ABCDEFl;  +0x0123456789ABCDEFll;  +0x0123456789ABCDEFul;  +0x0123456789ABCDEFlu;  +0x0123456789ABCDEFull;  +0x0123456789ABCDEFllu;
+	-0x0123456789ABCDEF;  -0x0123456789ABCDEFu;  -0x0123456789ABCDEFl;  -0x0123456789ABCDEFll;  -0x0123456789ABCDEFul;  -0x0123456789ABCDEFlu;  -0x0123456789ABCDEFull;  -0x0123456789ABCDEFllu;
+
+	 0X0123456789abcdef;   0X0123456789abcdefu;   0X0123456789abcdefl;   0X0123456789abcdefll;   0X0123456789abcdeful;   0X0123456789abcdeflu;   0X0123456789abcdefull;   0X0123456789abcdefllu;
+	+0X0123456789abcdef;  +0X0123456789abcdefu;  +0X0123456789abcdefl;  +0X0123456789abcdefll;  +0X0123456789abcdeful;  +0X0123456789abcdeflu;  +0X0123456789abcdefull;  +0X0123456789abcdefllu;
+	-0X0123456789abcdef;  -0X0123456789abcdefu;  -0X0123456789abcdefl;  -0X0123456789abcdefll;  -0X0123456789abcdeful;  -0X0123456789abcdeflu;  -0X0123456789abcdefull;  -0X0123456789abcdefllu;
+
+	 0X0123456789ABCDEF;   0X0123456789ABCDEFu;   0X0123456789ABCDEFl;   0X0123456789ABCDEFll;   0X0123456789ABCDEFul;   0X0123456789ABCDEFlu;   0X0123456789ABCDEFull;   0X0123456789ABCDEFllu;
+	+0X0123456789ABCDEF;  +0X0123456789ABCDEFu;  +0X0123456789ABCDEFl;  +0X0123456789ABCDEFll;  +0X0123456789ABCDEFul;  +0X0123456789ABCDEFlu;  +0X0123456789ABCDEFull;  +0X0123456789ABCDEFllu;
+	-0X0123456789ABCDEF;  -0X0123456789ABCDEFu;  -0X0123456789ABCDEFl;  -0X0123456789ABCDEFll;  -0X0123456789ABCDEFul;  -0X0123456789ABCDEFlu;  -0X0123456789ABCDEFull;  -0X0123456789ABCDEFllu;
+
+// decimal floating literals
+
+	 0123456789.;   0123456789.f;   0123456789.l;   0123456789.F;   0123456789.L;   0123456789.DL;
+	+0123456789.;  +0123456789.f;  +0123456789.l;  +0123456789.F;  +0123456789.L;  +0123456789.DL;
+	-0123456789.;  -0123456789.f;  -0123456789.l;  -0123456789.F;  -0123456789.L;  -0123456789.DL;
+
+	 0123456789.e09;   0123456789.e09f;   0123456789.e09l;   0123456789.e09F;   0123456789.e09L;   0123456789.e09DL;
+	+0123456789.e09;  +0123456789.e09f;  +0123456789.e09l;  +0123456789.e09F;  +0123456789.e09L;  +0123456789.e09DL;
+	-0123456789.e09;  -0123456789.e09f;  -0123456789.e09l;  -0123456789.e09F;  -0123456789.e09L;  -0123456789.e09DL;
+
+	 0123456789.e+09;   0123456789.e+09f;   0123456789.e+09l;   0123456789.e+09F;   0123456789.e+09L;   0123456789.e+09DL;
+	+0123456789.e+09;  +0123456789.e+09f;  +0123456789.e+09l;  +0123456789.e+09F;  +0123456789.e+09L;  +0123456789.e+09DL;
+	-0123456789.e+09;  -0123456789.e+09f;  -0123456789.e+09l;  -0123456789.e+09F;  -0123456789.e+09L;  -0123456789.e+09DL;
+
+	 0123456789.e-09;   0123456789.e-09f;   0123456789.e-09l;   0123456789.e-09F;   0123456789.e-09L;   0123456789.e-09DL;
+	+0123456789.e-09;  +0123456789.e-09f;  +0123456789.e-09l;  +0123456789.e-09F;  +0123456789.e-09L;  +0123456789.e-09DL;
+	-0123456789.e-09;  -0123456789.e-09f;  -0123456789.e-09l;  -0123456789.e-09F;  -0123456789.e-09L;  -0123456789.e-09DL;
+
+	 .0123456789;   .0123456789f;   .0123456789l;   .0123456789F;   .0123456789L;   .0123456789DL;
+	+.0123456789;  +.0123456789f;  +.0123456789l;  +.0123456789F;  +.0123456789L;  +.0123456789DL;
+	-.0123456789;  -.0123456789f;  -.0123456789l;  -.0123456789F;  -.0123456789L;  -.0123456789DL;
+
+	 .0123456789e09;   .0123456789e09f;   .0123456789e09l;   .0123456789e09F;   .0123456789e09L;   .0123456789e09DL;
+	+.0123456789e09;  +.0123456789e09f;  +.0123456789e09l;  +.0123456789e09F;  +.0123456789e09L;  +.0123456789e09DL;
+	-.0123456789e09;  -.0123456789e09f;  -.0123456789e09l;  -.0123456789e09F;  -.0123456789e09L;  -.0123456789e09DL;
+
+	 .0123456789E+09;   .0123456789E+09f;   .0123456789E+09l;   .0123456789E+09F;   .0123456789E+09L;   .0123456789E+09DL;
+	+.0123456789E+09;  +.0123456789E+09f;  +.0123456789E+09l;  +.0123456789E+09F;  +.0123456789E+09L;  +.0123456789E+09DL;
+	-.0123456789E+09;  -.0123456789E+09f;  -.0123456789E+09l;  -.0123456789E+09F;  -.0123456789E+09L;  -.0123456789E+09DL;
+
+	 .0123456789E-09;   .0123456789E-09f;   .0123456789E-09l;   .0123456789E-09F;   .0123456789E-09L;   .0123456789E-09DL;
+	-.0123456789E-09;  -.0123456789E-09f;  -.0123456789E-09l;  -.0123456789E-09F;  -.0123456789E-09L;  -.0123456789E-09DL;
+	-.0123456789E-09;  -.0123456789E-09f;  -.0123456789E-09l;  -.0123456789E-09F;  -.0123456789E-09L;  -.0123456789E-09DL;
+
+	 0123456789.0123456789;   0123456789.0123456789f;   0123456789.0123456789l;   0123456789.0123456789F;   0123456789.0123456789L;   0123456789.0123456789DL;
+	+0123456789.0123456789;  +0123456789.0123456789f;  +0123456789.0123456789l;  +0123456789.0123456789F;  +0123456789.0123456789L;  +0123456789.0123456789DL;
+	-0123456789.0123456789;  -0123456789.0123456789f;  -0123456789.0123456789l;  -0123456789.0123456789F;  -0123456789.0123456789L;  -0123456789.0123456789DL;
+
+	 0123456789.0123456789E09;   0123456789.0123456789E09f;   0123456789.0123456789E09l;   0123456789.0123456789E09F;   0123456789.0123456789E09L;   0123456789.0123456789E09DL;
+	+0123456789.0123456789E09;  +0123456789.0123456789E09f;  +0123456789.0123456789E09l;  +0123456789.0123456789E09F;  +0123456789.0123456789E09L;  +0123456789.0123456789E09DL;
+	-0123456789.0123456789E09;  -0123456789.0123456789E09f;  -0123456789.0123456789E09l;  -0123456789.0123456789E09F;  -0123456789.0123456789E09L;  -0123456789.0123456789E09DL;
+
+	 0123456789.0123456789E+09;   0123456789.0123456789E+09f;   0123456789.0123456789E+09l;   0123456789.0123456789E+09F;   0123456789.0123456789E+09L;   0123456789.0123456789E+09DL;
+	+0123456789.0123456789E+09;  +0123456789.0123456789E+09f;  +0123456789.0123456789E+09l;  +0123456789.0123456789E+09F;  +0123456789.0123456789E+09L;  +0123456789.0123456789E+09DL;
+	-0123456789.0123456789E+09;  -0123456789.0123456789E+09f;  -0123456789.0123456789E+09l;  -0123456789.0123456789E+09F;  -0123456789.0123456789E+09L;  -0123456789.0123456789E+09DL;
+
+	 0123456789.0123456789E-09;   0123456789.0123456789E-09f;   0123456789.0123456789E-09l;   0123456789.0123456789E-09F;   0123456789.0123456789E-09L;   0123456789.0123456789E-09DL;
+	+0123456789.0123456789E-09;  +0123456789.0123456789E-09f;  +0123456789.0123456789E-09l;  +0123456789.0123456789E-09F;  +0123456789.0123456789E-09L;  +0123456789.0123456789E-09DL;
+	-0123456789.0123456789E-09;  -0123456789.0123456789E-09f;  -0123456789.0123456789E-09l;  -0123456789.0123456789E-09F;  -0123456789.0123456789E-09L;  -0123456789.0123456789E-09DL;
+
+// hexadecimal floating literals, must have exponent
+
+	 0x0123456789.p09;   0x0123456789.p09f;   0x0123456789.p09l;   0x0123456789.p09F;   0x0123456789.p09L;
+	+0x0123456789.p09;  +0x0123456789.p09f;  +0x0123456789.p09l;  +0x0123456789.p09F;  +0x0123456789.p09L;
+	-0x0123456789.p09;  -0x0123456789.p09f;  -0x0123456789.p09l;  -0x0123456789.p09F;  -0x0123456789.p09L;
+
+	 0x0123456789.p+09;   0x0123456789.p+09f;   0x0123456789.p+09l;   0x0123456789.p+09F;   0x0123456789.p+09L;
+	+0x0123456789.p+09;  +0x0123456789.p+09f;  +0x0123456789.p+09l;  +0x0123456789.p+09F;  +0x0123456789.p+09L;
+	-0x0123456789.p+09;  -0x0123456789.p+09f;  -0x0123456789.p+09l;  -0x0123456789.p+09F;  -0x0123456789.p+09L;
+
+	 0x0123456789.p-09;   0x0123456789.p-09f;   0x0123456789.p-09l;   0x0123456789.p-09F;   0x0123456789.p-09L;
+	+0x0123456789.p-09;  +0x0123456789.p-09f;  +0x0123456789.p-09l;  +0x0123456789.p-09F;  +0x0123456789.p-09L;
+	-0x0123456789.p-09;  -0x0123456789.p-09f;  -0x0123456789.p-09l;  -0x0123456789.p-09F;  -0x0123456789.p-09L;
+
+	 0x.0123456789p09;   0x.0123456789p09f;   0x.0123456789p09l;   0x.0123456789p09F;   0x.0123456789p09L;
+	+0x.0123456789p09;  +0x.0123456789p09f;  +0x.0123456789p09l;  +0x.0123456789p09F;  +0x.0123456789p09L;
+	-0x.0123456789p09;  -0x.0123456789p09f;  -0x.0123456789p09l;  -0x.0123456789p09F;  -0x.0123456789p09L;
+
+	 0x.0123456789p+09;   0x.0123456789p+09f;   0x.0123456789p+09l;   0x.0123456789p+09F;   0x.0123456789p+09L;
+	+0x.0123456789p+09;  +0x.0123456789p+09f;  +0x.0123456789p+09l;  +0x.0123456789p+09F;  +0x.0123456789p+09L;
+	-0x.0123456789p+09;  -0x.0123456789p+09f;  -0x.0123456789p+09l;  -0x.0123456789p+09F;  -0x.0123456789p+09L;
+
+	 0x.0123456789P-09;   0x.0123456789P-09f;   0x.0123456789P-09l;   0x.0123456789P-09F;   0x.0123456789P-09L;
+	+0x.0123456789P-09;  +0x.0123456789P-09f;  +0x.0123456789P-09l;  +0x.0123456789P-09F;  +0x.0123456789P-09L;
+	-0x.0123456789P-09;  -0x.0123456789P-09f;  -0x.0123456789P-09l;  -0x.0123456789P-09F;  -0x.0123456789P-09L;
+
+	 0X0123456789.0123456789P09;   0X0123456789.0123456789P09f;   0X0123456789.0123456789P09l;   0X0123456789.0123456789P09F;   0X0123456789.0123456789P09L;
+	+0X0123456789.0123456789P09;  +0X0123456789.0123456789P09f;  +0X0123456789.0123456789P09l;  +0X0123456789.0123456789P09F;  +0X0123456789.0123456789P09L;
+	-0X0123456789.0123456789P09;  -0X0123456789.0123456789P09f;  -0X0123456789.0123456789P09l;  -0X0123456789.0123456789P09F;  -0X0123456789.0123456789P09L;
+
+	 0X0123456789.0123456789P+09;   0X0123456789.0123456789P+09f;   0X0123456789.0123456789P+09l;   0X0123456789.0123456789P+09F;   0X0123456789.0123456789P+09L;
+	+0X0123456789.0123456789P+09;  +0X0123456789.0123456789P+09f;  +0X0123456789.0123456789P+09l;  +0X0123456789.0123456789P+09F;  +0X0123456789.0123456789P+09L;
+	-0X0123456789.0123456789P+09;  -0X0123456789.0123456789P+09f;  -0X0123456789.0123456789P+09l;  -0X0123456789.0123456789P+09F;  -0X0123456789.0123456789P+09L;
+
+	 0X0123456789.0123456789P-09;   0X0123456789.0123456789P-09f;   0X0123456789.0123456789P-09l;   0X0123456789.0123456789P-09F;   0X0123456789.0123456789P-09L;
+	+0X0123456789.0123456789P-09;  +0X0123456789.0123456789P-09f;  +0X0123456789.0123456789P-09l;  +0X0123456789.0123456789P-09F;  +0X0123456789.0123456789P-09L;
+	-0X0123456789.0123456789P-09;  -0X0123456789.0123456789P-09f;  -0X0123456789.0123456789P-09l;  -0X0123456789.0123456789P-09F;  -0X0123456789.0123456789P-09L;
+
+#ifdef __CFA__
+// fixed-size length
+
+	// binary
+	 0b01101011_l8;   0b01101011_l16;   0b01101011_l32;   0b01101011_l64;   0b01101011_l8u;   0b01101011_ul16;   0b01101011_l32u;   0b01101011_ul64;
+	+0b01101011_l8;  +0b01101011_l16;  +0b01101011_l32;  +0b01101011_l64;  +0b01101011_l8u;  +0b01101011_ul16;  +0b01101011_l32u;  +0b01101011_ul64;
+	-0b01101011_l8;  -0b01101011_l16;  -0b01101011_l32;  -0b01101011_l64;  -0b01101011_l8u;  -0b01101011_ul16;  -0b01101011_l32u;  -0b01101011_ul64;
+
+#ifdef __LP64__ // 64-bit processor
+	0b01101011_l128;   0b01101011_ul128;
+	+0b01101011_l128;  +0b01101011_ul128;
+	-0b01101011_l128;  -0b01101011_ul128;
+#endif // __LP64__
+
+	// octal
+	 01234567_l8;   01234567_l16;   01234567_l32;   01234567_l64;   01234567_l8u;   01234567_ul16;   01234567_l32u;   01234567_ul64;
+	+01234567_l8;  +01234567_l16;  +01234567_l32;  +01234567_l64;  +01234567_l8u;  +01234567_ul16;  +01234567_l32u;  +01234567_ul64;
+	-01234567_l8;  -01234567_l16;  -01234567_l32;  -01234567_l64;  -01234567_l8u;  -01234567_ul16;  -01234567_l32u;  -01234567_ul64;
+
+#ifdef __LP64__ // 64-bit processor
+	01234567_l128;   01234567_ul128;
+	+01234567_l128;  +01234567_ul128;
+	-01234567_l128;  -01234567_ul128;
+#endif // __LP64__
+
+	// decimal
+	 1234567890L8;   1234567890L16;   1234567890l32;   1234567890l64;   1234567890UL8;   1234567890L16U;   1234567890Ul32;   1234567890l64u;
+	+1234567890L8;  +1234567890L16;  +1234567890l32;  +1234567890l64;  +1234567890UL8;  +1234567890L16U;  +1234567890Ul32;  +1234567890l64u;
+	-1234567890L8;  -1234567890L16;  -1234567890l32;  -1234567890l64;  -1234567890UL8;  -1234567890L16U;  -1234567890Ul32;  -1234567890l64u;
+
+#ifdef __LP64__ // 64-bit processor
+	1234567890l128;   1234567890l128u;
+	+1234567890l128;  +1234567890l128u;
+	-1234567890l128;  -1234567890l128u;
+#endif // __LP64__
+
+	// hexadecimal
+	 0x0123456789abcdef_l8;   0x0123456789abcdef_l16;   0x0123456789abcdefl32;   0x0123456789abcdefl64;   0x0123456789abcdef_ul8;   0x0123456789abcdef_l16u;   0x0123456789abcdeful32;   0x0123456789abcdefl64u;
+	+0x0123456789abcdef_l8;  +0x0123456789abcdef_l16;  +0x0123456789abcdefl32;  +0x0123456789abcdefl64;  +0x0123456789abcdef_ul8;  +0x0123456789abcdef_l16u;  +0x0123456789abcdeful32;  +0x0123456789abcdefl64u;
+	-0x0123456789abcdef_l8;  -0x0123456789abcdef_l16;  -0x0123456789abcdefl32;  -0x0123456789abcdefl64;  -0x0123456789abcdef_ul8;  -0x0123456789abcdef_l16u;  -0x0123456789abcdeful32;  -0x0123456789abcdefl64u;
+
+	 0x0123456789ABCDEF_l8;   0x0123456789ABCDEF_l16;   0x0123456789ABCDEFl32;   0x0123456789ABCDEFl64;   0x0123456789ABCDEF_ul8;   0x0123456789ABCDEF_l16u;   0x0123456789ABCDEFul32;   0x0123456789ABCDEFl64u;
+	+0x0123456789ABCDEF_l8;  +0x0123456789ABCDEF_l16;  +0x0123456789ABCDEFl32;  +0x0123456789ABCDEFl64;  +0x0123456789ABCDEF_ul8;  +0x0123456789ABCDEF_l16u;  +0x0123456789ABCDEFul32;  +0x0123456789ABCDEFl64u;
+	-0x0123456789ABCDEF_l8;  -0x0123456789ABCDEF_l16;  -0x0123456789ABCDEFl32;  -0x0123456789ABCDEFl64;  -0x0123456789ABCDEF_ul8;  -0x0123456789ABCDEF_l16u;  -0x0123456789ABCDEFul32;  -0x0123456789ABCDEFl64u;
+
+	 0X0123456789abcdef_l8;   0X0123456789abcdef_l16;   0X0123456789abcdefl32;   0X0123456789abcdefl64;   0X0123456789abcdef_ul8;   0X0123456789abcdef_l16u;   0X0123456789abcdeful32;   0X0123456789abcdefl64u;
+	+0X0123456789abcdef_l8;  +0X0123456789abcdef_l16;  +0X0123456789abcdefl32;  +0X0123456789abcdefl64;  +0X0123456789abcdef_ul8;  +0X0123456789abcdef_l16u;  +0X0123456789abcdeful32;  +0X0123456789abcdefl64u;
+	-0X0123456789abcdef_l8;  -0X0123456789abcdef_l16;  -0X0123456789abcdefl32;  -0X0123456789abcdefl64;  -0X0123456789abcdef_ul8;  -0X0123456789abcdef_l16u;  -0X0123456789abcdeful32;  -0X0123456789abcdefl64u;
+
+	 0X0123456789ABCDEF_l8;   0X0123456789ABCDEF_l16;   0X0123456789ABCDEFl32;   0X0123456789ABCDEFl64;   0X0123456789ABCDEF_ul8;   0X0123456789ABCDEF_l16u;   0X0123456789ABCDEFul32;   0X0123456789ABCDEFl64u;
+	+0X0123456789ABCDEF_l8;  +0X0123456789ABCDEF_l16;  +0X0123456789ABCDEFl32;  +0X0123456789ABCDEFl64;  +0X0123456789ABCDEF_ul8;  +0X0123456789ABCDEF_l16u;  +0X0123456789ABCDEFul32;  +0X0123456789ABCDEFl64u;
+	-0X0123456789ABCDEF_l8;  -0X0123456789ABCDEF_l16;  -0X0123456789ABCDEFl32;  -0X0123456789ABCDEFl64;  -0X0123456789ABCDEF_ul8;  -0X0123456789ABCDEF_l16u;  -0X0123456789ABCDEFul32;  -0X0123456789ABCDEFl64u;
+
+	// floating
+	 0123456789.l32;   0123456789.l64;   0123456789.l80;   0123456789.l128;
+	+0123456789.l32;  +0123456789.l64;  +0123456789.l80;  +0123456789.l128;
+	-0123456789.l32;  -0123456789.l64;  -0123456789.l80;  -0123456789.l128;
+
+	 0123456789.e09L32;    0123456789.e09L64;    0123456789.e09L80;    0123456789.e09L128;
+	+0123456789.e+09L32;  +0123456789.e+09L64;  +0123456789.e+09L80;  +0123456789.e+09L128;
+	-0123456789.e-09L32;  -0123456789.e-09L64;  -0123456789.e-09L80;  -0123456789.e-09L128;
+
+	 .0123456789e09L32;    .0123456789e09L64;    .0123456789e09L80;    .0123456789e09L128;
+	+.0123456789E+09L32;  +.0123456789E+09L64;  +.0123456789E+09L80;  +.0123456789E+09L128;
+	-.0123456789E-09L32;  -.0123456789E-09L64;  -.0123456789E-09L80;  -.0123456789E-09L128;
+
+	 0123456789.0123456789L32;       0123456789.0123456789L64;       0123456789.0123456789L80;       0123456789.0123456789L128;
+	+0123456789.0123456789E09L32;   +0123456789.0123456789E09L64;   +0123456789.0123456789E09L80;   +0123456789.0123456789E09L128;
+	-0123456789.0123456789E+09L32;  -0123456789.0123456789E+09L64;  -0123456789.0123456789E+09L80;  -0123456789.0123456789E+09L128;
+	 0123456789.0123456789E-09L32;   0123456789.0123456789E-09L64;   0123456789.0123456789E-09L80;   0123456789.0123456789E-09L128;
+
+	 0x0123456789.p09l32;   0x0123456789.p09l64;   0x0123456789.p09l80;   0x0123456789.p09l128;
+	+0x0123456789.p09l32;  +0x0123456789.p09l64;  +0x0123456789.p09l80;  +0x0123456789.p09l128;
+	-0x0123456789.p09l32;  -0x0123456789.p09l64;  -0x0123456789.p09l80;  -0x0123456789.p09l128;
+
+	 0x0123456789.p+09l32;   0x0123456789.p+09L64;   0x0123456789.p+09L80;   0x0123456789.p+09L128;
+	+0x0123456789.p-09l32;  +0x0123456789.p-09L64;  +0x0123456789.p-09L80;  +0x0123456789.p-09L128;
+	-0x.0123456789p09l32;   -0x.0123456789p09L64;   -0x.0123456789p09L80;   -0x.0123456789p09L128;
+
+// char, short, int suffix overloading
+
+	f( 'a' );
+	f( 20_hh );
+	f( 21_hhu );
+	f( 22_h );
+	f( 23_uh );
+	f( 24z );
+#endif // __CFA__
+
+// character literals
+
+	' ';  'a';  '"';  '_';
+	'\'';  '\"';  '\?';  '\\';							// simple escape
+	'\a';  '\b';  '\e'; /* GCC */  '\f';  '\n';  '\r';  '\t';  '\v';
+	'\0'; '\377';										// octal escape
+	'\xf';  '\xff';										// hex escape
+
+	u' ';  u'a';  u'"';  u'_';
+	U' ';  U'a';  U'"';  U'_';
+	L' ';  L'a';  L'"';  L'_';
+
+// warnings/errors
+
+#ifdef ERROR
+	'';													// empty character
+	'aa';												// multi-character
+	'a\na';												// multi-character, embedded escape
+	'a\0a';
+	'\xfff';											// hex escape out of range
+	'_\377_';											// multi-character
+	'_\xff_';
+	'\xffff';											// hex escape out of range
+	'a\xff34w';
+	'\xf_f';											// multi-character
+	'\xff_ff';
+#endif // ERROR
+
+// string literals
+
+	" ";  "a";  "'";  '_';  "abcdefghijklmnopqrstuvwxyz";
+	"";  "aa";  "a\na";  "a\0a";  "_\377_";  "_\xff_";  "\xf_f";
+	"\'";  "\"";  "\?";  "\\";							// simple escape
+	"\a";  "\b";  "\e"; /* GCC */  "\f";  "\n";  "\r";  "\t";  "\v";
+	"\0";  "\377";										// octal escape
+	"\xf";  "\xff";										// hex escape
+
+	u8" ";  u8"a";  u8"'";  u'_';  u8"abcdefghijklmnopqrstuvwxyz";
+	u" ";  u"a";  u"'";  u'_';  u"abcdefghijklmnopqrstuvwxyz";
+	U" ";  U"a";  U"'";  U'_';  U"abcdefghijklmnopqrstuvwxyz";
+	L" ";  L"a";  L"'";  L'_';  L"abcdefghijklmnopqrstuvwxyz";
+
+	"\xFF";  u"\xFFFF";  U"\xFFFFFFFF";  L"\xFFFFFFFF";	// maximum size
+
+	// concatenation
+
+	"\x12" "3";											// 2 characters not 1!
+
+	"a" "b" u8"c";
+	"a" u8"b" "c";
+	"a" u8"b" u8"c";
+	u8"a" "b" u8"c";
+	u8"a" u8"b" u8"c";
+
+	"a" "b" u"c";
+	"a" u"b" "c";
+	"a" u"b" u"c";
+	u"a" "b" u"c";
+	u"a" u"b" u"c";
+
+	"a" "b" U"c";
+	"a" U"b" "c";
+	"a" U"b" U"c";
+	U"a" "b" U"c";
+	U"a" U"b" U"c";
+
+	"a" "b" L"c";
+	"a" L"b" "c";
+	"a" L"b" L"c";
+	L"a" "b" L"c";
+	L"a" L"b" L"c";
+
+// warnings/errors
+
+#ifdef ERROR
+	"\xff_ff";
+	"\xfff";				// hex escape out of range
+	"a\xff34w";
+	"\xffff";
+#endif // ERROR
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa literals.cfa" //
+// End: //
Index: sts/long_tests.h
===================================================================
--- tests/long_tests.h	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,21 +1,0 @@
-#pragma once
-
-#include <unistd.h>
-
-#if   defined(TEST_FOREVER)
-
-static unsigned long long __kick_count = 0;
-#if !defined(__kick_rate)
-#define __kick_rate 5000ul
-#endif
-
-#define TEST(x) 1
-#define KICK_WATCHDOG do { __kick_count++; if(__kick_count > __kick_rate) { write(STDOUT_FILENO, ".", 1); __kick_count = 0; } } while(0)
-
-
-#else
-
-#define TEST(x) x
-#define KICK_WATCHDOG
-
-#endif
Index: tests/long_tests.hfa
===================================================================
--- tests/long_tests.hfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/long_tests.hfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,21 @@
+#pragma once
+
+#include <unistd.h>
+
+#if   defined(TEST_FOREVER)
+
+static unsigned long long __kick_count = 0;
+#if !defined(__kick_rate)
+#define __kick_rate 5000ul
+#endif
+
+#define TEST(x) 1
+#define KICK_WATCHDOG do { __kick_count++; if(__kick_count > __kick_rate) { write(STDOUT_FILENO, ".", 1); __kick_count = 0; } } while(0)
+
+
+#else
+
+#define TEST(x) x
+#define KICK_WATCHDOG
+
+#endif
Index: sts/loopctrl.c
===================================================================
--- tests/loopctrl.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,79 +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.
-// 
-// 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 Nov  1 23:11:23 2018
-// Update Count     : 46
-// 
-
-#include <fstream.hfa>
-
-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; }
-int ?<?( S t1, S t2 ) { return t1.i < t2.i && t1.j < t2.j; }
-int ?<=?( S t1, S t2 ) { return t1.i <= t2.i && t1.j <= t2.j; }
-int ?>?( S t1, S t2 ) { return 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.i += t2.i; t1.j += t2.j; return t1; }
-S ?+=?( S & t, one_t ) { t.i += 1; t.j += 1; return t; }
-S ?-=?( S & t1, S t2 ) { t1.i -= t2.i; t1.j -= t2.j; return t1; }
-S ?-=?( S & t, one_t ) { t.i -= 1; t.j -= 1; return t; }
-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 | endl;
-
-	for ( 0 ) { sout | "A"; }					sout | "zero" | endl;
-	for ( 1 ) { sout | "A"; }					sout | endl;
-	for ( 10 ) { sout | "A"; }					sout | endl;
-
-	for ( 1 ~= 10 ~ 2 ) { sout | "B"; }			sout | endl;
-	for ( 10 -~= 1 ~ 2 ) { sout | "C"; }		sout | endl;
-	for ( 0.5 ~ 5.5 ) { sout | "D"; }			sout | endl;
-	for ( 5.5 -~ 0.5 ) { sout | "E"; }			sout | endl | endl;
-
-	for ( i; 10 ) { sout | i; }					sout | endl;
-	for ( i; 1 ~= 10 ~ 2 ) { sout | i; }		sout | endl;
-	for ( i; 10 -~= 1 ~ 2 ) { sout | i; }		sout | endl;
-	for ( i; 0.5 ~ 5.5 ) { sout | i; }			sout | endl;
-	for ( i; 5.5 -~ 0.5 ) { sout | i; }			sout | endl;
-
-	for ( ui; 2u ~= 10u ~ 2u ) { sout | ui; }	sout | endl;
-	for ( ui; 10u -~= 2u ~ 2u ) { sout | ui; }	sout | endl | endl | endl;
-
-	int start = 3, comp = 10, inc = 2;
-	for ( i; start ~ comp ~ inc + 1 ) { sout | i; } sout | endl;
-
-	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;
-	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;
-	for ( s; (S){0} ~= (S){10,10} ) { sout | s; } sout | endl;
-	for ( s; (S){0} ~= (S){10,10} ~ (S){1} ) { sout | s; } sout | endl;
-	sout | endl;
-	for ( s; (S){10,10} -~ (S){0} ) { sout | s; } sout | endl;
-	for ( s; (S){10,10} -~ (S){0} ~ (S){1} ) { sout | s; } sout | endl;
-	for ( s; (S){10,10} -~= (S){0} ) { sout | s; } sout | endl;
-	for ( s; (S){10,10} -~= (S){0} ~ (S){1} ) { sout | s; } sout | endl;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa loopctrl.c" //
-// End: //
Index: tests/loopctrl.cfa
===================================================================
--- tests/loopctrl.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/loopctrl.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,79 @@
+// 
+// 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.
+// 
+// loopctrl.cfa -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Wed Aug  8 18:32:59 2018
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:58:25 2018
+// Update Count     : 52
+// 
+
+#include <fstream.hfa>
+
+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; }
+int ?<?( S t1, S t2 ) { return t1.i < t2.i && t1.j < t2.j; }
+int ?<=?( S t1, S t2 ) { return t1.i <= t2.i && t1.j <= t2.j; }
+int ?>?( S t1, S t2 ) { return 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.i += t2.i; t1.j += t2.j; return t1; }
+S ?+=?( S & t, one_t ) { t.i += 1; t.j += 1; return t; }
+S ?-=?( S & t1, S t2 ) { t1.i -= t2.i; t1.j -= t2.j; return t1; }
+S ?-=?( S & t, one_t ) { t.i -= 1; t.j -= 1; return t; }
+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 | endl;
+
+	for ( 0 ) { sout | "A"; }					sout | "zero" | endl;
+	for ( 1 ) { sout | "A"; }					sout | endl;
+	for ( 10 ) { sout | "A"; }					sout | endl;
+
+	for ( 1 ~= 10 ~ 2 ) { sout | "B"; }			sout | endl;
+	for ( 10 -~= 1 ~ 2 ) { sout | "C"; }		sout | endl;
+	for ( 0.5 ~ 5.5 ) { sout | "D"; }			sout | endl;
+	for ( 5.5 -~ 0.5 ) { sout | "E"; }			sout | endl | endl;
+
+	for ( i; 10 ) { sout | i; }					sout | endl;
+	for ( i; 1 ~= 10 ~ 2 ) { sout | i; }		sout | endl;
+	for ( i; 10 -~= 1 ~ 2 ) { sout | i; }		sout | endl;
+	for ( i; 0.5 ~ 5.5 ) { sout | i; }			sout | endl;
+	for ( i; 5.5 -~ 0.5 ) { sout | i; }			sout | endl;
+
+	for ( ui; 2u ~= 10u ~ 2u ) { sout | ui; }	sout | endl;
+	for ( ui; 10u -~= 2u ~ 2u ) { sout | ui; }	sout | endl | endl | endl;
+
+	const int start = 3, comp = 10, inc = 2;
+	for ( i; start ~ comp ~ inc + 1 ) { sout | i; } sout | endl;
+
+	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;
+	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;
+	for ( s; (S){0} ~= (S){10,10} ) { sout | s; } sout | endl;
+	for ( s; (S){0} ~= (S){10,10} ~ (S){1} ) { sout | s; } sout | endl;
+	sout | endl;
+	for ( s; (S){10,10} -~ (S){0} ) { sout | s; } sout | endl;
+	for ( s; (S){10,10} -~ (S){0} ~ (S){1} ) { sout | s; } sout | endl;
+	for ( s; (S){10,10} -~= (S){0} ) { sout | s; } sout | endl;
+	for ( s; (S){10,10} -~= (S){0} ~ (S){1} ) { sout | s; } sout | endl;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa loopctrl.cfa" //
+// End: //
Index: sts/math1.c
===================================================================
--- tests/math1.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,55 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// math1.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Fri Apr 22 14:59:21 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu May 24 21:01:15 2018
-// Update Count     : 85
-//
-
-#include <fstream.hfa>
-#include <math.hfa>
-
-int main( void ) {
-	float f;
-	double d;
-	long double l;
-
-	sout | "fmod:" | 5.0F % -2.0F | fmod( 5.0F, -2.0F ) | 5.0D % -2.0D | fmod( 5.0D, -2.0D ) | 5.0L % -2.0L | fmod( 5.0L, -2.0L ) | endl;
-	sout | "remainder:" | remainder( 2.0F, 3.0F ) | remainder( 2.0D, 3.0D ) | remainder( 2.0L, 3.0L ) | endl;
-	int quot;
-	f = remquo( 3.6F, 0.5F, &quot );
-	sout | "remquo:" | quot | f;
-	d = remquo( 3.6D, 0.5F, &quot );
-	sout | quot | d;
-	l = remquo( 3.6L, 0.5L, &quot );
-	sout | quot | l | endl;
-	sout | "div:" | div( 3.6F, 0.5F ) | div( 3.6D, 0.5D ) | div( 3.6L, 0.5L ) | endl;
-	sout | "fma:" | fma( 3.0F, -1.0F, 1.0F ) | fma( 3.0D, -1.0D, 1.0D ) | fma( 3.0L, -1.0L, , 1.0L ) | endl;
-	sout | "fdim:" | fdim( 1.0F, -1.0F ) | fdim( 1.0D, -1.0D ) | fdim( 1.0L, -1.0L ) | endl;
-	sout | "nan:" | (float)nan( "" ) | (double)nan( "" ) | (long double)nan( "" ) | endl;
-
-	//---------------------- Exponential ----------------------
-
-	sout | "exp:" | exp( 1.0F ) | exp( 1.0D ) | exp( 1.0L ) | exp( 1.0F+1.0FI ) | exp( 1.0D+1.0DI ) | exp( 1.0DL+1.0LI ) | endl;
-	sout | "exp2:" | exp2( 1.0F ) | exp2( 1.0D ) | exp2( 1.0L ) | endl;
-	sout | "expm1:" | expm1( 1.0F ) | expm1( 1.0D ) | expm1( 1.0L ) | endl;
-	sout | "pow:" | pow( 1.0F, 1.0F ) | pow( 1.0D, 1.0D ) | pow( 1.0L, 1.0L ) | pow( 1.0F+1.0FI, 1.0F+1.0FI ) | pow( 1.0D+1.0DI, 1.0D+1.0DI ) | pow( 1.5DL+1.5LI, 1.5DL+1.5LI ) | endl;
-
-	int b = 4;
-	unsigned int e = 2;
-    b \= e;
-    sout | "\\" | b | b \ e | endl;
-    sout | "\\" | 'a' \ 3u | 2 \ 8u | 4 \ 3u | -4 \ 3u | 4 \ -3 | -4 \ -3 | 4.0 \ 2.1 | (1.0f+2.0fi) \ (3.0f+2.0fi) | endl;
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa math1.c" //
-// End: //
Index: tests/math1.cfa
===================================================================
--- tests/math1.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/math1.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,55 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// math1.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Fri Apr 22 14:59:21 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:58:37 2018
+// Update Count     : 86
+//
+
+#include <fstream.hfa>
+#include <math.hfa>
+
+int main( void ) {
+	float f;
+	double d;
+	long double l;
+
+	sout | "fmod:" | 5.0F % -2.0F | fmod( 5.0F, -2.0F ) | 5.0D % -2.0D | fmod( 5.0D, -2.0D ) | 5.0L % -2.0L | fmod( 5.0L, -2.0L ) | endl;
+	sout | "remainder:" | remainder( 2.0F, 3.0F ) | remainder( 2.0D, 3.0D ) | remainder( 2.0L, 3.0L ) | endl;
+	int quot;
+	f = remquo( 3.6F, 0.5F, &quot );
+	sout | "remquo:" | quot | f;
+	d = remquo( 3.6D, 0.5F, &quot );
+	sout | quot | d;
+	l = remquo( 3.6L, 0.5L, &quot );
+	sout | quot | l | endl;
+	sout | "div:" | div( 3.6F, 0.5F ) | div( 3.6D, 0.5D ) | div( 3.6L, 0.5L ) | endl;
+	sout | "fma:" | fma( 3.0F, -1.0F, 1.0F ) | fma( 3.0D, -1.0D, 1.0D ) | fma( 3.0L, -1.0L, , 1.0L ) | endl;
+	sout | "fdim:" | fdim( 1.0F, -1.0F ) | fdim( 1.0D, -1.0D ) | fdim( 1.0L, -1.0L ) | endl;
+	sout | "nan:" | (float)nan( "" ) | (double)nan( "" ) | (long double)nan( "" ) | endl;
+
+	//---------------------- Exponential ----------------------
+
+	sout | "exp:" | exp( 1.0F ) | exp( 1.0D ) | exp( 1.0L ) | exp( 1.0F+1.0FI ) | exp( 1.0D+1.0DI ) | exp( 1.0DL+1.0LI ) | endl;
+	sout | "exp2:" | exp2( 1.0F ) | exp2( 1.0D ) | exp2( 1.0L ) | endl;
+	sout | "expm1:" | expm1( 1.0F ) | expm1( 1.0D ) | expm1( 1.0L ) | endl;
+	sout | "pow:" | pow( 1.0F, 1.0F ) | pow( 1.0D, 1.0D ) | pow( 1.0L, 1.0L ) | pow( 1.0F+1.0FI, 1.0F+1.0FI ) | pow( 1.0D+1.0DI, 1.0D+1.0DI ) | pow( 1.5DL+1.5LI, 1.5DL+1.5LI ) | endl;
+
+	int b = 4;
+	unsigned int e = 2;
+    b \= e;
+    sout | "\\" | b | b \ e | endl;
+    sout | "\\" | 'a' \ 3u | 2 \ 8u | 4 \ 3u | -4 \ 3u | 4 \ -3 | -4 \ -3 | 4.0 \ 2.1 | (1.0f+2.0fi) \ (3.0f+2.0fi) | endl;
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa math1.cfa" //
+// End: //
Index: sts/math2.c
===================================================================
--- tests/math2.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,52 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// math2.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Fri Apr 22 14:59:21 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu May 24 21:06:10 2018
-// Update Count     : 82
-//
-
-#include <fstream.hfa>
-#include <math.hfa>
-
-int main( void ) {
-	float f;
-	double d;
-	long double l;
-
-	//---------------------- Logarithm ----------------------
-
-	sout | "log:" | log( 1.0F ) | log( 1.0D ) | log( 1.0L ) | log( 1.0F+1.0FI ) | log( 1.0D+1.0DI ) | log( 1.0DL+1.0LI ) | endl;
-	sout | "log2:" | log2( 8.0F ) | log2( 8.0D ) | log2( 8.0L ) | endl;
-	sout | "log10:" | log10( 100.0F ) | log10( 100.0D ) | log10( 100.0L ) | endl;
-	sout | "log1p:" | log1p( 1.0F ) | log1p( 1.0D ) | log1p( 1.0L ) | endl;
-	sout | "ilogb:" | ilogb( 1.0F ) | ilogb( 1.0D ) | ilogb( 1.0L ) | endl;
-	sout | "logb:" | logb( 8.0F ) | logb( 8.0D ) | logb( 8.0L ) | endl;
-
-	sout | "sqrt:" | sqrt( 1.0F ) | sqrt( 1.0D ) | sqrt( 1.0L ) | sqrt( 1.0F+1.0FI ) | sqrt( 1.0D+1.0DI ) | sqrt( 1.0DL+1.0LI ) | endl;
-	sout | "cbrt:" | cbrt( 27.0F ) | cbrt( 27.0D ) | cbrt( 27.0L ) | endl;
-	sout | "hypot:" | hypot( 1.0F, -1.0F ) | hypot( 1.0D, -1.0D ) | hypot( 1.0L, -1.0L ) | endl;
-
-	//---------------------- Trigonometric ----------------------
-
-	sout | "sin:" | sin( 1.0F ) | sin( 1.0D ) | sin( 1.0L ) | sin( 1.0F+1.0FI ) | sin( 1.0D+1.0DI ) | sin( 1.0DL+1.0LI ) | endl;
-	sout | "cos:" | cos( 1.0F ) | cos( 1.0D ) | cos( 1.0L ) | cos( 1.0F+1.0FI ) | cos( 1.0D+1.0DI ) | cos( 1.0DL+1.0LI ) | endl;
-	sout | "tan:" | tan( 1.0F ) | tan( 1.0D ) | tan( 1.0L ) | tan( 1.0F+1.0FI ) | tan( 1.0D+1.0DI ) | tan( 1.0DL+1.0LI ) | endl;
-	sout | "asin:" | asin( 1.0F ) | asin( 1.0D ) | asin( 1.0L ) | asin( 1.0F+1.0FI ) | asin( 1.0D+1.0DI ) | asin( 1.0DL+1.0LI ) | endl;
-	sout | "acos:" | acos( 1.0F ) | acos( 1.0D ) | acos( 1.0L ) | acos( 1.0F+1.0FI ) | acos( 1.0D+1.0DI ) | acos( 1.0DL+1.0LI ) | endl;
-	sout | "atan:" | atan( 1.0F ) | atan( 1.0D ) | atan( 1.0L ) | atan( 1.0F+1.0FI ) | atan( 1.0D+1.0DI ) | atan( 1.0DL+1.0LI ) | endl;
-	sout | "atan2:" | atan2( 1.0F, 1.0F ) | atan2( 1.0D, 1.0D ) | atan2( 1.0L, 1.0L );
-	sout | "atan:" | atan( 1.0F, 1.0F ) | atan( 1.0D, 1.0D ) | atan( 1.0L, 1.0L ) | endl;
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa math2.c" //
-// End: //
Index: tests/math2.cfa
===================================================================
--- tests/math2.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/math2.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,52 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// math2.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Fri Apr 22 14:59:21 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:58:55 2018
+// Update Count     : 83
+//
+
+#include <fstream.hfa>
+#include <math.hfa>
+
+int main( void ) {
+	float f;
+	double d;
+	long double l;
+
+	//---------------------- Logarithm ----------------------
+
+	sout | "log:" | log( 1.0F ) | log( 1.0D ) | log( 1.0L ) | log( 1.0F+1.0FI ) | log( 1.0D+1.0DI ) | log( 1.0DL+1.0LI ) | endl;
+	sout | "log2:" | log2( 8.0F ) | log2( 8.0D ) | log2( 8.0L ) | endl;
+	sout | "log10:" | log10( 100.0F ) | log10( 100.0D ) | log10( 100.0L ) | endl;
+	sout | "log1p:" | log1p( 1.0F ) | log1p( 1.0D ) | log1p( 1.0L ) | endl;
+	sout | "ilogb:" | ilogb( 1.0F ) | ilogb( 1.0D ) | ilogb( 1.0L ) | endl;
+	sout | "logb:" | logb( 8.0F ) | logb( 8.0D ) | logb( 8.0L ) | endl;
+
+	sout | "sqrt:" | sqrt( 1.0F ) | sqrt( 1.0D ) | sqrt( 1.0L ) | sqrt( 1.0F+1.0FI ) | sqrt( 1.0D+1.0DI ) | sqrt( 1.0DL+1.0LI ) | endl;
+	sout | "cbrt:" | cbrt( 27.0F ) | cbrt( 27.0D ) | cbrt( 27.0L ) | endl;
+	sout | "hypot:" | hypot( 1.0F, -1.0F ) | hypot( 1.0D, -1.0D ) | hypot( 1.0L, -1.0L ) | endl;
+
+	//---------------------- Trigonometric ----------------------
+
+	sout | "sin:" | sin( 1.0F ) | sin( 1.0D ) | sin( 1.0L ) | sin( 1.0F+1.0FI ) | sin( 1.0D+1.0DI ) | sin( 1.0DL+1.0LI ) | endl;
+	sout | "cos:" | cos( 1.0F ) | cos( 1.0D ) | cos( 1.0L ) | cos( 1.0F+1.0FI ) | cos( 1.0D+1.0DI ) | cos( 1.0DL+1.0LI ) | endl;
+	sout | "tan:" | tan( 1.0F ) | tan( 1.0D ) | tan( 1.0L ) | tan( 1.0F+1.0FI ) | tan( 1.0D+1.0DI ) | tan( 1.0DL+1.0LI ) | endl;
+	sout | "asin:" | asin( 1.0F ) | asin( 1.0D ) | asin( 1.0L ) | asin( 1.0F+1.0FI ) | asin( 1.0D+1.0DI ) | asin( 1.0DL+1.0LI ) | endl;
+	sout | "acos:" | acos( 1.0F ) | acos( 1.0D ) | acos( 1.0L ) | acos( 1.0F+1.0FI ) | acos( 1.0D+1.0DI ) | acos( 1.0DL+1.0LI ) | endl;
+	sout | "atan:" | atan( 1.0F ) | atan( 1.0D ) | atan( 1.0L ) | atan( 1.0F+1.0FI ) | atan( 1.0D+1.0DI ) | atan( 1.0DL+1.0LI ) | endl;
+	sout | "atan2:" | atan2( 1.0F, 1.0F ) | atan2( 1.0D, 1.0D ) | atan2( 1.0L, 1.0L );
+	sout | "atan:" | atan( 1.0F, 1.0F ) | atan( 1.0D, 1.0D ) | atan( 1.0L, 1.0L ) | endl;
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa math2.cfa" //
+// End: //
Index: sts/math3.c
===================================================================
--- tests/math3.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,51 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// math3.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Fri Apr 22 14:59:21 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu May 24 21:06:12 2018
-// Update Count     : 82
-//
-
-#include <fstream.hfa>
-#include <math.hfa>
-
-int main( void ) {
-	float f;
-	double d;
-	long double l;
-
-	//---------------------- Hyperbolic ----------------------
-
-	sout | "sinh:" | sinh( 1.0F ) | sinh( 1.0D ) | sinh( 1.0L ) | sinh( 1.0F+1.0FI ) | sinh( 1.0D+1.0DI ) | sinh( 1.0DL+1.0LI ) | endl;
-	sout | "cosh:" | cosh( 1.0F ) | cosh( 1.0D ) | cosh( 1.0L ) | cosh( 1.0F+1.0FI ) | cosh( 1.0D+1.0DI ) | cosh( 1.0DL+1.0LI ) | endl;
-	sout | "tanh:" | tanh( 1.0F ) | tanh( 1.0D ) | tanh( 1.0L ) | tanh( 1.0F+1.0FI ) | tanh( 1.0D+1.0DI ) | tanh( 1.0DL+1.0LI ) | endl;
-	sout | "acosh:" | acosh( 1.0F ) | acosh( 1.0D ) | acosh( 1.0L ) | acosh( 1.0F+1.0FI ) | acosh( 1.0D+1.0DI ) | acosh( 1.0DL+1.0LI ) | endl;
-	sout | "asinh:" | asinh( 1.0F ) | asinh( 1.0D ) | asinh( 1.0L ) | asinh( 1.0F+1.0FI ) | asinh( 1.0D+1.0DI ) | asinh( 1.0DL+1.0LI ) | endl;
-	sout | "atanh:" | atanh( 1.0F ) | atanh( 1.0D ) | atanh( 1.0L ) | atanh( 1.0F+1.0FI ) | atanh( 1.0D+1.0DI ) | atanh( 1.0DL+1.0LI ) | endl;
-
-	//---------------------- Error / Gamma ----------------------
-
-	sout | "erf:" | erf( 1.0F ) | erf( 1.0D ) | erf( 1.0L ) | endl;
-	sout | "erfc:" | erfc( 1.0F ) | erfc( 1.0D ) | erfc( 1.0L ) | endl;
-	sout | "lgamma:" | lgamma( 4.0F ) | lgamma( 4.0D ) | lgamma( 4.0L ) | endl;
-	int sign;
-	f = lgamma( 4.0F, &sign );
-	sout | "lgamma:" | f | sign;
-	d = lgamma( 4.0D, &sign );
-	sout | d | sign;
-	l = lgamma( 4.0L, &sign );
-	sout | l | sign | endl;
-	sout | "tgamma:" | tgamma( 4.0F ) | tgamma( 4.0D ) | tgamma( 4.0L ) | endl;
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa math3.c" //
-// End: //
Index: tests/math3.cfa
===================================================================
--- tests/math3.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/math3.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,51 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// math3.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Fri Apr 22 14:59:21 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:59:05 2018
+// Update Count     : 83
+//
+
+#include <fstream.hfa>
+#include <math.hfa>
+
+int main( void ) {
+	float f;
+	double d;
+	long double l;
+
+	//---------------------- Hyperbolic ----------------------
+
+	sout | "sinh:" | sinh( 1.0F ) | sinh( 1.0D ) | sinh( 1.0L ) | sinh( 1.0F+1.0FI ) | sinh( 1.0D+1.0DI ) | sinh( 1.0DL+1.0LI ) | endl;
+	sout | "cosh:" | cosh( 1.0F ) | cosh( 1.0D ) | cosh( 1.0L ) | cosh( 1.0F+1.0FI ) | cosh( 1.0D+1.0DI ) | cosh( 1.0DL+1.0LI ) | endl;
+	sout | "tanh:" | tanh( 1.0F ) | tanh( 1.0D ) | tanh( 1.0L ) | tanh( 1.0F+1.0FI ) | tanh( 1.0D+1.0DI ) | tanh( 1.0DL+1.0LI ) | endl;
+	sout | "acosh:" | acosh( 1.0F ) | acosh( 1.0D ) | acosh( 1.0L ) | acosh( 1.0F+1.0FI ) | acosh( 1.0D+1.0DI ) | acosh( 1.0DL+1.0LI ) | endl;
+	sout | "asinh:" | asinh( 1.0F ) | asinh( 1.0D ) | asinh( 1.0L ) | asinh( 1.0F+1.0FI ) | asinh( 1.0D+1.0DI ) | asinh( 1.0DL+1.0LI ) | endl;
+	sout | "atanh:" | atanh( 1.0F ) | atanh( 1.0D ) | atanh( 1.0L ) | atanh( 1.0F+1.0FI ) | atanh( 1.0D+1.0DI ) | atanh( 1.0DL+1.0LI ) | endl;
+
+	//---------------------- Error / Gamma ----------------------
+
+	sout | "erf:" | erf( 1.0F ) | erf( 1.0D ) | erf( 1.0L ) | endl;
+	sout | "erfc:" | erfc( 1.0F ) | erfc( 1.0D ) | erfc( 1.0L ) | endl;
+	sout | "lgamma:" | lgamma( 4.0F ) | lgamma( 4.0D ) | lgamma( 4.0L ) | endl;
+	int sign;
+	f = lgamma( 4.0F, &sign );
+	sout | "lgamma:" | f | sign;
+	d = lgamma( 4.0D, &sign );
+	sout | d | sign;
+	l = lgamma( 4.0L, &sign );
+	sout | l | sign | endl;
+	sout | "tgamma:" | tgamma( 4.0F ) | tgamma( 4.0D ) | tgamma( 4.0L ) | endl;
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa math3.cfa" //
+// End: //
Index: sts/math4.c
===================================================================
--- tests/math4.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,72 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// math4.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Thu May 24 20:56:54 2018
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu May 24 20:58:06 2018
-// Update Count     : 2
-//
-
-#include <fstream.hfa>
-#include <math.hfa>
-
-int main( void ) {
-	float f;
-	double d;
-	long double l;
-
-	//---------------------- Nearest Integer ----------------------
-
-	sout | "floor:" | floor( 1.2F ) | floor( 1.2D ) | floor( 1.2L ) | endl;
-	sout | "ceil:" | ceil( 1.6F ) | ceil( 1.6D ) | ceil( 1.6L ) | endl;
-	sout | "trunc:" | trunc( 3.5F ) | trunc( 3.5D ) | trunc( 3.5L ) | endl;
-	sout | "rint:" | (float)rint( 1.5F ) | (double)rint( 1.5D ) | (long double)rint( 1.5L ) | endl;
-	sout | "rint:" | (long int)rint( 1.5F ) | (long int)rint( 1.5D ) | (long int)rint( 1.5L ) | endl;
-	sout | "rint:" | (long long int)rint( 1.5F ) | (long long int)rint( 1.5D ) | (long long int)rint( 1.5L ) | endl;
-	sout | "lrint:" | lrint( 1.5F ) | lrint( 1.5D ) | lrint( 1.5L ) | endl;
-	sout | "llrint:" | llrint( 1.5F ) | llrint( 1.5D ) | llrint( 1.5L ) | endl;
-	sout | "nearbyint:" | nearbyint( 3.5F ) | nearbyint( 3.5D ) | nearbyint( 3.5L ) | endl;
-	sout | "round:" | (float)round( 1.5F ) | (double)round( 1.5D ) | (long double)round( 1.5L ) | endl;
-	sout | "round:" | (long int)round( 1.5F ) | (long int)round( 1.5D ) | (long int)round( 1.5L ) | endl;
-	sout | "round:" | (long long int)round( 1.5F ) | (long long int)round( 1.5D ) | (long long int)round( 1.5L ) | endl;
-	sout | "lround:" | lround( 1.5F ) | lround( 1.5D ) | lround( 1.5L ) | endl;
-	sout | "llround:" | llround( 1.5F ) | llround( 1.5D ) | llround( 1.5L ) | endl;
-
-	//---------------------- Manipulation ----------------------
-
-	sout | "copysign:" | copysign( 1.0F, -1.0F ) | copysign( 1.0D, -1.0D ) | copysign( 1.0L, -1.0L ) | endl;
-	int exp;
-	f = frexp( 4.0F, &exp );
-	sout | "frexp:" | f | exp;
-	d = frexp( 4.0D, &exp );
-	sout | d | exp;
-	l = frexp( 4.0L, &exp );
-	sout | l | exp | endl;
-	sout | "ldexp:" | ldexp( 2.0F, 2 ) | ldexp( 2.0D, 2 ) | ldexp( 2.0L, 2 ) | endl;
-	float fi;
-	double di;
-	long double ldi;
-	f = modf( 2.3F, &fi );
-	sout | "modf:" | fi | f;
-	d = modf( 2.3D, &di );
-	sout | di | d;
-	l = modf( 2.3L, &ldi );
-	sout | ldi | l | endl;
-	sout | "modf:" | modf( 2.3F ) | modf( 2.3D ) | modf( 2.3L ) | endl;
-	sout | "nextafter:" | nextafter( 2.0F, 3.0F ) | nextafter( 2.0D, 3.0D ) | nextafter( 2.0L, 3.0L ) | endl;
-	sout | "nexttoward:" | nexttoward( 2.0F, 3.0F ) | nexttoward( 2.0D, 3.0D ) | nexttoward( 2.0L, 3.0L ) | endl;
-
-	sout | "scalbn:" | scalbn( 2.0F, 3 ) | scalbn( 2.0D, 3 ) | scalbn( 2.0L, 3 ) | endl;
-	sout | "scalbln:" | scalbln( 2.0F, 3L ) | scalbln( 2.0D, 3L ) | scalbln( 2.0L, 3L ) | endl;
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa math3.c" //
-// End: //
Index: tests/math4.cfa
===================================================================
--- tests/math4.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/math4.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,72 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// math4.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Thu May 24 20:56:54 2018
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:59:14 2018
+// Update Count     : 3
+//
+
+#include <fstream.hfa>
+#include <math.hfa>
+
+int main( void ) {
+	float f;
+	double d;
+	long double l;
+
+	//---------------------- Nearest Integer ----------------------
+
+	sout | "floor:" | floor( 1.2F ) | floor( 1.2D ) | floor( 1.2L ) | endl;
+	sout | "ceil:" | ceil( 1.6F ) | ceil( 1.6D ) | ceil( 1.6L ) | endl;
+	sout | "trunc:" | trunc( 3.5F ) | trunc( 3.5D ) | trunc( 3.5L ) | endl;
+	sout | "rint:" | (float)rint( 1.5F ) | (double)rint( 1.5D ) | (long double)rint( 1.5L ) | endl;
+	sout | "rint:" | (long int)rint( 1.5F ) | (long int)rint( 1.5D ) | (long int)rint( 1.5L ) | endl;
+	sout | "rint:" | (long long int)rint( 1.5F ) | (long long int)rint( 1.5D ) | (long long int)rint( 1.5L ) | endl;
+	sout | "lrint:" | lrint( 1.5F ) | lrint( 1.5D ) | lrint( 1.5L ) | endl;
+	sout | "llrint:" | llrint( 1.5F ) | llrint( 1.5D ) | llrint( 1.5L ) | endl;
+	sout | "nearbyint:" | nearbyint( 3.5F ) | nearbyint( 3.5D ) | nearbyint( 3.5L ) | endl;
+	sout | "round:" | (float)round( 1.5F ) | (double)round( 1.5D ) | (long double)round( 1.5L ) | endl;
+	sout | "round:" | (long int)round( 1.5F ) | (long int)round( 1.5D ) | (long int)round( 1.5L ) | endl;
+	sout | "round:" | (long long int)round( 1.5F ) | (long long int)round( 1.5D ) | (long long int)round( 1.5L ) | endl;
+	sout | "lround:" | lround( 1.5F ) | lround( 1.5D ) | lround( 1.5L ) | endl;
+	sout | "llround:" | llround( 1.5F ) | llround( 1.5D ) | llround( 1.5L ) | endl;
+
+	//---------------------- Manipulation ----------------------
+
+	sout | "copysign:" | copysign( 1.0F, -1.0F ) | copysign( 1.0D, -1.0D ) | copysign( 1.0L, -1.0L ) | endl;
+	int exp;
+	f = frexp( 4.0F, &exp );
+	sout | "frexp:" | f | exp;
+	d = frexp( 4.0D, &exp );
+	sout | d | exp;
+	l = frexp( 4.0L, &exp );
+	sout | l | exp | endl;
+	sout | "ldexp:" | ldexp( 2.0F, 2 ) | ldexp( 2.0D, 2 ) | ldexp( 2.0L, 2 ) | endl;
+	float fi;
+	double di;
+	long double ldi;
+	f = modf( 2.3F, &fi );
+	sout | "modf:" | fi | f;
+	d = modf( 2.3D, &di );
+	sout | di | d;
+	l = modf( 2.3L, &ldi );
+	sout | ldi | l | endl;
+	sout | "modf:" | modf( 2.3F ) | modf( 2.3D ) | modf( 2.3L ) | endl;
+	sout | "nextafter:" | nextafter( 2.0F, 3.0F ) | nextafter( 2.0D, 3.0D ) | nextafter( 2.0L, 3.0L ) | endl;
+	sout | "nexttoward:" | nexttoward( 2.0F, 3.0F ) | nexttoward( 2.0D, 3.0D ) | nexttoward( 2.0L, 3.0L ) | endl;
+
+	sout | "scalbn:" | scalbn( 2.0F, 3 ) | scalbn( 2.0D, 3 ) | scalbn( 2.0L, 3 ) | endl;
+	sout | "scalbln:" | scalbln( 2.0F, 3L ) | scalbln( 2.0D, 3L ) | scalbln( 2.0L, 3L ) | endl;
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa math3.cfa" //
+// End: //
Index: sts/maybe.c
===================================================================
--- tests/maybe.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,67 +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.
-//
-// maybe.c --
-//
-// Author           : Andrew Beach
-// Created On       : Thr May 25 16:02:00 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 20 15:24:07 2017
-// Update Count     : 1
-//
-
-#include <assert.h>
-#include <containers/maybe.hfa>
-
-void checkPredicates() {
-	maybe(int) filled = 4;
-	assert(filled);
-	assert(has_value(&filled));
-
-	maybe(int) empty = {};
-	assert(empty ? false : true);
-	assert(!has_value(&empty));
-}
-
-void checkGetter() {
-	maybe(int) a = 94;
-	assert(94 == get(&a));
-}
-
-/* Waiting on bug#11 to be fixed.
-void checkNamedConstructors() {
-	maybe(char) letter = maybe_value('a');
-	assert(has_value(&letter));
-	assert('a' == get(&letter));
-
-	maybe(char) rune = maybe_none();
-	assert(!has_value(&rune));
-}
-*/
-
-void checkSetters() {
-	maybe(int) fee = 3;
-	assert(3 == get(&fee));
-	set(&fee, 7);
-	assert(7 == get(&fee));
-	set_none(&fee);
-	assert(!has_value(&fee));
-
-	maybe(int) fy = 4;
-	maybe(int) foe = 8;
-	maybe(int) fum = {};
-	fy = foe;
-	assert(8 == get(&fy));
-	fy = fum;
-	assert(!has_value(&fy));
-}
-
-int main(int argc, char * argv[]) {
-	checkPredicates();
-	checkGetter();
-	//checkNamedConstructors();
-	checkSetters();
-}
Index: tests/maybe.cfa
===================================================================
--- tests/maybe.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/maybe.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,67 @@
+//
+// 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.
+//
+// maybe.c --
+//
+// Author           : Andrew Beach
+// Created On       : Thr May 25 16:02:00 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu Jul 20 15:24:07 2017
+// Update Count     : 1
+//
+
+#include <assert.h>
+#include <containers/maybe.hfa>
+
+void checkPredicates() {
+	maybe(int) filled = 4;
+	assert(filled);
+	assert(has_value(&filled));
+
+	maybe(int) empty = {};
+	assert(empty ? false : true);
+	assert(!has_value(&empty));
+}
+
+void checkGetter() {
+	maybe(int) a = 94;
+	assert(94 == get(&a));
+}
+
+/* Waiting on bug#11 to be fixed.
+void checkNamedConstructors() {
+	maybe(char) letter = maybe_value('a');
+	assert(has_value(&letter));
+	assert('a' == get(&letter));
+
+	maybe(char) rune = maybe_none();
+	assert(!has_value(&rune));
+}
+*/
+
+void checkSetters() {
+	maybe(int) fee = 3;
+	assert(3 == get(&fee));
+	set(&fee, 7);
+	assert(7 == get(&fee));
+	set_none(&fee);
+	assert(!has_value(&fee));
+
+	maybe(int) fy = 4;
+	maybe(int) foe = 8;
+	maybe(int) fum = {};
+	fy = foe;
+	assert(8 == get(&fy));
+	fy = fum;
+	assert(!has_value(&fy));
+}
+
+int main(int argc, char * argv[]) {
+	checkPredicates();
+	checkGetter();
+	//checkNamedConstructors();
+	checkSetters();
+}
Index: sts/minmax.c
===================================================================
--- tests/minmax.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,52 +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.
-//
-// minmax.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Wed May 27 17:56:53 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Apr 10 17:29:09 2018
-// Update Count     : 50
-//
-
-#include <fstream.hfa>
-#include <stdlib.hfa>										// min, max
-
-int main( void ) {
-	// char does not have less or greater than.
-	int ?<?( char op1, char op2 ) { return (int)op1 < (int)op2; }
-	int ?>?( char op1, char op2 ) { return (int)op1 > (int)op2; }
-
-	sout | "char\t\t\t"					| 'z' | ' ' | 'a' | "\tmin " | min( 'z', 'a' ) | endl;
-	sout | "signed int\t\t"				| 4 | 3 | "\tmin" | min( 4, 3 ) | endl;
-	sout | "unsigned int\t\t"			| 4u | 3u | "\tmin" | min( 4u, 3u ) | endl;
-	sout | "signed long int\t\t" 		| 4l | 3l | "\tmin" | min( 4l, 3l ) | endl;
-	sout | "unsigned long int\t" 		| 4ul | 3ul | "\tmin" | min( 4ul, 3ul ) | endl;
-	sout | "signed long long int\t"		| 4ll | 3ll | "\tmin" | min( 4ll, 3ll ) | endl;
-	sout | "unsigned long long int\t"	| 4ull | 3ull | "\tmin" | min( 4ull, 3ull ) | endl;
-	sout | "float\t\t\t" 				| 4.0f | 3.1f | "\tmin" | min( 4.0f, 3.1f ) | endl;
-	sout | "double\t\t\t"				| 4.0 | 3.1 | "\tmin" | min( 4.0, 3.1 ) | endl;
-	sout | "long double\t\t"			| 4.0l | 3.1l | "\tmin" | min( 4.0l, 3.1l ) | endl;
-
-	sout | endl;
-
-	sout | "char\t\t\t"					| 'z' | ' ' | 'a' | "\tmax " | max( 'z', 'a' ) | endl;
-	sout | "signed int\t\t"				| 4 | 3 | "\tmax" | max( 4, 3 ) | endl;
-	sout | "unsigned int\t\t"			| 4u | 3u | "\tmax" | max( 4u, 3u ) | endl;
-	sout | "signed long int\t\t" 		| 4l | 3l | "\tmax" | max( 4l, 3l ) | endl;
-	sout | "unsigned long int\t" 		| 4ul | 3ul | "\tmax" | max( 4ul, 3ul ) | endl;
-	sout | "signed long long int\t"		| 4ll | 3ll | "\tmax" | max( 4ll, 3ll ) | endl;
-	sout | "unsigned long long int\t"	| 4ull | 3ull | "\tmax" | max( 4ull, 3ull ) | endl;
-	sout | "float\t\t\t" 				| 4.0f | 3.1f | "\tmax" | max( 4.0f, 3.1f ) | endl;
-	sout | "double\t\t\t"				| 4.0 | 3.1 | "\tmax" | max( 4.0, 3.1 ) | endl;
-	sout | "long double\t\t"			| 4.0l | 3.1l | "\tmax" | max( 4.0l, 3.1l ) | endl;
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa minmax.c" //
-// End: //
Index: tests/minmax.cfa
===================================================================
--- tests/minmax.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/minmax.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,52 @@
+//
+// 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.
+//
+// minmax.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Wed May 27 17:56:53 2015
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:59:26 2018
+// Update Count     : 51
+//
+
+#include <fstream.hfa>
+#include <stdlib.hfa>										// min, max
+
+int main( void ) {
+	// char does not have less or greater than.
+	int ?<?( char op1, char op2 ) { return (int)op1 < (int)op2; }
+	int ?>?( char op1, char op2 ) { return (int)op1 > (int)op2; }
+
+	sout | "char\t\t\t"					| 'z' | ' ' | 'a' | "\tmin " | min( 'z', 'a' ) | endl;
+	sout | "signed int\t\t"				| 4 | 3 | "\tmin" | min( 4, 3 ) | endl;
+	sout | "unsigned int\t\t"			| 4u | 3u | "\tmin" | min( 4u, 3u ) | endl;
+	sout | "signed long int\t\t" 		| 4l | 3l | "\tmin" | min( 4l, 3l ) | endl;
+	sout | "unsigned long int\t" 		| 4ul | 3ul | "\tmin" | min( 4ul, 3ul ) | endl;
+	sout | "signed long long int\t"		| 4ll | 3ll | "\tmin" | min( 4ll, 3ll ) | endl;
+	sout | "unsigned long long int\t"	| 4ull | 3ull | "\tmin" | min( 4ull, 3ull ) | endl;
+	sout | "float\t\t\t" 				| 4.0f | 3.1f | "\tmin" | min( 4.0f, 3.1f ) | endl;
+	sout | "double\t\t\t"				| 4.0 | 3.1 | "\tmin" | min( 4.0, 3.1 ) | endl;
+	sout | "long double\t\t"			| 4.0l | 3.1l | "\tmin" | min( 4.0l, 3.1l ) | endl;
+
+	sout | endl;
+
+	sout | "char\t\t\t"					| 'z' | ' ' | 'a' | "\tmax " | max( 'z', 'a' ) | endl;
+	sout | "signed int\t\t"				| 4 | 3 | "\tmax" | max( 4, 3 ) | endl;
+	sout | "unsigned int\t\t"			| 4u | 3u | "\tmax" | max( 4u, 3u ) | endl;
+	sout | "signed long int\t\t" 		| 4l | 3l | "\tmax" | max( 4l, 3l ) | endl;
+	sout | "unsigned long int\t" 		| 4ul | 3ul | "\tmax" | max( 4ul, 3ul ) | endl;
+	sout | "signed long long int\t"		| 4ll | 3ll | "\tmax" | max( 4ll, 3ll ) | endl;
+	sout | "unsigned long long int\t"	| 4ull | 3ull | "\tmax" | max( 4ull, 3ull ) | endl;
+	sout | "float\t\t\t" 				| 4.0f | 3.1f | "\tmax" | max( 4.0f, 3.1f ) | endl;
+	sout | "double\t\t\t"				| 4.0 | 3.1 | "\tmax" | max( 4.0, 3.1 ) | endl;
+	sout | "long double\t\t"			| 4.0l | 3.1l | "\tmax" | max( 4.0l, 3.1l ) | endl;
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa minmax.cfa" //
+// End: //
Index: sts/namedParmArg.c
===================================================================
--- tests/namedParmArg.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,14 +1,0 @@
-int f1( int i = 3, int *j = 0 ) {}  /* ANSI */
-[int, int ] f2( int i = 3, * int j = 0 ) {}  /* CFA */
-
-int main() {
-    f1();		/* identical calls */
-    f1( 3 );
-    f1( 3, );
-    f1( 3, 0 );
-    f1( 3, j : 0 );
-    f1( j : 0, 3 );
-    f1( i : 3, j : 0 );
-    f1( j : 0, i : 3 );
-    f1( [j, i] : f2() );
-}
Index: tests/namedParmArg.cfa
===================================================================
--- tests/namedParmArg.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/namedParmArg.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,14 @@
+int f1( int i = 3, int *j = 0 ) {}  /* ANSI */
+[int, int ] f2( int i = 3, * int j = 0 ) {}  /* CFA */
+
+int main() {
+    f1();		/* identical calls */
+    f1( 3 );
+    f1( 3, );
+    f1( 3, 0 );
+    f1( 3, j : 0 );
+    f1( j : 0, 3 );
+    f1( i : 3, j : 0 );
+    f1( j : 0, i : 3 );
+    f1( [j, i] : f2() );
+}
Index: sts/nested-types.c
===================================================================
--- tests/nested-types.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,91 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// nested-types.c --
-//
-// Author           : Rob Schluntz
-// Created On       : Mon Jul 9 10:20:03 2018
-// Last Modified By : Rob Schluntz
-// Last Modified On : Mon Jul 9 10:20:03 2017
-// Update Count     : 1
-//
-
-typedef int N;
-struct A {
-  forall(otype T)
-  struct N {
-    T x;
-  };
-};
-
-struct S {
-  struct T {
-    int i;
-    typedef int Bar;
-  };
-  T x;
-
-  // struct U;
-  typedef T Bar;
-  typedef int Baz;
-};
-
-// // // // need a way to stuff a qualified name into a struct decl
-// // struct S.U {
-// //   double z;
-// // };
-
-// // what will this do?
-// struct U {
-//   union S {
-//     int i;
-//     double d;
-//   };
-// };
-
-// struct T {
-//   double d;
-// };
-
-int main() {
-  // access nested struct
-  S.T x;
-
-  {
-    struct S {
-      int i;
-      struct Z {
-        double d;
-      };
-    };
-
-    S.Z z;   // gets local S
-    .S.T y;  // lookup at global scope only
-
-    const volatile .S.T q;
-#if ERR1
-    T err1;           // error: no T in scope
-#endif
-#if ERR2
-    .Z err2;          // error: no Z in global scope
-    .S.Baz.Bar err3;  // error: .S.Baz => int, int is not aggregate and should not appear left of the dot
-    .S.Z err4;        // error: no Z in global S
-#endif
-  }
-
-  // U.S un;
-
-  S.Bar y;
-  S.Baz x;
-  S.T.Bar z;
-
-  // A.N(int) x;  // xxx - should not be an error, but currently is.
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa nested-types.c" //
-// End: //
Index: tests/nested-types.cfa
===================================================================
--- tests/nested-types.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/nested-types.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,91 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// nested-types.cfa --
+//
+// Author           : Rob Schluntz
+// Created On       : Mon Jul 9 10:20:03 2018
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:59:40 2018
+// Update Count     : 2
+//
+
+typedef int N;
+struct A {
+  forall(otype T)
+  struct N {
+    T x;
+  };
+};
+
+struct S {
+  struct T {
+    int i;
+    typedef int Bar;
+  };
+  T x;
+
+  // struct U;
+  typedef T Bar;
+  typedef int Baz;
+};
+
+// // // // need a way to stuff a qualified name into a struct decl
+// // struct S.U {
+// //   double z;
+// // };
+
+// // what will this do?
+// struct U {
+//   union S {
+//     int i;
+//     double d;
+//   };
+// };
+
+// struct T {
+//   double d;
+// };
+
+int main() {
+  // access nested struct
+  S.T x;
+
+  {
+    struct S {
+      int i;
+      struct Z {
+        double d;
+      };
+    };
+
+    S.Z z;   // gets local S
+    .S.T y;  // lookup at global scope only
+
+    const volatile .S.T q;
+#if ERR1
+    T err1;           // error: no T in scope
+#endif
+#if ERR2
+    .Z err2;          // error: no Z in global scope
+    .S.Baz.Bar err3;  // error: .S.Baz => int, int is not aggregate and should not appear left of the dot
+    .S.Z err4;        // error: no Z in global S
+#endif
+  }
+
+  // U.S un;
+
+  S.Bar y;
+  S.Baz x;
+  S.T.Bar z;
+
+  // A.N(int) x;  // xxx - should not be an error, but currently is.
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa nested-types.cfa" //
+// End: //
Index: sts/numericConstants.c
===================================================================
--- tests/numericConstants.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,70 +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.
-// 
-// numericConstants.c -- 
-// 
-// Author           : Peter A. Buhr
-// Created On       : Wed May 24 22:10:36 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Wed May 24 22:11:36 2017
-// Update Count     : 2
-// 
-
-int main() {
-	1;							// decimal
-	2_1;
-	2_147_483_647;
-	37LL;
-	45ull;
-	89llu;
-	99LLu;
-	56_lu;
-	88_LLu;
-
-//	0;							// octal
-	0u;
-	0_3_77;
-	0_377_ul;
-
-	0x1;						// hexadecimal
-	0x1u;
-	0xabL;
-	0x_80000000;
-	0x_fff;
-	0x_ef3d_aa5c;
-	0x_3LL;
-
-	3.;							// integral real
-	3_100.;
-	1_000_000.;
-
-	3.1;						// integral/fractional real
-	3.141_592_654L;
-	123_456.123_456;
-
-	3E1;						// integral/exponent real
-	3_e1f;
-	3_E1_1_F;
-	3_E_11;
-	3_e_+11;
-	3_E_-11;
-
-	3.0E1;						// integral/fractional/exponent real
-	3.0_E1L;
-	3.0_e1_1;
-	3.0_E_11_l;
-	3.0_e_+11l;
-	3.0_E_-11;
-	123_456.123_456E-16;
-
-	0x_ff.ffp0;					// hex real
-	0x_1.ffff_ffff_p_128_l;
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa minmax.c" //
-// End: //
Index: tests/numericConstants.cfa
===================================================================
--- tests/numericConstants.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/numericConstants.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,70 @@
+// 
+// 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.
+// 
+// numericConstants.cfa -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Wed May 24 22:10:36 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:59:53 2018
+// Update Count     : 3
+// 
+
+int main() {
+	1;							// decimal
+	2_1;
+	2_147_483_647;
+	37LL;
+	45ull;
+	89llu;
+	99LLu;
+	56_lu;
+	88_LLu;
+
+//	0;							// octal
+	0u;
+	0_3_77;
+	0_377_ul;
+
+	0x1;						// hexadecimal
+	0x1u;
+	0xabL;
+	0x_80000000;
+	0x_fff;
+	0x_ef3d_aa5c;
+	0x_3LL;
+
+	3.;							// integral real
+	3_100.;
+	1_000_000.;
+
+	3.1;						// integral/fractional real
+	3.141_592_654L;
+	123_456.123_456;
+
+	3E1;						// integral/exponent real
+	3_e1f;
+	3_E1_1_F;
+	3_E_11;
+	3_e_+11;
+	3_E_-11;
+
+	3.0E1;						// integral/fractional/exponent real
+	3.0_E1L;
+	3.0_e1_1;
+	3.0_E_11_l;
+	3.0_e_+11l;
+	3.0_E_-11;
+	123_456.123_456E-16;
+
+	0x_ff.ffp0;					// hex real
+	0x_1.ffff_ffff_p_128_l;
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa minmax.cfa" //
+// End: //
Index: sts/occursError.c
===================================================================
--- tests/occursError.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,12 +1,0 @@
-forall( otype T ) void f( void (*)( T, T * ) );
-forall( otype U ) void g( U,  U * );
-forall( otype U ) void h( U *, U );
-
-void test() {
-    f( h );
-    f( g );
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: tests/occursError.cfa
===================================================================
--- tests/occursError.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/occursError.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,12 @@
+forall( otype T ) void f( void (*)( T, T * ) );
+forall( otype U ) void g( U,  U * );
+forall( otype U ) void h( U *, U );
+
+void test() {
+    f( h );
+    f( g );
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: sts/operators.c
===================================================================
--- tests/operators.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,38 +1,0 @@
-int ?*?( int a, int b ) {
-	return 0;
-}
-
-int ?()( int number1, int number2 ) {
-	return number1 * number2;
-}
-
-int ?+?( int a, int b ) {
-	return 0;
-}
-
-int ?=?( int &a, int b ) {
-	return 0;
-}
-struct accumulator {
-	int total;
-};
-
-char ?()( struct accumulator a, char number1, char number2 ) {
-	return 'a';
-}
-
-void f( void ) {
-	char a, b;
-	?()( a, b );
-	a(b);
-	a + b;
-}
-
-int main(int argc, char const *argv[]) {
-	/* code */
-	return 0;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: tests/operators.cfa
===================================================================
--- tests/operators.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/operators.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,38 @@
+int ?*?( int a, int b ) {
+	return 0;
+}
+
+int ?()( int number1, int number2 ) {
+	return number1 * number2;
+}
+
+int ?+?( int a, int b ) {
+	return 0;
+}
+
+int ?=?( int &a, int b ) {
+	return 0;
+}
+struct accumulator {
+	int total;
+};
+
+char ?()( struct accumulator a, char number1, char number2 ) {
+	return 'a';
+}
+
+void f( void ) {
+	char a, b;
+	?()( a, b );
+	a(b);
+	a + b;
+}
+
+int main(int argc, char const *argv[]) {
+	/* code */
+	return 0;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: sts/polymorphism.c
===================================================================
--- tests/polymorphism.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,121 +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.
-//
-// polymorphism.c --
-//
-// Author           : Rob Schluntz
-// Created On       : Tue Oct 17 12:19:48 2017
-// Last Modified By : Rob Schluntz
-// Last Modified On : Tue Oct 17 12:21:07 2017
-// Update Count     : 1
-//
-
-#include <assert.h>
-#include <inttypes.h>
-
-forall(otype T)
-T f(T x, T y) {
-	x = y;
-	return x;
-}
-
-forall(otype T) T ident(T x) {
-	return x;
-}
-
-forall( otype T, otype U )
-size_t struct_size( T i, U j ) {
-	struct S { T i; U j; };
-	return sizeof(S);
-}
-
-forall( otype T, otype U )
-size_t union_size( T i, U j ) {
-	union B { T i; U j; };
-	return sizeof(B);
-}
-
-// perform some simple operations on aggregates of T and U
-forall( otype T | { void print(T); int ?==?(T, T); }, otype U | { void print(U); U ?=?(U&, zero_t); } )
-U foo(T i, U j) {
-	struct S { T i; U j; };
-	union B { T i; U j; };
-
-	S s;
-	s.i = i;
-	assertf(s.i == i, "struct operation fails in polymorphic context.");
-
-	B b;
-	b.j = 0;
-	b.i = s.i;
-	return b.j;
-}
-
-int main() {
-	{
-		// ensure that x is not changed by the invocation of a polymorphic function
-		int x = 123;
-		int y = 456;
-		int z = f(x, y);
-		printf("%d %d %d\n", x, y, z);
-	}
-
-	{
-		// explicitly specialize function
-		int (*f)(int) = ident;
-		((int(*)(int))ident);
-		printf("%d %d\n", f(5), ((int(*)(int))ident)(5));
-	}
-
-	{
-		// test aggregates with polymorphic members
-		typedef __attribute__((aligned(8))) uint32_t x_type;
-		typedef __attribute__((aligned(8))) uint64_t y_type;
-
-		x_type x = 3;
-		y_type y = 3;
-
-		struct S {
-			x_type f1;
-			y_type f2;
-		};
-		union U {
-			x_type f1;
-			y_type f2;
-		};
-		// ensure that the size of aggregates with polymorphic members
-		// matches the size of the aggregates in a monomorphic context
-		size_t ssz = struct_size(x, y);
-		size_t usz = union_size(x, y);
-		assertf( ssz == sizeof(S), "struct size differs in polymorphic context: %zd / %zd", ssz, sizeof(S));
-		assertf( usz == sizeof(U), "union size differs in polymorphic context: %zd / %zd", usz, sizeof(U));
-
-		y_type ?=?(y_type & this, zero_t) {
-			this = (int)0;
-			return this;
-		}
-
-		void print(x_type x) {
-			printf("%"PRIu32"\n", x);
-		}
-
-		void print(y_type y) {
-			printf("%"PRIu64"\n", y);
-		}
-
-		y_type ret = foo(x, y);
-
-		// duplicate logic from inside of foo to ensure the same results
-		U u;
-		u.f2 = 0;
-		u.f1 = x;
-		assertf(ret == u.f2, "union operation fails in polymorphic context.");
-	}
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: tests/polymorphism.cfa
===================================================================
--- tests/polymorphism.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/polymorphism.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,121 @@
+//
+// 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.
+//
+// polymorphism.c --
+//
+// Author           : Rob Schluntz
+// Created On       : Tue Oct 17 12:19:48 2017
+// Last Modified By : Rob Schluntz
+// Last Modified On : Tue Oct 17 12:21:07 2017
+// Update Count     : 1
+//
+
+#include <assert.h>
+#include <inttypes.h>
+
+forall(otype T)
+T f(T x, T y) {
+	x = y;
+	return x;
+}
+
+forall(otype T) T ident(T x) {
+	return x;
+}
+
+forall( otype T, otype U )
+size_t struct_size( T i, U j ) {
+	struct S { T i; U j; };
+	return sizeof(S);
+}
+
+forall( otype T, otype U )
+size_t union_size( T i, U j ) {
+	union B { T i; U j; };
+	return sizeof(B);
+}
+
+// perform some simple operations on aggregates of T and U
+forall( otype T | { void print(T); int ?==?(T, T); }, otype U | { void print(U); U ?=?(U&, zero_t); } )
+U foo(T i, U j) {
+	struct S { T i; U j; };
+	union B { T i; U j; };
+
+	S s;
+	s.i = i;
+	assertf(s.i == i, "struct operation fails in polymorphic context.");
+
+	B b;
+	b.j = 0;
+	b.i = s.i;
+	return b.j;
+}
+
+int main() {
+	{
+		// ensure that x is not changed by the invocation of a polymorphic function
+		int x = 123;
+		int y = 456;
+		int z = f(x, y);
+		printf("%d %d %d\n", x, y, z);
+	}
+
+	{
+		// explicitly specialize function
+		int (*f)(int) = ident;
+		((int(*)(int))ident);
+		printf("%d %d\n", f(5), ((int(*)(int))ident)(5));
+	}
+
+	{
+		// test aggregates with polymorphic members
+		typedef __attribute__((aligned(8))) uint32_t x_type;
+		typedef __attribute__((aligned(8))) uint64_t y_type;
+
+		x_type x = 3;
+		y_type y = 3;
+
+		struct S {
+			x_type f1;
+			y_type f2;
+		};
+		union U {
+			x_type f1;
+			y_type f2;
+		};
+		// ensure that the size of aggregates with polymorphic members
+		// matches the size of the aggregates in a monomorphic context
+		size_t ssz = struct_size(x, y);
+		size_t usz = union_size(x, y);
+		assertf( ssz == sizeof(S), "struct size differs in polymorphic context: %zd / %zd", ssz, sizeof(S));
+		assertf( usz == sizeof(U), "union size differs in polymorphic context: %zd / %zd", usz, sizeof(U));
+
+		y_type ?=?(y_type & this, zero_t) {
+			this = (int)0;
+			return this;
+		}
+
+		void print(x_type x) {
+			printf("%"PRIu32"\n", x);
+		}
+
+		void print(y_type y) {
+			printf("%"PRIu64"\n", y);
+		}
+
+		y_type ret = foo(x, y);
+
+		// duplicate logic from inside of foo to ensure the same results
+		U u;
+		u.f2 = 0;
+		u.f1 = x;
+		assertf(ret == u.f2, "union operation fails in polymorphic context.");
+	}
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: tests/preempt_longrun/create.c
===================================================================
--- tests/preempt_longrun/create.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ tests/preempt_longrun/create.c	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -3,5 +3,5 @@
 #include <time.hfa>
 
-#include "long_tests.h"
+#include "long_tests.hfa"
 
 #ifndef PREEMPTION_RATE
Index: tests/preempt_longrun/enter3.c
===================================================================
--- tests/preempt_longrun/enter3.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ tests/preempt_longrun/enter3.c	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -5,5 +5,5 @@
 
 #define __kick_rate 75000ul
-#include "long_tests.h"
+#include "long_tests.hfa"
 
 #ifndef PREEMPTION_RATE
Index: tests/preempt_longrun/processor.c
===================================================================
--- tests/preempt_longrun/processor.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ tests/preempt_longrun/processor.c	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -5,5 +5,5 @@
 #include <unistd.h>
 
-#include "long_tests.h"
+#include "long_tests.hfa"
 
 #ifndef PREEMPTION_RATE
Index: tests/preempt_longrun/yield.c
===================================================================
--- tests/preempt_longrun/yield.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ tests/preempt_longrun/yield.c	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -4,5 +4,5 @@
 
 #define __kick_rate 550000ul
-#include "long_tests.h"
+#include "long_tests.hfa"
 
 #ifndef PREEMPTION_RATE
Index: tests/quotedKeyword.cfa
===================================================================
--- tests/quotedKeyword.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/quotedKeyword.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,49 @@
+//
+// 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.
+//
+// quotedKeyword.cfa -- test quoted keyword usage
+//
+// Author           : Peter A. Buhr
+// Created On       : Wed May 27 17:56:53 2015
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 17:46:20 2018
+// Update Count     : 22
+//
+
+#include <fstream.hfa>
+
+struct {
+	int `otype`;
+	int `struct`;
+} st = { 10, 10 };
+
+typedef int `forall`;
+`forall` xxx = 10;
+
+int `_Alignas`, `_Alignof`, `__alignof`, `__alignof__`, `asm`, `__asm`, `__asm__`, `_At`, `_Atomic`, `__attribute`,
+	`__attribute__`, `auto`, `_Bool`, `break`, `case`, `catch`, `catchResume`, `char`, `choose`, `_Complex`, `__complex`,
+	`__complex__`, `const`, `__const`, `__const__`, `continue`, `default`, `disable`, `do`, `double`, `dtype`, `else`,
+	`enable`, `enum`, `__extension__`, `extern`, `fallthru`, `finally`, `float`, `__float128`, `for`, `forall`, `fortran`,
+	`ftype`, `_Generic`, `goto`, `if`, `_Imaginary`, `__imag`, `__imag__`, `inline`, `__inline`, `__inline__`, `int`,
+	`__int128`, `__label__`, `long`, `lvalue`, `_Noreturn`, `__builtin_offsetof`, `otype`, `register`, `restrict`,
+	`__restrict`, `__restrict__`, `return`, `short`, `signed`, `__signed`, `__signed__`, `sizeof`, `static`,
+	`_Static_assert`, `struct`, `switch`, `_Thread_local`, `throw`, `throwResume`, `trait`, `try`, `typedef`,
+	`typeof`, `__typeof`, `__typeof__`, `union`, `unsigned`, `__builtin_va_list`, `void`, `volatile`, `__volatile`,
+	`__volatile__`, `while`;
+
+int main() {
+	int `if` = 0;
+	`catch` = 1;
+	st.`otype` = 2;
+	st.`struct` = 3;
+	`throw` = 4;
+	sout | `catch` + st.`otype` + st.`struct` + `throw` | endl;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa quotedKeyword.cfa" //
+// End: //
Index: sts/quoted_keyword.c
===================================================================
--- tests/quoted_keyword.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,49 +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.
-//
-// quoted_keyword.c -- test quoted keyword usage
-//
-// Author           : Peter A. Buhr
-// Created On       : Wed May 27 17:56:53 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jun 30 14:03:59 2016
-// Update Count     : 19
-//
-
-#include <fstream.hfa>
-
-struct {
-	int `otype`;
-	int `struct`;
-} st = { 10, 10 };
-
-typedef int `forall`;
-`forall` xxx = 10;
-
-int `_Alignas`, `_Alignof`, `__alignof`, `__alignof__`, `asm`, `__asm`, `__asm__`, `_At`, `_Atomic`, `__attribute`,
-	`__attribute__`, `auto`, `_Bool`, `break`, `case`, `catch`, `catchResume`, `char`, `choose`, `_Complex`, `__complex`,
-	`__complex__`, `const`, `__const`, `__const__`, `continue`, `default`, `disable`, `do`, `double`, `dtype`, `else`,
-	`enable`, `enum`, `__extension__`, `extern`, `fallthru`, `finally`, `float`, `__float128`, `for`, `forall`, `fortran`,
-	`ftype`, `_Generic`, `goto`, `if`, `_Imaginary`, `__imag`, `__imag__`, `inline`, `__inline`, `__inline__`, `int`,
-	`__int128`, `__label__`, `long`, `lvalue`, `_Noreturn`, `__builtin_offsetof`, `otype`, `register`, `restrict`,
-	`__restrict`, `__restrict__`, `return`, `short`, `signed`, `__signed`, `__signed__`, `sizeof`, `static`,
-	`_Static_assert`, `struct`, `switch`, `_Thread_local`, `throw`, `throwResume`, `trait`, `try`, `typedef`,
-	`typeof`, `__typeof`, `__typeof__`, `union`, `unsigned`, `__builtin_va_list`, `void`, `volatile`, `__volatile`,
-	`__volatile__`, `while`;
-
-int main() {
-	int `if` = 0;
-	`catch` = 1;
-	st.`otype` = 2;
-	st.`struct` = 3;
-	`throw` = 4;
-	sout | `catch` + st.`otype` + st.`struct` + `throw` | endl;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa quoted_keyword.c" //
-// End: //
Index: sts/random.c
===================================================================
--- tests/random.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,79 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// random.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Tue Jul  5 21:29:30 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jan  2 12:19:34 2018
-// Update Count     : 19
-//
-
-#include <fstream.hfa>
-#include <stdlib.hfa>										// random
-#include <unistd.h>										// getpid
-
-int main() {
-	// srandom( getpid() );								// set random seed
-	srandom( 1003 );									// fixed seed for repeatable tests
-
-	// test polymorphic calls to random and stream
-	char c = random();
-	sout | c | endl;
-	c = random( 'A' );
-	sout | c | endl;
-	c = random( 'A', 'Z' );
-	sout | c | endl;
-
-	int i = random();
-    sout | i | endl;
-	i = random( 10 );
-    sout | i | endl;
-	i = random( -10, 20 );
-    sout | i | endl;
-
-	unsigned int ui = random();
-    sout | ui | endl;
-	ui = random( 10u );
-    sout | ui | endl;
-	ui = random( 10u, 20u );
-    sout | ui | endl;
-
-	long int li = random();
-    sout | li | endl;
-	li = random( 10l );
-    sout | li | endl;
-	li = random( -10l, 20l );
-    sout | li | endl;
-
-	unsigned long int uli = random();
-    sout | uli | endl;
-	uli = random( 10ul );
-    sout | uli | endl;
-	uli = random( 10ul, 20ul );
-    sout | uli | endl;
-
-    float f = random();
-    sout | f | endl;
-
-    double d = random();
-    sout | d | endl;
-
-    float _Complex fc = random();
-    sout | fc | endl;
-
-    double _Complex dc = random();
-    sout | dc | endl;
-
-    long double _Complex ldc = random();
-    sout | ldc | endl;
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa random.c" //
-// End: //
Index: tests/random.cfa
===================================================================
--- tests/random.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/random.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,79 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// random.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Tue Jul  5 21:29:30 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 18:00:15 2018
+// Update Count     : 20
+//
+
+#include <fstream.hfa>
+#include <stdlib.hfa>										// random
+#include <unistd.h>										// getpid
+
+int main() {
+	// srandom( getpid() );								// set random seed
+	srandom( 1003 );									// fixed seed for repeatable tests
+
+	// test polymorphic calls to random and stream
+	char c = random();
+	sout | c | endl;
+	c = random( 'A' );
+	sout | c | endl;
+	c = random( 'A', 'Z' );
+	sout | c | endl;
+
+	int i = random();
+    sout | i | endl;
+	i = random( 10 );
+    sout | i | endl;
+	i = random( -10, 20 );
+    sout | i | endl;
+
+	unsigned int ui = random();
+    sout | ui | endl;
+	ui = random( 10u );
+    sout | ui | endl;
+	ui = random( 10u, 20u );
+    sout | ui | endl;
+
+	long int li = random();
+    sout | li | endl;
+	li = random( 10l );
+    sout | li | endl;
+	li = random( -10l, 20l );
+    sout | li | endl;
+
+	unsigned long int uli = random();
+    sout | uli | endl;
+	uli = random( 10ul );
+    sout | uli | endl;
+	uli = random( 10ul, 20ul );
+    sout | uli | endl;
+
+    float f = random();
+    sout | f | endl;
+
+    double d = random();
+    sout | d | endl;
+
+    float _Complex fc = random();
+    sout | fc | endl;
+
+    double _Complex dc = random();
+    sout | dc | endl;
+
+    long double _Complex ldc = random();
+    sout | ldc | endl;
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa random.cfa" //
+// End: //
Index: sts/rational.c
===================================================================
--- tests/rational.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,101 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// rational.c -- test rational number package
-//
-// Author           : Peter A. Buhr
-// Created On       : Mon Mar 28 08:43:12 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Oct 10 23:25:04 2017
-// Update Count     : 67
-//
-
-#include <rational.hfa>
-#include <limits.hfa>
-#include <stdlib.hfa>
-#include <fstream.hfa>
-
-// UNNECESSARY, FIX ME
-void ?{}( int & this ) { this = 0; }
-void ?{}( int & this, zero_t ) { this = 0; }
-void ?{}( int & this, one_t ) { this = 1; }
-double convert( int i ) { return (double)i; }
-int convert( double d ) { return (int)d; }
-
-int main() {
-	sout | "constructor" | endl;
-	Rational(int) a = { 3 }, b = { 4 }, c;
-	sout | a | b | c | endl;
-
-	a = (Rational(int)){ 4, 8 };
-	b = (Rational(int)){ 5, 7 };
-	sout | a | b | endl;
-	a = (Rational(int)){ -2, -3 };
-	b = (Rational(int)){ 3, -2 };
-	sout | a | b | endl;
-	a = (Rational(int)){ -2, 3 };
-	b = (Rational(int)){ 3, 2 };
-	sout | a | b | endl;
-
-	sout | "logical" | endl;
-	a = (Rational(int)){ -2 };
-	b = (Rational(int)){ -3, 2 };
-	sout | a | b | endl;
-//	sout | a == 1 | endl; // FIX ME
-	sout | a != b | endl;
-	sout | a <  b | endl;
-	sout | a <= b | endl;
-	sout | a >  b | endl;
-	sout | a >= b | endl;
-
-	sout | "arithmetic" | endl;
-	sout | a | b | endl;
-	sout | a + b | endl;
-	sout | a - b | endl;
-	sout | a * b | endl;
-	sout | a / b | endl;
-
-	sout | "conversion" | endl;
-	a = (Rational(int)){ 3, 4 };
-	sout | widen( a ) | endl;
-	a = (Rational(int)){ 1, 7 };
-	sout | widen( a ) | endl;
-	a = (Rational(int)){ 355, 113 };
-	sout | widen( a ) | endl;
-	sout | narrow( 0.75, 4 ) | endl;
-	sout | narrow( 0.14285714285714, 16 ) | endl;
-	sout | narrow( 3.14159265358979, 256 ) | endl;
-
-	sout | "decompose" | endl;
-	int n, d;
-//	[n, d] = a;
-//	sout | a | n | d | endl;
-
-	sout | "more tests" | endl;
-	Rational(int) x = { 1, 2 }, y = { 2 };
-	sout | x - y | endl;
-	sout | x > y | endl;
-	sout | x | numerator( x, 2 ) | x | endl;
-	sout | y | denominator( y, -2 ) | y | endl;
-
-	Rational(int) z = { 0, 5 };
-	sout | z | endl;
-
-	sout | x | numerator( x, 0 ) | x | endl;
-
-	x = (Rational(int)){ 1, MAX } + (Rational(int)){ 1, MAX };
-	sout | x | endl;
-	x = (Rational(int)){ 3, MAX } + (Rational(int)){ 2, MAX };
-	sout | x | endl;
-
-	sin | a | b;
-	sout | a | b | endl;
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa rational.c" //
-// End: //
Index: tests/rational.cfa
===================================================================
--- tests/rational.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/rational.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,101 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// rational.cfa -- test rational number package
+//
+// Author           : Peter A. Buhr
+// Created On       : Mon Mar 28 08:43:12 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 18:00:27 2018
+// Update Count     : 68
+//
+
+#include <rational.hfa>
+#include <limits.hfa>
+#include <stdlib.hfa>
+#include <fstream.hfa>
+
+// UNNECESSARY, FIX ME
+void ?{}( int & this ) { this = 0; }
+void ?{}( int & this, zero_t ) { this = 0; }
+void ?{}( int & this, one_t ) { this = 1; }
+double convert( int i ) { return (double)i; }
+int convert( double d ) { return (int)d; }
+
+int main() {
+	sout | "constructor" | endl;
+	Rational(int) a = { 3 }, b = { 4 }, c;
+	sout | a | b | c | endl;
+
+	a = (Rational(int)){ 4, 8 };
+	b = (Rational(int)){ 5, 7 };
+	sout | a | b | endl;
+	a = (Rational(int)){ -2, -3 };
+	b = (Rational(int)){ 3, -2 };
+	sout | a | b | endl;
+	a = (Rational(int)){ -2, 3 };
+	b = (Rational(int)){ 3, 2 };
+	sout | a | b | endl;
+
+	sout | "logical" | endl;
+	a = (Rational(int)){ -2 };
+	b = (Rational(int)){ -3, 2 };
+	sout | a | b | endl;
+//	sout | a == 1 | endl; // FIX ME
+	sout | a != b | endl;
+	sout | a <  b | endl;
+	sout | a <= b | endl;
+	sout | a >  b | endl;
+	sout | a >= b | endl;
+
+	sout | "arithmetic" | endl;
+	sout | a | b | endl;
+	sout | a + b | endl;
+	sout | a - b | endl;
+	sout | a * b | endl;
+	sout | a / b | endl;
+
+	sout | "conversion" | endl;
+	a = (Rational(int)){ 3, 4 };
+	sout | widen( a ) | endl;
+	a = (Rational(int)){ 1, 7 };
+	sout | widen( a ) | endl;
+	a = (Rational(int)){ 355, 113 };
+	sout | widen( a ) | endl;
+	sout | narrow( 0.75, 4 ) | endl;
+	sout | narrow( 0.14285714285714, 16 ) | endl;
+	sout | narrow( 3.14159265358979, 256 ) | endl;
+
+	sout | "decompose" | endl;
+	int n, d;
+//	[n, d] = a;
+//	sout | a | n | d | endl;
+
+	sout | "more tests" | endl;
+	Rational(int) x = { 1, 2 }, y = { 2 };
+	sout | x - y | endl;
+	sout | x > y | endl;
+	sout | x | numerator( x, 2 ) | x | endl;
+	sout | y | denominator( y, -2 ) | y | endl;
+
+	Rational(int) z = { 0, 5 };
+	sout | z | endl;
+
+	sout | x | numerator( x, 0 ) | x | endl;
+
+	x = (Rational(int)){ 1, MAX } + (Rational(int)){ 1, MAX };
+	sout | x | endl;
+	x = (Rational(int)){ 3, MAX } + (Rational(int)){ 2, MAX };
+	sout | x | endl;
+
+	sin | a | b;
+	sout | a | b | endl;
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa rational.cfa" //
+// End: //
Index: sts/references.c
===================================================================
--- tests/references.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,123 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// references.c --
-//
-// Author           : Rob Schluntz
-// Created On       : Wed Aug 23 16:11:50 2017
-// Last Modified By : Rob Schluntz
-// Last Modified On : Wed Aug 23 16:12:03
-// Update Count     : 2
-//
-
-struct Y { int i; };
-void ?{}(Y & y) { printf("Default constructing a Y\n"); }
-void ?{}(Y & y, Y other) { printf("Copy constructing a Y\n"); }
-void ^?{}(Y & y) { printf("Destructing a Y\n"); }
-Y ?=?(Y & y, Y other) { printf("Assigning a Y\n"); return y; }
-void ?{}(Y & y, int i) { printf("Value constructing a Y %d\n", i); y.i = i; }
-
-struct X { Y & r; Y y; };
-void ?{}(X & x) {
-	// ensure that r is not implicitly constructed
-}
-void ?{}(X & x, X other) {
-	// ensure that r is not implicitly constructed
-}
-void ^?{}(X & x) {
-	// ensure that r is not implicitly destructed
-}
-X ?=?(X & x, X other) { return x; }
-
-// ensure that generated functions do not implicitly operate on references
-struct Z { Y & r; Y y; };
-
-// test user-defined reference-returning function
-int & toref( int * p ) { return *p; }
-// test user-defined reference-parameter function
-int * toptr( int & r ) { return &r; }
-
-void changeRef( int & r ) {
-	r++;
-}
-
-int main() {
-	int x = 123456, x2 = 789, *p1 = &x, **p2 = &p1, ***p3 = &p2,
-		&r1 = x,    &&r2 = r1,   &&&r3 = r2;
-	***p3 = 3;                          // change x
-	**p3 = &x;                          // change p1
-	*p3 = &p1;                          // change p2
-	int y = 0, z = 11, & ar[3] = { x, y, z };    // initialize array of references
-	// &ar[1] = &z;                        // change reference array element
-	// typeof( ar[1] ) p = 3;              // is int, i.e., the type of referenced object
-	// typeof( &ar[1] ) q = &x;            // is int *, i.e., the type of pointer
-	// _Static_assert( sizeof( ar[1] ) == sizeof( int ), "Array type should be int." );   // is true, i.e., the size of referenced object
-	// _Static_assert( sizeof( &ar[1] ) == sizeof( int *), "Address of array should be int *." ); // is true, i.e., the size of a reference
-
-	((int*&)&r3) = &x;                  // change r1, (&*)**r3
-	x = 3;
-	// test that basic reference properties are true - r1 should be an alias for x
-	printf("%d %d %d\n", x, r1, &x == &r1);
-	r1 = 12;
-	printf("%d %d %d\n", x, r1, &x == &r1);
-
-	// test that functions using basic references work
-	printf("%d %d %d %d\n", toref(&x), toref(p1), toptr(r1) == toptr(x), toptr(r1) == &x);
-
-	changeRef( x );
-	changeRef( y );
-	changeRef( z );
-	printf("%d %d %d\n", x, y, z);
-	changeRef( r1 );
-	printf("%d %d\n", r1, x);
-
-	r3 = 6;                               // change x, ***r3
-	printf("x = %d ; x2 = %d\n", x, x2);  // check that x was changed
-	&r3 = &x2;                            // change r1 to refer to x2, (&*)**r3
-	r3 = 999;                             // modify x2
-	printf("x = %d ; x2 = %d\n", x, x2);  // check that x2 was changed
-	((int**&)&&r3) = p2;                  // change r2, (&(&*)*)*r3, ensure explicit cast to reference works
-	r3 = 12345;                           // modify x
-	printf("x = %d ; x2 = %d\n", x, x2);  // check that x was changed
-	&&&r3 = p3;                           // change r3 to p3, (&(&(&*)*)*)r3
-	((int&)r3) = 22222;                   // modify x, ensure explicit cast to reference works
-	printf("x = %d ; x2 = %d\n", x, x2);  // check that x was changed
-
-	// test that reference members are not implicitly constructed/destructed/assigned
-	X x1, x2 = x1;
-	x1 = x2;
-
-	Z z1, z2 = z1;
-	Y z1r = 56, z2r = 78;
-	&z1.r = &z1r;
-	&z2.r = &z2r;
-
-	z1 = z2;
-
-	// test rvalue-to-reference conversion
-	{
-		struct S { double x, y; };
-		void f( int & i, int & j, S & s, int v[] ) {
-			printf("%d %d { %g, %g }, [%d, %d, %d]\n", i, j, s.[x, y], v[0], v[1], v[2]);
-		}
-		void g(int & i) { printf("%d\n", i); }
-		void h(int &&& i) { printf("%d\n", i); }
-
-		int &&& r = 3;  // rvalue to reference
-		int i = r;
-		printf("%d %d\n", i, r);  // both 3
-
-		g( 3 );          // rvalue to reference
-		h( (int &&&)3 ); // rvalue to reference
-
-		int a = 5, b = 4;
-		f( 3, a + b, (S){ 1.0, 7.0 }, (int [3]){ 1, 2, 3 } ); // two rvalue to reference
-	}
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: tests/references.cfa
===================================================================
--- tests/references.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/references.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,123 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// references.c --
+//
+// Author           : Rob Schluntz
+// Created On       : Wed Aug 23 16:11:50 2017
+// Last Modified By : Rob Schluntz
+// Last Modified On : Wed Aug 23 16:12:03
+// Update Count     : 2
+//
+
+struct Y { int i; };
+void ?{}(Y & y) { printf("Default constructing a Y\n"); }
+void ?{}(Y & y, Y other) { printf("Copy constructing a Y\n"); }
+void ^?{}(Y & y) { printf("Destructing a Y\n"); }
+Y ?=?(Y & y, Y other) { printf("Assigning a Y\n"); return y; }
+void ?{}(Y & y, int i) { printf("Value constructing a Y %d\n", i); y.i = i; }
+
+struct X { Y & r; Y y; };
+void ?{}(X & x) {
+	// ensure that r is not implicitly constructed
+}
+void ?{}(X & x, X other) {
+	// ensure that r is not implicitly constructed
+}
+void ^?{}(X & x) {
+	// ensure that r is not implicitly destructed
+}
+X ?=?(X & x, X other) { return x; }
+
+// ensure that generated functions do not implicitly operate on references
+struct Z { Y & r; Y y; };
+
+// test user-defined reference-returning function
+int & toref( int * p ) { return *p; }
+// test user-defined reference-parameter function
+int * toptr( int & r ) { return &r; }
+
+void changeRef( int & r ) {
+	r++;
+}
+
+int main() {
+	int x = 123456, x2 = 789, *p1 = &x, **p2 = &p1, ***p3 = &p2,
+		&r1 = x,    &&r2 = r1,   &&&r3 = r2;
+	***p3 = 3;                          // change x
+	**p3 = &x;                          // change p1
+	*p3 = &p1;                          // change p2
+	int y = 0, z = 11, & ar[3] = { x, y, z };    // initialize array of references
+	// &ar[1] = &z;                        // change reference array element
+	// typeof( ar[1] ) p = 3;              // is int, i.e., the type of referenced object
+	// typeof( &ar[1] ) q = &x;            // is int *, i.e., the type of pointer
+	// _Static_assert( sizeof( ar[1] ) == sizeof( int ), "Array type should be int." );   // is true, i.e., the size of referenced object
+	// _Static_assert( sizeof( &ar[1] ) == sizeof( int *), "Address of array should be int *." ); // is true, i.e., the size of a reference
+
+	((int*&)&r3) = &x;                  // change r1, (&*)**r3
+	x = 3;
+	// test that basic reference properties are true - r1 should be an alias for x
+	printf("%d %d %d\n", x, r1, &x == &r1);
+	r1 = 12;
+	printf("%d %d %d\n", x, r1, &x == &r1);
+
+	// test that functions using basic references work
+	printf("%d %d %d %d\n", toref(&x), toref(p1), toptr(r1) == toptr(x), toptr(r1) == &x);
+
+	changeRef( x );
+	changeRef( y );
+	changeRef( z );
+	printf("%d %d %d\n", x, y, z);
+	changeRef( r1 );
+	printf("%d %d\n", r1, x);
+
+	r3 = 6;                               // change x, ***r3
+	printf("x = %d ; x2 = %d\n", x, x2);  // check that x was changed
+	&r3 = &x2;                            // change r1 to refer to x2, (&*)**r3
+	r3 = 999;                             // modify x2
+	printf("x = %d ; x2 = %d\n", x, x2);  // check that x2 was changed
+	((int**&)&&r3) = p2;                  // change r2, (&(&*)*)*r3, ensure explicit cast to reference works
+	r3 = 12345;                           // modify x
+	printf("x = %d ; x2 = %d\n", x, x2);  // check that x was changed
+	&&&r3 = p3;                           // change r3 to p3, (&(&(&*)*)*)r3
+	((int&)r3) = 22222;                   // modify x, ensure explicit cast to reference works
+	printf("x = %d ; x2 = %d\n", x, x2);  // check that x was changed
+
+	// test that reference members are not implicitly constructed/destructed/assigned
+	X x1, x2 = x1;
+	x1 = x2;
+
+	Z z1, z2 = z1;
+	Y z1r = 56, z2r = 78;
+	&z1.r = &z1r;
+	&z2.r = &z2r;
+
+	z1 = z2;
+
+	// test rvalue-to-reference conversion
+	{
+		struct S { double x, y; };
+		void f( int & i, int & j, S & s, int v[] ) {
+			printf("%d %d { %g, %g }, [%d, %d, %d]\n", i, j, s.[x, y], v[0], v[1], v[2]);
+		}
+		void g(int & i) { printf("%d\n", i); }
+		void h(int &&& i) { printf("%d\n", i); }
+
+		int &&& r = 3;  // rvalue to reference
+		int i = r;
+		printf("%d %d\n", i, r);  // both 3
+
+		g( 3 );          // rvalue to reference
+		h( (int &&&)3 ); // rvalue to reference
+
+		int a = 5, b = 4;
+		f( 3, a + b, (S){ 1.0, 7.0 }, (int [3]){ 1, 2, 3 } ); // two rvalue to reference
+	}
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: sts/result.c
===================================================================
--- tests/result.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,68 +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.
-//
-// result.c --
-//
-// Author           : Andrew Beach
-// Created On       : Thr May 25 16:50:00 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 20 15:24:12 2017
-// Update Count     : 1
-//
-
-#include <assert.h>
-#include <containers/result.hfa>
-
-void checkPredicates() {
-	result(int, char) pass = {1, 4};
-	assert(pass);
-	assert(has_value(&pass));
-
-	result(int, char) fail = {0, '!'};
-	assert((fail ? false : true));
-	assert(!has_value(&fail));
-}
-
-/* Waiting for bug#11 to be fixed.
-void checkNamedConstructors() {
-	result(int, char) = result_value(4);
-	assert(has_value(&pass));
-
-	result(int, char) fail = result_error('!');
-	assert(!has_value(&fail));
-}
-*/
-
-void checkGetters() {
-	result(int, char) pass = {1, 4};
-	assert(4 == get(&pass));
-
-	result(int, char) fail = {0, '!'};
-	assert('!' == get_error(&fail));
-}
-
-void checkSetters() {
-	result(int, char) fee = {1, -7};
-	assert(-7 == get(&fee));
-	set(&fee, 42);
-	assert(42 == get(&fee));
-	set_error(&fee, '@');
-	assert('@' == get_error(&fee));
-
-	result(int, char) fy = {1, -7};
-	fee = fy;
-	assert(-7 == get(&fee));
-	result(int, char) foe = {0, '!'};
-	fee = foe;
-	assert('!' == get_error(&fee));
-}
-
-int main(int argc, char * argv[]) {
-	checkPredicates();
-	//checkNamedConstructors();
-	checkGetters();
-	checkSetters();
-}
Index: tests/result.cfa
===================================================================
--- tests/result.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/result.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,68 @@
+//
+// 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.
+//
+// result.c --
+//
+// Author           : Andrew Beach
+// Created On       : Thr May 25 16:50:00 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu Jul 20 15:24:12 2017
+// Update Count     : 1
+//
+
+#include <assert.h>
+#include <containers/result.hfa>
+
+void checkPredicates() {
+	result(int, char) pass = {1, 4};
+	assert(pass);
+	assert(has_value(&pass));
+
+	result(int, char) fail = {0, '!'};
+	assert((fail ? false : true));
+	assert(!has_value(&fail));
+}
+
+/* Waiting for bug#11 to be fixed.
+void checkNamedConstructors() {
+	result(int, char) = result_value(4);
+	assert(has_value(&pass));
+
+	result(int, char) fail = result_error('!');
+	assert(!has_value(&fail));
+}
+*/
+
+void checkGetters() {
+	result(int, char) pass = {1, 4};
+	assert(4 == get(&pass));
+
+	result(int, char) fail = {0, '!'};
+	assert('!' == get_error(&fail));
+}
+
+void checkSetters() {
+	result(int, char) fee = {1, -7};
+	assert(-7 == get(&fee));
+	set(&fee, 42);
+	assert(42 == get(&fee));
+	set_error(&fee, '@');
+	assert('@' == get_error(&fee));
+
+	result(int, char) fy = {1, -7};
+	fee = fy;
+	assert(-7 == get(&fee));
+	result(int, char) foe = {0, '!'};
+	fee = foe;
+	assert('!' == get_error(&fee));
+}
+
+int main(int argc, char * argv[]) {
+	checkPredicates();
+	//checkNamedConstructors();
+	checkGetters();
+	checkSetters();
+}
Index: sts/scope.c
===================================================================
--- tests/scope.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,73 +1,0 @@
-int x;
-typedef double y;
-typedef float t;
-y z;
-//otype u = struct { int a; double b; };
-typedef struct { int a; double b; } u;
-int f( int y );
-y q;
-struct x { int x; };
-
-y w( y y, u v ) {
-//	otype x | { x t(u); };
-	void ?{}(struct x *);
-	void ^?{}(struct x *);
-	extern struct x t( u );
-	u u = y;
-	struct x z = t(u);
-}
-
-y p;
-
-trait has_u( otype z ) {
-	z u(z);
-};
-
-forall( otype t | has_u( t ) )
-y q( t the_t ) {
-	t y = u( the_t );
-}
-
-t f( y p ) {
-	int y;
-	typedef char x;
-	{
-		x y;
-		typedef x z;
-		{
-			z x;
-			typedef z y;
-			y z = x;
-		}
-		z x = y;
-	}
-	x q = y;
-}
-
-void some_func() {}
-
-t g( void ) {
-	typedef char x;
-//	try {
-		some_func();
-//	} catch ( x x ) {
-//		t y = x;
-//	}
-	x z;
-}
-
-y q( i )												/* K&R style */
-	int i;
-{
-	switch ( i ) {
-		y q = i;
-	  case 0:
-		return q;
-	  default:
-		return i;
-	}
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: tests/scope.cfa
===================================================================
--- tests/scope.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/scope.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,73 @@
+int x;
+typedef double y;
+typedef float t;
+y z;
+//otype u = struct { int a; double b; };
+typedef struct { int a; double b; } u;
+int f( int y );
+y q;
+struct x { int x; };
+
+y w( y y, u v ) {
+//	otype x | { x t(u); };
+	void ?{}(struct x *);
+	void ^?{}(struct x *);
+	extern struct x t( u );
+	u u = y;
+	struct x z = t(u);
+}
+
+y p;
+
+trait has_u( otype z ) {
+	z u(z);
+};
+
+forall( otype t | has_u( t ) )
+y q( t the_t ) {
+	t y = u( the_t );
+}
+
+t f( y p ) {
+	int y;
+	typedef char x;
+	{
+		x y;
+		typedef x z;
+		{
+			z x;
+			typedef z y;
+			y z = x;
+		}
+		z x = y;
+	}
+	x q = y;
+}
+
+void some_func() {}
+
+t g( void ) {
+	typedef char x;
+//	try {
+		some_func();
+//	} catch ( x x ) {
+//		t y = x;
+//	}
+	x z;
+}
+
+y q( i )												/* K&R style */
+	int i;
+{
+	switch ( i ) {
+		y q = i;
+	  case 0:
+		return q;
+	  default:
+		return i;
+	}
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: sts/scopeErrors.c
===================================================================
--- tests/scopeErrors.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,25 +1,0 @@
-int thisIsAnError;
-int thisIsAnError;
-
-int thisIsNotAnError;
-float thisIsNotAnError;
-
-int thisIsAlsoNotAnError() {
-  int thisIsNotAnError;
-}
-
-int thisIsAlsoNotAnError( double x ) {
-}
-
-double thisIsStillNotAnError( double );
-double thisIsStillNotAnError( double );
-
-double butThisIsAnError( double ) {
-}
-
-double butThisIsAnError( double ) {
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: tests/scopeErrors.cfa
===================================================================
--- tests/scopeErrors.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/scopeErrors.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,25 @@
+int thisIsAnError;
+int thisIsAnError;
+
+int thisIsNotAnError;
+float thisIsNotAnError;
+
+int thisIsAlsoNotAnError() {
+  int thisIsNotAnError;
+}
+
+int thisIsAlsoNotAnError( double x ) {
+}
+
+double thisIsStillNotAnError( double );
+double thisIsStillNotAnError( double );
+
+double butThisIsAnError( double ) {
+}
+
+double butThisIsAnError( double ) {
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: sts/searchsort.c
===================================================================
--- tests/searchsort.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,151 +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.
-//
-// searchsort.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Thu Feb  4 18:17:50 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug  9 07:54:57 2018
-// Update Count     : 101
-//
-
-#include <fstream.hfa>
-#include <stdlib.hfa>										// bsearch, qsort
-#include <stdlib.h>										// C version of bsearch
-
-int comp( const void * t1, const void * t2 ) { return *(int *)t1 < *(int *)t2 ? -1 : *(int *)t2 < *(int *)t1 ? 1 : 0; }
-
-int main( void ) {
-	const unsigned int size = 10;
-	int iarr[size];
-
-	for ( i; 0u ~ size ) {
-		iarr[i] = size - i;
-		sout | iarr[i] | ", ";
-	} // for
-	sout | endl | endl;
-
-	// ascending sort/search by changing < to >
-	qsort( iarr, size );
-	for ( i; 0u ~ size ) {
-		sout | iarr[i] | ", ";
-	} // for
-	sout | endl;
-	for ( i; 0u ~ size ) {		// C version
-		int key = size - i;
-		int * v = bsearch( &key, iarr, size, sizeof( iarr[0] ), comp );
-		sout | key | ':' | *v | ", ";
-	} // for
-	sout | endl;
-
-	for ( i; 0u ~ size ) {
-		int * v = bsearch( size - i, iarr, size );
-		sout | size - i | ':' | *v | ", ";
-	} // for
-	sout | endl;
-	for ( i; 0u ~ size ) {
-		unsigned int posn = bsearch( size - i, iarr, size );
-		sout | size - i | ':' | iarr[posn] | ", ";
-	} // for
-	sout | endl | endl;
-
-	// descending sort/search by changing < to >
-	for ( i; 0u ~ size ) {
-		iarr[i] = i + 1;
-		sout | iarr[i] | ", ";
-	} // for
-	sout | endl;
-	{
-		int ?<?( int x, int y ) { return x > y; }
-		qsort( iarr, size );
-		for ( i; 0u ~ size ) {
-			sout | iarr[i] | ", ";
-		} // for
-		sout | endl;
-		for ( i; 0u ~ size ) {
-			int * v = bsearch( size - i, iarr, size );
-			sout | size - i | ':' | *v | ", ";
-		} // for
-		sout | endl;
-		for ( i; 0u ~ size ) {
-			unsigned int posn = bsearch( size - i, iarr, size );
-			sout | size - i | ':' | iarr[posn] | ", ";
-		} // for
-	}
-	sout | endl | endl;
-
-	double darr[size];
-	for ( i; 0u ~ size ) {
-		darr[i] = size - i + 0.5;
-		sout | darr[i] | ", ";
-	} // for
-	sout | endl;
-	qsort( darr, size );
-	for ( i; 0u ~ size ) {
-		sout | darr[i] | ", ";
-	} // for
-	sout | endl;
-	for ( i; 0u ~ size ) {
-		double * v = bsearch( size - i + 0.5, darr, size );
-		sout | size - i + 0.5 | ':' | *v | ", ";
-	} // for
-	sout | endl;
-	for ( i; 0u ~ size ) {
-		unsigned int posn = bsearch( size - i + 0.5, darr, size );
-		sout | size - i + 0.5 | ':' | darr[posn] | ", ";
-	} // for
-	sout | endl | endl;
-
-	struct S { int i, j; } sarr[size];
-	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 ( i; 0u ~ size ) {
-		sarr[i].i = size - i;
-		sarr[i].j = size - i + 1;
-		sout | sarr[i] | ", ";
-	} // for
-	sout | endl;
-	qsort( sarr, size );
-	for ( i; 0u ~ size ) {
-		sout | sarr[i] | ", ";
-	} // for
-	sout | endl;
-	for ( i; 0u ~ size ) {
-		S temp = { size - i, size - i + 1 };
-		S * v = bsearch( temp, sarr, size );
-		sout | temp | ':' | *v | ", ";
-	} // for
-	sout | endl;
-	for ( i; 0u ~ size ) {
-		S temp = { size - i, size - i + 1 };
-		unsigned int posn = bsearch( temp, sarr, size );
-		sout | temp | ':' | sarr[posn] | ", ";
-	} // for
-	sout | endl | endl;
-	{
-		unsigned int getKey( const S & s ) { return s.j; }
-		for ( i; 0u ~ size ) {
-			sout | sarr[i] | ", ";
-		} // for
-		sout | endl;
-		for ( i; 0u ~ size ) {
-			S * v = bsearch( size - i + 1, sarr, size );
-			sout | size - i + 1 | ':' | *v | ", ";
-		} // for
-		sout | endl;
-		for ( i; 0u ~ size ) {
-			unsigned int posn = bsearch( size - i + 1, sarr, size );
-			sout | size - i + 1 | ':' | sarr[posn] | ", ";
-		} // for
-		sout | endl | endl;
-	}
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa searchsort.c" //
-// End: //
Index: tests/searchsort.cfa
===================================================================
--- tests/searchsort.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/searchsort.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,151 @@
+//
+// 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.
+//
+// searchsort.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Thu Feb  4 18:17:50 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 18:00:38 2018
+// Update Count     : 102
+//
+
+#include <fstream.hfa>
+#include <stdlib.hfa>										// bsearch, qsort
+#include <stdlib.h>										// C version of bsearch
+
+int comp( const void * t1, const void * t2 ) { return *(int *)t1 < *(int *)t2 ? -1 : *(int *)t2 < *(int *)t1 ? 1 : 0; }
+
+int main( void ) {
+	const unsigned int size = 10;
+	int iarr[size];
+
+	for ( i; 0u ~ size ) {
+		iarr[i] = size - i;
+		sout | iarr[i] | ", ";
+	} // for
+	sout | endl | endl;
+
+	// ascending sort/search by changing < to >
+	qsort( iarr, size );
+	for ( i; 0u ~ size ) {
+		sout | iarr[i] | ", ";
+	} // for
+	sout | endl;
+	for ( i; 0u ~ size ) {		// C version
+		int key = size - i;
+		int * v = bsearch( &key, iarr, size, sizeof( iarr[0] ), comp );
+		sout | key | ':' | *v | ", ";
+	} // for
+	sout | endl;
+
+	for ( i; 0u ~ size ) {
+		int * v = bsearch( size - i, iarr, size );
+		sout | size - i | ':' | *v | ", ";
+	} // for
+	sout | endl;
+	for ( i; 0u ~ size ) {
+		unsigned int posn = bsearch( size - i, iarr, size );
+		sout | size - i | ':' | iarr[posn] | ", ";
+	} // for
+	sout | endl | endl;
+
+	// descending sort/search by changing < to >
+	for ( i; 0u ~ size ) {
+		iarr[i] = i + 1;
+		sout | iarr[i] | ", ";
+	} // for
+	sout | endl;
+	{
+		int ?<?( int x, int y ) { return x > y; }
+		qsort( iarr, size );
+		for ( i; 0u ~ size ) {
+			sout | iarr[i] | ", ";
+		} // for
+		sout | endl;
+		for ( i; 0u ~ size ) {
+			int * v = bsearch( size - i, iarr, size );
+			sout | size - i | ':' | *v | ", ";
+		} // for
+		sout | endl;
+		for ( i; 0u ~ size ) {
+			unsigned int posn = bsearch( size - i, iarr, size );
+			sout | size - i | ':' | iarr[posn] | ", ";
+		} // for
+	}
+	sout | endl | endl;
+
+	double darr[size];
+	for ( i; 0u ~ size ) {
+		darr[i] = size - i + 0.5;
+		sout | darr[i] | ", ";
+	} // for
+	sout | endl;
+	qsort( darr, size );
+	for ( i; 0u ~ size ) {
+		sout | darr[i] | ", ";
+	} // for
+	sout | endl;
+	for ( i; 0u ~ size ) {
+		double * v = bsearch( size - i + 0.5, darr, size );
+		sout | size - i + 0.5 | ':' | *v | ", ";
+	} // for
+	sout | endl;
+	for ( i; 0u ~ size ) {
+		unsigned int posn = bsearch( size - i + 0.5, darr, size );
+		sout | size - i + 0.5 | ':' | darr[posn] | ", ";
+	} // for
+	sout | endl | endl;
+
+	struct S { int i, j; } sarr[size];
+	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 ( i; 0u ~ size ) {
+		sarr[i].i = size - i;
+		sarr[i].j = size - i + 1;
+		sout | sarr[i] | ", ";
+	} // for
+	sout | endl;
+	qsort( sarr, size );
+	for ( i; 0u ~ size ) {
+		sout | sarr[i] | ", ";
+	} // for
+	sout | endl;
+	for ( i; 0u ~ size ) {
+		S temp = { size - i, size - i + 1 };
+		S * v = bsearch( temp, sarr, size );
+		sout | temp | ':' | *v | ", ";
+	} // for
+	sout | endl;
+	for ( i; 0u ~ size ) {
+		S temp = { size - i, size - i + 1 };
+		unsigned int posn = bsearch( temp, sarr, size );
+		sout | temp | ':' | sarr[posn] | ", ";
+	} // for
+	sout | endl | endl;
+	{
+		unsigned int getKey( const S & s ) { return s.j; }
+		for ( i; 0u ~ size ) {
+			sout | sarr[i] | ", ";
+		} // for
+		sout | endl;
+		for ( i; 0u ~ size ) {
+			S * v = bsearch( size - i + 1, sarr, size );
+			sout | size - i + 1 | ':' | *v | ", ";
+		} // for
+		sout | endl;
+		for ( i; 0u ~ size ) {
+			unsigned int posn = bsearch( size - i + 1, sarr, size );
+			sout | size - i + 1 | ':' | sarr[posn] | ", ";
+		} // for
+		sout | endl | endl;
+	}
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa searchsort.cfa" //
+// End: //
Index: sts/shortCircuit.c
===================================================================
--- tests/shortCircuit.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,55 +1,0 @@
-void g( float f ) {}
-void g( int i ) {}
-
-void f( int a ) {
-	int b;
-	float c;
-	g( a ? b : c );
-	g( a && c );
-	g( a || b );
-}
-
-void g() {
-	int a;
-	struct { int b; } a;
-	if ( a ) {
-		while ( a ) {
-			int *b;
-			for ( b; a; b ) {
-			}
-		}
-	}
-}
-
-#include <fstream.hfa>
-
-struct test_t {
-	int x;
-};
-
-int ?!=?( test_t lhs, int rhs ) {
-	sout | lhs.x | " ";
-	return lhs.x != 0;
-}
-
-
-int main(int argc, char const *argv[])
-{
-	test_t true_val, false_val;
-	true_val.x = 1;
-	false_val.x = 0;
-
-	true_val && false_val;
-	sout | endl;
-
-	true_val || false_val;
-	sout | endl;
-
-	false_val && true_val;
-	sout | endl;
-
-	false_val || true_val;
-	sout | endl;
-
-	return 0;
-}
Index: tests/shortCircuit.cfa
===================================================================
--- tests/shortCircuit.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/shortCircuit.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,55 @@
+void g( float f ) {}
+void g( int i ) {}
+
+void f( int a ) {
+	int b;
+	float c;
+	g( a ? b : c );
+	g( a && c );
+	g( a || b );
+}
+
+void g() {
+	int a;
+	struct { int b; } a;
+	if ( a ) {
+		while ( a ) {
+			int *b;
+			for ( b; a; b ) {
+			}
+		}
+	}
+}
+
+#include <fstream.hfa>
+
+struct test_t {
+	int x;
+};
+
+int ?!=?( test_t lhs, int rhs ) {
+	sout | lhs.x | " ";
+	return lhs.x != 0;
+}
+
+
+int main(int argc, char const *argv[])
+{
+	test_t true_val, false_val;
+	true_val.x = 1;
+	false_val.x = 0;
+
+	true_val && false_val;
+	sout | endl;
+
+	true_val || false_val;
+	sout | endl;
+
+	false_val && true_val;
+	sout | endl;
+
+	false_val || true_val;
+	sout | endl;
+
+	return 0;
+}
Index: sts/simpleGenericTriple.c
===================================================================
--- tests/simpleGenericTriple.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,43 +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.
-//
-// simpleGenericTriple.c --
-//
-// Author           : Rob Schluntz
-// Created On       : Tue Nov 15 17:24:32 2016
-// Last Modified By : Rob Schluntz
-// Last Modified On : Tue Nov 15 17:27:28 2016
-// Update Count     : 3
-//
-
-forall(otype T)
-struct T3 {
-	T f0, f1, f2;
-};
-
-forall(otype T | { T ?+?(T, T); })
-T3(T) ?+?(T3(T) x, T3(T) y) {
-	T3(T) z = { x.f0+y.f0, x.f1+y.f1, x.f2+y.f2 };
-	return z;
-}
-
-int main() {
-  int x1 = 123, x3 = 456;
-  double x2 = 999.123;
-  struct T3(int) Li = { x1, (int)x2, x3 };
-  struct T3(int) Ri = { 9, 2, 3 };
-  struct T3(int) reti = Li+Ri;
-  printf("%d %d %d\n", reti.f0, reti.f1, reti.f2);
-
-  struct T3(double) Ld = { x1, x2, x3 };
-  struct T3(double) Rd = { 9, 2, 3 };
-  struct T3(double) retd = Ld+Rd;
-  printf("%g %g %g\n", retd.f0, retd.f1, retd.f2);
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: tests/simpleGenericTriple.cfa
===================================================================
--- tests/simpleGenericTriple.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/simpleGenericTriple.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,43 @@
+//
+// 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.
+//
+// simpleGenericTriple.c --
+//
+// Author           : Rob Schluntz
+// Created On       : Tue Nov 15 17:24:32 2016
+// Last Modified By : Rob Schluntz
+// Last Modified On : Tue Nov 15 17:27:28 2016
+// Update Count     : 3
+//
+
+forall(otype T)
+struct T3 {
+	T f0, f1, f2;
+};
+
+forall(otype T | { T ?+?(T, T); })
+T3(T) ?+?(T3(T) x, T3(T) y) {
+	T3(T) z = { x.f0+y.f0, x.f1+y.f1, x.f2+y.f2 };
+	return z;
+}
+
+int main() {
+  int x1 = 123, x3 = 456;
+  double x2 = 999.123;
+  struct T3(int) Li = { x1, (int)x2, x3 };
+  struct T3(int) Ri = { 9, 2, 3 };
+  struct T3(int) reti = Li+Ri;
+  printf("%d %d %d\n", reti.f0, reti.f1, reti.f2);
+
+  struct T3(double) Ld = { x1, x2, x3 };
+  struct T3(double) Rd = { 9, 2, 3 };
+  struct T3(double) retd = Ld+Rd;
+  printf("%g %g %g\n", retd.f0, retd.f1, retd.f2);
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: sts/stdincludes.c
===================================================================
--- tests/stdincludes.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,54 +1,0 @@
-// 
-// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-// 
-// stdincludes.c -- 
-// 
-// Author           : Peter A. Buhr
-// Created On       : Tue Aug 29 08:26:14 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Aug 30 07:56:39 2017
-// Update Count     : 5
-// 
-
-// C11 standard headers
-
-#include <assert.h>
-#include <complex.h>
-#include <ctype.h>
-#include <errno.h>
-#include <fenv.h>
-#include <float.h>
-#include <inttypes.h>
-//#include <iso646.h>										// does not exist on linux
-#include <limits.h>
-#include <locale.h>
-#include <malloc.h>										// extra
-#include <math.h>
-#include <setjmp.h>
-#include <signal.h>
-#include <stdalign.h>
-#include <stdarg.h>
-#include <stdatomic.h>
-#include <stdbool.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdnoreturn.h>
-#include <string.h>
-#include <tgmath.h>
-#include <time.h>
-#include <uchar.h>
-#include <unistd.h>										// extra
-#include <wchar.h>
-#include <wctype.h>
-
-int main() {}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa stdincludes.c" //
-// End: //
Index: tests/stdincludes.cfa
===================================================================
--- tests/stdincludes.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/stdincludes.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,54 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// stdincludes.cfa -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Tue Aug 29 08:26:14 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 18:00:53 2018
+// Update Count     : 6
+// 
+
+// C11 standard headers
+
+#include <assert.h>
+#include <complex.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fenv.h>
+#include <float.h>
+#include <inttypes.h>
+//#include <iso646.h>										// does not exist on linux
+#include <limits.h>
+#include <locale.h>
+#include <malloc.h>										// extra
+#include <math.h>
+#include <setjmp.h>
+#include <signal.h>
+#include <stdalign.h>
+#include <stdarg.h>
+#include <stdatomic.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdnoreturn.h>
+#include <string.h>
+#include <tgmath.h>
+#include <time.h>
+#include <uchar.h>
+#include <unistd.h>										// extra
+#include <wchar.h>
+#include <wctype.h>
+
+int main() {}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa stdincludes.cfa" //
+// End: //
Index: sts/structMember.c
===================================================================
--- tests/structMember.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,100 +1,0 @@
-typedef int TD;
-extern struct TTT {};
-
-struct S {
-	int m1:3, m2:4;
-	int :2;
-	int :3, :4;
-	int m3;
-	int m4, m5, m6;
-	int *m7, *m8, *m9;
-	__extension__ int (*m10)();
-	__extension__ int *(*m11)(int);
-//	TD (TD);
-
-// Cforall declarations
-
-	* int m12, m13;
-	* [ * int ] (int) m14;
-
-// C anonymous declarations (padding)
-
-	int :4;
-	int :4, :6;
-
-// Cforall anonymous declarations (padding)
-
-	int @;
-	TD @;
-	int @, @, @;
-	int * @ , @, @;
-	int * @, * @, * @;
-	* int @, @, @;
-	struct TTT @;
-	TTT @, @;
-	int @ :4, @ :6;
-	* int @, @;
-	int (*@)();
-	int (*@)(int), (*@)(int);
-	* [int](int) @, @;
-	int (**@)( int );
-	* * [int](int) @;
-
-// C aggregate open declarations
-
-	__extension__ union { int i; };
-	struct T { int k; };
-
-// Cforall forward declaration
-
-	struct PPP;
-	__extension__ struct QQQ;
-
-// C useless declarations
-
-	int;
-	TD;
-	unsigned int;
-	__extension__ long double;
-	_Complex;
-	double _Complex;
-	volatile zero_t;
-	const one_t;
-	S;
-	.S;
-	S.T;
-	.S.T;
-	forall( otype S, otype T ) struct W {
-		struct X {};
-	};
-	W(int);
-	W(int).X;
-};
-
-struct S s;
-
-// Cforall Plan 9 declarations
-
-struct UUU {};
-extern struct SSS {
-	inline struct WWW {};
-	inline UUU;
-	inline UUU *, **;
-	inline UUU (*)( int p );
-	inline int;
-	inline int *;
-	inline * int;
-	inline int (*)( int p );
-	inline * [int](int p);
-};
-
-union U {
-	[5] int m1;
-	int m2[5];
-	* int m3;
-	int *m4;
-} u;
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: tests/structMember.cfa
===================================================================
--- tests/structMember.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/structMember.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,100 @@
+typedef int TD;
+extern struct TTT {};
+
+struct S {
+	int m1:3, m2:4;
+	int :2;
+	int :3, :4;
+	int m3;
+	int m4, m5, m6;
+	int *m7, *m8, *m9;
+	__extension__ int (*m10)();
+	__extension__ int *(*m11)(int);
+//	TD (TD);
+
+// Cforall declarations
+
+	* int m12, m13;
+	* [ * int ] (int) m14;
+
+// C anonymous declarations (padding)
+
+	int :4;
+	int :4, :6;
+
+// Cforall anonymous declarations (padding)
+
+	int @;
+	TD @;
+	int @, @, @;
+	int * @ , @, @;
+	int * @, * @, * @;
+	* int @, @, @;
+	struct TTT @;
+	TTT @, @;
+	int @ :4, @ :6;
+	* int @, @;
+	int (*@)();
+	int (*@)(int), (*@)(int);
+	* [int](int) @, @;
+	int (**@)( int );
+	* * [int](int) @;
+
+// C aggregate open declarations
+
+	__extension__ union { int i; };
+	struct T { int k; };
+
+// Cforall forward declaration
+
+	struct PPP;
+	__extension__ struct QQQ;
+
+// C useless declarations
+
+	int;
+	TD;
+	unsigned int;
+	__extension__ long double;
+	_Complex;
+	double _Complex;
+	volatile zero_t;
+	const one_t;
+	S;
+	.S;
+	S.T;
+	.S.T;
+	forall( otype S, otype T ) struct W {
+		struct X {};
+	};
+	W(int);
+	W(int).X;
+};
+
+struct S s;
+
+// Cforall Plan 9 declarations
+
+struct UUU {};
+extern struct SSS {
+	inline struct WWW {};
+	inline UUU;
+	inline UUU *, **;
+	inline UUU (*)( int p );
+	inline int;
+	inline int *;
+	inline * int;
+	inline int (*)( int p );
+	inline * [int](int p);
+};
+
+union U {
+	[5] int m1;
+	int m2[5];
+	* int m3;
+	int *m4;
+} u;
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: sts/subrange.c
===================================================================
--- tests/subrange.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,63 +1,0 @@
-// A small context defining the notion of an ordered otype.  (The standard
-// library should probably contain a context for this purpose.)
-trait ordered(otype T) {
-    int ?<?(T, T), ?<=?(T, T);
-};
-
-// A subrange otype resembling an Ada subotype with a base otype and a range
-// constraint.
-otype subrange(otype base_t | ordered(base_t), base_t low = 0, base_t high = 8) = base_t;
-
-// Note that subrange() can be applied to floating-point and pointer otypes, not
-// just integral otypes.
-//   This requires a "otype generator" extension to Cforall.  Type generators
-// must accept otype and non-otype parameters, which is beyond what we discussed
-// previously.  Type parameters must be usable in the declaration of
-// subsequent parameters: parameter T is used to declare parameters "low"
-// and "high".
-
-// Example usage:
-subrange(unsigned, 1, 31) day_of_month;
-subrange(char, 'a', 'z')  lcase;
-subrange(int, 0, (rand() & 0xF) ) foo;
-
-// What sorts of expressions can be used as arguments of otype generators?  Is
-// "subrange(int, 0, rand() & 0xF)" legal?  Probably.  The nearest C equivalent
-// to the "low" and "high" arguments is the array size in a variable-length
-// array declaration, and C allows assignment expressions there.
-
-// Convenient access to subrange bounds, for instance for iteration:
-forall (otype T, T low, T high)
-T lbound( subrange(T, low, high) v) {
-    return low;
-}
-
-forall (otype T, T low, T high)
-T hbound( subrange(T, low, high) v) {
-    return high;
-}
-
-// Example usage:
-unsigned lday = lbound(day_of_month);
-
-// Assignment from the base otype, with bounds checking.  I'll ignore the issue
-// of exception handling here.  Inlining allows the compiler to eliminate
-// bounds checks.
-forall (otype T | ordered(T), T low, T high)
-inline subrange(T, low, high) ?=?(subrange(T, low, high)* target, T source) {
-    if (low <= source && source <= high) *((T*)target) = source;
-    else abort();
-    return target;
-}
-
-// Assignment between subranges with a common base otype.  The bounds check
-// compares range bounds so that the compiler can optimize checks away when the
-// ranges are known to overlap.
-forall (otype T | ordered(T), T t_low, T t_high, T s_low, T s_high)
-inline subrange(T, t_low, t_high) ?=?(subrange(T, t_low, t_high)* target,
-				      subrange(T, s_low, s_high) source) {
-    if ( (t_low <= s_low || t_low <= source)
-	 && (s_high <= t_high || source <= t_high) ) *((T*)target) = source;
-    else abort();
-    return target;
-}
Index: tests/subrange.cfa
===================================================================
--- tests/subrange.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/subrange.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,63 @@
+// A small context defining the notion of an ordered otype.  (The standard
+// library should probably contain a context for this purpose.)
+trait ordered(otype T) {
+    int ?<?(T, T), ?<=?(T, T);
+};
+
+// A subrange otype resembling an Ada subotype with a base otype and a range
+// constraint.
+otype subrange(otype base_t | ordered(base_t), base_t low = 0, base_t high = 8) = base_t;
+
+// Note that subrange() can be applied to floating-point and pointer otypes, not
+// just integral otypes.
+//   This requires a "otype generator" extension to Cforall.  Type generators
+// must accept otype and non-otype parameters, which is beyond what we discussed
+// previously.  Type parameters must be usable in the declaration of
+// subsequent parameters: parameter T is used to declare parameters "low"
+// and "high".
+
+// Example usage:
+subrange(unsigned, 1, 31) day_of_month;
+subrange(char, 'a', 'z')  lcase;
+subrange(int, 0, (rand() & 0xF) ) foo;
+
+// What sorts of expressions can be used as arguments of otype generators?  Is
+// "subrange(int, 0, rand() & 0xF)" legal?  Probably.  The nearest C equivalent
+// to the "low" and "high" arguments is the array size in a variable-length
+// array declaration, and C allows assignment expressions there.
+
+// Convenient access to subrange bounds, for instance for iteration:
+forall (otype T, T low, T high)
+T lbound( subrange(T, low, high) v) {
+    return low;
+}
+
+forall (otype T, T low, T high)
+T hbound( subrange(T, low, high) v) {
+    return high;
+}
+
+// Example usage:
+unsigned lday = lbound(day_of_month);
+
+// Assignment from the base otype, with bounds checking.  I'll ignore the issue
+// of exception handling here.  Inlining allows the compiler to eliminate
+// bounds checks.
+forall (otype T | ordered(T), T low, T high)
+inline subrange(T, low, high) ?=?(subrange(T, low, high)* target, T source) {
+    if (low <= source && source <= high) *((T*)target) = source;
+    else abort();
+    return target;
+}
+
+// Assignment between subranges with a common base otype.  The bounds check
+// compares range bounds so that the compiler can optimize checks away when the
+// ranges are known to overlap.
+forall (otype T | ordered(T), T t_low, T t_high, T s_low, T s_high)
+inline subrange(T, t_low, t_high) ?=?(subrange(T, t_low, t_high)* target,
+				      subrange(T, s_low, s_high) source) {
+    if ( (t_low <= s_low || t_low <= source)
+	 && (s_high <= t_high || source <= t_high) ) *((T*)target) = source;
+    else abort();
+    return target;
+}
Index: sts/sum.c
===================================================================
--- tests/sum.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,123 +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.
-//
-// sum.c -- test resolvers ability to deal with many variables with the same name and to use the minimum number of casts
-//    necessary to disambiguate overloaded variable names.
-//
-// Author           : Peter A. Buhr
-// Created On       : Wed May 27 17:56:53 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug  2 08:03:09 2018
-// Update Count     : 279
-//
-
-#include <fstream.hfa>
-#include <stdlib.hfa>
-
-void ?{}( int & c, zero_t ) { c = 0; }					// not in prelude
-
-trait sumable( otype T ) {
-	void ?{}( T &, zero_t );							// 0 literal constructor
-	T ?+?( T, T );										// assortment of additions
-	T ?+=?( T &, T );
-	T ++?( T & );
-	T ?++( T & );
-}; // sumable
-
-forall( otype T | sumable( T ) )						// use trait
-T sum( size_t size, T a[] ) {
-	T total = 0;										// initialize by 0 constructor
-	for ( size_t i = 0; i < size; i += 1 )
-		total += a[i];									// select appropriate +
-	return total;
-} // sum
-
-// Not in prelude.
-unsigned char ?+?( unsigned char t1, unsigned char t2 ) { return (int)t1 + t2; } // cast forces integer addition, otherwise recursion
-unsigned char ?+=?( unsigned char & t1, unsigned char t2 ) { t1 = t1 + t2; return t1; }
-unsigned char ++?( unsigned char & t ) { t += 1; return t; }
-unsigned char ?++( unsigned char & t ) { unsigned char temp = t; t += 1; return temp; }
-
-// Not in prelude.
-void ?{}( unsigned char & c, zero_t ) { c = 0; }
-void ?{}( float & f, zero_t ) { f = 0.0; }
-void ?{}( double & d, zero_t ) { d = 0.0; }
-
-int main( void ) {
-	const int low = 5, High = 15, size = High - low;
-
-	unsigned char s = 0, a[size], v = (char)low;
-	for ( int i = 0; i < size; i += 1, v += 1 ) {
-		s += v;
-		a[i] = v;
-	} // for
-	sout | "sum from" | low | "to" | High | "is"
-		 | sum( size, (unsigned char *)a ) | ", check" | (int)s | endl;
-
-	int s = 0, a[size], v = low;
-	for ( int i = 0; i < size; i += 1, v += 1 ) {
-		s += (int)v;
-		a[i] = (int)v;
-	} // for
-	sout | "sum from" | low | "to" | High | "is"
-		 | sum( size, (int *)a ) | ", check" | (int)s | endl;
-
-	float s = 0.0f, a[size], v = low / 10.0f;
-	for ( int i = 0; i < size; i += 1, v += 0.1f ) {
-		s += (float)v;
-		a[i] = (float)v;
-	} // for
-	sout | "sum from" | low / 10.0f | "to" | High / 10.0f | "is"
-		 | sum( size, (float *)a ) | ", check" | (float)s | endl;
-
-	double s = 0.0, a[size], v = low / 10.0;
-	for ( int i = 0; i < size; i += 1, v += 0.1 ) {
-		s += (double)v;
-		a[i] = (double)v;
-	} // for
-	sout | "sum from" | low / 10.0 | "to" | High / 10.0 | "is"
-		 | sum( size, (double *)a ) | ", check" | (double)s | endl;
-
-	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 }; }
-	S ?+=?( S & t1, S t2 ) { t1 = t1 + t2; return t1; }
-	S ++?( S & t ) { t += (S){1}; return t; }
-	S ?++( S & t ) { S temp = t; t += (S){1}; return temp; }
-	ofstream & ?|?( ofstream & os, S v ) { return os | v.i | v.j; }
-
-	S s = (S){0}, a[size], v = { low, low };
-	for ( int i = 0; i < size; i += 1, v += (S){1} ) {
-		s += (S)v;
-		a[i] = (S)v;
-	} // for
-	sout | "sum from" | low | "to" | High | "is"
-		 | sum( size, (S *)a ) | ", check" | (S)s | endl;
-
-	forall( otype Impl | sumable( Impl ) )
-	struct GS {
-		Impl * x, * y;
-	};
-	GS(int) gs;
-	gs.x = anew( size );								// create array storage for field
-	s = 0; v = low;
-	for ( int i = 0; i < size; i += 1, v += 1 ) {
-		s += (int)v;
-		gs.x[i] = (int)v;								// set field array in generic type
-	} // for
-	sout | "sum from" | low | "to" | High | "is"
-		 | sum( size, gs.x ) | ", check" | (int)s | endl; // add field array in generic type
-	delete( gs.x );
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa sum.c" //
-// End: //
Index: tests/sum.cfa
===================================================================
--- tests/sum.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/sum.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,123 @@
+//
+// 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.
+//
+// sum.cfa -- test resolvers ability to deal with many variables with the same name and to use the minimum number of
+//    casts necessary to disambiguate overloaded variable names.
+//
+// Author           : Peter A. Buhr
+// Created On       : Wed May 27 17:56:53 2015
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 18:01:10 2018
+// Update Count     : 280
+//
+
+#include <fstream.hfa>
+#include <stdlib.hfa>
+
+void ?{}( int & c, zero_t ) { c = 0; }					// not in prelude
+
+trait sumable( otype T ) {
+	void ?{}( T &, zero_t );							// 0 literal constructor
+	T ?+?( T, T );										// assortment of additions
+	T ?+=?( T &, T );
+	T ++?( T & );
+	T ?++( T & );
+}; // sumable
+
+forall( otype T | sumable( T ) )						// use trait
+T sum( size_t size, T a[] ) {
+	T total = 0;										// initialize by 0 constructor
+	for ( size_t i = 0; i < size; i += 1 )
+		total += a[i];									// select appropriate +
+	return total;
+} // sum
+
+// Not in prelude.
+unsigned char ?+?( unsigned char t1, unsigned char t2 ) { return (int)t1 + t2; } // cast forces integer addition, otherwise recursion
+unsigned char ?+=?( unsigned char & t1, unsigned char t2 ) { t1 = t1 + t2; return t1; }
+unsigned char ++?( unsigned char & t ) { t += 1; return t; }
+unsigned char ?++( unsigned char & t ) { unsigned char temp = t; t += 1; return temp; }
+
+// Not in prelude.
+void ?{}( unsigned char & c, zero_t ) { c = 0; }
+void ?{}( float & f, zero_t ) { f = 0.0; }
+void ?{}( double & d, zero_t ) { d = 0.0; }
+
+int main( void ) {
+	const int low = 5, High = 15, size = High - low;
+
+	unsigned char s = 0, a[size], v = (char)low;
+	for ( int i = 0; i < size; i += 1, v += 1 ) {
+		s += v;
+		a[i] = v;
+	} // for
+	sout | "sum from" | low | "to" | High | "is"
+		 | sum( size, (unsigned char *)a ) | ", check" | (int)s | endl;
+
+	int s = 0, a[size], v = low;
+	for ( int i = 0; i < size; i += 1, v += 1 ) {
+		s += (int)v;
+		a[i] = (int)v;
+	} // for
+	sout | "sum from" | low | "to" | High | "is"
+		 | sum( size, (int *)a ) | ", check" | (int)s | endl;
+
+	float s = 0.0f, a[size], v = low / 10.0f;
+	for ( int i = 0; i < size; i += 1, v += 0.1f ) {
+		s += (float)v;
+		a[i] = (float)v;
+	} // for
+	sout | "sum from" | low / 10.0f | "to" | High / 10.0f | "is"
+		 | sum( size, (float *)a ) | ", check" | (float)s | endl;
+
+	double s = 0.0, a[size], v = low / 10.0;
+	for ( int i = 0; i < size; i += 1, v += 0.1 ) {
+		s += (double)v;
+		a[i] = (double)v;
+	} // for
+	sout | "sum from" | low / 10.0 | "to" | High / 10.0 | "is"
+		 | sum( size, (double *)a ) | ", check" | (double)s | endl;
+
+	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 }; }
+	S ?+=?( S & t1, S t2 ) { t1 = t1 + t2; return t1; }
+	S ++?( S & t ) { t += (S){1}; return t; }
+	S ?++( S & t ) { S temp = t; t += (S){1}; return temp; }
+	ofstream & ?|?( ofstream & os, S v ) { return os | v.i | v.j; }
+
+	S s = (S){0}, a[size], v = { low, low };
+	for ( int i = 0; i < size; i += 1, v += (S){1} ) {
+		s += (S)v;
+		a[i] = (S)v;
+	} // for
+	sout | "sum from" | low | "to" | High | "is"
+		 | sum( size, (S *)a ) | ", check" | (S)s | endl;
+
+	forall( otype Impl | sumable( Impl ) )
+	struct GS {
+		Impl * x, * y;
+	};
+	GS(int) gs;
+	gs.x = anew( size );								// create array storage for field
+	s = 0; v = low;
+	for ( int i = 0; i < size; i += 1, v += 1 ) {
+		s += (int)v;
+		gs.x[i] = (int)v;								// set field array in generic type
+	} // for
+	sout | "sum from" | low | "to" | High | "is"
+		 | sum( size, gs.x ) | ", check" | (int)s | endl; // add field array in generic type
+	delete( gs.x );
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa sum.cfa" //
+// End: //
Index: sts/swap.c
===================================================================
--- tests/swap.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,95 +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.
-//
-// swap.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Wed May 27 17:56:53 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Dec  7 09:13:13 2017
-// Update Count     : 71
-//
-
-#include <fstream.hfa>
-#include <stdlib.hfa>										// swap
-
-int main( void ) {
-	char c1 = 'a', c2 = 'b';
-	sout | "char\t\t\t" | c1 | ' ' | c2 | "\t\t\tswap ";
-	swap( c1, c2 );
-	sout | '\t' | c1 | ' ' | c2 | endl;
-
-	signed int i1 = -1, i2 = -2;
-	sout | "signed int\t\t" | i1 | i2 | "\t\t\tswap ";
-	swap( i1, i2 );
-	sout | '\t' | i1 | i2 | endl;
-
-	unsigned int ui1 = 1, ui2 = 2;
-	sout | "unsigned int\t\t" | ui1 | ui2 | "\t\t\tswap ";
-	swap( ui1, ui2 );
-	sout | '\t' | ui1 | ui2 | endl;
-
-	signed long int li1 = -1, li2 = -2;
-	sout | "signed long int\t\t" | li1 | li2 | "\t\t\tswap ";
-	swap( li1, li2 );
-	sout | '\t' | li1 | li2 | endl;
-
-	unsigned long int uli1 = 1, uli2 = 2;
-	sout | "unsigned long int\t" | uli1 | uli2 | "\t\t\tswap ";
-	swap( uli1, uli2 );
-	sout | '\t' | uli1 | uli2 | endl;
-
-	signed long long int lli1 = -1, lli2 = -2;
-	sout | "signed long long int\t" | lli1 | lli2 | "\t\t\tswap ";
-	swap( lli1, lli2 );
-	sout | '\t' | lli1 | lli2 | endl;
-
-	unsigned long long int ulli1 = 1, ulli2 = 2;
-	sout | "unsigned long long int\t" | ulli1 | ulli2 | "\t\t\tswap ";
-	swap( ulli1, ulli2 );
-	sout | '\t' | ulli1 | ulli2 | endl;
-
-	float f1 = 1.5, f2 = 2.5;
-	sout | "float\t\t\t" | f1 | f2 | "\t\t\tswap ";
-	swap( f1, f2 );
-	sout | '\t' | f1 | f2 | endl;
-
-	double d1 = 1.5, d2 = 2.5;
-	sout | "double\t\t\t" | d1 | d2 | "\t\t\tswap ";
-	swap( d1, d2 );
-	sout | '\t' | d1 | d2 | endl;
-
-	long double ld1 = 1.5, ld2 = 2.5;
-	sout | "long double\t\t" | ld1 | ld2 | "\t\t\tswap ";
-	swap( ld1, ld2 );
-	sout | '\t' | ld1 | ld2 | endl;
-
-	float _Complex fc1 = 1.5f+1.5if, fc2 = 2.5f+2.5if;
-	sout | "float _Complex\t\t" | fc1 | fc2 | "\tswap ";
-	swap( fc1, fc2 );
-	sout | '\t' | fc1 | fc2 | endl;
-
-	double _Complex dc1 = 1.5d+1.5id, dc2 = 2.5d+2.5id;
-	sout | "double _Complex\t\t" | dc1 | dc2 | "\tswap ";
-	swap( dc1, dc2 );
-	sout | '\t' | dc1 | dc2 | endl;
-
-	long double _Complex ldc1 = 1.5d+1.5il, ldc2 = 2.5d+2.5il;
-	sout | "long double _Complex\t" | ldc1 | ldc2 | "\tswap ";
-	swap( ldc1, ldc2 );
-	sout | '\t' | ldc1 | ldc2 | endl;
-
-	struct S { int i, j; } s1 = { 1, 2 }, s2 = { 2, 1 };
-	ofstream & ?|?( ofstream & os, S s ) { return os | s.i | s.j; }
-	sout | "struct S\t\t" | s1 | "," | s2 | "\t\tswap ";
-	swap( s1, s2 );
-	sout | '\t' | s1 | "," | s2 | endl;
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa swap.c" //
-// End: //
Index: tests/swap.cfa
===================================================================
--- tests/swap.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/swap.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,95 @@
+//
+// 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.
+//
+// swap.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Wed May 27 17:56:53 2015
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 18:01:23 2018
+// Update Count     : 72
+//
+
+#include <fstream.hfa>
+#include <stdlib.hfa>										// swap
+
+int main( void ) {
+	char c1 = 'a', c2 = 'b';
+	sout | "char\t\t\t" | c1 | ' ' | c2 | "\t\t\tswap ";
+	swap( c1, c2 );
+	sout | '\t' | c1 | ' ' | c2 | endl;
+
+	signed int i1 = -1, i2 = -2;
+	sout | "signed int\t\t" | i1 | i2 | "\t\t\tswap ";
+	swap( i1, i2 );
+	sout | '\t' | i1 | i2 | endl;
+
+	unsigned int ui1 = 1, ui2 = 2;
+	sout | "unsigned int\t\t" | ui1 | ui2 | "\t\t\tswap ";
+	swap( ui1, ui2 );
+	sout | '\t' | ui1 | ui2 | endl;
+
+	signed long int li1 = -1, li2 = -2;
+	sout | "signed long int\t\t" | li1 | li2 | "\t\t\tswap ";
+	swap( li1, li2 );
+	sout | '\t' | li1 | li2 | endl;
+
+	unsigned long int uli1 = 1, uli2 = 2;
+	sout | "unsigned long int\t" | uli1 | uli2 | "\t\t\tswap ";
+	swap( uli1, uli2 );
+	sout | '\t' | uli1 | uli2 | endl;
+
+	signed long long int lli1 = -1, lli2 = -2;
+	sout | "signed long long int\t" | lli1 | lli2 | "\t\t\tswap ";
+	swap( lli1, lli2 );
+	sout | '\t' | lli1 | lli2 | endl;
+
+	unsigned long long int ulli1 = 1, ulli2 = 2;
+	sout | "unsigned long long int\t" | ulli1 | ulli2 | "\t\t\tswap ";
+	swap( ulli1, ulli2 );
+	sout | '\t' | ulli1 | ulli2 | endl;
+
+	float f1 = 1.5, f2 = 2.5;
+	sout | "float\t\t\t" | f1 | f2 | "\t\t\tswap ";
+	swap( f1, f2 );
+	sout | '\t' | f1 | f2 | endl;
+
+	double d1 = 1.5, d2 = 2.5;
+	sout | "double\t\t\t" | d1 | d2 | "\t\t\tswap ";
+	swap( d1, d2 );
+	sout | '\t' | d1 | d2 | endl;
+
+	long double ld1 = 1.5, ld2 = 2.5;
+	sout | "long double\t\t" | ld1 | ld2 | "\t\t\tswap ";
+	swap( ld1, ld2 );
+	sout | '\t' | ld1 | ld2 | endl;
+
+	float _Complex fc1 = 1.5f+1.5if, fc2 = 2.5f+2.5if;
+	sout | "float _Complex\t\t" | fc1 | fc2 | "\tswap ";
+	swap( fc1, fc2 );
+	sout | '\t' | fc1 | fc2 | endl;
+
+	double _Complex dc1 = 1.5d+1.5id, dc2 = 2.5d+2.5id;
+	sout | "double _Complex\t\t" | dc1 | dc2 | "\tswap ";
+	swap( dc1, dc2 );
+	sout | '\t' | dc1 | dc2 | endl;
+
+	long double _Complex ldc1 = 1.5d+1.5il, ldc2 = 2.5d+2.5il;
+	sout | "long double _Complex\t" | ldc1 | ldc2 | "\tswap ";
+	swap( ldc1, ldc2 );
+	sout | '\t' | ldc1 | ldc2 | endl;
+
+	struct S { int i, j; } s1 = { 1, 2 }, s2 = { 2, 1 };
+	ofstream & ?|?( ofstream & os, S s ) { return os | s.i | s.j; }
+	sout | "struct S\t\t" | s1 | "," | s2 | "\t\tswap ";
+	swap( s1, s2 );
+	sout | '\t' | s1 | "," | s2 | endl;
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa swap.cfa" //
+// End: //
Index: sts/switch.c
===================================================================
--- tests/switch.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,107 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// switch.c -- 
-//
-// Author           : Peter A. Buhr
-// Created On       : Tue Jul 12 06:50:22 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar  8 07:33:05 2018
-// Update Count     : 36
-// 
-
-int f( int i ) { return i; }
-
-int main( void ) {
-	int i = 0;
-	switch ( i ) case 3 : i = 1;
-	switch ( i ) default : f( 3 );
-
-	switch ( 3 )
-	  default:
-	  case 2:
-	  case 3:
-		f( 3 );
-
-	switch ( i ) {}
-	switch ( i ) {
-	  case 3:
-		f( 3 );
-	} // switch
-
-	switch ( 3 ) {
-		int j;
-	  case 3:
-		break;
-	  case 4:
-		j = 0;
-	}
-
-	switch ( i ) {
-	  case 1, 2, 3:
-		switch ( i ) {
-		  case 2, 3, 4:
-			7;
-		}
-	}
-
-	switch ( i ) {
-		int j = 0;
-		int k = 0;
-		struct S { int i; };
-		S s;
-	  case 8~10:
-	  default:
-		i = 3;
-	  case 19:
-	  case 'A' ... 'Z':
-	  case 1 ... 6:
-	  case 20, 30:
-		j = 3;
-		f( 3 );
-		break;
-	} // switch
-
-	choose ( i ) case 3 : f( 3 );
-	choose ( i ) default : i = 1;
-
-	choose ( 3 )
-	  case 2:
-	  default:
-	  case 3:
-		f( 3 );
-
-	choose ( i ) {}
-	choose ( i ) {
-	  case 3:
-		f( 3 );
-	} // choose
-
-	choose ( i ) {
-		int j = 0;
-		int k = 0;
-		struct S { int i; };
-		S s;
-	  case 19:
-	  case 'A'...'Z':
-	  case 0 ...6:										// space required, or lexed as decimal point
-	  case 20, 30, 40:
-		i = 3;
-		f( 3 );
-	  default:
-		j = 3;
-	  case 8~10:
-		f( 3 );
-		fallthru;
-	  case 'd':
-		j = 5;
-	} // choose
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa switch.c" //
-// End: //
Index: tests/switch.cfa
===================================================================
--- tests/switch.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/switch.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,107 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// switch.cfa -- 
+//
+// Author           : Peter A. Buhr
+// Created On       : Tue Jul 12 06:50:22 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 18:01:34 2018
+// Update Count     : 37
+// 
+
+int f( int i ) { return i; }
+
+int main( void ) {
+	int i = 0;
+	switch ( i ) case 3 : i = 1;
+	switch ( i ) default : f( 3 );
+
+	switch ( 3 )
+	  default:
+	  case 2:
+	  case 3:
+		f( 3 );
+
+	switch ( i ) {}
+	switch ( i ) {
+	  case 3:
+		f( 3 );
+	} // switch
+
+	switch ( 3 ) {
+		int j;
+	  case 3:
+		break;
+	  case 4:
+		j = 0;
+	}
+
+	switch ( i ) {
+	  case 1, 2, 3:
+		switch ( i ) {
+		  case 2, 3, 4:
+			7;
+		}
+	}
+
+	switch ( i ) {
+		int j = 0;
+		int k = 0;
+		struct S { int i; };
+		S s;
+	  case 8~10:
+	  default:
+		i = 3;
+	  case 19:
+	  case 'A' ... 'Z':
+	  case 1 ... 6:
+	  case 20, 30:
+		j = 3;
+		f( 3 );
+		break;
+	} // switch
+
+	choose ( i ) case 3 : f( 3 );
+	choose ( i ) default : i = 1;
+
+	choose ( 3 )
+	  case 2:
+	  default:
+	  case 3:
+		f( 3 );
+
+	choose ( i ) {}
+	choose ( i ) {
+	  case 3:
+		f( 3 );
+	} // choose
+
+	choose ( i ) {
+		int j = 0;
+		int k = 0;
+		struct S { int i; };
+		S s;
+	  case 19:
+	  case 'A'...'Z':
+	  case 0 ...6:										// space required, or lexed as decimal point
+	  case 20, 30, 40:
+		i = 3;
+		f( 3 );
+	  default:
+		j = 3;
+	  case 8~10:
+		f( 3 );
+		fallthru;
+	  case 'd':
+		j = 5;
+	} // choose
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa switch.cfa" //
+// End: //
Index: tests/test.c
===================================================================
--- tests/test.c	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/test.c	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,9 @@
+int main() {
+    basetypeof( const unsigned int ) usi;	// unsigned int
+    volatile const signed char ch;
+    basetypeof( ch ) sc;					// signed char
+    enum { N = 3 };
+    basetypeof( N ) si;						// signed int
+
+//    for ( t; N ) {}
+}
Index: sts/time.c
===================================================================
--- tests/time.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,71 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// time.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Tue Mar 27 17:24:56 2018
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Apr  6 11:27:23 2018
-// Update Count     : 16
-//
-
-#include "time.hfa"
-#include <fstream.hfa>
-
-int main() {
-	Duration d1 = 3`h, d2 = 2`s, d3 = 3.375`s, d4 = 12`s, d5 = 1`s + 10_000`ns;
-	sout | d1 | d2 | d3 | d4 | d5 | endl;
-	int i;
-	d1 = 0;
-	sout | d1 | d2 | d3 | endl;
-	d1 = 7`s;
-	d3 = d2 = d1;
-	sout | d1 | d2 | d3 | endl;
-	d1 = d1 + d2;
-	sout | d1 | endl;
-	sout | d1 == 7`s | d1 == d2 | d1 == 0 | endl;
-	sout | div( 7`s, 2`s ) | endl;
-	sout | endl;
-
-	Time t = { 1970, 1, 2, 0, 0, 0, 10_000_000 };
-	sout | t | endl;
-	t = t + d1;
-	sout | t | t.tv | endl;
-	Time t1 = (timespec){ 104_414, 10_000_000 };
-	sout | t1 | t1.tv | endl;
-	sout | t - t  | t + d5 | t.tv | endl;
-	char buf[16];
-	sout | "yy/mm/dd" | [t, buf]`ymd;					// shared buf => separate calls
-	sout | "mm/dd/yy" | mm_dd_yy( t, buf );
-	strftime( buf, 16, "%D", t );						// %D => mm/dd/yy
-	sout | "mm/dd/yy" | buf;
-	sout | "dd/yy/mm" | [t, buf]`dmy | endl;
-	Time t2 = { 2001, 7, 4, 0, 0, 1, 0 }, t3 = (timeval){ 994_219_201 };
-	sout | t2 | t2.tv | endl | t3 | t3.tv | endl;
-	sout | endl;
-
-	// Clock Newfoundland = { -3.5`h }, PST = { -8`h };	// distance from GMT (UTC)
-	// sout | "Clock Resolution" | getRes() | endl
-	// 	 | "Newfoundland" | getTime( Newfoundland ) | endl
-	// 	 | "local" | getTime() | endl
-	// 	 | "local nsec" | getTimeNsec() | endl
-	// 	 | "PST" | PST() | endl;						// getTime short form
-	// sout | endl;
-
-	// http://en.cppreference.com/w/cpp/chrono/duration/operator_arith4
-	Duration s = 1`h + 2 * 10`m + 70`s / 10;
-	sout | "1 hour + 2*10 min + 70/10 sec = " | s | "seconds" | endl;
-	sout | "Dividing that by 2 minutes gives" | s / 2`m | endl;
-	sout | "Dividing that by 2 gives" | s / 2 | "seconds\n";
-	sout | s | "seconds is" | s`h | "hours," | (s % 1`h)`m | "minutes," | (s % 1`m)`s | "seconds" | endl;
-} // main
-
-// Local Variables: //
-// mode: c //
-// tab-width: 4 //
-// compile-command: "cfa time.c" //
-// End: //
Index: tests/time.cfa
===================================================================
--- tests/time.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/time.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,71 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// time.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Tue Mar 27 17:24:56 2018
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 18:01:45 2018
+// Update Count     : 17
+//
+
+#include "time.hfa"
+#include <fstream.hfa>
+
+int main() {
+	Duration d1 = 3`h, d2 = 2`s, d3 = 3.375`s, d4 = 12`s, d5 = 1`s + 10_000`ns;
+	sout | d1 | d2 | d3 | d4 | d5 | endl;
+	int i;
+	d1 = 0;
+	sout | d1 | d2 | d3 | endl;
+	d1 = 7`s;
+	d3 = d2 = d1;
+	sout | d1 | d2 | d3 | endl;
+	d1 = d1 + d2;
+	sout | d1 | endl;
+	sout | d1 == 7`s | d1 == d2 | d1 == 0 | endl;
+	sout | div( 7`s, 2`s ) | endl;
+	sout | endl;
+
+	Time t = { 1970, 1, 2, 0, 0, 0, 10_000_000 };
+	sout | t | endl;
+	t = t + d1;
+	sout | t | t.tv | endl;
+	Time t1 = (timespec){ 104_414, 10_000_000 };
+	sout | t1 | t1.tv | endl;
+	sout | t - t  | t + d5 | t.tv | endl;
+	char buf[16];
+	sout | "yy/mm/dd" | [t, buf]`ymd;					// shared buf => separate calls
+	sout | "mm/dd/yy" | mm_dd_yy( t, buf );
+	strftime( buf, 16, "%D", t );						// %D => mm/dd/yy
+	sout | "mm/dd/yy" | buf;
+	sout | "dd/yy/mm" | [t, buf]`dmy | endl;
+	Time t2 = { 2001, 7, 4, 0, 0, 1, 0 }, t3 = (timeval){ 994_219_201 };
+	sout | t2 | t2.tv | endl | t3 | t3.tv | endl;
+	sout | endl;
+
+	// Clock Newfoundland = { -3.5`h }, PST = { -8`h };	// distance from GMT (UTC)
+	// sout | "Clock Resolution" | getRes() | endl
+	// 	 | "Newfoundland" | getTime( Newfoundland ) | endl
+	// 	 | "local" | getTime() | endl
+	// 	 | "local nsec" | getTimeNsec() | endl
+	// 	 | "PST" | PST() | endl;						// getTime short form
+	// sout | endl;
+
+	// http://en.cppreference.com/w/cpp/chrono/duration/operator_arith4
+	Duration s = 1`h + 2 * 10`m + 70`s / 10;
+	sout | "1 hour + 2*10 min + 70/10 sec = " | s | "seconds" | endl;
+	sout | "Dividing that by 2 minutes gives" | s / 2`m | endl;
+	sout | "Dividing that by 2 gives" | s / 2 | "seconds\n";
+	sout | s | "seconds is" | s`h | "hours," | (s % 1`h)`m | "minutes," | (s % 1`m)`s | "seconds" | endl;
+} // main
+
+// Local Variables: //
+// mode: c //
+// tab-width: 4 //
+// compile-command: "cfa time.cfa" //
+// End: //
Index: sts/typeGenerator.c
===================================================================
--- tests/typeGenerator.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,30 +1,0 @@
-context addable( otype T ) {
-	T ?+?( T,T );
-	T ?=?( T*, T);
-};
-
-otype List1( otype T | addable( T ) ) = struct { T data; List1( T ) *next; } *;
-typedef List1( int ) ListOfIntegers;
-//List1( int ) li;
-ListOfIntegers li;
-int f( List1( int ) ( (*g ))( int ) );
-[int] h( * List1( int ) p );							// new declaration syntax
-
-struct( otype T ) S2 { T i; };							// actual definition
-struct( int ) S3 v1, *p;								// expansion and instantiation
-struct( otype T )( int ) S24 { T i; } v2;				// actual definition, expansion and instantiation
-struct( otype T )( int ) { T i; } v2;					// anonymous actual definition, expansion and instantiation
-
-struct( otype T | addable( T ) ) node { T data; struct( T ) node *next; };
-otype List( otype T ) = struct( T ) node *;
-List( int ) my_list;
-
-otype Complex | addable( Complex );
-
-int main() {
-	(struct( int ) node)my_list;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: tests/typeGenerator.cfa
===================================================================
--- tests/typeGenerator.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/typeGenerator.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,30 @@
+context addable( otype T ) {
+	T ?+?( T,T );
+	T ?=?( T*, T);
+};
+
+otype List1( otype T | addable( T ) ) = struct { T data; List1( T ) *next; } *;
+typedef List1( int ) ListOfIntegers;
+//List1( int ) li;
+ListOfIntegers li;
+int f( List1( int ) ( (*g ))( int ) );
+[int] h( * List1( int ) p );							// new declaration syntax
+
+struct( otype T ) S2 { T i; };							// actual definition
+struct( int ) S3 v1, *p;								// expansion and instantiation
+struct( otype T )( int ) S24 { T i; } v2;				// actual definition, expansion and instantiation
+struct( otype T )( int ) { T i; } v2;					// anonymous actual definition, expansion and instantiation
+
+struct( otype T | addable( T ) ) node { T data; struct( T ) node *next; };
+otype List( otype T ) = struct( T ) node *;
+List( int ) my_list;
+
+otype Complex | addable( Complex );
+
+int main() {
+	(struct( int ) node)my_list;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: sts/typedef.c
===================================================================
--- tests/typedef.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,47 +1,0 @@
-typedef int T;
-
-void f( void ) {
-    int T( T p ) { return 3; }
-    T( 3 );
-}
-
-struct {
-    T (T);
-} fred = { 3 };
-
-typedef int (*a)(int, char);
-a b;
-
-int g(void) {
-    double a;
-}
-a c;
-
-typedef typeof(3) x, y;  // GCC
-
-x p;
-y q;
-
-int main() {
-    typedef typeof(3) z, p;
-    z w;
-    p x;
-}
-
-// new-style function definitions
-
-typedef [10] * int arrayOf10Pointers;
-arrayOf10Pointers array;
-typedef const * int constantPointer;
-typedef * [ int ]( [] int ) funcPtr;
-typedef [ int ] funcProto( []  int );
-typedef [ int, int ] tupleType;
-typedef * [ int, int ] tupleTypePtr;
-typedef * int c, d;
-typedef [ int ] f( * int ), g;
-typedef [ * [static 10] int ] t;
-typedef [ * [static 10] int x ] h();
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: tests/typedef.cfa
===================================================================
--- tests/typedef.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/typedef.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,47 @@
+typedef int T;
+
+void f( void ) {
+    int T( T p ) { return 3; }
+    T( 3 );
+}
+
+struct {
+    T (T);
+} fred = { 3 };
+
+typedef int (*a)(int, char);
+a b;
+
+int g(void) {
+    double a;
+}
+a c;
+
+typedef typeof(3) x, y;  // GCC
+
+x p;
+y q;
+
+int main() {
+    typedef typeof(3) z, p;
+    z w;
+    p x;
+}
+
+// new-style function definitions
+
+typedef [10] * int arrayOf10Pointers;
+arrayOf10Pointers array;
+typedef const * int constantPointer;
+typedef * [ int ]( [] int ) funcPtr;
+typedef [ int ] funcProto( []  int );
+typedef [ int, int ] tupleType;
+typedef * [ int, int ] tupleTypePtr;
+typedef * int c, d;
+typedef [ int ] f( * int ), g;
+typedef [ * [static 10] int ] t;
+typedef [ * [static 10] int x ] h();
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: sts/typedefDeclarator.c
===================================================================
--- tests/typedefDeclarator.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,120 +1,0 @@
-typedef int
-	 f0,  f1,  f2,  f3,  f4,  f5,  f6,  f7,  f8,  f9,
-	f10, f11, f12, f13, f14, f15, f16, f17, f18, f19,
-	f20, f21, f22, f23, f24, f25, f26, f27, f28, f29,
-	f30, f31, f32, f33, f34, f35, f36, f37, f38, f39,
-	f40, f41, f42, f43, f44, f45, f46, f47, f48, f49,
-	f50, f51, f52, f53, f54, f55, f56, f57, f58, f59,
-	f60, f61, f62, f63, f64, f65, f66, f67, f68, f69,
-	f70, f71, f72, f73, f74, f75, f76, f77, f78, f79,
-	f80, f81, f82, f83, f84, f85, f86, f87, f88, f89;
-
-int main() {
-	//int f0[]();
-	//int (f0[])();
-	//int f0()[];
-	//int f0()();
-	//int (*f0)()();
-	//int ((*f0())())[];
-	
-	int f1;
-	int (f2);
-
-	int *f3;
-	int **f4;
-	int * const *f5;
-	int * const * const f6;
-
-	int *(f7);
-	int **(f8);
-	int * const *(f9);
-	int * const * const (f10);
-
-	int (*f11);
-	int (**f12);
-	int (* const *f13);
-	int (* const * const f14);
-
-	int f15[];
-	int f16[10];
-	int (f17[]);
-	int (f18[10]);
-
-	int *f19[];
-	int *f20[10];
-	int **f21[];
-	int **f22[10];
-	int * const *f23[];
-	int * const *f24[10];
-	int * const * const f25[];
-	int * const * const f26[10];
-
-	int *(f27[]);
-	int *(f28[10]);
-	int **(f29[]);
-	int **(f30[10]);
-	int * const *(f31[]);
-	int * const *(f32[10]);
-	int * const * const (f33[]);
-	int * const * const (f34[10]);
-
-	int (*f35[]);
-	int (*f36[10]);
-	int (**f37[]);
-	int (**f38[10]);
-	int (* const *f39[]);
-	int (* const *f40[10]);
-	int (* const * const f41[]);
-	int (* const * const f42[10]);
-
-	int f43[][3];
-	int f44[3][3];
-	int (f45[])[3];
-	int (f46[3])[3];
-	int ((f47[]))[3];
-	int ((f48[3]))[3];
-
-	int *f49[][3];
-	int *f50[3][3];
-	int **f51[][3];
-	int **f52[3][3];
-	int * const *f53[][3];
-	int * const *f54[3][3];
-	int * const * const f55[][3];
-	int * const * const f56[3][3];
-
-	int (*f57[][3]);
-	int (*f58[3][3]);
-	int (**f59[][3]);
-	int (**f60[3][3]);
-	int (* const *f61[][3]);
-	int (* const *f62[3][3]);
-	int (* const * const f63[][3]);
-	int (* const * const f64[3][3]);
-
-	int f65(int);
-	int (f66)(int);
-
-	int *f67(int);
-	int **f68(int);
-	int * const *f69(int);
-	int * const * const f70(int);
-
-	int *(f71)(int);
-	int **(f72)(int);
-	int * const *(f73)(int);
-	int * const * const (f74)(int);
-
-	int (*f75)(int);
-	int (**f76)(int);
-	int (* const *f77)(int);
-	int (* const * const f78)(int);
-
-	int (*(*f79)(int))();
-	int (*(* const f80)(int))();
-	int (* const(* const f81)(int))();
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: tests/typedefDeclarator.cfa
===================================================================
--- tests/typedefDeclarator.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/typedefDeclarator.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,120 @@
+typedef int
+	 f0,  f1,  f2,  f3,  f4,  f5,  f6,  f7,  f8,  f9,
+	f10, f11, f12, f13, f14, f15, f16, f17, f18, f19,
+	f20, f21, f22, f23, f24, f25, f26, f27, f28, f29,
+	f30, f31, f32, f33, f34, f35, f36, f37, f38, f39,
+	f40, f41, f42, f43, f44, f45, f46, f47, f48, f49,
+	f50, f51, f52, f53, f54, f55, f56, f57, f58, f59,
+	f60, f61, f62, f63, f64, f65, f66, f67, f68, f69,
+	f70, f71, f72, f73, f74, f75, f76, f77, f78, f79,
+	f80, f81, f82, f83, f84, f85, f86, f87, f88, f89;
+
+int main() {
+	//int f0[]();
+	//int (f0[])();
+	//int f0()[];
+	//int f0()();
+	//int (*f0)()();
+	//int ((*f0())())[];
+	
+	int f1;
+	int (f2);
+
+	int *f3;
+	int **f4;
+	int * const *f5;
+	int * const * const f6;
+
+	int *(f7);
+	int **(f8);
+	int * const *(f9);
+	int * const * const (f10);
+
+	int (*f11);
+	int (**f12);
+	int (* const *f13);
+	int (* const * const f14);
+
+	int f15[];
+	int f16[10];
+	int (f17[]);
+	int (f18[10]);
+
+	int *f19[];
+	int *f20[10];
+	int **f21[];
+	int **f22[10];
+	int * const *f23[];
+	int * const *f24[10];
+	int * const * const f25[];
+	int * const * const f26[10];
+
+	int *(f27[]);
+	int *(f28[10]);
+	int **(f29[]);
+	int **(f30[10]);
+	int * const *(f31[]);
+	int * const *(f32[10]);
+	int * const * const (f33[]);
+	int * const * const (f34[10]);
+
+	int (*f35[]);
+	int (*f36[10]);
+	int (**f37[]);
+	int (**f38[10]);
+	int (* const *f39[]);
+	int (* const *f40[10]);
+	int (* const * const f41[]);
+	int (* const * const f42[10]);
+
+	int f43[][3];
+	int f44[3][3];
+	int (f45[])[3];
+	int (f46[3])[3];
+	int ((f47[]))[3];
+	int ((f48[3]))[3];
+
+	int *f49[][3];
+	int *f50[3][3];
+	int **f51[][3];
+	int **f52[3][3];
+	int * const *f53[][3];
+	int * const *f54[3][3];
+	int * const * const f55[][3];
+	int * const * const f56[3][3];
+
+	int (*f57[][3]);
+	int (*f58[3][3]);
+	int (**f59[][3]);
+	int (**f60[3][3]);
+	int (* const *f61[][3]);
+	int (* const *f62[3][3]);
+	int (* const * const f63[][3]);
+	int (* const * const f64[3][3]);
+
+	int f65(int);
+	int (f66)(int);
+
+	int *f67(int);
+	int **f68(int);
+	int * const *f69(int);
+	int * const * const f70(int);
+
+	int *(f71)(int);
+	int **(f72)(int);
+	int * const *(f73)(int);
+	int * const * const (f74)(int);
+
+	int (*f75)(int);
+	int (**f76)(int);
+	int (* const *f77)(int);
+	int (* const * const f78)(int);
+
+	int (*(*f79)(int))();
+	int (*(* const f80)(int))();
+	int (* const(* const f81)(int))();
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: sts/typedefRedef.c
===================================================================
--- tests/typedefRedef.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,69 +1,0 @@
-typedef volatile struct Foo FooInterm;
-typedef const FooInterm Foo;
-#ifdef ERR1
-typedef struct Foo Foo;
-#endif
-
-typedef int ** pt;
-typedef int ** pt;
-
-#ifdef __CFA__
-extern "C" {
-#endif
-typedef int __io_read_fn ( char buf);
-typedef int __io_write_fn ( const char buf);
-
-
-__io_read_fn read;
-__io_write_fn write;
-#ifdef __CFA__
-}
-#endif
-
-int sz;
-typedef int FUNC(int, ...);
-typedef int FUNC(int, ...);
-
-typedef int ARR[];
-typedef int ARR[];
-// #ifdef ERR1
-// if a typedef has an array dimension,
-// it can only be redefined to the same dimension
-typedef int ARR[2];
-// #endif
-
-typedef int X;
-typedef int Y;
-typedef Y Y2;
-typedef X X2;
-
-typedef Y2 Z;
-typedef X2 Z;
-
-typedef Z X2;
-typedef int X2;
-typedef Z X2;
-typedef int X2;
-
-// xxx - this doesn't work yet due to parsing problems with generic types
-// #ifdef __CFA__
-// typedef forall(type T) void foo(T);
-// typedef forall(type T) void foo(T);
-// typedef forall(type S) void foo(S); // should be allowed to do this...
-// #endif
-
-int main() {
-  typedef int ARR[sz];
-
-  // can't redefine typedef which is VLA
-#if ERR1
-  typedef int ARR[sz];
-#endif
-
-  Foo *x;
-
-  typedef struct Bar Foo;
-  Foo *y;
-
-  typedef int *** pt;
-}
Index: tests/typedefRedef.cfa
===================================================================
--- tests/typedefRedef.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/typedefRedef.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,69 @@
+typedef volatile struct Foo FooInterm;
+typedef const FooInterm Foo;
+#ifdef ERR1
+typedef struct Foo Foo;
+#endif
+
+typedef int ** pt;
+typedef int ** pt;
+
+#ifdef __CFA__
+extern "C" {
+#endif
+typedef int __io_read_fn ( char buf);
+typedef int __io_write_fn ( const char buf);
+
+
+__io_read_fn read;
+__io_write_fn write;
+#ifdef __CFA__
+}
+#endif
+
+int sz;
+typedef int FUNC(int, ...);
+typedef int FUNC(int, ...);
+
+typedef int ARR[];
+typedef int ARR[];
+// #ifdef ERR1
+// if a typedef has an array dimension,
+// it can only be redefined to the same dimension
+typedef int ARR[2];
+// #endif
+
+typedef int X;
+typedef int Y;
+typedef Y Y2;
+typedef X X2;
+
+typedef Y2 Z;
+typedef X2 Z;
+
+typedef Z X2;
+typedef int X2;
+typedef Z X2;
+typedef int X2;
+
+// xxx - this doesn't work yet due to parsing problems with generic types
+// #ifdef __CFA__
+// typedef forall(type T) void foo(T);
+// typedef forall(type T) void foo(T);
+// typedef forall(type S) void foo(S); // should be allowed to do this...
+// #endif
+
+int main() {
+  typedef int ARR[sz];
+
+  // can't redefine typedef which is VLA
+#if ERR1
+  typedef int ARR[sz];
+#endif
+
+  Foo *x;
+
+  typedef struct Bar Foo;
+  Foo *y;
+
+  typedef int *** pt;
+}
Index: sts/typeof.c
===================================================================
--- tests/typeof.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,11 +1,0 @@
-int main() {
-    int *v1;
-    typeof(v1) v2;
-    typeof(*v1) v3[4];
-    char *v4[4];
-    typeof(typeof(char *)[4]) v5;
-    typeof (int *) v6;
-    typeof( int ( int, int p ) ) *v7;
-    typeof( [int] ( int, int p ) ) *v8;
-    (typeof(v1)) v2; // cast with typeof
-}
Index: tests/typeof.cfa
===================================================================
--- tests/typeof.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/typeof.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,11 @@
+int main() {
+    int *v1;
+    typeof(v1) v2;
+    typeof(*v1) v3[4];
+    char *v4[4];
+    typeof(typeof(char *)[4]) v5;
+    typeof (int *) v6;
+    typeof( int ( int, int p ) ) *v7;
+    typeof( [int] ( int, int p ) ) *v8;
+    (typeof(v1)) v2; // cast with typeof
+}
Index: tests/userLiterals.cfa
===================================================================
--- tests/userLiterals.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/userLiterals.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,93 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// user_literals.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Wed Sep  6 21:40:50 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 18:02:03 2018
+// Update Count     : 55
+//
+
+#include <fstream.hfa>
+#include <wchar.h>
+#include <uchar.h>
+
+int ?`s( int s ) { sout | "secs" | s | endl; return s; }
+int ?`m( int m ) { sout | "mins" | m | endl; return m * 60; }
+int ?`h( int h ) { sout | "hours" | h | endl; return h * 3600; }
+int ?`_A_( int x ) { sout | "_A_" | x | endl; return x; }
+int ?`__thingy_( int x ) { sout | "_thingy_" | x | endl; return x; }
+
+int ?`s( const char * s ) { sout | "secs" | s | endl; return 0; }
+int ?`m( const char16_t * m ) { sout | "mins" | m | endl; return 0;}
+int ?`h( const char32_t * h ) { sout | "hours" | h | endl; return 0; }
+int ?`_A_( const wchar_t * str ) { sout | "_A_" | str | endl; return 0; }
+int ?`__thingy_( const char * str ) { sout | "_thingy_" | str | endl; return 0; }
+
+
+struct Weight { double stones; };
+void ?{}( Weight & w ) { w.stones = 0; }
+void ?{}( Weight & w, double w ) { w.stones = w; }
+Weight ?+?( Weight l, Weight r ) {
+	return (Weight){ l.stones + r.stones };
+}
+ofstream & ?|?( ofstream & os, Weight w ) { return os | w.stones; }
+
+Weight ?`st( double w ) { return (Weight){ w }; }		// backquote for user literals
+Weight ?`lb( double w ) { return (Weight){ w / 14.0 }; }
+Weight ?`kg( double w ) { return (Weight) { w * 0.16 }; }
+
+int main() {
+	Weight w, heavy = { 20 };							// 20 stone
+	w = 155`lb;
+	sout | w | endl;
+	w = 0b_1111`st;
+	sout | w | endl;
+	w = 0_233`lb;										// octal weight (155)
+	sout | w | endl;
+	w = 0x_9b_u`kg;
+	sout | w | endl;
+	w = 70.3`kg;
+	sout | w | endl;
+	w = 11`st + 1`lb;
+	sout | w | endl;
+	w = 5`st + 8`kg + 25`lb + heavy;
+	sout | w | endl;
+
+//	0`secs;
+	1`s;
+	23`s;
+	23u`m;
+	23l`h;
+	23_ul`_A_;
+	1_234_LL`__thingy_;
+
+	0xff_ffl;
+	0xff_ff`s;
+	0xff_ffu`m;
+	0xff_ffl`h;
+	0xff_fful`_A_;
+	0xff_ffLL`__thingy_;
+
+	'\n'`s;
+	L'\n'`h;
+	u'\n'`m;
+	L_'\n'`_A_;
+	U_'\n'`__thingy_;
+
+	"abc"`s;
+//	u"abc"`m;
+//	U_"abc"`h;
+//	L"abc"`_A_;
+	u8_"abc"`__thingy_;
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa user_literals.cfa" //
+// End: //
Index: sts/user_literals.c
===================================================================
--- tests/user_literals.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,93 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// user_literals.c --
-//
-// Author           : Peter A. Buhr
-// Created On       : Wed Sep  6 21:40:50 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Apr 29 16:51:42 2018
-// Update Count     : 54
-//
-
-#include <fstream.hfa>
-#include <wchar.h>
-#include <uchar.h>
-
-int ?`s( int s ) { sout | "secs" | s | endl; return s; }
-int ?`m( int m ) { sout | "mins" | m | endl; return m * 60; }
-int ?`h( int h ) { sout | "hours" | h | endl; return h * 3600; }
-int ?`_A_( int x ) { sout | "_A_" | x | endl; return x; }
-int ?`__thingy_( int x ) { sout | "_thingy_" | x | endl; return x; }
-
-int ?`s( const char * s ) { sout | "secs" | s | endl; return 0; }
-int ?`m( const char16_t * m ) { sout | "mins" | m | endl; return 0;}
-int ?`h( const char32_t * h ) { sout | "hours" | h | endl; return 0; }
-int ?`_A_( const wchar_t * str ) { sout | "_A_" | str | endl; return 0; }
-int ?`__thingy_( const char * str ) { sout | "_thingy_" | str | endl; return 0; }
-
-
-struct Weight { double stones; };
-void ?{}( Weight & w ) { w.stones = 0; }
-void ?{}( Weight & w, double w ) { w.stones = w; }
-Weight ?+?( Weight l, Weight r ) {
-	return (Weight){ l.stones + r.stones };
-}
-ofstream & ?|?( ofstream & os, Weight w ) { return os | w.stones; }
-
-Weight ?`st( double w ) { return (Weight){ w }; }		// backquote for user literals
-Weight ?`lb( double w ) { return (Weight){ w / 14.0 }; }
-Weight ?`kg( double w ) { return (Weight) { w * 0.16 }; }
-
-int main() {
-	Weight w, heavy = { 20 };							// 20 stone
-	w = 155`lb;
-	sout | w | endl;
-	w = 0b_1111`st;
-	sout | w | endl;
-	w = 0_233`lb;										// octal weight (155)
-	sout | w | endl;
-	w = 0x_9b_u`kg;
-	sout | w | endl;
-	w = 70.3`kg;
-	sout | w | endl;
-	w = 11`st + 1`lb;
-	sout | w | endl;
-	w = 5`st + 8`kg + 25`lb + heavy;
-	sout | w | endl;
-
-//	0`secs;
-	1`s;
-	23`s;
-	23u`m;
-	23l`h;
-	23_ul`_A_;
-	1_234_LL`__thingy_;
-
-	0xff_ffl;
-	0xff_ff`s;
-	0xff_ffu`m;
-	0xff_ffl`h;
-	0xff_fful`_A_;
-	0xff_ffLL`__thingy_;
-
-	'\n'`s;
-	L'\n'`h;
-	u'\n'`m;
-	L_'\n'`_A_;
-	U_'\n'`__thingy_;
-
-	"abc"`s;
-//	u"abc"`m;
-//	U_"abc"`h;
-//	L"abc"`_A_;
-	u8_"abc"`__thingy_;
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa user_literals.c" //
-// End: //
Index: sts/variableDeclarator.c
===================================================================
--- tests/variableDeclarator.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,185 +1,0 @@
-// 
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-// 
-// variableDeclarator.c -- 
-// 
-// Author           : Peter A. Buhr
-// Created On       : Wed Aug 17 08:41:42 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Aug 17 08:42:21 2016
-// Update Count     : 1
-// 
-
-// Variable declarations test
-int f1;
-int (f2);
-
-int *f3;
-int **f4;
-int * const *f5;
-int * const * const f6;
-
-int *(f7);
-int **(f8);
-int * const *(f9);
-int * const * const (f10);
-
-int (*f11);
-int (**f12);
-int (* const *f13);
-int (* const * const f14);
-
-int f15[];
-int f16[10];
-int (f17[]);
-int (f18[10]);
-
-int *f19[];
-int *f20[10];
-int **f21[];
-int **f22[10];
-int * const *f23[];
-int * const *f24[10];
-int * const * const f25[];
-int * const * const f26[10];
-
-int *(f27[]);
-int *(f28[10]);
-int **(f29[]);
-int **(f30[10]);
-int * const *(f31[]);
-int * const *(f32[10]);
-int * const * const (f33[]);
-int * const * const (f34[10]);
-
-int (*f35)[];
-int (*f36)[10];
-int (**f37)[];
-int (**f38)[10];
-int (* const *f39)[];
-int (* const *f40)[10];
-int (* const * const f41)[];
-int (* const * const f42)[10];
-
-int f43[][3];
-int f44[3][3];
-int (f45[])[3];
-int (f46[3])[3];
-int ((f47[]))[3];
-int ((f48[3]))[3];
-
-int *f49[][3];
-int *f50[3][3];
-int **f51[][3];
-int **f52[3][3];
-int * const *f53[][3];
-int * const *f54[3][3];
-int * const * const f55[][3];
-int * const * const f56[3][3];
-
-int (*f57[][3]);
-int (*f58[3][3]);
-int (**f59[][3]);
-int (**f60[3][3]);
-int (* const *f61[][3]);
-int (* const *f62[3][3]);
-int (* const * const f63[][3]);
-int (* const * const f64[3][3]);
-
-int f65(int);
-int (f66)(int);
-
-int *f67(int);
-int **f68(int);
-int * const *f69(int);
-int * const * const f70(int);
-
-int *(f71)(int);
-int **(f72)(int);
-int * const *(f73)(int);
-
-int * const * const (f74)(int);
-
-int (*f75)(int);
-int (**f76)(int);
-int (* const *f77)(int);
-int (* const * const f78)(int);
-
-int (*(*f79)(int))();
-int (*(* const f80)(int))();
-int (* const(* const f81)(int))();
-
-// errors
-
-//int fe0[]();				// array of functions
-//int (fe1[])();				// array of functions
-//int fe2()[];				// returning an array
-//int fe3()();				// returning a function
-//int (*fe4)()();				// returning a function
-//int ((*fe5())())[];			// returning an array
-
-// Cforall extensions
-
-* int cf3;
-* * int cf4;
-* const * int cf5;
-const * const * int cf6;
-
-[] int cf15;
-[10] int cf16;
-
-[] * int cf19;
-[10] * int cf20;
-int **cf21[];
-[10] * * int cf22;
-[] * const * int cf23;
-[10] * const * int cf24;
-[] const * const * int cf25;
-[10] const * const * int cf26;
-
-* [] int cf35;
-* [10] int cf36;
-* * [] int cf37;
-* * [10] int cf38;
-* const * [] int cf39;
-* const * [10] int cf40;
-const * const * [] int cf41;
-const * const * [10] int cf42;
-
-[][3] int cf43;
-[3][3] int cf44;
-
-[][3] * int cf49;
-[3][3] * int cf50;
-[][3] * * int cf51;
-[3][3] * * int cf52;
-[][3] const * int cf53;
-[3][3] * const * int cf54;
-[][3] const * const * int cf55;
-[3][3] const * const * int cf56;
-
-[int] cf65(int);
-[int] cf66(int);
-
-[* int] cf67(int);
-[* * int] cf68(int);
-[const * * int] cf69(int);
-[const * const * int] cf70(int);
-
-// function pointer
-
-*[]*[]* [ *[]*[] int ]( *[]*[] int, *[]*[] int ) v3;
-
-//Dummy main
-int main(int argc, char const *argv[])
-{
-	return 0;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa variableDeclarator.c" //
-// End: //
Index: tests/variableDeclarator.cfa
===================================================================
--- tests/variableDeclarator.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/variableDeclarator.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,185 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// variableDeclarator.cfa -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Wed Aug 17 08:41:42 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 18:02:16 2018
+// Update Count     : 2
+// 
+
+// Variable declarations test
+int f1;
+int (f2);
+
+int *f3;
+int **f4;
+int * const *f5;
+int * const * const f6;
+
+int *(f7);
+int **(f8);
+int * const *(f9);
+int * const * const (f10);
+
+int (*f11);
+int (**f12);
+int (* const *f13);
+int (* const * const f14);
+
+int f15[];
+int f16[10];
+int (f17[]);
+int (f18[10]);
+
+int *f19[];
+int *f20[10];
+int **f21[];
+int **f22[10];
+int * const *f23[];
+int * const *f24[10];
+int * const * const f25[];
+int * const * const f26[10];
+
+int *(f27[]);
+int *(f28[10]);
+int **(f29[]);
+int **(f30[10]);
+int * const *(f31[]);
+int * const *(f32[10]);
+int * const * const (f33[]);
+int * const * const (f34[10]);
+
+int (*f35)[];
+int (*f36)[10];
+int (**f37)[];
+int (**f38)[10];
+int (* const *f39)[];
+int (* const *f40)[10];
+int (* const * const f41)[];
+int (* const * const f42)[10];
+
+int f43[][3];
+int f44[3][3];
+int (f45[])[3];
+int (f46[3])[3];
+int ((f47[]))[3];
+int ((f48[3]))[3];
+
+int *f49[][3];
+int *f50[3][3];
+int **f51[][3];
+int **f52[3][3];
+int * const *f53[][3];
+int * const *f54[3][3];
+int * const * const f55[][3];
+int * const * const f56[3][3];
+
+int (*f57[][3]);
+int (*f58[3][3]);
+int (**f59[][3]);
+int (**f60[3][3]);
+int (* const *f61[][3]);
+int (* const *f62[3][3]);
+int (* const * const f63[][3]);
+int (* const * const f64[3][3]);
+
+int f65(int);
+int (f66)(int);
+
+int *f67(int);
+int **f68(int);
+int * const *f69(int);
+int * const * const f70(int);
+
+int *(f71)(int);
+int **(f72)(int);
+int * const *(f73)(int);
+
+int * const * const (f74)(int);
+
+int (*f75)(int);
+int (**f76)(int);
+int (* const *f77)(int);
+int (* const * const f78)(int);
+
+int (*(*f79)(int))();
+int (*(* const f80)(int))();
+int (* const(* const f81)(int))();
+
+// errors
+
+//int fe0[]();				// array of functions
+//int (fe1[])();				// array of functions
+//int fe2()[];				// returning an array
+//int fe3()();				// returning a function
+//int (*fe4)()();				// returning a function
+//int ((*fe5())())[];			// returning an array
+
+// Cforall extensions
+
+* int cf3;
+* * int cf4;
+* const * int cf5;
+const * const * int cf6;
+
+[] int cf15;
+[10] int cf16;
+
+[] * int cf19;
+[10] * int cf20;
+int **cf21[];
+[10] * * int cf22;
+[] * const * int cf23;
+[10] * const * int cf24;
+[] const * const * int cf25;
+[10] const * const * int cf26;
+
+* [] int cf35;
+* [10] int cf36;
+* * [] int cf37;
+* * [10] int cf38;
+* const * [] int cf39;
+* const * [10] int cf40;
+const * const * [] int cf41;
+const * const * [10] int cf42;
+
+[][3] int cf43;
+[3][3] int cf44;
+
+[][3] * int cf49;
+[3][3] * int cf50;
+[][3] * * int cf51;
+[3][3] * * int cf52;
+[][3] const * int cf53;
+[3][3] * const * int cf54;
+[][3] const * const * int cf55;
+[3][3] const * const * int cf56;
+
+[int] cf65(int);
+[int] cf66(int);
+
+[* int] cf67(int);
+[* * int] cf68(int);
+[const * * int] cf69(int);
+[const * const * int] cf70(int);
+
+// function pointer
+
+*[]*[]* [ *[]*[] int ]( *[]*[] int, *[]*[] int ) v3;
+
+//Dummy main
+int main(int argc, char const *argv[])
+{
+	return 0;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa variableDeclarator.cfa" //
+// End: //
Index: sts/vector.c
===================================================================
--- tests/vector.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,66 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// vector.c --
-//
-// Author           : Thierry Delisle
-// Created On       : Mon Jul  4 23:36:19 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jan 18 17:08:08 2018
-// Update Count     : 27
-//
-
-#include <fstream.hfa>
-#include <vector.hfa>
-
-#undef assert
-#define assert(x)								\
-	do {										\
-		if ( !(x) ) {							\
-			sout | "CHECK failed :" | #x | "at" | __FILE__ | " :" | __LINE__ | endl;	\
-			abort();							\
-		}										\
-	} while( 0 == 1 )
-
-int main() {
-	vector( int ) iv;
-
-	assert( empty( &iv ) );
-	assert( size( &iv ) == 0 );
-	sout | size( &iv ) | endl;
-
-	push_back( &iv, 1 );
-	assert( size( &iv ) == 1 );
-	sout | size( &iv ) | endl;
-
-	push_back( &iv, 2 );
-	assert( size( &iv ) == 2 );
-	sout | size( &iv ) | endl;
-
-	push_back( &iv, 3 );
-	assert( size( &iv ) == 3 );
-	sout | size( &iv ) | endl;
-
-	assert( !empty( &iv ) );
-	assert( size( &iv ) == 3 );
-	assert( at( &iv, 0 ) == 1 );
-	assert( (&iv)[0] == 1 );
-	assert( at( &iv, 1 ) == 2 );
-	assert( (&iv)[1] == 2 );
-	assert( at( &iv, 2 ) == 3 );
-	assert( (&iv)[2] == 3 );
-
-	clear( &iv );
-
-	assert( empty( &iv ) );
-	assert( size( &iv ) == 0 );
-	sout | size( &iv ) | endl;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa vector.c" //
-// End: //
Index: tests/vector.cfa
===================================================================
--- tests/vector.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/vector.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,66 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// vector.cfa --
+//
+// Author           : Thierry Delisle
+// Created On       : Mon Jul  4 23:36:19 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Nov  6 18:02:26 2018
+// Update Count     : 28
+//
+
+#include <fstream.hfa>
+#include <vector.hfa>
+
+#undef assert
+#define assert(x)								\
+	do {										\
+		if ( !(x) ) {							\
+			sout | "CHECK failed :" | #x | "at" | __FILE__ | " :" | __LINE__ | endl;	\
+			abort();							\
+		}										\
+	} while( 0 == 1 )
+
+int main() {
+	vector( int ) iv;
+
+	assert( empty( &iv ) );
+	assert( size( &iv ) == 0 );
+	sout | size( &iv ) | endl;
+
+	push_back( &iv, 1 );
+	assert( size( &iv ) == 1 );
+	sout | size( &iv ) | endl;
+
+	push_back( &iv, 2 );
+	assert( size( &iv ) == 2 );
+	sout | size( &iv ) | endl;
+
+	push_back( &iv, 3 );
+	assert( size( &iv ) == 3 );
+	sout | size( &iv ) | endl;
+
+	assert( !empty( &iv ) );
+	assert( size( &iv ) == 3 );
+	assert( at( &iv, 0 ) == 1 );
+	assert( (&iv)[0] == 1 );
+	assert( at( &iv, 1 ) == 2 );
+	assert( (&iv)[1] == 2 );
+	assert( at( &iv, 2 ) == 3 );
+	assert( (&iv)[2] == 3 );
+
+	clear( &iv );
+
+	assert( empty( &iv ) );
+	assert( size( &iv ) == 0 );
+	sout | size( &iv ) | endl;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa vector.cfa" //
+// End: //
Index: sts/virtualCast.c
===================================================================
--- tests/virtualCast.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,76 +1,0 @@
-// Testing the virtual cast, as part of strict inheritance.
-
-/* IMPORTANT: This test does not repersent the final feature set.
- * We are missing a number of important aspects such as:
- * + vtable type generation.
- * + vtable instance generation, that might use different resolution rules.
- * + Virtual syntax to force said generation on structures and traits.
- * + Trait references/pointers that do the virtual_table lookup.
- */
-
-#include <stdlib.hfa>
-#include <assert.h>
-
-struct alpha_vtable {
-	alpha_vtable const * const parent;
-	char (*code)(void);
-};
-
-struct alpha {
-	alpha_vtable const * virtual_table;
-};
-
-char ret_a(void) {
-	return 'a';
-}
-
-
-
-struct beta_vtable {
-	alpha_vtable const * const parent;
-	char (*code)(void);
-};
-
-struct beta {
-	beta_vtable const * virtual_table;
-};
-
-char ret_b(void) {
-	return 'b';
-}
-
-
-
-struct gamma_vtable {
-	beta_vtable const * const parent;
-	char (*code)(void);
-};
-
-struct gamma {
-	gamma_vtable const * virtual_table;
-};
-
-char ret_g(void) {
-	return 'g';
-}
-
-
-extern "C" {
-	alpha_vtable _alpha_vtable_instance = { 0, ret_a };
-	beta_vtable _beta_vtable_instance = { &_alpha_vtable_instance, ret_b };
-	gamma_vtable _gamma_vtable_instance = { &_beta_vtable_instance, ret_g };
-}
-
-int main (int argc, char * argv[]) {
-
-	gamma * tri = malloc(); tri->virtual_table = &_gamma_vtable_instance;
-	beta * mid = (virtual beta *)tri;
-	assert( 'g' == mid->virtual_table->code() );
-
-	alpha * top = malloc(); top->virtual_table = &_alpha_vtable_instance;
-	mid = (virtual beta *)top;
-	assert( ! mid );
-
-	free(tri);
-	free(top);
-}
Index: tests/virtualCast.cfa
===================================================================
--- tests/virtualCast.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/virtualCast.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,76 @@
+// Testing the virtual cast, as part of strict inheritance.
+
+/* IMPORTANT: This test does not repersent the final feature set.
+ * We are missing a number of important aspects such as:
+ * + vtable type generation.
+ * + vtable instance generation, that might use different resolution rules.
+ * + Virtual syntax to force said generation on structures and traits.
+ * + Trait references/pointers that do the virtual_table lookup.
+ */
+
+#include <stdlib.hfa>
+#include <assert.h>
+
+struct alpha_vtable {
+	alpha_vtable const * const parent;
+	char (*code)(void);
+};
+
+struct alpha {
+	alpha_vtable const * virtual_table;
+};
+
+char ret_a(void) {
+	return 'a';
+}
+
+
+
+struct beta_vtable {
+	alpha_vtable const * const parent;
+	char (*code)(void);
+};
+
+struct beta {
+	beta_vtable const * virtual_table;
+};
+
+char ret_b(void) {
+	return 'b';
+}
+
+
+
+struct gamma_vtable {
+	beta_vtable const * const parent;
+	char (*code)(void);
+};
+
+struct gamma {
+	gamma_vtable const * virtual_table;
+};
+
+char ret_g(void) {
+	return 'g';
+}
+
+
+extern "C" {
+	alpha_vtable _alpha_vtable_instance = { 0, ret_a };
+	beta_vtable _beta_vtable_instance = { &_alpha_vtable_instance, ret_b };
+	gamma_vtable _gamma_vtable_instance = { &_beta_vtable_instance, ret_g };
+}
+
+int main (int argc, char * argv[]) {
+
+	gamma * tri = malloc(); tri->virtual_table = &_gamma_vtable_instance;
+	beta * mid = (virtual beta *)tri;
+	assert( 'g' == mid->virtual_table->code() );
+
+	alpha * top = malloc(); top->virtual_table = &_alpha_vtable_instance;
+	mid = (virtual beta *)top;
+	assert( ! mid );
+
+	free(tri);
+	free(top);
+}
Index: sts/voidPtr.c
===================================================================
--- tests/voidPtr.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,17 +1,0 @@
-int main() {
-	int i, j;
-	void *a = &i, *b = &j;
-
-	if ( a == 0 ) {
-		abort();
-	}
-
-	if ( a == b ) {
-		abort();
-	}
-
-	if ( ! a ) {
-		abort();
-	}	
-}
-
Index: tests/voidPtr.cfa
===================================================================
--- tests/voidPtr.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/voidPtr.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,17 @@
+int main() {
+	int i, j;
+	void *a = &i, *b = &j;
+
+	if ( a == 0 ) {
+		abort();
+	}
+
+	if ( a == b ) {
+		abort();
+	}
+
+	if ( ! a ) {
+		abort();
+	}	
+}
+
Index: sts/with-statement.c
===================================================================
--- tests/with-statement.c	(revision 8e047947cd4f0671f365d8a7f63521132e2e48e4)
+++ 	(revision )
@@ -1,108 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// tupleFunction.c --
-//
-// Author           : Rob Schluntz
-// Created On       : Mon Dec 04 17:41:45 2017
-// Last Modified By : Rob Schluntz
-// Last Modified On : Mon Dec 04 17:45:07 2017
-// Update Count     : 2
-//
-
-struct S {
-  int i;
-  // dynamically allocated member ensures ctor/dtors are called correctly on temporaries
-  int * ptr;
-};
-
-// with clause on reference parameter
-void ?{}(S & this, int n) with(this) {
-  i = n;
-  ptr = (int *)malloc(sizeof(int));
-}
-
-void ?{}(S & this) {
-  this{ 0 };
-}
-
-void ?{}(S & this, S other) {
-  this{ other.i };
-}
-
-S ?=?(S & this, S other) with(this) {
-  i = other.i;
-  *ptr = *other.ptr;
-  return this;
-}
-
-void ^?{}(S & this) with(this) {
-  free(ptr);
-}
-
-struct S2 {
-  S s;
-};
-
-void ?{}(S2 & this, int n) {
-  (this.s){ n };
-}
-
-forall(otype T)
-struct Box {
-  T x;
-};
-
-forall(otype T)
-void ?{}(Box(T) & this) with(this) { // with clause in polymorphic function
-  x{};
-}
-
-void print(int i) { printf("%d", i); }
-
-forall(otype T | { void print(T); })
-void foo(T t) {
-  Box(T) b = { t };
-  with(b) {  // with statement in polymorphic function
-    print(x);
-    printf("\n");
-  }
-}
-
-// ensure with-statement temporary generation works correctly
-S mk() {
-  printf("called mk\n");
-  return (S) { 444 };
-}
-
-// ensure with-statement temporary generation with reference-returning functions works correctly
-S & ref() {
-  static S var = { 123456789 };
-  return var;
-}
-
-int main() {
-  S2 s2 = { 12345 };
-  with (s2) {
-    with(s) { // with s2.s
-      printf("%d %d %d\n", i, s.i, s2.s.i);
-      foo(i);  // s.i
-      with(mk()) {
-        printf("%d %d %d\n", i, i, i);
-        with(ref()) {
-          printf("%d %d %d\n", i, i, i);
-        } // with ref()
-        with(ref()) {
-          printf("%d %d %d\n", i, i, i);
-        } // with ref()
-      } // with mk()
-    } // with s
-  } // with s2
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: tests/withStatement.cfa
===================================================================
--- tests/withStatement.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
+++ tests/withStatement.cfa	(revision 909aebf77e5c84dee2d8df4bfce6b50fb89b38dc)
@@ -0,0 +1,108 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// tupleFunction.c --
+//
+// Author           : Rob Schluntz
+// Created On       : Mon Dec 04 17:41:45 2017
+// Last Modified By : Rob Schluntz
+// Last Modified On : Mon Dec 04 17:45:07 2017
+// Update Count     : 2
+//
+
+struct S {
+  int i;
+  // dynamically allocated member ensures ctor/dtors are called correctly on temporaries
+  int * ptr;
+};
+
+// with clause on reference parameter
+void ?{}(S & this, int n) with(this) {
+  i = n;
+  ptr = (int *)malloc(sizeof(int));
+}
+
+void ?{}(S & this) {
+  this{ 0 };
+}
+
+void ?{}(S & this, S other) {
+  this{ other.i };
+}
+
+S ?=?(S & this, S other) with(this) {
+  i = other.i;
+  *ptr = *other.ptr;
+  return this;
+}
+
+void ^?{}(S & this) with(this) {
+  free(ptr);
+}
+
+struct S2 {
+  S s;
+};
+
+void ?{}(S2 & this, int n) {
+  (this.s){ n };
+}
+
+forall(otype T)
+struct Box {
+  T x;
+};
+
+forall(otype T)
+void ?{}(Box(T) & this) with(this) { // with clause in polymorphic function
+  x{};
+}
+
+void print(int i) { printf("%d", i); }
+
+forall(otype T | { void print(T); })
+void foo(T t) {
+  Box(T) b = { t };
+  with(b) {  // with statement in polymorphic function
+    print(x);
+    printf("\n");
+  }
+}
+
+// ensure with-statement temporary generation works correctly
+S mk() {
+  printf("called mk\n");
+  return (S) { 444 };
+}
+
+// ensure with-statement temporary generation with reference-returning functions works correctly
+S & ref() {
+  static S var = { 123456789 };
+  return var;
+}
+
+int main() {
+  S2 s2 = { 12345 };
+  with (s2) {
+    with(s) { // with s2.s
+      printf("%d %d %d\n", i, s.i, s2.s.i);
+      foo(i);  // s.i
+      with(mk()) {
+        printf("%d %d %d\n", i, i, i);
+        with(ref()) {
+          printf("%d %d %d\n", i, i, i);
+        } // with ref()
+        with(ref()) {
+          printf("%d %d %d\n", i, i, i);
+        } // with ref()
+      } // with mk()
+    } // with s
+  } // with s2
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
