| -- 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; |