view gcc/testsuite/ada/acats/tests/c3/c3a0008.a @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
line wrap: on
line source

-- C3A0008.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 subprogram references may be passed as parameters using 
--      access-to-subprogram types. Check that the passed subprograms may 
--      be invoked from within the called subprogram.
--
-- TEST DESCRIPTION:
--      Declare an access to function type in a package specification.  
--      Declare three different trig functions that can be referred to by 
--      the access to function type.  
--
--      In the main program, call each function indirectly by passing the 
--      access to subprogram value as parameter.
--
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--
--!


package Integrate_Lookup is

  TC_Log_Call  : Boolean := False;

  TC_Cos_Call  : Boolean := False;

  TC_Sine_Call : Boolean := False;

  -- Type accesses to functions Log, Sine, or Cos
  type Integrand_Ptr is access function        
     (Angle : Float) return Float;

  function Log  (Angle : in Float) return Float;        

  function Sine (Angle : in Float) return Float;         

  function Cos  (Angle : in Float) return Float;        

  function Integrate  (Func : Integrand_Ptr; From, To: Float) 
    return Float;

end Integrate_Lookup;


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


package body Integrate_Lookup is


  function Log (Angle : in Float) return Float is
  begin
     TC_Log_Call := True;
     return 0.1;
  end Log;


  function Sine (Angle : in Float) return Float is
  begin
     TC_Sine_Call := True;
     return 0.0;
  end Sine;


  function Cos  (Angle : in Float) return Float is
  begin
     TC_Cos_Call := True;
     return 1.0;
  end Cos;


  function Integrate (Func : Integrand_Ptr; From, To: Float) 
    return Float is
     Theta : Float;
  begin
     -- calls the actual subprogram passed as parameter
     Theta := Func (From) + Func (To);
     return Theta;
  end Integrate;

end Integrate_Lookup;


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


with Report;

with Integrate_Lookup; 

procedure C3A0008 is

  Area : Float := 0.0;

begin

  Report.Test ("C3A0008", "Check that subprogram references may be passed "
                        & "as parameters using access-to-subprogram types. " 
                       & "Check that the passed subprograms may be invoked "
                        & "from within the called subprogram");

  Area := Integrate_Lookup.Integrate
            (Integrate_Lookup.Log'Access, 1.0, 2.0);

  If not Integrate_Lookup.TC_Log_Call or Area /= 0.2 then
     Report.Failed ("Incorrect Log result");
  end if;

  Area := Integrate_Lookup.Integrate
            (Integrate_Lookup.Sine'Access, 1.0, 2.0);

  If not Integrate_Lookup.TC_Sine_Call or Area /= 0.0 then
     Report.Failed ("Incorrect Sine result");
  end if;

  Area := Integrate_Lookup.Integrate
            (Integrate_Lookup.Cos'Access, 1.0, 2.0);

  If not Integrate_Lookup.TC_Cos_Call or Area /= 2.0 then
     Report.Failed ("Incorrect Cos result");
  end if;

  Report.Result;

end C3A0008;