-- 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;