blob: 19bca35984edf7ca33d308ecc8bc626c9dc14d45 [file] [log] [blame]
-- 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 is
begin
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;