[fpc-devel] user error or bug? bitpacked array - neighbouring values overwrite each other

Martin fpc at mfriebe.de
Wed Oct 9 12:09:37 CEST 2019


To initialize an array, negative values can not be specified (see error 
below).

Type casting to positive works,  if you have the exact bit-size-matching 
unsigned type.
If the typecast is to big, it also gives a range check.

But with $R- values that are to big, are truncated.

Except in bitpacked arrays.
- no range check error (that may be due to the sub range type ??)
- values to big, overwrite the neighbouring element

I think the latter is a bug. *If* the compiler accepts the value, then 
it should protect neighbouring elements.

So is this a bug?
What should happen?

Doing
gcBitPackTinyNegArray[1] := cardinal(-1);
at runtime seems to work fine. (gives a compile time warning too / $R-)

program test;
{$R-}

type
   TTinyNegRange = -2..3;
   TBitPackTinyNegArray  = bitpacked array [0..3] of TTinyNegRange;
   TTestArray  = bitpacked array [0..3] of byte;

const
   // Warning: range check error while evaluating constants (4294967294 
must be between 0 and 255)
   // Works with $R-
//  gcBitPackTinyNegArray   : TTestArray = (2, cardinal(-2), 0, 
cardinal(-1));

   //Error: range check error while evaluating constants (-2 must be 
between 0 and 18446744073709551615)//
   //Also range check, even with $R-
//  gcBitPackTinyNegArray : TBitPackTinyNegArray = (2, -2, 0, -1);

   // No Error / WRONG Value, prints: 2, -2, -1, -1  // 0 is replaced by -1
   // same with $R-
   gcBitPackTinyNegArray : TBitPackTinyNegArray = (2, cardinal(-2), 0, 
cardinal(-1));

   // works
//  gcBitPackTinyNegArray : TBitPackTinyNegArray = (2, 6, 0, cardinal(-1));
//  gcBitPackTinyNegArray : TBitPackTinyNegArray = (2, 6, 0, 7);


begin
writeln(gcBitPackTinyNegArray[0]);
writeln(gcBitPackTinyNegArray[1]);
writeln(gcBitPackTinyNegArray[2]);
writeln(gcBitPackTinyNegArray[3]);

readln();
end.



More information about the fpc-devel mailing list