-- CXH3001.A -- -- 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 -- The test requires that the configuration pragma Reviewable -- be processed. The following package contains a simple "one of each -- construct in the language" to check that the configuration pragma has -- not disallowed some feature of the language. This test should generate -- no errors. -- -- APPLICABILITY CRITERIA: -- This test is only applicable for a compiler attempting validation -- for the Safety and Security Annex. -- -- PASS/FAIL CRITERIA: -- This test passes if it correctly compiles, executes, and reports PASS. -- It fails if the pragma is rejected. The effect of the pragma should -- be to produce a listing with information, including warnings, as -- required in H.3.1. Specific form and contents of this listing are not -- required by this test and are not part of the PASS/FAIL criteria. -- -- SPECIAL REQUIREMENTS -- The implementation must process a configuration pragma which is not -- part of any Compilation Unit; the method employed is implementation -- defined. -- -- Pragma Reviewable requires that the implementation provide the -- following information for the compilation units in this test: -- -- o Where compiler-generated run-time checks remain (6) -- -- o Identification of any construct with a language-defined check -- that is recognized prior to runtime as certain to fail if -- executed (7) -- -- o For each reference to a scalar object, an identification of -- the reference as either "known to be initialized," -- or "possibly uninitialized" (8) -- -- o Where run-time support routines are implicitly invoked (9) -- -- o An object code listing including: (10) -- -- o Machine instructions with relative offsets (11) -- -- o Where each data object is stored during its lifetime (12) -- -- o Correspondence with the source program (13) -- -- o Identification of each construct for which the implementation -- detects the possibility of erroneous execution (14) -- -- o For each subprogram, block, task or other construct implemented by -- reserving and subsequently freezing an area of the run-time stack, -- an identification of the length of the fixed-size portion of -- the area and an indication of whether the non-fixed size portion -- is reserved on the stack or in a dynamically managed storage -- region (15) -- -- -- CHANGE HISTORY: -- 26 OCT 95 SAIC Initial version -- 12 NOV 96 SAIC Revised for 2.1 -- 27 AUG 99 RLB Removed result dependence on uninitialized object. -- 30 AUG 99 RLB Repaired the above. -- --! ---------------------------- CONFIGURATION PRAGMAS ----------------------- pragma Reviewable; -- OK -- configuration pragma ------------------------ END OF CONFIGURATION PRAGMAS -------------------- ----------------------------------------------------------------- CXH3001_0 package CXH3001_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; protected PT is entry Set(Switch: Boolean); function Enquire return Boolean; private Toggle : Boolean; end PT; task TT is entry Release; end TT; Global_Variable : Boolean := False; end CXH3001_0; -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- with Report; package body CXH3001_0 is procedure P(R:Root) is Warnable : Positive := 0; -- (7) -- OPTIONAL WARNING -- this would raise Constraint_Error if P were ever called, however -- this test never calls P. 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; -- (8) known to be initialized end if; end P; function F return A_Proc is begin return P'Access; end F; 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; -- (9) TT activation end CXH3001_0; ------------------------------------------------------------------- CXH3001 with Report; with CXH3001_0; procedure CXH3001 is begin Report.Test("CXH3001", "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; -- (8) 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; CXH3001_0.PT.Set( A_Truth ); CXH3001_0.Global_Variable := A_Truth; CXH3001_0.TT.Release; -- (9) rendezvous with TT while CXH3001_0.TT'Callable loop delay 1.0; -- wait for TT to become non-callable end loop; if not CXH3001_0.PT.Enquire or not CXH3001_0.Global_Variable or CXH3001_0.TT'Callable then Report.Failed(Message); end if; end Block; Report.Result; end CXH3001;