home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gnat-2.06-src.tgz / tar.out / fsf / gnat / ada / atree.ads < prev    next >
Text File  |  1996-09-28  |  71KB  |  1,892 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                                A T R E E                                 --
  6. --                                                                          --
  7. --                                 S p e c                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.95 $                             --
  10. --                                                                          --
  11. --        Copyright (c) 1992,1993,1994,1995 NYU, All Rights Reserved        --
  12. --                                                                          --
  13. -- The GNAT library is free software; you can redistribute it and/or modify --
  14. -- it under terms of the GNU Library General Public License as published by --
  15. -- the Free Software  Foundation; either version 2, or (at your option) any --
  16. -- later version.  The GNAT library is distributed in the hope that it will --
  17. -- be useful, but WITHOUT ANY WARRANTY;  without even  the implied warranty --
  18. -- of MERCHANTABILITY  or  FITNESS FOR  A PARTICULAR PURPOSE.  See the  GNU --
  19. -- Library  General  Public  License for  more  details.  You  should  have --
  20. -- received  a copy of the GNU  Library  General Public License  along with --
  21. -- the GNAT library;  see the file  COPYING.LIB.  If not, write to the Free --
  22. -- Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.        --
  23. --                                                                          --
  24. ------------------------------------------------------------------------------
  25.  
  26. with Alloc;  use Alloc;
  27. with Sinfo;  use Sinfo;
  28. with Einfo;  use Einfo;
  29. with Types;  use Types;
  30. with Snames; use Snames;
  31. with System; use System;
  32. with Table;
  33. with Uintp;  use Uintp;
  34. with Urealp; use Urealp;
  35.  
  36. package Atree is
  37.  
  38. --  This package defines the format of the tree used to represent the Ada
  39. --  program internally. Syntactic and semantic information is combined in
  40. --  this tree. There is no separate symbol table structure.
  41.  
  42. --  WARNING: There is a C version of this package. Any changes to this
  43. --  source file must be properly reflected in the C header file tree.h
  44.  
  45. --  Package Atree defines the basic structure of the tree and its nodes and
  46. --  provides the basic abstract interface for manipulating the tree. Two
  47. --  other packages use this interface to define the representation of Ada
  48. --  programs using this tree format. The package Sinfo defines the basic
  49. --  representation of the syntactic structure of the program, as output
  50. --  by the parser. The package Entity_Info defines the semantic information
  51. --  which is added to the tree nodes that represent declared entities (i.e.
  52. --  the information which might typically be described in a separate symbol
  53. --  table structure.
  54.  
  55. --  The front end of the compiler first parses the program and generates a
  56. --  tree that is simply a syntactic representation of the program in abstract
  57. --  syntax tree format. Subsequent processing in the front end traverses the
  58. --  tree, transforming it in various ways and adding semantic information.
  59.  
  60.    ----------------------------------------
  61.    -- Definitions of Fields in Tree Node --
  62.    ----------------------------------------
  63.  
  64.    --  The representation of the tree is completely hidden, using a functional
  65.    --  interface for accessing and modifying the contents of nodes. Logically
  66.    --  a node contains a number of fields, much as though the nodes were
  67.    --  defined as a record type. The fields in a node are as follows:
  68.  
  69.    --   Nkind            Indicates the kind of the node. This field is present
  70.    --                    in all nodes. The type is Node_Kind, which is declared
  71.    --                    in the package Sinfo.
  72.  
  73.    --   Sloc             Location (Source_Ptr) of the corresponding token
  74.    --                    in the Source buffer. The individual node definitions
  75.    --                    show which token is referenced by this pointer.
  76.  
  77.    --   In_List          A flag used to indicate if the node is a member
  78.    --                    of a node list.
  79.  
  80.    --   Rewrite_Sub      A flag set if the node has been rewritten using
  81.    --                    the Rewrite_Substitute_Tree procedure. The original
  82.    --                    value of the node is retrievable with Original_Node.
  83.  
  84.    --   Rewrite_Ins      A flag set if a node is marked as a rewrite inserted
  85.    --                    node as a result of a call to Mark_Rewrite_Insertion.
  86.  
  87.    --   Paren_Count      A 2-bit count used on expression nodes to indicate
  88.    --                    the level of parentheses. Up to 3 levels can be
  89.    --                    accomodated. Anything more than 3 levels is treated
  90.    --                    as 3 levels (conformance tests that complain about
  91.    --                    this are hereby deemed pathological!) Set to zero
  92.    --                    for non-subexpression nodes.
  93.  
  94.    --   Comes_From_Source
  95.    --                    This flag is present in all nodes. It is set if the
  96.    --                    node is built by the scanner or parser, and clear if
  97.    --                    the node is built by the analyzer or expander. It
  98.    --                    indicates that the node corresponds to a construct
  99.    --                    that appears in the original source program.
  100.  
  101.    --   Field1
  102.    --   Field2
  103.    --   Field3
  104.    --   Field4
  105.    --   Field5           Five fields holding Union_Id values
  106.  
  107.    --   Char_CodeN       Synonym for FieldN typed as Char_Code
  108.    --   ElistN           Synonym for FieldN typed as Elist_Id
  109.    --   ListN            Synonym for FieldN typed as List_Id
  110.    --   NameN            Synonym for FieldN typed as Name_Id
  111.    --   NodeN            Synonym for FieldN typed as Node_Id
  112.    --   StrN             Synonym for FieldN typed as String_Id
  113.    --   UintN            Synonym for FieldN typed as Uint
  114.    --   UrealN           Synonym for FieldN typed as Ureal
  115.  
  116.    --   Note: the actual usage of FieldN (i.e. whether it contains a Char_Code,
  117.    --   Elist_Id, List_Id, Name_Id, Node_Id, String_Id, Uint or Ureal), depends
  118.    --   on the value in Nkind. Generally the access to this field is always via
  119.    --   the functional interface, so the field names Char_CodeN, ElistN, ListN,
  120.    --   NameN, NodeN, StrN, UintN and UrealN are used only in the bodies of the
  121.    --   access functions (i.e. in the bodies of Sinfo and Einfo). These access
  122.    --   functions contain debugging code that checks that the use is consistent
  123.    --   with Nkind and Ekind values.
  124.  
  125.    --   However, in specialized circumstances (examples are the circuit in
  126.    --   generic instantiation to copy trees, and in the tree dump routine),
  127.    --   it is useful to be able to do untyped traversals, and an internal
  128.    --   package in Atree allows for direct untyped accesses in such cases.
  129.  
  130.    --   Flag1            Seventeen Boolean flags (use depends on Nkind and
  131.    --   Flag3            Ekind, as described for Fieldn). Again the access
  132.    --   Flag4            is usually via subprograms in Sinfo and Einfo which
  133.    --   Flag5            provide high-level synonyms for these flags, and
  134.    --   Flag6            contain debugging code that checks that the values
  135.    --   Flag7            in Nkind and Ekind are appropriate for the access.
  136.    --   Flag8
  137.    --   Flag9            Note that Flag2 is missing from the list (it is used
  138.    --   Flag10           for Comes_From_Source, a historical accident!)
  139.    --   Flag11
  140.    --   Flag12
  141.    --   Flag13
  142.    --   Flag14
  143.    --   Flag15
  144.    --   Flag16
  145.    --   Flag17
  146.    --   Flag18
  147.  
  148.    --   Link             Pointer to parent node, i.e. node which points to
  149.    --                    the node which references this field. The parent
  150.    --                    field can only be set in a node which is not in
  151.    --                    a list, or in a list header. The parent field of
  152.    --                    nodes that are in a list is automatically set to
  153.    --                    the parent of the list header, and cannot be
  154.    --                    explicitly set. This field is considered private
  155.    --                    to Atree.
  156.  
  157.    --  The following additional fields are present in extended nodes used
  158.    --  for entities (Nkind in N_Entity).
  159.  
  160.    --   Ekind            Entity type. This field indicates the type of the
  161.    --                    entity, it is of type Entity_Kind which is defined
  162.    --                    in package Einfo.
  163.  
  164.    --   Flag19           94 additional flags
  165.    --   ...
  166.    --   Flag112
  167.  
  168.    --   Convention       Entity convention (Convention_Id value)
  169.  
  170.    --   Field6           Additional Union_Id value stored in tree
  171.  
  172.    --   Node6            Synonym for Field6 typed as Node_Id
  173.    --   Elist6           Synonym for Field6 typed as Elist_Id
  174.    --   Uint6            Synonym for Field6 typed as Uint
  175.  
  176.    --   Similar definitions for Field7 to Field18 (and Node7-Node22,
  177.    --   Elist7-Elist22, Uint7-Uint22, Ureal7-Ureal22). Note that not
  178.    --   all these functions are defined, only the ones that are actually
  179.    --   used by Einfo.
  180.  
  181.    type Paren_Count_Type is mod 4;
  182.    for Paren_Count_Type'Size use 2;
  183.    --  Type used for Paren_Count field
  184.  
  185.    function Last_Node_Id return Node_Id;
  186.    pragma Inline (Last_Node_Id);
  187.    --  Returns Id of last allocated node Id
  188.  
  189.    function Nodes_Address return System.Address;
  190.    --  Return address of Nodes table (used in Back_End for Gigi call)
  191.  
  192.    function Num_Nodes return Nat;
  193.    --  Total number of nodes allocated, where an entity counts as a single
  194.    --  node. This count is incremented every time a node or entity is
  195.    --  allocated, and decremented every time a node or entity is deleted.
  196.  
  197.    -----------------------
  198.    -- Use of Empty Node --
  199.    -----------------------
  200.  
  201.    --  The special Node_Id Empty is used to mark missing fields. Whenever the
  202.    --  syntax has an optional component, then the corresponding field will be
  203.    --  set to Empty if the component is missing.
  204.  
  205.    --  Note: Empty is not used to describe an empty list. Instead in this
  206.    --  case the node field contains a list which is empty, and these cases
  207.    --  should be distinguished (essentially from a type point of view, Empty
  208.    --  is a Node, and is thus not a list).
  209.  
  210.    --  Note: Empty does in fact correspond to an allocated node. Only the
  211.    --  Nkind field of this node may be referenced. It contains N_Empty, which
  212.    --  uniquely identifies the empty case. This allows the Nkind field to be
  213.    --  dereferenced before the check for Empty which is sometimes useful.
  214.  
  215.    -------------------------------
  216.    -- Default Setting of Fields --
  217.    -------------------------------
  218.  
  219.    --  Nkind is set to N_Unused_At_Start
  220.  
  221.    --  Ekind is set to E_Void
  222.  
  223.    --  Sloc is always set, there is no default value
  224.  
  225.    --  Field1-5 fields are set to Empty
  226.  
  227.    --  Field6-22 fields in extended nodes are set to Empty
  228.  
  229.    --  Parent is set to Empty
  230.  
  231.    --  All Boolean flag fields are set to False
  232.  
  233.    --  Note: the value Empty is used in Field1-Field17 to indicate a null node.
  234.    --  The usage varies. The common uses are to indicate absence of an
  235.    --  optional clause or a completely unused Field1-17 field.
  236.  
  237.    -------------------------------------
  238.    -- Use of Synonyms for Node Fields --
  239.    -------------------------------------
  240.  
  241.    --  A subpackage Atree.Unchecked_Access provides routines for reading and
  242.    --  writing the fields defined above (Field1-17, Node1-17, Flag1-88 etc).
  243.    --  These unchecked access routines can be used for untyped traversals. In
  244.    --  In addition they are used in the implementations of the Sinfo and
  245.    --  Einfo packages. These packages both provide logical synonyms for
  246.    --  the generic fields, together with an appropriate set of access routines.
  247.    --  Normally access to information within tree nodes uses these synonyms,
  248.    --  providing a high level typed interface to the tree information.
  249.  
  250.    --------------------------------------------------
  251.    -- Node Allocation and Modification Subprograms --
  252.    --------------------------------------------------
  253.  
  254.    --  Generally the parser builds the tree and then it is further decorated
  255.    --  (e.g. by setting the entity fields), but not fundamentally modified.
  256.    --  However, there are cases in which the tree must be restructured by
  257.    --  adding and rearranging nodes, as a result of disambiguating cases
  258.    --  which the parser could not parse correctly, and adding additional
  259.    --  semantic information (e.g. making constraint checks explicit). The
  260.    --  following subprograms are used for constructing the tree in the first
  261.    --  place, and then for subsequent modifications as required
  262.  
  263.    procedure Initialize;
  264.    --  Called at the start of compilation to initialize the allocation of
  265.    --  the node and list tables and make the standard entries for Empty,
  266.    --  Error and Error_List. Note that Initialize must not be called if
  267.    --  Tree_Read is used.
  268.  
  269.    procedure Tree_Read;
  270.    --  Initializes internal tables from current tree file using Tree_Read.
  271.    --  Note that Initialize should not be called if Tree_Read is used.
  272.    --  Tree_Read includes all necessary initialization.
  273.  
  274.    procedure Tree_Write;
  275.    --  Writes out internal tables to current tree file using Tree_Write
  276.  
  277.    function New_Node
  278.      (New_Node_Kind : Node_Kind;
  279.       New_Sloc      : Source_Ptr)
  280.       return          Node_Id;
  281.    --  Allocates a completely new node with the given node type and source
  282.    --  location values. All other fields are set to their standard defaults:
  283.    --
  284.    --    Empty for all Fieldn fields
  285.    --    False for all Flagn fields
  286.    --
  287.    --  The usual approach is to build a new node using this function and
  288.    --  then, using the value returned, use the Set_xxx functions to set
  289.    --  fields of the node as required. New_Node can only be used for
  290.    --  non-entity nodes, i.e. it never generates an extended node.
  291.  
  292.    function New_Entity
  293.      (New_Node_Kind : Node_Kind;
  294.       New_Sloc      : Source_Ptr)
  295.       return          Entity_Id;
  296.    --  Similar to New_Node, except that it is used only for entity nodes
  297.    --  and returns an extended node.
  298.  
  299.    procedure Set_Comes_From_Source_Default (Default : Boolean);
  300.    --  Sets value of Comes_From_Source flag to be used in all subsequent
  301.    --  New_Node and New_Entity calls until another call to this procedure
  302.    --  changes the default.
  303.  
  304.    function Has_Extension (N : Node_Id) return Boolean;
  305.    pragma Inline (Has_Extension);
  306.    --  Returns True if the given node has an extension (i.e. was created by
  307.    --  a call to New_Entity rather than New_Node, and Nkind is in N_Entity)
  308.  
  309.    procedure Change_Node (N : Node_Id; New_Node_Kind : Node_Kind);
  310.    --  This procedure replaces the given node by setting its Nkind field to
  311.    --  the indicated value and resetting all other fields to their default
  312.    --  values except for Sloc, which is unchanged, and the Parent pointer
  313.    --  and list links, which are also unchanged. All other information in
  314.    --  the original node is lost. The new node has an extension if the
  315.    --  original node had an extension.
  316.  
  317.    procedure Copy_Node (Source : Node_Id; Destination : Node_Id);
  318.    --  Copy the entire contents of the source node to the destination node.
  319.    --  The contents of the source node is not affected. If the source node
  320.    --  has an extension, then the destination must have an extension also.
  321.    --  The parent pointer of the destination and its list link, if any, are
  322.    --  not affected by the copy. Note that parent pointers of descendents
  323.    --  are not adjusted, so the descendents of the destination node after
  324.    --  the Copy_Node is completed have dubious parent pointers.
  325.  
  326.    function New_Copy (Source : Node_Id) return Node_Id;
  327.    --  This function allocates a completely new node, and then initializes
  328.    --  it by copying the contents of the source node into it. The contents
  329.    --  of the source node is not affected. The target node is always marked
  330.    --  as not being in a list (even if the source is a list member). The
  331.    --  new node will have an extension if the source has an extension.
  332.    --  New_Copy (Empty) returns Empty and New_Copy (Error) returns Error.
  333.    --  Note that, unlike New_Copy_Tree, New_Copy does not recursively copy any
  334.    --  descendents, so in general parent pointers are not set correctly for
  335.    --  the descendents of the copied node. Both normal and extended nodes
  336.    --  (entities) may be copied using New_Copy.
  337.  
  338.    function Relocate_Node (Source : Node_Id) return Node_Id;
  339.    --  Source is a non-entity node that is to be relocated. A new node is
  340.    --  allocated and the contents of Source are copied to this node using
  341.    --  Copy_Node. The parent pointers of descendents of the node are then
  342.    --  adjusted to point to the relocated copy. The original node is not
  343.    --  modified, but the parent pointers of its descendents are no longer
  344.    --  valid. This routine is used in conjunction with the tree rewrite
  345.    --  routines (see descriptions of Replace/Rewrite_Substitute_Tree)
  346.    --  Note that the resulting node has the same parent as the source
  347.    --  node, and is thus still attached to the tree. It is valid for
  348.    --  Source to be Empty, in which case Relocate_Node simply returns
  349.    --  Empty as the result.
  350.  
  351.    function New_Copy_Tree (Source : Node_Id) return Node_Id;
  352.    --  Given a node that is the root of a subtree, Copy_Tree copies the entire
  353.    --  syntactic subtree, including recursively any descendents whose parent
  354.    --  field references a copied node (descendents not linked to a copied node
  355.    --  by the parent field are not copied, instead the copied tree references
  356.    --  the same descendent as the original in this case, which is appropriate
  357.    --  for non-syntactic fields such as Etype). The parent pointers in the
  358.    --  copy are properly set. Copy_Tree (Empty/Error) returns Empty/Error.
  359.    --  The one exception to the rule of not copying semantic fields is that
  360.    --  any implicit types attached to the subtree are duplicated, so that
  361.    --  the copy contains a distinct set of implicit type entities.
  362.  
  363.    function New_Copy_With_Replacement (Source : Node_Id; Map : Elist_Id)
  364.    return Node_Id;
  365.    --  Variant of New_Copy_Tree, used for copying derived record declarations.
  366.    --  Map is an association between the components of the parent record and
  367.    --  the derived record. As the original tree is copied, all references to
  368.    --  the old entities are replaced with references to the new entities. The
  369.    --  Itypes of the original declaration are similarly mapped into new
  370.    --  Itypes, in the course of making the copy.
  371.  
  372.    function Copy_Original_Tree (Source : Node_Id) return Node_Id;
  373.    --  Does the same thing as Copy_Separate_Tree, except for a substituted
  374.    --  tree and for parents of field copies. For a substituted tree we copy
  375.    --  the corresponding original tree. Each copy is also set as parent of its
  376.    --  field copies. The main purpose of this function is to produce a good
  377.    --  copy according to the specification of Sprint_Node_Pure_Ada as defined
  378.    --  in Sprint.
  379.  
  380.    function Copy_Separate_Tree (Source : Node_Id) return Node_Id;
  381.    --  Given a node that is the root of a subtree, Copy_Separate_Tree copies
  382.    --  the entire syntactic subtree, including recursively any descendants
  383.    --  whose parent field references a copied node (descendants not linked to
  384.    --  a copied node by the parent field are also copied.) The parent pointers
  385.    --  in the copy are properly set. Copy_Separate_Tree (Empty/Error) returns
  386.    --  Empty/Error. The semantic fields are not copied and the new subtree
  387.    --  does not share any entity with source subtree.
  388.    --  But the code *does* copy semantic fields, and the description above
  389.    --  is in any case unclear on this point ??? (RBKD)
  390.  
  391.    procedure Exchange_Entities (E1 : Entity_Id; E2 : Entity_Id);
  392.    --  Exchange the contents of two entities. The parent pointers are switched
  393.    --  as well as the Defining_Identifier fields in the parents, so that the
  394.    --  entities point correctly to their original parents. The effect is thus
  395.    --  to leave the tree completely unchanged in structure, except that the
  396.    --  entity ID values of the two entities are interchanged. Neither of the
  397.    --  two entities may be list members.
  398.  
  399.    procedure Delete_Node (Node : Node_Id);
  400.    --  The node, which must not be a list member, is deleted from the tree
  401.    --  an its type is set to N_Void. It is an error (not necessarily detected)
  402.    --  to reference this node after it has been deleted. The implementation of
  403.    --  the body of Atree is free to reuse the node to satisfy future node
  404.    --  allocation requests, but is not required to do so.
  405.  
  406.    function Extend_Node (Node : Node_Id) return Node_Id;
  407.    --  This function returns a copy of its input node with an extension
  408.    --  added. The fields of the extension are set to Empty. Due to the way
  409.    --  extensions are handled (as two consecutive array elements), it may
  410.    --  be necessary to reallocate the node, so that the returned value is
  411.    --  not the same as the input value, but where possible the returned
  412.    --  value will be the same as the input value (i.e. the extension will
  413.    --  occur in place). It is the caller's responsibility to ensure that
  414.    --  any pointers to the original node are appropriately updated. This
  415.    --  function is used only by Sinfo.CN to change nodes into their
  416.    --  corresponding entities, which is why it is in Unchecked_Access.
  417.  
  418.    ---------------------------
  419.    -- Node Access Functions --
  420.    ---------------------------
  421.  
  422.    --  The following functions return the contents of the indicated field of
  423.    --  the node referenced by the argument, which is a Node_Id.
  424.  
  425.    function Nkind       (N : Node_Id) return Node_Kind;
  426.    pragma Inline (Nkind);
  427.  
  428.    function Ekind       (N : Node_Id) return Entity_Kind;
  429.    pragma Inline (Ekind);
  430.  
  431.    function Comes_From_Source (N : Node_Id) return Boolean;
  432.    pragma Inline (Comes_From_Source);
  433.  
  434.    function Sloc        (N : Node_Id) return Source_Ptr;
  435.    pragma Inline (Sloc);
  436.  
  437.    function Paren_Count (N : Node_Id) return Paren_Count_Type;
  438.    pragma Inline (Paren_Count);
  439.  
  440.    function Convention  (N : Node_Id) return Convention_Id;
  441.    pragma Inline (Convention);
  442.  
  443.    function Parent      (N : Node_Id) return Node_Id;
  444.    pragma Inline (Parent);
  445.    --  Returns the parent of a node if the node is not a list member, or
  446.    --  else the parent of the list containing the node if the node is a
  447.    --  list member.
  448.  
  449.    function No          (N : Node_Id) return Boolean;
  450.    pragma Inline (No);
  451.    --  Tests given Id for equality with the Empty node. This allows notations
  452.    --  like "if No (Variant_Part)" as opposed to "if Variant_Part = Empty".
  453.  
  454.    function Present     (N : Node_Id) return Boolean;
  455.    pragma Inline (Present);
  456.    --  Tests given Id for inequality with the Empty node. This allows notations
  457.    --  like "if Present (Statement)" as opposed to "if Statement /= Empty".
  458.  
  459.    ----------------------------
  460.    -- Node Update Procedures --
  461.    ----------------------------
  462.  
  463.    --  The following functions set a specified field in the node whose Id is
  464.    --  passed as the first argument. The second parameter is the new value
  465.    --  to be set in the specified field. Note that Set_Nkind is in the next
  466.    --  section, since its use is restricted.
  467.  
  468.    procedure Set_Ekind       (N : Node_Id; Val : Entity_Kind);
  469.    pragma Inline (Set_Ekind);
  470.  
  471.    procedure Set_Sloc        (N : Node_Id; Val : Source_Ptr);
  472.    pragma Inline (Set_Sloc);
  473.  
  474.    procedure Set_Paren_Count (N : Node_Id; Val : Paren_Count_Type);
  475.    pragma Inline (Set_Paren_Count);
  476.  
  477.    procedure Set_Convention  (N : Node_Id; Val : Convention_Id);
  478.    pragma Inline (Set_Convention);
  479.  
  480.    procedure Set_Parent      (N : Node_Id; Val : Node_Id);
  481.    pragma Inline (Set_Parent);
  482.  
  483.    ---------------------------
  484.    -- Tree Rewrite Routines --
  485.    ---------------------------
  486.  
  487.    --  During the compilation process it is necessary in a number of situations
  488.    --  to rewrite the tree. In some cases, such rewrites do not affect the
  489.    --  structure of the tree, for example, when an indexed component node is
  490.    --  replaced by the corresponding call node (the parser cannot distinguish
  491.    --  between these two cases).
  492.  
  493.    --  In other situations, the rewrite does affect the structure of the
  494.    --  tree. Examples are the replacement of a generic instantiation by the
  495.    --  instantiated spec and body, and the static evaluation of expressions.
  496.  
  497.    --  If such structural modifications are done by the expander, there are
  498.    --  no difficulties, since the form of the tree after the expander has no
  499.    --  special significance, except as input to the backend of the compiler.
  500.    --  However, if these modifications are done by the semantic phase, then
  501.    --  it is important that they be done in a manner which allows the original
  502.    --  tree to be preserved. This is because tools like pretty printers need
  503.    --  to have this original tree structure available.
  504.  
  505.    --  The subprograms in this section allow rewriting of the tree by either
  506.    --  insertion of new nodes in an existing list, or complete replacement of
  507.    --  a subtree. The resulting tree for most purposes looks as though it has
  508.    --  been really changed, and there is no trace of the original. However,
  509.    --  special subprograms, also defined in this section, allow the original
  510.    --  tree to be reconstructed if necessary.
  511.  
  512.    --  For tree modifications done in the expander, it is permissible to
  513.    --  destroy the original tree, although it is also allowable to use the
  514.    --  tree rewrite routines where it is convenient to do so.
  515.  
  516.    procedure Mark_Rewrite_Insertion (New_Node : Node_Id);
  517.    pragma Inline (Mark_Rewrite_Insertion);
  518.    --  This procedure marks the given node as an insertion made during a tree
  519.    --  rewriting operation. Only the root needs to be marked. The call does
  520.    --  not do the actual insertion, which must be done using one of the normal
  521.    --  list insertion routines. The node is treated normally in all respects
  522.    --  except for its response to Is_Rewrite_Insertion.
  523.  
  524.    function Is_Rewrite_Insertion (Node : Node_Id) return Boolean;
  525.    pragma Inline (Is_Rewrite_Insertion);
  526.    --  Tests whether the given node was marked using Set_Rewrite_Insert. This
  527.    --  is used in reconstructing the original tree (where such nodes are to
  528.    --  be eliminated from the reconstructed tree).
  529.  
  530.    procedure Rewrite_Substitute_Tree (Old_Node, New_Node : Node_Id);
  531.    --  This is used when a complete subtree is to be replaced. Old_Node is the
  532.    --  root of the old subtree to be replaced, and New_Node is the root of the
  533.    --  newly constructed replacement subtree. The actual mechanism is to swap
  534.    --  the contents of these two nodes fixing up the parent pointers of the
  535.    --  replaced node (we do not attempt to preserve parent pointers for the
  536.    --  original node). Neither Old_Node nor New_Node can be extended nodes.
  537.    --
  538.    --  Note, New_Node may not contain references to Old_Node, for example as
  539.    --  descendents, since the rewrite would make such references invalid. If
  540.    --  New_Node does need to refernce Old_Node, then these references should
  541.    --  be to a relocated copy of Old_Node (see Relocate_Node procedure).
  542.  
  543.    procedure Replace_Substitute_Tree (Old_Node, New_Node : Node_Id);
  544.    --  This is similar to Rewrite_Substitute_Tree, except that the old value
  545.    --  of Old_Node is not saved, and the New_Node is deleted after the replace
  546.    --  since it is assumed that it can no longer be legitimately needed. The
  547.    --  Is_Rewrite_Susbtitute flag will be False for the resulting node, unless
  548.    --  it was already true on entry, and Original_Node will not return the
  549.    --  original contents of the Old_Node, but rather the New_Node value (unless
  550.    --  Old_Node had already been rewritten using Rewrite_Substitute_Tree).
  551.    --
  552.    --  Note, New_Node may not contain references to Old_Node, for example as
  553.    --  descendents, since the rewrite would make such references invalid. If
  554.    --  New_Node does need to refernce Old_Node, then these references should
  555.    --  be to a relocated copy of Old_Node (see Relocate_Node procedure).
  556.  
  557.    function Is_Rewrite_Substitution (Node : Node_Id) return Boolean;
  558.    pragma Inline (Is_Rewrite_Substitution);
  559.    --  Return True iff Node has been rewritten (i.e. if Node is the root
  560.    --  or a subtree which was installed using Rewrite_Substitute_Tree)
  561.  
  562.    function Original_Node (Node : Node_Id) return Node_Id;
  563.    --  If Node has not been rewritten, then returns its input argument
  564.    --  unchanged, else returns the Node for the original subtree. If
  565.    --  applied to a node marked by Set_Rewrite_Insert, returns Empty.
  566.    --  Note that parents are not preserved in original tree nodes that
  567.    --  are retrieved in this way (i.e. their children may have parent
  568.    --  pointers which reference some other node).
  569.  
  570.    --  Note: there is no direct mechanism for deleting an original node (in
  571.    --  a manner that can be reversed later). One possible approach is to use
  572.    --  Rewrite_Substitute_Tree to substitute a null statement for the node
  573.    --  to be deleted.
  574.  
  575.    -----------------------------------
  576.    -- Generic Field Access Routines --
  577.    -----------------------------------
  578.  
  579.    --  This subpackage provides the functions for accessing and procedures
  580.    --  for setting fields that are normally referenced by their logical
  581.    --  synonyms defined in packages Sinfo and Einfo. As previously
  582.    --  described the implementations of these packages use the package
  583.    --  Atree.Unchecked_Access.
  584.  
  585.    package Unchecked_Access is
  586.  
  587.       --  Functions to allow interpretation of Union_Id values as Uint
  588.       --  and Ureal values
  589.  
  590.       function To_Union is new Unchecked_Conversion (Uint,  Union_Id);
  591.       function To_Union is new Unchecked_Conversion (Ureal, Union_Id);
  592.  
  593.       function From_Union is new Unchecked_Conversion (Union_Id, Uint);
  594.       function From_Union is new Unchecked_Conversion (Union_Id, Ureal);
  595.  
  596.       --  Functions to fetch contents of indicated field. It is an error
  597.       --  to attempt to read the value of a field which is not present.
  598.  
  599.       function Field1 (N : Node_Id) return Union_Id;
  600.       pragma Inline (Field1);
  601.  
  602.       function Field2 (N : Node_Id) return Union_Id;
  603.       pragma Inline (Field2);
  604.  
  605.       function Field3 (N : Node_Id) return Union_Id;
  606.       pragma Inline (Field3);
  607.  
  608.       function Field4 (N : Node_Id) return Union_Id;
  609.       pragma Inline (Field4);
  610.  
  611.       function Field5 (N : Node_Id) return Union_Id;
  612.       pragma Inline (Field5);
  613.  
  614.       function Field6 (N : Node_Id) return Union_Id;
  615.       pragma Inline (Field6);
  616.  
  617.       function Field7 (N : Node_Id) return Union_Id;
  618.       pragma Inline (Field7);
  619.  
  620.       function Field8 (N : Node_Id) return Union_Id;
  621.       pragma Inline (Field8);
  622.  
  623.       function Field9 (N : Node_Id) return Union_Id;
  624.       pragma Inline (Field9);
  625.  
  626.       function Field10 (N : Node_Id) return Union_Id;
  627.       pragma Inline (Field10);
  628.  
  629.       function Field11 (N : Node_Id) return Union_Id;
  630.       pragma Inline (Field11);
  631.  
  632.       function Field12 (N : Node_Id) return Union_Id;
  633.       pragma Inline (Field12);
  634.  
  635.       function Field13 (N : Node_Id) return Union_Id;
  636.       pragma Inline (Field13);
  637.  
  638.       function Field14 (N : Node_Id) return Union_Id;
  639.       pragma Inline (Field14);
  640.  
  641.       function Field15 (N : Node_Id) return Union_Id;
  642.       pragma Inline (Field15);
  643.  
  644.       function Field16 (N : Node_Id) return Union_Id;
  645.       pragma Inline (Field16);
  646.  
  647.       function Field17 (N : Node_Id) return Union_Id;
  648.       pragma Inline (Field17);
  649.  
  650.       function Field18 (N : Node_Id) return Union_Id;
  651.       pragma Inline (Field18);
  652.  
  653.       function Field19 (N : Node_Id) return Union_Id;
  654.       pragma Inline (Field19);
  655.  
  656.       function Field20 (N : Node_Id) return Union_Id;
  657.       pragma Inline (Field20);
  658.  
  659.       function Field21 (N : Node_Id) return Union_Id;
  660.       pragma Inline (Field21);
  661.  
  662.       function Field22 (N : Node_Id) return Union_Id;
  663.       pragma Inline (Field22);
  664.  
  665.       function Node1 (N : Node_Id) return Node_Id;
  666.       pragma Inline (Node1);
  667.  
  668.       function Node2 (N : Node_Id) return Node_Id;
  669.       pragma Inline (Node2);
  670.  
  671.       function Node3 (N : Node_Id) return Node_Id;
  672.       pragma Inline (Node3);
  673.  
  674.       function Node4 (N : Node_Id) return Node_Id;
  675.       pragma Inline (Node4);
  676.  
  677.       function Node5 (N : Node_Id) return Node_Id;
  678.       pragma Inline (Node5);
  679.  
  680.       function Node6 (N : Node_Id) return Node_Id;
  681.       pragma Inline (Node6);
  682.  
  683.       function Node7 (N : Node_Id) return Node_Id;
  684.       pragma Inline (Node7);
  685.  
  686.       function Node8 (N : Node_Id) return Node_Id;
  687.       pragma Inline (Node8);
  688.  
  689.       function Node9 (N : Node_Id) return Node_Id;
  690.       pragma Inline (Node9);
  691.  
  692.       function Node10 (N : Node_Id) return Node_Id;
  693.       pragma Inline (Node10);
  694.  
  695.       function Node11 (N : Node_Id) return Node_Id;
  696.       pragma Inline (Node11);
  697.  
  698.       function Node12 (N : Node_Id) return Node_Id;
  699.       pragma Inline (Node12);
  700.  
  701.       function Node13 (N : Node_Id) return Node_Id;
  702.       pragma Inline (Node13);
  703.  
  704.       function Node14 (N : Node_Id) return Node_Id;
  705.       pragma Inline (Node14);
  706.  
  707.       function Node15 (N : Node_Id) return Node_Id;
  708.       pragma Inline (Node15);
  709.  
  710.       function Node16 (N : Node_Id) return Node_Id;
  711.       pragma Inline (Node16);
  712.  
  713.       function Node17 (N : Node_Id) return Node_Id;
  714.       pragma Inline (Node17);
  715.  
  716.       function Node18 (N : Node_Id) return Node_Id;
  717.       pragma Inline (Node18);
  718.  
  719.       function Node19 (N : Node_Id) return Node_Id;
  720.       pragma Inline (Node19);
  721.  
  722.       function Node20 (N : Node_Id) return Node_Id;
  723.       pragma Inline (Node20);
  724.  
  725.       function Node21 (N : Node_Id) return Node_Id;
  726.       pragma Inline (Node21);
  727.  
  728.       function Node22 (N : Node_Id) return Node_Id;
  729.       pragma Inline (Node22);
  730.  
  731.       function List1 (N : Node_Id) return List_Id;
  732.       pragma Inline (List1);
  733.  
  734.       function List2 (N : Node_Id) return List_Id;
  735.       pragma Inline (List2);
  736.  
  737.       function List3 (N : Node_Id) return List_Id;
  738.       pragma Inline (List3);
  739.  
  740.       function List4 (N : Node_Id) return List_Id;
  741.       pragma Inline (List4);
  742.  
  743.       function List5 (N : Node_Id) return List_Id;
  744.       pragma Inline (List5);
  745.  
  746.       function Elist3 (N : Node_Id) return Elist_Id;
  747.       pragma Inline (Elist3);
  748.  
  749.       function Elist6 (N : Node_Id) return Elist_Id;
  750.       pragma Inline (Elist6);
  751.  
  752.       function Elist7 (N : Node_Id) return Elist_Id;
  753.       pragma Inline (Elist7);
  754.  
  755.       function Elist13 (N : Node_Id) return Elist_Id;
  756.       pragma Inline (Elist13);
  757.  
  758.       function Name1 (N : Node_Id) return Name_Id;
  759.       pragma Inline (Name1);
  760.  
  761.       function Name2 (N : Node_Id) return Name_Id;
  762.       pragma Inline (Name2);
  763.  
  764.       function Char_Code2 (N : Node_Id) return Char_Code;
  765.       pragma Inline (Char_Code2);
  766.  
  767.       function Str3 (N : Node_Id) return String_Id;
  768.       pragma Inline (Str3);
  769.  
  770.       function Uint3 (N : Node_Id) return Uint;
  771.       pragma Inline (Uint3);
  772.  
  773.       function Uint4 (N : Node_Id) return Uint;
  774.       pragma Inline (Uint4);
  775.  
  776.       function Uint8 (N : Node_Id) return Uint;
  777.       pragma Inline (Uint8);
  778.  
  779.       function Uint9 (N : Node_Id) return Uint;
  780.       pragma Inline (Uint9);
  781.  
  782.       function Uint11 (N : Node_Id) return Uint;
  783.       pragma Inline (Uint11);
  784.  
  785.       function Uint12 (N : Node_Id) return Uint;
  786.       pragma Inline (Uint12);
  787.  
  788.       function Uint15 (N : Node_Id) return Uint;
  789.       pragma Inline (Uint15);
  790.  
  791.       function Ureal3 (N : Node_Id) return Ureal;
  792.       pragma Inline (Ureal3);
  793.  
  794.       function Ureal6 (N : Node_Id) return Ureal;
  795.       pragma Inline (Ureal6);
  796.  
  797.       function Ureal7 (N : Node_Id) return Ureal;
  798.       pragma Inline (Ureal7);
  799.  
  800.       function Flag1 (N : Node_Id) return Boolean;
  801.       pragma Inline (Flag1);
  802.  
  803.       function Flag3 (N : Node_Id) return Boolean;
  804.       pragma Inline (Flag3);
  805.  
  806.       function Flag4 (N : Node_Id) return Boolean;
  807.       pragma Inline (Flag4);
  808.  
  809.       function Flag5 (N : Node_Id) return Boolean;
  810.       pragma Inline (Flag5);
  811.  
  812.       function Flag6 (N : Node_Id) return Boolean;
  813.       pragma Inline (Flag6);
  814.  
  815.       function Flag7 (N : Node_Id) return Boolean;
  816.       pragma Inline (Flag7);
  817.  
  818.       function Flag8 (N : Node_Id) return Boolean;
  819.       pragma Inline (Flag8);
  820.  
  821.       function Flag9 (N : Node_Id) return Boolean;
  822.       pragma Inline (Flag9);
  823.  
  824.       function Flag10 (N : Node_Id) return Boolean;
  825.       pragma Inline (Flag10);
  826.  
  827.       function Flag11 (N : Node_Id) return Boolean;
  828.       pragma Inline (Flag11);
  829.  
  830.       function Flag12 (N : Node_Id) return Boolean;
  831.       pragma Inline (Flag12);
  832.  
  833.       function Flag13 (N : Node_Id) return Boolean;
  834.       pragma Inline (Flag13);
  835.  
  836.       function Flag14 (N : Node_Id) return Boolean;
  837.       pragma Inline (Flag14);
  838.  
  839.       function Flag15 (N : Node_Id) return Boolean;
  840.       pragma Inline (Flag15);
  841.  
  842.       function Flag16 (N : Node_Id) return Boolean;
  843.       pragma Inline (Flag16);
  844.  
  845.       function Flag17 (N : Node_Id) return Boolean;
  846.       pragma Inline (Flag17);
  847.  
  848.       function Flag18 (N : Node_Id) return Boolean;
  849.       pragma Inline (Flag18);
  850.  
  851.       function Flag19 (N : Node_Id) return Boolean;
  852.       pragma Inline (Flag19);
  853.  
  854.       function Flag20 (N : Node_Id) return Boolean;
  855.       pragma Inline (Flag20);
  856.  
  857.       function Flag21 (N : Node_Id) return Boolean;
  858.       pragma Inline (Flag21);
  859.  
  860.       function Flag22 (N : Node_Id) return Boolean;
  861.       pragma Inline (Flag22);
  862.  
  863.       function Flag23 (N : Node_Id) return Boolean;
  864.       pragma Inline (Flag23);
  865.  
  866.       function Flag24 (N : Node_Id) return Boolean;
  867.       pragma Inline (Flag24);
  868.  
  869.       function Flag25 (N : Node_Id) return Boolean;
  870.       pragma Inline (Flag25);
  871.  
  872.       function Flag26 (N : Node_Id) return Boolean;
  873.       pragma Inline (Flag26);
  874.  
  875.       function Flag27 (N : Node_Id) return Boolean;
  876.       pragma Inline (Flag27);
  877.  
  878.       function Flag28 (N : Node_Id) return Boolean;
  879.       pragma Inline (Flag28);
  880.  
  881.       function Flag29 (N : Node_Id) return Boolean;
  882.       pragma Inline (Flag29);
  883.  
  884.       function Flag30 (N : Node_Id) return Boolean;
  885.       pragma Inline (Flag30);
  886.  
  887.       function Flag31 (N : Node_Id) return Boolean;
  888.       pragma Inline (Flag31);
  889.  
  890.       function Flag32 (N : Node_Id) return Boolean;
  891.       pragma Inline (Flag32);
  892.  
  893.       function Flag33 (N : Node_Id) return Boolean;
  894.       pragma Inline (Flag33);
  895.  
  896.       function Flag34 (N : Node_Id) return Boolean;
  897.       pragma Inline (Flag34);
  898.  
  899.       function Flag35 (N : Node_Id) return Boolean;
  900.       pragma Inline (Flag35);
  901.  
  902.       function Flag36 (N : Node_Id) return Boolean;
  903.       pragma Inline (Flag36);
  904.  
  905.       function Flag37 (N : Node_Id) return Boolean;
  906.       pragma Inline (Flag37);
  907.  
  908.       function Flag38 (N : Node_Id) return Boolean;
  909.       pragma Inline (Flag38);
  910.  
  911.       function Flag39 (N : Node_Id) return Boolean;
  912.       pragma Inline (Flag39);
  913.  
  914.       function Flag40 (N : Node_Id) return Boolean;
  915.       pragma Inline (Flag40);
  916.  
  917.       function Flag41 (N : Node_Id) return Boolean;
  918.       pragma Inline (Flag41);
  919.  
  920.       function Flag42 (N : Node_Id) return Boolean;
  921.       pragma Inline (Flag42);
  922.  
  923.       function Flag43 (N : Node_Id) return Boolean;
  924.       pragma Inline (Flag43);
  925.  
  926.       function Flag44 (N : Node_Id) return Boolean;
  927.       pragma Inline (Flag44);
  928.  
  929.       function Flag45 (N : Node_Id) return Boolean;
  930.       pragma Inline (Flag45);
  931.  
  932.       function Flag46 (N : Node_Id) return Boolean;
  933.       pragma Inline (Flag46);
  934.  
  935.       function Flag47 (N : Node_Id) return Boolean;
  936.       pragma Inline (Flag47);
  937.  
  938.       function Flag48 (N : Node_Id) return Boolean;
  939.       pragma Inline (Flag48);
  940.  
  941.       function Flag49 (N : Node_Id) return Boolean;
  942.       pragma Inline (Flag49);
  943.  
  944.       function Flag50 (N : Node_Id) return Boolean;
  945.       pragma Inline (Flag50);
  946.  
  947.       function Flag51 (N : Node_Id) return Boolean;
  948.       pragma Inline (Flag51);
  949.  
  950.       function Flag52 (N : Node_Id) return Boolean;
  951.       pragma Inline (Flag52);
  952.  
  953.       function Flag53 (N : Node_Id) return Boolean;
  954.       pragma Inline (Flag53);
  955.  
  956.       function Flag54 (N : Node_Id) return Boolean;
  957.       pragma Inline (Flag54);
  958.  
  959.       function Flag55 (N : Node_Id) return Boolean;
  960.       pragma Inline (Flag55);
  961.  
  962.       function Flag56 (N : Node_Id) return Boolean;
  963.       pragma Inline (Flag56);
  964.  
  965.       function Flag57 (N : Node_Id) return Boolean;
  966.       pragma Inline (Flag57);
  967.  
  968.       function Flag58 (N : Node_Id) return Boolean;
  969.       pragma Inline (Flag58);
  970.  
  971.       function Flag59 (N : Node_Id) return Boolean;
  972.       pragma Inline (Flag59);
  973.  
  974.       function Flag60 (N : Node_Id) return Boolean;
  975.       pragma Inline (Flag60);
  976.  
  977.       function Flag61 (N : Node_Id) return Boolean;
  978.       pragma Inline (Flag61);
  979.  
  980.       function Flag62 (N : Node_Id) return Boolean;
  981.       pragma Inline (Flag62);
  982.  
  983.       function Flag63 (N : Node_Id) return Boolean;
  984.       pragma Inline (Flag63);
  985.  
  986.       function Flag64 (N : Node_Id) return Boolean;
  987.       pragma Inline (Flag64);
  988.  
  989.       function Flag65 (N : Node_Id) return Boolean;
  990.       pragma Inline (Flag65);
  991.  
  992.       function Flag66 (N : Node_Id) return Boolean;
  993.       pragma Inline (Flag66);
  994.  
  995.       function Flag67 (N : Node_Id) return Boolean;
  996.       pragma Inline (Flag67);
  997.  
  998.       function Flag68 (N : Node_Id) return Boolean;
  999.       pragma Inline (Flag68);
  1000.  
  1001.       function Flag69 (N : Node_Id) return Boolean;
  1002.       pragma Inline (Flag69);
  1003.  
  1004.       function Flag70 (N : Node_Id) return Boolean;
  1005.       pragma Inline (Flag70);
  1006.  
  1007.       function Flag71 (N : Node_Id) return Boolean;
  1008.       pragma Inline (Flag71);
  1009.  
  1010.       function Flag72 (N : Node_Id) return Boolean;
  1011.       pragma Inline (Flag72);
  1012.  
  1013.       function Flag73 (N : Node_Id) return Boolean;
  1014.       pragma Inline (Flag73);
  1015.  
  1016.       function Flag74 (N : Node_Id) return Boolean;
  1017.       pragma Inline (Flag74);
  1018.  
  1019.       function Flag75 (N : Node_Id) return Boolean;
  1020.       pragma Inline (Flag75);
  1021.  
  1022.       function Flag76 (N : Node_Id) return Boolean;
  1023.       pragma Inline (Flag76);
  1024.  
  1025.       function Flag77 (N : Node_Id) return Boolean;
  1026.       pragma Inline (Flag77);
  1027.  
  1028.       function Flag78 (N : Node_Id) return Boolean;
  1029.       pragma Inline (Flag78);
  1030.  
  1031.       function Flag79 (N : Node_Id) return Boolean;
  1032.       pragma Inline (Flag79);
  1033.  
  1034.       function Flag80 (N : Node_Id) return Boolean;
  1035.       pragma Inline (Flag80);
  1036.  
  1037.       function Flag81 (N : Node_Id) return Boolean;
  1038.       pragma Inline (Flag81);
  1039.  
  1040.       function Flag82 (N : Node_Id) return Boolean;
  1041.       pragma Inline (Flag82);
  1042.  
  1043.       function Flag83 (N : Node_Id) return Boolean;
  1044.       pragma Inline (Flag83);
  1045.  
  1046.       function Flag84 (N : Node_Id) return Boolean;
  1047.       pragma Inline (Flag84);
  1048.  
  1049.       function Flag85 (N : Node_Id) return Boolean;
  1050.       pragma Inline (Flag85);
  1051.  
  1052.       function Flag86 (N : Node_Id) return Boolean;
  1053.       pragma Inline (Flag86);
  1054.  
  1055.       function Flag87 (N : Node_Id) return Boolean;
  1056.       pragma Inline (Flag87);
  1057.  
  1058.       function Flag88 (N : Node_Id) return Boolean;
  1059.       pragma Inline (Flag88);
  1060.  
  1061.       function Flag89 (N : Node_Id) return Boolean;
  1062.       pragma Inline (Flag89);
  1063.  
  1064.       function Flag90 (N : Node_Id) return Boolean;
  1065.       pragma Inline (Flag90);
  1066.  
  1067.       function Flag91 (N : Node_Id) return Boolean;
  1068.       pragma Inline (Flag91);
  1069.  
  1070.       function Flag92 (N : Node_Id) return Boolean;
  1071.       pragma Inline (Flag92);
  1072.  
  1073.       function Flag93 (N : Node_Id) return Boolean;
  1074.       pragma Inline (Flag93);
  1075.  
  1076.       function Flag94 (N : Node_Id) return Boolean;
  1077.       pragma Inline (Flag94);
  1078.  
  1079.       function Flag95 (N : Node_Id) return Boolean;
  1080.       pragma Inline (Flag95);
  1081.  
  1082.       function Flag96 (N : Node_Id) return Boolean;
  1083.       pragma Inline (Flag96);
  1084.  
  1085.       function Flag97 (N : Node_Id) return Boolean;
  1086.       pragma Inline (Flag97);
  1087.  
  1088.       function Flag98 (N : Node_Id) return Boolean;
  1089.       pragma Inline (Flag98);
  1090.  
  1091.       function Flag99 (N : Node_Id) return Boolean;
  1092.       pragma Inline (Flag99);
  1093.  
  1094.       function Flag100 (N : Node_Id) return Boolean;
  1095.       pragma Inline (Flag100);
  1096.  
  1097.       function Flag101 (N : Node_Id) return Boolean;
  1098.       pragma Inline (Flag101);
  1099.  
  1100.       function Flag102 (N : Node_Id) return Boolean;
  1101.       pragma Inline (Flag102);
  1102.  
  1103.       function Flag103 (N : Node_Id) return Boolean;
  1104.       pragma Inline (Flag103);
  1105.  
  1106.       function Flag104 (N : Node_Id) return Boolean;
  1107.       pragma Inline (Flag104);
  1108.  
  1109.       function Flag105 (N : Node_Id) return Boolean;
  1110.       pragma Inline (Flag105);
  1111.  
  1112.       function Flag106 (N : Node_Id) return Boolean;
  1113.       pragma Inline (Flag106);
  1114.  
  1115.       function Flag107 (N : Node_Id) return Boolean;
  1116.       pragma Inline (Flag107);
  1117.  
  1118.       function Flag108 (N : Node_Id) return Boolean;
  1119.       pragma Inline (Flag108);
  1120.  
  1121.       function Flag109 (N : Node_Id) return Boolean;
  1122.       pragma Inline (Flag109);
  1123.  
  1124.       function Flag110 (N : Node_Id) return Boolean;
  1125.       pragma Inline (Flag110);
  1126.  
  1127.       function Flag111 (N : Node_Id) return Boolean;
  1128.       pragma Inline (Flag111);
  1129.  
  1130.       function Flag112 (N : Node_Id) return Boolean;
  1131.       pragma Inline (Flag112);
  1132.  
  1133.       --  Procedures to set value of indicated field
  1134.  
  1135.       procedure Set_Nkind (N : Node_Id; Val : Node_Kind);
  1136.       pragma Inline (Set_Nkind);
  1137.  
  1138.       procedure Set_Field1 (N : Node_Id; Val : Union_Id);
  1139.       pragma Inline (Set_Field1);
  1140.  
  1141.       procedure Set_Field2 (N : Node_Id; Val : Union_Id);
  1142.       pragma Inline (Set_Field2);
  1143.  
  1144.       procedure Set_Field3 (N : Node_Id; Val : Union_Id);
  1145.       pragma Inline (Set_Field3);
  1146.  
  1147.       procedure Set_Field4 (N : Node_Id; Val : Union_Id);
  1148.       pragma Inline (Set_Field4);
  1149.  
  1150.       procedure Set_Field5 (N : Node_Id; Val : Union_Id);
  1151.       pragma Inline (Set_Field5);
  1152.  
  1153.       procedure Set_Field6 (N : Node_Id; Val : Union_Id);
  1154.       pragma Inline (Set_Field6);
  1155.  
  1156.       procedure Set_Field7 (N : Node_Id; Val : Union_Id);
  1157.       pragma Inline (Set_Field7);
  1158.  
  1159.       procedure Set_Field8 (N : Node_Id; Val : Union_Id);
  1160.       pragma Inline (Set_Field8);
  1161.  
  1162.       procedure Set_Field9 (N : Node_Id; Val : Union_Id);
  1163.       pragma Inline (Set_Field9);
  1164.  
  1165.       procedure Set_Field10 (N : Node_Id; Val : Union_Id);
  1166.       pragma Inline (Set_Field10);
  1167.  
  1168.       procedure Set_Field11 (N : Node_Id; Val : Union_Id);
  1169.       pragma Inline (Set_Field11);
  1170.  
  1171.       procedure Set_Field12 (N : Node_Id; Val : Union_Id);
  1172.       pragma Inline (Set_Field12);
  1173.  
  1174.       procedure Set_Field13 (N : Node_Id; Val : Union_Id);
  1175.       pragma Inline (Set_Field13);
  1176.  
  1177.       procedure Set_Field14 (N : Node_Id; Val : Union_Id);
  1178.       pragma Inline (Set_Field14);
  1179.  
  1180.       procedure Set_Field15 (N : Node_Id; Val : Union_Id);
  1181.       pragma Inline (Set_Field15);
  1182.  
  1183.       procedure Set_Field16 (N : Node_Id; Val : Union_Id);
  1184.       pragma Inline (Set_Field16);
  1185.  
  1186.       procedure Set_Field17 (N : Node_Id; Val : Union_Id);
  1187.       pragma Inline (Set_Field17);
  1188.  
  1189.       procedure Set_Field18 (N : Node_Id; Val : Union_Id);
  1190.       pragma Inline (Set_Field18);
  1191.  
  1192.       procedure Set_Field19 (N : Node_Id; Val : Union_Id);
  1193.       pragma Inline (Set_Field19);
  1194.  
  1195.       procedure Set_Field20 (N : Node_Id; Val : Union_Id);
  1196.       pragma Inline (Set_Field20);
  1197.  
  1198.       procedure Set_Field21 (N : Node_Id; Val : Union_Id);
  1199.       pragma Inline (Set_Field21);
  1200.  
  1201.       procedure Set_Field22 (N : Node_Id; Val : Union_Id);
  1202.       pragma Inline (Set_Field22);
  1203.  
  1204.       procedure Set_Node1 (N : Node_Id; Val : Node_Id);
  1205.       pragma Inline (Set_Node1);
  1206.  
  1207.       procedure Set_Node2 (N : Node_Id; Val : Node_Id);
  1208.       pragma Inline (Set_Node2);
  1209.  
  1210.       procedure Set_Node3 (N : Node_Id; Val : Node_Id);
  1211.       pragma Inline (Set_Node3);
  1212.  
  1213.       procedure Set_Node4 (N : Node_Id; Val : Node_Id);
  1214.       pragma Inline (Set_Node4);
  1215.  
  1216.       procedure Set_Node5 (N : Node_Id; Val : Node_Id);
  1217.       pragma Inline (Set_Node5);
  1218.  
  1219.       procedure Set_Node6 (N : Node_Id; Val : Node_Id);
  1220.       pragma Inline (Set_Node6);
  1221.  
  1222.       procedure Set_Node7 (N : Node_Id; Val : Node_Id);
  1223.       pragma Inline (Set_Node7);
  1224.  
  1225.       procedure Set_Node8 (N : Node_Id; Val : Node_Id);
  1226.       pragma Inline (Set_Node8);
  1227.  
  1228.       procedure Set_Node9 (N : Node_Id; Val : Node_Id);
  1229.       pragma Inline (Set_Node9);
  1230.  
  1231.       procedure Set_Node10 (N : Node_Id; Val : Node_Id);
  1232.       pragma Inline (Set_Node10);
  1233.  
  1234.       procedure Set_Node11 (N : Node_Id; Val : Node_Id);
  1235.       pragma Inline (Set_Node11);
  1236.  
  1237.       procedure Set_Node12 (N : Node_Id; Val : Node_Id);
  1238.       pragma Inline (Set_Node12);
  1239.  
  1240.       procedure Set_Node13 (N : Node_Id; Val : Node_Id);
  1241.       pragma Inline (Set_Node13);
  1242.  
  1243.       procedure Set_Node14 (N : Node_Id; Val : Node_Id);
  1244.       pragma Inline (Set_Node14);
  1245.  
  1246.       procedure Set_Node15 (N : Node_Id; Val : Node_Id);
  1247.       pragma Inline (Set_Node15);
  1248.  
  1249.       procedure Set_Node16 (N : Node_Id; Val : Node_Id);
  1250.       pragma Inline (Set_Node16);
  1251.  
  1252.       procedure Set_Node17 (N : Node_Id; Val : Node_Id);
  1253.       pragma Inline (Set_Node17);
  1254.  
  1255.       procedure Set_Node18 (N : Node_Id; Val : Node_Id);
  1256.       pragma Inline (Set_Node18);
  1257.  
  1258.       procedure Set_Node19 (N : Node_Id; Val : Node_Id);
  1259.       pragma Inline (Set_Node19);
  1260.  
  1261.       procedure Set_Node20 (N : Node_Id; Val : Node_Id);
  1262.       pragma Inline (Set_Node20);
  1263.  
  1264.       procedure Set_Node21 (N : Node_Id; Val : Node_Id);
  1265.       pragma Inline (Set_Node21);
  1266.  
  1267.       procedure Set_Node22 (N : Node_Id; Val : Node_Id);
  1268.       pragma Inline (Set_Node22);
  1269.  
  1270.       procedure Set_List1 (N : Node_Id; Val : List_Id);
  1271.       pragma Inline (Set_List1);
  1272.  
  1273.       procedure Set_List2 (N : Node_Id; Val : List_Id);
  1274.       pragma Inline (Set_List2);
  1275.  
  1276.       procedure Set_List3 (N : Node_Id; Val : List_Id);
  1277.       pragma Inline (Set_List3);
  1278.  
  1279.       procedure Set_List4 (N : Node_Id; Val : List_Id);
  1280.       pragma Inline (Set_List4);
  1281.  
  1282.       procedure Set_List5 (N : Node_Id; Val : List_Id);
  1283.       pragma Inline (Set_List5);
  1284.  
  1285.       procedure Set_Elist3 (N : Node_Id; Val : Elist_Id);
  1286.       pragma Inline (Set_Elist3);
  1287.  
  1288.       procedure Set_Elist6 (N : Node_Id; Val : Elist_Id);
  1289.       pragma Inline (Set_Elist6);
  1290.  
  1291.       procedure Set_Elist7 (N : Node_Id; Val : Elist_Id);
  1292.       pragma Inline (Set_Elist7);
  1293.  
  1294.       procedure Set_Elist13 (N : Node_Id; Val : Elist_Id);
  1295.       pragma Inline (Set_Elist13);
  1296.  
  1297.       procedure Set_Name1 (N : Node_Id; Val : Name_Id);
  1298.       pragma Inline (Set_Name1);
  1299.  
  1300.       procedure Set_Name2 (N : Node_Id; Val : Name_Id);
  1301.       pragma Inline (Set_Name2);
  1302.  
  1303.       procedure Set_Char_Code2 (N : Node_Id; Val : Char_Code);
  1304.       pragma Inline (Set_Char_Code2);
  1305.  
  1306.       procedure Set_Str3 (N : Node_Id; Val : String_Id);
  1307.       pragma Inline (Set_Str3);
  1308.  
  1309.       procedure Set_Uint3 (N : Node_Id; Val : Uint);
  1310.       pragma Inline (Set_Uint3);
  1311.  
  1312.       procedure Set_Uint4 (N : Node_Id; Val : Uint);
  1313.       pragma Inline (Set_Uint4);
  1314.  
  1315.       procedure Set_Uint8 (N : Node_Id; Val : Uint);
  1316.       pragma Inline (Set_Uint8);
  1317.  
  1318.       procedure Set_Uint9 (N : Node_Id; Val : Uint);
  1319.       pragma Inline (Set_Uint9);
  1320.  
  1321.       procedure Set_Uint11 (N : Node_Id; Val : Uint);
  1322.       pragma Inline (Set_Uint11);
  1323.  
  1324.       procedure Set_Uint12 (N : Node_Id; Val : Uint);
  1325.       pragma Inline (Set_Uint12);
  1326.  
  1327.       procedure Set_Uint15 (N : Node_Id; Val : Uint);
  1328.       pragma Inline (Set_Uint15);
  1329.  
  1330.       procedure Set_Ureal3 (N : Node_Id; Val : Ureal);
  1331.       pragma Inline (Set_Ureal3);
  1332.  
  1333.       procedure Set_Ureal6 (N : Node_Id; Val : Ureal);
  1334.       pragma Inline (Set_Ureal6);
  1335.  
  1336.       procedure Set_Ureal7 (N : Node_Id; Val : Ureal);
  1337.       pragma Inline (Set_Ureal7);
  1338.  
  1339.       procedure Set_Flag1 (N : Node_Id; Val : Boolean);
  1340.       pragma Inline (Set_Flag1);
  1341.  
  1342.       procedure Set_Flag3 (N : Node_Id; Val : Boolean);
  1343.       pragma Inline (Set_Flag3);
  1344.  
  1345.       procedure Set_Flag4 (N : Node_Id; Val : Boolean);
  1346.       pragma Inline (Set_Flag4);
  1347.  
  1348.       procedure Set_Flag5 (N : Node_Id; Val : Boolean);
  1349.       pragma Inline (Set_Flag5);
  1350.  
  1351.       procedure Set_Flag6 (N : Node_Id; Val : Boolean);
  1352.       pragma Inline (Set_Flag6);
  1353.  
  1354.       procedure Set_Flag7 (N : Node_Id; Val : Boolean);
  1355.       pragma Inline (Set_Flag7);
  1356.  
  1357.       procedure Set_Flag8 (N : Node_Id; Val : Boolean);
  1358.       pragma Inline (Set_Flag8);
  1359.  
  1360.       procedure Set_Flag9 (N : Node_Id; Val : Boolean);
  1361.       pragma Inline (Set_Flag9);
  1362.  
  1363.       procedure Set_Flag10 (N : Node_Id; Val : Boolean);
  1364.       pragma Inline (Set_Flag10);
  1365.  
  1366.       procedure Set_Flag11 (N : Node_Id; Val : Boolean);
  1367.       pragma Inline (Set_Flag11);
  1368.  
  1369.       procedure Set_Flag12 (N : Node_Id; Val : Boolean);
  1370.       pragma Inline (Set_Flag12);
  1371.  
  1372.       procedure Set_Flag13 (N : Node_Id; Val : Boolean);
  1373.       pragma Inline (Set_Flag13);
  1374.  
  1375.       procedure Set_Flag14 (N : Node_Id; Val : Boolean);
  1376.       pragma Inline (Set_Flag14);
  1377.  
  1378.       procedure Set_Flag15 (N : Node_Id; Val : Boolean);
  1379.       pragma Inline (Set_Flag15);
  1380.  
  1381.       procedure Set_Flag16 (N : Node_Id; Val : Boolean);
  1382.       pragma Inline (Set_Flag16);
  1383.  
  1384.       procedure Set_Flag17 (N : Node_Id; Val : Boolean);
  1385.       pragma Inline (Set_Flag17);
  1386.  
  1387.       procedure Set_Flag18 (N : Node_Id; Val : Boolean);
  1388.       pragma Inline (Set_Flag18);
  1389.  
  1390.       procedure Set_Flag19 (N : Node_Id; Val : Boolean);
  1391.       pragma Inline (Set_Flag19);
  1392.  
  1393.       procedure Set_Flag20 (N : Node_Id; Val : Boolean);
  1394.       pragma Inline (Set_Flag20);
  1395.  
  1396.       procedure Set_Flag21 (N : Node_Id; Val : Boolean);
  1397.       pragma Inline (Set_Flag21);
  1398.  
  1399.       procedure Set_Flag22 (N : Node_Id; Val : Boolean);
  1400.       pragma Inline (Set_Flag22);
  1401.  
  1402.       procedure Set_Flag23 (N : Node_Id; Val : Boolean);
  1403.       pragma Inline (Set_Flag23);
  1404.  
  1405.       procedure Set_Flag24 (N : Node_Id; Val : Boolean);
  1406.       pragma Inline (Set_Flag24);
  1407.  
  1408.       procedure Set_Flag25 (N : Node_Id; Val : Boolean);
  1409.       pragma Inline (Set_Flag25);
  1410.  
  1411.       procedure Set_Flag26 (N : Node_Id; Val : Boolean);
  1412.       pragma Inline (Set_Flag26);
  1413.  
  1414.       procedure Set_Flag27 (N : Node_Id; Val : Boolean);
  1415.       pragma Inline (Set_Flag27);
  1416.  
  1417.       procedure Set_Flag28 (N : Node_Id; Val : Boolean);
  1418.       pragma Inline (Set_Flag28);
  1419.  
  1420.       procedure Set_Flag29 (N : Node_Id; Val : Boolean);
  1421.       pragma Inline (Set_Flag29);
  1422.  
  1423.       procedure Set_Flag30 (N : Node_Id; Val : Boolean);
  1424.       pragma Inline (Set_Flag30);
  1425.  
  1426.       procedure Set_Flag31 (N : Node_Id; Val : Boolean);
  1427.       pragma Inline (Set_Flag31);
  1428.  
  1429.       procedure Set_Flag32 (N : Node_Id; Val : Boolean);
  1430.       pragma Inline (Set_Flag32);
  1431.  
  1432.       procedure Set_Flag33 (N : Node_Id; Val : Boolean);
  1433.       pragma Inline (Set_Flag33);
  1434.  
  1435.       procedure Set_Flag34 (N : Node_Id; Val : Boolean);
  1436.       pragma Inline (Set_Flag34);
  1437.  
  1438.       procedure Set_Flag35 (N : Node_Id; Val : Boolean);
  1439.       pragma Inline (Set_Flag35);
  1440.  
  1441.       procedure Set_Flag36 (N : Node_Id; Val : Boolean);
  1442.       pragma Inline (Set_Flag36);
  1443.  
  1444.       procedure Set_Flag37 (N : Node_Id; Val : Boolean);
  1445.       pragma Inline (Set_Flag37);
  1446.  
  1447.       procedure Set_Flag38 (N : Node_Id; Val : Boolean);
  1448.       pragma Inline (Set_Flag38);
  1449.  
  1450.       procedure Set_Flag39 (N : Node_Id; Val : Boolean);
  1451.       pragma Inline (Set_Flag39);
  1452.  
  1453.       procedure Set_Flag40 (N : Node_Id; Val : Boolean);
  1454.       pragma Inline (Set_Flag40);
  1455.  
  1456.       procedure Set_Flag41 (N : Node_Id; Val : Boolean);
  1457.       pragma Inline (Set_Flag41);
  1458.  
  1459.       procedure Set_Flag42 (N : Node_Id; Val : Boolean);
  1460.       pragma Inline (Set_Flag42);
  1461.  
  1462.       procedure Set_Flag43 (N : Node_Id; Val : Boolean);
  1463.       pragma Inline (Set_Flag43);
  1464.  
  1465.       procedure Set_Flag44 (N : Node_Id; Val : Boolean);
  1466.       pragma Inline (Set_Flag44);
  1467.  
  1468.       procedure Set_Flag45 (N : Node_Id; Val : Boolean);
  1469.       pragma Inline (Set_Flag45);
  1470.  
  1471.       procedure Set_Flag46 (N : Node_Id; Val : Boolean);
  1472.       pragma Inline (Set_Flag46);
  1473.  
  1474.       procedure Set_Flag47 (N : Node_Id; Val : Boolean);
  1475.       pragma Inline (Set_Flag47);
  1476.  
  1477.       procedure Set_Flag48 (N : Node_Id; Val : Boolean);
  1478.       pragma Inline (Set_Flag48);
  1479.  
  1480.       procedure Set_Flag49 (N : Node_Id; Val : Boolean);
  1481.       pragma Inline (Set_Flag49);
  1482.  
  1483.       procedure Set_Flag50 (N : Node_Id; Val : Boolean);
  1484.       pragma Inline (Set_Flag50);
  1485.  
  1486.       procedure Set_Flag51 (N : Node_Id; Val : Boolean);
  1487.       pragma Inline (Set_Flag51);
  1488.  
  1489.       procedure Set_Flag52 (N : Node_Id; Val : Boolean);
  1490.       pragma Inline (Set_Flag52);
  1491.  
  1492.       procedure Set_Flag53 (N : Node_Id; Val : Boolean);
  1493.       pragma Inline (Set_Flag53);
  1494.  
  1495.       procedure Set_Flag54 (N : Node_Id; Val : Boolean);
  1496.       pragma Inline (Set_Flag54);
  1497.  
  1498.       procedure Set_Flag55 (N : Node_Id; Val : Boolean);
  1499.       pragma Inline (Set_Flag55);
  1500.  
  1501.       procedure Set_Flag56 (N : Node_Id; Val : Boolean);
  1502.       pragma Inline (Set_Flag56);
  1503.  
  1504.       procedure Set_Flag57 (N : Node_Id; Val : Boolean);
  1505.       pragma Inline (Set_Flag57);
  1506.  
  1507.       procedure Set_Flag58 (N : Node_Id; Val : Boolean);
  1508.       pragma Inline (Set_Flag58);
  1509.  
  1510.       procedure Set_Flag59 (N : Node_Id; Val : Boolean);
  1511.       pragma Inline (Set_Flag59);
  1512.  
  1513.       procedure Set_Flag60 (N : Node_Id; Val : Boolean);
  1514.       pragma Inline (Set_Flag60);
  1515.  
  1516.       procedure Set_Flag61 (N : Node_Id; Val : Boolean);
  1517.       pragma Inline (Set_Flag61);
  1518.  
  1519.       procedure Set_Flag62 (N : Node_Id; Val : Boolean);
  1520.       pragma Inline (Set_Flag62);
  1521.  
  1522.       procedure Set_Flag63 (N : Node_Id; Val : Boolean);
  1523.       pragma Inline (Set_Flag63);
  1524.  
  1525.       procedure Set_Flag64 (N : Node_Id; Val : Boolean);
  1526.       pragma Inline (Set_Flag64);
  1527.  
  1528.       procedure Set_Flag65 (N : Node_Id; Val : Boolean);
  1529.       pragma Inline (Set_Flag65);
  1530.  
  1531.       procedure Set_Flag66 (N : Node_Id; Val : Boolean);
  1532.       pragma Inline (Set_Flag66);
  1533.  
  1534.       procedure Set_Flag67 (N : Node_Id; Val : Boolean);
  1535.       pragma Inline (Set_Flag67);
  1536.  
  1537.       procedure Set_Flag68 (N : Node_Id; Val : Boolean);
  1538.       pragma Inline (Set_Flag68);
  1539.  
  1540.       procedure Set_Flag69 (N : Node_Id; Val : Boolean);
  1541.       pragma Inline (Set_Flag69);
  1542.  
  1543.       procedure Set_Flag70 (N : Node_Id; Val : Boolean);
  1544.       pragma Inline (Set_Flag70);
  1545.  
  1546.       procedure Set_Flag71 (N : Node_Id; Val : Boolean);
  1547.       pragma Inline (Set_Flag71);
  1548.  
  1549.       procedure Set_Flag72 (N : Node_Id; Val : Boolean);
  1550.       pragma Inline (Set_Flag72);
  1551.  
  1552.       procedure Set_Flag73 (N : Node_Id; Val : Boolean);
  1553.       pragma Inline (Set_Flag73);
  1554.  
  1555.       procedure Set_Flag74 (N : Node_Id; Val : Boolean);
  1556.       pragma Inline (Set_Flag74);
  1557.  
  1558.       procedure Set_Flag75 (N : Node_Id; Val : Boolean);
  1559.       pragma Inline (Set_Flag75);
  1560.  
  1561.       procedure Set_Flag76 (N : Node_Id; Val : Boolean);
  1562.       pragma Inline (Set_Flag76);
  1563.  
  1564.       procedure Set_Flag77 (N : Node_Id; Val : Boolean);
  1565.       pragma Inline (Set_Flag77);
  1566.  
  1567.       procedure Set_Flag78 (N : Node_Id; Val : Boolean);
  1568.       pragma Inline (Set_Flag78);
  1569.  
  1570.       procedure Set_Flag79 (N : Node_Id; Val : Boolean);
  1571.       pragma Inline (Set_Flag79);
  1572.  
  1573.       procedure Set_Flag80 (N : Node_Id; Val : Boolean);
  1574.       pragma Inline (Set_Flag80);
  1575.  
  1576.       procedure Set_Flag81 (N : Node_Id; Val : Boolean);
  1577.       pragma Inline (Set_Flag81);
  1578.  
  1579.       procedure Set_Flag82 (N : Node_Id; Val : Boolean);
  1580.       pragma Inline (Set_Flag82);
  1581.  
  1582.       procedure Set_Flag83 (N : Node_Id; Val : Boolean);
  1583.       pragma Inline (Set_Flag83);
  1584.  
  1585.       procedure Set_Flag84 (N : Node_Id; Val : Boolean);
  1586.       pragma Inline (Set_Flag84);
  1587.  
  1588.       procedure Set_Flag85 (N : Node_Id; Val : Boolean);
  1589.       pragma Inline (Set_Flag85);
  1590.  
  1591.       procedure Set_Flag86 (N : Node_Id; Val : Boolean);
  1592.       pragma Inline (Set_Flag86);
  1593.  
  1594.       procedure Set_Flag87 (N : Node_Id; Val : Boolean);
  1595.       pragma Inline (Set_Flag87);
  1596.  
  1597.       procedure Set_Flag88 (N : Node_Id; Val : Boolean);
  1598.       pragma Inline (Set_Flag88);
  1599.  
  1600.       procedure Set_Flag89 (N : Node_Id; Val : Boolean);
  1601.       pragma Inline (Set_Flag89);
  1602.  
  1603.       procedure Set_Flag90 (N : Node_Id; Val : Boolean);
  1604.       pragma Inline (Set_Flag90);
  1605.  
  1606.       procedure Set_Flag91 (N : Node_Id; Val : Boolean);
  1607.       pragma Inline (Set_Flag91);
  1608.  
  1609.       procedure Set_Flag92 (N : Node_Id; Val : Boolean);
  1610.       pragma Inline (Set_Flag92);
  1611.  
  1612.       procedure Set_Flag93 (N : Node_Id; Val : Boolean);
  1613.       pragma Inline (Set_Flag93);
  1614.  
  1615.       procedure Set_Flag94 (N : Node_Id; Val : Boolean);
  1616.       pragma Inline (Set_Flag94);
  1617.  
  1618.       procedure Set_Flag95 (N : Node_Id; Val : Boolean);
  1619.       pragma Inline (Set_Flag95);
  1620.  
  1621.       procedure Set_Flag96 (N : Node_Id; Val : Boolean);
  1622.       pragma Inline (Set_Flag96);
  1623.  
  1624.       procedure Set_Flag97 (N : Node_Id; Val : Boolean);
  1625.       pragma Inline (Set_Flag97);
  1626.  
  1627.       procedure Set_Flag98 (N : Node_Id; Val : Boolean);
  1628.       pragma Inline (Set_Flag98);
  1629.  
  1630.       procedure Set_Flag99 (N : Node_Id; Val : Boolean);
  1631.       pragma Inline (Set_Flag99);
  1632.  
  1633.       procedure Set_Flag100 (N : Node_Id; Val : Boolean);
  1634.       pragma Inline (Set_Flag100);
  1635.  
  1636.       procedure Set_Flag101 (N : Node_Id; Val : Boolean);
  1637.       pragma Inline (Set_Flag101);
  1638.  
  1639.       procedure Set_Flag102 (N : Node_Id; Val : Boolean);
  1640.       pragma Inline (Set_Flag102);
  1641.  
  1642.       procedure Set_Flag103 (N : Node_Id; Val : Boolean);
  1643.       pragma Inline (Set_Flag103);
  1644.  
  1645.       procedure Set_Flag104 (N : Node_Id; Val : Boolean);
  1646.       pragma Inline (Set_Flag104);
  1647.  
  1648.       procedure Set_Flag105 (N : Node_Id; Val : Boolean);
  1649.       pragma Inline (Set_Flag105);
  1650.  
  1651.       procedure Set_Flag106 (N : Node_Id; Val : Boolean);
  1652.       pragma Inline (Set_Flag106);
  1653.  
  1654.       procedure Set_Flag107 (N : Node_Id; Val : Boolean);
  1655.       pragma Inline (Set_Flag107);
  1656.  
  1657.       procedure Set_Flag108 (N : Node_Id; Val : Boolean);
  1658.       pragma Inline (Set_Flag108);
  1659.  
  1660.       procedure Set_Flag109 (N : Node_Id; Val : Boolean);
  1661.       pragma Inline (Set_Flag109);
  1662.  
  1663.       procedure Set_Flag110 (N : Node_Id; Val : Boolean);
  1664.       pragma Inline (Set_Flag110);
  1665.  
  1666.       procedure Set_Flag111 (N : Node_Id; Val : Boolean);
  1667.       pragma Inline (Set_Flag111);
  1668.  
  1669.       procedure Set_Flag112 (N : Node_Id; Val : Boolean);
  1670.       pragma Inline (Set_Flag112);
  1671.  
  1672.       --  The following versions of Set_Noden also set the parent
  1673.       --  pointer of the referenced node if it is non_Empty
  1674.  
  1675.       procedure Set_Node1_With_Parent (N : Node_Id; Val : Node_Id);
  1676.       pragma Inline (Set_Node1);
  1677.  
  1678.       procedure Set_Node2_With_Parent (N : Node_Id; Val : Node_Id);
  1679.       pragma Inline (Set_Node2);
  1680.  
  1681.       procedure Set_Node3_With_Parent (N : Node_Id; Val : Node_Id);
  1682.       pragma Inline (Set_Node3);
  1683.  
  1684.       procedure Set_Node4_With_Parent (N : Node_Id; Val : Node_Id);
  1685.       pragma Inline (Set_Node4);
  1686.  
  1687.       procedure Set_Node5_With_Parent (N : Node_Id; Val : Node_Id);
  1688.       pragma Inline (Set_Node5);
  1689.  
  1690.       --  The following versions of Set_Listn also set the parent pointer of
  1691.       --  the referenced node if it is non_Empty. The procedures for List6
  1692.       --  to List12 can only be applied to nodes which have an extension.
  1693.  
  1694.       procedure Set_List1_With_Parent (N : Node_Id; Val : List_Id);
  1695.       pragma Inline (Set_List1_With_Parent);
  1696.  
  1697.       procedure Set_List2_With_Parent (N : Node_Id; Val : List_Id);
  1698.       pragma Inline (Set_List2_With_Parent);
  1699.  
  1700.       procedure Set_List3_With_Parent (N : Node_Id; Val : List_Id);
  1701.       pragma Inline (Set_List3_With_Parent);
  1702.  
  1703.       procedure Set_List4_With_Parent (N : Node_Id; Val : List_Id);
  1704.       pragma Inline (Set_List4_With_Parent);
  1705.  
  1706.       procedure Set_List5_With_Parent (N : Node_Id; Val : List_Id);
  1707.       pragma Inline (Set_List5_With_Parent);
  1708.  
  1709.    end Unchecked_Access;
  1710.  
  1711.    -----------------------------
  1712.    -- Private Part Subpackage --
  1713.    -----------------------------
  1714.  
  1715.    --  The following package contains the definition of the data structure
  1716.    --  used by the implementation of the Atree package. Logically it really
  1717.    --  corresponds to the private part, hence the name. The reason that it
  1718.    --  is defined as a sub-package is to allow special access from clients
  1719.    --  that need to see the internals of the data structures.
  1720.  
  1721.    package Atree_Private_Part is
  1722.  
  1723.       -------------------------
  1724.       -- Tree Representation --
  1725.       -------------------------
  1726.  
  1727.       --  The nodes of the tree are stored in a table (i.e. an array). In the
  1728.       --  case of extended nodes four consecutive components in the array are
  1729.       --  used. There are thus two formats for array components. One is used
  1730.       --  for non-extended nodes, and for the first component of extended
  1731.       --  nodes. The other is used for the extension parts (second, third and
  1732.       --  fourth components) of an extended node. A variant record structure
  1733.       --  is used to distinguish the two formats.
  1734.  
  1735.       type Node_Record (Is_Extension : Boolean := False) is record
  1736.  
  1737.          --  Logically, the only field in the common part is the above
  1738.          --  Is_Extension discriminant (a single bit). However, Gigi cannot
  1739.          --  yet handle such a structure, so we fill out the common part of
  1740.          --  the record with fields that are used in different ways for
  1741.          --  normal nodes and node extensions.
  1742.  
  1743.          Pflag1, Pflag2 : Boolean;
  1744.          --  The Paren_Count field is represented using two boolean flags,
  1745.          --  where Pflag1 is worth 1, and Pflag2 is worth 2. This is done
  1746.          --  because we need to be easily able to reuse this field for
  1747.          --  extra flags in the extended node case.
  1748.  
  1749.          In_List : Boolean;
  1750.          --  Flag used to indicate if node is a member of a list.
  1751.          --  This field is considered private to the Atree package.
  1752.  
  1753.          Rewrite_Sub : Boolean;
  1754.          --  Flag set if this node was result of Rewrite_Substitute_Tree.
  1755.          --  This field is considered private to the Atree package.
  1756.  
  1757.          Rewrite_Ins : Boolean;
  1758.          --  Flag set by Mark_Rewrite_Insertion procedure.
  1759.          --  This field is considered private to the Atree package.
  1760.  
  1761.          Comes_From_Source : Boolean;
  1762.          --  Flag to indicate that node comes from the source program (i.e.
  1763.          --  was built by the parser or scanner, not the analyzer or expander).
  1764.  
  1765.          Flag1  : Boolean;
  1766.          Flag3  : Boolean;
  1767.          Flag4  : Boolean;
  1768.          Flag5  : Boolean;
  1769.          Flag6  : Boolean;
  1770.          Flag7  : Boolean;
  1771.          Flag8  : Boolean;
  1772.          Flag9  : Boolean;
  1773.          Flag10 : Boolean;
  1774.          Flag11 : Boolean;
  1775.          Flag12 : Boolean;
  1776.          Flag13 : Boolean;
  1777.          Flag14 : Boolean;
  1778.          Flag15 : Boolean;
  1779.          Flag16 : Boolean;
  1780.          Flag17 : Boolean;
  1781.          Flag18 : Boolean;
  1782.          --  The eighteen flags for a normal node
  1783.  
  1784.          --  The above fields are used as follows in components two and
  1785.          --  three of an extended node entry (they are currently unused
  1786.          --  in the fourth component of an extended node entry).
  1787.  
  1788.          --    In_List            used as  Flag19, Flag40  in extension
  1789.          --    Rewrite_Sub        used as  Flag20, Flag41  in extension
  1790.          --    Rewrite_Ins        used as  Flag21, Flag42  in extension
  1791.          --    Flag1              used as  Flag22, Flag43  in extension
  1792.          --    Comes_From_Source  used as  Flag23, Flag44  in extension
  1793.          --    Flag3              used as  Flag24, Flag45  in extension
  1794.          --    Flag4              used as  Flag25, Flag46  in extension
  1795.          --    Flag5              used as  Flag26, Flag47  in extension
  1796.          --    Flag6              used as  Flag27, Flag48  in extension
  1797.          --    Flag7              used as  Flag28, Flag49  in extension
  1798.          --    Flag8              used as  Flag29, Flag50  in extension
  1799.          --    Flag9              used as  Flag30, Flag51  in extension
  1800.          --    Flag10             used as  Flag31, Flag52  in extension
  1801.          --    Flag11             used as  Flag32, Flag53  in extension
  1802.          --    Flag12             used as  Flag33, Flag54  in extension
  1803.          --    Flag13             used as  Flag34, Flag55  in extension
  1804.          --    Flag14             used as  Flag35, Flag56  in extension
  1805.          --    Flag15             used as  Flag36, Flag57  in extension
  1806.          --    Flag16             used as  Flag37, Flag58  in extension
  1807.          --    Flag17             used as  Flag38, Flag59  in extension
  1808.          --    Flag18             used as  Flag39, Flag60  in extension
  1809.          --    Pflag1             used as  Flag61, Flag62  in extension
  1810.          --    Pflag2             used as  Flag63, Flag64  in extension
  1811.  
  1812.          Nkind : Node_Kind;
  1813.          --  For a non-extended node, or the initial section of an extended
  1814.          --  node, this field holds the Node_Kind value. For an extended node,
  1815.          --  the Nkind field of the second entry is used to hold the Ekind
  1816.          --  field of the entity, and also the Nkind of the third entity is
  1817.          --  used to hold 8 additional flags (Flag65-Flag72)
  1818.  
  1819.          --  Now finally (on an 32-bit boundary!) comes the variant part
  1820.  
  1821.          case Is_Extension is
  1822.  
  1823.             --  Non-extended node, or first component of extended node
  1824.  
  1825.             when False =>
  1826.  
  1827.                Sloc : Source_Ptr;
  1828.                --  Source location for this node
  1829.  
  1830.                Link : Union_Id;
  1831.                --  This field is used either as the Parent pointer (if In_List
  1832.                --  is False), or as the list link pointer (if In_List is True)
  1833.                --  This field is considered private to the Atree package.
  1834.  
  1835.                Field1 : Union_Id;
  1836.                Field2 : Union_Id;
  1837.                Field3 : Union_Id;
  1838.                Field4 : Union_Id;
  1839.                Field5 : Union_Id;
  1840.                --  Five general use fields, which can contain Node_Id, List_Id,
  1841.                --  Elist_Id, String_Id, Name_Id, or Char_Code values depending
  1842.                --  on the values in Nkind and (for extended nodes), in Ekind.
  1843.                --  See packages Sinfo and Einfo for details of their use.
  1844.  
  1845.             --  Extension (second component) of extended node
  1846.  
  1847.             when True =>
  1848.                Field6  : Union_Id;
  1849.                Field7  : Union_Id;
  1850.                Field8  : Union_Id;
  1851.                Field9  : Union_Id;
  1852.                Field10 : Union_Id;
  1853.                Field11 : Union_Id;
  1854.                Field12 : Union_Id;
  1855.                --  Seven additional general fields available only for entities
  1856.                --  See package Einfo for details of their use (which depends
  1857.                --  on the value in the Ekind field).
  1858.  
  1859.             --  In the third component, the extension format as described
  1860.             --  above is used as follows:
  1861.  
  1862.             --    Field6-11      Used to hold Field13-Field18
  1863.             --    Field12        Used to hold Convention and Flags
  1864.  
  1865.             --  In the fourth component, the extension format as described
  1866.             --  above is used as follows:
  1867.  
  1868.             --    Field6-9       Used to hold Field19-Field22
  1869.             --    Field10-11     Currently unused
  1870.             --    Field12        Used to hold Flags
  1871.  
  1872.          end case;
  1873.       end record;
  1874.  
  1875.       pragma Pack (Node_Record);
  1876.       for Node_Record'Size use 8*32;
  1877.  
  1878.       --  The following defines the extendible array used for the nodes table
  1879.       --  Nodes with extensions use two consecutive entries in the array
  1880.  
  1881.       package Nodes is new Table (
  1882.         Table_Component_Type => Node_Record,
  1883.         Table_Index_Type     => Node_Id,
  1884.         Table_Low_Bound      => First_Node_Id,
  1885.         Table_Initial        => Alloc_Nodes_Initial,
  1886.         Table_Increment      => Alloc_Nodes_Increment,
  1887.         Table_Name           => "Nodes");
  1888.  
  1889.    end Atree_Private_Part;
  1890.  
  1891. end Atree;
  1892.