(* 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 'f' from File "test.ml", line 19, characters 8-9 *)
let rec f = let f = () in f

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

(* no-warning tests, thanks to david allsopp *)
let i ?(i = fun i -> i) x = x;;

let j x =
 match x with
   (y, 1) -> ()
 | (y, _) -> ()