URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [testsuite/] [ada/] [acats/] [tests/] [c3/] [c393008.a] - Rev 720
Compare with Previous | Blame | View Log
-- C393008.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.--*---- TEST OBJECTIVE:-- Check that an extended type can be derived from an abstract type.---- TEST DESCRIPTION:-- Declare a tagged record; declare an abstract-- primitive operation and a non-abstract primitive operation of the-- type. Derive an extended type from it, including a new component.-- Use the derived type, the overriding operation and the inherited-- operation to instantiate a generic package. The overriding operation-- calls a new primitive operation and an inherited operation [so the-- instantiation must get this sorted out correctly].------ CHANGE HISTORY:-- 06 Dec 94 SAIC ACVC 2.0----!with Report;with TCTouch;procedure C393008 ispackage C393008_0 istype Status_Enum is (No_Status, Handled, Unhandled, Pending);type Alert_Type is abstract tagged recordStatus : Status_Enum;Reply : Boolean;Urgent : Boolean;end record;subtype Serial_Number is Integer range 0..Integer'last;Serial_Num : Serial_Number := 0;procedure Handle (A : in out Alert_Type) is abstract;-- abstract primitive operation-- the procedure Init would be _nice_ have this procedure be non_abstract-- and create a "base" object with a "null" constraint. The language-- will not allow this due to the restriction that an object of an-- abstract type cannot be created. Hence Init must be abstract,-- requiring any type derived directly from Alert_Type to declare-- an Init.---- In light of this, I have changed init to a function to more closely-- model the typical usage of OO features...function Init return Alert_Type is abstract;procedure No_Reply (A : in out Alert_Type);end C393008_0;--=======================================================================--package body C393008_0 isprocedure No_Reply (A : in out Alert_Type) isbegin -- primitive operation, not abstractTCTouch.Touch('A'); ------------------------------------------------- Aif A.Status = Handled thenA.Reply := False;end if;end No_Reply;end C393008_0;--=======================================================================--generic-- pass in the Alert_Type object, including its-- operationstype Data_Type is new C393008_0.Alert_Type with private;-- note that Alert_Type is abstract, so it may not be-- used as an actual parameterwith procedure Update (P : in out Data_Type) is <>; -- generic formalwith function Initialize return Data_Type is <>; -- generic formalpackage C393008_1 is-- Utilitiesprocedure Modify (Item : in out Data_Type);end C393008_1;-- Utilities--=======================================================================--package body C393008_1 is-- Utilitiesprocedure Modify (Item : in out Data_Type) isbeginTCTouch.Touch('B'); --------------------------------------------- BItem := Initialize;Update (Item);end Modify;end C393008_1;--=======================================================================--package C393008_2 istype Low_Alert_Type is new C393008_0.Alert_Type with recordSerial : C393008_0.Serial_Number;end record;procedure Serialize (LA : in out Low_Alert_Type);-- inherit No_Replyprocedure Handle (LA : in out Low_Alert_Type);function Init return Low_Alert_Type;end C393008_2;package body C393008_2 isprocedure Serialize (LA : in out Low_Alert_Type) isbegin -- new primitive operationTCTouch.Touch('C'); ------------------------------------------------- CC393008_0.Serial_Num := C393008_0.Serial_Num + 1;LA.Serial := C393008_0.Serial_Num;end Serialize;-- inherit No_Replyfunction Init return Low_Alert_Type isTA: Low_Alert_Type;beginTCTouch.Touch('D'); ------------------------------------------------- DSerialize( TA );TA.Status := C393008_0.No_Status;return TA;end Init;procedure Handle (LA : in out Low_Alert_Type) isbegin -- overrides abstract inherited HandleTCTouch.Touch('E'); ------------------------------------------------- ESerialize (LA);LA.Reply := False;LA.Status := C393008_0.Handled;No_Reply (LA);end Handle;end C393008_2;use C393008_2;package Alert_Utilities is newC393008_1 (Data_Type => Low_Alert_Type,Update => Handle, -- Low_Alert's HandleInitialize => Init); -- inherited from AlertItem : Low_Alert_Type;use type C393008_0.Status_Enum;beginReport.Test ("C393008", "Check that an extended type can be derived "&"from an abstract type");Item := Init;if (Item.Status /= C393008_0.No_Status) or (Item.Serial /=1) thenReport.Failed ("Wrong initialization");end if;TCTouch.Validate("DC", "Initialization Call");Alert_Utilities.Modify (Item);if (Item.Status /= C393008_0.Handled) or (Item.Serial /= 3) thenReport.Failed ("Wrong results from Modify");end if;TCTouch.Validate("BDCECA", "Generic Instance Call");Report.Result;end C393008;
