-- CXH30031.AM -- -- Grant of Unlimited Rights -- -- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687, -- F08630-91-C-0015, and DCA100-97-D-0025, 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 WHATSOEVER, 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 pragma Reviewable. -- Check that pragma Reviewable is accepted as a configuration pragma. -- -- TEST DESCRIPTION -- This test checks that pragma Reviewable is processed as a -- configuration pragma. See CXH3001 for testing pragma Reviewable as -- other than a configuration pragma. -- -- TEST FILES: -- The following files comprise this test: -- -- CXH30030.A -- => CXH30031.AM -- -- APPLICABILITY CRITERIA: -- This test is only applicable for a compiler attempting validation -- for the Safety and Security Annex. -- -- SPECIAL REQUIREMENTS -- The implementation must process a configuration pragma which is not -- part of any Compilation Unit; the method employed is implementation -- defined. -- -- -- CHANGE HISTORY: -- 26 OCT 95 SAIC Initial version for 2.1 -- 07 JUN 96 SAIC Revised by reviewer request -- 03 NOV 96 SAIC Documentation revision -- -- 03 NOV 96 Keith Documentation revision -- 27 AUG 99 RLB Removed result dependence on uninitialized object. -- 30 AUG 99 RLB Repaired the above. -- --! pragma Reviewable; ----------------------------------------------------------------- CXH3003_0 package CXH3003_0 is type Enum is (Item,Stuff,Things); type Int is range 0..256; type Unt is mod 256; type Flt is digits 5; type Fix is delta 0.5 range -1.0..1.0; type Root(Disc: Enum) is tagged record I: Int; U:Unt; end record; type List is array(Unt) of Root(Stuff); type A_List is access List; type A_Proc is access procedure(R:Root); procedure P(R:Root); function F return A_Proc; Global_Variable : Boolean := False; end CXH3003_0; -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- with Report; package body CXH3003_0 is procedure P(R:Root) is Warnable : Positive := 0; -- OPTIONAL WARNING begin case R.Disc is when Item => Report.Comment("Got Item"); when Stuff => Report.Comment("Got Stuff"); when Things => Report.Comment("Got Things"); end case; if Report.Ident_Int( Warnable ) = 0 then Global_Variable := not Global_Variable; -- known to be initialized end if; end P; function F return A_Proc is begin return P'Access; end F; end CXH3003_0; ----------------------------------------------------------------- CXH3003_1 package CXH3003_0.CXH3003_1 is protected PT is entry Set(Switch: Boolean); function Enquire return Boolean; private Toggle : Boolean; end PT; task TT is entry Release; end TT; end CXH3003_0.CXH3003_1; -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- package body CXH3003_0.CXH3003_1 is protected body PT is entry Set(Switch: Boolean) when True is begin Toggle := Switch; end Set; function Enquire return Boolean is begin return Toggle; end Enquire; end PT; task body TT is begin loop accept Release; exit when Global_Variable; end loop; end TT; -- TT activation end CXH3003_0.CXH3003_1; ------------------------------------------------------------------- CXH3003 with Report; with CXH3003_0.CXH3003_1; procedure CXH30031 is begin Report.Test("CXH3003", "Check pragma Reviewable as a configuration pragma"); Block: declare A_Truth : Boolean; Message : String := Report.Ident_Str( "Bad value encountered" ); begin begin A_Truth := Report.Ident_Bool( True ) or A_Truth; -- not initialized if not A_Truth then Report.Comment ("True or Uninit = False"); A_Truth := Report.Ident_Bool (True); else A_Truth := Report.Ident_Bool (True); -- We do this separately on each branch in order to insure that a -- clever optimizer can find out little about this value. Ident_Bool -- is supposed to be opaque to any optimizer. end if; exception when Constraint_Error | Program_Error => -- Possible results of accessing an uninitialized object. A_Truth := Report.Ident_Bool (True); end; CXH3003_0.CXH3003_1.PT.Set( A_Truth ); CXH3003_0.Global_Variable := A_Truth; CXH3003_0.CXH3003_1.TT.Release; -- rendezvous with TT while CXH3003_0.CXH3003_1.TT'Callable loop -- wait for TT to complete delay 1.0; end loop; if not CXH3003_0.CXH3003_1.PT.Enquire or not CXH3003_0.Global_Variable then Report.Failed(Message); end if; end Block; Report.Result; end CXH30031;