Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision c8dfcd3a4ea472775bb425585268096226f404ce)
+++ src/InitTweak/FixInit.cc	(revision 4d4882af105c01a957552263fa5e039f2f2620f3)
@@ -787,5 +787,13 @@
 					UntypedExpr * deref = new UntypedExpr( new NameExpr( "*?" ) );
 					deref->get_args().push_back( new VariableExpr( thisParam ) );
-					InitExpander srcParam( (Initializer *)NULL ); // xxx - if copy ctor, need to pass appropriate argument - second param of this function dot member
+
+					Expression * arg2 = 0;
+					if ( isCopyConstructor( function ) ) {
+						// if copy ctor, need to pass second-param-of-this-function.member
+						std::list< DeclarationWithType * > & params = function->get_functionType()->get_parameters();
+						assert( params.size() == 2 );
+						arg2 = new MemberExpr( member, new VariableExpr( params.back() ) );
+					}
+					InitExpander srcParam( arg2 );
 					SymTab::genImplicitCall( srcParam, new MemberExpr( member, deref ), function->get_name(), back_inserter( stmt ), member, isCtor );
 
@@ -832,9 +840,4 @@
 					handleFirstParam( firstParam );
 				}
-			} else if ( fname == "?=?" && isIntrinsicCallExpr( appExpr ) ) {
-				// forgive use of intrinsic assignment to construct, since instrinsic constructors
-				// codegen as assignment anyway.
-				assert( appExpr->get_args().size() == 2 );
-				handleFirstParam( appExpr->get_args().front() );
 			}
 
Index: src/InitTweak/InitTweak.cc
===================================================================
--- src/InitTweak/InitTweak.cc	(revision c8dfcd3a4ea472775bb425585268096226f404ce)
+++ src/InitTweak/InitTweak.cc	(revision 4d4882af105c01a957552263fa5e039f2f2620f3)
@@ -7,4 +7,5 @@
 #include "SynTree/Attribute.h"
 #include "GenPoly/GenPoly.h"
+#include "ResolvExpr/typeops.h"
 
 namespace InitTweak {
@@ -439,3 +440,22 @@
 	bool isDestructor( const std::string & str ) { return str == "^?{}"; }
 	bool isCtorDtor( const std::string & str ) { return isConstructor( str ) || isDestructor( str ); }
+
+	FunctionDecl * isCopyConstructor( Declaration * decl ) {
+		FunctionDecl * function = dynamic_cast< FunctionDecl * >( decl );
+		if ( ! function ) return 0;
+		if ( ! isConstructor( function->get_name() ) ) return 0;
+		FunctionType * ftype = function->get_functionType();
+		if ( ftype->get_parameters().size() != 2 ) return 0;
+
+		Type * t1 = ftype->get_parameters().front()->get_type();
+		Type * t2 = ftype->get_parameters().back()->get_type();
+		PointerType * ptrType = dynamic_cast< PointerType * > ( t1 );
+		assert( ptrType );
+
+		if ( ResolvExpr::typesCompatible( ptrType->get_base(), t2, SymTab::Indexer() ) ) {
+			return function;
+		} else {
+			return 0;
+		}
+	}
 }
Index: src/InitTweak/InitTweak.h
===================================================================
--- src/InitTweak/InitTweak.h	(revision c8dfcd3a4ea472775bb425585268096226f404ce)
+++ src/InitTweak/InitTweak.h	(revision 4d4882af105c01a957552263fa5e039f2f2620f3)
@@ -29,4 +29,6 @@
 	bool isDestructor( const std::string & );
 	bool isCtorDtor( const std::string & );
+
+	FunctionDecl * isCopyConstructor( Declaration * decl );
 
 	/// transform Initializer into an argument list that can be passed to a call expression
