[fpc-devel] "Case statement does not handle all possible cases" Warning

J. Gareth Moreton gareth at moreton-family.com
Sun May 19 05:16:47 CEST 2019

Yes, I'm jumpy, especially as you always like to open your responses 
with a direct insult of some kind - yes, I checked.  You want to kill me 
or ban me from the mailing list, go right ahead. I'm sure Free Pascal 
will survive without me.

We will agree to disagree on that one.  I see a warning as an actual 
warning that the code is very likely to cause unpredictable results or 
is an obvious oversight, like an uninitialised variable or a conditional 
block that is impossible to branch into (in this case, an 'unreachable 
else' for the case block would be a warning).  A hint is an optimisation 
tip that might also indicate laziness, like a variable declaration 
that's never used because you removed some old code or neglected to use 
it, while a note is a bit more serious than a hint but not as severe as 
a warning.

I'm not the only one who wasn't aware of the ISO standard - evidently 
Borland never followed through with it and most other Pascal 
programmers.  Until recently, even the compiler was full of omitted 
blank else blocks.  I would have thought that the lack of an else 
section on a case block is fairly indictive of one not being necessary, 
and any special values that need to be handled should contain their own 

Now don't get me wrong, I do agree that a notification is useful - as 
Jonas said, at least 1/3 of the messages pointed to case blocks that 
benefitted from having internal errors added, since an explicit branch 
should always be taken - an example of a manual one that Pierre and I 
implemented is the one that appears in TEntryFile.GetAInt, because 
SizeOf(AInt) should always return 1, 2, 4 or 8.  But a lot of the time, 
one may only want to check a select number of values for special 
operations, but which are numerous to the point that individal if 
statements are inefficient - for example, 
TCpuAsmOptimizer.PeepHoleOptPass1Cpu under x86_64 - having an empty else 
block, while certainly safer, comes off as superfluous since, in that 
case, it doesn't give any extra information.  Granted, if the standard 
of an obligatory 'else' was adhered to from the very beginning, we 
wouldn't be in this situation, but like the problem of 'inline' 
appearing only in the implementation section of subroutines, there is so 
much code out there now that it will be an endless battle to change it 
all to adhere to the standard and not break something.

I just feel that in this case, it should be a note, not a warning, 
unless you're compiling under a dialect of Pascal (e.g. Extended) that 
is stricter in its interpretation of the whitesheet and demands an error 
be returned.

Gareth aka. Kit

P.S. And while I agree that one should not merely look towards C and C++ 
for inspiration (I see the practice of lowercasing everything and not 
having a space between operators and operands as 'colonisation', for 
lack of a better term), it seems that we are a little inconsistent when 
it comes to that, given that Free Pascal supports the C-style assignment 
operators now.

On 19/05/2019 02:42, Ralf Quint wrote:
> On 5/18/2019 3:42 PM, J. Gareth Moreton wrote:
>> Lazy... you've got a bloody cheek.  Well I guess there's no point in 
>> me contributing anything more if that's how you honestly view me.  I 
>> wasn't aware of the ISO that dictated that a case block shouldn't 
>> just fall through until today, and C/C++ and Basic never threw 
>> similar errors or warnings, so I didn't know this was a thing.
> Wow, a bit jumpy, aren't we?
> As we are talking here about a Pascal compiler, it doesn't matter what 
> C/C++ or BASIC do. And even in other programming languages, properly 
> acting upon unexpected conditions is good programming practice. And 
> commonly people programming in Pascal are ones that try to adhere to 
> good programming practices, not just ignore them out of whatever 
> convenience they might perceive.
> A warning from the compiler is hence an appropriate response, telling 
> the programmer to check the source and make a decision, even if it is 
> adding an empty else clause to the offending case statement. 
> Everything else is just "lazy programming", like it or not...
> Ralf
> ---
> This email has been checked for viruses by Avast antivirus software.
> https://www.avast.com/antivirus
> _______________________________________________
> fpc-devel maillist  -  fpc-devel at lists.freepascal.org
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

More information about the fpc-devel mailing list