c460a01.a
来自「linux下编程用 编译软件」· A 代码 · 共 409 行
A
409 行
-- C460A01.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 if the target type of a type conversion is a general-- access type, Program_Error is raised if the accessibility level of-- the operand type is deeper than that of the target type. Check for-- cases where the type conversion occurs in an instance body, and-- the operand type is passed as an actual during instantiation.---- TEST DESCRIPTION:-- In order to satisfy accessibility requirements, the operand type must-- be at the same or a less deep nesting level than the target type -- the-- operand type must "live" as long as the target type. 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 checks for cases where the operand is a subprogram formal-- parameter.---- The test declares three generic packages, each containing an access-- type conversion in which the operand type is a formal type:---- (1) One in which the target type is declared within the-- specification, and the conversion occurs within a nested-- function.---- (2) One in which the target type is also a formal type, and-- the conversion occurs within a nested function.---- (3) One in which the target type is declared outside the-- generic, and the conversion occurs within a nested-- procedure.---- The test verifies the following:---- For (1), Program_Error is not raised when the nested function is-- called. Since the actual corresponding to the formal operand type-- must always have the same or a less deep level than the target-- type declared within the instance, the access type conversion is-- always safe.---- For (2), Program_Error is raised when the nested function is-- called if the operand type passed as an actual during instantiation-- has an accessibility level deeper than that of the target type-- passed as an actual, and that no exception is raised otherwise.-- The exception is propagated to the innermost enclosing master.---- For (3), Program_Error is raised when the nested procedure is-- called if the operand type passed as an actual during instantiation-- has an accessibility level deeper than that of the target type.-- The exception is handled within the nested procedure.---- TEST FILES:-- The following files comprise this test:---- F460A00.A-- => C460A01.A------ CHANGE HISTORY:-- 09 May 95 SAIC Initial prerelease version.-- 24 Apr 96 SAIC Added code to avoid dead variable optimization.-- 13 Feb 97 PWB.CTA Removed 'Class from qual expression at line 342.--!generic type Designated_Type is tagged private; type Operand_Type is access Designated_Type;package C460A01_0 is type Target_Type is access all Designated_Type; function Convert (P : Operand_Type) return Target_Type;end C460A01_0; --==================================================================--package body C460A01_0 is function Convert (P : Operand_Type) return Target_Type is begin return Target_Type(P); -- Never fails. end Convert;end C460A01_0; --==================================================================--generic type Designated_Type is tagged private; type Operand_Type is access all Designated_Type; type Target_Type is access all Designated_Type;package C460A01_1 is function Convert (P : Operand_Type) return Target_Type;end C460A01_1; --==================================================================--package body C460A01_1 is function Convert (P : Operand_Type) return Target_Type is begin return Target_Type(P); end Convert;end C460A01_1; --==================================================================--with F460A00;generic type Designated_Type (<>) is new F460A00.Tagged_Type with private; type Operand_Type is access Designated_Type;package C460A01_2 is procedure Proc (P : Operand_Type; Res : out F460A00.TC_Result_Kind);end C460A01_2; --==================================================================--with Report;package body C460A01_2 is procedure Proc (P : Operand_Type; Res : out F460A00.TC_Result_Kind) is Ptr : F460A00.AccTag_L0; begin Ptr := F460A00.AccTag_L0(P); -- Avoid optimization (dead variable removal of Ptr): if not Report.Equal (Ptr.C, Ptr.C) then -- Always false. Report.Failed ("Unexpected error in C460A01_2 instance"); end if; Res := F460A00.OK; exception when Program_Error => Res := F460A00.PE_Exception; when others => Res := F460A00.Others_Exception; end Proc;end C460A01_2; --==================================================================--with F460A00;with C460A01_0;with C460A01_1;with C460A01_2;with Report;procedure C460A01 isbegin -- C460A01. -- [ Level = 1 ] Report.Test ("C460A01", "Run-time accessibility checks: instance " & "bodies. Operand type of access type conversion is " & "passed as actual to instance"); SUBTEST1: declare -- [ Level = 2 ] type AccTag_L2 is access all F460A00.Tagged_Type; Operand: AccTag_L2 := new F460A00.Tagged_Type; Result : F460A00.TC_Result_Kind := F460A00.UN_Init; begin -- SUBTEST1. declare -- [ Level = 3 ] -- The instantiation of C460A01_0 should NOT result in any -- exceptions. package Pack_OK is new C460A01_0 (F460A00.Tagged_Type, AccTag_L2); Target : Pack_OK.Target_Type; begin -- The accessibility level of Pack_OK.Target_Type will always be at -- least as deep as the operand type passed as an actual. Thus, -- a call to Pack_OK.Convert does not propagate an exception: Target := Pack_OK.Convert(Operand); -- Avoid optimization (dead variable removal of Target): if not Report.Equal (Target.C, Target.C) then -- Always false. Report.Failed ("Unexpected error in SUBTEST #1"); end if; Result := F460A00.OK; -- Expected result. exception when Program_Error => Result := F460A00.PE_Exception; when others => Result := F460A00.Others_Exception; end; F460A00.TC_Check_Results (Result, F460A00.OK, "SUBTEST #1"); exception when Program_Error => Report.Failed ("SUBTEST #1: Program_Error incorrectly raised"); when others => Report.Failed ("SUBTEST #1: Unexpected exception raised"); end SUBTEST1; SUBTEST2: declare -- [ Level = 2 ] type AccTag_L2 is access all F460A00.Tagged_Type; Operand : AccTag_L2 := new F460A00.Tagged_Type; Result : F460A00.TC_Result_Kind := F460A00.UN_Init; begin -- SUBTEST2. declare -- [ Level = 3 ] type AccTag_L3 is access all F460A00.Tagged_Type; Target : AccTag_L3; -- The instantiation of C460A01_1 should NOT result in any -- exceptions. package Pack_OK is new C460A01_1 (Designated_Type => F460A00.Tagged_Type, Operand_Type => AccTag_L2, Target_Type => AccTag_L3); begin -- The accessibility level of the actual passed as the operand type -- in Pack_OK is 2. The accessibility level of the actual passed as -- the target type is 3. Therefore, the access type conversion in -- Pack_OK.Convert does not raise an exception when the subprogram is -- called. If an exception is (incorrectly) raised, it is propagated -- to the innermost enclosing master: Target := Pack_OK.Convert(Operand); -- Avoid optimization (dead variable removal of Target): if not Report.Equal (Target.C, Target.C) then -- Always false. Report.Failed ("Unexpected error in SUBTEST #2"); end if; Result := F460A00.OK; -- Expected result. exception when Program_Error => Result := F460A00.PE_Exception; when others => Result := F460A00.Others_Exception; end; F460A00.TC_Check_Results (Result, F460A00.OK, "SUBTEST #2"); exception when Program_Error => Report.Failed ("SUBTEST #2: Program_Error incorrectly raised"); when others => Report.Failed ("SUBTEST #2: Unexpected exception raised"); end SUBTEST2; SUBTEST3: declare -- [ Level = 2 ] type AccTag_L2 is access all F460A00.Tagged_Type; Target : AccTag_L2; Result : F460A00.TC_Result_Kind := F460A00.UN_Init; begin -- SUBTEST3. declare -- [ Level = 3 ] type AccTag_L3 is access all F460A00.Tagged_Type; Operand : AccTag_L3 := new F460A00.Tagged_Type; -- The instantiation of C460A01_1 should NOT result in any -- exceptions. package Pack_PE is new C460A01_1 (Designated_Type => F460A00.Tagged_Type, Operand_Type => AccTag_L3, Target_Type => AccTag_L2); begin -- The accessibility level of the actual passed as the operand type -- in Pack_PE is 3. The accessibility level of the actual passed as -- the target type is 2. Therefore, the access type conversion in -- Pack_PE.Convert raises Program_Error when the subprogram is -- called. The exception is propagated to the innermost enclosing -- master: Target := Pack_PE.Convert(Operand); -- Avoid optimization (dead variable removal of Target): if not Report.Equal (Target.C, Target.C) then -- Always false. Report.Failed ("Unexpected error in SUBTEST #3"); end if; Result := F460A00.OK; exception when Program_Error => Result := F460A00.PE_Exception; -- Expected result. when others => Result := F460A00.Others_Exception; end; F460A00.TC_Check_Results (Result, F460A00.PE_Exception, "SUBTEST #3"); exception when Program_Error => Report.Failed ("SUBTEST #3: Program_Error incorrectly raised"); when others => Report.Failed ("SUBTEST #3: Unexpected exception raised"); end SUBTEST3; SUBTEST4: declare -- [ Level = 2 ] Result : F460A00.TC_Result_Kind := F460A00.UN_Init; begin -- SUBTEST4. declare -- [ Level = 3 ] TType : F460A00.Tagged_Type; Operand : F460A00.AccTagClass_L0 := new F460A00.Tagged_Type'(TType); -- The instantiation of C460A01_2 should NOT result in any -- exceptions. package Pack_OK is new C460A01_2 (F460A00.Tagged_Type'Class, F460A00.AccTagClass_L0); begin -- The accessibility level of the actual passed as the operand type -- in Pack_OK is 0. The accessibility level of the target type -- (F460A00.AccTag_L0) is also 0. Therefore, the access type -- conversion in Pack_OK.Proc does not raise an exception when the -- subprogram is called. If an exception is (incorrectly) raised, -- it is handled within the subprogram: Pack_OK.Proc(Operand, Result); end; F460A00.TC_Check_Results (Result, F460A00.OK, "SUBTEST #4"); exception when Program_Error => Report.Failed ("SUBTEST #4: Program_Error incorrectly raised"); when others => Report.Failed ("SUBTEST #4: Unexpected exception raised"); end SUBTEST4; SUBTEST5: declare -- [ Level = 2 ] Result : F460A00.TC_Result_Kind := F460A00.UN_Init; begin -- SUBTEST5. declare -- [ Level = 3 ] type AccDerTag_L3 is access all F460A00.Derived_Tagged_Type; Operand : AccDerTag_L3 := new F460A00.Derived_Tagged_Type; -- The instantiation of C460A01_2 should NOT result in any -- exceptions. package Pack_PE is new C460A01_2 (F460A00.Derived_Tagged_Type, AccDerTag_L3); begin -- The accessibility level of the actual passed as the operand type -- in Pack_PE is 3. The accessibility level of the target type -- (F460A00.AccTag_L0) is 0. Therefore, the access type conversion -- in Pack_PE.Proc raises Program_Error when the subprogram is -- called. The exception is handled within the subprogram: Pack_PE.Proc(Operand, Result); end; F460A00.TC_Check_Results (Result, F460A00.PE_Exception, "SUBTEST #5"); exception when Program_Error => Report.Failed ("SUBTEST #5: Program_Error incorrectly raised"); when others => Report.Failed ("SUBTEST #5: Unexpected exception raised"); end SUBTEST5; Report.Result;end C460A01;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?