Index: libcfa/src/bits/random.hfa
===================================================================
--- libcfa/src/bits/random.hfa	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ libcfa/src/bits/random.hfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -10,6 +10,6 @@
 // Created On       : Fri Jan 14 07:18:11 2022
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jan 14 07:18:58 2022
-// Update Count     : 1
+// Last Modified On : Mon Nov 21 17:50:12 2022
+// Update Count     : 15
 // 
 
@@ -17,4 +17,24 @@
 
 #include <stdint.h>
+
+// Set default PRNG for architecture size.
+#ifdef __x86_64__										// 64-bit architecture
+#define LEHMER64
+#else													// 32-bit architecture
+#define XORSHIFT_6_21_7
+#endif // __x86_64__
+
+// C/CFA PRNG name and random-state.
+#ifdef LEHMER64
+#define PRNG_NAME lehmer64
+#define PRNG_ARG_T __uint128_t
+#endif // LEHMER64
+
+#ifdef XORSHIFT_6_21_7
+#define PRNG_NAME xorshift_6_21_7
+#define PRNG_ARG_T uint32_t
+#endif // XORSHIFT_6_21_7
+
+#ifdef __cforall										// don't include in C code (invoke.h)
 
 // Pipelined to allow out-of-order overlap with reduced dependencies. Critically, the current random state is returned
@@ -61,6 +81,6 @@
 //--------------------------------------------------
 typedef struct {
-  uint32_t a, b, c, d;
-  uint32_t counter;
+	uint32_t a, b, c, d;
+	uint32_t counter;
 } xorwow__state_t;
 
@@ -116,2 +136,4 @@
 #undef C
 #undef D
+
+#endif // __cforall
Index: libcfa/src/concurrency/invoke.h
===================================================================
--- libcfa/src/concurrency/invoke.h	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ libcfa/src/concurrency/invoke.h	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -10,6 +10,6 @@
 // Created On       : Tue Jan 17 12:27:26 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Jan  9 19:06:45 2022
-// Update Count     : 48
+// Last Modified On : Mon Nov 21 17:40:24 2022
+// Update Count     : 55
 //
 
@@ -17,4 +17,5 @@
 #include "bits/defs.hfa"
 #include "bits/locks.hfa"
+#include "bits/random.hfa"
 #include "kernel/fwd.hfa"
 
@@ -222,5 +223,5 @@
 		struct processor * last_proc;
 
-		uint32_t random_state;							// fast random numbers
+		PRNG_ARG_T random_state;						// fast random numbers
 
 		#if defined( __CFA_WITH_VERIFY__ )
Index: libcfa/src/concurrency/kernel/fwd.hfa
===================================================================
--- libcfa/src/concurrency/kernel/fwd.hfa	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ libcfa/src/concurrency/kernel/fwd.hfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -120,5 +120,5 @@
 
 		// Yield: yield N times
-		static inline void yield( unsigned times ) {
+		static inline void yield( size_t times ) {
 			for( times ) {
 				yield();
Index: libcfa/src/concurrency/kernel/startup.cfa
===================================================================
--- libcfa/src/concurrency/kernel/startup.cfa	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ libcfa/src/concurrency/kernel/startup.cfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -39,4 +39,5 @@
 #include "limits.hfa"
 #include "math.hfa"
+#include "bits/random.hfa"								// prng
 
 #define CFA_PROCESSOR_USE_MMAP 0
@@ -107,5 +108,6 @@
 extern void __wake_proc(processor *);
 extern int cfa_main_returned;							// from interpose.cfa
-uint32_t __global_random_prime = 4_294_967_291u, __global_random_mask = false;
+PRNG_ARG_T __global_random_prime = 4_294_967_291u;
+bool __global_random_mask = false;
 
 //-----------------------------------------------------------------------------
Index: libcfa/src/concurrency/thread.cfa
===================================================================
--- libcfa/src/concurrency/thread.cfa	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ libcfa/src/concurrency/thread.cfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -10,6 +10,6 @@
 // Created On       : Tue Jan 17 12:27:26 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Feb 12 15:24:18 2022
-// Update Count     : 66
+// Last Modified On : Sun Nov 20 17:17:50 2022
+// Update Count     : 80
 //
 
@@ -26,5 +26,6 @@
 #include "invoke.h"
 
-extern uint32_t __global_random_seed, __global_random_prime, __global_random_mask;
+extern PRNG_ARG_T __global_random_seed, __global_random_prime;
+extern bool __global_random_mask;
 
 #pragma GCC visibility push(default)
@@ -225,17 +226,16 @@
 
 //-----------------------------------------------------------------------------
-#define GENERATOR LCG
-
-void set_seed( uint32_t seed ) {
-	uint32_t & state = active_thread()->random_state;
+
+void set_seed( uint64_t seed ) {
+	PRNG_ARG_T & state = active_thread()->random_state;
 	state = __global_random_seed = seed;
-	GENERATOR( state );
+	(void)PRNG_NAME( state );							// prime PRNG
 	__global_random_prime = state;
 	__global_random_mask = true;
 } // set_seed
 
-uint32_t prng( void ) {									// [0,UINT_MAX]
-	uint32_t & state = active_thread()->random_state;
-	return GENERATOR( state );
+uint64_t prng( void ) {									// [0,UINT_MAX]
+	PRNG_ARG_T & state = active_thread()->random_state;
+	return PRNG_NAME( state );
 } // prng
 
Index: libcfa/src/concurrency/thread.hfa
===================================================================
--- libcfa/src/concurrency/thread.hfa	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ libcfa/src/concurrency/thread.hfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -10,6 +10,6 @@
 // Created On       : Tue Jan 17 12:27:26 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Feb 11 16:34:07 2022
-// Update Count     : 20
+// Last Modified On : Sat Nov 19 16:41:27 2022
+// Update Count     : 30
 //
 
@@ -23,4 +23,5 @@
 #include "monitor.hfa"
 #include "exception.hfa"
+#include "bits/random.hfa"
 
 //-----------------------------------------------------------------------------
@@ -142,11 +143,11 @@
 // prng
 static inline {
-	uint32_t prng( thread$ & th ) __attribute__(( warn_unused_result )) { return LCG( th.random_state ); } // [0,UINT_MAX]
-	uint32_t prng( thread$ & th, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( th ) % u; } // [0,u)
-	uint32_t prng( thread$ & th, uint32_t l, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( th, u - l + 1 ) + l; } // [l,u]
+	uint64_t prng( thread$ & th ) __attribute__(( warn_unused_result )) { return PRNG_NAME( th.random_state ); } // [0,UINT_MAX]
+	uint64_t prng( thread$ & th, uint64_t u ) __attribute__(( warn_unused_result )) { return prng( th ) % u; } // [0,u)
+	uint64_t prng( thread$ & th, uint64_t l, uint64_t u ) __attribute__(( warn_unused_result )) { return prng( th, u - l + 1 ) + l; } // [l,u]
 	forall( T & | is_thread(T) ) {
-		uint32_t prng( T & th ) __attribute__(( warn_unused_result )) { return prng( (thread &)th ); } // [0,UINT_MAX]
-		uint32_t prng( T & th, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( th ) % u; } // [0,u)
-		uint32_t prng( T & th, uint32_t l, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( th, u - l + 1 ) + l; } // [l,u]
+		uint64_t prng( T & th ) __attribute__(( warn_unused_result )) { return prng( (thread &)th ); } // [0,UINT_MAX]
+		uint64_t prng( T & th, uint64_t u ) __attribute__(( warn_unused_result )) { return prng( th ) % u; } // [0,u)
+		uint64_t prng( T & th, uint64_t l, uint64_t u ) __attribute__(( warn_unused_result )) { return prng( th, u - l + 1 ) + l; } // [l,u]
 	} // distribution
 } // distribution
Index: libcfa/src/startup.cfa
===================================================================
--- libcfa/src/startup.cfa	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ libcfa/src/startup.cfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -10,6 +10,6 @@
 // Created On       : Tue Jul 24 16:21:57 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Oct  6 13:51:57 2022
-// Update Count     : 57
+// Last Modified On : Sun Nov 20 21:26:40 2022
+// Update Count     : 59
 //
 
@@ -18,8 +18,9 @@
 #include <stdlib.h>										// getenv
 #include "bits/defs.hfa"								// rdtscl
+#include "bits/random.hfa"								// rdtscl
 #include "startup.hfa"
 
-extern uint32_t __global_random_seed;					// sequential/concurrent
-extern uint32_t __global_random_state;					// sequential
+extern PRNG_ARG_T __global_random_seed;					// sequential/concurrent
+extern PRNG_ARG_T __global_random_state;				// sequential
 
 extern "C" {
Index: libcfa/src/stdlib.cfa
===================================================================
--- libcfa/src/stdlib.cfa	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ libcfa/src/stdlib.cfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -10,6 +10,6 @@
 // Created On       : Thu Jan 28 17:10:29 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug 25 22:41:14 2022
-// Update Count     : 604
+// Last Modified On : Sat Nov 19 16:42:26 2022
+// Update Count     : 612
 //
 
@@ -225,15 +225,11 @@
 //---------------------------------------
 
-#define GENERATOR LCG
-
 // would be cool to make hidden but it's needed for libcfathread
-__attribute__((visibility("default"))) uint32_t __global_random_seed;							// sequential/concurrent
-__attribute__((visibility("hidden"))) uint32_t __global_random_state;							// sequential only
-
-void set_seed( PRNG & prng, uint32_t seed_ ) with( prng ) { state = seed = seed_; GENERATOR( state ); } // set seed
-
-void set_seed( uint32_t seed ) { __global_random_state = __global_random_seed = seed; GENERATOR( __global_random_state ); }
-uint32_t get_seed() { return __global_random_seed; }
-uint32_t prng( void ) { return GENERATOR( __global_random_state ); } // [0,UINT_MAX]
+__attribute__((visibility("default"))) PRNG_ARG_T __global_random_seed; // sequential/concurrent
+__attribute__((visibility("hidden"))) PRNG_ARG_T __global_random_state; // sequential only
+
+void set_seed( uint64_t seed ) { __global_random_state = __global_random_seed = seed; PRNG_NAME( __global_random_state ); }
+uint64_t get_seed() { return __global_random_seed; }
+uint64_t prng( void ) { return PRNG_NAME( __global_random_state ); } // [0,UINT_MAX]
 
 //---------------------------------------
Index: libcfa/src/stdlib.hfa
===================================================================
--- libcfa/src/stdlib.hfa	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ libcfa/src/stdlib.hfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -10,6 +10,6 @@
 // Created On       : Thu Jan 28 17:12:35 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug 25 18:07:06 2022
-// Update Count     : 645
+// Last Modified On : Sun Nov 20 17:12:37 2022
+// Update Count     : 730
 //
 
@@ -404,19 +404,47 @@
 //   calls( sprng );
 
-struct PRNG {
+trait basic_prng( PRNG &, S, R ) {
+	void set_seed( PRNG & prng, S seed );				// set seed
+	S get_seed( PRNG & prng );							// get seed
+	R prng( PRNG & prng );
+	void ?{}( PRNG & prng );							// random seed
+	void ?{}( PRNG & prng, S seed );					// fixed seed
+}; // basic_prng
+
+static inline forall( PRNG &, S, R | basic_prng( PRNG, S, R ) | { R ?%?( R, R ); } ) {
+	R prng( PRNG & prng, R u ) { return prng( prng ) % u; } // [0,u)
+}
+static inline forall( PRNG &, S, R | basic_prng( PRNG, S, R ) | { R ?+?( R, R ); R ?-?( R, R ); R ?%?( R, R ); void ?{}( R &, one_t ); } ) {
+	R prng( PRNG & prng, R l, R u ) { return prng( prng, u - l + (R){1} ) + l; } // [l,u]
+}
+
+struct PRNG32 {
 	uint32_t callcnt;									// call count
 	uint32_t seed;										// current seed
-	uint32_t state;										// random state
+	PRNG_ARG_T state;									// random state
 }; // PRNG
 
-void set_seed( PRNG & prng, uint32_t seed_ );
-static inline {
-	void ?{}( PRNG & prng ) with( prng ) { callcnt = 0; set_seed( prng, rdtscl() ); } // random seed
-	void ?{}( PRNG & prng, uint32_t seed ) with( prng ) { callcnt = 0; set_seed( prng, seed ); } // fixed seed
-	uint32_t get_seed( PRNG & prng ) __attribute__(( warn_unused_result )) with( prng ) { return seed; } // get seed
-	uint32_t prng( PRNG & prng ) __attribute__(( warn_unused_result )) with( prng ) { callcnt += 1; return LCG( state ); } // [0,UINT_MAX]
-	uint32_t prng( PRNG & prng, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( prng ) % u; } // [0,u)
-	uint32_t prng( PRNG & prng, uint32_t l, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( prng, u - l + 1 ) + l; } // [l,u]
-	uint32_t calls( PRNG & prng ) __attribute__(( warn_unused_result )) with( prng ) { return callcnt; }
+static inline {
+	void set_seed( PRNG32 & prng, uint32_t seed_ ) with( prng ) { state = seed = seed_; PRNG_NAME( state ); } // set seed
+	uint32_t get_seed( PRNG32 & prng ) __attribute__(( warn_unused_result )) with( prng ) { return seed; } // get seed
+	uint32_t prng( PRNG32 & prng ) __attribute__(( warn_unused_result )) with( prng ) { callcnt += 1; return PRNG_NAME( state ); } // [0,UINT_MAX]
+	uint32_t calls( PRNG32 & prng ) __attribute__(( warn_unused_result )) with( prng ) { return callcnt; }
+	void ?{}( PRNG32 & prng ) with( prng ) { callcnt = 0; set_seed( prng, rdtscl() ); } // random seed
+	void ?{}( PRNG32 & prng, uint32_t seed ) with( prng ) { callcnt = 0; set_seed( prng, seed ); } // fixed seed
+} // distribution
+
+struct PRNG64 {
+	uint64_t callcnt;									// call count
+	uint64_t seed;										// current seed
+	PRNG_ARG_T state;									// random state
+}; // PRNG
+
+static inline {
+	void set_seed( PRNG64 & prng, uint64_t seed_ ) with( prng ) { state = seed = seed_; PRNG_NAME( state ); } // set seed
+	uint64_t get_seed( PRNG64 & prng ) __attribute__(( warn_unused_result )) with( prng ) { return seed; } // get seed
+	uint64_t prng( PRNG64 & prng ) __attribute__(( warn_unused_result )) with( prng ) { callcnt += 1; return PRNG_NAME( state ); } // [0,UINT_MAX]
+	uint64_t calls( PRNG64 & prng ) __attribute__(( warn_unused_result )) with( prng ) { return callcnt; }
+	void ?{}( PRNG64 & prng ) with( prng ) { callcnt = 0; set_seed( prng, rdtscl() ); } // random seed
+	void ?{}( PRNG64 & prng, uint64_t seed ) with( prng ) { callcnt = 0; set_seed( prng, seed ); } // fixed seed
 } // distribution
 
@@ -435,10 +463,11 @@
 //   prng( 5, 21 );
 
-void set_seed( uint32_t seed_ ) OPTIONAL_THREAD;
-uint32_t get_seed() __attribute__(( warn_unused_result ));
-uint32_t prng( void ) __attribute__(( warn_unused_result )) OPTIONAL_THREAD; // [0,UINT_MAX]
-static inline {
-	uint32_t prng( uint32_t u ) __attribute__(( warn_unused_result )) { return prng() % u; } // [0,u)
-	uint32_t prng( uint32_t l, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( u - l + 1 ) + l; } // [l,u]
+// Harmonize with concurrency/thread.hfa.
+void set_seed( uint64_t seed_ ) OPTIONAL_THREAD;
+uint64_t get_seed() __attribute__(( warn_unused_result ));
+uint64_t prng( void ) __attribute__(( warn_unused_result )) OPTIONAL_THREAD; // [0,UINT_MAX]
+static inline {
+	uint64_t prng( uint64_t u ) __attribute__(( warn_unused_result )) { return prng() % u; } // [0,u)
+	uint64_t prng( uint64_t l, uint64_t u ) __attribute__(( warn_unused_result )) { return prng( u - l + 1 ) + l; } // [l,u]
 } // distribution
 
Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/AST/Convert.cpp	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -236,6 +236,6 @@
 	}
 
-	// InlineValueDecl vanish after EnumAndPointerDecay pass so no necessary to implement NewToOld
-	const ast::DeclWithType * visit( const ast::InlineValueDecl * node ) override final {	
+	// InlineMemberDecl vanish after EnumAndPointerDecay pass so no necessary to implement NewToOld
+	const ast::DeclWithType * visit( const ast::InlineMemberDecl * node ) override final {	
 		assert( false );
 		(void) node;
@@ -1764,4 +1764,5 @@
 			{ old->linkage.val },
 			GET_ACCEPT_1(base, Type),
+			old->hide == EnumDecl::EnumHiding::Hide ? ast::EnumDecl::EnumHiding::Hide : ast::EnumDecl::EnumHiding::Visible,
 			old->enumValues
 		);
@@ -1869,5 +1870,5 @@
 	}
 
-	virtual void visit( const InlineValueDecl * old ) override final {
+	virtual void visit( const InlineMemberDecl * old ) override final {
 		if ( inCache( old ) ) {
 			return;
@@ -1875,6 +1876,6 @@
 		auto&& type = GET_ACCEPT_1(type, Type);
 		auto&& attr = GET_ACCEPT_V(attributes, Attribute);
- 
-		auto decl = new ast::InlineValueDecl(
+
+		auto decl = new ast::InlineMemberDecl(
 			old->location,
 			old->name,
Index: src/AST/Decl.hpp
===================================================================
--- src/AST/Decl.hpp	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/AST/Decl.hpp	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -315,10 +315,11 @@
 	// enum (type_optional) Name {...} 
 	ptr<Type> base; // if isTyped == true && base.get() == nullptr, it is a "void" type enum
-
-	EnumDecl( const CodeLocation& loc, const std::string& name, bool isTyped = false, 
+	enum class EnumHiding { Visible, Hide } hide;
+
+	EnumDecl( const CodeLocation& loc, const std::string& name, bool isTyped = false,
 		std::vector<ptr<Attribute>>&& attrs = {}, Linkage::Spec linkage = Linkage::Cforall,
-		Type const * base = nullptr,
+		Type const * base = nullptr, EnumHiding hide = EnumHiding::Hide,
 		std::unordered_map< std::string, long long > enumValues = std::unordered_map< std::string, long long >() )
-	: AggregateDecl( loc, name, std::move(attrs), linkage ), isTyped(isTyped), base(base), enumValues(enumValues) {}
+	: AggregateDecl( loc, name, std::move(attrs), linkage ), isTyped(isTyped), base(base), hide(hide), enumValues(enumValues) {}
 
 	/// gets the integer value for this enumerator, returning true iff value found
@@ -397,4 +398,5 @@
 };
 
+/// Static Assertion `_Static_assert( ... , ... );`
 class StaticAssertDecl : public Decl {
 public:
@@ -411,9 +413,10 @@
 };
 
-class InlineValueDecl final : public DeclWithType {
+/// Inline Member Declaration `inline TypeName;`
+class InlineMemberDecl final : public DeclWithType {
 public:
 	ptr<Type> type;
 
-	InlineValueDecl( const CodeLocation & loc, const std::string & name, const Type * type,
+	InlineMemberDecl( const CodeLocation & loc, const std::string & name, const Type * type,
 		Storage::Classes storage = {}, Linkage::Spec linkage = Linkage::Cforall,
 		std::vector< ptr<Attribute> > && attrs = {}, Function::Specs fs = {} )
@@ -425,7 +428,8 @@
 	const DeclWithType * accept( Visitor& v ) const override { return v.visit( this ); }
 private:
-	InlineValueDecl * clone() const override { return new InlineValueDecl{ *this }; }
-	MUTATE_FRIEND
-};
+	InlineMemberDecl * clone() const override { return new InlineMemberDecl{ *this }; }
+	MUTATE_FRIEND
+};
+
 }
 
Index: src/AST/Fwd.hpp
===================================================================
--- src/AST/Fwd.hpp	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/AST/Fwd.hpp	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -37,5 +37,5 @@
 class DirectiveDecl;
 class StaticAssertDecl;
-class InlineValueDecl;
+class InlineMemberDecl;
 
 class Stmt;
Index: src/AST/Pass.hpp
===================================================================
--- src/AST/Pass.hpp	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/AST/Pass.hpp	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -141,5 +141,5 @@
 	const ast::DirectiveDecl *    visit( const ast::DirectiveDecl        * ) override final;
 	const ast::StaticAssertDecl * visit( const ast::StaticAssertDecl     * ) override final;
-	const ast::DeclWithType	*     visit( const ast::InlineValueDecl      * ) override final;
+	const ast::DeclWithType	*     visit( const ast::InlineMemberDecl     * ) override final;
 	const ast::CompoundStmt *     visit( const ast::CompoundStmt         * ) override final;
 	const ast::Stmt *             visit( const ast::ExprStmt             * ) override final;
Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/AST/Pass.impl.hpp	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -686,9 +686,16 @@
 
 	if ( __visit_children() ) {
-		// unlike structs, traits, and unions, enums inject their members into the global scope
-		maybe_accept( node, &EnumDecl::base );
-		maybe_accept( node, &EnumDecl::params     );
-		maybe_accept( node, &EnumDecl::members    );
-		maybe_accept( node, &EnumDecl::attributes );
+		if ( node->hide == ast::EnumDecl::EnumHiding::Hide ) {
+			guard_symtab guard { *this };
+			maybe_accept( node, &EnumDecl::base );
+			maybe_accept( node, &EnumDecl::params     );
+			maybe_accept( node, &EnumDecl::members    );
+			maybe_accept( node, &EnumDecl::attributes );
+		} else {
+			maybe_accept( node, &EnumDecl::base );
+			maybe_accept( node, &EnumDecl::params     );
+			maybe_accept( node, &EnumDecl::members    );
+			maybe_accept( node, &EnumDecl::attributes );
+		}
 	}
 
@@ -803,13 +810,13 @@
 
 //--------------------------------------------------------------------------
-// DeclWithType
-template< typename core_t >
-const ast::DeclWithType * ast::Pass< core_t >::visit( const ast::InlineValueDecl * node ) {
-	VISIT_START( node );
-
-	if ( __visit_children() ) {
-		{
-			guard_symtab guard { *this };
-			maybe_accept( node, &InlineValueDecl::type );
+// InlineMemberDecl
+template< typename core_t >
+const ast::DeclWithType * ast::Pass< core_t >::visit( const ast::InlineMemberDecl * node ) {
+	VISIT_START( node );
+
+	if ( __visit_children() ) {
+		{
+			guard_symtab guard { *this };
+			maybe_accept( node, &InlineMemberDecl::type );
 		}
 	}
Index: src/AST/Print.cpp
===================================================================
--- src/AST/Print.cpp	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/AST/Print.cpp	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -401,5 +401,5 @@
 	}
 
-	virtual const ast::DeclWithType * visit( const ast::InlineValueDecl * node ) override final {
+	virtual const ast::DeclWithType * visit( const ast::InlineMemberDecl * node ) override final {
 		os << "inline ";
 		if ( ! node->name.empty() ) os << node->name;
Index: src/AST/Visitor.hpp
===================================================================
--- src/AST/Visitor.hpp	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/AST/Visitor.hpp	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -33,5 +33,5 @@
     virtual const ast::DirectiveDecl *    visit( const ast::DirectiveDecl        * ) = 0;
     virtual const ast::StaticAssertDecl * visit( const ast::StaticAssertDecl     * ) = 0;
-    virtual const ast::DeclWithType *     visit( const ast::InlineValueDecl      * ) = 0;
+    virtual const ast::DeclWithType *     visit( const ast::InlineMemberDecl     * ) = 0;
     virtual const ast::CompoundStmt *     visit( const ast::CompoundStmt         * ) = 0;
     virtual const ast::Stmt *             visit( const ast::ExprStmt             * ) = 0;
Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/CodeGen/CodeGenerator.cc	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -290,5 +290,9 @@
 					if ( obj->get_init() ) {
 						obj->get_init()->accept( *visitor );
-						last_val = ((ConstantExpr *)(((SingleInit *)(obj->init))->value))->constant.get_ival();
+						Expression* expr = ((SingleInit *)(obj->init))->value;
+						while ( auto temp = dynamic_cast<CastExpr *>(expr) ) {
+							expr = temp->arg;
+						}
+						last_val = ((ConstantExpr *)expr)->constant.get_ival();
 					} else {
 						output << ++last_val;
Index: src/Common/CodeLocationTools.cpp
===================================================================
--- src/Common/CodeLocationTools.cpp	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/Common/CodeLocationTools.cpp	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -111,5 +111,5 @@
     macro(DirectiveDecl, DirectiveDecl) \
     macro(StaticAssertDecl, StaticAssertDecl) \
-    macro(InlineValueDecl, DeclWithType) \
+    macro(InlineMemberDecl, DeclWithType) \
     macro(CompoundStmt, CompoundStmt) \
     macro(ExprStmt, Stmt) \
Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/Common/PassVisitor.h	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -81,6 +81,6 @@
 	virtual void visit( StaticAssertDecl * assertDecl ) override final;
 	virtual void visit( const StaticAssertDecl * assertDecl ) override final;
-	virtual void visit( InlineValueDecl * valueDecl ) override final;
-	virtual void visit( const InlineValueDecl * valueDecl ) override final;
+	virtual void visit( InlineMemberDecl * valueDecl ) override final;
+	virtual void visit( const InlineMemberDecl * valueDecl ) override final;
 
 	virtual void visit( CompoundStmt * compoundStmt ) override final;
@@ -275,5 +275,5 @@
 	virtual DirectiveDecl * mutate( DirectiveDecl * directiveDecl ) override final;
 	virtual StaticAssertDecl * mutate( StaticAssertDecl * assertDecl ) override final;
-	virtual DeclarationWithType * mutate( InlineValueDecl * valueDecl ) override final;
+	virtual DeclarationWithType * mutate( InlineMemberDecl * valueDecl ) override final;
 
 	virtual CompoundStmt * mutate( CompoundStmt * compoundStmt ) override final;
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/Common/PassVisitor.impl.h	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -1047,7 +1047,7 @@
 
 //--------------------------------------------------------------------------
-// InlineValueDecl
-template< typename pass_type >
-void PassVisitor< pass_type >::visit( InlineValueDecl * node ) {
+// InlineMemberDecl
+template< typename pass_type >
+void PassVisitor< pass_type >::visit( InlineMemberDecl * node ) {
 	VISIT_START( node );
 
@@ -1058,5 +1058,5 @@
 
 template< typename pass_type >
-void PassVisitor< pass_type >::visit( const InlineValueDecl * node ) {
+void PassVisitor< pass_type >::visit( const InlineMemberDecl * node ) {
 	VISIT_START( node );
 
@@ -1067,5 +1067,5 @@
 
 template< typename pass_type >
-DeclarationWithType * PassVisitor< pass_type >::mutate( InlineValueDecl * node ) {
+DeclarationWithType * PassVisitor< pass_type >::mutate( InlineMemberDecl * node ) {
 	MUTATE_START( node );
 
Index: src/Common/utility.h
===================================================================
--- src/Common/utility.h	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/Common/utility.h	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -461,16 +461,22 @@
 	Iterables iterables;
 
+	// Getting the iterator and value types this way preserves const.
 	template<size_t I> using Iter = decltype(std::get<I>(iterables).begin());
 	template<size_t I> using Data = decltype(*std::get<I>(iterables).begin());
 	template<typename> struct base_iterator;
 
-	template<std::size_t... Is>
-	struct base_iterator<std::integer_sequence<std::size_t, Is...>> {
-		using value_type = std::tuple< Data<Is>... >;
-		std::tuple<Iter<Is>...> iterators;
-
-		base_iterator( Iter<Is>... is ) : iterators( is... ) {}
+	// This inner template puts the sequence of `0, 1, ... sizeof...(Args)-1`
+	// into a pack. These are the indexes into the tuples, so unpacking can
+	// go over each element of the tuple.
+	// The std::integer_sequence is just used to build that sequence.
+	// A library reference will probably explain it better than I can.
+	template<std::size_t... Indices>
+	struct base_iterator<std::integer_sequence<std::size_t, Indices...>> {
+		using value_type = std::tuple< Data<Indices>... >;
+		std::tuple<Iter<Indices>...> iterators;
+
+		base_iterator( Iter<Indices>... is ) : iterators( is... ) {}
 		base_iterator operator++() {
-			return base_iterator( ++std::get<Is>( iterators )... );
+			return base_iterator( ++std::get<Indices>( iterators )... );
 		}
 		bool operator!=( const base_iterator& other ) const {
@@ -478,12 +484,12 @@
 		}
 		value_type operator*() const {
-			return std::tie( *std::get<Is>( iterators )... );
+			return std::tie( *std::get<Indices>( iterators )... );
 		}
 
 		static base_iterator make_begin( Iterables & data ) {
-			return base_iterator( std::get<Is>( data ).begin()... );
+			return base_iterator( std::get<Indices>( data ).begin()... );
 		}
 		static base_iterator make_end( Iterables & data ) {
-			return base_iterator( std::get<Is>( data ).end()... );
+			return base_iterator( std::get<Indices>( data ).end()... );
 		}
 	};
Index: src/GenPoly/ErasableScopedMap.h
===================================================================
--- src/GenPoly/ErasableScopedMap.h	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/GenPoly/ErasableScopedMap.h	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -23,256 +23,268 @@
 
 namespace GenPoly {
-	/// A map where the items are placed into nested scopes;
-	/// inserted items are placed into the innermost scope, lookup looks from the innermost scope outward;
-	/// erasing a key means that find() will no longer report any instance of the key in a scope further
-	/// out, but the erasure itself is scoped. Key erasure works by inserting a sentinal value into the
-	/// value field, and thus only works for Value types where a meaningful sentinal can be chosen.
-	template<typename Key, typename Value>
-	class ErasableScopedMap {
-		typedef std::map< Key, Value > Scope;
-		typedef std::vector< Scope > ScopeList;
-
-		ScopeList scopes; ///< scoped list of maps
-		Value erased;     ///< sentinal value for erased keys
-	public:
-		typedef typename Scope::key_type key_type;
-		typedef typename Scope::mapped_type mapped_type;
-		typedef typename Scope::value_type value_type;
-		typedef typename ScopeList::size_type size_type;
-		typedef typename ScopeList::difference_type difference_type;
-		typedef typename Scope::reference reference;
-		typedef typename Scope::const_reference const_reference;
-		typedef typename Scope::pointer pointer;
-		typedef typename Scope::const_pointer const_pointer;
-
-		class iterator : public std::iterator< std::bidirectional_iterator_tag,
-		                                       value_type > {
-		friend class ErasableScopedMap;
-		friend class const_iterator;
-			typedef typename std::map< Key, Value >::iterator wrapped_iterator;
-			typedef typename std::vector< std::map< Key, Value > > scope_list;
-			typedef typename scope_list::size_type size_type;
-
-			/// Checks if this iterator points to a valid item
-			bool is_valid() const {
-				return it != map->scopes[i].end() && it->second != map->erased;
+
+/// A map where the items are placed into nested scopes.
+/// Inserted items are placed into the innermost scope, lookup looks from the
+/// innermost scope outward. Erasing a key means that find() will no longer
+/// report any instance of the key in a scope further out, but the erasure
+/// itself is scoped. Key erasure works by inserting a sentinal value into
+/// the value field, and thus only works for Value types where a meaningful
+/// sentinal can be chosen.
+template<typename Key, typename Value>
+class ErasableScopedMap {
+	typedef std::map< Key, Value > Scope;
+	typedef std::vector< Scope > ScopeList;
+
+	/// Scoped list of maps.
+	ScopeList scopes;
+	/// Sentinal value for erased keys.
+	Value erased;
+public:
+	typedef typename Scope::key_type key_type;
+	typedef typename Scope::mapped_type mapped_type;
+	typedef typename Scope::value_type value_type;
+	typedef typename ScopeList::size_type size_type;
+	typedef typename ScopeList::difference_type difference_type;
+	typedef typename Scope::reference reference;
+	typedef typename Scope::const_reference const_reference;
+	typedef typename Scope::pointer pointer;
+	typedef typename Scope::const_pointer const_pointer;
+
+	// Both iterator types are complete bidirection iterators, defined below.
+	class iterator;
+	class const_iterator;
+
+	/// Starts a new scope
+	void beginScope() {
+		Scope scope;
+		scopes.push_back(scope);
+	}
+
+	/// Ends a scope; invalidates any iterators pointing to elements of that scope
+	void endScope() {
+		scopes.pop_back();
+		assert( ! scopes.empty() );
+	}
+
+	/// Default constructor initializes with one scope
+	ErasableScopedMap( const Value &erased_ ) : erased( erased_ ) { beginScope(); }
+
+	iterator begin() { return iterator(*this, scopes.back().begin(), scopes.size()-1).next_valid(); }
+	const_iterator begin() const { return const_iterator(*this, scopes.back().begin(), scopes.size()-1).next_valid(); }
+	const_iterator cbegin() const { return const_iterator(*this, scopes.back().begin(), scopes.size()-1).next_valid(); }
+	iterator end() { return iterator(*this, scopes[0].end(), 0); }
+	const_iterator end() const { return const_iterator(*this, scopes[0].end(), 0); }
+	const_iterator cend() const { return const_iterator(*this, scopes[0].end(), 0); }
+
+	/// Gets the index of the current scope (counted from 1)
+	size_type currentScope() const { return scopes.size(); }
+
+	/// Finds the given key in the outermost scope it occurs; returns end() for none such
+	iterator find( const Key &key ) {
+		for ( size_type i = scopes.size() - 1; ; --i ) {
+			typename Scope::iterator val = scopes[i].find( key );
+			if ( val != scopes[i].end() ) {
+				return val->second == erased ? end() : iterator( *this, val, i );
 			}
-
-			/// Increments on invalid
-			iterator& next_valid() {
-				if ( ! is_valid() ) { ++(*this); }
-				return *this;
+			if ( i == 0 ) break;
+		}
+		return end();
+	}
+	const_iterator find( const Key &key ) const {
+		return const_iterator( const_cast< ErasableScopedMap< Key, Value >* >(this)->find( key ) );
+	}
+
+	/// Finds the given key in the outermost scope inside the given scope where it occurs
+	iterator findNext( const_iterator &it, const Key &key ) {
+		if ( it.i == 0 ) return end();
+		for ( size_type i = it.i - 1; ; --i ) {
+			typename Scope::iterator val = scopes[i].find( key );
+			if ( val != scopes[i].end() ) {
+				return val->second == erased ? end() : iterator( *this, val, i );
 			}
-
-			/// Decrements on invalid
-			iterator& prev_valid() {
-				if ( ! is_valid() ) { --(*this); }
-				return *this;
-			}
-			
-			iterator(ErasableScopedMap< Key, Value > const &_map, const wrapped_iterator &_it, size_type _i)
-					: map(&_map), it(_it), i(_i) {}
-			
-		public:
-			iterator(const iterator &that) : map(that.map), it(that.it), i(that.i) {}
-			iterator& operator= (const iterator &that) {
-				map = that.map; i = that.i; it = that.it;
-				return *this;
-			}
-
-			reference operator* () { return *it; }
-			pointer operator-> () { return it.operator->(); }
-
-			iterator& operator++ () {
-				if ( it == map->scopes[i].end() ) {
-					if ( i == 0 ) return *this;
-					--i;
-					it = map->scopes[i].begin();
-				} else {
-					++it;
-				}
-				return next_valid();
-			}
-			iterator& operator++ (int) { iterator tmp = *this; ++(*this); return tmp; }
-
-			iterator& operator-- () {
-				// may fail if this is the begin iterator; allowed by STL spec
-				if ( it == map->scopes[i].begin() ) {
-					++i;
-					it = map->scopes[i].end();
-				}
-				--it;
-				return prev_valid();
-			}
-			iterator& operator-- (int) { iterator tmp = *this; --(*this); return tmp; }
-
-			bool operator== (const iterator &that) {
-				return map == that.map && i == that.i && it == that.it;
-			}
-			bool operator!= (const iterator &that) { return !( *this == that ); }
-
-		private:
-			ErasableScopedMap< Key, Value > const *map;
-			wrapped_iterator it;
-			size_type i;
-		};
-
-		class const_iterator : public std::iterator< std::bidirectional_iterator_tag,
-		                                             value_type > {
-		friend class ErasableScopedMap;
-			typedef typename std::map< Key, Value >::iterator wrapped_iterator;
-			typedef typename std::map< Key, Value >::const_iterator wrapped_const_iterator;
-			typedef typename std::vector< std::map< Key, Value > > scope_list;
-			typedef typename scope_list::size_type size_type;
-
-			/// Checks if this iterator points to a valid item
-			bool is_valid() const {
-				return it != map->scopes[i].end() && it->second != map->erased;
-			}
-
-			/// Increments on invalid
-			const_iterator& next_valid() {
-				if ( ! is_valid() ) { ++(*this); }
-				return *this;
-			}
-
-			/// Decrements on invalid
-			const_iterator& prev_valid() {
-				if ( ! is_valid() ) { --(*this); }
-				return *this;
-			}
-			
-			const_iterator(ErasableScopedMap< Key, Value > const &_map, const wrapped_const_iterator &_it, size_type _i)
-					: map(&_map), it(_it), i(_i) {}
-		public:
-			const_iterator(const iterator &that) : map(that.map), it(that.it), i(that.i) {}
-			const_iterator(const const_iterator &that) : map(that.map), it(that.it), i(that.i) {}
-			const_iterator& operator= (const iterator &that) {
-				map = that.map; i = that.i; it = that.it;
-				return *this;
-			}
-			const_iterator& operator= (const const_iterator &that) {
-				map = that.map; i = that.i; it = that.it;
-				return *this;
-			}
-
-			const_reference operator* () { return *it; }
-			const_pointer operator-> () { return it.operator->(); }
-
-			const_iterator& operator++ () {
-				if ( it == map->scopes[i].end() ) {
-					if ( i == 0 ) return *this;
-					--i;
-					it = map->scopes[i].begin();
-				} else {
-					++it;
-				}
-				return next_valid();
-			}
-			const_iterator& operator++ (int) { const_iterator tmp = *this; ++(*this); return tmp; }
-
-			const_iterator& operator-- () {
-				// may fail if this is the begin iterator; allowed by STL spec
-				if ( it == map->scopes[i].begin() ) {
-					++i;
-					it = map->scopes[i].end();
-				}
-				--it;
-				return prev_valid();
-			}
-			const_iterator& operator-- (int) { const_iterator tmp = *this; --(*this); return tmp; }
-
-			bool operator== (const const_iterator &that) {
-				return map == that.map && i == that.i && it == that.it;
-			}
-			bool operator!= (const const_iterator &that) { return !( *this == that ); }
-
-		private:
-			ErasableScopedMap< Key, Value > const *map;
-			wrapped_const_iterator it;
-			size_type i;
-		};
-
-		/// Starts a new scope
-		void beginScope() {
-			Scope scope;
-			scopes.push_back(scope);
-		}
-
-		/// Ends a scope; invalidates any iterators pointing to elements of that scope
-		void endScope() {
-			scopes.pop_back();
-			assert( ! scopes.empty() );
-		}
-
-		/// Default constructor initializes with one scope
-		ErasableScopedMap( const Value &erased_ ) : erased( erased_ ) { beginScope(); }
-
-		iterator begin() { return iterator(*this, scopes.back().begin(), scopes.size()-1).next_valid(); }
-		const_iterator begin() const { return const_iterator(*this, scopes.back().begin(), scopes.size()-1).next_valid(); }
-		const_iterator cbegin() const { return const_iterator(*this, scopes.back().begin(), scopes.size()-1).next_valid(); }
-		iterator end() { return iterator(*this, scopes[0].end(), 0); }
-		const_iterator end() const { return const_iterator(*this, scopes[0].end(), 0); }
-		const_iterator cend() const { return const_iterator(*this, scopes[0].end(), 0); }
-
-		/// Gets the index of the current scope (counted from 1)
-		size_type currentScope() const { return scopes.size(); }
-
-		/// Finds the given key in the outermost scope it occurs; returns end() for none such
-		iterator find( const Key &key ) {
-			for ( size_type i = scopes.size() - 1; ; --i ) {
-				typename Scope::iterator val = scopes[i].find( key );
-				if ( val != scopes[i].end() ) {
-					return val->second == erased ? end() : iterator( *this, val, i );
-				}
-				if ( i == 0 ) break;
-			}
-			return end();
-		}
-		const_iterator find( const Key &key ) const {
-				return const_iterator( const_cast< ErasableScopedMap< Key, Value >* >(this)->find( key ) );
-		}
-
-		/// Finds the given key in the outermost scope inside the given scope where it occurs
-		iterator findNext( const_iterator &it, const Key &key ) {
-			if ( it.i == 0 ) return end();
-			for ( size_type i = it.i - 1; ; --i ) {
-				typename Scope::iterator val = scopes[i].find( key );
-				if ( val != scopes[i].end() ) {
-					return val->second == erased ? end() : iterator( *this, val, i );
-				}
-				if ( i == 0 ) break;
-			}
-			return end();
-		}
-		const_iterator findNext( const_iterator &it, const Key &key ) const {
-				return const_iterator( const_cast< ErasableScopedMap< Key, Value >* >(this)->findNext( it, key ) );
-		}
-
-		/// Inserts the given key-value pair into the outermost scope
-		std::pair< iterator, bool > insert( const value_type &value ) {
-			std::pair< typename Scope::iterator, bool > res = scopes.back().insert( value );
-			return std::make_pair( iterator(*this, res.first, scopes.size()-1), res.second );
-		}
-		std::pair< iterator, bool > insert( const Key &key, const Value &value ) { return insert( std::make_pair( key, value ) ); }
-
-		/// Marks the given element as erased from this scope inward; returns 1 for erased an element, 0 otherwise
-		size_type erase( const Key &key ) {
-			typename Scope::iterator val = scopes.back().find( key );
-			if ( val != scopes.back().end() ) {
-				val->second = erased;
-				return 1;
-			} else {
-				scopes.back().insert( val, std::make_pair( key, erased ) );
-				return 0;
-			}
-		}
-
-		Value& operator[] ( const Key &key ) {
-			iterator slot = find( key );
-			if ( slot != end() ) return slot->second;
-			return insert( key, Value() ).first->second;
-		}
-	};
+			if ( i == 0 ) break;
+		}
+		return end();
+	}
+	const_iterator findNext( const_iterator &it, const Key &key ) const {
+		return const_iterator( const_cast< ErasableScopedMap< Key, Value >* >(this)->findNext( it, key ) );
+	}
+
+	/// Inserts the given key-value pair into the outermost scope
+	std::pair< iterator, bool > insert( const value_type &value ) {
+		std::pair< typename Scope::iterator, bool > res = scopes.back().insert( value );
+		return std::make_pair( iterator(*this, res.first, scopes.size()-1), res.second );
+	}
+	std::pair< iterator, bool > insert( const Key &key, const Value &value ) { return insert( std::make_pair( key, value ) ); }
+
+	/// Marks the given element as erased from this scope inward; returns 1 for erased an element, 0 otherwise
+	size_type erase( const Key &key ) {
+		typename Scope::iterator val = scopes.back().find( key );
+		if ( val != scopes.back().end() ) {
+			val->second = erased;
+			return 1;
+		} else {
+			scopes.back().insert( val, std::make_pair( key, erased ) );
+			return 0;
+		}
+	}
+
+	Value& operator[] ( const Key &key ) {
+		iterator slot = find( key );
+		if ( slot != end() ) return slot->second;
+		return insert( key, Value() ).first->second;
+	}
+};
+
+template<typename Key, typename Value>
+class ErasableScopedMap<Key, Value>::iterator :
+		public std::iterator< std::bidirectional_iterator_tag, value_type > {
+	friend class ErasableScopedMap;
+	typedef typename std::map< Key, Value >::iterator wrapped_iterator;
+	typedef typename std::vector< std::map< Key, Value > > scope_list;
+	typedef typename scope_list::size_type size_type;
+
+	/// Checks if this iterator points to a valid item
+	bool is_valid() const {
+		return it != map->scopes[i].end() && it->second != map->erased;
+	}
+
+	/// Increments on invalid
+	iterator& next_valid() {
+		if ( ! is_valid() ) { ++(*this); }
+		return *this;
+	}
+
+	/// Decrements on invalid
+	iterator& prev_valid() {
+		if ( ! is_valid() ) { --(*this); }
+		return *this;
+	}
+
+	iterator(ErasableScopedMap< Key, Value > const &_map, const wrapped_iterator &_it, size_type _i)
+			: map(&_map), it(_it), i(_i) {}
+
+public:
+	iterator(const iterator &that) : map(that.map), it(that.it), i(that.i) {}
+	iterator& operator= (const iterator &that) {
+		map = that.map; i = that.i; it = that.it;
+		return *this;
+	}
+
+	reference operator* () { return *it; }
+	pointer operator-> () { return it.operator->(); }
+
+	iterator& operator++ () {
+		if ( it == map->scopes[i].end() ) {
+			if ( i == 0 ) return *this;
+			--i;
+			it = map->scopes[i].begin();
+		} else {
+			++it;
+		}
+		return next_valid();
+	}
+
+	iterator& operator++ (int) { iterator tmp = *this; ++(*this); return tmp; }
+
+	iterator& operator-- () {
+		// may fail if this is the begin iterator; allowed by STL spec
+		if ( it == map->scopes[i].begin() ) {
+			++i;
+			it = map->scopes[i].end();
+		}
+		--it;
+		return prev_valid();
+	}
+	iterator& operator-- (int) { iterator tmp = *this; --(*this); return tmp; }
+
+	bool operator== (const iterator &that) {
+		return map == that.map && i == that.i && it == that.it;
+	}
+	bool operator!= (const iterator &that) { return !( *this == that ); }
+
+private:
+	ErasableScopedMap< Key, Value > const *map;
+	wrapped_iterator it;
+	size_type i;
+};
+
+template<typename Key, typename Value>
+class ErasableScopedMap<Key, Value>::const_iterator :
+		public std::iterator< std::bidirectional_iterator_tag, value_type > {
+	friend class ErasableScopedMap;
+	typedef typename std::map< Key, Value >::iterator wrapped_iterator;
+	typedef typename std::map< Key, Value >::const_iterator wrapped_const_iterator;
+	typedef typename std::vector< std::map< Key, Value > > scope_list;
+	typedef typename scope_list::size_type size_type;
+
+	/// Checks if this iterator points to a valid item
+	bool is_valid() const {
+		return it != map->scopes[i].end() && it->second != map->erased;
+	}
+
+	/// Increments on invalid
+	const_iterator& next_valid() {
+		if ( ! is_valid() ) { ++(*this); }
+		return *this;
+	}
+
+	/// Decrements on invalid
+	const_iterator& prev_valid() {
+		if ( ! is_valid() ) { --(*this); }
+		return *this;
+	}
+
+	const_iterator(ErasableScopedMap< Key, Value > const &_map, const wrapped_const_iterator &_it, size_type _i)
+			: map(&_map), it(_it), i(_i) {}
+public:
+	const_iterator(const iterator &that) : map(that.map), it(that.it), i(that.i) {}
+	const_iterator(const const_iterator &that) : map(that.map), it(that.it), i(that.i) {}
+	const_iterator& operator= (const iterator &that) {
+		map = that.map; i = that.i; it = that.it;
+		return *this;
+	}
+	const_iterator& operator= (const const_iterator &that) {
+		map = that.map; i = that.i; it = that.it;
+		return *this;
+	}
+
+	const_reference operator* () { return *it; }
+	const_pointer operator-> () { return it.operator->(); }
+
+	const_iterator& operator++ () {
+		if ( it == map->scopes[i].end() ) {
+			if ( i == 0 ) return *this;
+			--i;
+			it = map->scopes[i].begin();
+		} else {
+			++it;
+		}
+		return next_valid();
+	}
+	const_iterator& operator++ (int) { const_iterator tmp = *this; ++(*this); return tmp; }
+
+	const_iterator& operator-- () {
+		// may fail if this is the begin iterator; allowed by STL spec
+		if ( it == map->scopes[i].begin() ) {
+			++i;
+			it = map->scopes[i].end();
+		}
+		--it;
+		return prev_valid();
+	}
+	const_iterator& operator-- (int) { const_iterator tmp = *this; --(*this); return tmp; }
+
+	bool operator== (const const_iterator &that) {
+		return map == that.map && i == that.i && it == that.it;
+	}
+	bool operator!= (const const_iterator &that) { return !( *this == that ); }
+
+private:
+	ErasableScopedMap< Key, Value > const *map;
+	wrapped_const_iterator it;
+	size_type i;
+};
+
 } // namespace GenPoly
 
Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/Parser/DeclarationNode.cc	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -27,5 +27,5 @@
 #include "SynTree/LinkageSpec.h"   // for Spec, linkageName, Cforall
 #include "SynTree/Attribute.h"     // for Attribute
-#include "SynTree/Declaration.h"   // for TypeDecl, ObjectDecl, InlineValueDecl, Declaration
+#include "SynTree/Declaration.h"   // for TypeDecl, ObjectDecl, InlineMemberDecl, Declaration
 #include "SynTree/Expression.h"    // for Expression, ConstantExpr
 #include "SynTree/Statement.h"     // for AsmStmt
@@ -254,5 +254,5 @@
 } // DeclarationNode::newAggregate
 
-DeclarationNode * DeclarationNode::newEnum( const string * name, DeclarationNode * constants, bool body, bool typed, DeclarationNode * base) {
+DeclarationNode * DeclarationNode::newEnum( const string * name, DeclarationNode * constants, bool body, bool typed, DeclarationNode * base, EnumHiding hiding ) {
 	DeclarationNode * newnode = new DeclarationNode;
 	newnode->type = new TypeData( TypeData::Enum );
@@ -262,4 +262,5 @@
 	newnode->type->enumeration.anon = name == nullptr;
 	newnode->type->enumeration.typed = typed;
+	newnode->type->enumeration.hiding = hiding;
 	if ( base && base->type)  {
 		newnode->type->base = base->type;
@@ -1166,5 +1167,5 @@
 	} // if
 	if ( enumInLine ) {
-		return new InlineValueDecl( *name, storageClasses, linkage, nullptr );
+		return new InlineMemberDecl( *name, storageClasses, linkage, nullptr );
 	} // if
 	assertf( name, "ObjectDecl must a have name\n" );
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/Parser/ParseNode.h	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -239,5 +239,5 @@
 	static DeclarationNode * newFunction( const std::string * name, DeclarationNode * ret, DeclarationNode * param, StatementNode * body );
 	static DeclarationNode * newAggregate( AggregateDecl::Aggregate kind, const std::string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body );
-	static DeclarationNode * newEnum( const std::string * name, DeclarationNode * constants, bool body, bool typed, DeclarationNode * base = nullptr );
+	static DeclarationNode * newEnum( const std::string * name, DeclarationNode * constants, bool body, bool typed, DeclarationNode * base = nullptr, EnumHiding hiding = EnumHiding::Visible );
 	static DeclarationNode * newEnumConstant( const std::string * name, ExpressionNode * constant );
 	static DeclarationNode * newEnumValueGeneric( const std::string * name, InitializerNode * init );
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/Parser/TypeData.cc	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -923,4 +923,5 @@
 	buildList( td->enumeration.constants, ret->get_members() );
 	list< Declaration * >::iterator members = ret->get_members().begin();
+	ret->hide = td->enumeration.hiding == EnumHiding::Hide ? EnumDecl::EnumHiding::Hide : EnumDecl::EnumHiding::Visible;
 	for ( const DeclarationNode * cur = td->enumeration.constants; cur != nullptr; cur = dynamic_cast< DeclarationNode * >( cur->get_next() ), ++members ) {
 		if ( cur->enumInLine ) {
Index: src/Parser/TypeData.h
===================================================================
--- src/Parser/TypeData.h	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/Parser/TypeData.h	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -60,4 +60,5 @@
 		bool anon;
 		bool typed;
+		EnumHiding hiding;
 	};
 
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/Parser/parser.yy	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Nov  2 21:31:21 2022
-// Update Count     : 5810
+// Last Modified On : Mon Nov 21 22:34:30 2022
+// Update Count     : 5848
 //
 
@@ -383,5 +383,5 @@
 %type<ifctl> conditional_declaration
 %type<fctl> for_control_expression		for_control_expression_list
-%type<compop> updown updowneq downupdowneq
+%type<compop> upupeq updown updowneq downupdowneq
 %type<en> subrange
 %type<decl> asm_name_opt
@@ -489,5 +489,5 @@
 %type<decl> type_parameter type_parameter_list type_initializer_opt
 
-%type<en> type_parameters_opt type_list
+%type<en> type_parameters_opt type_list array_type_list
 
 %type<decl> type_qualifier type_qualifier_name forall type_qualifier_list_opt type_qualifier_list
@@ -2558,8 +2558,8 @@
 		{ typedefTable.makeTypedef( *$3 ); }
 	  hide_opt '{' enumerator_list comma_opt '}'
-	  { $$ = DeclarationNode::newEnum( $3, $7, true, false )->addQualifiers( $2 ); }
+		{ $$ = DeclarationNode::newEnum( $3, $7, true, false, nullptr, $5 )->addQualifiers( $2 ); }
 	| ENUM attribute_list_opt typedef_name				// unqualified type name
 	  hide_opt '{' enumerator_list comma_opt '}'
-		{ $$ = DeclarationNode::newEnum( $3->name, $6, true, false )->addQualifiers( $2 ); }
+		{ $$ = DeclarationNode::newEnum( $3->name, $6, true, false, nullptr, $4 )->addQualifiers( $2 ); }
 	| ENUM '(' cfa_abstract_parameter_declaration ')' attribute_list_opt '{' enumerator_list comma_opt '}'
 	 	{
@@ -2580,20 +2580,20 @@
 	  hide_opt '{' enumerator_list comma_opt '}'
 		{
-			$$ = DeclarationNode::newEnum( $6, $11, true, true, $3 )->addQualifiers( $5 )->addQualifiers( $7 );
+			$$ = DeclarationNode::newEnum( $6, $11, true, true, $3, $9 )->addQualifiers( $5 )->addQualifiers( $7 );
 		}
 	| ENUM '(' ')' attribute_list_opt identifier attribute_list_opt
 	  hide_opt '{' enumerator_list comma_opt '}'
 		{
-			$$ = DeclarationNode::newEnum( $5, $9, true, true, nullptr )->addQualifiers( $4 )->addQualifiers( $6 );
+			$$ = DeclarationNode::newEnum( $5, $9, true, true, nullptr, $7 )->addQualifiers( $4 )->addQualifiers( $6 );
 		}
 	| ENUM '(' cfa_abstract_parameter_declaration ')' attribute_list_opt typedef_name attribute_list_opt
 	  hide_opt '{' enumerator_list comma_opt '}'
 		{
-			$$ = DeclarationNode::newEnum( $6->name, $10, true, true, $3 )->addQualifiers( $5 )->addQualifiers( $7 );
+			$$ = DeclarationNode::newEnum( $6->name, $10, true, true, $3, $8 )->addQualifiers( $5 )->addQualifiers( $7 );
 		}
 	| ENUM '(' ')' attribute_list_opt typedef_name attribute_list_opt
 	  hide_opt '{' enumerator_list comma_opt '}'
 		{
-			$$ = DeclarationNode::newEnum( $5->name, $9, true, true, nullptr )->addQualifiers( $4 )->addQualifiers( $6 );
+			$$ = DeclarationNode::newEnum( $5->name, $9, true, true, nullptr, $7 )->addQualifiers( $4 )->addQualifiers( $6 );
 		}
 	| enum_type_nobody
@@ -3653,9 +3653,32 @@
 	| '[' ']' multi_array_dimension
 		{ $$ = DeclarationNode::newArray( 0, 0, false )->addArray( $3 ); }
-	| '[' push assignment_expression pop ',' comma_expression ']'
+		// Cannot use constant_expression because of tuples => semantic check
+	| '[' push assignment_expression pop ',' comma_expression ']' // CFA
 		{ $$ = DeclarationNode::newArray( $3, 0, false )->addArray( DeclarationNode::newArray( $6, 0, false ) ); }
 		// { SemanticError( yylloc, "New array dimension is currently unimplemented." ); $$ = nullptr; }
+	| '[' push array_type_list pop ']'					// CFA
+		{ SemanticError( yylloc, "Type array dimension is currently unimplemented." ); $$ = nullptr; }
 	| multi_array_dimension
 	;
+
+array_type_list:
+	basic_type_name
+		{ $$ = new ExpressionNode( new TypeExpr( maybeMoveBuildType( $1 ) ) ); }
+	| type_name
+		{ $$ = new ExpressionNode( new TypeExpr( maybeMoveBuildType( $1 ) ) ); }
+	| assignment_expression upupeq assignment_expression
+	| array_type_list ',' basic_type_name
+		{ $$ = (ExpressionNode *)($1->set_last( new ExpressionNode( new TypeExpr( maybeMoveBuildType( $3 ) ) ) )); }
+	| array_type_list ',' type_name 
+		{ $$ = (ExpressionNode *)($1->set_last( new ExpressionNode( new TypeExpr( maybeMoveBuildType( $3 ) ) ) )); }
+	| array_type_list ',' assignment_expression upupeq assignment_expression
+	;
+
+upupeq:
+	'~'
+		{ $$ = OperKinds::LThan; }
+	| ErangeUpEq
+		{ $$ = OperKinds::LEThan; }
+ 	;
 
 multi_array_dimension:
Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/SynTree/Declaration.h	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -340,4 +340,5 @@
   	bool isTyped;
 	Type * base;
+	enum EnumHiding { Visible, Hide } hide;
 
 	EnumDecl( const std::string & name,
@@ -345,5 +346,5 @@
 	  bool isTyped = false, LinkageSpec::Spec linkage = LinkageSpec::Cforall,
 	  Type * baseType = nullptr ) 
-	  : Parent( name, attributes, linkage ),isTyped(isTyped), base( baseType ) {}
+	  : Parent( name, attributes, linkage ), isTyped(isTyped), base( baseType ) {}
 	EnumDecl( const EnumDecl & other ) 
 	  : Parent( other ), isTyped( other.isTyped), base( other.base ) {}
@@ -450,20 +451,20 @@
 
 
-class InlineValueDecl : public DeclarationWithType {
+class InlineMemberDecl : public DeclarationWithType {
 	typedef DeclarationWithType Parent;
   public:
 	Type * type;
 
-	InlineValueDecl( const std::string & name, Type::StorageClasses scs, LinkageSpec::Spec linkage, Type * type,
+	InlineMemberDecl( const std::string & name, Type::StorageClasses scs, LinkageSpec::Spec linkage, Type * type,
 				const std::list< Attribute * > attributes = std::list< Attribute * >(), Type::FuncSpecifiers fs = Type::FuncSpecifiers() );
-	InlineValueDecl( const InlineValueDecl & other );
-	virtual ~InlineValueDecl();
+	InlineMemberDecl( const InlineMemberDecl & other );
+	virtual ~InlineMemberDecl();
 
 	virtual Type * get_type() const override { return type; }
 	virtual void set_type(Type * newType) override { type = newType; }
 
-	static InlineValueDecl * newInlineValueDecl( const std::string & name, Type * type );
-
-	virtual InlineValueDecl * clone() const override { return new InlineValueDecl( *this ); }
+	static InlineMemberDecl * newInlineMemberDecl( const std::string & name, Type * type );
+
+	virtual InlineMemberDecl * clone() const override { return new InlineMemberDecl( *this ); }
 	virtual void accept( Visitor & v ) override { v.visit( this ); }
 	virtual void accept( Visitor & v ) const override { v.visit( this ); }
Index: src/SynTree/InlineMemberDecl.cc
===================================================================
--- src/SynTree/InlineMemberDecl.cc	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
+++ src/SynTree/InlineMemberDecl.cc	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -0,0 +1,57 @@
+#include <list>                  // for list
+#include <ostream>               // for operator<<, ostream, basic_ostream
+#include <string>                // for operator<<, string, char_traits, ope...
+
+#include "Attribute.h"           // for Attribute
+#include "Declaration.h"
+#include "Common/utility.h"      // for maybeClone, printAll
+#include "LinkageSpec.h"         // for Spec, linkageName, Cforall
+#include "Type.h"                // for Type, Type::StorageClasses, Type::Fu...
+
+InlineMemberDecl::InlineMemberDecl( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage,
+Type * type, const std::list< Attribute * >attributes, Type::FuncSpecifiers fs) 
+    : Parent( name, scs, linkage, attributes, fs ), type( type ) {}
+
+InlineMemberDecl::InlineMemberDecl( const InlineMemberDecl &other) 
+    : Parent( other), type( maybeClone( other.type ) ) {}
+
+InlineMemberDecl::~InlineMemberDecl() { delete type; }
+
+InlineMemberDecl * InlineMemberDecl::newInlineMemberDecl( const std::string &name, Type * type ) {
+    return new InlineMemberDecl( name, Type::StorageClasses(), LinkageSpec::C, type );
+}
+
+void InlineMemberDecl::print( std::ostream &os, Indenter indent ) const {
+    if ( name != "" ) os << name << ": ";
+
+	if ( linkage != LinkageSpec::Cforall ) {
+		os << LinkageSpec::name( linkage ) << " ";
+	} // if
+
+	get_storageClasses().print( os );
+
+	if ( type ) {
+		type->print( os, indent );
+	} else {
+		os << " untyped entity ";
+	} // if
+
+	if ( ! attributes.empty() ) {
+		os << std::endl << indent << "... with attributes:" << std::endl;
+		printAll( attributes, os, indent+1 );
+	} // if
+
+}
+
+void InlineMemberDecl::printShort( std::ostream &os, Indenter indent ) const {
+    if ( name != "" ) os << name << ": ";
+
+	get_storageClasses().print( os );
+
+	if ( type ) {
+		type->print( os, indent );
+	} else {
+		os << "untyped entity ";
+	} // if
+    
+}
Index: c/SynTree/InlineValueDecl.cc
===================================================================
--- src/SynTree/InlineValueDecl.cc	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ 	(revision )
@@ -1,57 +1,0 @@
-#include <list>                  // for list
-#include <ostream>               // for operator<<, ostream, basic_ostream
-#include <string>                // for operator<<, string, char_traits, ope...
-
-#include "Attribute.h"           // for Attribute
-#include "Declaration.h"
-#include "Common/utility.h"      // for maybeClone, printAll
-#include "LinkageSpec.h"         // for Spec, linkageName, Cforall
-#include "Type.h"                // for Type, Type::StorageClasses, Type::Fu...
-
-InlineValueDecl::InlineValueDecl( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage,
-Type * type, const std::list< Attribute * >attributes, Type::FuncSpecifiers fs) 
-    : Parent( name, scs, linkage, attributes, fs ), type( type ) {}
-
-InlineValueDecl::InlineValueDecl( const InlineValueDecl &other) 
-    : Parent( other), type( maybeClone( other.type ) ) {}
-
-InlineValueDecl::~InlineValueDecl() { delete type; }
-
-InlineValueDecl * InlineValueDecl::newInlineValueDecl( const std::string &name, Type * type ) {
-    return new InlineValueDecl( name, Type::StorageClasses(), LinkageSpec::C, type );
-}
-
-void InlineValueDecl::print( std::ostream &os, Indenter indent ) const {
-    if ( name != "" ) os << name << ": ";
-
-	if ( linkage != LinkageSpec::Cforall ) {
-		os << LinkageSpec::name( linkage ) << " ";
-	} // if
-
-	get_storageClasses().print( os );
-
-	if ( type ) {
-		type->print( os, indent );
-	} else {
-		os << " untyped entity ";
-	} // if
-
-	if ( ! attributes.empty() ) {
-		os << std::endl << indent << "... with attributes:" << std::endl;
-		printAll( attributes, os, indent+1 );
-	} // if
-
-}
-
-void InlineValueDecl::printShort( std::ostream &os, Indenter indent ) const {
-    if ( name != "" ) os << name << ": ";
-
-	get_storageClasses().print( os );
-
-	if ( type ) {
-		type->print( os, indent );
-	} else {
-		os << "untyped entity ";
-	} // if
-    
-}
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/SynTree/Mutator.h	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -36,5 +36,5 @@
 	virtual DirectiveDecl * mutate( DirectiveDecl * directiveDecl ) = 0;
 	virtual StaticAssertDecl * mutate( StaticAssertDecl * assertDecl ) = 0;
-	virtual DeclarationWithType * mutate( InlineValueDecl * inlineValueDecl ) = 0;
+	virtual DeclarationWithType * mutate( InlineMemberDecl * InlineMemberDecl ) = 0;
 
 	virtual CompoundStmt * mutate( CompoundStmt * compoundStmt ) = 0;
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/SynTree/SynTree.h	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -38,5 +38,5 @@
 class DirectiveDecl;
 class StaticAssertDecl;
-class InlineValueDecl;
+class InlineMemberDecl;
 
 class Statement;
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/SynTree/Visitor.h	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -49,6 +49,6 @@
 	virtual void visit( StaticAssertDecl * node ) { visit( const_cast<const StaticAssertDecl *>(node) ); }
 	virtual void visit( const StaticAssertDecl * assertDecl ) = 0;
-	virtual void visit( InlineValueDecl * node ) { visit( const_cast<const InlineValueDecl *>(node) ); }
-	virtual void visit( const InlineValueDecl * valueDecl ) = 0;
+	virtual void visit( InlineMemberDecl * node ) { visit( const_cast<const InlineMemberDecl *>(node) ); }
+	virtual void visit( const InlineMemberDecl * valueDecl ) = 0;
 
 	virtual void visit( CompoundStmt * node ) { visit( const_cast<const CompoundStmt *>(node) ); }
Index: src/SynTree/module.mk
===================================================================
--- src/SynTree/module.mk	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/SynTree/module.mk	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -42,5 +42,5 @@
       SynTree/Initializer.cc \
       SynTree/Initializer.h \
-      SynTree/InlineValueDecl.cc \
+      SynTree/InlineMemberDecl.cc \
       SynTree/Label.h \
       SynTree/LinkageSpec.cc \
Index: src/Validate/EnumAndPointerDecay.cpp
===================================================================
--- src/Validate/EnumAndPointerDecay.cpp	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ src/Validate/EnumAndPointerDecay.cpp	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -41,22 +41,25 @@
 	auto mut = ast::mutate( decl );
 	std::vector<ast::ptr<ast::Decl>> buffer;
-	for ( auto it = decl->members.begin(); it != decl->members.end(); ++it ) {
-		if ( ast::ObjectDecl const * object = (*it).as<ast::ObjectDecl>() ) {
-			buffer.push_back( ast::mutate_field( object, &ast::ObjectDecl::type, new ast::EnumInstType( decl, ast::CV::Const ) ) );
-		} else if ( ast::InlineValueDecl const * value = (*it).as<ast::InlineValueDecl>() ) {
+	for ( auto member : decl->members ) {
+		if ( ast::ObjectDecl const * object = member.as<ast::ObjectDecl>() ) {
+			buffer.push_back( ast::mutate_field( object,
+				&ast::ObjectDecl::type,
+				new ast::EnumInstType( decl, ast::CV::Const ) ) );
+		} else if ( auto value = member.as<ast::InlineMemberDecl>() ) {
 			if ( auto targetEnum = symtab.lookupEnum( value->name ) ) {
-				for ( auto singleMember : targetEnum->members ) {
-					auto copyingMember = singleMember.as<ast::ObjectDecl>();
+				for ( auto enumMember : targetEnum->members ) {
+					auto enumObject = enumMember.strict_as<ast::ObjectDecl>();
 					buffer.push_back( new ast::ObjectDecl(
-						value->location, // use the "inline" location
-						copyingMember->name,
+						// Get the location from the "inline" declaration.
+						value->location,
+						enumObject->name,
+						// Construct a new EnumInstType as the type.
 						new ast::EnumInstType( decl, ast::CV::Const ),
-						// Construct a new EnumInstType as the type
-						copyingMember->init,
-						copyingMember->storage,
-						copyingMember->linkage,
-						copyingMember->bitfieldWidth,
+						enumObject->init,
+						enumObject->storage,
+						enumObject->linkage,
+						enumObject->bitfieldWidth,
 						{},
-						copyingMember->funcSpec
+						enumObject->funcSpec
 					) );
 				}
Index: sts/.expect/PRNG.txt
===================================================================
--- tests/.expect/PRNG.txt	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ 	(revision )
@@ -1,96 +1,0 @@
-
-       PRNG()   PRNG(5)    PRNG(0,5)
-     37301721         2            2
-   1681308562         1            3
-    290112364         3            2
-   1852700364         4            3
-    733221210         1            3
-   1775396023         2            3
-    123981445         2            3
-   2062557687         2            0
-    283934808         1            0
-    672325890         1            3
-   1414344101         1            3
-    873424536         3            4
-    871831898         3            4
-    866783532         0            1
-   2142057611         4            4
-     17310256         2            5
-    802117363         0            4
-    492964499         0            0
-   2346353643         1            3
-   2143013105         3            2
-seed 1009
-
-Sequential
-trials 100000000 buckets 100000 min 853 max 1141 avg 1000.0 std 31.1 rstd 3.1%
-
-Concurrent
-trials 100000000 buckets 100000 min 853 max 1141 avg 1000.0 std 31.1 rstd 3.1%
-trials 100000000 buckets 100000 min 853 max 1141 avg 1000.0 std 31.1 rstd 3.1%
-trials 100000000 buckets 100000 min 853 max 1141 avg 1000.0 std 31.1 rstd 3.1%
-trials 100000000 buckets 100000 min 853 max 1141 avg 1000.0 std 31.1 rstd 3.1%
-
-       prng()   prng(5)    prng(0,5)
-     37301721         2            2
-   1681308562         1            3
-    290112364         3            2
-   1852700364         4            3
-    733221210         1            3
-   1775396023         2            3
-    123981445         2            3
-   2062557687         2            0
-    283934808         1            0
-    672325890         1            3
-   1414344101         1            3
-    873424536         3            4
-    871831898         3            4
-    866783532         0            1
-   2142057611         4            4
-     17310256         2            5
-    802117363         0            4
-    492964499         0            0
-   2346353643         1            3
-   2143013105         3            2
-seed 1009
-
-Sequential
-trials 100000000 buckets 100000 min 853 max 1141 avg 1000.0 std 31.1 rstd 3.1%
-
-Concurrent
-trials 100000000 buckets 100000 min 853 max 1141 avg 1000.0 std 31.1 rstd 3.1%
-trials 100000000 buckets 100000 min 853 max 1141 avg 1000.0 std 31.1 rstd 3.1%
-trials 100000000 buckets 100000 min 853 max 1141 avg 1000.0 std 31.1 rstd 3.1%
-trials 100000000 buckets 100000 min 853 max 1141 avg 1000.0 std 31.1 rstd 3.1%
-
-      prng(t) prng(t,5)  prng(t,0,5)
-     37301721         2            2
-   1681308562         1            3
-    290112364         3            2
-   1852700364         4            3
-    733221210         1            3
-   1775396023         2            3
-    123981445         2            3
-   2062557687         2            0
-    283934808         1            0
-    672325890         1            3
-   1414344101         1            3
-    873424536         3            4
-    871831898         3            4
-    866783532         0            1
-   2142057611         4            4
-     17310256         2            5
-    802117363         0            4
-    492964499         0            0
-   2346353643         1            3
-   2143013105         3            2
-seed 1009
-
-Sequential
-trials 100000000 buckets 100000 min 853 max 1141 avg 1000.0 std 31.1 rstd 3.1%
-
-Concurrent
-trials 100000000 buckets 100000 min 853 max 1141 avg 1000.0 std 31.1 rstd 3.1%
-trials 100000000 buckets 100000 min 853 max 1141 avg 1000.0 std 31.1 rstd 3.1%
-trials 100000000 buckets 100000 min 853 max 1141 avg 1000.0 std 31.1 rstd 3.1%
-trials 100000000 buckets 100000 min 853 max 1141 avg 1000.0 std 31.1 rstd 3.1%
Index: tests/.expect/PRNG.x64.txt
===================================================================
--- tests/.expect/PRNG.x64.txt	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
+++ tests/.expect/PRNG.x64.txt	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -0,0 +1,96 @@
+
+       PRNG()   PRNG(5)    PRNG(0,5)
+          861         3            0
+10137507171299805328         1            2
+12205946788447993741         4            0
+16222929371023265189         2            5
+11921944259646500358         1            1
+9511863719043198063         2            0
+18170109536749574203         0            1
+15896208456307578543         0            3
+4171113079117645375         1            4
+5535309872453329531         1            1
+13293369315461644140         2            2
+855811942427900360         1            1
+9125507373316195824         1            5
+6942856496042419510         1            5
+16774706561877323900         2            4
+17765436951300330249         4            0
+3766082030894719812         1            2
+15818141700523398820         3            5
+1244962761353699441         0            5
+4506898200126256218         1            2
+seed 1009
+
+Sequential
+trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
+
+Concurrent
+trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
+trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
+trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
+trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
+
+       prng()   prng(5)    prng(0,5)
+          861         3            0
+10137507171299805328         1            2
+12205946788447993741         4            0
+16222929371023265189         2            5
+11921944259646500358         1            1
+9511863719043198063         2            0
+18170109536749574203         0            1
+15896208456307578543         0            3
+4171113079117645375         1            4
+5535309872453329531         1            1
+13293369315461644140         2            2
+855811942427900360         1            1
+9125507373316195824         1            5
+6942856496042419510         1            5
+16774706561877323900         2            4
+17765436951300330249         4            0
+3766082030894719812         1            2
+15818141700523398820         3            5
+1244962761353699441         0            5
+4506898200126256218         1            2
+seed 1009
+
+Sequential
+trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
+
+Concurrent
+trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
+trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
+trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
+trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
+
+      prng(t) prng(t,5)  prng(t,0,5)
+          861         3            0
+10137507171299805328         1            2
+12205946788447993741         4            0
+16222929371023265189         2            5
+11921944259646500358         1            1
+9511863719043198063         2            0
+18170109536749574203         0            1
+15896208456307578543         0            3
+4171113079117645375         1            4
+5535309872453329531         1            1
+13293369315461644140         2            2
+855811942427900360         1            1
+9125507373316195824         1            5
+6942856496042419510         1            5
+16774706561877323900         2            4
+17765436951300330249         4            0
+3766082030894719812         1            2
+15818141700523398820         3            5
+1244962761353699441         0            5
+4506898200126256218         1            2
+seed 1009
+
+Sequential
+trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
+
+Concurrent
+trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
+trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
+trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
+trials 100000000 buckets 100000 min 875 max 1138 avg 1000.0 std 31.8 rstd 3.2%
Index: tests/.expect/PRNG.x86.txt
===================================================================
--- tests/.expect/PRNG.x86.txt	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
+++ tests/.expect/PRNG.x86.txt	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -0,0 +1,96 @@
+
+       PRNG()   PRNG(5)    PRNG(0,5)
+      8333105         1            2
+   1989339636         4            5
+    266970699         3            2
+   1928130121         3            4
+   1351003938         4            5
+   1624164922         4            3
+    363429604         1            2
+   3355083174         1            1
+    214422584         1            1
+   2266729947         1            2
+   3649702519         2            4
+   2250875012         2            4
+   4184653025         1            3
+   2640851227         2            5
+    206468178         2            3
+   2600873108         1            3
+   3007574582         3            3
+    394476790         0            2
+   1312145388         1            5
+   2989081290         2            4
+seed 1009
+
+Sequential
+trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
+
+Concurrent
+trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
+trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
+trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
+trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
+
+       prng()   prng(5)    prng(0,5)
+      8333105         1            2
+   1989339636         4            5
+    266970699         3            2
+   1928130121         3            4
+   1351003938         4            5
+   1624164922         4            3
+    363429604         1            2
+   3355083174         1            1
+    214422584         1            1
+   2266729947         1            2
+   3649702519         2            4
+   2250875012         2            4
+   4184653025         1            3
+   2640851227         2            5
+    206468178         2            3
+   2600873108         1            3
+   3007574582         3            3
+    394476790         0            2
+   1312145388         1            5
+   2989081290         2            4
+seed 1009
+
+Sequential
+trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
+
+Concurrent
+trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
+trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
+trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
+trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
+
+      prng(t) prng(t,5)  prng(t,0,5)
+      8333105         1            2
+   1989339636         4            5
+    266970699         3            2
+   1928130121         3            4
+   1351003938         4            5
+   1624164922         4            3
+    363429604         1            2
+   3355083174         1            1
+    214422584         1            1
+   2266729947         1            2
+   3649702519         2            4
+   2250875012         2            4
+   4184653025         1            3
+   2640851227         2            5
+    206468178         2            3
+   2600873108         1            3
+   3007574582         3            3
+    394476790         0            2
+   1312145388         1            5
+   2989081290         2            4
+seed 1009
+
+Sequential
+trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
+
+Concurrent
+trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
+trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
+trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
+trials 100000000 buckets 100000 min 873 max 1140 avg 1000.0 std 31.3 rstd 3.1%
Index: sts/.expect/ifwhileCtl.txt
===================================================================
--- tests/.expect/ifwhileCtl.txt	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ 	(revision )
@@ -1,7 +1,0 @@
-x != 0 correct
-x != 0 && y != 0 correct
-x == y correct
-s.i < 4 correct
-x != 0 correct
-x == y correct
-s.i < 4 correct
Index: sts/.expect/loop-inc.txt
===================================================================
--- tests/.expect/loop-inc.txt	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ 	(revision )
@@ -1,3 +1,0 @@
-loop
-loop
-done
Index: sts/.expect/loop_else.txt
===================================================================
--- tests/.expect/loop_else.txt	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ 	(revision )
@@ -1,64 +1,0 @@
-empty
-empty
-empty
-
-false else
-
-else zero
-A else
-A A A A A A A A A A else
-A A A A A A A A A A A else
-B B B B B else
-C C C C C else
-D D D D D else
-E E E E E else
-
-0 1 2 3 4 5 6 7 8 9 else
-0 1 2 3 4 5 6 7 8 9 10 else
-1 3 5 7 9 else
-10 8 6 4 2 else
-0.5 1.5 2.5 3.5 4.5 else
-5.5 4.5 3.5 2.5 1.5 else
-2 4 6 8 10 else
-10 8 6 4 2 else
-
-1 2 3 4 5 6 7 8 9 10
-10 9 8 7 6 5 4 3 2 1 0
-2 4 6 8 10
-2.1 3.8 5.5 7.2 8.9
-10 8 6 4 2 0
-12.1 10.4 8.7 7. 5.3 3.6
-
-N N N N N N N N N N else
-0 1 2 3 4 5 6 7 8 9 else
-0 1 2 3 4 5 6 7 8 9 10 else
-10 9 8 7 6 5 4 3 2 1 0 else
-
-3 6 9 else
-
-0 -5 1 -4 2 -3 3 -2 4 -1 5 0 6 1 7 2 8 3 9 4 else
-0 -5 1 -6 2 -7 3 -8 4 -9 5 -10 6 -11 7 -12 8 -13 9 -14 else
-0 -5 1 -3 2 -1 3 1 4 3 5 5 6 7 7 9 8 11 9 13 else
-0 -5 1 -7 2 -9 3 -11 4 -13 5 -15 6 -17 7 -19 8 -21 9 -23 else
-
-0 -5 1 -4 2 -3 3 -2 4 -1 5 0 6 1 7 2 8 3 9 4 else
-0 -5 1 -6 2 -7 3 -8 4 -9 5 -10 6 -11 7 -12 8 -13 9 -14 else
-0 -5 1 -3 2 -1 3 1 4 3 5 5 6 7 7 9 8 11 9 13 else
-0 -5 1 -7 2 -9 3 -11 4 -13 5 -15 6 -17 7 -19 8 -21 9 -23 else
-
-0 -5 1.5 1 -7 2.5 2 -9 3.5 3 -11 4.5 4 -13 5.5 5 -15 6.5 6 -17 7.5 7 -19 8.5 8 -21 9.5 9 -23 10.5 else
-0 -5 1.5 1 -7 2.5 2 -9 3.5 3 -11 4.5 4 -13 5.5 5 -15 6.5 6 -17 7.5 7 -19 8.5 8 -21 9.5 9 -23 10.5 else
-0 -5 1.5 1 -7 2.5 2 -9 3.5 3 -11 4.5 4 -13 5.5 5 -15 6.5 6 -17 7.5 7 -19 8.5 8 -21 9.5 9 -23 10.5 else
-(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)else
-(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)else
-
-(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)else
-(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)else
-(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)(10 10)else
-(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)(10 10)else
-
-(10 10)(9 9)(8 8)(7 7)(6 6)(5 5)(4 4)(3 3)(2 2)(1 1)else
-(10 10)(9 9)(8 8)(7 7)(6 6)(5 5)(4 4)(3 3)(2 2)(1 1)else
-(10 10)(9 9)(8 8)(7 7)(6 6)(5 5)(4 4)(3 3)(2 2)(1 1)(0 0)else
-(10 10)(9 9)(8 8)(7 7)(6 6)(5 5)(4 4)(3 3)(2 2)(1 1)(0 0)else
-
Index: sts/.expect/loopctrl.txt
===================================================================
--- tests/.expect/loopctrl.txt	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ 	(revision )
@@ -1,109 +1,0 @@
-empty
-empty
-empty
-
-zero
-A
-A A A A A A A A A A
-A A A A A A A A A A A
-B B B B B
-C C C C C
-D D D D D
-E E E E E
-
-0 1 2 3 4 5 6 7 8 9
-0 1 2 3 4 5 6 7 8 9 10
-1 3 5 7 9
-10 8 6 4 2
-0.5 1.5 2.5 3.5 4.5
-5.5 4.5 3.5 2.5 1.5
-2 4 6 8 10
-10 8 6 4 2
-
-1 2 3 4 5 6 7 8 9 10
-10 9 8 7 6 5 4 3 2 1 0
-2 4 6 8 10
-2.1 3.8 5.5 7.2 8.9
-10 8 6 4 2 0
-12.1 10.4 8.7 7. 5.3 3.6
-
-N N N N N N N N N N
-0 1 2 3 4 5 6 7 8 9
-0 1 2 3 4 5 6 7 8 9 10
-10 9 8 7 6 5 4 3 2 1 0
-
-3 6 9
-
-0 -5 1 -4 2 -3 3 -2 4 -1 5 0 6 1 7 2 8 3 9 4
-0 -5 1 -6 2 -7 3 -8 4 -9 5 -10 6 -11 7 -12 8 -13 9 -14
-0 -5 1 -3 2 -1 3 1 4 3 5 5 6 7 7 9 8 11 9 13
-0 -5 1 -7 2 -9 3 -11 4 -13 5 -15 6 -17 7 -19 8 -21 9 -23
-
-0 -5 1 -4 2 -3 3 -2 4 -1 5 0 6 1 7 2 8 3 9 4
-0 -5 1 -6 2 -7 3 -8 4 -9 5 -10 6 -11 7 -12 8 -13 9 -14
-0 -5 1 -3 2 -1 3 1 4 3 5 5 6 7 7 9 8 11 9 13
-0 -5 1 -7 2 -9 3 -11 4 -13 5 -15 6 -17 7 -19 8 -21 9 -23
-
-0 -5 1.5 1 -7 2.5 2 -9 3.5 3 -11 4.5 4 -13 5.5 5 -15 6.5 6 -17 7.5 7 -19 8.5 8 -21 9.5 9 -23 10.5
-0 -5 1.5 1 -7 2.5 2 -9 3.5 3 -11 4.5 4 -13 5.5 5 -15 6.5 6 -17 7.5 7 -19 8.5 8 -21 9.5 9 -23 10.5
-0 -5 1.5 1 -7 2.5 2 -9 3.5 3 -11 4.5 4 -13 5.5 5 -15 6.5 6 -17 7.5 7 -19 8.5 8 -21 9.5 9 -23 10.5
-(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)
-(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)
-
-(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)
-(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)
-(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)(10 10)
-(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)(10 10)
-
-(10 10)(9 9)(8 8)(7 7)(6 6)(5 5)(4 4)(3 3)(2 2)(1 1)
-(10 10)(9 9)(8 8)(7 7)(6 6)(5 5)(4 4)(3 3)(2 2)(1 1)
-(10 10)(9 9)(8 8)(7 7)(6 6)(5 5)(4 4)(3 3)(2 2)(1 1)(0 0)
-(10 10)(9 9)(8 8)(7 7)(6 6)(5 5)(4 4)(3 3)(2 2)(1 1)(0 0)
-
-A A A A A A A A A A
-B B B B B B B B B B B
-C C C C C C C C C C
-D D D D D D D D D D D
-A A A A A A A A A A
-B B B B B B B B B B B
-C C C C C C C C C C
-D D D D D D D D D D D
-A A A A A
-B B B B B B
-C C C C C
-D D D D D D
-0 1 2 3 4 5 6 7 8 9
-0 1 2 3 4 5 6 7 8 9 10
-10 9 8 7 6 5 4 3 2 1
-10 9 8 7 6 5 4 3 2 1 0
-0 1 2 3 4 5 6 7 8 9
-0 1 2 3 4 5 6 7 8 9 10
-10 9 8 7 6 5 4 3 2 1
-10 9 8 7 6 5 4 3 2 1 0
-0 2 4 6 8
-0 2 4 6 8 10
-10 8 6 4 2
-10 8 6 4 2 0
-0 1 2 3 4 5 6 7 8 9
-0 1 2 3 4 5 6 7 8 9
-0 1 2 3 4 5 6 7 8 9 10
-10 9 8 7 6 5 4 3 2 1
-10 9 8 7 6 5 4 3 2 1 0
-0 1 2 3 4 5 6 7 8 9
-0 1 2 3 4 5 6 7 8 9 10
-10 9 8 7 6 5 4 3 2 1
-10 9 8 7 6 5 4 3 2 1 0
-0 2 4 6 8
-0 2 4 6 8 10
-10 8 6 4 2
-10 8 6 4 2 0
-0 1 2 3 4 5 6 7 8 9
-0 -1 -2 -3 -4 -5 -6 -7 -8 -9
-0 2 4 6 8
-0 -2 -4 -6 -8
-0 1 2 3 4 5 6 7 8 9
-0 2 4 6 8
-0 -2 -4 -6 -8
-0 2 4 6 8
-0 -2 -4 -6 -8
-0 1 2 3 4 5 6 7 8 9
Index: sts/.expect/nested_function.txt
===================================================================
--- tests/.expect/nested_function.txt	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ 	(revision )
@@ -1,1 +1,0 @@
-total 105
Index: tests/.expect/nested_function.x64.txt
===================================================================
--- tests/.expect/nested_function.x64.txt	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
+++ tests/.expect/nested_function.x64.txt	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -0,0 +1,1 @@
+total 80
Index: tests/.expect/nested_function.x86.txt
===================================================================
--- tests/.expect/nested_function.x86.txt	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
+++ tests/.expect/nested_function.x86.txt	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -0,0 +1,1 @@
+total 55
Index: tests/PRNG.cfa
===================================================================
--- tests/PRNG.cfa	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ tests/PRNG.cfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -8,6 +8,6 @@
 // Created On       : Wed Dec 29 09:38:12 2021
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Apr  9 15:21:14 2022
-// Update Count     : 344
+// Last Modified On : Sun Nov 20 22:17:35 2022
+// Update Count     : 377
 // 
 
@@ -22,4 +22,10 @@
 #include <mutex_stmt.hfa>
 
+#ifdef __x86_64__										// 64-bit architecture
+#define PRNG PRNG64
+#else													// 32-bit architecture
+#define PRNG PRNG32
+#endif // __x86_64__
+
 #ifdef TIME												// use -O2 -nodebug
 #define STARTTIME start = timeHiRes()
@@ -54,5 +60,5 @@
 
 
-uint32_t seed = 1009;
+unsigned int seed = 1009;
 
 thread T1 {};
@@ -158,4 +164,5 @@
 #if 1
 	PRNG prng;
+
 	if ( seed != 0 ) set_seed( prng, seed );
 
@@ -164,6 +171,6 @@
 	for ( 20 ) {
 		sout | wd(13, prng( prng )) | nonl;				// cascading => side-effect functions called in arbitary order
-		sout | wd(10, prng( prng, 5 )) | nonl;
-		sout | wd(13, prng( prng, 0, 5 ));
+		sout | wd(10, prng( prng, 5z )) | nonl;
+		sout | wd(13, prng( prng, 0, 5z ));
 	} // for
 	sout | sepEnable;
@@ -199,6 +206,6 @@
 	for ( 20 ) {
 		sout | wd(13, prng()) | nonl;					// cascading => side-effect functions called in arbitary order
-		sout | wd(10, prng( 5 )) | nonl;
-		sout | wd(13, prng( 0, 5 ));
+		sout | wd(10, prng( 5z )) | nonl;
+		sout | wd(13, prng( 0, 5z ));
 	} // for
 	sout | sepEnable;
@@ -235,6 +242,6 @@
 	for ( 20 ) {
 		sout | wd(13, prng( th )) | nonl;				// cascading => side-effect functions called in arbitary order
-		sout | wd(10, prng( th, 5 )) | nonl;
-		sout | wd(13, prng( th, 0, 5 ));
+		sout | wd(10, prng( th, 5z )) | nonl;
+		sout | wd(13, prng( th, 0, 5z ));
 	} // for
 	sout | sepEnable;
Index: tests/concurrent/barrier/generation.cfa
===================================================================
--- tests/concurrent/barrier/generation.cfa	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ tests/concurrent/barrier/generation.cfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -37,5 +37,5 @@
 		for(c; 'A' ~= 'Z') {
 			// Yield for chaos
-			yield(prng(this, 10));
+			yield( prng(this, 10) );
 
 			// Print the generation, no newline because
@@ -43,5 +43,5 @@
 
 			// Yield again for more chaos
-			yield(prng(this, 10));
+			yield( prng(this, 10) );
 
 			// Block on the barrier
Index: tests/concurrent/barrier/order.cfa
===================================================================
--- tests/concurrent/barrier/order.cfa	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ tests/concurrent/barrier/order.cfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -37,5 +37,5 @@
 	for(l; NUM_LAPS) {
 		// Yield for chaos
-		yield(prng(this, 10));
+		yield( prng(this, 10) );
 
 		// Block and what order we arrived
Index: tests/concurrent/once.cfa
===================================================================
--- tests/concurrent/once.cfa	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ tests/concurrent/once.cfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -30,5 +30,5 @@
 
 		// sometime yields
-		yield(prng(this, 3));
+		yield( prng(this, 3) );
 	}
 }
Index: tests/concurrent/readyQ/leader_spin.cfa
===================================================================
--- tests/concurrent/readyQ/leader_spin.cfa	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ tests/concurrent/readyQ/leader_spin.cfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -26,10 +26,10 @@
 }
 
-PRNG lead_rng;
+PRNG64 lead_rng;
 volatile unsigned leader;
 volatile size_t lead_idx;
 
-const unsigned nthreads = 17;
-const unsigned stop_count = 327;
+const uint64_t nthreads = 17;
+const uint64_t stop_count = 327;
 
 thread$ * the_main;
Index: tests/ctrl-flow/.expect/ifwhileCtl.txt
===================================================================
--- tests/ctrl-flow/.expect/ifwhileCtl.txt	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
+++ tests/ctrl-flow/.expect/ifwhileCtl.txt	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -0,0 +1,7 @@
+x != 0 correct
+x != 0 && y != 0 correct
+x == y correct
+s.i < 4 correct
+x != 0 correct
+x == y correct
+s.i < 4 correct
Index: tests/ctrl-flow/.expect/loop-inc.txt
===================================================================
--- tests/ctrl-flow/.expect/loop-inc.txt	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
+++ tests/ctrl-flow/.expect/loop-inc.txt	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -0,0 +1,3 @@
+loop
+loop
+done
Index: tests/ctrl-flow/.expect/loop_else.txt
===================================================================
--- tests/ctrl-flow/.expect/loop_else.txt	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
+++ tests/ctrl-flow/.expect/loop_else.txt	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -0,0 +1,64 @@
+empty
+empty
+empty
+
+false else
+
+else zero
+A else
+A A A A A A A A A A else
+A A A A A A A A A A A else
+B B B B B else
+C C C C C else
+D D D D D else
+E E E E E else
+
+0 1 2 3 4 5 6 7 8 9 else
+0 1 2 3 4 5 6 7 8 9 10 else
+1 3 5 7 9 else
+10 8 6 4 2 else
+0.5 1.5 2.5 3.5 4.5 else
+5.5 4.5 3.5 2.5 1.5 else
+2 4 6 8 10 else
+10 8 6 4 2 else
+
+1 2 3 4 5 6 7 8 9 10
+10 9 8 7 6 5 4 3 2 1 0
+2 4 6 8 10
+2.1 3.8 5.5 7.2 8.9
+10 8 6 4 2 0
+12.1 10.4 8.7 7. 5.3 3.6
+
+N N N N N N N N N N else
+0 1 2 3 4 5 6 7 8 9 else
+0 1 2 3 4 5 6 7 8 9 10 else
+10 9 8 7 6 5 4 3 2 1 0 else
+
+3 6 9 else
+
+0 -5 1 -4 2 -3 3 -2 4 -1 5 0 6 1 7 2 8 3 9 4 else
+0 -5 1 -6 2 -7 3 -8 4 -9 5 -10 6 -11 7 -12 8 -13 9 -14 else
+0 -5 1 -3 2 -1 3 1 4 3 5 5 6 7 7 9 8 11 9 13 else
+0 -5 1 -7 2 -9 3 -11 4 -13 5 -15 6 -17 7 -19 8 -21 9 -23 else
+
+0 -5 1 -4 2 -3 3 -2 4 -1 5 0 6 1 7 2 8 3 9 4 else
+0 -5 1 -6 2 -7 3 -8 4 -9 5 -10 6 -11 7 -12 8 -13 9 -14 else
+0 -5 1 -3 2 -1 3 1 4 3 5 5 6 7 7 9 8 11 9 13 else
+0 -5 1 -7 2 -9 3 -11 4 -13 5 -15 6 -17 7 -19 8 -21 9 -23 else
+
+0 -5 1.5 1 -7 2.5 2 -9 3.5 3 -11 4.5 4 -13 5.5 5 -15 6.5 6 -17 7.5 7 -19 8.5 8 -21 9.5 9 -23 10.5 else
+0 -5 1.5 1 -7 2.5 2 -9 3.5 3 -11 4.5 4 -13 5.5 5 -15 6.5 6 -17 7.5 7 -19 8.5 8 -21 9.5 9 -23 10.5 else
+0 -5 1.5 1 -7 2.5 2 -9 3.5 3 -11 4.5 4 -13 5.5 5 -15 6.5 6 -17 7.5 7 -19 8.5 8 -21 9.5 9 -23 10.5 else
+(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)else
+(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)else
+
+(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)else
+(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)else
+(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)(10 10)else
+(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)(10 10)else
+
+(10 10)(9 9)(8 8)(7 7)(6 6)(5 5)(4 4)(3 3)(2 2)(1 1)else
+(10 10)(9 9)(8 8)(7 7)(6 6)(5 5)(4 4)(3 3)(2 2)(1 1)else
+(10 10)(9 9)(8 8)(7 7)(6 6)(5 5)(4 4)(3 3)(2 2)(1 1)(0 0)else
+(10 10)(9 9)(8 8)(7 7)(6 6)(5 5)(4 4)(3 3)(2 2)(1 1)(0 0)else
+
Index: tests/ctrl-flow/.expect/loopctrl.txt
===================================================================
--- tests/ctrl-flow/.expect/loopctrl.txt	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
+++ tests/ctrl-flow/.expect/loopctrl.txt	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -0,0 +1,109 @@
+empty
+empty
+empty
+
+zero
+A
+A A A A A A A A A A
+A A A A A A A A A A A
+B B B B B
+C C C C C
+D D D D D
+E E E E E
+
+0 1 2 3 4 5 6 7 8 9
+0 1 2 3 4 5 6 7 8 9 10
+1 3 5 7 9
+10 8 6 4 2
+0.5 1.5 2.5 3.5 4.5
+5.5 4.5 3.5 2.5 1.5
+2 4 6 8 10
+10 8 6 4 2
+
+1 2 3 4 5 6 7 8 9 10
+10 9 8 7 6 5 4 3 2 1 0
+2 4 6 8 10
+2.1 3.8 5.5 7.2 8.9
+10 8 6 4 2 0
+12.1 10.4 8.7 7. 5.3 3.6
+
+N N N N N N N N N N
+0 1 2 3 4 5 6 7 8 9
+0 1 2 3 4 5 6 7 8 9 10
+10 9 8 7 6 5 4 3 2 1 0
+
+3 6 9
+
+0 -5 1 -4 2 -3 3 -2 4 -1 5 0 6 1 7 2 8 3 9 4
+0 -5 1 -6 2 -7 3 -8 4 -9 5 -10 6 -11 7 -12 8 -13 9 -14
+0 -5 1 -3 2 -1 3 1 4 3 5 5 6 7 7 9 8 11 9 13
+0 -5 1 -7 2 -9 3 -11 4 -13 5 -15 6 -17 7 -19 8 -21 9 -23
+
+0 -5 1 -4 2 -3 3 -2 4 -1 5 0 6 1 7 2 8 3 9 4
+0 -5 1 -6 2 -7 3 -8 4 -9 5 -10 6 -11 7 -12 8 -13 9 -14
+0 -5 1 -3 2 -1 3 1 4 3 5 5 6 7 7 9 8 11 9 13
+0 -5 1 -7 2 -9 3 -11 4 -13 5 -15 6 -17 7 -19 8 -21 9 -23
+
+0 -5 1.5 1 -7 2.5 2 -9 3.5 3 -11 4.5 4 -13 5.5 5 -15 6.5 6 -17 7.5 7 -19 8.5 8 -21 9.5 9 -23 10.5
+0 -5 1.5 1 -7 2.5 2 -9 3.5 3 -11 4.5 4 -13 5.5 5 -15 6.5 6 -17 7.5 7 -19 8.5 8 -21 9.5 9 -23 10.5
+0 -5 1.5 1 -7 2.5 2 -9 3.5 3 -11 4.5 4 -13 5.5 5 -15 6.5 6 -17 7.5 7 -19 8.5 8 -21 9.5 9 -23 10.5
+(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)
+(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)
+
+(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)
+(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)
+(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)(10 10)
+(0 0)(1 1)(2 2)(3 3)(4 4)(5 5)(6 6)(7 7)(8 8)(9 9)(10 10)
+
+(10 10)(9 9)(8 8)(7 7)(6 6)(5 5)(4 4)(3 3)(2 2)(1 1)
+(10 10)(9 9)(8 8)(7 7)(6 6)(5 5)(4 4)(3 3)(2 2)(1 1)
+(10 10)(9 9)(8 8)(7 7)(6 6)(5 5)(4 4)(3 3)(2 2)(1 1)(0 0)
+(10 10)(9 9)(8 8)(7 7)(6 6)(5 5)(4 4)(3 3)(2 2)(1 1)(0 0)
+
+A A A A A A A A A A
+B B B B B B B B B B B
+C C C C C C C C C C
+D D D D D D D D D D D
+A A A A A A A A A A
+B B B B B B B B B B B
+C C C C C C C C C C
+D D D D D D D D D D D
+A A A A A
+B B B B B B
+C C C C C
+D D D D D D
+0 1 2 3 4 5 6 7 8 9
+0 1 2 3 4 5 6 7 8 9 10
+10 9 8 7 6 5 4 3 2 1
+10 9 8 7 6 5 4 3 2 1 0
+0 1 2 3 4 5 6 7 8 9
+0 1 2 3 4 5 6 7 8 9 10
+10 9 8 7 6 5 4 3 2 1
+10 9 8 7 6 5 4 3 2 1 0
+0 2 4 6 8
+0 2 4 6 8 10
+10 8 6 4 2
+10 8 6 4 2 0
+0 1 2 3 4 5 6 7 8 9
+0 1 2 3 4 5 6 7 8 9
+0 1 2 3 4 5 6 7 8 9 10
+10 9 8 7 6 5 4 3 2 1
+10 9 8 7 6 5 4 3 2 1 0
+0 1 2 3 4 5 6 7 8 9
+0 1 2 3 4 5 6 7 8 9 10
+10 9 8 7 6 5 4 3 2 1
+10 9 8 7 6 5 4 3 2 1 0
+0 2 4 6 8
+0 2 4 6 8 10
+10 8 6 4 2
+10 8 6 4 2 0
+0 1 2 3 4 5 6 7 8 9
+0 -1 -2 -3 -4 -5 -6 -7 -8 -9
+0 2 4 6 8
+0 -2 -4 -6 -8
+0 1 2 3 4 5 6 7 8 9
+0 2 4 6 8
+0 -2 -4 -6 -8
+0 2 4 6 8
+0 -2 -4 -6 -8
+0 1 2 3 4 5 6 7 8 9
Index: tests/ctrl-flow/ifwhileCtl.cfa
===================================================================
--- tests/ctrl-flow/ifwhileCtl.cfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
+++ tests/ctrl-flow/ifwhileCtl.cfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -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 Dec  4 21:39:18 2018
+// Update Count     : 23
+//
+
+#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";
+	} else {
+		sout | "x == 0 incorrect";
+	} // if
+
+	if ( int x = 4, y = 0 ) {
+		sout | "x != 0 && y != 0 incorrect";
+	} else if ( int x = 4, y = 1 ) {
+		sout | "x != 0 && y != 0 correct";
+	} else {
+		sout | "x == 0 || y == 0 incorrect";
+	} // if
+
+	if ( int x = 5, y = f( x ); x == y ) {
+		sout | "x == y correct";
+	} else {
+		sout | "x != y incorrect";
+	} // if
+
+	if ( struct S { int i; } s = { 3 }; s.i < 4 ) {
+		S s1;
+		sout | "s.i < 4 correct";
+	} else {
+		S s1;
+		sout | "s.i >= 4 incorrect";
+	} // if
+
+	while ( int x = 1 ) {
+		sout | "x != 0 correct";
+		break;
+	} // while
+
+	while ( int x = 4, y = 0 ) {
+		sout | "x != 0 && y != 0 incorrect";
+	} // while
+
+	while ( int x = 5, y = f( x ); x == y ) {
+		sout | "x == y correct";
+		break;
+	} // while
+
+	while ( struct S { int i; } s = { 3 }; s.i < 4 ) {
+		S s1;
+		sout | "s.i < 4 correct";
+		break;
+	} // while
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa ifwhileCtl.cfa" //
+// End: //
Index: tests/ctrl-flow/loop-inc.cfa
===================================================================
--- tests/ctrl-flow/loop-inc.cfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
+++ tests/ctrl-flow/loop-inc.cfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -0,0 +1,20 @@
+forall(T &)
+struct A {
+    T * next;
+};
+
+struct B {
+    A(B) link;
+};
+
+int main(void) {
+	B end = { { 0p } };
+	B two = { { &end } };
+	B one = { { &two } };
+	B * head = &one;
+
+	for (B ** it = &head ; (*it)->link.next ; it = &(*it)->link.next) {
+		printf("loop\n");
+	}
+	printf("done\n");
+}
Index: tests/ctrl-flow/loop_else.cfa
===================================================================
--- tests/ctrl-flow/loop_else.cfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
+++ tests/ctrl-flow/loop_else.cfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -0,0 +1,112 @@
+#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 | ')'; }
+void & ?|?( ofstream & os, S v ) { (ofstream &)(os | v); ends( os ); }
+
+int main() {
+	// Test some loop options.
+
+	sout | nlOff;										// turn off auto newline
+	while () { sout | "empty"; break; } else { sout | "else"; }						sout | nl;
+	do { sout | "empty"; break; } while () else { sout | "else"; }					sout | nl;
+	for () { sout | "empty"; break; } else { sout | "else"; }						sout | nl | nl;
+
+	do { sout | "false"; } while (false) else { sout | "else"; }					sout | nl | nl;
+
+	for ( 0 ) { sout | "A"; } else { sout | "else"; }								sout | "zero" | nl;
+	for ( 1 ) { sout | "A"; } else { sout | "else"; }								sout | nl;
+	for ( 10 ) { sout | "A"; } else { sout | "else"; }								sout | nl;
+	for ( ~= 10 ) { sout | "A"; } else { sout | "else"; }							sout | nl;
+	for ( 1 ~= 10 ~ 2 ) { sout | "B"; } else { sout | "else"; }						sout | nl;
+	for ( 1 -~= 10 ~ 2 ) { sout | "C"; } else { sout | "else"; }					sout | nl;
+	for ( 0.5 ~ 5.5 ) { sout | "D"; } else { sout | "else"; }						sout | nl;
+	for ( 0.5 -~ 5.5 ) { sout | "E"; } else { sout | "else"; }						sout | nl | nl;
+
+	for ( i; 10 ) { sout | i; } else { sout | "else"; }								sout | nl;
+	for ( i; ~= 10 ) { sout | i; } else { sout | "else"; }							sout | nl;
+	for ( i; 1 ~= 10 ~ 2 ) { sout | i; } else { sout | "else"; }					sout | nl;
+	for ( i; 1 -~= 10 ~ 2 ) { sout | i; } else { sout | "else"; }					sout | nl;
+	for ( i; 0.5 ~ 5.5 ) { sout | i; } else { sout | "else"; }						sout | nl;
+	for ( i; 0.5 -~ 5.5 ) { sout | i; } else { sout | "else"; }						sout | nl;
+	for ( ui; 2u ~= 10u ~ 2u ) { sout | ui; } else { sout | "else"; }				sout | nl;
+	for ( ui; 2u -~= 10u ~ 2u ) { sout | ui; } else { sout | "else"; }				sout | nl | nl;
+
+	// @ means do nothing
+	for ( i; 1 ~ @ ) {
+	  if ( i > 10 ) break;
+		sout | i;
+	} else { sout | "else"; }														sout | nl;
+	for ( i; @ -~ 10 ) {
+	  if ( i < 0 ) break;
+		sout | i;
+	} else { sout | "else"; }														sout | nl;
+	for ( i; 2 ~ @ ~ 2 ) {
+	  if ( i > 10 ) break;
+		sout | i;
+	} else { sout | "else"; }														sout | nl;
+	for ( i; 2.1 ~ @ ~ @ ) {
+	  if ( i > 10.5 ) break;
+		sout | i;
+		i += 1.7;
+	} else { sout | "else"; }														sout | nl;
+	for ( i; @ -~ 10 ~ 2 ) {
+	  if ( i < 0 ) break;
+		sout | i;
+	} else { sout | "else"; }														sout | nl;
+	for ( i; 12.1 ~ @ ~ @ ) {
+	  if ( i < 2.5 ) break;
+		sout | i;
+		i -= 1.7;
+	} else { sout | "else"; }														sout | nl | nl;
+	
+	enum { N = 10 };
+	for ( N ) { sout | "N"; } else { sout | "else"; }							sout | nl;
+	for ( i; N ) { sout | i; } else { sout | "else"; }							sout | nl;
+	for ( i; ~= N ) { sout | i; } else { sout | "else"; }						sout | nl;
+	for ( i; -~= N ) { sout | i; } else { sout | "else"; }						sout | nl | nl;
+
+	const int start = 3, comp = 10, inc = 2;
+	for ( i; start ~ comp ~ inc + 1 ) { sout | i; } else { sout | "else"; }		sout | nl | nl;
+
+	for ( i; 10 : j; -5 ~ @ ) { sout | i | j; } else { sout | "else"; } sout | nl;
+	for ( i; 10 : j; @ -~ -5 ) { sout | i | j; } else { sout | "else"; } sout | nl;
+	for ( i; 10 : j; -5 ~ @ ~ 2 ) { sout | i | j; } else { sout | "else"; } sout | nl;
+	for ( i; 10 : j; @ -~ -5 ~ 2 ) { sout | i | j; } else { sout | "else"; } sout | nl | nl;
+
+	for ( j; -5 ~ @ : i; 10 ) { sout | i | j; } else { sout | "else"; } sout | nl;
+	for ( j; @ -~ -5 : i; 10 ) { sout | i | j; } else { sout | "else"; } sout | nl;
+	for ( j; -5 ~ @ ~ 2 : i; 10 ) { sout | i | j; } else { sout | "else"; } sout | nl;
+	for ( j; @ -~ -5 ~ 2 : i; 10 ) { sout | i | j; } else { sout | "else"; } sout | nl | nl;
+
+	for ( j; @ -~ -5 ~ 2 : i; 10 : k; 1.5 ~ @ ) { sout | i | j | k; } else { sout | "else"; } sout | nl;
+	for ( j; @ -~ -5 ~ 2 : k; 1.5 ~ @ : i; 10 ) { sout | i | j | k; } else { sout | "else"; } sout | nl;
+	for ( k; 1.5 ~ @ : j; @ -~ -5 ~ 2 : i; 10 ) { sout | i | j | k; } else { sout | "else"; } sout | nl;
+
+	for ( S s = (S){0}; s < (S){10,10}; s += (S){1} ) { sout | s; } else { sout | "else"; } sout | nl;
+	for ( s; (S){10,10} ) { sout | s; } else { sout | "else"; } sout | nl;
+	sout | nl;
+	for ( s; (S){0} ~ (S){10,10} ) { sout | s; } else { sout | "else"; }		 sout | nl;
+	for ( s; (S){0} ~ (S){10,10} ~ (S){1} ) { sout | s; } else { sout | "else"; } sout | nl;
+	for ( s; (S){0} ~= (S){10,10} ) { sout | s; } else { sout | "else"; }		 sout | nl;
+	for ( s; (S){0} ~= (S){10,10} ~ (S){1} ) { sout | s; } else { sout | "else"; } sout | nl;
+	sout | nl;
+	for ( s; (S){0} -~  (S){10,10} ) { sout | s; } else { sout | "else"; }		 sout | nl;
+	for ( s; (S){0} -~  (S){10,10} ~ (S){1} ) { sout | s; } else { sout | "else"; } sout | nl;
+	for ( s; (S){0} -~= (S){10,10} ) { sout | s; } else { sout | "else"; }		 sout | nl;
+	for ( s; (S){0} -~= (S){10,10} ~ (S){1} ) { sout | s; } else { sout | "else"; } sout | nl | nl;
+}
Index: tests/ctrl-flow/loopctrl.cfa
===================================================================
--- tests/ctrl-flow/loopctrl.cfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
+++ tests/ctrl-flow/loopctrl.cfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -0,0 +1,205 @@
+// 
+// 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 : Thu Aug 11 23:04:35 2022
+// Update Count     : 160
+// 
+
+#include <fstream.hfa>
+
+void fred() {
+	// Test all possible loop syntax.
+
+	int s = 0, c = 10, i = 2;
+
+	for ( c ) { sout | "A"; }						sout | nl;
+	for ( ~= c ) { sout | "B"; }					sout | nl;
+	for ( -~ c ) { sout | "C"; }					sout | nl;
+	for ( -~= c ) { sout | "D"; }					sout | nl;
+
+	for ( s ~ c ) { sout | "A"; }					sout | nl;
+	for ( s ~= c ) { sout | "B"; }					sout | nl;
+	for ( s -~ c ) { sout | "C"; }					sout | nl;
+	for ( s -~= c ) { sout | "D"; }					sout | nl;
+
+	for ( s ~ c ~ i ) { sout | "A"; }				sout | nl;
+	for ( s ~= c ~ i ) { sout | "B"; }				sout | nl;
+	for ( s -~ c ~ i ) { sout | "C"; }				sout | nl;
+	for ( s -~= c ~ i ) { sout | "D"; }				sout | nl;
+
+	for ( j; c ) { sout | j; }							sout | nl;
+	for ( j; ~= c ) { sout | j; }					sout | nl;
+	for ( j; -~ c ) { sout | j; }					sout | nl;
+	for ( j; -~= c ) { sout | j; }					sout | nl;
+
+	for ( j; s ~ c ) { sout | j; }					sout | nl;
+	for ( j; s ~= c ) { sout | j; }					sout | nl;
+	for ( j; s -~ c ) { sout | j; }					sout | nl;
+	for ( j; s -~= c ) { sout | j; }				sout | nl;
+
+	for ( j; s ~ c ~ i ) { sout | j; }				sout | nl;
+	for ( j; s ~= c ~ i ) { sout | j; }				sout | nl;
+	for ( j; s -~ c ~ i ) { sout | j; }				sout | nl;
+	for ( j; s -~= c ~ i ) { sout | j; }			sout | nl;
+
+	// CANNOT DIRECTLY INITIALIZE INDEX VARIABLE, ONLY SINGLE LOOP INDEX VARIABLE IN DECLARATION
+
+	for ( j; c ) { sout | j; }						sout | nl;
+	for ( int j; c ) { sout | j; }					sout | nl;
+	for ( int j; ~= c ) { sout | j; }				sout | nl;
+	for ( int j; -~ c ) { sout | j; }				sout | nl;
+	for ( int j; -~= c ) { sout | j; }				sout | nl;
+
+	for ( int j; s ~ c ) { sout | j; }				sout | nl;
+	for ( int j; s ~= c ) { sout | j; }				sout | nl;
+	for ( int j; s -~ c ) { sout | j; }				sout | nl;
+	for ( int j; s -~= c ) { sout | j; }			sout | nl;
+
+	for ( int j; s ~ c ~ i ) { sout | j; }			sout | nl;
+	for ( int j; s ~= c ~ i ) { sout | j; }			sout | nl;
+	for ( int j; s -~ c ~ i ) { sout | j; }			sout | nl;
+	for ( int j; s -~= c ~ i ) { sout | j; }		sout | nl;
+
+	for ( j; s ~ @ ) { if ( j == 10 ) break; sout | j; }				sout | nl;
+	for ( j; @ -~ s ) { if ( j == -10 ) break; sout | j; }				sout | nl;
+	for ( j; s ~ @ ~ i ) { if ( j == 10 ) break; sout | j; }			sout | nl;
+	for ( j; @ -~ s ~ i ) { if ( j == -10 ) break; sout | j; }			sout | nl;
+	for ( j; s ~ @ ~ @ ) { if ( j == 10 ) break; sout | j; j += 1; }	sout | nl;
+
+	for ( int j; s ~ @ ) { if ( j == 10 ) break; sout | j; j += 1; }	sout | nl;
+	for ( int j; @ -~ s ) { if ( j == -10 ) break; sout | j; j -= 1; }	sout | nl;
+	for ( int j; s ~ @ ~ i ) { if ( j == 10 ) break; sout | j; }		sout | nl;
+	for ( int j; @ -~ s ~ i ) { if ( j == -10 ) break; sout | j; }		sout | nl;
+	for ( int j; s ~ @ ~ @ ) { if ( j == 10 ) break; sout | j; j += 1; } sout | nl;
+
+	// enum E { A, B, C, D };
+	// for ( e; A ~= C ) { sout | j; }
+	// for ( e; A ~= D ) { sout | j; }
+	// for ( e; A -~= D ~ 2 ) { sout | j; }
+	// for ( e; E ) { sout | j; }
+	// for ( e; -~ E ) { sout | j; }
+}
+
+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 | ')'; }
+void & ?|?( ofstream & os, S v ) { (ofstream &)(os | v); ends( os ); }
+
+int main() {
+	// Test some loop options.
+
+	sout | nlOff;										// turn off auto newline
+	while () { sout | "empty"; break; }					sout | nl;
+	do { sout | "empty"; break; } while ();				sout | nl;
+	for () { sout | "empty"; break; }					sout | nl | nl;
+
+	for ( 0 ) { sout | "A"; }							sout | "zero" | nl;
+	for ( 1 ) { sout | "A"; }							sout | nl;
+	for ( 10 ) { sout | "A"; }							sout | nl;
+	for ( ~= 10 ) { sout | "A"; }						sout | nl;
+	for ( 1 ~= 10 ~ 2 ) { sout | "B"; }					sout | nl;
+	for ( 1 -~= 10 ~ 2 ) { sout | "C"; }				sout | nl;
+	for ( 0.5 ~ 5.5 ) { sout | "D"; }					sout | nl;
+	for ( 0.5 -~ 5.5 ) { sout | "E"; }					sout | nl | nl;
+
+	for ( i; 10 ) { sout | i; }							sout | nl;
+	for ( i; ~= 10 ) { sout | i; }						sout | nl;
+	for ( i; 1 ~= 10 ~ 2 ) { sout | i; }				sout | nl;
+	for ( i; 1 -~= 10 ~ 2 ) { sout | i; }				sout | nl;
+	for ( i; 0.5 ~ 5.5 ) { sout | i; }					sout | nl;
+	for ( i; 0.5 -~ 5.5 ) { sout | i; }					sout | nl;
+	for ( ui; 2u ~= 10u ~ 2u ) { sout | ui; }			sout | nl;
+	for ( ui; 2u -~= 10u ~ 2u ) { sout | ui; }			sout | nl | nl;
+
+	// @ means do nothing
+	for ( i; 1 ~ @ ) {
+	  if ( i > 10 ) break;
+		sout | i;
+	}													sout | nl;
+	for ( i; @ -~ 10 ) {
+	  if ( i < 0 ) break;
+		sout | i;
+	}													sout | nl;
+	for ( i; 2 ~ @ ~ 2 ) {
+	  if ( i > 10 ) break;
+		sout | i;
+	}													sout | nl;
+	for ( i; 2.1 ~ @ ~ @ ) {
+	  if ( i > 10.5 ) break;
+		sout | i;
+		i += 1.7;
+	}													sout | nl;
+	for ( i; @ -~ 10 ~ 2 ) {
+	  if ( i < 0 ) break;
+		sout | i;
+	}													sout | nl;
+	for ( i; 12.1 ~ @ ~ @ ) {
+	  if ( i < 2.5 ) break;
+		sout | i;
+		i -= 1.7;
+	}													sout | nl | nl;
+	
+	enum { N = 10 };
+	for ( N ) { sout | "N"; }							sout | nl;
+	for ( i; N ) { sout | i; }							sout | nl;
+	for ( i; ~= N ) { sout | i; }						sout | nl;
+	for ( i; -~= N ) { sout | i; }						sout | nl | nl;
+
+	const int start = 3, comp = 10, inc = 2;
+	for ( i; start ~ comp ~ inc + 1 ) { sout | i; }		sout | nl | nl;
+
+	for ( i; 10 : j; -5 ~ @ ) { sout | i | j; } sout | nl;
+	for ( i; 10 : j; @ -~ -5 ) { sout | i | j; } sout | nl;
+	for ( i; 10 : j; -5 ~ @ ~ 2 ) { sout | i | j; } sout | nl;
+	for ( i; 10 : j; @ -~ -5 ~ 2 ) { sout | i | j; } sout | nl | nl;
+
+	for ( j; -5 ~ @ : i; 10 ) { sout | i | j; } sout | nl;
+	for ( j; @ -~ -5 : i; 10 ) { sout | i | j; } sout | nl;
+	for ( j; -5 ~ @ ~ 2 : i; 10 ) { sout | i | j; } sout | nl;
+	for ( j; @ -~ -5 ~ 2 : i; 10 ) { sout | i | j; } sout | nl | nl;
+
+	for ( j; @ -~ -5 ~ 2 : i; 10 : k; 1.5 ~ @ ) { sout | i | j | k; } sout | nl;
+	for ( j; @ -~ -5 ~ 2 : k; 1.5 ~ @ : i; 10 ) { sout | i | j | k; } sout | nl;
+	for ( k; 1.5 ~ @ : j; @ -~ -5 ~ 2 : i; 10 ) { sout | i | j | k; } sout | nl;
+
+	for ( S s = (S){0}; s < (S){10,10}; s += (S){1} ) { sout | s; } sout | nl;
+	for ( s; (S){10,10} ) { sout | s; } sout | nl;
+	sout | nl;
+	for ( s; (S){0} ~ (S){10,10} ) { sout | s; }		 sout | nl;
+	for ( s; (S){0} ~ (S){10,10} ~ (S){1} ) { sout | s; } sout | nl;
+	for ( s; (S){0} ~= (S){10,10} ) { sout | s; }		 sout | nl;
+	for ( s; (S){0} ~= (S){10,10} ~ (S){1} ) { sout | s; } sout | nl;
+	sout | nl;
+	for ( s; (S){0} -~  (S){10,10} ) { sout | s; }		 sout | nl;
+	for ( s; (S){0} -~  (S){10,10} ~ (S){1} ) { sout | s; } sout | nl;
+	for ( s; (S){0} -~= (S){10,10} ) { sout | s; }		 sout | nl;
+	for ( s; (S){0} -~= (S){10,10} ~ (S){1} ) { sout | s; } sout | nl | nl;
+
+	fred();
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa loopctrl.cfa" //
+// End: //
Index: tests/enum_tests/.expect/anonymous.txt
===================================================================
--- tests/enum_tests/.expect/anonymous.txt	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
+++ tests/enum_tests/.expect/anonymous.txt	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -0,0 +1,1 @@
+17
Index: tests/enum_tests/anonymous.cfa
===================================================================
--- tests/enum_tests/anonymous.cfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
+++ tests/enum_tests/anonymous.cfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
@@ -0,0 +1,8 @@
+#include <stdio.h>
+enum(unsigned long int ) { nthreads = 17 };
+
+int main() {
+    printf("%lu", nthreads);
+}
+
+
Index: sts/ifwhileCtl.cfa
===================================================================
--- tests/ifwhileCtl.cfa	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ 	(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.cfa --
-//
-// Author           : Peter A. Buhr
-// Created On       : Sat Aug 26 10:13:11 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Dec  4 21:39:18 2018
-// Update Count     : 23
-//
-
-#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";
-	} else {
-		sout | "x == 0 incorrect";
-	} // if
-
-	if ( int x = 4, y = 0 ) {
-		sout | "x != 0 && y != 0 incorrect";
-	} else if ( int x = 4, y = 1 ) {
-		sout | "x != 0 && y != 0 correct";
-	} else {
-		sout | "x == 0 || y == 0 incorrect";
-	} // if
-
-	if ( int x = 5, y = f( x ); x == y ) {
-		sout | "x == y correct";
-	} else {
-		sout | "x != y incorrect";
-	} // if
-
-	if ( struct S { int i; } s = { 3 }; s.i < 4 ) {
-		S s1;
-		sout | "s.i < 4 correct";
-	} else {
-		S s1;
-		sout | "s.i >= 4 incorrect";
-	} // if
-
-	while ( int x = 1 ) {
-		sout | "x != 0 correct";
-		break;
-	} // while
-
-	while ( int x = 4, y = 0 ) {
-		sout | "x != 0 && y != 0 incorrect";
-	} // while
-
-	while ( int x = 5, y = f( x ); x == y ) {
-		sout | "x == y correct";
-		break;
-	} // while
-
-	while ( struct S { int i; } s = { 3 }; s.i < 4 ) {
-		S s1;
-		sout | "s.i < 4 correct";
-		break;
-	} // while
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa ifwhileCtl.cfa" //
-// End: //
Index: tests/io/away_fair.cfa
===================================================================
--- tests/io/away_fair.cfa	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ tests/io/away_fair.cfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
Index: tests/io/comp_basic.cfa
===================================================================
--- tests/io/comp_basic.cfa	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ tests/io/comp_basic.cfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
Index: tests/io/comp_fair.cfa
===================================================================
--- tests/io/comp_fair.cfa	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ tests/io/comp_fair.cfa	(revision 29702ad1e351b5bb998c5b18e96a209401abf2b4)
Index: sts/loop-inc.cfa
===================================================================
--- tests/loop-inc.cfa	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ 	(revision )
@@ -1,20 +1,0 @@
-forall(T &)
-struct A {
-    T * next;
-};
-
-struct B {
-    A(B) link;
-};
-
-int main(void) {
-	B end = { { 0p } };
-	B two = { { &end } };
-	B one = { { &two } };
-	B * head = &one;
-
-	for (B ** it = &head ; (*it)->link.next ; it = &(*it)->link.next) {
-		printf("loop\n");
-	}
-	printf("done\n");
-}
Index: sts/loop_else.cfa
===================================================================
--- tests/loop_else.cfa	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ 	(revision )
@@ -1,112 +1,0 @@
-#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 | ')'; }
-void & ?|?( ofstream & os, S v ) { (ofstream &)(os | v); ends( os ); }
-
-int main() {
-	// Test some loop options.
-
-	sout | nlOff;										// turn off auto newline
-	while () { sout | "empty"; break; } else { sout | "else"; }						sout | nl;
-	do { sout | "empty"; break; } while () else { sout | "else"; }					sout | nl;
-	for () { sout | "empty"; break; } else { sout | "else"; }						sout | nl | nl;
-
-	do { sout | "false"; } while (false) else { sout | "else"; }					sout | nl | nl;
-
-	for ( 0 ) { sout | "A"; } else { sout | "else"; }								sout | "zero" | nl;
-	for ( 1 ) { sout | "A"; } else { sout | "else"; }								sout | nl;
-	for ( 10 ) { sout | "A"; } else { sout | "else"; }								sout | nl;
-	for ( ~= 10 ) { sout | "A"; } else { sout | "else"; }							sout | nl;
-	for ( 1 ~= 10 ~ 2 ) { sout | "B"; } else { sout | "else"; }						sout | nl;
-	for ( 1 -~= 10 ~ 2 ) { sout | "C"; } else { sout | "else"; }					sout | nl;
-	for ( 0.5 ~ 5.5 ) { sout | "D"; } else { sout | "else"; }						sout | nl;
-	for ( 0.5 -~ 5.5 ) { sout | "E"; } else { sout | "else"; }						sout | nl | nl;
-
-	for ( i; 10 ) { sout | i; } else { sout | "else"; }								sout | nl;
-	for ( i; ~= 10 ) { sout | i; } else { sout | "else"; }							sout | nl;
-	for ( i; 1 ~= 10 ~ 2 ) { sout | i; } else { sout | "else"; }					sout | nl;
-	for ( i; 1 -~= 10 ~ 2 ) { sout | i; } else { sout | "else"; }					sout | nl;
-	for ( i; 0.5 ~ 5.5 ) { sout | i; } else { sout | "else"; }						sout | nl;
-	for ( i; 0.5 -~ 5.5 ) { sout | i; } else { sout | "else"; }						sout | nl;
-	for ( ui; 2u ~= 10u ~ 2u ) { sout | ui; } else { sout | "else"; }				sout | nl;
-	for ( ui; 2u -~= 10u ~ 2u ) { sout | ui; } else { sout | "else"; }				sout | nl | nl;
-
-	// @ means do nothing
-	for ( i; 1 ~ @ ) {
-	  if ( i > 10 ) break;
-		sout | i;
-	} else { sout | "else"; }														sout | nl;
-	for ( i; @ -~ 10 ) {
-	  if ( i < 0 ) break;
-		sout | i;
-	} else { sout | "else"; }														sout | nl;
-	for ( i; 2 ~ @ ~ 2 ) {
-	  if ( i > 10 ) break;
-		sout | i;
-	} else { sout | "else"; }														sout | nl;
-	for ( i; 2.1 ~ @ ~ @ ) {
-	  if ( i > 10.5 ) break;
-		sout | i;
-		i += 1.7;
-	} else { sout | "else"; }														sout | nl;
-	for ( i; @ -~ 10 ~ 2 ) {
-	  if ( i < 0 ) break;
-		sout | i;
-	} else { sout | "else"; }														sout | nl;
-	for ( i; 12.1 ~ @ ~ @ ) {
-	  if ( i < 2.5 ) break;
-		sout | i;
-		i -= 1.7;
-	} else { sout | "else"; }														sout | nl | nl;
-	
-	enum { N = 10 };
-	for ( N ) { sout | "N"; } else { sout | "else"; }							sout | nl;
-	for ( i; N ) { sout | i; } else { sout | "else"; }							sout | nl;
-	for ( i; ~= N ) { sout | i; } else { sout | "else"; }						sout | nl;
-	for ( i; -~= N ) { sout | i; } else { sout | "else"; }						sout | nl | nl;
-
-	const int start = 3, comp = 10, inc = 2;
-	for ( i; start ~ comp ~ inc + 1 ) { sout | i; } else { sout | "else"; }		sout | nl | nl;
-
-	for ( i; 10 : j; -5 ~ @ ) { sout | i | j; } else { sout | "else"; } sout | nl;
-	for ( i; 10 : j; @ -~ -5 ) { sout | i | j; } else { sout | "else"; } sout | nl;
-	for ( i; 10 : j; -5 ~ @ ~ 2 ) { sout | i | j; } else { sout | "else"; } sout | nl;
-	for ( i; 10 : j; @ -~ -5 ~ 2 ) { sout | i | j; } else { sout | "else"; } sout | nl | nl;
-
-	for ( j; -5 ~ @ : i; 10 ) { sout | i | j; } else { sout | "else"; } sout | nl;
-	for ( j; @ -~ -5 : i; 10 ) { sout | i | j; } else { sout | "else"; } sout | nl;
-	for ( j; -5 ~ @ ~ 2 : i; 10 ) { sout | i | j; } else { sout | "else"; } sout | nl;
-	for ( j; @ -~ -5 ~ 2 : i; 10 ) { sout | i | j; } else { sout | "else"; } sout | nl | nl;
-
-	for ( j; @ -~ -5 ~ 2 : i; 10 : k; 1.5 ~ @ ) { sout | i | j | k; } else { sout | "else"; } sout | nl;
-	for ( j; @ -~ -5 ~ 2 : k; 1.5 ~ @ : i; 10 ) { sout | i | j | k; } else { sout | "else"; } sout | nl;
-	for ( k; 1.5 ~ @ : j; @ -~ -5 ~ 2 : i; 10 ) { sout | i | j | k; } else { sout | "else"; } sout | nl;
-
-	for ( S s = (S){0}; s < (S){10,10}; s += (S){1} ) { sout | s; } else { sout | "else"; } sout | nl;
-	for ( s; (S){10,10} ) { sout | s; } else { sout | "else"; } sout | nl;
-	sout | nl;
-	for ( s; (S){0} ~ (S){10,10} ) { sout | s; } else { sout | "else"; }		 sout | nl;
-	for ( s; (S){0} ~ (S){10,10} ~ (S){1} ) { sout | s; } else { sout | "else"; } sout | nl;
-	for ( s; (S){0} ~= (S){10,10} ) { sout | s; } else { sout | "else"; }		 sout | nl;
-	for ( s; (S){0} ~= (S){10,10} ~ (S){1} ) { sout | s; } else { sout | "else"; } sout | nl;
-	sout | nl;
-	for ( s; (S){0} -~  (S){10,10} ) { sout | s; } else { sout | "else"; }		 sout | nl;
-	for ( s; (S){0} -~  (S){10,10} ~ (S){1} ) { sout | s; } else { sout | "else"; } sout | nl;
-	for ( s; (S){0} -~= (S){10,10} ) { sout | s; } else { sout | "else"; }		 sout | nl;
-	for ( s; (S){0} -~= (S){10,10} ~ (S){1} ) { sout | s; } else { sout | "else"; } sout | nl | nl;
-}
Index: sts/loopctrl.cfa
===================================================================
--- tests/loopctrl.cfa	(revision 1553a5552a430f9af78a97c35d5fc3629d0910c2)
+++ 	(revision )
@@ -1,205 +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.
-// 
-// loopctrl.cfa -- 
-// 
-// Author           : Peter A. Buhr
-// Created On       : Wed Aug  8 18:32:59 2018
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug 11 23:04:35 2022
-// Update Count     : 160
-// 
-
-#include <fstream.hfa>
-
-void fred() {
-	// Test all possible loop syntax.
-
-	int s = 0, c = 10, i = 2;
-
-	for ( c ) { sout | "A"; }						sout | nl;
-	for ( ~= c ) { sout | "B"; }					sout | nl;
-	for ( -~ c ) { sout | "C"; }					sout | nl;
-	for ( -~= c ) { sout | "D"; }					sout | nl;
-
-	for ( s ~ c ) { sout | "A"; }					sout | nl;
-	for ( s ~= c ) { sout | "B"; }					sout | nl;
-	for ( s -~ c ) { sout | "C"; }					sout | nl;
-	for ( s -~= c ) { sout | "D"; }					sout | nl;
-
-	for ( s ~ c ~ i ) { sout | "A"; }				sout | nl;
-	for ( s ~= c ~ i ) { sout | "B"; }				sout | nl;
-	for ( s -~ c ~ i ) { sout | "C"; }				sout | nl;
-	for ( s -~= c ~ i ) { sout | "D"; }				sout | nl;
-
-	for ( j; c ) { sout | j; }							sout | nl;
-	for ( j; ~= c ) { sout | j; }					sout | nl;
-	for ( j; -~ c ) { sout | j; }					sout | nl;
-	for ( j; -~= c ) { sout | j; }					sout | nl;
-
-	for ( j; s ~ c ) { sout | j; }					sout | nl;
-	for ( j; s ~= c ) { sout | j; }					sout | nl;
-	for ( j; s -~ c ) { sout | j; }					sout | nl;
-	for ( j; s -~= c ) { sout | j; }				sout | nl;
-
-	for ( j; s ~ c ~ i ) { sout | j; }				sout | nl;
-	for ( j; s ~= c ~ i ) { sout | j; }				sout | nl;
-	for ( j; s -~ c ~ i ) { sout | j; }				sout | nl;
-	for ( j; s -~= c ~ i ) { sout | j; }			sout | nl;
-
-	// CANNOT DIRECTLY INITIALIZE INDEX VARIABLE, ONLY SINGLE LOOP INDEX VARIABLE IN DECLARATION
-
-	for ( j; c ) { sout | j; }						sout | nl;
-	for ( int j; c ) { sout | j; }					sout | nl;
-	for ( int j; ~= c ) { sout | j; }				sout | nl;
-	for ( int j; -~ c ) { sout | j; }				sout | nl;
-	for ( int j; -~= c ) { sout | j; }				sout | nl;
-
-	for ( int j; s ~ c ) { sout | j; }				sout | nl;
-	for ( int j; s ~= c ) { sout | j; }				sout | nl;
-	for ( int j; s -~ c ) { sout | j; }				sout | nl;
-	for ( int j; s -~= c ) { sout | j; }			sout | nl;
-
-	for ( int j; s ~ c ~ i ) { sout | j; }			sout | nl;
-	for ( int j; s ~= c ~ i ) { sout | j; }			sout | nl;
-	for ( int j; s -~ c ~ i ) { sout | j; }			sout | nl;
-	for ( int j; s -~= c ~ i ) { sout | j; }		sout | nl;
-
-	for ( j; s ~ @ ) { if ( j == 10 ) break; sout | j; }				sout | nl;
-	for ( j; @ -~ s ) { if ( j == -10 ) break; sout | j; }				sout | nl;
-	for ( j; s ~ @ ~ i ) { if ( j == 10 ) break; sout | j; }			sout | nl;
-	for ( j; @ -~ s ~ i ) { if ( j == -10 ) break; sout | j; }			sout | nl;
-	for ( j; s ~ @ ~ @ ) { if ( j == 10 ) break; sout | j; j += 1; }	sout | nl;
-
-	for ( int j; s ~ @ ) { if ( j == 10 ) break; sout | j; j += 1; }	sout | nl;
-	for ( int j; @ -~ s ) { if ( j == -10 ) break; sout | j; j -= 1; }	sout | nl;
-	for ( int j; s ~ @ ~ i ) { if ( j == 10 ) break; sout | j; }		sout | nl;
-	for ( int j; @ -~ s ~ i ) { if ( j == -10 ) break; sout | j; }		sout | nl;
-	for ( int j; s ~ @ ~ @ ) { if ( j == 10 ) break; sout | j; j += 1; } sout | nl;
-
-	// enum E { A, B, C, D };
-	// for ( e; A ~= C ) { sout | j; }
-	// for ( e; A ~= D ) { sout | j; }
-	// for ( e; A -~= D ~ 2 ) { sout | j; }
-	// for ( e; E ) { sout | j; }
-	// for ( e; -~ E ) { sout | j; }
-}
-
-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 | ')'; }
-void & ?|?( ofstream & os, S v ) { (ofstream &)(os | v); ends( os ); }
-
-int main() {
-	// Test some loop options.
-
-	sout | nlOff;										// turn off auto newline
-	while () { sout | "empty"; break; }					sout | nl;
-	do { sout | "empty"; break; } while ();				sout | nl;
-	for () { sout | "empty"; break; }					sout | nl | nl;
-
-	for ( 0 ) { sout | "A"; }							sout | "zero" | nl;
-	for ( 1 ) { sout | "A"; }							sout | nl;
-	for ( 10 ) { sout | "A"; }							sout | nl;
-	for ( ~= 10 ) { sout | "A"; }						sout | nl;
-	for ( 1 ~= 10 ~ 2 ) { sout | "B"; }					sout | nl;
-	for ( 1 -~= 10 ~ 2 ) { sout | "C"; }				sout | nl;
-	for ( 0.5 ~ 5.5 ) { sout | "D"; }					sout | nl;
-	for ( 0.5 -~ 5.5 ) { sout | "E"; }					sout | nl | nl;
-
-	for ( i; 10 ) { sout | i; }							sout | nl;
-	for ( i; ~= 10 ) { sout | i; }						sout | nl;
-	for ( i; 1 ~= 10 ~ 2 ) { sout | i; }				sout | nl;
-	for ( i; 1 -~= 10 ~ 2 ) { sout | i; }				sout | nl;
-	for ( i; 0.5 ~ 5.5 ) { sout | i; }					sout | nl;
-	for ( i; 0.5 -~ 5.5 ) { sout | i; }					sout | nl;
-	for ( ui; 2u ~= 10u ~ 2u ) { sout | ui; }			sout | nl;
-	for ( ui; 2u -~= 10u ~ 2u ) { sout | ui; }			sout | nl | nl;
-
-	// @ means do nothing
-	for ( i; 1 ~ @ ) {
-	  if ( i > 10 ) break;
-		sout | i;
-	}													sout | nl;
-	for ( i; @ -~ 10 ) {
-	  if ( i < 0 ) break;
-		sout | i;
-	}													sout | nl;
-	for ( i; 2 ~ @ ~ 2 ) {
-	  if ( i > 10 ) break;
-		sout | i;
-	}													sout | nl;
-	for ( i; 2.1 ~ @ ~ @ ) {
-	  if ( i > 10.5 ) break;
-		sout | i;
-		i += 1.7;
-	}													sout | nl;
-	for ( i; @ -~ 10 ~ 2 ) {
-	  if ( i < 0 ) break;
-		sout | i;
-	}													sout | nl;
-	for ( i; 12.1 ~ @ ~ @ ) {
-	  if ( i < 2.5 ) break;
-		sout | i;
-		i -= 1.7;
-	}													sout | nl | nl;
-	
-	enum { N = 10 };
-	for ( N ) { sout | "N"; }							sout | nl;
-	for ( i; N ) { sout | i; }							sout | nl;
-	for ( i; ~= N ) { sout | i; }						sout | nl;
-	for ( i; -~= N ) { sout | i; }						sout | nl | nl;
-
-	const int start = 3, comp = 10, inc = 2;
-	for ( i; start ~ comp ~ inc + 1 ) { sout | i; }		sout | nl | nl;
-
-	for ( i; 10 : j; -5 ~ @ ) { sout | i | j; } sout | nl;
-	for ( i; 10 : j; @ -~ -5 ) { sout | i | j; } sout | nl;
-	for ( i; 10 : j; -5 ~ @ ~ 2 ) { sout | i | j; } sout | nl;
-	for ( i; 10 : j; @ -~ -5 ~ 2 ) { sout | i | j; } sout | nl | nl;
-
-	for ( j; -5 ~ @ : i; 10 ) { sout | i | j; } sout | nl;
-	for ( j; @ -~ -5 : i; 10 ) { sout | i | j; } sout | nl;
-	for ( j; -5 ~ @ ~ 2 : i; 10 ) { sout | i | j; } sout | nl;
-	for ( j; @ -~ -5 ~ 2 : i; 10 ) { sout | i | j; } sout | nl | nl;
-
-	for ( j; @ -~ -5 ~ 2 : i; 10 : k; 1.5 ~ @ ) { sout | i | j | k; } sout | nl;
-	for ( j; @ -~ -5 ~ 2 : k; 1.5 ~ @ : i; 10 ) { sout | i | j | k; } sout | nl;
-	for ( k; 1.5 ~ @ : j; @ -~ -5 ~ 2 : i; 10 ) { sout | i | j | k; } sout | nl;
-
-	for ( S s = (S){0}; s < (S){10,10}; s += (S){1} ) { sout | s; } sout | nl;
-	for ( s; (S){10,10} ) { sout | s; } sout | nl;
-	sout | nl;
-	for ( s; (S){0} ~ (S){10,10} ) { sout | s; }		 sout | nl;
-	for ( s; (S){0} ~ (S){10,10} ~ (S){1} ) { sout | s; } sout | nl;
-	for ( s; (S){0} ~= (S){10,10} ) { sout | s; }		 sout | nl;
-	for ( s; (S){0} ~= (S){10,10} ~ (S){1} ) { sout | s; } sout | nl;
-	sout | nl;
-	for ( s; (S){0} -~  (S){10,10} ) { sout | s; }		 sout | nl;
-	for ( s; (S){0} -~  (S){10,10} ~ (S){1} ) { sout | s; } sout | nl;
-	for ( s; (S){0} -~= (S){10,10} ) { sout | s; }		 sout | nl;
-	for ( s; (S){0} -~= (S){10,10} ~ (S){1} ) { sout | s; } sout | nl | nl;
-
-	fred();
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa loopctrl.cfa" //
-// End: //
