-- LA140172.AM
--
--                             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 a compilation unit may not depend semantically
--      on two different versions of the same compilation unit.
--      Check the case where a separate function semantically 
--      depends on a library level generic function that is changed.
--
-- TEST DESCRIPTION:
--      This test compiles a generic function, and a procedure that 
--      withs the function.  Then, a new version of the generic 
--      function body is compiled (in a separate file, simulating 
--      and editing modification to the unit).  Unless automatic 
--      recompilation is supported, this test should fail to link.  
--      Otherwise, the test should recompile and link the correct 
--      version of the withed function and report "PASSED" at 
--      execution time.
--
-- SPECIAL REQUIREMENTS:
--      To build this test:
--         1) Compile the file LA140170 (and include the results in the
--            program library).
--         2) Compile the file LA140171 (and include the results in the
--            program library).
--         3) Compile the file LA140172 (and include the results in the
--            program library).
--         4) Compile the file LA140173 (and include the results in the
--            program library).
--         5) Attempt to build an executable image.
--         6) If an executable image results, run it.
--
-- TEST FILES:
--      This test consists of the following files:
--         LA140170.A
--         LA140171.A
--      -> LA140172.AM
--         LA140173.A
--
-- PASS/FAIL CRITERIA:    
--      The test passes if a link time error message reports that 
--      LA14017_1.Inc is missing or obsolete and no executable image
--      results.  The test also passes if an executable image is produced
--      and reports "PASSED" (in the case where the implementation supports
--      automatic recompilation).            
--
--
-- CHANGE HISTORY:
--     01 MAY 95   ACVC 1.12   LA5008M baseline version
--     16 JUN 95   SAIC        Initial version
--     03 MAR 96   SAIC        First revision after review
--     17 NOV 96   SAIC        Modified unit names and prologue to conform
--                             to coding conventions.
--     07 DEC 96   SAIC        Moved LA14017_1 to a separate file.
--
--!

separate (LA14017_1)     -- This dependency must be resolved 
                         -- after LA140171.A is compiled.

function Inc (Param : integer) return integer is
begin
     return Param + integer (count_factor);
end Inc;

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


with Report; use Report;
with LA14017_1;
with LA14017_0;

procedure LA140172 is
     type Access_integer is access integer;
     TC_local : integer := 0;
     P1, P2 : LA14017_0.swap_type_ptr;

     function New_swap is new LA14017_1(swap_type => integer);
begin
     Test ("LA14017", "Check that a compilation unit may not " &
                      "depend semantically on two different " &
                      "versions of the same compilation unit. " &
                      "Check the case where a separate " &
                      "function semantically depends on a " &
                      "library level generic function that is " &
                      "changed");

     P1.p_all := 0;
     P2 := P1;
     TC_local := integer (New_swap(P1,P2,0));

     if TC_local = 10 then
          Failed ("Revised library level function not used");
     elsif TC_local /= -10 then
          Failed ("Incorrect value returned");
     end if;

     Result;
end LA140172;
