Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 9e2c1f036fddf8f841b5d1d1b225d3cb03a7ca67)
+++ src/CodeGen/CodeGenerator.cc	(revision e365cb53bad5e4b5c75e0ec39f328dfd43a15597)
@@ -33,4 +33,6 @@
 #include "OperatorTable.h"
 #include "GenType.h"
+
+#include "InitTweak/InitTweak.h"
 
 using namespace std;
@@ -255,9 +257,30 @@
 				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() );
@@ -269,4 +292,8 @@
 							UntypedExpr *newExpr = new UntypedExpr( new NameExpr( "*?" ) );
 							newExpr->get_args().push_back( *arg );
+							assert( (*arg)->get_results().size() == 1 );
+							Type * type = InitTweak::getPointerBase( (*arg)->get_results().front() );
+							assert( type );
+							newExpr->get_results().push_back( type );
 							*arg = newExpr;
 						} // if
