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 + -
显示快捷键?