(* TEST flags = "-nopervasives"; (* can't pass -nostdlib because of objects. *) expect; *) (* Signatures *) (* Tests that everything can be shadowed. *) module type S = sig type t val unit : unit external e : unit -> unit = "%identity" module M : sig type t end module type T exception E type ext = .. type ext += C class c : object end class type ct = object end end ;; [%%expect{| module type S = sig type t val unit : unit external e : unit -> unit = "%identity" module M : sig type t end module type T exception E type ext = .. type ext += C class c : object end class type ct = object end end |}] module type SS = sig include S include S end ;; [%%expect{| module type SS = sig type t val unit : unit external e : unit -> unit = "%identity" module M : sig type t end module type T exception E type ext = .. type ext += C class c : object end class type ct = object end end |}] (* Test that the call to nondep works properly. *) module type Type = sig include S type u = t include S end ;; [%%expect{| module type Type = sig type u type t val unit : unit external e : unit -> unit = "%identity" module M : sig type t end module type T exception E type ext = .. type ext += C class c : object end class type ct = object end end |}] module type Type_fail = sig include S val ignore : t -> unit include S end ;; [%%expect{| Line 4, characters 2-11: 4 | include S ^^^^^^^^^ Error: Illegal shadowing of included type "t/2" by "t". Line 2, characters 2-11: 2 | include S ^^^^^^^^^ Type "t/2" came from this include. Line 3, characters 2-24: 3 | val ignore : t -> unit ^^^^^^^^^^^^^^^^^^^^^^ The value "ignore" has no valid type if "t/2" is shadowed. |}] module type Module = sig include S module N = M include S end ;; [%%expect{| module type Module = sig module N : sig type t end type t val unit : unit external e : unit -> unit = "%identity" module M : sig type t end module type T exception E type ext = .. type ext += C class c : object end class type ct = object end end |}] module type Module_fail = sig include S val ignore : M.t -> unit include S end ;; [%%expect{| Line 4, characters 2-11: 4 | include S ^^^^^^^^^ Error: Illegal shadowing of included module "M/2" by "M". Line 2, characters 2-11: 2 | include S ^^^^^^^^^ Module "M/2" came from this include. Line 3, characters 2-26: 3 | val ignore : M.t -> unit ^^^^^^^^^^^^^^^^^^^^^^^^ The value "ignore" has no valid type if "M/2" is shadowed. |}] module type Module_type_fail = sig include S module type U = T include S end ;; [%%expect{| Line 4, characters 2-11: 4 | include S ^^^^^^^^^ Error: Illegal shadowing of included module type "T/2" by "T". Line 2, characters 2-11: 2 | include S ^^^^^^^^^ Module type "T/2" came from this include. Line 3, characters 2-19: 3 | module type U = T ^^^^^^^^^^^^^^^^^ The module type "U" has no valid type if "T/2" is shadowed. |}] module type Module_type_fail = sig include S module F : functor (_ : T) -> sig end include S end ;; [%%expect{| Line 4, characters 2-11: 4 | include S ^^^^^^^^^ Error: Illegal shadowing of included module type "T/2" by "T". Line 2, characters 2-11: 2 | include S ^^^^^^^^^ Module type "T/2" came from this include. Line 3, characters 2-39: 3 | module F : functor (_ : T) -> sig end ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The module "F" has no valid type if "T/2" is shadowed. |}] module type Extension = sig include S type ext += C2 include S end ;; [%%expect{| Line 4, characters 2-11: 4 | include S ^^^^^^^^^ Error: Illegal shadowing of included type "ext/2" by "ext". Line 2, characters 2-11: 2 | include S ^^^^^^^^^ Type "ext/2" came from this include. Line 3, characters 14-16: 3 | type ext += C2 ^^ The extension constructor "C2" has no valid type if "ext/2" is shadowed. |}] module type Class = sig include S class parametrized : int -> c include S end ;; [%%expect{| module type Class = sig class parametrized : int -> object end type t val unit : unit external e : unit -> unit = "%identity" module M : sig type t end module type T exception E type ext = .. type ext += C class c : object end class type ct = object end end |}] module type Class_type = sig include S class type parametrized = ct include S end ;; [%%expect{| module type Class_type = sig class type parametrized = object end type t val unit : unit external e : unit -> unit = "%identity" module M : sig type t end module type T exception E type ext = .. type ext += C class c : object end class type ct = object end end |}] (* Structures *) (* Tests that everything can be shadowed. *) module N = struct type t let unit = () external e : unit -> unit = "%identity" module M = struct end module type T = sig end exception E type ext = .. type ext += C class c = object end class type ct = object end end ;; [%%expect{| module N : sig type t val unit : unit external e : unit -> unit = "%identity" module M : sig end module type T = sig end exception E type ext = .. type ext += C class c : object end class type ct = object end end |}] module NN = struct include N include N end ;; [%%expect{| module NN : sig type t = N.t val unit : unit external e : unit -> unit = "%identity" module M = N.M module type T = N.T exception E type ext = N.ext = .. type ext += C class c : object end class type ct = object end end |}] (* Test that the call to nondep works properly *) module Type = struct include N type u = t include N end ;; [%%expect{| module Type : sig type u = N.t type t = N.t val unit : unit external e : unit -> unit = "%identity" module M = N.M module type T = N.T exception E type ext = N.ext = .. type ext += C class c : object end class type ct = object end end |}] module Module = struct include N module O = M include N end ;; [%%expect{| module Module : sig module O = N.M type t = N.t val unit : unit external e : unit -> unit = "%identity" module M = N.M module type T = N.T exception E type ext = N.ext = .. type ext += C class c : object end class type ct = object end end |}] module Module_type = struct include N module type U = T include N end ;; [%%expect{| module Module_type : sig module type U = N.T type t = N.t val unit : unit external e : unit -> unit = "%identity" module M = N.M module type T = N.T exception E type ext = N.ext = .. type ext += C class c : object end class type ct = object end end |}] module Exception = struct include N exception Exn = E include N end ;; [%%expect{| module Exception : sig exception Exn type t = N.t val unit : unit external e : unit -> unit = "%identity" module M = N.M module type T = N.T exception E type ext = N.ext = .. type ext += C class c : object end class type ct = object end end |}] module Extension = struct include N type ext += C2 include N end ;; [%%expect{| module Extension : sig type N.ext += C2 type t = N.t val unit : unit external e : unit -> unit = "%identity" module M = N.M module type T = N.T exception E type ext = N.ext = .. type ext += C class c : object end class type ct = object end end |}] module Class = struct include N class parametrized _ = c include N end ;; [%%expect{| module Class : sig class parametrized : 'a -> object end type t = N.t val unit : unit external e : unit -> unit = "%identity" module M = N.M module type T = N.T exception E type ext = N.ext = .. type ext += C class c : object end class type ct = object end end |}] module Class_type = struct include N class type parametrized = ct include N end ;; [%%expect{| module Class_type : sig class type parametrized = object end type t = N.t val unit : unit external e : unit -> unit = "%identity" module M = N.M module type T = N.T exception E type ext = N.ext = .. type ext += C class c : object end class type ct = object end end |}] (** Test rare interaction between shadowing and generalized open in error messages *) module M = struct include struct type t = A let x = A end open struct type t end open struct type t end type t end [%%expect {| Line 8, characters 2-8: 8 | type t ^^^^^^ Error: Illegal shadowing of included type "t/4" by "t". Lines 2-5, characters 2-5: 2 | ..include struct 3 | type t = A 4 | let x = A 5 | end Type "t/4" came from this include. Line 4, characters 8-9: 4 | let x = A ^ The value "x" has no valid type if "t/4" is shadowed. |}]