On 11.07.2019 11:58, J. Gareth Moreton wrote:

Done!

Thank you for your work!

BTW, your note in the issue report is very misleading: https://bugs.freepascal.org/view.php?id=33603#c117162.

> The idea behind "is" and "as" is that they are the sole exception to the rule and will return False and raise an error respectively if the enum is out of bounds.

IS/AS are not an exception of the rule - after a long discussion we settled down that if IS/AS is applied on a value of the same enumeration type:

var
  MyEnumValue: TEnumValue;
begin
  if MyEnumValue is TEnumValue then
// ...
end;

the compiler will expect that the result is always true. (It doesn't have to check for invalid values.)

When I read the following sentence:
> If the value falls within a hole, then it will pass - currently only in Delphi mode though. FPC mode won't allow it.

I think you mixed up "normal enums" and "enums with holes" and so the note in the issue report doesn't make any sense.

----

The conclusion is:
1.) IS/AS works reliably only on valid values on the left side of the operator. (Like any other function/intrinsic/operator in FPC.) 2.) If an invalid value is to be expected, IS/AS must be executed on an ordinal value (Integer, SmallInt, ...) before assigning it to the enumeration value. It cannot be executed on the resulting enumeration value to check its validity. 3.) IS/AS can be used also on "enumerations with holes". In this respect only the low/high bounds are checked, not the holes inside the valid range.
4.) IS/AS can be also used on ordinal types:
 - 4a.) (MyInt64Value is Integer) is a reasonable check if MyInt64Value is in Integer range.  - 4b.) (MyIntegerValue is Int64) is not reasonable (Integer falls always into Int64 range) and will always return True and can/will be optimized by the compiler to return a True constant.

Ondrej

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to