summaryrefslogtreecommitdiff
path: root/gcc/testsuite/ada/acats/tests/c3/c3a1001.a
blob: 9b05b5da254992a12d96baf221b734a04b6f6f03 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
-- C3A1001.A
--
--                             Grant of Unlimited Rights
--
--     Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
--     F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained 
--     unlimited rights in the software and documentation contained herein.
--     Unlimited rights are defined in DFAR 252.227-7013(a)(19).  By making 
--     this public release, the Government intends to confer upon all 
--     recipients unlimited rights  equal to those held by the Government.  
--     These rights include rights to use, duplicate, release or disclose the 
--     released technical data and computer software in whole or in part, in 
--     any manner and for any purpose whatsoever, and to have or permit others 
--     to do so.
--
--                                    DISCLAIMER
--
--     ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
--     DISCLOSED ARE AS IS.  THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED 
--     WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
--     SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE 
--     OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
--     PARTICULAR PURPOSE OF SAID MATERIAL.
--*
--
-- OBJECTIVE:
--      Check that the full type completing a type with no discriminant part
--      or an unknown discriminant part may have explicitly declared or
--      inherited discriminants.
--      Check for cases where the types are records and protected types.
--
-- TEST DESCRIPTION:
--      Declare two groups of incomplete types: one group with no discriminant 
--      part and one group with unknown discriminant part.  Both groups of 
--      incomplete types are completed with both explicit and inherited 
--      discriminants.  Discriminants for record and protected types are 
--      declared with default and non default values.
--      In the main program, verify that objects of both groups of incomplete 
--      types can be created by default values or by assignments.
--
--
-- CHANGE HISTORY:
--      11 Oct 95   SAIC    Initial prerelease version.
--      11 Nov 96   SAIC    Revised for version 2.1.
--
--!

package C3A1001_0 is

   type Incomplete1 (<>);                          -- unknown discriminant

   type Incomplete2;                               -- no discriminant

   type Incomplete3 (<>);                          -- unknown discriminant

   type Incomplete4;                               -- no discriminant

   type Incomplete5 (<>);                          -- unknown discriminant

   type Incomplete6;                               -- no discriminant

   type Incomplete8;                               -- no discriminant

   subtype Small_Int is Integer range 1 .. 10;

   type Enu_Type is (M, F);

   type Incomplete1 (Disc : Enu_Type) is           -- unknown discriminant/
     record                                        -- explicit discriminant 
        case Disc is
           when M => MInteger : Small_Int := 3;
           when F => FInteger : Small_Int := 8;
        end case;
     end record;

   type Incomplete2 (Disc : Small_Int := 8) is     -- no discriminant/  
     record                                        -- explicit discriminant 
        ID : String (1 .. Disc) := "Plymouth";
     end record;

   type Incomplete3 is new Incomplete2;            -- unknown discriminant/
                                                   -- inherited discriminant

   type Incomplete4 is new Incomplete2;            -- no discriminant/  
                                                   -- inherited discriminant   
                                                   
   protected type Incomplete5                      -- unknown discriminant/
     (Disc : Enu_Type) is                          -- explicit discriminant
        function Get_Priv_Val return Enu_Type;     
   private
      Enu_Obj : Enu_Type := Disc;
   end Incomplete5;    

   protected type Incomplete6                      -- no discriminant/  
     (Disc : Small_Int := 1) is                    -- explicit discriminant
        function Get_Priv_Val return Small_Int;    -- with default
   private
      Num : Small_Int := Disc;
   end Incomplete6;

   type Incomplete8 (Disc : Small_Int) is          -- no discriminant/  
     record                                        -- explicit discriminant
       Str : String (1 .. Disc);                   -- no default
     end record;

   type Incomplete9 is new Incomplete8;

   function Return_String (S : String) return String;

end C3A1001_0;

     --==================================================================--

with Report;

package body C3A1001_0 is

   protected body Incomplete5 is    

      function Get_Priv_Val return Enu_Type is
      begin
         return Enu_Obj;
      end Get_Priv_Val; 

    end Incomplete5; 

   ----------------------------------------------------------------------
   protected body Incomplete6 is                                             
            
      function Get_Priv_Val return Small_Int is
      begin
         return Num;
      end Get_Priv_Val; 

    end Incomplete6; 

   ----------------------------------------------------------------------
   function Return_String (S : String) return String is
   begin
      if Report.Ident_Bool(True) = True then
         return S;
      end if;

      return S;
   end Return_String;
   
end C3A1001_0;

     --==================================================================--

with Report;

with C3A1001_0;
use  C3A1001_0;

procedure C3A1001 is

   -- Discriminant value comes from default.

   Incomplete2_Obj_1 :  Incomplete2;                

   Incomplete4_Obj_1 :  Incomplete4;

   Incomplete6_Obj_1 :  Incomplete6;                

   -- Discriminant value comes from explicit constraint.

   Incomplete1_Obj_1 :  Incomplete1 (F);              

   Incomplete5_Obj_1 :  Incomplete5 (M);               

   Incomplete6_Obj_2 :  Incomplete6 (2);           

   -- Discriminant value comes from assignment.        

   Incomplete3_Obj_1 :  Incomplete3 := (Disc => 6, ID => "Sentra");       

   Incomplete1_Obj_2 :  Incomplete1 := (Disc => M, MInteger => 9);    
                                  
   Incomplete2_Obj_2 :  Incomplete2 := (Disc => 5, ID => "Buick");    
                                  
begin

   Report.Test ("C3A1001", "Check that the full type completing a type " &
                "with no discriminant part or an unknown discriminant "  &
                "part may have explicitly declared or inherited "        &
                "discriminants.  Check for cases where the types are "   &
                "records and protected types");

   -- Check the initial values.

   if (Incomplete2_Obj_1.Disc /= 8) or
      (Incomplete2_Obj_1.ID   /= "Plymouth") then
         Report.Failed ("Wrong initial values for Incomplete2_Obj_1");
   end if;

   if (Incomplete4_Obj_1.Disc /= 8) or
      (Incomplete4_Obj_1.ID   /= "Plymouth") then
         Report.Failed ("Wrong initial values for Incomplete4_Obj_1");
   end if;

   if (Incomplete6_Obj_1.Disc         /= 1) or
      (Incomplete6_Obj_1.Get_Priv_Val /= 1) then
         Report.Failed ("Wrong initial value for Incomplete6_Obj_1");
   end if;

   -- Check the explicit values.

   if (Incomplete1_Obj_1.Disc     /= F) or 
      (Incomplete1_Obj_1.FInteger /= 8) then
         Report.Failed ("Wrong values for Incomplete1_Obj_1");
   end if;

   if (Incomplete5_Obj_1.Disc         /= M) or  
      (Incomplete5_Obj_1.Get_Priv_Val /= M) then
         Report.Failed ("Wrong value for Incomplete5_Obj_1");
   end if;

   if (Incomplete6_Obj_2.Disc         /= 2) or
      (Incomplete6_Obj_2.Get_Priv_Val /= 2) then
         Report.Failed ("Wrong value for Incomplete6_Obj_2");
   end if;

   -- Check the assigned values.

   if (Incomplete3_Obj_1.Disc /= 6) or 
      (Incomplete3_Obj_1.ID   /= "Sentra") then
         Report.Failed ("Wrong values for Incomplete3_Obj_1");
   end if;

   if (Incomplete1_Obj_2.Disc     /= M) or
      (Incomplete1_Obj_2.MInteger /= 9) then
         Report.Failed ("Wrong values for Incomplete1_Obj_2");
   end if;

   if (Incomplete2_Obj_2.Disc /= 5) or 
      (Incomplete2_Obj_2.ID   /= "Buick") then
         Report.Failed ("Wrong values for Incomplete2_Obj_2");
   end if;

   -- Make sure that assignments work without problems.

   Incomplete1_Obj_1.FInteger := 1;

   -- Avoid optimization (dead variable removal of FInteger):

   if Incomplete1_Obj_1.FInteger /= Report.Ident_Int(1) 
      then  
         Report.Failed ("Wrong value stored in Incomplete1_Obj_1.FInteger");
   end if;

   Incomplete2_Obj_1.ID       := Return_String ("12345678");

   -- Avoid optimization (dead variable removal of ID)

   if Incomplete2_Obj_1.ID /= Return_String ("12345678")
     then   
        Report.Failed ("Wrong values for Incomplete8_Obj_1.ID");
   end if;

   Incomplete4_Obj_1.ID       := Return_String ("87654321");

   -- Avoid optimization (dead variable removal of ID)

   if Incomplete4_Obj_1.ID /= Return_String ("87654321")
     then   
        Report.Failed ("Wrong values for Incomplete4_Obj_1.ID");
   end if;


   Test1:
   declare
   
      Incomplete8_Obj_1 :  Incomplete8 (10);

   begin
      Incomplete8_Obj_1.Str := "Merry Xmas";

      -- Avoid optimization (dead variable removal of Str):

      if Return_String (Incomplete8_Obj_1.Str) /= "Merry Xmas"
        then   
           Report.Failed ("Wrong values for Incomplete8_Obj_1.Str");
      end if;

   exception
      when Constraint_Error =>
          Report.Failed ("Constraint_Error raised in Incomplete8_Obj_1");

   end Test1;

   Test2:
   declare

      Incomplete8_Obj_2 :  Incomplete8 (5);

   begin
      Incomplete8_Obj_2.Str := "Happy";       

      -- Avoid optimization (dead variable removal of Str):

      if Return_String (Incomplete8_Obj_2.Str) /= "Happy"               
        then   
           Report.Failed ("Wrong values for Incomplete8_Obj_1.Str");
      end if;

   exception
      when Constraint_Error =>
          Report.Failed ("Constraint_Error raised in Incomplete8_Obj_2");

   end Test2;

   Report.Result;

end C3A1001;