-- CD30005.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 Address clauses are supported for imported subprograms.
--
-- TEST DESCRIPTION:
--      This test imports a simple C function and specifies it's location.
--
--      The implementation may choose to implement
--      Impdef.CD30005_1_Foreign_Address so as to dynamically call a C
--      function that returns the appropriate address for the external
--      function identified by Impdef.CD30005_1_External_Name.
--
-- TEST FILES:
--         CD300050.AM
--         CD300051.C  -- the C function:  (included below for reference)
--
-- SPECIAL REQUIREMENTS:
--      The file CD300051.C must be compiled with a C compiler.
--      Implementation dialects of C may require alteration of the C program
--      syntax.  The program is included here for reference:
--
--            int _cd30005_1( Value )
--            {
--               /* int Value */
--
--               return Value + 1;
--            }
--
--      Implementations may require special linkage commands to include the
--      C code.
--
-- APPLICABILITY CRITERIA:
--    This test is not applicable to implementations not providing an interface
--    to C language units.  OTHERWISE:
--
--      All implementations must attempt to compile this test.
--
--      For implementations validating against Systems Programming Annex (C):
--        this test must execute and report PASSED.
--
--      For implementations not validating against Annex C:
--        this test may report compile time errors at one or more points
--        indicated by "-- ANX-C RQMT", in which case it may be graded as inapplicable.
--        Otherwise, the test must execute and report PASSED.
--
--
-- CHANGE HISTORY:
--      22 JUL 95   SAIC   Initial version
--      30 APR 96   SAIC   Added commentary for 2.1
--      09 MAY 96   SAIC   Changed reporting for 2.1
--      04 NOV 96   SAIC   Added use type System.Address
--      16 FEB 98   EDS    Modified documentation.
--      29 JUN 98   EDS    Modified main program name.
--!

----------------------------------------------------------------- CD30005_0

with Impdef;
package CD30005_0 is

--      Check that Address clauses are supported for imported subprograms.

  type External_Func_Ref is access function(N:Integer) return Integer;
    pragma Convention( C, External_Func_Ref );


  function CD30005_1( I: Integer ) return Integer;

    pragma Import( C, CD30005_1,
                   Impdef.CD30005_1_External_Name );          -- N/A => ERROR.

      for CD30005_1'Address use
        Impdef.CD30005_1_Foreign_Address;                     -- ANX-C RQMT.

  procedure TC_Check_Imports;

end CD30005_0;

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

with Report;
with System.Storage_Elements;
with System.Address_To_Access_Conversions;
package body CD30005_0 is

  use type System.Address;

  procedure TC_Check_Imports is
    S   : External_Func_Ref := CD30005_1'Access;
    I,K : Integer := 99;
  begin

    K := S.all(I);
    if K /= 100 then
      Report.Failed("C program returned" & Integer'Image(K));
    end if;

    I := CD30005_1( I );
    if I /= 100 then
      Report.Failed("C program returned" & Integer'Image(I));
    end if;

    if CD30005_1'Address /= Impdef.CD30005_1_Foreign_Address then
      Report.Failed("Address not that specified");
    end if;

  end TC_Check_Imports;

end CD30005_0;

------------------------------------------------------------------- CD300050

with Report;
with CD30005_0;

procedure CD300050 is

begin  -- Main test procedure.

  Report.Test ("CD30005",
               "Check that Address clauses are supported for imported " &
               "subprograms" );
   
--      Check that Address clauses are supported for imported subprograms.

  CD30005_0.TC_Check_Imports;

  Report.Result;

end CD300050;
