[fpc-devel] [Patch/RFC] Warnings for (in/over)complete case statements

Michael Van Canneyt michael at freepascal.org
Wed Jan 2 11:19:30 CET 2019



On Tue, 1 Jan 2019, Martok wrote:

> Hi all,
>
> The attached patch adds two messages inspired by C compiler's -Wswitch-enum and
> -Wcovered-switch-default. Building on the recent label count refactoring, this
> was fairly straightforward.
>
> - If a case statement on an ordinal does not contain labels for all values of
> the ordinal, and no else statement is given, raise a new warning (W6059). This
> is actually defined as an error in ISO7185 and a dynamic-violation in IEC10206.
>
> - If a case statement has labels for the entire range of the type, and an (now
> never used) else statement is present, a warning "Unreachable code" is raised.
>
> Both cases are clearly something where the compiler and programmer don't agree
> on something, hence drawing attention to these situations.
>
> The checks are enabled only for enumerated types and small (1-byte) integers. In
> C, they are only for enumerated types, I added small types because they are
> often used as tag types, where this check is extra useful.
>
> Now, the RFC part. I have a few open questions...
>
> * does it make sense to do that to all integral types? In ISO mode, it's
> formally required for all case statements. I left it out for now as sometimes
> case..of is used as a shorthand for multiple in..[range], there would be more
> detections that look like false positives.

It does not make sense. Consider the following:

Type
   TMyClass = class
   Private
     function GetString(AIndex: Integer): string;
   Published
     Property MyString : String Index 1 Read GetString;
   end;

function TMyClass.GetString(AIndex: Integer): string;

begin
   case AIndex of
    1 : Result:=GenerateSomestringvalue;
   end;
end;

I don't think there should be errors or warnings.

Michael.



More information about the fpc-devel mailing list