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 / sem_ch3.adb < prev    next >
Text File  |  1996-09-28  |  243KB  |  6,981 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                              S E M _ C H 3                               --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.674 $                            --
  10. --                                                                          --
  11. --        Copyright (c) 1992,1993,1994,1995 NYU, All Rights Reserved        --
  12. --                                                                          --
  13. -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  14. -- terms of the  GNU General Public License as published  by the Free Soft- --
  15. -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
  16. -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  17. -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  18. -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  19. -- for  more details.  You should have  received  a copy of the GNU General --
  20. -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
  21. -- to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. --
  22. --                                                                          --
  23. ------------------------------------------------------------------------------
  24.  
  25. with Atree;    use Atree;
  26. with Checks;   use Checks;
  27. with Elists;   use Elists;
  28. with Einfo;    use Einfo;
  29. with Errout;   use Errout;
  30. with Expander; use Expander;
  31. with Exp_Ch3;  use Exp_Ch3;
  32. with Exp_Dist; use Exp_Dist;
  33. with Exp_Util; use Exp_Util;
  34. with Features; use Features;
  35. with Freeze;   use Freeze;
  36. with Itypes;   use Itypes;
  37. with Namet;    use Namet;
  38. with Nlists;   use Nlists;
  39. with Nmake;    use Nmake;
  40. with Opt;      use Opt;
  41. with Output;   use Output;
  42. with Rtsfind;  use Rtsfind;
  43. with Sem;      use Sem;
  44. with Sem_Ch5;  use Sem_Ch5;
  45. with Sem_Ch6;  use Sem_Ch6;
  46. with Sem_Ch7;  use Sem_Ch7;
  47. with Sem_Ch8;  use Sem_Ch8;
  48. with Sem_Ch13; use Sem_Ch13;
  49. with Sem_Dist; use Sem_Dist;
  50. with Sem_Eval; use Sem_Eval;
  51. with Sem_Res;  use Sem_Res;
  52. with Sem_Type; use Sem_Type;
  53. with Sem_Util; use Sem_Util;
  54. with Stand;    use Stand;
  55. with Sinfo;    use Sinfo;
  56. with Snames;   use Snames;
  57. with Tbuild;   use Tbuild;
  58. with Ttypes;   use Ttypes;
  59. with Uintp;    use Uintp;
  60. with Urealp;   use Urealp;
  61.  
  62. package body Sem_Ch3 is
  63.  
  64.    -----------------------
  65.    -- Local Subprograms --
  66.    -----------------------
  67.  
  68.    procedure Build_Derived_Array_Type
  69.      (N            : Node_Id;
  70.       Parent_Type  : Entity_Id;
  71.       Derived_Type : in out Entity_Id);
  72.    --  Subsidiary procedure to Build_Derived_Type. For a derived array type,
  73.    --  create an implicit base if the parent type is constrained or if the
  74.    --  subtype indication has a constraint.
  75.  
  76.    procedure Build_Derived_Enumeration_Type
  77.      (N            : Node_Id;
  78.       Parent_Type  : Entity_Id;
  79.       Derived_Type : Entity_Id);
  80.    --  Subsidiary procedure to Build_Derived_Type. For a derived enumeration
  81.    --  type, we must create a new list of literals. Types derived from
  82.    --  Character and Wide_Character are special-cased.
  83.  
  84.    procedure Build_Derived_Numeric_Type
  85.      (N            : Node_Id;
  86.       Parent_Type  : Entity_Id;
  87.       Derived_Type : Entity_Id);
  88.    --  Subsidiary procedure to Build_Derived_Type. For numeric types, create
  89.    --  an anonymous base type, and propagate constraint to subtype if needed.
  90.  
  91.    procedure Build_Derived_Record_Type
  92.      (N            : Node_Id;
  93.       Parent_Type  : Entity_Id;
  94.       Derived_Type : Entity_Id);
  95.    --  Subsidiary procedure to Build_derived_Type. For non tagged record types,
  96.    --  copy the declaration of the parent, so that the derived type has its own
  97.    --  declaration tree, discriminants, and possibly its own representation.
  98.  
  99.    procedure Build_Derived_Tagged_Type
  100.      (N            : Node_Id;
  101.       Type_Def     : Node_Id;
  102.       Parent_Type  : Entity_Id;
  103.       Derived_Type : Entity_Id);
  104.    --  Used for building Tagged Extensions, either private or not. N is the
  105.    --  type declaration node, Type_Def is the type definition node. For private
  106.    --  extensions this is the same node.
  107.  
  108.    procedure Build_Derived_Type
  109.      (N            : Node_Id;
  110.       Parent_Type  : Entity_Id;
  111.       Derived_Type : in out Entity_Id);
  112.    --  The attributes of a derived type are a copy of the attributes of
  113.    --  the parent type. In some cases, additional entities (copies of
  114.    --  components of the parent type) must also be created.
  115.  
  116.    function Build_Discriminant_Constraints
  117.      (T           : Entity_Id;
  118.       Def         : Node_Id;
  119.       Related_Nod : Node_Id)
  120.       return        Elist_Id;
  121.    --  Validate discriminant constraints, and build list of expressions in
  122.    --  order of discriminant declarations. Used for subtypes and for derived
  123.    --  types of record types.
  124.  
  125.    procedure Check_Delta_Expression (E : Node_Id);
  126.    --  Check that the expression represented by E is suitable for use as
  127.    --  a delta expression, i.e. it is of real type and is static.
  128.  
  129.    procedure Check_Digits_Expression (E : Node_Id);
  130.    --  Check that the expression represented by E is suitable for use as
  131.    --  a digits expression, i.e. it is of integer type, positive and static.
  132.  
  133.    procedure Check_Incomplete (T : Entity_Id);
  134.    --  Called to verify that an incomplete type is not used prematurely
  135.  
  136.    procedure Check_Initialization (T : Entity_Id; Exp : Node_Id);
  137.    --  Validate the initialization of an object declaration. T is the
  138.    --  required type, and Exp is the initialization expression.
  139.  
  140.    procedure Check_Or_Process_Discriminants (N : Node_Id; T : Entity_Id);
  141.    --  If T is the full declaration of an incomplete or private type, check
  142.    --  the conformance of the discriminants, otherwise process them.
  143.  
  144.    procedure Check_Real_Bound (Bound : Node_Id);
  145.    --  Check given bound for being of real type and static. If not, post an
  146.    --  appropriate message, and rewrite the bound with the real literal zero.
  147.  
  148.    procedure Conditional_Delay (New_Ent, Old_Ent : Entity_Id);
  149.    --  Sets the Has_Delayed_Freeze flag of New if the Delayed_Freeze flag
  150.    --  of Old is set and Old has no yet been Frozen (i.e. Is_Frozen is false);
  151.  
  152.    procedure Constant_Redeclaration (Id : Entity_Id; N : Node_Id);
  153.    --  Processes full declaration of deferred constant. Id is the entity for
  154.    --  the redeclaration, and N is the N_Object_Declaration node. The caller
  155.    --  has not done an Enter_Name or Set_Ekind on this entity.
  156.  
  157.    procedure Create_Constrained_Components
  158.      (Subt        : Entity_Id;
  159.       Decl_Node   : Node_Id;
  160.       Typ         : Entity_Id;
  161.       Parent_Rec  : Entity_Id;
  162.       Constraints : Elist_Id);
  163.    --  Build entity list for a constrained record type. If a component depends
  164.    --  on a discriminant, replace its subtype using the discriminant values in
  165.    --  the discriminant constraint.
  166.  
  167.    procedure Constrain_Access
  168.      (Def_Id      : in out Entity_Id;
  169.       S           : Node_Id;
  170.       Related_Nod : Node_Id);
  171.    --  Apply a list of constraints to an access type. If Def_If is emtpy,
  172.    --  it is an anonymous type created for a subtype indication. In that
  173.    --  case it is created in the procedure and attached to Related_Nod.
  174.  
  175.    procedure Constrain_Array
  176.      (Def_Id      : in out Entity_Id;
  177.       SI          : Node_Id;
  178.       Related_Nod : Node_Id;
  179.       Related_Id  : Entity_Id;
  180.       Suffix      : Character);
  181.    --  Apply a list of index constraints to an unconstrained array type. The
  182.    --  first parameter is the entity for the resulting subtype. A value of
  183.    --  Empty for Def_Id indicates that an implicit type must be created, but
  184.    --  creation is delayed (and must be done by this procedure) because other
  185.    --  subsidiary implicit types must be created first (which is why Def_Id
  186.    --  is an in/out parameter). Related_Nod gives the place where this type has
  187.    --  to be inserted in the tree. The last two arguments are used to create
  188.    --  its external name if needed.
  189.  
  190.    procedure Constrain_Concurrent
  191.      (Def_Id      : in out Entity_Id;
  192.       SI          : Node_Id;
  193.       Related_Nod : Node_Id;
  194.       Related_Id  : Entity_Id;
  195.       Suffix      : Character);
  196.    --  Apply list of discriminant constraints to an unconstrained concurrent
  197.    --  type. The first parameter is the entity for the resulting subtype. A
  198.    --  value of Empty for Def_Id indicates that an implicit type must be
  199.    --  created, but creation is delayed (and must be done by this procedure)
  200.    --  because other subsidiary implicit types must be created first (which is
  201.    --  why Def_Id is an in/out parameter).  Related_Nod gives the place where
  202.    --  this type has to be inserted in the tree. The last two arguments are
  203.    --  used to create its external name if needed.
  204.  
  205.    procedure Constrain_Decimal
  206.      (Def_Id      : Node_Id;
  207.       S           : Node_Id;
  208.       Related_Nod : Node_Id);
  209.    --  Constrain a decimal fixed point type with a digits constraint and range
  210.    --  constraint if present, and build E_Decimal_Fixed_Point_Subtype entity.
  211.  
  212.    procedure Constrain_Discriminated_Type
  213.    (Def_Id      : Entity_Id;
  214.     S           : Node_Id;
  215.     Related_Nod : Node_Id);
  216.    --  Process discriminant constraints of composite type. Verify that values
  217.    --  have been provided for all discriminants, that the original type is
  218.    --  unconstrained, and that the types of the supplied expressions match
  219.    --  the discriminant types.
  220.  
  221.    procedure Constrain_Enumeration
  222.      (Def_Id      : Node_Id;
  223.       S           : Node_Id;
  224.       Related_Nod : Node_Id);
  225.    --  Constrain an enumeration type with a range constraint. This is
  226.    --  identical to Constrain_Integer, but for the Ekind of the
  227.    --  resulting subtype.
  228.  
  229.    procedure Constrain_Float
  230.      (Def_Id      : Node_Id;
  231.       S           : Node_Id;
  232.       Related_Nod : Node_Id);
  233.    --  Constrain a floating point type with either a digits constraint
  234.    --  and/or a range constraint, building a E_Floating_Point_Subtype.
  235.  
  236.    procedure Constrain_Index
  237.      (Index        : Node_Id;
  238.       S            : Node_Id;
  239.       Related_Nod  : Node_Id;
  240.       Related_Id   : Entity_Id;
  241.       Suffix       : Character;
  242.       Suffix_Index : Nat);
  243.    --  Process an index constraint in a constrained array declaration.
  244.    --  The constraint can be a subtype name, or a range with or without
  245.    --  an explicit subtype mark. The index is the corresponding index of the
  246.    --  unconstrained array. The three last parameters are used to build the
  247.    --  name for the implicit type that is created.
  248.  
  249.    procedure Constrain_Integer
  250.      (Def_Id      : Node_Id;
  251.       S           : Node_Id;
  252.       Related_Nod : Node_Id);
  253.    --  Build subtype of a signed or modular integer type.
  254.  
  255.    procedure Constrain_Ordinary_Fixed
  256.      (Def_Id      : Node_Id;
  257.       S           : Node_Id;
  258.       Related_Nod : Node_Id);
  259.    --  Constrain an ordinary fixed point type with a range constraint, and
  260.    --  build an E_Ordinary_Fixed_Point_Subtype entity.
  261.  
  262.    procedure Copy_And_Swap (Privat, Full : Entity_Id);
  263.    --  Copy the Privat entity into the entity of its full declaration
  264.    --  then swap the 2 entities in such a manner that the former private
  265.    --  type is now seen as a full type.
  266.  
  267.    procedure Copy_Private_To_Full (Priv, Full : Entity_Id);
  268.    --  Initialize the full view declaration with the relevant fields
  269.    --  from the private view.
  270.  
  271.    procedure Decimal_Fixed_Point_Type_Declaration
  272.      (T   : Entity_Id;
  273.       Def : Node_Id);
  274.    --  Create a new decimal fixed point type, and apply the constraint to
  275.    --  obtain a subtype of this new type.
  276.  
  277.    procedure Derive_Subprograms (Parent_Type, Derived_Type : Entity_Id);
  278.    --  To complete type derivation, collect or retrieve the primitive
  279.    --  operations of the parent type, and replace the subsidiary subtypes
  280.    --  with the derived type, to build the specs of the inherited ops.
  281.  
  282.    procedure Complete_Private_Subtype
  283.      (Priv        : Entity_Id;
  284.       Full        : Entity_Id;
  285.       Full_Base   : Entity_Id;
  286.       Related_Nod : Node_Id);
  287.    --  Complete the implicit full view of a private subtype by setting
  288.    --  the appropriate semantic fields. If the full view of the parent is
  289.    --  a record type, build constrained components of subtype.
  290.  
  291.    procedure Derived_Standard_Character
  292.      (N             : Node_Id;
  293.       Parent_Type   : Entity_Id;
  294.       Derived_Type  : Entity_Id);
  295.    --  Subsidiary procedure to Build_Derived_Enumeration_Type which handles
  296.    --  derivations from types Standard.Character and Standard.Wide_Character.
  297.  
  298.    procedure Derived_Type_Declaration (T : in out Entity_Id; N : Node_Id);
  299.    --  Process derived type declaration
  300.  
  301.    procedure Discriminant_Redeclaration (T : Entity_Id; D_List : List_Id);
  302.    --  Verify conformance of discriminant part on redeclarations of types
  303.  
  304.    procedure Enumeration_Type_Declaration (T : Entity_Id; Def : Node_Id);
  305.    --  Insert each literal in symbol table, as an overloadable identifier
  306.    --  Each enumeration type is mapped into a sequence of integers, and
  307.    --  each literal is defined as a constant with integer value. If any
  308.    --  of the literals are character literals, the type is a character
  309.    --  type, which means that strings are legal aggregates for arrays of
  310.    --  components of the type.
  311.  
  312.    procedure Expand_Others_Choice
  313.      (Case_Table     : Case_Table_Type;
  314.       Others_Choice  : Node_Id;
  315.       Choice_Type    : Entity_Id);
  316.    --  In the case of a variant part of a record type that has an OTHERS
  317.    --  choice, this procedure expands the OTHERS into the actual choices
  318.    --  that it represents. This new list of choice nodes is attached to
  319.    --  the OTHERS node via the Others_Discrete_Choices field. The Case_Table
  320.    --  contains all choices that have been given explicitly in the variant.
  321.  
  322.    function Find_Type_Of_Object
  323.      (Obj_Def     : Node_Id;
  324.       Related_Nod : Node_Id)
  325.       return        Entity_Id;
  326.    --  Get type entity for object referenced by Obj_Def, attaching the
  327.    --  implicit types generated to Related_Nod
  328.  
  329.    procedure Floating_Point_Type_Declaration (T : Entity_Id; Def : Node_Id);
  330.    --  Create a new float, and apply the constraint to obtain subtype of it
  331.  
  332.    function Inherit_Components
  333.      (N            : Node_Id;
  334.       Parent_Type  : Entity_Id;
  335.       Derived_Type : Entity_Id)
  336.       return         Elist_Id;
  337.    --  Used by derived types and type extensions to copy components of Parent.
  338.    --  The returned value is an association list:
  339.    --  (old_component => new_component).
  340.  
  341.    function In_Visible_Part (Scope_Id : Entity_Id) return Boolean;
  342.    --  Determine whether a declaration occurs within the visible part of a
  343.    --  package specification. The package must be on the scope stack, and the
  344.    --  corresponding private part must not.
  345.  
  346.    function Is_Null_Range (Lo : Node_Id; Hi : Node_Id) return Boolean;
  347.    --  Predicate that determines if the expressions Lo and Hi represent a
  348.    --  "Ada null range". The nodes passed are assumed to be static.
  349.  
  350.    function Is_Valid_Constraint_Kind
  351.      (T_Kind          : Type_Kind;
  352.       Constraint_Kind : Node_Kind)
  353.       return Boolean;
  354.    --  Returns True if it is legal to apply the given kind of constraint
  355.    --  to the given kind of type (index constraint to an array type,
  356.    --  for example).
  357.  
  358.    procedure Modular_Type_Declaration (T : Entity_Id; Def : Node_Id);
  359.    --  Create new modular type. Verify that modulus is in  bounds and is
  360.    --  a power of two (implementation restriction).
  361.  
  362.    procedure New_Binary_Operator (Op_Name : Name_Id; Typ : Entity_Id);
  363.    --  Create an abbreviated declaration for an operator in order to
  364.    --  materialize minimally operators on derived types.
  365.  
  366.    procedure Ordinary_Fixed_Point_Type_Declaration
  367.      (T   : Entity_Id;
  368.       Def : Node_Id);
  369.    --  Create a new ordinary fixed point type, and apply the constraint
  370.    --  to obtain subtype of it.
  371.  
  372.    procedure Prepare_Private_Subtype_Completion
  373.      (Id          : Entity_Id;
  374.       Related_Nod : Node_Id);
  375.    --  Id is a subtype of some private type. Creates the full declaration
  376.    --  associated with Id whenever possible, i.e. when the full declaration
  377.    --  of the base type is already known. Records each subtype into
  378.    --  Private_Dependents of the base type.
  379.  
  380.    procedure Process_Full_View (N : Node_Id; Full_T, Priv_T : Entity_Id);
  381.    --  Process some semantic actions when the full view of a private type is
  382.    --  encountered and analyzed. The first action is to create the full views
  383.    --  of the dependant private subtypes. The second action is to recopy the
  384.    --  primitive operations of the private view (in the tagged case).
  385.  
  386.    procedure Process_Range_Expr_In_Decl
  387.      (R           : Node_Id;
  388.       T           : Entity_Id;
  389.       Related_Nod : Node_Id);
  390.    --  Process a range expression that appears in a declaration context. The
  391.    --  range is analyzed and resolved with the base type of the given type,
  392.    --  and an appropriate check for expressions in non-static contexts made
  393.    --  on the bounds. R is analyzed and resolved using T, so the caller should
  394.    --  if necessary link R into the tree before the call, and in particular in
  395.    --  the case of a subtype declaration, it is appropriate to set the parent
  396.    --  pointer of R so that the types get properly frozen.
  397.  
  398.    procedure Process_Real_Range_Specification (Def : Node_Id);
  399.    --  Given the type definition for a real type, this procedure processes
  400.    --  and checks the real range specification of this type definition if
  401.    --  one is present. If errors are found, error messages are posted, and
  402.    --  the Real_Range_Specification of Def is reset to Empty.
  403.  
  404.    procedure Record_Type_Definition (Def : Node_Id; T : Entity_Id);
  405.    --  Def is a record type definition node. This procedure analyzes the
  406.    --  components in this record type definition. T is the entity for
  407.    --  the enclosing type. It is provided so that its Has_Tasks flag
  408.    --  can be set if any of the component have Has_Tasks set.
  409.  
  410.    procedure Record_Type_Declaration (T : Entity_Id; N : Node_Id);
  411.    --  Process non-tagged record type declaration
  412.  
  413.    procedure Set_Scalar_Range_For_Subtype
  414.      (Def_Id      : Entity_Id;
  415.       R           : Node_Id;
  416.       Subt        : Node_Id;
  417.       Related_Nod : Node_Id);
  418.    --  This routine is used to set the scalar range field for a subtype
  419.    --  given Def_Id, the entity for the subtype, and R, the range expression
  420.    --  for the scalar range. Subt provides the parent subtype to be used
  421.    --  to analyze, resolve, and check the given range.
  422.  
  423.  
  424.    procedure Signed_Integer_Type_Declaration (T : Entity_Id; Def : Node_Id);
  425.    --  Create a new signed integer entity, and apply the constraint to obtain
  426.    --  the required first named subtype of this type.
  427.  
  428.    procedure Tagged_Record_Type_Declaration (T : Entity_Id; N : Node_Id);
  429.    --  Process tagged record type declaration. T is the typ being defined,
  430.    --  N is the declaration node.
  431.  
  432.    --------------------------
  433.    -- Analyze_Declarations --
  434.    --------------------------
  435.  
  436.    procedure Analyze_Declarations (L : List_Id) is
  437.       D           : Node_Id;
  438.       Next_Node   : Node_Id;
  439.       Freeze_From : Entity_Id := Empty;
  440.  
  441.    begin
  442.       D := First (L);
  443.       while Present (D) loop
  444.  
  445.          --  Complete analysis of declaration
  446.  
  447.          Analyze (D);
  448.          Next_Node := Next (D);
  449.  
  450.          if No (Freeze_From) then
  451.             Freeze_From := First_Entity (Current_Scope);
  452.          end if;
  453.  
  454.          --  At the end of a declarative part, freeze remaining entities
  455.          --  declared in it. The end of the visible declarations of a
  456.          --  package specification is not the end of a declarative part
  457.          --  if private declarations are present. The end of a package
  458.          --  declaration is a freezing point only if it a library package.
  459.          --  A task definition or protected type definition is not a freeze
  460.          --  point either. Finally, we do not freeze entities in generic
  461.          --  scopes, because there is no code generated for them and freeze
  462.          --  nodes will be generated for the instance.
  463.          --  The end of a package instantiation is not a freeze point, but
  464.          --  for now we make it one, because the generic body is inserted
  465.          --  (currently) immediately after. Generic instantiations will not
  466.          --  be a freeze point once delayed freezing of bodies is implemented.
  467.          --  (This is needed in any case for early instantiations ???).
  468.  
  469.          if No (Next_Node) then
  470.             if Nkind (Parent (L)) = N_Component_List
  471.               or else Nkind (Parent (L)) = N_Task_Definition
  472.               or else Nkind (Parent (L)) = N_Protected_Definition
  473.             then
  474.                null;
  475.  
  476.             elsif Ekind (Current_Scope) = E_Generic_Package then
  477.                null;
  478.  
  479.             elsif Nkind (Parent (L)) /= N_Package_Specification then
  480.                Freeze_All (Freeze_From, D);
  481.                Freeze_From := Last_Entity (Current_Scope);
  482.  
  483.             elsif Scope (Current_Scope) /= Standard_Standard
  484.               and then not Is_Child_Unit (Current_Scope)
  485.               and then No (Generic_Parent (Parent (L)))
  486.             then
  487.                null;
  488.  
  489.             elsif L /= Visible_Declarations (Parent (L))
  490.                or else No (Private_Declarations (Parent (L)))
  491.                or else Is_Empty_List (Private_Declarations (Parent (L)))
  492.             then
  493.                Freeze_All (Freeze_From, D);
  494.                Freeze_From := Last_Entity (Current_Scope);
  495.             end if;
  496.  
  497.          --  If next node is a body then freeze all types before the body.
  498.          --  An exception occurs for expander generated bodies, which can
  499.          --  be recognized by their already being analyzed. The expander
  500.          --  ensures that all types needed by these bodies have been frozen
  501.          --  but it is not necessary to freeze all types (and would be wrong
  502.          --  since it would not correspond to an RM defined freeze point).
  503.  
  504.          elsif not Analyzed (Next_Node)
  505.            and then (Nkind (Next_Node) = N_Subprogram_Body
  506.              or else Nkind (Next_Node) = N_Entry_Body
  507.              or else Nkind (Next_Node) = N_Package_Body
  508.              or else Nkind (Next_Node) = N_Protected_Body
  509.              or else Nkind (Next_Node) = N_Task_Body
  510.              or else Nkind (Next_Node) in N_Body_Stub)
  511.          then
  512.             Freeze_All (Freeze_From, D);
  513.             Freeze_From := Last_Entity (Current_Scope);
  514.          end if;
  515.  
  516.          D := Next (D);
  517.       end loop;
  518.  
  519.    end Analyze_Declarations;
  520.  
  521.    --------------------------------
  522.    -- Analyze_Default_Expression --
  523.    --------------------------------
  524.  
  525.    procedure Analyze_Default_Expression (N : Node_Id; T : Entity_Id) is
  526.    begin
  527.       In_Default_Expression := True;
  528.       Analyze (N);
  529.       Resolve (N, T);
  530.       In_Default_Expression := False;
  531.    end Analyze_Default_Expression;
  532.  
  533.    -----------------------------
  534.    --  Analyze_Implicit_Types --
  535.    -----------------------------
  536.  
  537.    --  Nothing to do, since the only descendent is the head of the list of
  538.    --  itypes, and all itype entities were analyzed when the implicit types
  539.    --  were constructed (this is the whole point of implicit types!)
  540.  
  541.    procedure Analyze_Implicit_Types (N : Node_Id) is
  542.    begin
  543.       null;
  544.    end Analyze_Implicit_Types;
  545.  
  546.    --------------------------------
  547.    -- Analyze_Object_Declaration --
  548.    --------------------------------
  549.  
  550.    procedure Analyze_Object_Declaration (N : Node_Id) is
  551.       Loc : constant Source_Ptr := Sloc (N);
  552.       Id  : constant Entity_Id  := Defining_Identifier (N);
  553.       T   : Entity_Id;
  554.  
  555.       E : Node_Id := Expression (N);
  556.       --  E is set to Expression (N) throughout this routine. When
  557.       --  Expression (N) is modified, E is changed accordingly.
  558.  
  559.    begin
  560.       if Constant_Present (N)
  561.          and then Present (Current_Entity_In_Scope (Id))
  562.       then
  563.          Constant_Redeclaration (Id, N);
  564.  
  565.       --  In the normal case, enter identifiers at the start to catch
  566.       --  premature usage in the initialization expression.
  567.  
  568.       else
  569.          Enter_Name (Id);
  570.       end if;
  571.  
  572.       --  Entities declared in Pure unit should be set Is_Pure
  573.       --  Since 'Partition_Id cannot be applied to such an entity
  574.  
  575.       Set_Is_Pure (Id, Is_Pure (Current_Scope));
  576.  
  577.       --  There are three kinds of implicit types generated by an
  578.       --  object declaration:
  579.  
  580.       --   1. those for generated by the original Object Definition
  581.  
  582.       --   2. those generated by the Expression
  583.  
  584.       --   3. those used to constrained the Object Definition with the
  585.       --       expression constraints when it is unconstrained
  586.  
  587.       --  They must be generated in this order to avoid order of elaboration
  588.       --  issues
  589.  
  590.       T := Find_Type_Of_Object (Object_Definition (N), N);
  591.  
  592.       --  If deferred constant, make sure context is appropriate
  593.  
  594.       if Constant_Present (N) and then No (E) then
  595.          if (Ekind (Current_Scope) /= E_Package
  596.               and then Ekind (Current_Scope) /= E_Generic_Package)
  597.            or else In_Private_Part (Current_Scope)
  598.          then
  599.             Error_Msg_N
  600.               ("invalid context for deferred constant declaration", N);
  601.             Set_Constant_Present (N, False);
  602.  
  603.          --  In Ada 83, deferred constant must be of private type
  604.  
  605.          elsif not Is_Private_Type (T) then
  606.             Note_Feature (Deferred_Constants_Of_Any_Type, Sloc (N));
  607.  
  608.             if Ada_83 and then Comes_From_Source (N) then
  609.                Error_Msg_N
  610.                  ("(Ada 83) deferred constant must be private type", N);
  611.             end if;
  612.          end if;
  613.  
  614.       --  If not a deferred constant, then object declaration freezes its type
  615.  
  616.       else
  617.          Check_Fully_Declared (T, N);
  618.          Freeze_Before (N, T);
  619.       end if;
  620.  
  621.       --  Process initialization expression if present
  622.  
  623.       if Present (E) then
  624.          Analyze (E);
  625.          Check_Initialization (T, E);
  626.          Resolve (E, T);
  627.          Apply_Range_Check (E, Etype (E), T);
  628.          Apply_Static_Length_Check (E, Etype (E), T);
  629.  
  630.          --  ??? Next block can be removed as soon as the new mechanism
  631.          --  to get rid of expression actions are in place.
  632.  
  633.          Get_Rid_Of_Expression_Actions : declare
  634.             Expr : Node_Id := Expression (N);
  635.  
  636.          begin
  637.             if Nkind (Expr) = N_Expression_Actions then
  638.                Insert_List_Before (N, Actions (Expr));
  639.             end if;
  640.  
  641.             if Nkind (Expr) in N_Has_Itypes
  642.               and then Present (First_Itype (Expr))
  643.             then
  644.                declare
  645.                   Inode : Node_Id := Make_Implicit_Types (Loc);
  646.  
  647.                begin
  648.                   Transfer_Itypes (From => Expr, To => Inode);
  649.                   Insert_Before (N, Inode);
  650.                end;
  651.             end if;
  652.  
  653.             if Nkind (Expr) = N_Expression_Actions then
  654.                Set_Expression (N, Expression (Expr));
  655.                E := Expression (N);
  656.             end if;
  657.          end Get_Rid_Of_Expression_Actions;
  658.  
  659.          --  Have to wait until after actions so the itype is there.
  660.  
  661.          if Is_Array_Type (T) and then Is_Constrained (T) then
  662.             Apply_Length_Check (E, T);
  663.          end if;
  664.  
  665.       end if;
  666.  
  667.       --  Abstract type is never permitted for a variable or constant
  668.  
  669.       if Is_Abstract (T) then
  670.          Error_Msg_N ("type of object cannot be abstract",
  671.            Object_Definition (N));
  672.  
  673.       --  Case of unconstrained type
  674.  
  675.       elsif Is_Indefinite_Subtype (T) then
  676.  
  677.          Set_Has_U_Nominal_Subtype (Id);
  678.  
  679.          --  Nothing to do in deferred constant case
  680.  
  681.          if Constant_Present (N) and then No (E) then
  682.             null;
  683.  
  684.          --  Otherwise must have an initialization
  685.  
  686.          elsif No (E) then
  687.             if not Constant_Present (N) then
  688.                Note_Feature (Unconstrained_Variables,
  689.                  Sloc (Object_Definition (N)));
  690.  
  691.                if Ada_83
  692.                  and then Comes_From_Source (Object_Definition (N))
  693.                then
  694.                   Error_Msg_N
  695.                     ("(Ada 83) unconstrained variable not allowed",
  696.                     Object_Definition (N));
  697.                end if;
  698.             end if;
  699.  
  700.             if Is_Class_Wide_Type (T) then
  701.                Error_Msg_N
  702.                  ("initialization required in class-wide declaration ", N);
  703.             else
  704.                Error_Msg_N
  705.                  ("unconstrained subtype not allowed (need initialization)",
  706.                   Object_Definition (N));
  707.             end if;
  708.  
  709.          elsif Has_Unknown_Discriminants (T) then
  710.             Unimplemented (N, "Objects of type with unknown discriminants");
  711.  
  712.          --  All OK, constrain the type with the expression size
  713.  
  714.          else
  715.             Expand_Subtype_From_Expr (N, T, Object_Definition (N), E);
  716.             T := Find_Type_Of_Object (Object_Definition (N), N);
  717.             Freeze_Before (N, T);
  718.          end if;
  719.       end if;
  720.  
  721.       --  Now establish the proper kind and type of the object.
  722.  
  723.       if Constant_Present (N) then
  724.          Set_Ekind (Id, E_Constant);
  725.  
  726.       else
  727.          Set_Ekind (Id, E_Variable);
  728.       end if;
  729.  
  730.       Set_Etype      (Id, T);
  731.       Set_Is_Aliased (Id, Aliased_Present (N));
  732.  
  733.       Validate_Object_Declaration (N, Id, E, Object_Definition (N), T);
  734.  
  735.    end Analyze_Object_Declaration;
  736.  
  737.    ----------------------
  738.    -- Check_Real_Bound --
  739.    ----------------------
  740.  
  741.    procedure Check_Real_Bound (Bound : Node_Id) is
  742.    begin
  743.       if not Is_Real_Type (Etype (Bound)) then
  744.          Error_Msg_N
  745.            ("bound in real type definition must be of real type", Bound);
  746.  
  747.       elsif not Is_OK_Static_Expression (Bound) then
  748.          Error_Msg_N
  749.            ("non-static expression used for real type bound", Bound);
  750.  
  751.       else
  752.          return;
  753.       end if;
  754.  
  755.       Rewrite_Substitute_Tree
  756.         (Bound, Make_Real_Literal (Sloc (Bound), Ureal_0));
  757.       Analyze (Bound);
  758.       Resolve (Bound, Standard_Float);
  759.    end Check_Real_Bound;
  760.  
  761.    -----------------------
  762.    -- Conditional_Delay --
  763.    -----------------------
  764.  
  765.    procedure Conditional_Delay (New_Ent, Old_Ent : Entity_Id) is
  766.    begin
  767.       if Has_Delayed_Freeze (Old_Ent) and then not Is_Frozen (Old_Ent) then
  768.          Set_Has_Delayed_Freeze (New_Ent);
  769.       end if;
  770.    end Conditional_Delay;
  771.  
  772.    ----------------------------
  773.    -- Constant_Redeclaration --
  774.    ----------------------------
  775.  
  776.    procedure Constant_Redeclaration (Id : Entity_Id; N : Node_Id) is
  777.       E    : constant Node_Id   := Expression (N);
  778.       Prev : constant Entity_Id := Current_Entity_In_Scope (Id);
  779.       T    : Entity_Id;
  780.  
  781.    begin
  782.       T := Find_Type_Of_Object (Object_Definition (N), N);
  783.       Freeze_Before (N, T);
  784.  
  785.       --  Case of a constant with a previous declaration that was either not
  786.       --  a constant, or was a full constant declaration. In either case, it
  787.       --  seems best to let Enter_Name treat it as an illegal duplicate decl.
  788.  
  789.       if Ekind (Prev) /= E_Constant
  790.         or else Present (Expression (Parent (Prev)))
  791.       then
  792.          Enter_Name (Id);
  793.  
  794.       --  Case of full declaration of constant has wrong type
  795.  
  796.       elsif Base_Type (Etype (Prev)) /= Base_Type (T) then
  797.          Error_Msg_Sloc := Sloc (Prev);
  798.          Error_Msg_N ("type does not match declaration#", N);
  799.          Set_Full_View (Prev, Id);
  800.          Set_Etype (Id, Any_Type);
  801.  
  802.       --  Otherwise process the full constant declaration
  803.  
  804.       else
  805.          Set_Full_View (Prev, Id);
  806.          Set_Is_Public (Id, Is_Public (Prev));
  807.          Set_Is_Internal (Id);
  808.          Append_Entity (Id, Current_Scope);
  809.  
  810.          if Is_Frozen (Prev) then
  811.             Error_Msg_N ("full constant declaration appears too late", N);
  812.          end if;
  813.  
  814.          --  Check ALIASED present if present before (RM 7.4(7))
  815.  
  816.          if Is_Aliased (Prev)
  817.            and then not Aliased_Present (N)
  818.          then
  819.             Error_Msg_Sloc := Sloc (Prev);
  820.             Error_Msg_N ("ALIASED required (see declaration#)", N);
  821.          end if;
  822.  
  823.          if Present (E) and then No (Etype (E)) then
  824.             --  How can E be not present here ???
  825.  
  826.             Analyze (E);
  827.             Check_Initialization (T, E);
  828.             Resolve (E, T);
  829.  
  830.             if Is_Indefinite_Subtype (T) then
  831.                Expand_Subtype_From_Expr (N, T, Object_Definition (N), E);
  832.                T := Find_Type_Of_Object (Object_Definition (N), N);
  833.                Set_Etype (Id, T);
  834.                Freeze_Before (N, T);
  835.             end if;
  836.          end if;
  837.       end if;
  838.    end Constant_Redeclaration;
  839.  
  840.    --------------------------------
  841.    -- Analyze_Number_Declaration --
  842.    --------------------------------
  843.  
  844.    procedure Analyze_Number_Declaration (N : Node_Id) is
  845.       Id    : constant Entity_Id := Defining_Identifier (N);
  846.       E     : constant Node_Id   := Expression (N);
  847.       T     : Entity_Id;
  848.       Index : Interp_Index;
  849.       It    : Interp;
  850.  
  851.    begin
  852.       --  Entities declared in Pure unit should be set Is_Pure
  853.       --  Since 'Partition_Id cannot be applied to such an entity
  854.  
  855.       Set_Is_Pure (Id, Is_Pure (Current_Scope));
  856.  
  857.       Analyze (E);
  858.  
  859.       --  Verify that the expression is static and numeric. If
  860.       --  the expression is overloaded, we apply the preference
  861.       --  rule that favors root numeric types.
  862.  
  863.       if not Is_Overloaded (E) then
  864.          T := Etype (E);
  865.  
  866.       else
  867.          T := Any_Type;
  868.          Get_First_Interp (E, Index, It);
  869.  
  870.          while Present (It.Typ) loop
  871.             if (Is_Integer_Type (It.Typ)
  872.                  or else Is_Real_Type (It.Typ))
  873.               and then (Scope (Base_Type (It.Typ))) = Standard_Standard
  874.             then
  875.                if T = Any_Type then
  876.                   T := It.Typ;
  877.  
  878.                elsif It.Typ = Universal_Real
  879.                  or else It.Typ = Universal_Integer
  880.                then
  881.                   --  Choose universal interpretation over any other.
  882.  
  883.                   T := It.Typ;
  884.                   exit;
  885.                end if;
  886.             end if;
  887.  
  888.             Get_Next_Interp (Index, It);
  889.          end loop;
  890.       end if;
  891.  
  892.       Enter_Name (Id);
  893.  
  894.       if Is_Integer_Type (T)  then
  895.          Resolve (E, T);
  896.          Set_Etype (Id, Universal_Integer);
  897.          Set_Ekind (Id, E_Named_Integer);
  898.  
  899.       elsif Is_Real_Type (T) then
  900.          Resolve (E, T);
  901.          Set_Etype (Id, Universal_Real);
  902.          Set_Ekind (Id, E_Named_Real);
  903.  
  904.       else
  905.          Wrong_Type (E, Any_Numeric);
  906.          Set_Etype (Id, Any_Type);
  907.          Set_Ekind (Id, E_Constant);
  908.       end if;
  909.  
  910.       if Nkind (E) = N_Integer_Literal
  911.         or else Nkind (E) = N_Real_Literal
  912.       then
  913.          Set_Etype (E, Etype (Id));
  914.       end if;
  915.  
  916.       if not Is_OK_Static_Expression (E) then
  917.          Error_Msg_N ("non-static expression used in number declaration", E);
  918.          Replace_Substitute_Tree (N, Make_Integer_Literal (Sloc (N), Uint_0));
  919.          Set_Etype (N, Any_Type);
  920.       end if;
  921.  
  922.    end Analyze_Number_Declaration;
  923.  
  924.    -------------------------
  925.    -- Find_Type_Of_Object --
  926.    -------------------------
  927.  
  928.    function Find_Type_Of_Object
  929.      (Obj_Def     : Node_Id;
  930.       Related_Nod : Node_Id)
  931.       return        Entity_Id
  932.    is
  933.       Def_Kind : constant Node_Kind := Nkind (Obj_Def);
  934.       P        : constant Node_Id   := Parent (Obj_Def);
  935.       Obj      : constant Entity_Id := Defining_Identifier (P);
  936.       T        : Entity_Id;
  937.  
  938.    begin
  939.       --  Case of an anonymous array subtype
  940.  
  941.       if Def_Kind = N_Constrained_Array_Definition
  942.         or else Def_Kind = N_Unconstrained_Array_Definition
  943.       then
  944.  
  945.          T := Empty;
  946.          Array_Type_Declaration (T, Obj_Def);
  947.  
  948.       --  create an explicit subtype whenever possible
  949.  
  950.       elsif Nkind (P) /=  N_Component_Declaration
  951.         and then Def_Kind = N_Subtype_Indication
  952.       then
  953.          T := Make_Defining_Identifier (Sloc (P),
  954.                 New_External_Name (Chars (Obj), 'S'));
  955.  
  956.          Insert_Action (Obj_Def,
  957.            Make_Subtype_Declaration (Sloc (P),
  958.              Defining_Identifier => T,
  959.              Subtype_Indication  => Relocate_Node (Obj_Def)));
  960.  
  961.       else
  962.          T := Process_Subtype (Obj_Def, Related_Nod, Obj, 'S');
  963.       end if;
  964.  
  965.       return T;
  966.    end Find_Type_Of_Object;
  967.  
  968.    --------------------------------
  969.    -- Analyze_Subtype_Indication --
  970.    --------------------------------
  971.  
  972.    procedure Analyze_Subtype_Indication (N : Node_Id) is
  973.       T : constant Node_Id := Subtype_Mark (N);
  974.       R : constant Node_Id := Range_Expression (Constraint (N));
  975.  
  976.    begin
  977.       Analyze (T);
  978.       Analyze (R);
  979.       Set_Etype (N, Etype (R));
  980.    end Analyze_Subtype_Indication;
  981.  
  982.    ----------------------------
  983.    -- Check_Delta_Expression --
  984.    ----------------------------
  985.  
  986.    procedure Check_Delta_Expression (E : Node_Id) is
  987.    begin
  988.       if not (Is_Real_Type (Etype (E))) then
  989.          Wrong_Type (E, Any_Real);
  990.  
  991.       elsif not Is_OK_Static_Expression (E) then
  992.          Error_Msg_N ("non-static expression used for delta value", E);
  993.  
  994.       elsif not UR_Is_Positive (Expr_Value_R (E)) then
  995.          Error_Msg_N ("delta expression must be positive", E);
  996.  
  997.       else
  998.          return;
  999.       end if;
  1000.  
  1001.       --  If any of above errors occurred, then replace the incorrect
  1002.       --  expression by the real 0.1, which should prevent further errors.
  1003.  
  1004.       Replace_Substitute_Tree (E,
  1005.         Make_Real_Literal (Sloc (E), Ureal_Tenth));
  1006.       Analyze (E);
  1007.       Resolve (E, Standard_Float);
  1008.  
  1009.    end Check_Delta_Expression;
  1010.  
  1011.    -----------------------------
  1012.    -- Check_Digits_Expression --
  1013.    -----------------------------
  1014.  
  1015.    procedure Check_Digits_Expression (E : Node_Id) is
  1016.    begin
  1017.       if not (Is_Integer_Type (Etype (E))) then
  1018.          Wrong_Type (E, Any_Integer);
  1019.  
  1020.       elsif not Is_OK_Static_Expression (E) then
  1021.          Error_Msg_N ("non-static expression used for digits value", E);
  1022.  
  1023.       elsif Expr_Value (E) <= 0 then
  1024.          Error_Msg_N ("digits value must be greater than zero", E);
  1025.  
  1026.       else
  1027.          return;
  1028.       end if;
  1029.  
  1030.       --  If any of above errors occurred, then replace the incorrect
  1031.       --  expression by the integer 1, which should prevent further errors.
  1032.  
  1033.       Replace_Substitute_Tree (E, Make_Integer_Literal (Sloc (E), Uint_1));
  1034.       Analyze (E);
  1035.       Resolve (E, Standard_Integer);
  1036.  
  1037.    end Check_Digits_Expression;
  1038.  
  1039.    --------------------------
  1040.    -- Check_Initialization --
  1041.    --------------------------
  1042.  
  1043.    procedure Check_Initialization (T : Entity_Id; Exp : Node_Id) is
  1044.    begin
  1045.       if Is_Limited_Type (T) then
  1046.          Error_Msg_N
  1047.            ("cannot initialize entities of limited type", Exp);
  1048.       end if;
  1049.    end Check_Initialization;
  1050.  
  1051.    ------------------------------
  1052.    -- Analyze_Type_Declaration --
  1053.    ------------------------------
  1054.  
  1055.    procedure Analyze_Type_Declaration (N : Node_Id) is
  1056.       Def    : constant Node_Id   := Type_Definition (N);
  1057.       Def_Id : constant Entity_Id := Defining_Identifier (N);
  1058.       T      : Entity_Id;
  1059.  
  1060.    begin
  1061.  
  1062.       --  If the unit is RCI or remote types then this is a remote
  1063.       --  access to subprogram type declaration. We need some special
  1064.       --  processing for such a declaration, including declaring
  1065.       --  Def_Id as a record (fat pointer) type with a link to the
  1066.       --  original declaration.
  1067.  
  1068.       case Nkind (Def) is
  1069.  
  1070.          when N_Access_To_Subprogram_Definition =>
  1071.             if Inside_Remote_Call_Interface_Unit
  1072.               or else Inside_Remote_Types_Unit
  1073.             then
  1074.                Process_Remote_AST_Declaration (N);
  1075.             end if;
  1076.  
  1077.          when others =>
  1078.             null;
  1079.  
  1080.       end case;
  1081.  
  1082.       T := Find_Type_Name (N);
  1083.  
  1084.       --  Entities declared in Pure unit should be set Is_Pure
  1085.       --  Since 'Partition_Id cannot be applied to such an entity
  1086.  
  1087.       Set_Is_Pure (T, Is_Pure (Current_Scope));
  1088.  
  1089.       --  Only composite types other than array types are allowed to have
  1090.       --  discriminants.
  1091.  
  1092.       case Nkind (Def) is
  1093.  
  1094.          --  For derived types, the rule will be checked once we've figured
  1095.          --  out the parent type.
  1096.  
  1097.          when N_Derived_Type_Definition =>
  1098.             null;
  1099.  
  1100.          --  For record types, discriminants are allowed.
  1101.  
  1102.          when N_Record_Definition =>
  1103.             null;
  1104.  
  1105.          when others =>
  1106.             if Present (Discriminant_Specifications (N)) then
  1107.                Error_Msg_N
  1108.                  ("elementary or array type cannot have discriminants",
  1109.                   Defining_Identifier
  1110.                   (First (Discriminant_Specifications (N))));
  1111.             end if;
  1112.  
  1113.       end case;
  1114.  
  1115.       --  Elaborate the type definition according to kind, and generate
  1116.       --  susbsidiary (implicit) subtypes where needed.
  1117.  
  1118.       case Nkind (Def) is
  1119.  
  1120.          when N_Access_To_Subprogram_Definition =>
  1121.             Access_Subprogram_Declaration (T, Def);
  1122.  
  1123.             --  Validate categorization rule against access type declaration
  1124.             --  usually a violation in Pure unit, Shared_Passive unit.
  1125.  
  1126.             Validate_Access_Type_Declaration (T, N);
  1127.  
  1128.          when N_Access_To_Object_Definition =>
  1129.             Access_Type_Declaration (T, Def);
  1130.  
  1131.             --  Validate categorization rule against access type declaration
  1132.             --  usually a violation in Pure unit, Shared_Passive unit.
  1133.  
  1134.             Validate_Access_Type_Declaration (T, N);
  1135.  
  1136.             --  If we are compiling calling stubs, we add read/write
  1137.             --  representation clause for each access to class wide limited
  1138.             --  private type (abstract this out to Sem_Attr???)
  1139.  
  1140.             if (Stub_Mode = Compile_Caller_Stub_Spec or
  1141.                 Stub_Mode = Compile_Receiver_Stub_Spec)
  1142.               and then Is_ACWLP_Type (Def_Id)
  1143.             then
  1144.                Add_Racw_RW (N);
  1145.             end if;
  1146.  
  1147.          when N_Array_Type_Definition =>
  1148.             Array_Type_Declaration (T, Def);
  1149.  
  1150.          when N_Derived_Type_Definition =>
  1151.             Derived_Type_Declaration (T, N);
  1152.  
  1153.          when N_Enumeration_Type_Definition =>
  1154.             Enumeration_Type_Declaration (T, Def);
  1155.  
  1156.          when N_Floating_Point_Definition =>
  1157.             Floating_Point_Type_Declaration (T, Def);
  1158.  
  1159.          when N_Decimal_Fixed_Point_Definition =>
  1160.             Decimal_Fixed_Point_Type_Declaration (T, Def);
  1161.  
  1162.          when N_Ordinary_Fixed_Point_Definition =>
  1163.             Ordinary_Fixed_Point_Type_Declaration (T, Def);
  1164.  
  1165.          when N_Signed_Integer_Type_Definition =>
  1166.             Signed_Integer_Type_Declaration (T, Def);
  1167.  
  1168.          when N_Modular_Type_Definition =>
  1169.             Modular_Type_Declaration (T, Def);
  1170.  
  1171.          when N_Record_Definition =>
  1172.             if Tagged_Present (Def) then
  1173.                Tagged_Record_Type_Declaration (T, N);
  1174.             else
  1175.                Record_Type_Declaration (T, N);
  1176.             end if;
  1177.  
  1178.          when others =>
  1179.             pragma Assert (False); null;
  1180.  
  1181.       end case;
  1182.  
  1183.       --  Some common processing for all types
  1184.  
  1185.       Set_Depends_On_Private (T, Has_Private_Component (T));
  1186.       Set_Is_First_Subtype   (T, True);
  1187.  
  1188.       --  Both the declared entity, and its anonymous base type if one
  1189.       --  was created, need freeze nodes allocating.
  1190.  
  1191.       declare
  1192.          B : constant Entity_Id := Base_Type (T);
  1193.  
  1194.       begin
  1195.          --  In the case where the base type is different from the first
  1196.          --  subtype, we pre-allocate a freeze node, and set the proper
  1197.          --  link to the first subtype. Freeze_Entity will use this
  1198.          --  preallocated freeze node when it freezes the entity.
  1199.  
  1200.          if B /= T then
  1201.  
  1202.             --  Don't allocate freeze node if already allocated
  1203.  
  1204.             if No (Freeze_Node (B)) then
  1205.                Set_Has_Delayed_Freeze (B);
  1206.                Set_Freeze_Node (B, Make_Freeze_Entity (No_Location));
  1207.                Set_TSS_Elist (Freeze_Node (B), No_Elist);
  1208.             end if;
  1209.  
  1210.             Set_First_Subtype_Link (Freeze_Node (B), T);
  1211.          end if;
  1212.  
  1213.          Set_Has_Delayed_Freeze (T);
  1214.       end;
  1215.  
  1216.       --  Case of T is the full declaration of some private type which has
  1217.       --  been swapped in Defining_Identifier (N).
  1218.  
  1219.       if T /= Def_Id and then Is_Private_Type (Def_Id) then
  1220.          Process_Full_View (N, T, Def_Id);
  1221.       end if;
  1222.    end Analyze_Type_Declaration;
  1223.  
  1224.    -----------------------
  1225.    -- Process_Full_View --
  1226.    -----------------------
  1227.  
  1228.    procedure Process_Full_View (N : Node_Id; Full_T, Priv_T : Entity_Id) is
  1229.  
  1230.    begin
  1231.  
  1232.       --  First some sanity checks that must be done after semantic
  1233.       --  decoration of the full view and thus cannot be placed with other
  1234.       --  similar checks in Find_Type_Name
  1235.  
  1236.       if not Is_Limited_Type (Priv_T) and then Is_Limited_Type (Full_T) then
  1237.          Error_Msg_N ("Completion of a non limited type cannot be limited",
  1238.            Full_T);
  1239.  
  1240.       elsif Is_Tagged_Type (Priv_T)
  1241.         and then Is_Limited_Type (Priv_T)
  1242.         and then not Is_Limited_Type (Full_T)
  1243.       then
  1244.          --  GNAT allow its own definition of Limited_Controlled to disobey
  1245.          --  this rule in order in ease the implementation. The next test is
  1246.          --  safe because Root_Controlled is defined in a private system child
  1247.  
  1248.          if Etype (Full_T) = Full_View (RTE (RE_Root_Controlled)) then
  1249.             null;
  1250.          else
  1251.             Error_Msg_N (
  1252.               "Completion of a limited tagged type must be limited", Full_T);
  1253.          end if;
  1254.       end if;
  1255.  
  1256.       --  Create a full declaration for all its subtypes recorded in
  1257.       --  Private_Dependents and swap them similarly to the base type.
  1258.       --  These are subtypes that have been define before the full
  1259.       --  declaration of the private type. We also swap the entry in
  1260.       --  Private_Dependents list so we can properly restore the
  1261.       --  private view on exit from the scope.
  1262.  
  1263.       declare
  1264.          Priv_Elmt : Elmt_Id;
  1265.          Priv      : Entity_Id;
  1266.          Full      : Entity_Id;
  1267.  
  1268.       begin
  1269.          Priv_Elmt := First_Elmt (Private_Dependents (Priv_T));
  1270.          while Present (Priv_Elmt) loop
  1271.             Priv := Node (Priv_Elmt);
  1272.  
  1273.             if Ekind (Priv) = E_Private_Subtype
  1274.               or else Ekind (Priv) = E_Limited_Private_Subtype
  1275.             then
  1276.                Full := Make_Defining_Identifier (Sloc (Priv), Chars (Priv));
  1277.                Attach_Itype_To (N, Full);
  1278.                Copy_And_Swap (Priv, Full);
  1279.                Complete_Private_Subtype (Full, Priv, Full_T, N);
  1280.                Replace_Elmt (Priv_Elmt, Full);
  1281.             end if;
  1282.  
  1283.             Priv_Elmt := Next_Elmt (Priv_Elmt);
  1284.          end loop;
  1285.       end;
  1286.  
  1287.       --  If the private view was tagged, copy the new Primitive
  1288.       --  operations from the private view to the full view.
  1289.  
  1290.       if Is_Tagged_Type (Full_T) then
  1291.          declare
  1292.             Priv_List : Elist_Id;
  1293.             Full_List : constant Elist_Id := Primitive_Operations (Full_T);
  1294.             P1, P2    : Elmt_Id;
  1295.             Prim      : Entity_Id;
  1296.  
  1297.          begin
  1298.             if Is_Tagged_Type (Priv_T) then
  1299.                Priv_List := Primitive_Operations (Priv_T);
  1300.  
  1301.                P1 := First_Elmt (Priv_List);
  1302.                while Present (P1) loop
  1303.                   Prim := Node (P1);
  1304.  
  1305.                   if No (Alias (Prim)) then
  1306.                      P2 := First_Elmt (Full_List);
  1307.                      while Present (P2) and then Node (P2) /= Prim loop
  1308.                         P2 := Next_Elmt (P2);
  1309.                      end loop;
  1310.  
  1311.                      --  If not found, that is a new one
  1312.  
  1313.                      if No (P2) then
  1314.                         Append_Elmt (Prim, Full_List);
  1315.                      end if;
  1316.                   end if;
  1317.  
  1318.                   P1 := Next_Elmt (P1);
  1319.                end loop;
  1320.  
  1321.             else
  1322.                --  In this case the partial view is non tagged, just check
  1323.                --  if "=" is not already defined in order to avoid to generate
  1324.                --  a default one
  1325.  
  1326.                Prim := Next_Entity (Full_T);
  1327.                while Present (Prim) loop
  1328.                   if Chars (Prim) = Name_Op_Eq
  1329.                     and then Etype (Prim) = Standard_Boolean
  1330.                     and then Etype (First_Formal (Prim)) = Full_T
  1331.                     and then Etype (Next_Formal (First_Formal (Prim))) = Full_T
  1332.                   then
  1333.                      Append_Elmt (Prim, Full_List);
  1334.                      exit;
  1335.                   end if;
  1336.  
  1337.                   Prim := Next_Entity (Prim);
  1338.                end loop;
  1339.             end if;
  1340.  
  1341.             --  Now the 2 views can share the same Primitive Operation list
  1342.  
  1343.             if Is_Tagged_Type (Priv_T) then
  1344.                Set_Primitive_Operations (Priv_T, Full_List);
  1345.             end if;
  1346.  
  1347.             --  Both views must share the same Class Wide type
  1348.  
  1349.             Set_Class_Wide_Type (Full_T, Class_Wide_Type (Priv_T));
  1350.          end;
  1351.       end if;
  1352.    end Process_Full_View;
  1353.  
  1354.    -------------------
  1355.    -- Copy_And_Swap --
  1356.    -------------------
  1357.  
  1358.    procedure Copy_And_Swap (Privat, Full : Entity_Id) is
  1359.       Loc : constant Source_Ptr := Sloc (Full);
  1360.  
  1361.    begin
  1362.       --  Initialize new full declaration entity by copying the pertinent
  1363.       --  fields of the corresponding private declaration entity.
  1364.  
  1365.       Copy_Private_To_Full (Privat, Full);
  1366.       Set_Sloc (Full, Loc);
  1367.  
  1368.       --  Swap the two entities. Now Privat is the full type entity and
  1369.       --  Full is the private one. They will be swapped back at the end
  1370.       --  of the private part. This swapping ensures that the entity that
  1371.       --  is visible in the private part is the full declaration.
  1372.  
  1373.       Exchange_Entities (Privat, Full);
  1374.       Set_Full_View (Full, Privat);
  1375.       Append_Entity (Full, Current_Scope);
  1376.    end Copy_And_Swap;
  1377.  
  1378.    ---------------------------
  1379.    --  Copy_Private_To_Full --
  1380.    ---------------------------
  1381.  
  1382.    procedure Copy_Private_To_Full (Priv, Full : Entity_Id) is
  1383.    begin
  1384.       Set_Ekind           (Full, Ekind (Priv)); --  for now, need a type!???
  1385.       Set_Etype           (Full, Any_Type);
  1386.       Set_Has_Discriminants
  1387.                           (Full, Has_Discriminants (Priv));
  1388.  
  1389.       if Has_Discriminants (Full) then
  1390.          Set_Discriminant_Constraint
  1391.                           (Full, Discriminant_Constraint (Priv));
  1392.       end if;
  1393.  
  1394.       Set_Class_Wide_Type (Full, Class_Wide_Type (Priv));
  1395.       Set_Homonym         (Full, Homonym (Priv));
  1396.       Set_Is_Abstract     (Full, Is_Abstract (Priv));
  1397.       Set_Is_Controlled   (Full, Is_Controlled (Priv));
  1398.       Set_Is_Immediately_Visible
  1399.                           (Full, Is_Immediately_Visible (Priv));
  1400.       Set_Is_Public       (Full, Is_Public (Priv));
  1401.       Set_Is_Pure         (Full, Is_Pure (Priv));
  1402.       Set_Is_Tagged_Type  (Full, Is_Tagged_Type (Priv));
  1403.  
  1404.       Conditional_Delay   (Full, Priv);
  1405.  
  1406.       if Is_Tagged_Type (Full) then
  1407.          Set_Primitive_Operations
  1408.                           (Full, Primitive_Operations (Priv));
  1409.       end if;
  1410.  
  1411.       Set_Is_Volatile     (Full, Is_Volatile (Priv));
  1412.       Set_Scope           (Full, Scope (Priv));
  1413.       Set_Next_Entity     (Full, Next_Entity (Priv));
  1414.       Set_First_Entity    (Full, First_Entity (Priv));
  1415.       Set_Last_Entity     (Full, Last_Entity (Priv));
  1416.    end Copy_Private_To_Full;
  1417.  
  1418.    --------------------
  1419.    -- Find_Type_Name --
  1420.    --------------------
  1421.  
  1422.    function Find_Type_Name (N : Node_Id) return Entity_Id is
  1423.       Id       : constant Entity_Id := Defining_Identifier (N);
  1424.       Prev     : Entity_Id;
  1425.       New_Id   : Entity_Id;
  1426.       Prev_Par : Node_Id;
  1427.  
  1428.    begin
  1429.       --  Find incomplete declaration, if some was given.
  1430.  
  1431.       Prev := Current_Entity_In_Scope (Id);
  1432.  
  1433.       if Present (Prev) then
  1434.  
  1435.          --  Previous declaration exists. Error if not incomplete/private case
  1436.  
  1437.          Prev_Par := Parent (Prev);
  1438.  
  1439.          if not Is_Incomplete_Or_Private_Type (Prev) then
  1440.             Error_Msg_NE ("invalid redeclaration of }", Id, Prev);
  1441.             New_Id := Id;
  1442.  
  1443.          elsif Nkind (N) /= N_Full_Type_Declaration
  1444.            and then Nkind (N) /= N_Task_Type_Declaration
  1445.            and then Nkind (N) /= N_Protected_Type_Declaration
  1446.          then
  1447.             --  Completion must be a full type declarations (RM 7.3(4))
  1448.  
  1449.             Error_Msg_Sloc := Sloc (Prev);
  1450.             Error_Msg_NE ("invalid completion of }", Id, Prev);
  1451.             New_Id := Id;
  1452.  
  1453.          --  Case of full declaration of incomplete type
  1454.  
  1455.          elsif Ekind (Prev) = E_Incomplete_Type then
  1456.  
  1457.             --  Indicate that the incomplete declaration has a matching
  1458.             --  full declaration. The defining occurrence of the incomplete
  1459.             --  declaration remains the visible one, and the procedure
  1460.             --  Get_Full_View dereferences it whenever the type is used.
  1461.  
  1462.             Set_Full_View (Prev,  Id);
  1463.             Append_Entity (Id, Current_Scope);
  1464.             Set_Is_Public (Id, Is_Public (Prev));
  1465.             Set_Is_Internal (Id);
  1466.             New_Id := Id;
  1467.  
  1468.             if Nkind (N) = N_Full_Type_Declaration
  1469.               and then Nkind (Type_Definition (N)) =
  1470.                            N_Unconstrained_Array_Definition
  1471.             then
  1472.                Unimplemented
  1473.                  (N, "incomplete types completed with unconstrained arrays");
  1474.             end if;
  1475.  
  1476.  
  1477.          --  Case of full declaration of private type
  1478.  
  1479.          else
  1480.             if Nkind (Parent (Prev)) /= N_Private_Extension_Declaration then
  1481.                if Etype (Prev) /= Prev then
  1482.  
  1483.                   --  Prev is a private subtype or a derived type, and needs
  1484.                   --  no completion.
  1485.  
  1486.                   Error_Msg_NE ("invalid redeclaration of }", Id, Prev);
  1487.                   New_Id := Id;
  1488.                end if;
  1489.  
  1490.             elsif Nkind (N) /= N_Full_Type_Declaration
  1491.               or else Nkind (Type_Definition (N)) /= N_Derived_Type_Definition
  1492.             then
  1493.                Error_Msg_N ("full view of private extension must be"
  1494.                  & " an extension", N);
  1495.  
  1496.             elsif not (Abstract_Present (Parent (Prev)))
  1497.               and then Abstract_Present (Type_Definition (N))
  1498.             then
  1499.                Error_Msg_N ("full view of non-abstract extension cannot"
  1500.                  & " be abstract", N);
  1501.             end if;
  1502.  
  1503.             if not In_Private_Part (Current_Scope) then
  1504.                Error_Msg_N
  1505.                  ("declaration of full view must appear in private part",  N);
  1506.             end if;
  1507.  
  1508.             Copy_And_Swap (Prev, Id);
  1509.             New_Id := Prev;
  1510.          end if;
  1511.  
  1512.          --  Verify that full declaration conforms to incomplete one
  1513.  
  1514.          if Present (Discriminant_Specifications (N))
  1515.            and then Is_Incomplete_Or_Private_Type (Prev)
  1516.          then
  1517.             Discriminant_Redeclaration (Prev, Discriminant_Specifications (N));
  1518.  
  1519.          elsif Is_Incomplete_Or_Private_Type (Prev)
  1520.            and then Present (Discriminant_Specifications (Prev_Par))
  1521.          then
  1522.             Error_Msg_N ("missing discriminants in full type declaration", N);
  1523.          end if;
  1524.  
  1525.          if Is_Tagged_Type (Prev) then
  1526.             Note_Feature (Tagged_Types, Sloc (N));
  1527.  
  1528.             --  The full declaration is either a tagged record or an
  1529.             --  extension otherwise this is an error
  1530.  
  1531.             if Nkind (Type_Definition (N)) = N_Record_Definition then
  1532.                if not Tagged_Present (Type_Definition (N)) then
  1533.                   Error_Msg_NE
  1534.                     ("full declaration of } must be tagged", Prev, Id);
  1535.                   Set_Primitive_Operations (Id, New_Elmt_List);
  1536.                end if;
  1537.  
  1538.             elsif Nkind (Type_Definition (N)) = N_Derived_Type_Definition then
  1539.                if No (Record_Extension_Part (Type_Definition (N))) then
  1540.                   Error_Msg_NE (
  1541.                     "full declaration of } must be a record extension",
  1542.                     Prev, Id);
  1543.                   Set_Primitive_Operations (Id, New_Elmt_List);
  1544.                end if;
  1545.             end if;
  1546.          end if;
  1547.  
  1548.          return New_Id;
  1549.  
  1550.       else
  1551.          --  New type declaration
  1552.  
  1553.          Enter_Name (Id);
  1554.          return Id;
  1555.       end if;
  1556.    end Find_Type_Name;
  1557.  
  1558.    ------------------------------
  1559.    -- Is_Valid_Constraint_Kind --
  1560.    ------------------------------
  1561.  
  1562.    function Is_Valid_Constraint_Kind
  1563.      (T_Kind          : Type_Kind;
  1564.       Constraint_Kind : Node_Kind)
  1565.       return Boolean is
  1566.  
  1567.    begin
  1568.       case T_Kind is
  1569.  
  1570.          when Enumeration_Kind |
  1571.               Integer_Kind =>
  1572.             return Constraint_Kind = N_Range_Constraint;
  1573.  
  1574.          when Decimal_Fixed_Point_Kind =>
  1575.             return Constraint_Kind = N_Digits_Constraint;
  1576.  
  1577.          when Ordinary_Fixed_Point_Kind =>
  1578.             return Constraint_Kind = N_Delta_Constraint or else
  1579.               Constraint_Kind = N_Range_Constraint;
  1580.  
  1581.          when Float_Kind =>
  1582.             return Constraint_Kind = N_Digits_Constraint or else
  1583.               Constraint_Kind = N_Range_Constraint;
  1584.  
  1585.          when Access_Kind       |
  1586.               Array_Kind        |
  1587.               E_Record_Type     |
  1588.               E_Record_Subtype  |
  1589.               Class_Wide_Kind   |
  1590.               E_Incomplete_Type |
  1591.               Private_Kind      |
  1592.               Concurrent_Kind  =>
  1593.             return Constraint_Kind = N_Index_Or_Discriminant_Constraint;
  1594.  
  1595.          when others =>
  1596.             return True; -- Error will be detected later.
  1597.       end case;
  1598.  
  1599.    end Is_Valid_Constraint_Kind;
  1600.  
  1601.    ---------------------
  1602.    -- Process_Subtype --
  1603.    ---------------------
  1604.  
  1605.    function Process_Subtype
  1606.      (S           : Node_Id;
  1607.       Related_Nod : Node_Id;
  1608.       Related_Id  : Entity_Id := Empty;
  1609.       Suffix      : Character := ' ')
  1610.       return        Entity_Id
  1611.    is
  1612.       P               : Node_Id;
  1613.       Def_Id          : Entity_Id;
  1614.       Subtype_Mark_Id : Entity_Id;
  1615.       N_Dynamic_Ityp  : Node_Id := Empty;
  1616.  
  1617.    begin
  1618.       --  Case of constraint present, so that we have an N_Subtype_Indication
  1619.       --  node (this node is created only if constraints are present).
  1620.  
  1621.       if Nkind (S) = N_Subtype_Indication then
  1622.          Find_Type (Subtype_Mark (S));
  1623.          P := Parent (S);
  1624.          Subtype_Mark_Id := Entity (Subtype_Mark (S));
  1625.  
  1626.          --  Explicit subtype declaration case
  1627.  
  1628.          if Nkind (P) = N_Subtype_Declaration then
  1629.             Def_Id := Defining_Identifier (P);
  1630.  
  1631.          --  Explicit derived type definition case
  1632.  
  1633.          elsif Nkind (P) = N_Derived_Type_Definition then
  1634.             Def_Id := Defining_Identifier (Parent (P));
  1635.  
  1636.          --  Implicit case, the Def_Id must be created as an implicit type.
  1637.          --  The one exception arises in the case of concurrent types,
  1638.          --  array and access types, where other subsidiary implicit types
  1639.          --  may be created and must appear before the main implicit type.
  1640.          --  In these cases we leave Def_Id set to Empty as a signal that the
  1641.          --  call to New_Itype has not yet been made to create Def_Id.
  1642.  
  1643.          else
  1644.             if Is_Array_Type (Subtype_Mark_Id)
  1645.               or else Is_Concurrent_Type (Subtype_Mark_Id)
  1646.               or else Is_Access_Type (Subtype_Mark_Id)
  1647.             then
  1648.                Def_Id := Empty;
  1649.             else
  1650.                Def_Id := New_Itype (E_Void, Related_Nod, Related_Id, Suffix);
  1651.             end if;
  1652.  
  1653.             --  Only set Has_Dynamic_Itypes if the type is Implicit
  1654.  
  1655.             N_Dynamic_Ityp := Related_Nod;
  1656.          end if;
  1657.  
  1658.          --  If the kind of constraint is invalid for this kind of type,
  1659.          --  then give an error, and then pretend no constraint was given.
  1660.  
  1661.          if not Is_Valid_Constraint_Kind
  1662.                    (Ekind (Subtype_Mark_Id), Nkind (Constraint (S)))
  1663.          then
  1664.             Error_Msg_N
  1665.               ("incorrect constraint for this kind of type",
  1666.                Constraint (S));
  1667.             Rewrite_Substitute_Tree (S,
  1668.               New_Copy_Tree (Subtype_Mark (S)));
  1669.  
  1670.             --  Make recursive call, having got rid of the bogus constraint
  1671.  
  1672.             return Process_Subtype (S, Related_Nod, Related_Id, Suffix);
  1673.          end if;
  1674.  
  1675.          --  Remaining processing depends on type
  1676.  
  1677.          case Ekind (Subtype_Mark_Id) is
  1678.  
  1679.             --  If the type is a access type, the constraint applies to the
  1680.             --  type being accessed. Create the corresponding subtype of it,
  1681.             --  promote it to an implicit type, and return an access to it.
  1682.  
  1683.             when Access_Kind =>
  1684.                Constrain_Access (Def_Id, S, Related_Nod);
  1685.  
  1686.             when Array_Kind =>
  1687.                Constrain_Array (Def_Id, S, Related_Nod, Related_Id, Suffix);
  1688.  
  1689.             when Decimal_Fixed_Point_Kind =>
  1690.                Constrain_Decimal (Def_Id, S, N_Dynamic_Ityp);
  1691.  
  1692.             when Enumeration_Kind =>
  1693.                Constrain_Enumeration (Def_Id, S, N_Dynamic_Ityp);
  1694.  
  1695.             when Ordinary_Fixed_Point_Kind =>
  1696.                Constrain_Ordinary_Fixed (Def_Id, S, N_Dynamic_Ityp);
  1697.  
  1698.             when Float_Kind =>
  1699.                Constrain_Float (Def_Id, S, N_Dynamic_Ityp);
  1700.  
  1701.             when Integer_Kind =>
  1702.                Constrain_Integer (Def_Id, S, N_Dynamic_Ityp);
  1703.  
  1704.             when E_Record_Type     |
  1705.                  E_Record_Subtype  |
  1706.                  Class_Wide_Kind   |
  1707.                  E_Incomplete_Type =>
  1708.                Constrain_Discriminated_Type (Def_Id, S, Related_Nod);
  1709.  
  1710.             when Private_Kind =>
  1711.                Constrain_Discriminated_Type (Def_Id, S, Related_Nod);
  1712.                Prepare_Private_Subtype_Completion (Def_Id, Related_Nod);
  1713.  
  1714.             when Concurrent_Kind  =>
  1715.                Constrain_Concurrent (Def_Id, S,
  1716.                  Related_Nod, Related_Id, Suffix);
  1717.  
  1718.             when others =>
  1719.                Error_Msg_N ("invalid subtype mark in subtype indication", S);
  1720.          end case;
  1721.  
  1722.          --  Size is always inherited from base type, so is Is_Packed
  1723.  
  1724.          Set_Esize     (Def_Id, Esize     (Subtype_Mark_Id));
  1725.          Set_Is_Packed (Def_Id, Is_Packed (Subtype_Mark_Id));
  1726.          return Def_Id;
  1727.  
  1728.       --  Case of no constraints present
  1729.  
  1730.       else
  1731.          Find_Type (S);
  1732.          Check_Incomplete (S);
  1733.          return Entity (S);
  1734.       end if;
  1735.    end Process_Subtype;
  1736.  
  1737.    ----------------------
  1738.    -- Check_Incomplete --
  1739.    ----------------------
  1740.  
  1741.    procedure Check_Incomplete (T : Entity_Id) is
  1742.    begin
  1743.       if Ekind (Entity (T)) = E_Incomplete_Type then
  1744.          Error_Msg_N ("invalid use of type before its full declaration", T);
  1745.       end if;
  1746.    end Check_Incomplete;
  1747.  
  1748.    -----------------------
  1749.    --  Check_Completion --
  1750.    -----------------------
  1751.  
  1752.    procedure Check_Completion (Body_Id : Node_Id := Empty) is
  1753.       E : Entity_Id;
  1754.  
  1755.       procedure Post_Error;
  1756.       --  Post errors for ???
  1757.  
  1758.       procedure Post_Error is
  1759.       begin
  1760.          if not Comes_From_Source (E) then
  1761.  
  1762.             if (Ekind (E) = E_Task_Type
  1763.               or else Ekind (E) = E_Protected_Type)
  1764.             then
  1765.                --  It may be an anonymous protected type created for a
  1766.                --  single variable. Post error on variable, if present.
  1767.  
  1768.                declare
  1769.                   Var : Entity_Id;
  1770.  
  1771.                begin
  1772.                   Var := First_Entity (Current_Scope);
  1773.  
  1774.                   while Present (Var) loop
  1775.                      exit when Etype (Var) = E
  1776.                        and then Comes_From_Source (Var);
  1777.  
  1778.                      Var := Next_Entity (Var);
  1779.                   end loop;
  1780.  
  1781.                   if Present (Var) then
  1782.                      E := Var;
  1783.                   end if;
  1784.                end;
  1785.             end if;
  1786.          end if;
  1787.  
  1788.          if not Comes_From_Source (E) then
  1789.  
  1790.             --  If a generated entity has no completion, then either previous
  1791.             --  semantic errors have disabled the expansion phase, or else
  1792.             --  something is very wrong.
  1793.  
  1794.             if Errors_Detected > 0 then
  1795.                return;
  1796.             else
  1797.                pragma Assert (False); null;
  1798.             end if;
  1799.          end if;
  1800.  
  1801.          if No (Body_Id) then
  1802.  
  1803.             --  Check on a declarative part: post error on the declaration
  1804.             --  that has no completion.
  1805.             --  This is not the right place to post this message ???
  1806.  
  1807.             if Is_Type (E) then
  1808.                Error_Msg_NE ("missing full declaration for }", Parent (E), E);
  1809.             else
  1810.                Error_Msg_NE ("missing body for &", Parent (E), E);
  1811.             end if;
  1812.  
  1813.          else
  1814.             --  Package body has no completion for a declaration that appears
  1815.             --  in the corresponding spec. Post error on the body, with a
  1816.             --  reference to the non-completed declaration. However, do not
  1817.             --  post the message if the item is internal, and we have any
  1818.             --  errors so far (otherwise it could easily be an artifact of
  1819.             --  expansion, which is turned off if any errors occur, e.g. in
  1820.             --  the case of a missing task body procedure, where expansion of
  1821.             --  the task body was suppressed because of other errors).
  1822.  
  1823.             if Comes_From_Source (E)
  1824.               or else Errors_Detected = 0
  1825.             then
  1826.                Error_Msg_Sloc := Sloc (E);
  1827.  
  1828.                if Is_Type (E) then
  1829.                   Error_Msg_NE
  1830.                     ("missing full declaration for }!", Body_Id, E);
  1831.                else
  1832.                   Error_Msg_NE ("missing body for & declared#!",
  1833.                      Body_Id, E);
  1834.                end if;
  1835.             end if;
  1836.          end if;
  1837.       end Post_Error;
  1838.  
  1839.    --  Start processing for Check_Completion
  1840.  
  1841.    begin
  1842.       E := First_Entity (Current_Scope);
  1843.       while Present (E) loop
  1844.          if Is_Internal (E) then
  1845.             null;
  1846.  
  1847.          --  The following situation requires special handling: a child
  1848.          --  unit that appears in the context clause of the body of its
  1849.          --  parent:
  1850.  
  1851.          --    procedure Parent.Child (...);
  1852.          --
  1853.          --    with Parent.Child;
  1854.          --    package body Parent is
  1855.  
  1856.          --  Here Parent.Child appears as a local entity, but should not
  1857.          --  be flagged as requiring completion, because it is a
  1858.          --  compilation unit.
  1859.  
  1860.          elsif Ekind (E) = E_Function
  1861.            or else Ekind (E) = E_Procedure
  1862.            or else Ekind (E) = E_Generic_Function
  1863.            or else Ekind (E) = E_Generic_Procedure
  1864.          then
  1865.             if not Has_Completion (E)
  1866.               and then not Is_Abstract (E)
  1867.               and then Nkind (Parent (Get_Declaration_Node (E))) /=
  1868.                                                        N_Compilation_Unit
  1869.               and then Chars (E) /= Name_uSize
  1870.             then
  1871.                Post_Error;
  1872.             end if;
  1873.  
  1874.          elsif Ekind (E) = E_Package
  1875.            or else Ekind (E) = E_Generic_Package
  1876.          then
  1877.             if Unit_Requires_Body (E) then
  1878.                if not Has_Completion (E)
  1879.                  and then Nkind (Parent (Get_Declaration_Node (E))) /=
  1880.                                                        N_Compilation_Unit
  1881.                then
  1882.                   Post_Error;
  1883.                end if;
  1884.             else
  1885.                May_Need_Implicit_Body (E);
  1886.             end if;
  1887.  
  1888.          elsif Ekind (E) = E_Incomplete_Type
  1889.            and then No (Underlying_Type (E))
  1890.          then
  1891.             Post_Error;
  1892.  
  1893.          elsif (Ekind (E) = E_Task_Type or else
  1894.                 Ekind (E) = E_Protected_Type)
  1895.            and then not Has_Completion (E)
  1896.          then
  1897.             Post_Error;
  1898.  
  1899.          elsif Ekind (E) = E_Constant
  1900.            and then Ekind (Etype (E)) = E_Task_Type
  1901.            and then not Has_Completion (Etype (E))
  1902.          then
  1903.             Post_Error;
  1904.  
  1905.          elsif Ekind (E) = E_Protected_Object
  1906.            and then not Has_Completion (Etype (E))
  1907.          then
  1908.             Post_Error;
  1909.  
  1910.          end if;
  1911.  
  1912.          E := Next_Entity (E);
  1913.       end loop;
  1914.    end Check_Completion;
  1915.  
  1916.    ----------------------------------------
  1917.    -- Prepare_Private_Subtype_Completion --
  1918.    ----------------------------------------
  1919.  
  1920.    procedure Prepare_Private_Subtype_Completion
  1921.      (Id          : Entity_Id;
  1922.       Related_Nod : Node_Id)
  1923.    is
  1924.       Id_B   : constant Entity_Id := Base_Type (Id);
  1925.       Full_B : constant Entity_Id := Full_View (Id_B);
  1926.       Full   : Entity_Id;
  1927.       Itypnod : Node_Id;
  1928.  
  1929.    begin
  1930.       if Present (Full_B) then
  1931.  
  1932.          --  The Base_Type is already completed, we can complete the
  1933.          --  subtype now. We have to create a new entity with the same name,
  1934.          --  Thus we can't use New_Itype.
  1935.  
  1936.          Full := Make_Defining_Identifier (Sloc (Id), Chars (Id));
  1937.  
  1938.          --  Attach the full declaration to the list of implicit types
  1939.          --  after the private view. If the related node is not the
  1940.          --  parent of the private view (the private view is itself
  1941.          --  an itype), we can just attach it to the itype list.
  1942.          --  Otherwise (the private view is an explicit subtype
  1943.          --  declaration), we create an N_Implicit_Types node and
  1944.          --  place it after the declaration to ensure that the private
  1945.          --  view is seen first.
  1946.  
  1947.          if Related_Nod /= Parent (Id) then
  1948.             Attach_Itype_To (Related_Nod, Full);
  1949.  
  1950.          else
  1951.             Itypnod := Make_Implicit_Types (Sloc (Id));
  1952.             Set_First_Itype (Itypnod, Full);
  1953.             Insert_After (Related_Nod, Itypnod);
  1954.          end if;
  1955.  
  1956.          Complete_Private_Subtype (Id, Full, Full_B, Related_Nod);
  1957.  
  1958.       end if;
  1959.  
  1960.       --  Place all subtypes on the Private_Dependents list. The ones
  1961.       --  that have not yet received a full view will receive one
  1962.       --  after the full view of the base type is seen (Process_Full_View).
  1963.  
  1964.       Append_Elmt (Id, Private_Dependents (Id_B));
  1965.  
  1966.    end Prepare_Private_Subtype_Completion;
  1967.  
  1968.    ------------------------------
  1969.    -- Complete_Private_Subtype --
  1970.    ------------------------------
  1971.  
  1972.    procedure Complete_Private_Subtype
  1973.      (Priv        : Entity_Id;
  1974.       Full        : Entity_Id;
  1975.       Full_Base   : Entity_Id;
  1976.       Related_Nod : Node_Id)
  1977.    is
  1978.       Save_Next_Entity : Entity_Id;
  1979.       Save_Next_Itype  : Entity_Id;
  1980.  
  1981.    begin
  1982.       --  Set semantic attributes for (implicit) private subtype completion.
  1983.       --  If the full type has no discriminants, then it is a copy of the full
  1984.       --  view of the base. Otherwise, it is a subtype of the base with a
  1985.       --  possible discriminant constraint. Save and restore the original
  1986.       --  Next_Entity and Next_Itype fields of full to ensure that the
  1987.       --  calls to Copy_Node do not corrupt the respective chains.
  1988.       --  Note that the type of the full view is the same entity as the
  1989.       --  type of the partial view. In this fashion, the subtype has
  1990.       --  access to the correct view of the parent.
  1991.  
  1992.       Save_Next_Entity := Next_Entity (Full);
  1993.       Save_Next_Itype  := Next_Itype (Full);
  1994.  
  1995.       case Ekind (Full_Base) is
  1996.  
  1997.          when Private_Kind     |
  1998.               E_Record_Type    |
  1999.               E_Record_Subtype |
  2000.               Class_Wide_Kind  =>
  2001.             Copy_Node (Priv, Full);
  2002.  
  2003.             Set_Has_Discriminants  (Full, Has_Discriminants (Full_Base));
  2004.             Set_First_Entity       (Full, First_Entity (Full_Base));
  2005.             Set_Last_Entity        (Full, Last_Entity (Full_Base));
  2006.             Set_Next_Itype         (Full, Save_Next_Itype);
  2007.  
  2008.             if Ekind (Full_Base) = E_Record_Type
  2009.               and then Has_Discriminants (Full_Base)
  2010.               and then Has_Discriminants (Priv) -- might not, if errors
  2011.               and then Present (Discriminant_Constraint (Priv))
  2012.               and then not Is_Empty_Elmt_List (Discriminant_Constraint (Priv))
  2013.             then
  2014.                Create_Constrained_Components (Full, Related_Nod,
  2015.                  Full_Base, Full_Base, Discriminant_Constraint (Priv));
  2016.             end if;
  2017.  
  2018.          when others =>
  2019.             Copy_Node (Full_Base, Full);
  2020.             Set_Chars          (Full, Chars (Priv));
  2021.             Set_Next_Itype     (Full, Save_Next_Itype);
  2022.             Conditional_Delay  (Full, Priv);
  2023.             Set_Sloc           (Full, Sloc (Priv));
  2024.  
  2025.       end case;
  2026.  
  2027.       Set_Next_Entity (Full, Save_Next_Entity);
  2028.  
  2029.       --  Set common attributes for all subtypes.
  2030.  
  2031.       Set_Ekind            (Full, Subtype_Kind (Ekind (Full_Base)));
  2032.       Set_Scope            (Full, Scope (Priv));
  2033.       Set_Esize            (Full, Esize (Full_Base));
  2034.       Set_Is_Controlled    (Full, Is_Controlled (Full_Base));
  2035.       Set_Has_Controlled   (Full, Has_Controlled (Full_Base));
  2036.       Set_Has_Tasks        (Full, Has_Tasks (Full_Base));
  2037.  
  2038.       if not Is_Concurrent_Type (Full_Base) then
  2039.          Set_Alignment_Clause (Full, Alignment_Clause (Full_Base));
  2040.       end if;
  2041.  
  2042.       Set_Depends_On_Private (Full, Has_Private_Component (Full));
  2043.       Set_Has_Delayed_Freeze (Full,
  2044.             Has_Delayed_Freeze (Full_Base) and not Is_Frozen (Full_Base));
  2045.       Set_Freeze_Node (Full, Empty);
  2046.       Set_Is_Frozen (Full, False);
  2047.       Set_Full_View (Priv, Full);
  2048.    end Complete_Private_Subtype;
  2049.  
  2050.    ---------------------------------
  2051.    -- Analyze_Subtype_Declaration --
  2052.    ---------------------------------
  2053.  
  2054.    procedure Analyze_Subtype_Declaration (N : Node_Id) is
  2055.       Id    : constant Entity_Id := Defining_Identifier (N);
  2056.       T     : Entity_Id;
  2057.  
  2058.    begin
  2059.       --  Entities declared in Pure unit should be set Is_Pure
  2060.       --  Since 'Partition_Id cannot be applied to such an entity
  2061.  
  2062.       Set_Is_Pure (Id, Is_Pure (Current_Scope));
  2063.  
  2064.       --  The following guard condition on Enter_Name is to handle cases
  2065.       --  where the defining identifier has already been entered into the
  2066.       --  scope but the the declaration as a whole needs to be analyzed.
  2067.  
  2068.       --  This case in particular happens for derived enumeration types.
  2069.       --  The derived enumeration type is processed as an inserted enumeration
  2070.       --  type declaration followed by a rewritten subtype declaration. The
  2071.       --  defining identifier, however, is entered into the name scope very
  2072.       --  early in the processing of the original type declaration and
  2073.       --  therefore needs to be avoided here, when the created subtype
  2074.       --  declaration is analyzed. (See Build_Derived_Types)
  2075.  
  2076.       --  This also happens when the full view of a private type is a
  2077.       --  derived type with constraints. In this case the entity has been
  2078.       --  introduced in the private declaration.
  2079.  
  2080.       if Present (Etype (Id))
  2081.         and then (Is_Private_Type (Etype (Id))
  2082.                    or else Is_Rewrite_Substitution (N))
  2083.       then
  2084.          null;
  2085.  
  2086.       else
  2087.          Enter_Name (Id);
  2088.       end if;
  2089.  
  2090.       T := Process_Subtype (Subtype_Indication (N), N, Id, 'P');
  2091.       pragma Assert (Is_Type (T));
  2092.  
  2093.       --  Inherit common attributes
  2094.  
  2095.       Set_Is_Generic_Type (Id, Is_Generic_Type (Base_Type (T)));
  2096.  
  2097.       --  In the case where there is no constraint given in the subtype
  2098.       --  indication, Process_Subtype just returns the Subtype_Mark,
  2099.       --  so its semantic attributes must be established here.
  2100.  
  2101.       if Nkind (Subtype_Indication (N)) /= N_Subtype_Indication then
  2102.          Set_Etype (Id, Base_Type (T));
  2103.  
  2104.          case Ekind (T) is
  2105.             when Array_Kind =>
  2106.                Set_Ekind                (Id, E_Array_Subtype);
  2107.                Set_First_Index          (Id, First_Index        (T));
  2108.                Set_Component_Type       (Id, Component_Type     (T));
  2109.                Set_Is_Aliased           (Id, Is_Aliased         (T));
  2110.                Set_Is_Constrained       (Id, Is_Constrained     (T));
  2111.  
  2112.             when Decimal_Fixed_Point_Kind =>
  2113.                Set_Ekind                (Id, E_Decimal_Fixed_Point_Subtype);
  2114.                Set_Digits_Value         (Id, Digits_Value       (T));
  2115.                Set_Delta_Value          (Id, Delta_Value        (T));
  2116.                Set_Scale_Value          (Id, Scale_Value        (T));
  2117.                Set_Small_Value          (Id, Small_Value        (T));
  2118.                Set_Scalar_Range         (Id, Scalar_Range       (T));
  2119.                Set_Machine_Radix_10     (Id, Machine_Radix_10   (T));
  2120.  
  2121.             when Enumeration_Kind =>
  2122.                Set_Ekind                (Id, E_Enumeration_Subtype);
  2123.                Set_First_Literal        (Id, First_Literal (Base_Type (T)));
  2124.                Set_Lit_Name_Table       (Id, Lit_Name_Table     (T));
  2125.                Set_Scalar_Range         (Id, Scalar_Range       (T));
  2126.                Set_Is_Character_Type    (Id, Is_Character_Type  (T));
  2127.  
  2128.             when Ordinary_Fixed_Point_Kind =>
  2129.                Set_Ekind                (Id, E_Ordinary_Fixed_Point_Subtype);
  2130.                Set_Scalar_Range         (Id, Scalar_Range       (T));
  2131.                Set_Small_Value          (Id, Small_Value        (T));
  2132.                Set_Delta_Value          (Id, Delta_Value        (T));
  2133.  
  2134.             when Float_Kind =>
  2135.                Set_Ekind                (Id, E_Floating_Point_Subtype);
  2136.                Set_Scalar_Range         (Id, Scalar_Range       (T));
  2137.                Set_Digits_Value         (Id, Digits_Value       (T));
  2138.  
  2139.             when Signed_Integer_Kind =>
  2140.                Set_Ekind                (Id, E_Signed_Integer_Subtype);
  2141.                Set_Scalar_Range         (Id, Scalar_Range       (T));
  2142.  
  2143.             when Modular_Integer_Kind =>
  2144.                Set_Ekind                (Id, E_Modular_Integer_Subtype);
  2145.                Set_Scalar_Range         (Id, Scalar_Range       (T));
  2146.                Set_Modulus              (Id, Modulus            (T));
  2147.                Set_Non_Binary_Modulus   (Id, Non_Binary_Modulus (T));
  2148.  
  2149.             when Class_Wide_Kind =>
  2150.                Note_Feature (Class_Wide_Types, Sloc (Id));
  2151.                Set_First_Entity         (Id, First_Entity       (T));
  2152.                Set_Last_Entity          (Id, Last_Entity        (T));
  2153.                Set_Is_Tagged_Type       (Id, True);
  2154.                Set_Ekind                (Id, E_Class_Wide_Subtype);
  2155.  
  2156.                if Ekind (T) = E_Class_Wide_Subtype then
  2157.                   Set_Equivalent_Type   (Id, Equivalent_Type    (T));
  2158.                end if;
  2159.  
  2160.             when E_Record_Type | E_Record_Subtype =>
  2161.                Set_Ekind                (Id, E_Record_Subtype);
  2162.                Set_First_Entity         (Id, First_Entity       (T));
  2163.                Set_Last_Entity          (Id, Last_Entity        (T));
  2164.                Set_Is_Tagged_Type       (Id, Is_Tagged_Type     (T));
  2165.                Set_Has_Discriminants    (Id, Has_Discriminants  (T));
  2166.                Set_Is_Constrained       (Id, Is_Constrained     (T));
  2167.  
  2168.                if Has_Discriminants (T) then
  2169.                   Set_Discriminant_Constraint
  2170.                                         (Id, Discriminant_Constraint (T));
  2171.                end if;
  2172.  
  2173.                if Is_Tagged_Type (T) then
  2174.                   Set_Class_Wide_Type   (Id, Class_Wide_Type (T));
  2175.                   Set_Primitive_Operations
  2176.                                         (Id, Primitive_Operations (T));
  2177.                   Set_Access_Disp_Table (Id, Access_Disp_Table  (T));
  2178.                end if;
  2179.  
  2180.             when Private_Kind =>
  2181.                Set_Ekind             (Id, Subtype_Kind (Ekind   (T)));
  2182.                Set_Has_Discriminants (Id, Has_Discriminants     (T));
  2183.                Set_Is_Constrained    (Id, Is_Constrained        (T));
  2184.                Set_Is_Tagged_Type    (Id, Is_Tagged_Type        (T));
  2185.                Set_First_Entity      (Id, First_Entity          (T));
  2186.                Set_Last_Entity       (Id, Last_Entity           (T));
  2187.  
  2188.                --  In general the attributes of the subtype of a private
  2189.                --  type are the attributes of the partial view of parent.
  2190.                --  However, the full view may be a discriminated type,
  2191.                --  and the subtype must share the discriminant constraint
  2192.                --  to generate correct calls to initialization procedures.
  2193.  
  2194.                if Has_Discriminants (T) then
  2195.                   Set_Discriminant_Constraint
  2196.                                      (Id, Discriminant_Constraint (T));
  2197.  
  2198.                elsif Present (Full_View (T))
  2199.                  and then Has_Discriminants (Full_View (T))
  2200.                then
  2201.                   Set_Discriminant_Constraint
  2202.                                (Id, Discriminant_Constraint (Full_View (T)));
  2203.                end if;
  2204.  
  2205.                Prepare_Private_Subtype_Completion (Id, N);
  2206.  
  2207.             when Access_Kind =>
  2208.                Set_Ekind             (Id, E_Access_Subtype);
  2209.                Set_Directly_Designated_Type
  2210.                                      (Id, Designated_Type       (T));
  2211.  
  2212.                --  A Pure library_item must not contain the declaration of a
  2213.                --  named access type, except within a subprogram, generic
  2214.                --  subprogram, task unit, or protected unit (RM 10.2.1(16)).
  2215.  
  2216.                if Comes_From_Source (Id)
  2217.                  and then Inside_Pure_Unit
  2218.                  and then not Inside_Subprogram_Task_Protected_Unit
  2219.                then
  2220.                   Error_Msg_N
  2221.                     ("named access types not allowed in pure unit", N);
  2222.                end if;
  2223.  
  2224.             when Concurrent_Kind =>
  2225.  
  2226.                Set_Ekind                (Id, Subtype_Kind (Ekind   (T)));
  2227.                Set_Corresponding_Record_Type (Id,
  2228.                                          Corresponding_Record_Type (T));
  2229.                Set_First_Entity         (Id, First_Entity          (T));
  2230.                Set_First_Private_Entity (Id,  First_Private_Entity (T));
  2231.                Set_Has_Discriminants    (Id, Has_Discriminants     (T));
  2232.                Set_Is_Constrained       (Id, Is_Constrained        (T));
  2233.                Set_Last_Entity          (Id, Last_Entity           (T));
  2234.  
  2235.                if Is_Constrained (T) then
  2236.                   Set_Discriminant_Constraint (Id,
  2237.                                            Discriminant_Constraint (T));
  2238.                end if;
  2239.  
  2240.             when others =>
  2241.                pragma Assert (False); null;
  2242.          end case;
  2243.       end if;
  2244.  
  2245.       if Etype (Id) = Any_Type then
  2246.          return;
  2247.       end if;
  2248.  
  2249.       --  Some common processing on all types
  2250.  
  2251.       Set_Is_Packed (Id, Is_Packed (T));
  2252.       Set_Esize     (Id, Esize     (T));
  2253.  
  2254.       if Ekind (T) not in Concurrent_Kind then
  2255.          Set_Alignment_Clause (Id, Alignment_Clause (T));
  2256.       end if;
  2257.  
  2258.       T := Etype (Id);
  2259.  
  2260.       Set_Is_Immediately_Visible (Id, True);
  2261.       Set_Depends_On_Private     (Id, Has_Private_Component (T));
  2262.  
  2263.       if Is_Array_Type (Id)
  2264.         and then Is_Packed (Id)
  2265.       then
  2266.          Set_Has_Delayed_Freeze (Id);
  2267.  
  2268.       elsif Is_Private_Type (T)
  2269.         and then Present (Full_View (T))
  2270.       then
  2271.          Conditional_Delay (Id, Full_View (T));
  2272.  
  2273.       else
  2274.          Conditional_Delay (Id, T);
  2275.       end if;
  2276.  
  2277.       Set_Has_Tasks      (Id, Has_Tasks (T));
  2278.       Set_Has_Controlled (Id, Has_Controlled (T));
  2279.       Set_Is_Controlled  (Id, Is_Controlled (T));
  2280.  
  2281.       if Has_Controlled (Id) then
  2282.          Note_Feature (Controlled_Types, Sloc (Id));
  2283.       end if;
  2284.  
  2285.       --  Now that the subtype is fully decorated we can create a
  2286.       --  completion if needed
  2287.  
  2288.    end Analyze_Subtype_Declaration;
  2289.  
  2290.    ----------------------
  2291.    -- Constrain_Float --
  2292.    ----------------------
  2293.  
  2294.    procedure Constrain_Float
  2295.      (Def_Id      : Node_Id;
  2296.       S           : Node_Id;
  2297.       Related_Nod : Node_Id)
  2298.    is
  2299.       T    : constant Node_Id := Entity (Subtype_Mark (S));
  2300.       C    : Node_Id;
  2301.       D    : Node_Id;
  2302.       Rais : Node_Id;
  2303.  
  2304.    begin
  2305.       Set_Ekind            (Def_Id, E_Floating_Point_Subtype);
  2306.       Set_Etype            (Def_Id, Base_Type (T));
  2307.       Set_Esize            (Def_Id, Esize (T));
  2308.       Set_Alignment_Clause (Def_Id, Alignment_Clause (T));
  2309.  
  2310.       --  Process the constraint
  2311.  
  2312.       C := Constraint (S);
  2313.  
  2314.       --  Digits constraint present
  2315.  
  2316.       if Nkind (C) = N_Digits_Constraint then
  2317.          D := Digits_Expression (C);
  2318.          Analyze (D);
  2319.          Resolve (D, Any_Integer);
  2320.          Check_Digits_Expression (D);
  2321.          Set_Digits_Value (Def_Id, Expr_Value (D));
  2322.  
  2323.          --  Check that digits value is in range. Obviously we can do this
  2324.          --  at compile time, but it is strictly a runtime check, and of
  2325.          --  course there is an ACVC test that checks this!
  2326.  
  2327.          if Digits_Value (Def_Id) > Digits_Value (T) then
  2328.             Error_Msg_Uint_1 := Digits_Value (T);
  2329.             Error_Msg_N ("?digits value is too large, max here = ^", D);
  2330.  
  2331.             Rais :=
  2332.               Make_Raise_Statement (Sloc (D),
  2333.                 Name =>
  2334.                   New_Reference_To (Standard_Constraint_Error, Sloc (D)));
  2335.  
  2336.             Insert_Before (Declaration_Node (Def_Id), Rais);
  2337.             Analyze (Rais);
  2338.          end if;
  2339.  
  2340.          C := Range_Constraint (C);
  2341.  
  2342.       --  No digits constraint present
  2343.  
  2344.       else
  2345.          Set_Digits_Value (Def_Id, Digits_Value (T));
  2346.       end if;
  2347.  
  2348.       --  Range constraint present
  2349.  
  2350.       if Nkind (C) = N_Range_Constraint then
  2351.          Set_Scalar_Range_For_Subtype
  2352.            (Def_Id, Range_Expression (C), T, Related_Nod);
  2353.  
  2354.       --  No range constraint present
  2355.  
  2356.       else
  2357.          pragma Assert (No (C));
  2358.          Set_Scalar_Range (Def_Id, Scalar_Range (T));
  2359.  
  2360.       end if;
  2361.  
  2362.    end Constrain_Float;
  2363.  
  2364.    -----------------------
  2365.    -- Constrain_Decimal --
  2366.    -----------------------
  2367.  
  2368.    procedure Constrain_Decimal
  2369.      (Def_Id      : Node_Id;
  2370.       S           : Node_Id;
  2371.       Related_Nod : Node_Id)
  2372.    is
  2373.       T           : constant Entity_Id  := Entity (Subtype_Mark (S));
  2374.       C           : constant Node_Id    := Constraint (S);
  2375.       Loc         : constant Source_Ptr := Sloc (C);
  2376.       R           : Node_Id;
  2377.       Digits_Expr : Node_Id;
  2378.       Digits_Val  : Uint;
  2379.       Bound_Val   : Ureal;
  2380.  
  2381.    begin
  2382.       Set_Ekind (Def_Id, E_Decimal_Fixed_Point_Subtype);
  2383.  
  2384.       Analyze (Digits_Expr);
  2385.       Resolve (Digits_Expr, Any_Integer);
  2386.  
  2387.       R := Range_Constraint (R);
  2388.       Digits_Expr := Digits_Expression (C);
  2389.  
  2390.       Check_Digits_Expression (Digits_Expr);
  2391.       Digits_Val := Expr_Value (Digits_Expr);
  2392.  
  2393.       if Digits_Val > Digits_Value (T) then
  2394.          Error_Msg_N ("digits expression is incompatible with subtype", C);
  2395.       end if;
  2396.  
  2397.       Set_Etype            (Def_Id, Base_Type        (T));
  2398.       Set_Esize            (Def_Id, Esize            (T));
  2399.       Set_Alignment_Clause (Def_Id, Alignment_Clause (T));
  2400.       Set_Delta_Value      (Def_Id, Delta_Value      (T));
  2401.       Set_Scale_Value      (Def_Id, Scale_Value      (T));
  2402.       Set_Small_Value      (Def_Id, Small_Value      (T));
  2403.       Set_Machine_Radix_10 (Def_Id, Machine_Radix_10 (T));
  2404.       Set_Digits_Value     (Def_Id, Digits_Val);
  2405.  
  2406.       --  Manufacture range from given digits value if no range present
  2407.  
  2408.       if No (R) then
  2409.          Bound_Val := Ureal_10 ** (Digits_Val - 1);
  2410.          R :=
  2411.             Make_Range (Loc,
  2412.                Low_Bound =>
  2413.                  Make_Type_Conversion (Loc,
  2414.                     Subtype_Mark => New_Reference_To (T, Loc),
  2415.                     Expression =>
  2416.                       Make_Real_Literal (Loc, (-Bound_Val))),
  2417.  
  2418.                High_Bound =>
  2419.                  Make_Type_Conversion (Loc,
  2420.                     Subtype_Mark => New_Reference_To (T, Loc),
  2421.                     Expression => Make_Real_Literal (Loc, Bound_Val)));
  2422.  
  2423.       end if;
  2424.  
  2425.       Set_Scalar_Range_For_Subtype (Def_Id, R, T, Related_Nod);
  2426.  
  2427.    end Constrain_Decimal;
  2428.  
  2429.    ------------------------------
  2430.    -- Constrain_Ordinary_Fixed --
  2431.    ------------------------------
  2432.  
  2433.    procedure Constrain_Ordinary_Fixed
  2434.      (Def_Id      : Node_Id;
  2435.       S           : Node_Id;
  2436.       Related_Nod : Node_Id)
  2437.    is
  2438.       T    : constant Node_Id := Entity (Subtype_Mark (S));
  2439.       C    : Node_Id;
  2440.       D    : Node_Id;
  2441.       Rais : Node_Id;
  2442.  
  2443.    begin
  2444.       Set_Ekind            (Def_Id, E_Ordinary_Fixed_Point_Subtype);
  2445.       Set_Etype            (Def_Id, Base_Type (T));
  2446.       Set_Esize            (Def_Id, Esize (T));
  2447.       Set_Alignment_Clause (Def_Id, Alignment_Clause (T));
  2448.       Set_Small_Value      (Def_Id, Small_Value      (T));
  2449.  
  2450.       --  Process the constraint
  2451.  
  2452.       C := Constraint (S);
  2453.  
  2454.       --  Delta constraint present
  2455.  
  2456.       if Nkind (C) = N_Delta_Constraint then
  2457.          D := Delta_Expression (C);
  2458.          Analyze (D);
  2459.          Resolve (D, Any_Real);
  2460.          Check_Delta_Expression (D);
  2461.          Set_Delta_Value (Def_Id, Expr_Value_R (D));
  2462.  
  2463.          --  Check that delta value is in range. Obviously we can do this
  2464.          --  at compile time, but it is strictly a runtime check, and of
  2465.          --  course there is an ACVC test that checks this!
  2466.  
  2467.          if Delta_Value (Def_Id) < Delta_Value (T) then
  2468.             Error_Msg_N ("?delta value is too small", D);
  2469.  
  2470.             Rais :=
  2471.               Make_Raise_Statement (Sloc (D),
  2472.                 Name =>
  2473.                   New_Reference_To (Standard_Constraint_Error, Sloc (D)));
  2474.  
  2475.             Insert_Before (Declaration_Node (Def_Id), Rais);
  2476.             Analyze (Rais);
  2477.          end if;
  2478.  
  2479.          C := Range_Constraint (C);
  2480.  
  2481.       --  No delta constraint present
  2482.  
  2483.       else
  2484.          Set_Delta_Value (Def_Id, Delta_Value (T));
  2485.       end if;
  2486.  
  2487.       --  Range constraint present
  2488.  
  2489.       if Nkind (C) = N_Range_Constraint then
  2490.          Set_Scalar_Range_For_Subtype
  2491.            (Def_Id, Range_Expression (C), T, Related_Nod);
  2492.  
  2493.       --  No range constraint present
  2494.  
  2495.       else
  2496.          pragma Assert (No (C));
  2497.          Set_Scalar_Range (Def_Id, Scalar_Range (T));
  2498.  
  2499.       end if;
  2500.  
  2501.    end Constrain_Ordinary_Fixed;
  2502.  
  2503.    ---------------------------
  2504.    -- Constrain_Enumeration --
  2505.    ---------------------------
  2506.  
  2507.    procedure Constrain_Enumeration
  2508.      (Def_Id      : Node_Id;
  2509.       S           : Node_Id;
  2510.       Related_Nod : Node_Id)
  2511.    is
  2512.       T : constant Entity_Id := Entity (Subtype_Mark (S));
  2513.       C : constant Node_Id   := Constraint (S);
  2514.  
  2515.    begin
  2516.       Set_Ekind (Def_Id, E_Enumeration_Subtype);
  2517.  
  2518.       Set_First_Literal     (Def_Id, First_Literal (Base_Type (T)));
  2519.       Set_Etype             (Def_Id, Base_Type (T));
  2520.       Set_Lit_Name_Table    (Def_Id, Lit_Name_Table (T));
  2521.       Set_Esize             (Def_Id, Esize (T));
  2522.       Set_Alignment_Clause  (Def_Id, Alignment_Clause (T));
  2523.       Set_Is_Character_Type (Def_Id, Is_Character_Type (T));
  2524.  
  2525.       Set_Scalar_Range_For_Subtype
  2526.         (Def_Id, Range_Expression (C), T, Related_Nod);
  2527.  
  2528.    end Constrain_Enumeration;
  2529.  
  2530.    -----------------------
  2531.    -- Constrain_Integer --
  2532.    -----------------------
  2533.  
  2534.    procedure Constrain_Integer
  2535.      (Def_Id      : Node_Id;
  2536.       S           : Node_Id;
  2537.       Related_Nod : Node_Id)
  2538.    is
  2539.       T : constant Node_Id := Entity (Subtype_Mark (S));
  2540.       C : constant Node_Id := Constraint (S);
  2541.  
  2542.    begin
  2543.       if Is_Modular_Integer_Type (T) then
  2544.          Set_Ekind         (Def_Id, E_Modular_Integer_Subtype);
  2545.          Set_Modulus       (Def_Id, Modulus (T));
  2546.       else
  2547.          Set_Ekind         (Def_Id, E_Signed_Integer_Subtype);
  2548.       end if;
  2549.  
  2550.       Set_Etype            (Def_Id, Base_Type (T));
  2551.       Set_Esize            (Def_Id, Esize (T));
  2552.       Set_Alignment_Clause (Def_Id, Alignment_Clause (T));
  2553.  
  2554.       Set_Scalar_Range_For_Subtype
  2555.         (Def_Id, Range_Expression (C), T, Related_Nod);
  2556.  
  2557.    end Constrain_Integer;
  2558.  
  2559.    -------------------------------------
  2560.    -- Floating_Point_Type_Declaration --
  2561.    -------------------------------------
  2562.  
  2563.    procedure Floating_Point_Type_Declaration (T : Entity_Id; Def : Node_Id) is
  2564.       Digs          : constant Node_Id := Digits_Expression (Def);
  2565.       Digs_Val      : Uint;
  2566.       Base_Type     : Entity_Id;
  2567.       Implicit_Base : Entity_Id;
  2568.  
  2569.       function Can_Derive_From (E : Entity_Id) return Boolean;
  2570.       --  Find if given digits value allows derivation from specified type
  2571.  
  2572.       function Can_Derive_From (E : Entity_Id) return Boolean is
  2573.          Spec : constant Entity_Id := Real_Range_Specification (Def);
  2574.  
  2575.       begin
  2576.          if Digs_Val > Digits_Value (E) then
  2577.             return False;
  2578.          end if;
  2579.  
  2580.          if Present (Spec) then
  2581.             if Expr_Value_R (Type_Low_Bound (E)) >
  2582.                Expr_Value_R (Low_Bound (Spec))
  2583.             then
  2584.                return False;
  2585.             end if;
  2586.  
  2587.             if Expr_Value_R (Type_High_Bound (E)) <
  2588.                Expr_Value_R (High_Bound (Spec))
  2589.             then
  2590.                return False;
  2591.             end if;
  2592.          end if;
  2593.  
  2594.          return True;
  2595.       end Can_Derive_From;
  2596.  
  2597.    --  Start of processing for Floating_Point_Type_Declaration
  2598.  
  2599.    begin
  2600.       --  Create an implicit base type
  2601.  
  2602.       Implicit_Base :=
  2603.         New_Itype (E_Floating_Point_Type, Parent (Def), T, 'B');
  2604.  
  2605.       --  Analyze and verify digits value
  2606.  
  2607.       Analyze (Digs);
  2608.       Resolve (Digs, Any_Integer);
  2609.       Check_Digits_Expression (Digs);
  2610.       Digs_Val := Expr_Value (Digs);
  2611.  
  2612.       --  Process possible range spec and find correct type to derive from
  2613.  
  2614.       Process_Real_Range_Specification (Def);
  2615.  
  2616.       if Can_Derive_From (Standard_Short_Float) then
  2617.          Base_Type := Standard_Short_Float;
  2618.       elsif Can_Derive_From (Standard_Float) then
  2619.          Base_Type := Standard_Float;
  2620.       elsif Can_Derive_From (Standard_Long_Float) then
  2621.          Base_Type := Standard_Long_Float;
  2622.       elsif Can_Derive_From (Standard_Long_Long_Float) then
  2623.          Base_Type := Standard_Long_Long_Float;
  2624.  
  2625.       --  If we can't derive from any existing type, use long long float
  2626.       --  and give appropriate message explaining the problem.
  2627.  
  2628.       else
  2629.          Base_Type := Standard_Long_Long_Float;
  2630.  
  2631.          if Digs_Val >= Digits_Value (Standard_Long_Long_Float) then
  2632.             Error_Msg_N ("digits value out of range", Digs);
  2633.          else
  2634.             Error_Msg_N
  2635.               ("range too large for any predefined type",
  2636.                Real_Range_Specification (Def));
  2637.          end if;
  2638.       end if;
  2639.  
  2640.       --  If there are bounds given in the declaration use them as the bounds
  2641.       --  of the type, otherwise use the bounds of the predefined base type
  2642.       --  that was chosen based on the Digits value.
  2643.  
  2644.       if Present (Real_Range_Specification (Def)) then
  2645.          Set_Scalar_Range (T, Real_Range_Specification (Def));
  2646.       else
  2647.          Set_Scalar_Range (T, Scalar_Range (Base_Type));
  2648.       end if;
  2649.  
  2650.       --  Complete definition of implicit base and declared first subtype
  2651.  
  2652.       Set_Scalar_Range     (Implicit_Base, Scalar_Range (Base_Type));
  2653.       Set_Etype            (Implicit_Base, Base_Type);
  2654.       Set_Esize            (Implicit_Base, Esize (Base_Type));
  2655.       Set_Alignment_Clause (Implicit_Base, Alignment_Clause (Base_Type));
  2656.       Set_Digits_Value     (Implicit_Base, Digs_Val);
  2657.  
  2658.       Set_Ekind            (T, E_Floating_Point_Subtype);
  2659.       Set_Etype            (T, Implicit_Base);
  2660.       Set_Esize            (T, Esize (Implicit_Base));
  2661.       Set_Alignment_Clause (T, Alignment_Clause (Implicit_Base));
  2662.       Set_Digits_Value     (T, Digs_Val);
  2663.  
  2664.    end Floating_Point_Type_Declaration;
  2665.  
  2666.    -------------------------------------------
  2667.    -- Ordinary_Fixed_Point_Type_Declaration --
  2668.    -------------------------------------------
  2669.  
  2670.    procedure Ordinary_Fixed_Point_Type_Declaration
  2671.      (T   : Entity_Id;
  2672.       Def : Node_Id)
  2673.    is
  2674.       Loc           : constant Source_Ptr := Sloc (Def);
  2675.       Delta_Expr    : constant Node_Id    := Delta_Expression (Def);
  2676.       RRS           : constant Node_Id    := Real_Range_Specification (Def);
  2677.       Implicit_Base : Entity_Id;
  2678.       Delta_Val     : Ureal;
  2679.       Small_Val     : Ureal;
  2680.  
  2681.    begin
  2682.       --  Create implicit base type
  2683.  
  2684.       Implicit_Base :=
  2685.         New_Itype (E_Ordinary_Fixed_Point_Type, Parent (Def), T, 'B');
  2686.       Set_Etype (Implicit_Base, Implicit_Base);
  2687.  
  2688.       --  Analyze and process delta expression
  2689.  
  2690.       Analyze (Delta_Expr);
  2691.       Resolve (Delta_Expr, Any_Real);
  2692.  
  2693.       Check_Delta_Expression (Delta_Expr);
  2694.       Delta_Val := Expr_Value_R (Delta_Expr);
  2695.  
  2696.       if Delta_Val < Ureal_Fine_Delta then
  2697.          Error_Msg_N ("delta value must be greater than Fine_Delta", Def);
  2698.          Delta_Val := Ureal_Fine_Delta;
  2699.       end if;
  2700.  
  2701.       Set_Delta_Value (Implicit_Base, Delta_Val);
  2702.  
  2703.       --  Compute default small from given delta, which is the largest
  2704.       --  power of 2 that does not exceed the given delta value.
  2705.  
  2706.       declare
  2707.          Tmp   : Ureal := Ureal_1;
  2708.          Scale : Int   := 0;
  2709.  
  2710.       begin
  2711.          if Delta_Val < Ureal_1 then
  2712.             while Delta_Val < Tmp loop
  2713.                Tmp := Tmp / Ureal_2;
  2714.                Scale := Scale + 1;
  2715.             end loop;
  2716.  
  2717.          else
  2718.             loop
  2719.                Tmp := Tmp * Ureal_2;
  2720.                exit when Tmp > Delta_Val;
  2721.                Scale := Scale - 1;
  2722.             end loop;
  2723.          end if;
  2724.  
  2725.          Small_Val := UR_From_Components (Uint_1, UI_From_Int (Scale), 2);
  2726.       end;
  2727.  
  2728.       Set_Small_Value (Implicit_Base, Small_Val);
  2729.  
  2730.       --  Analyze and process given range
  2731.  
  2732.       declare
  2733.          Low      : constant Node_Id := Low_Bound  (RRS);
  2734.          High     : constant Node_Id := High_Bound (RRS);
  2735.          Low_Val  : Ureal;
  2736.          High_Val : Ureal;
  2737.          Maxr     : Ureal;
  2738.  
  2739.       begin
  2740.          Analyze (Low);
  2741.          Analyze (High);
  2742.          Resolve (Low, Any_Real);
  2743.          Resolve (High, Any_Real);
  2744.          Check_Real_Bound (Low);
  2745.          Check_Real_Bound (High);
  2746.  
  2747.          --  Obtain the range, fudging the deltas as allowed to make sure we
  2748.          --  do not use too many bits (when the type is frozen, we will try
  2749.          --  to unfudge these values if it does not increase the size).
  2750.  
  2751.          Low_Val  := Expr_Value_R (Low)  + Small_Value (Implicit_Base);
  2752.          High_Val := Expr_Value_R (High) - Small_Value (Implicit_Base);
  2753.          Maxr     := UR_Max (abs Low_Val, abs High_Val);
  2754.  
  2755.          --  The base range is expressed using universal real literals. When
  2756.          --  the type is frozen, the Corresponding_Integer_Value will be set.
  2757.  
  2758.          Set_Scalar_Range (Implicit_Base,
  2759.            Make_Range (Loc,
  2760.              Low_Bound  => Make_Real_Literal (Loc, (-Maxr)),
  2761.              High_Bound => Make_Real_Literal (Loc, Maxr)));
  2762.  
  2763.          --  Also set scalar range of the first subtype
  2764.  
  2765.          Set_Scalar_Range (T,
  2766.            Make_Range (Loc,
  2767.              Low_Bound  => Make_Real_Literal (Loc, Low_Val),
  2768.              High_Bound => Make_Real_Literal (Loc, High_Val)));
  2769.       end;
  2770.  
  2771.       --  Find default size
  2772.  
  2773.       declare
  2774.          Min_Size : constant Nat := Minimum_Size (Implicit_Base);
  2775.  
  2776.       begin
  2777.          if Min_Size <= 8 then
  2778.             Set_Esize (Implicit_Base, Uint_8);
  2779.  
  2780.          elsif Min_Size <= 16 then
  2781.             Set_Esize (Implicit_Base, Uint_16);
  2782.  
  2783.          elsif Min_Size <= 32 then
  2784.             Set_Esize (Implicit_Base, Uint_32);
  2785.  
  2786.          elsif Min_Size <= 64 then
  2787.             Set_Esize (Implicit_Base, Uint_64);
  2788.  
  2789.             --  Output warning if more than 53 bits, and we only have 64-bit
  2790.             --  floating-point available, because that means that Fixed_IO
  2791.             --  will not be fully accurate.
  2792.  
  2793.             if Esize (Standard_Long_Long_Float) = 64
  2794.               and then Min_Size > 53
  2795.             then
  2796.                Error_Msg_N ("Fixed_IO may lose precision on this type?", Def);
  2797.             end if;
  2798.  
  2799.          --  Here we are out of range, so settle for 64 bits with error message
  2800.  
  2801.          else
  2802.             Set_Esize (Implicit_Base, Uint_64);
  2803.             Error_Msg_N ("fixed-point definition requires too many bits", Def);
  2804.          end if;
  2805.       end;
  2806.  
  2807.       --  Complete definition of first subtype
  2808.  
  2809.       Set_Ekind            (T, E_Ordinary_Fixed_Point_Subtype);
  2810.       Set_Etype            (T, Implicit_Base);
  2811.       Set_Esize            (T, Esize (Implicit_Base));
  2812.       Set_Alignment_Clause (T, Alignment_Clause (Implicit_Base));
  2813.       Set_Small_Value      (T, Small_Val);
  2814.       Set_Delta_Value      (T, Delta_Val);
  2815.  
  2816.    end Ordinary_Fixed_Point_Type_Declaration;
  2817.  
  2818.    ------------------------------------------
  2819.    -- Decimal_Fixed_Point_Type_Declaration --
  2820.    ------------------------------------------
  2821.  
  2822.    procedure Decimal_Fixed_Point_Type_Declaration
  2823.      (T : Entity_Id;
  2824.       Def : Node_Id)
  2825.    is
  2826.       Loc           : constant Source_Ptr := Sloc (Def);
  2827.       Digs_Expr     : constant Node_Id    := Digits_Expression (Def);
  2828.       Delta_Expr    : constant Node_Id    := Delta_Expression (Def);
  2829.       Implicit_Base : Entity_Id;
  2830.       Digs_Val      : Uint;
  2831.       Delta_Val     : Ureal;
  2832.       Scale_Val     : Uint;
  2833.       Bound_Val     : Ureal;
  2834.  
  2835.    --  Start of processing for Decimal_Fixed_Point_Type_Declaration
  2836.  
  2837.    begin
  2838.       --  Create implicit base type
  2839.  
  2840.       Implicit_Base :=
  2841.         New_Itype (E_Decimal_Fixed_Point_Type, Parent (Def), T, 'B');
  2842.       Set_Etype (Implicit_Base, Implicit_Base);
  2843.  
  2844.       --  Analyze and process delta expression
  2845.  
  2846.       Analyze (Delta_Expr);
  2847.       Resolve (Delta_Expr, Universal_Real);
  2848.  
  2849.       Check_Delta_Expression (Delta_Expr);
  2850.       Delta_Val := Expr_Value_R (Delta_Expr);
  2851.  
  2852.       --  Determine scale value from delta value and check delta is power of 10
  2853.  
  2854.       declare
  2855.          Val : Ureal := Delta_Val;
  2856.  
  2857.       begin
  2858.          Scale_Val := Uint_0;
  2859.  
  2860.          if Val < Ureal_1 then
  2861.             while Val < Ureal_1 loop
  2862.                Val := Val * Ureal_10;
  2863.                Scale_Val := Scale_Val + 1;
  2864.             end loop;
  2865.  
  2866.             if Scale_Val > 18 then
  2867.                Error_Msg_N ("scale exceeds maximum value of 18", Def);
  2868.                Scale_Val := UI_From_Int (+18);
  2869.             end if;
  2870.  
  2871.          else
  2872.             while Val > Ureal_1 loop
  2873.                Val := Val / Ureal_10;
  2874.                Scale_Val := Scale_Val - 1;
  2875.             end loop;
  2876.  
  2877.             if Scale_Val > 18 then
  2878.                Error_Msg_N ("scale is less than minimum value of -18", Def);
  2879.                Scale_Val := UI_From_Int (-18);
  2880.             end if;
  2881.          end if;
  2882.  
  2883.          if Val /= Ureal_1 then
  2884.             Error_Msg_N ("delta expression must be a power of 10", Def);
  2885.             Delta_Val := Ureal_10 ** (-Scale_Val);
  2886.          end if;
  2887.       end;
  2888.  
  2889.       --  Set delta, scale and small (small = delta for decimal type)
  2890.  
  2891.       Set_Delta_Value  (Implicit_Base, Delta_Val);
  2892.       Set_Scale_Value  (Implicit_Base, Scale_Val);
  2893.       Set_Small_Value  (Implicit_Base, Delta_Val);
  2894.  
  2895.       --  Analyze and process digits expression
  2896.  
  2897.       Analyze (Digs_Expr);
  2898.       Resolve (Digs_Expr, Any_Integer);
  2899.       Check_Digits_Expression (Digs_Expr);
  2900.       Digs_Val := Expr_Value (Digs_Expr);
  2901.  
  2902.       if Digs_Val > 18 then
  2903.          Digs_Val := UI_From_Int (+18);
  2904.          Error_Msg_N ("digits value out of range, maximum is 18", Digs_Expr);
  2905.       end if;
  2906.  
  2907.       Set_Digits_Value (Implicit_Base, Digs_Val);
  2908.  
  2909.       --  The base range is expressed using universal real literals. When
  2910.       --  the type is frozen, the Corresponding_Integer_Value will be set.
  2911.  
  2912.       Bound_Val := UR_From_Uint (10 ** Digs_Val - 1) * Delta_Val;
  2913.  
  2914.       Set_Scalar_Range (Implicit_Base,
  2915.         Make_Range (Loc,
  2916.           Low_Bound  => Make_Real_Literal (Loc, -Bound_Val),
  2917.           High_Bound => Make_Real_Literal (Loc, Bound_Val)));
  2918.  
  2919.       --  Find and set appropriate size
  2920.  
  2921.       declare
  2922.          Min_Size : constant Nat := Minimum_Size (Implicit_Base);
  2923.  
  2924.       begin
  2925.          if Min_Size <= 8 then
  2926.             Set_Esize (Implicit_Base, Uint_8);
  2927.  
  2928.          elsif Min_Size <= 16 then
  2929.             Set_Esize (Implicit_Base, Uint_16);
  2930.  
  2931.          elsif Min_Size <= 32 then
  2932.             Set_Esize (Implicit_Base, Uint_32);
  2933.  
  2934.          else
  2935.             pragma Assert (Min_Size <= 64);
  2936.             Set_Esize (Implicit_Base, Uint_64);
  2937.          end if;
  2938.       end;
  2939.  
  2940.       --  Complete entity for first subtype
  2941.  
  2942.       Set_Ekind            (T, E_Decimal_Fixed_Point_Subtype);
  2943.       Set_Etype            (T, Implicit_Base);
  2944.       Set_Esize            (T, Esize (Implicit_Base));
  2945.       Set_Alignment_Clause (T, Alignment_Clause (Implicit_Base));
  2946.       Set_Digits_Value     (T, Digs_Val);
  2947.       Set_Delta_Value      (T, Delta_Val);
  2948.       Set_Small_Value      (T, Delta_Val);
  2949.       Set_Scale_Value      (T, Scale_Val);
  2950.  
  2951.       --  If there are bounds given in the declaration use them as the
  2952.       --  bounds of the first named subtype.
  2953.  
  2954.       if Present (Real_Range_Specification (Def)) then
  2955.          declare
  2956.             RRS      : constant Node_Id := Real_Range_Specification (Def);
  2957.             Low      : constant Node_Id := Low_Bound (RRS);
  2958.             High     : constant Node_Id := High_Bound (RRS);
  2959.             Low_Val  : Ureal;
  2960.             High_Val : Ureal;
  2961.  
  2962.          begin
  2963.             Analyze (Low);
  2964.             Analyze (High);
  2965.             Resolve (Low, Universal_Real);
  2966.             Resolve (High, Universal_Real);
  2967.             Check_Real_Bound (Low);
  2968.             Check_Real_Bound (High);
  2969.  
  2970.             Low_Val  := UR_Max (Expr_Value_R (Low), -Bound_Val);
  2971.             High_Val := UR_Min (Expr_Value_R (High), Bound_Val);
  2972.  
  2973.             --  The bounds are constructed with universal reals, to be set
  2974.             --  to the proper values with Corresponding_Integer_Value set
  2975.             --  when the subtype is frozen.
  2976.  
  2977.             Set_Scalar_Range (T,
  2978.               Make_Range (Loc,
  2979.                 Low_Bound  => Make_Real_Literal (Loc, Low_Val),
  2980.                 High_Bound => Make_Real_Literal (Loc, High_Val)));
  2981.          end;
  2982.  
  2983.       --  If no explicit range, use base range
  2984.  
  2985.       else
  2986.          Set_Scalar_Range (T, Scalar_Range (Implicit_Base));
  2987.       end if;
  2988.  
  2989.    end Decimal_Fixed_Point_Type_Declaration;
  2990.  
  2991.    -------------------------------------
  2992.    -- Signed_Integer_Type_Declaration --
  2993.    -------------------------------------
  2994.  
  2995.    procedure Signed_Integer_Type_Declaration (T : Entity_Id; Def : Node_Id) is
  2996.       Implicit_Base : Entity_Id;
  2997.       Base_Type     : Entity_Id;
  2998.       Lo_Val        : Uint;
  2999.       Hi_Val        : Uint;
  3000.       Errs          : Boolean := False;
  3001.       Lo            : Node_Id;
  3002.       Hi            : Node_Id;
  3003.  
  3004.       function Can_Derive_From (E : Entity_Id) return Boolean;
  3005.       --  Determine whether given bounds allow derivation from specified type
  3006.  
  3007.       procedure Check_Bound (Expr : Node_Id);
  3008.       --  Check bound to make sure it is integral and static. If not, post
  3009.       --  appropriate error message and set Errs flag
  3010.  
  3011.       function Can_Derive_From (E : Entity_Id) return Boolean is
  3012.       begin
  3013.          return Lo_Val >= Expr_Value (Type_Low_Bound (E))
  3014.            and then Hi_Val <= Expr_Value (Type_High_Bound (E));
  3015.       end Can_Derive_From;
  3016.  
  3017.       procedure Check_Bound (Expr : Node_Id) is
  3018.       begin
  3019.          --  If a range constraint is used as an integer type definition, each
  3020.          --  bound of the range must be defined by a static expression of some
  3021.          --  integer type, but the two bounds need not have the same integer
  3022.          --  type (Negative bounds are allowed.) (RM 3.5.4)
  3023.  
  3024.          if not Is_Integer_Type (Etype (Expr)) then
  3025.             Error_Msg_N
  3026.               ("integer type definition bounds must be of integer type", Expr);
  3027.             Errs := True;
  3028.  
  3029.          elsif not Is_OK_Static_Expression (Expr) then
  3030.             Error_Msg_N
  3031.               ("non-static expression used for integer type bound", Expr);
  3032.             Errs := True;
  3033.          end if;
  3034.       end Check_Bound;
  3035.  
  3036.    --  Start of processing for Signed_Integer_Type_Declaration
  3037.  
  3038.    begin
  3039.       --  Create an anonymous base type
  3040.  
  3041.       Implicit_Base :=
  3042.         New_Itype (E_Signed_Integer_Type, Parent (Def), T, 'B');
  3043.  
  3044.       --  Analyze and check the bounds, they can be of any integer type
  3045.  
  3046.       Lo := Low_Bound (Def);
  3047.       Hi := High_Bound (Def);
  3048.       Analyze (Lo);
  3049.       Analyze (Hi);
  3050.       Resolve (Lo, Any_Integer);
  3051.       Resolve (Hi, Any_Integer);
  3052.  
  3053.       Check_Bound (Lo);
  3054.       Check_Bound (Hi);
  3055.  
  3056.       if Errs then
  3057.          Hi := Type_High_Bound (Standard_Long_Long_Integer);
  3058.          Lo := Type_Low_Bound (Standard_Long_Long_Integer);
  3059.       end if;
  3060.  
  3061.       --  Find type to derive from
  3062.  
  3063.       Lo_Val := Expr_Value (Lo);
  3064.       Hi_Val := Expr_Value (Hi);
  3065.  
  3066.       if Can_Derive_From (Standard_Short_Short_Integer) then
  3067.          Base_Type := Standard_Short_Short_Integer;
  3068.       elsif Can_Derive_From (Standard_Short_Integer) then
  3069.          Base_Type := Standard_Short_Integer;
  3070.       elsif Can_Derive_From (Standard_Integer) then
  3071.          Base_Type := Standard_Integer;
  3072.       elsif Can_Derive_From (Standard_Long_Integer) then
  3073.          Base_Type := Standard_Long_Integer;
  3074.       elsif Can_Derive_From (Standard_Long_Long_Integer) then
  3075.          Base_Type := Standard_Long_Long_Integer;
  3076.       else
  3077.          Base_Type := Standard_Long_Long_Integer;
  3078.          Error_Msg_N ("integer type definition bounds out of range", Def);
  3079.          Hi := Type_High_Bound (Standard_Long_Long_Integer);
  3080.          Lo := Type_Low_Bound (Standard_Long_Long_Integer);
  3081.       end if;
  3082.  
  3083.       --  Complete both implicit base and declared first subtype entities
  3084.  
  3085.       Set_Scalar_Range     (Implicit_Base, Scalar_Range (Base_Type));
  3086.       Set_Etype            (Implicit_Base, Base_Type);
  3087.       Set_Esize            (Implicit_Base, Esize (Base_Type));
  3088.       Set_Alignment_Clause (Implicit_Base, Alignment_Clause (Base_Type));
  3089.  
  3090.       Set_Ekind            (T, E_Signed_Integer_Subtype);
  3091.       Set_Etype            (T, Implicit_Base);
  3092.       Set_Esize            (T, Esize (Implicit_Base));
  3093.       Set_Alignment_Clause (T, Alignment_Clause (Implicit_Base));
  3094.       Set_Scalar_Range     (T, Def);
  3095.    end Signed_Integer_Type_Declaration;
  3096.  
  3097.    ------------------------------
  3098.    -- Modular_Type_Declaration --
  3099.    ------------------------------
  3100.  
  3101.    procedure Modular_Type_Declaration (T : Entity_Id; Def : Node_Id) is
  3102.       Mod_Expr : constant Node_Id := Expression (Def);
  3103.       M_Val    : Uint;
  3104.  
  3105.    begin
  3106.       Set_Etype (T, T);
  3107.       Set_Ekind (T, E_Modular_Integer_Type);
  3108.       Analyze (Mod_Expr);
  3109.       Resolve (Mod_Expr, Any_Integer);
  3110.  
  3111.       if not Is_OK_Static_Expression (Mod_Expr) then
  3112.          Error_Msg_N
  3113.            ("non-static expression used for modular type bound", Mod_Expr);
  3114.          M_Val := 2 ** System_Max_Binary_Modulus_Power;
  3115.       else
  3116.          M_Val := Expr_Value (Mod_Expr);
  3117.       end if;
  3118.  
  3119.       if M_Val <= 1 then
  3120.          Error_Msg_N ("modulus value must be greater than 1", Mod_Expr);
  3121.          M_Val := 2 ** System_Max_Binary_Modulus_Power;
  3122.       end if;
  3123.  
  3124.       Set_Modulus (T, M_Val);
  3125.  
  3126.       --   Create bounds for the modular type based on the modulus given in
  3127.       --   the type declaration and then analyze and resolve those bounds.
  3128.  
  3129.       Set_Scalar_Range (T,
  3130.         Make_Range (Sloc (Mod_Expr),
  3131.           Low_Bound  =>
  3132.             Make_Integer_Literal (Sloc (Mod_Expr),
  3133.               Intval => Uint_0),
  3134.           High_Bound =>
  3135.             Make_Integer_Literal (Sloc (Mod_Expr),
  3136.               Intval => M_Val - 1)));
  3137.  
  3138.       Analyze (Low_Bound  (Scalar_Range (T)));
  3139.       Analyze (High_Bound (Scalar_Range (T)));
  3140.       Resolve (Low_Bound  (Scalar_Range (T)), T);
  3141.       Resolve (High_Bound (Scalar_Range (T)), T);
  3142.  
  3143.       --  Loop through powers of 2 to find number of bits required
  3144.  
  3145.       for Bits in Int range 1 .. System_Max_Binary_Modulus_Power loop
  3146.  
  3147.          --  Binary case
  3148.  
  3149.          if M_Val = 2 ** Bits then
  3150.             Set_Esize (T, UI_From_Int (Bits));
  3151.             return;
  3152.  
  3153.          --  Non-binary case
  3154.  
  3155.          elsif M_Val < 2 ** Bits then
  3156.             Set_Non_Binary_Modulus (T);
  3157.  
  3158.             if Bits > System_Max_Nonbinary_Modulus_Power then
  3159.                Error_Msg_Uint_1 :=
  3160.                  UI_From_Int (System_Max_Nonbinary_Modulus_Power);
  3161.                Error_Msg_N
  3162.                  ("nonbinary modulus exceeds limit (2'*'*^ - 1)", Mod_Expr);
  3163.                Set_Esize (T, UI_From_Int (System_Max_Binary_Modulus_Power));
  3164.                return;
  3165.  
  3166.             else
  3167.                --  In the non-binary case, we must have the actual size
  3168.                --  of the object be at least enough to hold the square
  3169.                --  of the modulus.
  3170.                --  This makes zero sense to me (RBKD) ???
  3171.  
  3172.                Set_Esize (T, UI_From_Int (Bits * 2));
  3173.                return;
  3174.             end if;
  3175.          end if;
  3176.  
  3177.       end loop;
  3178.  
  3179.       --  If we fall through, then the size exceed System.Max_Binary_Modulus
  3180.       --  so we just signal an error and set the maximum size.
  3181.  
  3182.       Error_Msg_Uint_1 := UI_From_Int (System_Max_Binary_Modulus_Power);
  3183.       Error_Msg_N ("modulus exceeds limit (2'*'*^)", Mod_Expr);
  3184.       Set_Esize (T, UI_From_Int (System_Max_Binary_Modulus_Power));
  3185.  
  3186.    end Modular_Type_Declaration;
  3187.  
  3188.    ----------------------------------
  3189.    -- Enumeration_Type_Declaration --
  3190.    ----------------------------------
  3191.  
  3192.    procedure Enumeration_Type_Declaration (T : Entity_Id; Def : Node_Id) is
  3193.       Ev             : Uint;
  3194.       L              : Node_Id;
  3195.       Int_Lit        : Node_Id;
  3196.       R_Node, B_Node : Node_Id;
  3197.       Table_Obj      : Entity_Id;
  3198.       Table_Type     : Entity_Id;
  3199.  
  3200.    begin
  3201.       --  Create identifier node representing lower bound
  3202.  
  3203.       B_Node := New_Node (N_Identifier, Sloc (Def));
  3204.       L := First (Literals (Def));
  3205.       Set_Chars (B_Node, Chars (L));
  3206.       Set_Entity (B_Node,  L);
  3207.       Set_Etype (B_Node, T);
  3208.       Set_Is_Static_Expression (B_Node, True);
  3209.  
  3210.       R_Node := New_Node (N_Range, Sloc (Def));
  3211.       Set_Low_Bound  (R_Node, B_Node);
  3212.  
  3213.       Set_Ekind (T, E_Enumeration_Type);
  3214.       Set_First_Literal (T, L);
  3215.       Set_Etype (T, T);
  3216.  
  3217.       Ev := Uint_0;
  3218.  
  3219.       --  Loop through literals of enumeration type setting pos and rep values
  3220.  
  3221.       while Present (L) loop
  3222.          Set_Ekind (L, E_Enumeration_Literal);
  3223.          Set_Etype (L, T);
  3224.          Set_Enumeration_Pos (L, Ev);
  3225.          Set_Enumeration_Rep (L, Ev);
  3226.          New_Overloaded_Entity (L);
  3227.  
  3228.          if Nkind (L) = N_Defining_Character_Literal then
  3229.             Set_Is_Character_Type (T, True);
  3230.          end if;
  3231.  
  3232.          Ev := Ev + 1;
  3233.          L := Next (L);
  3234.       end loop;
  3235.  
  3236.       --  Now create a node representing upper bound
  3237.  
  3238.       B_Node := New_Node (N_Identifier, Sloc (Def));
  3239.       Set_Chars (B_Node, Chars (Last (Literals (Def))));
  3240.       Set_Entity (B_Node,  Last (Literals (Def)));
  3241.       Set_Etype (B_Node, T);
  3242.       Set_Is_Static_Expression (B_Node, True);
  3243.  
  3244.       Set_High_Bound (R_Node, B_Node);
  3245.       Set_Scalar_Range (T, R_Node);
  3246.       Determine_Enum_Representation (T);
  3247.  
  3248.       --  Create two defining occurrences corresponding to a enumeration
  3249.       --  table containing the literal names and its type. This table is
  3250.       --  used in conjunction with calls to 'Image on enumeration values.
  3251.       --  This table is filled in by the back-end.
  3252.  
  3253.       Table_Obj :=
  3254.         Make_Defining_Identifier (Sloc (Def),
  3255.           Chars => New_External_Name (Chars (T), 'T'));
  3256.  
  3257.       Set_Is_Internal (Table_Obj);
  3258.       Append_Entity (Table_Obj, Current_Scope);
  3259.       Set_Current_Entity (Table_Obj);
  3260.  
  3261.       Table_Type := New_Itype (E_Enum_Table_Type, Parent (Def), T, 'T');
  3262.       Set_Has_Delayed_Freeze (Table_Type);
  3263.  
  3264.       Set_Etype         (Table_Obj, Table_Type);
  3265.       Set_Ekind         (Table_Obj, E_Variable);
  3266.       Set_Public_Status (Table_Obj);
  3267.  
  3268.       Set_Etype          (Table_Type, Table_Type);
  3269.       Set_Public_Status  (Table_Type);
  3270.       Set_Component_Type (Table_Type, Standard_A_String);
  3271.       Set_First_Index    (Table_Type,
  3272.         First (New_List (
  3273.           New_Occurrence_Of (Standard_Natural, Sloc (Def)))));
  3274.  
  3275.       Int_Lit := New_Node (N_Integer_Literal, Sloc (Def));
  3276.       Set_Intval (Int_Lit, Enumeration_Pos (Entity (Type_High_Bound (T))));
  3277.       Set_Etype  (Int_Lit, Standard_Integer);
  3278.       Set_Is_Static_Expression (Int_Lit, True);
  3279.  
  3280.       Set_Table_High_Bound (Table_Type, Int_Lit);
  3281.       Set_Lit_Name_Table (T, Table_Obj);
  3282.    end Enumeration_Type_Declaration;
  3283.  
  3284.    -----------------------------------
  3285.    -- Determine_Enum_Representation --
  3286.    -----------------------------------
  3287.  
  3288.    procedure Determine_Enum_Representation  (T : Entity_Id) is
  3289.       Lo : Uint;
  3290.       Hi : Uint;
  3291.       Sz : Nat;
  3292.  
  3293.    begin
  3294.       Lo := Enumeration_Rep (Entity (Type_Low_Bound (T)));
  3295.       Hi := Enumeration_Rep (Entity (Type_High_Bound (T)));
  3296.  
  3297.       if Lo < 0 then
  3298.          if Lo >= -Uint_2**07 and then Hi < Uint_2**07 then
  3299.             Sz := 8;
  3300.  
  3301.          elsif Lo >= -Uint_2**15 and then Hi < Uint_2**15 then
  3302.             Sz := 16;
  3303.  
  3304.          elsif Lo >= -Uint_2**31 and then Hi < Uint_2**31 then
  3305.             Sz := 32;
  3306.  
  3307.          elsif Lo >= -Uint_2**63 and then Hi < Uint_2**63 then
  3308.             Sz := 64;
  3309.  
  3310.          else
  3311.             pragma Assert (False); null;
  3312.          end if;
  3313.  
  3314.       else
  3315.          if Hi <= Uint_2**08 then
  3316.             Sz := 8;
  3317.  
  3318.          elsif Hi <= Uint_2**16 then
  3319.             Sz := 16;
  3320.  
  3321.          elsif Hi <= Uint_2**32 then
  3322.             Sz := 32;
  3323.  
  3324.          elsif Hi < Uint_2**63 then
  3325.             Sz := 64;
  3326.  
  3327.          else
  3328.             pragma Assert (False); null;
  3329.          end if;
  3330.       end if;
  3331.  
  3332.       Set_Esize (T, UI_From_Int (Sz));
  3333.    end Determine_Enum_Representation;
  3334.  
  3335.    ----------------------------
  3336.    -- Array_Type_Declaration --
  3337.    ----------------------------
  3338.  
  3339.    procedure Array_Type_Declaration (T : in out Entity_Id; Def : Node_Id) is
  3340.       Component_Def : constant Node_Id := Subtype_Indication (Def);
  3341.       Element_Type  : Entity_Id;
  3342.       Implicit_Base : Entity_Id;
  3343.       Index         : Node_Id;
  3344.       Related_Id    : Entity_Id := Empty;
  3345.       Nb_Index      : Nat;
  3346.       P             : constant Node_Id := Parent (Def);
  3347.       Priv          : Entity_Id;
  3348.  
  3349.    begin
  3350.       if Nkind (Def) = N_Constrained_Array_Definition then
  3351.  
  3352.          Index := First (Discrete_Subtype_Definitions (Def));
  3353.  
  3354.          --  Find proper names for the implicit types which may be public.
  3355.          --  in case of anonymous arrays we use the name of the first object
  3356.          --  of that type as prefix.
  3357.  
  3358.          if No (T) then
  3359.             Related_Id :=  Defining_Identifier (P);
  3360.          else
  3361.             Related_Id := T;
  3362.          end if;
  3363.  
  3364.       else
  3365.          Index := First (Subtype_Marks (Def));
  3366.       end if;
  3367.  
  3368.       Nb_Index := 1;
  3369.  
  3370.       while Present (Index) loop
  3371.          Analyze (Index);
  3372.          Make_Index (Index, P, Related_Id, Nb_Index);
  3373.          Index := Next_Index (Index);
  3374.          Nb_Index := Nb_Index + 1;
  3375.       end loop;
  3376.  
  3377.       Element_Type := Process_Subtype (Component_Def, P, Related_Id, 'C');
  3378.  
  3379.       --  Constrained array case
  3380.  
  3381.       if No (T) then
  3382.          T := New_Itype (E_Void, P, Related_Id, 'T');
  3383.       end if;
  3384.  
  3385.       if Nkind (Def) = N_Constrained_Array_Definition then
  3386.  
  3387.          --  Establish Implicit_Base as unconstrained base type
  3388.  
  3389.          Implicit_Base := New_Itype (E_Array_Type, P, Related_Id, 'B');
  3390.  
  3391.          Set_Esize (Implicit_Base, Uint_0);
  3392.          Set_Etype (Implicit_Base, Implicit_Base);
  3393.          Set_Scope (Implicit_Base, Current_Scope);
  3394.          Set_Has_Delayed_Freeze (Implicit_Base);
  3395.  
  3396.          --  The constrained array type is a subtype of the unconstrained one
  3397.  
  3398.          Set_Ekind (T, E_Array_Subtype);
  3399.          Set_Esize (T, Uint_0);
  3400.          Set_Etype (T, Implicit_Base);
  3401.          Set_Scope (T, Current_Scope);
  3402.          Set_Is_Constrained (T, True);
  3403.          Set_First_Index    (T, First (Discrete_Subtype_Definitions (Def)));
  3404.          Set_Has_Delayed_Freeze (T);
  3405.  
  3406.          --  Complete setup of implicit base type
  3407.  
  3408.          Set_First_Index    (Implicit_Base, First_Index (T));
  3409.          Set_Component_Type (Implicit_Base, Element_Type);
  3410.          Set_Has_Tasks      (Implicit_Base, Has_Tasks (Element_Type));
  3411.          Set_Has_Controlled (Implicit_Base,
  3412.            Has_Controlled (Element_Type) or else Is_Controlled (Element_Type));
  3413.  
  3414.       --  Unconstrained array case
  3415.  
  3416.       else
  3417.          Set_Ekind (T, E_Array_Type);
  3418.          Set_Esize (T, Uint_0);
  3419.          Set_Etype (T, T);
  3420.          Set_Scope (T, Current_Scope);
  3421.  
  3422.          Set_Is_Constrained     (T, False);
  3423.          Set_First_Index        (T, First (Subtype_Marks (Def)));
  3424.          Set_Has_Delayed_Freeze (T, True);
  3425.       end if;
  3426.  
  3427.       Set_Component_Type (T, Element_Type);
  3428.       Set_Has_Tasks      (T, Has_Tasks (Element_Type));
  3429.       Set_Has_Controlled (T,
  3430.         Has_Controlled (Element_Type) or else Is_Controlled (Element_Type));
  3431.  
  3432.       if Aliased_Present (Def) then
  3433.          Set_Is_Aliased (T);
  3434.          Set_Is_Aliased (Etype (T));
  3435.       end if;
  3436.  
  3437.       Priv := Private_Ancestor (Element_Type);
  3438.  
  3439.       if Present (Priv) then
  3440.          Append_Elmt (T, Private_Dependents (Priv));
  3441.       end if;
  3442.  
  3443.       if Number_Dimensions (T) = 1 then
  3444.          New_Binary_Operator (Name_Op_Concat, T);
  3445.       end if;
  3446.  
  3447.       --  In the case of an unconstrained array the parser has already
  3448.       --  verified that all the indices are unconstrained but we still
  3449.       --  need to make sure that the element type is constrained.
  3450.  
  3451.       if Is_Indefinite_Subtype (Element_Type) then
  3452.          Error_Msg_N
  3453.            ("unconstrained element type in array declaration ",
  3454.             Component_Def);
  3455.  
  3456.       elsif Is_Abstract (Element_Type) then
  3457.          Error_Msg_N ("The type of a component cannot be abstract ",
  3458.               Component_Def);
  3459.       end if;
  3460.  
  3461.    end Array_Type_Declaration;
  3462.  
  3463.    ----------------
  3464.    -- Make_Index --
  3465.    ----------------
  3466.  
  3467.    procedure Make_Index
  3468.      (I            : Node_Id;
  3469.       Related_Nod  : Node_Id;
  3470.       Related_Id   : Entity_Id := Empty;
  3471.       Suffix_Index : Nat := 1)
  3472.    is
  3473.       R      : Node_Id;
  3474.       T      : Entity_Id;
  3475.       Def_Id : Entity_Id;
  3476.  
  3477.    begin
  3478.       --  For a discrete range used in a constrained array definition and
  3479.       --  defined by a range, an implicit conversion to the predefined type
  3480.       --  INTEGER is assumed if each bound is either a numeric literal, a named
  3481.       --  number, or an attribute, and the type of both bounds (prior to the
  3482.       --  implicit conversion) is the type universal_integer. Otherwise, both
  3483.       --  bounds must be of the same discrete type, other than universal
  3484.       --  integer; this type must be determinable independently of the
  3485.       --  context, but using the fact that the type must be discrete and that
  3486.       --  both bounds must have the same type.
  3487.  
  3488.       --  Character literals also have a universal type in the absence of
  3489.       --  of additional context,  and are resolved to Standard_Character.
  3490.  
  3491.       if Nkind (I) = N_Range then
  3492.  
  3493.          --  The index is given by a range constraint. The bounds are known
  3494.          --  to be of a consistent type.
  3495.  
  3496.          if not Is_Overloaded (I) then
  3497.             T := Etype (I);
  3498.  
  3499.             --  If the bounds are universal, choose the specific predefined
  3500.             --  type.
  3501.  
  3502.             if T = Universal_Integer then
  3503.                T := Standard_Integer;
  3504.             elsif T = Any_Character then
  3505.                T := Standard_Character;
  3506.             end if;
  3507.  
  3508.          else
  3509.             T := Any_Type;
  3510.  
  3511.             declare
  3512.                Ind : Interp_Index;
  3513.                It  : Interp;
  3514.  
  3515.             begin
  3516.                Get_First_Interp (I, Ind, It);
  3517.  
  3518.                while Present (It.Typ) loop
  3519.                   if Is_Discrete_Type (It.Typ) then
  3520.                      T := It.Typ;
  3521.                      exit;
  3522.                   end if;
  3523.  
  3524.                   Get_Next_Interp (Ind, It);
  3525.                end loop;
  3526.  
  3527.                if T = Any_Type then
  3528.                   Error_Msg_N ("discrete type required for range", I);
  3529.                   Set_Etype (I, Any_Type);
  3530.                   return;
  3531.                end if;
  3532.             end;
  3533.          end if;
  3534.  
  3535.          R := I;
  3536.          Process_Range_Expr_In_Decl (R, T, Related_Nod);
  3537.  
  3538.       elsif Nkind (I) = N_Subtype_Indication then
  3539.  
  3540.          --  The index is given by a subtype with a range constraint.
  3541.  
  3542.          T :=  Base_Type (Entity (Subtype_Mark (I)));
  3543.          R := Range_Expression (Constraint (I));
  3544.          Resolve (R, T);
  3545.          Process_Range_Expr_In_Decl (R,
  3546.            Entity (Subtype_Mark (I)), Related_Nod);
  3547.  
  3548.       elsif Nkind (I) = N_Attribute_Reference then
  3549.  
  3550.          --  The parser guarantees that the attribute is a RANGE attribute
  3551.  
  3552.          Analyze (I);
  3553.          T := Etype (I);
  3554.          Resolve (I, T);
  3555.          R := I;
  3556.  
  3557.       --  If none of the above, must be a subtype. We convert this to a
  3558.       --  range attribute reference because in the case of declared first
  3559.       --  named subtypes, the types in the range reference can be different
  3560.       --  from the type of the entity. A range attribute normalizes the
  3561.       --  reference and obtains the correct types for the bounds.
  3562.       --  This transformation is in the nature of an expansion, is only
  3563.       --  done if expansion is active. In particular, it is not done on
  3564.       --  formal generic types,  because we need to retain the name of the
  3565.       --  original index for instantiation purposes.
  3566.  
  3567.       else
  3568.          if not Is_Entity_Name (I) or else not Is_Type (Entity (I)) then
  3569.             Error_Msg_N ("invalid subtype mark in discrete range ", I);
  3570.             Set_Etype (I, Any_Integer);
  3571.             return;
  3572.  
  3573.          elsif Expander_Active then
  3574.             Rewrite_Substitute_Tree (I,
  3575.               Make_Attribute_Reference (Sloc (I),
  3576.                 Attribute_Name => Name_Range,
  3577.                 Prefix         => Relocate_Node (I)));
  3578.  
  3579.             Analyze (I);
  3580.             T := Etype (I);
  3581.             Resolve (I, T);
  3582.             R := I;
  3583.  
  3584.          else
  3585.             --  Check that type is legal, nothing else to construct.
  3586.  
  3587.             if not Is_Discrete_Type (Etype (I)) then
  3588.                Error_Msg_N ("discrete type required for index", I);
  3589.             end if;
  3590.  
  3591.             return;
  3592.          end if;
  3593.       end if;
  3594.  
  3595.       if not Is_Discrete_Type (T) then
  3596.          Error_Msg_N ("discrete type required for range", I);
  3597.          Set_Etype (I, Any_Type);
  3598.          return;
  3599.  
  3600.       elsif T = Any_Type then
  3601.          Set_Etype (I, Any_Type);
  3602.          return;
  3603.       end if;
  3604.  
  3605.       Def_Id := New_Itype (E_Void, Related_Nod, Related_Id, 'X', Suffix_Index);
  3606.       Set_Etype (Def_Id, Base_Type (T));
  3607.  
  3608.       --  ??? what about modular types in the following situation
  3609.  
  3610.       if Is_Integer_Type (T) then
  3611.          Set_Ekind (Def_Id, E_Signed_Integer_Subtype);
  3612.       else
  3613.          Set_Ekind (Def_Id, E_Enumeration_Subtype);
  3614.          Set_Is_Character_Type (Def_Id, Is_Character_Type (T));
  3615.       end if;
  3616.  
  3617.       Set_Esize            (Def_Id, Esize (T));
  3618.       Set_Alignment_Clause (Def_Id, Alignment_Clause (T));
  3619.       Set_Scalar_Range     (Def_Id, R);
  3620.  
  3621.       Set_Etype (I, Def_Id);
  3622.    end Make_Index;
  3623.  
  3624.    ---------------------
  3625.    -- Constrain_Array --
  3626.    ---------------------
  3627.  
  3628.    procedure Constrain_Array
  3629.      (Def_Id      : in out Entity_Id;
  3630.       SI          : Node_Id;
  3631.       Related_Nod : Node_Id;
  3632.       Related_Id  : Entity_Id;
  3633.       Suffix      : Character)
  3634.    is
  3635.       C                     : constant Node_Id := Constraint (SI);
  3636.       Number_Of_Constraints : Nat := 0;
  3637.       Index                 : Node_Id;
  3638.       S, T                  : Entity_Id;
  3639.       Constraint_OK         : Boolean := True;
  3640.  
  3641.    begin
  3642.       T := Entity (Subtype_Mark (SI));
  3643.  
  3644.       if Ekind (T) in Access_Kind then
  3645.          T := Designated_Type (T);
  3646.       end if;
  3647.  
  3648.       --  If an index constraint follows a subtype mark in a subtype indication
  3649.       --  then the type or subtype denoted by the subtype mark must not already
  3650.       --  impose an index constraint. The subtype mark must denote either an
  3651.       --  unconstrained array type or an access type whose designated type
  3652.       --  is such an array type... (RM 3.6.1)
  3653.  
  3654.       if Is_Constrained (T) then
  3655.          Error_Msg_N
  3656.            ("array type is already constrained", Subtype_Mark (SI));
  3657.          Constraint_OK := False;
  3658.  
  3659.       else
  3660.          S := First (Constraints (C));
  3661.  
  3662.          while Present (S) loop
  3663.             Number_Of_Constraints := Number_Of_Constraints + 1;
  3664.             S := Next (S);
  3665.          end loop;
  3666.  
  3667.          --  In either case, the index constraint must provide a discrete
  3668.          --  range for each index of the array type and the type of each
  3669.          --  discrete range must be the same as that of the corresponding
  3670.          --  index. (RM 3.6.1)
  3671.  
  3672.          if Number_Of_Constraints /= Number_Dimensions (T) then
  3673.             Error_Msg_NE ("incorrect number of index constraints for }", C, T);
  3674.             Constraint_OK := False;
  3675.  
  3676.          else
  3677.             S := First (Constraints (C));
  3678.             Index := First_Index (T);
  3679.             Analyze (Index);
  3680.  
  3681.             --  Apply constraints to each index type
  3682.  
  3683.             for J in 1 .. Number_Of_Constraints loop
  3684.                Constrain_Index (Index, S, Related_Nod, Related_Id, Suffix, J);
  3685.                Index := Next (Index);
  3686.                S := Next (S);
  3687.             end loop;
  3688.  
  3689.          end if;
  3690.       end if;
  3691.  
  3692.       if No (Def_Id) then
  3693.          Def_Id :=
  3694.            New_Itype (E_Array_Subtype, Related_Nod, Related_Id, Suffix);
  3695.       else
  3696.          Set_Ekind (Def_Id, E_Array_Subtype);
  3697.       end if;
  3698.  
  3699.       Set_Esize              (Def_Id, Esize (T));
  3700.       Set_Alignment_Clause   (Def_Id, Alignment_Clause (T));
  3701.       Set_Etype              (Def_Id, Base_Type (T));
  3702.  
  3703.       if Constraint_OK then
  3704.          Set_First_Index     (Def_Id, First (Constraints (C)));
  3705.       end if;
  3706.  
  3707.       Set_Component_Type     (Def_Id, Component_Type (T));
  3708.       Set_Has_Tasks          (Def_Id, Has_Tasks (T));
  3709.       Set_Has_Controlled     (Def_Id, Has_Controlled (T));
  3710.       Set_Is_Constrained     (Def_Id, True);
  3711.       Set_Is_Aliased         (Def_Id, Is_Aliased (T));
  3712.       Set_Is_Packed          (Def_Id, Is_Packed (T));
  3713.       Set_Depends_On_Private (Def_Id, Has_Private_Component (Def_Id));
  3714.  
  3715.       --  We always need a freeze node for a packed array subtype, so that
  3716.       --  we can build the Packed_Array_Type corresponding to the subtype.
  3717.  
  3718.       if Is_Packed (Def_Id) then
  3719.          Set_Has_Delayed_Freeze (Def_Id, True);
  3720.       end if;
  3721.  
  3722.       --  If the subtype is not that of a record component, build a freeze
  3723.       --  node if parent still needs one.
  3724.  
  3725.       if not Is_Type (Scope (Def_Id)) then
  3726.          Set_Depends_On_Private (Def_Id, Depends_On_Private (T));
  3727.          Conditional_Delay (Def_Id, T);
  3728.       end if;
  3729.  
  3730.    end Constrain_Array;
  3731.  
  3732.    --------------------------
  3733.    -- Constrain_Concurrent --
  3734.    --------------------------
  3735.  
  3736.    --  For concurrent types, the associated record value type carries the same
  3737.    --  discriminants, so when we constrain a concurrent type, we must constrain
  3738.    --  the value type as well.
  3739.  
  3740.    procedure Constrain_Concurrent
  3741.      (Def_Id      : in out Entity_Id;
  3742.       SI          : Node_Id;
  3743.       Related_Nod : Node_Id;
  3744.       Related_Id  : Entity_Id;
  3745.       Suffix      : Character)
  3746.    is
  3747.       T_Ent : constant Entity_Id := Entity (Subtype_Mark (SI));
  3748.       T_Val : constant Entity_Id := Corresponding_Record_Type (T_Ent);
  3749.       T_Sub : Entity_Id;
  3750.  
  3751.    begin
  3752.       if Present (T_Val) then
  3753.  
  3754.          if No (Def_Id) then
  3755.             Def_Id := New_Itype (E_Void, Related_Nod, Related_Id, Suffix);
  3756.          end if;
  3757.  
  3758.          Constrain_Discriminated_Type  (Def_Id, SI, Related_Nod);
  3759.          T_Sub := New_Itype (E_Record_Subtype, Related_Nod, Related_Id, 'V');
  3760.  
  3761.          Set_Depends_On_Private (Def_Id, Has_Private_Component (Def_Id));
  3762.          Set_Corresponding_Record_Type (Def_Id, T_Sub);
  3763.  
  3764.          Set_Etype                   (T_Sub, T_Val);
  3765.          Set_Esize                   (T_Sub, Uint_0);
  3766.          Set_Has_Discriminants       (T_Sub, True);
  3767.          Set_Is_Constrained          (T_Sub, True);
  3768.          Set_First_Entity            (T_Sub, First_Entity (T_Val));
  3769.          Set_Last_Entity             (T_Sub, Last_Entity (T_Val));
  3770.  
  3771.          if Has_Discriminants (Def_Id) then -- False only if errors.
  3772.             Set_Discriminant_Constraint (T_Sub,
  3773.                                          Discriminant_Constraint (Def_Id));
  3774.          end if;
  3775.  
  3776.          Set_Depends_On_Private      (T_Sub, Has_Private_Component (T_Sub));
  3777.  
  3778.       else
  3779.          --  If there is no associated record, expansion is disabled and this
  3780.          --  is a generic context. Create a subtype in any case, so that
  3781.          --  semantic analysis can proceed.
  3782.  
  3783.          if No (Def_Id) then
  3784.             Def_Id := New_Itype (E_Void, Related_Nod, Related_Id, Suffix);
  3785.          end if;
  3786.  
  3787.          Constrain_Discriminated_Type  (Def_Id, SI, Related_Nod);
  3788.       end if;
  3789.    end Constrain_Concurrent;
  3790.  
  3791.    ---------------------
  3792.    -- Constrain_Index --
  3793.    ---------------------
  3794.  
  3795.    procedure Constrain_Index
  3796.      (Index        : Node_Id;
  3797.       S            : Node_Id;
  3798.       Related_Nod  : Node_Id;
  3799.       Related_Id   : Entity_Id;
  3800.       Suffix       : Character;
  3801.       Suffix_Index : Nat)
  3802.    is
  3803.       Def_Id : Entity_Id;
  3804.       R      : Node_Id;
  3805.       T      : constant Entity_Id := Etype (Index);
  3806.  
  3807.    begin
  3808.       if Nkind (S) = N_Range
  3809.         or else Nkind (S) = N_Attribute_Reference
  3810.       then
  3811.          --  A Range attribute will transformed into N_Range by Resolve.
  3812.  
  3813.          Analyze (S);
  3814.          Set_Etype (S, T);
  3815.          R := S;
  3816.          Process_Range_Expr_In_Decl (R, T, Related_Nod);
  3817.  
  3818.          if Nkind (S) /= N_Range
  3819.            or else Base_Type (T) /= Base_Type (Etype (Low_Bound (S)))
  3820.            or else Base_Type (T) /= Base_Type (Etype (High_Bound (S)))
  3821.          then
  3822.             Error_Msg_N ("range expected", S);
  3823.          end if;
  3824.  
  3825.       elsif Nkind (S) = N_Subtype_Indication then
  3826.          Resolve_Discrete_Subtype_Indication (S, T);
  3827.  
  3828.          --  Make sure constraint is of the right kind.
  3829.  
  3830.          if Nkind (Constraint (S)) = N_Range_Constraint then
  3831.             R := Range_Expression (Constraint (S));
  3832.          end if;
  3833.  
  3834.       --  Subtype_Mark case, no anonymous subtypes to construct
  3835.  
  3836.       else
  3837.          Analyze (S);
  3838.          if Is_Entity_Name (S) then
  3839.  
  3840.             if not Is_Type (Entity (S))
  3841.               or else Base_Type (Entity (S)) /= Base_Type (T)
  3842.             then
  3843.                Error_Msg_N ("range expected", S);
  3844.             end if;
  3845.  
  3846.             return;
  3847.  
  3848.          else
  3849.             Error_Msg_N ("invalid index constraint", S);
  3850.             return;
  3851.          end if;
  3852.       end if;
  3853.  
  3854.       Def_Id :=
  3855.         New_Itype (E_Void, Related_Nod, Related_Id, Suffix, Suffix_Index);
  3856.  
  3857.       Set_Etype (Def_Id, Base_Type (T));
  3858.  
  3859.       --  What about modular types in the following test ???
  3860.  
  3861.       if Is_Integer_Type (T) then
  3862.          Set_Ekind (Def_Id, E_Signed_Integer_Subtype);
  3863.       else
  3864.          Set_Ekind (Def_Id, E_Enumeration_Subtype);
  3865.          Set_Is_Character_Type (Def_Id, Is_Character_Type (T));
  3866.       end if;
  3867.  
  3868.       Set_Esize            (Def_Id, Esize (T));
  3869.       Set_Alignment_Clause (Def_Id, Alignment_Clause (T));
  3870.       Set_Scalar_Range     (Def_Id, R);
  3871.  
  3872.       Set_Etype (S, Def_Id);
  3873.    end Constrain_Index;
  3874.  
  3875.    ------------------------------------
  3876.    -- Check_Or_Process_Discriminants --
  3877.    ------------------------------------
  3878.  
  3879.    --  If an incomplete or private type declaration was already given for
  3880.    --  the type, the discriminants may have already been processed if they
  3881.    --  were present on the incomplete declaration. In this case a full
  3882.    --  conformance check is performed otherwise just process them.
  3883.  
  3884.    procedure Check_Or_Process_Discriminants (N : Node_Id; T : Entity_Id) is
  3885.    begin
  3886.       if Has_Discriminants (T) then
  3887.  
  3888.          --  ??? conformance checks not implemented
  3889.  
  3890.          null;
  3891.  
  3892.          --  Make the discriminants visible to component declarations.
  3893.  
  3894.          declare
  3895.             D    : Entity_Id := First_Discriminant (T);
  3896.             Prev : Entity_Id;
  3897.  
  3898.          begin
  3899.             while Present (D) loop
  3900.                Prev := Current_Entity (D);
  3901.                Set_Current_Entity (D);
  3902.                Set_Is_Immediately_Visible (D);
  3903.                Set_Homonym (D, Prev);
  3904.                D := Next_Discriminant (D);
  3905.             end loop;
  3906.          end;
  3907.  
  3908.       else
  3909.          if Present (Discriminant_Specifications (N)) then
  3910.             Process_Discriminants (N);
  3911.          end if;
  3912.       end if;
  3913.    end Check_Or_Process_Discriminants;
  3914.  
  3915.    -----------------------------
  3916.    -- Record_Type_Declaration --
  3917.    -----------------------------
  3918.  
  3919.    procedure Record_Type_Declaration (T : Entity_Id; N : Node_Id) is
  3920.       Def : constant Node_Id := Type_Definition (N);
  3921.  
  3922.    begin
  3923.       --  Records constitute a scope for the component declarations within.
  3924.       --  The scope is created prior to the processing of these declarations.
  3925.       --  Discriminants are processed first, so that they are visible when
  3926.       --  processing the other components. The Ekind of the record type itself
  3927.       --  is set to E_Record_Type (subtypes appear as E_Record_Subtype).
  3928.       --  If an incomplete or private type declaration was already given for
  3929.       --  the type, then this scope already exists, and the discriminants have
  3930.       --  been declared within. We must verify that the full declaration
  3931.       --  matches the incomplete one.
  3932.  
  3933.       New_Scope (T); -- Enter record scope
  3934.       Set_Is_Limited_Record (T, Limited_Present (Def));
  3935.  
  3936.       Check_Or_Process_Discriminants (N, T);
  3937.  
  3938.       Set_Ekind              (T, E_Record_Type);
  3939.       Set_Etype              (T, T);
  3940.       Set_Esize              (T, Uint_0);
  3941.       Set_Is_Constrained     (T, not Has_Discriminants (T));
  3942.       Set_Has_Delayed_Freeze (T, True);
  3943.  
  3944.       Record_Type_Definition (Def, T);
  3945.  
  3946.       --  Exit from record scope
  3947.  
  3948.       End_Scope;
  3949.  
  3950.    end Record_Type_Declaration;
  3951.  
  3952.    ------------------------------------
  3953.    -- Tagged_Record_Type_Declaration --
  3954.    ------------------------------------
  3955.  
  3956.    procedure Tagged_Record_Type_Declaration (T : Entity_Id; N : Node_Id) is
  3957.       Def      : constant Node_Id := Type_Definition (N);
  3958.       Tag_Comp : Entity_Id;
  3959.  
  3960.    begin
  3961.  
  3962.       New_Scope (T); -- Enter record scope
  3963.  
  3964.       Set_Is_Tagged_Type (T);
  3965.       Set_Is_Limited_Record (T, Limited_Present (Def));
  3966.  
  3967.       --  Type is abstract if full declaration carries keyword, or if
  3968.       --  previous partial view did.
  3969.  
  3970.       Set_Is_Abstract (T, Is_Abstract (T) or else Abstract_Present (Def));
  3971.       Check_Or_Process_Discriminants (N, T);
  3972.       Set_Ekind              (T, E_Record_Type);
  3973.       Set_Etype              (T, T);
  3974.       Set_Esize              (T, Uint_0);
  3975.       Set_Is_Constrained     (T, not Has_Discriminants (T));
  3976.       Set_Has_Delayed_Freeze (T, True);
  3977.  
  3978.       --  Add a manually analyzed component corresponding to the component
  3979.       --  _tag, the corresponding piece of tree will be expanded as part of
  3980.       --  the freezing actions if it is not a CPP_Class
  3981.  
  3982.       Tag_Comp := Make_Defining_Identifier (Sloc (Def), Name_uTag);
  3983.       Enter_Name (Tag_Comp);
  3984.       Set_Is_Tag (Tag_Comp);
  3985.       Set_Ekind (Tag_Comp, E_Component);
  3986.       Set_DT_Entry_Count (Tag_Comp, No_Uint);
  3987.       Set_Etype (Tag_Comp, RTE (RE_Tag));
  3988.       Set_Original_Record_Component (Tag_Comp, Tag_Comp);
  3989.  
  3990.       Record_Type_Definition (Def, T);
  3991.  
  3992.       Make_Class_Wide_Type (T);
  3993.       Set_Primitive_Operations (T, New_Elmt_List);
  3994.  
  3995.       if Has_Discriminants (T)
  3996.         and then Present (Discriminant_Default_Value (First_Discriminant (T)))
  3997.       then
  3998.          Error_Msg_N ("discriminants of tagged type cannot have defaults", N);
  3999.       end if;
  4000.  
  4001.       End_Scope; -- Exit record scope
  4002.    end Tagged_Record_Type_Declaration;
  4003.  
  4004.    ---------------------------
  4005.    -- Process_Discriminants --
  4006.    ---------------------------
  4007.  
  4008.    procedure Process_Discriminants (N : Node_Id) is
  4009.       Id                  : Node_Id;
  4010.       Discr               : Node_Id;
  4011.       Discr_Type          : Entity_Id;
  4012.       Default_Present     : Boolean := False;
  4013.       Default_Not_Present : Boolean := False;
  4014.       D_Minal             : Entity_Id;
  4015.       Elist               : Elist_Id;
  4016.  
  4017.    begin
  4018.       --  A composite type other than an array type can have discriminants.
  4019.       --  Discriminants of non-limited types must have a discrete type.
  4020.       --  On entry, the current scope is the composite type.
  4021.  
  4022.       --  The discriminants are initially entered into the scope of the type
  4023.       --  via Enter_Name with the default Ekind of E_Void to prevent premature
  4024.       --  use, as explained at the end of this procedure.
  4025.  
  4026.       Elist := New_Elmt_List;
  4027.  
  4028.       Discr := First (Discriminant_Specifications (N));
  4029.       while Present (Discr) loop
  4030.          Enter_Name (Defining_Identifier (Discr));
  4031.  
  4032.          if Nkind (Discriminant_Type (Discr)) = N_Access_Definition then
  4033.             Discr_Type := Access_Definition (N, Discriminant_Type (Discr));
  4034.  
  4035.          else
  4036.             Analyze (Discriminant_Type (Discr));
  4037.             Discr_Type := Etype (Discriminant_Type (Discr));
  4038.          end if;
  4039.  
  4040.          if Is_Access_Type (Discr_Type) then
  4041.             Note_Feature (Access_Discriminants, Sloc (Discr));
  4042.  
  4043.             --  A discriminant_specification for an access discriminant
  4044.             --  shall appear only in the declaration for a task or protected
  4045.             --  type, or for a type with the reserved word 'limited' in
  4046.             --  its definition or in one of its ancestors. (RM 3.7(10))
  4047.  
  4048.             if Nkind (Discriminant_Type (Discr)) = N_Access_Definition
  4049.               and then not Is_Concurrent_Type (Current_Scope)
  4050.               and then not Is_Concurrent_Record_Type (Current_Scope)
  4051.               and then not Is_Limited_Record (Current_Scope)
  4052.               and then Ekind (Current_Scope) /= E_Limited_Private_Type
  4053.             then
  4054.                Error_Msg_N
  4055.                  ("access discriminants allowed only for limited types",
  4056.                   Discriminant_Type (Discr));
  4057.             end if;
  4058.  
  4059.             if Ada_83 and then Comes_From_Source (Discr) then
  4060.                Error_Msg_N
  4061.                  ("(Ada 83) access discriminant not allowed", Discr);
  4062.             end if;
  4063.  
  4064.          elsif not Is_Discrete_Type (Discr_Type) then
  4065.             Error_Msg_N ("discriminants must have a discrete or access type",
  4066.               Discriminant_Type (Discr));
  4067.          end if;
  4068.  
  4069.          Set_Etype (Defining_Identifier (Discr), Discr_Type);
  4070.  
  4071.          --  If a discriminant specification includes the assignment compound
  4072.          --  delimiter followed by an expression, the expression is the default
  4073.          --  expression of the discriminant; the default expression must be of
  4074.          --  the type of the discriminant. (RM 3.7.1) Since this expression is
  4075.          --  a default expression, we do the special preanalysis, since this
  4076.          --  expression does not freeze (see "Handling of Default Expressions"
  4077.          --  in spec of package Sem).
  4078.  
  4079.          if Present (Expression (Discr)) then
  4080.  
  4081.             --  For now don't do this because we don't yet properly analyze
  4082.             --  the default expression later ???
  4083.  
  4084.             --   In_Default_Expression := True;
  4085.  
  4086.             Analyze (Expression (Discr));
  4087.             In_Default_Expression := False;
  4088.             Resolve (Expression (Discr), Discr_Type);
  4089.             Default_Present := True;
  4090.             Append_Elmt (Expression (Discr), Elist);
  4091.  
  4092.             --  Tag the defining identifiers for the discriminants with their
  4093.             --  corresponding default expressions from the tree.
  4094.  
  4095.             Set_Discriminant_Default_Value
  4096.               (Defining_Identifier (Discr), Expression (Discr));
  4097.  
  4098.          else
  4099.             Default_Not_Present := True;
  4100.          end if;
  4101.  
  4102.          Discr := Next (Discr);
  4103.       end loop;
  4104.  
  4105.       --  An element list consisting of the default expressions of the
  4106.       --  discriminants is constructed in the above loop and used to set
  4107.       --  the Discriminant_Constraint attribute for the type. If an object
  4108.       --  is declared of this (record or task) type without any explicit
  4109.       --  discriminant constraint given, this element list will form the
  4110.       --  actual parameters for the corresponding initialization procedure
  4111.       --  for the type.
  4112.  
  4113.       Set_Discriminant_Constraint (Current_Scope, Elist);
  4114.  
  4115.       --  Default expressions must be provided either for all or for none
  4116.       --  of the discriminants of a discriminant part. (RM 3.7.1)
  4117.  
  4118.       if Default_Present then
  4119.          if Nkind (N) = N_Formal_Type_Declaration then
  4120.             Error_Msg_N
  4121.               ("discriminant defaults not allowed for formal type", N);
  4122.  
  4123.          elsif Default_Not_Present then
  4124.             Error_Msg_N
  4125.               ("incomplete specification of defaults for discriminants", N);
  4126.          end if;
  4127.       end if;
  4128.  
  4129.       --  The use of the name of a discriminant is not allowed in default
  4130.       --  expressions of a discriminant part if the specification of the
  4131.       --  discriminant is itself given in the discriminant part. (RM 3.7.1)
  4132.  
  4133.       --  To detect this, the discriminant names are entered initially with an
  4134.       --  Ekind of E_Void (which is the default Ekind given by Enter_Name). Any
  4135.       --  attempt to use a void entity (for example in an expression that is
  4136.       --  type-checked) produces the error message: premature usage.  Now after
  4137.       --  completing the semantic analysis of the discriminant part, we can set
  4138.       --  the Ekind of all the discriminants appropriately.
  4139.  
  4140.       Discr := First (Discriminant_Specifications (N));
  4141.  
  4142.       while Present (Discr) loop
  4143.          Id := Defining_Identifier (Discr);
  4144.          Set_Ekind (Id, E_Discriminant);
  4145.  
  4146.          --  Initialize the Original_Record_Component to the entity itself
  4147.          --  the New_Copy call in Build_Derived_Type will automatically
  4148.          --  propagate the right value to descendants
  4149.  
  4150.          Set_Original_Record_Component (Id, Id);
  4151.  
  4152.          --  Create discriminal, that is to say the associated entity
  4153.          --  to be used in initialization procedures for the type,
  4154.          --  in which a discriminal is a formal parameter whose actual
  4155.          --  is the value of the corresponding discriminant constraint.
  4156.          --  Discriminals are not used during semantic analysis, and are
  4157.          --  not fully defined entities until expansion. Thus they are not
  4158.          --  given a scope until intialization procedures are built.
  4159.  
  4160.          --  The discriminals have the same names as the discriminants
  4161.  
  4162.          D_Minal := Make_Defining_Identifier (Sloc (N), Chars (Id));
  4163.          Set_Ekind (D_Minal, E_In_Parameter);
  4164.          Set_Etype (D_Minal, Etype (Id));
  4165.          Set_Discriminal (Id, D_Minal);
  4166.  
  4167.          Discr := Next (Discr);
  4168.       end loop;
  4169.  
  4170.       Set_Has_Discriminants (Current_Scope);
  4171.    end Process_Discriminants;
  4172.  
  4173.    --------------------------------
  4174.    -- Discriminant_Redeclaration --
  4175.    --------------------------------
  4176.  
  4177.    procedure Discriminant_Redeclaration (T : Entity_Id; D_List : List_Id) is
  4178.    begin
  4179.       null; -- For now ???
  4180.    end Discriminant_Redeclaration;
  4181.  
  4182.    ----------------------------
  4183.    -- Record_Type_Definition --
  4184.    ----------------------------
  4185.  
  4186.    procedure Record_Type_Definition (Def : Node_Id; T : Entity_Id) is
  4187.       Component : Entity_Id;
  4188.  
  4189.    begin
  4190.       --  If the component list of a record type is defined by the reserved
  4191.       --  word null and there is no discriminant part, then the record type has
  4192.       --  no components and all records of the type are null records (RM 3.7)
  4193.       --  This procedure is also called to process the extension part of a
  4194.       --  record extension, in which case the current scope may have inherited
  4195.       --  components.
  4196.  
  4197.       if No (Component_List (Def))
  4198.         or else Null_Present (Component_List (Def))
  4199.       then
  4200.          null;
  4201.  
  4202.       else
  4203.          Analyze_Declarations (Component_Items (Component_List (Def)));
  4204.  
  4205.          if Present (Variant_Part (Component_List (Def))) then
  4206.             Analyze (Variant_Part (Component_List (Def)));
  4207.          end if;
  4208.       end if;
  4209.  
  4210.       --  After completing the semantic analysis of the record definition,
  4211.       --  record components, both new and inherited, are accessible. Set
  4212.       --  their kind accordingly.
  4213.  
  4214.       Component := First_Entity (Current_Scope);
  4215.       while Present (Component) loop
  4216.          if Ekind (Component) = E_Void then
  4217.             Set_Ekind (Component, E_Component);
  4218.          end if;
  4219.  
  4220.          if Has_Tasks (Etype (Component)) then
  4221.             Set_Has_Tasks (T, True);
  4222.          end if;
  4223.  
  4224.          if Has_Controlled (Etype (Component))
  4225.            or else (Chars (Component) /= Name_uParent
  4226.                     and then Is_Controlled (Etype (Component)))
  4227.          then
  4228.             Note_Feature (Controlled_Types, Sloc (T));
  4229.             Set_Has_Controlled (T, True);
  4230.          end if;
  4231.  
  4232.          Component := Next_Entity (Component);
  4233.       end loop;
  4234.    end Record_Type_Definition;
  4235.  
  4236.    -----------------------------------
  4237.    -- Analyze_Component_Declaration --
  4238.    -----------------------------------
  4239.  
  4240.    procedure Analyze_Component_Declaration (N : Node_Id) is
  4241.       Id : constant Entity_Id := Defining_Identifier (N);
  4242.       T  : Entity_Id;
  4243.       P  : Entity_Id;
  4244.  
  4245.    begin
  4246.       Enter_Name (Defining_Identifier (N));
  4247.       T := Find_Type_Of_Object (Subtype_Indication (N), N);
  4248.  
  4249.       --  If the component declaration includes a default expression, then we
  4250.       --  check that the component is not of a limited type (RM 3.7(5)),
  4251.       --  and do the special preanalysis of the expression (see section on
  4252.       --  "Handling of Default Expressions" in the spec of package Sem).
  4253.  
  4254.       if Present (Expression (N)) then
  4255.          Analyze_Default_Expression (Expression (N), T);
  4256.          Check_Initialization (T, Expression (N));
  4257.       end if;
  4258.  
  4259.       if Is_Indefinite_Subtype (T) then
  4260.          Error_Msg_N
  4261.            ("unconstrained subtype in component declaration",
  4262.             Subtype_Indication (N));
  4263.  
  4264.       --  Components cannot be abstract, except for the special case of
  4265.       --  the _Parent field (case of extending an abstract tagged type)
  4266.  
  4267.       elsif Is_Abstract (T) and then Chars (Id) /= Name_uParent then
  4268.          Error_Msg_N ("type of a component cannot be abstract", N);
  4269.       end if;
  4270.  
  4271.       Set_Etype (Id, T);
  4272.       Set_Is_Aliased (Id, Aliased_Present (N));
  4273.  
  4274.       --  If the this component is private (or depends on a private type),
  4275.       --  add the record type to private dependents of its ancestor type.
  4276.  
  4277.       P := Private_Ancestor (T);
  4278.  
  4279.       if Present (P) then
  4280.          Append_Elmt (Current_Scope, Private_Dependents (P));
  4281.       end if;
  4282.  
  4283.       if Is_Limited_Type (T)
  4284.         and then Chars (Id) /= Name_uParent
  4285.         and then Is_Tagged_Type (Current_Scope)
  4286.         and then Is_Derived_Type (Current_Scope)
  4287.         and then not Is_Limited_Record (Root_Type (Current_Scope))
  4288.       then
  4289.          Error_Msg_N
  4290.            ("extension of non limited type cannot have limited components", N);
  4291.       end if;
  4292.  
  4293.       --  Initialize the Original_Record_Component to the entity itself
  4294.       --  the New_Copy call in Build_Derived_Type will automatically
  4295.       --  propagate the right value to descendants
  4296.  
  4297.       Set_Original_Record_Component (Id, Id);
  4298.    end Analyze_Component_Declaration;
  4299.  
  4300.    ---------------------------
  4301.    -- Analyze_Others_Choice --
  4302.    ---------------------------
  4303.  
  4304.    --  Nothing to do for the others choice node itself, the semantic analysis
  4305.    --  of the others choice will occur as part of the processing of the parent
  4306.  
  4307.    procedure Analyze_Others_Choice (N : Node_Id) is
  4308.    begin
  4309.       null;
  4310.    end Analyze_Others_Choice;
  4311.  
  4312.    --------------------------
  4313.    -- Analyze_Variant_Part --
  4314.    --------------------------
  4315.  
  4316.    procedure Analyze_Variant_Part (N : Node_Id) is
  4317.       Case_Table     : Case_Table_Type (1 .. Number_Of_Case_Choices (N));
  4318.       Choice         : Node_Id;
  4319.       Choice_Count   : Nat := 0;
  4320.       Discr_Name     : Node_Id;
  4321.       Discr_Type     : Entity_Id;
  4322.       Discr_Btype    : Entity_Id;
  4323.       E              : Entity_Id;
  4324.       Lo             : Node_Id;
  4325.       Hi             : Node_Id;
  4326.       Exp_Lo         : Uint;
  4327.       Exp_Hi         : Uint;
  4328.       Invalid_Case   : Boolean := False;
  4329.       Kind           : Node_Kind;
  4330.       Others_Present : Boolean := False;
  4331.       Variant        : Node_Id;
  4332.  
  4333.       procedure Check_Choice (Lo, Hi : Node_Id; Choice : Node_Id);
  4334.       --  Check_Choice checks whether the given bounds of a choice are
  4335.       --  static and valid for the range of the discrete subtype. If not,
  4336.       --  a message is issued, otherwise the bounds are entered into
  4337.       --  the case table.
  4338.  
  4339.       procedure Check_Choice (Lo, Hi : Node_Id; Choice : Node_Id) is
  4340.       begin
  4341.          --  The simple expressions and discrete ranges given as choices
  4342.          --  in a variant part must be static (RM 3.7.3).
  4343.  
  4344.          if not Is_Static_Expression (Lo)
  4345.            or else not Is_Static_Expression (Hi)
  4346.          then
  4347.             Error_Msg_N
  4348.               ("choice given in variant part is not static", Choice);
  4349.             Invalid_Case := True;
  4350.             return;
  4351.          end if;
  4352.  
  4353.          if Choice_In_Range (Lo, Hi, Exp_Lo, Exp_Hi, Discr_Btype) then
  4354.             Choice_Count := Choice_Count + 1;
  4355.             Case_Table (Choice_Count).Choice_Lo := Lo;
  4356.             Case_Table (Choice_Count).Choice_Hi := Hi;
  4357.             Case_Table (Choice_Count).Choice_Node := Choice;
  4358.          end if;
  4359.       end Check_Choice;
  4360.  
  4361.    --  Start of processing for Analyze_Variant_Part
  4362.  
  4363.    begin
  4364.       Discr_Name := Name (N);
  4365.       Analyze (Discr_Name);
  4366.  
  4367.       if Ekind (Entity (Discr_Name)) /= E_Discriminant then
  4368.          Error_Msg_N ("invalid discriminant name in variant part", Discr_Name);
  4369.       end if;
  4370.  
  4371.       Discr_Type := Etype (Entity (Discr_Name));
  4372.       Discr_Btype := Base_Type (Discr_Type);
  4373.  
  4374.       --  The type of the discriminant of a variant part must not be a
  4375.       --  generic formal type (RM 3.7.3).
  4376.  
  4377.       if Is_Generic_Type (Discr_Type) then
  4378.          Error_Msg_N
  4379.            ("discriminant of variant part cannot be generic", Discr_Name);
  4380.          return;
  4381.       end if;
  4382.  
  4383.       if Is_OK_Static_Subtype (Discr_Type) then
  4384.          Exp_Lo := Expr_Value (Type_Low_Bound (Discr_Type));
  4385.          Exp_Hi := Expr_Value (Type_High_Bound (Discr_Type));
  4386.  
  4387.       else
  4388.          Exp_Lo := Expr_Value (Type_Low_Bound (Discr_Btype));
  4389.          Exp_Hi := Expr_Value (Type_High_Bound (Discr_Btype));
  4390.       end if;
  4391.  
  4392.       --  Now check each of the case choices against Exp_Base_Type.
  4393.  
  4394.       Variant := First (Variants (N));
  4395.  
  4396.       while Present (Variant) loop
  4397.          Choice := First (Discrete_Choices (Variant));
  4398.  
  4399.          while Present (Choice) loop
  4400.             Analyze (Choice);
  4401.             Kind := Nkind (Choice);
  4402.  
  4403.             if Kind = N_Range then
  4404.                Resolve (Choice, Discr_Type);
  4405.                Check_Choice (Low_Bound (Choice), High_Bound (Choice), Choice);
  4406.  
  4407.             elsif Is_Entity_Name (Choice)
  4408.               and then Is_Type (Entity (Choice))
  4409.             then
  4410.                E  := Entity (Choice);
  4411.                Lo := Type_Low_Bound (E);
  4412.                Hi := Type_High_Bound (E);
  4413.                Check_Choice (Lo, Hi, Choice);
  4414.  
  4415.             elsif Kind = N_Subtype_Indication then
  4416.                pragma Assert (False); null;        -- for now ???
  4417.  
  4418.             --  The choice others is only allowed for the last variant and as
  4419.             --  its only choice; it stands for all values (possibly none) not
  4420.             --  given in the choices of previous variants (RM 3.7.3).
  4421.  
  4422.             elsif Kind = N_Others_Choice then
  4423.                if not (Choice = First (Discrete_Choices (Variant))
  4424.                  and then Choice = Last (Discrete_Choices (Variant))
  4425.                  and then Variant = Last (Variants (N)))
  4426.                then
  4427.                   Error_Msg_N
  4428.                     ("the choice OTHERS must appear alone and last", Choice);
  4429.                   return;
  4430.                end if;
  4431.  
  4432.                Others_Present := True;
  4433.  
  4434.             else
  4435.                --  Must be an expression
  4436.  
  4437.                Resolve (Choice, Discr_Type);
  4438.                Check_Choice (Choice, Choice, Choice);
  4439.             end if;
  4440.  
  4441.             Choice := Next (Choice);
  4442.          end loop;
  4443.  
  4444.          if not Null_Present (Component_List (Variant)) then
  4445.             Analyze_Declarations (Component_Items (Component_List (Variant)));
  4446.  
  4447.             if Present (Variant_Part (Component_List (Variant))) then
  4448.                Analyze (Variant_Part (Component_List (Variant)));
  4449.             end if;
  4450.          end if;
  4451.  
  4452.          Variant := Next (Variant);
  4453.       end loop;
  4454.  
  4455.       if not Invalid_Case
  4456.         and then Case_Table'Length > 0
  4457.       then
  4458.          Check_Case_Choices
  4459.            (Case_Table (1 .. Choice_Count), N, Discr_Type, Others_Present);
  4460.       end if;
  4461.  
  4462.       if not Invalid_Case
  4463.         and then Others_Present
  4464.       then
  4465.  
  4466.          --  Fill in Others_Discrete_Choices field of the OTHERS choice
  4467.  
  4468.          Choice := Last (Discrete_Choices (Last (Variants (N))));
  4469.          Expand_Others_Choice
  4470.            (Case_Table (1 .. Choice_Count), Choice, Discr_Type);
  4471.       end if;
  4472.  
  4473.    end Analyze_Variant_Part;
  4474.  
  4475.    --------------------------
  4476.    -- Expand_Others_Choice --
  4477.    --------------------------
  4478.  
  4479.    procedure Expand_Others_Choice
  4480.      (Case_Table    : Case_Table_Type;
  4481.       Others_Choice : Node_Id;
  4482.       Choice_Type   : Entity_Id)
  4483.    is
  4484.       Choice      : Node_Id;
  4485.       Choice_List : List_Id := New_List;
  4486.       Exp_Lo      : Node_Id;
  4487.       Exp_Hi      : Node_Id;
  4488.       Hi          : Uint;
  4489.       Lo          : Uint;
  4490.       Loc         : Source_Ptr := Sloc (Others_Choice);
  4491.       Previous_Hi : Uint;
  4492.  
  4493.       function Lit_Of (Value : Uint) return Node_Id;
  4494.       --  Returns the Node_Id for the enumeration literal corresponding to the
  4495.       --  position given by Value within the enumeration type Choice_Type.
  4496.  
  4497.       function Build_Choice (Value1, Value2 : Uint) return Node_Id;
  4498.       --  Builds a node representing the missing choices given by the
  4499.       --  Value1 and Value2. A N_Range node is built if there is more than
  4500.       --  one literal value missing. Otherwise a single N_Integer_Literal,
  4501.       --  N_Identifier or N_Character_Literal is built depending on what
  4502.       --  Choice_Type is.
  4503.  
  4504.       ------------
  4505.       -- Lit_Of --
  4506.       ------------
  4507.  
  4508.       function Lit_Of (Value : Uint) return Node_Id is
  4509.          Lit : Entity_Id;
  4510.  
  4511.       begin
  4512.          --  In the case where the literal is of type Character, there needs
  4513.          --  to be some special handling since there is no explicit chain
  4514.          --  of literals to search. Instead, a N_Character_Literal node
  4515.          --  is created with the appropriate Char_Code and Chars fields.
  4516.  
  4517.          if Root_Type (Choice_Type) = Standard_Character then
  4518.             Set_Character_Literal_Name (Char_Code (UI_To_Int (Value)));
  4519.             Lit := New_Node (N_Character_Literal, Loc);
  4520.             Set_Chars (Lit, Name_Find);
  4521.             Set_Char_Literal_Value (Lit, Char_Code (UI_To_Int (Value)));
  4522.             Set_Etype (Lit, Choice_Type);
  4523.             Set_Is_Static_Expression (Lit, True);
  4524.             return Lit;
  4525.  
  4526.          --  Otherwise, iterate through the literals list of Choice_Type
  4527.          --  "Value" number of times until the desired literal is reached
  4528.          --  and then return an occurrence of it.
  4529.  
  4530.          else
  4531.             Lit := First_Literal (Choice_Type);
  4532.             for J in 1 .. UI_To_Int (Value) loop
  4533.                Lit := Next_Literal (Lit);
  4534.             end loop;
  4535.  
  4536.             return New_Occurrence_Of (Lit, Loc);
  4537.          end if;
  4538.       end Lit_Of;
  4539.  
  4540.       ------------------
  4541.       -- Build_Choice --
  4542.       ------------------
  4543.  
  4544.       function Build_Choice (Value1, Value2 : Uint) return Node_Id is
  4545.          Lit_Node : Node_Id;
  4546.          Lo, Hi   : Node_Id;
  4547.  
  4548.       begin
  4549.          --  If there is only one choice value missing between Value1 and
  4550.          --  Value2, build an integer or enumeration literal to represent it.
  4551.  
  4552.          if (Value2 - Value1) = 0 then
  4553.             if Is_Integer_Type (Choice_Type) then
  4554.                Lit_Node := Make_Integer_Literal (Loc, Value1);
  4555.                Set_Etype (Lit_Node, Choice_Type);
  4556.             else
  4557.                Lit_Node := Lit_Of (Value1);
  4558.             end if;
  4559.  
  4560.          --  Otherwise is more that one choice value that is missing between
  4561.          --  Value1 and Value2, therefore build a N_Range node of either
  4562.          --  integer or enumeration literals.
  4563.  
  4564.          else
  4565.             if Is_Integer_Type (Choice_Type) then
  4566.                Lo := Make_Integer_Literal (Loc, Value1);
  4567.                Set_Etype (Lo, Choice_Type);
  4568.                Hi := Make_Integer_Literal (Loc, Value2);
  4569.                Set_Etype (Hi, Choice_Type);
  4570.                Lit_Node :=
  4571.                  Make_Range (Loc,
  4572.                    Low_Bound  => Lo,
  4573.                    High_Bound => Hi);
  4574.  
  4575.             else
  4576.                Lit_Node :=
  4577.                  Make_Range (Loc,
  4578.                    Low_Bound  => Lit_Of (Value1),
  4579.                    High_Bound => Lit_Of (Value2));
  4580.             end if;
  4581.          end if;
  4582.  
  4583.          return Lit_Node;
  4584.       end Build_Choice;
  4585.  
  4586.    --  Start of processing for Expand_Others_Choice
  4587.  
  4588.    begin
  4589.       if Case_Table'Length = 0 then
  4590.  
  4591.          --  Pathological case: only an others case is present.
  4592.          --  The others case covers the full range of the type.
  4593.  
  4594.          if Is_Static_Subtype (Choice_Type) then
  4595.             Choice := New_Occurrence_Of (Choice_Type, Loc);
  4596.          else
  4597.             Choice := New_Occurrence_Of (Base_Type (Choice_Type), Loc);
  4598.          end if;
  4599.  
  4600.          Set_Others_Discrete_Choices (Others_Choice, New_List (Choice));
  4601.          return;
  4602.       end if;
  4603.  
  4604.       --  Establish the bound values for the variant depending upon whether
  4605.       --  the type of the discriminant name is static or not.
  4606.  
  4607.       if Is_OK_Static_Subtype (Choice_Type) then
  4608.          Exp_Lo := Type_Low_Bound (Choice_Type);
  4609.          Exp_Hi := Type_High_Bound (Choice_Type);
  4610.       else
  4611.          Exp_Lo := Type_Low_Bound (Base_Type (Choice_Type));
  4612.          Exp_Hi := Type_High_Bound (Base_Type (Choice_Type));
  4613.       end if;
  4614.  
  4615.       Lo := Expr_Value (Case_Table (Case_Table'First).Choice_Lo);
  4616.       Hi := Expr_Value (Case_Table (Case_Table'First).Choice_Hi);
  4617.       Previous_Hi := Expr_Value (Case_Table (Case_Table'First).Choice_Hi);
  4618.  
  4619.       --  Build the node for any missing choices that are smaller than any
  4620.       --  explicit choices given in the variant.
  4621.  
  4622.       if Expr_Value (Exp_Lo) < Lo then
  4623.          Append (Build_Choice (Expr_Value (Exp_Lo), Lo - 1), Choice_List);
  4624.       end if;
  4625.  
  4626.       --  Build the nodes representing any missing choices that lie between
  4627.       --  the explicit ones given in the variant.
  4628.  
  4629.       for J in Case_Table'First + 1 .. Case_Table'Last loop
  4630.          Lo := Expr_Value (Case_Table (J).Choice_Lo);
  4631.          Hi := Expr_Value (Case_Table (J).Choice_Hi);
  4632.  
  4633.          if Lo /= (Previous_Hi + 1) then
  4634.             Append_To (Choice_List, Build_Choice (Previous_Hi + 1, Lo - 1));
  4635.          end if;
  4636.  
  4637.          Previous_Hi := Hi;
  4638.       end loop;
  4639.  
  4640.       --  Build the node for any missing choices that are greater than any
  4641.       --  explicit choices given in the variant.
  4642.  
  4643.       if Expr_Value (Exp_Hi) > Hi then
  4644.          Append (Build_Choice (Hi + 1, Expr_Value (Exp_Hi)), Choice_List);
  4645.       end if;
  4646.  
  4647.       Set_Others_Discrete_Choices (Others_Choice, Choice_List);
  4648.    end Expand_Others_Choice;
  4649.  
  4650.    ------------------------------------
  4651.    -- Build_Discriminant_Constraints --
  4652.    ------------------------------------
  4653.  
  4654.    function Build_Discriminant_Constraints
  4655.      (T           : Entity_Id;
  4656.       Def         : Node_Id;
  4657.       Related_Nod : Node_Id)
  4658.       return        Elist_Id
  4659.    is
  4660.       C          : Node_Id := Constraint (Def);
  4661.       Discr_Expr : array (1 .. Number_Discriminants (T)) of Node_Id;
  4662.       Discr      : Entity_Id;
  4663.       E          : Entity_Id;
  4664.       Elist      : Elist_Id := New_Elmt_List;
  4665.       Position   : Nat := 1;
  4666.       Id         : Entity_Id;
  4667.       Id2        : Entity_Id;
  4668.       N          : Node_Id;
  4669.       Not_Found  : Boolean;
  4670.  
  4671.       function Pos_Of_Discr (T : Entity_Id; Discr : Entity_Id) return Nat;
  4672.       --  Return the Position number (starting at 1) of a discriminant
  4673.       --  (Discr) within the discriminant list of the record type (T).
  4674.  
  4675.       function Pos_Of_Discr (T : Entity_Id; Discr : Entity_Id) return Nat is
  4676.          J : Nat := 1;
  4677.          D : Entity_Id;
  4678.  
  4679.       begin
  4680.          D := First_Discriminant (T);
  4681.  
  4682.          while Present (D) loop
  4683.             if D = Discr then
  4684.                return J;
  4685.             end if;
  4686.  
  4687.             D := Next_Discriminant (D);
  4688.             J := J + 1;
  4689.          end loop;
  4690.  
  4691.          --  Note: Since this function is called on discriminants that are
  4692.          --  known to belong to the record type, falling through the loop
  4693.          --  with no match signals an internal compiler error.
  4694.  
  4695.          pragma Assert (False);
  4696.       end Pos_Of_Discr;
  4697.  
  4698.    --  Start of processing for Build_Discriminant_Constraints
  4699.  
  4700.    begin
  4701.       for J in Discr_Expr'Range loop
  4702.          Discr_Expr (J) := Empty;
  4703.       end loop;
  4704.  
  4705.       Discr := First_Discriminant (T);
  4706.       N := First (Constraints (C));
  4707.  
  4708.       --  The following loop will process the positional associations only
  4709.       --  and will exit when a named association is seen. The named
  4710.       --  associations will then be processed by the subsequent loop.
  4711.  
  4712.       while Present (N) loop
  4713.          exit when Nkind (N) = N_Discriminant_Association; -- Named Assoc
  4714.  
  4715.          --  For a positional association, the (single) discriminant is
  4716.          --  implicitly specified by position, in textual order (RM 3.7.2).
  4717.  
  4718.          if No (Discr) then
  4719.             Error_Msg_N ("too many discriminants given in constraint", C);
  4720.             return New_Elmt_List;
  4721.  
  4722.          elsif Nkind (N) = N_Range then
  4723.             Error_Msg_N
  4724.               ("a range is not a valid discriminant constraint", N);
  4725.             Discr_Expr (Position) := Error;
  4726.             Position := Position + 1;
  4727.             Discr := Next_Discriminant (Discr);
  4728.  
  4729.          else
  4730.             Analyze (N);
  4731.             Discr_Expr (Position) := N;
  4732.             Resolve (N, Base_Type (Etype (Discr)));
  4733.             Remove_Side_Effects (N);
  4734.             Position := Position + 1;
  4735.             Discr := Next_Discriminant (Discr);
  4736.  
  4737.             if Present (Related_Nod)
  4738.               and then not Is_Static_Expression (N)
  4739.             then
  4740.                Set_Has_Dynamic_Itype (Related_Nod);
  4741.             end if;
  4742.          end if;
  4743.  
  4744.          N := Next (N);
  4745.       end loop;
  4746.  
  4747.       --  There should only be named associations left on the discriminant
  4748.       --  constraint. Any positional assoication are in error.
  4749.  
  4750.       while Present (N) loop
  4751.  
  4752.          if Nkind (N) = N_Discriminant_Association then
  4753.             E := Empty;
  4754.             Analyze (Expression (N));
  4755.  
  4756.             --  Search the entity list of the record looking at only the
  4757.             --  discriminants (which always appear first) to see if the
  4758.             --  simple name given in the constraint matches any of them.
  4759.  
  4760.             Id := First (Selector_Names (N));
  4761.  
  4762.             while Present (Id) loop
  4763.                Not_Found := True;
  4764.                Id2 := First_Entity (T);
  4765.  
  4766.                while Present (Id2)
  4767.                  and then Ekind (Id2) = E_Discriminant
  4768.                loop
  4769.                   if Chars (Id2) = Chars (Id) then
  4770.                      Not_Found := False;
  4771.                      exit;
  4772.                   end if;
  4773.  
  4774.                   Id2 := Next_Entity (Id2);
  4775.                end loop;
  4776.  
  4777.                if Not_Found then
  4778.                   Error_Msg_N ("& does not match any discriminant", Id);
  4779.                   return New_Elmt_List;
  4780.                end if;
  4781.  
  4782.                Position := Pos_Of_Discr (T, Id2);
  4783.  
  4784.                if No (Discr_Expr (Position)) then
  4785.                   Discr_Expr (Position) := Expression (N);
  4786.                   Resolve (Expression (N), Base_Type (Etype (Id2)));
  4787.                   Remove_Side_Effects (Expression (N));
  4788.                else
  4789.                   Error_Msg_N
  4790.                     ("duplicate constraint for discriminant&", Id);
  4791.                end if;
  4792.  
  4793.                --  A discriminant association with more than one
  4794.                --  discriminant name is only allowed if the named
  4795.                --  discriminants are all of the same type (RM 3.7.2).
  4796.  
  4797.                if E = Empty then
  4798.                   E := Etype (Id2);
  4799.  
  4800.                elsif Etype (Id2) /= E then
  4801.                   Error_Msg_N ("all discriminants in an association " &
  4802.                                "must have the same type", N);
  4803.                end if;
  4804.  
  4805.                Id := Next (Id);
  4806.             end loop;
  4807.  
  4808.          else
  4809.             --  Positional Association
  4810.  
  4811.             --  Named associations can be given in any order, but if both
  4812.             --  positional and named associations are used in the same
  4813.             --  discriminant constraint, then positional associations must
  4814.             --  occur first, at their normal position. Hence once a named
  4815.             --  association is used, the rest of the discriminant constraint
  4816.             --  must use only named associations.
  4817.  
  4818.             Error_Msg_N ("positional association follows named one", N);
  4819.             return New_Elmt_List;
  4820.          end if;
  4821.  
  4822.          N := Next (N);
  4823.       end loop;
  4824.  
  4825.       --  Furthermore, for each discriminant association (whether named or
  4826.       --  positional), the expression and the associated discriminants must
  4827.       --  have the same type. A discriminant constraint must provide exactly
  4828.       --  one value for each discriminant of the type (RM 3.7.2).
  4829.  
  4830.       --  missing code here???
  4831.  
  4832.       for J in Discr_Expr'Range loop
  4833.          if No (Discr_Expr (J)) then
  4834.             Error_Msg_N ("too few discriminants given in constraint", C);
  4835.             return New_Elmt_List;
  4836.          end if;
  4837.       end loop;
  4838.  
  4839.       --  Build an element list consisting of the expressions given in the
  4840.       --  discriminant constraint. The list is constructed after resolving
  4841.       --  any named discriminant associations and therefore the expressions
  4842.       --  appear in the textual order of the discriminants.
  4843.  
  4844.       Discr := First_Discriminant (T);
  4845.  
  4846.       for J in Discr_Expr'Range loop
  4847.          Append_Elmt (Discr_Expr (J), Elist);
  4848.  
  4849.          --  If any of the discriminant constraints is given by a discriminant
  4850.          --  the context may be a derived type derivation that renames them.
  4851.          --  Establish link between new and old discriminant.
  4852.  
  4853.          if Is_Entity_Name (Discr_Expr (J))
  4854.             and then Ekind (Entity (Discr_Expr (J))) = E_Discriminant
  4855.          then
  4856.             Set_Corresponding_Discriminant (Entity (Discr_Expr (J)), Discr);
  4857.          end if;
  4858.  
  4859.          Discr := Next_Discriminant (Discr);
  4860.       end loop;
  4861.  
  4862.       return Elist;
  4863.    end Build_Discriminant_Constraints;
  4864.  
  4865.    ----------------------------------
  4866.    -- Constrain_Discriminated_Type --
  4867.    ----------------------------------
  4868.  
  4869.    procedure Constrain_Discriminated_Type
  4870.      (Def_Id      : Entity_Id;
  4871.       S           : Node_Id;
  4872.       Related_Nod : Node_Id)
  4873.    is
  4874.       T     : Entity_Id;
  4875.       C     : Node_Id;
  4876.       Elist : Elist_Id;
  4877.       Constraint_OK : Boolean := False;
  4878.  
  4879.    begin
  4880.       C := Constraint (S);
  4881.  
  4882.       --  A discriminant constraint is only allowed in a subtype indication,
  4883.       --  after a subtype mark. This subtype mark must denote either a type
  4884.       --  with discriminants, or an access type whose designated type is a
  4885.       --  type with discriminants. A discriminant constraint specifies the
  4886.       --  values of these discriminants (RM 3.7.2(5)).
  4887.  
  4888.       T := Base_Type (Entity (Subtype_Mark (S)));
  4889.  
  4890.       if Ekind (T) in Access_Kind then
  4891.          T := Designated_Type (T);
  4892.       end if;
  4893.  
  4894.       if not Has_Discriminants (T) then
  4895.          Error_Msg_N
  4896.            ("invalid constraint: type has no discriminant", C);
  4897.          Set_Etype (Def_Id, Any_Type);
  4898.  
  4899.       elsif Is_Constrained (Entity (Subtype_Mark (S))) then
  4900.          Error_Msg_N
  4901.            ("type is already constrained", Subtype_Mark (S));
  4902.          Set_Etype (Def_Id, Any_Type);
  4903.  
  4904.       else
  4905.          --  Explain Itype test here???
  4906.  
  4907.          if Is_Itype (Def_Id) then
  4908.             Elist := Build_Discriminant_Constraints (T, S, Related_Nod);
  4909.          else
  4910.             Elist := Build_Discriminant_Constraints (T, S, Empty);
  4911.          end if;
  4912.  
  4913.          Constraint_OK := not Is_Empty_Elmt_List (Elist);
  4914.  
  4915.       end if;
  4916.  
  4917.       if Ekind (T) = E_Record_Type then
  4918.          Set_Ekind (Def_Id, E_Record_Subtype);
  4919.  
  4920.       elsif Ekind (T) = E_Task_Type then
  4921.          Set_Ekind (Def_Id, E_Task_Subtype);
  4922.  
  4923.       elsif Ekind (T) = E_Protected_Type then
  4924.          Set_Ekind (Def_Id, E_Protected_Subtype);
  4925.  
  4926.       elsif Is_Private_Type (T) then
  4927.          Set_Ekind (Def_Id, Subtype_Kind (Ekind (T)));
  4928.  
  4929.       else
  4930.          --  Incomplete type.
  4931.  
  4932.          Set_Ekind (Def_Id, Ekind (T));
  4933.       end if;
  4934.  
  4935.       Set_Etype              (Def_Id, T);
  4936.       Set_Esize              (Def_Id, Uint_0);
  4937.       Set_Has_Controlled     (Def_Id, Has_Controlled (T));
  4938.       Set_Has_Discriminants  (Def_Id, Constraint_OK);
  4939.       Set_Has_Tasks          (Def_Id, Has_Tasks (T));
  4940.       Set_Is_Constrained     (Def_Id, Constraint_OK);
  4941.       Set_Is_Controlled      (Def_Id, Is_Controlled (T));
  4942.       Set_Is_Tagged_Type     (Def_Id, Is_Tagged_Type (T));
  4943.       Set_First_Entity       (Def_Id, First_Entity (T));
  4944.       Set_Last_Entity        (Def_Id, Last_Entity (T));
  4945.       Set_Is_Packed          (Def_Id, Is_Packed (T));
  4946.  
  4947.       if not Is_Concurrent_Type (T) then
  4948.          Set_Alignment_Clause (Def_Id, Alignment_Clause (T));
  4949.       end if;
  4950.  
  4951.       if Constraint_OK then
  4952.          Set_Discriminant_Constraint (Def_Id, Elist);
  4953.       end if;
  4954.  
  4955.       if Is_Tagged_Type (T) then
  4956.          Set_Class_Wide_Type      (Def_Id, Class_Wide_Type (T));
  4957.          Set_Primitive_Operations (Def_Id, Primitive_Operations (T));
  4958.          Set_Access_Disp_Table    (Def_Id, Access_Disp_Table (T));
  4959.       end if;
  4960.  
  4961.       if Is_Record_Type (T) and then Constraint_OK then
  4962.          Create_Constrained_Components (Def_Id, Related_Nod, T, T, Elist);
  4963.       end if;
  4964.  
  4965.       --  Subtypes introduced by component declarations do not need to be
  4966.       --  marked as delayed, and do not get freeze nodes, because the semantics
  4967.       --  verifies that the parents of the subtypes are frozen before the
  4968.       --  enclosing record is frozen.
  4969.  
  4970.       if not Is_Type (Scope (Def_Id)) then
  4971.          Set_Depends_On_Private (Def_Id, Depends_On_Private (T));
  4972.  
  4973.          if Is_Private_Type (T)
  4974.            and then Present (Full_View (T))
  4975.          then
  4976.             Conditional_Delay (Def_Id, Full_View (T));
  4977.          else
  4978.             Conditional_Delay (Def_Id, T);
  4979.          end if;
  4980.       end if;
  4981.  
  4982.    end Constrain_Discriminated_Type;
  4983.  
  4984.    -----------------------------------
  4985.    -- Create_Constrained_Components --
  4986.    -----------------------------------
  4987.  
  4988.    procedure Create_Constrained_Components
  4989.      (Subt        : Entity_Id;
  4990.       Decl_Node   : Node_Id;
  4991.       Typ         : Entity_Id;
  4992.       Parent_Rec  : Entity_Id;
  4993.       Constraints : Elist_Id)
  4994.    is
  4995.       Old_E : Entity_Id;
  4996.       New_E : Entity_Id;
  4997.  
  4998.  
  4999.       Index_Type     : Entity_Id;
  5000.       Old_Index      : Node_Id;
  5001.       New_Index      : Node_Id;
  5002.       New_Index_List : List_Id;
  5003.  
  5004.       New_Constraint : Elist_Id;
  5005.       Old_Constraint : Elmt_Id;
  5006.       Old_Expr       : Node_Id;
  5007.       New_Expr       : Node_Id;
  5008.       Low_Expr       : Node_Id;
  5009.       High_Expr      : Node_Id;
  5010.       Old_Type       : Entity_Id;
  5011.  
  5012.       Itype  : Entity_Id;
  5013.       Need_To_Create_Itype : Boolean;
  5014.  
  5015.       function Get_Value (D : Entity_Id) return Node_Id;
  5016.       --  Find the value of discriminant D in the discriminant constraint for
  5017.       --  the subtype.
  5018.  
  5019.       function Get_Value (D : Entity_Id) return Node_Id is
  5020.          Assoc : Elmt_Id;
  5021.          Disc  : Entity_Id;
  5022.       begin
  5023.          Assoc := First_Elmt (Constraints);
  5024.          Disc  := First_Discriminant (Parent_Rec);
  5025.  
  5026.          while Original_Record_Component (Disc) /= D loop
  5027.             Assoc := Next_Elmt (Assoc);
  5028.             Disc := Next_Discriminant (Disc);
  5029.          end loop;
  5030.  
  5031.          return Node (Assoc);
  5032.       end Get_Value;
  5033.  
  5034.    begin
  5035.       --  Tagged types and their descendants work without component
  5036.       --  expansion. To be investigated. ???
  5037.  
  5038.       if Is_Tagged_Type (Typ) then
  5039.          return;
  5040.       end if;
  5041.  
  5042.       Old_E := First_Entity (Typ);
  5043.  
  5044.       while Present (Old_E) loop
  5045.          Need_To_Create_Itype := False;
  5046.  
  5047.          if Old_E = First_Entity (Typ) then
  5048.             New_E := New_Copy (Old_E);
  5049.             Set_First_Entity (Subt, New_E);
  5050.          else
  5051.             Set_Next_Entity (New_E, New_Copy (Old_E));
  5052.             New_E := Next_Entity (New_E);
  5053.          end if;
  5054.  
  5055.          Old_Type := Etype (Old_E);
  5056.  
  5057.          if Is_Type (Old_E) then
  5058.  
  5059.             --  No need to consider anonymous types in the record
  5060.             --  declaration, they are the types of components that are
  5061.             --  about to be rebuilt.
  5062.             null;
  5063.  
  5064.          elsif Is_Array_Type (Old_Type) then
  5065.             New_Index_List := New_List;
  5066.  
  5067.             Old_Index := First_Index (Etype (Old_E));
  5068.             while Present (Old_Index) loop
  5069.                New_Index := New_Copy_Tree (Old_Index);
  5070.  
  5071.                if Nkind (New_Index) = N_Range then
  5072.                   Set_Etype (New_Index, Base_Type (Etype (Old_Index)));
  5073.  
  5074.                   Get_Index_Bounds (New_Index, Low_Expr, High_Expr);
  5075.  
  5076.                   Old_Expr := Low_Expr;
  5077.                   for J in 1 .. 2 loop
  5078.                      if Nkind (Old_Expr)         = N_Identifier   and then
  5079.                        Ekind (Entity (Old_Expr)) = E_Discriminant
  5080.                      then
  5081.                         Need_To_Create_Itype := True;
  5082.  
  5083.                         New_Expr := Get_Value (Entity (Old_Expr));
  5084.  
  5085.                         if J = 1 then
  5086.                            Set_Low_Bound
  5087.                              (New_Index, New_Copy_Tree (New_Expr));
  5088.                         else
  5089.                            Set_High_Bound
  5090.                              (New_Index, New_Copy_Tree (New_Expr));
  5091.                         end if;
  5092.                      end if;
  5093.  
  5094.                      Old_Expr := High_Expr;
  5095.                   end loop;
  5096.  
  5097.                   --  Create anonymous index type for range
  5098.  
  5099.                   Index_Type := New_Itype
  5100.                       (Subtype_Kind (Ekind (Etype (New_Index))), Decl_Node);
  5101.                   Set_Etype        (Index_Type, Etype (New_Index));
  5102.                   Set_Esize        (Index_Type, Esize (Etype (New_Index)));
  5103.                   Set_Scalar_Range (Index_Type, New_Index);
  5104.  
  5105.                   Set_Etype (New_Index, Index_Type);
  5106.                end if;
  5107.  
  5108.                Append (New_Index, To => New_Index_List);
  5109.                Old_Index := Next_Index (Old_Index);
  5110.             end loop;
  5111.  
  5112.             if Need_To_Create_Itype then
  5113.                Itype := New_Itype (E_Array_Subtype, Decl_Node);
  5114.  
  5115.                Set_Is_Constrained     (Itype);
  5116.                Set_Esize              (Itype, Esize              (Old_Type));
  5117.                Set_Alignment_Clause   (Itype, Alignment_Clause   (Old_Type));
  5118.                Set_Etype              (Itype, Base_Type          (Old_Type));
  5119.                Set_Component_Type     (Itype, Component_Type     (Old_Type));
  5120.                Set_Has_Tasks          (Itype, Has_Tasks          (Old_Type));
  5121.                Set_Has_Controlled     (Itype, Has_Controlled     (Old_Type));
  5122.                Set_Depends_On_Private (Itype, Depends_On_Private (Old_Type));
  5123.  
  5124.                Set_First_Index (Itype, First (New_Index_List));
  5125.                Set_Etype (New_E, Itype);
  5126.  
  5127.             else
  5128.                Set_Etype (New_E, Old_Type);
  5129.             end if;
  5130.  
  5131.          elsif Ekind (Old_Type) = E_Record_Subtype
  5132.            and then Has_Discriminants (Old_Type)
  5133.  
  5134.          then
  5135.             New_Constraint := New_Elmt_List;
  5136.  
  5137.             Old_Constraint :=
  5138.               First_Elmt (Discriminant_Constraint (Old_Type));
  5139.  
  5140.             while Present (Old_Constraint) loop
  5141.                Old_Expr := Node (Old_Constraint);
  5142.  
  5143.                if Nkind (Old_Expr)          = N_Identifier   and then
  5144.                   Ekind (Entity (Old_Expr)) = E_Discriminant
  5145.                then
  5146.                   Need_To_Create_Itype := True;
  5147.                   New_Expr := Get_Value (Entity (Old_Expr));
  5148.  
  5149.                   Append_Elmt (New_Expr, New_Constraint);
  5150.  
  5151.                else
  5152.                   Append_Elmt (Old_Expr, New_Constraint);
  5153.                end if;
  5154.  
  5155.                Old_Constraint := Next_Elmt (Old_Constraint);
  5156.             end loop;
  5157.  
  5158.             if Need_To_Create_Itype then
  5159.  
  5160.                Itype := New_Itype (E_Record_Subtype, Decl_Node);
  5161.  
  5162.                Set_Etype                   (Itype, Base_Type (Old_Type));
  5163.                Set_Discriminant_Constraint (Itype, New_Constraint);
  5164.                Set_Is_Tagged_Type          (Itype, Is_Tagged_Type (Old_Type));
  5165.                Set_Has_Discriminants       (Itype);
  5166.                Set_First_Entity            (Itype, First_Entity (Old_Type));
  5167.                Set_Last_Entity             (Itype, Last_Entity  (Old_Type));
  5168.                Set_Is_Constrained          (Itype);
  5169.                Set_Has_Tasks               (Itype, Has_Tasks (Old_Type));
  5170.                Set_Depends_On_Private (Itype, Depends_On_Private (Old_Type));
  5171.  
  5172.                if Is_Tagged_Type (Old_Type) then
  5173.                   Set_Access_Disp_Table (Itype, Access_Disp_Table (Old_Type));
  5174.                end if;
  5175.  
  5176.                --  If the component is a constrained record subtype, create
  5177.                --  its constrained components as well. The values of the
  5178.                --  discriminants to be used are those of the enclosing record
  5179.                --  type,  because those are the discriminants used to constrain
  5180.                --  the current component, and thus its subcomponents.
  5181.  
  5182.                Create_Constrained_Components (Itype, Decl_Node,
  5183.                                     Old_Type, Parent_Rec, Constraints);
  5184.                Set_Etype (New_E, Itype);
  5185.  
  5186.             else
  5187.                Set_Etype (New_E, Old_Type);
  5188.             end if;
  5189.  
  5190.          else
  5191.             Set_Etype (New_E, Old_Type);
  5192.          end if;
  5193.  
  5194.          Old_E := Next_Entity (Old_E);
  5195.  
  5196.       end loop;
  5197.  
  5198.       Set_Last_Entity (Subt, New_E);
  5199.    end Create_Constrained_Components;
  5200.  
  5201.    ------------------------------
  5202.    -- Derived_Type_Declaration --
  5203.    ------------------------------
  5204.  
  5205.    procedure Derived_Type_Declaration (T : in out Entity_Id; N : Node_Id) is
  5206.       Def             : constant Node_Id    := Type_Definition (N);
  5207.       Indic           : constant Node_Id    := Subtype_Indication (Def);
  5208.       Extension       : constant Node_Id    := Record_Extension_Part (Def);
  5209.       Derived_Type    : Entity_Id;
  5210.       Parent_Type     : Entity_Id;
  5211.       Taggd           : Boolean;
  5212.  
  5213.    begin
  5214.       if Nkind (Indic) = N_Subtype_Indication then
  5215.          Find_Type (Subtype_Mark (Indic));
  5216.          Parent_Type := Entity (Subtype_Mark (Indic));
  5217.  
  5218.          if not Is_Valid_Constraint_Kind
  5219.                     (Ekind (Parent_Type), Nkind (Constraint (Indic)))
  5220.          then
  5221.             Error_Msg_N
  5222.               ("incorrect constraint for this kind of type",
  5223.                Constraint (Indic));
  5224.             Rewrite_Substitute_Tree (Indic,
  5225.               New_Copy_Tree (Subtype_Mark (Indic)));
  5226.          end if;
  5227.  
  5228.          --  Otherwise we have a subtype mark without a constraint
  5229.  
  5230.       else
  5231.          Find_Type (Indic);
  5232.          Parent_Type := Entity (Indic);
  5233.       end if;
  5234.  
  5235.       if Parent_Type = Any_Type then
  5236.          Set_Etype (T, Any_Type);
  5237.  
  5238.          if Is_Tagged_Type (T) then
  5239.             Set_Primitive_Operations (T, New_Elmt_List);
  5240.          end if;
  5241.  
  5242.          return;
  5243.       end if;
  5244.  
  5245.       --  Only composite types other than array types are allowed to have
  5246.       --  discriminants.
  5247.  
  5248.       if Present (Discriminant_Specifications (N)) then
  5249.          if Is_Elementary_Type (Parent_Type)
  5250.            or else Is_Array_Type (Parent_Type) then
  5251.             Error_Msg_N
  5252.              ("elementary or array type cannot have discriminants",
  5253.               Defining_Identifier (First (Discriminant_Specifications (N))));
  5254.          end if;
  5255.       end if;
  5256.  
  5257.       --  In Ada 83, a derived type defined in a package specification cannot
  5258.       --  be used for further derivation until the end of its visible part.
  5259.       --  Note that derivation in the private part of the package is allowed.
  5260.  
  5261.       if (Ada_83 or Features_On)
  5262.         and then Is_Derived_Type (Parent_Type)
  5263.         and then In_Visible_Part (Scope (Parent_Type))
  5264.       then
  5265.          Note_Feature (Inheritance_At_Local_Derivation, Sloc (Indic));
  5266.  
  5267.          if Ada_83 and then Comes_From_Source (Indic) then
  5268.             Error_Msg_N
  5269.               ("(Ada 83): premature use of type for derivation", Indic);
  5270.          end if;
  5271.       end if;
  5272.  
  5273.       --  Check for early use of incomplete or private type
  5274.  
  5275.       if Ekind (Parent_Type) = E_Void
  5276.         or else Ekind (Parent_Type) = E_Incomplete_Type
  5277.       then
  5278.          Error_Msg_N ("premature derivation of incomplete type", Indic);
  5279.          return;
  5280.  
  5281.       elsif (Is_Incomplete_Or_Private_Type (Parent_Type)
  5282.         and then not Is_Generic_Type (Parent_Type)
  5283.         and then not Is_Generic_Actual_Type (Parent_Type)
  5284.         and then No (Underlying_Type (Parent_Type)))
  5285.         or else Has_Private_Component (Parent_Type)
  5286.       then
  5287.          Error_Msg_N ("premature derivation of derived or private type",
  5288.           Indic);
  5289.       end if;
  5290.  
  5291.       --  Check that form of derivation is appropriate
  5292.  
  5293.       Taggd := Is_Tagged_Type (Parent_Type);
  5294.  
  5295.       if Present (Extension) and then not Taggd then
  5296.          Error_Msg_N
  5297.            ("type derived from non tagged type cannot have extension", Indic);
  5298.  
  5299.       elsif No (Extension) and then Taggd then
  5300.          Error_Msg_N
  5301.            ("type derived from tagged type must have extension", Indic);
  5302.       end if;
  5303.  
  5304.       Derived_Type := T;
  5305.  
  5306.       Build_Derived_Type (N, Parent_Type, T);
  5307.       Derive_Subprograms (Parent_Type, T);
  5308.       Set_Has_Delayed_Freeze (T);
  5309.    end Derived_Type_Declaration;
  5310.  
  5311.    ------------------------
  5312.    -- Build_Derived_Type --
  5313.    ------------------------
  5314.  
  5315.    procedure Build_Derived_Type
  5316.      (N            : Node_Id;
  5317.       Parent_Type  : Entity_Id;
  5318.       Derived_Type : in out Entity_Id)
  5319.    is
  5320.    begin
  5321.       --  Copy common attributes
  5322.  
  5323.       Set_Ekind (Derived_Type, Ekind (Base_Type     (Parent_Type)));
  5324.       Set_Esize (Derived_Type, Esize                (Parent_Type));
  5325.       Set_Etype (Derived_Type, Base_Type            (Parent_Type));
  5326.       Set_Has_Non_Standard_Rep
  5327.                 (Derived_Type, Has_Non_Standard_Rep (Parent_Type));
  5328.  
  5329.       Set_Scope (Derived_Type, Current_Scope);
  5330.  
  5331.       if Ekind (Derived_Type) not in Concurrent_Kind then
  5332.          Set_Alignment_Clause (Derived_Type, Alignment_Clause (Parent_Type));
  5333.          --  should add alignment clause to concurrent types ???
  5334.       end if;
  5335.  
  5336.       case Ekind (Parent_Type) is
  5337.          when Numeric_Kind =>
  5338.             Build_Derived_Numeric_Type (N, Parent_Type, Derived_Type);
  5339.  
  5340.          when Array_Kind =>
  5341.             Build_Derived_Array_Type (N, Parent_Type,  Derived_Type);
  5342.  
  5343.          when E_Record_Type | E_Record_Subtype =>
  5344.             if Is_Tagged_Type (Parent_Type) then
  5345.                Build_Derived_Tagged_Type (N,
  5346.                  Type_Definition (N), Parent_Type, Derived_Type);
  5347.             else
  5348.                Build_Derived_Record_Type (N, Parent_Type, Derived_Type);
  5349.             end if;
  5350.  
  5351.             Set_Has_Specified_Layout
  5352.               (Derived_Type, Has_Specified_Layout (Parent_Type));
  5353.  
  5354.          when Class_Wide_Kind =>
  5355.             Build_Derived_Record_Type (N, Parent_Type, Derived_Type);
  5356.  
  5357.          when Enumeration_Kind =>
  5358.             Build_Derived_Enumeration_Type (N, Parent_Type, Derived_Type);
  5359.  
  5360.          when Access_Kind =>
  5361.             Set_Directly_Designated_Type
  5362.               (Derived_Type, Designated_Type (Parent_Type));
  5363.             Set_Is_Access_Constant (Derived_Type,
  5364.               Is_Access_Constant (Parent_Type));
  5365.             Set_Storage_Size_Variable (Derived_Type,
  5366.               Storage_Size_Variable (Parent_Type));
  5367.  
  5368.          when Incomplete_Or_Private_Kind =>
  5369.             if Is_Tagged_Type (Parent_Type) then
  5370.                Build_Derived_Tagged_Type (N,
  5371.                  Type_Definition (N), Parent_Type, Derived_Type);
  5372.             else
  5373.                if Has_Discriminants (Parent_Type) then
  5374.                   Build_Derived_Record_Type (N, Parent_Type, Derived_Type);
  5375.  
  5376.                elsif Present (Full_View (Parent_Type))
  5377.                  and then Has_Discriminants (Full_View (Parent_Type))
  5378.                then
  5379.                   --  Inherit the discriminants of the full view, but
  5380.                   --  keep the proper parent type.
  5381.  
  5382.                   Build_Derived_Record_Type
  5383.                     (N, Full_View (Parent_Type), Derived_Type);
  5384.                   Set_Etype (Base_Type (Derived_Type),
  5385.                              Base_Type (Parent_Type));
  5386.                else
  5387.                   Set_Is_Constrained  (Derived_Type,
  5388.                     Is_Constrained (Parent_Type));
  5389.                end if;
  5390.             end if;
  5391.  
  5392.             if Is_Private_Type (Derived_Type) then
  5393.                Set_Private_Dependents (Derived_Type, New_Elmt_List);
  5394.             end if;
  5395.  
  5396.             if Is_Private_Type (Parent_Type)
  5397.               and then Base_Type (Parent_Type) = Parent_Type
  5398.             then
  5399.                Append_Elmt (Derived_Type, Private_Dependents (Parent_Type));
  5400.             end if;
  5401.  
  5402.          when Concurrent_Kind =>
  5403.  
  5404.             --  All attributes are inherited from parent. In particular,
  5405.             --  entries and the corresponding record type are the same.
  5406.  
  5407.             Set_First_Entity (Derived_Type,  First_Entity (Parent_Type));
  5408.             Set_Last_Entity  (Derived_Type,  Last_Entity  (Parent_Type));
  5409.             Set_Has_Tasks    (Derived_Type,  Is_Task_Type (Parent_Type));
  5410.             Set_Has_Discriminants (Derived_Type,
  5411.                 Has_Discriminants (Parent_Type));
  5412.             Set_Corresponding_Record_Type (Derived_Type,
  5413.                 Corresponding_Record_Type (Parent_Type));
  5414.  
  5415.             if Is_Task_Type (Parent_Type) then
  5416.                Set_Storage_Size_Variable (Derived_Type,
  5417.                  Storage_Size_Variable (Parent_Type));
  5418.             end if;
  5419.  
  5420.             Set_Has_Completion (Derived_Type);
  5421.  
  5422.          when others =>
  5423.             pragma Assert (False); null;
  5424.       end case;
  5425.    end Build_Derived_Type;
  5426.  
  5427.    ------------------------------
  5428.    -- Build_Derived_Array_Type --
  5429.    ------------------------------
  5430.  
  5431.    procedure Build_Derived_Array_Type
  5432.      (N            : Node_Id;
  5433.       Parent_Type  : Entity_Id;
  5434.       Derived_Type : in out Entity_Id)
  5435.    is
  5436.       Loc           : constant Source_Ptr := Sloc (N);
  5437.       Tdef          : constant Node_Id    := Type_Definition (N);
  5438.       Indic         : constant Node_Id    := Subtype_Indication (Tdef);
  5439.       Parent_Base   : constant Entity_Id  := Base_Type (Parent_Type);
  5440.       Implicit_Base : Entity_Id;
  5441.       New_Indic     : Node_Id;
  5442.  
  5443.       procedure Copy_Array_Attributes (T1 : Entity_Id; T2 : Entity_Id);
  5444.       --  Utility to initialize attributes of derived type and its base.
  5445.  
  5446.       procedure Copy_Array_Attributes (T1 : Entity_Id; T2 : Entity_Id) is
  5447.       begin
  5448.          Set_First_Index        (T1, First_Index           (T2));
  5449.          Set_Component_Type     (T1, Component_Type        (T2));
  5450.          Set_Is_Aliased         (T1, Is_Aliased            (T2));
  5451.          Set_Is_Constrained     (T1, Is_Constrained        (T2));
  5452.          Set_Has_Tasks          (T1, Has_Tasks             (T2));
  5453.          Set_Has_Controlled     (T1, Has_Controlled        (T2));
  5454.          Set_Depends_On_Private (T1, Has_Private_Component (T2));
  5455.          Set_Esize              (T1, Esize                 (T2));
  5456.          Set_Alignment_Clause   (T1, Alignment_Clause      (T2));
  5457.       end Copy_Array_Attributes;
  5458.  
  5459.    begin
  5460.       if not Is_Constrained (Parent_Type) then
  5461.          if Nkind (Indic) /= N_Subtype_Indication then
  5462.             Set_Ekind              (Derived_Type, E_Array_Type);
  5463.             Copy_Array_Attributes  (Derived_Type, Parent_Type);
  5464.             Set_Has_Delayed_Freeze (Derived_Type, True);
  5465.  
  5466.          else
  5467.             --  If the parent type is constrained, the derived type is a
  5468.             --  subtype of an implicit base type derived from the parent base.
  5469.  
  5470.             Implicit_Base :=
  5471.               New_Itype (Ekind (Parent_Base), N, Derived_Type, 'B');
  5472.             Set_Ekind             (Implicit_Base, Ekind (Parent_Type));
  5473.             Copy_Array_Attributes (Implicit_Base, Parent_Type);
  5474.             Set_Has_Delayed_Freeze (Implicit_Base, True);
  5475.  
  5476.             New_Indic :=
  5477.                 Make_Subtype_Indication (Loc,
  5478.                   Subtype_Mark => New_Reference_To (Implicit_Base, Loc),
  5479.                   Constraint => Constraint (Indic));
  5480.             Constrain_Array (Derived_Type, New_Indic, N, Empty, ' ');
  5481.          end if;
  5482.  
  5483.       else
  5484.          if Nkind (Indic) /= N_Subtype_Indication then
  5485.             Implicit_Base :=
  5486.               New_Itype (Ekind (Parent_Base), N, Derived_Type, 'B');
  5487.             Set_Ekind              (Implicit_Base, Ekind (Parent_Base));
  5488.             Set_Etype              (Implicit_Base, Parent_Base);
  5489.             Copy_Array_Attributes  (Implicit_Base, Parent_Base);
  5490.             Set_Has_Delayed_Freeze (Implicit_Base, True);
  5491.  
  5492.             Set_Ekind              (Derived_Type, Ekind (Parent_Type));
  5493.             Set_Etype              (Derived_Type, Implicit_Base);
  5494.             Copy_Array_Attributes  (Derived_Type, Parent_Type);
  5495.  
  5496.          else
  5497.             Error_Msg_N ("illegal constraint on constrained type", Indic);
  5498.          end if;
  5499.       end if;
  5500.    end Build_Derived_Array_Type;
  5501.  
  5502.    --------------------------------
  5503.    -- Build_Derived_Numeric_Type --
  5504.    --------------------------------
  5505.  
  5506.    procedure Build_Derived_Numeric_Type
  5507.      (N            : Node_Id;
  5508.       Parent_Type  : Entity_Id;
  5509.       Derived_Type : Entity_Id)
  5510.    is
  5511.       Loc           : constant Source_Ptr := Sloc (N);
  5512.       Tdef          : constant Node_Id := Type_Definition (N);
  5513.       Indic         : constant Node_Id := Subtype_Indication (Tdef);
  5514.       Implicit_Base : Entity_Id;
  5515.       Lo            : Node_Id;
  5516.       Hi            : Node_Id;
  5517.       T             : Entity_Id;
  5518.  
  5519.    --  Start of processing for Build_Derived_Numeric_Type
  5520.  
  5521.    begin
  5522.       --  Process the subtype indication including a validation check on
  5523.       --  the constraint if any.
  5524.  
  5525.       T := Process_Subtype (Indic, N);
  5526.  
  5527.       --  Introduce an implicit base type for the derived type even if
  5528.       --  there is no constraint attached to it, since this seems closer
  5529.       --  to the Ada semantics.
  5530.  
  5531.       Implicit_Base :=
  5532.         New_Itype (Ekind (Base_Type (Parent_Type)), N, Derived_Type, 'B');
  5533.  
  5534.       Set_Etype (Implicit_Base, Parent_Type);
  5535.       Set_Esize (Implicit_Base, Esize (Base_Type (Parent_Type)));
  5536.       Set_Alignment_Clause
  5537.                 (Implicit_Base, Alignment_Clause (Parent_Type));
  5538.  
  5539.       Lo := New_Copy_Tree (Type_Low_Bound  (Base_Type (Parent_Type)));
  5540.       Hi := New_Copy_Tree (Type_High_Bound (Base_Type (Parent_Type)));
  5541.  
  5542.       Set_Scalar_Range (Implicit_Base,
  5543.         Make_Range (Loc,
  5544.           Low_Bound  => Lo,
  5545.           High_Bound => Hi));
  5546.  
  5547.       --  The Derived_Type, which is the entity of the declaration, is
  5548.       --  a subtype of the implicit base. Its Ekind is a subtype, even
  5549.       --  in the absence of an explicit constraint.
  5550.  
  5551.       Set_Etype (Derived_Type, Implicit_Base);
  5552.  
  5553.       if Nkind (Indic) /= N_Subtype_Indication then
  5554.          Set_Ekind (Derived_Type, Subtype_Kind (Ekind (Parent_Type)));
  5555.          Set_Scalar_Range (Derived_Type, Scalar_Range (Parent_Type));
  5556.       end if;
  5557.  
  5558.       if Is_Modular_Integer_Type (Parent_Type) then
  5559.          Set_Modulus (Implicit_Base, Modulus (Parent_Type));
  5560.          Set_Modulus (Derived_Type, Modulus (Parent_Type));
  5561.  
  5562.       elsif Is_Floating_Point_Type (Parent_Type) then
  5563.          Set_Digits_Value (Derived_Type,  Digits_Value (Parent_Type));
  5564.          Set_Digits_Value (Implicit_Base, Digits_Value (Parent_Type));
  5565.  
  5566.       elsif Is_Fixed_Point_Type (Parent_Type) then
  5567.          Set_Delta_Value (Derived_Type,  Delta_Value (Parent_Type));
  5568.          Set_Delta_Value (Implicit_Base, Delta_Value (Parent_Type));
  5569.          Set_Small_Value (Derived_Type,  Small_Value (Parent_Type));
  5570.          Set_Small_Value (Implicit_Base, Small_Value (Parent_Type));
  5571.  
  5572.          if Is_Decimal_Fixed_Point_Type (Parent_Type) then
  5573.             Set_Scale_Value (Derived_Type,  Scale_Value (Parent_Type));
  5574.             Set_Scale_Value (Implicit_Base, Scale_Value (Parent_Type));
  5575.  
  5576.             Set_Machine_Radix_10
  5577.               (Derived_Type,  Machine_Radix_10 (Parent_Type));
  5578.             Set_Machine_Radix_10
  5579.               (Implicit_Base, Machine_Radix_10 (Parent_Type));
  5580.          end if;
  5581.       end if;
  5582.    end Build_Derived_Numeric_Type;
  5583.  
  5584.    ------------------------------------
  5585.    -- Build_Derived_Enumeration_Type --
  5586.    ------------------------------------
  5587.  
  5588.    procedure Build_Derived_Enumeration_Type
  5589.      (N            : Node_Id;
  5590.       Parent_Type  : Entity_Id;
  5591.       Derived_Type : Entity_Id)
  5592.    is
  5593.       Loc           : constant Source_Ptr := Sloc (N);
  5594.       Def           : constant Node_Id    := Type_Definition (N);
  5595.       Indic         : constant Node_Id    := Subtype_Indication (Def);
  5596.       Implicit_Base : Entity_Id;
  5597.       Literal       : Entity_Id;
  5598.       New_Lit       : Entity_Id;
  5599.       Literals_List : List_Id;
  5600.       Type_Decl     : Node_Id;
  5601.       I_Node        : Node_Id;
  5602.  
  5603.    begin
  5604.       --  Since types Standard.Character and Standard.Wide_Character do
  5605.       --  not have explicit literals lists we need to process types derived
  5606.       --  from them specially. This is handled by Derived_Standard_Character.
  5607.       --  If the parent type is a generic type, there are no literals either,
  5608.       --  and we construct the same skeletal representation as for the generic
  5609.       --  parent type.
  5610.  
  5611.       if Root_Type (Parent_Type) = Standard_Character
  5612.         or else Root_Type (Parent_Type) = Standard_Wide_Character
  5613.       then
  5614.          Derived_Standard_Character (N, Parent_Type, Derived_Type);
  5615.  
  5616.       elsif Is_Generic_Type (Root_Type (Parent_Type)) then
  5617.          declare
  5618.             Lo : Node_Id;
  5619.             Hi : Node_Id;
  5620.  
  5621.          begin
  5622.             Lo :=
  5623.                Make_Attribute_Reference (Loc,
  5624.                  Attribute_Name => Name_First,
  5625.                  Prefix => New_Reference_To (Derived_Type, Loc));
  5626.             Set_Etype (Lo, Derived_Type);
  5627.  
  5628.             Hi :=
  5629.                Make_Attribute_Reference (Loc,
  5630.                  Attribute_Name => Name_Last,
  5631.                  Prefix => New_Reference_To (Derived_Type, Loc));
  5632.             Set_Etype (Hi, Derived_Type);
  5633.  
  5634.             Set_Scalar_Range (Derived_Type,
  5635.                Make_Range (Loc,
  5636.                  Low_Bound => Lo,
  5637.                  High_Bound => Hi));
  5638.          end;
  5639.  
  5640.       else
  5641.          --  Introduce an implicit base type for the derived type even
  5642.          --  if there is no constraint attached to it, since this seems
  5643.          --  closer to the Ada semantics. Build a full type declaration
  5644.          --  tree for the derived type using the implicit base type as
  5645.          --  the defining identifier. The build a subtype declaration
  5646.          --  tree which applies the constraint (if any) have it replace
  5647.          --  the derived type declaration.
  5648.  
  5649.          Literal := First_Literal (Parent_Type);
  5650.          Literals_List := New_List;
  5651.  
  5652.          while Present (Literal)
  5653.            and then Ekind (Literal) = E_Enumeration_Literal
  5654.          loop
  5655.             --  Literals of the derived type have the same representation as
  5656.             --  those of the parent type, but this representation can be
  5657.             --  overridden by an explicit representation clause. Indicate
  5658.             --  that there is no explicit representation given yet.
  5659.  
  5660.             New_Lit := New_Copy (Literal);
  5661.             Set_Enumeration_Rep_Expr (New_Lit, Empty);
  5662.  
  5663.             Append (New_Lit, Literals_List);
  5664.             Literal := Next_Literal (Literal);
  5665.          end loop;
  5666.  
  5667.          Implicit_Base :=
  5668.            Make_Defining_Identifier (Loc,
  5669.              New_External_Name (Chars (Derived_Type), 'B'));
  5670.  
  5671.          Type_Decl :=
  5672.            Make_Full_Type_Declaration (Loc,
  5673.              Defining_Identifier => Implicit_Base,
  5674.              Discriminant_Specifications => No_List,
  5675.              Type_Definition =>
  5676.                Make_Enumeration_Type_Definition (Loc, Literals_List));
  5677.  
  5678.          Mark_Rewrite_Insertion (Type_Decl);
  5679.          Insert_Before (N, Type_Decl);
  5680.          Analyze (Type_Decl);
  5681.  
  5682.          --  After the implicit base is analyzed its Etype needs to be
  5683.          --  changed to reflect the fact that it is derived from the
  5684.          --  parent type which was ignored during analysis. We also set
  5685.          --  the size at this point.
  5686.  
  5687.          Set_Etype (Implicit_Base, Parent_Type);
  5688.  
  5689.          Set_Esize            (Implicit_Base, Esize             (Parent_Type));
  5690.          Set_Alignment_Clause (Implicit_Base,  Alignment_Clause (Parent_Type));
  5691.  
  5692.          --  Process the subtype indication including a validation check
  5693.          --  on the constraint if any. If a constraint is given, its bounds
  5694.          --  must be implicitly converted to the new type.
  5695.  
  5696.          if Nkind (Indic) = N_Subtype_Indication then
  5697.             declare
  5698.                Hi  : Node_Id;
  5699.                Lo  : Node_Id;
  5700.                R   : Node_Id := Range_Expression (Constraint (Indic));
  5701.  
  5702.             begin
  5703.                if Nkind (R) = N_Range then
  5704.                   Hi :=
  5705.                     Make_Unchecked_Type_Conversion (Loc,
  5706.                       Subtype_Mark => New_Occurrence_Of (Implicit_Base, Loc),
  5707.                       Expression => Relocate_Node (High_Bound (R)));
  5708.  
  5709.                   Lo :=
  5710.                     Make_Unchecked_Type_Conversion (Loc,
  5711.                       Subtype_Mark => New_Occurrence_Of (Implicit_Base, Loc),
  5712.                       Expression => Relocate_Node (Low_Bound (R)));
  5713.  
  5714.                else
  5715.                   --  Constraint is a Range attribute. Replace with the
  5716.                   --  explicit mention of the bounds of the prefix, which
  5717.                   --  must be a subtype.
  5718.  
  5719.                   Analyze (Prefix (R));
  5720.                   Hi :=
  5721.                     Make_Unchecked_Type_Conversion (Loc,
  5722.                       Subtype_Mark => New_Occurrence_Of (Implicit_Base, Loc),
  5723.                       Expression =>
  5724.                         Make_Attribute_Reference (Loc,
  5725.                           Attribute_Name => Name_Last,
  5726.                           Prefix =>
  5727.                             New_Occurrence_Of (Entity (Prefix (R)), Loc)));
  5728.  
  5729.                   Lo :=
  5730.                     Make_Unchecked_Type_Conversion (Loc,
  5731.                       Subtype_Mark => New_Occurrence_Of (Implicit_Base, Loc),
  5732.                       Expression =>
  5733.                         Make_Attribute_Reference (Loc,
  5734.                         Attribute_Name => Name_First,
  5735.                         Prefix =>
  5736.                           New_Occurrence_Of (Entity (Prefix (R)), Loc)));
  5737.                end if;
  5738.  
  5739.                I_Node :=
  5740.                  Make_Subtype_Indication (Loc,
  5741.                    Subtype_Mark => New_Occurrence_Of (Implicit_Base, Loc),
  5742.                    Constraint =>
  5743.                      Make_Range_Constraint (Loc,
  5744.                        Range_Expression => Make_Range (Loc, Lo, Hi)));
  5745.             end;
  5746.  
  5747.          else
  5748.             I_Node := New_Occurrence_Of (Implicit_Base, Loc);
  5749.          end if;
  5750.  
  5751.          Rewrite_Substitute_Tree (N,
  5752.            Make_Subtype_Declaration (Loc,
  5753.              Defining_Identifier => Derived_Type,
  5754.              Subtype_Indication => I_Node));
  5755.          Analyze (N);
  5756.       end if;
  5757.    end Build_Derived_Enumeration_Type;
  5758.  
  5759.    -------------------------------
  5760.    -- Build_Derived_Record_Type --
  5761.    -------------------------------
  5762.  
  5763.    procedure Build_Derived_Record_Type
  5764.      (N            : Node_Id;
  5765.       Parent_Type  : Entity_Id;
  5766.       Derived_Type : Entity_Id)
  5767.    is
  5768.       Type_Def : constant Node_Id := Type_Definition (N);
  5769.       Indic    : constant Node_Id := Subtype_Indication (Type_Def);
  5770.       New_Decl : Node_Id;
  5771.       I_Node   : Node_Id;
  5772.       Discs    : Elist_Id;
  5773.       Loc      : constant Source_Ptr := Sloc (N);
  5774.       Derived_Base : Entity_Id;
  5775.       Parent_Base  : Entity_Id := Base_Type (Parent_Type);
  5776.  
  5777.    begin
  5778.       --  A derived record type has the same fields and types as the parent.
  5779.       --  If the subtype indication has a constraint,  the constraint must be
  5780.       --  applied to the derived type to create the derived subtype. However,
  5781.       --  if the declaration has a discriminant part, the constraint on the
  5782.       --  parent type does not make the derived type into a constrained type,
  5783.       --  but the constraint only serves to rename the discriminants.
  5784.       --  For non-tagged types this is the only legal use of new
  5785.       --  discriminants.
  5786.  
  5787.       if Present (Discriminant_Specifications (N)) then
  5788.          New_Scope (Derived_Type);
  5789.          Process_Discriminants (N);
  5790.  
  5791.          if  Nkind (Indic) = N_Subtype_Indication then
  5792.             Discs :=
  5793.               Build_Discriminant_Constraints (Parent_Type, Indic, Empty);
  5794.          end if;
  5795.  
  5796.          End_Scope;
  5797.          Derived_Base := Derived_Type;
  5798.  
  5799.       else
  5800.          --  Introduce an implicit base type (derived from parent) and
  5801.          --  make the new derived type a subtype of it.
  5802.  
  5803.          Derived_Base :=
  5804.               New_Itype_Not_Attached (Ekind (Base_Type (Parent_Base)),
  5805.                                       Loc, Derived_Type, 'B');
  5806.          Set_Etype (Derived_Base, Parent_Base);
  5807.  
  5808.       end if;
  5809.  
  5810.       Set_Is_Constrained    (Derived_Base, Is_Constrained    (Parent_Type));
  5811.       Set_Is_Limited_Record (Derived_Base, Is_Limited_Record (Parent_Type));
  5812.       Set_Has_Discriminants (Derived_Base, Has_Discriminants (Parent_Type));
  5813.       Set_Esize             (Derived_Base, Esize             (Parent_Type));
  5814.       Set_Alignment_Clause  (Derived_Base, Alignment_Clause  (Parent_Type));
  5815.  
  5816.       if Has_Discriminants (Derived_Base) then
  5817.          Set_Discriminant_Constraint
  5818.                     (Derived_Base, Discriminant_Constraint (Parent_Type));
  5819.       end if;
  5820.  
  5821.       if Is_Private_Type (Derived_Base) then
  5822.          Set_Private_Dependents (Derived_Base, New_Elmt_List);
  5823.       end if;
  5824.  
  5825.       New_Decl :=
  5826.         New_Copy_With_Replacement (Parent (Parent_Base),
  5827.           Inherit_Components (N, Parent_Base, Derived_Base));
  5828.  
  5829.       if Present (Discriminant_Specifications (N)) then
  5830.          Rewrite_Substitute_Tree (N, New_Decl);
  5831.       else
  5832.          --  Insert derived type before current declaration, and
  5833.          --  then rewrite current declaration as a subtype of the
  5834.          --  derived base.
  5835.  
  5836.          Mark_Rewrite_Insertion (New_Decl);
  5837.          Insert_Before (N, New_Decl);
  5838.          Set_Depends_On_Private (Derived_Base,
  5839.                                  Has_Private_Component (Derived_Base));
  5840.          Set_Has_Delayed_Freeze (Derived_Base, True);
  5841.  
  5842.          if Nkind (Indic) = N_Subtype_Indication then
  5843.             I_Node :=
  5844.               Make_Subtype_Indication (Loc,
  5845.                 Subtype_Mark => New_Occurrence_Of (Derived_Base, Loc),
  5846.                 Constraint => Constraint (Indic));
  5847.          else
  5848.             I_Node := New_Occurrence_Of (Derived_Base, Loc);
  5849.          end if;
  5850.  
  5851.          Rewrite_Substitute_Tree (N,
  5852.            Make_Subtype_Declaration (Loc,
  5853.              Defining_Identifier => Derived_Type,
  5854.              Subtype_Indication => I_Node));
  5855.          Analyze (N);
  5856.       end if;
  5857.    end Build_Derived_Record_Type;
  5858.  
  5859.    --------------------------------
  5860.    -- Derived_Standard_Character --
  5861.    --------------------------------
  5862.  
  5863.    procedure Derived_Standard_Character
  5864.      (N             : Node_Id;
  5865.       Parent_Type   : Entity_Id;
  5866.       Derived_Type  : Entity_Id)
  5867.    is
  5868.       Def           : constant Node_Id   := Type_Definition (N);
  5869.       Indic         : constant Node_Id   := Subtype_Indication (Def);
  5870.       Implicit_Base : constant Entity_Id :=
  5871.                         New_Itype
  5872.                           (E_Enumeration_Type, N, Parent_Type, 'B');
  5873.  
  5874.       Lo, Hi        : Node_Id;
  5875.       R_Node        : Node_Id;
  5876.  
  5877.    begin
  5878.       Set_Etype (Implicit_Base, Base_Type (Parent_Type));
  5879.       Set_Esize (Implicit_Base, Esize (Root_Type (Parent_Type)));
  5880.       Set_Is_Character_Type (Implicit_Base, True);
  5881.  
  5882.       R_Node := New_Node (N_Range, Sloc (N));
  5883.       Set_Low_Bound (R_Node, New_Copy (Type_Low_Bound (Parent_Type)));
  5884.       Set_High_Bound (R_Node, New_Copy (Type_High_Bound (Parent_Type)));
  5885.       Set_Scalar_Range (Implicit_Base, R_Node);
  5886.  
  5887.       R_Node := New_Node (N_Range, Sloc (N));
  5888.  
  5889.       Set_Ekind (Derived_Type, E_Enumeration_Subtype);
  5890.       Set_Etype (Derived_Type, Implicit_Base);
  5891.       Set_Esize (Derived_Type, Esize (Root_Type (Parent_Type)));
  5892.       Set_Is_Character_Type (Derived_Type, True);
  5893.  
  5894.       if Nkind (Indic) = N_Subtype_Indication then
  5895.          Lo := New_Copy (Low_Bound (Range_Expression (Constraint (Indic))));
  5896.          Hi := New_Copy (High_Bound (Range_Expression (Constraint (Indic))));
  5897.       else
  5898.          Lo := New_Copy (Type_Low_Bound (Parent_Type));
  5899.          Hi := New_Copy (Type_High_Bound (Parent_Type));
  5900.       end if;
  5901.  
  5902.       Set_Low_Bound (R_Node, Lo);
  5903.       Set_High_Bound (R_Node, Hi);
  5904.       Set_Scalar_Range (Derived_Type, R_Node);
  5905.  
  5906.       Analyze (Lo);
  5907.       Analyze (Hi);
  5908.       Resolve (Lo, Derived_Type);
  5909.       Resolve (Hi, Derived_Type);
  5910.  
  5911.    end Derived_Standard_Character;
  5912.  
  5913.    -------------------------------
  5914.    -- Build_Derived_Tagged_Type --
  5915.    -------------------------------
  5916.  
  5917.    procedure Build_Derived_Tagged_Type
  5918.      (N            : Node_Id;
  5919.       Type_Def     : Node_Id;
  5920.       Parent_Type  : Entity_Id;
  5921.       Derived_Type : Entity_Id)
  5922.    is
  5923.       Assoc_List : Elist_Id;
  5924.       E          : Entity_Id;
  5925.  
  5926.       Subtype_Indic_Case : constant Boolean :=
  5927.         Nkind (Subtype_Indication (Type_Def)) = N_Subtype_Indication;
  5928.  
  5929.    begin
  5930.       Set_Is_Tagged_Type (Derived_Type);
  5931.       Set_Primitive_Operations (Derived_Type, New_Elmt_List);
  5932.       Set_Is_Limited_Record (Derived_Type, (Is_Limited_Record (Parent_Type)));
  5933.       New_Scope (Derived_Type);
  5934.  
  5935.       if Type_Access_Level (Derived_Type)
  5936.         /= Type_Access_Level (Parent_Type)
  5937.       then
  5938.          if Is_Controlled (Parent_Type) then
  5939.             Error_Msg_N
  5940.               ("controlled type must be declared at the library level?",
  5941.               Subtype_Indication (Type_Def));
  5942.          else
  5943.             Error_Msg_N
  5944.               ("type extension not allowed at deeper level than parent?",
  5945.               Subtype_Indication (Type_Def));
  5946.          end if;
  5947.          Temporary_Msg_N
  5948.            ("this will be a fatal error in the next release?!",
  5949.            Subtype_Indication (Type_Def));
  5950.          Temporary_Msg_N ("!see gnatinfo.txt for details?!",
  5951.            Subtype_Indication (Type_Def));
  5952.       end if;
  5953.  
  5954.       if Present (Discriminant_Specifications (N)) then
  5955.          if Is_Constrained (Parent_Type) or else Subtype_Indic_Case then
  5956.             Check_Or_Process_Discriminants (N, Derived_Type);
  5957.  
  5958.          else
  5959.             --  If a known_discriminant_part is provided then the parent
  5960.             --  subtype must be constrained (RM 3.7(13)).
  5961.  
  5962.             Error_Msg_N ("unconstrained type not allowed in this context",
  5963.               Subtype_Indication (Type_Def));
  5964.          end if;
  5965.  
  5966.       else
  5967.          --  The derived type can only have inherited discriminants if the
  5968.          --  parent type is unconstrained
  5969.  
  5970.          if Is_Constrained (Parent_Type) or else Subtype_Indic_Case then
  5971.             Set_Has_Discriminants (Derived_Type, False);
  5972.          else
  5973.             Set_Has_Discriminants (Derived_Type, True);
  5974.             Set_Discriminant_Constraint (Derived_Type,
  5975.               Discriminant_Constraint (Parent_Type));
  5976.          end if;
  5977.       end if;
  5978.  
  5979.       Set_Is_Constrained (Derived_Type, not Has_Discriminants (Derived_Type));
  5980.  
  5981.       --  Analyze the extension
  5982.  
  5983.       if Nkind (N) = N_Private_Extension_Declaration then
  5984.          Set_Ekind (Derived_Type, E_Record_Type_With_Private);
  5985.          Assoc_List := Inherit_Components (N, Parent_Type, Derived_Type);
  5986.  
  5987.       else
  5988.          Set_Ekind (Derived_Type, E_Record_Type);
  5989.          Assoc_List := Inherit_Components (N, Parent_Type, Derived_Type);
  5990.          Expand_Derived_Record (Derived_Type, Type_Def);
  5991.  
  5992.          --  Make previous components visible, to catch duplicates and
  5993.          --  invalid dependencies between components, (except for inherited
  5994.          --  discriminants that could hide new discriminants).
  5995.          --  Non-inherited discriminants are already in scope and visible.
  5996.  
  5997.          E := First_Entity (Derived_Type);
  5998.  
  5999.          while Present (E) loop
  6000.             if Ekind (E) = E_Component
  6001.               and then Ekind (Original_Record_Component (E)) /= E_Discriminant
  6002.             then
  6003.                Set_Homonym (E, Current_Entity (E));
  6004.                Set_Current_Entity (E);
  6005.                Set_Scope (E, Derived_Type);
  6006.                Set_Is_Immediately_Visible (E, True);
  6007.                Set_Ekind (E, E_Void);
  6008.             end if;
  6009.  
  6010.             E := Next_Entity (E);
  6011.          end loop;
  6012.  
  6013.          Record_Type_Definition
  6014.            (Record_Extension_Part (Type_Def), Derived_Type);
  6015.       end if;
  6016.  
  6017.       End_Scope;
  6018.  
  6019.       --  All tagged types defined in Ada.Finalization are controlled
  6020.  
  6021.       if Chars (Scope (Derived_Type)) = Name_Finalization
  6022.         and then Chars (Scope (Scope (Derived_Type))) = Name_Ada
  6023.         and then Scope (Scope (Scope (Derived_Type))) = Standard_Standard
  6024.       then
  6025.          Note_Feature (Controlled_Types, Sloc (Derived_Type));
  6026.          Set_Is_Controlled (Derived_Type);
  6027.       else
  6028.          Set_Is_Controlled (Derived_Type, Is_Controlled (Parent_Type));
  6029.       end if;
  6030.  
  6031.       Make_Class_Wide_Type (Derived_Type);
  6032.       Set_Is_Abstract (Derived_Type, Abstract_Present (Type_Def));
  6033.  
  6034.       --  The parent type is frozen for non-private extensions (RM 13.13(7)).
  6035.  
  6036.       if not Is_Private_Type (Derived_Type) then
  6037.          Freeze_Before (N, Parent_Type);
  6038.       end if;
  6039.  
  6040.    end Build_Derived_Tagged_Type;
  6041.  
  6042.    ------------------------
  6043.    -- Inherit_Components --
  6044.    ------------------------
  6045.  
  6046.    function Inherit_Components
  6047.      (N            : Node_Id;
  6048.       Parent_Type  : Entity_Id;
  6049.       Derived_Type : Entity_Id)
  6050.       return         Elist_Id
  6051.    is
  6052.       Assoc_List : Elist_Id := New_Elmt_List;
  6053.       Comp       : Entity_Id;
  6054.       New_Comp   : Entity_Id;
  6055.       Old_Disc   : Entity_Id;
  6056.  
  6057.       function Assoc (C : Entity_Id) return Entity_Id;
  6058.       --  This function searches the association list, and returns the entity
  6059.       --  that is associated with C. A matching entry is assumed to be present.
  6060.  
  6061.       procedure Inherit_Discriminant (Old_Disc : Entity_Id);
  6062.       --  Procedure to do discriminant inheritance processing for one discr
  6063.  
  6064.       function Assoc (C : Entity_Id) return Entity_Id is
  6065.          Elmt : Elmt_Id;
  6066.  
  6067.       begin
  6068.          Elmt := First_Elmt (Assoc_List);
  6069.  
  6070.          while Present (Elmt) loop
  6071.  
  6072.             if Node (Elmt) = C then
  6073.                return Node (Next_Elmt (Elmt));
  6074.             end if;
  6075.  
  6076.             Elmt := Next_Elmt (Elmt);
  6077.          end loop;
  6078.  
  6079.          return Empty;
  6080.       end Assoc;
  6081.  
  6082.       procedure Inherit_Discriminant (Old_Disc : Entity_Id) is
  6083.          D_Minal : Node_Id;
  6084.  
  6085.       begin
  6086.          New_Comp := New_Copy (Old_Disc);
  6087.          Set_Scope (New_Comp, Derived_Type);
  6088.  
  6089.          Append_Elmt   (Old_Disc, Assoc_List);
  6090.          Append_Elmt   (New_Comp, Assoc_List);
  6091.          Append_Entity (New_Comp, Derived_Type);
  6092.  
  6093.          D_Minal :=
  6094.            Make_Defining_Identifier
  6095.                 (Sloc (N), New_External_Name (Chars (Old_Disc), 'D'));
  6096.          Set_Ekind (D_Minal, E_In_Parameter);
  6097.          Set_Etype (D_Minal, Etype (Old_Disc));
  6098.  
  6099.          Set_Discriminal (New_Comp, D_Minal);
  6100.       end Inherit_Discriminant;
  6101.  
  6102.    --  Start of processing for Inherit_Components
  6103.  
  6104.    begin
  6105.       Append_Elmt (Parent_Type,  Assoc_List);
  6106.       Append_Elmt (Derived_Type, Assoc_List);
  6107.  
  6108.       --  If the declaration has a discriminant part, the discriminants
  6109.       --  are already analyzed. If the parent type has discriminants,
  6110.       --  then some or all of them may correspond to the new discriminants.
  6111.       --  In  the case of untagged types, all of them must correspond.
  6112.       --  The correspondence determines the list of components that is built
  6113.       --  for the derived type. The discriminant part itself is not used
  6114.       --  further. It there are inherited discriminants, the discriminant
  6115.       --  part is incomplete,  but this does not affect subsequent expansion
  6116.       --  or translation in Gigi.
  6117.  
  6118.       if not Is_Tagged_Type (Parent_Type) then
  6119.  
  6120.          if Present (Discriminant_Specifications (N)) then
  6121.             New_Comp := First_Discriminant (Derived_Type);
  6122.  
  6123.             while Present (New_Comp) loop
  6124.                Old_Disc := Corresponding_Discriminant (New_Comp);
  6125.  
  6126.                if Present (Old_Disc) then
  6127.                   Append_Elmt (Old_Disc, Assoc_List);
  6128.                   Append_Elmt (New_Comp, Assoc_List);
  6129.  
  6130.                else
  6131.                   Error_Msg_N ("new discriminants must constrain old ones", N);
  6132.                end if;
  6133.  
  6134.                New_Comp := Next_Discriminant (New_Comp);
  6135.             end loop;
  6136.  
  6137.          elsif Has_Discriminants (Parent_Type) then
  6138.  
  6139.             --  Inherit all discriminants of parent.
  6140.  
  6141.             Old_Disc := First_Discriminant (Parent_Type);
  6142.  
  6143.             while Present (Old_Disc) loop
  6144.                Inherit_Discriminant (Old_Disc);
  6145.                Old_Disc := Next_Discriminant (Old_Disc);
  6146.             end loop;
  6147.          end if;
  6148.  
  6149.       else
  6150.          --  Parent type is tagged. Some of the discriminants may be
  6151.          --  renamed, some constrained, and some inherited.
  6152.          --  First we mark the renamed discriminants.  These renamed
  6153.          --  discriminants are not visible components of the derived
  6154.          --  type (3.4 (11)).
  6155.  
  6156.          if Present (Discriminant_Specifications (N)) then
  6157.             New_Comp := First_Discriminant (Derived_Type);
  6158.  
  6159.             while Present (New_Comp) loop
  6160.                Old_Disc := Corresponding_Discriminant (New_Comp);
  6161.  
  6162.                if Present (Old_Disc) then
  6163.                   Append_Elmt (Old_Disc, Assoc_List);
  6164.                   Append_Elmt (New_Comp, Assoc_List);
  6165.                end if;
  6166.  
  6167.                New_Comp := Next_Discriminant (New_Comp);
  6168.             end loop;
  6169.          end if;
  6170.  
  6171.          --  Next we inherit the discriminants of the parent which have
  6172.          --  not been renamed. If there is a discriminant constraint on
  6173.          --  the parent, the inherited components are not discriminants
  6174.          --  any longer, and cannot participate in  subsequent constraints
  6175.          --  on the derived type.
  6176.  
  6177.          if Has_Discriminants (Parent_Type) then
  6178.             Old_Disc := First_Discriminant (Parent_Type);
  6179.  
  6180.             while Present (Old_Disc) loop
  6181.  
  6182.                if No (Assoc (Old_Disc)) then
  6183.                   Inherit_Discriminant (Old_Disc);
  6184.  
  6185.                   if Is_Constrained (Parent_Type)
  6186.                     or else (Nkind (N) = N_Private_Extension_Declaration
  6187.                               and then Nkind (Subtype_Indication (N)) =
  6188.                                                     N_Subtype_Indication)
  6189.                     or else (Nkind (N) = N_Full_Type_Declaration
  6190.                               and then Nkind
  6191.                                 (Subtype_Indication (Type_Definition (N))) =
  6192.                                                     N_Subtype_Indication)
  6193.                   then
  6194.                      --  The old discriminant is now a regular component
  6195.  
  6196.                      Set_Ekind (New_Comp, E_Component);
  6197.                   end if;
  6198.                end if;
  6199.  
  6200.                Old_Disc := Next_Discriminant (Old_Disc);
  6201.             end loop;
  6202.          end if;
  6203.  
  6204.       end if;
  6205.  
  6206.       --  Finally, inherit non-discriminant components unless they are not
  6207.       --  visible because defined or inherited from the full view of the parent
  6208.  
  6209.       Comp := First_Entity (Parent_Type);
  6210.  
  6211.       while Present (Comp) loop
  6212.  
  6213.          if Ekind (Comp) /= E_Component
  6214.            or else Chars (Comp) = Name_uParent
  6215.          then
  6216.             null;
  6217.  
  6218.          elsif not Is_Visible_Component (Comp) then
  6219.             null;
  6220.  
  6221.          else
  6222.             New_Comp := New_Copy (Comp);
  6223.  
  6224.             Append_Elmt   (Comp,     Assoc_List);
  6225.             Append_Elmt   (New_Comp, Assoc_List);
  6226.             Append_Entity (New_Comp, Derived_Type);
  6227.          end if;
  6228.  
  6229.          Comp := Next_Entity (Comp);
  6230.       end loop;
  6231.  
  6232.       return Assoc_List;
  6233.  
  6234.    end Inherit_Components;
  6235.  
  6236.    ---------------------
  6237.    --  Is_Null_Range --
  6238.    ---------------------
  6239.  
  6240.    function Is_Null_Range (Lo : Node_Id; Hi : Node_Id) return Boolean is
  6241.       Typ : Entity_Id := Etype (Lo);
  6242.  
  6243.    begin
  6244.       --  For discrete types, do the check against the bounds
  6245.  
  6246.       if Is_Discrete_Type (Typ) then
  6247.          return Expr_Value (Lo) > Expr_Value (Hi);
  6248.  
  6249.       --  For now, all other types are considered to be in range, TBSL ???
  6250.  
  6251.       else
  6252.          return False;
  6253.       end if;
  6254.    end Is_Null_Range;
  6255.  
  6256.    --------------------------
  6257.    -- Is_Visible_Component --
  6258.    --------------------------
  6259.  
  6260.    function Is_Visible_Component (C : Entity_Id) return Boolean is
  6261.       Original_Comp  : constant Entity_Id := Original_Record_Component (C);
  6262.       Original_Scope : constant Entity_Id := Scope (Original_Comp);
  6263.  
  6264.    begin
  6265.       --  This test only concern tagged types
  6266.  
  6267.       if not Is_Tagged_Type (Original_Scope) then
  6268.          return True;
  6269.  
  6270.       --  If it is _Parent or _Tag, there is no visiblity issue
  6271.  
  6272.       elsif not Comes_From_Source (Original_Comp) then
  6273.          return True;
  6274.  
  6275.       --  If the component has been declared in an ancestor which is
  6276.       --  currently a private type, then it is not visible
  6277.  
  6278.       elsif Is_Private_Type (Original_Scope) then
  6279.          return False;
  6280.  
  6281.       --  There is another wierd way in which a component may be invisible
  6282.       --  when the private and the full view are not derived from the same
  6283.       --  ancestor. Here is an example :
  6284.  
  6285.       --       type A1 is tagged      record F1 : integer; end record;
  6286.       --       type A2 is new A2 with record F2 : integer; end record;
  6287.       --       type T is new A2 with private;
  6288.       --     private
  6289.       --       type T is new A1 with private;
  6290.  
  6291.       --  In this case, the full view of T inherits F1 and F2 but the
  6292.       --  private view inherits only F2
  6293.  
  6294.       else
  6295.          declare
  6296.             Ancestor : Entity_Id := Scope (C);
  6297.  
  6298.          begin
  6299.             loop
  6300.                if Ancestor = Original_Scope then
  6301.                   return True;
  6302.                elsif Ancestor = Etype (Ancestor) then
  6303.                   return False;
  6304.                end if;
  6305.  
  6306.                Ancestor := Etype (Ancestor);
  6307.             end loop;
  6308.  
  6309.             return True;
  6310.          end;
  6311.       end if;
  6312.    end Is_Visible_Component;
  6313.  
  6314.    ---------------------
  6315.    -- In_Visible_Part --
  6316.    ---------------------
  6317.  
  6318.    function In_Visible_Part (Scope_Id : Entity_Id) return Boolean is
  6319.    begin
  6320.       return
  6321.         (Ekind (Scope_Id) = E_Package
  6322.             or else Ekind (Scope_Id) = E_Generic_Package)
  6323.           and then In_Open_Scopes (Scope_Id)
  6324.           and then not In_Package_Body (Scope_Id)
  6325.           and then not In_Private_Part (Scope_Id);
  6326.    end In_Visible_Part;
  6327.  
  6328.    ----------------------------------
  6329.    -- Collect_Primitive_Operations --
  6330.    ----------------------------------
  6331.  
  6332.    function Collect_Primitive_Operations (T : Entity_Id) return Elist_Id is
  6333.       B_Type  : constant Entity_Id := Base_Type (T);
  6334.       B_Scope : constant Entity_Id := Scope (B_Type);
  6335.       Op_List : Elist_Id;
  6336.       Formal  : Entity_Id;
  6337.       Is_Prim : Boolean;
  6338.       Id      : Entity_Id;
  6339.  
  6340.    begin
  6341.       --  For tagged types, the primitive operations are collected as they
  6342.       --  are declared, and held in an explicit list which is simply returned.
  6343.  
  6344.       if Is_Tagged_Type (B_Type) then
  6345.          return Primitive_Operations (B_Type);
  6346.  
  6347.       else
  6348.          Op_List := New_Elmt_List;
  6349.  
  6350.          if B_Scope = Standard_Standard then
  6351.             if B_Type = Standard_String then
  6352.                Append_Elmt (Standard_Op_Concat, Op_List);
  6353.  
  6354.             elsif B_Type = Standard_Wide_String then
  6355.                Append_Elmt (Standard_Op_Concatw, Op_List);
  6356.  
  6357.             else
  6358.                null;
  6359.             end if;
  6360.  
  6361.          elsif Ekind (B_Scope) = E_Package
  6362.            or else Ekind (B_Scope) = E_Generic_Package
  6363.            or else Is_Derived_Type (B_Type)
  6364.          then
  6365.             Id := Next_Entity (B_Type);
  6366.  
  6367.             while Present (Id) loop
  6368.                if Is_Overloadable (Id) then
  6369.                   Is_Prim := False;
  6370.  
  6371.                   if Base_Type (Etype (Id)) = B_Type then
  6372.                      Is_Prim := True;
  6373.                   else
  6374.                      Formal := First_Formal (Id);
  6375.                      while Present (Formal) loop
  6376.                         if Base_Type (Etype (Formal)) = B_Type then
  6377.                            Is_Prim := True;
  6378.                            exit;
  6379.                         end if;
  6380.  
  6381.                         Formal := Next_Formal (Formal);
  6382.                      end loop;
  6383.                   end if;
  6384.  
  6385.                   if Is_Prim then
  6386.                      Append_Elmt (Id, Op_List);
  6387.                   end if;
  6388.                end if;
  6389.  
  6390.                Id := Next_Entity (Id);
  6391.  
  6392.             end loop;
  6393.  
  6394.          end if;
  6395.  
  6396.          return Op_List;
  6397.       end if;
  6398.    end Collect_Primitive_Operations;
  6399.  
  6400.    ------------------------
  6401.    -- Derive_Subprograms --
  6402.    ------------------------
  6403.  
  6404.    procedure Derive_Subprograms (Parent_Type, Derived_Type  : Entity_Id) is
  6405.       Op_List    : Elist_Id  := Collect_Primitive_Operations (Parent_Type);
  6406.       Elmt       : Elmt_Id;
  6407.       Subp       : Entity_Id;
  6408.       New_Subp   : Entity_Id;
  6409.       Formal     : Entity_Id;
  6410.       New_Formal : Entity_Id;
  6411.  
  6412.       procedure Replace_Type (Id, New_Id : Entity_Id);
  6413.       --  When the type is an anonymous access type, create a new access type
  6414.       --  designating the derived type. The implicit type mechanism doesn't
  6415.       --  need to be used because inherited subprograms are never used in Gigi.
  6416.  
  6417.       procedure Replace_Type (Id, New_Id : Entity_Id) is
  6418.          Acc_Type : Entity_Id;
  6419.  
  6420.       begin
  6421.          --  When the type is an anonymous access type, create a new access
  6422.          --  type designating the derived type. The implicit type mechanism
  6423.          --  doesn't need to be used because inherited subprograms are never
  6424.          --  used in Gigi.
  6425.  
  6426.          if Ekind (Etype (Id)) = E_Anonymous_Access_Type
  6427.            and then Base_Type (Designated_Type (Etype (Id)))
  6428.                   = Base_Type (Parent_Type)
  6429.          then
  6430.             Acc_Type := New_Copy (Etype (Id));
  6431.             Set_Etype (Acc_Type, Acc_Type);
  6432.             Set_Directly_Designated_Type (Acc_Type, Derived_Type);
  6433.  
  6434.             Set_Etype (New_Id, Acc_Type);
  6435.  
  6436.          elsif Base_Type (Etype (Id)) = Base_Type (Parent_Type) then
  6437.             Set_Etype (New_Id, Derived_Type);
  6438.          else
  6439.             Set_Etype (New_Id, Etype (Id));
  6440.          end if;
  6441.       end Replace_Type;
  6442.  
  6443.    --  Start of processing for Derive_Subprograms
  6444.  
  6445.    begin
  6446.       Elmt := First_Elmt (Op_List);
  6447.  
  6448.       while Present (Elmt) loop
  6449.          Subp := Node (Elmt);
  6450.          New_Subp := New_Entity (N_Defining_Identifier, Sloc (Derived_Type));
  6451.          Set_Ekind (New_Subp, Ekind (Subp));
  6452.          Set_Chars (New_Subp, Chars (Subp));
  6453.          Replace_Type (Subp, New_Subp);
  6454.          Conditional_Delay (New_Subp, Subp);
  6455.  
  6456.          Formal := First_Formal (Subp);
  6457.          while Present (Formal) loop
  6458.             New_Formal := New_Copy (Formal);
  6459.             Append_Entity (New_Formal, New_Subp);
  6460.             Replace_Type (Formal, New_Formal);
  6461.             Formal := Next_Formal (Formal);
  6462.          end loop;
  6463.  
  6464.          Set_Alias (New_Subp, Subp);
  6465.          New_Overloaded_Entity (New_Subp);
  6466.  
  6467.          --  Indicate that a derived subprogram does not require a body.
  6468.  
  6469.          Set_Has_Completion (New_Subp);
  6470.  
  6471.          --  A derived function with a controlling result is abstract.
  6472.          --  If the Derived_Type is a formal generic derived type,
  6473.          --  then inherited operations are not abstract: check is
  6474.          --  done at instantiation time.
  6475.  
  6476.          if Is_Generic_Type (Derived_Type) then
  6477.             null;
  6478.  
  6479.          elsif Is_Abstract (Subp)
  6480.            or else (Is_Tagged_Type (Derived_Type)
  6481.              and then Etype (New_Subp) = Derived_Type)
  6482.          then
  6483.             Set_Is_Abstract (New_Subp);
  6484.          end if;
  6485.  
  6486.          Elmt := Next_Elmt (Elmt);
  6487.       end loop;
  6488.    end Derive_Subprograms;
  6489.  
  6490.    -------------------------------------------
  6491.    -- Analyze_Private_Extension_Declaration --
  6492.    -------------------------------------------
  6493.  
  6494.    procedure Analyze_Private_Extension_Declaration (N : Node_Id) is
  6495.       T           : constant Entity_Id := Defining_Identifier (N);
  6496.       Indic       : constant Node_Id   := Subtype_Indication (N);
  6497.       Parent_Type : Entity_Id;
  6498.  
  6499.    begin
  6500.       Enter_Name (T);
  6501.  
  6502.       if Nkind (Indic) = N_Subtype_Indication then
  6503.          Find_Type (Subtype_Mark (Indic));
  6504.          Parent_Type := Entity (Subtype_Mark (Indic));
  6505.       else
  6506.          Find_Type (Indic);
  6507.          Parent_Type := Entity (Indic);
  6508.       end if;
  6509.  
  6510.       if not Is_Tagged_Type (Parent_Type) then
  6511.          Error_Msg_N
  6512.            ("parent of type extension must be a tagged type ", Indic);
  6513.          return;
  6514.       end if;
  6515.  
  6516.       if Ekind (Current_Scope) /= E_Package
  6517.         and then Ekind (Current_Scope) /= E_Generic_Package
  6518.         and then Nkind (Parent (N)) /= N_Generic_Subprogram_Declaration
  6519.       then
  6520.          Error_Msg_N ("invalid context for private extension", N);
  6521.       end if;
  6522.  
  6523.       Set_Is_Tagged_Type     (T, True);
  6524.       Set_Ekind              (T, E_Record_Type_With_Private);
  6525.       Set_Esize              (T, Uint_0);
  6526.       Set_Alignment_Clause   (T, Alignment_Clause (Parent_Type));
  6527.       Set_Etype              (T, Base_Type (Parent_Type));
  6528.       Set_Scope              (T, Current_Scope);
  6529.       Set_Is_Limited_Record  (T, Is_Limited_Record (Parent_Type));
  6530.       Set_Private_Dependents (T, New_Elmt_List);
  6531.       Set_Depends_On_Private (T, True);
  6532.       Set_Has_Delayed_Freeze (T, True);
  6533.  
  6534.       --  Entities declared in Pure unit should be set Is_Pure
  6535.       --  Since 'Partition_Id cannot be applied to such an entity
  6536.  
  6537.       Set_Is_Pure (T, Is_Pure (Current_Scope));
  6538.  
  6539.       Build_Derived_Tagged_Type (N, N, Parent_Type, T);
  6540.       Derive_Subprograms (Parent_Type, T);
  6541.    end Analyze_Private_Extension_Declaration;
  6542.  
  6543.    --------------------------
  6544.    -- Make_Class_Wide_Type --
  6545.    --------------------------
  6546.  
  6547.    procedure Make_Class_Wide_Type  (T : Entity_Id) is
  6548.       CW_Type : Entity_Id;
  6549.       CW_Name : Name_Id;
  6550.       Next_E  : Entity_Id;
  6551.  
  6552.    begin
  6553.  
  6554.       --  The class wide type can have been defined by the partial view in
  6555.       --  which case evertything is already done
  6556.  
  6557.       if Present (Class_Wide_Type (T)) then
  6558.          return;
  6559.       end if;
  6560.  
  6561.       CW_Type :=
  6562.         New_External_Entity (E_Void, Scope (T), Sloc (T), T, 'C', 0, 'T');
  6563.  
  6564.       --  Inherit root type characteristics
  6565.  
  6566.       CW_Name := Chars (CW_Type);
  6567.       Next_E  := Next_Entity (CW_Type);
  6568.       Copy_Node (T, CW_Type);
  6569.       Set_Chars (CW_Type, CW_Name);
  6570.       Set_Next_Entity (CW_Type, Next_E);
  6571.       Set_Has_Delayed_Freeze (CW_Type);
  6572.  
  6573.       --  Customize the class-wide type: It has no prim. op., it cannot be
  6574.       --  abstract and its Etype points back to the root type
  6575.  
  6576.       Set_Ekind (CW_Type, E_Class_Wide_Type);
  6577.       Set_Primitive_Operations (CW_Type,  New_Elmt_List);
  6578.       Set_Is_Abstract (CW_Type, False);
  6579.       Set_Etype (CW_Type, T);
  6580.       Set_Is_Constrained (CW_Type, False);
  6581.       Set_Class_Wide_Type (T, CW_Type);
  6582.  
  6583.       --  The class-wide type of a class-wide type is itself (RM 3.9(14))
  6584.  
  6585.       Set_Class_Wide_Type (CW_Type, CW_Type);
  6586.  
  6587.    end Make_Class_Wide_Type;
  6588.  
  6589.    ----------------------------------
  6590.    -- Analyze_Incomplete_Type_Decl --
  6591.    ----------------------------------
  6592.  
  6593.    procedure Analyze_Incomplete_Type_Decl (N : Node_Id) is
  6594.       F : constant Boolean := Is_Pure (Current_Scope);
  6595.       T : Node_Id;
  6596.  
  6597.    begin
  6598.       --  Process an incomplete declaration. The identifier must not have been
  6599.       --  declared already in the scope. However, an incomplete declaration may
  6600.       --  appear in the private part of a package, for a private type that has
  6601.       --  already been declared.
  6602.  
  6603.       --  In this case, the discriminants (if any) must match.
  6604.  
  6605.       T := Find_Type_Name (N);
  6606.  
  6607.       Set_Ekind (T, E_Incomplete_Type);
  6608.       Set_Etype (T, T);
  6609.       New_Scope (T);
  6610.  
  6611.       if Present (Discriminant_Specifications (N)) then
  6612.          Process_Discriminants (N);
  6613.       end if;
  6614.  
  6615.       End_Scope;
  6616.  
  6617.       --  Entities declared in Pure unit should be set Is_Pure
  6618.       --  Since 'Partition_Id cannot be applied to such an entity
  6619.  
  6620.       Set_Is_Pure (T, F);
  6621.    end Analyze_Incomplete_Type_Decl;
  6622.  
  6623.    ----------------------------
  6624.    -- Access_Type_Declaration --
  6625.    ----------------------------
  6626.  
  6627.    procedure Access_Type_Declaration (T : Entity_Id; Def : Node_Id) is
  6628.       S : constant Node_Id := Subtype_Indication (Def);
  6629.       P : constant Node_Id := Parent (Def);
  6630.  
  6631.    begin
  6632.       --  Check for permissible use of incomplete type
  6633.  
  6634.       if Nkind (S) /= N_Subtype_Indication then
  6635.          Analyze (S);
  6636.  
  6637.          if Ekind (Entity (S)) = E_Incomplete_Type then
  6638.             Set_Directly_Designated_Type (T, Entity (S));
  6639.          else
  6640.             Set_Directly_Designated_Type (T,
  6641.               Process_Subtype (S, P, T, 'P'));
  6642.          end if;
  6643.  
  6644.       else
  6645.          Set_Directly_Designated_Type (T,
  6646.            Process_Subtype (S, P, T, 'P'));
  6647.       end if;
  6648.  
  6649.       if All_Present (Def) or Constant_Present (Def) then
  6650.          Set_Ekind (T, E_General_Access_Type);
  6651.       else
  6652.          Set_Ekind (T, E_Access_Type);
  6653.       end if;
  6654.  
  6655.       if Base_Type (Designated_Type (T)) = T then
  6656.          Error_Msg_N ("access type cannot designate itself", S);
  6657.       end if;
  6658.  
  6659.       Set_Etype     (T, T);
  6660.       Set_Esize     (T, UI_From_Int (System_Address_Size));
  6661.       Set_Is_Access_Constant (T, Constant_Present (Def));
  6662.  
  6663.       --  Note that Has_Tasks is always false, since the access type itself
  6664.       --  is not a task type. See Einfo for more description on this point.
  6665.       --  Exactly the same consideration applies to Has_Controlled.
  6666.  
  6667.       Set_Has_Tasks      (T, False);
  6668.       Set_Has_Controlled (T, False);
  6669.    end Access_Type_Declaration;
  6670.  
  6671.    -----------------------------------
  6672.    -- Access_Subprogram_Declaration --
  6673.    -----------------------------------
  6674.  
  6675.    procedure Access_Subprogram_Declaration
  6676.      (T_Name : Entity_Id;
  6677.       T_Def  : Node_Id)
  6678.    is
  6679.       Formals : constant List_Id   := Parameter_Specifications (T_Def);
  6680.  
  6681.       --  The attachment of the itype is delayed otherwise it would be at
  6682.       --  the beginning of the itype list which is incorrect in presence
  6683.       --  of access parameters.
  6684.  
  6685.       Desig_Type : constant Entity_Id :=
  6686.         New_Itype_Not_Attached (E_Subprogram_Type, Sloc (Parent (T_Def)));
  6687.  
  6688.    begin
  6689.       if Nkind (T_Def) = N_Access_Function_Definition then
  6690.          Analyze (Subtype_Mark (T_Def));
  6691.          Set_Etype (Desig_Type, Entity (Subtype_Mark (T_Def)));
  6692.       else
  6693.          Set_Etype (Desig_Type, Standard_Void_Type);
  6694.       end if;
  6695.  
  6696.       if Present (Formals) then
  6697.          New_Scope (Desig_Type);
  6698.          Process_Formals (Desig_Type, Formals, Parent (T_Def));
  6699.          End_Scope;
  6700.       end if;
  6701.  
  6702.       Attach_Itype_To (Parent (T_Def), Desig_Type);
  6703.       Check_Delayed_Subprogram (Desig_Type);
  6704.  
  6705.       Set_Ekind     (T_Name, E_Access_Subprogram_Type);
  6706.       Set_Etype     (T_Name, T_Name);
  6707.       Set_Esize     (T_Name, UI_From_Int (System_Address_Size));
  6708.       Set_Directly_Designated_Type (T_Name, Desig_Type);
  6709.    end Access_Subprogram_Declaration;
  6710.  
  6711.    ----------------------
  6712.    -- Constrain_Access --
  6713.    ----------------------
  6714.  
  6715.    procedure Constrain_Access
  6716.      (Def_Id      : in out Entity_Id;
  6717.       S           : Node_Id;
  6718.       Related_Nod : Node_Id)
  6719.    is
  6720.       T             : constant Entity_Id := Entity (Subtype_Mark (S));
  6721.       Desig_Type    : constant Entity_Id := Designated_Type (T);
  6722.       Desig_Subtype : Entity_Id := Empty;
  6723.       Constraint_OK : Boolean := True;
  6724.  
  6725.    begin
  6726.       if Ekind (Desig_Type) = E_Array_Type
  6727.         or else Ekind (Desig_Type) = E_String_Type
  6728.       then
  6729.          Constrain_Array (Desig_Subtype, S, Related_Nod, Def_Id, 'P');
  6730.  
  6731.       elsif Ekind (Desig_Type) = E_Record_Type
  6732.         or else Ekind (Desig_Type) = E_Task_Type
  6733.         or else Ekind (Desig_Type) = E_Protected_Type
  6734.         or else Is_Private_Type (Desig_Type)
  6735.       then
  6736.  
  6737.          --  ??? The following code is a temporary kludge to ignore
  6738.          --  discriminant constraint on access type if
  6739.          --  it is constraining the current record. Avoid creating the
  6740.          --  implicit subtype of the record we are currently compiling
  6741.          --  since right now, we cannot handle these.
  6742.          --  For now, just return the access type itself.
  6743.  
  6744.          if Desig_Type = Current_Scope
  6745.            and then No (Def_Id)
  6746.          then
  6747.             Def_Id := Entity (Subtype_Mark (S));
  6748.             return;
  6749.          end if;
  6750.  
  6751.          Desig_Subtype := New_Itype (E_Void, Related_Nod);
  6752.          Constrain_Discriminated_Type (Desig_Subtype, S, Related_Nod);
  6753.  
  6754.          if Is_Private_Type (Desig_Type) then
  6755.             Prepare_Private_Subtype_Completion (Desig_Subtype, Related_Nod);
  6756.          end if;
  6757.  
  6758.       else
  6759.          Error_Msg_N ("invalid constraint on access type", S);
  6760.          Desig_Subtype := Desig_Type; -- Ignore invalid constraint.
  6761.          Constraint_OK := False;
  6762.       end if;
  6763.  
  6764.       if No (Def_Id) then
  6765.          Def_Id := New_Itype (E_Access_Subtype, Related_Nod);
  6766.       else
  6767.          Set_Ekind (Def_Id, E_Access_Subtype);
  6768.       end if;
  6769.  
  6770.       if Constraint_OK then
  6771.          Set_Etype (Def_Id, T);
  6772.       else
  6773.          Set_Etype (Def_Id, Any_Type);
  6774.       end if;
  6775.  
  6776.       Set_Esize                    (Def_Id, Esize (T));
  6777.       Set_Directly_Designated_Type (Def_Id, Desig_Subtype);
  6778.       Set_Depends_On_Private       (Def_Id, Has_Private_Component (Def_Id));
  6779.       Set_Is_Access_Constant       (Def_Id, Is_Access_Constant (T));
  6780.    end Constrain_Access;
  6781.  
  6782.    -----------------------
  6783.    -- Access_Definition --
  6784.    -----------------------
  6785.  
  6786.    function Access_Definition
  6787.      (Related_Nod : Node_Id;
  6788.       N           : Node_Id)
  6789.       return        Entity_Id
  6790.    is
  6791.       Anon_Type : constant Entity_Id :=
  6792.         New_Itype (E_Anonymous_Access_Type, Related_Nod,
  6793.           Scope_Id => Scope (Current_Scope));
  6794.  
  6795.    begin
  6796.       if (Ekind (Current_Scope) = E_Entry
  6797.            or else Ekind (Current_Scope) = E_Entry_Family)
  6798.         and then Is_Task_Type (Etype (Scope (Current_Scope)))
  6799.       then
  6800.          Error_Msg_N ("task entries cannot have access parameters", N);
  6801.       end if;
  6802.  
  6803.       Find_Type (Subtype_Mark (N));
  6804.  
  6805.       Set_Directly_Designated_Type
  6806.                              (Anon_Type, Entity (Subtype_Mark (N)));
  6807.       Set_Etype              (Anon_Type, Anon_Type);
  6808.       Set_Depends_On_Private (Anon_Type, Has_Private_Component (Anon_Type));
  6809.  
  6810.       --  The annonymous access type is as public as the discriminated type or
  6811.       --  subprogram that defines it
  6812.  
  6813.       Set_Is_Public          (Anon_Type, Is_Public (Scope (Anon_Type)));
  6814.       return Anon_Type;
  6815.    end Access_Definition;
  6816.  
  6817.    -------------------------
  6818.    -- New_Binary_Operator --
  6819.    -------------------------
  6820.  
  6821.    procedure New_Binary_Operator (Op_Name : Name_Id; Typ : Entity_Id) is
  6822.       Loc : constant Source_Ptr := Sloc (Typ);
  6823.       Op  : Entity_Id;
  6824.  
  6825.       function Make_Op_Formal (Typ, Op : Entity_Id) return Entity_Id;
  6826.       --  Create abbreviated declaration for the formal of a predefined
  6827.       --  Operator 'Op' of type 'Typ'
  6828.  
  6829.       function Make_Op_Formal (Typ, Op : Entity_Id) return Entity_Id is
  6830.          Formal : Entity_Id;
  6831.  
  6832.       begin
  6833.          Formal := New_Internal_Entity (E_In_Parameter, Op, Loc, 'P');
  6834.          Set_Etype (Formal, Typ);
  6835.          return Formal;
  6836.       end Make_Op_Formal;
  6837.  
  6838.    --  Start of processing for Make_Op_Formal
  6839.  
  6840.    begin
  6841.       Op :=  New_Internal_Entity (E_Operator, Current_Scope, Loc, 'F');
  6842.  
  6843.       Set_Etype                   (Op, Typ);
  6844.       Set_Chars                   (Op, Op_Name);
  6845.       Set_Homonym                 (Op, Get_Name_Entity_Id (Op_Name));
  6846.       Set_Is_Immediately_Visible  (Op);
  6847.       Set_Is_Internal             (Op);
  6848.       Set_Is_Intrinsic_Subprogram (Op);
  6849.       Set_Has_Completion          (Op);
  6850.       Append_Entity               (Op, Current_Scope);
  6851.  
  6852.       Set_Name_Entity_Id (Op_Name, Op);
  6853.  
  6854.       Append_Entity (Make_Op_Formal (Typ, Op), Op);
  6855.       Append_Entity (Make_Op_Formal (Typ, Op), Op);
  6856.  
  6857.    end New_Binary_Operator;
  6858.  
  6859.    --------------------------------
  6860.    -- Process_Range_Expr_In_Decl --
  6861.    --------------------------------
  6862.  
  6863.    procedure Process_Range_Expr_In_Decl
  6864.      (R           : Node_Id;
  6865.       T           : Entity_Id;
  6866.       Related_Nod : Node_Id)
  6867.    is
  6868.       Lo : Node_Id;
  6869.       Hi : Node_Id;
  6870.  
  6871.    begin
  6872.       Analyze (R);
  6873.       Resolve (R, Base_Type (T));
  6874.  
  6875.       if Nkind (R) = N_Range then
  6876.          Lo := Low_Bound (R);
  6877.          Hi := High_Bound (R);
  6878.  
  6879.          --  Resolve (actually Sem_Eval) has checked that the bounds are in
  6880.          --  then range of the base type. Here we check whether the bounds
  6881.          --  are in the range of the subtype itself. This is complicated by
  6882.          --  the fact that the bounds may represent the null range in which
  6883.          --  case the Constraint_Error exception should not be raised.
  6884.  
  6885.          if Is_OK_Static_Expression (Lo)
  6886.            and then Is_OK_Static_Expression (Hi)
  6887.          then
  6888.             if not Is_Null_Range (Lo, Hi) then
  6889.                if Is_Out_Of_Range (Lo, T) then
  6890.                   Compile_Time_Constraint_Error
  6891.                     (Lo, "static value out of range?");
  6892.                end if;
  6893.  
  6894.                if Is_Out_Of_Range (Hi, T) then
  6895.                   Compile_Time_Constraint_Error
  6896.                     (Hi, "static value out of range?");
  6897.                end if;
  6898.             end if;
  6899.  
  6900.          --  Case of one of the two expressions is not static
  6901.  
  6902.          else
  6903.             if Present (Related_Nod) then
  6904.                Set_Has_Dynamic_Itype (Related_Nod);
  6905.             end if;
  6906.          end if;
  6907.       end if;
  6908.  
  6909.       Get_Index_Bounds (R, Lo, Hi);
  6910.       Remove_Side_Effects (Lo);
  6911.       Remove_Side_Effects (Hi);
  6912.    end Process_Range_Expr_In_Decl;
  6913.  
  6914.    --------------------------------------
  6915.    -- Process_Real_Range_Specification --
  6916.    --------------------------------------
  6917.  
  6918.    procedure Process_Real_Range_Specification (Def : Node_Id) is
  6919.       Spec : constant Node_Id := Real_Range_Specification (Def);
  6920.       Lo   : Node_Id;
  6921.       Hi   : Node_Id;
  6922.       Err  : Boolean := False;
  6923.  
  6924.       procedure Analyze_Bound (N : Node_Id);
  6925.       --  Analyze and check one bound
  6926.  
  6927.       procedure Analyze_Bound (N : Node_Id) is
  6928.       begin
  6929.          Analyze (N);
  6930.          Resolve (N, Any_Real);
  6931.  
  6932.          if not Is_OK_Static_Expression (N) then
  6933.             Error_Msg_N
  6934.               ("bound in real type definition is not static", N);
  6935.             Err := True;
  6936.          end if;
  6937.       end Analyze_Bound;
  6938.  
  6939.    begin
  6940.       if Present (Spec) then
  6941.          Lo := Low_Bound (Spec);
  6942.          Hi := High_Bound (Spec);
  6943.          Analyze_Bound (Lo);
  6944.          Analyze_Bound (Hi);
  6945.  
  6946.          --  If error, clear away junk range specification
  6947.  
  6948.          if Err then
  6949.             Set_Real_Range_Specification (Def, Empty);
  6950.          end if;
  6951.       end if;
  6952.    end Process_Real_Range_Specification;
  6953.  
  6954.    ----------------------------------
  6955.    -- Set_Scalar_Range_For_Subtype --
  6956.    ----------------------------------
  6957.  
  6958.    procedure Set_Scalar_Range_For_Subtype
  6959.      (Def_Id      : Entity_Id;
  6960.       R           : Node_Id;
  6961.       Subt        : Node_Id;
  6962.       Related_Nod : Node_Id)
  6963.    is
  6964.    begin
  6965.       Set_Scalar_Range (Def_Id, R);
  6966.  
  6967.       --  We need to link the range into the tree before resolving it so
  6968.       --  that types that are referenced, including importantly the subtype
  6969.       --  itself, are properly frozen (Freeze_Expression requires that the
  6970.       --  expression be properly linked into the tree). Of course if it is
  6971.       --  already linked in, then we do not disturb the current link.
  6972.  
  6973.       if No (Parent (R)) then
  6974.          Set_Parent (R, Def_Id);
  6975.       end if;
  6976.  
  6977.       Process_Range_Expr_In_Decl (R, Subt, Related_Nod);
  6978.    end Set_Scalar_Range_For_Subtype;
  6979.  
  6980. end Sem_Ch3;
  6981.