Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 7e003011cac72e307c02d183bca9cbd4a982d69b)
+++ src/CodeGen/CodeGenerator.cc	(revision e4d829bf54d5191b9e826c8c7fc40b7c7c7bc768)
@@ -298,17 +298,17 @@
 	}
 
-	void CodeGenerator::printDesignators( std::list< Expression * > & designators ) {
-		typedef std::list< Expression * > DesignatorList;
+	void CodeGenerator::visit( Designation * designation ) {
+		std::list< Expression * > designators = designation->get_designators();
 		if ( designators.size() == 0 ) return;
-		for ( DesignatorList::iterator iter = designators.begin(); iter != designators.end(); ++iter ) {
-			if ( dynamic_cast< NameExpr * >( *iter ) ) {
-				// if expression is a name, then initializing aggregate member
+		for ( Expression * des : designators ) {
+			if ( dynamic_cast< ConstantExpr * >( des ) ) {
+				// if expression is a ConstantExpr, then initializing array element
+				output << "[";
+				des->accept( *this );
+				output << "]";
+			} else {
+				// if not a ConstantExpr, it has to be a NameExpr or VariableExpr, initializing aggregate member
 				output << ".";
-				(*iter)->accept( *this );
-			} else {
-				// if not a simple name, it has to be a constant expression, i.e. an array designator
-				output << "[";
-				(*iter)->accept( *this );
-				output << "]";
+				des->accept( *this );
 			} // if
 		} // for
@@ -317,13 +317,24 @@
 
 	void CodeGenerator::visit( SingleInit * init ) {
-		printDesignators( init->get_designators() );
 		init->get_value()->accept( *this );
 	}
 
 	void CodeGenerator::visit( ListInit * init ) {
-		printDesignators( init->get_designators() );
+		auto initBegin = init->begin();
+		auto initEnd = init->end();
+		auto desigBegin = init->get_designations().begin();
+		auto desigEnd = init->get_designations().end();
+
 		output << "{ ";
-		genCommaList( init->begin(), init->end() );
+		for ( ; initBegin != initEnd && desigBegin != desigEnd; ) {
+			(*desigBegin)->accept( *this );
+			(*initBegin)->accept( *this );
+			++initBegin, ++desigBegin;
+			if ( initBegin != initEnd ) {
+				output << ", ";
+			}
+		}
 		output << " }";
+		assertf( initBegin == initEnd && desigBegin == desigEnd, "Initializers and designators not the same length. %s", toString( init ).c_str() );
 	}
 
@@ -726,6 +737,9 @@
 
 	void CodeGenerator::visit( TypeExpr * typeExpr ) {
-		assertf( ! genC, "TypeExpr should not reach code generation." );
-		output<< genType( typeExpr->get_type(), "", pretty, genC );
+		// 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 );
+		}
 	}
 
Index: src/CodeGen/CodeGenerator.h
===================================================================
--- src/CodeGen/CodeGenerator.h	(revision 7e003011cac72e307c02d183bca9cbd4a982d69b)
+++ src/CodeGen/CodeGenerator.h	(revision e4d829bf54d5191b9e826c8c7fc40b7c7c7bc768)
@@ -47,4 +47,5 @@
 
 		//*** Initializer
+		virtual void visit( Designation * );
 		virtual void visit( SingleInit * );
 		virtual void visit( ListInit * );
@@ -136,5 +137,4 @@
 		bool lineMarks = false;
 
-		void printDesignators( std::list< Expression * > & );
 		void handleStorageClass( DeclarationWithType *decl );
 		void handleAggregate( AggregateDecl *aggDecl, const std::string & kind );
