On Jan 19, 2010, at 1:28 PM, David Allsopp wrote:

Goswin von Brederlow wrote:

# 2147483648l;;
- : int32 = -2147483648l

Isn't that documented properly? I think in the docs I saw at least that
ocaml will silently overflow ints.

Arithmetic operations are allowed to overflow silently but at no point do
you end up with an illegal constant which is the bug here.

i.e. Int32.add 2147483647l 1l correctly evaluates to -2147483648l but
-2147483648l is a valid int32. The evaluation of a constant by the compiler
in your ML source is supposed to follow the same rules as Int32.of_string
(which would raise an exception if given "-2147483648l") hence 2147483648l
which is not a valid int32 should be a "syntax" error.

As a point of clarification, the top level and the to_string functions do have the same behavior; none of them raise an exception when given a literal representing max_int+1 or min_int. It doesn't matter whether this is done with ints, Int32s, or Int64s. (I am using OCaml 3.11.1 on a 32-bit machine.)

# 1073741824,-1073741824;;
- : int * int = (-1073741824, -1073741824)
# int_of_string "1073741824",int_of_string "-1073741824";;
- : int * int = (-1073741824, -1073741824)

# 2147483648l,-2147483648l;;
- : int32 * int32 = (-2147483648l, -2147483648l)
# Int32.of_string "2147483648",Int32.of_string "-2147483648";;
- : int32 * int32 = (-2147483648l, -2147483648l)

# 9223372036854775808L,-9223372036854775808L;;
- : int64 * int64 = (-9223372036854775808L, -9223372036854775808L)
# Int64.of_string "9223372036854775808",Int64.of_string "-9223372036854775808";;
- : int64 * int64 = (-9223372036854775808L, -9223372036854775808L)

-Elnatan