------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                                T Y P E S                                 --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
--          Copyright (C) 1992-2023, Free Software Foundation, Inc.         --
--                                                                          --
-- GNAT is free software;  you can  redistribute it  and/or modify it under --
-- terms of the  GNU General Public License as published  by the Free Soft- --
-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT 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  distributed with GNAT; see file COPYING3.  If not, go to --
-- http://www.gnu.org/licenses for a complete copy of the license.          --
--                                                                          --
-- GNAT was originally developed  by the GNAT team at  New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
--                                                                          --
------------------------------------------------------------------------------

--  This package contains host independent type definitions which are used
--  in more than one unit in the compiler. They are gathered here for easy
--  reference, although in some cases the full description is found in the
--  relevant module which implements the definition. The main reason that they
--  are not in their "natural" specs is that this would cause a lot of inter-
--  spec dependencies, and in particular some awkward circular dependencies
--  would have to be dealt with.

--  WARNING: There is a C version of this package. Any changes to this source
--  file must be properly reflected in the C header file types.h

--  Note: the declarations in this package reflect an expectation that the host
--  machine has an efficient integer base type with a range at least 32 bits
--  2s-complement. If there are any machines for which this is not a correct
--  assumption, a significant number of changes will be required.

with Ada.Unchecked_Conversion;
with Ada.Unchecked_Deallocation;
with System;

package Types is
   pragma Preelaborate;

   -------------------------------
   -- General Use Integer Types --
   -------------------------------

   type Int is range -2 ** 31 .. +2 ** 31 - 1;
   --  Signed 32-bit integer

   subtype Nat is Int range 0 .. Int'Last;
   --  Non-negative Int values

   subtype Pos is Int range 1 .. Int'Last;
   --  Positive Int values

   subtype Nonzero_Int is Int with Predicate => Nonzero_Int /= 0;

   type Int_64 is range -2 ** 63 .. +2 ** 63 - 1;
   --  Signed 64-bit integer

   subtype Nat_64 is Int_64 range 0 .. Int_64'Last;
   subtype Pos_64 is Int_64 range 1 .. Int_64'Last;
   subtype Nonzero_Int_64 is Int_64 with Predicate => Nonzero_Int_64 /= 0;

   type Word is mod 2 ** 32;
   --  Unsigned 32-bit integer

   type Short is range -32768 .. +32767;
   for Short'Size use 16;
   --  16-bit signed integer

   type Byte is mod 2 ** 8;
   for Byte'Size use 8;
   --  8-bit unsigned integer

   type size_t is mod 2 ** Standard'Address_Size;
   --  Memory size value, for use in calls to C routines

   --------------------------------------
   -- 8-Bit Character and String Types --
   --------------------------------------

   --  We use Standard.Character and Standard.String freely, since we are
   --  compiling ourselves, and we properly implement the required 8-bit
   --  character code as required in Ada 95. This section defines a few
   --  general use constants and subtypes.

   EOF : constant Character := ASCII.SUB;
   --  The character SUB (16#1A#) is used in DOS and other systems derived
   --  from DOS (XP, NT etc) to signal the end of a text file. Internally
   --  all source files are ended by an EOF character, even on Unix systems.
   --  An EOF character acts as the end of file only as the last character
   --  of a source buffer, in any other position, it is treated as a blank
   --  if it appears between tokens, and as an illegal character otherwise.
   --  This makes life easier dealing with files that originated from DOS,
   --  including concatenated files with interspersed EOF characters.

   subtype Graphic_Character is Character range ' ' .. '~';
   --  Graphic characters, as defined in ARM

   subtype Line_Terminator is Character range ASCII.LF .. ASCII.CR;
   --  Line terminator characters (LF, VT, FF, CR). For further details, see
   --  the extensive discussion of line termination in the Sinput spec.

   subtype Upper_Half_Character is
     Character range Character'Val (16#80#) .. Character'Val (16#FF#);
   --  8-bit Characters with the upper bit set

   type Character_Ptr    is access all Character;
   type String_Ptr       is access all String;
   type String_Ptr_Const is access constant String;
   --  Standard character and string pointers

   procedure Free is new Ada.Unchecked_Deallocation (String, String_Ptr);
   --  Procedure for freeing dynamically allocated String values

   subtype Big_String is String (Positive);
   type Big_String_Ptr is access all Big_String;
   --  Virtual type for handling imported big strings. Note that we should
   --  never have any allocators for this type, but we don't give a storage
   --  size of zero, since there are legitimate deallocations going on.

   function To_Big_String_Ptr is
     new Ada.Unchecked_Conversion (System.Address, Big_String_Ptr);
   --  Used to obtain Big_String_Ptr values from external addresses

   subtype Word_Hex_String is String (1 .. 8);
   --  Type used to represent Word value as 8 hex digits, with lower case
   --  letters for the alphabetic cases.

   function Get_Hex_String (W : Word) return Word_Hex_String;
   --  Convert word value to 8-character hex string

   -----------------------------------------
   -- Types Used for Text Buffer Handling --
   -----------------------------------------

   --  We cannot use type String for text buffers, since we must use the
   --  standard 32-bit integer as an index value, since we count on all index
   --  values being the same size.

   type Text_Ptr is new Int;
   --  Type used for subscripts in text buffer

   type Text_Buffer is array (Text_Ptr range <>) of Character;
   --  Text buffer used to hold source file or library information file

   type Text_Buffer_Ptr is access all Text_Buffer;
   --  Text buffers for input files are allocated dynamically and this type
   --  is used to reference these text buffers.

   procedure Free is
     new Ada.Unchecked_Deallocation (Text_Buffer, Text_Buffer_Ptr);
   --  Procedure for freeing dynamically allocated text buffers

   ------------------------------------------
   -- Types Used for Source Input Handling --
   ------------------------------------------

   type Logical_Line_Number is range 0 .. Int'Last;
   for Logical_Line_Number'Size use 32;
   --  Line number type, used for storing logical line numbers (i.e. line
   --  numbers that include effects of any Source_Reference pragmas in the
   --  source file). The value zero indicates a line containing a source
   --  reference pragma.

   No_Line_Number : constant Logical_Line_Number := 0;
   --  Special value used to indicate no line number

   type Physical_Line_Number is range 1 .. Int'Last;
   for Physical_Line_Number'Size use 32;
   --  Line number type, used for storing physical line numbers (i.e. line
   --  numbers in the physical file being compiled, unaffected by the presence
   --  of source reference pragmas).

   type Column_Number is range 0 .. 32767;
   for Column_Number'Size use 16;
   --  Column number (assume that 2**15 - 1 is large enough). The range for
   --  this type is used to compute Hostparm.Max_Line_Length. See also the
   --  processing for -gnatyM in Stylesw).

   No_Column_Number : constant Column_Number := 0;
   --  Special value used to indicate no column number

   Source_Align : constant := 2 ** 12;
   --  Alignment requirement for source buffers (by keeping source buffers
   --  aligned, we can optimize the implementation of Get_Source_File_Index.
   --  See this routine in Sinput for details.

   subtype Source_Buffer is Text_Buffer;
   --  Type used to store text of a source file. The buffer for the main
   --  source (the source specified on the command line) has a lower bound
   --  starting at zero. Subsequent subsidiary sources have lower bounds
   --  which are one greater than the previous upper bound, rounded up to
   --  a multiple of Source_Align.

   type Source_Buffer_Ptr_Var is access all Source_Buffer;
   type Source_Buffer_Ptr is access constant Source_Buffer;
   --  Pointer to source buffer. Source_Buffer_Ptr_Var is used for allocation
   --  and deallocation; Source_Buffer_Ptr is used for all other uses of source
   --  buffers.

   function Null_Source_Buffer_Ptr (X : Source_Buffer_Ptr) return Boolean;
   --  True if X = null

   function Source_Buffer_Ptr_Equal (X, Y : Source_Buffer_Ptr) return Boolean
     renames "=";
   --  Squirrel away the predefined "=", for use in Null_Source_Buffer_Ptr.
   --  Do not call this elsewhere.

   function "=" (X, Y : Source_Buffer_Ptr) return Boolean is abstract;
   --  Make "=" abstract. Note that this makes "/=" abstract as well. This is a
   --  vestige of the zero-origin array indexing we used to use, where "=" is
   --  always wrong (including the one in Null_Source_Buffer_Ptr). We keep this
   --  just because we never need to compare Source_Buffer_Ptrs other than to
   --  null.

   subtype Source_Ptr is Text_Ptr;
   --  Type used to represent a source location, which is a subscript of a
   --  character in the source buffer. As noted above, different source buffers
   --  have different ranges, so it is possible to tell from a Source_Ptr value
   --  which source it refers to. Note that negative numbers are allowed to
   --  accommodate the following special values.

   type Source_Span is record
      Ptr, First, Last : Source_Ptr;
   end record;
   --  Type used to represent a source span, consisting in a main location Ptr,
   --  with a First and Last location, such that Ptr in First .. Last

   function To_Span (Loc : Source_Ptr) return Source_Span is ((others => Loc));
   function To_Span (Ptr, First, Last : Source_Ptr) return Source_Span is
     ((Ptr, First, Last));

   No_Location : constant Source_Ptr := -1;
   --  Value used to indicate no source position set in a node. A test for a
   --  Source_Ptr value being > No_Location is the approved way to test for a
   --  standard value that does not include No_Location or any of the following
   --  special definitions. One important use of No_Location is to label
   --  generated nodes that we don't want the debugger to see in normal mode
   --  (very often we conditionalize so that we set No_Location in normal mode
   --  and the corresponding source line in -gnatD mode).

   function No (Loc : Source_Ptr) return Boolean is (Loc = No_Location);
   function Present (Loc : Source_Ptr) return Boolean is (not No (Loc));
   --  Tests for No_Location / not No_Location

   Standard_Location : constant Source_Ptr := -2;
   --  Used for all nodes in the representation of package Standard other than
   --  nodes representing the contents of Standard.ASCII. Note that testing for
   --  a value being <= Standard_Location tests for both Standard_Location and
   --  for Standard_ASCII_Location.

   Standard_ASCII_Location : constant Source_Ptr := -3;
   --  Used for all nodes in the presentation of package Standard.ASCII

   System_Location : constant Source_Ptr := -4;
   --  Used to identify locations of pragmas scanned by Targparm, where we know
   --  the location is in System, but we don't know exactly what line.

   First_Source_Ptr : constant Source_Ptr := 0;
   --  Starting source pointer index value for first source program

   -------------------------------------
   -- Range Definitions for Tree Data --
   -------------------------------------

   --  The tree has fields that can hold any of the following types:

   --    Pointers to other tree nodes (type Node_Id)
   --    List pointers (type List_Id)
   --    Element list pointers (type Elist_Id)
   --    Names (type Name_Id)
   --    Strings (type String_Id)
   --    Universal integers (type Uint)
   --    Universal reals (type Ureal)

   --  These types are represented as integer indices into various tables.
   --  However, they should be treated as private, except in a few documented
   --  cases. In particular it is usually inappropriate to perform arithmetic
   --  operations using these types. One exception is in computing hash
   --  functions of these types.

   --  In most contexts, the strongly typed interface determines which of these
   --  types is present. However, there are some situations (involving untyped
   --  traversals of the tree), where it is convenient to be easily able to
   --  distinguish these values. The underlying representation in all cases is
   --  an integer type Union_Id, and we ensure that the range of the various
   --  possible values for each of the above types is disjoint (except that
   --  List_Id and Node_Id overlap at Empty) so that this distinction is
   --  possible.

   --  Note: it is also helpful for debugging purposes to make these ranges
   --  distinct. If a bug leads to misidentification of a value, then it will
   --  typically result in an out of range value and a Constraint_Error.

   --  The range of Node_Id is most of the nonnegative integers. The other
   --  ranges are negative. Uint has a very large range, because a substantial
   --  part of this range is used to store direct values; see Uintp for
   --  details. The other types have 100 million values, which should be
   --  plenty.

   type Union_Id is new Int;
   --  The type in the tree for a union of possible ID values

   --  Following are the Low and High bounds of the various ranges.

   List_Low_Bound : constant := -099_999_999;
   --  The List_Id values are subscripts into an array of list headers which
   --  has List_Low_Bound as its lower bound.

   List_High_Bound : constant := 0;
   --  Maximum List_Id subscript value. The ranges of List_Id and Node_Id
   --  overlap by one element (with value zero), which is used both for the
   --  Empty node, and for No_List. The fact that the same value is used is
   --  convenient because it means that the default value of Empty applies to
   --  both nodes and lists, and also is more efficient to test for.

   Node_Low_Bound : constant := 0;
   --  The tree Id values start at zero, because we use zero for Empty (to
   --  allow a zero test for Empty).

   Node_High_Bound : constant := 1_999_999_999;

   Elist_Low_Bound : constant := -199_999_999;
   --  The Elist_Id values are subscripts into an array of elist headers which
   --  has Elist_Low_Bound as its lower bound.

   Elist_High_Bound : constant := -100_000_000;

   Elmt_Low_Bound : constant := -299_999_999;
   --  Low bound of element Id values. The use of these values is internal to
   --  the Elists package, but the definition of the range is included here
   --  since it must be disjoint from other Id values. The Elmt_Id values are
   --  subscripts into an array of list elements which has this as lower bound.

   Elmt_High_Bound : constant := -200_000_000;

   Names_Low_Bound : constant := -399_999_999;

   Names_High_Bound : constant := -300_000_000;

   Strings_Low_Bound : constant := -499_999_999;

   Strings_High_Bound : constant := -400_000_000;

   Ureal_Low_Bound : constant := -599_999_999;

   Ureal_High_Bound : constant := -500_000_000;

   Uint_Low_Bound : constant := -2_100_000_000;
   --  Low bound for Uint values

   Uint_Table_Start : constant := -699_999_999;
   --  Location where table entries for universal integers start (see
   --  Uintp spec for details of the representation of Uint values).

   Uint_High_Bound : constant := -600_000_000;

   --  The following subtype definitions are used to provide convenient names
   --  for membership tests on Int values to see what data type range they
   --  lie in. Such tests appear only in the lowest level packages.

   subtype List_Range      is Union_Id
     range List_Low_Bound    .. List_High_Bound;

   subtype Node_Range      is Union_Id
     range Node_Low_Bound    .. Node_High_Bound;

   subtype Elist_Range     is Union_Id
     range Elist_Low_Bound   .. Elist_High_Bound;

   subtype Elmt_Range      is Union_Id
     range Elmt_Low_Bound    .. Elmt_High_Bound;

   subtype Names_Range     is Union_Id
     range Names_Low_Bound   .. Names_High_Bound;

   subtype Strings_Range   is Union_Id
     range Strings_Low_Bound .. Strings_High_Bound;

   subtype Uint_Range      is Union_Id
     range Uint_Low_Bound    .. Uint_High_Bound;

   subtype Ureal_Range     is Union_Id
     range Ureal_Low_Bound   .. Ureal_High_Bound;

   -----------------------------
   -- Types for Atree Package --
   -----------------------------

   --  Node_Id values are used to identify nodes in the tree. They are
   --  subscripts into the Nodes table declared in package Atree. Note that
   --  the special values Empty and Error are subscripts into this table.
   --  See package Atree for further details.

   type Node_Id is range Node_Low_Bound .. Node_High_Bound with Size => 32;
   --  Type used to identify nodes in the tree

   subtype Entity_Id is Node_Id;
   --  A synonym for node types, used in the Einfo package to refer to nodes
   --  that are entities (i.e. nodes with an Nkind of N_Defining_xxx). All such
   --  nodes are extended nodes and these are the only extended nodes, so that
   --  in practice entity and extended nodes are synonymous.
   --
   --  Note that Sinfo.Nodes.N_Entity_Id is the same as Entity_Id, except it
   --  has a predicate requiring the correct Nkind. Opt_N_Entity_Id is the same
   --  as N_Entity_Id, except it allows Empty. (Sinfo.Nodes is generated by the
   --  Gen_IL program.)

   subtype Node_Or_Entity_Id is Node_Id;
   --  A synonym for node types, used in cases where a given value may be used
   --  to represent either a node or an entity. We like to minimize such uses
   --  for obvious reasons of logical type consistency, but where such uses
   --  occur, they should be documented by use of this type.

   Empty : constant Node_Id := Node_Low_Bound;
   --  Used to indicate null node. A node is actually allocated with this
   --  Id value, so that Nkind (Empty) = N_Empty. Note that Node_Low_Bound
   --  is zero, so Empty = No_List = zero.

   Empty_List_Or_Node : constant := 0;
   --  This constant is used in situations (e.g. initializing empty fields)
   --  where the value set will be used to represent either an empty node or
   --  a non-existent list, depending on the context.

   Error : constant Node_Id := Node_Low_Bound + 1;
   --  Used to indicate an error in the source program. A node is actually
   --  allocated with this Id value, so that Nkind (Error) = N_Error.

   Empty_Or_Error : constant Node_Id := Error;
   --  Since Empty and Error are the first two Node_Id values, the test for
   --  N <= Empty_Or_Error tests to see if N is Empty or Error. This definition
   --  provides convenient self-documentation for such tests.

   First_Node_Id  : constant Node_Id := Node_Low_Bound;
   --  Subscript of first allocated node. Note that Empty and Error are both
   --  allocated nodes, whose Nkind fields can be accessed without error.

   ------------------------------
   -- Types for Nlists Package --
   ------------------------------

   --  List_Id values are used to identify node lists stored in the tree, so
   --  that each node can be on at most one such list (see package Nlists for
   --  further details). Note that the special value Error_List is a subscript
   --  in this table, but the value No_List is *not* a valid subscript, and any
   --  attempt to apply list operations to No_List will cause a (detected)
   --  error.

   type List_Id is range List_Low_Bound .. List_High_Bound with Size => 32;
   --  Type used to identify a node list

   No_List : constant List_Id := List_High_Bound;
   --  Used to indicate absence of a list. Note that the value is zero, which
   --  is the same as Empty, which is helpful in initializing nodes where a
   --  value of zero can represent either an empty node or an empty list.

   Error_List : constant List_Id := List_Low_Bound;
   --  Used to indicate that there was an error in the source program in a
   --  context which would normally require a list. This node appears to be
   --  an empty list to the list operations (a null list is actually allocated
   --  which has this Id value).

   First_List_Id : constant List_Id := Error_List;
   --  Subscript of first allocated list header

   ------------------------------
   -- Types for Elists Package --
   ------------------------------

   --  Element list Id values are used to identify element lists stored outside
   --  of the tree, allowing nodes to be members of more than one such list
   --  (see package Elists for further details).

   type Elist_Id is range Elist_Low_Bound .. Elist_High_Bound with Size => 32;
   --  Type used to identify an element list (Elist header table subscript)

   No_Elist : constant Elist_Id := Elist_Low_Bound;
   --  Used to indicate absence of an element list. Note that this is not an
   --  actual Elist header, so element list operations on this value are not
   --  valid.

   First_Elist_Id : constant Elist_Id := No_Elist + 1;
   --  Subscript of first allocated Elist header

   --  Element Id values are used to identify individual elements of an element
   --  list (see package Elists for further details).

   type Elmt_Id is range Elmt_Low_Bound .. Elmt_High_Bound;
   --  Type used to identify an element list

   No_Elmt : constant Elmt_Id := Elmt_Low_Bound;
   --  Used to represent empty element

   First_Elmt_Id : constant Elmt_Id := No_Elmt + 1;
   --  Subscript of first allocated Elmt table entry

   -------------------------------
   -- Types for Stringt Package --
   -------------------------------

   --  String_Id values are used to identify entries in the strings table. They
   --  are subscripts into the Strings table defined in package Stringt.

   type String_Id is range Strings_Low_Bound .. Strings_High_Bound
     with Size => 32;
   --  Type used to identify entries in the strings table

   No_String : constant String_Id := Strings_Low_Bound;
   --  Used to indicate missing string Id. Note that the value zero is used
   --  to indicate a missing data value for all the Int types in this section.

   First_String_Id : constant String_Id := No_String + 1;
   --  First subscript allocated in string table

   -------------------------
   -- Character Code Type --
   -------------------------

   --  The type Char is used for character data internally in the compiler, but
   --  character codes in the source are represented by the Char_Code type.
   --  Each character literal in the source is interpreted as being one of the
   --  16#7FFF_FFFF# possible Wide_Wide_Character codes, and a unique Integer
   --  value is assigned, corresponding to the UTF-32 value, which also
   --  corresponds to the Pos value in the Wide_Wide_Character type, and also
   --  corresponds to the Pos value in the Wide_Character and Character types
   --  for values that are in appropriate range. String literals are similarly
   --  interpreted as a sequence of such codes.

   type Char_Code_Base is mod 2 ** 32;
   for Char_Code_Base'Size use 32;

   subtype Char_Code is Char_Code_Base range 0 .. 16#7FFF_FFFF#;
   for Char_Code'Value_Size use 32;
   for Char_Code'Object_Size use 32;

   function Get_Char_Code (C : Character) return Char_Code;
   pragma Inline (Get_Char_Code);
   --  Function to obtain internal character code from source character. For
   --  the moment, the internal character code is simply the Pos value of the
   --  input source character, but we provide this interface for possible
   --  later support of alternative character sets.

   function In_Character_Range (C : Char_Code) return Boolean;
   pragma Inline (In_Character_Range);
   --  Determines if the given character code is in range of type Character,
   --  and if so, returns True. If not, returns False.

   function In_Wide_Character_Range (C : Char_Code) return Boolean;
   pragma Inline (In_Wide_Character_Range);
   --  Determines if the given character code is in range of the type
   --  Wide_Character, and if so, returns True. If not, returns False.

   function Get_Character (C : Char_Code) return Character;
   pragma Inline (Get_Character);
   --  For a character C that is in Character range (see above function), this
   --  function returns the corresponding Character value. It is an error to
   --  call Get_Character if C is not in Character range.

   function Get_Wide_Character (C : Char_Code) return Wide_Character;
   --  For a character C that is in Wide_Character range (see above function),
   --  this function returns the corresponding Wide_Character value. It is an
   --  error to call Get_Wide_Character if C is not in Wide_Character range.

   ---------------------------------------
   -- Types used for Library Management --
   ---------------------------------------

   type Unit_Number_Type is new Int range -1 .. Int'Last;
   --  Unit number. The main source is unit 0, and subsidiary sources have
   --  non-zero numbers starting with 1. Unit numbers are used to index the
   --  Units table in package Lib.

   Main_Unit : constant Unit_Number_Type := 0;
   --  Unit number value for main unit

   No_Unit : constant Unit_Number_Type := -1;
   --  Special value used to signal no unit

   type Source_File_Index is new Int range -1 .. Int'Last;
   --  Type used to index the source file table (see package Sinput)

   No_Source_File : constant Source_File_Index := 0;
   --  Value used to indicate no source file present

   No_Access_To_Source_File : constant Source_File_Index := -1;
   --  Value used to indicate a source file is present but unreadable

   -----------------------------------
   -- Representation of Time Stamps --
   -----------------------------------

   --  All compiled units are marked with a time stamp which is derived from
   --  the source file (we assume that the host system has the concept of a
   --  file time stamp which is modified when a file is modified). These
   --  time stamps are used to ensure consistency of the set of units that
   --  constitutes a library. Time stamps are 14-character strings with
   --  with the following format:

   --     YYYYMMDDHHMMSS

   --       YYYY   year
   --       MM     month (2 digits 01-12)
   --       DD     day (2 digits 01-31)
   --       HH     hour (2 digits 00-23)
   --       MM     minutes (2 digits 00-59)
   --       SS     seconds (2 digits 00-59)

   --  In the case of Unix systems (and other systems which keep the time in
   --  GMT), the time stamp is the GMT time of the file, not the local time.
   --  This solves problems in using libraries across networks with clients
   --  spread across multiple time-zones.

   Time_Stamp_Length : constant := 14;
   --  Length of time stamp value

   subtype Time_Stamp_Index is Natural range 1 .. Time_Stamp_Length;
   type Time_Stamp_Type is new String (Time_Stamp_Index);
   --  Type used to represent time stamp

   Empty_Time_Stamp : constant Time_Stamp_Type := (others => ' ');
   --  Value representing an empty or missing time stamp. Looks less than any
   --  real time stamp if two time stamps are compared. Note that although this
   --  is not private, clients should not rely on the exact way in which this
   --  string is represented, and instead should use the subprograms below.

   Dummy_Time_Stamp : constant Time_Stamp_Type := (others => '0');
   --  This is used for dummy time stamp values used in the D lines for
   --  non-existent files, and is intended to be an impossible value.

   function "="  (Left, Right : Time_Stamp_Type) return Boolean;
   function "<=" (Left, Right : Time_Stamp_Type) return Boolean;
   function ">=" (Left, Right : Time_Stamp_Type) return Boolean;
   function "<"  (Left, Right : Time_Stamp_Type) return Boolean;
   function ">"  (Left, Right : Time_Stamp_Type) return Boolean;
   --  Comparison functions on time stamps. Note that two time stamps are
   --  defined as being equal if they have the same day/month/year and the
   --  hour/minutes/seconds values are within 2 seconds of one another. This
   --  deals with rounding effects in library file time stamps caused by
   --  copying operations during installation. We have particularly noticed
   --  that WinNT seems susceptible to such changes.
   --
   --  Note: the Empty_Time_Stamp value looks equal to itself, and less than
   --  any non-empty time stamp value.

   procedure Split_Time_Stamp
     (TS      : Time_Stamp_Type;
      Year    : out Nat;
      Month   : out Nat;
      Day     : out Nat;
      Hour    : out Nat;
      Minutes : out Nat;
      Seconds : out Nat);
   --  Given a time stamp, decompose it into its components

   procedure Make_Time_Stamp
     (Year    : Nat;
      Month   : Nat;
      Day     : Nat;
      Hour    : Nat;
      Minutes : Nat;
      Seconds : Nat;
      TS      : out Time_Stamp_Type);
   --  Given the components of a time stamp, initialize the value

   -------------------------------------
   -- Types used for Check Management --
   -------------------------------------

   type Check_Id is new Nat;
   --  Type used to represent a check id

   No_Check_Id : constant := 0;
   --  Check_Id value used to indicate no check

   Access_Check               : constant :=  1;
   Accessibility_Check        : constant :=  2;
   Alignment_Check            : constant :=  3;
   Allocation_Check           : constant :=  4;
   Atomic_Synchronization     : constant :=  5;
   Characters_Assertion_Check : constant :=  6;
   Containers_Assertion_Check : constant :=  7;
   Discriminant_Check         : constant :=  8;
   Division_Check             : constant :=  9;
   Duplicated_Tag_Check       : constant := 10;
   Elaboration_Check          : constant := 11;
   Index_Check                : constant := 12;
   Interfaces_Assertion_Check : constant := 13;
   IO_Assertion_Check         : constant := 14;
   Length_Check               : constant := 15;
   Numerics_Assertion_Check   : constant := 16;
   Overflow_Check             : constant := 17;
   Predicate_Check            : constant := 18;
   Program_Error_Check        : constant := 19;
   Range_Check                : constant := 20;
   Storage_Check              : constant := 21;
   Strings_Assertion_Check    : constant := 22;
   System_Assertion_Check     : constant := 23;
   Tag_Check                  : constant := 24;
   Validity_Check             : constant := 25;
   Container_Checks           : constant := 26;
   Tampering_Check            : constant := 27;
   Tasking_Check              : constant := 28;
   --  Values used to represent individual predefined checks (including the
   --  setting of Atomic_Synchronization, which is implemented internally using
   --  a "check" whose name is Atomic_Synchronization).

   All_Checks : constant := 29;
   --  Value used to represent All_Checks value

   subtype Predefined_Check_Id is Check_Id range 1 .. All_Checks;
   --  Subtype for predefined checks, including All_Checks

   --  The following array contains an entry for each recognized check name
   --  for pragma Suppress. It is used to represent current settings of scope
   --  based suppress actions from pragma Suppress or command line settings.

   --  Note: when Suppress_Array (All_Checks) is True, then generally all other
   --  specific check entries are set True, except for the Elaboration_Check
   --  entry which is set only if an explicit Suppress for this check is given.
   --  The reason for this non-uniformity is that we do not want All_Checks to
   --  suppress elaboration checking when using the static elaboration model.
   --  We recognize only an explicit suppress of Elaboration_Check as a signal
   --  that the static elaboration checking should skip a compile time check.

   type Suppress_Array is array (Predefined_Check_Id) of Boolean;
   pragma Pack (Suppress_Array);

   --  To add a new check type to GNAT, the following steps are required:

   --    1.  Add an entry to Snames spec for the new name
   --    2.  Add an entry to the definition of Check_Id above (very important:
   --        these definitions should be in the same order in Snames and here)
   --    3.  Add a new function to Checks to handle the new check test
   --    4.  Add a new Do_xxx_Check flag to Sinfo (if required)
   --    5.  Add appropriate checks for the new test

   --  The following provides precise details on the mode used to generate
   --  code for intermediate operations in expressions for signed integer
   --  arithmetic (and how to generate overflow checks if enabled). Note
   --  that this only affects handling of intermediate results. The final
   --  result must always fit within the target range, and if overflow
   --  checking is enabled, the check on the final result is against this
   --  target range.

   type Overflow_Mode_Type is (
      Not_Set,
      --  Dummy value used during initialization process to show that the
      --  corresponding value has not yet been initialized.

      Strict,
      --  Operations are done in the base type of the subexpression. If
      --  overflow checks are enabled, then the check is against the range
      --  of this base type.

      Minimized,
      --  Where appropriate, intermediate arithmetic operations are performed
      --  with an extended range, using Long_Long_Integer if necessary. If
      --  overflow checking is enabled, then the check is against the range
      --  of Long_Long_Integer.

      Eliminated);
      --  In this mode arbitrary precision arithmetic is used as needed to
      --  ensure that it is impossible for intermediate arithmetic to cause an
      --  overflow. In this mode, intermediate expressions are not affected by
      --  the overflow checking mode, since overflows are eliminated.

   subtype Minimized_Or_Eliminated is
     Overflow_Mode_Type range Minimized .. Eliminated;
   --  Define subtype so that clients don't need to know ordering. Note that
   --  Overflow_Mode_Type is not marked as an ordered enumeration type.

   --  The following structure captures the state of check suppression or
   --  activation at a particular point in the program execution.

   type Suppress_Record is record
      Suppress : Suppress_Array;
      --  Indicates suppression status of each possible check

      Overflow_Mode_General : Overflow_Mode_Type;
      --  This field indicates the mode for handling code generation and
      --  overflow checking (if enabled) for intermediate expression values.
      --  This applies to general expressions outside assertions.

      Overflow_Mode_Assertions : Overflow_Mode_Type;
      --  This field indicates the mode for handling code generation and
      --  overflow checking (if enabled) for intermediate expression values.
      --  This applies to any expression occurring inside assertions.
   end record;

   -----------------------------------
   -- Global Exception Declarations --
   -----------------------------------

   --  This section contains declarations of exceptions that are used
   --  throughout the compiler or in other GNAT tools.

   Unrecoverable_Error : exception;
   --  This exception is raised to immediately terminate the compilation of the
   --  current source program. Used in situations where things are bad enough
   --  that it doesn't seem worth continuing (e.g. max errors reached, or a
   --  required file is not found). Also raised when the compiler finds itself
   --  in trouble after an error (see Comperr).

   Terminate_Program : exception;
   --  This exception is raised to immediately terminate the tool being
   --  executed. Each tool where this exception may be raised must have a
   --  single exception handler that contains only a null statement and that is
   --  the last statement of the program. If needed, procedure Set_Exit_Status
   --  is called with the appropriate exit status before raising
   --  Terminate_Program.

   ---------------------------------
   -- Parameter Mechanism Control --
   ---------------------------------

   --  Function and parameter entities have a field that records the passing
   --  mechanism. See specification of Sem_Mech for full details. The following
   --  subtype is used to represent values of this type:

   subtype Mechanism_Type is Int range -2 .. Int'Last;
   --  Type used to represent a mechanism value. This is a subtype rather than
   --  a type to avoid some annoying processing problems with certain routines
   --  in Einfo (processing them to create the corresponding C). The values in
   --  the range -2 .. 0 are used to represent mechanism types declared as
   --  named constants in the spec of Sem_Mech. Positive values are used for
   --  the case of a pragma C_Pass_By_Copy that sets a threshold value for the
   --  mechanism to be used. For example if pragma C_Pass_By_Copy (32) is given
   --  then Default_C_Record_Mechanism is set to 32, and the meaning is to use
   --  By_Reference if the size is greater than 32, and By_Copy otherwise.

   ---------------------------------
   -- Component_Alignment Control --
   ---------------------------------

   --  There are four types of alignment possible for array and record
   --  types, and a field in the type entities contains a value of the
   --  following type indicating which alignment choice applies. For full
   --  details of the meaning of these alignment types, see description
   --  of the Component_Alignment pragma.

   type Component_Alignment_Kind is (
      Calign_Default,          -- default alignment
      Calign_Component_Size,   -- natural alignment for component size
      Calign_Component_Size_4, -- natural for size <= 4, 4 for size >= 4
      Calign_Storage_Unit);    -- all components byte aligned

   -----------------------------------
   -- Floating Point Representation --
   -----------------------------------

   type Float_Rep_Kind is (IEEE_Binary);
   --  The only one supported now is IEEE 754p conforming binary format, but
   --  other formats were supported in the past, and could conceivably be
   --  supported in the future, so we keep this singleton enumeration type.

   ----------------------------
   -- Small_Paren_Count_Type --
   ----------------------------

   --  See Paren_Count in Atree for documentation

   subtype Small_Paren_Count_Type is Nat range 0 .. 3;

   ------------------------------
   -- Run-Time Exception Codes --
   ------------------------------

   --  When the code generator generates a run-time exception, it provides a
   --  reason code which is one of the following. This reason code is used to
   --  select the appropriate run-time routine to be called, determining both
   --  the exception to be raised, and the message text to be added.

   --  The prefix CE/PE/SE indicates the exception to be raised
   --    CE = Constraint_Error
   --    PE = Program_Error
   --    SE = Storage_Error

   --  The remaining part of the name indicates the message text to be added,
   --  where all letters are lower case, and underscores are converted to
   --  spaces (for example CE_Invalid_Data adds the text "invalid data").

   --  To add a new code, you need to do the following:

   --    1. Assign a new number to the reason. Do not renumber existing codes,
   --       since this causes compatibility/bootstrap issues, so always add the
   --       new code at the end of the list.

   --    2. Update the contents of the array Kind

   --    3. Modify the corresponding definitions in types.h, including the
   --       definition of last_reason_code.

   --    4. Add the name of the routines in exp_ch11.Get_RT_Exception_Name

   --    5. Add a new routine in Ada.Exceptions with the appropriate call and
   --       static string constant. Note that there is more than one version
   --       of a-except.adb which must be modified.

   --  Note on ordering of references. For the tables in Ada.Exceptions units,
   --  usually the ordering does not matter, and we use the same ordering as
   --  is used here.

   type RT_Exception_Code is
     (CE_Access_Check_Failed,            -- 00
      CE_Access_Parameter_Is_Null,       -- 01
      CE_Discriminant_Check_Failed,      -- 02
      CE_Divide_By_Zero,                 -- 03
      CE_Explicit_Raise,                 -- 04
      CE_Index_Check_Failed,             -- 05
      CE_Invalid_Data,                   -- 06
      CE_Length_Check_Failed,            -- 07
      CE_Null_Exception_Id,              -- 08
      CE_Null_Not_Allowed,               -- 09

      CE_Overflow_Check_Failed,          -- 10
      CE_Partition_Check_Failed,         -- 11
      CE_Range_Check_Failed,             -- 12
      CE_Tag_Check_Failed,               -- 13
      PE_Access_Before_Elaboration,      -- 14
      PE_Accessibility_Check_Failed,     -- 15
      PE_Address_Of_Intrinsic,           -- 16
      PE_Aliased_Parameters,             -- 17
      PE_All_Guards_Closed,              -- 18
      PE_Bad_Predicated_Generic_Type,    -- 19

      PE_Current_Task_In_Entry_Body,     -- 20
      PE_Duplicated_Entry_Address,       -- 21
      PE_Explicit_Raise,                 -- 22
      PE_Finalize_Raised_Exception,      -- 23
      PE_Implicit_Return,                -- 24
      PE_Misaligned_Address_Value,       -- 25
      PE_Missing_Return,                 -- 26
      PE_Overlaid_Controlled_Object,     -- 27
      PE_Potentially_Blocking_Operation, -- 28
      PE_Stubbed_Subprogram_Called,      -- 29

      PE_Unchecked_Union_Restriction,    -- 30
      PE_Non_Transportable_Actual,       -- 31
      SE_Empty_Storage_Pool,             -- 32
      SE_Explicit_Raise,                 -- 33
      SE_Infinite_Recursion,             -- 34
      SE_Object_Too_Large,               -- 35
      PE_Stream_Operation_Not_Allowed,   -- 36
      PE_Build_In_Place_Mismatch);       -- 37
   pragma Convention (C, RT_Exception_Code);

   Last_Reason_Code : constant :=
     RT_Exception_Code'Pos (RT_Exception_Code'Last);
   --  Last reason code

   type Reason_Kind is (CE_Reason, PE_Reason, SE_Reason);
   --  Categorization of reason codes by exception raised

   Rkind : constant array (RT_Exception_Code range <>) of Reason_Kind :=
             (CE_Access_Check_Failed            => CE_Reason,
              CE_Access_Parameter_Is_Null       => CE_Reason,
              CE_Discriminant_Check_Failed      => CE_Reason,
              CE_Divide_By_Zero                 => CE_Reason,
              CE_Explicit_Raise                 => CE_Reason,
              CE_Index_Check_Failed             => CE_Reason,
              CE_Invalid_Data                   => CE_Reason,
              CE_Length_Check_Failed            => CE_Reason,
              CE_Null_Exception_Id              => CE_Reason,
              CE_Null_Not_Allowed               => CE_Reason,
              CE_Overflow_Check_Failed          => CE_Reason,
              CE_Partition_Check_Failed         => CE_Reason,
              CE_Range_Check_Failed             => CE_Reason,
              CE_Tag_Check_Failed               => CE_Reason,

              PE_Access_Before_Elaboration      => PE_Reason,
              PE_Accessibility_Check_Failed     => PE_Reason,
              PE_Address_Of_Intrinsic           => PE_Reason,
              PE_Aliased_Parameters             => PE_Reason,
              PE_All_Guards_Closed              => PE_Reason,
              PE_Bad_Predicated_Generic_Type    => PE_Reason,
              PE_Current_Task_In_Entry_Body     => PE_Reason,
              PE_Duplicated_Entry_Address       => PE_Reason,
              PE_Explicit_Raise                 => PE_Reason,
              PE_Finalize_Raised_Exception      => PE_Reason,
              PE_Implicit_Return                => PE_Reason,
              PE_Misaligned_Address_Value       => PE_Reason,
              PE_Missing_Return                 => PE_Reason,
              PE_Overlaid_Controlled_Object     => PE_Reason,
              PE_Potentially_Blocking_Operation => PE_Reason,
              PE_Stubbed_Subprogram_Called      => PE_Reason,
              PE_Unchecked_Union_Restriction    => PE_Reason,
              PE_Non_Transportable_Actual       => PE_Reason,
              PE_Stream_Operation_Not_Allowed   => PE_Reason,
              PE_Build_In_Place_Mismatch        => PE_Reason,

              SE_Empty_Storage_Pool             => SE_Reason,
              SE_Explicit_Raise                 => SE_Reason,
              SE_Infinite_Recursion             => SE_Reason,
              SE_Object_Too_Large               => SE_Reason);

   --  Types for field offsets/sizes used in Seinfo, Sinfo.Nodes and
   --  Einfo.Entities:

   type Field_Offset is new Nat;
   --  Offset of a node field, in units of the size of the field, which is
   --  always a power of 2.

   subtype Node_Offset is Field_Offset'Base range 1 .. Field_Offset'Base'Last;

   subtype Slot_Count is Field_Offset;
   --  Count of number of slots. Same type as Field_Offset to avoid
   --  proliferation of type conversions.

   subtype Field_Size_In_Bits is Field_Offset with Predicate =>
     Field_Size_In_Bits in 1 | 2 | 4 | 8 | 32;

   subtype Opt_Field_Offset is Field_Offset'Base range -1 .. Field_Offset'Last;
   No_Field_Offset : constant Opt_Field_Offset := Opt_Field_Offset'First;

   type Offset_Array_Index is new Nat;
   type Offset_Array is
     array (Offset_Array_Index range <>) of Opt_Field_Offset;

end Types;
