-- { dg-do run } with Text_IO; use Text_IO; with Ada.Finalization; use Ada.Finalization; procedure Nested_Controlled_Alloc is package Controlled_Alloc is type Fin is new Limited_Controlled with null record; procedure Finalize (X : in out Fin); F : Fin; type T is limited private; type Ref is access all T; private type T is new Limited_Controlled with null record; procedure Finalize (X : in out T); end Controlled_Alloc; package body Controlled_Alloc is procedure Finalize (X : in out T) is begin Put_Line ("Finalize (T)"); end Finalize; procedure Finalize (X : in out Fin) is R : Ref; begin begin R := new T; raise Constraint_Error; exception when Program_Error => null; -- OK end; end Finalize; end Controlled_Alloc; begin null; end Nested_Controlled_Alloc;