-- LA140212.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:
--      See LA140211.AM.
--
-- TEST DESCRIPTION:
--      See LA140211.AM.
--
-- SPECIAL REQUIREMENTS:
--      See LA140211.AM.
--
-- TEST FILES:
--      This test consists of the following files:
--         LA140210.A
--         LA140211.AM
--      -> LA140212.A
--
-- PASS/FAIL CRITERIA:                
--      See LA140211.AM.
--
-- CHANGE HISTORY:
--     01 MAY 95   ACVC 1.12   LA5008R baseline version
--     23 JUN 95   SAIC        Initial version
--     18 NOV 96   SAIC        Modified prologue to conform
--                             to coding conventions.
--     07 DEC 96   SAIC        Modified prologue to reflect new test
--                             file organization.
--
--!

generic
     type swap_type is private;
     type int_type is range <>;
     times : int_type :=2; --this line contains the change
package LA14021_0 is
     procedure swap (this, for_that : in out swap_type);
end LA14021_0;

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

package body LA14021_0 is
     procedure swap (this, for_that : in out swap_type) is
          temp : swap_type;
     begin
          for i in int_type'first..times loop
               temp := this;
               this := for_that;
               for_that := temp;
          end loop;
     end swap;
end LA14021_0;
