-- LA140251.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 generic instantiation depends on
--      a non-generic package that is changed.
--
-- TEST DESCRIPTION:
--      This test compiles a package, a generic package, a 
--      generic instantiation that withs both of the first two
--      packages, and a main procedure that withs the instantiated 
--      generic package.  Then, a new version of the first   
--      package is compiled (in a separate file, simulating 
--      editing and 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 package and report "PASSED" at 
--      execution time.
--
-- SPECIAL REQUIREMENTS:
--      To build this test:
--         1) Compile the file LA140250 (and include the results in the
--            program library).
--         2) Compile the file LA140251 (and include the results in the
--            program library).
--         3) Compile the file LA140252 (and include the results in the
--            program library).
--         4) Attempt to build an executable image.
--         5) If an executable image results, run it.
--
-- TEST FILES:
--      This test consists of the following files:
--         LA140250.A
--      -> LA140251.AM
--         LA140252.A
--
-- PASS/FAIL CRITERIA:    
--      The test passes if a link time error message reports that 
--      LA14025 is missing or obsolete, or that LA14025_2 is 
--      missing or obsolete (optional) and no executable image
--      results.  The test passes if an executable image is produced
--      and reports "PASSED" (in case the implementation supports
--      automatic recompilation).            
--
--
-- CHANGE HISTORY:
--     01 MAY 95   ACVC 1.12   LA5008V baseline version
--     06 JUL 95   SAIC        Initial version
--     08 NOV 96   SAIC        Unit naming correction
--     07 DEC 96   SAIC        Moved LA14025_0 to a separate file. Added
--                             pragma Elaborate to context clause of
--                             LA14025_2.
--
--!

with LA14025_0;
generic
     type your_addition is (<>);
package LA14025_1 is          --extensions, utilities
     type extended_record is new LA14025_0.data_rec with record
          new_data : your_addition;
     end record;
     procedure stuff (param : your_addition);
     function fetch (param : LA14025_0.byte) return LA14025_0.byte;
private
     obj : extended_record;
end LA14025_1;

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

package body LA14025_1 is
     procedure stuff (param : your_addition) is
     begin
          obj.new_data := param; 
     end stuff;

     function fetch (param : LA14025_0.byte) return LA14025_0.byte is
     begin
          return (param + obj.val);
     end fetch;
end LA14025_1;

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

with LA14025_0;
with LA14025_1;
pragma Elaborate (LA14025_1);
package LA14025_2 is new LA14025_1 (LA14025_0.byte);

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

with Report; use Report;
with LA14025_2;
with LA14025_0;
procedure LA140251 is
     TC_val : LA14025_0.byte := 0;
     Temp_var : LA14025_2.extended_record;
begin
     Test ("LA14025", "Check that a compilation unit may not " &
                      "depend semantically on two different " &
                      "versions of the same compilation unit.  " &
                      "Check the case where a generic " &
                      "instantiation depends on a non-generic " &
                      "package that is changed");

     LA14025_2.stuff(10);
     
     TC_val := LA14025_2.fetch (Temp_var.val);

     if TC_val = 256 then
          Failed ("Old version of package used");
     elsif TC_val /= 128 then
          Failed ("Incorrect value returned");
     end if;

     Result;
end LA140251;
