Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 721f17ac6221a75230b4b1228917e6a163b53ff6)
+++ 	(revision )
@@ -1,670 +1,0 @@
-//
-// 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.
-//
-// CodeGenerator.cc -- 
-//
-// Author           : Richard C. Bilson
-// Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jun 26 16:52:58 2015
-// Update Count     : 144
-//
-
-#include <algorithm>
-#include <iostream>
-#include <cassert>
-#include <list>
-
-#include "Parser/ParseNode.h"
-
-#include "SynTree/Type.h"
-#include "SynTree/Expression.h"
-#include "SynTree/Initializer.h"
-#include "SynTree/Statement.h"
-
-#include "utility.h"
-#include "UnimplementedError.h"
-
-#include "CodeGenerator.h"
-#include "OperatorTable.h"
-#include "GenType.h"
-
-using namespace std;
-
-namespace CodeGen {
-	int CodeGenerator::tabsize = 4;
-
-	// the kinds of statements that would ideally be separated by more whitespace
-	bool wantSpacing( Statement * stmt) {
-		return dynamic_cast< IfStmt * >( stmt ) || dynamic_cast< CompoundStmt * >( stmt ) ||
-			dynamic_cast< WhileStmt * >( stmt ) || dynamic_cast< ForStmt * > ( stmt ) || dynamic_cast< SwitchStmt *>( stmt );
-	}
-
-	ostream & CodeGenerator::Indenter::operator()( ostream & output ) {
-	  return output << string( cg.cur_indent, ' ' );
-	}
-
-	ostream & operator<<( ostream & output, CodeGenerator::Indenter &indent ) {
-		return indent( output );
-	}
-
-	CodeGenerator::CodeGenerator( std::ostream &os ) : indent(*this), cur_indent( 0 ), insideFunction( false ), output( os ) { }
-
-	CodeGenerator::CodeGenerator( std::ostream &os, std::string init, int indentation, bool infunp )
-			: indent(*this), cur_indent( indentation ), insideFunction( infunp ), output( os ) {
-		//output << std::string( init );
-	}
-
-	CodeGenerator::CodeGenerator( std::ostream &os, char *init, int indentation, bool infunp )
-			: indent(*this), cur_indent( indentation ), insideFunction( infunp ), output( os ) {
-		//output << std::string( init );
-	}
-
-	string mangleName( DeclarationWithType *decl ) {
-		if ( decl->get_mangleName() != "" ) {
-			return decl->get_mangleName();
-		} else {
-			return decl->get_name();
-		} // if
-	}
-
-	//*** Declarations
-	void CodeGenerator::visit( FunctionDecl *functionDecl ) {
-		handleStorageClass( functionDecl );
-		if ( functionDecl->get_isInline() ) {
-			output << "inline ";
-		} // if
-		if ( functionDecl->get_isNoreturn() ) {
-			output << "_Noreturn ";
-		} // if
-		output << genType( functionDecl->get_functionType(), mangleName( functionDecl ) );
-
-		// how to get this to the Functype?
-		std::list< Declaration * > olds = functionDecl->get_oldDecls();
-		if ( ! olds.empty() ) {
-			output << " /* function has old declaration */";
-		} // if
-
-		// acceptAll( functionDecl->get_oldDecls(), *this );
-		if ( functionDecl->get_statements() ) {
-			functionDecl->get_statements()->accept(*this );
-		} // if
-	}
-
-	void CodeGenerator::visit( ObjectDecl *objectDecl ) {
-		handleStorageClass( objectDecl );
-		output << genType( objectDecl->get_type(), mangleName( objectDecl ) );
-	
-		if ( objectDecl->get_init() ) {
-			output << " = ";
-			objectDecl->get_init()->accept( *this );
-		} // if
-		if ( objectDecl->get_bitfieldWidth() ) {
-			output << ":";
-			objectDecl->get_bitfieldWidth()->accept( *this );
-		} // if
-	}
-
-	void CodeGenerator::handleAggregate( AggregateDecl *aggDecl ) {
-		if ( aggDecl->get_name() != "" )
-			output << aggDecl->get_name();
-	
-		std::list< Declaration * > &memb = aggDecl->get_members();
-
-		if ( ! memb.empty() ) {
-			output << " {" << endl;
-
-			cur_indent += CodeGenerator::tabsize; 
-			for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end();  i++) {
-				output << indent; 
-				(*i)->accept(*this );
-				output << ";" << endl;
-			}
-
-			cur_indent -= CodeGenerator::tabsize; 
-
-			output << indent << "}";
-		} // if
-	}
-
-	void CodeGenerator::visit( StructDecl *structDecl ) {
-		output << "struct ";
-		handleAggregate( structDecl );
-	}
-
-	void CodeGenerator::visit( UnionDecl *aggregateDecl ) {
-		output << "union ";
-		handleAggregate( aggregateDecl );
-	}
-  
-	void CodeGenerator::visit( EnumDecl *aggDecl ) {
-		output << "enum ";
-
-		if ( aggDecl->get_name() != "" )
-			output << aggDecl->get_name();
-	
-		std::list< Declaration* > &memb = aggDecl->get_members();
-
-		if ( ! memb.empty() ) {
-			output << " {" << endl;
-
-			cur_indent += CodeGenerator::tabsize; 
-			for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end();  i++) {
-				ObjectDecl *obj = dynamic_cast< ObjectDecl* >( *i );
-				assert( obj );
-				output << indent << mangleName( obj ); 
-				if ( obj->get_init() ) {
-					output << " = ";
-					obj->get_init()->accept(*this );
-				} // if
-				output << "," << endl;
-			} // for
-
-			cur_indent -= CodeGenerator::tabsize; 
-
-			output << indent << "}";
-		} // if
-	}
-  
-	void CodeGenerator::visit( ContextDecl *aggregateDecl ) {}
-  
-	void CodeGenerator::visit( TypedefDecl *typeDecl ) {
-		output << "typedef ";
-		output << genType( typeDecl->get_base(), typeDecl->get_name() );
-	}
-  
-	void CodeGenerator::visit( TypeDecl *typeDecl ) {
-		// really, we should mutate this into something that isn't a TypeDecl but that requires large-scale changes,
-		// still to be done
-		output << "extern unsigned long " << typeDecl->get_name();
-		if ( typeDecl->get_base() ) {
-			output << " = sizeof( " << genType( typeDecl->get_base(), "" ) << " )";
-		} // if
-	}
-
-	void CodeGenerator::visit( SingleInit *init ) {
-		init->get_value()->accept( *this );
-	}
-
-	void CodeGenerator::visit( ListInit *init ) {
-		output << "{ ";
-		genCommaList( init->begin_initializers(), init->end_initializers() );
-		output << " }";
-	}
-
-	void CodeGenerator::visit( Constant *constant ) { 
-		output << constant->get_value() ;
-	}
-
-	//*** Expressions
-	void CodeGenerator::visit( ApplicationExpr *applicationExpr ) {
-		if ( VariableExpr *varExpr = dynamic_cast< VariableExpr* >( applicationExpr->get_function() ) ) {
-			OperatorInfo opInfo;
-			if ( varExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && operatorLookup( varExpr->get_var()->get_name(), opInfo ) ) {
-				std::list< Expression* >::iterator arg = applicationExpr->get_args().begin();
-				switch ( opInfo.type ) {
-				  case OT_PREFIXASSIGN:
-				  case OT_POSTFIXASSIGN:
-				  case OT_INFIXASSIGN:
-					{
-						assert( arg != applicationExpr->get_args().end() );
-						if ( AddressExpr *addrExpr = dynamic_cast< AddressExpr * >( *arg ) ) {
-	        
-							*arg = addrExpr->get_arg();
-						} else {
-							UntypedExpr *newExpr = new UntypedExpr( new NameExpr( "*?" ) );
-							newExpr->get_args().push_back( *arg );
-							*arg = newExpr;
-						} // if
-						break;
-					}
-	      
-				  default:
-					// do nothing
-					;
-				}
-	    
-				switch ( opInfo.type ) {
-				  case OT_INDEX:
-					assert( applicationExpr->get_args().size() == 2 );
-					(*arg++)->accept( *this );
-					output << "[";
-					(*arg)->accept( *this );
-					output << "]";
-					break;
-	      
-				  case OT_CALL:
-					// there are no intrinsic definitions of the function call operator
-					assert( false );
-					break;
-	      
-				  case OT_PREFIX:
-				  case OT_PREFIXASSIGN:
-					assert( applicationExpr->get_args().size() == 1 );
-					output << "(";
-					output << opInfo.symbol;
-					(*arg)->accept( *this );
-					output << ")";
-					break;
-	      
-				  case OT_POSTFIX:
-				  case OT_POSTFIXASSIGN:
-					assert( applicationExpr->get_args().size() == 1 );
-					(*arg)->accept( *this );
-					output << opInfo.symbol;
-					break;
-
-				  case OT_INFIX:
-				  case OT_INFIXASSIGN:
-					assert( applicationExpr->get_args().size() == 2 );
-					output << "(";
-					(*arg++)->accept( *this );
-					output << opInfo.symbol;
-					(*arg)->accept( *this );
-					output << ")";
-					break;
-	      
-				  case OT_CONSTANT:
-				  case OT_LABELADDRESS:
-					// there are no intrinsic definitions of 0/1 or label addresses as functions
-					assert( false );
-				}
-			} else {
-				varExpr->accept( *this );
-				output << "(";
-				genCommaList( applicationExpr->get_args().begin(), applicationExpr->get_args().end() );
-				output << ")";
-			} // if
-		} else {
-			applicationExpr->get_function()->accept( *this );
-			output << "(";
-			genCommaList( applicationExpr->get_args().begin(), applicationExpr->get_args().end() );
-			output << ")";
-		} // if
-	}
-  
-	void CodeGenerator::visit( UntypedExpr *untypedExpr ) {
-		if ( NameExpr *nameExpr = dynamic_cast< NameExpr* >( untypedExpr->get_function() ) ) {
-			OperatorInfo opInfo;
-			if ( operatorLookup( nameExpr->get_name(), opInfo ) ) {
-				std::list< Expression* >::iterator arg = untypedExpr->get_args().begin();
-				switch ( opInfo.type ) {
-				  case OT_INDEX:
-					assert( untypedExpr->get_args().size() == 2 );
-					(*arg++)->accept( *this );
-					output << "[";
-					(*arg)->accept( *this );
-					output << "]";
-					break;
-	      
-				  case OT_CALL:
-					assert( false );
-					break;
-	      
-				  case OT_PREFIX:
-				  case OT_PREFIXASSIGN:
-				  case OT_LABELADDRESS:
-					assert( untypedExpr->get_args().size() == 1 );
-					output << "(";
-					output << opInfo.symbol;
-					(*arg)->accept( *this );
-					output << ")";
-					break;
-	      
-				  case OT_POSTFIX:
-				  case OT_POSTFIXASSIGN:
-					assert( untypedExpr->get_args().size() == 1 );
-					(*arg)->accept( *this );
-					output << opInfo.symbol;
-					break;
-  
-				  case OT_INFIX:
-				  case OT_INFIXASSIGN:
-					assert( untypedExpr->get_args().size() == 2 );
-					output << "(";
-					(*arg++)->accept( *this );
-					output << opInfo.symbol;
-					(*arg)->accept( *this );
-					output << ")";
-					break;
-					
-				  case OT_CONSTANT:
-					// there are no intrinsic definitions of 0 or 1 as functions
-					assert( false );
-				}
-			} else {
-				nameExpr->accept( *this );
-				output << "(";
-				genCommaList( untypedExpr->get_args().begin(), untypedExpr->get_args().end() );
-				output << ")";
-			} // if
-		} else {
-			untypedExpr->get_function()->accept( *this );
-			output << "(";
-			genCommaList( untypedExpr->get_args().begin(), untypedExpr->get_args().end() );
-			output << ")";
-		} // if
-	}
-  
-	void CodeGenerator::visit( NameExpr *nameExpr ) {
-		OperatorInfo opInfo;
-		if ( operatorLookup( nameExpr->get_name(), opInfo ) ) {
-			assert( opInfo.type == OT_CONSTANT );
-			output << opInfo.symbol;
-		} else {
-			output << nameExpr->get_name();
-		} // if
-	}
-  
-	void CodeGenerator::visit( AddressExpr *addressExpr ) {
-		output << "(&";
-		// this hack makes sure that we don't convert "constant_zero" to "0" if we're taking its address
-		if ( VariableExpr *variableExpr = dynamic_cast< VariableExpr* >( addressExpr->get_arg() ) ) {
-			output << mangleName( variableExpr->get_var() );
-		} else {
-			addressExpr->get_arg()->accept( *this );
-		} // if
-		output << ")";
-	}
-
-	void CodeGenerator::visit( CastExpr *castExpr ) {
-		output << "((";
-		if ( castExpr->get_results().empty() ) {
-			output << "void" ;
-		} else {
-			output << genType( castExpr->get_results().front(), "" );
-		} // if
-		output << ")";
-		castExpr->get_arg()->accept( *this );
-		output << ")";
-	}
-  
-	void CodeGenerator::visit( UntypedMemberExpr *memberExpr ) {
-		assert( false );
-	}
-  
-	void CodeGenerator::visit( MemberExpr *memberExpr ) {
-		memberExpr->get_aggregate()->accept( *this );
-		output << "." << mangleName( memberExpr->get_member() );
-	}
-  
-	void CodeGenerator::visit( VariableExpr *variableExpr ) {
-		OperatorInfo opInfo;
-		if ( variableExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && operatorLookup( variableExpr->get_var()->get_name(), opInfo ) && opInfo.type == OT_CONSTANT ) {
-			output << opInfo.symbol;
-		} else {
-			output << mangleName( variableExpr->get_var() );
-		} // if
-	}
-  
-	void CodeGenerator::visit( ConstantExpr *constantExpr ) {
-		assert( constantExpr->get_constant() );
-		constantExpr->get_constant()->accept( *this );
-	}
-  
-	void CodeGenerator::visit( SizeofExpr *sizeofExpr ) {
-		output << "sizeof(";
-		if ( sizeofExpr->get_isType() ) {
-			output << genType( sizeofExpr->get_type(), "" );
-		} else {
-			sizeofExpr->get_expr()->accept( *this );
-		} // if
-		output << ")";
-	}
-  
-	void CodeGenerator::visit( LogicalExpr *logicalExpr ) {
-		output << "(";
-		logicalExpr->get_arg1()->accept( *this );
-		if ( logicalExpr->get_isAnd() ) {
-			output << " && ";
-		} else {
-			output << " || ";
-		} // if
-		logicalExpr->get_arg2()->accept( *this );
-		output << ")";
-	}
-  
-	void CodeGenerator::visit( ConditionalExpr *conditionalExpr ) {
-		output << "(";
-		conditionalExpr->get_arg1()->accept( *this );
-		output << " ? ";
-		conditionalExpr->get_arg2()->accept( *this );
-		output << " : ";
-		conditionalExpr->get_arg3()->accept( *this );
-		output << ")";
-	}
-  
-	void CodeGenerator::visit( CommaExpr *commaExpr ) {
-		output << "(";
-		commaExpr->get_arg1()->accept( *this );
-		output << " , ";
-		commaExpr->get_arg2()->accept( *this );
-		output << ")";
-	}
-  
-	void CodeGenerator::visit( TupleExpr *tupleExpr ) {}
-  
-	void CodeGenerator::visit( TypeExpr *typeExpr ) {}
-
-	//*** Statements
-	void CodeGenerator::visit( CompoundStmt *compoundStmt ) {
-		std::list<Statement*> ks = compoundStmt->get_kids();
-		output << "{" << endl;
-
-		cur_indent += CodeGenerator::tabsize;
-
-		for ( std::list<Statement *>::iterator i = ks.begin(); i != ks.end();  i++) {
-			output << indent << printLabels( (*i)->get_labels() );
-			(*i)->accept(*this );
-
-			output << endl;
-			if ( wantSpacing( *i ) ) {
-				output << endl;
-			}
-		}
-		cur_indent -= CodeGenerator::tabsize; 
-
-		output << indent << "}";
-	}
-
-	void CodeGenerator::visit( ExprStmt *exprStmt ) {
-		// I don't see why this check is necessary. 
-		// If this starts to cause problems then put it back in, 
-		// with an explanation
-		assert( exprStmt );
-
-		// if ( exprStmt != 0 ) {
-		exprStmt->get_expr()->accept( *this );
-		output << ";" ;
-		// } // if
-	}
-
-	void CodeGenerator::visit( IfStmt *ifStmt ) {
-		output << "if (";
-		ifStmt->get_condition()->accept(*this );
-		output << ") ";
-
-		ifStmt->get_thenPart()->accept(*this );
-
-		if ( ifStmt->get_elsePart() != 0) {
-			output << " else ";
-			ifStmt->get_elsePart()->accept(*this );
-		} // if
-	}
-
-	void CodeGenerator::visit( SwitchStmt *switchStmt ) {
-		output << "switch (" ;
-		switchStmt->get_condition()->accept(*this );
-		output << ") ";
-		
-		output << "{" << std::endl;
-		cur_indent += CodeGenerator::tabsize;
-
-		acceptAll( switchStmt->get_branches(), *this );
-
-		cur_indent -= CodeGenerator::tabsize;
-
-		output << indent << "}";
-	}
-
-	void CodeGenerator::visit( CaseStmt *caseStmt ) {
-		output << indent;
-		if ( caseStmt->isDefault()) {
-			output << "default";
-		} else {
-			output << "case ";
-			caseStmt->get_condition()->accept(*this );
-		} // if
-		output << ":\n";
-		
-		std::list<Statement *> sts = caseStmt->get_statements();
-
-		cur_indent += CodeGenerator::tabsize;
-		for ( std::list<Statement *>::iterator i = sts.begin(); i != sts.end();  i++) {
-			output << indent << printLabels( (*i)->get_labels() )  ;
-			(*i)->accept(*this );
-			output << endl;
-		}
-		cur_indent -= CodeGenerator::tabsize;
-	}
-
-	void CodeGenerator::visit( BranchStmt *branchStmt ) {
-		switch ( branchStmt->get_type()) {
-		  case BranchStmt::Goto:
-			if ( ! branchStmt->get_target().empty() )
-				output << "goto " << branchStmt->get_target();
-			else { 
-				if ( branchStmt->get_computedTarget() != 0 ) {
-					output << "goto *";
-					branchStmt->get_computedTarget()->accept( *this );
-				} // if
-			} // if
-			break;
-		  case BranchStmt::Break:
-			output << "break";
-			break;
-		  case BranchStmt::Continue:
-			output << "continue";
-			break;
-		}
-		output << ";";
-	}
-
-
-	void CodeGenerator::visit( ReturnStmt *returnStmt ) {
-		output << "return ";
-
-		// xxx -- check for null expression;
-		if ( returnStmt->get_expr() ) {
-			returnStmt->get_expr()->accept( *this );
-		} // if
-		output << ";";
-	}
-
-	void CodeGenerator::visit( WhileStmt *whileStmt ) {
-		if ( whileStmt->get_isDoWhile() )
-			output << "do" ;
-		else {
-			output << "while (" ;
-			whileStmt->get_condition()->accept(*this );
-			output << ")";
-		} // if
-		output << " ";
-
-		output << CodeGenerator::printLabels( whileStmt->get_body()->get_labels() );
-		whileStmt->get_body()->accept( *this );
-
-		output << indent;
-
-		if ( whileStmt->get_isDoWhile() ) {
-			output << " while (" ;
-			whileStmt->get_condition()->accept(*this );
-			output << ");";
-		} // if
-	}
-
-	void CodeGenerator::visit( ForStmt *forStmt ) {
-		output << "for (";
-
-		if ( forStmt->get_initialization() != 0 )
-			forStmt->get_initialization()->accept( *this );
-		else
-			output << ";";
-		
-		if ( forStmt->get_condition() != 0 )
-			forStmt->get_condition()->accept( *this );
-		output << ";";
-
-		if ( forStmt->get_increment() != 0 )
-			forStmt->get_increment()->accept( *this );
-		output << ") ";
-
-		if ( forStmt->get_body() != 0 ) {
-			output << CodeGenerator::printLabels( forStmt->get_body()->get_labels() );
-			forStmt->get_body()->accept( *this );
-		} // if
-	}
-
-	void CodeGenerator::visit( NullStmt *nullStmt ) {
-		//output << indent << CodeGenerator::printLabels( nullStmt->get_labels() );
-		output << "/* null statement */ ;";
-	}
-
-	void CodeGenerator::visit( DeclStmt *declStmt ) {
-		declStmt->get_decl()->accept( *this );
-	
-		if ( doSemicolon( declStmt->get_decl() ) ) {
-			output << ";";
-		} // if
-	}
-
-	std::string CodeGenerator::printLabels( std::list< Label > &l ) {
-		std::string str( "" );
-		l.unique(); // assumes a sorted list. Why not use set?
-
-		for ( std::list< Label >::iterator i = l.begin(); i != l.end(); i++ )
-			str += *i + ": ";
-
-		return str;
-	}
-
-	void CodeGenerator::handleStorageClass( Declaration *decl ) {
-		switch ( decl->get_storageClass() ) {
-		  case DeclarationNode::Extern:
-			output << "extern ";
-			break;
-		  case DeclarationNode::Static:
-			output << "static ";
-			break;
-		  case DeclarationNode::Auto:
-			// silently drop storage class
-			break;
-		  case DeclarationNode::Register:
-			output << "register ";
-			break;
-		  case DeclarationNode::Inline:
-			output << "inline ";
-			break;
-		  case DeclarationNode::Fortran:
-			output << "fortran ";
-			break;
-		  case DeclarationNode::Noreturn:
-			output << "_Noreturn ";
-			break;
-		  case DeclarationNode::Threadlocal:
-			output << "_Thread_local ";
-			break;
-		  case DeclarationNode::NoStorageClass:
-			break;
-		} // switch
-	}
-} // namespace CodeGen
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: src/CodeGen/CodeGenerator.h
===================================================================
--- src/CodeGen/CodeGenerator.h	(revision 721f17ac6221a75230b4b1228917e6a163b53ff6)
+++ 	(revision )
@@ -1,127 +1,0 @@
-//
-// 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.
-//
-// CodeGenerator.h -- 
-//
-// Author           : Richard C. Bilson
-// Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Thu Jun 11 13:24:23 2015
-// Update Count     : 23
-//
-
-#ifndef CODEGENV_H
-#define CODEGENV_H
-
-#include <list>
-
-#include "SynTree/SynTree.h"
-#include "SynTree/Visitor.h"
-#include "SymTab/Indexer.h"
-
-namespace CodeGen {
-	class CodeGenerator : public Visitor {
-	  public:
-		static int tabsize;
-
-		CodeGenerator( std::ostream &os );
-		CodeGenerator( std::ostream &os, std::string, int indent = 0, bool infun = false );
-		CodeGenerator( std::ostream &os, char *, int indent = 0, bool infun = false );
-
-		//*** Declaration
-		virtual void visit( StructDecl * );
-		virtual void visit( FunctionDecl * );
-		virtual void visit( ObjectDecl * );
-		virtual void visit( UnionDecl *aggregateDecl );
-		virtual void visit( EnumDecl *aggregateDecl );
-		virtual void visit( ContextDecl *aggregateDecl );
-		virtual void visit( TypedefDecl *typeDecl );
-		virtual void visit( TypeDecl *typeDecl );
-
-		//*** Initializer
-		virtual void visit( SingleInit * );
-		virtual void visit( ListInit * );
-
-		//*** Constant
-		virtual void visit( Constant * );
-
-		//*** Expression
-		virtual void visit( ApplicationExpr *applicationExpr );
-		virtual void visit( UntypedExpr *untypedExpr );
-		virtual void visit( NameExpr *nameExpr );
-		virtual void visit( AddressExpr *addressExpr );
-		virtual void visit( CastExpr *castExpr );
-		virtual void visit( UntypedMemberExpr *memberExpr );
-		virtual void visit( MemberExpr *memberExpr );
-		virtual void visit( VariableExpr *variableExpr );
-		virtual void visit( ConstantExpr *constantExpr ); 
-		virtual void visit( SizeofExpr *sizeofExpr );
-		virtual void visit( LogicalExpr *logicalExpr );
-		virtual void visit( ConditionalExpr *conditionalExpr );
-		virtual void visit( CommaExpr *commaExpr );
-		virtual void visit( TupleExpr *tupleExpr );
-		virtual void visit( TypeExpr *typeExpr );
-
-		//*** Statements
-		virtual void visit( CompoundStmt * );
-		virtual void visit( ExprStmt * );
-		virtual void visit( IfStmt * );
-		virtual void visit( SwitchStmt * );
-		virtual void visit( CaseStmt * );
-		virtual void visit( BranchStmt * );
-		virtual void visit( ReturnStmt * );
-		virtual void visit( WhileStmt * );
-		virtual void visit( ForStmt * );
-		virtual void visit( NullStmt * );
-		virtual void visit( DeclStmt * ); 
-
-		template< class Iterator > void genCommaList( Iterator begin, Iterator end );
-
-		struct Indenter {
-			Indenter(CodeGenerator &cg) : cg(cg) {}
-			CodeGenerator & cg;
-			std::ostream& operator()(std::ostream & os);
-		};
-	  private:
-
-		Indenter indent;
-		int cur_indent;
-		bool insideFunction;
-		std::ostream &output;
-
-		static std::string printLabels ( std::list < Label > & );
-		void handleStorageClass( Declaration *decl );
-		void handleAggregate( AggregateDecl *aggDecl );
-		void handleTypedef( NamedTypeDecl *namedType );
-
-	};
-	
-	template< class Iterator >
-	void CodeGenerator::genCommaList( Iterator begin, Iterator end ) {
-		if ( begin == end ) return;
-
-		for ( ;; ) {
-			(*begin++)->accept( *this );
-			if ( begin == end ) return;
-			output << ", ";
-		} // for
-	}
-  
-	inline bool doSemicolon( Declaration* decl ) {
-		if ( FunctionDecl* func = dynamic_cast< FunctionDecl* >( decl ) ) {
-			return ! func->get_statements();
-		} // if
-		return true;
-	}
-} // namespace CodeGen
-
-#endif // CODEGENV_H
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: src/CodeGen/CodeGenerator2.cc
===================================================================
--- src/CodeGen/CodeGenerator2.cc	(revision 09d789c493c816483fb88c49a900967b7addbd2c)
+++ src/CodeGen/CodeGenerator2.cc	(revision 09d789c493c816483fb88c49a900967b7addbd2c)
@@ -0,0 +1,666 @@
+//
+// 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.
+//
+// CodeGenerator2.cc -- 
+//
+// Author           : Richard C. Bilson
+// Created On       : Mon May 18 07:44:20 2015
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu May 21 17:13:35 2015
+// Update Count     : 7
+//
+
+#include <algorithm>
+#include <iostream>
+#include <cassert>
+#include <list>
+
+#include "SynTree/Type.h"
+#include "SynTree/Declaration.h"
+#include "SynTree/Statement.h"
+#include "SynTree/Expression.h"
+#include "SynTree/Initializer.h"
+
+#include "utility.h"
+#include "UnimplementedError.h"
+
+#include "CodeGenerator2.h"
+#include "OperatorTable.h"
+#include "GenType.h"
+
+using namespace std;
+
+namespace CodeGen {
+	int CodeGenerator2::tabsize = 4;
+
+	CodeGenerator2::CodeGenerator2( std::ostream &os ) : cur_indent( 0 ), insideFunction( false ), before( os ), after() { }
+
+	CodeGenerator2::CodeGenerator2( std::ostream &os, std::string init, int indent, bool infunp )
+		: cur_indent( indent ), insideFunction( infunp ), before( os ) {
+		//before << std::string( init );
+	}
+
+	CodeGenerator2::CodeGenerator2( std::ostream &os, char *init, int indent, bool infunp )
+		: cur_indent( indent ), insideFunction( infunp ), before( os ) {
+		//before << std::string( init );
+	}
+
+	string mangleName( DeclarationWithType *decl ) {
+		if ( decl->get_mangleName() != "" ) {
+			return decl->get_mangleName();
+		} else {
+			return decl->get_name();
+		} // if
+	}
+  
+	//*** Declarations
+	void CodeGenerator2::visit( FunctionDecl *functionDecl ) {
+		handleStorageClass( functionDecl );
+		before << genType( functionDecl->get_functionType(), mangleName( functionDecl ) );
+
+		// how to get this to the Functype?
+		std::list< Declaration * > olds = functionDecl->get_oldDecls();
+		if ( ! olds.empty() ) {
+			before << " /* function has old declaration */";
+		} // if
+
+		// acceptAll( functionDecl->get_oldDecls(), *this );
+		if ( functionDecl->get_statements() ) {
+			functionDecl->get_statements()->accept(*this );
+		} // if
+	}
+
+	void CodeGenerator2::visit( ObjectDecl *objectDecl ) {
+		handleStorageClass( objectDecl );
+		before << genType( objectDecl->get_type(), mangleName( objectDecl ) );
+	
+		if ( objectDecl->get_init() ) {
+			before << " = ";
+			objectDecl->get_init()->accept( *this );
+		} // if
+		if ( objectDecl->get_bitfieldWidth() ) {
+			before << ":";
+			objectDecl->get_bitfieldWidth()->accept( *this );
+		} // if
+	}
+
+	void CodeGenerator2::handleAggregate( AggregateDecl *aggDecl ) {
+		if ( aggDecl->get_name() != "" )
+			before << aggDecl->get_name();
+	
+		std::list< Declaration * > &memb = aggDecl->get_members();
+
+		if ( ! memb.empty() ) {
+			before << endl << string( cur_indent, ' ' ) << "{" << endl;
+
+			cur_indent += CodeGenerator2::tabsize; 
+			for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end();  i++) {
+				before << string( cur_indent, ' ' ); 
+				(*i)->accept(*this );
+				before << ";" << endl;
+			}
+
+			cur_indent -= CodeGenerator2::tabsize; 
+
+			before << string( cur_indent, ' ' ) << "}";
+		} // if
+	}
+
+	void CodeGenerator2::visit( StructDecl *structDecl ) {
+		before << "struct ";
+		handleAggregate( structDecl );
+	}
+
+	void CodeGenerator2::visit( UnionDecl *aggregateDecl ) {
+		before << "union ";
+		handleAggregate( aggregateDecl );
+	}
+  
+	void CodeGenerator2::visit( EnumDecl *aggDecl ) {
+		before << "enum ";
+
+		if ( aggDecl->get_name() != "" )
+			before << aggDecl->get_name();
+	
+		std::list< Declaration* > &memb = aggDecl->get_members();
+
+		if ( ! memb.empty() ) {
+			before << endl << "{" << endl;
+
+			cur_indent += CodeGenerator2::tabsize; 
+			for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end();  i++) {
+				ObjectDecl *obj = dynamic_cast< ObjectDecl* >( *i );
+				assert( obj );
+				before << string( cur_indent, ' ' ) << mangleName( obj ); 
+				if ( obj->get_init() ) {
+					before << " = ";
+					obj->get_init()->accept(*this );
+				} // if
+				before << "," << endl;
+			} // for
+
+			cur_indent -= CodeGenerator2::tabsize; 
+
+			before << "}" << endl;
+		} // if
+	}
+  
+	void CodeGenerator2::visit( ContextDecl *aggregateDecl ) {}
+  
+	void CodeGenerator2::visit( TypedefDecl *typeDecl ) {
+		before << "typedef ";
+		before << genType( typeDecl->get_base(), typeDecl->get_name() );
+	}
+  
+	void CodeGenerator2::visit( TypeDecl *typeDecl ) {
+		// really, we should mutate this into something that isn't a TypeDecl but that requires large-scale changes,
+		// still to be done
+		before << "extern unsigned long " << typeDecl->get_name();
+		if ( typeDecl->get_base() ) {
+			before << " = sizeof( " << genType( typeDecl->get_base(), "" ) << " )";
+		} // if
+	}
+
+	void CodeGenerator2::visit( SingleInit *init ) {
+		init->get_value()->accept( *this );
+	}
+
+	void CodeGenerator2::visit( ListInit *init ) {
+		before << "{ ";
+		genCommaList( init->begin_initializers(), init->end_initializers() );
+		before << " }";
+	}
+
+	void CodeGenerator2::visit( Constant *constant ) { 
+		before << constant->get_value() ;
+	}
+
+	//*** Expressions
+	void CodeGenerator2::visit( ApplicationExpr *applicationExpr ) {
+		if ( VariableExpr *varExpr = dynamic_cast< VariableExpr* >( applicationExpr->get_function() ) ) {
+			OperatorInfo opInfo;
+			if ( varExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && operatorLookup( varExpr->get_var()->get_name(), opInfo ) ) {
+				std::list< Expression* >::iterator arg = applicationExpr->get_args().begin();
+				switch ( opInfo.type ) {
+				  case OT_PREFIXASSIGN:
+				  case OT_POSTFIXASSIGN:
+				  case OT_INFIXASSIGN:
+					{
+						assert( arg != applicationExpr->get_args().end() );
+						if ( AddressExpr *addrExpr = dynamic_cast< AddressExpr * >( *arg ) ) {
+	        
+							*arg = addrExpr->get_arg();
+						} else {
+							UntypedExpr *newExpr = new UntypedExpr( new NameExpr( "*?" ) );
+							newExpr->get_args().push_back( *arg );
+							*arg = newExpr;
+						} // if
+						break;
+					}
+	      
+				  default:
+					// do nothing
+					;
+				}
+	    
+				switch ( opInfo.type ) {
+				  case OT_INDEX:
+					assert( applicationExpr->get_args().size() == 2 );
+					(*arg++)->accept( *this );
+					before << "[";
+					(*arg)->accept( *this );
+					before << "]";
+					break;
+	      
+				  case OT_CALL:
+					// there are no intrinsic definitions of the function call operator
+					assert( false );
+					break;
+	      
+				  case OT_PREFIX:
+				  case OT_PREFIXASSIGN:
+					assert( applicationExpr->get_args().size() == 1 );
+					before << "(";
+					before << opInfo.symbol;
+					(*arg)->accept( *this );
+					before << ")";
+					break;
+	      
+				  case OT_POSTFIX:
+				  case OT_POSTFIXASSIGN:
+					assert( applicationExpr->get_args().size() == 1 );
+					(*arg)->accept( *this );
+					before << opInfo.symbol;
+					break;
+
+				  case OT_INFIX:
+				  case OT_INFIXASSIGN:
+					assert( applicationExpr->get_args().size() == 2 );
+					before << "(";
+					(*arg++)->accept( *this );
+					before << opInfo.symbol;
+					(*arg)->accept( *this );
+					before << ")";
+					break;
+	      
+				  case OT_CONSTANT:
+					// there are no intrinsic definitions of 0 or 1 as functions
+					assert( false );
+				}
+			} else {
+				varExpr->accept( *this );
+				before << "(";
+				genCommaList( applicationExpr->get_args().begin(), applicationExpr->get_args().end() );
+				before << ")";
+			} // if
+		} else {
+			applicationExpr->get_function()->accept( *this );
+			before << "(";
+			genCommaList( applicationExpr->get_args().begin(), applicationExpr->get_args().end() );
+			before << ")";
+		} // if
+	}
+  
+	void CodeGenerator2::visit( UntypedExpr *untypedExpr ) {
+		if ( NameExpr *nameExpr = dynamic_cast< NameExpr* >( untypedExpr->get_function() ) ) {
+			OperatorInfo opInfo;
+			if ( operatorLookup( nameExpr->get_name(), opInfo ) ) {
+				std::list< Expression* >::iterator arg = untypedExpr->get_args().begin();
+				switch ( opInfo.type ) {
+				  case OT_INDEX:
+					assert( untypedExpr->get_args().size() == 2 );
+					(*arg++)->accept( *this );
+					before << "[";
+					(*arg)->accept( *this );
+					before << "]";
+					break;
+	      
+				  case OT_CALL:
+					assert( false );
+					break;
+	      
+				  case OT_PREFIX:
+				  case OT_PREFIXASSIGN:
+					assert( untypedExpr->get_args().size() == 1 );
+					before << "(";
+					before << opInfo.symbol;
+					(*arg)->accept( *this );
+					before << ")";
+					break;
+	      
+				  case OT_POSTFIX:
+				  case OT_POSTFIXASSIGN:
+					assert( untypedExpr->get_args().size() == 1 );
+					(*arg)->accept( *this );
+					before << opInfo.symbol;
+					break;
+  
+				  case OT_INFIX:
+				  case OT_INFIXASSIGN:
+					assert( untypedExpr->get_args().size() == 2 );
+					before << "(";
+					(*arg++)->accept( *this );
+					before << opInfo.symbol;
+					(*arg)->accept( *this );
+					before << ")";
+					break;
+	      
+				  case OT_CONSTANT:
+					// there are no intrinsic definitions of 0 or 1 as functions
+					assert( false );
+				}
+			} else {
+				nameExpr->accept( *this );
+				before << "(";
+				genCommaList( untypedExpr->get_args().begin(), untypedExpr->get_args().end() );
+				before << ")";
+			} // if
+		} else {
+			untypedExpr->get_function()->accept( *this );
+			before << "(";
+			genCommaList( untypedExpr->get_args().begin(), untypedExpr->get_args().end() );
+			before << ")";
+		} // if
+	}
+  
+	void CodeGenerator2::visit( NameExpr *nameExpr ) {
+		OperatorInfo opInfo;
+		if ( operatorLookup( nameExpr->get_name(), opInfo ) ) {
+			assert( opInfo.type == OT_CONSTANT );
+			before << opInfo.symbol;
+		} else {
+			before << nameExpr->get_name();
+		} // if
+	}
+  
+	void CodeGenerator2::visit( AddressExpr *addressExpr ) {
+		before << "(&";
+		// this hack makes sure that we don't convert "constant_zero" to "0" if we're taking its address
+		if ( VariableExpr *variableExpr = dynamic_cast< VariableExpr* >( addressExpr->get_arg() ) ) {
+			before << mangleName( variableExpr->get_var() );
+		} else {
+			addressExpr->get_arg()->accept( *this );
+		} // if
+		before << ")";
+	}
+
+	void CodeGenerator2::visit( CastExpr *castExpr ) {
+		before << "((";
+		if ( castExpr->get_results().empty() ) {
+			before << "void" ;
+		} else {
+			before << genType( castExpr->get_results().front(), "" );
+		} // if
+		before << ")";
+		castExpr->get_arg()->accept( *this );
+		before << ")";
+	}
+  
+	void CodeGenerator2::visit( UntypedMemberExpr *memberExpr ) {
+		assert( false );
+	}
+  
+	void CodeGenerator2::visit( MemberExpr *memberExpr ) {
+		memberExpr->get_aggregate()->accept( *this );
+		before << "." << mangleName( memberExpr->get_member() );
+	}
+  
+	void CodeGenerator2::visit( VariableExpr *variableExpr ) {
+		OperatorInfo opInfo;
+		if ( variableExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && operatorLookup( variableExpr->get_var()->get_name(), opInfo ) && opInfo.type == OT_CONSTANT ) {
+			before << opInfo.symbol;
+		} else {
+			before << mangleName( variableExpr->get_var() );
+		} // if
+	}
+  
+	void CodeGenerator2::visit( ConstantExpr *constantExpr ) {
+		assert( constantExpr->get_constant() );
+		constantExpr->get_constant()->accept( *this );
+	}
+  
+	void CodeGenerator2::visit( SizeofExpr *sizeofExpr ) {
+		before << "sizeof(";
+		if ( sizeofExpr->get_isType() ) {
+			before << genType( sizeofExpr->get_type(), "" );
+		} else {
+			sizeofExpr->get_expr()->accept( *this );
+		} // if
+		before << ")";
+	}
+  
+	void CodeGenerator2::visit( LogicalExpr *logicalExpr ) {
+		before << "(";
+		logicalExpr->get_arg1()->accept( *this );
+		if ( logicalExpr->get_isAnd() ) {
+			before << " && ";
+		} else {
+			before << " || ";
+		} // if
+		logicalExpr->get_arg2()->accept( *this );
+		before << ")";
+	}
+  
+	void CodeGenerator2::visit( ConditionalExpr *conditionalExpr ) {
+		before << "(";
+		conditionalExpr->get_arg1()->accept( *this );
+		before << " ? ";
+		conditionalExpr->get_arg2()->accept( *this );
+		before << " : ";
+		conditionalExpr->get_arg3()->accept( *this );
+		before << ")";
+	}
+  
+	void CodeGenerator2::visit( CommaExpr *commaExpr ) {
+		before << "(";
+		commaExpr->get_arg1()->accept( *this );
+		before << " , ";
+		commaExpr->get_arg2()->accept( *this );
+		before << ")";
+	}
+  
+	void CodeGenerator2::visit( TupleExpr *tupleExpr ) {}
+  
+	void CodeGenerator2::visit( TypeExpr *typeExpr ) {}
+  
+  
+	//*** Statements
+	void CodeGenerator2::visit( CompoundStmt *compoundStmt ) {
+		std::list<Statement*> ks = compoundStmt->get_kids();
+
+		before << endl << string( cur_indent, ' ' ) << "{" << endl;
+
+		cur_indent += CodeGenerator2::tabsize; 
+
+		for ( std::list<Statement *>::iterator i = ks.begin(); i != ks.end();  i++) {
+			before << string( cur_indent, ' ' ) << printLabels( (*i)->get_labels() )  ;
+			(*i)->accept(*this );
+			shift_left();
+			before << endl;
+		}
+		cur_indent -= CodeGenerator2::tabsize; 
+
+		before << string( cur_indent, ' ' ) << "}" << endl;
+	}
+
+	void CodeGenerator2::visit( ExprStmt *exprStmt ) {
+		if ( exprStmt != 0 ) {
+			exprStmt->get_expr()->accept( *this );
+			shift_left();
+			before << ";" ;
+		} // if
+	}
+
+	void CodeGenerator2::visit( IfStmt *ifStmt ) {
+		before << "if (";
+		ifStmt->get_condition()->accept(*this );
+		after += ")\n";
+		shift_left(); 
+
+		cur_indent += CodeGenerator2::tabsize;
+		before << string( cur_indent, ' ' );
+		ifStmt->get_thenPart()->accept(*this );
+		cur_indent -= CodeGenerator2::tabsize; 
+		shift_left(); before << endl;
+
+		if ( ifStmt->get_elsePart() != 0) {
+			before << string( cur_indent, ' ' ) << " else " << endl ;
+
+			cur_indent += CodeGenerator2::tabsize; 
+			ifStmt->get_elsePart()->accept(*this );
+			cur_indent -= CodeGenerator2::tabsize; 
+		} // if
+	}
+
+	void CodeGenerator2::visit( SwitchStmt *switchStmt ) {
+		//before << /* "\r" << */ string( cur_indent, ' ' ) << CodeGenerator2::printLabels( switchStmt->get_labels() ) 
+		before << "switch (" ;
+		switchStmt->get_condition()->accept(*this );
+		after += ")\n";
+		shift_left();
+
+		before << string( cur_indent, ' ' ) << "{" << std::endl;
+		cur_indent += CodeGenerator2::tabsize;
+
+		std::list< Statement * > stmts = switchStmt->get_branches();
+		bool lastBreak = false; 
+
+		// horrible, horrible hack
+		if ( dynamic_cast<BranchStmt *>( stmts.back() ) != 0 ) {
+			lastBreak = true;
+			stmts.pop_back();
+		} // if
+		acceptAll( stmts, *this );
+		if ( lastBreak ) {
+			Statement *st = switchStmt->get_branches().back();
+			before << CodeGenerator2::printLabels( st->get_labels());
+			st->accept( *this );
+		} // if
+	  
+		cur_indent -= CodeGenerator2::tabsize; 
+
+		before << /* "\r" << */ string( cur_indent, ' ' ) << "}" << endl ;
+	}
+
+	void CodeGenerator2::visit( CaseStmt *caseStmt ) {
+		before << string( cur_indent, ' ' );
+		if ( caseStmt->isDefault()) 
+			before << "default "  ;
+		else {
+			before << "case "  ;
+			caseStmt->get_condition()->accept(*this );
+		} // if
+		after += ":\n";
+		shift_left();
+
+		std::list<Statement *> sts = caseStmt->get_statements();
+
+		cur_indent += CodeGenerator2::tabsize;
+		for ( std::list<Statement *>::iterator i = sts.begin(); i != sts.end();  i++) {
+			before << /* "\r" << */ string( cur_indent, ' ' ) << printLabels( (*i)->get_labels() )  ;
+			(*i)->accept(*this );
+			shift_left();
+			before << ";" << endl;
+		}
+		cur_indent -= CodeGenerator2::tabsize;
+	}
+
+	void CodeGenerator2::visit( BranchStmt *branchStmt ) {
+		switch ( branchStmt->get_type()) {
+		  case BranchStmt::Goto:
+			if ( ! branchStmt->get_target().empty() )
+				before << "goto " << branchStmt->get_target();
+			else { 
+				if ( branchStmt->get_computedTarget() != 0 ) {
+					before << "goto *";
+					branchStmt->get_computedTarget()->accept( *this );
+				} // if
+			} // if
+			break;
+		  case BranchStmt::Break:
+			before << "break";
+			break;
+		  case BranchStmt::Continue:
+			before << "continue";
+			break;
+		}
+		before << ";";
+	}
+
+
+	void CodeGenerator2::visit( ReturnStmt *returnStmt ) {
+		before << "return ";
+
+		// xxx -- check for null expression;
+		if ( returnStmt->get_expr() ) {
+			returnStmt->get_expr()->accept( *this );
+		} // if
+		after += ";";
+	}
+
+	void CodeGenerator2::visit( WhileStmt *whileStmt ) {
+		if ( whileStmt->get_isDoWhile() )
+			before << "do" ;
+		else {
+			before << "while (" ;
+			whileStmt->get_condition()->accept(*this );
+			after += ")";
+		} // if
+		after += "{\n";
+		shift_left();
+
+		whileStmt->get_body()->accept( *this );
+
+		before << /* "\r" << */ string( cur_indent, ' ' ) << "}" ;
+
+		if ( whileStmt->get_isDoWhile() ) {
+			before << " while (" ;
+			whileStmt->get_condition()->accept(*this );
+			after += ");";
+		} // if
+
+		after += "\n";
+	}
+
+	void CodeGenerator2::visit( ForStmt *forStmt ) {
+		before << "for (";
+
+		if ( forStmt->get_initialization() != 0 )
+			forStmt->get_initialization()->accept( *this );
+		else
+			before << ";";
+		shift_left();
+
+		if ( forStmt->get_condition() != 0 )
+			forStmt->get_condition()->accept( *this );
+		shift_left(); before << ";";
+
+		if ( forStmt->get_increment() != 0 )
+			forStmt->get_increment()->accept( *this );
+		shift_left(); before << ")" << endl;
+
+		if ( forStmt->get_body() != 0 ) {
+			cur_indent += CodeGenerator2::tabsize; 
+			before << string( cur_indent, ' ' ) << CodeGenerator2::printLabels( forStmt->get_body()->get_labels() );
+			forStmt->get_body()->accept( *this );
+			cur_indent -= CodeGenerator2::tabsize; 
+		} // if
+	}
+
+	void CodeGenerator2::visit( NullStmt *nullStmt ) {
+		//before << /* "\r" << */ string( cur_indent, ' ' ) << CodeGenerator2::printLabels( nullStmt->get_labels() );
+		before << "/* null statement */ ;";
+	}
+
+	void CodeGenerator2::visit( DeclStmt *declStmt ) {
+		declStmt->get_decl()->accept( *this );
+	
+		if ( doSemicolon( declStmt->get_decl() ) ) {
+			after += ";";
+		} // if
+		shift_left();
+	}
+
+	std::string CodeGenerator2::printLabels( std::list< Label > &l ) {
+		std::string str( "" );
+		l.unique();
+
+		for ( std::list< Label >::iterator i = l.begin(); i != l.end(); i++ )
+			str += *i + ": ";
+
+		return str;
+	}
+
+	void CodeGenerator2::shift_left() {
+		before << after;
+		after = "";
+	}
+
+	void CodeGenerator2::handleStorageClass( Declaration *decl ) {
+		switch ( decl->get_storageClass() ) {
+		  case Declaration::NoStorageClass:
+			break;
+		  case Declaration::Extern:
+			before << "extern ";
+			break;
+		  case Declaration::Static:
+			before << "static ";
+			break;
+		  case Declaration::Auto:
+			// silently drop storage class
+			break;
+		  case Declaration::Register:
+			before << "register ";
+			break;
+		} // switch
+	}
+} // namespace CodeGen
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
Index: src/CodeGen/CodeGenerator2.h
===================================================================
--- src/CodeGen/CodeGenerator2.h	(revision 09d789c493c816483fb88c49a900967b7addbd2c)
+++ src/CodeGen/CodeGenerator2.h	(revision 09d789c493c816483fb88c49a900967b7addbd2c)
@@ -0,0 +1,126 @@
+//
+// 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.
+//
+// CodeGenerator2.h -- 
+//
+// Author           : Richard C. Bilson
+// Created On       : Mon May 18 07:44:20 2015
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Mon May 18 23:35:37 2015
+// Update Count     : 2
+//
+
+#ifndef CODEGENV_H
+#define CODEGENV_H
+
+#include <strstream>
+#include <list>
+
+#include "SynTree/SynTree.h"
+#include "SynTree/Visitor.h"
+#include "SymTab/Indexer.h"
+
+namespace CodeGen {
+	class CodeGenerator2 : public Visitor {
+	  public:
+		static int tabsize;
+
+		CodeGenerator2( std::ostream &os );
+		CodeGenerator2( std::ostream &os, std::string, int indent = 0, bool infun = false );
+		CodeGenerator2( std::ostream &os, char *, int indent = 0, bool infun = false );
+
+		CodeGenerator2( CodeGenerator2 & );
+
+		//*** Declaration
+		virtual void visit( StructDecl * );
+		virtual void visit( FunctionDecl * );
+		virtual void visit( ObjectDecl * );
+		virtual void visit( UnionDecl *aggregateDecl );
+		virtual void visit( EnumDecl *aggregateDecl );
+		virtual void visit( ContextDecl *aggregateDecl );
+		virtual void visit( TypedefDecl *typeDecl );
+		virtual void visit( TypeDecl *typeDecl );
+
+		//*** Initializer
+		virtual void visit( SingleInit * );
+		virtual void visit( ListInit * );
+
+		//*** Constant
+		virtual void visit( Constant * );
+
+		//*** Expression
+		virtual void visit( ApplicationExpr *applicationExpr );
+		virtual void visit( UntypedExpr *untypedExpr );
+		virtual void visit( NameExpr *nameExpr );
+		virtual void visit( AddressExpr *addressExpr );
+		virtual void visit( CastExpr *castExpr );
+		virtual void visit( UntypedMemberExpr *memberExpr );
+		virtual void visit( MemberExpr *memberExpr );
+		virtual void visit( VariableExpr *variableExpr );
+		virtual void visit( ConstantExpr *constantExpr ); 
+		virtual void visit( SizeofExpr *sizeofExpr );
+		virtual void visit( LogicalExpr *logicalExpr );
+		virtual void visit( ConditionalExpr *conditionalExpr );
+		virtual void visit( CommaExpr *commaExpr );
+		virtual void visit( TupleExpr *tupleExpr );
+		virtual void visit( TypeExpr *typeExpr );
+
+		//*** Statements
+		virtual void visit( CompoundStmt * );
+		virtual void visit( ExprStmt * );
+		virtual void visit( IfStmt * );
+		virtual void visit( SwitchStmt * );
+		virtual void visit( CaseStmt * );
+		virtual void visit( BranchStmt * );
+		virtual void visit( ReturnStmt * );
+		virtual void visit( WhileStmt * );
+		virtual void visit( ForStmt * );
+		virtual void visit( NullStmt * );
+		virtual void visit( DeclStmt * ); 
+
+		std::string get_string( void );
+		void add_string_left( std::string s ) { before << s; }
+		void shift_left();
+		template< class Iterator > void genCommaList( Iterator begin, Iterator end );
+	  private:
+		int cur_indent;
+		bool insideFunction;
+		std::ostream &before;
+		std::string after;
+
+		static std::string printLabels ( std::list < Label > & );
+		void handleStorageClass( Declaration *decl );
+		void handleAggregate( AggregateDecl *aggDecl );
+		void handleTypedef( NamedTypeDecl *namedType );
+
+	};
+	
+	template< class Iterator >
+	void CodeGenerator2::genCommaList( Iterator begin, Iterator end ) {
+		if ( begin == end ) return;
+
+		for ( ;; ) {
+			(*begin++)->accept( *this );
+			if ( begin == end ) return;
+			before << ", ";
+		} // for
+	}
+  
+	inline bool doSemicolon( Declaration* decl ) {
+		if ( FunctionDecl* func = dynamic_cast< FunctionDecl* >( decl ) ) {
+			return ! func->get_statements();
+		} // if
+		return true;
+	}
+} // namespace CodeGen
+
+#endif // CODEGENV_H
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
Index: src/CodeGen/GenType.cc
===================================================================
--- src/CodeGen/GenType.cc	(revision 721f17ac6221a75230b4b1228917e6a163b53ff6)
+++ src/CodeGen/GenType.cc	(revision 09d789c493c816483fb88c49a900967b7addbd2c)
@@ -10,13 +10,13 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jun  8 14:36:02 2015
-// Update Count     : 9
-//
-
-#include <sstream>
+// Last Modified On : Mon May 18 23:38:22 2015
+// Update Count     : 2
+//
+
+#include <strstream>
 #include <cassert>
 
 #include "GenType.h"
-#include "CodeGenerator.h"
+#include "CodeGenerator2.h"
 #include "SynTree/Visitor.h"
 #include "SynTree/Type.h"
@@ -68,5 +68,5 @@
 
 	void GenType::genArray( const Type::Qualifiers &qualifiers, Type *base, Expression *dimension, bool isVarLen, bool isStatic ) {
-		std::ostringstream os;
+		std::ostrstream os;
 		if ( typeString != "" ) {
 			if ( typeString[ 0 ] == '*' ) {
@@ -97,10 +97,10 @@
 		} // if
 		if ( dimension != 0 ) {
-			CodeGenerator cg( os );
+			CodeGenerator2 cg( os );
 			dimension->accept( cg );
 		} // if
 		os << "]";
 
-		typeString = os.str();
+		typeString = std::string( os.str(), os.pcount() );
   
 		base->accept( *this );
@@ -127,5 +127,5 @@
 
 	void GenType::visit( FunctionType *funcType ) {
-		std::ostringstream os;
+		std::ostrstream os;
 
 		if ( typeString != "" ) {
@@ -148,5 +148,5 @@
 			} // if
 		} else {
-			CodeGenerator cg( os );
+			CodeGenerator2 cg( os );
 			os << "(" ;
 
@@ -159,5 +159,5 @@
 		} // if
   
-		typeString = os.str();
+		typeString = std::string( os.str(), os.pcount() );
 
 		if ( funcType->get_returnVals().size() == 0 ) {
Index: src/CodeGen/Generate.cc
===================================================================
--- src/CodeGen/Generate.cc	(revision 721f17ac6221a75230b4b1228917e6a163b53ff6)
+++ src/CodeGen/Generate.cc	(revision 09d789c493c816483fb88c49a900967b7addbd2c)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jun  4 14:04:25 2015
-// Update Count     : 5
+// Last Modified On : Mon May 18 23:39:24 2015
+// Update Count     : 1
 //
 
@@ -21,5 +21,6 @@
 #include "Generate.h"
 #include "SynTree/Declaration.h"
-#include "CodeGenerator.h"
+
+#include "CodeGenerator2.h"
 
 using namespace std;
@@ -27,9 +28,10 @@
 namespace CodeGen {
 	void generate( std::list< Declaration* > translationUnit, std::ostream &os, bool doIntrinsics ) {
-		CodeGen::CodeGenerator cgv( os );
+		CodeGen::CodeGenerator2 cgv( os );
 
 		for ( std::list<Declaration *>::iterator i = translationUnit.begin(); i != translationUnit.end();  i++ ) {
 			if ( LinkageSpec::isGeneratable( (*i)->get_linkage() ) && (doIntrinsics || ! LinkageSpec::isBuiltin( (*i)->get_linkage() ) ) ) {
 				(*i)->accept(cgv);
+				cgv.shift_left();
 				if ( doSemicolon( *i ) ) {
 					os << ";";
Index: src/CodeGen/OperatorTable.cc
===================================================================
--- src/CodeGen/OperatorTable.cc	(revision 721f17ac6221a75230b4b1228917e6a163b53ff6)
+++ src/CodeGen/OperatorTable.cc	(revision 09d789c493c816483fb88c49a900967b7addbd2c)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jun 23 17:41:14 2015
-// Update Count     : 5
+// Last Modified On : Mon May 18 23:42:07 2015
+// Update Count     : 2
 //
 
@@ -20,45 +20,44 @@
 	namespace {
 		const OperatorInfo tableValues[] = {
-			{	"?[?]",		"",		"_operator_index",				OT_INDEX			},
-			{	"?()",		"",		"_operator_call",				OT_CALL				},
-			{	"?++",		"++",	"_operator_postincr",			OT_POSTFIXASSIGN	},
-			{	"?--",		"--",	"_operator_postdecr",			OT_POSTFIXASSIGN	},
-			{	"*?",		"*",	"_operator_deref",				OT_PREFIX			},
-			{	"+?",		"+",	"_operator_unaryplus",			OT_PREFIX			},
-			{	"-?",		"-",	"_operator_unaryminus",			OT_PREFIX			},
-			{	"~?",		"~",	"_operator_bitnot",				OT_PREFIX			},
-			{	"!?",		"!",	"_operator_lognot",				OT_PREFIX			},
-			{	"++?",		"++",	"_operator_preincr",			OT_PREFIXASSIGN		},
-			{	"--?",		"--",	"_operator_predecr",			OT_PREFIXASSIGN		},
-			{	"?*?",		"*",	"_operator_multiply",			OT_INFIX			},
-			{	"?/?",		"/",	"_operator_divide",				OT_INFIX			},
-			{	"?%?",		"%",	"_operator_modulus",			OT_INFIX			},
-			{	"?+?",		"+",	"_operator_add",				OT_INFIX			},
-			{	"?-?",		"-",	"_operator_subtract",			OT_INFIX			},
-			{	"?<<?",		"<<",	"_operator_shiftleft",			OT_INFIX			},
-			{	"?>>?",		">>",	"_operator_shiftright",			OT_INFIX			},
-			{	"?<?",		"<",	"_operator_less",				OT_INFIX			},
-			{	"?>?",		">",	"_operator_greater",			OT_INFIX			},
-			{	"?<=?",		"<=",	"_operator_lessequal",			OT_INFIX			},
-			{	"?>=?",		">=",	"_operator_greaterequal",		OT_INFIX			},
-			{	"?==?",		"==",	"_operator_equal",				OT_INFIX			},
-			{	"?!=?",		"!=",	"_operator_notequal",			OT_INFIX			},
-			{	"?&?",		"&",	"_operator_bitand",				OT_INFIX			},
-			{	"?^?",		"^",	"_operator_bitxor",				OT_INFIX			},
-			{	"?|?",		"|",	"_operator_bitor",				OT_INFIX			},
-			{	"?=?",		"=",	"_operator_assign",				OT_INFIXASSIGN		},
-			{	"?*=?",		"*=",	"_operator_multassign",			OT_INFIXASSIGN		},
-			{	"?/=?",		"/=",	"_operator_divassign",			OT_INFIXASSIGN		},
-			{	"?%=?",		"%=",	"_operator_modassign",			OT_INFIXASSIGN		},
-			{	"?+=?",		"+=",	"_operator_addassign",			OT_INFIXASSIGN		},
-			{	"?-=?",		"-=",	"_operator_subassign",			OT_INFIXASSIGN		},
+			{	"?[?]",		"",		"_operator_index",			OT_INDEX		},
+			{	"?()",		"",		"_operator_call",			OT_CALL			},
+			{	"?++",		"++",	"_operator_postincr",		OT_POSTFIXASSIGN	},
+			{	"?--",		"--",	"_operator_postdecr",		OT_POSTFIXASSIGN	},
+			{	"*?",		"*",	"_operator_deref",			OT_PREFIX		},
+			{	"+?",		"+",	"_operator_unaryplus",		OT_PREFIX		},
+			{	"-?",		"-",	"_operator_unaryminus",		OT_PREFIX		},
+			{	"~?",		"~",	"_operator_bitnot",			OT_PREFIX		},
+			{	"!?",		"!",	"_operator_lognot",			OT_PREFIX		},
+			{	"++?",		"++",	"_operator_preincr",		OT_PREFIXASSIGN		},
+			{	"--?",		"--",	"_operator_predecr",		OT_PREFIXASSIGN		},
+			{	"?*?",		"*",	"_operator_multiply",		OT_INFIX		},
+			{	"?/?",		"/",	"_operator_divide",			OT_INFIX		},
+			{	"?%?",		"%",	"_operator_modulus",		OT_INFIX		},
+			{	"?+?",		"+",	"_operator_add",			OT_INFIX		},
+			{	"?-?",		"-",	"_operator_subtract",		OT_INFIX		},
+			{	"?<<?",		"<<",	"_operator_shiftleft",		OT_INFIX		},
+			{	"?>>?",		">>",	"_operator_shiftright",		OT_INFIX		},
+			{	"?<?",		"<",	"_operator_less",			OT_INFIX		},
+			{	"?>?",		">",	"_operator_greater",		OT_INFIX		},
+			{	"?<=?",		"<=",	"_operator_lessequal",		OT_INFIX		},
+			{	"?>=?",		">=",	"_operator_greaterequal",	OT_INFIX		},
+			{	"?==?",		"==",	"_operator_equal",			OT_INFIX		},
+			{	"?!=?",		"!=",	"_operator_notequal",		OT_INFIX		},
+			{	"?&?",		"&",	"_operator_bitand",			OT_INFIX		},
+			{	"?^?",		"^",	"_operator_bitxor",			OT_INFIX		},
+			{	"?|?",		"|",	"_operator_bitor",			OT_INFIX		},
+			{	"?=?",		"=",	"_operator_assign",			OT_INFIXASSIGN		},
+			{	"?*=?",		"*=",	"_operator_multassign",		OT_INFIXASSIGN		},
+			{	"?/=?",		"/=",	"_operator_divassign",		OT_INFIXASSIGN		},
+			{	"?%=?",		"%=",	"_operator_modassign",		OT_INFIXASSIGN		},
+			{	"?+=?",		"+=",	"_operator_addassign",		OT_INFIXASSIGN		},
+			{	"?-=?",		"-=",	"_operator_subassign",		OT_INFIXASSIGN		},
 			{	"?<<=?",	"<<=",	"_operator_shiftleftassign",	OT_INFIXASSIGN		},
 			{	"?>>=?",	">>=",	"_operator_shiftrightassign",	OT_INFIXASSIGN		},
-			{	"?&=?",		"&=",	"_operator_bitandassign",		OT_INFIXASSIGN		},
-			{	"?^=?",		"^=",	"_operator_bitxorassign",		OT_INFIXASSIGN		},
-			{	"?|=?",		"|=",	"_operator_bitorassign",		OT_INFIXASSIGN		},
-			{	"&&",		"&&",	"&&",							OT_LABELADDRESS		},
-			{	"0",		"0",	"_constant_zero",				OT_CONSTANT			},
-			{	"1",		"1",	"_constant_one",				OT_CONSTANT			}
+			{	"?&=?",		"&=",	"_operator_bitandassign",	OT_INFIXASSIGN		},
+			{	"?^=?",		"^=",	"_operator_bitxorassign",	OT_INFIXASSIGN		},
+			{	"?|=?",		"|=",	"_operator_bitorassign",	OT_INFIXASSIGN		},
+			{	"0",		"0",	"_constant_zero",			OT_CONSTANT		},
+			{	"1",		"1",	"_constant_one",			OT_CONSTANT		}
 		};
 
Index: src/CodeGen/OperatorTable.h
===================================================================
--- src/CodeGen/OperatorTable.h	(revision 721f17ac6221a75230b4b1228917e6a163b53ff6)
+++ src/CodeGen/OperatorTable.h	(revision 09d789c493c816483fb88c49a900967b7addbd2c)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jun 23 16:09:27 2015
-// Update Count     : 3
+// Last Modified On : Mon May 18 23:43:07 2015
+// Update Count     : 2
 //
 
@@ -29,5 +29,4 @@
 		OT_POSTFIXASSIGN,
 		OT_INFIXASSIGN,
-		OT_LABELADDRESS,
 		OT_CONSTANT
 	};
Index: src/CodeGen/module.mk
===================================================================
--- src/CodeGen/module.mk	(revision 721f17ac6221a75230b4b1228917e6a163b53ff6)
+++ src/CodeGen/module.mk	(revision 09d789c493c816483fb88c49a900967b7addbd2c)
@@ -1,24 +1,6 @@
-######################### -*- Mode: Makefile-Gmake -*- ########################
-##
-## 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.
-##
-## module.mk -- 
-##
-## Author           : Richard C. Bilson
-## Created On       : Mon Jun  1 17:49:17 2015
-## Last Modified By : Peter A. Buhr
-## Last Modified On : Tue Jun  2 11:17:02 2015
-## Update Count     : 3
-###############################################################################
-
-#SRC +=  ArgTweak/Rewriter.cc \
-#	ArgTweak/Mutate.cc
-
 SRC +=  CodeGen/Generate.cc \
-	CodeGen/CodeGenerator.cc \
+	CodeGen/CodeGenerator2.cc \
 	CodeGen/GenType.cc \
 	CodeGen/FixNames.cc \
-	CodeGen/OperatorTable.cc
+	CodeGen/OperatorTable.cc \
+	$(NULL)
