struct A; void ?{}(A *); void ^?{}(A *); void f(int i) { A x; // construct x { A y; // construct y { A z; // construct z { if (i == 0) return; // destruct x, y, z } if (i == 1) return; // destruct x, y, z // destruct z } if (i == 2) return; // destruct x, y // destruct y } }