(* TEST expect; *) type (_, _) t = A : ('a, 'a) t | B : string -> ('a, 'b) t ;; module M (A : sig module type T end) (B : sig module type T end) = struct let f : ((module A.T), (module B.T)) t -> string = function | B s -> s end;; module A = struct module type T = sig end end;; module N = M(A)(A);; let x = N.f A;; [%%expect{| type (_, _) t = A : ('a, 'a) t | B : string -> ('a, 'b) t Lines 8-9, characters 52-13: 8 | ....................................................function 9 | | B s -> s Warning 8 [partial-match]: this pattern-matching is not exhaustive. Here is an example of a case that is not matched: A module M : functor (A : sig module type T end) (B : sig module type T end) -> sig val f : ((module A.T), (module B.T)) t -> string end module A : sig module type T = sig end end module N : sig val f : ((module A.T), (module A.T)) t -> string end Exception: Match_failure ("", 8, 52). |}];;