Index: tests/raii/.expect/memberCtors-ERR1.txt
===================================================================
--- tests/raii/.expect/memberCtors-ERR1.txt	(revision b54ad9c66788ec2930ca0cac1989ef26b86a2708)
+++ tests/raii/.expect/memberCtors-ERR1.txt	(revision a42a6542b4369835501abbde87c5fd815d0f0d21)
@@ -1,1 +1,1 @@
-raii/memberCtors.c:71:1 error: in void ?{}(B &b), field a2 used before being constructed
+raii/memberCtors.c:92:1 error: in void ?{}(B &b), field a2 used before being constructed
Index: tests/raii/.expect/memberCtors.txt
===================================================================
--- tests/raii/.expect/memberCtors.txt	(revision b54ad9c66788ec2930ca0cac1989ef26b86a2708)
+++ tests/raii/.expect/memberCtors.txt	(revision a42a6542b4369835501abbde87c5fd815d0f0d21)
@@ -1,217 +1,219 @@
 Before declaration of b1
-constructing int
-constructing int
-constructing int
-constructing int
-constructing int
-constructing int
-begin construct B
+constructing int id: 0
+constructing int id: 1
+constructing int id: 2
+default construct A 0
+constructing int id: 3
+constructing int id: 4
+constructing int id: 5
+default construct A 1
+begin construct B id: 0
 assign b.a2
-constructing int
-constructing int
-begin construct A
-construct a.x
-constructing int: 1001
-assign a.y
-assigning int: 0 0
-end construct A
-copy constructing int: 0
-copy constructing int: 0
-begin copy construct A
-copy construct this.x
-copy constructing int: 1001
-assign this.y
-copy constructing int: 0
-destructing int: 0
-destructing int: 0
-end copy construct A
-begin ?=? A
-copy constructing int: 1001
-destructing int: 1001
-destructing int: 1001
-copy constructing int: 0
-destructing int: 0
-destructing int: 0
-copy constructing int: 0
-destructing int: 0
-destructing int: 0
+constructing int id: 6
+constructing int id: 7
+begin construct A id: 2
+construct a.x
+constructing int: 1001 id: 8
+assign a.y
+assigning int: 0 0 id: 6
+end construct A
+copy constructing int: 0 id: 9
+copy constructing int: 0 id: 10
+begin copy construct A id: 3
+copy construct this.x
+copy constructing int: 1001 id: 11
+assign this.y
+copy constructing int: 0 id: 12
+destructing int: 0 id: 12
+destructing int: 0 id: 12
+end copy construct A
+begin ?=? A id: 0
+copy constructing int: 1001 id: 13
+destructing int: 1001 id: 13
+destructing int: 1001 id: 13
+copy constructing int: 0 id: 14
+destructing int: 0 id: 14
+destructing int: 0 id: 14
+copy constructing int: 0 id: 15
+destructing int: 0 id: 15
+destructing int: 0 id: 15
 end ?=? A
-copy constructing int: 0
-copy constructing int: 0
-begin copy construct A
-copy construct this.x
-copy constructing int: 1001
-assign this.y
-copy constructing int: 0
-destructing int: 0
-destructing int: 0
-end copy construct A
-destructing int: 0
-destructing int: 0
-destructing int: 1001
-destructing int: 0
-destructing int: 0
-destructing int: 1001
+copy constructing int: 0 id: 16
+copy constructing int: 0 id: 17
+begin copy construct A id: 4
+copy construct this.x
+copy constructing int: 1001 id: 18
+assign this.y
+copy constructing int: 0 id: 19
+destructing int: 0 id: 19
+destructing int: 0 id: 19
+end copy construct A
+destructing int: 0 id: 17
+destructing int: 0 id: 19
+destructing int: 1001 id: 18
+destructing int: 0 id: 10
+destructing int: 0 id: 12
+destructing int: 1001 id: 11
 construct b.a1
-constructing int
-constructing int
-begin construct A
-construct a.x
-constructing int: 1000
-assign a.y
-assigning int: 0 0
+constructing int id: 20
+constructing int id: 21
+begin construct A id: 5
+construct a.x
+constructing int: 1000 id: 22
+assign a.y
+assigning int: 0 0 id: 20
 end construct A
 end construct B
-destructing int: 0
-destructing int: 0
-destructing int: 1001
+destructing int: 0 id: 7
+destructing int: 0 id: 6
+destructing int: 1001 id: 8
 Before declaration of b2
-copy constructing int: 0
-copy constructing int: 0
-begin copy construct A
-copy construct this.x
-copy constructing int: 1000
-assign this.y
-copy constructing int: 0
-destructing int: 0
-destructing int: 0
-end copy construct A
-copy constructing int: 0
-copy constructing int: 0
-begin copy construct A
-copy construct this.x
-copy constructing int: 1001
-assign this.y
-copy constructing int: 0
-destructing int: 0
-destructing int: 0
-end copy construct A
-copy constructing int: 0
-copy constructing int: 0
-begin copy construct A
-copy construct this.x
-copy constructing int: 0
-assign this.y
-copy constructing int: 0
-destructing int: 0
-destructing int: 0
+copy constructing int: 0 id: 23
+copy constructing int: 0 id: 24
+begin copy construct A id: 6
+copy construct this.x
+copy constructing int: 1000 id: 25
+assign this.y
+copy constructing int: 0 id: 26
+destructing int: 0 id: 26
+destructing int: 0 id: 26
+end copy construct A
+copy constructing int: 0 id: 27
+copy constructing int: 0 id: 28
+begin copy construct A id: 7
+copy construct this.x
+copy constructing int: 1001 id: 29
+assign this.y
+copy constructing int: 0 id: 30
+destructing int: 0 id: 30
+destructing int: 0 id: 30
+end copy construct A
+copy constructing int: 0 id: 31
+copy constructing int: 0 id: 32
+begin copy construct A id: 8
+copy construct this.x
+copy constructing int: 0 id: 33
+assign this.y
+copy constructing int: 0 id: 34
+destructing int: 0 id: 34
+destructing int: 0 id: 34
 end copy construct A
 End of main
-begin destruct B
-constructing int
-constructing int
-begin construct A
-construct a.x
-constructing int: 999
-assign a.y
-assigning int: 0 0
-end construct A
-copy constructing int: 0
-copy constructing int: 0
-begin copy construct A
-copy construct this.x
-copy constructing int: 999
-assign this.y
-copy constructing int: 0
-destructing int: 0
-destructing int: 0
-end copy construct A
-begin ?=? A
-copy constructing int: 999
-destructing int: 999
-destructing int: 999
-copy constructing int: 0
-destructing int: 0
-destructing int: 0
-copy constructing int: 0
-destructing int: 0
-destructing int: 0
+begin destruct B id: 1
+constructing int id: 35
+constructing int id: 36
+begin construct A id: 9
+construct a.x
+constructing int: 999 id: 37
+assign a.y
+assigning int: 0 0 id: 35
+end construct A
+copy constructing int: 0 id: 38
+copy constructing int: 0 id: 39
+begin copy construct A id: 10
+copy construct this.x
+copy constructing int: 999 id: 40
+assign this.y
+copy constructing int: 0 id: 41
+destructing int: 0 id: 41
+destructing int: 0 id: 41
+end copy construct A
+begin ?=? A id: 7
+copy constructing int: 999 id: 42
+destructing int: 999 id: 42
+destructing int: 999 id: 42
+copy constructing int: 0 id: 43
+destructing int: 0 id: 43
+destructing int: 0 id: 43
+copy constructing int: 0 id: 44
+destructing int: 0 id: 44
+destructing int: 0 id: 44
 end ?=? A
-copy constructing int: 0
-copy constructing int: 0
-begin copy construct A
-copy construct this.x
-copy constructing int: 999
-assign this.y
-copy constructing int: 0
-destructing int: 0
-destructing int: 0
-end copy construct A
-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: 1000
+copy constructing int: 0 id: 45
+copy constructing int: 0 id: 46
+begin copy construct A id: 11
+copy construct this.x
+copy constructing int: 999 id: 47
+assign this.y
+copy constructing int: 0 id: 48
+destructing int: 0 id: 48
+destructing int: 0 id: 48
+end copy construct A
+destructing int: 0 id: 46
+destructing int: 0 id: 48
+destructing int: 999 id: 47
+destructing int: 0 id: 39
+destructing int: 0 id: 41
+destructing int: 999 id: 40
+destructing int: 0 id: 24
+destructing int: 0 id: 26
+destructing int: 1000 id: 25
 end destruct B
-destructing int: 0
-destructing int: 0
-destructing int: 999
-destructing int: 0
-destructing int: 0
-destructing int: 0
-destructing int: 0
-destructing int: 0
-destructing int: 999
-begin destruct B
-constructing int
-constructing int
-begin construct A
-construct a.x
-constructing int: 999
-assign a.y
-assigning int: 0 0
-end construct A
-copy constructing int: 0
-copy constructing int: 0
-begin copy construct A
-copy construct this.x
-copy constructing int: 999
-assign this.y
-copy constructing int: 0
-destructing int: 0
-destructing int: 0
-end copy construct A
-begin ?=? A
-copy constructing int: 999
-destructing int: 999
-destructing int: 999
-copy constructing int: 0
-destructing int: 0
-destructing int: 0
-copy constructing int: 0
-destructing int: 0
-destructing int: 0
+destructing int: 0 id: 36
+destructing int: 0 id: 35
+destructing int: 999 id: 37
+destructing int: 0 id: 32
+destructing int: 0 id: 34
+destructing int: 0 id: 33
+destructing int: 0 id: 44
+destructing int: 0 id: 43
+destructing int: 999 id: 42
+begin destruct B id: 2
+constructing int id: 49
+constructing int id: 50
+begin construct A id: 12
+construct a.x
+constructing int: 999 id: 51
+assign a.y
+assigning int: 0 0 id: 49
+end construct A
+copy constructing int: 0 id: 52
+copy constructing int: 0 id: 53
+begin copy construct A id: 13
+copy construct this.x
+copy constructing int: 999 id: 54
+assign this.y
+copy constructing int: 0 id: 55
+destructing int: 0 id: 55
+destructing int: 0 id: 55
+end copy construct A
+begin ?=? A id: 0
+copy constructing int: 999 id: 56
+destructing int: 999 id: 56
+destructing int: 999 id: 56
+copy constructing int: 0 id: 57
+destructing int: 0 id: 57
+destructing int: 0 id: 57
+copy constructing int: 0 id: 58
+destructing int: 0 id: 58
+destructing int: 0 id: 58
 end ?=? A
-copy constructing int: 0
-copy constructing int: 0
-begin copy construct A
-copy construct this.x
-copy constructing int: 999
-assign this.y
-copy constructing int: 0
-destructing int: 0
-destructing int: 0
-end copy construct A
-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: 1000
+copy constructing int: 0 id: 59
+copy constructing int: 0 id: 60
+begin copy construct A id: 14
+copy construct this.x
+copy constructing int: 999 id: 61
+assign this.y
+copy constructing int: 0 id: 62
+destructing int: 0 id: 62
+destructing int: 0 id: 62
+end copy construct A
+destructing int: 0 id: 60
+destructing int: 0 id: 62
+destructing int: 999 id: 61
+destructing int: 0 id: 53
+destructing int: 0 id: 55
+destructing int: 999 id: 54
+destructing int: 0 id: 21
+destructing int: 0 id: 20
+destructing int: 1000 id: 22
 end destruct B
-destructing int: 0
-destructing int: 0
-destructing int: 999
-destructing int: 0
-destructing int: 0
-destructing int: 0
-destructing int: 0
-destructing int: 0
-destructing int: 999
+destructing int: 0 id: 50
+destructing int: 0 id: 49
+destructing int: 999 id: 51
+destructing int: 0 id: 5
+destructing int: 0 id: 4
+destructing int: 0 id: 3
+destructing int: 0 id: 58
+destructing int: 0 id: 57
+destructing int: 999 id: 56
Index: tests/raii/memberCtors.c
===================================================================
--- tests/raii/memberCtors.c	(revision b54ad9c66788ec2930ca0cac1989ef26b86a2708)
+++ tests/raii/memberCtors.c	(revision a42a6542b4369835501abbde87c5fd815d0f0d21)
@@ -1,27 +1,32 @@
 struct WrappedInt {
   int x;
+  int id;
 };
+int intID = 0;
 
 void ?{}(WrappedInt & this) {
-  printf("constructing int\n");
+  this.id = intID++;
+  printf("constructing int id: %d\n", this.id);
   this.x = 0;
 }
 
 void ?{}(WrappedInt & this, WrappedInt other) {
-  printf("copy constructing int: %d\n", other.x);
+  this.id = intID++;
+  printf("copy constructing int: %d id: %d\n", other.x, this.id);
   this.x = other.x;
 }
 
 void ?{}(WrappedInt & this, int x) {
-  printf("constructing int: %d\n", x);
+  this.id = intID++;
+  printf("constructing int: %d id: %d\n", x, this.id);
   this.x = x;
 }
 
 void ^?{}(WrappedInt & this) {
-  printf("destructing int: %d\n", this.x);
+  printf("destructing int: %d id: %d\n", this.x, this.id);
 }
 
 /* WrappedInt */ void ?=?(WrappedInt & this, int x) {
-  printf("assigning int: %d %d\n", this.x, x);
+  printf("assigning int: %d %d id: %d\n", this.x, x, this.id);
   this.x = x;
   // return this;
@@ -36,12 +41,17 @@
 struct A {
   WrappedInt x, y, z;
+  int id;
 };
+int AID = 0;
 
 void ?{}(A & a) {
   // currently must define default ctor, since there's no "= default" syntax
+  a.id = AID++;
+  printf("default construct A %d\n", a.id);
 }
 
 void ?{}(A & a, int x) {
-  printf("begin construct A\n");
+  a.id = AID++;
+  printf("begin construct A id: %d\n", a.id);
   printf("construct a.x\n");
   (a.x){ x+999 };
@@ -52,5 +62,6 @@
 
 void ?{}(A & this, A other) {
-  printf("begin copy construct A\n");
+  this.id = AID++;
+  printf("begin copy construct A id: %d\n", this.id);
   printf("copy construct this.x\n");
   (this.x){ other.x };
@@ -61,5 +72,5 @@
 
 A ?=?(A & this, A other) {
-  printf("begin ?=? A\n");
+  printf("begin ?=? A id: %d\n", this.id);
   this.x = other.x;
   this.y = other.y;
@@ -71,8 +82,11 @@
 struct B {
   A a1, a2, a3;
+  int id;
 };
+int BID = 0;
 
 void ?{}(B & b) {
-  printf("begin construct B\n");
+  b.id = BID++;
+  printf("begin construct B id: %d\n", b.id);
   printf("assign b.a2\n");
   b.a2 = (A) { 2 };
@@ -86,5 +100,6 @@
 
 void ^?{}(B & b) {
-  printf("begin destruct B\n");
+  b.id = BID++;
+  printf("begin destruct B id: %d\n", b.id);
   b.a2 = (A) { 0 };
   ^(b.a1){};
