summaryrefslogtreecommitdiff
path: root/gcc/testsuite/ada/acats/tests/c3/c3a0006.a
blob: effab3465811671874e98662d2b4761aa635078b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
-- C3A0006.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 access to subprogram may be stored within data 
--      structures, and that the access to subprogram can subsequently 
--      be called. 
-- 
-- TEST DESCRIPTION:
--      Declare an access to function type in a package specification.  
--      Declare an array of the access type.  Declare three different 
--      functions that can be referred to by the access to function type.  
--      
--      In the main program, declare a key function that builds the array 
--      by calling each function indirectly through the access value.
--
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--
--!


package C3A0006_0 is

   TC_Sine_Call  : Integer := 0;
   TC_Cos_Call   : Integer := 0;
   TC_Tan_Call   : Integer := 0;

   Sine_Value    : Float :=  4.0;
   Cos_Value     : Float :=  8.0;
   Tan_Value     : Float := 10.0;

   -- Type accesses to any function
   type Trig_Function_Ptr is access function        
      (Angle : in Float) return Float;

   function Sine (Angle : in Float) return Float;         

   function Cos  (Angle : in Float) return Float;        

   function Tan  (Angle : in Float) return Float;         

end C3A0006_0;


-----------------------------------------------------------------------------


package body C3A0006_0 is

   function Sine (Angle : in Float) return Float is
   begin
     TC_Sine_Call := TC_Sine_Call + 1;
     Sine_Value := Sine_Value + Angle;
     return Sine_Value;
   end Sine;


   function Cos  (Angle: in Float) return Float is
   begin
     TC_Cos_Call := TC_Cos_Call + 1;
     Cos_Value := Cos_Value - Angle;
     return Cos_Value;
   end Cos;


   function Tan (Angle : in Float) return Float is
   begin
     TC_Tan_Call := TC_Tan_Call + 1;
     Tan_Value := (Tan_Value + (Tan_Value * Angle));
     return Tan_Value;
   end Tan;


end C3A0006_0;

-----------------------------------------------------------------------------


with Report;

with C3A0006_0; 

procedure C3A0006 is

   Trig_Value, Theta  : Float := 0.0;

   Total_Routines     : constant := 3;

   Sine_Total         : constant := 7.0;
   Cos_Total          : constant := 5.0;
   Tan_Total          : constant := 75.0;

   Trig_Table : array (1 .. Total_Routines) of C3A0006_0.Trig_Function_Ptr;


   -- Key function to build the table
   function Call_Trig_Func (Func : C3A0006_0.Trig_Function_Ptr;
                            Operand : Float) return Float is 
   begin
      return (Func(Operand));
   end Call_Trig_Func;


begin

   Report.Test ("C3A0006", "Check that access to subprogram may be " &
                "stored within data structures, and that the access " &
                "to subprogram can subsequently be called");

   Trig_Table := (C3A0006_0.Sine'Access, C3A0006_0.Cos'Access, 
                  C3A0006_0.Tan'Access);

   -- increase the value of Theta to build the table
   for I in 1 .. Total_Routines loop
      Theta := Theta + 0.5;
      for J in 1 .. Total_Routines loop
         Trig_Value     := Call_Trig_Func (Trig_Table(J), Theta);
      end loop;
   end loop;

   if C3A0006_0.TC_Sine_Call /= Total_Routines 
     or C3A0006_0.TC_Cos_Call /= Total_Routines
     or C3A0006_0.TC_Tan_Call /= Total_Routines then
        Report.Failed ("Incorrect subprograms result");
   end if;

   if C3A0006_0.Sine_Value /= Sine_Total
     or C3A0006_0.Cos_Value /= Cos_Total
     or C3A0006_0.Tan_Value /= Tan_Total then
        Report.Failed ("Incorrect values returned from subprograms");
   end if;

   if Trig_Value /= Tan_Total then
        Report.Failed ("Incorrect call order.");
   end if;

   Report.Result;

end C3A0006;