longword within const array of const
Original Reporter info from Mantis: UK
-
Reporter name: UK
Original Reporter info from Mantis: UK
- Reporter name: UK
Description:
A longword within const array of const will be recognized as integer.
This leads to an exception if range check {R+} is anabled and the value is greater than high( integer ).
example:
{$R+}
var
U32: longword;
U32 := high( integer ) + 1;
format( '%u', [ U32 ]);
Steps to reproduce:
program test;
{$R+} // <= important
procedure Dump( const par: array of const );
var
i: integer;
begin
For i:=0 to high( par ) do begin
write( 'par[ ', i, ' ] has type ', par[i].vtype:2, ' => ');
case par[i].vtype of
vtInteger : writeln( 'vtInteger ', par[ i ].vInteger ); // 0
vtBoolean : writeln( 'vtBoolean ', par[ i ].vBoolean ); // 1
vtChar : writeln( 'vtChar ', par[ i ].vChar ); // 2
vtExtended : writeln( 'vtExtended ', par[ i ].vExtended^ ); // 3
vtString : writeln( 'vtString ', par[ i ].vString^ ); // 4
vtPointer : writeln( 'vtPointer ' {par[ i ].vPointer^} ); // 5
vtPChar : writeln( 'vtPChar ', par[ i ].vPChar^ ); // 6
vtObject : writeln( 'vtObject ' {par[ i ].vObject^} ); // 7
vtClass : writeln( 'vtClass ' {par[ i ].vClass^} ); // 8
vtWideChar : writeln( 'vtWideChar ', par[ i ].vWideChar ); // 9
vtPWideChar : writeln( 'vtPWideChar ', par[ i ].vPWideChar^ ); // 10
vtAnsiString : writeln( 'vtAnsiString ' {par[ i ].vAnsiString^} ); // 11
vtCurrency : writeln( 'vtCurrency ', par[ i ].vCurrency^ ); // 12
vtVariant : writeln( 'vtVariant ', par[ i ].vVariant^ ); // 13
vtInterface : writeln( 'vtInterface ' {par[ i ].vInterface^} ); // 14
vtWideString : writeln( 'vtWideString ' {par[ i ].vWideString^} ); // 15
vtInt64 : writeln( 'vtInt64 ', par[ i ].vInt64^ ); // 16
vtQWord : writeln( 'vtQWord ', par[ i ].vQWord^ ); // 17
vtUnicodeString : writeln( 'vtUnicodeString' {par[ i ].vUnicodeString^} ); // 18
else writeln( '(Unknown)' );
end;
end;
end;
var
U16: shortint;
S16: word;
S32: longint;
U32: longword;
S64: int64;
U64: qword;
begin
Dump([ U16, S16, S32, U32, S64, U64 ]);
U32 := high( S32 );
Dump([ U32 ]);
inc( U32 );
Dump([ U32 ]); // <= Excception
end.
Mantis conversion info:
- Mantis ID: 32135
- OS: Linux, Windows
- OS Build: independent
- Build: 33143
- Platform: i386
- Version: 3.1.1