1-- CD30005.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 Address clauses are supported for imported subprograms.
28--
29-- TEST DESCRIPTION:
30--      This test imports a simple C function and specifies it's location.
31--
32--      The implementation may choose to implement
33--      Impdef.CD30005_1_Foreign_Address so as to dynamically call a C
34--      function that returns the appropriate address for the external
35--      function identified by Impdef.CD30005_1_External_Name.
36--
37-- TEST FILES:
38--         CD300050.AM
39--         CD300051.C  -- the C function:  (included below for reference)
40--
41-- SPECIAL REQUIREMENTS:
42--      The file CD300051.C must be compiled with a C compiler.
43--      Implementation dialects of C may require alteration of the C program
44--      syntax.  The program is included here for reference:
45--
46--            int _cd30005_1( Value )
47--            {
48--               /* int Value */
49--
50--               return Value + 1;
51--            }
52--
53--      Implementations may require special linkage commands to include the
54--      C code.
55--
56-- APPLICABILITY CRITERIA:
57--    This test is not applicable to implementations not providing an interface
58--    to C language units.  OTHERWISE:
59--
60--      All implementations must attempt to compile this test.
61--
62--      For implementations validating against Systems Programming Annex (C):
63--        this test must execute and report PASSED.
64--
65--      For implementations not validating against Annex C:
66--        this test may report compile time errors at one or more points
67--        indicated by "-- ANX-C RQMT", in which case it may be graded as inapplicable.
68--        Otherwise, the test must execute and report PASSED.
69--
70--
71-- CHANGE HISTORY:
72--      22 JUL 95   SAIC   Initial version
73--      30 APR 96   SAIC   Added commentary for 2.1
74--      09 MAY 96   SAIC   Changed reporting for 2.1
75--      04 NOV 96   SAIC   Added use type System.Address
76--      16 FEB 98   EDS    Modified documentation.
77--      29 JUN 98   EDS    Modified main program name.
78--!
79
80----------------------------------------------------------------- CD30005_0
81
82with Impdef;
83package CD30005_0 is
84
85--      Check that Address clauses are supported for imported subprograms.
86
87  type External_Func_Ref is access function(N:Integer) return Integer;
88    pragma Convention( C, External_Func_Ref );
89
90
91  function CD30005_1( I: Integer ) return Integer;
92
93    pragma Import( C, CD30005_1,
94                   Impdef.CD30005_1_External_Name );          -- N/A => ERROR.
95
96      for CD30005_1'Address use
97        Impdef.CD30005_1_Foreign_Address;                     -- ANX-C RQMT.
98
99  procedure TC_Check_Imports;
100
101end CD30005_0;
102
103-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
104
105with Report;
106with System.Storage_Elements;
107with System.Address_To_Access_Conversions;
108package body CD30005_0 is
109
110  use type System.Address;
111
112  procedure TC_Check_Imports is
113    S   : External_Func_Ref := CD30005_1'Access;
114    I,K : Integer := 99;
115  begin
116
117    K := S.all(I);
118    if K /= 100 then
119      Report.Failed("C program returned" & Integer'Image(K));
120    end if;
121
122    I := CD30005_1( I );
123    if I /= 100 then
124      Report.Failed("C program returned" & Integer'Image(I));
125    end if;
126
127    if CD30005_1'Address /= Impdef.CD30005_1_Foreign_Address then
128      Report.Failed("Address not that specified");
129    end if;
130
131  end TC_Check_Imports;
132
133end CD30005_0;
134
135------------------------------------------------------------------- CD300050
136
137with Report;
138with CD30005_0;
139
140procedure CD300050 is
141
142begin  -- Main test procedure.
143
144  Report.Test ("CD30005",
145               "Check that Address clauses are supported for imported " &
146               "subprograms" );
147
148--      Check that Address clauses are supported for imported subprograms.
149
150  CD30005_0.TC_Check_Imports;
151
152  Report.Result;
153
154end CD300050;
155