1class virtual child1 parent =
2  object
3    method private parent = parent
4  end
5
6class virtual child2 =
7  object(_ : 'self)
8    constraint 'parent = < previous: 'self option; .. >
9    method private virtual parent: 'parent
10  end
11
12(* Worked in 4.03 *)
13let _ =
14  object(self)
15    method previous = None
16    method child =
17      object
18        inherit child1 self
19        inherit child2
20      end
21  end;;
22[%%expect{|
23class virtual child1 : 'a -> object method private parent : 'a end
24class virtual child2 :
25  object ('a)
26    method private virtual parent : < previous : 'a option; .. >
27  end
28- : < child : child2; previous : child2 option > = <obj>
29|}]
30
31(* Worked in 4.03 *)
32let _ =
33  object(self)
34    method previous = None
35    method child (_ : unit) =
36      object
37        inherit child1 self
38        inherit child2
39      end
40  end;;
41[%%expect{|
42- : < child : unit -> child2; previous : child2 option > = <obj>
43|}]
44
45(* Worked in 4.03 *)
46let _ =
47  object(self)
48    method previous = None
49    method child () =
50      object
51        inherit child1 self
52        inherit child2
53      end
54  end;;
55[%%expect{|
56- : < child : unit -> child2; previous : child2 option > = <obj>
57|}]
58
59(* Didn't work in 4.03 *)
60let _ =
61  object(self)
62    method previous = None
63    method child =
64      let o =
65      object
66        inherit child1 self
67        inherit child2
68      end
69      in o
70  end;;
71[%%expect{|
72Line _, characters 16-22:
73Error: The method parent has type < child : 'a; previous : 'b option >
74       but is expected to have type < previous : < .. > option; .. >
75       Self type cannot escape its class
76|}]
77