On 02.07.2019 23:34, Jonas Maebe wrote:
On 02/07/2019 22:31, Ondrej Pokorny wrote:
This is similar to the object-is operator that gets evaluated as well
even if the type of the left-side value is the type at right side:

var
   Value: TPersistent;
begin
   Value := TPersistent(TObject.Create);
   IsValid := Value is TPersistent; // IsValid gains false
This is an invalid program. If you compile with -CR, the program will
abort with an error when the typecast is performed, because it will get
replaced by an "as" operation. In that sense, "integer as enum" would
indeed be somewhat similar, and -CR might even be extended to perform
the same replacement of explicit typecasts with "as" operators for these
types.

If you want to extend -CR to perform "integer as enum" on enum(integer), please do it consequently and perform "integer as ShortInt" also on ShortInt(integer) - do range checking on explicit typecasts for all simple types, not only enums. People will love you for this:

var
  S: ShortInt;
  I: Integer;
begin
  I := 130;
  S := ShortInt(I);
end;

shall now raise a range check error with -CR. You can even optimize the compiler to verify constants on compile-time:

var
  S: ShortInt;
begin
  S := ShortInt($FF);
end;

should not compile any more with -CR. Good idea.

BTW I was always convinced that an explicit typecast switches off range checking. And now I open the documentation https://www.freepascal.org/docs-html/prog/progsu65.html and I read this: (citation) /If, at run-time, an index or enumeration type is specified that is out of the declared range of the compiler, then a run-time error is generated, and the program exits with exit code 201. This can happen when doing a typecast (implicit or explicit) on an enumeration type or subrange type./

This means that this program is documented to exit with code 201:

program Project1;
uses Classes;
{$R+}
var
  B: Boolean;
begin
  B := Boolean(3);
  Writeln(B);
end.

Why doesn't it?

Ondrej

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

Reply via email to