By default, the compiler doesn’t generate code to check the ranges of array indices, enumeration types, subrange types, etc. Specifying the {$R+} switch tells the computer to generate code to check these indices. If, at run-time, an index or enumeration type is specified that is out of the declared range of the compiler, then a run-time error is generated, and the program exits with exit code 201. This can happen when doing a typecast (implicit or explicit) on an enumeration type or subrange type.
The {$RANGECHECKS OFF} switch tells the compiler not to generate range checking code. This may result in faulty program behavior, but no run-time errors will be generated.
Remark
The standard functions val and Read will also check ranges when the call is compiled in {$R+}
mode.
In Delphi, range checking is only switchable at the procedure level. In Free Pascal, the {$R } directive can be used at the expression level.
Remark
See the note on expression evaluation on 64-bit systems and the consequences for range checking
and overflow checking.
Remark
The -CR and -Cr command-line options will activate the range checks globally. They can be
switched off locally with the OFF state of the directive.