2003-12-26 Guilhem Lavaux <guilhem@kaffe.org>
[official-gcc.git] / gcc / testsuite / ada / acats / tests / c3 / c34006j.ada
blob597bf63c5ebf1351a9baffe5b480efc089a92c75
1 -- C34006J.ADA
3 -- Grant of Unlimited Rights
4 --
5 -- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
6 -- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained
7 -- unlimited rights in the software and documentation contained herein.
8 -- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making
9 -- this public release, the Government intends to confer upon all
10 -- recipients unlimited rights equal to those held by the Government.
11 -- These rights include rights to use, duplicate, release or disclose the
12 -- released technical data and computer software in whole or in part, in
13 -- any manner and for any purpose whatsoever, and to have or permit others
14 -- to do so.
16 -- DISCLAIMER
18 -- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
19 -- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
20 -- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
21 -- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
22 -- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
23 -- PARTICULAR PURPOSE OF SAID MATERIAL.
24 --*
25 -- OBJECTIVE:
26 -- CHECK THAT THE REQUIRED PREDEFINED OPERATIONS ARE DECLARED
27 -- (IMPLICITLY) FOR DERIVED RECORD TYPES WITH DISCRIMINANTS AND WITH
28 -- A LIMITED COMPONENT TYPE.
30 -- HISTORY:
31 -- JRK 08/25/87 CREATED ORIGINAL TEST.
32 -- VCL 06/28/88 MODIFIED THE STATEMENTS INVOLVING THE 'SIZE
33 -- ATTRIBUTE TO REMOVE ANY ASSUMPTIONS ABOUT THE
34 -- SIZES.
35 -- PWN 11/30/94 REMOVED 'BASE USE ILLEGAL IN ADA 9X.
37 WITH SYSTEM; USE SYSTEM;
38 WITH REPORT; USE REPORT;
40 PROCEDURE C34006J IS
42 PACKAGE PKG_L IS
44 TYPE LP IS LIMITED PRIVATE;
46 FUNCTION CREATE (X : INTEGER) RETURN LP;
48 FUNCTION EQUAL (X, Y : LP) RETURN BOOLEAN;
50 PROCEDURE ASSIGN (X : OUT LP; Y : LP);
52 C4 : CONSTANT LP;
53 C5 : CONSTANT LP;
55 PRIVATE
57 TYPE LP IS NEW INTEGER;
59 C4 : CONSTANT LP := 4;
60 C5 : CONSTANT LP := 5;
62 END PKG_L;
64 USE PKG_L;
66 SUBTYPE COMPONENT IS LP;
68 PACKAGE PKG_P IS
70 MAX_LEN : CONSTANT := 10;
72 SUBTYPE LENGTH IS NATURAL RANGE 0 .. MAX_LEN;
74 TYPE PARENT (B : BOOLEAN := TRUE; L : LENGTH := 3) IS
75 RECORD
76 I : INTEGER := 2;
77 CASE B IS
78 WHEN TRUE =>
79 S : STRING (1 .. L) := (1 .. L => 'A');
80 C : COMPONENT;
81 WHEN FALSE =>
82 F : FLOAT := 5.0;
83 END CASE;
84 END RECORD;
86 FUNCTION CREATE ( B : BOOLEAN;
87 L : LENGTH;
88 I : INTEGER;
89 S : STRING;
90 C : COMPONENT;
91 F : FLOAT;
92 X : PARENT -- TO RESOLVE OVERLOADING.
93 ) RETURN PARENT;
95 FUNCTION EQUAL (X, Y : PARENT) RETURN BOOLEAN;
97 FUNCTION AGGR ( B : BOOLEAN;
98 L : LENGTH;
99 I : INTEGER;
100 S : STRING;
101 C : COMPONENT
102 ) RETURN PARENT;
104 FUNCTION AGGR ( B : BOOLEAN;
105 L : LENGTH;
106 I : INTEGER;
107 F : FLOAT
108 ) RETURN PARENT;
110 END PKG_P;
112 USE PKG_P;
114 TYPE T IS NEW PARENT (IDENT_BOOL (TRUE), IDENT_INT (3));
116 X : T;
117 W : PARENT;
118 B : BOOLEAN := FALSE;
120 PROCEDURE A (X : ADDRESS) IS
121 BEGIN
122 B := IDENT_BOOL (TRUE);
123 END A;
125 PACKAGE BODY PKG_L IS
127 FUNCTION CREATE (X : INTEGER) RETURN LP IS
128 BEGIN
129 RETURN LP (IDENT_INT (X));
130 END CREATE;
132 FUNCTION EQUAL (X, Y : LP) RETURN BOOLEAN IS
133 BEGIN
134 RETURN X = Y;
135 END EQUAL;
137 PROCEDURE ASSIGN (X : OUT LP; Y : LP) IS
138 BEGIN
139 X := Y;
140 END ASSIGN;
142 END PKG_L;
144 PACKAGE BODY PKG_P IS
146 FUNCTION CREATE
147 ( B : BOOLEAN;
148 L : LENGTH;
149 I : INTEGER;
150 S : STRING;
151 C : COMPONENT;
152 F : FLOAT;
153 X : PARENT
154 ) RETURN PARENT
156 A : PARENT (B, L);
157 BEGIN
158 A.I := I;
159 CASE B IS
160 WHEN TRUE =>
161 A.S := S;
162 ASSIGN (A.C, C);
163 WHEN FALSE =>
164 A.F := F;
165 END CASE;
166 RETURN A;
167 END CREATE;
169 FUNCTION EQUAL (X, Y : PARENT) RETURN BOOLEAN IS
170 BEGIN
171 IF X.B /= Y.B OR X.L /= Y.L OR X.I /= Y.I THEN
172 RETURN FALSE;
173 END IF;
174 CASE X.B IS
175 WHEN TRUE =>
176 RETURN X.S = Y.S AND EQUAL (X.C, Y.C);
177 WHEN FALSE =>
178 RETURN X.F = Y.F;
179 END CASE;
180 END EQUAL;
182 FUNCTION AGGR
183 ( B : BOOLEAN;
184 L : LENGTH;
185 I : INTEGER;
186 S : STRING;
187 C : COMPONENT
188 ) RETURN PARENT
190 RESULT : PARENT (B, L);
191 BEGIN
192 RESULT.I := I;
193 RESULT.S := S;
194 ASSIGN (RESULT.C, C);
195 RETURN RESULT;
196 END AGGR;
198 FUNCTION AGGR
199 ( B : BOOLEAN;
200 L : LENGTH;
201 I : INTEGER;
202 F : FLOAT
203 ) RETURN PARENT
205 RESULT : PARENT (B, L);
206 BEGIN
207 RESULT.I := I;
208 RESULT.F := F;
209 RETURN RESULT;
210 END AGGR;
212 END PKG_P;
214 BEGIN
215 TEST ("C34006J", "CHECK THAT THE REQUIRED PREDEFINED OPERATIONS " &
216 "ARE DECLARED (IMPLICITLY) FOR DERIVED " &
217 "RECORD TYPES WITH DISCRIMINANTS AND WITH A " &
218 "LIMITED COMPONENT TYPE");
220 X.I := IDENT_INT (1);
221 X.S := IDENT_STR ("ABC");
222 ASSIGN (X.C, CREATE (4));
224 W.I := IDENT_INT (1);
225 W.S := IDENT_STR ("ABC");
226 ASSIGN (W.C, CREATE (4));
228 IF NOT EQUAL (T'(X), AGGR (TRUE, 3, 1, "ABC", C4)) THEN
229 FAILED ("INCORRECT QUALIFICATION");
230 END IF;
232 IF NOT EQUAL (T(X), AGGR (TRUE, 3, 1, "ABC", C4)) THEN
233 FAILED ("INCORRECT SELF CONVERSION");
234 END IF;
236 IF NOT EQUAL (T(W), AGGR (TRUE, 3, 1, "ABC", C4)) THEN
237 FAILED ("INCORRECT CONVERSION FROM PARENT");
238 END IF;
240 IF NOT EQUAL (PARENT(X), AGGR (TRUE, 3, 1, "ABC", C4)) OR
241 NOT EQUAL (PARENT(CREATE (FALSE, 2, 3, "XX", C5, 6.0, X)),
242 AGGR (FALSE, 2, 3, 6.0)) THEN
243 FAILED ("INCORRECT CONVERSION TO PARENT");
244 END IF;
246 IF X.B /= TRUE OR X.L /= 3 OR
247 CREATE (FALSE, 2, 3, "XX", C5, 6.0, X).B /= FALSE OR
248 CREATE (FALSE, 2, 3, "XX", C5, 6.0, X).L /= 2 THEN
249 FAILED ("INCORRECT SELECTION (DISCRIMINANT)");
250 END IF;
252 IF X.I /= 1 OR X.S /= "ABC" OR NOT EQUAL (X.C, C4) OR
253 CREATE (FALSE, 2, 3, "XX", C5, 6.0, X).I /= 3 OR
254 CREATE (FALSE, 2, 3, "XX", C5, 6.0, X).F /= 6.0 THEN
255 FAILED ("INCORRECT SELECTION (VALUE)");
256 END IF;
258 X.I := IDENT_INT (7);
259 X.S := IDENT_STR ("XYZ");
260 IF NOT EQUAL (X, AGGR (TRUE, 3, 7, "XYZ", C4)) THEN
261 FAILED ("INCORRECT SELECTION (ASSIGNMENT)");
262 END IF;
264 X.I := IDENT_INT (1);
265 X.S := IDENT_STR ("ABC");
266 IF NOT (X IN T) OR AGGR (FALSE, 2, 3, 6.0) IN T THEN
267 FAILED ("INCORRECT ""IN""");
268 END IF;
270 IF X NOT IN T OR NOT (AGGR (FALSE, 2, 3, 6.0) NOT IN T) THEN
271 FAILED ("INCORRECT ""NOT IN""");
272 END IF;
274 B := FALSE;
275 A (X'ADDRESS);
276 IF NOT B THEN
277 FAILED ("INCORRECT 'ADDRESS");
278 END IF;
280 IF NOT X'CONSTRAINED THEN
281 FAILED ("INCORRECT 'CONSTRAINED");
282 END IF;
284 IF X.C'FIRST_BIT < 0 THEN
285 FAILED ("INCORRECT 'FIRST_BIT");
286 END IF;
288 IF X.C'LAST_BIT < 0 OR
289 X.C'LAST_BIT - X.C'FIRST_BIT + 1 /= X.C'SIZE THEN
290 FAILED ("INCORRECT 'LAST_BIT");
291 END IF;
293 IF X.C'POSITION < 0 THEN
294 FAILED ("INCORRECT 'POSITION");
295 END IF;
297 IF X'SIZE < T'SIZE THEN
298 COMMENT ("X'SIZE < T'SIZE");
299 ELSIF X'SIZE = T'SIZE THEN
300 COMMENT ("X'SIZE = T'SIZE");
301 ELSE
302 COMMENT ("X'SIZE > T'SIZE");
303 END IF;
305 RESULT;
306 EXCEPTION
307 WHEN OTHERS =>
308 FAILED ("UNEXPECTED EXCEPTION RAISED WHILE CHECKING BASIC " &
309 "OPERATIONS");
310 RESULT;
311 END C34006J;