Index: doc/bibliography/pl.bib
===================================================================
--- doc/bibliography/pl.bib	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ doc/bibliography/pl.bib	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -1919,4 +1919,14 @@
     year	= 1965,
     note	= {Reprinted in \cite{Genuys68} pp. 43--112.}
+}
+
+@manual{C++20Coroutine19,
+    keywords	= {coroutine},
+    contributer	= {pabuhr@plg},
+    title	= {Coroutines (C++20)},
+    organization= {cppreference.com},
+    month	= apr,
+    year	= 2019,
+    note	= {\href{https://en.cppreference.com/w/cpp/language/coroutines}{https://\-en.cppreference.com/\-w/\-cpp/\-language/\-coroutines}},
 }
 
Index: libcfa/src/concurrency/coroutine.hfa
===================================================================
--- libcfa/src/concurrency/coroutine.hfa	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ libcfa/src/concurrency/coroutine.hfa	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -117,5 +117,5 @@
 // Resume implementation inlined for performance
 forall(dtype T | is_coroutine(T))
-static inline void resume(T & cor) {
+static inline T & resume(T & cor) {
 	// optimization : read TLS once and reuse it
 	// Safety note: this is preemption safe since if
@@ -145,4 +145,6 @@
 	// always done for performance testing
 	CoroutineCtxSwitch( src, dst );
+
+	return cor;
 }
 
Index: libcfa/src/fstream.cfa
===================================================================
--- libcfa/src/fstream.cfa	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ libcfa/src/fstream.cfa	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Apr 20 12:03:43 2019
-// Update Count     : 311
+// Last Modified On : Thu May 16 08:33:28 2019
+// Update Count     : 328
 //
 
@@ -27,14 +27,14 @@
 #define IO_MSG "I/O error: "
 
-void ?{}( ofstream & os, void * file, bool sepDefault, bool sepOnOff, bool nlOnOff, bool prt, const char * separator, const char * tupleSeparator ) {
+void ?{}( ofstream & os, void * file ) {
 	os.file = file;
-	os.sepDefault = sepDefault;
-	os.sepOnOff = sepOnOff;
-	os.nlOnOff = nlOnOff;
-	os.prt = prt;
+	os.sepDefault = true;
+	os.sepOnOff = false;
+	os.nlOnOff = true;
+	os.prt = false;
 	os.sawNL = false;
-	sepSet( os, separator );
+	sepSet( os, " " );
 	sepSetCur( os, sepGet( os ) );
-	sepSetTuple( os, tupleSeparator );
+	sepSetTuple( os, ", " );
 }
 
@@ -104,5 +104,5 @@
 
 void open( ofstream & os, const char * name, const char * mode ) {
-	FILE *file = fopen( name, mode );
+	FILE * file = fopen( name, mode );
 	#ifdef __CFA_DEBUG__
 	if ( file == 0 ) {
@@ -110,5 +110,5 @@
 	} // if
 	#endif // __CFA_DEBUG__
-	(os){ file, true, false, true, false, " ", ", " };
+	(os){ file };
 } // open
 
@@ -152,9 +152,18 @@
 } // fmt
 
-static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_), true, false, true, false, " ", ", " };
+static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_) };
 ofstream & sout = soutFile;
-static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_), true, false, true, false, " ", ", " };
+static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_) };
 ofstream & serr = serrFile;
 
+// static ofstream sexitFile = { (FILE *)(&_IO_2_1_stdout_) };
+// ofstream & sexit = sexitFile;
+// static ofstream sabortFile = { (FILE *)(&_IO_2_1_stderr_) };
+// ofstream & sabort = sabortFile;
+
+void nl( ofstream & os ) {
+	if ( getANL( os ) ) (ofstream &)(nl( os ));			// implementation only
+	else setPrt( os, false );							// turn off
+}
 
 //---------------------------------------
Index: libcfa/src/fstream.hfa
===================================================================
--- libcfa/src/fstream.hfa	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ libcfa/src/fstream.hfa	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Apr 20 12:03:58 2019
-// Update Count     : 151
+// Last Modified On : Thu May 16 08:34:10 2019
+// Update Count     : 157
 //
 
@@ -70,4 +70,7 @@
 extern ofstream & sout, & serr;
 
+// extern ofstream & sout, & serr, & sexit, & sabort;
+// void nl( ofstream & os );
+
 
 struct ifstream {
Index: libcfa/src/iostream.cfa
===================================================================
--- libcfa/src/iostream.cfa	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ libcfa/src/iostream.cfa	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Apr 20 14:02:43 2019
-// Update Count     : 617
+// Last Modified On : Mon May 13 12:46:45 2019
+// Update Count     : 650
 //
 
@@ -23,4 +23,5 @@
 extern size_t strlen (const char *__s) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
 #include <float.h>										// DBL_DIG, LDBL_DIG
+#include <math.h>										// modff, modf, modlf
 #include <complex.h>									// creal, cimag
 }
@@ -156,4 +157,6 @@
 		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
 		fmt( os, "%g", f );
+		float tempi;
+		if ( isfinite( f ) && modff( f, &tempi ) == 0.0F ) fmt( os, "." ); // always print decimal point
 		return os;
 	} // ?|?
@@ -165,4 +168,7 @@
 		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
 		fmt( os, "%.*lg", DBL_DIG, d );
+		// fmt( os, "%lg", d );
+		double tempi;
+		if ( isfinite( d ) && modf( d, &tempi ) == 0.0D ) fmt( os, "." ); // always print decimal point
 		return os;
 	} // ?|?
@@ -174,4 +180,7 @@
 		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
 		fmt( os, "%.*Lg", LDBL_DIG, ld );
+		// fmt( os, "%Lg", ld );
+		long double tempi;
+		if ( isfinite( ld ) && modfl( ld, &tempi ) == 0.0L ) fmt( os, "." ); // always print decimal point
 		return os;
 	} // ?|?
@@ -182,5 +191,11 @@
 	ostype & ?|?( ostype & os, float _Complex fc ) {
 		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
-		fmt( os, "%g%+gi", crealf( fc ), cimagf( fc ) );
+		float temp = crealf( fc ), tempi;
+		fmt( os, "%g", temp );
+		if ( isfinite( temp ) && modff( temp, &tempi ) == 0.0F ) fmt( os, "." ); // always print decimal point
+		temp = cimagf( fc );
+		fmt( os, "%+g", temp );
+		if ( isfinite( temp ) && modff( temp, &tempi ) == 0.0F ) fmt( os, "." ); // always print decimal point
+		fmt( os, "i" );
 		return os;
 	} // ?|?
@@ -191,5 +206,12 @@
 	ostype & ?|?( ostype & os, double _Complex dc ) {
 		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
-		fmt( os, "%.*lg%+.*lgi", DBL_DIG, creal( dc ), DBL_DIG, cimag( dc ) );
+		double temp = creal( dc ), tempi;
+		fmt( os, "%.*lg", DBL_DIG, temp );
+		if ( isfinite( temp ) && modf( temp, &tempi ) == 0.0D ) fmt( os, "." ); // always print decimal point
+		temp = cimag( dc );
+		fmt( os, "%+.*lg", DBL_DIG, temp );
+		if ( isfinite( temp ) && modf( temp, &tempi ) == 0.0D ) fmt( os, "." ); // always print decimal point
+		fmt( os, "i" );
+		// fmt( os, "%lg%+lgi", creal( dc ), cimag( dc ) );
 		return os;
 	} // ?|?
@@ -200,5 +222,12 @@
 	ostype & ?|?( ostype & os, long double _Complex ldc ) {
 		if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
-		fmt( os, "%.*Lg%+.*Lgi", LDBL_DIG, creall( ldc ), LDBL_DIG, cimagl( ldc ) );
+		long double temp = creall( ldc ), tempi;
+		fmt( os, "%.*Lg", LDBL_DIG, temp );
+		if ( isfinite( temp ) && modfl( temp, &tempi ) == 0.0L ) fmt( os, "." ); // always print decimal point
+		temp = cimagl( ldc );
+		fmt( os, "%+.*Lg", LDBL_DIG, cimagl( ldc ) );
+		if ( isfinite( temp ) && modfl( temp, &tempi ) == 0.0L ) fmt( os, "." ); // always print decimal point
+		fmt( os, "i" );
+		// fmt( os, "%Lg%+Lgi", creall( ldc ), cimagl( ldc ) );
 		return os;
 	} // ?|?
@@ -494,5 +523,4 @@
 	} // ?|?
 
-
 	// manipulators
 	istype & ?|?( istype & is, istype & (* manip)( istype & ) ) {
@@ -501,5 +529,5 @@
 
 	istype & nl( istype & is ) {
-		fmt( is, "%*[ \t\f\n\r\v]" );					// ignore whitespace
+		fmt( is, "%*[^\n]" );							// ignore characters to newline
 		return is;
 	} // nl
Index: libcfa/src/iostream.hfa
===================================================================
--- libcfa/src/iostream.hfa	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ libcfa/src/iostream.hfa	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri May  3 22:55:04 2019
-// Update Count     : 230
+// Last Modified On : Sat May 11 10:31:27 2019
+// Update Count     : 232
 //
 
@@ -190,8 +190,8 @@
 
 	// manipulators
+	istype & ?|?( istype &, istype & (*)( istype & ) );
+	istype & nl( istype & is );
 	istype & nlOn( istype & );
 	istype & nlOff( istype & );
-	istype & ?|?( istype &, istype & (*)( istype & ) );
-	istype & nl( istype & is );
 } // distribution
 
@@ -215,5 +215,4 @@
 
 // Local Variables: //
-// mode: c //
 // tab-width: 4 //
 // End: //
Index: src/AST/CVQualifiers.hpp
===================================================================
--- src/AST/CVQualifiers.hpp	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ src/AST/CVQualifiers.hpp	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -59,11 +59,11 @@
 	// ordering is a subtype relationship over qualifiers, e.g. `int` => `const int` is free
 
-	bool operator== ( Qualifiers a, Qualifiers b ) {
-		return (a & EquivQualifiers) == (b & EquivQualifiers);
+	inline bool operator== ( Qualifiers a, Qualifiers b ) {
+		return (a.val & EquivQualifiers) == (b.val & EquivQualifiers);
 	}
-	bool operator!= ( Qualifiers a, Qualifiers b ) {
-		return (a & EquivQualifiers) != (b & EquivQualifiers);
+	inline bool operator!= ( Qualifiers a, Qualifiers b ) {
+		return !(a == b);
 	}
-	bool operator<= ( Qualifiers a, Qualifiers b ) {
+	inline bool operator<= ( Qualifiers a, Qualifiers b ) {
 		return a.is_const    <= b.is_const    // non-const converts to const for free
 			&& a.is_volatile <= b.is_volatile // non-volatile converts to volatile for free
@@ -71,7 +71,7 @@
 			&& a.is_atomic   == b.is_atomic;  // atomicity must be preserved in free conversion
 	}
-	bool operator<  ( Qualifiers a, Qualifiers b ) { return a != b && a <= b; }
-	bool operator>= ( Qualifiers a, Qualifiers b ) { return b <= a; }
-	bool operator>  ( Qualifiers a, Qualifiers b ) { return b < a; }
+	inline bool operator<  ( Qualifiers a, Qualifiers b ) { return a != b && a <= b; }
+	inline bool operator>= ( Qualifiers a, Qualifiers b ) { return b <= a; }
+	inline bool operator>  ( Qualifiers a, Qualifiers b ) { return b < a; }
 
 }
Index: src/AST/Decl.cpp
===================================================================
--- src/AST/Decl.cpp	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ src/AST/Decl.cpp	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -45,9 +45,14 @@
 }
 
+// --- FunctionDecl
+
+const Type * FunctionDecl::get_type() const override { return type.get(); }
+void FunctionDecl::set_type(Type * t) override { type = strict_dynamic_cast< FunctionType* >( t ); }
+
 // --- TypeDecl
 
 std::string TypeDecl::typeString() const {
 	static const std::string kindNames[] = { "object type", "function type", "tuple type" };
-	assertf( sizeof(kindNames)/sizeof(kindNames[0]) == DeclarationNode::NoTypeClass-1, 
+	assertf( sizeof(kindNames)/sizeof(kindNames[0]) == DeclarationNode::NoTypeClass-1,
 		"typeString: kindNames is out of sync." );
 	assertf( kind < sizeof(kindNames)/sizeof(kindNames[0]), "TypeDecl's kind is out of bounds." );
Index: src/AST/Decl.hpp
===================================================================
--- src/AST/Decl.hpp	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ src/AST/Decl.hpp	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -114,4 +114,5 @@
 };
 
+/// Object declaration `int foo()`
 class FunctionDecl : public DeclWithType {
 public:
@@ -126,6 +127,6 @@
 	  stmts( stmts ) {}
 
-	const Type * get_type() const override { return type.get(); }
-	void set_type(Type * t) override { type = strict_dynamic_cast< FunctionType* >( t ); }
+	const Type * get_type() const override;
+	void set_type(Type * t) override;
 
 	bool has_body() const { return stmts; }
@@ -184,5 +185,5 @@
 	TypeDecl( const CodeLocation& loc, const std::string& name, Storage::Classes storage, Type* b,
 		TypeVar::Kind k, bool s, Type* i = nullptr )
-	: NamedTypeDecl( loc, name, storage, b ), kind( k ), sized( k == TypeVar::Ttype || s ), 
+	: NamedTypeDecl( loc, name, storage, b ), kind( k ), sized( k == TypeVar::Ttype || s ),
 	  init( i ) {}
 
Index: src/AST/Pass.hpp
===================================================================
--- src/AST/Pass.hpp	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ src/AST/Pass.hpp	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -29,4 +29,5 @@
 #include "AST/Init.hpp"
 #include "AST/Stmt.hpp"
+#include "AST/Type.hpp"
 
 #include "AST/Visitor.hpp"
@@ -189,5 +190,9 @@
 
 	template< typename node_t >
-	auto call_accept( const node_t * node ) -> decltype( node->accept(*this) );
+	auto call_accept( const node_t * node ) -> typename std::enable_if<
+				!std::is_base_of<ast::Expr, node_t>::value &&
+				!std::is_base_of<ast::Stmt, node_t>::value
+			, decltype( node->accept(*this) )
+		>::type;
 
 	template< template <class...> class container_t >
Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ src/AST/Pass.impl.hpp	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -64,5 +64,5 @@
 
 			std::transform(decls->begin(), decls->end(), it, [](const ast::Decl * decl) -> auto {
-					return new DeclStmt( decl );
+					return new DeclStmt( decl->location, decl );
 				});
 			decls->clear();
@@ -119,5 +119,12 @@
 	template< typename pass_t >
 	template< typename node_t >
-	auto Pass< pass_t >::call_accept( const node_t * node ) -> decltype( node->accept(*this) ) {
+	auto Pass< pass_t >::call_accept( const node_t * node )
+		-> typename std::enable_if<
+				!std::is_base_of<ast::Expr, node_t>::value &&
+				!std::is_base_of<ast::Stmt, node_t>::value
+			, decltype( node->accept(*this) )
+		>::type
+
+	{
 		__pedantic_pass_assert( __visit_children() );
 		__pedantic_pass_assert( expr );
@@ -296,5 +303,5 @@
 		child_t parent_t::*child
 	) {
-		static_assert( std::is_base_of<parent_t, node_t>::value, "Error deductiing member object" );
+		static_assert( std::is_base_of<parent_t, node_t>::value, "Error deducing member object" );
 
 		if(__pass::skip(parent->*child)) return;
@@ -424,5 +431,5 @@
 				new ast::ArrayType(
 					new ast::BasicType( ast::BasicType::Char, ast::CV::Qualifiers( ast::CV::Const ) ),
-					nullptr, true, false
+					nullptr, VariableLen, DynamicDim
 				)
 			);
@@ -434,5 +441,5 @@
 				ValueGuard< bool > oldInFunction( inFunction );
 				inFunction = true;
-				maybe_accept( node, &FunctionDecl::statements );
+				maybe_accept( node, &FunctionDecl::stmts );
 				maybe_accept( node, &FunctionDecl::attributes );
 			)
@@ -537,5 +544,5 @@
 
 	VISIT(
-		maybe_accept( node, &TypeDecl::assertions, *this );
+		maybe_accept( node, &TypeDecl::assertions );
 
 		{
@@ -614,4 +621,74 @@
 }
 
+//--------------------------------------------------------------------------
+// ExprStmt
+template< typename pass_t >
+const ast::Stmt * ast::Pass< pass_t >::visit( const ExprStmt * node ) {
+	VISIT_START( node );
+
+	VISIT(
+		maybe_accept( node, &ExprStmt::expr );
+	)
+
+	VISIT_END( Stmt, node );
+}
+
+//--------------------------------------------------------------------------
+// AsmStmt
+template< typename pass_t >
+const ast::Stmt * ast::Pass< pass_t >::visit( const ast::AsmStmt * node ) {
+	VISIT_START( node )
+
+	VISIT(
+		maybe_accept( node, &AsmStmt::instruction );
+		maybe_accept( node, &AsmStmt::output      );
+		maybe_accept( node, &AsmStmt::input       );
+		maybe_accept( node, &AsmStmt::clobber     );
+	)
+
+	VISIT_END( Stmt, node );
+}
+
+//--------------------------------------------------------------------------
+// DirectiveStmt
+template< typename pass_t >
+const ast::Stmt * ast::Pass< pass_t >::visit( const ast::DirectiveStmt * node ) {
+	VISIT_START( node )
+
+	VISIT_END( Stmt, node );
+}
+
+//--------------------------------------------------------------------------
+// IfStmt
+template< typename pass_t >
+const ast::Stmt * ast::Pass< pass_t >::visit( const ast::IfStmt * node ) {
+	VISIT_START( node );
+	VISIT({
+		// if statements introduce a level of scope (for the initialization)
+		guard_indexer guard { *this };
+		maybe_accept( node, &IfStmt::inits    );
+		maybe_accept( node, &IfStmt::cond     );
+		maybe_accept( node, &IfStmt::thenPart );
+		maybe_accept( node, &IfStmt::elsePart );
+	})
+	VISIT_END( Stmt, node );
+}
+
+//--------------------------------------------------------------------------
+// WhileStmt
+template< typename pass_t >
+const ast::Stmt * ast::Pass< pass_t >::visit( const WhileStmt * node ) {
+	VISIT_START( node );
+
+	VISIT({
+		// while statements introduce a level of scope (for the initialization)
+		guard_indexer guard { *this };
+		maybe_accept( node, &WhileStmt::inits );
+		maybe_accept( node, &WhileStmt::cond  );
+		maybe_accept( node, &WhileStmt::body  );
+	})
+
+	VISIT_END( Stmt, node );
+}
 
 //--------------------------------------------------------------------------
@@ -667,5 +744,5 @@
 	)
 
-	VISIT_END( Attribute *, node );
+	VISIT_END( Attribute, node );
 }
 
Index: src/AST/Pass.proto.hpp
===================================================================
--- src/AST/Pass.proto.hpp	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ src/AST/Pass.proto.hpp	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -241,5 +241,5 @@
 		INDEXER_FUNC1( addUnion  , const UnionDecl *     );
 		INDEXER_FUNC1( addTrait  , const TraitDecl *     );
-		INDEXER_FUNC2( addWith   , const std::list< Expression * > &, const Node * );
+		INDEXER_FUNC2( addWith   , const std::list< ptr<Expr> > &, const Node * );
 
 		// A few extra functions have more complicated behaviour, they are hand written
Index: src/AST/Stmt.hpp
===================================================================
--- src/AST/Stmt.hpp	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ src/AST/Stmt.hpp	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -62,4 +62,8 @@
 private:
 	CompoundStmt* clone() const override { return new CompoundStmt{ *this }; }
+
+	/// Must be copied in ALL derived classes
+	template<typename node_t>
+	friend auto mutate(const node_t * node);
 };
 
@@ -73,4 +77,8 @@
 private:
 	NullStmt* clone() const override { return new NullStmt{ *this }; }
+
+	/// Must be copied in ALL derived classes
+	template<typename node_t>
+	friend auto mutate(const node_t * node);
 };
 
@@ -80,9 +88,13 @@
 	ptr<Expr> expr;
 
-	ExprStmt( const CodeLocation& loc, const Expr* e ) : Stmt(loc), expr(e) {}
+	ExprStmt( const CodeLocation & loc, const Expr * e ) : Stmt(loc), expr(e) {}
 
 	const Stmt * accept( Visitor& v ) const override { return v.visit( this ); }
 private:
 	ExprStmt * clone() const override { return new ExprStmt{ *this }; }
+
+	/// Must be copied in ALL derived classes
+	template<typename node_t>
+	friend auto mutate(const node_t * node);
 };
 
@@ -106,4 +118,8 @@
 private:
 	AsmStmt* clone() const override { return new AsmStmt{ *this }; }
+
+	/// Must be copied in ALL derived classes
+	template<typename node_t>
+	friend auto mutate(const node_t * node);
 };
 
@@ -119,4 +135,8 @@
 private:
 	DirectiveStmt* clone() const override { return new DirectiveStmt{ *this }; }
+
+	/// Must be copied in ALL derived classes
+	template<typename node_t>
+	friend auto mutate(const node_t * node);
 };
 
@@ -137,4 +157,8 @@
 private:
 	IfStmt* clone() const override { return new IfStmt{ *this }; }
+
+	/// Must be copied in ALL derived classes
+	template<typename node_t>
+	friend auto mutate(const node_t * node);
 };
 
@@ -151,4 +175,8 @@
 private:
 	SwitchStmt* clone() const override { return new SwitchStmt{ *this }; }
+
+	/// Must be copied in ALL derived classes
+	template<typename node_t>
+	friend auto mutate(const node_t * node);
 };
 
@@ -167,4 +195,8 @@
 private:
 	CaseStmt* clone() const override { return new CaseStmt{ *this }; }
+
+	/// Must be copied in ALL derived classes
+	template<typename node_t>
+	friend auto mutate(const node_t * node);
 };
 
@@ -184,4 +216,8 @@
 private:
 	WhileStmt* clone() const override { return new WhileStmt{ *this }; }
+
+	/// Must be copied in ALL derived classes
+	template<typename node_t>
+	friend auto mutate(const node_t * node);
 };
 
@@ -190,10 +226,10 @@
 	std::vector<ptr<Stmt>> inits;
 	ptr<Expr> cond;
-	ptr<Expr> increment;
+	ptr<Expr> inc;
 	ptr<Stmt> body;
 
 	ForStmt( const CodeLocation& loc, std::vector<ptr<Stmt>>&& inits, const Expr* cond,
-		const Expr* increment, const Stmt* body, std::vector<Label>&& labels = {} )
-	: Stmt(loc, std::move(labels)), inits(std::move(inits)), cond(cond), increment(increment),
+		const Expr* inc, const Stmt* body, std::vector<Label>&& labels = {} )
+	: Stmt(loc, std::move(labels)), inits(std::move(inits)), cond(cond), inc(inc),
 	  body(body) {}
 
@@ -201,4 +237,8 @@
 private:
 	ForStmt* clone() const override { return new ForStmt{ *this }; }
+
+	/// Must be copied in ALL derived classes
+	template<typename node_t>
+	friend auto mutate(const node_t * node);
 };
 
@@ -225,4 +265,9 @@
 private:
 	BranchStmt* clone() const override { return new BranchStmt{ *this }; }
+
+	/// Must be copied in ALL derived classes
+	template<typename node_t>
+	friend auto mutate(const node_t * node);
+
 	static const char * kindNames[kindEnd];
 };
@@ -238,4 +283,8 @@
 private:
 	ReturnStmt* clone() const override { return new ReturnStmt{ *this }; }
+
+	/// Must be copied in ALL derived classes
+	template<typename node_t>
+	friend auto mutate(const node_t * node);
 };
 
@@ -255,4 +304,8 @@
 private:
 	ThrowStmt* clone() const override { return new ThrowStmt{ *this }; }
+
+	/// Must be copied in ALL derived classes
+	template<typename node_t>
+	friend auto mutate(const node_t * node);
 };
 
@@ -271,4 +324,8 @@
 private:
 	TryStmt* clone() const override { return new TryStmt{ *this }; }
+
+	/// Must be copied in ALL derived classes
+	template<typename node_t>
+	friend auto mutate(const node_t * node);
 };
 
@@ -289,4 +346,8 @@
 private:
 	CatchStmt* clone() const override { return new CatchStmt{ *this }; }
+
+	/// Must be copied in ALL derived classes
+	template<typename node_t>
+	friend auto mutate(const node_t * node);
 };
 
@@ -302,4 +363,8 @@
 private:
 	FinallyStmt* clone() const override { return new FinallyStmt{ *this }; }
+
+	/// Must be copied in ALL derived classes
+	template<typename node_t>
+	friend auto mutate(const node_t * node);
 };
 
@@ -338,4 +403,8 @@
 private:
 	WaitForStmt* clone() const override { return new WaitForStmt{ *this }; }
+
+	/// Must be copied in ALL derived classes
+	template<typename node_t>
+	friend auto mutate(const node_t * node);
 };
 
@@ -352,4 +421,8 @@
 private:
 	WithStmt* clone() const override { return new WithStmt{ *this }; }
+
+	/// Must be copied in ALL derived classes
+	template<typename node_t>
+	friend auto mutate(const node_t * node);
 };
 
@@ -364,4 +437,8 @@
 private:
 	DeclStmt* clone() const override { return new DeclStmt{ *this }; }
+
+	/// Must be copied in ALL derived classes
+	template<typename node_t>
+	friend auto mutate(const node_t * node);
 };
 
@@ -377,4 +454,8 @@
 private:
 	ImplicitCtorDtorStmt* clone() const override { return new ImplicitCtorDtorStmt{ *this }; }
+
+	/// Must be copied in ALL derived classes
+	template<typename node_t>
+	friend auto mutate(const node_t * node);
 };
 
@@ -390,40 +471,40 @@
 inline void increment( const class ExprStmt * node, Node::ref_type ref ) { node->increment( ref ); }
 inline void decrement( const class ExprStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
-// inline void increment( const class AsmStmt * node, Node::ref_type ref ) { node->increment( ref ); }
-// inline void decrement( const class AsmStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
-// inline void increment( const class DirectiveStmt * node, Node::ref_type ref ) { node->increment( ref ); }
-// inline void decrement( const class DirectiveStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
-// inline void increment( const class IfStmt * node, Node::ref_type ref ) { node->increment( ref ); }
-// inline void decrement( const class IfStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
-// inline void increment( const class WhileStmt * node, Node::ref_type ref ) { node->increment( ref ); }
-// inline void decrement( const class WhileStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
-// inline void increment( const class ForStmt * node, Node::ref_type ref ) { node->increment( ref ); }
-// inline void decrement( const class ForStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
-// inline void increment( const class SwitchStmt * node, Node::ref_type ref ) { node->increment( ref ); }
-// inline void decrement( const class SwitchStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
-// inline void increment( const class CaseStmt * node, Node::ref_type ref ) { node->increment( ref ); }
-// inline void decrement( const class CaseStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
-// inline void increment( const class BranchStmt * node, Node::ref_type ref ) { node->increment( ref ); }
-// inline void decrement( const class BranchStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
-// inline void increment( const class ReturnStmt * node, Node::ref_type ref ) { node->increment( ref ); }
-// inline void decrement( const class ReturnStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
-// inline void increment( const class ThrowStmt * node, Node::ref_type ref ) { node->increment( ref ); }
-// inline void decrement( const class ThrowStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
-// inline void increment( const class TryStmt * node, Node::ref_type ref ) { node->increment( ref ); }
-// inline void decrement( const class TryStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
-// inline void increment( const class CatchStmt * node, Node::ref_type ref ) { node->increment( ref ); }
-// inline void decrement( const class CatchStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
-// inline void increment( const class FinallyStmt * node, Node::ref_type ref ) { node->increment( ref ); }
-// inline void decrement( const class FinallyStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
-// inline void increment( const class WaitForStmt * node, Node::ref_type ref ) { node->increment( ref ); }
-// inline void decrement( const class WaitForStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
-// inline void increment( const class WithStmt * node, Node::ref_type ref ) { node->increment( ref ); }
-// inline void decrement( const class WithStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
-// inline void increment( const class DeclStmt * node, Node::ref_type ref ) { node->increment( ref ); }
-// inline void decrement( const class DeclStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
+inline void increment( const class AsmStmt * node, Node::ref_type ref ) { node->increment( ref ); }
+inline void decrement( const class AsmStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
+inline void increment( const class DirectiveStmt * node, Node::ref_type ref ) { node->increment( ref ); }
+inline void decrement( const class DirectiveStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
+inline void increment( const class IfStmt * node, Node::ref_type ref ) { node->increment( ref ); }
+inline void decrement( const class IfStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
+inline void increment( const class WhileStmt * node, Node::ref_type ref ) { node->increment( ref ); }
+inline void decrement( const class WhileStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
+inline void increment( const class ForStmt * node, Node::ref_type ref ) { node->increment( ref ); }
+inline void decrement( const class ForStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
+inline void increment( const class SwitchStmt * node, Node::ref_type ref ) { node->increment( ref ); }
+inline void decrement( const class SwitchStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
+inline void increment( const class CaseStmt * node, Node::ref_type ref ) { node->increment( ref ); }
+inline void decrement( const class CaseStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
+inline void increment( const class BranchStmt * node, Node::ref_type ref ) { node->increment( ref ); }
+inline void decrement( const class BranchStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
+inline void increment( const class ReturnStmt * node, Node::ref_type ref ) { node->increment( ref ); }
+inline void decrement( const class ReturnStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
+inline void increment( const class ThrowStmt * node, Node::ref_type ref ) { node->increment( ref ); }
+inline void decrement( const class ThrowStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
+inline void increment( const class TryStmt * node, Node::ref_type ref ) { node->increment( ref ); }
+inline void decrement( const class TryStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
+inline void increment( const class CatchStmt * node, Node::ref_type ref ) { node->increment( ref ); }
+inline void decrement( const class CatchStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
+inline void increment( const class FinallyStmt * node, Node::ref_type ref ) { node->increment( ref ); }
+inline void decrement( const class FinallyStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
+inline void increment( const class WaitForStmt * node, Node::ref_type ref ) { node->increment( ref ); }
+inline void decrement( const class WaitForStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
+inline void increment( const class WithStmt * node, Node::ref_type ref ) { node->increment( ref ); }
+inline void decrement( const class WithStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
+inline void increment( const class DeclStmt * node, Node::ref_type ref ) { node->increment( ref ); }
+inline void decrement( const class DeclStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
 inline void increment( const class NullStmt * node, Node::ref_type ref ) { node->increment( ref ); }
 inline void decrement( const class NullStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
-// inline void increment( const class ImplicitCtorDtorStmt * node, Node::ref_type ref ) { node->increment( ref ); }
-// inline void decrement( const class ImplicitCtorDtorStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
+inline void increment( const class ImplicitCtorDtorStmt * node, Node::ref_type ref ) { node->increment( ref ); }
+inline void decrement( const class ImplicitCtorDtorStmt * node, Node::ref_type ref ) { node->decrement( ref ); }
 
 }
Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ src/Parser/lex.ll	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -10,6 +10,6 @@
  * Created On       : Sat Sep 22 08:58:10 2001
  * Last Modified By : Peter A. Buhr
- * Last Modified On : Wed Mar 13 14:54:30 2019
- * Update Count     : 707
+ * Last Modified On : Wed May 15 21:25:27 2019
+ * Update Count     : 708
  */
 
@@ -265,4 +265,5 @@
 fortran			{ KEYWORD_RETURN(FORTRAN); }
 ftype			{ KEYWORD_RETURN(FTYPE); }				// CFA
+generator		{ KEYWORD_RETURN(GENERATOR); }			// CFA
 _Generic		{ KEYWORD_RETURN(GENERIC); }			// C11
 goto			{ KEYWORD_RETURN(GOTO); }
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ src/Parser/parser.yy	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Apr 15 15:02:56 2019
-// Update Count     : 4290
+// Last Modified On : Wed May 15 21:25:27 2019
+// Update Count     : 4296
 //
 
@@ -173,5 +173,5 @@
 DeclarationNode * fieldDecl( DeclarationNode * typeSpec, DeclarationNode * fieldList ) {
 	if ( ! fieldList ) {								// field declarator ?
-		if ( ! ( typeSpec->type && typeSpec->type->kind == TypeData::Aggregate ) ) {
+		if ( ! ( typeSpec->type && (typeSpec->type->kind == TypeData::Aggregate || typeSpec->type->kind == TypeData::Enum) ) ) {
 			stringstream ss;
 			typeSpec->type->print( ss );
@@ -275,5 +275,5 @@
 %token ENUM STRUCT UNION
 %token EXCEPTION										// CFA
-%token COROUTINE MONITOR THREAD							// CFA
+%token GENERATOR COROUTINE MONITOR THREAD				// CFA
 %token OTYPE FTYPE DTYPE TTYPE TRAIT					// CFA
 %token SIZEOF OFFSETOF
@@ -677,5 +677,5 @@
 	// empty
 		{ $$ = nullptr; }
-	| '?'												// CFA, default parameter
+	| '@'												// CFA, default parameter
 		{ SemanticError( yylloc, "Default parameter for argument is currently unimplemented." ); $$ = nullptr; }
 	 	// { $$ = new ExpressionNode( build_constantInteger( *new string( "2" ) ) ); }
@@ -796,4 +796,6 @@
 		{ $$ = new ExpressionNode( build_cast( $2, $4 ) ); }
 		// keyword cast cannot be grouped because of reduction in aggregate_key
+	| '(' GENERATOR '&' ')' cast_expression				// CFA
+		{ $$ = new ExpressionNode( build_keyword_cast( KeywordCastExpr::Coroutine, $5 ) ); }
 	| '(' COROUTINE '&' ')' cast_expression				// CFA
 		{ $$ = new ExpressionNode( build_keyword_cast( KeywordCastExpr::Coroutine, $5 ) ); }
@@ -2061,4 +2063,6 @@
 	| EXCEPTION
 		{ yyy = true; $$ = DeclarationNode::Exception; }
+	| GENERATOR
+		{ yyy = true; $$ = DeclarationNode::Coroutine; }
 	| COROUTINE
 		{ yyy = true; $$ = DeclarationNode::Coroutine; }
Index: tests/.expect/abs.txt
===================================================================
--- tests/.expect/abs.txt	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ tests/.expect/abs.txt	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -3,8 +3,8 @@
 signed long int		-65	abs 65
 signed long long int	-65	abs 65
-float			-65	abs 65
-double			-65	abs 65
-long double		-65	abs 65
-float _Complex		-65-2i	abs 65.0308
-double _Complex		-65-2i	abs 65.0307619515564
-long double _Complex	-65-2i	abs 65.0307619515564342
+float			-65.	abs 65.
+double			-65.	abs 65.
+long double		-65.	abs 65.
+float _Complex		-65.-2.i	abs 65.0308
+double _Complex		-65.-2.i	abs 65.0307619515564
+long double _Complex	-65.-2.i	abs 65.0307619515564342
Index: tests/.expect/ato.txt
===================================================================
--- tests/.expect/ato.txt	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ tests/.expect/ato.txt	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -22,5 +22,5 @@
 -123.456789012345679 -123.45678901234567890123456789
 -123.456-123.456i -123.456-123.456i
-0+0i 2  3
+0.+0.i 2  3
 -123.456789012346+123.456789012346i -123.4567890123456+123.4567890123456i
 123.456789012345679-123.456789012345679i 123.45678901234567890123456789-123.45678901234567890123456789i
Index: tests/.expect/complex.txt
===================================================================
--- tests/.expect/complex.txt	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ tests/.expect/complex.txt	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -1,4 +1,4 @@
 x:3+2i y:4+5i z:7+7i
-x:3+2i y:4+5i z:7+7i
+x:3.+2.i y:4.+5.i z:7.+7.i
 x:2.1+1.3i y:3.2+4.5i z:5.3+5.8i
 x:2.1+1.3i y:3.2+4.5i z:5.3+5.8i
Index: tests/.expect/identity.txt
===================================================================
--- tests/.expect/identity.txt	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ tests/.expect/identity.txt	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -9,5 +9,5 @@
 double			4.1
 long double		4.1
-float _Complex		-4.1-2i
-double _Complex		-4.1-2i
-long double _Complex	-4.1-2i
+float _Complex		-4.1-2.i
+double _Complex		-4.1-2.i
+long double _Complex	-4.1-2.i
Index: tests/.expect/math1.txt
===================================================================
--- tests/.expect/math1.txt	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ tests/.expect/math1.txt	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -1,13 +1,13 @@
-fmod:1 1 1 1 1 1
-remainder:-1 -1 -1
+fmod:1. 1. 1. 1. 1. 1.
+remainder:-1. -1. -1.
 remquo:7 0.0999999 7 0.1 7 0.0999999999999999999
-div:7, 0.2 7, 0.2 7, 0.2
-fma:-2 -2 -2
-fdim:2 2 2
+div:7., 0.2 7., 0.2 7., 0.2
+fma:-2. -2. -2.
+fdim:2. 2. 2.
 nan:nan nan nan
 exp:2.71828 2.71828182845905 2.71828182845904524 1.46869+2.28736i 1.46869393991589+2.28735528717884i 1.46869393991588516+2.28735528717884239i
-exp2:2 2 2
+exp2:2. 2. 2.
 expm1:1.71828 1.71828182845905 1.71828182845904524
-pow:1 1 1 0.273957+0.583701i 0.273957253830121+0.583700758758615i -0.638110484918098871+0.705394566961838155i
+pow:1. 1. 1. 0.273957+0.583701i 0.273957253830121+0.583700758758615i -0.638110484918098871+0.705394566961838155i
 16 \ 2 = 256
 912673 256 64 -64 0 0
Index: tests/.expect/math2.txt
===================================================================
--- tests/.expect/math2.txt	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ tests/.expect/math2.txt	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -1,10 +1,10 @@
-log:0 0 0 0.346574+0.785398i 0.346573590279973+0.785398163397448i 0.346573590279972655+0.78539816339744831i
-log2:3 3 3
-log10:2 2 2
+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
+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
@@ -12,5 +12,5 @@
 tan:1.55741 1.5574077246549 1.55740772465490223 0.271753+1.08392i 0.271752585319512+1.08392332733869i 0.271752585319511717+1.08392332733869454i
 asin:1.5708 1.5707963267949 1.57079632679489662 0.666239+1.06128i 0.666239432492515+1.06127506190504i 0.666239432492515255+1.06127506190503565i
-acos:0 0 0 0.904557-1.06128i 0.904556894302381-1.06127506190504i 0.904556894302381364-1.06127506190503565i
+acos:0. 0. 0. 0.904557-1.06128i 0.904556894302381-1.06127506190504i 0.904556894302381364-1.06127506190503565i
 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
Index: tests/.expect/math3.txt
===================================================================
--- tests/.expect/math3.txt	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ tests/.expect/math3.txt	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -2,5 +2,5 @@
 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
+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
@@ -9,3 +9,3 @@
 lgamma:1.79176 1.79175946922805 1.791759469228055
 lgamma:1.79176 1 1.79175946922805 1 1.791759469228055 1
-tgamma:6 6 6
+tgamma:6 6. 6.
Index: tests/.expect/math4.txt
===================================================================
--- tests/.expect/math4.txt	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ tests/.expect/math4.txt	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -1,23 +1,23 @@
-floor:1 1 1
-ceil:2 2 2
-trunc:3 3 3
-rint:2 2 2
+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
+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
+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
+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
+scalbn:16. 16. 16.
+scalbln:16. 16. 16.
Index: tests/.expect/minmax.txt
===================================================================
--- tests/.expect/minmax.txt	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ tests/.expect/minmax.txt	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -6,7 +6,7 @@
 signed long long int	4 3	min 3
 unsigned long long int	4 3	min 3
-float			4 3.1	min 3.1
-double			4 3.1	min 3.1
-long double		4 3.1	min 3.1
+float			4. 3.1	min 3.1
+double			4. 3.1	min 3.1
+long double		4. 3.1	min 3.1
 
 char			z a	max z
@@ -17,5 +17,5 @@
 signed long long int	4 3	max 4
 unsigned long long int	4 3	max 4
-float			4 3.1	max 4
-double			4 3.1	max 4
-long double		4 3.1	max 4
+float			4. 3.1	max 4.
+double			4. 3.1	max 4.
+long double		4. 3.1	max 4.
Index: tests/.expect/references.txt
===================================================================
--- tests/.expect/references.txt	(revision 54e41b38e2be1b9c4d667e9c0fe4eb202e951fc7)
+++ tests/.expect/references.txt	(revision 24afc5313ce84b9962eaf6529d35b0fc0d0df58f)
@@ -35,5 +35,5 @@
 3
 3
-3 9 { 1, 7 }, [1, 2, 3]
+3 9 { 1., 7. }, [1, 2, 3]
 Destructing a Y
 Destructing a Y
