On Mon, 29 Jul 2019, J. Gareth Moreton wrote:
Hi everyone,
So there's been an issue raised
<https://bugs.freepascal.org/view.php?id=35905> in regards to ISO compliance
with case blocks (when under $mode iso). Currently, a compiler error is
raised if a case block does not have exhaustive coverage for the input type
(it's a warning on other modes).
According to ISO7185 <http://pascal-central.com/docs/iso7185.pdf>, page 55,
section 6.8.3.5:
"On execution of the case-statement the case-index shall be evaluated. That
value shall then specify execution of the statement of the case-list-element
closest-containing thecase-constant denoting that value. One of the
case-constants shall be equal to the value of the case-index upon entry to
the case-statement; otherwise, it shall be an error."
Given it says "on execution", it implies this all occurs at run-time,
especially as 'case-index' is usually a variable or otherwise
non-deterministic at compile-time, hence the error should be a run-time
error, not a compile-time error. I think the issue is that FPC won't compile
some well-known ISO Pascal code
<https://bugs.freepascal.org/view.php?id=35859> because some of the case
blocks don't exhaustively cover all inputs (which itself might be a sign of
bad programming, but could be justified if said values are determined to be
logically impossible, in which case the else blocks should contain assertions
or internal errors).
Just interpreting the standard, I think that the error should be run-time,
not compile-time (although definitely keep the warning). That's just my take
on it though. If it is to be changed, it should be simple enough by
configuring the 'elselabel' field to point to an error-raising routine rather
than 'endlabel' (which occurs if there's no else block).
I tend to agree with your reading of the spec.
Michael.
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel