[fpc-devel] [Suggestion] Enumeration range-check intrinsic
Ondrej Pokorny
lazarus at kluug.net
Sat Jul 13 20:37:34 CEST 2019
On 13.07.2019 14:32, Michael Van Canneyt wrote:
> I yesterday checked a database project I have. I counted 25 enumerateds
> which are stored in the database. Without fail, for each type there is
> somewhere code in a type helper:
>
> if (MyDatabaseValue>=0) and (MyDatabaseValue<=Ord(High(TMyENum))) then
> MyENumValue:=TEnum(MyDatabaseValue))
> else
> EConvertError.Create('Invalid value for TMyEnum : %d',[MyDatabaseValue])
I do exactly the same - check the low/high bounds in a type helper :)
Yes, and I am tired of typing it as well :)
> That the case where you would write
>
> if MyEnumValue is TMyEnumValue then
>
> can 'by default' be optimized away because as far as the compiler is
> concerned this is a tautology, is for me a perfectly acceptable and
> defendable point of view.
I agree.
> Even to such a degree that the compiler would
> simply reject your code by not allowing is/at on a variable of the type
> itself. Also defendable.
No - not this one. Don't forget about e.g. generics:
function Test<T>(MyValue: T): Boolean;
begin
Result := MyValue is TMyEnum;
end;
would compile for all enumeration types but not for MyValue:TMyEnum.
That doesn't make sense.
Better to have a compiler hint/warning when such a construct is found
and optimized. This perfectly corresponds with the fact that also
constructs like "SmallIntValue is Integer" can be optimized away but
must be allowed.
Ondrej
More information about the fpc-devel
mailing list