[fpc-devel] Dangerous optimization in CASE..OF
Martok
listbox at martoks-place.de
Sun Jul 16 22:15:39 CEST 2017
Am 16.07.2017 um 13:17 schrieb Jonas Maebe:
> Does that mean that you would consider the same transformation of a
> case-statement when using a subrange type as correct? And that putting a
> value outside the range of a subrange into such a variable as a
> programmer error? (as opposed to doing the same with a non-subrange enum
> type?)
Hold on, there already is a test for that particular question in the language
itself!
-> Can the type be used as an array index?
---------------------------
{$mode objfpc}
type
TExplEnum = (a=1, b=3, c=5, d=7);
TEnArr = array[TExplEnum] of Byte;
---------------------------
=> Error: enums with assignments cannot be used as array index
Makes sense, after all, what should happen with the gaps? And creating the array
for the entire base type with lots of filler data would potentially be too
memory-consuming.
However:
---------------------------
{$mode objfpc}
type
TExplEnum = (a=1, b=3, c=5, d=7);
TSubEnum = a..d;
TEnArr = array[TSubEnum] of Byte;
begin
WriteLn('SizeOf(TEnArr) = ', SizeOf(TEnArr));
WriteLn('Low(TEnArr) = ', Low(TEnArr), ', ', Ord(Low(TEnArr)));
WriteLn('High(TEnArr) = ', High(TEnArr), ', ', Ord(High(TEnArr)));
end.
---------------------------
SizeOf(TEnArr) = 7
Low(TEnArr) = a, 1
High(TEnArr) = d, 7
---------------------------
That difference was unexpected. At least for me.
In {$mode delphi} (and Delphi), we get the second result for both tests. So
there already is some distinction of enum semantics between modes.
Also:
---------------------------
k:= Pred(c);
---------------------------
Error: succ or pred on enums with assignments not possible
---------------------------
k:= Pred(TSubEnum(c));
---------------------------
Happily compiles.
So, from the compiler's perspective, we cannot rely on the values of enums with
assignments enough to use them as an index (or count them), but we can do so
with subranges - because the subrange in question is effectively 1..7 and
doesn't actually know (or care) about the enum-ness of its host type.
Huh. Fascinating.
More information about the fpc-devel
mailing list