1#labels false;;
2type (_,_) eql = Refl : ('a, 'a) eql
3type s = x:int -> y:float -> unit
4type t = y:int -> x:float -> unit
5type silly = {silly: 'a.'a};;
6let eql : (s, t) eql = Refl;;
7[%%expect{|
8type (_, _) eql = Refl : ('a, 'a) eql
9type s = x:int -> y:float -> unit
10type t = y:int -> x:float -> unit
11type silly = { silly : 'a. 'a; }
12val eql : (s, t) eql = Refl
13|}]
14
15#labels true;;
16let f : [`L of (s, t) eql | `R of silly] -> 'a =
17  function `R {silly} -> silly
18;;
19[%%expect{|
20Line _, characters 2-30:
21Warning 8: this pattern-matching is not exhaustive.
22Here is an example of a case that is not matched:
23`L Refl
24val f : [ `L of (s, t) eql | `R of silly ] -> 'a = <fun>
25|}]
26
27(* Segfault: let () = print_endline (f (`L eql)) *)
28