Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/Parser/parser.yy	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue May 22 08:41:57 2018
-// Update Count     : 3353
+// Last Modified On : Thu May 24 18:11:59 2018
+// Update Count     : 3369
 //
 
@@ -837,8 +837,8 @@
 //	'[' push assignment_expression pop ']'
 //		{ $$ = new ExpressionNode( build_tuple( $3 ) ); }
-	'[' ',' tuple_expression_list ']'
-		{ $$ = new ExpressionNode( build_tuple( (ExpressionNode *)(new ExpressionNode( nullptr ) )->set_last( $3 ) ) ); }
-	| '[' assignment_expression ',' tuple_expression_list ']'
-		{ $$ = new ExpressionNode( build_tuple( (ExpressionNode *)$2->set_last( $4 ) ) ); }
+	'[' push ',' tuple_expression_list pop ']'
+		{ $$ = new ExpressionNode( build_tuple( (ExpressionNode *)(new ExpressionNode( nullptr ) )->set_last( $4 ) ) ); }
+	| '[' push assignment_expression ',' tuple_expression_list pop ']'
+		{ $$ = new ExpressionNode( build_tuple( (ExpressionNode *)$3->set_last( $5 ) ) ); }
 	;
 
@@ -866,5 +866,5 @@
 	labeled_statement
 	| compound_statement
-	| expression_statement						{ $$ = $1; }
+	| expression_statement
 	| selection_statement
 	| iteration_statement
@@ -1183,13 +1183,9 @@
 	type_specifier_nobody
 	| type_specifier_nobody declarator
-		{
-			$$ = $2->addType( $1 );
-		}
+		{ $$ = $2->addType( $1 ); }
 	| type_specifier_nobody variable_abstract_declarator
 		{ $$ = $2->addType( $1 ); }
 	| cfa_abstract_declarator_tuple no_attr_identifier	// CFA
-		{
-			$$ = $1->addName( $2 );
-		}
+		{ $$ = $1->addName( $2 ); }
 	| cfa_abstract_declarator_tuple						// CFA
 	;
@@ -1269,5 +1265,5 @@
 
 declaration_list_opt:									// used at beginning of switch statement
-	pop
+	pop	// empty
 		{ $$ = nullptr; }
 	| declaration_list
@@ -1304,6 +1300,6 @@
 
 local_label_list:										// GCC, local label
-	no_attr_identifier_or_type_name				{}
-	| local_label_list ',' no_attr_identifier_or_type_name {}
+	no_attr_identifier_or_type_name
+	| local_label_list ',' no_attr_identifier_or_type_name
 	;
 
@@ -1400,18 +1396,17 @@
 		// type_specifier can resolve to just TYPEDEFname (e.g., typedef int T; int f( T );). Therefore this must be
 		// flattened to allow lookahead to the '(' without having to reduce identifier_or_type_name.
-	cfa_abstract_tuple identifier_or_type_name '(' cfa_parameter_type_list_opt ')'
+	cfa_abstract_tuple identifier_or_type_name '(' push cfa_parameter_type_list_opt pop ')'
 		// To obtain LR(1 ), this rule must be factored out from function return type (see cfa_abstract_declarator).
-		{ $$ = DeclarationNode::newFunction( $2, $1, $4, 0 ); }
-	| cfa_function_return identifier_or_type_name '(' cfa_parameter_type_list_opt ')'
-		{ $$ = DeclarationNode::newFunction( $2, $1, $4, 0 ); }
+		{ $$ = DeclarationNode::newFunction( $2, $1, $5, 0 ); }
+	| cfa_function_return identifier_or_type_name '(' push cfa_parameter_type_list_opt pop ')'
+		{ $$ = DeclarationNode::newFunction( $2, $1, $5, 0 ); }
 	;
 
 cfa_function_return:									// CFA
-	'[' cfa_parameter_list ']'
-		{ $$ = DeclarationNode::newTuple( $2 ); }
-	| '[' cfa_parameter_list ',' cfa_abstract_parameter_list ']'
-		// To obtain LR(1 ), the last cfa_abstract_parameter_list is added into this flattened rule to lookahead to the
-		// ']'.
-		{ $$ = DeclarationNode::newTuple( $2->appendList( $4 ) ); }
+	'[' push cfa_parameter_list pop ']'
+		{ $$ = DeclarationNode::newTuple( $3 ); }
+	| '[' push cfa_parameter_list pop ',' push cfa_abstract_parameter_list pop ']'
+		// To obtain LR(1 ), the last cfa_abstract_parameter_list is added into this flattened rule to lookahead to the ']'.
+		{ $$ = DeclarationNode::newTuple( $3->appendList( $7 ) ); }
 	;
 
@@ -1587,13 +1582,6 @@
 
 forall:
-	FORALL '('
-		{
-			typedefTable.enterScope();
-		}
-	  type_parameter_list ')'							// CFA
-		{
-			typedefTable.leaveScope();
-			$$ = DeclarationNode::newForall( $4 );
-		}
+	FORALL '(' push type_parameter_list pop ')'					// CFA
+		{ $$ = DeclarationNode::newForall( $4 ); }
 	;
 
@@ -1970,9 +1958,9 @@
 	| cfa_abstract_parameter_list
 	| cfa_parameter_list
-	| cfa_parameter_list ',' cfa_abstract_parameter_list
-		{ $$ = $1->appendList( $3 ); }
-	| cfa_abstract_parameter_list ',' ELLIPSIS
+	| cfa_parameter_list pop ',' push cfa_abstract_parameter_list
+		{ $$ = $1->appendList( $5 ); }
+	| cfa_abstract_parameter_list pop ',' push ELLIPSIS
 		{ $$ = $1->addVarArgs(); }
-	| cfa_parameter_list ',' ELLIPSIS
+	| cfa_parameter_list pop ',' push ELLIPSIS
 		{ $$ = $1->addVarArgs(); }
 	;
@@ -1982,16 +1970,16 @@
 		// factored out from cfa_parameter_list, flattening the rules to get lookahead to the ']'.
 	cfa_parameter_declaration
-	| cfa_abstract_parameter_list ',' cfa_parameter_declaration
-		{ $$ = $1->appendList( $3 ); }
-	| cfa_parameter_list ',' cfa_parameter_declaration
-		{ $$ = $1->appendList( $3 ); }
-	| cfa_parameter_list ',' cfa_abstract_parameter_list ',' cfa_parameter_declaration
-		{ $$ = $1->appendList( $3 )->appendList( $5 ); }
+	| cfa_abstract_parameter_list pop ',' push cfa_parameter_declaration
+		{ $$ = $1->appendList( $5 ); }
+	| cfa_parameter_list pop ',' push cfa_parameter_declaration
+		{ $$ = $1->appendList( $5 ); }
+	| cfa_parameter_list pop ',' push cfa_abstract_parameter_list pop ',' push cfa_parameter_declaration
+		{ $$ = $1->appendList( $5 )->appendList( $9 ); }
 	;
 
 cfa_abstract_parameter_list:							// CFA, new & old style abstract
 	cfa_abstract_parameter_declaration
-	| cfa_abstract_parameter_list ',' cfa_abstract_parameter_declaration
-		{ $$ = $1->appendList( $3 ); }
+	| cfa_abstract_parameter_list pop ',' push cfa_abstract_parameter_declaration
+		{ $$ = $1->appendList( $5 ); }
 	;
 
@@ -2142,13 +2130,13 @@
 	'.' no_attr_identifier								// C99, field name
 		{ $$ = new ExpressionNode( build_varref( $2 ) ); }
-	| '[' assignment_expression ']'						// C99, single array element
+	| '[' push assignment_expression pop ']'			// C99, single array element
 		// assignment_expression used instead of constant_expression because of shift/reduce conflicts with tuple.
-		{ $$ = $2; }
-	| '[' subrange ']'									// CFA, multiple array elements
-		{ $$ = $2; }
-	| '[' constant_expression ELLIPSIS constant_expression ']' // GCC, multiple array elements
-		{ $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild< Expression >( $2 ), maybeMoveBuild< Expression >( $4 ) ) ); }
-	| '.' '[' field_list ']'							// CFA, tuple field selector
 		{ $$ = $3; }
+	| '[' push subrange pop ']'							// CFA, multiple array elements
+		{ $$ = $3; }
+	| '[' push constant_expression ELLIPSIS constant_expression pop ']' // GCC, multiple array elements
+		{ $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild< Expression >( $3 ), maybeMoveBuild< Expression >( $5 ) ) ); }
+	| '.' '[' push field_list pop ']'					// CFA, tuple field selector
+		{ $$ = $4; }
 	;
 
@@ -2269,7 +2257,5 @@
 	TRAIT no_attr_identifier_or_type_name '(' push type_parameter_list pop ')' '{' '}'
 		{ $$ = DeclarationNode::newTrait( $2, $5, 0 ); }
-	| TRAIT no_attr_identifier_or_type_name '(' push type_parameter_list pop ')' '{'
-		{ typedefTable.enterScope(); }
-	  trait_declaration_list '}'
+	| TRAIT no_attr_identifier_or_type_name '(' push type_parameter_list pop ')' '{' push trait_declaration_list '}'
 		{ $$ = DeclarationNode::newTrait( $2, $5, $10 ); }
 	;
@@ -2288,7 +2274,5 @@
 cfa_trait_declaring_list:								// CFA
 	cfa_variable_specifier
-		{ $$ = $1; }
 	| cfa_function_specifier
-		{ $$ = $1; }
 	| cfa_trait_declaring_list pop ',' push identifier_or_type_name
 		{ $$ = $1->appendList( $1->cloneType( $5 ) ); }
@@ -2349,7 +2333,5 @@
 		}
 	| type_qualifier_list
-		{
-			if ( $1->type->forall ) xxx = forall = true; // remember generic type
-		}
+		{ if ( $1->type->forall ) xxx = forall = true; } // remember generic type
 	  push '{' external_definition_list '}'				// CFA, namespace
 		{
@@ -2364,7 +2346,5 @@
 		}
 	| declaration_qualifier_list
-		{
-			if ( $1->type->forall ) xxx = forall = true; // remember generic type
-		}
+		{ if ( $1->type->forall ) xxx = forall = true; } // remember generic type
 	  push '{' external_definition_list '}'				// CFA, namespace
 		{
@@ -2406,13 +2386,7 @@
 		// declaration must still have a type_specifier.  OBSOLESCENT (see 1)
 	| function_declarator compound_statement
-		{
-			typedefTable.leaveScope();
-			$$ = $1->addFunctionBody( $2 );
-		}
+		{ $$ = $1->addFunctionBody( $2 ); }
 	| KR_function_declarator KR_declaration_list_opt compound_statement
-		{
-			typedefTable.leaveScope();
-			$$ = $1->addOldDeclList( $2 )->addFunctionBody( $3 );
-		}
+		{ $$ = $1->addOldDeclList( $2 )->addFunctionBody( $3 ); }
 	;
 
@@ -2427,5 +2401,4 @@
 	cfa_function_declaration with_clause_opt compound_statement	// CFA
 		{
-			typedefTable.leaveScope();
 			// Add the function body to the last identifier in the function definition list, i.e., foo3:
 			//   [const double] foo1(), foo2( int ), foo3( double ) { return 3.0; }
@@ -2436,5 +2409,4 @@
 		{
 			rebindForall( $1, $2 );
-			typedefTable.leaveScope();
 			$$ = $2->addFunctionBody( $4, $3 )->addType( $1 );
 		}
@@ -2442,25 +2414,15 @@
 		{
 			rebindForall( $1, $2 );
-			typedefTable.leaveScope();
 			$$ = $2->addFunctionBody( $4, $3 )->addType( $1 );
 		}
 		// handles default int return type, OBSOLESCENT (see 1)
 	| type_qualifier_list function_declarator with_clause_opt compound_statement
-		{
-			typedefTable.leaveScope();
-			$$ = $2->addFunctionBody( $4, $3 )->addQualifiers( $1 );
-		}
+		{ $$ = $2->addFunctionBody( $4, $3 )->addQualifiers( $1 ); }
 		// handles default int return type, OBSOLESCENT (see 1)
 	| declaration_qualifier_list function_declarator with_clause_opt compound_statement
-		{
-			typedefTable.leaveScope();
-			$$ = $2->addFunctionBody( $4, $3 )->addQualifiers( $1 );
-		}
+		{ $$ = $2->addFunctionBody( $4, $3 )->addQualifiers( $1 ); }
 		// handles default int return type, OBSOLESCENT (see 1)
 	| declaration_qualifier_list type_qualifier_list function_declarator with_clause_opt compound_statement
-		{
-			typedefTable.leaveScope();
-			$$ = $3->addFunctionBody( $5, $4 )->addQualifiers( $2 )->addQualifiers( $1 );
-		}
+		{ $$ = $3->addFunctionBody( $5, $4 )->addQualifiers( $2 )->addQualifiers( $1 ); }
 
 		// Old-style K&R function definition, OBSOLESCENT (see 4)
@@ -2468,25 +2430,15 @@
 		{
 			rebindForall( $1, $2 );
-			typedefTable.leaveScope();
 			$$ = $2->addOldDeclList( $3 )->addFunctionBody( $5, $4 )->addType( $1 );
 		}
 		// handles default int return type, OBSOLESCENT (see 1)
 	| type_qualifier_list KR_function_declarator KR_declaration_list_opt with_clause_opt compound_statement
-		{
-			typedefTable.leaveScope();
-			$$ = $2->addOldDeclList( $3 )->addFunctionBody( $5, $4 )->addQualifiers( $1 );
-		}
+		{ $$ = $2->addOldDeclList( $3 )->addFunctionBody( $5, $4 )->addQualifiers( $1 ); }
 		// handles default int return type, OBSOLESCENT (see 1)
 	| declaration_qualifier_list KR_function_declarator KR_declaration_list_opt with_clause_opt compound_statement
-		{
-			typedefTable.leaveScope();
-			$$ = $2->addOldDeclList( $3 )->addFunctionBody( $5, $4 )->addQualifiers( $1 );
-		}
+		{ $$ = $2->addOldDeclList( $3 )->addFunctionBody( $5, $4 )->addQualifiers( $1 ); }
 		// handles default int return type, OBSOLESCENT (see 1)
 	| declaration_qualifier_list type_qualifier_list KR_function_declarator KR_declaration_list_opt with_clause_opt compound_statement
-		{
-			typedefTable.leaveScope();
-			$$ = $3->addOldDeclList( $4 )->addFunctionBody( $6, $5 )->addQualifiers( $2 )->addQualifiers( $1 );
-		}
+		{ $$ = $3->addOldDeclList( $4 )->addFunctionBody( $6, $5 )->addQualifiers( $2 )->addQualifiers( $1 ); }
 	;
 
@@ -2685,6 +2637,6 @@
 	paren_identifier '(' identifier_list ')'			// function_declarator handles empty parameter
 		{ $$ = $1->addIdList( $3 ); }
-	| '(' KR_function_ptr ')' '(' parameter_type_list_opt ')'
-		{ $$ = $2->addParamList( $5 ); }
+	| '(' KR_function_ptr ')' '(' push parameter_type_list_opt pop ')'
+		{ $$ = $2->addParamList( $6 ); }
 	| '(' KR_function_no_ptr ')'						// redundant parenthesis
 		{ $$ = $2; }
@@ -2804,8 +2756,8 @@
 
 identifier_parameter_function:
-	paren_identifier '(' parameter_type_list_opt ')'	// empty parameter list OBSOLESCENT (see 3)
-		{ $$ = $1->addParamList( $3 ); }
-	| '(' identifier_parameter_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
-		{ $$ = $2->addParamList( $5 ); }
+	paren_identifier '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
+		{ $$ = $1->addParamList( $4 ); }
+	| '(' identifier_parameter_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
+		{ $$ = $2->addParamList( $6 ); }
 	| '(' identifier_parameter_function ')'				// redundant parenthesis
 		{ $$ = $2; }
@@ -2857,8 +2809,8 @@
 
 type_parameter_function:
-	typedef '(' parameter_type_list_opt ')'				// empty parameter list OBSOLESCENT (see 3)
-		{ $$ = $1->addParamList( $3 ); }
-	| '(' type_parameter_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
-		{ $$ = $2->addParamList( $5 ); }
+	typedef '(' push parameter_type_list_opt pop ')'	// empty parameter list OBSOLESCENT (see 3)
+		{ $$ = $1->addParamList( $4 ); }
+	| '(' type_parameter_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
+		{ $$ = $2->addParamList( $6 ); }
 	;
 
@@ -2907,8 +2859,8 @@
 
 abstract_function:
-	'(' parameter_type_list_opt ')'						// empty parameter list OBSOLESCENT (see 3)
-		{ $$ = DeclarationNode::newFunction( nullptr, nullptr, $2, nullptr ); }
-	| '(' abstract_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
-		{ $$ = $2->addParamList( $5 ); }
+	'(' push parameter_type_list_opt pop ')'			// empty parameter list OBSOLESCENT (see 3)
+		{ $$ = DeclarationNode::newFunction( nullptr, nullptr, $3, nullptr ); }
+	| '(' abstract_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
+		{ $$ = $2->addParamList( $6 ); }
 	| '(' abstract_function ')'							// redundant parenthesis
 		{ $$ = $2; }
@@ -2925,11 +2877,11 @@
 
 multi_array_dimension:
-	'[' assignment_expression ']'
-		{ $$ = DeclarationNode::newArray( $2, 0, false ); }
-	| '[' '*' ']'										// C99
+	'[' push assignment_expression pop ']'
+		{ $$ = DeclarationNode::newArray( $3, 0, false ); }
+	| '[' push '*' pop ']'								// C99
 		{ $$ = DeclarationNode::newVarArray( 0 ); }
-	| multi_array_dimension '[' assignment_expression ']'
-		{ $$ = $1->addArray( DeclarationNode::newArray( $3, 0, false ) ); }
-	| multi_array_dimension '[' '*' ']'					// C99
+	| multi_array_dimension '[' push assignment_expression pop ']'
+		{ $$ = $1->addArray( DeclarationNode::newArray( $4, 0, false ) ); }
+	| multi_array_dimension '[' push '*' pop ']'		// C99
 		{ $$ = $1->addArray( DeclarationNode::newVarArray( 0 ) ); }
 	;
@@ -2998,8 +2950,8 @@
 
 abstract_parameter_function:
-	'(' parameter_type_list_opt ')'						// empty parameter list OBSOLESCENT (see 3)
-		{ $$ = DeclarationNode::newFunction( nullptr, nullptr, $2, nullptr ); }
-	| '(' abstract_parameter_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
-		{ $$ = $2->addParamList( $5 ); }
+	'(' push parameter_type_list_opt pop ')'			// empty parameter list OBSOLESCENT (see 3)
+		{ $$ = DeclarationNode::newFunction( nullptr, nullptr, $3, nullptr ); }
+	| '(' abstract_parameter_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
+		{ $$ = $2->addParamList( $6 ); }
 	| '(' abstract_parameter_function ')'				// redundant parenthesis
 		{ $$ = $2; }
@@ -3023,15 +2975,15 @@
 		{ $$ = DeclarationNode::newArray( 0, 0, false ); }
 	// multi_array_dimension handles the '[' '*' ']' case
-	| '[' type_qualifier_list '*' ']'					// remaining C99
-		{ $$ = DeclarationNode::newVarArray( $2 ); }
-	| '[' type_qualifier_list ']'
-		{ $$ = DeclarationNode::newArray( 0, $2, false ); }
+	| '[' push type_qualifier_list '*' pop ']'			// remaining C99
+		{ $$ = DeclarationNode::newVarArray( $3 ); }
+	| '[' push type_qualifier_list pop ']'
+		{ $$ = DeclarationNode::newArray( 0, $3, false ); }
 	// multi_array_dimension handles the '[' assignment_expression ']' case
-	| '[' type_qualifier_list assignment_expression ']'
-		{ $$ = DeclarationNode::newArray( $3, $2, false ); }
-	| '[' STATIC type_qualifier_list_opt assignment_expression ']'
-		{ $$ = DeclarationNode::newArray( $4, $3, true ); }
-	| '[' type_qualifier_list STATIC assignment_expression ']'
-		{ $$ = DeclarationNode::newArray( $4, $2, true ); }
+	| '[' push type_qualifier_list assignment_expression pop ']'
+		{ $$ = DeclarationNode::newArray( $4, $3, false ); }
+	| '[' push STATIC type_qualifier_list_opt assignment_expression pop ']'
+		{ $$ = DeclarationNode::newArray( $5, $4, true ); }
+	| '[' push type_qualifier_list STATIC assignment_expression pop ']'
+		{ $$ = DeclarationNode::newArray( $5, $3, true ); }
 	;
 
@@ -3077,6 +3029,6 @@
 
 variable_abstract_function:
-	'(' variable_abstract_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
-		{ $$ = $2->addParamList( $5 ); }
+	'(' variable_abstract_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
+		{ $$ = $2->addParamList( $6 ); }
 	| '(' variable_abstract_function ')'				// redundant parenthesis
 		{ $$ = $2; }
@@ -3141,15 +3093,15 @@
 
 cfa_array_parameter_1st_dimension:
-	'[' type_qualifier_list '*' ']'						// remaining C99
-		{ $$ = DeclarationNode::newVarArray( $2 ); }
-	| '[' type_qualifier_list assignment_expression ']'
-		{ $$ = DeclarationNode::newArray( $3, $2, false ); }
-	| '[' declaration_qualifier_list assignment_expression ']'
+	'[' push type_qualifier_list '*' pop ']'			// remaining C99
+		{ $$ = DeclarationNode::newVarArray( $3 ); }
+	| '[' push type_qualifier_list assignment_expression pop ']'
+		{ $$ = DeclarationNode::newArray( $4, $3, false ); }
+	| '[' push declaration_qualifier_list assignment_expression pop ']'
 		// declaration_qualifier_list must be used because of shift/reduce conflict with
 		// assignment_expression, so a semantic check is necessary to preclude them as a type_qualifier cannot
 		// appear in this context.
-		{ $$ = DeclarationNode::newArray( $3, $2, true ); }
-	| '[' declaration_qualifier_list type_qualifier_list assignment_expression ']'
-		{ $$ = DeclarationNode::newArray( $4, $3->addQualifiers( $3 ), true ); }
+		{ $$ = DeclarationNode::newArray( $4, $3, true ); }
+	| '[' push declaration_qualifier_list type_qualifier_list assignment_expression pop ']'
+		{ $$ = DeclarationNode::newArray( $5, $4->addQualifiers( $3 ), true ); }
 	;
 
@@ -3220,6 +3172,6 @@
 
 cfa_abstract_tuple:										// CFA
-	'[' cfa_abstract_parameter_list ']'
-		{ $$ = DeclarationNode::newTuple( $2 ); }
+	'[' push cfa_abstract_parameter_list pop ']'
+		{ $$ = DeclarationNode::newTuple( $3 ); }
 	;
 
@@ -3227,8 +3179,8 @@
 //	'[' ']' '(' cfa_parameter_type_list_opt ')'
 //		{ $$ = DeclarationNode::newFunction( nullptr, DeclarationNode::newTuple( nullptr ), $4, nullptr ); }
-	cfa_abstract_tuple '(' cfa_parameter_type_list_opt ')'
-		{ $$ = DeclarationNode::newFunction( nullptr, $1, $3, nullptr ); }
-	| cfa_function_return '(' cfa_parameter_type_list_opt ')'
-		{ $$ = DeclarationNode::newFunction( nullptr, $1, $3, nullptr ); }
+	cfa_abstract_tuple '(' push cfa_parameter_type_list_opt pop ')'
+		{ $$ = DeclarationNode::newFunction( nullptr, $1, $4, nullptr ); }
+	| cfa_function_return '(' push cfa_parameter_type_list_opt pop ')'
+		{ $$ = DeclarationNode::newFunction( nullptr, $1, $4, nullptr ); }
 	;
 
Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -698,9 +698,10 @@
 			const ExplodedArgs& args, std::vector<ArgPack>& results, std::size_t& genStart,
 			const SymTab::Indexer& indexer, unsigned nTuples = 0 ) {
-		if ( TupleType* tupleType = dynamic_cast<TupleType*>( formalType ) ) {
+		if ( TupleType * tupleType = dynamic_cast<TupleType*>( formalType ) ) {
 			// formalType is a TupleType - group actuals into a TupleExpr
 			++nTuples;
 			for ( Type* type : *tupleType ) {
 				// xxx - dropping initializer changes behaviour from previous, but seems correct
+				// ^^^ need to handle the case where a tuple has a default argument
 				if ( ! instantiateArgument(
 						type, nullptr, args, results, genStart, indexer, nTuples ) )
@@ -713,5 +714,5 @@
 			}
 			return true;
-		} else if ( TypeInstType* ttype = Tuples::isTtype( formalType ) ) {
+		} else if ( TypeInstType * ttype = Tuples::isTtype( formalType ) ) {
 			// formalType is a ttype, consumes all remaining arguments
 			// xxx - mixing default arguments with variadic??
@@ -916,5 +917,5 @@
 				// consider only first exploded actual
 				Expression* expr = expl.exprs.front().get();
-				Type* actualType = expr->get_result()->clone();
+				Type* actualType = expr->result->clone();
 
 				PRINT(
@@ -947,5 +948,5 @@
 		ApplicationExpr *appExpr = new ApplicationExpr( func.expr->clone() );
 		// sum cost and accumulate actuals
-		std::list<Expression*>& args = appExpr->get_args();
+		std::list<Expression*>& args = appExpr->args;
 		Cost cost = func.cost;
 		const ArgPack* pack = &result;
@@ -974,9 +975,9 @@
 		// add all type variables as open variables now so that those not used in the parameter
 		// list are still considered open.
-		funcEnv.add( funcType->get_forall() );
-
-		if ( targetType && ! targetType->isVoid() && ! funcType->get_returnVals().empty() ) {
+		funcEnv.add( funcType->forall );
+
+		if ( targetType && ! targetType->isVoid() && ! funcType->returnVals.empty() ) {
 			// attempt to narrow based on expected target type
-			Type * returnType = funcType->get_returnVals().front()->get_type();
+			Type * returnType = funcType->returnVals.front()->get_type();
 			if ( ! unify( returnType, targetType, funcEnv, funcNeed, funcHave, funcOpenVars,
 					indexer ) ) {
@@ -991,8 +992,8 @@
 		std::size_t genStart = 0;
 
-		for ( DeclarationWithType* formal : funcType->get_parameters() ) {
+		for ( DeclarationWithType* formal : funcType->parameters ) {
 			ObjectDecl* obj = strict_dynamic_cast< ObjectDecl* >( formal );
 			if ( ! instantiateArgument(
-					obj->get_type(), obj->get_init(), args, results, genStart, indexer ) )
+					obj->type, obj->init, args, results, genStart, indexer ) )
 				return;
 		}
@@ -1075,5 +1076,5 @@
 	void AlternativeFinder::Finder::postvisit( UntypedExpr *untypedExpr ) {
 		AlternativeFinder funcFinder( indexer, env );
-		funcFinder.findWithAdjustment( untypedExpr->get_function() );
+		funcFinder.findWithAdjustment( untypedExpr->function );
 		// if there are no function alternatives, then proceeding is a waste of time.
 		if ( funcFinder.alternatives.empty() ) return;
@@ -1120,6 +1121,6 @@
 				)
 				// check if the type is pointer to function
-				if ( PointerType *pointer = dynamic_cast< PointerType* >( func->expr->get_result()->stripReferences() ) ) {
-					if ( FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ) ) {
+				if ( PointerType *pointer = dynamic_cast< PointerType* >( func->expr->result->stripReferences() ) ) {
+					if ( FunctionType *function = dynamic_cast< FunctionType* >( pointer->base ) ) {
 						Alternative newFunc( *func );
 						referenceToRvalueConversion( newFunc.expr, newFunc.cost );
@@ -1127,7 +1128,7 @@
 							std::back_inserter( candidates ) );
 					}
-				} else if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( func->expr->get_result()->stripReferences() ) ) { // handle ftype (e.g. *? on function pointer)
+				} else if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( func->expr->result->stripReferences() ) ) { // handle ftype (e.g. *? on function pointer)
 					EqvClass eqvClass;
-					if ( func->env.lookup( typeInst->get_name(), eqvClass ) && eqvClass.type ) {
+					if ( func->env.lookup( typeInst->name, eqvClass ) && eqvClass.type ) {
 						if ( FunctionType *function = dynamic_cast< FunctionType* >( eqvClass.type ) ) {
 							Alternative newFunc( *func );
@@ -1158,7 +1159,7 @@
 					// check if type is a pointer to function
 					if ( PointerType* pointer = dynamic_cast<PointerType*>(
-							funcOp->expr->get_result()->stripReferences() ) ) {
+							funcOp->expr->result->stripReferences() ) ) {
 						if ( FunctionType* function =
-								dynamic_cast<FunctionType*>( pointer->get_base() ) ) {
+								dynamic_cast<FunctionType*>( pointer->base ) ) {
 							Alternative newFunc( *funcOp );
 							referenceToRvalueConversion( newFunc.expr, newFunc.cost );
@@ -1182,11 +1183,11 @@
 			PRINT(
 				ApplicationExpr *appExpr = strict_dynamic_cast< ApplicationExpr* >( withFunc.expr );
-				PointerType *pointer = strict_dynamic_cast< PointerType* >( appExpr->get_function()->get_result() );
-				FunctionType *function = strict_dynamic_cast< FunctionType* >( pointer->get_base() );
-				std::cerr << "Case +++++++++++++ " << appExpr->get_function() << std::endl;
+				PointerType *pointer = strict_dynamic_cast< PointerType* >( appExpr->function->result );
+				FunctionType *function = strict_dynamic_cast< FunctionType* >( pointer->base );
+				std::cerr << "Case +++++++++++++ " << appExpr->function << std::endl;
 				std::cerr << "formals are:" << std::endl;
-				printAll( function->get_parameters(), std::cerr, 8 );
+				printAll( function->parameters, std::cerr, 8 );
 				std::cerr << "actuals are:" << std::endl;
-				printAll( appExpr->get_args(), std::cerr, 8 );
+				printAll( appExpr->args, std::cerr, 8 );
 				std::cerr << "bindings are:" << std::endl;
 				withFunc.env.print( std::cerr, 8 );
@@ -1229,5 +1230,5 @@
 	bool isLvalue( Expression *expr ) {
 		// xxx - recurse into tuples?
-		return expr->result && ( expr->get_result()->get_lvalue() || dynamic_cast< ReferenceType * >( expr->get_result() ) );
+		return expr->result && ( expr->result->get_lvalue() || dynamic_cast< ReferenceType * >( expr->result ) );
 	}
 
@@ -1291,4 +1292,6 @@
 			AssertionSet needAssertions, haveAssertions;
 			OpenVarSet openVars;
+
+			alt.env.extractOpenVars( openVars );
 
 			// It's possible that a cast can throw away some values in a multiply-valued expression.  (An example is a
@@ -1709,5 +1712,5 @@
 			AlternativeFinder finder( indexer, env );
 			finder.targetType = toType;
-			finder.findWithAdjustment( initExpr->get_expr() );
+			finder.findWithAdjustment( initExpr->expr );
 			for ( Alternative & alt : finder.get_alternatives() ) {
 				TypeEnvironment newEnv( alt.env );
@@ -1716,10 +1719,10 @@
 				PRINT(
 					std::cerr << "  @ " << toType << " " << initAlt.designation << std::endl;
-				 )
+				)
 				// It's possible that a cast can throw away some values in a multiply-valued expression.  (An example is a
 				// cast-to-void, which casts from one value to zero.)  Figure out the prefix of the subexpression results
 				// that are cast directly.  The candidate is invalid if it has fewer results than there are types to cast
 				// to.
-				int discardedValues = alt.expr->get_result()->size() - toType->size();
+				int discardedValues = alt.expr->result->size() - toType->size();
 				if ( discardedValues < 0 ) continue;
 				// xxx - may need to go into tuple types and extract relevant types and use unifyList. Note that currently, this does not
@@ -1728,5 +1731,5 @@
 				unify( toType, alt.expr->result, newEnv, needAssertions, haveAssertions, openVars, indexer ); // xxx - do some inspecting on this line... why isn't result bound to initAlt.type??
 
-				Cost thisCost = castCost( alt.expr->get_result(), toType, indexer, newEnv );
+				Cost thisCost = castCost( alt.expr->result, toType, indexer, newEnv );
 				if ( thisCost != Cost::infinity ) {
 					// count one safe conversion for each value that is thrown away
Index: src/Tuples/TupleAssignment.cc
===================================================================
--- src/Tuples/TupleAssignment.cc	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/Tuples/TupleAssignment.cc	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -231,5 +231,6 @@
 
 			ResolvExpr::AlternativeFinder finder{ currentFinder.get_indexer(),
-				currentFinder.get_environ() };
+				matcher->compositeEnv };
+
 			try {
 				finder.findWithAdjustment(*i);
@@ -349,4 +350,10 @@
 				ltmp.push_back( lobj );
 				rtmp.push_back( robj );
+
+				// resolve the cast expression so that rhsAlt return type is bound by the cast type as needed, and transfer the resulting environment
+				ResolvExpr::AlternativeFinder finder{ spotter.currentFinder.get_indexer(), compositeEnv };
+				finder.findWithAdjustment( rhsAlt.expr );
+				assert( finder.get_alternatives().size() == 1 );
+				compositeEnv = std::move( finder.get_alternatives().front().env );
 			}
 			tmpDecls.splice( tmpDecls.end(), ltmp );
Index: src/libcfa/concurrency/alarm.c
===================================================================
--- src/libcfa/concurrency/alarm.c	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/libcfa/concurrency/alarm.c	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -10,6 +10,6 @@
 // Created On       : Fri Jun 2 11:31:25 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Apr  9 13:36:18 2018
-// Update Count     : 61
+// Last Modified On : Fri May 25 06:25:47 2018
+// Update Count     : 67
 //
 
@@ -37,5 +37,5 @@
 
 void __kernel_set_timer( Duration alarm ) {
-	verifyf(alarm >= 1`us || alarm == 0, "Setting timer to < 1us (%luns)", alarm.tv);
+	verifyf(alarm >= 1`us || alarm == 0, "Setting timer to < 1us (%jins)", alarm.tv);
 	setitimer( ITIMER_REAL, &(itimerval){ alarm }, NULL );
 }
Index: src/tests/.expect/io.txt
===================================================================
--- src/tests/.expect/io.txt	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ 	(revision )
@@ -1,85 +1,0 @@
-9 6 28 0 7 1 2
-1 2 3
-123
-123
-
-opening delimiters
-x (1 x [2 x {3 x =4 x $5 x £6 x ¥7 x ¡8 x ¿9 x «10
-
-closing delimiters
-1, x 2. x 3; x 4! x 5? x 6% x 7¢ x 8» x 9) x 10] x 11} x
-
-opening/closing delimiters
-x`1`x'2'x"3"x:4:x 5 x	6	x
-7
-x
-8
-x
-9
-x
-10
-x
-
-override opening/closing delimiters
-x ( 1 ) x 2 , x 3 :x: 4
-
-input bacis types
-
-output basic types
-false
-A 23 93
-1 2 3 4 5 6 7 8
-1.1 1.2 1.3
-1.1+2.3i 1.1-2.3i 1.1-2.3i
-
-tuples
-1, 2, 3 4, 5, 6
-
-toggle separator
-1.11.21.3
-1.1+2.3i1.1-2.3i1.1-2.3i
-1.1+2.3i 1.1-2.3i1.1-2.3i
-1.1+2.3i 1.1-2.3i 1.1-2.3i
-1.1+2.3i1.1-2.3i 1.1-2.3i
-abcxyz
-abcxyz
-
-change separator
-from " " to ", $"
-1.1, $1.2, $1.3
-1.1+2.3i, $1.1-2.3i, $1.1-2.3i
-abc, $xyz
-1, 2, 3, $4, 5, 6
-
-from ", $" to " "
-1.1 1.2 1.3
-1.1+2.3i 1.1-2.3i 1.1-2.3i
-abc xyz
-1, 2, 3 4, 5, 6
-
-check sepOn/sepOff
-1 2 3
-12 3
-1 2 3
-1 2 3
-
-1 2 3
-
-check enable/disable
-123
-1 23
-1 2 3
-123
-1 2 3
-123
-1 2 3
-
-1 2 3 4 5 6 " "
-1, 2, 3 4, 5, 6 " "
-1, 2, 3 4, 5, 6
-
-3, 4, a, 7.2
-3, 4, a, 7.2
-3 4 a 7.2
-3 4 a 7.234a7.23 4 a 7.2
-3-4-a-7.2^3^4^3-4-a-7.2
Index: src/tests/.expect/io1.txt
===================================================================
--- src/tests/.expect/io1.txt	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
+++ src/tests/.expect/io1.txt	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -0,0 +1,25 @@
+9 6 28 0 7 1 2
+1 2 3
+123
+123
+
+opening delimiters
+x (1 x [2 x {3 x =4 x $5 x £6 x ¥7 x ¡8 x ¿9 x «10
+
+closing delimiters
+1, x 2. x 3; x 4! x 5? x 6% x 7¢ x 8» x 9) x 10] x 11} x
+
+opening/closing delimiters
+x`1`x'2'x"3"x:4:x 5 x	6	x
+7
+x
+8
+x
+9
+x
+10
+x
+
+override opening/closing delimiters
+x ( 1 ) x 2 , x 3 :x: 4
+
Index: src/tests/.expect/io2.txt
===================================================================
--- src/tests/.expect/io2.txt	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
+++ src/tests/.expect/io2.txt	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -0,0 +1,60 @@
+input bacis types
+
+output basic types
+false
+A 23 93
+1 2 3 4 5 6 7 8
+1.1 1.2 1.3
+1.1+2.3i 1.1-2.3i 1.1-2.3i
+
+tuples
+1, 2, 3 4, 5, 6
+
+toggle separator
+1.11.21.3
+1.1+2.3i1.1-2.3i1.1-2.3i
+1.1+2.3i 1.1-2.3i1.1-2.3i
+1.1+2.3i 1.1-2.3i 1.1-2.3i
+1.1+2.3i1.1-2.3i 1.1-2.3i
+abcxyz
+abcxyz
+
+change separator
+from " " to ", $"
+1.1, $1.2, $1.3
+1.1+2.3i, $1.1-2.3i, $1.1-2.3i
+abc, $xyz
+1, 2, 3, $4, 5, 6
+
+from ", $" to " "
+1.1 1.2 1.3
+1.1+2.3i 1.1-2.3i 1.1-2.3i
+abc xyz
+1, 2, 3 4, 5, 6
+
+check sepOn/sepOff
+1 2 3
+12 3
+1 2 3
+1 2 3
+
+1 2 3
+
+check enable/disable
+123
+1 23
+1 2 3
+123
+1 2 3
+123
+1 2 3
+
+1 2 3 4 5 6 " "
+1, 2, 3 4, 5, 6 " "
+1, 2, 3 4, 5, 6
+
+3, 4, a, 7.2
+3, 4, a, 7.2
+3 4 a 7.2
+3 4 a 7.234a7.23 4 a 7.2
+3-4-a-7.2^3^4^3-4-a-7.2
Index: src/tests/.expect/math1.x64.txt
===================================================================
--- src/tests/.expect/math1.x64.txt	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/.expect/math1.x64.txt	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -12,11 +12,2 @@
 \ 16 256
 \ 912673 256 64 -64 0.015625 -0.015625 18.3791736799526 0.264715-1.1922i
-log:0 0 0 0.346574+0.785398i 0.346573590279973+0.785398163397448i 0.346573590279972655+0.78539816339744831i
-log2:3 3 3
-log10:2 2 2
-log1p:0.693147 0.693147180559945 0.693147180559945309
-ilogb:0 0 0
-logb:3 3 3
-sqrt:1 1 1 1.09868+0.45509i 1.09868411346781+0.455089860562227i 1.09868411346780997+0.455089860562227341i
-cbrt:3 3 3
-hypot:1.41421 1.4142135623731 1.41421356237309505
Index: src/tests/.expect/math1.x86.txt
===================================================================
--- src/tests/.expect/math1.x86.txt	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/.expect/math1.x86.txt	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -12,11 +12,2 @@
 \ 16 256
 \ 912673 256 64 -64 0.015625 -0.015625 18.3791736799526 0.264715-1.1922i
-log:0 0 0 0.346574+0.785398i 0.346573590279973+0.785398163397448i 0.346573590279972655+0.78539816339744831i
-log2:3 3 3
-log10:2 2 2
-log1p:0.693147 0.693147180559945 0.693147180559945309
-ilogb:0 0 0
-logb:3 3 3
-sqrt:1 1 1 1.09868+0.45509i 1.09868411346781+0.455089860562227i 1.09868411346780997+0.455089860562227341i
-cbrt:3 3 3
-hypot:1.41421 1.4142135623731 1.41421356237309505
Index: src/tests/.expect/math2.x64.txt
===================================================================
--- src/tests/.expect/math2.x64.txt	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/.expect/math2.x64.txt	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -1,2 +1,11 @@
+log:0 0 0 0.346574+0.785398i 0.346573590279973+0.785398163397448i 0.346573590279972655+0.78539816339744831i
+log2:3 3 3
+log10:2 2 2
+log1p:0.693147 0.693147180559945 0.693147180559945309
+ilogb:0 0 0
+logb:3 3 3
+sqrt:1 1 1 1.09868+0.45509i 1.09868411346781+0.455089860562227i 1.09868411346780997+0.455089860562227341i
+cbrt:3 3 3
+hypot:1.41421 1.4142135623731 1.41421356237309505
 sin:0.841471 0.841470984807897 0.841470984807896507 1.29846+0.634964i 1.29845758141598+0.634963914784736i 1.29845758141597729+0.634963914784736108i
 cos:0.540302 0.54030230586814 0.540302305868139717 0.83373-0.988898i 0.833730025131149-0.988897705762865i 0.833730025131149049-0.988897705762865096i
@@ -6,13 +15,2 @@
 atan:0.785398 0.785398163397448 0.78539816339744831 1.01722+0.402359i 1.01722196789785+0.402359478108525i 1.01722196789785137+0.402359478108525094i
 atan2:0.785398 0.785398163397448 0.78539816339744831 atan:0.785398 0.785398163397448 0.78539816339744831
-sinh:1.1752 1.1752011936438 1.17520119364380146 0.634964+1.29846i 0.634963914784736+1.29845758141598i 0.634963914784736108+1.29845758141597729i
-cosh:1.54308 1.54308063481524 1.54308063481524378 0.83373+0.988898i 0.833730025131149+0.988897705762865i 0.833730025131149049+0.988897705762865096i
-tanh:0.761594 0.761594155955765 0.761594155955764888 1.08392+0.271753i 1.08392332733869+0.271752585319512i 1.08392332733869454+0.271752585319511717i
-acosh:0 0 0 1.06128+0.904557i 1.06127506190504+0.904556894302381i 1.06127506190503565+0.904556894302381364i
-asinh:0.881374 0.881373587019543 0.881373587019543025 1.06128+0.666239i 1.06127506190504+0.666239432492515i 1.06127506190503565+0.666239432492515255i
-atanh:inf inf inf 0.402359+1.01722i 0.402359478108525+1.01722196789785i 0.402359478108525094+1.01722196789785137i
-erf:0.842701 0.842700792949715 0.842700792949714869
-erfc:0.157299 0.157299207050285 0.157299207050285131
-lgamma:1.79176 1.79175946922805 1.791759469228055
-lgamma:1.79176 1 1.79175946922805 1 1.791759469228055 1
-tgamma:6 6 6
Index: src/tests/.expect/math2.x86.txt
===================================================================
--- src/tests/.expect/math2.x86.txt	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/.expect/math2.x86.txt	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -1,2 +1,11 @@
+log:0 0 0 0.346574+0.785398i 0.346573590279973+0.785398163397448i 0.346573590279972655+0.78539816339744831i
+log2:3 3 3
+log10:2 2 2
+log1p:0.693147 0.693147180559945 0.693147180559945309
+ilogb:0 0 0
+logb:3 3 3
+sqrt:1 1 1 1.09868+0.45509i 1.09868411346781+0.455089860562227i 1.09868411346780997+0.455089860562227341i
+cbrt:3 3 3
+hypot:1.41421 1.4142135623731 1.41421356237309505
 sin:0.841471 0.841470984807897 0.841470984807896507 1.29846+0.634964i 1.29845758141598+0.634963914784736i 1.29845758141597729+0.634963914784736108i
 cos:0.540302 0.54030230586814 0.540302305868139717 0.83373-0.988898i 0.833730025131149-0.988897705762865i 0.833730025131149049-0.988897705762865096i
@@ -6,13 +15,2 @@
 atan:0.785398 0.785398163397448 0.78539816339744831 1.01722+0.402359i 1.01722196789785+0.402359478108525i 1.01722196789785137+0.402359478108525094i
 atan2:0.785398 0.785398163397448 0.78539816339744831 atan:0.785398 0.785398163397448 0.78539816339744831
-sinh:1.1752 1.1752011936438 1.17520119364380146 0.634964+1.29846i 0.634963914784736+1.29845758141598i 0.634963914784736108+1.29845758141597729i
-cosh:1.54308 1.54308063481524 1.54308063481524378 0.83373+0.988898i 0.833730025131149+0.988897705762865i 0.833730025131149049+0.988897705762865096i
-tanh:0.761594 0.761594155955765 0.761594155955764888 1.08392+0.271753i 1.08392332733869+0.271752585319512i 1.08392332733869454+0.271752585319511717i
-acosh:0 0 0 1.06128+0.904557i 1.06127506190504+0.904556894302381i 1.06127506190503565+0.904556894302381364i
-asinh:0.881374 0.881373587019543 0.881373587019543025 1.06128+0.666239i 1.06127506190504+0.666239432492515i 1.06127506190503565+0.666239432492515255i
-atanh:inf inf inf 0.402359+1.01722i 0.402359478108525+1.01722196789785i 0.402359478108525094+1.01722196789785137i
-erf:0.842701 0.842700792949715 0.842700792949714869
-erfc:0.157299 0.157299207050285 0.157299207050285131
-lgamma:1.79176 1.79175946922805 1.791759469228055
-lgamma:1.79176 1 1.79175946922805 1 1.791759469228055 1
-tgamma:6 6 6
Index: src/tests/.expect/math3.x64.txt
===================================================================
--- src/tests/.expect/math3.x64.txt	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/.expect/math3.x64.txt	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -1,23 +1,11 @@
-floor:1 1 1
-ceil:2 2 2
-trunc:3 3 3
-rint:2 2 2
-rint:2 2 2
-rint:2 2 2
-lrint:2 2 2
-llrint:2 2 2
-nearbyint:4 4 4
-round:2 2 2
-round:2 2 2
-round:2 2 2
-lround:2 2 2
-llround:2 2 2
-copysign:-1 -1 -1
-frexp:0.5 3 0.5 3 0.5 3
-ldexp:8 8 8
-modf:2 0.3 2 0.3 2 0.3
-modf:2, 0.3 2, 0.3 2, 0.3
-nextafter:2 2 2
-nexttoward:2 2 2
-scalbn:16 16 16
-scalbln:16 16 16
+sinh:1.1752 1.1752011936438 1.17520119364380146 0.634964+1.29846i 0.634963914784736+1.29845758141598i 0.634963914784736108+1.29845758141597729i
+cosh:1.54308 1.54308063481524 1.54308063481524378 0.83373+0.988898i 0.833730025131149+0.988897705762865i 0.833730025131149049+0.988897705762865096i
+tanh:0.761594 0.761594155955765 0.761594155955764888 1.08392+0.271753i 1.08392332733869+0.271752585319512i 1.08392332733869454+0.271752585319511717i
+acosh:0 0 0 1.06128+0.904557i 1.06127506190504+0.904556894302381i 1.06127506190503565+0.904556894302381364i
+asinh:0.881374 0.881373587019543 0.881373587019543025 1.06128+0.666239i 1.06127506190504+0.666239432492515i 1.06127506190503565+0.666239432492515255i
+atanh:inf inf inf 0.402359+1.01722i 0.402359478108525+1.01722196789785i 0.402359478108525094+1.01722196789785137i
+erf:0.842701 0.842700792949715 0.842700792949714869
+erfc:0.157299 0.157299207050285 0.157299207050285131
+lgamma:1.79176 1.79175946922805 1.791759469228055
+lgamma:1.79176 1 1.79175946922805 1 1.791759469228055 1
+tgamma:6 6 6
Index: src/tests/.expect/math3.x86.txt
===================================================================
--- src/tests/.expect/math3.x86.txt	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/.expect/math3.x86.txt	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -1,23 +1,11 @@
-floor:1 1 1
-ceil:2 2 2
-trunc:3 3 3
-rint:2 2 2
-rint:2 2 2
-rint:2 2 2
-lrint:2 2 2
-llrint:2 2 2
-nearbyint:4 4 4
-round:2 2 2
-round:2 2 2
-round:2 2 2
-lround:2 2 2
-llround:2 2 2
-copysign:-1 -1 -1
-frexp:0.5 3 0.5 3 0.5 3
-ldexp:8 8 8
-modf:2 0.3 2 0.3 2 0.3
-modf:2, 0.3 2, 0.3 2, 0.3
-nextafter:2 2 2
-nexttoward:2 2 2
-scalbn:16 16 16
-scalbln:16 16 16
+sinh:1.1752 1.1752011936438 1.17520119364380146 0.634964+1.29846i 0.634963914784736+1.29845758141598i 0.634963914784736108+1.29845758141597729i
+cosh:1.54308 1.54308063481524 1.54308063481524378 0.83373+0.988898i 0.833730025131149+0.988897705762865i 0.833730025131149049+0.988897705762865096i
+tanh:0.761594 0.761594155955765 0.761594155955764888 1.08392+0.271753i 1.08392332733869+0.271752585319512i 1.08392332733869454+0.271752585319511717i
+acosh:0 0 0 1.06128+0.904557i 1.06127506190504+0.904556894302381i 1.06127506190503565+0.904556894302381364i
+asinh:0.881374 0.881373587019543 0.881373587019543025 1.06128+0.666239i 1.06127506190504+0.666239432492515i 1.06127506190503565+0.666239432492515255i
+atanh:inf inf inf 0.402359+1.01722i 0.402359478108525+1.01722196789785i 0.402359478108525094+1.01722196789785137i
+erf:0.842701 0.842700792949715 0.842700792949714869
+erfc:0.157299 0.157299207050285 0.157299207050285131
+lgamma:1.79176 1.79175946922805 1.791759469228055
+lgamma:1.79176 1 1.79175946922805 1 1.791759469228055 1
+tgamma:6 6 6
Index: src/tests/.expect/math4.x64.txt
===================================================================
--- src/tests/.expect/math4.x64.txt	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
+++ src/tests/.expect/math4.x64.txt	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -0,0 +1,23 @@
+floor:1 1 1
+ceil:2 2 2
+trunc:3 3 3
+rint:2 2 2
+rint:2 2 2
+rint:2 2 2
+lrint:2 2 2
+llrint:2 2 2
+nearbyint:4 4 4
+round:2 2 2
+round:2 2 2
+round:2 2 2
+lround:2 2 2
+llround:2 2 2
+copysign:-1 -1 -1
+frexp:0.5 3 0.5 3 0.5 3
+ldexp:8 8 8
+modf:2 0.3 2 0.3 2 0.3
+modf:2, 0.3 2, 0.3 2, 0.3
+nextafter:2 2 2
+nexttoward:2 2 2
+scalbn:16 16 16
+scalbln:16 16 16
Index: src/tests/concurrent/coroutineYield.c
===================================================================
--- src/tests/concurrent/coroutineYield.c	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/concurrent/coroutineYield.c	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -3,4 +3,13 @@
 #include <stdlib>
 #include <thread>
+#include <time>
+
+#ifndef PREEMPTION_RATE
+#define PREEMPTION_RATE 10`ms
+#endif
+
+Duration default_preemption() {
+	return PREEMPTION_RATE;
+}
 
 #ifdef LONG_TEST
Index: src/tests/concurrent/examples/matrixSum.c
===================================================================
--- src/tests/concurrent/examples/matrixSum.c	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/concurrent/examples/matrixSum.c	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -11,6 +11,6 @@
 // Created On       : Mon Oct  9 08:29:28 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Dec  5 22:56:46 2017
-// Update Count     : 4
+// Last Modified On : Fri May 25 09:34:27 2018
+// Update Count     : 10
 // 
 
@@ -20,40 +20,39 @@
 
 thread Adder {
-    int * row, cols, * subtotal;						// communication
+	int * row, cols, & subtotal;						// communication
 };
 
 void ?{}( Adder & adder, int row[], int cols, int & subtotal ) {
-    adder.row = row;
-    adder.cols = cols;
-    adder.subtotal = &subtotal;
+	adder.[ row, cols ] = [ row, cols ];				// expression disallowed in multi-member access
+	&adder.subtotal = &subtotal;
 }
 
-void main( Adder & adder ) with( adder ) {
-    *subtotal = 0;
-    for ( int c = 0; c < cols; c += 1 ) {
-		*subtotal += row[c];
-    } // for
+void main( Adder & adder ) with( adder ) {				// thread starts here
+	subtotal = 0;
+	for ( int c = 0; c < cols; c += 1 ) {
+		subtotal += row[c];
+	} // for
 }
 
 int main() {
-    const int rows = 10, cols = 1000;
-    int matrix[rows][cols], subtotals[rows], total = 0;
-    processor p;										// extra kernel thread
+	const int rows = 10, cols = 1000;
+	int matrix[rows][cols], subtotals[rows], total = 0;
+	processor p;										// add kernel thread
 
-    for ( int r = 0; r < rows; r += 1 ) {
+	for ( int r = 0; r < rows; r += 1 ) {
 		for ( int c = 0; c < cols; c += 1 ) {
 			matrix[r][c] = 1;
 		} // for
-    } // for
-    Adder * adders[rows];
-    for ( int r = 0; r < rows; r += 1 ) {				// start threads to sum rows
+	} // for
+	Adder * adders[rows];
+	for ( int r = 0; r < rows; r += 1 ) {				// start threads to sum rows
 		adders[r] = &(*malloc()){ matrix[r], cols, subtotals[r] };
 //		adders[r] = new( matrix[r], cols, &subtotals[r] );
-    } // for
-    for ( int r = 0; r < rows; r += 1 ) {				// wait for threads to finish
+	} // for
+	for ( int r = 0; r < rows; r += 1 ) {				// wait for threads to finish
 		delete( adders[r] );
 		total += subtotals[r];							// total subtotals
-    } // for
-    sout | total | endl;
+	} // for
+	sout | total | endl;
 }
 
Index: src/tests/concurrent/signal/block.c
===================================================================
--- src/tests/concurrent/signal/block.c	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/concurrent/signal/block.c	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -14,10 +14,4 @@
 #include <time>
 
-#ifdef LONG_TEST
-static const unsigned long N = 150_000ul;
-#else
-static const unsigned long N = 5_000ul;
-#endif
-
 #ifndef PREEMPTION_RATE
 #define PREEMPTION_RATE 10`ms
@@ -27,4 +21,10 @@
 	return PREEMPTION_RATE;
 }
+
+#ifdef LONG_TEST
+static const unsigned long N = 150_000ul;
+#else
+static const unsigned long N = 5_000ul;
+#endif
 
 enum state_t { WAITED, SIGNAL, BARGE };
Index: src/tests/concurrent/signal/disjoint.c
===================================================================
--- src/tests/concurrent/signal/disjoint.c	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/concurrent/signal/disjoint.c	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -4,10 +4,4 @@
 #include <thread>
 #include <time>
-
-#ifdef LONG_TEST
-static const unsigned long N = 300_000ul;
-#else
-static const unsigned long N = 10_000ul;
-#endif
 
 #ifndef PREEMPTION_RATE
@@ -18,4 +12,10 @@
 	return PREEMPTION_RATE;
 }
+
+#ifdef LONG_TEST
+static const unsigned long N = 300_000ul;
+#else
+static const unsigned long N = 10_000ul;
+#endif
 
 enum state_t { WAIT, SIGNAL, BARGE };
Index: src/tests/concurrent/signal/wait.c
===================================================================
--- src/tests/concurrent/signal/wait.c	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/concurrent/signal/wait.c	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -12,10 +12,4 @@
 #include <time>
 
-#ifdef LONG_TEST
-static const unsigned long N = 375_000ul;
-#else
-static const unsigned long N = 2_500ul;
-#endif
-
 #ifndef PREEMPTION_RATE
 #define PREEMPTION_RATE 10`ms
@@ -25,4 +19,10 @@
 	return PREEMPTION_RATE;
 }
+
+#ifdef LONG_TEST
+static const unsigned long N = 375_000ul;
+#else
+static const unsigned long N = 2_500ul;
+#endif
 
 monitor global_t {};
Index: src/tests/io.c
===================================================================
--- src/tests/io.c	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ 	(revision )
@@ -1,184 +1,0 @@
-// 
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-// 
-// io.c -- 
-// 
-// Author           : Peter A. Buhr
-// Created On       : Wed Mar  2 16:56:02 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jan 26 15:19:34 2018
-// Update Count     : 100
-// 
-
-#include <fstream>
-
-int main() {
-	_Bool b;											// basic types
-	char c;
-	signed char sc;
-	unsigned char usc;
-	short int si;
-	unsigned short int usi;
-	int i;
-	unsigned int ui;
-	long int li;
-	unsigned long int uli;
-	long long int lli;
-	unsigned long long int ulli;
-	float f;
-	double d;
-	long double ld;
-	float _Complex fc;
-	double _Complex dc;
-	long double _Complex ldc;
-	enum { size = 10 };
-	char s1[size], s2[size];
-
-	int x = 3, y = 5, z = 7;
-	sout | x * 3 | y + 1 | z << 2 | x == y | (x | y) | (x || y) | (x > z ? 1 : 2) | endl;
-	sout | 1 | 2 | 3 | endl;
-	sout | '1' | '2' | '3' | endl;
-	sout | 1 | "" | 2 | "" | 3 | endl;
-	sout | endl;
-
-	sout | "opening delimiters" | endl;
-	sout
-		 | "x (" | 1
-		 | "x [" | 2
-		 | "x {" | 3
-		 | "x =" | 4
-		 | "x $" | 5
-		 | "x £" | 6
-		 | "x ¥" | 7
-		 | "x ¡" | 8
-		 | "x ¿" | 9
-		 | "x «" | 10
-		 | endl | endl;
-
-	sout | "closing delimiters" | endl;
-	sout
-		 | 1 | ", x"
-		 | 2 | ". x"
-		 | 3 | "; x"
-		 | 4 | "! x"
-		 | 5 | "? x"
-		 | 6 | "% x"
-		 | 7 | "¢ x"
-		 | 8 | "» x"
-		 | 9 | ") x"
-		 | 10 | "] x"
-		 | 11 | "} x"
-		 | endl | endl;
-
-	sout | "opening/closing delimiters" | endl;
-	sout
-		 | "x`" | 1 | "`x'" | 2
-		 | "'x\"" | 3 | "\"x:" | 4
-		 | ":x " | 5 | " x\t" | 6
-		 | "\tx\f" | 7 | "\fx\v" | 8
-		 | "\vx\n" | 9 | "\nx\r" | 10
-		 | "\rx"
-		 | endl | endl;
-
-	sout | "override opening/closing delimiters" | endl;
-	sout | "x ( " | 1 | " ) x" | 2 | " , x" | 3 | " :x: " | 4 | endl;
-	sout | endl;
-
-	ifstream in = { "io.data" };						// create / open file
-
-	sout | "input bacis types" | endl;
-	in	 | b											// boolean
-		 | c | sc | usc									// character
-		 | si | usi | i | ui | li | uli | lli | ulli	// integral
-		 | f | d | ld									// floating point
-		 | fc | dc | ldc								// floating-point complex
-		 | cstr( s1 ) | cstr( s2, size );				// C string, length unchecked and checked
-	sout | endl;
-
-	sout | "output basic types" | endl;
-	sout | b | endl										// boolean
-		 | c | ' ' | sc | ' ' | usc | endl				// character
-		 | si | usi | i | ui | li | uli | lli | ulli | endl // integral
-		 | f | d | ld | endl							// floating point
-		 | fc | dc | ldc | endl;						// complex
-	sout | endl;
-
-	sout | "tuples" | endl;
-	[int, [ int, int ] ] t1 = [ 1, [ 2, 3 ] ], t2 = [ 4, [ 5, 6 ] ];
-	sout | t1 | t2 | endl;								// print tuple
-	sout | endl;
-
-	sout | "toggle separator" | endl;
-	sout | f | "" | d | "" | ld | endl					// floating point without separator
-		 | sepDisable | fc | dc | ldc | endl			// complex without separator
-		 | fc | sepOn | dc | ldc | endl					// local separator add
-		 | sepEnable | fc | dc | ldc | endl				// complex with separator
-		 | fc | sepOff | dc | ldc | endl				// local separator removal
-		 | s1 | sepOff | s2 | endl						// local separator removal
-		 | s1 | "" | s2 | endl;							// local separator removal
-	sout | endl;
-
-	sout | "change separator" | endl;
-	sout | "from \"" | sep | "\"";
-	sepSet( sout, ", $" );								// change separator, maximum of 15 characters
-	sout | " to \"" | sep | "\"" | endl;
-	sout | f | d | ld | endl
-		 | fc | dc | ldc | endl
-		 | s1 | s2 | endl
-		 | t1 | t2 | endl;								// print tuple
-	sout | endl;
-	sout | "from \"" | sep | "\" ";
-	sepSet( sout, " " );								// restore separator
-	sout | "to \"" | sep | "\"" | endl;
-	sout | f | d | ld | endl
-		 | fc | dc | ldc | endl
-		 | s1 | s2 | endl
-		 | t1 | t2 | endl;								// print tuple
-	sout | endl;
-
-	sout | "check sepOn/sepOff" | endl;
-	sout | sepOn | 1 | 2 | 3 | sepOn | endl;			// no separator at start/end of line
-	sout | 1 | sepOff | 2 | 3 | endl;					// locally turn off implicit separator
-	sout | sepOn | sepOn | 1 | 2 | 3 | sepOn | sepOff | sepOn | '\n'; // no separator at start/end of line
-	sout | 1 | 2 | 3 | "\n\n" | sepOn;					// no separator at start of next line
-	sout | 1 | 2 | 3 | endl;
-	sout | endl;
-
-	sout | "check enable/disable" | endl;
-	sout | sepDisable | 1 | 2 | 3 | endl;				// globally turn off implicit separation
-	sout | 1 | sepOn | 2 | 3 | endl;					// locally turn on implicit separator
-	sout | sepEnable | 1 | 2 | 3 | endl | sepDisable;	// globally turn on/off implicit separation
-	sout | 1 | 2 | 3 | endl | sepEnable;				// globally turn on implicit separation
-	sout | 1 | 2 | 3 | sepOn | sepDisable | endl;		// ignore seperate at end of line
-	sout | 1 | 2 | 3 | sepOn | sepEnable | endl;		// separator at end of line
-	sout | 1 | 2 | 3 | endl;
-	sout | endl;
-
-//	sout | fmt( d, "%8.3f" ) || endl;
-//	sout | endl;
-
-	sepSetTuple( sout, " " );							// set tuple separator from ", " to " "
-	sout | t1 | t2 | " \"" | sep | "\"" | endl;
-	sepSetTuple( sout, ", " );							// reset tuple separator to ", "
-	sout | t1 | t2 | " \"" | sep | "\"" | endl;
-	sout | t1 | t2 | endl;								// print tuple
-	sout | endl;
-
-	[int, int, const char *, double] t3 = { 3, 4, "a", 7.2 };
-	sout | [ 3, 4, "a", 7.2 ] | endl;
-	sout | t3 | endl;
-	sepSetTuple( sout, " " );
-	sout | t3 | endl;
-	sout | sepOn | t3 | sepDisable | t3 | sepEnable | t3 | endl;
-	sepSet( sout, "^" );
-	sepSetTuple( sout, "-" );
-	sout | t3 | 3 | 4 | t3 | endl;
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa io.c" //
-// End: //
Index: src/tests/io1.c
===================================================================
--- src/tests/io1.c	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
+++ src/tests/io1.c	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -0,0 +1,73 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// io1.c -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Wed Mar  2 16:56:02 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu May 24 21:17:56 2018
+// Update Count     : 104
+// 
+
+#include <fstream>
+
+int main() {
+	int x = 3, y = 5, z = 7;
+	sout | x * 3 | y + 1 | z << 2 | x == y | (x | y) | (x || y) | (x > z ? 1 : 2) | endl;
+	sout | 1 | 2 | 3 | endl;
+	sout | '1' | '2' | '3' | endl;
+	sout | 1 | "" | 2 | "" | 3 | endl;
+	sout | endl;
+
+	sout | "opening delimiters" | endl;
+	sout
+		 | "x (" | 1
+		 | "x [" | 2
+		 | "x {" | 3
+		 | "x =" | 4
+		 | "x $" | 5
+		 | "x £" | 6
+		 | "x ¥" | 7
+		 | "x ¡" | 8
+		 | "x ¿" | 9
+		 | "x «" | 10
+		 | endl | endl;
+
+	sout | "closing delimiters" | endl;
+	sout
+		 | 1 | ", x"
+		 | 2 | ". x"
+		 | 3 | "; x"
+		 | 4 | "! x"
+		 | 5 | "? x"
+		 | 6 | "% x"
+		 | 7 | "¢ x"
+		 | 8 | "» x"
+		 | 9 | ") x"
+		 | 10 | "] x"
+		 | 11 | "} x"
+		 | endl | endl;
+
+	sout | "opening/closing delimiters" | endl;
+	sout
+		 | "x`" | 1 | "`x'" | 2
+		 | "'x\"" | 3 | "\"x:" | 4
+		 | ":x " | 5 | " x\t" | 6
+		 | "\tx\f" | 7 | "\fx\v" | 8
+		 | "\vx\n" | 9 | "\nx\r" | 10
+		 | "\rx"
+		 | endl | endl;
+
+	sout | "override opening/closing delimiters" | endl;
+	sout | "x ( " | 1 | " ) x" | 2 | " , x" | 3 | " :x: " | 4 | endl;
+	sout | endl;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa io1.c" //
+// End: //
Index: src/tests/io2.c
===================================================================
--- src/tests/io2.c	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
+++ src/tests/io2.c	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -0,0 +1,134 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// io2.c -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Wed Mar  2 16:56:02 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu May 24 21:17:41 2018
+// Update Count     : 103
+// 
+
+#include <fstream>
+
+int main() {
+	_Bool b;											// basic types
+	char c;
+	signed char sc;
+	unsigned char usc;
+	short int si;
+	unsigned short int usi;
+	int i;
+	unsigned int ui;
+	long int li;
+	unsigned long int uli;
+	long long int lli;
+	unsigned long long int ulli;
+	float f;
+	double d;
+	long double ld;
+	float _Complex fc;
+	double _Complex dc;
+	long double _Complex ldc;
+	enum { size = 10 };
+	char s1[size], s2[size];
+
+	ifstream in = { "io.data" };						// create / open file
+
+	sout | "input bacis types" | endl;
+	in	 | b											// boolean
+		 | c | sc | usc									// character
+		 | si | usi | i | ui | li | uli | lli | ulli	// integral
+		 | f | d | ld									// floating point
+		 | fc | dc | ldc								// floating-point complex
+		 | cstr( s1 ) | cstr( s2, size );				// C string, length unchecked and checked
+	sout | endl;
+
+	sout | "output basic types" | endl;
+	sout | b | endl										// boolean
+		 | c | ' ' | sc | ' ' | usc | endl				// character
+		 | si | usi | i | ui | li | uli | lli | ulli | endl // integral
+		 | f | d | ld | endl							// floating point
+		 | fc | dc | ldc | endl;						// complex
+	sout | endl;
+
+	sout | "tuples" | endl;
+	[int, [ int, int ] ] t1 = [ 1, [ 2, 3 ] ], t2 = [ 4, [ 5, 6 ] ];
+	sout | t1 | t2 | endl;								// print tuple
+	sout | endl;
+
+	sout | "toggle separator" | endl;
+	sout | f | "" | d | "" | ld | endl					// floating point without separator
+		 | sepDisable | fc | dc | ldc | endl			// complex without separator
+		 | fc | sepOn | dc | ldc | endl					// local separator add
+		 | sepEnable | fc | dc | ldc | endl				// complex with separator
+		 | fc | sepOff | dc | ldc | endl				// local separator removal
+		 | s1 | sepOff | s2 | endl						// local separator removal
+		 | s1 | "" | s2 | endl;							// local separator removal
+	sout | endl;
+
+	sout | "change separator" | endl;
+	sout | "from \"" | sep | "\"";
+	sepSet( sout, ", $" );								// change separator, maximum of 15 characters
+	sout | " to \"" | sep | "\"" | endl;
+	sout | f | d | ld | endl
+		 | fc | dc | ldc | endl
+		 | s1 | s2 | endl
+		 | t1 | t2 | endl;								// print tuple
+	sout | endl;
+	sout | "from \"" | sep | "\" ";
+	sepSet( sout, " " );								// restore separator
+	sout | "to \"" | sep | "\"" | endl;
+	sout | f | d | ld | endl
+		 | fc | dc | ldc | endl
+		 | s1 | s2 | endl
+		 | t1 | t2 | endl;								// print tuple
+	sout | endl;
+
+	sout | "check sepOn/sepOff" | endl;
+	sout | sepOn | 1 | 2 | 3 | sepOn | endl;			// no separator at start/end of line
+	sout | 1 | sepOff | 2 | 3 | endl;					// locally turn off implicit separator
+	sout | sepOn | sepOn | 1 | 2 | 3 | sepOn | sepOff | sepOn | '\n'; // no separator at start/end of line
+	sout | 1 | 2 | 3 | "\n\n" | sepOn;					// no separator at start of next line
+	sout | 1 | 2 | 3 | endl;
+	sout | endl;
+
+	sout | "check enable/disable" | endl;
+	sout | sepDisable | 1 | 2 | 3 | endl;				// globally turn off implicit separation
+	sout | 1 | sepOn | 2 | 3 | endl;					// locally turn on implicit separator
+	sout | sepEnable | 1 | 2 | 3 | endl | sepDisable;	// globally turn on/off implicit separation
+	sout | 1 | 2 | 3 | endl | sepEnable;				// globally turn on implicit separation
+	sout | 1 | 2 | 3 | sepOn | sepDisable | endl;		// ignore seperate at end of line
+	sout | 1 | 2 | 3 | sepOn | sepEnable | endl;		// separator at end of line
+	sout | 1 | 2 | 3 | endl;
+	sout | endl;
+
+//	sout | fmt( d, "%8.3f" ) || endl;
+//	sout | endl;
+
+	sepSetTuple( sout, " " );							// set tuple separator from ", " to " "
+	sout | t1 | t2 | " \"" | sep | "\"" | endl;
+	sepSetTuple( sout, ", " );							// reset tuple separator to ", "
+	sout | t1 | t2 | " \"" | sep | "\"" | endl;
+	sout | t1 | t2 | endl;								// print tuple
+	sout | endl;
+
+	[int, int, const char *, double] t3 = { 3, 4, "a", 7.2 };
+	sout | [ 3, 4, "a", 7.2 ] | endl;
+	sout | t3 | endl;
+	sepSetTuple( sout, " " );
+	sout | t3 | endl;
+	sout | sepOn | t3 | sepDisable | t3 | sepEnable | t3 | endl;
+	sepSet( sout, "^" );
+	sepSetTuple( sout, "-" );
+	sout | t3 | 3 | 4 | t3 | endl;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa io2.c" //
+// End: //
Index: src/tests/math1.c
===================================================================
--- src/tests/math1.c	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/math1.c	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -10,6 +10,6 @@
 // Created On       : Fri Apr 22 14:59:21 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Aug 11 15:16:41 2017
-// Update Count     : 84
+// Last Modified On : Thu May 24 21:01:15 2018
+// Update Count     : 85
 // 
 
@@ -48,17 +48,4 @@
     sout | "\\" | b | b \ e | endl;
     sout | "\\" | 'a' \ 3u | 2 \ 8u | 4 \ 3u | -4 \ 3u | 4 \ -3 | -4 \ -3 | 4.0 \ 2.1 | (1.0f+2.0fi) \ (3.0f+2.0fi) | endl;
-
-	//---------------------- Logarithm ----------------------
-
-	sout | "log:" | log( 1.0F ) | log( 1.0D ) | log( 1.0L ) | log( 1.0F+1.0FI ) | log( 1.0D+1.0DI ) | log( 1.0DL+1.0LI ) | endl;
-	sout | "log2:" | log2( 8.0F ) | log2( 8.0D ) | log2( 8.0L ) | endl;
-	sout | "log10:" | log10( 100.0F ) | log10( 100.0D ) | log10( 100.0L ) | endl;
-	sout | "log1p:" | log1p( 1.0F ) | log1p( 1.0D ) | log1p( 1.0L ) | endl;
-	sout | "ilogb:" | ilogb( 1.0F ) | ilogb( 1.0D ) | ilogb( 1.0L ) | endl;
-	sout | "logb:" | logb( 8.0F ) | logb( 8.0D ) | logb( 8.0L ) | endl;
-
-	sout | "sqrt:" | sqrt( 1.0F ) | sqrt( 1.0D ) | sqrt( 1.0L ) | sqrt( 1.0F+1.0FI ) | sqrt( 1.0D+1.0DI ) | sqrt( 1.0DL+1.0LI ) | endl;
-	sout | "cbrt:" | cbrt( 27.0F ) | cbrt( 27.0D ) | cbrt( 27.0L ) | endl;
-	sout | "hypot:" | hypot( 1.0F, -1.0F ) | hypot( 1.0D, -1.0D ) | hypot( 1.0L, -1.0L ) | endl;
 } // main
 
Index: src/tests/math2.c
===================================================================
--- src/tests/math2.c	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/math2.c	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -10,6 +10,6 @@
 // Created On       : Fri Apr 22 14:59:21 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Aug 11 15:40:04 2017
-// Update Count     : 81
+// Last Modified On : Thu May 24 21:06:10 2018
+// Update Count     : 82
 // 
 
@@ -21,4 +21,17 @@
 	double d;
 	long double l;
+
+	//---------------------- Logarithm ----------------------
+
+	sout | "log:" | log( 1.0F ) | log( 1.0D ) | log( 1.0L ) | log( 1.0F+1.0FI ) | log( 1.0D+1.0DI ) | log( 1.0DL+1.0LI ) | endl;
+	sout | "log2:" | log2( 8.0F ) | log2( 8.0D ) | log2( 8.0L ) | endl;
+	sout | "log10:" | log10( 100.0F ) | log10( 100.0D ) | log10( 100.0L ) | endl;
+	sout | "log1p:" | log1p( 1.0F ) | log1p( 1.0D ) | log1p( 1.0L ) | endl;
+	sout | "ilogb:" | ilogb( 1.0F ) | ilogb( 1.0D ) | ilogb( 1.0L ) | endl;
+	sout | "logb:" | logb( 8.0F ) | logb( 8.0D ) | logb( 8.0L ) | endl;
+
+	sout | "sqrt:" | sqrt( 1.0F ) | sqrt( 1.0D ) | sqrt( 1.0L ) | sqrt( 1.0F+1.0FI ) | sqrt( 1.0D+1.0DI ) | sqrt( 1.0DL+1.0LI ) | endl;
+	sout | "cbrt:" | cbrt( 27.0F ) | cbrt( 27.0D ) | cbrt( 27.0L ) | endl;
+	sout | "hypot:" | hypot( 1.0F, -1.0F ) | hypot( 1.0D, -1.0D ) | hypot( 1.0L, -1.0L ) | endl;
 
 	//---------------------- Trigonometric ----------------------
@@ -32,27 +45,4 @@
 	sout | "atan2:" | atan2( 1.0F, 1.0F ) | atan2( 1.0D, 1.0D ) | atan2( 1.0L, 1.0L );
 	sout | "atan:" | atan( 1.0F, 1.0F ) | atan( 1.0D, 1.0D ) | atan( 1.0L, 1.0L ) | endl;
-
-	//---------------------- Hyperbolic ----------------------
-
-	sout | "sinh:" | sinh( 1.0F ) | sinh( 1.0D ) | sinh( 1.0L ) | sinh( 1.0F+1.0FI ) | sinh( 1.0D+1.0DI ) | sinh( 1.0DL+1.0LI ) | endl;
-	sout | "cosh:" | cosh( 1.0F ) | cosh( 1.0D ) | cosh( 1.0L ) | cosh( 1.0F+1.0FI ) | cosh( 1.0D+1.0DI ) | cosh( 1.0DL+1.0LI ) | endl;
-	sout | "tanh:" | tanh( 1.0F ) | tanh( 1.0D ) | tanh( 1.0L ) | tanh( 1.0F+1.0FI ) | tanh( 1.0D+1.0DI ) | tanh( 1.0DL+1.0LI ) | endl;
-	sout | "acosh:" | acosh( 1.0F ) | acosh( 1.0D ) | acosh( 1.0L ) | acosh( 1.0F+1.0FI ) | acosh( 1.0D+1.0DI ) | acosh( 1.0DL+1.0LI ) | endl;
-	sout | "asinh:" | asinh( 1.0F ) | asinh( 1.0D ) | asinh( 1.0L ) | asinh( 1.0F+1.0FI ) | asinh( 1.0D+1.0DI ) | asinh( 1.0DL+1.0LI ) | endl;
-	sout | "atanh:" | atanh( 1.0F ) | atanh( 1.0D ) | atanh( 1.0L ) | atanh( 1.0F+1.0FI ) | atanh( 1.0D+1.0DI ) | atanh( 1.0DL+1.0LI ) | endl;
-
-	//---------------------- Error / Gamma ----------------------
-
-	sout | "erf:" | erf( 1.0F ) | erf( 1.0D ) | erf( 1.0L ) | endl;
-	sout | "erfc:" | erfc( 1.0F ) | erfc( 1.0D ) | erfc( 1.0L ) | endl;
-	sout | "lgamma:" | lgamma( 4.0F ) | lgamma( 4.0D ) | lgamma( 4.0L ) | endl;
-	int sign;
-	f = lgamma( 4.0F, &sign );
-	sout | "lgamma:" | f | sign;
-	d = lgamma( 4.0D, &sign );
-	sout | d | sign;
-	l = lgamma( 4.0L, &sign );
-	sout | l | sign | endl;
-	sout | "tgamma:" | tgamma( 4.0F ) | tgamma( 4.0D ) | tgamma( 4.0L ) | endl;
 } // main
 
Index: src/tests/math3.c
===================================================================
--- src/tests/math3.c	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/math3.c	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -10,6 +10,6 @@
 // Created On       : Fri Apr 22 14:59:21 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Aug 11 15:40:03 2017
-// Update Count     : 81
+// Last Modified On : Thu May 24 21:06:12 2018
+// Update Count     : 82
 // 
 
@@ -22,47 +22,26 @@
 	long double l;
 
-	//---------------------- Nearest Integer ----------------------
+	//---------------------- Hyperbolic ----------------------
 
-	sout | "floor:" | floor( 1.2F ) | floor( 1.2D ) | floor( 1.2L ) | endl;
-	sout | "ceil:" | ceil( 1.6F ) | ceil( 1.6D ) | ceil( 1.6L ) | endl;
-	sout | "trunc:" | trunc( 3.5F ) | trunc( 3.5D ) | trunc( 3.5L ) | endl;
-	sout | "rint:" | (float)rint( 1.5F ) | (double)rint( 1.5D ) | (long double)rint( 1.5L ) | endl;
-	sout | "rint:" | (long int)rint( 1.5F ) | (long int)rint( 1.5D ) | (long int)rint( 1.5L ) | endl;
-	sout | "rint:" | (long long int)rint( 1.5F ) | (long long int)rint( 1.5D ) | (long long int)rint( 1.5L ) | endl;
-	sout | "lrint:" | lrint( 1.5F ) | lrint( 1.5D ) | lrint( 1.5L ) | endl;
-	sout | "llrint:" | llrint( 1.5F ) | llrint( 1.5D ) | llrint( 1.5L ) | endl;
-	sout | "nearbyint:" | nearbyint( 3.5F ) | nearbyint( 3.5D ) | nearbyint( 3.5L ) | endl;
-	sout | "round:" | (float)round( 1.5F ) | (double)round( 1.5D ) | (long double)round( 1.5L ) | endl;
-	sout | "round:" | (long int)round( 1.5F ) | (long int)round( 1.5D ) | (long int)round( 1.5L ) | endl;
-	sout | "round:" | (long long int)round( 1.5F ) | (long long int)round( 1.5D ) | (long long int)round( 1.5L ) | endl;
-	sout | "lround:" | lround( 1.5F ) | lround( 1.5D ) | lround( 1.5L ) | endl;
-	sout | "llround:" | llround( 1.5F ) | llround( 1.5D ) | llround( 1.5L ) | endl;
+	sout | "sinh:" | sinh( 1.0F ) | sinh( 1.0D ) | sinh( 1.0L ) | sinh( 1.0F+1.0FI ) | sinh( 1.0D+1.0DI ) | sinh( 1.0DL+1.0LI ) | endl;
+	sout | "cosh:" | cosh( 1.0F ) | cosh( 1.0D ) | cosh( 1.0L ) | cosh( 1.0F+1.0FI ) | cosh( 1.0D+1.0DI ) | cosh( 1.0DL+1.0LI ) | endl;
+	sout | "tanh:" | tanh( 1.0F ) | tanh( 1.0D ) | tanh( 1.0L ) | tanh( 1.0F+1.0FI ) | tanh( 1.0D+1.0DI ) | tanh( 1.0DL+1.0LI ) | endl;
+	sout | "acosh:" | acosh( 1.0F ) | acosh( 1.0D ) | acosh( 1.0L ) | acosh( 1.0F+1.0FI ) | acosh( 1.0D+1.0DI ) | acosh( 1.0DL+1.0LI ) | endl;
+	sout | "asinh:" | asinh( 1.0F ) | asinh( 1.0D ) | asinh( 1.0L ) | asinh( 1.0F+1.0FI ) | asinh( 1.0D+1.0DI ) | asinh( 1.0DL+1.0LI ) | endl;
+	sout | "atanh:" | atanh( 1.0F ) | atanh( 1.0D ) | atanh( 1.0L ) | atanh( 1.0F+1.0FI ) | atanh( 1.0D+1.0DI ) | atanh( 1.0DL+1.0LI ) | endl;
 
-	//---------------------- Manipulation ----------------------
+	//---------------------- Error / Gamma ----------------------
 
-	sout | "copysign:" | copysign( 1.0F, -1.0F ) | copysign( 1.0D, -1.0D ) | copysign( 1.0L, -1.0L ) | endl;
-	int exp;
-	f = frexp( 4.0F, &exp );
-	sout | "frexp:" | f | exp;
-	d = frexp( 4.0D, &exp );
-	sout | d | exp;
-	l = frexp( 4.0L, &exp );
-	sout | l | exp | endl;
-	sout | "ldexp:" | ldexp( 2.0F, 2 ) | ldexp( 2.0D, 2 ) | ldexp( 2.0L, 2 ) | endl;
-	float fi;
-	double di;
-	long double ldi;
-	f = modf( 2.3F, &fi );
-	sout | "modf:" | fi | f;
-	d = modf( 2.3D, &di );
-	sout | di | d;
-	l = modf( 2.3L, &ldi );
-	sout | ldi | l | endl;
-	sout | "modf:" | modf( 2.3F ) | modf( 2.3D ) | modf( 2.3L ) | endl;
-	sout | "nextafter:" | nextafter( 2.0F, 3.0F ) | nextafter( 2.0D, 3.0D ) | nextafter( 2.0L, 3.0L ) | endl;
-	sout | "nexttoward:" | nexttoward( 2.0F, 3.0F ) | nexttoward( 2.0D, 3.0D ) | nexttoward( 2.0L, 3.0L ) | endl;
-
-	sout | "scalbn:" | scalbn( 2.0F, 3 ) | scalbn( 2.0D, 3 ) | scalbn( 2.0L, 3 ) | endl;
-	sout | "scalbln:" | scalbln( 2.0F, 3L ) | scalbln( 2.0D, 3L ) | scalbln( 2.0L, 3L ) | endl;
+	sout | "erf:" | erf( 1.0F ) | erf( 1.0D ) | erf( 1.0L ) | endl;
+	sout | "erfc:" | erfc( 1.0F ) | erfc( 1.0D ) | erfc( 1.0L ) | endl;
+	sout | "lgamma:" | lgamma( 4.0F ) | lgamma( 4.0D ) | lgamma( 4.0L ) | endl;
+	int sign;
+	f = lgamma( 4.0F, &sign );
+	sout | "lgamma:" | f | sign;
+	d = lgamma( 4.0D, &sign );
+	sout | d | sign;
+	l = lgamma( 4.0L, &sign );
+	sout | l | sign | endl;
+	sout | "tgamma:" | tgamma( 4.0F ) | tgamma( 4.0D ) | tgamma( 4.0L ) | endl;
 } // main
 
Index: src/tests/math4.c
===================================================================
--- src/tests/math4.c	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
+++ src/tests/math4.c	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -0,0 +1,72 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// math4.c -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Thu May 24 20:56:54 2018
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu May 24 20:58:06 2018
+// Update Count     : 2
+// 
+
+#include <fstream>
+#include <math>
+
+int main( void ) {
+	float f;
+	double d;
+	long double l;
+
+	//---------------------- Nearest Integer ----------------------
+
+	sout | "floor:" | floor( 1.2F ) | floor( 1.2D ) | floor( 1.2L ) | endl;
+	sout | "ceil:" | ceil( 1.6F ) | ceil( 1.6D ) | ceil( 1.6L ) | endl;
+	sout | "trunc:" | trunc( 3.5F ) | trunc( 3.5D ) | trunc( 3.5L ) | endl;
+	sout | "rint:" | (float)rint( 1.5F ) | (double)rint( 1.5D ) | (long double)rint( 1.5L ) | endl;
+	sout | "rint:" | (long int)rint( 1.5F ) | (long int)rint( 1.5D ) | (long int)rint( 1.5L ) | endl;
+	sout | "rint:" | (long long int)rint( 1.5F ) | (long long int)rint( 1.5D ) | (long long int)rint( 1.5L ) | endl;
+	sout | "lrint:" | lrint( 1.5F ) | lrint( 1.5D ) | lrint( 1.5L ) | endl;
+	sout | "llrint:" | llrint( 1.5F ) | llrint( 1.5D ) | llrint( 1.5L ) | endl;
+	sout | "nearbyint:" | nearbyint( 3.5F ) | nearbyint( 3.5D ) | nearbyint( 3.5L ) | endl;
+	sout | "round:" | (float)round( 1.5F ) | (double)round( 1.5D ) | (long double)round( 1.5L ) | endl;
+	sout | "round:" | (long int)round( 1.5F ) | (long int)round( 1.5D ) | (long int)round( 1.5L ) | endl;
+	sout | "round:" | (long long int)round( 1.5F ) | (long long int)round( 1.5D ) | (long long int)round( 1.5L ) | endl;
+	sout | "lround:" | lround( 1.5F ) | lround( 1.5D ) | lround( 1.5L ) | endl;
+	sout | "llround:" | llround( 1.5F ) | llround( 1.5D ) | llround( 1.5L ) | endl;
+
+	//---------------------- Manipulation ----------------------
+
+	sout | "copysign:" | copysign( 1.0F, -1.0F ) | copysign( 1.0D, -1.0D ) | copysign( 1.0L, -1.0L ) | endl;
+	int exp;
+	f = frexp( 4.0F, &exp );
+	sout | "frexp:" | f | exp;
+	d = frexp( 4.0D, &exp );
+	sout | d | exp;
+	l = frexp( 4.0L, &exp );
+	sout | l | exp | endl;
+	sout | "ldexp:" | ldexp( 2.0F, 2 ) | ldexp( 2.0D, 2 ) | ldexp( 2.0L, 2 ) | endl;
+	float fi;
+	double di;
+	long double ldi;
+	f = modf( 2.3F, &fi );
+	sout | "modf:" | fi | f;
+	d = modf( 2.3D, &di );
+	sout | di | d;
+	l = modf( 2.3L, &ldi );
+	sout | ldi | l | endl;
+	sout | "modf:" | modf( 2.3F ) | modf( 2.3D ) | modf( 2.3L ) | endl;
+	sout | "nextafter:" | nextafter( 2.0F, 3.0F ) | nextafter( 2.0D, 3.0D ) | nextafter( 2.0L, 3.0L ) | endl;
+	sout | "nexttoward:" | nexttoward( 2.0F, 3.0F ) | nexttoward( 2.0D, 3.0D ) | nexttoward( 2.0L, 3.0L ) | endl;
+
+	sout | "scalbn:" | scalbn( 2.0F, 3 ) | scalbn( 2.0D, 3 ) | scalbn( 2.0L, 3 ) | endl;
+	sout | "scalbln:" | scalbln( 2.0F, 3L ) | scalbln( 2.0D, 3L ) | scalbln( 2.0L, 3L ) | endl;
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa math3.c" //
+// End: //
Index: src/tests/preempt_longrun/Makefile.am
===================================================================
--- src/tests/preempt_longrun/Makefile.am	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/preempt_longrun/Makefile.am	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -17,5 +17,5 @@
 repeats=10
 max_time=600
-preempt=1_000ul
+preempt=10ul\`ms
 debug=-debug
 
Index: src/tests/preempt_longrun/Makefile.in
===================================================================
--- src/tests/preempt_longrun/Makefile.in	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/preempt_longrun/Makefile.in	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -450,5 +450,5 @@
 repeats = 10
 max_time = 600
-preempt = 1_000ul
+preempt = 10ul\`ms
 debug = -debug
 REPEAT = ${abs_top_srcdir}/tools/repeat
Index: src/tests/preempt_longrun/create.c
===================================================================
--- src/tests/preempt_longrun/create.c	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/preempt_longrun/create.c	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -1,9 +1,8 @@
 #include <kernel>
 #include <thread>
-
-static const unsigned long N = 60_000ul;
+#include <time>
 
 #ifndef PREEMPTION_RATE
-#define PREEMPTION_RATE 10`ms
+#error PREEMPTION_RATE not defined in makefile
 #endif
 
@@ -11,4 +10,6 @@
 	return PREEMPTION_RATE;
 }
+
+static const unsigned long N = 60_000ul;
 
 thread worker_t {};
Index: src/tests/preempt_longrun/enter.c
===================================================================
--- src/tests/preempt_longrun/enter.c	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/preempt_longrun/enter.c	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -2,9 +2,8 @@
 #include <monitor>
 #include <thread>
-
-static const unsigned long N  = 2_100_000ul;
+#include <time>
 
 #ifndef PREEMPTION_RATE
-#define PREEMPTION_RATE 10`ms
+#error PREEMPTION_RATE not defined in makefile
 #endif
 
@@ -12,4 +11,6 @@
 	return PREEMPTION_RATE;
 }
+
+static const unsigned long N  = 2_100_000ul;
 
 monitor mon_t {};
Index: src/tests/preempt_longrun/enter3.c
===================================================================
--- src/tests/preempt_longrun/enter3.c	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/preempt_longrun/enter3.c	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -2,9 +2,8 @@
 #include <monitor>
 #include <thread>
-
-static const unsigned long N  = 500_000ul;
+#include <time>
 
 #ifndef PREEMPTION_RATE
-#define PREEMPTION_RATE 10`ms
+#error PREEMPTION_RATE not defined in makefile
 #endif
 
@@ -12,4 +11,6 @@
 	return PREEMPTION_RATE;
 }
+
+static const unsigned long N  = 500_000ul;
 
 monitor mon_t {};
Index: src/tests/preempt_longrun/processor.c
===================================================================
--- src/tests/preempt_longrun/processor.c	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/preempt_longrun/processor.c	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -1,9 +1,8 @@
 #include <kernel>
 #include <thread>
-
-static const unsigned long N = 5_000ul;
+#include <time>
 
 #ifndef PREEMPTION_RATE
-#define PREEMPTION_RATE 10`ms
+#error PREEMPTION_RATE not defined in makefile
 #endif
 
@@ -11,4 +10,6 @@
 	return PREEMPTION_RATE;
 }
+
+static const unsigned long N = 5_000ul;
 
 int main(int argc, char* argv[]) {
Index: src/tests/preempt_longrun/stack.c
===================================================================
--- src/tests/preempt_longrun/stack.c	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/preempt_longrun/stack.c	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -1,9 +1,9 @@
 #include <kernel>
+#include <math>
 #include <thread>
-
-#include <math>
+#include <time>
 
 #ifndef PREEMPTION_RATE
-#define PREEMPTION_RATE 10`ms
+#error PREEMPTION_RATE not defined in makefile
 #endif
 
Index: src/tests/preempt_longrun/yield.c
===================================================================
--- src/tests/preempt_longrun/yield.c	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/preempt_longrun/yield.c	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -1,4 +1,13 @@
 #include <kernel>
 #include <thread>
+#include <time>
+
+#ifndef PREEMPTION_RATE
+#error PREEMPTION_RATE not defined in makefile
+#endif
+
+Duration default_preemption() {
+	return PREEMPTION_RATE;
+}
 
 #ifdef LONG_TEST
@@ -7,12 +16,4 @@
 static const unsigned long N = 325_000ul;
 #endif
-
-#ifndef PREEMPTION_RATE
-#define PREEMPTION_RATE 10`ms
-#endif
-
-Duration default_preemption() {
-	return PREEMPTION_RATE;
-}
 
 thread worker_t {};
Index: src/tests/test.py
===================================================================
--- src/tests/test.py	(revision 13073be42dba9d23e1eb3322d700f265381ae024)
+++ src/tests/test.py	(revision 8dbedfc9ed34c91b75dbb53a6977634c91f963be)
@@ -78,9 +78,4 @@
 			else :
 				print('ERROR: No expected file for test %s, ignoring it' % testname, file=sys.stderr)
-
-	# make sure we have at least some test to run
-	if not tests :
-		print('ERROR: No valid test to run', file=sys.stderr)
-		sys.exit(1)
 
 	return tests
@@ -266,4 +261,10 @@
 		tests = validTests( options )
 
+	# make sure we have at least some test to run
+	if not tests :
+		print('ERROR: No valid test to run', file=sys.stderr)
+		sys.exit(1)
+
+
 	# sort the test alphabetically for convenience
 	tests.sort(key=lambda t: (t.arch if t.arch else '') + t.target())
