(* File "test.ml", line 3, characters 6-7: shadowing binding 'a' from File "test.ml", line 2, characters 9-10 *)
let test a =
  let a = b in
  a

(* File "test.ml", line 9, characters 4-5: shadowing binding 'b' from File "test.ml", line 7, characters 4-5 *)
let b = c
and b = d
let b = e

(* File "test.ml", line 12, characters 4-8: shadowing binding 'test' from File "test.ml", line 2, characters 4-8
   File "test.ml", line 16, characters 4-5: shadowing binding 'c' from File "test.ml", line 13, characters 9-10 *)
let test c =
  match d with
  | e -> c
  | c -> e

(* File "test.ml", line 19, characters 16-17: shadowing binding 'a' from File "test.ml", line 19, characters 8-9 *)
let rec a = let a = () in a

(* File "test.ml", line 23, characters 7-8: shadowing binding 'd' from File "test.ml", line 24, characters 4-5 *)
let rec a =
  (let d = c in ())
and d = ()