> This looks like a pretty clear compiler bug, especially since by the > time Finalize is called by the outermost Do_Something, it's using, for > the value of I, the parameter from a Do_Something call that is no > longer active. It shouldn't be hard to modify this slightly, using > (say) a string or record as a parameter to Do_Something, to create a > test where utter garbage is displayed; then it would be clearer that > this is a compiler bug. Good idea! Yes, the following change makes the program output a bit of garbage, as you guessed: procedure Strong_Fin_Test_Case is type Fin is new Ada.Finalization.Limited_Controlled with null record; procedure Do_Something (I: Natural) is A: String(1 .. 5); -- this is new type My_Fin is new Fin with null record; overriding procedure Finalize(Self: in out My_Fin) is begin Ada.Text_IO.Put_Line(" Do_Something Finalization " & A); end Finalize; Singleton: My_Fin; begin -- Do_Something Ada.Text_IO.Put_Line(" I = " & Natural'Image(I)); if I>0 then Do_Something(I-1); Do_Something(I-1); end if; A(1 .. 5) := ("ABCDE"); -- always the same end Do_Something; begin Ada.Text_IO.Put_Line("Start Do_Something (2)"); Do_Something(2); Ada.Text_IO.Put_Line("Stop Do_Something (2)"); end Strong_Fin_Test_Case; The putput: Start Do_Something (2) I = 2 I = 1 I = 0 Do_Something Finalization ABCDE I = 0 Do_Something Finalization ABCDE Do_Something Finalization ABCDE I = 1 I = 0 Do_Something Finalization ABCDE I = 0 Do_Something Finalization ABCDE Do_Something Finalization ABCDE Do_Something Finalization �l Stop Do_Something (2) The last line before "Stop Do_Something (2)" contains some strange characters instead of the constant "ABCDE" it should output. Furthermore, this output is not always the same. So long Stefan -- ------ Stefan Lucks -- Bauhaus-University Weimar -- Germany ------ Stefan dot Lucks at uni minus weimar dot de ------ I love the taste of Cryptanalysis in the morning! ------