annotate gcc/testsuite/ada/acats/tests/cxb/cxb3015.a @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 -- CXB3015.A
kono
parents:
diff changeset
2 --
kono
parents:
diff changeset
3 -- Grant of Unlimited Rights
kono
parents:
diff changeset
4 --
kono
parents:
diff changeset
5 -- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
kono
parents:
diff changeset
6 -- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained
kono
parents:
diff changeset
7 -- unlimited rights in the software and documentation contained herein.
kono
parents:
diff changeset
8 -- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making
kono
parents:
diff changeset
9 -- this public release, the Government intends to confer upon all
kono
parents:
diff changeset
10 -- recipients unlimited rights equal to those held by the Government.
kono
parents:
diff changeset
11 -- These rights include rights to use, duplicate, release or disclose the
kono
parents:
diff changeset
12 -- released technical data and computer software in whole or in part, in
kono
parents:
diff changeset
13 -- any manner and for any purpose whatsoever, and to have or permit others
kono
parents:
diff changeset
14 -- to do so.
kono
parents:
diff changeset
15 --
kono
parents:
diff changeset
16 -- DISCLAIMER
kono
parents:
diff changeset
17 --
kono
parents:
diff changeset
18 -- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
kono
parents:
diff changeset
19 -- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
kono
parents:
diff changeset
20 -- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
kono
parents:
diff changeset
21 -- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
kono
parents:
diff changeset
22 -- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
kono
parents:
diff changeset
23 -- PARTICULAR PURPOSE OF SAID MATERIAL.
kono
parents:
diff changeset
24 --*
kono
parents:
diff changeset
25 --
kono
parents:
diff changeset
26 -- OBJECTIVE:
kono
parents:
diff changeset
27 -- Check that the "+" and "-" functions with Pointer and ptrdiff_t
kono
parents:
diff changeset
28 -- parameters that return Pointer values produce correct results,
kono
parents:
diff changeset
29 -- based on the size of the array elements.
kono
parents:
diff changeset
30 --
kono
parents:
diff changeset
31 -- Check that the "-" function with two Pointer parameters that
kono
parents:
diff changeset
32 -- returns a ptrdiff_t type parameter produces correct results,
kono
parents:
diff changeset
33 -- based on the size of the array elements.
kono
parents:
diff changeset
34 --
kono
parents:
diff changeset
35 -- Check that each of the "+" and "-" functions above will
kono
parents:
diff changeset
36 -- propagate Pointer_Error if a Pointer parameter is null.
kono
parents:
diff changeset
37 --
kono
parents:
diff changeset
38 -- Check that the Increment and Decrement procedures provide the
kono
parents:
diff changeset
39 -- correct "pointer arithmetic" operations.
kono
parents:
diff changeset
40 --
kono
parents:
diff changeset
41 -- TEST DESCRIPTION:
kono
parents:
diff changeset
42 -- This test checks that the functions "+" and "-", and the procedures
kono
parents:
diff changeset
43 -- Increment and Decrement in the generic package Interfaces.C.Pointers
kono
parents:
diff changeset
44 -- will allow the user to perform "pointer arithmetic" operations on
kono
parents:
diff changeset
45 -- Pointer values.
kono
parents:
diff changeset
46 -- Package Interfaces.C.Pointers is instantiated three times, for
kono
parents:
diff changeset
47 -- short values, chars, and arrays of arrays. Pointers from each
kono
parents:
diff changeset
48 -- instantiated package are then used to reference different elements
kono
parents:
diff changeset
49 -- of array objects. Pointer arithmetic operations are performed on
kono
parents:
diff changeset
50 -- these pointers, and the results of these operations are verified
kono
parents:
diff changeset
51 -- against expected pointer positions along the referenced arrays.
kono
parents:
diff changeset
52 -- The propagation of Pointer_Error is checked for when the function
kono
parents:
diff changeset
53 -- Pointer parameter is null.
kono
parents:
diff changeset
54 --
kono
parents:
diff changeset
55 -- The following chart indicates the combinations of subprograms and
kono
parents:
diff changeset
56 -- parameter types used in this test.
kono
parents:
diff changeset
57 --
kono
parents:
diff changeset
58 --
kono
parents:
diff changeset
59 -- Short Char Array
kono
parents:
diff changeset
60 -- --------------------------
kono
parents:
diff changeset
61 -- "+" Pointer, ptrdiff_t | X | | X |
kono
parents:
diff changeset
62 -- |--------------------------|
kono
parents:
diff changeset
63 -- "+" ptrdiff_t, Pointer | X | | X |
kono
parents:
diff changeset
64 -- |--------------------------|
kono
parents:
diff changeset
65 -- "-" Pointer, ptrdiff_t | | X | X |
kono
parents:
diff changeset
66 -- |--------------------------|
kono
parents:
diff changeset
67 -- "-" Pointer, Pointer | | X | X |
kono
parents:
diff changeset
68 -- |--------------------------|
kono
parents:
diff changeset
69 -- Increment (Pointer) | X | | X |
kono
parents:
diff changeset
70 -- |--------------------------|
kono
parents:
diff changeset
71 -- Decrement (Pointer) | X | | X |
kono
parents:
diff changeset
72 -- --------------------------
kono
parents:
diff changeset
73 --
kono
parents:
diff changeset
74 -- This test assumes that the following characters are all included
kono
parents:
diff changeset
75 -- in the implementation defined type Interfaces.C.char:
kono
parents:
diff changeset
76 -- ' ', and 'a'..'z'.
kono
parents:
diff changeset
77 --
kono
parents:
diff changeset
78 -- APPLICABILITY CRITERIA:
kono
parents:
diff changeset
79 -- This test is applicable to all implementations that provide
kono
parents:
diff changeset
80 -- package Interfaces.C.Pointers. If an implementation provides
kono
parents:
diff changeset
81 -- package Interfaces.C.Pointers, this test must compile, execute, and
kono
parents:
diff changeset
82 -- report "PASSED".
kono
parents:
diff changeset
83 --
kono
parents:
diff changeset
84 --
kono
parents:
diff changeset
85 -- CHANGE HISTORY:
kono
parents:
diff changeset
86 -- 26 Oct 95 SAIC Initial prerelease version.
kono
parents:
diff changeset
87 -- 13 May 96 SAIC Incorporated reviewer comments for ACVC 2.1.
kono
parents:
diff changeset
88 -- 26 Oct 96 SAIC Incorporated reviewer comments.
kono
parents:
diff changeset
89 -- 06 Mar 00 RLB Repaired so that array of arrays component
kono
parents:
diff changeset
90 -- type is statically constrained. (C does not have
kono
parents:
diff changeset
91 -- an analog to an array of dynamically constrained
kono
parents:
diff changeset
92 -- arrays.)
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94 with Report;
kono
parents:
diff changeset
95 with Ada.Exceptions;
kono
parents:
diff changeset
96 with Interfaces.C.Pointers; -- N/A => ERROR
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 procedure CXB3015 is
kono
parents:
diff changeset
99 begin
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 Report.Test ("CXB3015", "Check that +, -, Increment, and Decrement " &
kono
parents:
diff changeset
102 "subprograms in Package Interfaces.C.Pointers " &
kono
parents:
diff changeset
103 "produce correct results");
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 Test_Block:
kono
parents:
diff changeset
106 declare
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 use Ada.Exceptions;
kono
parents:
diff changeset
109 use type Interfaces.C.short;
kono
parents:
diff changeset
110 use type Interfaces.C.size_t, Interfaces.C.ptrdiff_t;
kono
parents:
diff changeset
111 use type Interfaces.C.char, Interfaces.C.char_array;
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 TC_Count : Interfaces.C.size_t;
kono
parents:
diff changeset
114 TC_Increment : Interfaces.C.ptrdiff_t;
kono
parents:
diff changeset
115 TC_ptrdiff_t : Interfaces.C.ptrdiff_t;
kono
parents:
diff changeset
116 TC_Short : Interfaces.C.short := 0;
kono
parents:
diff changeset
117 TC_Verbose : Boolean := False;
kono
parents:
diff changeset
118 Constant_Min_Array_Size : constant Interfaces.C.size_t := 0;
kono
parents:
diff changeset
119 Constant_Max_Array_Size : constant Interfaces.C.size_t := 20;
kono
parents:
diff changeset
120 Min_Array_Size : Interfaces.C.size_t := Interfaces.C.size_t(
kono
parents:
diff changeset
121 Report.Ident_Int(Integer(Constant_Min_Array_Size)));
kono
parents:
diff changeset
122 Max_Array_Size : Interfaces.C.size_t := Interfaces.C.size_t(
kono
parents:
diff changeset
123 Report.Ident_Int(Integer(Constant_Max_Array_Size)));
kono
parents:
diff changeset
124 Min_size_t,
kono
parents:
diff changeset
125 Max_size_t : Interfaces.C.size_t;
kono
parents:
diff changeset
126 Short_Terminator : Interfaces.C.short := Interfaces.C.short'Last;
kono
parents:
diff changeset
127 Alphabet : constant String := "abcdefghijklmnopqrstuvwxyz";
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129
kono
parents:
diff changeset
130 type Short_Array_Type is
kono
parents:
diff changeset
131 array (Interfaces.C.size_t range <>) of aliased Interfaces.C.short;
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 type Constrained_Array_Type is
kono
parents:
diff changeset
134 array (Min_Array_Size..Max_Array_Size) of aliased Interfaces.C.short;
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 type Static_Constrained_Array_Type is
kono
parents:
diff changeset
137 array (Constant_Min_Array_Size .. Constant_Max_Array_Size) of
kono
parents:
diff changeset
138 aliased Interfaces.C.short;
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 type Array_of_Arrays_Type is
kono
parents:
diff changeset
141 array (Interfaces.C.size_t range <>) of aliased
kono
parents:
diff changeset
142 Static_Constrained_Array_Type;
kono
parents:
diff changeset
143
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 Short_Array : Short_Array_Type(Min_Array_Size..Max_Array_Size);
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 Constrained_Array : Constrained_Array_Type;
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 Terminator_Array : Static_Constrained_Array_Type :=
kono
parents:
diff changeset
150 (others => Short_Terminator);
kono
parents:
diff changeset
151
kono
parents:
diff changeset
152 Ch_Array : Interfaces.C.char_array
kono
parents:
diff changeset
153 (0..Interfaces.C.size_t(Alphabet'Length)) :=
kono
parents:
diff changeset
154 Interfaces.C.To_C(Alphabet, True);
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 Array_of_Arrays : Array_of_Arrays_Type
kono
parents:
diff changeset
157 (Min_Array_Size..Max_Array_Size);
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 package Short_Pointers is new
kono
parents:
diff changeset
161 Interfaces.C.Pointers (Index => Interfaces.C.size_t,
kono
parents:
diff changeset
162 Element => Interfaces.C.short,
kono
parents:
diff changeset
163 Element_Array => Short_Array_Type,
kono
parents:
diff changeset
164 Default_Terminator => Short_Terminator);
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 package Char_Pointers is new
kono
parents:
diff changeset
167 Interfaces.C.Pointers (Interfaces.C.size_t,
kono
parents:
diff changeset
168 Interfaces.C.char,
kono
parents:
diff changeset
169 Element_Array => Interfaces.C.char_array,
kono
parents:
diff changeset
170 Default_Terminator => Interfaces.C.nul);
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 package Array_Pointers is new
kono
parents:
diff changeset
173 Interfaces.C.Pointers (Interfaces.C.size_t,
kono
parents:
diff changeset
174 Static_Constrained_Array_Type,
kono
parents:
diff changeset
175 Array_of_Arrays_Type,
kono
parents:
diff changeset
176 Terminator_Array);
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178
kono
parents:
diff changeset
179 use Short_Pointers, Char_Pointers, Array_Pointers;
kono
parents:
diff changeset
180
kono
parents:
diff changeset
181 Short_Ptr : Short_Pointers.Pointer := Short_Array(0)'Access;
kono
parents:
diff changeset
182 Char_Ptr : Char_Pointers.Pointer := Ch_Array(0)'Access;
kono
parents:
diff changeset
183 Start_Char_Ptr : Char_Pointers.Pointer := Ch_Array(1)'Access;
kono
parents:
diff changeset
184 End_Char_Ptr : Char_Pointers.Pointer := Ch_Array(10)'Access;
kono
parents:
diff changeset
185 Array_Ptr : Array_Pointers.Pointer := Array_of_Arrays(0)'Access;
kono
parents:
diff changeset
186 Start_Array_Ptr : Array_Pointers.Pointer := Array_of_Arrays(1)'Access;
kono
parents:
diff changeset
187 End_Array_Ptr : Array_Pointers.Pointer := Array_of_Arrays(10)'Access;
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 begin
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 -- Provide initial values for the arrays that hold short int values.
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 for i in Min_Array_Size..Max_Array_Size-1 loop
kono
parents:
diff changeset
194 Short_Array(i) := Interfaces.C.short(i);
kono
parents:
diff changeset
195 for j in Min_Array_Size..Max_Array_Size loop
kono
parents:
diff changeset
196 -- Initialize this "array of arrays" so that element (i)(0)
kono
parents:
diff changeset
197 -- is different for each value of i.
kono
parents:
diff changeset
198 Array_of_Arrays(i)(j) := TC_Short;
kono
parents:
diff changeset
199 TC_Short := TC_Short + 1;
kono
parents:
diff changeset
200 end loop;
kono
parents:
diff changeset
201 end loop;
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 -- Set the final element of each array object to be the "terminator"
kono
parents:
diff changeset
204 -- element used in the instantiations above.
kono
parents:
diff changeset
205
kono
parents:
diff changeset
206 Short_Array(Max_Array_Size) := Short_Terminator;
kono
parents:
diff changeset
207 Array_of_Arrays(Max_Array_Size) := Terminator_Array;
kono
parents:
diff changeset
208
kono
parents:
diff changeset
209 -- Check starting pointer positions.
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 if Short_Ptr.all /= 0 or
kono
parents:
diff changeset
212 Char_Ptr.all /= Ch_Array(0) or
kono
parents:
diff changeset
213 Array_Ptr.all /= Array_of_Arrays(0)
kono
parents:
diff changeset
214 then
kono
parents:
diff changeset
215 Report.Failed("Incorrect initial value for the first " &
kono
parents:
diff changeset
216 "Short_Array, Ch_Array, or Array_of_Array values");
kono
parents:
diff changeset
217 end if;
kono
parents:
diff changeset
218
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 -- Check that both versions of the "+" function with Pointer and
kono
parents:
diff changeset
221 -- ptrdiff_t parameters, that return a Pointer value, produce correct
kono
parents:
diff changeset
222 -- results, based on the size of the array elements.
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 for i in Min_Array_Size + 1 .. Max_Array_Size loop
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 if Integer(i)/2*2 /= Integer(i) then -- Odd numbered loops.
kono
parents:
diff changeset
227 -- Pointer + ptrdiff_t, increment by 1.
kono
parents:
diff changeset
228 Short_Ptr := Short_Ptr + 1;
kono
parents:
diff changeset
229 else -- Even numbered loops.
kono
parents:
diff changeset
230 -- ptrdiff_t + Pointer, increment by 1.
kono
parents:
diff changeset
231 Short_Ptr := 1 + Short_Ptr;
kono
parents:
diff changeset
232 end if;
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 if Short_Ptr.all /= Short_Array(i) then
kono
parents:
diff changeset
235 Report.Failed("Incorrect value returned following use " &
kono
parents:
diff changeset
236 "of the function +, incrementing by 1, " &
kono
parents:
diff changeset
237 "array position : " & Integer'Image(Integer(i)));
kono
parents:
diff changeset
238 if not TC_Verbose then
kono
parents:
diff changeset
239 exit;
kono
parents:
diff changeset
240 end if;
kono
parents:
diff changeset
241 end if;
kono
parents:
diff changeset
242 end loop;
kono
parents:
diff changeset
243
kono
parents:
diff changeset
244 Array_Ptr := Array_of_Arrays(Min_Array_Size)'Access;
kono
parents:
diff changeset
245 TC_Count := Min_Array_Size;
kono
parents:
diff changeset
246 TC_Increment := 3;
kono
parents:
diff changeset
247 while TC_Count+Interfaces.C.size_t(TC_Increment) < Max_Array_Size loop
kono
parents:
diff changeset
248
kono
parents:
diff changeset
249 if Integer(TC_Count)/2*2 /= Integer(TC_Count) then
kono
parents:
diff changeset
250 -- Odd numbered loops.
kono
parents:
diff changeset
251 -- Pointer + ptrdiff_t, increment by 3.
kono
parents:
diff changeset
252 Array_Ptr := Array_Pointers."+"(Array_Ptr, TC_Increment);
kono
parents:
diff changeset
253 else
kono
parents:
diff changeset
254 -- Odd numbered loops.
kono
parents:
diff changeset
255 -- ptrdiff_t + Pointer, increment by 3.
kono
parents:
diff changeset
256 Array_Ptr := Array_Pointers."+"(Left => TC_Increment,
kono
parents:
diff changeset
257 Right => Array_Ptr);
kono
parents:
diff changeset
258 end if;
kono
parents:
diff changeset
259
kono
parents:
diff changeset
260 if Array_Ptr.all /=
kono
parents:
diff changeset
261 Array_of_Arrays(TC_Count+Interfaces.C.size_t(TC_Increment))
kono
parents:
diff changeset
262 then
kono
parents:
diff changeset
263 Report.Failed("Incorrect value returned following use " &
kono
parents:
diff changeset
264 "of the function +, incrementing by " &
kono
parents:
diff changeset
265 Integer'Image(Integer(TC_Increment)) &
kono
parents:
diff changeset
266 ", array position : " &
kono
parents:
diff changeset
267 Integer'Image(Integer(TC_Count) +
kono
parents:
diff changeset
268 Integer(TC_Increment)));
kono
parents:
diff changeset
269 if not TC_Verbose then
kono
parents:
diff changeset
270 exit;
kono
parents:
diff changeset
271 end if;
kono
parents:
diff changeset
272 end if;
kono
parents:
diff changeset
273
kono
parents:
diff changeset
274 TC_Count := TC_Count + Interfaces.C.size_t(TC_Increment);
kono
parents:
diff changeset
275 end loop;
kono
parents:
diff changeset
276
kono
parents:
diff changeset
277
kono
parents:
diff changeset
278
kono
parents:
diff changeset
279 -- Check that the "-" function with Pointer and ptrdiff_t parameters,
kono
parents:
diff changeset
280 -- that returns a Pointer result, produces correct results, based
kono
parents:
diff changeset
281 -- on the size of the array elements.
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 -- Set the pointer to the last element in the char_array, which is a
kono
parents:
diff changeset
284 -- nul char.
kono
parents:
diff changeset
285 Char_Ptr := Ch_Array(Interfaces.C.size_t(Alphabet'Length))'Access;
kono
parents:
diff changeset
286
kono
parents:
diff changeset
287 if Char_Ptr.all /= Interfaces.C.nul then
kono
parents:
diff changeset
288 Report.Failed("Incorrect initial value for the last " &
kono
parents:
diff changeset
289 "Ch_Array value");
kono
parents:
diff changeset
290 end if;
kono
parents:
diff changeset
291
kono
parents:
diff changeset
292 Min_size_t := 1;
kono
parents:
diff changeset
293 Max_size_t := Interfaces.C.size_t(Alphabet'Length);
kono
parents:
diff changeset
294
kono
parents:
diff changeset
295 for i in reverse Min_size_t..Max_size_t loop
kono
parents:
diff changeset
296
kono
parents:
diff changeset
297 -- Subtract 1 from the pointer; it should now point to the previous
kono
parents:
diff changeset
298 -- element in the array.
kono
parents:
diff changeset
299 Char_Ptr := Char_Ptr - 1;
kono
parents:
diff changeset
300
kono
parents:
diff changeset
301 if Char_Ptr.all /= Ch_Array(i-1) then
kono
parents:
diff changeset
302 Report.Failed("Incorrect value returned following use " &
kono
parents:
diff changeset
303 "of the function '-' with char element values, " &
kono
parents:
diff changeset
304 "array position : " & Integer'Image(Integer(i-1)));
kono
parents:
diff changeset
305 if not TC_Verbose then
kono
parents:
diff changeset
306 exit;
kono
parents:
diff changeset
307 end if;
kono
parents:
diff changeset
308 end if;
kono
parents:
diff changeset
309 end loop;
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 Array_Ptr := Array_of_Arrays(Max_Array_Size)'Access;
kono
parents:
diff changeset
312 TC_Count := Max_Array_Size;
kono
parents:
diff changeset
313 TC_Increment := 3;
kono
parents:
diff changeset
314 while TC_Count > Min_Array_Size+Interfaces.C.size_t(TC_Increment) loop
kono
parents:
diff changeset
315
kono
parents:
diff changeset
316 -- Decrement the pointer by 3.
kono
parents:
diff changeset
317 Array_Ptr := Array_Pointers."-"(Array_Ptr, Right => 3);
kono
parents:
diff changeset
318
kono
parents:
diff changeset
319 if Array_Ptr.all /=
kono
parents:
diff changeset
320 Array_of_Arrays(TC_Count - Interfaces.C.size_t(TC_Increment))
kono
parents:
diff changeset
321 then
kono
parents:
diff changeset
322 Report.Failed("Incorrect value returned following use " &
kono
parents:
diff changeset
323 "of the function -, decrementing by " &
kono
parents:
diff changeset
324 Integer'Image(Integer(TC_Increment)) &
kono
parents:
diff changeset
325 ", array position : " &
kono
parents:
diff changeset
326 Integer'Image(Integer(TC_Count-3)));
kono
parents:
diff changeset
327 if not TC_Verbose then
kono
parents:
diff changeset
328 exit;
kono
parents:
diff changeset
329 end if;
kono
parents:
diff changeset
330 end if;
kono
parents:
diff changeset
331
kono
parents:
diff changeset
332 TC_Count := TC_Count - Interfaces.C.size_t(TC_Increment);
kono
parents:
diff changeset
333 end loop;
kono
parents:
diff changeset
334
kono
parents:
diff changeset
335
kono
parents:
diff changeset
336
kono
parents:
diff changeset
337 -- Check that the "-" function with two Pointer parameters, that
kono
parents:
diff changeset
338 -- returns a ptrdiff_t type result, produces correct results,
kono
parents:
diff changeset
339 -- based on the size of the array elements.
kono
parents:
diff changeset
340
kono
parents:
diff changeset
341 TC_ptrdiff_t := 9;
kono
parents:
diff changeset
342 if Char_Pointers."-"(Left => End_Char_Ptr,
kono
parents:
diff changeset
343 Right => Start_Char_Ptr) /= TC_ptrdiff_t
kono
parents:
diff changeset
344 then
kono
parents:
diff changeset
345 Report.Failed("Incorrect result from pointer-pointer " &
kono
parents:
diff changeset
346 "subtraction - 1");
kono
parents:
diff changeset
347 end if;
kono
parents:
diff changeset
348
kono
parents:
diff changeset
349 Start_Char_Ptr := Ch_Array(1)'Access;
kono
parents:
diff changeset
350 End_Char_Ptr := Ch_Array(25)'Access;
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 TC_ptrdiff_t := 24;
kono
parents:
diff changeset
353 if Char_Pointers."-"(End_Char_Ptr,
kono
parents:
diff changeset
354 Right => Start_Char_Ptr) /= TC_ptrdiff_t
kono
parents:
diff changeset
355 then
kono
parents:
diff changeset
356 Report.Failed("Incorrect result from pointer-pointer " &
kono
parents:
diff changeset
357 "subtraction - 2");
kono
parents:
diff changeset
358 end if;
kono
parents:
diff changeset
359
kono
parents:
diff changeset
360 TC_ptrdiff_t := 9;
kono
parents:
diff changeset
361 if Array_Pointers."-"(End_Array_Ptr,
kono
parents:
diff changeset
362 Start_Array_Ptr) /= TC_ptrdiff_t
kono
parents:
diff changeset
363 then
kono
parents:
diff changeset
364 Report.Failed("Incorrect result from pointer-pointer " &
kono
parents:
diff changeset
365 "subtraction - 3");
kono
parents:
diff changeset
366 end if;
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 Start_Array_Ptr := Array_of_Arrays(Min_Array_Size)'Access;
kono
parents:
diff changeset
369 End_Array_Ptr := Array_of_Arrays(Max_Array_Size)'Access;
kono
parents:
diff changeset
370
kono
parents:
diff changeset
371 TC_ptrdiff_t := Interfaces.C.ptrdiff_t(Max_Array_Size) -
kono
parents:
diff changeset
372 Interfaces.C.ptrdiff_t(Min_Array_Size);
kono
parents:
diff changeset
373 if End_Array_Ptr - Start_Array_Ptr /= TC_ptrdiff_t then
kono
parents:
diff changeset
374 Report.Failed("Incorrect result from pointer-pointer " &
kono
parents:
diff changeset
375 "subtraction - 4");
kono
parents:
diff changeset
376 end if;
kono
parents:
diff changeset
377
kono
parents:
diff changeset
378
kono
parents:
diff changeset
379
kono
parents:
diff changeset
380 -- Check that the Increment procedure produces correct results,
kono
parents:
diff changeset
381 -- based upon the size of the array elements.
kono
parents:
diff changeset
382
kono
parents:
diff changeset
383 Short_Ptr := Short_Array(0)'Access;
kono
parents:
diff changeset
384
kono
parents:
diff changeset
385 for i in Min_Array_Size + 1 .. Max_Array_Size loop
kono
parents:
diff changeset
386 -- Increment the value of the Pointer; it should now point
kono
parents:
diff changeset
387 -- to the next element in the array.
kono
parents:
diff changeset
388 Increment(Ref => Short_Ptr);
kono
parents:
diff changeset
389
kono
parents:
diff changeset
390 if Short_Ptr.all /= Short_Array(i) then
kono
parents:
diff changeset
391 Report.Failed("Incorrect value returned following use " &
kono
parents:
diff changeset
392 "of the Procedure Increment on pointer to an " &
kono
parents:
diff changeset
393 "array of short values, array position : " &
kono
parents:
diff changeset
394 Integer'Image(Integer(i)));
kono
parents:
diff changeset
395 if not TC_Verbose then
kono
parents:
diff changeset
396 exit;
kono
parents:
diff changeset
397 end if;
kono
parents:
diff changeset
398 end if;
kono
parents:
diff changeset
399 end loop;
kono
parents:
diff changeset
400
kono
parents:
diff changeset
401 Array_Ptr := Array_of_Arrays(0)'Access;
kono
parents:
diff changeset
402
kono
parents:
diff changeset
403 for i in Min_Array_Size + 1 .. Max_Array_Size loop
kono
parents:
diff changeset
404 -- Increment the value of the Pointer; it should now point
kono
parents:
diff changeset
405 -- to the next element in the array.
kono
parents:
diff changeset
406 Increment(Array_Ptr);
kono
parents:
diff changeset
407
kono
parents:
diff changeset
408 if Array_Ptr.all /= Array_of_Arrays(i) then
kono
parents:
diff changeset
409 Report.Failed("Incorrect value returned following use " &
kono
parents:
diff changeset
410 "of the Procedure Increment on an array of " &
kono
parents:
diff changeset
411 "arrays, array position : " &
kono
parents:
diff changeset
412 Integer'Image(Integer(i)));
kono
parents:
diff changeset
413 if not TC_Verbose then
kono
parents:
diff changeset
414 exit;
kono
parents:
diff changeset
415 end if;
kono
parents:
diff changeset
416 end if;
kono
parents:
diff changeset
417 end loop;
kono
parents:
diff changeset
418
kono
parents:
diff changeset
419
kono
parents:
diff changeset
420 -- Check that the Decrement procedure produces correct results,
kono
parents:
diff changeset
421 -- based upon the size of the array elements.
kono
parents:
diff changeset
422
kono
parents:
diff changeset
423 Short_Ptr := Short_Array(Max_Array_Size)'Access;
kono
parents:
diff changeset
424
kono
parents:
diff changeset
425 for i in reverse Min_Array_Size .. Max_Array_Size - 1 loop
kono
parents:
diff changeset
426 -- Decrement the value of the Pointer; it should now point
kono
parents:
diff changeset
427 -- to the previous element in the array.
kono
parents:
diff changeset
428 Decrement(Ref => Short_Ptr);
kono
parents:
diff changeset
429
kono
parents:
diff changeset
430 if Short_Ptr.all /= Short_Array(i) then
kono
parents:
diff changeset
431 Report.Failed("Incorrect value returned following use " &
kono
parents:
diff changeset
432 "of the Procedure Decrement on pointer to an " &
kono
parents:
diff changeset
433 "array of short values, array position : " &
kono
parents:
diff changeset
434 Integer'Image(Integer(i)));
kono
parents:
diff changeset
435 if not TC_Verbose then
kono
parents:
diff changeset
436 exit;
kono
parents:
diff changeset
437 end if;
kono
parents:
diff changeset
438 end if;
kono
parents:
diff changeset
439 end loop;
kono
parents:
diff changeset
440
kono
parents:
diff changeset
441 Array_Ptr := Array_of_Arrays(Max_Array_Size)'Access;
kono
parents:
diff changeset
442
kono
parents:
diff changeset
443 for i in reverse Min_Array_Size .. Max_Array_Size - 1 loop
kono
parents:
diff changeset
444 -- Decrement the value of the Pointer; it should now point
kono
parents:
diff changeset
445 -- to the previous array element.
kono
parents:
diff changeset
446 Decrement(Array_Ptr);
kono
parents:
diff changeset
447
kono
parents:
diff changeset
448 if Array_Ptr.all /= Array_of_Arrays(i) then
kono
parents:
diff changeset
449 Report.Failed("Incorrect value returned following use " &
kono
parents:
diff changeset
450 "of the Procedure Decrement on an array of " &
kono
parents:
diff changeset
451 "arrays, array position : " &
kono
parents:
diff changeset
452 Integer'Image(Integer(i)));
kono
parents:
diff changeset
453 if not TC_Verbose then
kono
parents:
diff changeset
454 exit;
kono
parents:
diff changeset
455 end if;
kono
parents:
diff changeset
456 end if;
kono
parents:
diff changeset
457 end loop;
kono
parents:
diff changeset
458
kono
parents:
diff changeset
459
kono
parents:
diff changeset
460
kono
parents:
diff changeset
461 -- Check that each of the "+" and "-" functions above will
kono
parents:
diff changeset
462 -- propagate Pointer_Error if a Pointer parameter is null.
kono
parents:
diff changeset
463
kono
parents:
diff changeset
464 begin
kono
parents:
diff changeset
465 Short_Ptr := null;
kono
parents:
diff changeset
466 Short_Ptr := Short_Ptr + 4;
kono
parents:
diff changeset
467 Report.Failed("Pointer_Error not raised by Function + when " &
kono
parents:
diff changeset
468 "the Pointer parameter is null");
kono
parents:
diff changeset
469 if Short_Ptr /= null then -- To avoid optimization.
kono
parents:
diff changeset
470 Report.Comment("This should never be printed");
kono
parents:
diff changeset
471 end if;
kono
parents:
diff changeset
472 exception
kono
parents:
diff changeset
473 when Short_Pointers.Pointer_Error => null; -- OK, expected exception.
kono
parents:
diff changeset
474 when others =>
kono
parents:
diff changeset
475 Report.Failed("Unexpected exception raised by Function + " &
kono
parents:
diff changeset
476 "when the Pointer parameter is null");
kono
parents:
diff changeset
477 end;
kono
parents:
diff changeset
478
kono
parents:
diff changeset
479
kono
parents:
diff changeset
480 begin
kono
parents:
diff changeset
481 Char_Ptr := null;
kono
parents:
diff changeset
482 Char_Ptr := Char_Ptr - 1;
kono
parents:
diff changeset
483 Report.Failed("Pointer_Error not raised by Function - when " &
kono
parents:
diff changeset
484 "the Pointer parameter is null");
kono
parents:
diff changeset
485 if Char_Ptr /= null then -- To avoid optimization.
kono
parents:
diff changeset
486 Report.Comment("This should never be printed");
kono
parents:
diff changeset
487 end if;
kono
parents:
diff changeset
488 exception
kono
parents:
diff changeset
489 when Char_Pointers.Pointer_Error => null; -- OK, expected exception.
kono
parents:
diff changeset
490 when others =>
kono
parents:
diff changeset
491 Report.Failed("Unexpected exception raised by Function - " &
kono
parents:
diff changeset
492 "when the Pointer parameter is null");
kono
parents:
diff changeset
493 end;
kono
parents:
diff changeset
494
kono
parents:
diff changeset
495
kono
parents:
diff changeset
496 begin
kono
parents:
diff changeset
497 Array_Ptr := null;
kono
parents:
diff changeset
498 Decrement(Array_Ptr);
kono
parents:
diff changeset
499 Report.Failed("Pointer_Error not raised by Procedure Decrement " &
kono
parents:
diff changeset
500 "when the Pointer parameter is null");
kono
parents:
diff changeset
501 if Array_Ptr /= null then -- To avoid optimization.
kono
parents:
diff changeset
502 Report.Comment("This should never be printed");
kono
parents:
diff changeset
503 end if;
kono
parents:
diff changeset
504 exception
kono
parents:
diff changeset
505 when Array_Pointers.Pointer_Error => null; -- OK, expected exception.
kono
parents:
diff changeset
506 when others =>
kono
parents:
diff changeset
507 Report.Failed("Unexpected exception raised by Procedure " &
kono
parents:
diff changeset
508 "Decrement when the Pointer parameter is null");
kono
parents:
diff changeset
509 end;
kono
parents:
diff changeset
510
kono
parents:
diff changeset
511
kono
parents:
diff changeset
512 exception
kono
parents:
diff changeset
513 when The_Error : others =>
kono
parents:
diff changeset
514 Report.Failed ("The following exception was raised in the " &
kono
parents:
diff changeset
515 "Test_Block: " & Exception_Name(The_Error));
kono
parents:
diff changeset
516 end Test_Block;
kono
parents:
diff changeset
517
kono
parents:
diff changeset
518 Report.Result;
kono
parents:
diff changeset
519
kono
parents:
diff changeset
520 end CXB3015;