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. _______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel