| -- C3A2A02.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 X'Access of a general access type A, Program_Error is |
| -- raised if the accessibility level of X is deeper than that of A. |
| -- Check for cases where X'Access occurs in an instance body, and A |
| -- is a type either declared inside the instance, or declared outside |
| -- the instance but not passed as an actual during instantiation. |
| -- |
| -- TEST DESCRIPTION: |
| -- In order to satisfy accessibility requirements, the designated |
| -- object X must be at the same or a less deep nesting level than the |
| -- general access type A -- X must "live" as long as A. Nesting |
| -- levels are the run-time nestings of masters: block statements; |
| -- subprogram, task, and entry bodies; and accept statements. Packages |
| -- are invisible to accessibility rules. |
| -- |
| -- This test declares three generic packages: |
| -- |
| -- (1) One in which X is of a formal tagged derived type and declared |
| -- in the body, A is a type declared outside the instance, and |
| -- X'Access occurs in the declarative part of a nested subprogram. |
| -- |
| -- (2) One in which X is a formal object of a tagged type, A is a |
| -- type declared outside the instance, and X'Access occurs in the |
| -- declarative part of the body. |
| -- |
| -- (3) One in which there are two X's and two A's. In the first pair, |
| -- X is a formal in object of a tagged type, A is declared in the |
| -- specification, and X'Access occurs in the declarative part of |
| -- the body. In the second pair, X is of a formal derived type, |
| -- X and A are declared in the specification, and X'Access occurs |
| -- in the sequence of statements of the body. |
| -- |
| -- The test verifies the following: |
| -- |
| -- For (1), Program_Error is raised when the nested subprogram is |
| -- called, if the generic package is instantiated at a deeper level |
| -- than that of A. The exception is propagated to the innermost |
| -- enclosing master. Also, check that Program_Error is not raised |
| -- if the instantiation is at the same level as that of A. |
| -- |
| -- For (2), Program_Error is raised upon instantiation if the object |
| -- passed as an actual during instantiation has an accessibility level |
| -- deeper than that of A. The exception is propagated to the innermost |
| -- enclosing master. Also, check that Program_Error is not raised if |
| -- the level of the actual object is not deeper than that of A. |
| -- |
| -- For (3), Program_Error is not raised, for actual objects at |
| -- various accessibility levels (since A will have at least the same |
| -- accessibility level as X in all cases, no exception should ever |
| -- be raised). |
| -- |
| -- TEST FILES: |
| -- The following files comprise this test: |
| -- |
| -- F3A2A00.A |
| -- -> C3A2A02.A |
| -- |
| -- |
| -- CHANGE HISTORY: |
| -- 12 May 95 SAIC Initial prerelease version. |
| -- 10 Jul 95 SAIC Modified code to avoid dead variable optimization. |
| -- 26 Jun 98 EDS Added pragma Elaborate (C3A2A02_0) to package |
| -- package C3A2A02_3, in order to avoid possible |
| -- instantiation error. |
| --! |
| |
| with F3A2A00; |
| generic |
| type FD is new F3A2A00.Tagged_Type with private; |
| package C3A2A02_0 is |
| procedure Proc; |
| end C3A2A02_0; |
| |
| |
| --==================================================================-- |
| |
| |
| with Report; |
| package body C3A2A02_0 is |
| X : aliased FD; |
| |
| procedure Proc is |
| Ptr : F3A2A00.AccTagClass_L0 := X'Access; |
| begin |
| -- Avoid optimization (dead variable removal of Ptr): |
| |
| if not Report.Equal (Ptr.C, Ptr.C) then -- Always false. |
| Report.Failed ("Unexpected error in Proc"); |
| end if; |
| end Proc; |
| end C3A2A02_0; |
| |
| |
| --==================================================================-- |
| |
| |
| with F3A2A00; |
| generic |
| FObj : in out F3A2A00.Tagged_Type; |
| package C3A2A02_1 is |
| procedure Dummy; -- Needed to allow package body. |
| end C3A2A02_1; |
| |
| |
| --==================================================================-- |
| |
| |
| with Report; |
| package body C3A2A02_1 is |
| Ptr : F3A2A00.AccTag_L0 := FObj'Access; |
| |
| procedure Dummy is |
| begin |
| null; |
| end Dummy; |
| begin |
| -- Avoid optimization (dead variable removal of Ptr): |
| |
| if not Report.Equal (Ptr.C, Ptr.C) then -- Always false. |
| Report.Failed ("Unexpected error in C3A2A02_1 instance"); |
| end if; |
| end C3A2A02_1; |
| |
| |
| --==================================================================-- |
| |
| |
| with F3A2A00; |
| generic |
| type FD is new F3A2A00.Array_Type; |
| FObj : in F3A2A00.Tagged_Type; |
| package C3A2A02_2 is |
| type GAF is access all FD; |
| type GAO is access constant F3A2A00.Tagged_Type; |
| XG : aliased FD; |
| PtrF : GAF; |
| Index : Integer := FD'First; |
| |
| procedure Dummy; -- Needed to allow package body. |
| end C3A2A02_2; |
| |
| |
| --==================================================================-- |
| |
| |
| with Report; |
| package body C3A2A02_2 is |
| PtrO : GAO := FObj'Access; |
| |
| procedure Dummy is |
| begin |
| null; |
| end Dummy; |
| begin |
| PtrF := XG'Access; |
| |
| -- Avoid optimization (dead variable removal of PtrO and/or PtrF): |
| |
| if not Report.Equal (PtrO.C, PtrO.C) then -- Always false. |
| Report.Failed ("Unexpected error in C3A2A02_2 instance: PtrO"); |
| end if; |
| |
| if not Report.Equal (PtrF(Index).C, PtrF(Index).C) then -- Always false. |
| Report.Failed ("Unexpected error in C3A2A02_2 instance: PtrF"); |
| end if; |
| end C3A2A02_2; |
| |
| |
| --==================================================================-- |
| |
| |
| -- The instantiation of C3A2A02_0 should NOT result in any exceptions. |
| |
| with F3A2A00; |
| with C3A2A02_0; |
| pragma Elaborate (C3A2A02_0); |
| package C3A2A02_3 is new C3A2A02_0 (F3A2A00.Tagged_Type); |
| |
| |
| --==================================================================-- |
| |
| |
| with F3A2A00; |
| with C3A2A02_0; |
| with C3A2A02_1; |
| with C3A2A02_2; |
| with C3A2A02_3; |
| |
| with Report; |
| procedure C3A2A02 is |
| begin -- C3A2A02. -- [ Level = 1 ] |
| |
| Report.Test ("C3A2A02", "Run-time accessibility checks: instance " & |
| "bodies. Type of X'Access is local or global to instance"); |
| |
| |
| SUBTEST1: |
| declare -- [ Level = 2 ] |
| Result1 : F3A2A00.TC_Result_Kind; |
| Result2 : F3A2A00.TC_Result_Kind; |
| begin -- SUBTEST1. |
| |
| declare -- [ Level = 3 ] |
| package Pack_Same_Level renames C3A2A02_3; |
| begin |
| -- The accessibility level of Pack_Same_Level.X is that of the |
| -- instance (0), not that of the renaming declaration. The level of |
| -- the type of Pack_Same_Level.X'Access (F3A2A00.AccTagClass_L0) is |
| -- 0. Therefore, the X'Access in Pack_Same_Level.Proc does not raise |
| -- an exception when the subprogram is called. The level of execution |
| -- of the subprogram is irrelevant: |
| |
| Pack_Same_Level.Proc; |
| Result1 := F3A2A00.OK; -- Expected result. |
| exception |
| when Program_Error => Result1 := F3A2A00.P_E; |
| when others => Result1 := F3A2A00.O_E; |
| end; |
| |
| F3A2A00.TC_Display_Results (Result1, F3A2A00.OK, |
| "SUBTEST #1 (same level)"); |
| |
| |
| declare -- [ Level = 3 ] |
| -- The instantiation of C3A2A02_0 should NOT result in any |
| -- exceptions. |
| |
| package Pack_Deeper_Level is new C3A2A02_0 (F3A2A00.Tagged_Type); |
| begin |
| -- The accessibility level of Pack_Deeper_Level.X is that of the |
| -- instance (3). The level of the type of Pack_Deeper_Level.X'Access |
| -- (F3A2A00.AccTagClass_L0) is 0. Therefore, the X'Access in |
| -- Pack_Deeper_Level.Proc propagates Program_Error when the |
| -- subprogram is called: |
| |
| Pack_Deeper_Level.Proc; |
| Result2 := F3A2A00.OK; |
| exception |
| when Program_Error => Result2 := F3A2A00.P_E; -- Expected result. |
| when others => Result2 := F3A2A00.O_E; |
| end; |
| |
| F3A2A00.TC_Display_Results (Result2, F3A2A00.P_E, |
| "SUBTEST #1: deeper level"); |
| |
| exception |
| when Program_Error => |
| Report.Failed ("SUBTEST #1: Program_Error incorrectly raised " & |
| "during instantiation of generic"); |
| when others => |
| Report.Failed ("SUBTEST #1: Unexpected exception raised " & |
| "during instantiation of generic"); |
| end SUBTEST1; |
| |
| |
| |
| SUBTEST2: |
| declare -- [ Level = 2 ] |
| Result1 : F3A2A00.TC_Result_Kind; |
| Result2 : F3A2A00.TC_Result_Kind; |
| begin -- SUBTEST2. |
| |
| declare -- [ Level = 3 ] |
| X_L3 : F3A2A00.Tagged_Type; |
| begin |
| declare -- [ Level = 4 ] |
| -- The accessibility level of the actual object corresponding to |
| -- FObj in Pack_PE is 3. The level of the type of FObj'Access |
| -- (F3A2A00.AccTag_L0) is 0. Therefore, the FObj'Access in Pack_PE |
| -- propagates Program_Error when the instance body is elaborated: |
| |
| package Pack_PE is new C3A2A02_1 (X_L3); |
| begin |
| Result1 := F3A2A00.OK; |
| end; |
| exception |
| when Program_Error => Result1 := F3A2A00.P_E; -- Expected result. |
| when others => Result1 := F3A2A00.O_E; |
| end; |
| |
| F3A2A00.TC_Display_Results (Result1, F3A2A00.P_E, |
| "SUBTEST #2: deeper level"); |
| |
| |
| begin -- [ Level = 3 ] |
| declare -- [ Level = 4 ] |
| -- The accessibility level of the actual object corresponding to |
| -- FObj in Pack_OK is 0. The level of the type of FObj'Access |
| -- (F3A2A00.AccTag_L0) is also 0. Therefore, the FObj'Access in |
| -- Pack_OK does not raise an exception when the instance body is |
| -- elaborated: |
| |
| package Pack_OK is new C3A2A02_1 (F3A2A00.X_L0); |
| begin |
| Result2 := F3A2A00.OK; -- Expected result. |
| end; |
| exception |
| when Program_Error => Result2 := F3A2A00.P_E; |
| when others => Result2 := F3A2A00.O_E; |
| end; |
| |
| F3A2A00.TC_Display_Results (Result2, F3A2A00.OK, |
| "SUBTEST #2: same level"); |
| |
| end SUBTEST2; |
| |
| |
| |
| SUBTEST3: |
| declare -- [ Level = 2 ] |
| Result1 : F3A2A00.TC_Result_Kind; |
| Result2 : F3A2A00.TC_Result_Kind; |
| begin -- SUBTEST3. |
| |
| declare -- [ Level = 3 ] |
| X_L3 : F3A2A00.Tagged_Type; |
| begin |
| declare -- [ Level = 4 ] |
| -- Since the accessibility level of the type of X'Access in |
| -- both cases within Pack_OK1 is that of the instance, and since |
| -- X is either passed as an actual (in which case its level will |
| -- not be deeper than that of the instance) or is declared within |
| -- the instance (in which case its level is the same as that of |
| -- the instance), no exception should be raised when the instance |
| -- body is elaborated: |
| |
| package Pack_OK1 is new C3A2A02_2 (F3A2A00.Array_Type, X_L3); |
| begin |
| Result1 := F3A2A00.OK; -- Expected result. |
| end; |
| exception |
| when Program_Error => Result1 := F3A2A00.P_E; |
| when others => Result1 := F3A2A00.O_E; |
| end; |
| |
| F3A2A00.TC_Display_Results (Result1, F3A2A00.OK, |
| "SUBTEST #3: 1st okay case"); |
| |
| |
| declare -- [ Level = 3 ] |
| type My_Array is new F3A2A00.Array_Type; |
| begin |
| declare -- [ Level = 4 ] |
| -- Since the accessibility level of the type of X'Access in |
| -- both cases within Pack_OK2 is that of the instance, and since |
| -- X is either passed as an actual (in which case its level will |
| -- not be deeper than that of the instance) or is declared within |
| -- the instance (in which case its level is the same as that of |
| -- the instance), no exception should be raised when the instance |
| -- body is elaborated: |
| |
| package Pack_OK2 is new C3A2A02_2 (My_Array, F3A2A00.X_L0); |
| begin |
| Result2 := F3A2A00.OK; -- Expected result. |
| end; |
| exception |
| when Program_Error => Result2 := F3A2A00.P_E; |
| when others => Result2 := F3A2A00.O_E; |
| end; |
| |
| F3A2A00.TC_Display_Results (Result2, F3A2A00.OK, |
| "SUBTEST #3: 2nd okay case"); |
| |
| |
| end SUBTEST3; |
| |
| |
| |
| Report.Result; |
| |
| end C3A2A02; |