From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on ip-172-31-65-14.ec2.internal X-Spam-Level: X-Spam-Status: No, score=-1.9 required=3.0 tests=BAYES_00,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 Path: eternal-september.org!reader01.eternal-september.org!.POSTED!not-for-mail From: nytpu Newsgroups: comp.lang.ada Subject: Variable value if exception is raised Date: Sun, 20 Nov 2022 18:03:04 -0000 (UTC) Organization: A noiseless patient Spider Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Injection-Date: Sun, 20 Nov 2022 18:03:04 -0000 (UTC) Injection-Info: reader01.eternal-september.org; posting-host="1ab5ff3814d029bf4725b1936f1deaac"; logging-data="3737378"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+Bt194B227yuIG0xIfG/q9" User-Agent: Pan/0.150 (Moucherotte; d13562f /home/alex/aur/pan-git/pan) Cancel-Lock: sha1:qj6LD/NCmdpWQE5YMPP/3l05XCI= Xref: reader01.eternal-september.org comp.lang.ada:64635 List-Id: Hello everyone, If an exception is *explicitly* raised during a variable assignment, what happens to the variable contents? Are they in an undefined ("abnormal") state, or are the previous contents preserved? For example: ``` with Ada.Text_IO; procedure Test is function Always_Raises return Integer is begin raise Program_Error; return 1; end Always_Raises; I : Integer := 0; begin -- insert a nested handler, because the ARM § 11.4 ¶ 3 *does* -- say that the currently executing body is "abnormally -- completed" (including finalizing everything) before -- entering the exception handler begin I := Always_Raises; exception when others => null; end; Ada.Text_IO.Put_Line(Integer'Image(I)); end; ``` What, if anything, will be printed? (Disclaimer: I know the preexisting variable value will be preserved in GNAT specifically, but I'm asking if the standard guarantees that's the case) I read through the ARM 2012 § 11 and § 5.2, as well as skimming through everything related to “assignment” and “exceptions” in the ARM index; and didn't see much relating to this. All I saw is this: > When an exception occurrence is raised by the execution of a given > construct, the rest of the execution of that construct is abandoned — ARM 2012 § 11.4 ¶ 3 Which I guess implicitly protects variable values since assigning to a variable is performed after evaluating the right hand side, but still not necessarily a clear answer. I did see in § 13.9.1 that language-defined validity checks (e.g. bounds checks) failing or calling `abort` in a task during an assignment will cause the variable to enter an "abnormal" (i.e. invalid) state, but that doesn't cover user-raised exceptions. -- ~nytpu