Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 321a2481aec2e4a3da980c519cddd0b6e8fbf3ea)
+++ src/CodeGen/CodeGenerator.cc	(revision 64071c2ad8eac1915b692988a8dc0d8e9d7cb8da)
@@ -257,30 +257,9 @@
 				std::list< Expression* >::iterator arg = applicationExpr->get_args().begin();
 				switch ( opInfo.type ) {
-				  case OT_CTOR:
-				  case OT_DTOR:
-					{
-						// if the first argument's type is const then GCC complains. In this
-						// case, output an explicit ctor/dtor call and exit, rather than following
-						// the normal path
-						assert( arg != applicationExpr->get_args().end() );
-						assert( (*arg)->get_results().size() >= 1 );
-						Type * baseType = InitTweak::getPointerBase( (*arg)->get_results().front() );
-						if ( baseType->get_isConst() ) {
-							// cast away the qualifiers, to eliminate warnings
-							Type * newType = baseType->clone();
-							newType->get_qualifiers() = Type::Qualifiers();
-							*arg = new CastExpr( *arg, new PointerType( Type::Qualifiers(), newType ) );
-							varExpr->accept( *this );
-							output << "(";
-							genCommaList( applicationExpr->get_args().begin(), applicationExpr->get_args().end() );
-							output << ")";
-							return;
-						}
-					}
-					// intentional fallthrough - instrinsic ctor/dtor for non-const objects should
-					// be handled the same way as assignment
 				  case OT_PREFIXASSIGN:
 				  case OT_POSTFIXASSIGN:
 				  case OT_INFIXASSIGN:
+				  case OT_CTOR:
+				  case OT_DTOR:
 					{
 						assert( arg != applicationExpr->get_args().end() );
@@ -324,8 +303,8 @@
 					if ( applicationExpr->get_args().size() == 1 ) {
 						// the expression fed into a single parameter constructor or destructor
-						// may contain side effects - output as a void expression
-						output << "((void)(";
+						// may contain side effects, so must still output this expression
+						output << "(";
 						(*arg++)->accept( *this );
-						output << ")) /* " << opInfo.inputName << " */";
+						output << ") /* " << opInfo.inputName << " */";
 					} else if ( applicationExpr->get_args().size() == 2 ) {
 						// intrinsic two parameter constructors are essentially bitwise assignment
@@ -409,8 +388,8 @@
 					if ( untypedExpr->get_args().size() == 1 ) {
 						// the expression fed into a single parameter constructor or destructor
-						// may contain side effects - output as a void expression
-						output << "((void)(";
+						// may contain side effects, so must still output this expression
+						output << "(";
 						(*arg++)->accept( *this );
-						output << ")) /* " << opInfo.inputName << " */";
+						output << ") /* " << opInfo.inputName << " */";
 					} else if ( untypedExpr->get_args().size() == 2 ) {
 						// intrinsic two parameter constructors are essentially bitwise assignment
