startup classage expr23 { main(String[] args) { create X(); } } classage X { X() { ::t(); } void t() { // invoke the default constructor print("[1]"); create W(); // invoke the U() constructor print("[2]"); create U(); // invoke the U(int x) constructor print("[3]"); create U(3); // invoke the U(Sub2 x) constructor print("[4]"); create U(create Sub2()); // invoke the U(Sub2 x) constructor, with subtyping print("[5]"); create U(create Sub1()); // invoke the default constructor print("[6]"); create UV1(); // invoke the UV2() constructor print("[7]"); create UV2(); // invoke the UV2(int x) constructor print("[8]"); create UV2(3); // invoke the UV2(Sub2 x) constructor print("[9]"); create UV2(create Sub2()); // invoke the UV2(Sub2 x) constructor, with subtyping print("[10]"); create UV2(create Sub1()); // invoke the default constructor print("[11]"); create URename1(); // invoke the URename2() constructor print("[12]"); create URename2(); // invoke the URename2(int x) constructor print("[13]"); create URename2(3); // invoke the UVRename(Sub2 x) constructor print("[14]"); create URename2(create Sub2()); // invoke the URename2(Sub2 x) constructor, with subtyping print("[15]"); create URename2(create Sub1()); // return type check, these are fine with subtyping print("[16]"); U x = create U(); V y = create U(); UV1 z = create U(); } } classage UV1 = U + V with E >> F as K classage UV2 = U + V with E >> F as K { UV2() { :U(); :V(); } UV2(int x) { :U(x); :V(x); } UV2(Sub2 x) { this(); } } classage URename1 = U rename E >> F classage URename2 = U rename E >> F { URename2() { :U(); } URename2(int x) { :U(x); } URename2(Sub2 x) { this(); } } classage W {} classage U { U() { print("now the U() constructor"); } U(int x) { this(); print("now the U(int x) constructor"); print(x); } U(Sub2 x) { print("now the U(Sub2 x) constructor"); } mixer E { export void a() { return; } } } classage V { V() { print("now the V() constructor"); } V(int x) { this(); print("now the V(int x) constructor"); print(x); } V(Sub2 x) { print("now the V(Sub2 x) constructor"); } mixer F { export void b() { return; } } } classage Sub1 { connector E { export void a() { return; } } } classage Sub2 { connector E { export void a() { return; } import void c() } }