| -- CC30002.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 an explicit declaration in the private part of an instance |
| -- does not override an implicit declaration in the instance, unless the |
| -- corresponding explicit declaration in the generic overrides a |
| -- corresponding implicit declaration in the generic. Check for primitive |
| -- subprograms of tagged types. |
| -- |
| -- TEST DESCRIPTION: |
| -- Consider the following: |
| -- |
| -- type Ancestor is tagged null record; |
| -- procedure R (X: in Ancestor); |
| -- |
| -- generic |
| -- type Formal is new Ancestor with private; |
| -- package G is |
| -- type T is new Formal with null record; |
| -- -- Implicit procedure R (X: in T); |
| -- procedure P (X: in T); -- (1) |
| -- private |
| -- procedure Q (X: in T); -- (2) |
| -- procedure R (X: in T); -- (3) Overrides implicit R in generic. |
| -- end G; |
| -- |
| -- type Actual is new Ancestor with null record; |
| -- procedure P (X: in Actual); |
| -- procedure Q (X: in Actual); |
| -- procedure R (X: in Actual); |
| -- |
| -- package Instance is new G (Formal => Actual); |
| -- |
| -- In the instance, the copy of P at (1) overrides Actual's P, since it |
| -- is declared in the visible part of the instance. The copy of Q at (2) |
| -- does not override anything. The copy of R at (3) overrides Actual's |
| -- R, even though it is declared in the private part, because within |
| -- the generic the explicit declaration of R overrides an implicit |
| -- declaration. |
| -- |
| -- Thus, for calls involving a parameter with tag T: |
| -- - Calls to P will execute the body declared for T. |
| -- - Calls to Q from within Instance will execute the body declared |
| -- for T. |
| -- - Calls to Q from outside Instance will execute the body declared |
| -- for Actual. |
| -- - Calls to R will execute the body declared for T. |
| -- |
| -- Verify this behavior for both dispatching and nondispatching calls to |
| -- Q and R. |
| -- |
| -- |
| -- CHANGE HISTORY: |
| -- 24 Feb 95 SAIC Initial prerelease version. |
| -- |
| --! |
| |
| package CC30002_0 is |
| |
| type TC_Body_Kind is (Body_Of_Ancestor, Body_In_Instance, |
| Body_Of_Actual, Initial_Value); |
| |
| type Camera is tagged record |
| -- ... Camera components. |
| TC_Focus_Called : TC_Body_Kind := Initial_Value; |
| TC_Shutter_Called : TC_Body_Kind := Initial_Value; |
| end record; |
| |
| procedure Focus (C: in out Camera); |
| |
| -- ...Other operations. |
| |
| end CC30002_0; |
| |
| |
| --==================================================================-- |
| |
| |
| package body CC30002_0 is |
| |
| procedure Focus (C: in out Camera) is |
| begin |
| -- Artificial for testing purposes. |
| C.TC_Focus_Called := Body_Of_Ancestor; |
| end Focus; |
| |
| end CC30002_0; |
| |
| |
| --==================================================================-- |
| |
| |
| with CC30002_0; |
| use CC30002_0; |
| generic |
| type Camera_Type is new CC30002_0.Camera with private; |
| package CC30002_1 is |
| |
| type Speed_Camera is new Camera_Type with record |
| Diag_Code: Positive; |
| -- ...Other components. |
| end record; |
| |
| -- Implicit procedure Focus (C: in out Speed_Camera) declared in generic. |
| procedure Self_Test_NonDisp (C: in out Speed_Camera); |
| procedure Self_Test_Disp (C: in out Speed_Camera'Class); |
| |
| private |
| |
| -- The following explicit declaration of Set_Shutter_Speed does NOT override |
| -- a corresponding implicit declaration in the generic. Therefore, its copy |
| -- does NOT override the implicit declaration (inherited from the actual) |
| -- in the instance. |
| |
| procedure Set_Shutter_Speed (C: in out Speed_Camera); |
| |
| -- The following explicit declaration of Focus DOES override a |
| -- corresponding implicit declaration (inherited from the parent) in the |
| -- generic. Therefore, its copy overrides the implicit declaration |
| -- (inherited from the actual) in the instance. |
| |
| procedure Focus (C: in out Speed_Camera); -- Overrides implicit Focus |
| -- in generic. |
| end CC30002_1; |
| |
| |
| --==================================================================-- |
| |
| |
| package body CC30002_1 is |
| |
| procedure Self_Test_NonDisp (C: in out Speed_Camera) is |
| begin |
| -- Nondispatching calls: |
| Focus (C); |
| Set_Shutter_Speed (C); |
| end Self_Test_NonDisp; |
| |
| procedure Self_Test_Disp (C: in out Speed_Camera'Class) is |
| begin |
| -- Dispatching calls: |
| Focus (C); |
| Set_Shutter_Speed (C); |
| end Self_Test_Disp; |
| |
| procedure Set_Shutter_Speed (C: in out Speed_Camera) is |
| begin |
| -- Artificial for testing purposes. |
| C.TC_Shutter_Called := Body_In_Instance; |
| end Set_Shutter_Speed; |
| |
| procedure Focus (C: in out Speed_Camera) is |
| begin |
| -- Artificial for testing purposes. |
| C.TC_Focus_Called := Body_In_Instance; |
| end Focus; |
| |
| end CC30002_1; |
| |
| |
| --==================================================================-- |
| |
| |
| with CC30002_0; |
| package CC30002_2 is |
| |
| type Aperture_Camera is new CC30002_0.Camera with record |
| FStop: Natural; |
| -- ...Other components. |
| end record; |
| |
| procedure Set_Shutter_Speed (C: in out Aperture_Camera); |
| procedure Focus (C: in out Aperture_Camera); |
| |
| end CC30002_2; |
| |
| |
| --==================================================================-- |
| |
| |
| package body CC30002_2 is |
| |
| procedure Set_Shutter_Speed (C: in out Aperture_Camera) is |
| use CC30002_0; |
| begin |
| -- Artificial for testing purposes. |
| C.TC_Shutter_Called := Body_Of_Actual; |
| end Set_Shutter_Speed; |
| |
| procedure Focus (C: in out Aperture_Camera) is |
| use CC30002_0; |
| begin |
| -- Artificial for testing purposes. |
| C.TC_Focus_Called := Body_Of_Actual; |
| end Focus; |
| |
| end CC30002_2; |
| |
| |
| --==================================================================-- |
| |
| |
| -- Instance declaration. |
| |
| with CC30002_1; |
| with CC30002_2; |
| package CC30002_3 is new CC30002_1 (Camera_Type => CC30002_2.Aperture_Camera); |
| |
| |
| --==================================================================-- |
| |
| |
| with CC30002_0; |
| with CC30002_1; |
| with CC30002_2; |
| with CC30002_3; -- Instance. |
| |
| with Report; |
| procedure CC30002 is |
| |
| package Speed_Cameras renames CC30002_3; |
| |
| use CC30002_0; |
| |
| TC_Camera1: Speed_Cameras.Speed_Camera; |
| TC_Camera2: Speed_Cameras.Speed_Camera'Class := TC_Camera1; |
| TC_Camera3: Speed_Cameras.Speed_Camera; |
| TC_Camera4: Speed_Cameras.Speed_Camera; |
| |
| begin |
| Report.Test ("CC30002", "Check that an explicit declaration in the " & |
| "private part of an instance does not override an implicit " & |
| "declaration in the instance, unless the corresponding " & |
| "explicit declaration in the generic overrides a " & |
| "corresponding implicit declaration in the generic. Check " & |
| "for primitive subprograms of tagged types"); |
| |
| -- |
| -- Check non-dispatching calls outside instance: |
| -- |
| |
| -- Non-overriding primitive operation: |
| |
| Speed_Cameras.Set_Shutter_Speed (TC_Camera1); |
| if TC_Camera1.TC_Shutter_Called /= Body_Of_Actual then |
| Report.Failed ("Wrong body executed: non-dispatching call to " & |
| "Set_Shutter_Speed outside instance"); |
| end if; |
| |
| |
| -- Overriding primitive operation: |
| |
| Speed_Cameras.Focus (TC_Camera1); |
| if TC_Camera1.TC_Focus_Called /= Body_In_Instance then |
| Report.Failed ("Wrong body executed: non-dispatching call to " & |
| "Focus outside instance"); |
| end if; |
| |
| |
| -- |
| -- Check dispatching calls outside instance: |
| -- |
| |
| -- Non-overriding primitive operation: |
| |
| Speed_Cameras.Set_Shutter_Speed (TC_Camera2); |
| if TC_Camera2.TC_Shutter_Called /= Body_Of_Actual then |
| Report.Failed ("Wrong body executed: dispatching call to " & |
| "Set_Shutter_Speed outside instance"); |
| end if; |
| |
| |
| -- Overriding primitive operation: |
| |
| Speed_Cameras.Focus (TC_Camera2); |
| if TC_Camera2.TC_Focus_Called /= Body_In_Instance then |
| Report.Failed ("Wrong body executed: dispatching call to " & |
| "Focus outside instance"); |
| end if; |
| |
| |
| |
| -- |
| -- Check non-dispatching calls within instance: |
| -- |
| |
| Speed_Cameras.Self_Test_NonDisp (TC_Camera3); |
| |
| -- Non-overriding primitive operation: |
| |
| if TC_Camera3.TC_Shutter_Called /= Body_In_Instance then |
| Report.Failed ("Wrong body executed: non-dispatching call to " & |
| "Set_Shutter_Speed inside instance"); |
| end if; |
| |
| -- Overriding primitive operation: |
| |
| if TC_Camera3.TC_Focus_Called /= Body_In_Instance then |
| Report.Failed ("Wrong body executed: non-dispatching call to " & |
| "Focus inside instance"); |
| end if; |
| |
| |
| |
| -- |
| -- Check dispatching calls within instance: |
| -- |
| |
| Speed_Cameras.Self_Test_Disp (TC_Camera4); |
| |
| -- Non-overriding primitive operation: |
| |
| if TC_Camera4.TC_Shutter_Called /= Body_In_Instance then |
| Report.Failed ("Wrong body executed: dispatching call to " & |
| "Set_Shutter_Speed inside instance"); |
| end if; |
| |
| -- Overriding primitive operation: |
| |
| if TC_Camera4.TC_Focus_Called /= Body_In_Instance then |
| Report.Failed ("Wrong body executed: dispatching call to " & |
| "Focus inside instance"); |
| end if; |
| |
| Report.Result; |
| end CC30002; |