Index: src/tests/.expect/ctorWarnings.txt
===================================================================
--- src/tests/.expect/ctorWarnings.txt	(revision 32a2a99c21001b02b5683ac97aa3b903e4d2a8e5)
+++ 	(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 32a2a99c21001b02b5683ac97aa3b903e4d2a8e5)
+++ 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 32a2a99c21001b02b5683ac97aa3b903e4d2a8e5)
+++ 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 32a2a99c21001b02b5683ac97aa3b903e4d2a8e5)
+++ 	(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;
+}
