Index: src/CodeGen/FixNames.cc
===================================================================
--- src/CodeGen/FixNames.cc	(revision f1e80d86555c7d3569436d4608786daf383df90a)
+++ src/CodeGen/FixNames.cc	(revision d56e5bcda08aa6816d20a750cfe4087387b7681f)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 16 07:50:30 2017
-// Update Count     : 16
+// Last Modified On : Wed Jun 21 14:22:59 2017
+// Update Count     : 19
 //
 
@@ -114,5 +114,5 @@
 				throw SemanticError("Main expected to have 0, 2 or 3 arguments\n", functionDecl); 
 			}
-			functionDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new ConstantExpr( Constant( new BasicType( Type::Qualifiers(), BasicType::SignedInt ), "0") ) ) );
+			functionDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new ConstantExpr( Constant::from_int( 0 ) ) ) );
 			CodeGen::FixMain::registerMain( functionDecl );
 		}
Index: src/GenPoly/Box.cc
===================================================================
--- src/GenPoly/Box.cc	(revision f1e80d86555c7d3569436d4608786daf383df90a)
+++ src/GenPoly/Box.cc	(revision d56e5bcda08aa6816d20a750cfe4087387b7681f)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat May 13 09:26:38 2017
-// Update Count     : 341
+// Last Modified On : Wed Jun 21 15:49:59 2017
+// Update Count     : 346
 //
 
@@ -341,5 +341,5 @@
 	Statement *makeAlignTo( Expression *lhs, Expression *rhs ) {
 		// check that the lhs is zeroed out to the level of rhs
-		Expression *ifCond = makeOp( "?&?", lhs, makeOp( "?-?", rhs, new ConstantExpr( Constant( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), "1" ) ) ) );
+		Expression *ifCond = makeOp( "?&?", lhs, makeOp( "?-?", rhs, new ConstantExpr( Constant::from_ulong( 1 ) ) ) );
 		// if not aligned, increment to alignment
 		Expression *ifExpr = makeOp( "?+=?", lhs->clone(), makeOp( "?-?", rhs->clone(), ifCond->clone() ) );
@@ -384,6 +384,6 @@
 
 		// initialize size and alignment to 0 and 1 (will have at least one member to re-edit size)
-		addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( sizeParam ), new ConstantExpr( Constant( sizeAlignType->clone(), "0" ) ) ) );
-		addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( alignParam ), new ConstantExpr( Constant( sizeAlignType->clone(), "1" ) ) ) );
+		addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( sizeParam ), new ConstantExpr( Constant::from_ulong( 0 ) ) ) );
+		addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( alignParam ), new ConstantExpr( Constant::from_ulong( 1 ) ) ) );
 		unsigned long n_members = 0;
 		bool firstMember = true;
@@ -441,6 +441,6 @@
 
 		// calculate union layout in function body
-		addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( sizeParam ), new ConstantExpr( Constant( sizeAlignType->clone(), "1" ) ) ) );
-		addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( alignParam ), new ConstantExpr( Constant( sizeAlignType->clone(), "1" ) ) ) );
+		addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( sizeParam ), new ConstantExpr( Constant::from_ulong( 1 ) ) ) );
+		addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( alignParam ), new ConstantExpr( Constant::from_ulong( 1 ) ) ) );
 		for ( std::list< Declaration* >::const_iterator member = unionDecl->get_members().begin(); member != unionDecl->get_members().end(); ++member ) {
 			DeclarationWithType *dwt = dynamic_cast< DeclarationWithType * >( *member );
@@ -1564,7 +1564,5 @@
 		/// Returns an index expression into the offset array for a type
 		Expression *makeOffsetIndex( Type *objectType, long i ) {
-			std::stringstream offset_namer;
-			offset_namer << i;
-			ConstantExpr *fieldIndex = new ConstantExpr( Constant( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), offset_namer.str() ) );
+			ConstantExpr *fieldIndex = new ConstantExpr( Constant::from_ulong( i ) );
 			UntypedExpr *fieldOffset = new UntypedExpr( new NameExpr( "?[?]" ) );
 			fieldOffset->get_args().push_back( new NameExpr( offsetofName( mangleType( objectType ) ) ) );
@@ -1779,5 +1777,5 @@
 				// all union members are at offset zero
 				delete offsetofExpr;
-				return new ConstantExpr( Constant( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), "0" ) );
+				return new ConstantExpr( Constant::from_ulong( 0 ) );
 			} else return offsetofExpr;
 		}
Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision f1e80d86555c7d3569436d4608786daf383df90a)
+++ src/InitTweak/FixInit.cc	(revision d56e5bcda08aa6816d20a750cfe4087387b7681f)
@@ -10,6 +10,6 @@
 // Created On       : Wed Jan 13 16:29:30 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Mar 17 09:13:47 2017
-// Update Count     : 71
+// Last Modified On : Wed Jun 21 17:35:05 2017
+// Update Count     : 74
 //
 
@@ -726,5 +726,5 @@
 						// static bool __objName_uninitialized = true
 						BasicType * boolType = new BasicType( Type::Qualifiers(), BasicType::Bool );
-						SingleInit * boolInitExpr = new SingleInit( new ConstantExpr( Constant( boolType->clone(), "1" ) ), noDesignators );
+						SingleInit * boolInitExpr = new SingleInit( new ConstantExpr( Constant::from_int( 1 ) ), noDesignators );
 						ObjectDecl * isUninitializedVar = new ObjectDecl( objDecl->get_mangleName() + "_uninitialized", Type::StorageClasses( Type::Static ), LinkageSpec::Cforall, 0, boolType, boolInitExpr );
 						isUninitializedVar->fixUniqueId();
@@ -733,5 +733,5 @@
 						UntypedExpr * setTrue = new UntypedExpr( new NameExpr( "?=?" ) );
 						setTrue->get_args().push_back( new VariableExpr( isUninitializedVar ) );
-						setTrue->get_args().push_back( new ConstantExpr( Constant( boolType->clone(), "0" ) ) );
+						setTrue->get_args().push_back( new ConstantExpr( Constant::from_int( 0 ) ) );
 
 						// generate body of if
Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision f1e80d86555c7d3569436d4608786daf383df90a)
+++ src/Parser/ExpressionNode.cc	(revision d56e5bcda08aa6816d20a750cfe4087387b7681f)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:17:07 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed May 17 21:31:01 2017
-// Update Count     : 527
+// Last Modified On : Wed Jun 21 16:44:46 2017
+// Update Count     : 541
 //
 
@@ -62,5 +62,5 @@
 	bool dec = true, Unsigned = false;					// decimal, unsigned constant
 	int size;											// 0 => int, 1 => long, 2 => long long
-	unsigned long long v;								// converted integral value
+	unsigned long long int v;								// converted integral value
 	size_t last = str.length() - 1;						// last character of constant
 
@@ -118,5 +118,5 @@
 	} // if
 
-	Expression * ret = new ConstantExpr( Constant( new BasicType( emptyQualifiers, kind[Unsigned][size] ), str ) );
+	Expression * ret = new ConstantExpr( Constant( new BasicType( emptyQualifiers, kind[Unsigned][size] ), str, v ) );
 	delete &str;										// created by lex
 	return ret;
@@ -133,4 +133,7 @@
 	// floating-point constant has minimum of 2 characters: 1. or .1
 	size_t last = str.length() - 1;
+	double v;
+
+	sscanf( str.c_str(), "%lg", &v );
 
 	if ( checkI( str[last] ) ) {						// imaginary ?
@@ -150,5 +153,5 @@
 	} // if
 
-	Expression * ret = new ConstantExpr( Constant( new BasicType( emptyQualifiers, kind[complx][size] ), str ) );
+	Expression * ret = new ConstantExpr( Constant( new BasicType( emptyQualifiers, kind[complx][size] ), str, v ) );
 	delete &str;										// created by lex
 	return ret;
@@ -156,5 +159,5 @@
 
 Expression *build_constantChar( const std::string & str ) {
-	Expression * ret = new ConstantExpr( Constant( new BasicType( emptyQualifiers, BasicType::Char ), str ) );
+	Expression * ret = new ConstantExpr( Constant( new BasicType( emptyQualifiers, BasicType::Char ), str, (unsigned long long int)(unsigned char)str[1] ) );
 	delete &str;										// created by lex
 	return ret;
@@ -164,8 +167,8 @@
 	// string should probably be a primitive type
 	ArrayType *at = new ArrayType( emptyQualifiers, new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ),
-				new ConstantExpr( Constant( new BasicType( emptyQualifiers, BasicType::UnsignedInt ),
-											toString( str.size()+1-2 ) ) ),  // +1 for '\0' and -2 for '"'
+								   new ConstantExpr( Constant::from_ulong( str.size() + 1 - 2 ) ),  // +1 for '\0' and -2 for '"'
 								   false, false );
-	ConstantExpr * ret = new ConstantExpr( Constant( at, str ) );
+	// constant 0 is ignored for pure string value
+	ConstantExpr * ret = new ConstantExpr( Constant( at, str, (unsigned long long int)0 ) );
 	delete &str;										// created by lex
 	return ret;
@@ -173,5 +176,6 @@
 
 Expression *build_constantZeroOne( const std::string & str ) {
-	Expression * ret = new ConstantExpr( Constant( str == "0" ? (Type *)new ZeroType( emptyQualifiers ) : (Type*)new OneType( emptyQualifiers ), str ) );
+	Expression * ret = new ConstantExpr( Constant( str == "0" ? (Type *)new ZeroType( emptyQualifiers ) : (Type*)new OneType( emptyQualifiers ), str,
+												   str == "0" ? (unsigned long long int)0 : (unsigned long long int)1 ) );
 	delete &str;										// created by lex
 	return ret;
@@ -184,7 +188,5 @@
 	std::stringstream ss( str );
 	ss >> a >> dot >> b;
-	UntypedMemberExpr * ret = new UntypedMemberExpr(
-		new ConstantExpr( Constant( new BasicType( emptyQualifiers, BasicType::SignedInt ), toString( b ) ) ),
-		new ConstantExpr( Constant( new BasicType( emptyQualifiers, BasicType::SignedInt ), toString( a ) ) ) );
+	UntypedMemberExpr * ret = new UntypedMemberExpr( new ConstantExpr( Constant::from_int( b ) ), new ConstantExpr( Constant::from_int( a ) ) );
 	delete &str;
 	return ret;
Index: src/Parser/parseutility.cc
===================================================================
--- src/Parser/parseutility.cc	(revision f1e80d86555c7d3569436d4608786daf383df90a)
+++ src/Parser/parseutility.cc	(revision d56e5bcda08aa6816d20a750cfe4087387b7681f)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:30:39 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Aug 14 23:45:03 2016
-// Update Count     : 3
+// Last Modified On : Wed Jun 21 15:33:41 2017
+// Update Count     : 5
 //
 
@@ -26,5 +26,5 @@
 	UntypedExpr *comparison = new UntypedExpr( new NameExpr( "?!=?" ) );
 	comparison->get_args().push_back( orig );
-	comparison->get_args().push_back( new ConstantExpr( Constant( new ZeroType( emptyQualifiers ), "0" ) ) );
+	comparison->get_args().push_back( new ConstantExpr( Constant( new ZeroType( emptyQualifiers ), "0", (unsigned long long int)0 ) ) );
 	return new CastExpr( comparison, new BasicType( Type::Qualifiers(), BasicType::SignedInt ) );
 }
Index: src/SymTab/Autogen.h
===================================================================
--- src/SymTab/Autogen.h	(revision f1e80d86555c7d3569436d4608786daf383df90a)
+++ src/SymTab/Autogen.h	(revision d56e5bcda08aa6816d20a750cfe4087387b7681f)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 21:53:34 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Mar 17 09:10:41 2017
-// Update Count     : 9
+// Last Modified On : Wed Jun 21 17:25:26 2017
+// Update Count     : 14
 //
 
@@ -25,153 +25,153 @@
 
 namespace SymTab {
-	/// Generates assignment operators, constructors, and destructor for aggregate types as required
-	void autogenerateRoutines( std::list< Declaration * > &translationUnit );
+    /// Generates assignment operators, constructors, and destructor for aggregate types as required
+    void autogenerateRoutines( std::list< Declaration * > &translationUnit );
 
-	/// returns true if obj's name is the empty string and it has a bitfield width
-	bool isUnnamedBitfield( ObjectDecl * obj );
+    /// returns true if obj's name is the empty string and it has a bitfield width
+    bool isUnnamedBitfield( ObjectDecl * obj );
 
-	/// size_t type - set when size_t typedef is seen. Useful in a few places,
-	/// such as in determining array dimension type
-	extern Type * SizeType;
+    /// size_t type - set when size_t typedef is seen. Useful in a few places,
+    /// such as in determining array dimension type
+    extern Type * SizeType;
 
-	/// inserts into out a generated call expression to function fname with arguments dstParam and srcParam. Intended to be used with generated ?=?, ?{}, and ^?{} calls.
-	template< typename OutputIterator >
+    /// inserts into out a generated call expression to function fname with arguments dstParam and srcParam. Intended to be used with generated ?=?, ?{}, and ^?{} calls.
+    template< typename OutputIterator >
 	Statement * genCall( InitTweak::InitExpander & srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, Type * type, bool addCast = false, bool forward = true );
 
-	/// inserts into out a generated call expression to function fname with arguments dstParam and srcParam. Should only be called with non-array types.
-	/// optionally returns a statement which must be inserted prior to the containing loop, if there is one
-	template< typename OutputIterator >
+    /// inserts into out a generated call expression to function fname with arguments dstParam and srcParam. Should only be called with non-array types.
+    /// optionally returns a statement which must be inserted prior to the containing loop, if there is one
+    template< typename OutputIterator >
 	Statement * genScalarCall( InitTweak::InitExpander & srcParam, Expression *dstParam, const std::string & fname, OutputIterator out, Type * type, bool addCast = false ) {
-		// want to be able to generate assignment, ctor, and dtor generically,
-		// so fname is either ?=?, ?{}, or ^?{}
-		UntypedExpr *fExpr = new UntypedExpr( new NameExpr( fname ) );
+	// want to be able to generate assignment, ctor, and dtor generically,
+	// so fname is either ?=?, ?{}, or ^?{}
+	UntypedExpr *fExpr = new UntypedExpr( new NameExpr( fname ) );
 
-		// do something special for unnamed members
-		dstParam = new AddressExpr( dstParam );
-		if ( addCast ) {
-			// cast to T* with qualifiers removed, so that qualified objects can be constructed
-			// and destructed with the same functions as non-qualified objects.
-			// unfortunately, lvalue is considered a qualifier. For AddressExpr to resolve, its argument
-			// must have an lvalue qualified type, so remove all qualifiers except lvalue. If we ever
-			// remove lvalue as a qualifier, this can change to
-			//   type->get_qualifiers() = Type::Qualifiers();
-			assert( type );
-			Type * castType = type->clone();
+	// do something special for unnamed members
+	dstParam = new AddressExpr( dstParam );
+	if ( addCast ) {
+	    // cast to T* with qualifiers removed, so that qualified objects can be constructed
+	    // and destructed with the same functions as non-qualified objects.
+	    // unfortunately, lvalue is considered a qualifier. For AddressExpr to resolve, its argument
+	    // must have an lvalue qualified type, so remove all qualifiers except lvalue. If we ever
+	    // remove lvalue as a qualifier, this can change to
+	    //   type->get_qualifiers() = Type::Qualifiers();
+	    assert( type );
+	    Type * castType = type->clone();
 //			castType->get_qualifiers() -= Type::Qualifiers(true, true, true, false, true, false);
-			castType->get_qualifiers() -= Type::Qualifiers( Type::Const | Type::Volatile | Type::Restrict | Type::Atomic );
-			castType->set_lvalue( true ); // xxx - might not need this
-			dstParam = new CastExpr( dstParam, new PointerType( Type::Qualifiers(), castType ) );
-		}
-		fExpr->get_args().push_back( dstParam );
+	    castType->get_qualifiers() -= Type::Qualifiers( Type::Const | Type::Volatile | Type::Restrict | Type::Atomic );
+	    castType->set_lvalue( true ); // xxx - might not need this
+	    dstParam = new CastExpr( dstParam, new PointerType( Type::Qualifiers(), castType ) );
+	}
+	fExpr->get_args().push_back( dstParam );
 
-		Statement * listInit = srcParam.buildListInit( fExpr );
+	Statement * listInit = srcParam.buildListInit( fExpr );
 
-		std::list< Expression * > args = *++srcParam;
-		fExpr->get_args().splice( fExpr->get_args().end(), args );
+	std::list< Expression * > args = *++srcParam;
+	fExpr->get_args().splice( fExpr->get_args().end(), args );
 
-		*out++ = new ExprStmt( noLabels, fExpr );
+	*out++ = new ExprStmt( noLabels, fExpr );
 
-		srcParam.clearArrayIndices();
+	srcParam.clearArrayIndices();
 
-		return listInit;
+	return listInit;
+    }
+
+    /// Store in out a loop which calls fname on each element of the array with srcParam and dstParam as arguments.
+    /// If forward is true, loop goes from 0 to N-1, else N-1 to 0
+    template< typename OutputIterator >
+	void genArrayCall( InitTweak::InitExpander & srcParam, Expression *dstParam, const std::string & fname, OutputIterator out, ArrayType *array, bool addCast = false, bool forward = true ) {
+	static UniqueName indexName( "_index" );
+
+	// for a flexible array member nothing is done -- user must define own assignment
+	if ( ! array->get_dimension() ) return ;
+
+	Expression * begin, * end, * update, * cmp;
+	if ( forward ) {
+	    // generate: for ( int i = 0; i < N; ++i )
+	    begin = new ConstantExpr( Constant::from_int( 0 ) );
+	    end = array->get_dimension()->clone();
+	    cmp = new NameExpr( "?<?" );
+	    update = new NameExpr( "++?" );
+	} else {
+	    // generate: for ( int i = N-1; i >= 0; --i )
+	    begin = new UntypedExpr( new NameExpr( "?-?" ) );
+	    ((UntypedExpr*)begin)->get_args().push_back( array->get_dimension()->clone() );
+	    ((UntypedExpr*)begin)->get_args().push_back( new ConstantExpr( Constant::from_int( 1 ) ) );
+	    end = new ConstantExpr( Constant::from_int( 0 ) );
+	    cmp = new NameExpr( "?>=?" );
+	    update = new NameExpr( "--?" );
 	}
 
-	/// Store in out a loop which calls fname on each element of the array with srcParam and dstParam as arguments.
-	/// If forward is true, loop goes from 0 to N-1, else N-1 to 0
-	template< typename OutputIterator >
-	void genArrayCall( InitTweak::InitExpander & srcParam, Expression *dstParam, const std::string & fname, OutputIterator out, ArrayType *array, bool addCast = false, bool forward = true ) {
-		static UniqueName indexName( "_index" );
+	ObjectDecl *index = new ObjectDecl( indexName.newName(), Type::StorageClasses(), LinkageSpec::C, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), new SingleInit( begin, std::list<Expression*>() ) );
 
-		// for a flexible array member nothing is done -- user must define own assignment
-		if ( ! array->get_dimension() ) return ;
+	UntypedExpr *cond = new UntypedExpr( cmp );
+	cond->get_args().push_back( new VariableExpr( index ) );
+	cond->get_args().push_back( end );
 
-		Expression * begin, * end, * update, * cmp;
-		if ( forward ) {
-			// generate: for ( int i = 0; i < 0; ++i )
-			begin = new ConstantExpr( Constant( new ZeroType( emptyQualifiers ), "0" ) );
-			end = array->get_dimension()->clone();
-			cmp = new NameExpr( "?<?" );
-			update = new NameExpr( "++?" );
-		} else {
-			// generate: for ( int i = N-1; i >= 0; --i )
-			begin = new UntypedExpr( new NameExpr( "?-?" ) );
-			((UntypedExpr*)begin)->get_args().push_back( array->get_dimension()->clone() );
-			((UntypedExpr*)begin)->get_args().push_back( new ConstantExpr( Constant( new OneType( emptyQualifiers ), "1" ) ) );
-			end = new ConstantExpr( Constant( new ZeroType( emptyQualifiers ), "0" ) );
-			cmp = new NameExpr( "?>=?" );
-			update = new NameExpr( "--?" );
-		}
+	UntypedExpr *inc = new UntypedExpr( update );
+	inc->get_args().push_back( new AddressExpr( new VariableExpr( index ) ) );
 
-		ObjectDecl *index = new ObjectDecl( indexName.newName(), Type::StorageClasses(), LinkageSpec::C, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), new SingleInit( begin, std::list<Expression*>() ) );
+	UntypedExpr *dstIndex = new UntypedExpr( new NameExpr( "?[?]" ) );
+	dstIndex->get_args().push_back( dstParam );
+	dstIndex->get_args().push_back( new VariableExpr( index ) );
+	dstParam = dstIndex;
 
-		UntypedExpr *cond = new UntypedExpr( cmp );
-		cond->get_args().push_back( new VariableExpr( index ) );
-		cond->get_args().push_back( end );
+	// srcParam must keep track of the array indices to build the
+	// source parameter and/or array list initializer
+	srcParam.addArrayIndex( new VariableExpr( index ), array->get_dimension()->clone() );
 
-		UntypedExpr *inc = new UntypedExpr( update );
-		inc->get_args().push_back( new AddressExpr( new VariableExpr( index ) ) );
+	// for stmt's body, eventually containing call
+	CompoundStmt * body = new CompoundStmt( noLabels );
+	Statement * listInit = genCall( srcParam, dstParam, fname, back_inserter( body->get_kids() ), array->get_base(), addCast, forward );
 
-		UntypedExpr *dstIndex = new UntypedExpr( new NameExpr( "?[?]" ) );
-		dstIndex->get_args().push_back( dstParam );
-		dstIndex->get_args().push_back( new VariableExpr( index ) );
-		dstParam = dstIndex;
+	// block containing for stmt and index variable
+	std::list<Statement *> initList;
+	CompoundStmt * block = new CompoundStmt( noLabels );
+	block->get_kids().push_back( new DeclStmt( noLabels, index ) );
+	if ( listInit ) block->get_kids().push_back( listInit );
+	block->get_kids().push_back( new ForStmt( noLabels, initList, cond, inc, body ) );
 
-		// srcParam must keep track of the array indices to build the
-		// source parameter and/or array list initializer
-		srcParam.addArrayIndex( new VariableExpr( index ), array->get_dimension()->clone() );
+	*out++ = block;
+    }
 
-		// for stmt's body, eventually containing call
-		CompoundStmt * body = new CompoundStmt( noLabels );
-		Statement * listInit = genCall( srcParam, dstParam, fname, back_inserter( body->get_kids() ), array->get_base(), addCast, forward );
+    template< typename OutputIterator >
+	Statement * genCall( InitTweak::InitExpander &  srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, Type * type, bool addCast, bool forward ) {
+	if ( ArrayType * at = dynamic_cast< ArrayType * >( type ) ) {
+	    genArrayCall( srcParam, dstParam, fname, out, at, addCast, forward );
+	    return 0;
+	} else {
+	    return genScalarCall( srcParam, dstParam, fname, out, type, addCast );
+	}
+    }
 
-		// block containing for stmt and index variable
-		std::list<Statement *> initList;
-		CompoundStmt * block = new CompoundStmt( noLabels );
-		block->get_kids().push_back( new DeclStmt( noLabels, index ) );
-		if ( listInit ) block->get_kids().push_back( listInit );
-		block->get_kids().push_back( new ForStmt( noLabels, initList, cond, inc, body ) );
+    /// inserts into out a generated call expression to function fname with arguments dstParam
+    /// and srcParam. Intended to be used with generated ?=?, ?{}, and ^?{} calls. decl is the
+    /// object being constructed. The function wraps constructor and destructor calls in an
+    /// ImplicitCtorDtorStmt node.
+    template< typename OutputIterator >
+	void genImplicitCall( InitTweak::InitExpander &  srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, DeclarationWithType * decl, bool forward = true ) {
+	ObjectDecl *obj = dynamic_cast<ObjectDecl *>( decl );
+	assert( obj );
+	// unnamed bit fields are not copied as they cannot be accessed
+	if ( isUnnamedBitfield( obj ) ) return;
 
-		*out++ = block;
+	bool addCast = (fname == "?{}" || fname == "^?{}") && ( !obj || ( obj && obj->get_bitfieldWidth() == NULL ) );
+	std::list< Statement * > stmts;
+	genCall( srcParam, dstParam, fname, back_inserter( stmts ), obj->get_type(), addCast, forward );
+
+	// currently genCall should produce at most one element, but if that changes then the next line needs to be updated to grab the statement which contains the call
+	assert( stmts.size() <= 1 );
+	if ( stmts.size() == 1 ) {
+	    Statement * callStmt = stmts.front();
+	    if ( addCast ) {
+		// implicitly generated ctor/dtor calls should be wrapped
+		// so that later passes are aware they were generated.
+		// xxx - don't mark as an implicit ctor/dtor if obj is a bitfield,
+		// because this causes the address to be taken at codegen, which is illegal in C.
+		callStmt = new ImplicitCtorDtorStmt( callStmt );
+	    }
+	    *out++ = callStmt;
 	}
-
-	template< typename OutputIterator >
-	Statement * genCall( InitTweak::InitExpander &  srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, Type * type, bool addCast, bool forward ) {
-		if ( ArrayType * at = dynamic_cast< ArrayType * >( type ) ) {
-			genArrayCall( srcParam, dstParam, fname, out, at, addCast, forward );
-			return 0;
-		} else {
-			return genScalarCall( srcParam, dstParam, fname, out, type, addCast );
-		}
-	}
-
-	/// inserts into out a generated call expression to function fname with arguments dstParam
-	/// and srcParam. Intended to be used with generated ?=?, ?{}, and ^?{} calls. decl is the
-	/// object being constructed. The function wraps constructor and destructor calls in an
-	/// ImplicitCtorDtorStmt node.
-	template< typename OutputIterator >
-	void genImplicitCall( InitTweak::InitExpander &  srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, DeclarationWithType * decl, bool forward = true ) {
-		ObjectDecl *obj = dynamic_cast<ObjectDecl *>( decl );
-		assert( obj );
-		// unnamed bit fields are not copied as they cannot be accessed
-		if ( isUnnamedBitfield( obj ) ) return;
-
-		bool addCast = (fname == "?{}" || fname == "^?{}") && ( !obj || ( obj && obj->get_bitfieldWidth() == NULL ) );
-		std::list< Statement * > stmts;
-		genCall( srcParam, dstParam, fname, back_inserter( stmts ), obj->get_type(), addCast, forward );
-
-		// currently genCall should produce at most one element, but if that changes then the next line needs to be updated to grab the statement which contains the call
-		assert( stmts.size() <= 1 );
-		if ( stmts.size() == 1 ) {
-			Statement * callStmt = stmts.front();
-			if ( addCast ) {
-				// implicitly generated ctor/dtor calls should be wrapped
-				// so that later passes are aware they were generated.
-				// xxx - don't mark as an implicit ctor/dtor if obj is a bitfield,
-				// because this causes the address to be taken at codegen, which is illegal in C.
-				callStmt = new ImplicitCtorDtorStmt( callStmt );
-			}
-			*out++ = callStmt;
-		}
-	}
+    }
 } // namespace SymTab
 #endif // AUTOGEN_H
Index: src/SynTree/Constant.cc
===================================================================
--- src/SynTree/Constant.cc	(revision f1e80d86555c7d3569436d4608786daf383df90a)
+++ src/SynTree/Constant.cc	(revision d56e5bcda08aa6816d20a750cfe4087387b7681f)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 30 15:18:38 2015
-// Update Count     : 12
+// Last Modified On : Wed Jun 21 16:44:48 2017
+// Update Count     : 27
 //
 
@@ -21,9 +21,9 @@
 #include "Type.h"
 
-Constant::Constant( Type *type_, std::string value_ ) : type( type_ ), value( value_ ) {}
+Constant::Constant( Type * type, std::string rep, unsigned long long val ) : type( type ), rep( rep ), val( val ) {}
+Constant::Constant( Type * type, std::string rep, double val ) : type( type ), rep( rep ), val( val ) {}
 
-Constant::Constant( const Constant &other ) {
+Constant::Constant( const Constant &other ) : rep( other.rep ), val( other.val ) {
 	type = other.type->clone();
-	value = other.value;
 }
 
@@ -31,19 +31,17 @@
 
 Constant Constant::from_int( int i ) {
-	return Constant( new BasicType( Type::Qualifiers(), BasicType::SignedInt ), std::to_string( i ) );
+	return Constant( new BasicType( Type::Qualifiers(), BasicType::SignedInt ), std::to_string( i ), (unsigned long long int)i );
 }
 
 Constant Constant::from_ulong( unsigned long i ) {
-	return Constant( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), std::to_string( i ) );
+	return Constant( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), std::to_string( i ), (unsigned long long int)i );
 }
 
 Constant Constant::from_double( double d ) {
-	return Constant( new BasicType( Type::Qualifiers(), BasicType::Double ), std::to_string( d ) );
+	return Constant( new BasicType( Type::Qualifiers(), BasicType::Double ), std::to_string( d ), d );
 }
 
-Constant *Constant::clone() const { assert( false ); return 0; }
-
 void Constant::print( std::ostream &os ) const {
-	os << "(" << value;
+	os << "(" << rep << " " << val.ival;
 	if ( type ) {
 		os << ": ";
Index: src/SynTree/Constant.h
===================================================================
--- src/SynTree/Constant.h	(revision f1e80d86555c7d3569436d4608786daf383df90a)
+++ src/SynTree/Constant.h	(revision d56e5bcda08aa6816d20a750cfe4087387b7681f)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jun 30 13:33:17 2016
-// Update Count     : 6
+// Last Modified On : Wed Jun 21 16:44:48 2017
+// Update Count     : 14
 //
 
@@ -23,12 +23,13 @@
 class Constant {
   public:
-	Constant( Type *type, std::string value );
-	Constant( const Constant &other );
+	Constant( Type * type, std::string rep, unsigned long long val );
+	Constant( Type * type, std::string rep, double val );
+	Constant( const Constant & other );
 	virtual ~Constant();
 
-	Type *get_type() { return type; }
-	void set_type( Type *newValue ) { type = newValue; }
-	std::string &get_value() { return value; }
-	void set_value( std::string newValue ) { value = newValue; }
+	Type * get_type() { return type; }
+	void set_type( Type * newValue ) { type = newValue; }
+	std::string & get_value() { return rep; }
+	void set_value( std::string newValue ) { rep = newValue; }
 
 	/// generates an integer constant of the given int
@@ -39,11 +40,16 @@
 	static Constant from_double( double d );
 
-	virtual Constant *clone() const;
-	virtual void accept( Visitor &v ) { v.visit( this ); }
-	virtual Constant *acceptMutator( Mutator &m ) { return m.mutate( this ); }
-	virtual void print( std::ostream &os ) const;
+	virtual void accept( Visitor & v ) { v.visit( this ); }
+	virtual Constant * acceptMutator( Mutator & m ) { return m.mutate( this ); }
+	virtual void print( std::ostream & os ) const;
   private:
-	Type *type;
-	std::string value;
+	Type * type;
+	std::string rep;
+	union Val {
+		unsigned long long ival;
+		double dval;
+		Val( unsigned long long ival ) : ival( ival ) {}
+		Val( double dval ) : dval( dval ) {}
+	} val;
 };
 
Index: src/Tuples/TupleExpansion.cc
===================================================================
--- src/Tuples/TupleExpansion.cc	(revision f1e80d86555c7d3569436d4608786daf383df90a)
+++ src/Tuples/TupleExpansion.cc	(revision d56e5bcda08aa6816d20a750cfe4087387b7681f)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 16 08:05:17 2017
-// Update Count     : 15
+// Last Modified On : Wed Jun 21 17:35:04 2017
+// Update Count     : 19
 //
 
@@ -191,10 +191,10 @@
 				commaExpr->set_arg1( nullptr );
 			}
-			BasicType * boolType = new BasicType( Type::Qualifiers(), BasicType::Bool );
-			ObjectDecl * finished = new ObjectDecl( toString( "_unq", id, "_finished_" ), Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new BasicType( Type::Qualifiers(), BasicType::Bool ), new SingleInit( new ConstantExpr( Constant( boolType->clone(), "0" ) ), noDesignators ) );
+			ObjectDecl * finished = new ObjectDecl( toString( "_unq", id, "_finished_" ), Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new BasicType( Type::Qualifiers(), BasicType::Bool ),
+													new SingleInit( new ConstantExpr( Constant::from_int( 0 ) ), noDesignators ) );
 			addDeclaration( finished );
 			// (finished ? _unq_expr_N : (_unq_expr_N = <unqExpr->get_expr()>, finished = 1, _unq_expr_N))
 			// This pattern ensures that each unique expression is evaluated once, regardless of evaluation order of the generated C code.
-			Expression * assignFinished = UntypedExpr::createAssign( new VariableExpr(finished), new ConstantExpr( Constant( boolType->clone(), "1" ) ) );
+			Expression * assignFinished = UntypedExpr::createAssign( new VariableExpr(finished), new ConstantExpr( Constant::from_int( 1 ) ) );
 			ConditionalExpr * condExpr = new ConditionalExpr( new VariableExpr( finished ), var->clone(),
 				new CommaExpr( new CommaExpr( assignUnq, assignFinished ), var->clone() ) );
