1package Discr54_Pkg is
2
3  type E_TYPE is (A_KIND, B_KIND, C_KIND, X_KIND);
4
5  type DR0 (V : E_TYPE) is tagged
6    record
7      I0 : INTEGER;
8      case V is
9        when A_KIND | B_KIND =>
10          I1 : INTEGER;
11          I2 : INTEGER;
12        when C_KIND | X_KIND =>
13          I3 : INTEGER;
14      end case;
15    end record;
16
17  type DN1 is new DR0 (V => A_KIND) with
18    record
19      I4 : INTEGER;
20      I5 : INTEGER;
21    end record;
22
23  type DR1 (W : E_TYPE) is new DR0 (V => A_KIND) with
24    record
25      I4 : INTEGER;
26      case W is
27        when A_KIND | B_KIND =>
28          I5 : INTEGER;
29        when C_KIND | X_KIND =>
30          I6 : INTEGER;
31      end case;
32    end record;
33
34  type DD1 (W : E_TYPE; V : E_TYPE) is new DR0 (V => V) with
35    record
36      I4 : INTEGER;
37      case W is
38        when A_KIND | B_KIND =>
39          I5 : INTEGER;
40        when C_KIND | X_KIND =>
41          I6 : INTEGER;
42      end case;
43    end record;
44
45  type DR2 is new DR1 (W => A_KIND) with
46    record
47      I7 : INTEGER;
48    end record;
49
50  V0 : constant DR0 := DR0'(I0 => 0,
51                            V  => A_KIND,
52                            I1 => 0,
53                            I2 => 0
54                           );
55
56  N1 : constant DN1 := DN1'(V  => A_KIND,
57                            I0 => 0,
58                            I1 => 0,
59                            I2 => 0,
60                            I4 => 0,
61                            I5 => 0);
62
63  N2 : constant DN1 := DN1'(V  => A_KIND,
64                            I0 => 0,
65                            I1 => 0,
66                            I2 => 0,
67                            I4 => 0,
68                            I5 => 0);
69
70  D1 : constant DD1 := DD1'(W  => A_KIND,
71                            V  => A_KIND,
72                            I0 => 0,
73                            I1 => 0,
74                            I2 => 0,
75                            I4 => 0,
76                            I5 => 0);
77
78  V1 : constant DR1 := DR1'(W  => A_KIND,
79                            I0 => 0,
80                            I1 => 0,
81                            I2 => 0,
82                            I4 => 0,
83                            I5 => 0);
84
85  V3 : constant DR2 := DR2'(V1 with I7 => 0);
86  V2 : constant DR2 := DR2'(
87                            --  V  => A_KIND,  --  needed???
88                            W  => A_KIND,
89                            I0 => 0,
90                            I1 => 1,
91                            I2 => 2,
92                            I4 => 4,
93                            I5 => 5,
94                            I7 => 7);
95
96  pragma Assert (
97      V2.I0 = 0
98    and then V2.I1 = 1
99    and then V2.I1 = 1
100    and then V2.I2 = 2
101    and then V2.I4 = 4
102    and then V2.I5 = 5
103    and then V2.I7 = 1);
104
105end Discr54_Pkg;
106