Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 54cd58b05627aa96eb079e979384aae60df8bd8e)
+++ src/CodeGen/CodeGenerator.cc	(revision 74b007ba1f2facc85656ade19a8bab1d56bb0a82)
@@ -182,4 +182,5 @@
 			genCommaList( aggDecl->get_parameters().begin(), aggDecl->get_parameters().end() );
 			output << ")" << endl;
+			output << indent;
 		}
 
@@ -321,6 +322,10 @@
 	void CodeGenerator::visit( __attribute__((unused)) ConstructorInit * init ){
 		assertf( ! genC, "ConstructorInit nodes should not reach code generation." );
-		// xxx - generate something reasonable for constructor/destructor pairs
-		output << "<ctorinit>";
+		// pseudo-output for constructor/destructor pairs
+		output << "<ctorinit>{" << std::endl << ++indent << "ctor: ";
+		maybeAccept( init->get_ctor(), *this );
+		output << ", " << std::endl << indent << "dtor: ";
+		maybeAccept( init->get_dtor(), *this );
+		output << std::endl << --indent << "}";
 	}
 
@@ -336,35 +341,4 @@
 			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:
-				  case OT_CTOR:
-				  case OT_DTOR:
-					{
-						assert( arg != applicationExpr->get_args().end() );
-						if ( AddressExpr * addrExpr = dynamic_cast< AddressExpr * >( *arg ) ) {
-							// remove & from first assignment/ctor argument
-							*arg = addrExpr->get_arg();
-						} else {
-							// no address-of operator, so must be a pointer - add dereference
-							// NOTE: if the assertion starts to trigger, check that the application expr isn't being shared.
-							// Since its arguments are modified here, this assertion most commonly triggers when the application
-							// is visited multiple times.
-							UntypedExpr * newExpr = new UntypedExpr( new NameExpr( "*?" ) );
-							newExpr->get_args().push_back( *arg );
-							Type * type = InitTweak::getPointerBase( (*arg)->get_result() );
-							assertf( type, "First argument to a derefence must be a pointer. Ensure that expressions are not being shared." );
-							newExpr->set_result( type->clone() );
-							*arg = newExpr;
-						} // if
-						break;
-					}
-
-				  default:
-					// do nothing
-					;
-				} // switch
-
 				switch ( opInfo.type ) {
 				  case OT_INDEX:
@@ -695,4 +669,8 @@
 		extension( commaExpr );
 		output << "(";
+		if ( genC ) {
+			// arg1 of a CommaExpr is never used, so it can be safely cast to void to reduce gcc warnings.
+			commaExpr->set_arg1( new CastExpr( commaExpr->get_arg1() ) );
+		}
 		commaExpr->get_arg1()->accept( *this );
 		output << " , ";
@@ -758,5 +736,5 @@
 		for ( Statement * stmt : stmts ) {
 			output << lineDirective( stmt ) << indent;
-            output << printLabels( stmt->get_labels() );
+			output << printLabels( stmt->get_labels() );
 			if ( i+1 == numStmts ) {
 				// last statement in a statement expression needs to be handled specially -
@@ -803,10 +781,9 @@
 	void CodeGenerator::visit( ExprStmt * exprStmt ) {
 		assert( exprStmt );
-		Expression * expr = exprStmt->get_expr();
 		if ( genC ) {
 			// cast the top-level expression to void to reduce gcc warnings.
-			expr = new CastExpr( expr );
-		}
-		expr->accept( *this );
+			exprStmt->set_expr( new CastExpr( exprStmt->get_expr() ) );
+		}
+		exprStmt->get_expr()->accept( *this );
 		output << ";";
 	}
Index: src/CodeGen/CodeGenerator.h
===================================================================
--- src/CodeGen/CodeGenerator.h	(revision 54cd58b05627aa96eb079e979384aae60df8bd8e)
+++ src/CodeGen/CodeGenerator.h	(revision 74b007ba1f2facc85656ade19a8bab1d56bb0a82)
@@ -19,4 +19,6 @@
 #include <ostream>                // for ostream, operator<<
 #include <string>                 // for string
+
+#include "Common/Indenter.h"      // for Indenter
 
 #include "SynTree/Declaration.h"  // for DeclarationWithType (ptr only), Fun...
Index: src/CodeGen/GenType.cc
===================================================================
--- src/CodeGen/GenType.cc	(revision 54cd58b05627aa96eb079e979384aae60df8bd8e)
+++ src/CodeGen/GenType.cc	(revision 74b007ba1f2facc85656ade19a8bab1d56bb0a82)
@@ -37,4 +37,5 @@
 		virtual void visit( PointerType *pointerType );
 		virtual void visit( ArrayType *arrayType );
+		virtual void visit( ReferenceType *refType );
 		virtual void visit( StructInstType *structInst );
 		virtual void visit( UnionInstType *unionInst );
@@ -147,4 +148,12 @@
 	}
 
+	void GenType::visit( ReferenceType *refType ) {
+		assert( refType->get_base() != 0);
+		assertf( ! genC, "Reference types should not reach code generation." );
+		handleQualifiers( refType );
+		typeString = "&" + typeString;
+		refType->get_base()->accept( *this );
+	}
+
 	void GenType::visit( FunctionType *funcType ) {
 		std::ostringstream os;
Index: src/CodeGen/OperatorTable.cc
===================================================================
--- src/CodeGen/OperatorTable.cc	(revision 54cd58b05627aa96eb079e979384aae60df8bd8e)
+++ src/CodeGen/OperatorTable.cc	(revision 74b007ba1f2facc85656ade19a8bab1d56bb0a82)
@@ -14,6 +14,7 @@
 //
 
-#include <map>      // for map, _Rb_tree_const_iterator, map<>::const_iterator
-#include <utility>  // for pair
+#include <algorithm>  // for any_of
+#include <map>        // for map, _Rb_tree_const_iterator, map<>::const_iterator
+#include <utility>    // for pair
 
 #include "OperatorTable.h"
@@ -93,4 +94,39 @@
 		} // if
 	}
+
+	/// determines if a given function name is one of the operator types between [begin, end)
+	template<typename Iterator>
+	bool isOperatorType( const std::string & funcName, Iterator begin, Iterator end ) {
+		OperatorInfo info;
+		if ( operatorLookup( funcName, info ) ) {
+			return std::find( begin, end, info.type ) != end;
+		}
+		return false;
+	}
+
+	bool isConstructor( const std::string & funcName ) {
+		static OperatorType types[] = { OT_CTOR };
+		return isOperatorType( funcName, std::begin(types), std::end(types) );
+	}
+
+	bool isDestructor( const std::string & funcName ) {
+		static OperatorType types[] = { OT_DTOR };
+		return isOperatorType( funcName, std::begin(types), std::end(types) );
+	}
+
+	bool isAssignment( const std::string & funcName ) {
+		static OperatorType types[] = { OT_PREFIXASSIGN, OT_POSTFIXASSIGN, OT_INFIXASSIGN };
+		return isOperatorType( funcName, std::begin(types), std::end(types) );
+	}
+
+	bool isCtorDtor( const std::string & funcName ) {
+		static OperatorType types[] = { OT_CTOR, OT_DTOR };
+		return isOperatorType( funcName, std::begin(types), std::end(types) );
+	}
+
+	bool isCtorDtorAssign( const std::string & funcName ) {
+		static OperatorType types[] = { OT_CTOR, OT_DTOR, OT_PREFIXASSIGN, OT_POSTFIXASSIGN, OT_INFIXASSIGN };
+		return isOperatorType( funcName, std::begin(types), std::end(types) );
+	}
 } // namespace CodeGen
 
Index: src/CodeGen/OperatorTable.h
===================================================================
--- src/CodeGen/OperatorTable.h	(revision 54cd58b05627aa96eb079e979384aae60df8bd8e)
+++ src/CodeGen/OperatorTable.h	(revision 74b007ba1f2facc85656ade19a8bab1d56bb0a82)
@@ -5,5 +5,5 @@
 // file "LICENCE" distributed with Cforall.
 //
-// OperatorTable.h -- 
+// OperatorTable.h --
 //
 // Author           : Richard C. Bilson
@@ -42,4 +42,10 @@
 
 	bool operatorLookup( std::string funcName, OperatorInfo &info );
+
+	bool isConstructor( const std::string & );
+	bool isDestructor( const std::string & );
+	bool isAssignment( const std::string & );
+	bool isCtorDtor( const std::string & );
+	bool isCtorDtorAssign( const std::string & );
 } // namespace CodeGen
 
