[fpc-devel] [Patch/RFC] Warnings for (in/over)complete case statements
Ondrej Pokorny
lazarus at kluug.net
Sun May 12 19:39:24 CEST 2019
On 12.05.2019 18:56, Jonas Maebe wrote:
> As far as range checking and undefined behaviour is concerned, they
> do. I.e., you won't get undefined behaviour by assigning any value
> between low(enum)..high(enum) to them.
Very good, thank you. IMO this should be clearly documented to avoid
confusion.
And if they are valid they should not cause any runtime errors:
program Project1;
{$mode objfpc}
type
TMyEnum = (two=2, five=5);
var
E: TMyEnum;
begin
E := TMyEnum(3);
Writeln(E); // RunError (107)
end.
(From the above example one would say they are not valid.)
>> Furthermore I strongly disagree with your (2) statement. On the
>> contrary, if there are all explicitly defined cases covered and there
>> is an else statement (like in the TestRanges program above), a
>> warning about the unnecessary case statement is very needed because
>> it is an "implementation detail" of the compiler if the else block
>> will ever be executed or not (AFAIR you supported this).
>
> The TestRanges program is not about an implementation detail, but
> about undefined behaviour. Those are two completely different things.
There was a misunderstanding. I thought you meant with "implicit" values
the "implicit default values" (=0):
program Project1;
{$mode objfpc}
type
TMyEnum = (two=2, five=5);
TMyObject = class
E: TMyEnum;
end;
var
O: TMyObject;
begin
O := TMyObject.Create;
Writeln(Ord(O.E)); // R has an implicit default valuethat is invalid
ReadLn;
end.
But you meant the implicit valid values (the holes). Now it's clear.
Best
Ondrej
More information about the fpc-devel
mailing list