1-- C730002.A
2--
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.
15--
16--                                    DISCLAIMER
17--
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--
26-- OBJECTIVE:
27--      Check that the full view of a private extension may be derived
28--      indirectly from the ancestor type (i.e., the parent type of the full
29--      type may be any descendant of the ancestor type). Check that, for
30--      a primitive subprogram of the private extension that is inherited from
31--      the ancestor type and not overridden, the formal parameter names and
32--      default expressions come from the corresponding primitive subprogram
33--      of the ancestor type, while the body comes from that of the parent
34--      type.
35--      Check for a case where the parent type is derived from the ancestor
36--      type through a series of types produced by generic instantiations.
37--      Examine both the static and dynamic binding cases.
38--
39-- TEST DESCRIPTION:
40--      Consider:
41--
42--      package P is
43--         type Ancestor is tagged ...
44--         procedure Op (P1: Ancestor; P2: Boolean := True);
45--      end P;
46--
47--      with P;
48--      generic
49--         type T is new P.Ancestor with private;
50--      package Gen1 is
51--         type Enhanced is new T with private;
52--         procedure Op (A: Enhanced; B: Boolean := True);
53--         -- other specific procedures...
54--      private
55--         type Enhanced is new T with ...
56--      end Gen1;
57--
58--      with P, Gen1;
59--      package N is new Gen1 (P.Ancestor);
60--
61--      with N;
62--      generic
63--         type T is new N.Enhanced with private;
64--      package Gen2 is
65--         type Enhanced_Again is new T with private;
66--         procedure Op (X: Enhanced_Again; Y: Boolean := False);
67--         -- other specific procedures...
68--      private
69--         type Enhanced_Again is new T with ...
70--      end Gen2;
71--
72--      with N, Gen2;
73--      package Q is new Gen2 (N.Enhanced);
74--
75--      with P, Q;
76--      package R is
77--         type Priv_Ext is new P.Ancestor with private;         -- (A)
78--         -- Inherits procedure Op (P1: Priv_Ext; P2: Boolean := True);
79--         -- But body executed is that of Q.Op.
80--      private
81--         type Priv_Ext is new Q.Enhanced_Again with record ... -- (B)
82--      end R;
83--
84--      The ancestor type in (A) differs from the parent type in (B); the
85--      parent of the full type is descended from the ancestor type of the
86--      private extension, in this case through a series of types produced
87--      by generic instantiations.  Gen1 redefines the implementation of Op
88--      for any type that has one.  N is an instance of Gen1 for the ancestor
89--      type. Gen2 again redefines the implementation of Op for any type that
90--      has one. Q is an instance of Gen2 for the extension of the P.Ancestor
91--      declared in N.  Both N and Q could define other operations which we
92--      don't want to be available in R.  For a call to Op (from outside the
93--      scope of the full view) with an operand of type R.Priv_Ext, the body
94--      executed will be that of Q.Op (the parent type's version), but the
95--      formal parameter names and default expression come from that of P.Op
96--      (the ancestor type's version).
97--
98--
99-- CHANGE HISTORY:
100--      06 Dec 94   SAIC    ACVC 2.0
101--      27 Feb 97   CTA.PWB Added elaboration pragmas.
102--!
103
104package C730002_0 is
105
106   type Hours_Type      is range 0..1000;
107   type Personnel_Type  is range 0..10;
108   type Specialist_ID is (Manny, Moe, Jack, Curly, Joe, Larry);
109
110   type Engine_Type is tagged record
111      Ave_Repair_Time    : Hours_Type     := 0;     -- Default init. for
112      Personnel_Required : Personnel_Type := 0;     -- component fields.
113      Specialist         : Specialist_ID  := Manny;
114   end record;
115
116   procedure Routine_Maintenance (Engine     : in out Engine_Type ;
117                                  Specialist : in     Specialist_ID := Moe);
118
119   -- The Routine_Maintenance procedure implements the processing required
120   -- for an engine.
121
122end C730002_0;
123
124     --==================================================================--
125
126package body C730002_0 is
127
128   procedure Routine_Maintenance (Engine     : in out Engine_Type ;
129                                  Specialist : in     Specialist_ID := Moe) is
130   begin
131      Engine.Ave_Repair_Time     := 3;
132      Engine.Personnel_Required  := 1;
133      Engine.Specialist := Specialist;
134   end Routine_Maintenance;
135
136end C730002_0;
137
138     --==================================================================--
139
140with C730002_0; use C730002_0;
141generic
142   type T is new C730002_0.Engine_Type with private;
143package C730002_1 is
144
145   -- This generic package contains types/procedures specific to engines
146   -- of the diesel variety.
147
148   type Repair_Facility_Type is (On_Site, Repair_Shop, Factory);
149
150   type Diesel_Series is new T with private;
151
152   procedure Routine_Maintenance (Eng      : in out Diesel_Series;
153                                  Spec_Req : in     Specialist_ID := Jack);
154
155   -- Other diesel specific operations... (not required in this test).
156
157private
158
159   type Diesel_Series is new T with record
160      Repair_Facility_Required : Repair_Facility_Type := On_Site;
161   end record;
162
163end C730002_1;
164
165     --==================================================================--
166
167package body C730002_1 is
168
169   procedure Routine_Maintenance (Eng      : in out Diesel_Series;
170                                  Spec_Req : in     Specialist_ID := Jack) is
171   begin
172      Eng.Ave_Repair_Time          := 6;
173      Eng.Personnel_Required       := 2;
174      Eng.Specialist               := Spec_Req;
175      Eng.Repair_Facility_Required := On_Site;
176   end Routine_Maintenance;
177
178end C730002_1;
179
180     --==================================================================--
181
182with C730002_0;
183with C730002_1;
184pragma Elaborate (C730002_1);
185package C730002_2 is new C730002_1 (C730002_0.Engine_Type);
186
187     --==================================================================--
188
189with C730002_0; use C730002_0;
190with C730002_2; use C730002_2;
191generic
192  type T is new C730002_2.Diesel_Series with private;
193package C730002_3 is
194
195   type Time_Of_Operation_Type is range 0..100_000;
196
197   type Electric_Series is new T with private;
198
199   procedure Routine_Maintenance (E  : in out Electric_Series;
200                                  SR : in     Specialist_ID := Curly);
201
202   -- Other electric specific operations... (not required in this test).
203
204private
205
206   type Electric_Series is new T with record
207      Mean_Time_Between_Repair : Time_Of_Operation_Type := 0;
208   end record;
209
210end C730002_3;
211
212     --==================================================================--
213
214package body C730002_3 is
215
216   procedure Routine_Maintenance (E  : in out Electric_Series;
217                                  SR : in     Specialist_ID := Curly) is
218   begin
219      E.Ave_Repair_Time          := 9;
220      E.Personnel_Required       := 3;
221      E.Specialist               := SR;
222      E.Mean_Time_Between_Repair := 1000;
223   end Routine_Maintenance;
224
225end C730002_3;
226
227     --==================================================================--
228
229with C730002_2;
230with C730002_3;
231pragma Elaborate (C730002_3);
232package C730002_4 is new C730002_3 (C730002_2.Diesel_Series);
233
234     --==================================================================--
235
236with C730002_0;  use C730002_0;
237with C730002_4;  use C730002_4;
238
239package C730002_5 is
240
241   type Inspection_Type is (AAA, MIL_STD, NRC);
242
243   type Nuclear_Series is new Engine_Type with private;              -- (A)
244
245   -- Inherits procedure Routine_Maintenance from ancestor; does not override.
246   --                      (Engine     : in out Nuclear_Series;
247   --                       Specialist : in     Specialist_ID := Moe);
248   -- But body executed will be that of C730002_4.Routine_Maintenance,
249   -- the parent type.
250
251   function TC_Specialist         (E : Nuclear_Series) return Specialist_ID;
252   function TC_Personnel_Required (E : Nuclear_Series) return Personnel_Type;
253   function TC_Time_Required      (E : Nuclear_Series) return Hours_Type;
254
255   -- Dispatching subprogram.
256   procedure Maintain_The_Engine (The_Engine : in out Engine_Type'Class);
257
258private
259
260   type Nuclear_Series is new Electric_Series with record           -- (B)
261      Inspector_Rep : Inspection_Type := NRC;
262   end record;
263
264   -- The ancestor type is used in the type extension (A), while the parent
265   -- of the full type (B) is a descendent of the ancestor type, through a
266   -- series of types produced by generic instantiation.
267
268end C730002_5;
269
270     --==================================================================--
271
272package body C730002_5 is
273
274   function TC_Specialist (E : Nuclear_Series) return Specialist_ID is
275   begin
276      return E.Specialist;
277   end TC_Specialist;
278
279   function TC_Personnel_Required (E : Nuclear_Series)
280     return Personnel_Type is
281   begin
282      return E.Personnel_Required;
283   end TC_Personnel_Required;
284
285   function TC_Time_Required (E : Nuclear_Series) return Hours_Type is
286   begin
287      return E.Ave_Repair_Time;
288   end TC_Time_Required;
289
290   -- Dispatching subprogram.
291   procedure Maintain_The_Engine (The_Engine : in out Engine_Type'Class) is
292   begin
293      Routine_Maintenance (The_Engine);
294   end Maintain_The_Engine;
295
296
297end C730002_5;
298
299     --==================================================================--
300
301with Report;
302with C730002_0;  use C730002_0;
303with C730002_2;  use C730002_2;
304with C730002_4;  use C730002_4;
305with C730002_5;  use C730002_5;
306
307procedure C730002 is
308begin
309
310   Report.Test ("C730002", "Check that the full view of a private "        &
311                           "extension may be derived indirectly from "     &
312                           "the ancestor type.  Check for a case where "   &
313                           "the parent type is derived from the ancestor " &
314                           "type through a series of types produced by "   &
315                           "generic instantiations");
316
317   Test_Block:
318   declare
319      Nuclear_Drive : Nuclear_Series;
320      Warp_Drive    : Nuclear_Series;
321   begin
322
323      -- Non-Dispatching Case:
324      -- Call Routine_Maintenance using formal parameter name from
325      -- C730002_0.Routine_Maintenance (ancestor version).
326      -- Give no second parameter so that the default expression must be
327      -- used.
328
329      Routine_Maintenance (Engine => Nuclear_Drive);
330
331      -- The value of the Specialist component should equal "Moe",
332      -- which is the default value from the ancestor's version of
333      -- Routine_Maintenance, and not the default value from the parent's
334      -- version of Routine_Maintenance.
335
336      if TC_Specialist (Nuclear_Drive) /= Moe then
337         Report.Failed
338           ("Default expression for ancestor op not used " &
339            " - non-dispatching case");
340      end if;
341
342      -- However the value of the Ave_Repair_Time and Personnel_Required
343      -- components should be those assigned in the parent type's version
344      -- of the body of Routine_Maintenance.
345      -- Note: Only components associated with the ancestor type are
346      --       evaluated for the purposes of this test.
347
348      if TC_Personnel_Required (Nuclear_Drive) /= 3  or
349         TC_Time_Required (Nuclear_Drive)      /= 9
350      then
351         Report.Failed("Wrong body was executed - non-dispatching case");
352      end if;
353
354      -- Dispatching Case:
355      -- Use a dispatching subprogram to ensure that the correct body is
356      -- used at runtime.
357
358      Maintain_The_Engine (Warp_Drive);
359
360      -- The resulting assignments to the fields of the Warp_Drive variable
361      -- should be the same as those of the Nuclear_Drive above, indicating
362      -- that the body of the parent version of the inherited subprogram
363      -- was used.
364
365      if TC_Specialist (Warp_Drive) /= Moe then
366         Report.Failed
367           ("Default expression for ancestor op not used - dispatching case");
368      end if;
369
370      if TC_Personnel_Required (Nuclear_Drive) /= 3  or
371         TC_Time_Required (Nuclear_Drive)      /= 9
372      then
373         Report.Failed("Wrong body was executed - dispatching case");
374      end if;
375
376
377   exception
378      when others => Report.Failed("Exception raised in Test_Block");
379   end Test_Block;
380
381   Report.Result;
382
383end C730002;
384