c490003.a

来自「linux下编程用 编译软件」· A 代码 · 共 216 行

A
216
字号
-- C490003.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 that a static expression is legal if its evaluation fails--      no language-defined check other than Overflow_Check. Check that such--      a static expression is legal if it is part of a larger static--      expression, even if its value is outside the base range of the--      expected type.----      Check that if a static expression is part of the right operand of a--      short circuit control form whose value is determined by its left--      operand, it is not evaluated.----      Check that a static expression in a non-static context is evaluated--      exactly.---- TEST DESCRIPTION:--      The first part of the objective is tested by constructing static--      expressions which involve predefined operations of integer, floating--      point, and fixed point subtypes. Intermediate expressions within the--      static expressions have values outside the base range of the expected--      type. In one case, the extended-range intermediates are compared as--      part of a boolean expression. In the remaining two cases, further--      predefined operations on the intermediates bring the final result--      within the base range. An implementation which compiles these static--      expressions satisfies this portion of the objective. A check is--      performed at run-time to ensure that the static expressions evaluate--      to values within the base range of their respective expected types.----      The second part of the objective is tested by constructing--      short-circuit control forms whose left operands have the values--      shown below:----         (TRUE)  or else  (...)--         (FALSE) and then (...)--    --      In both cases the left operand determines the value of the condition.--      In the test each right operand involves a division by zero, which will--      raise Constraint_Error if evaluated. A check is made that no exception--      is raised when each short-circuit control form is evaluated, and that--      the value of the condition is that of the left operand.--    --      The third part of the objective is tested by evaluating static--      expressions involving many operations in contexts which do not--      require a static expression, and verifying that the exact--      mathematical results are calculated.--    ---- CHANGE HISTORY:--      15 Sep 95   SAIC    Initial prerelease version for ACVC 2.1.--      20 Oct 96   SAIC    Modified expressions in C490003_0 to avoid--                          the use of universal operands.----!with System;package C490003_0 is   type My_Flt is digits System.Max_Digits;   Flt_Range_Diff : My_Flt := (My_Flt'Base'Last - My_Flt'Base'First) -                              (My_Flt'Last - My_Flt'First);           -- OK.   type My_Fix is delta 0.125 range -128.0 .. 128.0;   Symmetric : Boolean := (My_Fix'Base'Last - My_Fix'Base'First) =                           (My_Fix'Base'Last + My_Fix'Base'Last);      -- OK.   Center : constant Integer := Integer'Base'Last -                                 (Integer'Base'Last -                                  Integer'Base'First) / 2;            -- OK.end C490003_0;     --==================================================================--with Ada.Numerics;package C490003_1 is   Zero       : constant := 0.0;   Pi         : constant := Ada.Numerics.Pi;   Two_Pi     : constant := 2.0 * Pi;   Half_Pi    : constant := Pi/2.0;   Quarter    : constant := 90.0;   Half       : constant := 180.0;   Full       : constant := 360.0;   Deg_To_Rad : constant := Half_Pi/90;   Rad_To_Deg : constant := 1.0/Deg_To_Rad;   end C490003_1;     --==================================================================--with C490003_0;with C490003_1;with Report;procedure C490003 isbegin   Report.Test ("C490003", "Check that static expressions failing "          &                "Overflow_Check are legal if part of a larger static "       &                "expression. Check that static expressions as right "        &                "operands of short-circuit control forms are not "           &                "evaluated if value of control form is determined by "       &                "left operand. Check that static expressions in non-static " &                "contexts are evaluated exactly");---- Static expressions within larger static expressions:--   if C490003_0.Flt_Range_Diff not in C490003_0.My_Flt'Base'Range then      Report.Failed ("Error evaluating static expression: floating point");   end if;   if C490003_0.Symmetric not in Boolean'Range then      Report.Failed ("Error evaluating static expression: fixed point");   end if;   if C490003_0.Center not in Integer'Base'Range then      Report.Failed ("Error evaluating static expression: integer");   end if;---- Short-circuit control forms:--   declare      N : constant := 0.0;   begin      begin         if not ( (N = 0.0) or else (1.0/N > 0.5) ) then            Report.Failed ("Error evaluating OR ELSE");         end if;      exception         when Constraint_Error =>            Report.Failed ("Right side of OR ELSE was evaluated");         when others           =>            Report.Failed ("OR ELSE: unexpected exception raised");      end;      begin         if (N /= 0.0) and then (1.0/N <= 0.5) then            Report.Failed ("Error evaluating AND THEN");         end if;      exception         when Constraint_Error =>            Report.Failed ("Right side of AND THEN was evaluated");         when others           =>            Report.Failed ("AND THEN: unexpected exception raised");      end;   end;---- Exact evaluation of static expressions:--   declare      use C490003_1;      Left  : constant := 6.0 + 0.3125*( (Full*0.375) + (Half/2.4) -                             ((Quarter + 36.0)/3.0) )/10.0;            -- 11.25      Right : constant := (Pi/3.0) * 1.2 * (15.0/96.0);                -- Pi/16   begin      if Deg_To_Rad*Left /= Right then         Report.Failed ("Static expressions not evaluated exactly: #1");      end if;      if ((Pi*Rad_To_Deg)*2.0 + 4.0*Quarter)/16.0 /= Rad_To_Deg*(Pi/4.0) then         Report.Failed ("Static expressions not evaluated exactly: #2");      end if;   end;   Report.Result;end C490003;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?