1-- C490003.A
2--
3--                             Grant of Unlimited Rights
4--
5--     Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
6--     F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained
7--     unlimited rights in the software and documentation contained herein.
8--     Unlimited rights are defined in DFAR 252.227-7013(a)(19).  By making
9--     this public release, the Government intends to confer upon all
10--     recipients unlimited rights  equal to those held by the Government.
11--     These rights include rights to use, duplicate, release or disclose the
12--     released technical data and computer software in whole or in part, in
13--     any manner and for any purpose whatsoever, and to have or permit others
14--     to do so.
15--
16--                                    DISCLAIMER
17--
18--     ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
19--     DISCLOSED ARE AS IS.  THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
20--     WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
21--     SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
22--     OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
23--     PARTICULAR PURPOSE OF SAID MATERIAL.
24--*
25--
26-- OBJECTIVE:
27--      Check that a static expression is legal if its evaluation fails
28--      no language-defined check other than Overflow_Check. Check that such
29--      a static expression is legal if it is part of a larger static
30--      expression, even if its value is outside the base range of the
31--      expected type.
32--
33--      Check that if a static expression is part of the right operand of a
34--      short circuit control form whose value is determined by its left
35--      operand, it is not evaluated.
36--
37--      Check that a static expression in a non-static context is evaluated
38--      exactly.
39--
40-- TEST DESCRIPTION:
41--      The first part of the objective is tested by constructing static
42--      expressions which involve predefined operations of integer, floating
43--      point, and fixed point subtypes. Intermediate expressions within the
44--      static expressions have values outside the base range of the expected
45--      type. In one case, the extended-range intermediates are compared as
46--      part of a boolean expression. In the remaining two cases, further
47--      predefined operations on the intermediates bring the final result
48--      within the base range. An implementation which compiles these static
49--      expressions satisfies this portion of the objective. A check is
50--      performed at run-time to ensure that the static expressions evaluate
51--      to values within the base range of their respective expected types.
52--
53--      The second part of the objective is tested by constructing
54--      short-circuit control forms whose left operands have the values
55--      shown below:
56--
57--         (TRUE)  or else  (...)
58--         (FALSE) and then (...)
59--
60--      In both cases the left operand determines the value of the condition.
61--      In the test each right operand involves a division by zero, which will
62--      raise Constraint_Error if evaluated. A check is made that no exception
63--      is raised when each short-circuit control form is evaluated, and that
64--      the value of the condition is that of the left operand.
65--
66--      The third part of the objective is tested by evaluating static
67--      expressions involving many operations in contexts which do not
68--      require a static expression, and verifying that the exact
69--      mathematical results are calculated.
70--
71--
72-- CHANGE HISTORY:
73--      15 Sep 95   SAIC    Initial prerelease version for ACVC 2.1.
74--      20 Oct 96   SAIC    Modified expressions in C490003_0 to avoid
75--                          the use of universal operands.
76--
77--!
78
79with System;
80package C490003_0 is
81
82   type My_Flt is digits System.Max_Digits;
83
84   Flt_Range_Diff : My_Flt := (My_Flt'Base'Last - My_Flt'Base'First) -
85                              (My_Flt'Last - My_Flt'First);           -- OK.
86
87
88   type My_Fix is delta 0.125 range -128.0 .. 128.0;
89
90   Symmetric : Boolean := (My_Fix'Base'Last - My_Fix'Base'First) =
91                          (My_Fix'Base'Last + My_Fix'Base'Last);      -- OK.
92
93
94   Center : constant Integer := Integer'Base'Last -
95                                 (Integer'Base'Last -
96                                  Integer'Base'First) / 2;            -- OK.
97
98end C490003_0;
99
100
101     --==================================================================--
102
103
104with Ada.Numerics;
105package C490003_1 is
106
107   Zero       : constant := 0.0;
108   Pi         : constant := Ada.Numerics.Pi;
109
110   Two_Pi     : constant := 2.0 * Pi;
111   Half_Pi    : constant := Pi/2.0;
112
113   Quarter    : constant := 90.0;
114   Half       : constant := 180.0;
115   Full       : constant := 360.0;
116
117   Deg_To_Rad : constant := Half_Pi/90;
118   Rad_To_Deg : constant := 1.0/Deg_To_Rad;
119
120end C490003_1;
121
122
123     --==================================================================--
124
125
126with C490003_0;
127with C490003_1;
128
129with Report;
130procedure C490003 is
131begin
132   Report.Test ("C490003", "Check that static expressions failing "          &
133                "Overflow_Check are legal if part of a larger static "       &
134                "expression. Check that static expressions as right "        &
135                "operands of short-circuit control forms are not "           &
136                "evaluated if value of control form is determined by "       &
137                "left operand. Check that static expressions in non-static " &
138                "contexts are evaluated exactly");
139
140
141--
142-- Static expressions within larger static expressions:
143--
144
145
146   if C490003_0.Flt_Range_Diff not in C490003_0.My_Flt'Base'Range then
147      Report.Failed ("Error evaluating static expression: floating point");
148   end if;
149
150   if C490003_0.Symmetric not in Boolean'Range then
151      Report.Failed ("Error evaluating static expression: fixed point");
152   end if;
153
154   if C490003_0.Center not in Integer'Base'Range then
155      Report.Failed ("Error evaluating static expression: integer");
156   end if;
157
158
159--
160-- Short-circuit control forms:
161--
162
163   declare
164      N : constant := 0.0;
165   begin
166
167      begin
168         if not ( (N = 0.0) or else (1.0/N > 0.5) ) then
169            Report.Failed ("Error evaluating OR ELSE");
170         end if;
171      exception
172         when Constraint_Error =>
173            Report.Failed ("Right side of OR ELSE was evaluated");
174         when others           =>
175            Report.Failed ("OR ELSE: unexpected exception raised");
176      end;
177
178      begin
179         if (N /= 0.0) and then (1.0/N <= 0.5) then
180            Report.Failed ("Error evaluating AND THEN");
181         end if;
182      exception
183         when Constraint_Error =>
184            Report.Failed ("Right side of AND THEN was evaluated");
185         when others           =>
186            Report.Failed ("AND THEN: unexpected exception raised");
187      end;
188
189   end;
190
191
192--
193-- Exact evaluation of static expressions:
194--
195
196
197   declare
198      use C490003_1;
199
200      Left  : constant := 6.0 + 0.3125*( (Full*0.375) + (Half/2.4) -
201                             ((Quarter + 36.0)/3.0) )/10.0;            -- 11.25
202      Right : constant := (Pi/3.0) * 1.2 * (15.0/96.0);                -- Pi/16
203   begin
204      if Deg_To_Rad*Left /= Right then
205         Report.Failed ("Static expressions not evaluated exactly: #1");
206      end if;
207
208      if ((Pi*Rad_To_Deg)*2.0 + 4.0*Quarter)/16.0 /= Rad_To_Deg*(Pi/4.0) then
209         Report.Failed ("Static expressions not evaluated exactly: #2");
210      end if;
211   end;
212
213
214   Report.Result;
215end C490003;
216