blob: 1056b65bfccb3c4cc2528a9e00e33341455f0b53 [file] [log] [blame]
-- CA21001.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 revised 10.2.1(11) from Technical
-- Corrigendum 1 (originally discussed as AI95-00002).
-- A package subunit whose parent is a preelaborated subprogram need
-- not be preelaborable.
--
-- TEST DESCRIPTION
-- We create several preelaborated library procedures with
-- non-preelaborable package body subunits. We try various levels
-- of nesting of package and procedure subunits.
--
-- CHANGE HISTORY:
-- 29 JUN 1999 RAD Initial Version
-- 23 SEP 1999 RLB Improved comments, renamed, issued.
--
--!
procedure CA21001_1(X: out Integer);
pragma Preelaborate(CA21001_1);
procedure CA21001_1(X: out Integer) is
function F return Integer is separate;
package Sub is
function G(X: Integer) return Integer;
-- Returns X + 1.
Not_Preelaborable: Integer := F; -- OK, by AI-2.
end Sub;
package body Sub is separate;
begin
X := -1;
X := F;
X := Sub.G(X);
end CA21001_1;
separate(CA21001_1)
package body Sub is
package Sub_Sub is
-- Empty.
end Sub_Sub;
package body Sub_Sub is separate;
function G(X: Integer) return Integer is separate;
begin
Not_Preelaborable := G(F); -- OK, by AI-2.
if Not_Preelaborable /= 101 then
raise Program_Error; -- Can't call Report.Failed, here,
-- because Report is not preelaborated.
end if;
end Sub;
separate(CA21001_1.Sub)
package body Sub_Sub is
begin
X := X; -- OK by AI-2.
end Sub_Sub;
separate(CA21001_1.Sub)
function G(X: Integer) return Integer is
package G_Sub is
function H(X: Integer) return Integer;
-- Returns X + 1.
Not_Preelaborable: Integer := F; -- OK, by AI-2.
end G_Sub;
package body G_Sub is separate;
begin
return G_Sub.H(X);
end G;
separate(CA21001_1.Sub.G)
package body G_Sub is
function H(X: Integer) return Integer is separate;
begin
Not_Preelaborable := H(F); -- OK, by AI-2.
if Not_Preelaborable /= 101 then
raise Program_Error; -- Can't call Report.Failed, here,
-- because Report is not preelaborated.
end if;
end G_Sub;
separate(CA21001_1.Sub.G.G_Sub)
function H(X: Integer) return Integer is
begin
return X + 1;
end H;
separate(CA21001_1)
function F return Integer is
package F_Sub is
-- Empty.
end F_Sub;
package body F_Sub is separate;
begin
return 100;
end F;
separate(CA21001_1.F)
package body F_Sub is
True_Var: Boolean;
begin
True_Var := True;
if True_Var then -- OK by AI-2.
X := X;
else
X := X + 2;
end if;
end F_Sub;
with Report; use Report;
with CA21001_1;
procedure CA21001 is
X: Integer := 0;
begin
Test("CA21001",
"Test that a package subunit whose parent is a preelaborated"
& " subprogram need not be preelaborable");
CA21001_1(X);
if X /= 101 then
Failed("Bad value for X");
end if;
Result;
end CA21001;