-- Newsgroups: comp.lang.ada -- From: "Peter C. Chapin" <[EMAIL PROTECTED]> -- Date: Thu, 13 Dec 2007 07:20:46 -0500 -- Subject: Q about finalization and interfaces. -- -- I'm trying to understand the interaction between controlled types, -- interfaces, and class-wide dispatching. Accordingly I wrote the -- following program, which I will present in sections. First the package -- specification:
with Ada.Finalization; package Check_Package is type B is interface; procedure Do_Stuff( Thing : in B ) is abstract; type D is new Ada.Finalization.Controlled and B with record X : Integer := 0; end record; overriding procedure Do_Stuff( Thing : in D ); overriding procedure Finalize( Thing : in out D ); end Check_Package; -- The idea is that I want to build a derivation class rooted on the B -- interface with some of the types in that class (such as D) being -- controlled. The corresponding body prints out a few messages to help -- track what is happening. Note that I use the X component as a kind of -- object ID number. with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; package body Check_Package is procedure Do_Stuff( Thing : in D ) is begin Put("Do_Stuff( Thing : in D ) => "); Put(Thing.X); New_Line; end Do_Stuff; procedure Finalize( Thing : in out D ) is begin Put("Finalize( Thing : in out D ) => "); Put(Thing.X); New_Line; end Finalize; end Check_Package; -- Now the test program that exercises the above code looks like this: with Check_Package; use Check_Package; procedure Check is Object : D; Some_Thing : B'Class := Object; begin Object.X := -1; Do_Stuff(Some_Thing); end Check; -- Using GNAT GPL 2007 I get the following output: -- -- Finalize( Thing : in out D ) => 0 -- Finalize( Thing : in out D ) => -1 -- -- My interpretation is that Object is copied (with the default ID value -- of zero) when Some_Thing is initialized; Object's ID is then modified. -- Both Object and its copy are finalized when the program ends. But... -- what happened to my call to Do_Stuff?? I expected that call to dispatch -- on Some_Thing and invoke the Do_Stuff for type D. What am I -- misunderstanding? -- -- Thanks in advance! -- -- Peter -- Summary: Legal program runs incorrectly, dynamic dispatching with interfaces, RM 3.9.2(5/2, 20/2), 3.9.4(1/2) Product: gcc Version: 4.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: ada AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: ludovic at ludovic-brenta dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34504