-- CC51002.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, for formal derived tagged types, the formal parameter -- names and default expressions for a primitive subprogram in an -- instance are determined by the primitive subprogram of the ancestor -- type, but that the primitive subprogram body executed is that of the -- actual type. -- -- TEST DESCRIPTION: -- Define a root tagged type in a library-level package and give it a -- primitive subprogram. Provide a default expression for a non-tagged -- parameter of the subprogram. Declare a library-level generic subprogram -- with a formal derived type using the root type as ancestor. Call -- the primitive subprogram of the root type using named association for -- the tagged parameter, and provide no actual for the defaulted -- parameter. Extend the root type in a second package and override the -- root type's subprogram with one which has different parameter names -- and no default expression for the non-tagged parameter. Instantiate -- the generic subprogram for each of the tagged types in the class and -- call the instances. -- -- -- CHANGE HISTORY: -- 06 Dec 94 SAIC ACVC 2.0 -- --! package CC51002_0 is -- Root message type and operations. type Recipients is (None, Root, Sysop, Local, Remote); type Msg_Type is tagged record -- Root type of Text : String (1 .. 10); -- class. end record; function Send (Msg : in Msg_Type; -- Primitive To : Recipients := Local) return Boolean; -- subprogram. -- ...Other message operations. end CC51002_0; --==================================================================-- package body CC51002_0 is -- The implementation of Send is purely artificial; the validity of -- its implementation in the context of the abstraction is irrelevant to -- the feature being tested. function Send (Msg : in Msg_Type; To : Recipients := Local) return Boolean is begin return (Msg.Text = "Greetings!" and To = Local); end Send; end CC51002_0; --==================================================================-- with CC51002_0; -- Root message type and operations. generic -- Message class function. type Msg_Block is new CC51002_0.Msg_Type with private; function CC51002_1 (M : in Msg_Block) return Boolean; --==================================================================-- function CC51002_1 (M : in Msg_Block) return Boolean is Okay : Boolean := False; begin -- The call to Send below uses the ancestor type's parameter name, which -- should be legal even if the actual subprogram called does not have a -- parameter of that name. Furthermore, it uses the ancestor type's default -- expression for the second parameter, which should be legal even if the -- the actual subprogram called has no such default expression. Okay := Send (Msg => M); -- ...Other processing. return Okay; end CC51002_1; --==================================================================-- with CC51002_0; -- Root message type and operations. package CC51002_2 is -- Extended message type and operations. type Sender_Type is (Inside, Outside); type Who_Msg_Type is new CC51002_0.Msg_Type with record -- Derivative of From : Sender_Type; -- root type of end record; -- class. -- Note: this overriding version of Send has different parameter names -- from the root type's function. It also has no default expression. function Send (M : Who_Msg_Type; -- Overrides R : CC51002_0.Recipients) return Boolean; -- root type's -- operation. -- ...Other extended message operations. end CC51002_2; --==================================================================-- package body CC51002_2 is -- The implementation of Send is purely artificial; the validity of -- its implementation in the context of the abstraction is irrelevant to -- the feature being tested. function Send (M : Who_Msg_Type; R : CC51002_0.Recipients) return Boolean is use type CC51002_0.Recipients; begin return (M.Text = "Willkommen" and M.From = Outside and R = CC51002_0.Local); end Send; end CC51002_2; --==================================================================-- with CC51002_0; -- Root message type and operations. with CC51002_1; -- Message class function. with CC51002_2; -- Extended message type and operations. with Report; procedure CC51002 is function Send_Msg is new CC51002_1 (CC51002_0.Msg_Type); function Send_WMsg is new CC51002_1 (CC51002_2.Who_Msg_Type); Mess : CC51002_0.Msg_Type := (Text => "Greetings!"); WMess : CC51002_2.Who_Msg_Type := (Text => "Willkommen", From => CC51002_2.Outside); TC_Okay_MStatus : Boolean := False; TC_Okay_WMStatus : Boolean := False; begin Report.Test ("CC51002", "Check that, for formal derived tagged types, " & "the formal parameter names and default expressions for " & "a primitive subprogram in an instance are determined by " & "the primitive subprogram of the ancestor type, but that " & "the primitive subprogram body executed is that of the" & "actual type"); TC_Okay_MStatus := Send_Msg (Mess); if not TC_Okay_MStatus then Report.Failed ("Wrong result from call to root type's operation"); end if; TC_Okay_WMStatus := Send_WMsg (WMess); if not TC_Okay_WMStatus then Report.Failed ("Wrong result from call to derived type's operation"); end if; Report.Result; end CC51002;