c854002.a

来自「用于进行gcc测试」· A 代码 · 共 186 行

A
186
字号
-- C854002.A----                             Grant of Unlimited Rights----     Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687 and--     F08630-91-C-0015, 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 WHATSOVER, 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 the requirements of the new 8.5.4(8.A) from Technical--     Corrigendum 1 (originally discussed as AI95-00064).--     This paragraph requires an elaboration check on renamings-as-body:--     even if the body of the ultimately-called subprogram has been--     elaborated, the check should fail if the renaming-as-body--     itself has not yet been elaborated.---- TEST DESCRIPTION--     We declare two functions F and G, and ensure that they are--     elaborated before anything else, by using pragma Pure.  Then we--     declare two renamings-as-body: the renaming of F is direct, and--     the renaming of G is via an access-to-function object.  We call--     the renamings during elaboration, and check that they raise--     Program_Error.  We then call them again after elaboration; this--     time, they should work.---- CHANGE HISTORY:--      29 JUN 1999   RAD   Initial Version--      23 SEP 1999   RLB   Improved comments, renamed, issued.--      28 JUN 2002   RLB   Added pragma Elaborate_All for Report.--!package C854002_1 is    pragma Pure;    -- Empty.end C854002_1;package C854002_1.Pure is    pragma Pure;    function F return String;    function G return String;end C854002_1.Pure;with C854002_1.Pure;package C854002_1.Renamings is    F_Result: constant String := C854002_1.Pure.F; -- Make sure we can call F.    function Renamed_F return String;    G_Result: constant String := C854002_1.Pure.G;    type String_Function is access function return String;    G_Pointer: String_Function := null;        -- Will be set to C854002_1.Pure.G'Access in the body.    function Renamed_G return String;end C854002_1.Renamings;package C854002_1.Caller is    -- These procedures call the renamings; when called during elaboration,    -- we pass Should_Fail => True, which checks that Program_Error is    -- raised.  Later, we use Should_Fail => False.    procedure Call_Renamed_F(Should_Fail: Boolean);    procedure Call_Renamed_G(Should_Fail: Boolean);end C854002_1.Caller;with Report; use Report; pragma Elaborate_All (Report);with C854002_1.Renamings;package body C854002_1.Caller is    Some_Error: exception;    procedure Call_Renamed_F(Should_Fail: Boolean) is    begin        if Should_Fail then            begin                Failed(C854002_1.Renamings.Renamed_F);                raise Some_Error;                    -- This raise statement is necessary, because the                    -- Report package has a bug -- if Failed is called                    -- before Test, then the failure is ignored, and the                    -- test prints "PASSED".                    -- Presumably, this raise statement will cause the                    -- program to crash, thus avoiding the PASSED message.            exception                when Program_Error =>                    Comment("Program_Error -- OK");            end;        else            if C854002_1.Renamings.F_Result /= C854002_1.Renamings.Renamed_F then                Failed("Bad result from renamed F");            end if;        end if;    end Call_Renamed_F;    procedure Call_Renamed_G(Should_Fail: Boolean) is    begin        if Should_Fail then            begin                Failed(C854002_1.Renamings.Renamed_G);                raise Some_Error;            exception                when Program_Error =>                    Comment("Program_Error -- OK");            end;        else            if C854002_1.Renamings.G_Result /= C854002_1.Renamings.Renamed_G then                Failed("Bad result from renamed G");            end if;        end if;    end Call_Renamed_G;begin    -- At this point, the bodies of Renamed_F and Renamed_G have not yet    -- been elaborated, so calling them should raise Program_Error:    Call_Renamed_F(Should_Fail => True);    Call_Renamed_G(Should_Fail => True);end C854002_1.Caller;package body C854002_1.Pure is    function F return String is    begin        return "This is function F";    end F;    function G return String is    begin        return "This is function G";    end G;end C854002_1.Pure;with C854002_1.Pure;with C854002_1.Caller; pragma Elaborate(C854002_1.Caller);    -- This pragma ensures that this package body (Renamings)    -- will be elaborated after Caller, so that when Caller calls    -- the renamings during its elaboration, the renamings will    -- not have been elaborated (although what the rename have been).package body C854002_1.Renamings is    function Renamed_F return String renames C854002_1.Pure.F;    package Dummy is end; -- So we can insert statements here.    package body Dummy is    begin        G_Pointer := C854002_1.Pure.G'Access;    end Dummy;    function Renamed_G return String renames G_Pointer.all;end C854002_1.Renamings;with Report; use Report;with C854002_1.Caller;procedure C854002 isbegin    Test("C854002",         "An elaboration check is performed for a call to a subprogram"         & " whose body is given as a renaming-as-body");    -- By the time we get here, all library units have been elaborated,    -- so the following calls should not raise Program_Error:    C854002_1.Caller.Call_Renamed_F(Should_Fail => False);    C854002_1.Caller.Call_Renamed_G(Should_Fail => False);    Result;end C854002;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?