1--  { dg-do compile }
2
3with Ada.Finalization; use Ada.Finalization;
4
5procedure Controlled8
6  (Int_Input : Integer;
7   Str_Input : String)
8is
9   type Ctrl is new Controlled with null record;
10   type Integer_Ptr is access all Integer;
11   type String_Ptr  is access all String;
12
13   function Func (Val : Integer) return Ctrl is
14   begin return Result : Ctrl; end Func;
15
16   function Func (Val : String) return Ctrl is
17   begin return Result : Ctrl; end Func;
18
19   type Rec_1 (Val : Integer) is record
20      Comp : Ctrl := Func (Val);
21   end record;
22
23   type Rec_2 (Val : access Integer) is record
24      Comp : Ctrl := Func (Val.all);
25   end record;
26
27   type Rec_3 (Val : Integer_Ptr) is record
28      Comp : Ctrl := Func (Val.all);
29   end record;
30
31   type Rec_4 (Val : access String) is record
32      Comp : Ctrl := Func (Val.all);
33   end record;
34
35   type Rec_5 (Val : String_Ptr) is record
36      Comp : Ctrl := Func (Val.all);
37   end record;
38
39   Int_Heap  : constant Integer_Ptr := new Integer'(Int_Input);
40   Int_Stack : aliased  Integer     := Int_Input;
41   Str_Heap  : constant String_Ptr  := new String'(Str_Input);
42   Str_Stack : aliased  String      := Str_Input;
43
44   Obj_1  : constant Rec_1 := (Val => Int_Input, others => <>);
45
46   Obj_2  : constant Rec_2 := (Val => Int_Heap, others => <>);
47   Obj_3  : constant Rec_2 := (Val => Int_Stack'Access, others => <>);
48   Obj_4  : constant Rec_2 := (Val => new Integer'(Int_Input), others => <>);
49
50   Obj_5  : constant Rec_3 := (Val => Int_Heap, others => <>);
51   Obj_6  : constant Rec_3 := (Val => Int_Stack'Access, others => <>);
52   Obj_7  : constant Rec_3 := (Val => new Integer'(Int_Input), others => <>);
53
54   Obj_8  : constant Rec_4 := (Val => Str_Heap, others => <>);
55   Obj_9  : constant Rec_4 := (Val => Str_Stack'Access, others => <>);
56   Obj_10 : constant Rec_4 := (Val => new String'(Str_Input), others => <>);
57
58   Obj_11 : constant Rec_5 := (Val => Str_Heap, others => <>);
59   Obj_12 : constant Rec_5 := (Val => Str_Stack'Access, others => <>);
60   Obj_13 : constant Rec_5 := (Val => new String'(Str_Input), others => <>);
61begin
62   null;
63end Controlled8;
64