--  Copyright 2008, 2009 Free Software Foundation, Inc.
--
--  This program is free software; you can redistribute it and/or modify
--  it under the terms of the GNU General Public License as published by
--  the Free Software Foundation; either version 3 of the License, or
--  (at your option) any later version.
--
--  This program is distributed in the hope that it will be useful,
--  but WITHOUT ANY WARRANTY; without even the implied warranty of
--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--  GNU General Public License for more details.
--
--  You should have received a copy of the GNU General Public License
--  along with this program.  If not, see <http://www.gnu.org/licenses/>.

package body Homonym is

   type Integer_Range is new Integer range -100 .. 100;
   type Positive_Range is new Positive range 1 .. 19740804;

   ---------------
   -- Get_Value --
   ---------------

   function Get_Value return Integer_Range
   is
      subtype Local_Type is Integer_Range;
      subtype Local_Type_Subtype is Local_Type;
      subtype Int_Type   is Integer_Range;
      Lcl : Local_Type := 29;
   begin
      return Lcl;  --  BREAK_1
   end Get_Value;

   ---------------
   -- Get_Value --
   ---------------

   function Get_Value return Positive_Range
   is
      subtype Local_Type is Positive_Range;
      subtype Local_Type_Subtype is Local_Type;
      subtype Pos_Type is Positive_Range;
      Lcl : Local_Type := 17;
   begin
      return Lcl;  --  BREAK_2
   end Get_Value;

   ----------------
   -- Start_Test --
   ----------------

   procedure Start_Test is
      Int : Integer_Range;
      Pos : Positive_Range;
   begin
      Int := Get_Value;
      Pos := Get_Value;
   end Start_Test;

end Homonym;
