[fpc-devel] Dangerous optimization in CASE..OF
Ondrej Pokorny
lazarus at kluug.net
Sun Jul 2 18:43:17 CEST 2017
On 02.07.2017 18:28, Jonas Maebe wrote:
> On 02/07/17 18:26, Ondrej Pokorny wrote:
>> Allow me a stupid question: how to convert an integer to enum with
>> range checking?
>
> The current possibilities and possibly improvements have been
> mentioned elsewhere in this thread already
> * http://lists.freepascal.org/pipermail/fpc-devel/2017-July/038013.html
> * http://lists.freepascal.org/pipermail/fpc-devel/2017-July/038014.html
Thanks, so there is no enumeration range checking from the compiler at
all :/ Everything has to be done manually :/
1.) if (I>=Ord(Low(TMyEnum))) and (I<=Ord(High(TMyEnum))) then
It's long and ugly and it is manual checking that the $RANGECHECKS
directive has no effect to. (Yes, I use it in my code.)
2.) function ValueInEnumRange(TypeInfo : PTypeInfo; AValue : Integer) :
boolean;
This still involves a manual checking.
Another problem: RTTI is not generated for enums with explicit indexes,
if I am not mistaken: TEnum = (two = 2, four = 4).
---
IMO FPC/Pascal lacks an assignment operator for enums with range
checking. Something like:
EnumValue := IntegerValue as TEnum;
Are there any disadvantages of the enum-AS operator that prevents its
introduction?
Ondrej
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20170702/527c950e/attachment.html>
More information about the fpc-devel
mailing list