1-- PR ada/48844
2-- Reported by Georg Bauhaus <bauhaus@futureapps.de> */
3
4-- { dg-do compile }
5
6procedure Discr30 is
7
8   generic
9     type Source is private;
10     type Target is private;
11   function Conversion (S : Source) return Target;
12
13   function Conversion (S : Source) return Target is
14      type Source_Wrapper is tagged record
15         S : Source;
16      end record;
17      type Target_Wrapper is tagged record
18         T : Target;
19      end record;
20
21      type Selector is (Source_Field, Target_Field);
22      type Magic (Sel : Selector := Target_Field) is record
23         case Sel is
24            when Source_Field => S : Source_Wrapper;
25            when Target_Field => T : Target_Wrapper;
26         end case;
27      end record;
28
29      M : Magic;
30
31      function Convert (T : Target_Wrapper) return Target is
32      begin
33         M := (Sel => Source_Field, S => (S => S));
34         return T.T;
35      end Convert;
36
37   begin
38      return Convert (M.T);
39   end Conversion;
40
41   type Integer_Access is access all Integer;
42
43   I : aliased Integer;
44   I_Access : Integer_Access := I'Access;
45
46   function Convert is new Conversion (Integer_Access, Integer);
47
48begin
49   I := Convert (I_Access);
50end;
51