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
--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)