type t = A of t * t | B;;
type t2 = C of (t2 * t2) | D;;
type 'a t3 = S of 'a | T;;
fun B B B -> ();;
fun B (A (B, B)) B -> ();;
fun D (D, D) -> ();;
fun (C (D, D)) -> ();;
let A (b, B) = A (B, B);;
let f (A (B, B)) = ();;
let f B (A (B, B)) = ();;
let (D, d) = (D, D);;
let (C (D, d)) = (C (D, D));;
function S S T -> ();;
function Some (A (B, B)) -> ();;
function S (A (B, B)) -> ();;
function S (D, D) -> ();;
function (C (D, D)) -> ();;
function
| Some Some Some x -> x
(* | None None None x -> x *)
| _ -> assert false;;
fun None None None -> ();;
fun (Some None) None None -> ();;
let Some a = Some 42;;
let Some a :: y = [Some 42];;
let Some a, b = Some 42, 43;;
let (Some a), b = Some 42, 43;;
let Some a as b = let _ = b = 42 in Some 42;;
(* let Some (a as b) = let _ = b = None in Some 42;; *)
(* let Some (a as b) = let _ = b = 42 in Some 42;; *)
(* let (Some a) as b = let _ = b = 42 in Some 42;; *)
(* let (Some a) as b = let _ = b = None in Some 42;; *)
let Some a | Some a = Some 42;;
let x,y as r = 1,2 ;;
let ((x, y) as r) = (1, 2);;
type top = Top of (int * int);;
match Top (1,2) with Top min as t -> ();;
match Top (1,2) with Top (min,max) as t -> ();;
(* let Some 'a' .. 'b' = Some 'b';; *)
let rec f x y = ();;
fun x y -> ();;
fun (x, y) -> ();;
function x, y -> ();;
let rec next line pos0 = () in ();;
(* fun Some None None None -> ();; *)
(* fun x, y -> ();; |+ syntax error +| *)