-- C730002.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 view of a private extension may be derived -- indirectly from the ancestor type (i.e., the parent type of the full -- type may be any descendant of the ancestor type). Check that, for -- a primitive subprogram of the private extension that is inherited from -- the ancestor type and not overridden, the formal parameter names and -- default expressions come from the corresponding primitive subprogram -- of the ancestor type, while the body comes from that of the parent -- type. -- Check for a case where the parent type is derived from the ancestor -- type through a series of types produced by generic instantiations. -- Examine both the static and dynamic binding cases. -- -- TEST DESCRIPTION: -- Consider: -- -- package P is -- type Ancestor is tagged ... -- procedure Op (P1: Ancestor; P2: Boolean := True); -- end P; -- -- with P; -- generic -- type T is new P.Ancestor with private; -- package Gen1 is -- type Enhanced is new T with private; -- procedure Op (A: Enhanced; B: Boolean := True); -- -- other specific procedures... -- private -- type Enhanced is new T with ... -- end Gen1; -- -- with P, Gen1; -- package N is new Gen1 (P.Ancestor); -- -- with N; -- generic -- type T is new N.Enhanced with private; -- package Gen2 is -- type Enhanced_Again is new T with private; -- procedure Op (X: Enhanced_Again; Y: Boolean := False); -- -- other specific procedures... -- private -- type Enhanced_Again is new T with ... -- end Gen2; -- -- with N, Gen2; -- package Q is new Gen2 (N.Enhanced); -- -- with P, Q; -- package R is -- type Priv_Ext is new P.Ancestor with private; -- (A) -- -- Inherits procedure Op (P1: Priv_Ext; P2: Boolean := True); -- -- But body executed is that of Q.Op. -- private -- type Priv_Ext is new Q.Enhanced_Again with record ... -- (B) -- end R; -- -- The ancestor type in (A) differs from the parent type in (B); the -- parent of the full type is descended from the ancestor type of the -- private extension, in this case through a series of types produced -- by generic instantiations. Gen1 redefines the implementation of Op -- for any type that has one. N is an instance of Gen1 for the ancestor -- type. Gen2 again redefines the implementation of Op for any type that -- has one. Q is an instance of Gen2 for the extension of the P.Ancestor -- declared in N. Both N and Q could define other operations which we -- don't want to be available in R. For a call to Op (from outside the -- scope of the full view) with an operand of type R.Priv_Ext, the body -- executed will be that of Q.Op (the parent type's version), but the -- formal parameter names and default expression come from that of P.Op -- (the ancestor type's version). -- -- -- CHANGE HISTORY: -- 06 Dec 94 SAIC ACVC 2.0 -- 27 Feb 97 CTA.PWB Added elaboration pragmas. --! package C730002_0 is type Hours_Type is range 0..1000; type Personnel_Type is range 0..10; type Specialist_ID is (Manny, Moe, Jack, Curly, Joe, Larry); type Engine_Type is tagged record Ave_Repair_Time : Hours_Type := 0; -- Default init. for Personnel_Required : Personnel_Type := 0; -- component fields. Specialist : Specialist_ID := Manny; end record; procedure Routine_Maintenance (Engine : in out Engine_Type ; Specialist : in Specialist_ID := Moe); -- The Routine_Maintenance procedure implements the processing required -- for an engine. end C730002_0; --==================================================================-- package body C730002_0 is procedure Routine_Maintenance (Engine : in out Engine_Type ; Specialist : in Specialist_ID := Moe) is begin Engine.Ave_Repair_Time := 3; Engine.Personnel_Required := 1; Engine.Specialist := Specialist; end Routine_Maintenance; end C730002_0; --==================================================================-- with C730002_0; use C730002_0; generic type T is new C730002_0.Engine_Type with private; package C730002_1 is -- This generic package contains types/procedures specific to engines -- of the diesel variety. type Repair_Facility_Type is (On_Site, Repair_Shop, Factory); type Diesel_Series is new T with private; procedure Routine_Maintenance (Eng : in out Diesel_Series; Spec_Req : in Specialist_ID := Jack); -- Other diesel specific operations... (not required in this test). private type Diesel_Series is new T with record Repair_Facility_Required : Repair_Facility_Type := On_Site; end record; end C730002_1; --==================================================================-- package body C730002_1 is procedure Routine_Maintenance (Eng : in out Diesel_Series; Spec_Req : in Specialist_ID := Jack) is begin Eng.Ave_Repair_Time := 6; Eng.Personnel_Required := 2; Eng.Specialist := Spec_Req; Eng.Repair_Facility_Required := On_Site; end Routine_Maintenance; end C730002_1; --==================================================================-- with C730002_0; with C730002_1; pragma Elaborate (C730002_1); package C730002_2 is new C730002_1 (C730002_0.Engine_Type); --==================================================================-- with C730002_0; use C730002_0; with C730002_2; use C730002_2; generic type T is new C730002_2.Diesel_Series with private; package C730002_3 is type Time_Of_Operation_Type is range 0..100_000; type Electric_Series is new T with private; procedure Routine_Maintenance (E : in out Electric_Series; SR : in Specialist_ID := Curly); -- Other electric specific operations... (not required in this test). private type Electric_Series is new T with record Mean_Time_Between_Repair : Time_Of_Operation_Type := 0; end record; end C730002_3; --==================================================================-- package body C730002_3 is procedure Routine_Maintenance (E : in out Electric_Series; SR : in Specialist_ID := Curly) is begin E.Ave_Repair_Time := 9; E.Personnel_Required := 3; E.Specialist := SR; E.Mean_Time_Between_Repair := 1000; end Routine_Maintenance; end C730002_3; --==================================================================-- with C730002_2; with C730002_3; pragma Elaborate (C730002_3); package C730002_4 is new C730002_3 (C730002_2.Diesel_Series); --==================================================================-- with C730002_0; use C730002_0; with C730002_4; use C730002_4; package C730002_5 is type Inspection_Type is (AAA, MIL_STD, NRC); type Nuclear_Series is new Engine_Type with private; -- (A) -- Inherits procedure Routine_Maintenance from ancestor; does not override. -- (Engine : in out Nuclear_Series; -- Specialist : in Specialist_ID := Moe); -- But body executed will be that of C730002_4.Routine_Maintenance, -- the parent type. function TC_Specialist (E : Nuclear_Series) return Specialist_ID; function TC_Personnel_Required (E : Nuclear_Series) return Personnel_Type; function TC_Time_Required (E : Nuclear_Series) return Hours_Type; -- Dispatching subprogram. procedure Maintain_The_Engine (The_Engine : in out Engine_Type'Class); private type Nuclear_Series is new Electric_Series with record -- (B) Inspector_Rep : Inspection_Type := NRC; end record; -- The ancestor type is used in the type extension (A), while the parent -- of the full type (B) is a descendent of the ancestor type, through a -- series of types produced by generic instantiation. end C730002_5; --==================================================================-- package body C730002_5 is function TC_Specialist (E : Nuclear_Series) return Specialist_ID is begin return E.Specialist; end TC_Specialist; function TC_Personnel_Required (E : Nuclear_Series) return Personnel_Type is begin return E.Personnel_Required; end TC_Personnel_Required; function TC_Time_Required (E : Nuclear_Series) return Hours_Type is begin return E.Ave_Repair_Time; end TC_Time_Required; -- Dispatching subprogram. procedure Maintain_The_Engine (The_Engine : in out Engine_Type'Class) is begin Routine_Maintenance (The_Engine); end Maintain_The_Engine; end C730002_5; --==================================================================-- with Report; with C730002_0; use C730002_0; with C730002_2; use C730002_2; with C730002_4; use C730002_4; with C730002_5; use C730002_5; procedure C730002 is begin Report.Test ("C730002", "Check that the full view of a private " & "extension may be derived indirectly from " & "the ancestor type. Check for a case where " & "the parent type is derived from the ancestor " & "type through a series of types produced by " & "generic instantiations"); Test_Block: declare Nuclear_Drive : Nuclear_Series; Warp_Drive : Nuclear_Series; begin -- Non-Dispatching Case: -- Call Routine_Maintenance using formal parameter name from -- C730002_0.Routine_Maintenance (ancestor version). -- Give no second parameter so that the default expression must be -- used. Routine_Maintenance (Engine => Nuclear_Drive); -- The value of the Specialist component should equal "Moe", -- which is the default value from the ancestor's version of -- Routine_Maintenance, and not the default value from the parent's -- version of Routine_Maintenance. if TC_Specialist (Nuclear_Drive) /= Moe then Report.Failed ("Default expression for ancestor op not used " & " - non-dispatching case"); end if; -- However the value of the Ave_Repair_Time and Personnel_Required -- components should be those assigned in the parent type's version -- of the body of Routine_Maintenance. -- Note: Only components associated with the ancestor type are -- evaluated for the purposes of this test. if TC_Personnel_Required (Nuclear_Drive) /= 3 or TC_Time_Required (Nuclear_Drive) /= 9 then Report.Failed("Wrong body was executed - non-dispatching case"); end if; -- Dispatching Case: -- Use a dispatching subprogram to ensure that the correct body is -- used at runtime. Maintain_The_Engine (Warp_Drive); -- The resulting assignments to the fields of the Warp_Drive variable -- should be the same as those of the Nuclear_Drive above, indicating -- that the body of the parent version of the inherited subprogram -- was used. if TC_Specialist (Warp_Drive) /= Moe then Report.Failed ("Default expression for ancestor op not used - dispatching case"); end if; if TC_Personnel_Required (Nuclear_Drive) /= 3 or TC_Time_Required (Nuclear_Drive) /= 9 then Report.Failed("Wrong body was executed - dispatching case"); end if; exception when others => Report.Failed("Exception raised in Test_Block"); end Test_Block; Report.Result; end C730002;