The code generated by the compiler to handle the initialization of limited class-wide interface objects initialized by means of an aggregate erroneously generates a copy of the object (which causes a runtime exception in the application). After this patch the following test compiles and executes well. with Ada.Finalization; use Ada.Finalization; package Types is type Iface is limited interface; type User is new Limited_Controlled and Iface with record X : Integer := 0; end record; overriding procedure Finalize (Obj : in out User); end Types; with GNAT.IO; use GNAT.IO; package body Types is overriding procedure Finalize (Obj : in out User) is begin Put_Line ("Finalize"); end Finalize; end Types; with Ada.Finalization; use Ada.Finalization; with Types; use Types; with System.Address_Image; use System; procedure Demo is IW : Iface'Class := User'(Limited_Controlled with X => 42); Str : constant String := Address_Image (IW'Address); begin pragma Assert (Str /= ""); null; end Demo; Command: gnatmake -gnata demo.adb -gnat05 Output: Finalize Tested on x86_64-pc-linux-gnu, committed on trunk 2011-09-02 Javier Miranda * exp_ch3.adb (Expand_N_Object_Declaration): Do not copy the initializing expression of a class-wide interface object declaration if its type is limited.