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