Index: libcfa/src/iostream.cfa
===================================================================
--- libcfa/src/iostream.cfa	(revision 519f11c3bd79f925ace2b671bf682be5b31bea6f)
+++ libcfa/src/iostream.cfa	(revision 463cb3379a0b569bada3eb54e7751c62d819d4ac)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jul  8 22:14:20 2020
-// Update Count     : 1069
+// Last Modified On : Thu Jul 16 07:43:31 2020
+// Update Count     : 1102
 //
 
@@ -970,4 +970,25 @@
 	} // ?|?
 
+#if defined( __SIZEOF_INT128__ )
+	istype & ?|?( istype & is, int128 & i128 ) {
+		return (istype &)(is | (unsigned int128 &)i128);
+	} // ?|?
+
+	istype & ?|?( istype & is, unsigned int128 & ui128 ) {
+		char s[40];
+		bool sign = false;
+
+		if ( fmt( is, " %[-]", s ) == 1 ) sign = true;	// skip whitespace, negative sign ?
+		// If the input is too large, the value returned is undefined. If there is no input, no value is returned
+		if ( fmt( is, "%39[0-9]%*[0-9]", s ) == 1 ) {	// take first 39 characters, ignore remaining
+			ui128 = 0;
+			for ( unsigned int i = 0; s[i] != '\0'; i += 1 ) {
+				ui128 = ui128 * 10 + s[i] - '0';
+			} // for
+			if ( sign ) ui128 = -ui128;
+		} else if ( sign ) ungetc( is, '-' );			// return minus when no digits
+		return is;
+	} // ?|?
+#endif // __SIZEOF_INT128__
 
 	istype & ?|?( istype & is, float & f ) {
Index: libcfa/src/iostream.hfa
===================================================================
--- libcfa/src/iostream.hfa	(revision 519f11c3bd79f925ace2b671bf682be5b31bea6f)
+++ libcfa/src/iostream.hfa	(revision 463cb3379a0b569bada3eb54e7751c62d819d4ac)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jul 13 22:11:41 2020
-// Update Count     : 344
+// Last Modified On : Thu Jul 16 07:43:32 2020
+// Update Count     : 348
 //
 
@@ -315,7 +315,11 @@
 	istype & ?|?( istype &, unsigned int & );
 	istype & ?|?( istype &, long int & );
+	istype & ?|?( istype &, unsigned long int & );
 	istype & ?|?( istype &, long long int & );
-	istype & ?|?( istype &, unsigned long int & );
 	istype & ?|?( istype &, unsigned long long int & );
+#if defined( __SIZEOF_INT128__ )
+	istype & ?|?( istype &, int128 & );
+	istype & ?|?( istype &, unsigned int128 & );
+#endif // __SIZEOF_INT128__
 
 	istype & ?|?( istype &, float & );
Index: src/GenPoly/InstantiateGeneric.cc
===================================================================
--- src/GenPoly/InstantiateGeneric.cc	(revision 519f11c3bd79f925ace2b671bf682be5b31bea6f)
+++ src/GenPoly/InstantiateGeneric.cc	(revision 463cb3379a0b569bada3eb54e7751c62d819d4ac)
@@ -9,7 +9,7 @@
 // Author           : Aaron B. Moss
 // Created On       : Thu Aug 04 18:33:00 2016
-// Last Modified By : Aaron B. Moss
-// Last Modified On : Thu Aug 04 18:33:00 2016
-// Update Count     : 1
+// Last Modified By : Andrew Beach
+// Last Modified On : Wed Jul 16 10:17:00 2020
+// Update Count     : 2
 //
 #include "InstantiateGeneric.h"
@@ -297,4 +297,16 @@
 	}
 
+	template< typename AggrInst >
+	static AggrInst * asForward( AggrInst * decl ) {
+		if ( !decl->body ) {
+			return nullptr;
+		}
+		decl = decl->clone();
+		decl->body = false;
+		deleteAll( decl->members );
+		decl->members.clear();
+		return decl;
+	}
+
 	void GenericInstantiator::stripDtypeParams( AggregateDecl *base, std::list< TypeDecl* >& baseParams, const std::list< TypeExpr* >& typeSubs ) {
 		substituteMembers( base->get_members(), baseParams, typeSubs );
@@ -373,5 +385,9 @@
 				concDecl->set_body( inst->get_baseStruct()->has_body() );
 				substituteMembers( inst->get_baseStruct()->get_members(), *inst->get_baseParameters(), typeSubs, concDecl->get_members() );
-				insert( inst, typeSubs, concDecl ); // must insert before recursion
+				// Forward declare before recursion. (TODO: Only when needed, #199.)
+				insert( inst, typeSubs, concDecl );
+				if ( StructDecl *forwardDecl = asForward( concDecl ) ) {
+					declsToAddBefore.push_back( forwardDecl );
+				}
 				concDecl->acceptMutator( *visitor ); // recursively instantiate members
 				declsToAddBefore.push_back( concDecl ); // must occur before declaration is added so that member instantiations appear first
@@ -423,5 +439,9 @@
 				concDecl->set_body( inst->get_baseUnion()->has_body() );
 				substituteMembers( inst->get_baseUnion()->get_members(), *inst->get_baseParameters(), typeSubs, concDecl->get_members() );
-				insert( inst, typeSubs, concDecl ); // must insert before recursion
+				// Forward declare before recursion. (TODO: Only when needed, #199.)
+				insert( inst, typeSubs, concDecl );
+				if ( UnionDecl *forwardDecl = asForward( concDecl ) ) {
+					declsToAddBefore.push_back( forwardDecl );
+				}
 				concDecl->acceptMutator( *visitor ); // recursively instantiate members
 				declsToAddBefore.push_back( concDecl ); // must occur before declaration is added so that member instantiations appear first
Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision 519f11c3bd79f925ace2b671bf682be5b31bea6f)
+++ src/Parser/ExpressionNode.cc	(revision 463cb3379a0b569bada3eb54e7751c62d819d4ac)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:17:07 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jul 13 21:12:02 2020
-// Update Count     : 1043
+// Last Modified On : Wed Jul 15 08:24:08 2020
+// Update Count     : 1046
 //
 
@@ -222,7 +222,4 @@
 			} else {									// octal int128 constant
 				unsigned int len = str.length();
-				char buf[32];
-				__int128 val = v;
-				
 				if ( len > 1 + 43 || (len == 1 + 43 && str[0] > '3') ) SemanticError( yylloc, "128-bit octal constant to large " + str );
 				if ( len <= 1 + 21 ) {					// value < 21 octal digitis
@@ -230,5 +227,5 @@
 				} else {
 					sscanf( &str[len - 21], "%llo", &v );
-					val = v;							// store bits
+					__int128 val = v;					// accumulate bits
 					str[len - 21] ='\0';				// shorten string
 					sscanf( &str[len == 43 ? 1 : 0], "%llo", &v );
@@ -240,4 +237,5 @@
 					} // if
 					v = val >> 64; v2 = (uint64_t)val;	// replace octal constant with 2 hex constants
+					char buf[32];
 					sprintf( buf, "%#llx", v2 );
 					str2 = buf;
@@ -256,7 +254,4 @@
 			#define P10_UINT64 10'000'000'000'000'000'000ULL // 19 zeroes
 			unsigned int len = str.length();
-			char buf[32];
-			__int128 val = v;
-
 			if ( str.length() == 39 && str > (Unsigned ? "340282366920938463463374607431768211455" : "170141183460469231731687303715884105727") )
 				SemanticError( yylloc, "128-bit decimal constant to large " + str );
@@ -265,5 +260,5 @@
 			} else {
 				sscanf( &str[len - 19], "%llu", &v );
-				val = v;								// store bits
+				__int128 val = v;						// accumulate bits
 				str[len - 19] ='\0';					// shorten string
 				sscanf( &str[len == 39 ? 1 : 0], "%llu", &v );
@@ -275,4 +270,5 @@
 				} // if
 				v = val >> 64; v2 = (uint64_t)val;		// replace decimal constant with 2 hex constants
+				char buf[32];
 				sprintf( buf, "%#llx", v2 );
 				str2 = buf;
Index: tests/.expect/functions.x64.txt
===================================================================
--- tests/.expect/functions.x64.txt	(revision 519f11c3bd79f925ace2b671bf682be5b31bea6f)
+++ tests/.expect/functions.x64.txt	(revision 463cb3379a0b569bada3eb54e7751c62d819d4ac)
@@ -121,4 +121,5 @@
 
 }
+struct _conc__tuple2_0;
 struct _conc__tuple2_0 {
     signed int field_0;
@@ -157,4 +158,5 @@
 
 }
+struct _conc__tuple3_1;
 struct _conc__tuple3_1 {
     signed int field_0;
@@ -170,4 +172,5 @@
     __attribute__ ((unused)) struct _conc__tuple3_1 _X9_retval_fT3iii_1 = {  };
 }
+struct _conc__tuple3_2;
 struct _conc__tuple3_2 {
     signed int field_0;
@@ -260,4 +263,5 @@
     __attribute__ ((unused)) signed int *const _X10_retval_f3KPi_1;
 }
+struct _conc__tuple2_3;
 struct _conc__tuple2_3 {
     signed int *field_0;
Index: tests/.expect/functions.x86.txt
===================================================================
--- tests/.expect/functions.x86.txt	(revision 519f11c3bd79f925ace2b671bf682be5b31bea6f)
+++ tests/.expect/functions.x86.txt	(revision 463cb3379a0b569bada3eb54e7751c62d819d4ac)
@@ -121,4 +121,5 @@
 
 }
+struct _conc__tuple2_0;
 struct _conc__tuple2_0 {
     signed int field_0;
@@ -157,4 +158,5 @@
 
 }
+struct _conc__tuple3_1;
 struct _conc__tuple3_1 {
     signed int field_0;
@@ -170,4 +172,5 @@
     __attribute__ ((unused)) struct _conc__tuple3_1 _X9_retval_fT3iii_1 = {  };
 }
+struct _conc__tuple3_2;
 struct _conc__tuple3_2 {
     signed int field_0;
@@ -260,4 +263,5 @@
     __attribute__ ((unused)) signed int *const _X10_retval_f3KPi_1;
 }
+struct _conc__tuple2_3;
 struct _conc__tuple2_3 {
     signed int *field_0;
Index: sts/.expect/manipulatorsInput.txt
===================================================================
--- tests/.expect/manipulatorsInput.txt	(revision 519f11c3bd79f925ace2b671bf682be5b31bea6f)
+++ 	(revision )
@@ -1,92 +1,0 @@
-1 yyyyyyyyyyyyyyyyyyyy
-2 abcxxx
-3 abcxxx
-4 aaaaaaaa
-5 aaaaaaaa
-6 aabbccbb
-7 dddwww
-8 dddwww
-9 dddwww
-10 aaaaaaaa
-11 wwwwwwww
-12 wwwwwwww
-13 wwwwwwww
-1 yyyyyyyyyyyyyyyyyyyy
-2 abcxxx
-3 abcxxx
-4 aaaaaaaa
-5 aaaaaaaa
-6 aabbccbb
-7 dddwww
-8 dddwww
-9 dddwww
-10 aaaaaaaa
-11 wwwwwwww
-12 wwwwwwww
-13 wwwwwwww
-a
-a
--1
-15
-15
-15
-255
-15
-15
-15
-255
-15
-15
-15
-255
-15
-15
-15
-255
-15
-15
-15
-255
-15
-15
-15
-255
-15
-15
-15
-255
-15
-15
-15
-255
-15
-15
-15
-255
-15
-15
-15
-3.5
-345.6
-345.6
-345.6
-3.5
-345.6
-345.6
-345.6
-3.5
-345.6
-345.6
-345.6
-3.5+3.5i
-345.6+345.6i
-345.6+345.6i
-345.6+345.6i
-3.5+3.5i
-345.6+345.6i
-345.6+345.6i
-345.6+345.6i
-3.5+3.5i
-345.6+345.6i
-345.6+345.6i
-345.6+345.6i
Index: tests/.expect/manipulatorsInput.x64.txt
===================================================================
--- tests/.expect/manipulatorsInput.x64.txt	(revision 463cb3379a0b569bada3eb54e7751c62d819d4ac)
+++ tests/.expect/manipulatorsInput.x64.txt	(revision 463cb3379a0b569bada3eb54e7751c62d819d4ac)
@@ -0,0 +1,107 @@
+1 yyyyyyyyyyyyyyyyyyyy
+2 abcxxx
+3 abcxxx
+4 aaaaaaaa
+5 aaaaaaaa
+6 aabbccbb
+7 dddwww
+8 dddwww
+9 dddwww
+10 aaaaaaaa
+11 wwwwwwww
+12 wwwwwwww
+13 wwwwwwww
+1 yyyyyyyyyyyyyyyyyyyy
+2 abcxxx
+3 abcxxx
+4 aaaaaaaa
+5 aaaaaaaa
+6 aabbccbb
+7 dddwww
+8 dddwww
+9 dddwww
+10 aaaaaaaa
+11 wwwwwwww
+12 wwwwwwww
+13 wwwwwwww
+a
+a
+-1
+15
+15
+15
+255
+15
+15
+15
+255
+15
+15
+15
+255
+15
+15
+15
+255
+15
+15
+15
+255
+15
+15
+15
+255
+15
+15
+15
+255
+15
+15
+15
+255
+15
+15
+15
+255
+15
+15
+15
+3.5
+345.6
+345.6
+345.6
+3.5
+345.6
+345.6
+345.6
+3.5
+345.6
+345.6
+345.6
+3.5+3.5i
+345.6+345.6i
+345.6+345.6i
+345.6+345.6i
+3.5+3.5i
+345.6+345.6i
+345.6+345.6i
+345.6+345.6i
+3.5+3.5i
+345.6+345.6i
+345.6+345.6i
+345.6+345.6i
+25
+-25
+42798
+1402432282
+1505850196993244515
+394749758663249135511342
+12935154696204706112391834394
+423859149128410414395372834994551
+13889016598639747063234935497057631587
+170141183460469231731687303715884105727
+-1
+1
+-1
+1234567890123456789
+-1234567890123456789
Index: tests/.expect/manipulatorsInput.x86.txt
===================================================================
--- tests/.expect/manipulatorsInput.x86.txt	(revision 463cb3379a0b569bada3eb54e7751c62d819d4ac)
+++ tests/.expect/manipulatorsInput.x86.txt	(revision 463cb3379a0b569bada3eb54e7751c62d819d4ac)
@@ -0,0 +1,92 @@
+1 yyyyyyyyyyyyyyyyyyyy
+2 abcxxx
+3 abcxxx
+4 aaaaaaaa
+5 aaaaaaaa
+6 aabbccbb
+7 dddwww
+8 dddwww
+9 dddwww
+10 aaaaaaaa
+11 wwwwwwww
+12 wwwwwwww
+13 wwwwwwww
+1 yyyyyyyyyyyyyyyyyyyy
+2 abcxxx
+3 abcxxx
+4 aaaaaaaa
+5 aaaaaaaa
+6 aabbccbb
+7 dddwww
+8 dddwww
+9 dddwww
+10 aaaaaaaa
+11 wwwwwwww
+12 wwwwwwww
+13 wwwwwwww
+a
+a
+-1
+15
+15
+15
+255
+15
+15
+15
+255
+15
+15
+15
+255
+15
+15
+15
+255
+15
+15
+15
+255
+15
+15
+15
+255
+15
+15
+15
+255
+15
+15
+15
+255
+15
+15
+15
+255
+15
+15
+15
+3.5
+345.6
+345.6
+345.6
+3.5
+345.6
+345.6
+345.6
+3.5
+345.6
+345.6
+345.6
+3.5+3.5i
+345.6+345.6i
+345.6+345.6i
+345.6+345.6i
+3.5+3.5i
+345.6+345.6i
+345.6+345.6i
+345.6+345.6i
+3.5+3.5i
+345.6+345.6i
+345.6+345.6i
+345.6+345.6i
Index: tests/.expect/poly-cycle.txt
===================================================================
--- tests/.expect/poly-cycle.txt	(revision 463cb3379a0b569bada3eb54e7751c62d819d4ac)
+++ tests/.expect/poly-cycle.txt	(revision 463cb3379a0b569bada3eb54e7751c62d819d4ac)
@@ -0,0 +1,1 @@
+Success!
Index: tests/.in/manipulatorsInput.txt
===================================================================
--- tests/.in/manipulatorsInput.txt	(revision 519f11c3bd79f925ace2b671bf682be5b31bea6f)
+++ tests/.in/manipulatorsInput.txt	(revision 463cb3379a0b569bada3eb54e7751c62d819d4ac)
@@ -27,2 +27,16 @@
 3.5 3.5 3.456E+23.456E+2 -0x1.2p-3 3.5 0X1.23p3     3.5
 3.5 3.5 3.456E+23.456E+2 -0x1.2p-3 3.5 0X1.23p3     3.5
+25 -25 42798
+1402432282 1505850196993244515
+394749758663249135511342
+12935154696204706112391834394
+
+423859149128410414395372834994551
+
+
+13889016598639747063234935497057631587
+170141183460469231731687303715884105727
+340282366920938463463374607431768211455
+-340282366920938463463374607431768211455
+340282366920938463463374607431768211455999
+1234567890123456789 -1234567890123456789
Index: tests/manipulatorsInput.cfa
===================================================================
--- tests/manipulatorsInput.cfa	(revision 519f11c3bd79f925ace2b671bf682be5b31bea6f)
+++ tests/manipulatorsInput.cfa	(revision 463cb3379a0b569bada3eb54e7751c62d819d4ac)
@@ -7,6 +7,6 @@
 // Created On       : Sat Jun  8 17:58:54 2019
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jun 13 17:41:43 2019
-// Update Count     : 37
+// Last Modified On : Wed Jul 15 15:56:03 2020
+// Update Count     : 47
 // 
 
@@ -152,4 +152,13 @@
 		sin | ignore( wdi( 8, ldc ) );			sout | ldc;
 	}
+#if defined( __SIZEOF_INT128__ )
+	{
+		int128 val;
+		for ( 15 ) {
+			sin | val;
+			sout | val;
+		}
+	}
+#endif // __SIZEOF_INT128__
 } // main
 
Index: tests/poly-cycle.cfa
===================================================================
--- tests/poly-cycle.cfa	(revision 463cb3379a0b569bada3eb54e7751c62d819d4ac)
+++ tests/poly-cycle.cfa	(revision 463cb3379a0b569bada3eb54e7751c62d819d4ac)
@@ -0,0 +1,28 @@
+// Check that a cycle of polymorphic data structures can be instancated.
+
+#include <stdio.h>
+
+forall(otype T)
+struct func_table;
+
+forall(otype U)
+struct object {
+	func_table(U) * virtual_table;
+};
+
+forall(otype T)
+struct func_table {
+	void (*object_func)(object(T) *);
+};
+
+void func(object(int) *) {
+	printf("Success!\n");
+}
+
+func_table(int) an_instance = { func };
+
+int main(int argc, char * argv[]) {
+	object(int) x = { 0p };
+	an_instance.object_func( &x );
+	return 0;
+}
