Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 3d4b23fa9ef416e3543e652102009137f340d4e5)
+++ src/CodeGen/CodeGenerator.cc	(revision 89be1c68ce6af5c822ac429caef167ce24a3cf97)
@@ -336,35 +336,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:
Index: src/CodeGen/GenType.cc
===================================================================
--- src/CodeGen/GenType.cc	(revision 3d4b23fa9ef416e3543e652102009137f340d4e5)
+++ src/CodeGen/GenType.cc	(revision 89be1c68ce6af5c822ac429caef167ce24a3cf97)
@@ -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;
