c730002.a
来自「用于进行gcc测试」· A 代码 · 共 384 行
A
384 行
-- 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 isbegin 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;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?