| -- C650001.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 a function result type that is a return-by-reference |
| -- type, Program_Error is raised if the return expression is a name that |
| -- denotes an object view whose accessibility level is deeper than that |
| -- of the master that elaborated the function body. |
| -- |
| -- Check for cases where the result type is: |
| -- (a) A tagged limited type. |
| -- (b) A task type. |
| -- (c) A protected type. |
| -- (d) A composite type with a subcomponent of a |
| -- return-by-reference type (task type). |
| -- |
| -- TEST DESCRIPTION: |
| -- The accessibility level of the master that elaborates the body of a |
| -- return-by-reference function will always be less deep than that of |
| -- the function (which is itself a master). |
| -- |
| -- Thus, the return object may not be any of the following, since each |
| -- has an accessibility level at least as deep as that of the function: |
| -- |
| -- (1) An object declared local to the function. |
| -- (2) The result of a local function. |
| -- (3) A parameter of the function. |
| -- |
| -- Verify that Program_Error is raised within the return-by-reference |
| -- function if the return object is any of (1)-(3) above, for various |
| -- subsets of the return types (a)-(d) above. Include cases where (1)-(3) |
| -- are operands of parenthesized expressions. |
| -- |
| -- Verify that no exception is raised if the return object is any of the |
| -- following: |
| -- |
| -- (4) An object declared at a less deep level than that of the |
| -- master that elaborated the function body. |
| -- (5) The result of a function declared at the same level as the |
| -- original function (assuming the new function is also legal). |
| -- (6) A parameter of the master that elaborated the function body. |
| -- |
| -- For (5), pass the new function as an actual via an access-to- |
| -- subprogram parameter of the original function. Check for cases where |
| -- the new function does and does not raise an exception. |
| -- |
| -- Since the functions to be tested cannot be part of an assignment |
| -- statement (since they return values of a limited type), pass each |
| -- function result as an actual parameter to a dummy procedure, e.g., |
| -- |
| -- Dummy_Proc ( Function_Call ); |
| -- |
| -- |
| -- CHANGE HISTORY: |
| -- 03 May 95 SAIC Initial prerelease version. |
| -- 08 Feb 99 RLB Removed subcase with two errors. |
| -- |
| --! |
| |
| package C650001_0 is |
| |
| type Tagged_Limited is tagged limited record |
| C: String (1 .. 10); |
| end record; |
| |
| task type Task_Type; |
| |
| protected type Protected_Type is |
| procedure Op; |
| end Protected_Type; |
| |
| type Task_Array is array (1 .. 10) of Task_Type; |
| |
| type Variant_Record (Toggle: Boolean) is record |
| case Toggle is |
| when True => |
| T: Task_Type; -- Return-by-reference component. |
| when False => |
| I: Integer; -- Non-return-by-reference component. |
| end case; |
| end record; |
| |
| -- Limited type even though variant contains no limited components: |
| type Non_Task_Variant is new Variant_Record (Toggle => False); |
| |
| end C650001_0; |
| |
| |
| --==================================================================-- |
| |
| |
| package body C650001_0 is |
| |
| task body Task_Type is |
| begin |
| null; |
| end Task_Type; |
| |
| protected body Protected_Type is |
| procedure Op is |
| begin |
| null; |
| end Op; |
| end Protected_Type; |
| |
| end C650001_0; |
| |
| |
| --==================================================================-- |
| |
| |
| with C650001_0; |
| package C650001_1 is |
| |
| type TC_Result_Kind is (OK, P_E, O_E); |
| |
| procedure TC_Display_Results (Actual : in TC_Result_Kind; |
| Expected: in TC_Result_Kind; |
| Message : in String); |
| |
| -- Dummy procedures: |
| |
| procedure Check_Tagged (P: C650001_0.Tagged_Limited); |
| procedure Check_Task (P: C650001_0.Task_Type); |
| procedure Check_Protected (P: C650001_0.Protected_Type); |
| procedure Check_Composite (P: C650001_0.Non_Task_Variant); |
| |
| end C650001_1; |
| |
| |
| --==================================================================-- |
| |
| |
| with Report; |
| package body C650001_1 is |
| |
| procedure TC_Display_Results (Actual : in TC_Result_Kind; |
| Expected: in TC_Result_Kind; |
| Message : in String) is |
| begin |
| if Actual /= Expected then |
| case Actual is |
| when OK => |
| Report.Failed ("No exception raised: " & Message); |
| when P_E => |
| Report.Failed ("Program_Error raised: " & Message); |
| when O_E => |
| Report.Failed ("Unexpected exception raised: " & Message); |
| end case; |
| end if; |
| end TC_Display_Results; |
| |
| |
| procedure Check_Tagged (P: C650001_0.Tagged_Limited) is |
| begin |
| null; |
| end; |
| |
| procedure Check_Task (P: C650001_0.Task_Type) is |
| begin |
| null; |
| end; |
| |
| procedure Check_Protected (P: C650001_0.Protected_Type) is |
| begin |
| null; |
| end; |
| |
| procedure Check_Composite (P: C650001_0.Non_Task_Variant) is |
| begin |
| null; |
| end; |
| |
| end C650001_1; |
| |
| |
| |
| --==================================================================-- |
| |
| |
| with C650001_0; |
| with C650001_1; |
| |
| with Report; |
| procedure C650001 is |
| begin |
| |
| Report.Test ("C650001", "Check that, for a function result type that " & |
| "is a return-by-reference type, Program_Error is raised " & |
| "if the return expression is a name that denotes an " & |
| "object view whose accessibility level is deeper than " & |
| "that of the master that elaborated the function body"); |
| |
| |
| |
| SUBTEST1: |
| declare |
| |
| Result: C650001_1.TC_Result_Kind; |
| PO : C650001_0.Protected_Type; |
| |
| function Return_Prot (P: C650001_0.Protected_Type) |
| return C650001_0.Protected_Type is |
| begin |
| Result := C650001_1.OK; |
| return P; -- Formal parameter (3). |
| exception |
| when Program_Error => |
| Result := C650001_1.P_E; -- Expected result. |
| return PO; |
| when others => |
| Result := C650001_1.O_E; |
| return PO; |
| end Return_Prot; |
| |
| begin -- SUBTEST1. |
| C650001_1.Check_Protected ( Return_Prot(PO) ); |
| C650001_1.TC_Display_Results (Result, C650001_1.P_E, "SUBTEST #1"); |
| exception |
| when others => |
| Report.Failed ("SUBTEST #1: Unexpected exception in outer block"); |
| end SUBTEST1; |
| |
| |
| |
| SUBTEST2: |
| declare |
| |
| Result: C650001_1.TC_Result_Kind; |
| Comp : C650001_0.Non_Task_Variant; |
| |
| function Return_Composite return C650001_0.Non_Task_Variant is |
| Local: C650001_0.Non_Task_Variant; |
| begin |
| Result := C650001_1.OK; |
| return (Local); -- Parenthesized local object (1). |
| exception |
| when Program_Error => |
| Result := C650001_1.P_E; -- Expected result. |
| return Comp; |
| when others => |
| Result := C650001_1.O_E; |
| return Comp; |
| end Return_Composite; |
| |
| begin -- SUBTEST2. |
| C650001_1.Check_Composite ( Return_Composite ); |
| C650001_1.TC_Display_Results (Result, C650001_1.P_E, "SUBTEST #2"); |
| exception |
| when others => |
| Report.Failed ("SUBTEST #2: Unexpected exception in outer block"); |
| end SUBTEST2; |
| |
| |
| |
| SUBTEST3: |
| declare |
| |
| Result: C650001_1.TC_Result_Kind; |
| Tsk : C650001_0.Task_Type; |
| TskArr: C650001_0.Task_Array; |
| |
| function Return_Task (P: C650001_0.Task_Array) |
| return C650001_0.Task_Type is |
| |
| function Inner return C650001_0.Task_Type is |
| begin |
| return P(P'First); -- OK: should not raise exception (6). |
| exception |
| when Program_Error => |
| Report.Failed ("SUBTEST #3: Program_Error incorrectly " & |
| "raised within function Inner"); |
| return Tsk; |
| when others => |
| Report.Failed ("SUBTEST #3: Unexpected exception " & |
| "raised within function Inner"); |
| return Tsk; |
| end Inner; |
| |
| begin -- Return_Task. |
| Result := C650001_1.OK; |
| return Inner; -- Call to local function (2). |
| exception |
| when Program_Error => |
| Result := C650001_1.P_E; -- Expected result. |
| return Tsk; |
| when others => |
| Result := C650001_1.O_E; |
| return Tsk; |
| end Return_Task; |
| |
| begin -- SUBTEST3. |
| C650001_1.Check_Task ( Return_Task(TskArr) ); |
| C650001_1.TC_Display_Results (Result, C650001_1.P_E, "SUBTEST #3"); |
| exception |
| when others => |
| Report.Failed ("SUBTEST #3: Unexpected exception in outer block"); |
| end SUBTEST3; |
| |
| |
| |
| SUBTEST4: |
| declare |
| |
| Result: C650001_1.TC_Result_Kind; |
| TagLim: C650001_0.Tagged_Limited; |
| |
| function Return_TagLim (P: C650001_0.Tagged_Limited'Class) |
| return C650001_0.Tagged_Limited is |
| begin |
| Result := C650001_1.OK; |
| return C650001_0.Tagged_Limited(P); -- Conversion of formal param (3). |
| exception |
| when Program_Error => |
| Result := C650001_1.P_E; -- Expected result. |
| return TagLim; |
| when others => |
| Result := C650001_1.O_E; |
| return TagLim; |
| end Return_TagLim; |
| |
| begin -- SUBTEST4. |
| C650001_1.Check_Tagged ( Return_TagLim(TagLim) ); |
| C650001_1.TC_Display_Results (Result, C650001_1.P_E, |
| "SUBTEST #4 (root type)"); |
| exception |
| when others => |
| Report.Failed ("SUBTEST #4: Unexpected exception in outer block"); |
| end SUBTEST4; |
| |
| |
| |
| SUBTEST5: |
| declare |
| Tsk : C650001_0.Task_Type; |
| begin -- SUBTEST5. |
| |
| declare |
| Result: C650001_1.TC_Result_Kind; |
| |
| type AccToFunc is access function return C650001_0.Task_Type; |
| |
| function Return_Global return C650001_0.Task_Type is |
| begin |
| return Tsk; -- OK: should not raise exception (4). |
| end Return_Global; |
| |
| function Return_Local return C650001_0.Task_Type is |
| Local : C650001_0.Task_Type; |
| begin |
| return Local; -- Propagate Program_Error. |
| end Return_Local; |
| |
| |
| function Return_Func (P: AccToFunc) return C650001_0.Task_Type is |
| begin |
| Result := C650001_1.OK; |
| return P.all; -- Function call (5). |
| exception |
| when Program_Error => |
| Result := C650001_1.P_E; |
| return Tsk; |
| when others => |
| Result := C650001_1.O_E; |
| return Tsk; |
| end Return_Func; |
| |
| RG : AccToFunc := Return_Global'Access; |
| RL : AccToFunc := Return_Local'Access; |
| |
| begin |
| C650001_1.Check_Task ( Return_Func(RG) ); |
| C650001_1.TC_Display_Results (Result, C650001_1.OK, |
| "SUBTEST #5 (global task)"); |
| |
| C650001_1.Check_Task ( Return_Func(RL) ); |
| C650001_1.TC_Display_Results (Result, C650001_1.P_E, |
| "SUBTEST #5 (local task)"); |
| exception |
| when others => |
| Report.Failed ("SUBTEST #5: Unexpected exception in outer block"); |
| end; |
| |
| end SUBTEST5; |
| |
| |
| |
| Report.Result; |
| |
| end C650001; |