|
| 1 | +procedure Nondet_Function is |
| 2 | + type My_Int is range -500 .. 500; |
| 3 | + |
| 4 | + subtype My_Sub_Int is My_Int range 0 .. 100; |
| 5 | + |
| 6 | + type My_Enum is (one, two, three, four, five, six); |
| 7 | + |
| 8 | + subtype My_Sub_Enum is My_Enum range two .. four; |
| 9 | + |
| 10 | + subtype Index is Integer range 1 .. 10; |
| 11 | + |
| 12 | + type Fixed_Array is array (Index) of My_Sub_Int; |
| 13 | + |
| 14 | + type Rec is record |
| 15 | + A : My_Sub_Int; |
| 16 | + B : My_Enum; |
| 17 | + I : Index; |
| 18 | + D : Fixed_Array; |
| 19 | + end record; |
| 20 | + |
| 21 | + function Nondet_My_Int return My_Int |
| 22 | + with Annotate => (ASVAT, Nondet_Function), |
| 23 | + Import; |
| 24 | + |
| 25 | + function Nondet_My_Sub_Int return My_Sub_Int |
| 26 | + with Annotate => (ASVAT, Nondet_Function), |
| 27 | + Import; |
| 28 | + |
| 29 | + function Nondet_My_Enum return My_Enum |
| 30 | + with Annotate => (ASVAT, Nondet_Function), |
| 31 | + Import; |
| 32 | + |
| 33 | + function Nondet_My_Sub_Enum return My_Sub_Enum |
| 34 | + with Annotate => (ASVAT, Nondet_Function), |
| 35 | + Import; |
| 36 | + |
| 37 | + function Nondet_Integer return Integer |
| 38 | + with Annotate => (ASVAT, Nondet_Function), |
| 39 | + Import; |
| 40 | + |
| 41 | + function Nondet_Index return Index |
| 42 | + with Annotate => (ASVAT, Nondet_Function), |
| 43 | + Import; |
| 44 | + |
| 45 | + function In_Type (V : My_Int) return Boolean |
| 46 | + with Annotate => (ASVAT, In_Type_Function), |
| 47 | + Import; |
| 48 | + |
| 49 | + function In_Type_Sub (V : My_Sub_Int) return Boolean |
| 50 | + with Annotate => (ASVAT, In_Type_Function), |
| 51 | + Import; |
| 52 | + |
| 53 | + function In_Type (V : My_Enum) return Boolean |
| 54 | + with Annotate => (ASVAT, In_Type_Function), |
| 55 | + Import; |
| 56 | + |
| 57 | + function In_Type_Sub (V : My_Sub_Enum) return Boolean |
| 58 | + with Annotate => (ASVAT, In_Type_Function), |
| 59 | + Import; |
| 60 | + |
| 61 | + function In_Type (I : Index) return Boolean |
| 62 | + with Annotate => (ASVAT, In_Type_Function), |
| 63 | + Import; |
| 64 | + |
| 65 | + Var_My_Int : My_Int := 3; |
| 66 | + Var_My_Sub_Int : My_Sub_Int := 5; |
| 67 | + |
| 68 | + Var_My_Enum : My_Enum := one; |
| 69 | + Var_My_Sub_Enum : My_Sub_Enum := three; |
| 70 | + |
| 71 | + Var_Fixed_Array : Fixed_Array := (others => 7); |
| 72 | + Var_Rec : Rec := (11, |
| 73 | + five, |
| 74 | + 1, |
| 75 | + (others => 13)); |
| 76 | + begin |
| 77 | + pragma Assert (Var_My_Int = 3); |
| 78 | + pragma Assert (Var_My_Sub_Int = 5); |
| 79 | + |
| 80 | + pragma Assert (Var_My_Enum = one); |
| 81 | + pragma Assert (Var_My_Sub_Enum = three); |
| 82 | + |
| 83 | + for I in Index loop |
| 84 | + pragma Assert (Var_Fixed_Array (I) = 7); |
| 85 | + end loop; |
| 86 | + |
| 87 | + pragma Assert (Var_Rec.A = 11); |
| 88 | + pragma Assert (Var_Rec.B = five); |
| 89 | + pragma Assert (Var_Rec.I = 1); |
| 90 | + for I in Index loop |
| 91 | + pragma Assert (Var_Rec.D (I) = 13); |
| 92 | + end loop; |
| 93 | + |
| 94 | + pragma Assert (Var_My_Int >= My_Int'First and Var_My_Int <= My_Int'Last); |
| 95 | + pragma Assert (Var_My_Sub_Int in My_Sub_Int); |
| 96 | + |
| 97 | + pragma Assert (Var_My_Enum in My_Enum); |
| 98 | + pragma Assert (Var_My_Sub_Enum in My_Sub_Enum); |
| 99 | + |
| 100 | + for I in Index loop |
| 101 | + pragma Assert (Var_Fixed_Array (I) in My_Sub_Int); |
| 102 | + end loop; |
| 103 | + |
| 104 | + pragma Assert (Var_Rec.A in My_Sub_Int); |
| 105 | + pragma Assert (Var_Rec.B in My_Enum); |
| 106 | + pragma Assert (Var_Rec.I in Index); |
| 107 | + for I in Index loop |
| 108 | + pragma Assert (Var_Rec.D (I) in My_Sub_Int); |
| 109 | + end loop; |
| 110 | + |
| 111 | + pragma Assert (In_Type (Var_My_Int)); |
| 112 | + pragma Assert (In_Type_Sub (Var_My_Sub_Int)); |
| 113 | + pragma Assert (In_Type (Var_My_Enum)); |
| 114 | + pragma Assert (In_Type_Sub (Var_My_Sub_Enum)); |
| 115 | + |
| 116 | + for I in Index loop |
| 117 | + pragma Assert (In_Type_Sub (Var_Fixed_Array (I))); |
| 118 | + end loop; |
| 119 | + |
| 120 | + pragma Assert (In_Type_Sub (Var_Rec.A)); |
| 121 | + pragma Assert (In_Type (Var_Rec.B)); |
| 122 | + pragma Assert (In_Type (Var_Rec.I)); |
| 123 | + for I in Index loop |
| 124 | + pragma Assert (In_Type_Sub (Var_Rec.D (I))); |
| 125 | + end loop; |
| 126 | + |
| 127 | + Var_My_Int := Nondet_My_Int; |
| 128 | + pragma Assert (Var_My_Int = 3); |
| 129 | + |
| 130 | + Var_My_Sub_Int := Nondet_My_Sub_Int; |
| 131 | + pragma Assert (Var_My_Sub_Int = 5); |
| 132 | + |
| 133 | + Var_My_Enum := Nondet_My_Enum; |
| 134 | + pragma Assert (Var_My_Enum = one); |
| 135 | + |
| 136 | + Var_My_Sub_Enum := Nondet_My_Sub_Enum; |
| 137 | + pragma Assert (Var_My_Sub_Enum = three); |
| 138 | + |
| 139 | + for I in Var_Fixed_Array'Range loop |
| 140 | + Var_Fixed_Array (I) := Nondet_My_Sub_Int; |
| 141 | + end loop; |
| 142 | + |
| 143 | + for I in Index loop |
| 144 | + pragma Assert (Var_Fixed_Array (I) = 7); |
| 145 | + end loop; |
| 146 | + |
| 147 | + Var_Rec := |
| 148 | + (Nondet_My_Sub_Int, Nondet_My_Enum, Nondet_Index, |
| 149 | + (others => Nondet_My_Sub_Int)); |
| 150 | + |
| 151 | + pragma Assert (Var_Rec.A = 11); |
| 152 | + pragma Assert (Var_Rec.B = five); |
| 153 | + pragma Assert (Var_Rec.I = 1); |
| 154 | + for I in Index loop |
| 155 | + pragma Assert (Var_Rec.D (I) = 13); |
| 156 | + end loop; |
| 157 | + |
| 158 | + pragma Assert (Var_My_Int >= My_Int'First and Var_My_Int <= My_Int'Last); |
| 159 | + pragma Assert (Var_My_Sub_Int in My_Sub_Int); |
| 160 | + |
| 161 | + pragma Assert (Var_My_Enum in My_Enum); |
| 162 | + pragma Assert (Var_My_Sub_Enum in My_Sub_Enum); |
| 163 | + |
| 164 | + for I in Index loop |
| 165 | + pragma Assert (Var_Fixed_Array (I) in My_Sub_Int); |
| 166 | + end loop; |
| 167 | + |
| 168 | + pragma Assert (Var_Rec.A in My_Sub_Int); |
| 169 | + pragma Assert (Var_Rec.B in My_Enum); |
| 170 | + pragma Assert (Var_Rec.I in Index); |
| 171 | + for I in Index loop |
| 172 | + pragma Assert (Var_Rec.D (I) in My_Sub_Int); |
| 173 | + end loop; |
| 174 | + |
| 175 | + pragma Assume (In_Type (Var_My_Int)); |
| 176 | + pragma Assume (In_Type_Sub (Var_My_Sub_Int)); |
| 177 | + pragma Assume (In_Type (Var_My_Enum)); |
| 178 | + pragma Assume (In_Type_Sub (Var_My_Sub_Enum)); |
| 179 | + |
| 180 | + for I in Index loop |
| 181 | + pragma Assume (In_Type_Sub (Var_Fixed_Array (I))); |
| 182 | + end loop; |
| 183 | + |
| 184 | + pragma Assume (In_Type_Sub (Var_Rec.A)); |
| 185 | + pragma Assume (In_Type (Var_Rec.B)); |
| 186 | + pragma Assume (In_Type (Var_Rec.I)); |
| 187 | + for I in Index loop |
| 188 | + pragma Assume (In_Type_Sub (Var_Rec.D (I))); |
| 189 | + end loop; |
| 190 | + |
| 191 | + pragma Assert (Var_My_Int >= My_Int'First and Var_My_Int <= My_Int'Last); |
| 192 | + pragma Assert (Var_My_Sub_Int in My_Sub_Int); |
| 193 | + |
| 194 | + pragma Assert (Var_My_Enum >= My_Enum'First and Var_My_Enum <= My_Enum'Last); |
| 195 | + pragma Assert (Var_My_Sub_Enum in My_Sub_Enum); |
| 196 | + |
| 197 | + for I in Index loop |
| 198 | + pragma Assert (Var_Fixed_Array (I) in My_Sub_Int); |
| 199 | + end loop; |
| 200 | + |
| 201 | + pragma Assert (Var_Rec.A in My_Sub_Int); |
| 202 | + pragma Assert (Var_Rec.B in My_Enum); |
| 203 | + pragma Assert (Var_Rec.I in Index); |
| 204 | + for I in Index loop |
| 205 | + pragma Assert (Var_Rec.D (I) in My_Sub_Int); |
| 206 | + end loop; |
| 207 | + |
| 208 | +end Nondet_Function; |
0 commit comments