Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision bff227f73387fd7ed67a8a31545259b27d4ddc24)
+++ src/InitTweak/FixInit.cc	(revision 2afec66345a55139c8738d36411816676b2fe4d3)
@@ -1182,15 +1182,38 @@
 			ctorExpr->set_callExpr( nullptr );
 			ctorExpr->set_env( nullptr );
+			delete ctorExpr;
 
 			Expression *& firstArg = callExpr->get_args().front();
-			UntypedExpr * assign = new UntypedExpr( new NameExpr( "?=?" ) );
-			assign->get_args().push_back( new VariableExpr( tmp ) );
-			assign->get_args().push_back( firstArg );
-			assign->set_result( ctorExpr->get_result()->clone() );
-			firstArg = assign;
-
-			CommaExpr * commaExpr = new CommaExpr( callExpr, new VariableExpr( tmp ) );
+
+			// xxx - hack in 'fake' assignment operator until resolver can easily be called in this pass. Once the resolver can be used in PassVisitor, this hack goes away.
+
+			// generate the type of assignment operator using the type of tmp minus any reference types
+			Type * type = tmp->get_type()->stripReferences();
+			FunctionType * ftype = SymTab::genAssignType( type );
+
+			// generate fake assignment decl and call it using &tmp and &firstArg
+			// since tmp is guaranteed to be a reference and we want to assign pointers
+			FunctionDecl * assignDecl = new FunctionDecl( "?=?", Type::StorageClasses(), LinkageSpec::Intrinsic, ftype, nullptr );
+			ApplicationExpr * assign = new ApplicationExpr( VariableExpr::functionPointer( assignDecl ) );
+			assign->get_args().push_back( new AddressExpr( new VariableExpr( tmp ) ) );
+			Expression * addrArg = new AddressExpr( firstArg );
+			// if firstArg has type T&&, then &firstArg has type T*&.
+			// Cast away the reference to a value type so that the argument
+			// matches the assignment's parameter types
+			if ( dynamic_cast<ReferenceType *>( addrArg->get_result() ) ) {
+				addrArg = new CastExpr( addrArg, addrArg->get_result()->stripReferences()->clone() );
+			}
+			assign->get_args().push_back( addrArg );
+			firstArg = new VariableExpr( tmp );
+
+			// for constructor expr:
+			//   T x;
+			//   x{};
+			// results in:
+			//   T x;
+			//   T & tmp;
+			//   &tmp = &x, ?{}(tmp), tmp
+			CommaExpr * commaExpr = new CommaExpr( assign, new CommaExpr( callExpr, new VariableExpr( tmp ) ) );
 			commaExpr->set_env( env );
-			delete ctorExpr;
 			return commaExpr;
 		}
