It is so called trailing semicolon as in fact, OCaml accepts a sequence of expressions that may end with an optional semicolon,
<expr1>; <expr2>; ... <exprN> [;]
This is to accommodate an imperative style of programming, e.g.,
let () =
It would be quite surprising (to a typical programmer) if the last semicolon would raise a syntactic error.
So OCaml allows for a semicolon to follow an expression, e.g.,
let x = 1; in x
let x = 1;2 in x
let x = 1;2; in x
are all valid OCaml expressions.
With that said, I think it would be really helpful if OCaml will at least issue warning 10, for trailing semicolons.