blob: 4ed41b4d06f08ff32ad719e8e61f351a19a73d04 [file] [log] [blame]
-- 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;