Index: src/GenPoly/Box.cc
===================================================================
--- src/GenPoly/Box.cc	(revision 6d4d1a6cb61ef1c5bd941a1240e54345831e261e)
+++ src/GenPoly/Box.cc	(revision 8bf784a480c5767f00136e0ea0f9174c442f327f)
@@ -686,5 +686,5 @@
 			for ( std::list< Expression* >::iterator param = params.begin(); param != params.end(); ++param ) {
 				TypeExpr *paramType = dynamic_cast< TypeExpr* >( *param );
-				assert(paramType && "Aggregate parameters should be type expressions");
+				assertf(paramType, "Aggregate parameters should be type expressions");
 				paramType->set_type( replaceWithConcrete( appExpr, paramType->get_type(), false ) );
 			}
Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 6d4d1a6cb61ef1c5bd941a1240e54345831e261e)
+++ src/InitTweak/FixInit.cc	(revision 8bf784a480c5767f00136e0ea0f9174c442f327f)
@@ -38,4 +38,5 @@
 #include "SynTree/AddStmtVisitor.h"
 #include "CodeGen/GenType.h"  // for warning/error messages
+#include "Tuples/Tuples.h"
 
 bool ctordtorp = false; // print all debug
@@ -392,5 +393,5 @@
 
 		bool ResolveCopyCtors::skipCopyConstruct( Type * type ) {
-			return dynamic_cast< VarArgsType * >( type ) || GenPoly::getFunctionType( type );
+			return dynamic_cast< VarArgsType * >( type ) || GenPoly::getFunctionType( type ) || Tuples::isTtype( type );
 		}
 
Index: src/SymTab/Mangler.cc
===================================================================
--- src/SymTab/Mangler.cc	(revision 6d4d1a6cb61ef1c5bd941a1240e54345831e261e)
+++ src/SymTab/Mangler.cc	(revision 8bf784a480c5767f00136e0ea0f9174c442f327f)
@@ -214,4 +214,9 @@
 				mangleName << "f";
 				break;
+				case TypeDecl::Ttype:
+				mangleName << "tVARGS";
+				break;
+				default:
+				assert( false );
 			} // switch
 			mangleName << numStream.str();
@@ -256,5 +261,5 @@
 		if ( ! type->get_forall().empty() ) {
 			std::list< std::string > assertionNames;
-			int tcount = 0, dcount = 0, fcount = 0;
+			int tcount = 0, dcount = 0, fcount = 0, vcount = 0;
 			mangleName << "A";
 			for ( Type::ForallList::iterator i = type->get_forall().begin(); i != type->get_forall().end(); ++i ) {
@@ -269,4 +274,9 @@
 					fcount++;
 					break;
+				  case TypeDecl::Ttype:
+					vcount++;
+					break;
+				  default:
+					assert( false );
 				} // switch
 				varNums[ (*i )->get_name() ] = std::pair< int, int >( nextVarNum++, (int )(*i )->get_kind() );
@@ -280,5 +290,5 @@
 				} // for
 			} // for
-			mangleName << tcount << "_" << dcount << "_" << fcount << "_";
+			mangleName << tcount << "_" << dcount << "_" << fcount << "_" << vcount << "_";
 			std::copy( assertionNames.begin(), assertionNames.end(), std::ostream_iterator< std::string >( mangleName, "" ) );
 			mangleName << "_";
Index: src/SynTree/Declaration.cc
===================================================================
--- src/SynTree/Declaration.cc	(revision 6d4d1a6cb61ef1c5bd941a1240e54345831e261e)
+++ src/SynTree/Declaration.cc	(revision 8bf784a480c5767f00136e0ea0f9174c442f327f)
@@ -57,5 +57,9 @@
 
 std::ostream & operator<<( std::ostream & out, const Declaration * decl ) {
-	decl->print( out );
+	if ( decl ){
+		decl->print( out );
+	} else {
+		out << "nullptr";
+	}
 	return out;
 }
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 6d4d1a6cb61ef1c5bd941a1240e54345831e261e)
+++ src/SynTree/Expression.cc	(revision 8bf784a480c5767f00136e0ea0f9174c442f327f)
@@ -672,5 +672,9 @@
 
 std::ostream & operator<<( std::ostream & out, const Expression * expr ) {
-	expr->print( out );
+	if ( expr ) {
+		expr->print( out );
+	} else {
+		out << "nullptr";
+	}
 	return out;
 }
Index: src/SynTree/FunctionType.cc
===================================================================
--- src/SynTree/FunctionType.cc	(revision 6d4d1a6cb61ef1c5bd941a1240e54345831e261e)
+++ src/SynTree/FunctionType.cc	(revision 8bf784a480c5767f00136e0ea0f9174c442f327f)
@@ -5,5 +5,5 @@
 // file "LICENCE" distributed with Cforall.
 //
-// FunctionType.cc -- 
+// FunctionType.cc --
 //
 // Author           : Richard C. Bilson
@@ -19,4 +19,5 @@
 #include "Declaration.h"
 #include "Common/utility.h"
+#include "Tuples/Tuples.h"
 
 FunctionType::FunctionType( const Type::Qualifiers &tq, bool isVarArgs ) : Type( tq ), isVarArgs( isVarArgs ) {
@@ -31,4 +32,17 @@
 	deleteAll( returnVals );
 	deleteAll( parameters );
+}
+
+namespace {
+	bool containsTtype( const std::list<DeclarationWithType * > & l ) {
+		if ( ! l.empty() ) {
+			return Tuples::isTtype( l.back()->get_type() );
+		}
+		return false;
+	}
+}
+
+bool FunctionType::isTtype() const {
+	return containsTtype( returnVals ) || containsTtype( parameters );
 }
 
Index: src/SynTree/Statement.cc
===================================================================
--- src/SynTree/Statement.cc	(revision 6d4d1a6cb61ef1c5bd941a1240e54345831e261e)
+++ src/SynTree/Statement.cc	(revision 8bf784a480c5767f00136e0ea0f9174c442f327f)
@@ -388,5 +388,9 @@
 
 std::ostream & operator<<( std::ostream & out, const Statement * statement ) {
-	statement->print( out );
+	if ( statement ) {
+		statement->print( out );
+	} else {
+		out << "nullptr";
+	}
 	return out;
 }
Index: src/SynTree/Type.cc
===================================================================
--- src/SynTree/Type.cc	(revision 6d4d1a6cb61ef1c5bd941a1240e54345831e261e)
+++ src/SynTree/Type.cc	(revision 8bf784a480c5767f00136e0ea0f9174c442f327f)
@@ -85,5 +85,9 @@
 
 std::ostream & operator<<( std::ostream & out, const Type * type ) {
-	type->print( out );
+	if ( type ) {
+		type->print( out );
+	} else {
+		out << "nullptr";
+	}
 	return out;
 }
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision 6d4d1a6cb61ef1c5bd941a1240e54345831e261e)
+++ src/SynTree/Type.h	(revision 8bf784a480c5767f00136e0ea0f9174c442f327f)
@@ -204,6 +204,8 @@
 	std::list<DeclarationWithType*> & get_returnVals() { return returnVals; }
 	std::list<DeclarationWithType*> & get_parameters() { return parameters; }
-	bool get_isVarArgs() { return isVarArgs; }
+	bool get_isVarArgs() const { return isVarArgs; }
 	void set_isVarArgs( bool newValue ) { isVarArgs = newValue; }
+
+	bool isTtype() const;
 
 	virtual FunctionType *clone() const { return new FunctionType( *this ); }
Index: src/SynTree/TypeDecl.cc
===================================================================
--- src/SynTree/TypeDecl.cc	(revision 6d4d1a6cb61ef1c5bd941a1240e54345831e261e)
+++ src/SynTree/TypeDecl.cc	(revision 8bf784a480c5767f00136e0ea0f9174c442f327f)
@@ -18,5 +18,5 @@
 #include "Common/utility.h"
 
-TypeDecl::TypeDecl( const std::string &name, DeclarationNode::StorageClass sc, Type *type, Kind kind ) : Parent( name, sc, type ), kind( kind ), sized( kind == Any ) {
+TypeDecl::TypeDecl( const std::string &name, DeclarationNode::StorageClass sc, Type *type, Kind kind ) : Parent( name, sc, type ), kind( kind ), sized( kind == Any || kind == Ttype ) {
 }
 
@@ -25,5 +25,5 @@
 
 std::string TypeDecl::typeString() const {
-	static const char *kindNames[] = { "type", "incomplete type", "function type" };
+	static const char *kindNames[] = { "type", "incomplete type", "function type", "tuple type" };
 	return kindNames[ kind ];
 }
Index: src/Tuples/TupleExpansion.cc
===================================================================
--- src/Tuples/TupleExpansion.cc	(revision 6d4d1a6cb61ef1c5bd941a1240e54345831e261e)
+++ src/Tuples/TupleExpansion.cc	(revision 8bf784a480c5767f00136e0ea0f9174c442f327f)
@@ -318,4 +318,13 @@
 	}
 
+	TypeInstType * isTtype( Type * type ) {
+		if ( TypeInstType * inst = dynamic_cast< TypeInstType * >( type ) ) {
+			if ( inst->get_baseType()->get_kind() == TypeDecl::Ttype ) {
+				return inst;
+			}
+		}
+		return nullptr;
+	}
+
 	namespace {
 		/// determines if impurity (read: side-effects) may exist in a piece of code. Currently gives a very crude approximation, wherein any function call expression means the code may be impure
Index: src/Tuples/Tuples.h
===================================================================
--- src/Tuples/Tuples.h	(revision 6d4d1a6cb61ef1c5bd941a1240e54345831e261e)
+++ src/Tuples/Tuples.h	(revision 8bf784a480c5767f00136e0ea0f9174c442f327f)
@@ -42,4 +42,7 @@
 	Type * makeTupleType( const std::list< Expression * > & exprs );
 
+	/// returns a TypeInstType if `type` is a ttype, nullptr otherwise
+	TypeInstType * isTtype( Type * type );
+
 	/// returns true if the expression may contain side-effects.
 	bool maybeImpure( Expression * expr );
