From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.5-pre1 (2020-06-20) on ip-172-31-74-118.ec2.internal X-Spam-Level: X-Spam-Status: No, score=-1.9 required=3.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.5-pre1 Path: eternal-september.org!reader02.eternal-september.org!news.szaf.org!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Niklas Holsti Newsgroups: comp.lang.ada Subject: Re: Did I find a bug here? Date: Fri, 2 Apr 2021 11:33:11 +0300 Organization: Tidorum Ltd Message-ID: References: <6901cec3-b7b1-48c8-98fe-0360572175c2n@googlegroups.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Trace: individual.net l6PrQ/mN9M66iLmI1L58LQ65a00LUKmk504L3zlAPhPPU16DAv Cancel-Lock: sha1:I1lyZadM2Yp167KbUJGip7wl6Qs= User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:78.0) Gecko/20100101 Thunderbird/78.7.0 In-Reply-To: Content-Language: en-US Xref: reader02.eternal-september.org comp.lang.ada:61728 List-Id: On 2021-04-02 10:30, J-P. Rosen wrote: > Le 02/04/2021 à 08:30, reinert a écrit : >> Assume this simple program: >> >> procedure test0 is >>    type ABC_Type is (A,B,C); >>    subtype AB_Type is ABC_Type with Static_Predicate => AB_Type in A | B; >>    X : ABC_type    := A; >> begin >> -- alternative 1: >> case AB_Type(X) is >>      when A => null; >>      when B => null; >>      when others => null; -- ??? should the compiler complain here? >>    end case; >> --alternative 2: >>    case AB_Type(X) is >>      when A => null; >>      when B => null; >>    end case; >> end test0; >> >> Should the compiler complain about "when others => null" here? >> My compiler does not (running debian 10, updated, gnat-8). >> I find it strange that both alternatives goes through. >> > A case statement is allowed to have alternatives that cover no value. A > friendly compiler can warn you that "this branch covers no value", but > what you wrote is not illegal (and sometimes useful, if you have > variants of your software that use slightly different definitions of the > type). Recent discussion in ISO SC22 WG9, about the Ada part of the ISO "programming language vulnerabilities" document, brought out that if the selecting expression (here AB_Type(X)) in a case statement or case expression has an invalid representation (for example, is an uninitialized variable with an out-of-range value), an Ada compiler is required to raise Constraint_Error if there is no "others" alternative, but if there is an "others" alternative the compiler can instead let execution proceed to that alternative without raising Constraint_Error. In effect, "others" can cover all values, even those that are outside the nominal subtype of the selecting expression. See RM 5.4(12) and 5.4(13). So if the programmer is worried about such cases (invalid representations from uninitialized variables or other causes such as Unchecked_Conversion), they can add an apparently unnecessary "others" alternative even if the other alternatives already cover all valid values. However, note that the compiler may choose to raise Constraint_Error even if there is an "others" alternative; RM 5.4 (10.d). To avoid that uncertainty, the program can perform an explicit 'Valid check before the case statement.