-- { dg-do run } procedure Test_Self_Ref is type T2; type T2_Ref is access all T2; function F (X: T2_Ref) return Integer; type T2 is limited record Int1 : Integer := F (T2'Unchecked_Access); Int2 : Integer := F (T2'Unrestricted_Access); end record; Counter : Integer := 2; function F (X: T2_Ref) return Integer is begin Counter := Counter * 5; return Counter; end F; Obj1 : T2_Ref := new T2'(10,20); Obj2 : T2_Ref := new T2; Obj3 : T2_Ref := new T2'(others => <>); begin if Obj1.Int1 /= 10 or else Obj1.Int2 /= 20 then raise Program_Error; end if; if Obj2.Int1 /= 10 or else Obj2.Int2 /= 50 then raise Program_Error; end if; if Obj3.Int1 /= 250 or else Obj3.Int2 /= 1250 then raise Program_Error; end if; end Test_Self_Ref;