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