Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision fba44f88c0909ebe9f84c63385f6fa1d508208a7)
+++ 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 fba44f88c0909ebe9f84c63385f6fa1d508208a7)
+++ 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 fba44f88c0909ebe9f84c63385f6fa1d508208a7)
+++ 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
Index: src/SynTree/FunctionDecl.cc
===================================================================
--- src/SynTree/FunctionDecl.cc	(revision fba44f88c0909ebe9f84c63385f6fa1d508208a7)
+++ src/SynTree/FunctionDecl.cc	(revision 4d4882af105c01a957552263fa5e039f2f2620f3)
@@ -21,4 +21,5 @@
 #include "Attribute.h"
 #include "Common/utility.h"
+#include "InitTweak/InitTweak.h"
 
 FunctionDecl::FunctionDecl( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Spec linkage, FunctionType *type, CompoundStmt *statements, bool isInline, bool isNoreturn, std::list< Attribute * > attributes )
Index: src/tests/.expect/ctorWarnings.txt
===================================================================
--- src/tests/.expect/ctorWarnings.txt	(revision fba44f88c0909ebe9f84c63385f6fa1d508208a7)
+++ 	(revision )
@@ -1,8 +1,0 @@
-CFA Version 1.0.0 (debug)
-Error: in void ?{}(struct A *a, int x), member z may not have been constructed
-Error: in void ?{}(struct B *b), member a2 used before being constructed
-Error: in void ?{}(struct B *b), member a2 may not have been constructed
-Error: in void ?{}(struct B *b), member a3 may not have been constructed
-Error: in void ^?{}(struct B *b), member a2 may not have been destructed
-Error: in void ^?{}(struct B *b), member a3 may not have been destructed
-make: *** [ctorWarnings] Error 1
Index: src/tests/.expect/memberCtors-ERR1.txt
===================================================================
--- src/tests/.expect/memberCtors-ERR1.txt	(revision 4d4882af105c01a957552263fa5e039f2f2620f3)
+++ src/tests/.expect/memberCtors-ERR1.txt	(revision 4d4882af105c01a957552263fa5e039f2f2620f3)
@@ -0,0 +1,3 @@
+CFA Version 1.0.0 (debug)
+Error: in void ?{}(struct B *b), member a2 used before being constructed
+make: *** [memberCtors-ERR1] Error 1
Index: src/tests/.expect/memberCtors.txt
===================================================================
--- src/tests/.expect/memberCtors.txt	(revision 4d4882af105c01a957552263fa5e039f2f2620f3)
+++ src/tests/.expect/memberCtors.txt	(revision 4d4882af105c01a957552263fa5e039f2f2620f3)
@@ -0,0 +1,58 @@
+constructing int
+constructing int
+constructing int
+constructing int
+constructing int
+constructing int
+constructing int
+constructing int
+constructing int: 1001
+assigning int: 0 0
+constructing int
+constructing int
+constructing int: 1000
+assigning int: 0 0
+destructing int: 0
+destructing int: 0
+destructing int: 1001
+copy constructing int: 0
+copy constructing int: 0
+copy constructing int: 1000
+copy constructing int: 0
+copy constructing int: 0
+copy constructing int: 1001
+copy constructing int: 0
+copy constructing int: 0
+copy constructing int: 0
+constructing int
+constructing int
+constructing int: 999
+assigning int: 0 0
+destructing int: 0
+destructing int: 0
+destructing int: 1000
+destructing int: 0
+destructing int: 0
+destructing int: 999
+destructing int: 0
+destructing int: 0
+destructing int: 999
+destructing int: 0
+destructing int: 0
+destructing int: 0
+constructing int
+constructing int
+constructing int: 999
+assigning int: 0 0
+destructing int: 0
+destructing int: 0
+destructing int: 1000
+destructing int: 0
+destructing int: 0
+destructing int: 999
+destructing int: 0
+destructing int: 0
+destructing int: 999
+destructing int: 0
+destructing int: 0
+destructing int: 0
Index: src/tests/Makefile.am
===================================================================
--- src/tests/Makefile.am	(revision fba44f88c0909ebe9f84c63385f6fa1d508208a7)
+++ src/tests/Makefile.am	(revision 4d4882af105c01a957552263fa5e039f2f2620f3)
@@ -62,5 +62,5 @@
 	${CC} ${CFLAGS} -CFA -XCFA -p ${<} -o ${@}
 
-ctorWarnings: ctorWarnings.c
-	${CC} ${CFALGS} -CFA -XCFA -p ${<} -o ${@}
+memberCtors-ERR1: memberCtors.c
+	${CC} ${CFALGS} -DERR1 ${<} -o ${@}
 
Index: src/tests/Makefile.in
===================================================================
--- src/tests/Makefile.in	(revision fba44f88c0909ebe9f84c63385f6fa1d508208a7)
+++ src/tests/Makefile.in	(revision 4d4882af105c01a957552263fa5e039f2f2620f3)
@@ -670,6 +670,6 @@
 	${CC} ${CFLAGS} -CFA -XCFA -p ${<} -o ${@}
 
-ctorWarnings: ctorWarnings.c
-	${CC} ${CFALGS} -CFA -XCFA -p ${<} -o ${@}
+memberCtors-ERR1: memberCtors.c
+	${CC} ${CFALGS} -DERR1 ${<} -o ${@}
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
Index: src/tests/ctorWarnings.c
===================================================================
--- src/tests/ctorWarnings.c	(revision fba44f88c0909ebe9f84c63385f6fa1d508208a7)
+++ 	(revision )
@@ -1,26 +1,0 @@
-struct A {
-  int x, y, z;
-};
-
-void ?{}(A * a, int x) {
-  (&a->x){ x+999 };
-  a->y = 0; // not technically a constructor, but okay
-} // z never constructed
-
-struct B {
-  A a1, a2, a3;
-};
-
-void ?{}(B * b) {
-  b->a2 = (A) { 2 }; // a2 used before constructed
-  (&b->a1){ 1 };
-} // a2, a3 never constructed
-
-void ^?{}(B * b) {
-  b->a2 = (A) { 0 };
-  ^(&b->a1){};
-} // a2, a3 never destructed
-
-int main() {
-  B b;
-}
Index: src/tests/memberCtors.c
===================================================================
--- src/tests/memberCtors.c	(revision 4d4882af105c01a957552263fa5e039f2f2620f3)
+++ src/tests/memberCtors.c	(revision 4d4882af105c01a957552263fa5e039f2f2620f3)
@@ -0,0 +1,63 @@
+struct WrappedInt {
+  int x;
+};
+
+void ?{}(WrappedInt * this) {
+  printf("constructing int\n");
+  this->x = 0;
+}
+
+void ?{}(WrappedInt * this, WrappedInt other) {
+  printf("copy constructing int: %d\n", other.x);
+  this->x = other.x;
+}
+
+void ?{}(WrappedInt * this, int x) {
+  printf("constructing int: %d\n", x);
+  this->x = x;
+}
+
+void ^?{}(WrappedInt * this) {
+  printf("destructing int: %d\n", this->x);
+}
+
+void ?=?(WrappedInt * this, int x) {
+  printf("assigning int: %d %d\n", this->x, x);
+  this->x = x;
+}
+
+struct A {
+  WrappedInt x, y, z;
+};
+
+void ?{}(A * a, int x) {
+  (&a->x){ x+999 };
+  a->y = 0; // not a constructor - default constructor will be inserted
+} // z never constructed - will be automatically default constructed
+
+void ?{}(A * this, A other) {
+  (&this->x){ other.x };
+  this->y = other.y; // not a constructor - copy constructor will be inserted
+} // z never constructed - will be automatically copy constructed
+
+struct B {
+  A a1, a2, a3;
+};
+
+void ?{}(B * b) {
+  b->a2 = (A) { 2 };
+  (&b->a1){ 1 };
+#ifdef ERR1
+  (&b->a2){ b->a3 }; // error, b->a2 was used previously but is explicitly constructed
+#endif
+} // a2, a3 never constructed - will be automatically default constructed
+
+void ^?{}(B * b) {
+  b->a2 = (A) { 0 };
+  ^(&b->a1){};
+} // a2, a3 never destructed - will be automatically destructed
+
+int main() {
+  B b1;
+  B b2 = b1;
+}
