(* TEST expect; *) type t = A let x = A module M = struct type t = B let f: t -> t = fun B -> x end;; [%%expect{| type t = A val x : t = A Line 5, characters 27-28: 5 | let f: t -> t = fun B -> x ^ Error: The value "x" has type "t/2" but an expression was expected of type "t" Line 4, characters 2-12: Definition of type "t" Line 1, characters 0-10: Definition of type "t/2" |}] module M = struct type t = B end let y = M.B module N = struct module M = struct type t = C end let f : M.t -> M.t = fun M.C -> y end;; [%%expect{| module M : sig type t = B end val y : M.t = M.B Line 7, characters 34-35: 7 | let f : M.t -> M.t = fun M.C -> y ^ Error: The value "y" has type "M/2.t" but an expression was expected of type "M.t" Lines 4-6, characters 2-5: Definition of module "M" Line 1, characters 0-32: Definition of module "M/2" |}] type t = D let f: t -> t = fun D -> x;; [%%expect{| type t = D Line 2, characters 25-26: 2 | let f: t -> t = fun D -> x;; ^ Error: The value "x" has type "t/2" but an expression was expected of type "t" Line 1, characters 0-10: Definition of type "t" Line 1, characters 0-10: Definition of type "t/2" |}] type ttt type ttt = A of ttt | B of uuu and uuu = C of uuu | D of ttt;; [%%expect{| type ttt type ttt = A of ttt | B of uuu and uuu = C of uuu | D of ttt |}] type nonrec ttt = X of ttt let x: ttt = let rec y = A y in y;; [%%expect{| type nonrec ttt = X of ttt Line 2, characters 32-33: 2 | let x: ttt = let rec y = A y in y;; ^ Error: The value "y" has type "ttt/2" but an expression was expected of type "ttt" Line 1, characters 0-26: Definition of type "ttt" Line 2, characters 0-30: Definition of type "ttt/2" |}]