(* TEST expect; *) module Non_recursive_let_bad = struct type 'a t = | N of 'a | C of 'a t * 'a t let[@tail_mod_cons] rec map f l = match l with | N v -> N (f v) | C (a, b) -> let map' l = map f l in C (map' a, (map' [@tailcall]) b) end [%%expect {| Lines 6-11, characters 30-40: 6 | ..............................f l = 7 | match l with 8 | | N v -> N (f v) 9 | | C (a, b) -> 10 | let map' l = map f l in 11 | C (map' a, (map' [@tailcall]) b) Warning 71 [unused-tmc-attribute]: This function is marked @tail_mod_cons but is never applied in TMC position. Line 11, characters 19-39: 11 | C (map' a, (map' [@tailcall]) b) ^^^^^^^^^^^^^^^^^^^^ Warning 51 [wrong-tailcall-expectation]: expected tailcall Line 11, characters 19-39: 11 | C (map' a, (map' [@tailcall]) b) ^^^^^^^^^^^^^^^^^^^^ Warning 51 [wrong-tailcall-expectation]: expected tailcall module Non_recursive_let_bad : sig type 'a t = N of 'a | C of 'a t * 'a t val map : ('a -> 'b) -> 'a t -> 'b t end |}] module Non_recursive_let_good = struct type 'a t = | N of 'a | C of 'a t * 'a t let[@tail_mod_cons] rec map f l = match l with | N v -> N (f v) | C (a, b) -> let[@tail_mod_cons] map' l = map f l in C (map' a, (map' [@tailcall]) b) end [%%expect {| module Non_recursive_let_good : sig type 'a t = N of 'a | C of 'a t * 'a t val map : ('a -> 'b) -> 'a t -> 'b t end |}]