Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 16907789400504da4a690ba2030d00525e23c030)
+++ src/CodeGen/CodeGenerator.cc	(revision 42a36d91a8c8fb911137cec9b51d7e985170aeef)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat May  5 09:08:32 2018
-// Update Count     : 494
+// Last Modified By : Andrew Beach
+// Last Modified On : Wed May  1 10:06:00 2019
+// Update Count     : 495
 //
 #include "CodeGenerator.h"
@@ -83,5 +83,5 @@
 	void CodeGenerator::updateLocation( CodeLocation const & to ) {
 		// skip if linemarks shouldn't appear or if codelocation is unset
-		if ( !lineMarks || to.isUnset() ) return;
+		if ( !options.lineMarks || to.isUnset() ) return;
 
 		if ( currentLocation.followedBy( to, 0 ) ) {
@@ -116,9 +116,10 @@
 	}
 
-	CodeGenerator::CodeGenerator( std::ostream & os, bool pretty, bool genC, bool lineMarks, bool printExprTypes ) : indent( CodeGenerator::tabsize ), output( os ), printLabels( *this ), pretty( pretty ), genC( genC ), lineMarks( lineMarks ), printExprTypes( printExprTypes ), endl( *this ) {}
+	CodeGenerator::CodeGenerator( std::ostream & os, bool pretty, bool genC, bool lineMarks, bool printExprTypes ) : indent( CodeGenerator::tabsize ), output( os ), printLabels( *this ), options( pretty, genC, lineMarks, printExprTypes ), endl( *this ) {}
+	CodeGenerator::CodeGenerator( std::ostream & os, const Options &options ) : indent( CodeGenerator::tabsize ), output( os ), printLabels( *this ), options(options), endl( *this ) {}
 
 	string CodeGenerator::mangleName( DeclarationWithType * decl ) {
 		// GCC builtins should always be printed unmangled
-		if ( pretty || decl->linkage.is_gcc_builtin ) return decl->name;
+		if ( options.pretty || decl->linkage.is_gcc_builtin ) return decl->name;
 		if ( decl->mangleName != "" ) {
 			// need to incorporate scope level in order to differentiate names for destructors
@@ -164,6 +165,6 @@
 		previsit( (BaseSyntaxNode *)node );
 		GuardAction( [this, node](){
-			if ( printExprTypes && node->result ) {
-				output << " /* " << genType( node->result, "", pretty, genC ) << " */ ";
+			if ( options.printExprTypes && node->result ) {
+				output << " /* " << genType( node->result, "", options ) << " */ ";
 			}
 		} );
@@ -173,5 +174,5 @@
 	void CodeGenerator::postvisit( FunctionDecl * functionDecl ) {
 		// deleted decls should never be used, so don't print them
-		if ( functionDecl->isDeleted && genC ) return;
+		if ( functionDecl->isDeleted && options.genC ) return;
 		extension( functionDecl );
 		genAttributes( functionDecl->get_attributes() );
@@ -180,5 +181,5 @@
 		functionDecl->get_funcSpec().print( output );
 
-		output << genType( functionDecl->get_functionType(), mangleName( functionDecl ), pretty, genC );
+		output << genType( functionDecl->get_functionType(), mangleName( functionDecl ), options.pretty, options.genC );
 
 		asmName( functionDecl );
@@ -194,6 +195,6 @@
 	void CodeGenerator::postvisit( ObjectDecl * objectDecl ) {
 		// deleted decls should never be used, so don't print them
-		if ( objectDecl->isDeleted && genC ) return;
-		if (objectDecl->get_name().empty() && genC ) {
+		if ( objectDecl->isDeleted && options.genC ) return;
+		if (objectDecl->get_name().empty() && options.genC ) {
 			// only generate an anonymous name when generating C code, otherwise it clutters the output too much
 			static UniqueName name = { "__anonymous_object" };
@@ -205,5 +206,5 @@
 
 		handleStorageClass( objectDecl );
-		output << genType( objectDecl->get_type(), mangleName( objectDecl ), pretty, genC );
+		output << genType( objectDecl->get_type(), mangleName( objectDecl ), options.pretty, options.genC );
 
 		asmName( objectDecl );
@@ -224,5 +225,5 @@
 
 	void CodeGenerator::handleAggregate( AggregateDecl * aggDecl, const std::string & kind ) {
-		if( ! aggDecl->parameters.empty() && ! genC ) {
+		if( ! aggDecl->parameters.empty() && ! options.genC ) {
 			// assertf( ! genC, "Aggregate type parameters should not reach code generation." );
 			output << "forall(";
@@ -294,5 +295,5 @@
 
 	void CodeGenerator::postvisit( TraitDecl * traitDecl ) {
-		assertf( ! genC, "TraitDecls should not reach code generation." );
+		assertf( ! options.genC, "TraitDecls should not reach code generation." );
 		extension( traitDecl );
 		handleAggregate( traitDecl, "trait " );
@@ -300,11 +301,11 @@
 
 	void CodeGenerator::postvisit( TypedefDecl * typeDecl ) {
-		assertf( ! genC, "Typedefs are removed and substituted in earlier passes." );
+		assertf( ! options.genC, "Typedefs are removed and substituted in earlier passes." );
 		output << "typedef ";
-		output << genType( typeDecl->get_base(), typeDecl->get_name(), pretty, genC ) << endl;
+		output << genType( typeDecl->get_base(), typeDecl->get_name(), options ) << endl;
 	}
 
 	void CodeGenerator::postvisit( TypeDecl * typeDecl ) {
-		assertf( ! genC, "TypeDecls should not reach code generation." );
+		assertf( ! options.genC, "TypeDecls should not reach code generation." );
 		output << typeDecl->genTypeString() << " " << typeDecl->name;
 		if ( typeDecl->sized ) {
@@ -371,5 +372,5 @@
 
 	void CodeGenerator::postvisit( ConstructorInit * init ){
-		assertf( ! genC, "ConstructorInit nodes should not reach code generation." );
+		assertf( ! options.genC, "ConstructorInit nodes should not reach code generation." );
 		// pseudo-output for constructor/destructor pairs
 		output << "<ctorinit>{" << endl << ++indent << "ctor: ";
@@ -507,5 +508,5 @@
 					} else {
 						// no constructors with 0 or more than 2 parameters
-						assertf( ! genC, "UntypedExpr constructor/destructor with 0 or more than 2 parameters." );
+						assertf( ! options.genC, "UntypedExpr constructor/destructor with 0 or more than 2 parameters." );
 						output << "(";
 						(*arg++)->accept( *visitor );
@@ -604,5 +605,5 @@
 			// an lvalue cast, this has been taken out.
 			output << "(";
-			output << genType( castExpr->get_result(), "", pretty, genC );
+			output << genType( castExpr->get_result(), "", options );
 			output << ")";
 		} // if
@@ -612,5 +613,5 @@
 
 	void CodeGenerator::postvisit( KeywordCastExpr * castExpr ) {
-		assertf( ! genC, "KeywordCast should not reach code generation." );
+		assertf( ! options.genC, "KeywordCast should not reach code generation." );
 		extension( castExpr );
 		output << "((" << castExpr->targetString() << " &)";
@@ -620,5 +621,5 @@
 
 	void CodeGenerator::postvisit( VirtualCastExpr * castExpr ) {
-		assertf( ! genC, "VirtualCastExpr should not reach code generation." );
+		assertf( ! options.genC, "VirtualCastExpr should not reach code generation." );
 		extension( castExpr );
 		output << "(virtual ";
@@ -628,5 +629,5 @@
 
 	void CodeGenerator::postvisit( UntypedMemberExpr * memberExpr ) {
-		assertf( ! genC, "UntypedMemberExpr should not reach code generation." );
+		assertf( ! options.genC, "UntypedMemberExpr should not reach code generation." );
 		extension( memberExpr );
 		memberExpr->get_aggregate()->accept( *visitor );
@@ -661,5 +662,5 @@
 		output << "sizeof(";
 		if ( sizeofExpr->get_isType() ) {
-			output << genType( sizeofExpr->get_type(), "", pretty, genC );
+			output << genType( sizeofExpr->get_type(), "", options );
 		} else {
 			sizeofExpr->get_expr()->accept( *visitor );
@@ -673,5 +674,5 @@
 		output << "__alignof__(";
 		if ( alignofExpr->get_isType() ) {
-			output << genType( alignofExpr->get_type(), "", pretty, genC );
+			output << genType( alignofExpr->get_type(), "", options );
 		} else {
 			alignofExpr->get_expr()->accept( *visitor );
@@ -681,7 +682,7 @@
 
 	void CodeGenerator::postvisit( UntypedOffsetofExpr * offsetofExpr ) {
-		assertf( ! genC, "UntypedOffsetofExpr should not reach code generation." );
+		assertf( ! options.genC, "UntypedOffsetofExpr should not reach code generation." );
 		output << "offsetof(";
-		output << genType( offsetofExpr->get_type(), "", pretty, genC );
+		output << genType( offsetofExpr->get_type(), "", options );
 		output << ", " << offsetofExpr->get_member();
 		output << ")";
@@ -691,5 +692,5 @@
 		// use GCC builtin
 		output << "__builtin_offsetof(";
-		output << genType( offsetofExpr->get_type(), "", pretty, genC );
+		output << genType( offsetofExpr->get_type(), "", options );
 		output << ", " << mangleName( offsetofExpr->get_member() );
 		output << ")";
@@ -697,6 +698,6 @@
 
 	void CodeGenerator::postvisit( OffsetPackExpr * offsetPackExpr ) {
-		assertf( ! genC, "OffsetPackExpr should not reach code generation." );
-		output << "__CFA_offsetpack(" << genType( offsetPackExpr->get_type(), "", pretty, genC ) << ")";
+		assertf( ! options.genC, "OffsetPackExpr should not reach code generation." );
+		output << "__CFA_offsetpack(" << genType( offsetPackExpr->get_type(), "", options ) << ")";
 	}
 
@@ -728,5 +729,5 @@
 		extension( commaExpr );
 		output << "(";
-		if ( genC ) {
+		if ( options.genC ) {
 			// arg1 of a CommaExpr is never used, so it can be safely cast to void to reduce gcc warnings.
 			commaExpr->set_arg1( new CastExpr( commaExpr->get_arg1() ) );
@@ -739,10 +740,10 @@
 
 	void CodeGenerator::postvisit( TupleAssignExpr * tupleExpr ) {
-		assertf( ! genC, "TupleAssignExpr should not reach code generation." );
+		assertf( ! options.genC, "TupleAssignExpr should not reach code generation." );
 		tupleExpr->stmtExpr->accept( *visitor );
 	}
 
 	void CodeGenerator::postvisit( UntypedTupleExpr * tupleExpr ) {
-		assertf( ! genC, "UntypedTupleExpr should not reach code generation." );
+		assertf( ! options.genC, "UntypedTupleExpr should not reach code generation." );
 		extension( tupleExpr );
 		output << "[";
@@ -752,5 +753,5 @@
 
 	void CodeGenerator::postvisit( TupleExpr * tupleExpr ) {
-		assertf( ! genC, "TupleExpr should not reach code generation." );
+		assertf( ! options.genC, "TupleExpr should not reach code generation." );
 		extension( tupleExpr );
 		output << "[";
@@ -760,5 +761,5 @@
 
 	void CodeGenerator::postvisit( TupleIndexExpr * tupleExpr ) {
-		assertf( ! genC, "TupleIndexExpr should not reach code generation." );
+		assertf( ! options.genC, "TupleIndexExpr should not reach code generation." );
 		extension( tupleExpr );
 		tupleExpr->get_tuple()->accept( *visitor );
@@ -767,8 +768,8 @@
 
 	void CodeGenerator::postvisit( TypeExpr * typeExpr ) {
-		// if ( genC ) std::cerr << "typeexpr still exists: " << typeExpr << std::endl;
-		// assertf( ! genC, "TypeExpr should not reach code generation." );
-		if ( ! genC ) {
-			output<< genType( typeExpr->get_type(), "", pretty, genC );
+		// if ( options.genC ) std::cerr << "typeexpr still exists: " << typeExpr << std::endl;
+		// assertf( ! options.genC, "TypeExpr should not reach code generation." );
+		if ( ! options.genC ) {
+			output << genType( typeExpr->get_type(), "", options );
 		}
 	}
@@ -788,10 +789,10 @@
 	void CodeGenerator::postvisit( CompoundLiteralExpr *compLitExpr ) {
 		assert( compLitExpr->get_result() && dynamic_cast< ListInit * > ( compLitExpr->get_initializer() ) );
-		output << "(" << genType( compLitExpr->get_result(), "", pretty, genC ) << ")";
+		output << "(" << genType( compLitExpr->get_result(), "", options ) << ")";
 		compLitExpr->get_initializer()->accept( *visitor );
 	}
 
 	void CodeGenerator::postvisit( UniqueExpr * unqExpr ) {
-		assertf( ! genC, "Unique expressions should not reach code generation." );
+		assertf( ! options.genC, "Unique expressions should not reach code generation." );
 		output << "unq<" << unqExpr->get_id() << ">{ ";
 		unqExpr->get_expr()->accept( *visitor );
@@ -829,20 +830,20 @@
 
 	void CodeGenerator::postvisit( ConstructorExpr * expr ) {
-		assertf( ! genC, "Unique expressions should not reach code generation." );
+		assertf( ! options.genC, "Unique expressions should not reach code generation." );
 		expr->callExpr->accept( *visitor );
 	}
 
 	void CodeGenerator::postvisit( DeletedExpr * expr ) {
-		assertf( ! genC, "Deleted expressions should not reach code generation." );
+		assertf( ! options.genC, "Deleted expressions should not reach code generation." );
 		expr->expr->accept( *visitor );
 	}
 
 	void CodeGenerator::postvisit( DefaultArgExpr * arg ) {
-		assertf( ! genC, "Default argument expressions should not reach code generation." );
+		assertf( ! options.genC, "Default argument expressions should not reach code generation." );
 		arg->expr->accept( *visitor );
 	}
 
 	void CodeGenerator::postvisit( GenericExpr * expr ) {
-		assertf( ! genC, "C11 _Generic expressions should not reach code generation." );
+		assertf( ! options.genC, "C11 _Generic expressions should not reach code generation." );
 		output << "_Generic(";
 		expr->control->accept( *visitor );
@@ -854,5 +855,5 @@
 				output << "default: ";
 			} else {
-				output << genType( assoc.type, "", pretty, genC ) << ": ";
+				output << genType( assoc.type, "", options ) << ": ";
 			}
 			assoc.expr->accept( *visitor );
@@ -889,5 +890,5 @@
 	void CodeGenerator::postvisit( ExprStmt * exprStmt ) {
 		assert( exprStmt );
-		if ( genC ) {
+		if ( options.genC ) {
 			// cast the top-level expression to void to reduce gcc warnings.
 			exprStmt->set_expr( new CastExpr( exprStmt->get_expr() ) );
@@ -999,10 +1000,10 @@
 		  case BranchStmt::FallThrough:
 		  case BranchStmt::FallThroughDefault:
-			assertf( ! genC, "fallthru should not reach code generation." );
+			assertf( ! options.genC, "fallthru should not reach code generation." );
 		  output << "fallthru";
 			break;
 		} // switch
 		// print branch target for labelled break/continue/fallthru in debug mode
-		if ( ! genC && branchStmt->get_type() != BranchStmt::Goto ) {
+		if ( ! options.genC && branchStmt->get_type() != BranchStmt::Goto ) {
 			if ( ! branchStmt->get_target().empty() ) {
 				output << " " << branchStmt->get_target();
@@ -1021,5 +1022,5 @@
 
 	void CodeGenerator::postvisit( ThrowStmt * throwStmt ) {
-		assertf( ! genC, "Throw statements should not reach code generation." );
+		assertf( ! options.genC, "Throw statements should not reach code generation." );
 
 		output << ((throwStmt->get_kind() == ThrowStmt::Terminate) ?
@@ -1036,5 +1037,5 @@
 	}
 	void CodeGenerator::postvisit( CatchStmt * stmt ) {
-		assertf( ! genC, "Catch statements should not reach code generation." );
+		assertf( ! options.genC, "Catch statements should not reach code generation." );
 
 		output << ((stmt->get_kind() == CatchStmt::Terminate) ?
@@ -1053,5 +1054,5 @@
 
 	void CodeGenerator::postvisit( WaitForStmt * stmt ) {
-		assertf( ! genC, "Waitfor statements should not reach code generation." );
+		assertf( ! options.genC, "Waitfor statements should not reach code generation." );
 
 		bool first = true;
@@ -1099,5 +1100,5 @@
 
 	void CodeGenerator::postvisit( WithStmt * with ) {
-		if ( ! genC ) {
+		if ( ! options.genC ) {
 			output << "with ( ";
 			genCommaList( with->exprs.begin(), with->exprs.end() );
@@ -1165,5 +1166,5 @@
 
 	void CodeGenerator::postvisit( ImplicitCtorDtorStmt * stmt ) {
-		assertf( ! genC, "ImplicitCtorDtorStmts should not reach code generation." );
+		assertf( ! options.genC, "ImplicitCtorDtorStmts should not reach code generation." );
 		stmt->callStmt->accept( *visitor );
 	}
Index: src/CodeGen/CodeGenerator.h
===================================================================
--- src/CodeGen/CodeGenerator.h	(revision 16907789400504da4a690ba2030d00525e23c030)
+++ src/CodeGen/CodeGenerator.h	(revision 42a36d91a8c8fb911137cec9b51d7e985170aeef)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Fri Aug 18 15:40:00 2017
-// Update Count     : 56
+// Last Modified On : Tue Apr 30 12:01:00 2019
+// Update Count     : 57
 //
 
@@ -20,4 +20,5 @@
 #include <string>                 // for string
 
+#include "CodeGen/Options.h"      // for Options
 #include "Common/Indenter.h"      // for Indenter
 #include "Common/PassVisitor.h"   // for PassVisitor
@@ -31,4 +32,5 @@
 
 		CodeGenerator( std::ostream &os, bool pretty = false, bool genC = false, bool lineMarks = false, bool printExprTypes = false );
+		CodeGenerator( std::ostream &os, const Options &options );
 
 		//*** Turn off visit_children for all nodes
@@ -144,8 +146,5 @@
 		std::ostream & output;
 		LabelPrinter printLabels;
-		bool pretty = false;  // pretty print
-		bool genC = false;    // true if output has to be C code
-		bool lineMarks = false;
-		bool printExprTypes = false;
+		Options options;
 	public:
 		LineEnder endl;
Index: src/CodeGen/GenType.cc
===================================================================
--- src/CodeGen/GenType.cc	(revision 16907789400504da4a690ba2030d00525e23c030)
+++ src/CodeGen/GenType.cc	(revision 42a36d91a8c8fb911137cec9b51d7e985170aeef)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Mar 17 09:02:28 2017
-// Update Count     : 22
+// Last Modified By : Andrew Beach
+// Last Modified On : Wed May  1 15:24:00 2019
+// Update Count     : 23
 //
 #include "GenType.h"
@@ -28,5 +28,5 @@
 	struct GenType : public WithVisitorRef<GenType>, public WithShortCircuiting {
 		std::string typeString;
-		GenType( const std::string &typeString, bool pretty, bool genC, bool lineMarks );
+		GenType( const std::string &typeString, const Options &options );
 
 		void previsit( BaseSyntaxNode * );
@@ -57,15 +57,13 @@
 		void genArray( const Type::Qualifiers &qualifiers, Type *base, Expression *dimension, bool isVarLen, bool isStatic );
 
-		bool pretty = false;    // pretty print
-		bool genC = false;      // generating C code?
-		bool lineMarks = false; // lineMarks on for CodeGenerator?
+		Options options;
 	};
 
-	std::string genType( Type *type, const std::string &baseString, bool pretty, bool genC , bool lineMarks ) {
-		PassVisitor<GenType> gt( baseString, pretty, genC, lineMarks );
+	std::string genType( Type *type, const std::string &baseString, const Options &options ) {
+		PassVisitor<GenType> gt( baseString, options );
 		std::ostringstream os;
 
 		if ( ! type->get_attributes().empty() ) {
-			PassVisitor<CodeGenerator> cg( os, pretty, genC, lineMarks );
+			PassVisitor<CodeGenerator> cg( os, options );
 			cg.pass.genAttributes( type->get_attributes() );
 		} // if
@@ -75,9 +73,13 @@
 	}
 
-  std::string genPrettyType( Type * type, const std::string & baseString ) {
-  	return genType( type, baseString, true, false );
-  }
-
-	GenType::GenType( const std::string &typeString, bool pretty, bool genC, bool lineMarks ) : typeString( typeString ), pretty( pretty ), genC( genC ), lineMarks( lineMarks ) {}
+	std::string genType( Type *type, const std::string &baseString, bool pretty, bool genC , bool lineMarks ) {
+		return genType( type, baseString, Options(pretty, genC, lineMarks, false ) );
+	}
+
+	std::string genPrettyType( Type * type, const std::string & baseString ) {
+		return genType( type, baseString, true, false );
+	}
+
+	GenType::GenType( const std::string &typeString, const Options &options ) : typeString( typeString ), options( options ) {}
 
 	// *** BaseSyntaxNode
@@ -133,5 +135,5 @@
 		} // if
 		if ( dimension != 0 ) {
-			PassVisitor<CodeGenerator> cg( os, pretty, genC, lineMarks );
+			PassVisitor<CodeGenerator> cg( os, options );
 			dimension->accept( cg );
 		} else if ( isVarLen ) {
@@ -167,5 +169,5 @@
 	void GenType::postvisit( ReferenceType * refType ) {
 		assert( refType->base != 0);
-		assertf( ! genC, "Reference types should not reach code generation." );
+		assertf( ! options.genC, "Reference types should not reach code generation." );
 		handleQualifiers( refType );
 		typeString = "&" + typeString;
@@ -195,5 +197,5 @@
 			} // if
 		} else {
-			PassVisitor<CodeGenerator> cg( os, pretty, genC, lineMarks );
+			PassVisitor<CodeGenerator> cg( os, options );
 			os << "(" ;
 
@@ -215,8 +217,8 @@
 
 		// add forall
-		if( ! funcType->forall.empty() && ! genC ) {
+		if( ! funcType->forall.empty() && ! options.genC ) {
 			// assertf( ! genC, "Aggregate type parameters should not reach code generation." );
 			std::ostringstream os;
-			PassVisitor<CodeGenerator> cg( os, pretty, genC, lineMarks );
+			PassVisitor<CodeGenerator> cg( os, options );
 			os << "forall(";
 			cg.pass.genCommaList( funcType->forall.begin(), funcType->forall.end() );
@@ -229,5 +231,5 @@
 		if ( ! refType->parameters.empty() ) {
 			std::ostringstream os;
-			PassVisitor<CodeGenerator> cg( os, pretty, genC, lineMarks );
+			PassVisitor<CodeGenerator> cg( os, options );
 			os << "(";
 			cg.pass.genCommaList( refType->parameters.begin(), refType->parameters.end() );
@@ -240,5 +242,5 @@
 	void GenType::postvisit( StructInstType * structInst )  {
 		typeString = structInst->name + handleGeneric( structInst ) + " " + typeString;
-		if ( genC ) typeString = "struct " + typeString;
+		if ( options.genC ) typeString = "struct " + typeString;
 		handleQualifiers( structInst );
 	}
@@ -246,5 +248,5 @@
 	void GenType::postvisit( UnionInstType * unionInst ) {
 		typeString = unionInst->name + handleGeneric( unionInst ) + " " + typeString;
-		if ( genC ) typeString = "union " + typeString;
+		if ( options.genC ) typeString = "union " + typeString;
 		handleQualifiers( unionInst );
 	}
@@ -252,5 +254,5 @@
 	void GenType::postvisit( EnumInstType * enumInst ) {
 		typeString = enumInst->name + " " + typeString;
-		if ( genC ) typeString = "enum " + typeString;
+		if ( options.genC ) typeString = "enum " + typeString;
 		handleQualifiers( enumInst );
 	}
@@ -262,5 +264,5 @@
 
 	void GenType::postvisit( TupleType * tupleType ) {
-		assertf( ! genC, "Tuple types should not reach code generation." );
+		assertf( ! options.genC, "Tuple types should not reach code generation." );
 		unsigned int i = 0;
 		std::ostringstream os;
@@ -268,5 +270,5 @@
 		for ( Type * t : *tupleType ) {
 			i++;
-			os << genType( t, "", pretty, genC, lineMarks ) << (i == tupleType->size() ? "" : ", ");
+			os << genType( t, "", options ) << (i == tupleType->size() ? "" : ", ");
 		}
 		os << "] ";
@@ -281,5 +283,5 @@
 	void GenType::postvisit( ZeroType * zeroType ) {
 		// ideally these wouldn't hit codegen at all, but should be safe to make them ints
-		typeString = (pretty ? "zero_t " : "long int ") + typeString;
+		typeString = (options.pretty ? "zero_t " : "long int ") + typeString;
 		handleQualifiers( zeroType );
 	}
@@ -287,15 +289,15 @@
 	void GenType::postvisit( OneType * oneType ) {
 		// ideally these wouldn't hit codegen at all, but should be safe to make them ints
-		typeString = (pretty ? "one_t " : "long int ") + typeString;
+		typeString = (options.pretty ? "one_t " : "long int ") + typeString;
 		handleQualifiers( oneType );
 	}
 
 	void GenType::postvisit( GlobalScopeType * globalType ) {
-		assertf( ! genC, "Global scope type should not reach code generation." );
+		assertf( ! options.genC, "Global scope type should not reach code generation." );
 		handleQualifiers( globalType );
 	}
 
 	void GenType::postvisit( TraitInstType * inst ) {
-		assertf( ! genC, "Trait types should not reach code generation." );
+		assertf( ! options.genC, "Trait types should not reach code generation." );
 		typeString = inst->name + " " + typeString;
 		handleQualifiers( inst );
@@ -304,5 +306,5 @@
 	void GenType::postvisit( TypeofType * typeof ) {
 		std::ostringstream os;
-		PassVisitor<CodeGenerator> cg( os, pretty, genC, lineMarks );
+		PassVisitor<CodeGenerator> cg( os, options );
 		os << "typeof(";
 		typeof->expr->accept( cg );
@@ -313,7 +315,7 @@
 
 	void GenType::postvisit( QualifiedType * qualType ) {
-		assertf( ! genC, "Qualified types should not reach code generation." );
-		std::ostringstream os;
-		os << genType( qualType->parent, "", pretty, genC, lineMarks ) << "." << genType( qualType->child, "", pretty, genC, lineMarks ) << typeString;
+		assertf( ! options.genC, "Qualified types should not reach code generation." );
+		std::ostringstream os;
+		os << genType( qualType->parent, "", options ) << "." << genType( qualType->child, "", options ) << typeString;
 		typeString = os.str();
 		handleQualifiers( qualType );
@@ -333,5 +335,5 @@
 			typeString = "_Atomic " + typeString;
 		} // if
-		if ( type->get_lvalue() && ! genC ) {
+		if ( type->get_lvalue() && ! options.genC ) {
 			// when not generating C code, print lvalue for debugging.
 			typeString = "lvalue " + typeString;
Index: src/CodeGen/GenType.h
===================================================================
--- src/CodeGen/GenType.h	(revision 16907789400504da4a690ba2030d00525e23c030)
+++ src/CodeGen/GenType.h	(revision 42a36d91a8c8fb911137cec9b51d7e985170aeef)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 21 22:17:23 2017
-// Update Count     : 2
+// Last Modified By : Andrew Beach
+// Last Modified On : Tue Apr 30 11:47:00 2019
+// Update Count     : 3
 //
 
@@ -18,7 +18,10 @@
 #include <string>  // for string
 
+#include "CodeGen/Options.h" // for Options
+
 class Type;
 
 namespace CodeGen {
+	std::string genType( Type *type, const std::string &baseString, const Options &options );
 	std::string genType( Type *type, const std::string &baseString, bool pretty = false, bool genC = false, bool lineMarks = false );
   std::string genPrettyType( Type * type, const std::string & baseString );
Index: src/CodeGen/Options.h
===================================================================
--- src/CodeGen/Options.h	(revision 42a36d91a8c8fb911137cec9b51d7e985170aeef)
+++ src/CodeGen/Options.h	(revision 42a36d91a8c8fb911137cec9b51d7e985170aeef)
@@ -0,0 +1,36 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// Options.h --
+//
+// Author           : Andrew Beach
+// Created On       : Tue Apr 30 11:36:00 2019
+// Last Modified By : Andrew Beach
+// Last Modified On : Wed May  1 09:51:00 2019
+// Update Count     : 0
+//
+
+#pragma once
+
+namespace CodeGen {
+	struct Options {
+		// External Options: Same thoughout a pass.
+		bool pretty;
+		bool genC;
+		bool lineMarks;
+		bool printExprTypes;
+
+		Options(bool pretty, bool genC, bool lineMarks, bool printExprTypes) :
+			pretty(pretty), genC(genC), lineMarks(lineMarks), printExprTypes(printExprTypes)
+		{}
+	};
+} // namespace CodeGen
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
