OSDN Git Service

2011-08-05 Robert Dewar <dewar@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / sem_ch3.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                              S E M _ C H 3                               --
6 --                                                                          --
7 --                                 B o d y                                  --
8 --                                                                          --
9 --          Copyright (C) 1992-2011, Free Software Foundation, Inc.         --
10 --                                                                          --
11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
12 -- terms of the  GNU General Public License as published  by the Free Soft- --
13 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
17 -- for  more details.  You should have  received  a copy of the GNU General --
18 -- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
19 -- http://www.gnu.org/licenses for a complete copy of the license.          --
20 --                                                                          --
21 -- GNAT was originally developed  by the GNAT team at  New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
23 --                                                                          --
24 ------------------------------------------------------------------------------
25
26 with Atree;    use Atree;
27 with Checks;   use Checks;
28 with Debug;    use Debug;
29 with Elists;   use Elists;
30 with Einfo;    use Einfo;
31 with Errout;   use Errout;
32 with Eval_Fat; use Eval_Fat;
33 with Exp_Ch3;  use Exp_Ch3;
34 with Exp_Ch9;  use Exp_Ch9;
35 with Exp_Disp; use Exp_Disp;
36 with Exp_Dist; use Exp_Dist;
37 with Exp_Tss;  use Exp_Tss;
38 with Exp_Util; use Exp_Util;
39 with Fname;    use Fname;
40 with Freeze;   use Freeze;
41 with Itypes;   use Itypes;
42 with Layout;   use Layout;
43 with Lib;      use Lib;
44 with Lib.Xref; use Lib.Xref;
45 with Namet;    use Namet;
46 with Nmake;    use Nmake;
47 with Opt;      use Opt;
48 with Restrict; use Restrict;
49 with Rident;   use Rident;
50 with Rtsfind;  use Rtsfind;
51 with Sem;      use Sem;
52 with Sem_Aux;  use Sem_Aux;
53 with Sem_Case; use Sem_Case;
54 with Sem_Cat;  use Sem_Cat;
55 with Sem_Ch6;  use Sem_Ch6;
56 with Sem_Ch7;  use Sem_Ch7;
57 with Sem_Ch8;  use Sem_Ch8;
58 with Sem_Ch13; use Sem_Ch13;
59 with Sem_Disp; use Sem_Disp;
60 with Sem_Dist; use Sem_Dist;
61 with Sem_Elim; use Sem_Elim;
62 with Sem_Eval; use Sem_Eval;
63 with Sem_Mech; use Sem_Mech;
64 with Sem_Prag; use Sem_Prag;
65 with Sem_Res;  use Sem_Res;
66 with Sem_Smem; use Sem_Smem;
67 with Sem_Type; use Sem_Type;
68 with Sem_Util; use Sem_Util;
69 with Sem_Warn; use Sem_Warn;
70 with Stand;    use Stand;
71 with Sinfo;    use Sinfo;
72 with Sinput;   use Sinput;
73 with Snames;   use Snames;
74 with Targparm; use Targparm;
75 with Tbuild;   use Tbuild;
76 with Ttypes;   use Ttypes;
77 with Uintp;    use Uintp;
78 with Urealp;   use Urealp;
79
80 package body Sem_Ch3 is
81
82    -----------------------
83    -- Local Subprograms --
84    -----------------------
85
86    procedure Add_Interface_Tag_Components (N : Node_Id; Typ : Entity_Id);
87    --  Ada 2005 (AI-251): Add the tag components corresponding to all the
88    --  abstract interface types implemented by a record type or a derived
89    --  record type.
90
91    procedure Build_Derived_Type
92      (N             : Node_Id;
93       Parent_Type   : Entity_Id;
94       Derived_Type  : Entity_Id;
95       Is_Completion : Boolean;
96       Derive_Subps  : Boolean := True);
97    --  Create and decorate a Derived_Type given the Parent_Type entity. N is
98    --  the N_Full_Type_Declaration node containing the derived type definition.
99    --  Parent_Type is the entity for the parent type in the derived type
100    --  definition and Derived_Type the actual derived type. Is_Completion must
101    --  be set to False if Derived_Type is the N_Defining_Identifier node in N
102    --  (i.e. Derived_Type = Defining_Identifier (N)). In this case N is not the
103    --  completion of a private type declaration. If Is_Completion is set to
104    --  True, N is the completion of a private type declaration and Derived_Type
105    --  is different from the defining identifier inside N (i.e. Derived_Type /=
106    --  Defining_Identifier (N)). Derive_Subps indicates whether the parent
107    --  subprograms should be derived. The only case where this parameter is
108    --  False is when Build_Derived_Type is recursively called to process an
109    --  implicit derived full type for a type derived from a private type (in
110    --  that case the subprograms must only be derived for the private view of
111    --  the type).
112    --
113    --  ??? These flags need a bit of re-examination and re-documentation:
114    --  ???  are they both necessary (both seem related to the recursion)?
115
116    procedure Build_Derived_Access_Type
117      (N            : Node_Id;
118       Parent_Type  : Entity_Id;
119       Derived_Type : Entity_Id);
120    --  Subsidiary procedure to Build_Derived_Type. For a derived access type,
121    --  create an implicit base if the parent type is constrained or if the
122    --  subtype indication has a constraint.
123
124    procedure Build_Derived_Array_Type
125      (N            : Node_Id;
126       Parent_Type  : Entity_Id;
127       Derived_Type : Entity_Id);
128    --  Subsidiary procedure to Build_Derived_Type. For a derived array type,
129    --  create an implicit base if the parent type is constrained or if the
130    --  subtype indication has a constraint.
131
132    procedure Build_Derived_Concurrent_Type
133      (N            : Node_Id;
134       Parent_Type  : Entity_Id;
135       Derived_Type : Entity_Id);
136    --  Subsidiary procedure to Build_Derived_Type. For a derived task or
137    --  protected type, inherit entries and protected subprograms, check
138    --  legality of discriminant constraints if any.
139
140    procedure Build_Derived_Enumeration_Type
141      (N            : Node_Id;
142       Parent_Type  : Entity_Id;
143       Derived_Type : Entity_Id);
144    --  Subsidiary procedure to Build_Derived_Type. For a derived enumeration
145    --  type, we must create a new list of literals. Types derived from
146    --  Character and [Wide_]Wide_Character are special-cased.
147
148    procedure Build_Derived_Numeric_Type
149      (N            : Node_Id;
150       Parent_Type  : Entity_Id;
151       Derived_Type : Entity_Id);
152    --  Subsidiary procedure to Build_Derived_Type. For numeric types, create
153    --  an anonymous base type, and propagate constraint to subtype if needed.
154
155    procedure Build_Derived_Private_Type
156      (N             : Node_Id;
157       Parent_Type   : Entity_Id;
158       Derived_Type  : Entity_Id;
159       Is_Completion : Boolean;
160       Derive_Subps  : Boolean := True);
161    --  Subsidiary procedure to Build_Derived_Type. This procedure is complex
162    --  because the parent may or may not have a completion, and the derivation
163    --  may itself be a completion.
164
165    procedure Build_Derived_Record_Type
166      (N            : Node_Id;
167       Parent_Type  : Entity_Id;
168       Derived_Type : Entity_Id;
169       Derive_Subps : Boolean := True);
170    --  Subsidiary procedure for Build_Derived_Type and
171    --  Analyze_Private_Extension_Declaration used for tagged and untagged
172    --  record types. All parameters are as in Build_Derived_Type except that
173    --  N, in addition to being an N_Full_Type_Declaration node, can also be an
174    --  N_Private_Extension_Declaration node. See the definition of this routine
175    --  for much more info. Derive_Subps indicates whether subprograms should
176    --  be derived from the parent type. The only case where Derive_Subps is
177    --  False is for an implicit derived full type for a type derived from a
178    --  private type (see Build_Derived_Type).
179
180    procedure Build_Discriminal (Discrim : Entity_Id);
181    --  Create the discriminal corresponding to discriminant Discrim, that is
182    --  the parameter corresponding to Discrim to be used in initialization
183    --  procedures for the type where Discrim is a discriminant. Discriminals
184    --  are not used during semantic analysis, and are not fully defined
185    --  entities until expansion. Thus they are not given a scope until
186    --  initialization procedures are built.
187
188    function Build_Discriminant_Constraints
189      (T           : Entity_Id;
190       Def         : Node_Id;
191       Derived_Def : Boolean := False) return Elist_Id;
192    --  Validate discriminant constraints and return the list of the constraints
193    --  in order of discriminant declarations, where T is the discriminated
194    --  unconstrained type. Def is the N_Subtype_Indication node where the
195    --  discriminants constraints for T are specified. Derived_Def is True
196    --  when building the discriminant constraints in a derived type definition
197    --  of the form "type D (...) is new T (xxx)". In this case T is the parent
198    --  type and Def is the constraint "(xxx)" on T and this routine sets the
199    --  Corresponding_Discriminant field of the discriminants in the derived
200    --  type D to point to the corresponding discriminants in the parent type T.
201
202    procedure Build_Discriminated_Subtype
203      (T           : Entity_Id;
204       Def_Id      : Entity_Id;
205       Elist       : Elist_Id;
206       Related_Nod : Node_Id;
207       For_Access  : Boolean := False);
208    --  Subsidiary procedure to Constrain_Discriminated_Type and to
209    --  Process_Incomplete_Dependents. Given
210    --
211    --     T (a possibly discriminated base type)
212    --     Def_Id (a very partially built subtype for T),
213    --
214    --  the call completes Def_Id to be the appropriate E_*_Subtype.
215    --
216    --  The Elist is the list of discriminant constraints if any (it is set
217    --  to No_Elist if T is not a discriminated type, and to an empty list if
218    --  T has discriminants but there are no discriminant constraints). The
219    --  Related_Nod is the same as Decl_Node in Create_Constrained_Components.
220    --  The For_Access says whether or not this subtype is really constraining
221    --  an access type. That is its sole purpose is the designated type of an
222    --  access type -- in which case a Private_Subtype Is_For_Access_Subtype
223    --  is built to avoid freezing T when the access subtype is frozen.
224
225    function Build_Scalar_Bound
226      (Bound : Node_Id;
227       Par_T : Entity_Id;
228       Der_T : Entity_Id) return Node_Id;
229    --  The bounds of a derived scalar type are conversions of the bounds of
230    --  the parent type. Optimize the representation if the bounds are literals.
231    --  Needs a more complete spec--what are the parameters exactly, and what
232    --  exactly is the returned value, and how is Bound affected???
233
234    procedure Build_Underlying_Full_View
235      (N   : Node_Id;
236       Typ : Entity_Id;
237       Par : Entity_Id);
238    --  If the completion of a private type is itself derived from a private
239    --  type, or if the full view of a private subtype is itself private, the
240    --  back-end has no way to compute the actual size of this type. We build
241    --  an internal subtype declaration of the proper parent type to convey
242    --  this information. This extra mechanism is needed because a full
243    --  view cannot itself have a full view (it would get clobbered during
244    --  view exchanges).
245
246    procedure Check_Access_Discriminant_Requires_Limited
247      (D   : Node_Id;
248       Loc : Node_Id);
249    --  Check the restriction that the type to which an access discriminant
250    --  belongs must be a concurrent type or a descendant of a type with
251    --  the reserved word 'limited' in its declaration.
252
253    procedure Check_Anonymous_Access_Components
254       (Typ_Decl  : Node_Id;
255        Typ       : Entity_Id;
256        Prev      : Entity_Id;
257        Comp_List : Node_Id);
258    --  Ada 2005 AI-382: an access component in a record definition can refer to
259    --  the enclosing record, in which case it denotes the type itself, and not
260    --  the current instance of the type. We create an anonymous access type for
261    --  the component, and flag it as an access to a component, so accessibility
262    --  checks are properly performed on it. The declaration of the access type
263    --  is placed ahead of that of the record to prevent order-of-elaboration
264    --  circularity issues in Gigi. We create an incomplete type for the record
265    --  declaration, which is the designated type of the anonymous access.
266
267    procedure Check_Delta_Expression (E : Node_Id);
268    --  Check that the expression represented by E is suitable for use as a
269    --  delta expression, i.e. it is of real type and is static.
270
271    procedure Check_Digits_Expression (E : Node_Id);
272    --  Check that the expression represented by E is suitable for use as a
273    --  digits expression, i.e. it is of integer type, positive and static.
274
275    procedure Check_Initialization (T : Entity_Id; Exp : Node_Id);
276    --  Validate the initialization of an object declaration. T is the required
277    --  type, and Exp is the initialization expression.
278
279    procedure Check_Interfaces (N : Node_Id; Def : Node_Id);
280    --  Check ARM rules 3.9.4 (15/2), 9.1 (9.d/2) and 9.4 (11.d/2)
281
282    procedure Check_Or_Process_Discriminants
283      (N    : Node_Id;
284       T    : Entity_Id;
285       Prev : Entity_Id := Empty);
286    --  If N is the full declaration of the completion T of an incomplete or
287    --  private type, check its discriminants (which are already known to be
288    --  conformant with those of the partial view, see Find_Type_Name),
289    --  otherwise process them. Prev is the entity of the partial declaration,
290    --  if any.
291
292    procedure Check_Real_Bound (Bound : Node_Id);
293    --  Check given bound for being of real type and static. If not, post an
294    --  appropriate message, and rewrite the bound with the real literal zero.
295
296    procedure Constant_Redeclaration
297      (Id : Entity_Id;
298       N  : Node_Id;
299       T  : out Entity_Id);
300    --  Various checks on legality of full declaration of deferred constant.
301    --  Id is the entity for the redeclaration, N is the N_Object_Declaration,
302    --  node. The caller has not yet set any attributes of this entity.
303
304    function Contain_Interface
305      (Iface  : Entity_Id;
306       Ifaces : Elist_Id) return Boolean;
307    --  Ada 2005: Determine whether Iface is present in the list Ifaces
308
309    procedure Convert_Scalar_Bounds
310      (N            : Node_Id;
311       Parent_Type  : Entity_Id;
312       Derived_Type : Entity_Id;
313       Loc          : Source_Ptr);
314    --  For derived scalar types, convert the bounds in the type definition to
315    --  the derived type, and complete their analysis. Given a constraint of the
316    --  form ".. new T range Lo .. Hi", Lo and Hi are analyzed and resolved with
317    --  T'Base, the parent_type. The bounds of the derived type (the anonymous
318    --  base) are copies of Lo and Hi. Finally, the bounds of the derived
319    --  subtype are conversions of those bounds to the derived_type, so that
320    --  their typing is consistent.
321
322    procedure Copy_Array_Base_Type_Attributes (T1, T2 : Entity_Id);
323    --  Copies attributes from array base type T2 to array base type T1. Copies
324    --  only attributes that apply to base types, but not subtypes.
325
326    procedure Copy_Array_Subtype_Attributes (T1, T2 : Entity_Id);
327    --  Copies attributes from array subtype T2 to array subtype T1. Copies
328    --  attributes that apply to both subtypes and base types.
329
330    procedure Create_Constrained_Components
331      (Subt        : Entity_Id;
332       Decl_Node   : Node_Id;
333       Typ         : Entity_Id;
334       Constraints : Elist_Id);
335    --  Build the list of entities for a constrained discriminated record
336    --  subtype. If a component depends on a discriminant, replace its subtype
337    --  using the discriminant values in the discriminant constraint. Subt
338    --  is the defining identifier for the subtype whose list of constrained
339    --  entities we will create. Decl_Node is the type declaration node where
340    --  we will attach all the itypes created. Typ is the base discriminated
341    --  type for the subtype Subt. Constraints is the list of discriminant
342    --  constraints for Typ.
343
344    function Constrain_Component_Type
345      (Comp            : Entity_Id;
346       Constrained_Typ : Entity_Id;
347       Related_Node    : Node_Id;
348       Typ             : Entity_Id;
349       Constraints     : Elist_Id) return Entity_Id;
350    --  Given a discriminated base type Typ, a list of discriminant constraint
351    --  Constraints for Typ and a component of Typ, with type Compon_Type,
352    --  create and return the type corresponding to Compon_type where all
353    --  discriminant references are replaced with the corresponding constraint.
354    --  If no discriminant references occur in Compon_Typ then return it as is.
355    --  Constrained_Typ is the final constrained subtype to which the
356    --  constrained Compon_Type belongs. Related_Node is the node where we will
357    --  attach all the itypes created.
358    --
359    --  Above description is confused, what is Compon_Type???
360
361    procedure Constrain_Access
362      (Def_Id      : in out Entity_Id;
363       S           : Node_Id;
364       Related_Nod : Node_Id);
365    --  Apply a list of constraints to an access type. If Def_Id is empty, it is
366    --  an anonymous type created for a subtype indication. In that case it is
367    --  created in the procedure and attached to Related_Nod.
368
369    procedure Constrain_Array
370      (Def_Id      : in out Entity_Id;
371       SI          : Node_Id;
372       Related_Nod : Node_Id;
373       Related_Id  : Entity_Id;
374       Suffix      : Character);
375    --  Apply a list of index constraints to an unconstrained array type. The
376    --  first parameter is the entity for the resulting subtype. A value of
377    --  Empty for Def_Id indicates that an implicit type must be created, but
378    --  creation is delayed (and must be done by this procedure) because other
379    --  subsidiary implicit types must be created first (which is why Def_Id
380    --  is an in/out parameter). The second parameter is a subtype indication
381    --  node for the constrained array to be created (e.g. something of the
382    --  form string (1 .. 10)). Related_Nod gives the place where this type
383    --  has to be inserted in the tree. The Related_Id and Suffix parameters
384    --  are used to build the associated Implicit type name.
385
386    procedure Constrain_Concurrent
387      (Def_Id      : in out Entity_Id;
388       SI          : Node_Id;
389       Related_Nod : Node_Id;
390       Related_Id  : Entity_Id;
391       Suffix      : Character);
392    --  Apply list of discriminant constraints to an unconstrained concurrent
393    --  type.
394    --
395    --    SI is the N_Subtype_Indication node containing the constraint and
396    --    the unconstrained type to constrain.
397    --
398    --    Def_Id is the entity for the resulting constrained subtype. A value
399    --    of Empty for Def_Id indicates that an implicit type must be created,
400    --    but creation is delayed (and must be done by this procedure) because
401    --    other subsidiary implicit types must be created first (which is why
402    --    Def_Id is an in/out parameter).
403    --
404    --    Related_Nod gives the place where this type has to be inserted
405    --    in the tree
406    --
407    --  The last two arguments are used to create its external name if needed.
408
409    function Constrain_Corresponding_Record
410      (Prot_Subt   : Entity_Id;
411       Corr_Rec    : Entity_Id;
412       Related_Nod : Node_Id;
413       Related_Id  : Entity_Id) return Entity_Id;
414    --  When constraining a protected type or task type with discriminants,
415    --  constrain the corresponding record with the same discriminant values.
416
417    procedure Constrain_Decimal (Def_Id : Node_Id; S : Node_Id);
418    --  Constrain a decimal fixed point type with a digits constraint and/or a
419    --  range constraint, and build E_Decimal_Fixed_Point_Subtype entity.
420
421    procedure Constrain_Discriminated_Type
422      (Def_Id      : Entity_Id;
423       S           : Node_Id;
424       Related_Nod : Node_Id;
425       For_Access  : Boolean := False);
426    --  Process discriminant constraints of composite type. Verify that values
427    --  have been provided for all discriminants, that the original type is
428    --  unconstrained, and that the types of the supplied expressions match
429    --  the discriminant types. The first three parameters are like in routine
430    --  Constrain_Concurrent. See Build_Discriminated_Subtype for an explanation
431    --  of For_Access.
432
433    procedure Constrain_Enumeration (Def_Id : Node_Id; S : Node_Id);
434    --  Constrain an enumeration type with a range constraint. This is identical
435    --  to Constrain_Integer, but for the Ekind of the resulting subtype.
436
437    procedure Constrain_Float (Def_Id : Node_Id; S : Node_Id);
438    --  Constrain a floating point type with either a digits constraint
439    --  and/or a range constraint, building a E_Floating_Point_Subtype.
440
441    procedure Constrain_Index
442      (Index        : Node_Id;
443       S            : Node_Id;
444       Related_Nod  : Node_Id;
445       Related_Id   : Entity_Id;
446       Suffix       : Character;
447       Suffix_Index : Nat);
448    --  Process an index constraint S in a constrained array declaration. The
449    --  constraint can be a subtype name, or a range with or without an explicit
450    --  subtype mark. The index is the corresponding index of the unconstrained
451    --  array. The Related_Id and Suffix parameters are used to build the
452    --  associated Implicit type name.
453
454    procedure Constrain_Integer (Def_Id : Node_Id; S : Node_Id);
455    --  Build subtype of a signed or modular integer type
456
457    procedure Constrain_Ordinary_Fixed (Def_Id : Node_Id; S : Node_Id);
458    --  Constrain an ordinary fixed point type with a range constraint, and
459    --  build an E_Ordinary_Fixed_Point_Subtype entity.
460
461    procedure Copy_And_Swap (Priv, Full : Entity_Id);
462    --  Copy the Priv entity into the entity of its full declaration then swap
463    --  the two entities in such a manner that the former private type is now
464    --  seen as a full type.
465
466    procedure Decimal_Fixed_Point_Type_Declaration
467      (T   : Entity_Id;
468       Def : Node_Id);
469    --  Create a new decimal fixed point type, and apply the constraint to
470    --  obtain a subtype of this new type.
471
472    procedure Complete_Private_Subtype
473      (Priv        : Entity_Id;
474       Full        : Entity_Id;
475       Full_Base   : Entity_Id;
476       Related_Nod : Node_Id);
477    --  Complete the implicit full view of a private subtype by setting the
478    --  appropriate semantic fields. If the full view of the parent is a record
479    --  type, build constrained components of subtype.
480
481    procedure Derive_Progenitor_Subprograms
482      (Parent_Type : Entity_Id;
483       Tagged_Type : Entity_Id);
484    --  Ada 2005 (AI-251): To complete type derivation, collect the primitive
485    --  operations of progenitors of Tagged_Type, and replace the subsidiary
486    --  subtypes with Tagged_Type, to build the specs of the inherited interface
487    --  primitives. The derived primitives are aliased to those of the
488    --  interface. This routine takes care also of transferring to the full view
489    --  subprograms associated with the partial view of Tagged_Type that cover
490    --  interface primitives.
491
492    procedure Derived_Standard_Character
493      (N             : Node_Id;
494       Parent_Type   : Entity_Id;
495       Derived_Type  : Entity_Id);
496    --  Subsidiary procedure to Build_Derived_Enumeration_Type which handles
497    --  derivations from types Standard.Character and Standard.Wide_Character.
498
499    procedure Derived_Type_Declaration
500      (T             : Entity_Id;
501       N             : Node_Id;
502       Is_Completion : Boolean);
503    --  Process a derived type declaration. Build_Derived_Type is invoked
504    --  to process the actual derived type definition. Parameters N and
505    --  Is_Completion have the same meaning as in Build_Derived_Type.
506    --  T is the N_Defining_Identifier for the entity defined in the
507    --  N_Full_Type_Declaration node N, that is T is the derived type.
508
509    procedure Enumeration_Type_Declaration (T : Entity_Id; Def : Node_Id);
510    --  Insert each literal in symbol table, as an overloadable identifier. Each
511    --  enumeration type is mapped into a sequence of integers, and each literal
512    --  is defined as a constant with integer value. If any of the literals are
513    --  character literals, the type is a character type, which means that
514    --  strings are legal aggregates for arrays of components of the type.
515
516    function Expand_To_Stored_Constraint
517      (Typ        : Entity_Id;
518       Constraint : Elist_Id) return Elist_Id;
519    --  Given a constraint (i.e. a list of expressions) on the discriminants of
520    --  Typ, expand it into a constraint on the stored discriminants and return
521    --  the new list of expressions constraining the stored discriminants.
522
523    function Find_Type_Of_Object
524      (Obj_Def     : Node_Id;
525       Related_Nod : Node_Id) return Entity_Id;
526    --  Get type entity for object referenced by Obj_Def, attaching the
527    --  implicit types generated to Related_Nod
528
529    procedure Floating_Point_Type_Declaration (T : Entity_Id; Def : Node_Id);
530    --  Create a new float and apply the constraint to obtain subtype of it
531
532    function Has_Range_Constraint (N : Node_Id) return Boolean;
533    --  Given an N_Subtype_Indication node N, return True if a range constraint
534    --  is present, either directly, or as part of a digits or delta constraint.
535    --  In addition, a digits constraint in the decimal case returns True, since
536    --  it establishes a default range if no explicit range is present.
537
538    function Inherit_Components
539      (N             : Node_Id;
540       Parent_Base   : Entity_Id;
541       Derived_Base  : Entity_Id;
542       Is_Tagged     : Boolean;
543       Inherit_Discr : Boolean;
544       Discs         : Elist_Id) return Elist_Id;
545    --  Called from Build_Derived_Record_Type to inherit the components of
546    --  Parent_Base (a base type) into the Derived_Base (the derived base type).
547    --  For more information on derived types and component inheritance please
548    --  consult the comment above the body of Build_Derived_Record_Type.
549    --
550    --    N is the original derived type declaration
551    --
552    --    Is_Tagged is set if we are dealing with tagged types
553    --
554    --    If Inherit_Discr is set, Derived_Base inherits its discriminants from
555    --    Parent_Base, otherwise no discriminants are inherited.
556    --
557    --    Discs gives the list of constraints that apply to Parent_Base in the
558    --    derived type declaration. If Discs is set to No_Elist, then we have
559    --    the following situation:
560    --
561    --      type Parent (D1..Dn : ..) is [tagged] record ...;
562    --      type Derived is new Parent [with ...];
563    --
564    --    which gets treated as
565    --
566    --      type Derived (D1..Dn : ..) is new Parent (D1,..,Dn) [with ...];
567    --
568    --  For untagged types the returned value is an association list. The list
569    --  starts from the association (Parent_Base => Derived_Base), and then it
570    --  contains a sequence of the associations of the form
571    --
572    --    (Old_Component => New_Component),
573    --
574    --  where Old_Component is the Entity_Id of a component in Parent_Base and
575    --  New_Component is the Entity_Id of the corresponding component in
576    --  Derived_Base. For untagged records, this association list is needed when
577    --  copying the record declaration for the derived base. In the tagged case
578    --  the value returned is irrelevant.
579
580    function Is_Valid_Constraint_Kind
581      (T_Kind          : Type_Kind;
582       Constraint_Kind : Node_Kind) return Boolean;
583    --  Returns True if it is legal to apply the given kind of constraint to the
584    --  given kind of type (index constraint to an array type, for example).
585
586    procedure Modular_Type_Declaration (T : Entity_Id; Def : Node_Id);
587    --  Create new modular type. Verify that modulus is in bounds
588
589    procedure New_Concatenation_Op (Typ : Entity_Id);
590    --  Create an abbreviated declaration for an operator in order to
591    --  materialize concatenation on array types.
592
593    procedure Ordinary_Fixed_Point_Type_Declaration
594      (T   : Entity_Id;
595       Def : Node_Id);
596    --  Create a new ordinary fixed point type, and apply the constraint to
597    --  obtain subtype of it.
598
599    procedure Prepare_Private_Subtype_Completion
600      (Id          : Entity_Id;
601       Related_Nod : Node_Id);
602    --  Id is a subtype of some private type. Creates the full declaration
603    --  associated with Id whenever possible, i.e. when the full declaration
604    --  of the base type is already known. Records each subtype into
605    --  Private_Dependents of the base type.
606
607    procedure Process_Incomplete_Dependents
608      (N      : Node_Id;
609       Full_T : Entity_Id;
610       Inc_T  : Entity_Id);
611    --  Process all entities that depend on an incomplete type. There include
612    --  subtypes, subprogram types that mention the incomplete type in their
613    --  profiles, and subprogram with access parameters that designate the
614    --  incomplete type.
615
616    --  Inc_T is the defining identifier of an incomplete type declaration, its
617    --  Ekind is E_Incomplete_Type.
618    --
619    --    N is the corresponding N_Full_Type_Declaration for Inc_T.
620    --
621    --    Full_T is N's defining identifier.
622    --
623    --  Subtypes of incomplete types with discriminants are completed when the
624    --  parent type is. This is simpler than private subtypes, because they can
625    --  only appear in the same scope, and there is no need to exchange views.
626    --  Similarly, access_to_subprogram types may have a parameter or a return
627    --  type that is an incomplete type, and that must be replaced with the
628    --  full type.
629    --
630    --  If the full type is tagged, subprogram with access parameters that
631    --  designated the incomplete may be primitive operations of the full type,
632    --  and have to be processed accordingly.
633
634    procedure Process_Real_Range_Specification (Def : Node_Id);
635    --  Given the type definition for a real type, this procedure processes and
636    --  checks the real range specification of this type definition if one is
637    --  present. If errors are found, error messages are posted, and the
638    --  Real_Range_Specification of Def is reset to Empty.
639
640    procedure Record_Type_Declaration
641      (T    : Entity_Id;
642       N    : Node_Id;
643       Prev : Entity_Id);
644    --  Process a record type declaration (for both untagged and tagged
645    --  records). Parameters T and N are exactly like in procedure
646    --  Derived_Type_Declaration, except that no flag Is_Completion is needed
647    --  for this routine. If this is the completion of an incomplete type
648    --  declaration, Prev is the entity of the incomplete declaration, used for
649    --  cross-referencing. Otherwise Prev = T.
650
651    procedure Record_Type_Definition (Def : Node_Id; Prev_T : Entity_Id);
652    --  This routine is used to process the actual record type definition (both
653    --  for untagged and tagged records). Def is a record type definition node.
654    --  This procedure analyzes the components in this record type definition.
655    --  Prev_T is the entity for the enclosing record type. It is provided so
656    --  that its Has_Task flag can be set if any of the component have Has_Task
657    --  set. If the declaration is the completion of an incomplete type
658    --  declaration, Prev_T is the original incomplete type, whose full view is
659    --  the record type.
660
661    procedure Replace_Components (Typ : Entity_Id; Decl : Node_Id);
662    --  Subsidiary to Build_Derived_Record_Type. For untagged records, we
663    --  build a copy of the declaration tree of the parent, and we create
664    --  independently the list of components for the derived type. Semantic
665    --  information uses the component entities, but record representation
666    --  clauses are validated on the declaration tree. This procedure replaces
667    --  discriminants and components in the declaration with those that have
668    --  been created by Inherit_Components.
669
670    procedure Set_Fixed_Range
671      (E   : Entity_Id;
672       Loc : Source_Ptr;
673       Lo  : Ureal;
674       Hi  : Ureal);
675    --  Build a range node with the given bounds and set it as the Scalar_Range
676    --  of the given fixed-point type entity. Loc is the source location used
677    --  for the constructed range. See body for further details.
678
679    procedure Set_Scalar_Range_For_Subtype
680      (Def_Id : Entity_Id;
681       R      : Node_Id;
682       Subt   : Entity_Id);
683    --  This routine is used to set the scalar range field for a subtype given
684    --  Def_Id, the entity for the subtype, and R, the range expression for the
685    --  scalar range. Subt provides the parent subtype to be used to analyze,
686    --  resolve, and check the given range.
687
688    procedure Signed_Integer_Type_Declaration (T : Entity_Id; Def : Node_Id);
689    --  Create a new signed integer entity, and apply the constraint to obtain
690    --  the required first named subtype of this type.
691
692    procedure Set_Stored_Constraint_From_Discriminant_Constraint
693      (E : Entity_Id);
694    --  E is some record type. This routine computes E's Stored_Constraint
695    --  from its Discriminant_Constraint.
696
697    procedure Diagnose_Interface (N : Node_Id;  E : Entity_Id);
698    --  Check that an entity in a list of progenitors is an interface,
699    --  emit error otherwise.
700
701    -----------------------
702    -- Access_Definition --
703    -----------------------
704
705    function Access_Definition
706      (Related_Nod : Node_Id;
707       N           : Node_Id) return Entity_Id
708    is
709       Loc                 : constant Source_Ptr := Sloc (Related_Nod);
710       Anon_Type           : Entity_Id;
711       Anon_Scope          : Entity_Id;
712       Desig_Type          : Entity_Id;
713       Decl                : Entity_Id;
714       Enclosing_Prot_Type : Entity_Id := Empty;
715
716    begin
717       Check_SPARK_Restriction ("access type is not allowed", N);
718
719       if Is_Entry (Current_Scope)
720         and then Is_Task_Type (Etype (Scope (Current_Scope)))
721       then
722          Error_Msg_N ("task entries cannot have access parameters", N);
723          return Empty;
724       end if;
725
726       --  Ada 2005: for an object declaration the corresponding anonymous
727       --  type is declared in the current scope.
728
729       --  If the access definition is the return type of another access to
730       --  function, scope is the current one, because it is the one of the
731       --  current type declaration.
732
733       if Nkind_In (Related_Nod, N_Object_Declaration,
734                                 N_Access_Function_Definition)
735       then
736          Anon_Scope := Current_Scope;
737
738       --  For the anonymous function result case, retrieve the scope of the
739       --  function specification's associated entity rather than using the
740       --  current scope. The current scope will be the function itself if the
741       --  formal part is currently being analyzed, but will be the parent scope
742       --  in the case of a parameterless function, and we always want to use
743       --  the function's parent scope. Finally, if the function is a child
744       --  unit, we must traverse the tree to retrieve the proper entity.
745
746       elsif Nkind (Related_Nod) = N_Function_Specification
747         and then Nkind (Parent (N)) /= N_Parameter_Specification
748       then
749          --  If the current scope is a protected type, the anonymous access
750          --  is associated with one of the protected operations, and must
751          --  be available in the scope that encloses the protected declaration.
752          --  Otherwise the type is in the scope enclosing the subprogram.
753
754          --  If the function has formals, The return type of a subprogram
755          --  declaration is analyzed in the scope of the subprogram (see
756          --  Process_Formals) and thus the protected type, if present, is
757          --  the scope of the current function scope.
758
759          if Ekind (Current_Scope) = E_Protected_Type then
760             Enclosing_Prot_Type := Current_Scope;
761
762          elsif Ekind (Current_Scope) = E_Function
763            and then Ekind (Scope (Current_Scope)) = E_Protected_Type
764          then
765             Enclosing_Prot_Type := Scope (Current_Scope);
766          end if;
767
768          if Present (Enclosing_Prot_Type) then
769             Anon_Scope := Scope (Enclosing_Prot_Type);
770
771          else
772             Anon_Scope := Scope (Defining_Entity (Related_Nod));
773          end if;
774
775       else
776          --  For access formals, access components, and access discriminants,
777          --  the scope is that of the enclosing declaration,
778
779          Anon_Scope := Scope (Current_Scope);
780       end if;
781
782       Anon_Type :=
783         Create_Itype
784           (E_Anonymous_Access_Type, Related_Nod, Scope_Id => Anon_Scope);
785
786       if All_Present (N)
787         and then Ada_Version >= Ada_2005
788       then
789          Error_Msg_N ("ALL is not permitted for anonymous access types", N);
790       end if;
791
792       --  Ada 2005 (AI-254): In case of anonymous access to subprograms call
793       --  the corresponding semantic routine
794
795       if Present (Access_To_Subprogram_Definition (N)) then
796
797          --  Compiler runtime units are compiled in Ada 2005 mode when building
798          --  the runtime library but must also be compilable in Ada 95 mode
799          --  (when bootstrapping the compiler).
800
801          Check_Compiler_Unit (N);
802
803          Access_Subprogram_Declaration
804            (T_Name => Anon_Type,
805             T_Def  => Access_To_Subprogram_Definition (N));
806
807          if Ekind (Anon_Type) = E_Access_Protected_Subprogram_Type then
808             Set_Ekind
809               (Anon_Type, E_Anonymous_Access_Protected_Subprogram_Type);
810          else
811             Set_Ekind
812               (Anon_Type, E_Anonymous_Access_Subprogram_Type);
813          end if;
814
815          Set_Can_Use_Internal_Rep
816            (Anon_Type, not Always_Compatible_Rep_On_Target);
817
818          --  If the anonymous access is associated with a protected operation
819          --  create a reference to it after the enclosing protected definition
820          --  because the itype will be used in the subsequent bodies.
821
822          if Ekind (Current_Scope) = E_Protected_Type then
823             Build_Itype_Reference (Anon_Type, Parent (Current_Scope));
824          end if;
825
826          return Anon_Type;
827       end if;
828
829       Find_Type (Subtype_Mark (N));
830       Desig_Type := Entity (Subtype_Mark (N));
831
832       Set_Directly_Designated_Type (Anon_Type, Desig_Type);
833       Set_Etype (Anon_Type, Anon_Type);
834
835       --  Make sure the anonymous access type has size and alignment fields
836       --  set, as required by gigi. This is necessary in the case of the
837       --  Task_Body_Procedure.
838
839       if not Has_Private_Component (Desig_Type) then
840          Layout_Type (Anon_Type);
841       end if;
842
843       --  Ada 2005 (AI-231): Ada 2005 semantics for anonymous access differs
844       --  from Ada 95 semantics. In Ada 2005, anonymous access must specify if
845       --  the null value is allowed. In Ada 95 the null value is never allowed.
846
847       if Ada_Version >= Ada_2005 then
848          Set_Can_Never_Be_Null (Anon_Type, Null_Exclusion_Present (N));
849       else
850          Set_Can_Never_Be_Null (Anon_Type, True);
851       end if;
852
853       --  The anonymous access type is as public as the discriminated type or
854       --  subprogram that defines it. It is imported (for back-end purposes)
855       --  if the designated type is.
856
857       Set_Is_Public (Anon_Type, Is_Public (Scope (Anon_Type)));
858
859       --  Ada 2005 (AI-231): Propagate the access-constant attribute
860
861       Set_Is_Access_Constant (Anon_Type, Constant_Present (N));
862
863       --  The context is either a subprogram declaration, object declaration,
864       --  or an access discriminant, in a private or a full type declaration.
865       --  In the case of a subprogram, if the designated type is incomplete,
866       --  the operation will be a primitive operation of the full type, to be
867       --  updated subsequently. If the type is imported through a limited_with
868       --  clause, the subprogram is not a primitive operation of the type
869       --  (which is declared elsewhere in some other scope).
870
871       if Ekind (Desig_Type) = E_Incomplete_Type
872         and then not From_With_Type (Desig_Type)
873         and then Is_Overloadable (Current_Scope)
874       then
875          Append_Elmt (Current_Scope, Private_Dependents (Desig_Type));
876          Set_Has_Delayed_Freeze (Current_Scope);
877       end if;
878
879       --  Ada 2005: if the designated type is an interface that may contain
880       --  tasks, create a Master entity for the declaration. This must be done
881       --  before expansion of the full declaration, because the declaration may
882       --  include an expression that is an allocator, whose expansion needs the
883       --  proper Master for the created tasks.
884
885       if Nkind (Related_Nod) = N_Object_Declaration
886          and then Expander_Active
887       then
888          if Is_Interface (Desig_Type)
889            and then Is_Limited_Record (Desig_Type)
890          then
891             Build_Class_Wide_Master (Anon_Type);
892
893          --  Similarly, if the type is an anonymous access that designates
894          --  tasks, create a master entity for it in the current context.
895
896          elsif Has_Task (Desig_Type)
897            and then Comes_From_Source (Related_Nod)
898            and then not Restriction_Active (No_Task_Hierarchy)
899          then
900             if not Has_Master_Entity (Current_Scope) then
901                Decl :=
902                  Make_Object_Declaration (Loc,
903                    Defining_Identifier =>
904                      Make_Defining_Identifier (Loc, Name_uMaster),
905                    Constant_Present => True,
906                    Object_Definition =>
907                      New_Reference_To (RTE (RE_Master_Id), Loc),
908                    Expression =>
909                      Make_Explicit_Dereference (Loc,
910                        New_Reference_To (RTE (RE_Current_Master), Loc)));
911
912                Insert_Before (Related_Nod, Decl);
913                Analyze (Decl);
914
915                Set_Master_Id (Anon_Type, Defining_Identifier (Decl));
916                Set_Has_Master_Entity (Current_Scope);
917             else
918                Build_Master_Renaming (Related_Nod, Anon_Type);
919             end if;
920          end if;
921       end if;
922
923       --  For a private component of a protected type, it is imperative that
924       --  the back-end elaborate the type immediately after the protected
925       --  declaration, because this type will be used in the declarations
926       --  created for the component within each protected body, so we must
927       --  create an itype reference for it now.
928
929       if Nkind (Parent (Related_Nod)) = N_Protected_Definition then
930          Build_Itype_Reference (Anon_Type, Parent (Parent (Related_Nod)));
931
932       --  Similarly, if the access definition is the return result of a
933       --  function, create an itype reference for it because it will be used
934       --  within the function body. For a regular function that is not a
935       --  compilation unit, insert reference after the declaration. For a
936       --  protected operation, insert it after the enclosing protected type
937       --  declaration. In either case, do not create a reference for a type
938       --  obtained through a limited_with clause, because this would introduce
939       --  semantic dependencies.
940
941       --  Similarly, do not create a reference if the designated type is a
942       --  generic formal, because no use of it will reach the backend.
943
944       elsif Nkind (Related_Nod) = N_Function_Specification
945         and then not From_With_Type (Desig_Type)
946         and then not Is_Generic_Type (Desig_Type)
947       then
948          if Present (Enclosing_Prot_Type) then
949             Build_Itype_Reference (Anon_Type, Parent (Enclosing_Prot_Type));
950
951          elsif Is_List_Member (Parent (Related_Nod))
952            and then Nkind (Parent (N)) /= N_Parameter_Specification
953          then
954             Build_Itype_Reference (Anon_Type, Parent (Related_Nod));
955          end if;
956
957       --  Finally, create an itype reference for an object declaration of an
958       --  anonymous access type. This is strictly necessary only for deferred
959       --  constants, but in any case will avoid out-of-scope problems in the
960       --  back-end.
961
962       elsif Nkind (Related_Nod) = N_Object_Declaration then
963          Build_Itype_Reference (Anon_Type, Related_Nod);
964       end if;
965
966       return Anon_Type;
967    end Access_Definition;
968
969    -----------------------------------
970    -- Access_Subprogram_Declaration --
971    -----------------------------------
972
973    procedure Access_Subprogram_Declaration
974      (T_Name : Entity_Id;
975       T_Def  : Node_Id)
976    is
977
978       procedure Check_For_Premature_Usage (Def : Node_Id);
979       --  Check that type T_Name is not used, directly or recursively, as a
980       --  parameter or a return type in Def. Def is either a subtype, an
981       --  access_definition, or an access_to_subprogram_definition.
982
983       -------------------------------
984       -- Check_For_Premature_Usage --
985       -------------------------------
986
987       procedure Check_For_Premature_Usage (Def : Node_Id) is
988          Param : Node_Id;
989
990       begin
991          --  Check for a subtype mark
992
993          if Nkind (Def) in N_Has_Etype then
994             if Etype (Def) = T_Name then
995                Error_Msg_N
996                  ("type& cannot be used before end of its declaration", Def);
997             end if;
998
999          --  If this is not a subtype, then this is an access_definition
1000
1001          elsif Nkind (Def) = N_Access_Definition then
1002             if Present (Access_To_Subprogram_Definition (Def)) then
1003                Check_For_Premature_Usage
1004                  (Access_To_Subprogram_Definition (Def));
1005             else
1006                Check_For_Premature_Usage (Subtype_Mark (Def));
1007             end if;
1008
1009          --  The only cases left are N_Access_Function_Definition and
1010          --  N_Access_Procedure_Definition.
1011
1012          else
1013             if Present (Parameter_Specifications (Def)) then
1014                Param := First (Parameter_Specifications (Def));
1015                while Present (Param) loop
1016                   Check_For_Premature_Usage (Parameter_Type (Param));
1017                   Param := Next (Param);
1018                end loop;
1019             end if;
1020
1021             if Nkind (Def) = N_Access_Function_Definition then
1022                Check_For_Premature_Usage (Result_Definition (Def));
1023             end if;
1024          end if;
1025       end Check_For_Premature_Usage;
1026
1027       --  Local variables
1028
1029       Formals    : constant List_Id := Parameter_Specifications (T_Def);
1030       Formal     : Entity_Id;
1031       D_Ityp     : Node_Id;
1032       Desig_Type : constant Entity_Id :=
1033                      Create_Itype (E_Subprogram_Type, Parent (T_Def));
1034
1035    --  Start of processing for Access_Subprogram_Declaration
1036
1037    begin
1038       Check_SPARK_Restriction ("access type is not allowed", T_Def);
1039
1040       --  Associate the Itype node with the inner full-type declaration or
1041       --  subprogram spec or entry body. This is required to handle nested
1042       --  anonymous declarations. For example:
1043
1044       --      procedure P
1045       --       (X : access procedure
1046       --                     (Y : access procedure
1047       --                                   (Z : access T)))
1048
1049       D_Ityp := Associated_Node_For_Itype (Desig_Type);
1050       while not (Nkind_In (D_Ityp, N_Full_Type_Declaration,
1051                                    N_Private_Type_Declaration,
1052                                    N_Private_Extension_Declaration,
1053                                    N_Procedure_Specification,
1054                                    N_Function_Specification,
1055                                    N_Entry_Body)
1056
1057                    or else
1058                  Nkind_In (D_Ityp, N_Object_Declaration,
1059                                    N_Object_Renaming_Declaration,
1060                                    N_Formal_Object_Declaration,
1061                                    N_Formal_Type_Declaration,
1062                                    N_Task_Type_Declaration,
1063                                    N_Protected_Type_Declaration))
1064       loop
1065          D_Ityp := Parent (D_Ityp);
1066          pragma Assert (D_Ityp /= Empty);
1067       end loop;
1068
1069       Set_Associated_Node_For_Itype (Desig_Type, D_Ityp);
1070
1071       if Nkind_In (D_Ityp, N_Procedure_Specification,
1072                            N_Function_Specification)
1073       then
1074          Set_Scope (Desig_Type, Scope (Defining_Entity (D_Ityp)));
1075
1076       elsif Nkind_In (D_Ityp, N_Full_Type_Declaration,
1077                               N_Object_Declaration,
1078                               N_Object_Renaming_Declaration,
1079                               N_Formal_Type_Declaration)
1080       then
1081          Set_Scope (Desig_Type, Scope (Defining_Identifier (D_Ityp)));
1082       end if;
1083
1084       if Nkind (T_Def) = N_Access_Function_Definition then
1085          if Nkind (Result_Definition (T_Def)) = N_Access_Definition then
1086             declare
1087                Acc : constant Node_Id := Result_Definition (T_Def);
1088
1089             begin
1090                if Present (Access_To_Subprogram_Definition (Acc))
1091                  and then
1092                    Protected_Present (Access_To_Subprogram_Definition (Acc))
1093                then
1094                   Set_Etype
1095                     (Desig_Type,
1096                        Replace_Anonymous_Access_To_Protected_Subprogram
1097                          (T_Def));
1098
1099                else
1100                   Set_Etype
1101                     (Desig_Type,
1102                        Access_Definition (T_Def, Result_Definition (T_Def)));
1103                end if;
1104             end;
1105
1106          else
1107             Analyze (Result_Definition (T_Def));
1108
1109             declare
1110                Typ : constant Entity_Id := Entity (Result_Definition (T_Def));
1111
1112             begin
1113                --  If a null exclusion is imposed on the result type, then
1114                --  create a null-excluding itype (an access subtype) and use
1115                --  it as the function's Etype.
1116
1117                if Is_Access_Type (Typ)
1118                  and then Null_Exclusion_In_Return_Present (T_Def)
1119                then
1120                   Set_Etype  (Desig_Type,
1121                     Create_Null_Excluding_Itype
1122                       (T           => Typ,
1123                        Related_Nod => T_Def,
1124                        Scope_Id    => Current_Scope));
1125
1126                else
1127                   if From_With_Type (Typ) then
1128
1129                      --  AI05-151: Incomplete types are allowed in all basic
1130                      --  declarations, including access to subprograms.
1131
1132                      if Ada_Version >= Ada_2012 then
1133                         null;
1134
1135                      else
1136                         Error_Msg_NE
1137                          ("illegal use of incomplete type&",
1138                             Result_Definition (T_Def), Typ);
1139                      end if;
1140
1141                   elsif Ekind (Current_Scope) = E_Package
1142                     and then In_Private_Part (Current_Scope)
1143                   then
1144                      if Ekind (Typ) = E_Incomplete_Type then
1145                         Append_Elmt (Desig_Type, Private_Dependents (Typ));
1146
1147                      elsif Is_Class_Wide_Type (Typ)
1148                        and then Ekind (Etype (Typ)) = E_Incomplete_Type
1149                      then
1150                         Append_Elmt
1151                           (Desig_Type, Private_Dependents (Etype (Typ)));
1152                      end if;
1153                   end if;
1154
1155                   Set_Etype (Desig_Type, Typ);
1156                end if;
1157             end;
1158          end if;
1159
1160          if not (Is_Type (Etype (Desig_Type))) then
1161             Error_Msg_N
1162               ("expect type in function specification",
1163                Result_Definition (T_Def));
1164          end if;
1165
1166       else
1167          Set_Etype (Desig_Type, Standard_Void_Type);
1168       end if;
1169
1170       if Present (Formals) then
1171          Push_Scope (Desig_Type);
1172
1173          --  A bit of a kludge here. These kludges will be removed when Itypes
1174          --  have proper parent pointers to their declarations???
1175
1176          --  Kludge 1) Link defining_identifier of formals. Required by
1177          --  First_Formal to provide its functionality.
1178
1179          declare
1180             F : Node_Id;
1181
1182          begin
1183             F := First (Formals);
1184
1185             --  In ASIS mode, the access_to_subprogram may be analyzed twice,
1186             --  when it is part of an unconstrained type and subtype expansion
1187             --  is disabled. To avoid back-end problems with shared profiles,
1188             --  use previous subprogram type as the designated type.
1189
1190             if ASIS_Mode
1191               and then Present (Scope (Defining_Identifier (F)))
1192             then
1193                Set_Etype                    (T_Name, T_Name);
1194                Init_Size_Align              (T_Name);
1195                Set_Directly_Designated_Type (T_Name,
1196                  Scope (Defining_Identifier (F)));
1197                return;
1198             end if;
1199
1200             while Present (F) loop
1201                if No (Parent (Defining_Identifier (F))) then
1202                   Set_Parent (Defining_Identifier (F), F);
1203                end if;
1204
1205                Next (F);
1206             end loop;
1207          end;
1208
1209          Process_Formals (Formals, Parent (T_Def));
1210
1211          --  Kludge 2) End_Scope requires that the parent pointer be set to
1212          --  something reasonable, but Itypes don't have parent pointers. So
1213          --  we set it and then unset it ???
1214
1215          Set_Parent (Desig_Type, T_Name);
1216          End_Scope;
1217          Set_Parent (Desig_Type, Empty);
1218       end if;
1219
1220       --  Check for premature usage of the type being defined
1221
1222       Check_For_Premature_Usage (T_Def);
1223
1224       --  The return type and/or any parameter type may be incomplete. Mark
1225       --  the subprogram_type as depending on the incomplete type, so that
1226       --  it can be updated when the full type declaration is seen. This
1227       --  only applies to incomplete types declared in some enclosing scope,
1228       --  not to limited views from other packages.
1229
1230       if Present (Formals) then
1231          Formal := First_Formal (Desig_Type);
1232          while Present (Formal) loop
1233             if Ekind (Formal) /= E_In_Parameter
1234               and then Nkind (T_Def) = N_Access_Function_Definition
1235             then
1236                Error_Msg_N ("functions can only have IN parameters", Formal);
1237             end if;
1238
1239             if Ekind (Etype (Formal)) = E_Incomplete_Type
1240               and then In_Open_Scopes (Scope (Etype (Formal)))
1241             then
1242                Append_Elmt (Desig_Type, Private_Dependents (Etype (Formal)));
1243                Set_Has_Delayed_Freeze (Desig_Type);
1244             end if;
1245
1246             Next_Formal (Formal);
1247          end loop;
1248       end if;
1249
1250       --  If the return type is incomplete, this is legal as long as the
1251       --  type is declared in the current scope and will be completed in
1252       --  it (rather than being part of limited view).
1253
1254       if Ekind (Etype (Desig_Type)) = E_Incomplete_Type
1255         and then not Has_Delayed_Freeze (Desig_Type)
1256         and then In_Open_Scopes (Scope (Etype (Desig_Type)))
1257       then
1258          Append_Elmt (Desig_Type, Private_Dependents (Etype (Desig_Type)));
1259          Set_Has_Delayed_Freeze (Desig_Type);
1260       end if;
1261
1262       Check_Delayed_Subprogram (Desig_Type);
1263
1264       if Protected_Present (T_Def) then
1265          Set_Ekind (T_Name, E_Access_Protected_Subprogram_Type);
1266          Set_Convention (Desig_Type, Convention_Protected);
1267       else
1268          Set_Ekind (T_Name, E_Access_Subprogram_Type);
1269       end if;
1270
1271       Set_Can_Use_Internal_Rep (T_Name, not Always_Compatible_Rep_On_Target);
1272
1273       Set_Etype                    (T_Name, T_Name);
1274       Init_Size_Align              (T_Name);
1275       Set_Directly_Designated_Type (T_Name, Desig_Type);
1276
1277       --  Ada 2005 (AI-231): Propagate the null-excluding attribute
1278
1279       Set_Can_Never_Be_Null (T_Name, Null_Exclusion_Present (T_Def));
1280
1281       Check_Restriction (No_Access_Subprograms, T_Def);
1282    end Access_Subprogram_Declaration;
1283
1284    ----------------------------
1285    -- Access_Type_Declaration --
1286    ----------------------------
1287
1288    procedure Access_Type_Declaration (T : Entity_Id; Def : Node_Id) is
1289       P : constant Node_Id := Parent (Def);
1290       S : constant Node_Id := Subtype_Indication (Def);
1291
1292       Full_Desig : Entity_Id;
1293
1294    begin
1295       Check_SPARK_Restriction ("access type is not allowed", Def);
1296
1297       --  Check for permissible use of incomplete type
1298
1299       if Nkind (S) /= N_Subtype_Indication then
1300          Analyze (S);
1301
1302          if Ekind (Root_Type (Entity (S))) = E_Incomplete_Type then
1303             Set_Directly_Designated_Type (T, Entity (S));
1304          else
1305             Set_Directly_Designated_Type (T,
1306               Process_Subtype (S, P, T, 'P'));
1307          end if;
1308
1309       else
1310          Set_Directly_Designated_Type (T,
1311            Process_Subtype (S, P, T, 'P'));
1312       end if;
1313
1314       if All_Present (Def) or Constant_Present (Def) then
1315          Set_Ekind (T, E_General_Access_Type);
1316       else
1317          Set_Ekind (T, E_Access_Type);
1318       end if;
1319
1320       Full_Desig := Designated_Type (T);
1321
1322       if Base_Type (Full_Desig) = T then
1323          Error_Msg_N ("access type cannot designate itself", S);
1324
1325       --  In Ada 2005, the type may have a limited view through some unit
1326       --  in its own context, allowing the following circularity that cannot
1327       --  be detected earlier
1328
1329       elsif Is_Class_Wide_Type (Full_Desig)
1330         and then Etype (Full_Desig) = T
1331       then
1332          Error_Msg_N
1333            ("access type cannot designate its own classwide type", S);
1334
1335          --  Clean up indication of tagged status to prevent cascaded errors
1336
1337          Set_Is_Tagged_Type (T, False);
1338       end if;
1339
1340       Set_Etype (T, T);
1341
1342       --  If the type has appeared already in a with_type clause, it is
1343       --  frozen and the pointer size is already set. Else, initialize.
1344
1345       if not From_With_Type (T) then
1346          Init_Size_Align (T);
1347       end if;
1348
1349       --  Note that Has_Task is always false, since the access type itself
1350       --  is not a task type. See Einfo for more description on this point.
1351       --  Exactly the same consideration applies to Has_Controlled_Component.
1352
1353       Set_Has_Task (T, False);
1354       Set_Has_Controlled_Component (T, False);
1355
1356       --  Initialize Associated_Collection explicitly to Empty, to avoid
1357       --  problems where an incomplete view of this entity has been previously
1358       --  established by a limited with and an overlaid version of this field
1359       --  (Stored_Constraint) was initialized for the incomplete view.
1360
1361       --  This reset is performed in most cases except where the access type
1362       --  has been created for the purposes of allocating or deallocating a
1363       --  build-in-place object. Such access types have explicitly set pools
1364       --  and collections.
1365
1366       if No (Associated_Storage_Pool (T)) then
1367          Set_Associated_Collection (T, Empty);
1368       end if;
1369
1370       --  Ada 2005 (AI-231): Propagate the null-excluding and access-constant
1371       --  attributes
1372
1373       Set_Can_Never_Be_Null  (T, Null_Exclusion_Present (Def));
1374       Set_Is_Access_Constant (T, Constant_Present (Def));
1375    end Access_Type_Declaration;
1376
1377    ----------------------------------
1378    -- Add_Interface_Tag_Components --
1379    ----------------------------------
1380
1381    procedure Add_Interface_Tag_Components (N : Node_Id; Typ : Entity_Id) is
1382       Loc      : constant Source_Ptr := Sloc (N);
1383       L        : List_Id;
1384       Last_Tag : Node_Id;
1385
1386       procedure Add_Tag (Iface : Entity_Id);
1387       --  Add tag for one of the progenitor interfaces
1388
1389       -------------
1390       -- Add_Tag --
1391       -------------
1392
1393       procedure Add_Tag (Iface : Entity_Id) is
1394          Decl   : Node_Id;
1395          Def    : Node_Id;
1396          Tag    : Entity_Id;
1397          Offset : Entity_Id;
1398
1399       begin
1400          pragma Assert (Is_Tagged_Type (Iface)
1401            and then Is_Interface (Iface));
1402
1403          --  This is a reasonable place to propagate predicates
1404
1405          if Has_Predicates (Iface) then
1406             Set_Has_Predicates (Typ);
1407          end if;
1408
1409          Def :=
1410            Make_Component_Definition (Loc,
1411              Aliased_Present    => True,
1412              Subtype_Indication =>
1413                New_Occurrence_Of (RTE (RE_Interface_Tag), Loc));
1414
1415          Tag := Make_Temporary (Loc, 'V');
1416
1417          Decl :=
1418            Make_Component_Declaration (Loc,
1419              Defining_Identifier  => Tag,
1420              Component_Definition => Def);
1421
1422          Analyze_Component_Declaration (Decl);
1423
1424          Set_Analyzed (Decl);
1425          Set_Ekind               (Tag, E_Component);
1426          Set_Is_Tag              (Tag);
1427          Set_Is_Aliased          (Tag);
1428          Set_Related_Type        (Tag, Iface);
1429          Init_Component_Location (Tag);
1430
1431          pragma Assert (Is_Frozen (Iface));
1432
1433          Set_DT_Entry_Count    (Tag,
1434            DT_Entry_Count (First_Entity (Iface)));
1435
1436          if No (Last_Tag) then
1437             Prepend (Decl, L);
1438          else
1439             Insert_After (Last_Tag, Decl);
1440          end if;
1441
1442          Last_Tag := Decl;
1443
1444          --  If the ancestor has discriminants we need to give special support
1445          --  to store the offset_to_top value of the secondary dispatch tables.
1446          --  For this purpose we add a supplementary component just after the
1447          --  field that contains the tag associated with each secondary DT.
1448
1449          if Typ /= Etype (Typ)
1450            and then Has_Discriminants (Etype (Typ))
1451          then
1452             Def :=
1453               Make_Component_Definition (Loc,
1454                 Subtype_Indication =>
1455                   New_Occurrence_Of (RTE (RE_Storage_Offset), Loc));
1456
1457             Offset := Make_Temporary (Loc, 'V');
1458
1459             Decl :=
1460               Make_Component_Declaration (Loc,
1461                 Defining_Identifier  => Offset,
1462                 Component_Definition => Def);
1463
1464             Analyze_Component_Declaration (Decl);
1465
1466             Set_Analyzed (Decl);
1467             Set_Ekind               (Offset, E_Component);
1468             Set_Is_Aliased          (Offset);
1469             Set_Related_Type        (Offset, Iface);
1470             Init_Component_Location (Offset);
1471             Insert_After (Last_Tag, Decl);
1472             Last_Tag := Decl;
1473          end if;
1474       end Add_Tag;
1475
1476       --  Local variables
1477
1478       Elmt : Elmt_Id;
1479       Ext  : Node_Id;
1480       Comp : Node_Id;
1481
1482    --  Start of processing for Add_Interface_Tag_Components
1483
1484    begin
1485       if not RTE_Available (RE_Interface_Tag) then
1486          Error_Msg
1487            ("(Ada 2005) interface types not supported by this run-time!",
1488             Sloc (N));
1489          return;
1490       end if;
1491
1492       if Ekind (Typ) /= E_Record_Type
1493         or else (Is_Concurrent_Record_Type (Typ)
1494                   and then Is_Empty_List (Abstract_Interface_List (Typ)))
1495         or else (not Is_Concurrent_Record_Type (Typ)
1496                   and then No (Interfaces (Typ))
1497                   and then Is_Empty_Elmt_List (Interfaces (Typ)))
1498       then
1499          return;
1500       end if;
1501
1502       --  Find the current last tag
1503
1504       if Nkind (Type_Definition (N)) = N_Derived_Type_Definition then
1505          Ext := Record_Extension_Part (Type_Definition (N));
1506       else
1507          pragma Assert (Nkind (Type_Definition (N)) = N_Record_Definition);
1508          Ext := Type_Definition (N);
1509       end if;
1510
1511       Last_Tag := Empty;
1512
1513       if not (Present (Component_List (Ext))) then
1514          Set_Null_Present (Ext, False);
1515          L := New_List;
1516          Set_Component_List (Ext,
1517            Make_Component_List (Loc,
1518              Component_Items => L,
1519              Null_Present => False));
1520       else
1521          if Nkind (Type_Definition (N)) = N_Derived_Type_Definition then
1522             L := Component_Items
1523                    (Component_List
1524                      (Record_Extension_Part
1525                        (Type_Definition (N))));
1526          else
1527             L := Component_Items
1528                    (Component_List
1529                      (Type_Definition (N)));
1530          end if;
1531
1532          --  Find the last tag component
1533
1534          Comp := First (L);
1535          while Present (Comp) loop
1536             if Nkind (Comp) = N_Component_Declaration
1537               and then Is_Tag (Defining_Identifier (Comp))
1538             then
1539                Last_Tag := Comp;
1540             end if;
1541
1542             Next (Comp);
1543          end loop;
1544       end if;
1545
1546       --  At this point L references the list of components and Last_Tag
1547       --  references the current last tag (if any). Now we add the tag
1548       --  corresponding with all the interfaces that are not implemented
1549       --  by the parent.
1550
1551       if Present (Interfaces (Typ)) then
1552          Elmt := First_Elmt (Interfaces (Typ));
1553          while Present (Elmt) loop
1554             Add_Tag (Node (Elmt));
1555             Next_Elmt (Elmt);
1556          end loop;
1557       end if;
1558    end Add_Interface_Tag_Components;
1559
1560    -------------------------------------
1561    -- Add_Internal_Interface_Entities --
1562    -------------------------------------
1563
1564    procedure Add_Internal_Interface_Entities (Tagged_Type : Entity_Id) is
1565       Elmt          : Elmt_Id;
1566       Iface         : Entity_Id;
1567       Iface_Elmt    : Elmt_Id;
1568       Iface_Prim    : Entity_Id;
1569       Ifaces_List   : Elist_Id;
1570       New_Subp      : Entity_Id := Empty;
1571       Prim          : Entity_Id;
1572       Restore_Scope : Boolean := False;
1573
1574    begin
1575       pragma Assert (Ada_Version >= Ada_2005
1576         and then Is_Record_Type (Tagged_Type)
1577         and then Is_Tagged_Type (Tagged_Type)
1578         and then Has_Interfaces (Tagged_Type)
1579         and then not Is_Interface (Tagged_Type));
1580
1581       --  Ensure that the internal entities are added to the scope of the type
1582
1583       if Scope (Tagged_Type) /= Current_Scope then
1584          Push_Scope (Scope (Tagged_Type));
1585          Restore_Scope := True;
1586       end if;
1587
1588       Collect_Interfaces (Tagged_Type, Ifaces_List);
1589
1590       Iface_Elmt := First_Elmt (Ifaces_List);
1591       while Present (Iface_Elmt) loop
1592          Iface := Node (Iface_Elmt);
1593
1594          --  Originally we excluded here from this processing interfaces that
1595          --  are parents of Tagged_Type because their primitives are located
1596          --  in the primary dispatch table (and hence no auxiliary internal
1597          --  entities are required to handle secondary dispatch tables in such
1598          --  case). However, these auxiliary entities are also required to
1599          --  handle derivations of interfaces in formals of generics (see
1600          --  Derive_Subprograms).
1601
1602          Elmt := First_Elmt (Primitive_Operations (Iface));
1603          while Present (Elmt) loop
1604             Iface_Prim := Node (Elmt);
1605
1606             if not Is_Predefined_Dispatching_Operation (Iface_Prim) then
1607                Prim :=
1608                  Find_Primitive_Covering_Interface
1609                    (Tagged_Type => Tagged_Type,
1610                     Iface_Prim  => Iface_Prim);
1611
1612                pragma Assert (Present (Prim));
1613
1614                --  Ada 2012 (AI05-0197): If the name of the covering primitive
1615                --  differs from the name of the interface primitive then it is
1616                --  a private primitive inherited from a parent type. In such
1617                --  case, given that Tagged_Type covers the interface, the
1618                --  inherited private primitive becomes visible. For such
1619                --  purpose we add a new entity that renames the inherited
1620                --  private primitive.
1621
1622                if Chars (Prim) /= Chars (Iface_Prim) then
1623                   pragma Assert (Has_Suffix (Prim, 'P'));
1624                   Derive_Subprogram
1625                     (New_Subp     => New_Subp,
1626                      Parent_Subp  => Iface_Prim,
1627                      Derived_Type => Tagged_Type,
1628                      Parent_Type  => Iface);
1629                   Set_Alias (New_Subp, Prim);
1630                   Set_Is_Abstract_Subprogram
1631                     (New_Subp, Is_Abstract_Subprogram (Prim));
1632                end if;
1633
1634                Derive_Subprogram
1635                  (New_Subp     => New_Subp,
1636                   Parent_Subp  => Iface_Prim,
1637                   Derived_Type => Tagged_Type,
1638                   Parent_Type  => Iface);
1639
1640                --  Ada 2005 (AI-251): Decorate internal entity Iface_Subp
1641                --  associated with interface types. These entities are
1642                --  only registered in the list of primitives of its
1643                --  corresponding tagged type because they are only used
1644                --  to fill the contents of the secondary dispatch tables.
1645                --  Therefore they are removed from the homonym chains.
1646
1647                Set_Is_Hidden (New_Subp);
1648                Set_Is_Internal (New_Subp);
1649                Set_Alias (New_Subp, Prim);
1650                Set_Is_Abstract_Subprogram
1651                  (New_Subp, Is_Abstract_Subprogram (Prim));
1652                Set_Interface_Alias (New_Subp, Iface_Prim);
1653
1654                --  Internal entities associated with interface types are
1655                --  only registered in the list of primitives of the tagged
1656                --  type. They are only used to fill the contents of the
1657                --  secondary dispatch tables. Therefore they are not needed
1658                --  in the homonym chains.
1659
1660                Remove_Homonym (New_Subp);
1661
1662                --  Hidden entities associated with interfaces must have set
1663                --  the Has_Delay_Freeze attribute to ensure that, in case of
1664                --  locally defined tagged types (or compiling with static
1665                --  dispatch tables generation disabled) the corresponding
1666                --  entry of the secondary dispatch table is filled when
1667                --  such an entity is frozen.
1668
1669                Set_Has_Delayed_Freeze (New_Subp);
1670             end if;
1671
1672             Next_Elmt (Elmt);
1673          end loop;
1674
1675          Next_Elmt (Iface_Elmt);
1676       end loop;
1677
1678       if Restore_Scope then
1679          Pop_Scope;
1680       end if;
1681    end Add_Internal_Interface_Entities;
1682
1683    -----------------------------------
1684    -- Analyze_Component_Declaration --
1685    -----------------------------------
1686
1687    procedure Analyze_Component_Declaration (N : Node_Id) is
1688       Id  : constant Entity_Id := Defining_Identifier (N);
1689       E   : constant Node_Id   := Expression (N);
1690       Typ : constant Node_Id   :=
1691               Subtype_Indication (Component_Definition (N));
1692       T   : Entity_Id;
1693       P   : Entity_Id;
1694
1695       function Contains_POC (Constr : Node_Id) return Boolean;
1696       --  Determines whether a constraint uses the discriminant of a record
1697       --  type thus becoming a per-object constraint (POC).
1698
1699       function Is_Known_Limited (Typ : Entity_Id) return Boolean;
1700       --  Typ is the type of the current component, check whether this type is
1701       --  a limited type. Used to validate declaration against that of
1702       --  enclosing record.
1703
1704       ------------------
1705       -- Contains_POC --
1706       ------------------
1707
1708       function Contains_POC (Constr : Node_Id) return Boolean is
1709       begin
1710          --  Prevent cascaded errors
1711
1712          if Error_Posted (Constr) then
1713             return False;
1714          end if;
1715
1716          case Nkind (Constr) is
1717             when N_Attribute_Reference =>
1718                return
1719                  Attribute_Name (Constr) = Name_Access
1720                    and then Prefix (Constr) = Scope (Entity (Prefix (Constr)));
1721
1722             when N_Discriminant_Association =>
1723                return Denotes_Discriminant (Expression (Constr));
1724
1725             when N_Identifier =>
1726                return Denotes_Discriminant (Constr);
1727
1728             when N_Index_Or_Discriminant_Constraint =>
1729                declare
1730                   IDC : Node_Id;
1731
1732                begin
1733                   IDC := First (Constraints (Constr));
1734                   while Present (IDC) loop
1735
1736                      --  One per-object constraint is sufficient
1737
1738                      if Contains_POC (IDC) then
1739                         return True;
1740                      end if;
1741
1742                      Next (IDC);
1743                   end loop;
1744
1745                   return False;
1746                end;
1747
1748             when N_Range =>
1749                return Denotes_Discriminant (Low_Bound (Constr))
1750                         or else
1751                       Denotes_Discriminant (High_Bound (Constr));
1752
1753             when N_Range_Constraint =>
1754                return Denotes_Discriminant (Range_Expression (Constr));
1755
1756             when others =>
1757                return False;
1758
1759          end case;
1760       end Contains_POC;
1761
1762       ----------------------
1763       -- Is_Known_Limited --
1764       ----------------------
1765
1766       function Is_Known_Limited (Typ : Entity_Id) return Boolean is
1767          P : constant Entity_Id := Etype (Typ);
1768          R : constant Entity_Id := Root_Type (Typ);
1769
1770       begin
1771          if Is_Limited_Record (Typ) then
1772             return True;
1773
1774          --  If the root type is limited (and not a limited interface)
1775          --  so is the current type
1776
1777          elsif Is_Limited_Record (R)
1778            and then
1779              (not Is_Interface (R)
1780                or else not Is_Limited_Interface (R))
1781          then
1782             return True;
1783
1784          --  Else the type may have a limited interface progenitor, but a
1785          --  limited record parent.
1786
1787          elsif R /= P
1788            and then Is_Limited_Record (P)
1789          then
1790             return True;
1791
1792          else
1793             return False;
1794          end if;
1795       end Is_Known_Limited;
1796
1797    --  Start of processing for Analyze_Component_Declaration
1798
1799    begin
1800       Generate_Definition (Id);
1801       Enter_Name (Id);
1802
1803       if Present (Typ) then
1804          T := Find_Type_Of_Object
1805                 (Subtype_Indication (Component_Definition (N)), N);
1806
1807          if not Nkind_In (Typ, N_Identifier, N_Expanded_Name) then
1808             Check_SPARK_Restriction ("subtype mark required", Typ);
1809          end if;
1810
1811       --  Ada 2005 (AI-230): Access Definition case
1812
1813       else
1814          pragma Assert (Present
1815                           (Access_Definition (Component_Definition (N))));
1816
1817          T := Access_Definition
1818                 (Related_Nod => N,
1819                  N => Access_Definition (Component_Definition (N)));
1820          Set_Is_Local_Anonymous_Access (T);
1821
1822          --  Ada 2005 (AI-254)
1823
1824          if Present (Access_To_Subprogram_Definition
1825                       (Access_Definition (Component_Definition (N))))
1826            and then Protected_Present (Access_To_Subprogram_Definition
1827                                         (Access_Definition
1828                                           (Component_Definition (N))))
1829          then
1830             T := Replace_Anonymous_Access_To_Protected_Subprogram (N);
1831          end if;
1832       end if;
1833
1834       --  If the subtype is a constrained subtype of the enclosing record,
1835       --  (which must have a partial view) the back-end does not properly
1836       --  handle the recursion. Rewrite the component declaration with an
1837       --  explicit subtype indication, which is acceptable to Gigi. We can copy
1838       --  the tree directly because side effects have already been removed from
1839       --  discriminant constraints.
1840
1841       if Ekind (T) = E_Access_Subtype
1842         and then Is_Entity_Name (Subtype_Indication (Component_Definition (N)))
1843         and then Comes_From_Source (T)
1844         and then Nkind (Parent (T)) = N_Subtype_Declaration
1845         and then Etype (Directly_Designated_Type (T)) = Current_Scope
1846       then
1847          Rewrite
1848            (Subtype_Indication (Component_Definition (N)),
1849              New_Copy_Tree (Subtype_Indication (Parent (T))));
1850          T := Find_Type_Of_Object
1851                  (Subtype_Indication (Component_Definition (N)), N);
1852       end if;
1853
1854       --  If the component declaration includes a default expression, then we
1855       --  check that the component is not of a limited type (RM 3.7(5)),
1856       --  and do the special preanalysis of the expression (see section on
1857       --  "Handling of Default and Per-Object Expressions" in the spec of
1858       --  package Sem).
1859
1860       if Present (E) then
1861          Check_SPARK_Restriction ("default expression is not allowed", E);
1862          Preanalyze_Spec_Expression (E, T);
1863          Check_Initialization (T, E);
1864
1865          if Ada_Version >= Ada_2005
1866            and then Ekind (T) = E_Anonymous_Access_Type
1867            and then Etype (E) /= Any_Type
1868          then
1869             --  Check RM 3.9.2(9): "if the expected type for an expression is
1870             --  an anonymous access-to-specific tagged type, then the object
1871             --  designated by the expression shall not be dynamically tagged
1872             --  unless it is a controlling operand in a call on a dispatching
1873             --  operation"
1874
1875             if Is_Tagged_Type (Directly_Designated_Type (T))
1876               and then
1877                 Ekind (Directly_Designated_Type (T)) /= E_Class_Wide_Type
1878               and then
1879                 Ekind (Directly_Designated_Type (Etype (E))) =
1880                   E_Class_Wide_Type
1881             then
1882                Error_Msg_N
1883                  ("access to specific tagged type required (RM 3.9.2(9))", E);
1884             end if;
1885
1886             --  (Ada 2005: AI-230): Accessibility check for anonymous
1887             --  components
1888
1889             if Type_Access_Level (Etype (E)) > Type_Access_Level (T) then
1890                Error_Msg_N
1891                  ("expression has deeper access level than component " &
1892                   "(RM 3.10.2 (12.2))", E);
1893             end if;
1894
1895             --  The initialization expression is a reference to an access
1896             --  discriminant. The type of the discriminant is always deeper
1897             --  than any access type.
1898
1899             if Ekind (Etype (E)) = E_Anonymous_Access_Type
1900               and then Is_Entity_Name (E)
1901               and then Ekind (Entity (E)) = E_In_Parameter
1902               and then Present (Discriminal_Link (Entity (E)))
1903             then
1904                Error_Msg_N
1905                  ("discriminant has deeper accessibility level than target",
1906                   E);
1907             end if;
1908          end if;
1909       end if;
1910
1911       --  The parent type may be a private view with unknown discriminants,
1912       --  and thus unconstrained. Regular components must be constrained.
1913
1914       if Is_Indefinite_Subtype (T) and then Chars (Id) /= Name_uParent then
1915          if Is_Class_Wide_Type (T) then
1916             Error_Msg_N
1917                ("class-wide subtype with unknown discriminants" &
1918                  " in component declaration",
1919                  Subtype_Indication (Component_Definition (N)));
1920          else
1921             Error_Msg_N
1922               ("unconstrained subtype in component declaration",
1923                Subtype_Indication (Component_Definition (N)));
1924          end if;
1925
1926       --  Components cannot be abstract, except for the special case of
1927       --  the _Parent field (case of extending an abstract tagged type)
1928
1929       elsif Is_Abstract_Type (T) and then Chars (Id) /= Name_uParent then
1930          Error_Msg_N ("type of a component cannot be abstract", N);
1931       end if;
1932
1933       Set_Etype (Id, T);
1934       Set_Is_Aliased (Id, Aliased_Present (Component_Definition (N)));
1935
1936       --  The component declaration may have a per-object constraint, set
1937       --  the appropriate flag in the defining identifier of the subtype.
1938
1939       if Present (Subtype_Indication (Component_Definition (N))) then
1940          declare
1941             Sindic : constant Node_Id :=
1942                        Subtype_Indication (Component_Definition (N));
1943          begin
1944             if Nkind (Sindic) = N_Subtype_Indication
1945               and then Present (Constraint (Sindic))
1946               and then Contains_POC (Constraint (Sindic))
1947             then
1948                Set_Has_Per_Object_Constraint (Id);
1949             end if;
1950          end;
1951       end if;
1952
1953       --  Ada 2005 (AI-231): Propagate the null-excluding attribute and carry
1954       --  out some static checks.
1955
1956       if Ada_Version >= Ada_2005
1957         and then Can_Never_Be_Null (T)
1958       then
1959          Null_Exclusion_Static_Checks (N);
1960       end if;
1961
1962       --  If this component is private (or depends on a private type), flag the
1963       --  record type to indicate that some operations are not available.
1964
1965       P := Private_Component (T);
1966
1967       if Present (P) then
1968
1969          --  Check for circular definitions
1970
1971          if P = Any_Type then
1972             Set_Etype (Id, Any_Type);
1973
1974          --  There is a gap in the visibility of operations only if the
1975          --  component type is not defined in the scope of the record type.
1976
1977          elsif Scope (P) = Scope (Current_Scope) then
1978             null;
1979
1980          elsif Is_Limited_Type (P) then
1981             Set_Is_Limited_Composite (Current_Scope);
1982
1983          else
1984             Set_Is_Private_Composite (Current_Scope);
1985          end if;
1986       end if;
1987
1988       if P /= Any_Type
1989         and then Is_Limited_Type (T)
1990         and then Chars (Id) /= Name_uParent
1991         and then Is_Tagged_Type (Current_Scope)
1992       then
1993          if Is_Derived_Type (Current_Scope)
1994            and then not Is_Known_Limited (Current_Scope)
1995          then
1996             Error_Msg_N
1997               ("extension of nonlimited type cannot have limited components",
1998                N);
1999
2000             if Is_Interface (Root_Type (Current_Scope)) then
2001                Error_Msg_N
2002                  ("\limitedness is not inherited from limited interface", N);
2003                Error_Msg_N ("\add LIMITED to type indication", N);
2004             end if;
2005
2006             Explain_Limited_Type (T, N);
2007             Set_Etype (Id, Any_Type);
2008             Set_Is_Limited_Composite (Current_Scope, False);
2009
2010          elsif not Is_Derived_Type (Current_Scope)
2011            and then not Is_Limited_Record (Current_Scope)
2012            and then not Is_Concurrent_Type (Current_Scope)
2013          then
2014             Error_Msg_N
2015               ("nonlimited tagged type cannot have limited components", N);
2016             Explain_Limited_Type (T, N);
2017             Set_Etype (Id, Any_Type);
2018             Set_Is_Limited_Composite (Current_Scope, False);
2019          end if;
2020       end if;
2021
2022       Set_Original_Record_Component (Id, Id);
2023
2024       if Has_Aspects (N) then
2025          Analyze_Aspect_Specifications (N, Id);
2026       end if;
2027    end Analyze_Component_Declaration;
2028
2029    --------------------------
2030    -- Analyze_Declarations --
2031    --------------------------
2032
2033    procedure Analyze_Declarations (L : List_Id) is
2034       D           : Node_Id;
2035       Freeze_From : Entity_Id := Empty;
2036       Next_Node   : Node_Id;
2037
2038       procedure Adjust_D;
2039       --  Adjust D not to include implicit label declarations, since these
2040       --  have strange Sloc values that result in elaboration check problems.
2041       --  (They have the sloc of the label as found in the source, and that
2042       --  is ahead of the current declarative part).
2043
2044       --------------
2045       -- Adjust_D --
2046       --------------
2047
2048       procedure Adjust_D is
2049       begin
2050          while Present (Prev (D))
2051            and then Nkind (D) = N_Implicit_Label_Declaration
2052          loop
2053             Prev (D);
2054          end loop;
2055       end Adjust_D;
2056
2057    --  Start of processing for Analyze_Declarations
2058
2059    begin
2060       if Restriction_Check_Required (SPARK) then
2061          Check_Later_Vs_Basic_Declarations (L, During_Parsing => False);
2062       end if;
2063
2064       D := First (L);
2065       while Present (D) loop
2066
2067          --  Package spec cannot contain a package declaration in SPARK
2068
2069          if Nkind (D) = N_Package_Declaration
2070            and then Nkind (Parent (L)) = N_Package_Specification
2071          then
2072             Check_SPARK_Restriction
2073               ("package specification cannot contain a package declaration",
2074                D);
2075          end if;
2076
2077          --  Complete analysis of declaration
2078
2079          Analyze (D);
2080          Next_Node := Next (D);
2081
2082          if No (Freeze_From) then
2083             Freeze_From := First_Entity (Current_Scope);
2084          end if;
2085
2086          --  At the end of a declarative part, freeze remaining entities
2087          --  declared in it. The end of the visible declarations of package
2088          --  specification is not the end of a declarative part if private
2089          --  declarations are present. The end of a package declaration is a
2090          --  freezing point only if it a library package. A task definition or
2091          --  protected type definition is not a freeze point either. Finally,
2092          --  we do not freeze entities in generic scopes, because there is no
2093          --  code generated for them and freeze nodes will be generated for
2094          --  the instance.
2095
2096          --  The end of a package instantiation is not a freeze point, but
2097          --  for now we make it one, because the generic body is inserted
2098          --  (currently) immediately after. Generic instantiations will not
2099          --  be a freeze point once delayed freezing of bodies is implemented.
2100          --  (This is needed in any case for early instantiations ???).
2101
2102          if No (Next_Node) then
2103             if Nkind_In (Parent (L), N_Component_List,
2104                                      N_Task_Definition,
2105                                      N_Protected_Definition)
2106             then
2107                null;
2108
2109             elsif Nkind (Parent (L)) /= N_Package_Specification then
2110                if Nkind (Parent (L)) = N_Package_Body then
2111                   Freeze_From := First_Entity (Current_Scope);
2112                end if;
2113
2114                Adjust_D;
2115                Freeze_All (Freeze_From, D);
2116                Freeze_From := Last_Entity (Current_Scope);
2117
2118             elsif Scope (Current_Scope) /= Standard_Standard
2119               and then not Is_Child_Unit (Current_Scope)
2120               and then No (Generic_Parent (Parent (L)))
2121             then
2122                null;
2123
2124             elsif L /= Visible_Declarations (Parent (L))
2125                or else No (Private_Declarations (Parent (L)))
2126                or else Is_Empty_List (Private_Declarations (Parent (L)))
2127             then
2128                Adjust_D;
2129                Freeze_All (Freeze_From, D);
2130                Freeze_From := Last_Entity (Current_Scope);
2131             end if;
2132
2133          --  If next node is a body then freeze all types before the body.
2134          --  An exception occurs for some expander-generated bodies. If these
2135          --  are generated at places where in general language rules would not
2136          --  allow a freeze point, then we assume that the expander has
2137          --  explicitly checked that all required types are properly frozen,
2138          --  and we do not cause general freezing here. This special circuit
2139          --  is used when the encountered body is marked as having already
2140          --  been analyzed.
2141
2142          --  In all other cases (bodies that come from source, and expander
2143          --  generated bodies that have not been analyzed yet), freeze all
2144          --  types now. Note that in the latter case, the expander must take
2145          --  care to attach the bodies at a proper place in the tree so as to
2146          --  not cause unwanted freezing at that point.
2147
2148          elsif not Analyzed (Next_Node)
2149            and then (Nkind_In (Next_Node, N_Subprogram_Body,
2150                                           N_Entry_Body,
2151                                           N_Package_Body,
2152                                           N_Protected_Body,
2153                                           N_Task_Body)
2154                        or else
2155                      Nkind (Next_Node) in N_Body_Stub)
2156          then
2157             Adjust_D;
2158             Freeze_All (Freeze_From, D);
2159             Freeze_From := Last_Entity (Current_Scope);
2160          end if;
2161
2162          D := Next_Node;
2163       end loop;
2164
2165       --  One more thing to do, we need to scan the declarations to check
2166       --  for any precondition/postcondition pragmas (Pre/Post aspects have
2167       --  by this stage been converted into corresponding pragmas). It is
2168       --  at this point that we analyze the expressions in such pragmas,
2169       --  to implement the delayed visibility requirement.
2170
2171       declare
2172          Decl : Node_Id;
2173          Spec : Node_Id;
2174          Sent : Entity_Id;
2175          Prag : Node_Id;
2176
2177       begin
2178          Decl := First (L);
2179          while Present (Decl) loop
2180             if Nkind (Original_Node (Decl)) = N_Subprogram_Declaration then
2181                Spec := Specification (Original_Node (Decl));
2182                Sent := Defining_Unit_Name (Spec);
2183
2184                Prag := Spec_PPC_List (Contract (Sent));
2185                while Present (Prag) loop
2186                   Analyze_PPC_In_Decl_Part (Prag, Sent);
2187                   Prag := Next_Pragma (Prag);
2188                end loop;
2189
2190                Prag := Spec_TC_List (Contract (Sent));
2191                while Present (Prag) loop
2192                   Analyze_TC_In_Decl_Part (Prag, Sent);
2193                   Prag := Next_Pragma (Prag);
2194                end loop;
2195             end if;
2196
2197             Next (Decl);
2198          end loop;
2199       end;
2200    end Analyze_Declarations;
2201
2202    -----------------------------------
2203    -- Analyze_Full_Type_Declaration --
2204    -----------------------------------
2205
2206    procedure Analyze_Full_Type_Declaration (N : Node_Id) is
2207       Def    : constant Node_Id   := Type_Definition (N);
2208       Def_Id : constant Entity_Id := Defining_Identifier (N);
2209       T      : Entity_Id;
2210       Prev   : Entity_Id;
2211
2212       Is_Remote : constant Boolean :=
2213                     (Is_Remote_Types (Current_Scope)
2214                        or else Is_Remote_Call_Interface (Current_Scope))
2215                     and then not (In_Private_Part (Current_Scope)
2216                                     or else In_Package_Body (Current_Scope));
2217
2218       procedure Check_Ops_From_Incomplete_Type;
2219       --  If there is a tagged incomplete partial view of the type, traverse
2220       --  the primitives of the incomplete view and change the type of any
2221       --  controlling formals and result to indicate the full view. The
2222       --  primitives will be added to the full type's primitive operations
2223       --  list later in Sem_Disp.Check_Operation_From_Incomplete_Type (which
2224       --  is called from Process_Incomplete_Dependents).
2225
2226       ------------------------------------
2227       -- Check_Ops_From_Incomplete_Type --
2228       ------------------------------------
2229
2230       procedure Check_Ops_From_Incomplete_Type is
2231          Elmt   : Elmt_Id;
2232          Formal : Entity_Id;
2233          Op     : Entity_Id;
2234
2235       begin
2236          if Prev /= T
2237            and then Ekind (Prev) = E_Incomplete_Type
2238            and then Is_Tagged_Type (Prev)
2239            and then Is_Tagged_Type (T)
2240          then
2241             Elmt := First_Elmt (Primitive_Operations (Prev));
2242             while Present (Elmt) loop
2243                Op := Node (Elmt);
2244
2245                Formal := First_Formal (Op);
2246                while Present (Formal) loop
2247                   if Etype (Formal) = Prev then
2248                      Set_Etype (Formal, T);
2249                   end if;
2250
2251                   Next_Formal (Formal);
2252                end loop;
2253
2254                if Etype (Op) = Prev then
2255                   Set_Etype (Op, T);
2256                end if;
2257
2258                Next_Elmt (Elmt);
2259             end loop;
2260          end if;
2261       end Check_Ops_From_Incomplete_Type;
2262
2263    --  Start of processing for Analyze_Full_Type_Declaration
2264
2265    begin
2266       Prev := Find_Type_Name (N);
2267
2268       --  The full view, if present, now points to the current type
2269
2270       --  Ada 2005 (AI-50217): If the type was previously decorated when
2271       --  imported through a LIMITED WITH clause, it appears as incomplete
2272       --  but has no full view.
2273
2274       if Ekind (Prev) = E_Incomplete_Type
2275         and then Present (Full_View (Prev))
2276       then
2277          T := Full_View (Prev);
2278       else
2279          T := Prev;
2280       end if;
2281
2282       Set_Is_Pure (T, Is_Pure (Current_Scope));
2283
2284       --  We set the flag Is_First_Subtype here. It is needed to set the
2285       --  corresponding flag for the Implicit class-wide-type created
2286       --  during tagged types processing.
2287
2288       Set_Is_First_Subtype (T, True);
2289
2290       --  Only composite types other than array types are allowed to have
2291       --  discriminants.
2292
2293       case Nkind (Def) is
2294
2295          --  For derived types, the rule will be checked once we've figured
2296          --  out the parent type.
2297
2298          when N_Derived_Type_Definition =>
2299             null;
2300
2301          --  For record types, discriminants are allowed, unless we are in
2302          --  SPARK.
2303
2304          when N_Record_Definition =>
2305             if Present (Discriminant_Specifications (N)) then
2306                Check_SPARK_Restriction
2307                  ("discriminant type is not allowed",
2308                   Defining_Identifier
2309                     (First (Discriminant_Specifications (N))));
2310             end if;
2311
2312          when others =>
2313             if Present (Discriminant_Specifications (N)) then
2314                Error_Msg_N
2315                  ("elementary or array type cannot have discriminants",
2316                   Defining_Identifier
2317                     (First (Discriminant_Specifications (N))));
2318             end if;
2319       end case;
2320
2321       --  Elaborate the type definition according to kind, and generate
2322       --  subsidiary (implicit) subtypes where needed. We skip this if it was
2323       --  already done (this happens during the reanalysis that follows a call
2324       --  to the high level optimizer).
2325
2326       if not Analyzed (T) then
2327          Set_Analyzed (T);
2328
2329          case Nkind (Def) is
2330
2331             when N_Access_To_Subprogram_Definition =>
2332                Access_Subprogram_Declaration (T, Def);
2333
2334                --  If this is a remote access to subprogram, we must create the
2335                --  equivalent fat pointer type, and related subprograms.
2336
2337                if Is_Remote then
2338                   Process_Remote_AST_Declaration (N);
2339                end if;
2340
2341                --  Validate categorization rule against access type declaration
2342                --  usually a violation in Pure unit, Shared_Passive unit.
2343
2344                Validate_Access_Type_Declaration (T, N);
2345
2346             when N_Access_To_Object_Definition =>
2347                Access_Type_Declaration (T, Def);
2348
2349                --  Validate categorization rule against access type declaration
2350                --  usually a violation in Pure unit, Shared_Passive unit.
2351
2352                Validate_Access_Type_Declaration (T, N);
2353
2354                --  If we are in a Remote_Call_Interface package and define a
2355                --  RACW, then calling stubs and specific stream attributes
2356                --  must be added.
2357
2358                if Is_Remote
2359                  and then Is_Remote_Access_To_Class_Wide_Type (Def_Id)
2360                then
2361                   Add_RACW_Features (Def_Id);
2362                end if;
2363
2364                --  Set no strict aliasing flag if config pragma seen
2365
2366                if Opt.No_Strict_Aliasing then
2367                   Set_No_Strict_Aliasing (Base_Type (Def_Id));
2368                end if;
2369
2370             when N_Array_Type_Definition =>
2371                Array_Type_Declaration (T, Def);
2372
2373             when N_Derived_Type_Definition =>
2374                Derived_Type_Declaration (T, N, T /= Def_Id);
2375
2376             when N_Enumeration_Type_Definition =>
2377                Enumeration_Type_Declaration (T, Def);
2378
2379             when N_Floating_Point_Definition =>
2380                Floating_Point_Type_Declaration (T, Def);
2381
2382             when N_Decimal_Fixed_Point_Definition =>
2383                Decimal_Fixed_Point_Type_Declaration (T, Def);
2384
2385             when N_Ordinary_Fixed_Point_Definition =>
2386                Ordinary_Fixed_Point_Type_Declaration (T, Def);
2387
2388             when N_Signed_Integer_Type_Definition =>
2389                Signed_Integer_Type_Declaration (T, Def);
2390
2391             when N_Modular_Type_Definition =>
2392                Modular_Type_Declaration (T, Def);
2393
2394             when N_Record_Definition =>
2395                Record_Type_Declaration (T, N, Prev);
2396
2397             --  If declaration has a parse error, nothing to elaborate.
2398
2399             when N_Error =>
2400                null;
2401
2402             when others =>
2403                raise Program_Error;
2404
2405          end case;
2406       end if;
2407
2408       if Etype (T) = Any_Type then
2409          return;
2410       end if;
2411
2412       --  Controlled type is not allowed in SPARK
2413
2414       if Is_Visibly_Controlled (T) then
2415          Check_SPARK_Restriction ("controlled type is not allowed", N);
2416       end if;
2417
2418       --  Some common processing for all types
2419
2420       Set_Depends_On_Private (T, Has_Private_Component (T));
2421       Check_Ops_From_Incomplete_Type;
2422
2423       --  Both the declared entity, and its anonymous base type if one
2424       --  was created, need freeze nodes allocated.
2425
2426       declare
2427          B : constant Entity_Id := Base_Type (T);
2428
2429       begin
2430          --  In the case where the base type differs from the first subtype, we
2431          --  pre-allocate a freeze node, and set the proper link to the first
2432          --  subtype. Freeze_Entity will use this preallocated freeze node when
2433          --  it freezes the entity.
2434
2435          --  This does not apply if the base type is a generic type, whose
2436          --  declaration is independent of the current derived definition.
2437
2438          if B /= T and then not Is_Generic_Type (B) then
2439             Ensure_Freeze_Node (B);
2440             Set_First_Subtype_Link (Freeze_Node (B), T);
2441          end if;
2442
2443          --  A type that is imported through a limited_with clause cannot
2444          --  generate any code, and thus need not be frozen. However, an access
2445          --  type with an imported designated type needs a finalization list,
2446          --  which may be referenced in some other package that has non-limited
2447          --  visibility on the designated type. Thus we must create the
2448          --  finalization list at the point the access type is frozen, to
2449          --  prevent unsatisfied references at link time.
2450
2451          if not From_With_Type (T) or else Is_Access_Type (T) then
2452             Set_Has_Delayed_Freeze (T);
2453          end if;
2454       end;
2455
2456       --  Case where T is the full declaration of some private type which has
2457       --  been swapped in Defining_Identifier (N).
2458
2459       if T /= Def_Id and then Is_Private_Type (Def_Id) then
2460          Process_Full_View (N, T, Def_Id);
2461
2462          --  Record the reference. The form of this is a little strange, since
2463          --  the full declaration has been swapped in. So the first parameter
2464          --  here represents the entity to which a reference is made which is
2465          --  the "real" entity, i.e. the one swapped in, and the second
2466          --  parameter provides the reference location.
2467
2468          --  Also, we want to kill Has_Pragma_Unreferenced temporarily here
2469          --  since we don't want a complaint about the full type being an
2470          --  unwanted reference to the private type
2471
2472          declare
2473             B : constant Boolean := Has_Pragma_Unreferenced (T);
2474          begin
2475             Set_Has_Pragma_Unreferenced (T, False);
2476             Generate_Reference (T, T, 'c');
2477             Set_Has_Pragma_Unreferenced (T, B);
2478          end;
2479
2480          Set_Completion_Referenced (Def_Id);
2481
2482       --  For completion of incomplete type, process incomplete dependents
2483       --  and always mark the full type as referenced (it is the incomplete
2484       --  type that we get for any real reference).
2485
2486       elsif Ekind (Prev) = E_Incomplete_Type then
2487          Process_Incomplete_Dependents (N, T, Prev);
2488          Generate_Reference (Prev, Def_Id, 'c');
2489          Set_Completion_Referenced (Def_Id);
2490
2491       --  If not private type or incomplete type completion, this is a real
2492       --  definition of a new entity, so record it.
2493
2494       else
2495          Generate_Definition (Def_Id);
2496       end if;
2497
2498       if Chars (Scope (Def_Id)) = Name_System
2499         and then Chars (Def_Id) = Name_Address
2500         and then Is_Predefined_File_Name (Unit_File_Name (Get_Source_Unit (N)))
2501       then
2502          Set_Is_Descendent_Of_Address (Def_Id);
2503          Set_Is_Descendent_Of_Address (Base_Type (Def_Id));
2504          Set_Is_Descendent_Of_Address (Prev);
2505       end if;
2506
2507       Set_Optimize_Alignment_Flags (Def_Id);
2508       Check_Eliminated (Def_Id);
2509
2510       --  If the declaration is a completion and aspects are present, apply
2511       --  them to the entity for the type which is currently the partial
2512       --  view, but which is the one that will be frozen.
2513
2514       if Has_Aspects (N) then
2515          if Prev /= Def_Id then
2516             Analyze_Aspect_Specifications (N, Prev);
2517          else
2518             Analyze_Aspect_Specifications (N, Def_Id);
2519          end if;
2520       end if;
2521    end Analyze_Full_Type_Declaration;
2522
2523    ----------------------------------
2524    -- Analyze_Incomplete_Type_Decl --
2525    ----------------------------------
2526
2527    procedure Analyze_Incomplete_Type_Decl (N : Node_Id) is
2528       F : constant Boolean := Is_Pure (Current_Scope);
2529       T : Entity_Id;
2530
2531    begin
2532       Check_SPARK_Restriction ("incomplete type is not allowed", N);
2533
2534       Generate_Definition (Defining_Identifier (N));
2535
2536       --  Process an incomplete declaration. The identifier must not have been
2537       --  declared already in the scope. However, an incomplete declaration may
2538       --  appear in the private part of a package, for a private type that has
2539       --  already been declared.
2540
2541       --  In this case, the discriminants (if any) must match
2542
2543       T := Find_Type_Name (N);
2544
2545       Set_Ekind (T, E_Incomplete_Type);
2546       Init_Size_Align (T);
2547       Set_Is_First_Subtype (T, True);
2548       Set_Etype (T, T);
2549
2550       --  Ada 2005 (AI-326): Minimum decoration to give support to tagged
2551       --  incomplete types.
2552
2553       if Tagged_Present (N) then
2554          Set_Is_Tagged_Type (T);
2555          Make_Class_Wide_Type (T);
2556          Set_Direct_Primitive_Operations (T, New_Elmt_List);
2557       end if;
2558
2559       Push_Scope (T);
2560
2561       Set_Stored_Constraint (T, No_Elist);
2562
2563       if Present (Discriminant_Specifications (N)) then
2564          Process_Discriminants (N);
2565       end if;
2566
2567       End_Scope;
2568
2569       --  If the type has discriminants, non-trivial subtypes may be
2570       --  declared before the full view of the type. The full views of those
2571       --  subtypes will be built after the full view of the type.
2572
2573       Set_Private_Dependents (T, New_Elmt_List);
2574       Set_Is_Pure            (T, F);
2575    end Analyze_Incomplete_Type_Decl;
2576
2577    -----------------------------------
2578    -- Analyze_Interface_Declaration --
2579    -----------------------------------
2580
2581    procedure Analyze_Interface_Declaration (T : Entity_Id; Def : Node_Id) is
2582       CW : constant Entity_Id := Class_Wide_Type (T);
2583
2584    begin
2585       Set_Is_Tagged_Type (T);
2586
2587       Set_Is_Limited_Record (T, Limited_Present (Def)
2588                                   or else Task_Present (Def)
2589                                   or else Protected_Present (Def)
2590                                   or else Synchronized_Present (Def));
2591
2592       --  Type is abstract if full declaration carries keyword, or if previous
2593       --  partial view did.
2594
2595       Set_Is_Abstract_Type (T);
2596       Set_Is_Interface (T);
2597
2598       --  Type is a limited interface if it includes the keyword limited, task,
2599       --  protected, or synchronized.
2600
2601       Set_Is_Limited_Interface
2602         (T, Limited_Present (Def)
2603               or else Protected_Present (Def)
2604               or else Synchronized_Present (Def)
2605               or else Task_Present (Def));
2606
2607       Set_Interfaces (T, New_Elmt_List);
2608       Set_Direct_Primitive_Operations (T, New_Elmt_List);
2609
2610       --  Complete the decoration of the class-wide entity if it was already
2611       --  built (i.e. during the creation of the limited view)
2612
2613       if Present (CW) then
2614          Set_Is_Interface (CW);
2615          Set_Is_Limited_Interface      (CW, Is_Limited_Interface (T));
2616       end if;
2617
2618       --  Check runtime support for synchronized interfaces
2619
2620       if VM_Target = No_VM
2621         and then (Is_Task_Interface (T)
2622                     or else Is_Protected_Interface (T)
2623                     or else Is_Synchronized_Interface (T))
2624         and then not RTE_Available (RE_Select_Specific_Data)
2625       then
2626          Error_Msg_CRT ("synchronized interfaces", T);
2627       end if;
2628    end Analyze_Interface_Declaration;
2629
2630    -----------------------------
2631    -- Analyze_Itype_Reference --
2632    -----------------------------
2633
2634    --  Nothing to do. This node is placed in the tree only for the benefit of
2635    --  back end processing, and has no effect on the semantic processing.
2636
2637    procedure Analyze_Itype_Reference (N : Node_Id) is
2638    begin
2639       pragma Assert (Is_Itype (Itype (N)));
2640       null;
2641    end Analyze_Itype_Reference;
2642
2643    --------------------------------
2644    -- Analyze_Number_Declaration --
2645    --------------------------------
2646
2647    procedure Analyze_Number_Declaration (N : Node_Id) is
2648       Id    : constant Entity_Id := Defining_Identifier (N);
2649       E     : constant Node_Id   := Expression (N);
2650       T     : Entity_Id;
2651       Index : Interp_Index;
2652       It    : Interp;
2653
2654    begin
2655       Generate_Definition (Id);
2656       Enter_Name (Id);
2657
2658       --  This is an optimization of a common case of an integer literal
2659
2660       if Nkind (E) = N_Integer_Literal then
2661          Set_Is_Static_Expression (E, True);
2662          Set_Etype                (E, Universal_Integer);
2663
2664          Set_Etype     (Id, Universal_Integer);
2665          Set_Ekind     (Id, E_Named_Integer);
2666          Set_Is_Frozen (Id, True);
2667          return;
2668       end if;
2669
2670       Set_Is_Pure (Id, Is_Pure (Current_Scope));
2671
2672       --  Process expression, replacing error by integer zero, to avoid
2673       --  cascaded errors or aborts further along in the processing
2674
2675       --  Replace Error by integer zero, which seems least likely to
2676       --  cause cascaded errors.
2677
2678       if E = Error then
2679          Rewrite (E, Make_Integer_Literal (Sloc (E), Uint_0));
2680          Set_Error_Posted (E);
2681       end if;
2682
2683       Analyze (E);
2684
2685       --  Verify that the expression is static and numeric. If
2686       --  the expression is overloaded, we apply the preference
2687       --  rule that favors root numeric types.
2688
2689       if not Is_Overloaded (E) then
2690          T := Etype (E);
2691
2692       else
2693          T := Any_Type;
2694
2695          Get_First_Interp (E, Index, It);
2696          while Present (It.Typ) loop
2697             if (Is_Integer_Type (It.Typ)
2698                  or else Is_Real_Type (It.Typ))
2699               and then (Scope (Base_Type (It.Typ))) = Standard_Standard
2700             then
2701                if T = Any_Type then
2702                   T := It.Typ;
2703
2704                elsif It.Typ = Universal_Real
2705                  or else It.Typ = Universal_Integer
2706                then
2707                   --  Choose universal interpretation over any other
2708
2709                   T := It.Typ;
2710                   exit;
2711                end if;
2712             end if;
2713
2714             Get_Next_Interp (Index, It);
2715          end loop;
2716       end if;
2717
2718       if Is_Integer_Type (T)  then
2719          Resolve (E, T);
2720          Set_Etype (Id, Universal_Integer);
2721          Set_Ekind (Id, E_Named_Integer);
2722
2723       elsif Is_Real_Type (T) then
2724
2725          --  Because the real value is converted to universal_real, this is a
2726          --  legal context for a universal fixed expression.
2727
2728          if T = Universal_Fixed then
2729             declare
2730                Loc  : constant Source_Ptr := Sloc (N);
2731                Conv : constant Node_Id := Make_Type_Conversion (Loc,
2732                         Subtype_Mark =>
2733                           New_Occurrence_Of (Universal_Real, Loc),
2734                         Expression => Relocate_Node (E));
2735
2736             begin
2737                Rewrite (E, Conv);
2738                Analyze (E);
2739             end;
2740
2741          elsif T = Any_Fixed then
2742             Error_Msg_N ("illegal context for mixed mode operation", E);
2743
2744             --  Expression is of the form : universal_fixed * integer. Try to
2745             --  resolve as universal_real.
2746
2747             T := Universal_Real;
2748             Set_Etype (E, T);
2749          end if;
2750
2751          Resolve (E, T);
2752          Set_Etype (Id, Universal_Real);
2753          Set_Ekind (Id, E_Named_Real);
2754
2755       else
2756          Wrong_Type (E, Any_Numeric);
2757          Resolve (E, T);
2758
2759          Set_Etype               (Id, T);
2760          Set_Ekind               (Id, E_Constant);
2761          Set_Never_Set_In_Source (Id, True);
2762          Set_Is_True_Constant    (Id, True);
2763          return;
2764       end if;
2765
2766       if Nkind_In (E, N_Integer_Literal, N_Real_Literal) then
2767          Set_Etype (E, Etype (Id));
2768       end if;
2769
2770       if not Is_OK_Static_Expression (E) then
2771          Flag_Non_Static_Expr
2772            ("non-static expression used in number declaration!", E);
2773          Rewrite (E, Make_Integer_Literal (Sloc (N), 1));
2774          Set_Etype (E, Any_Type);
2775       end if;
2776    end Analyze_Number_Declaration;
2777
2778    --------------------------------
2779    -- Analyze_Object_Declaration --
2780    --------------------------------
2781
2782    procedure Analyze_Object_Declaration (N : Node_Id) is
2783       Loc   : constant Source_Ptr := Sloc (N);
2784       Id    : constant Entity_Id  := Defining_Identifier (N);
2785       T     : Entity_Id;
2786       Act_T : Entity_Id;
2787
2788       E : Node_Id := Expression (N);
2789       --  E is set to Expression (N) throughout this routine. When
2790       --  Expression (N) is modified, E is changed accordingly.
2791
2792       Prev_Entity : Entity_Id := Empty;
2793
2794       function Count_Tasks (T : Entity_Id) return Uint;
2795       --  This function is called when a non-generic library level object of a
2796       --  task type is declared. Its function is to count the static number of
2797       --  tasks declared within the type (it is only called if Has_Tasks is set
2798       --  for T). As a side effect, if an array of tasks with non-static bounds
2799       --  or a variant record type is encountered, Check_Restrictions is called
2800       --  indicating the count is unknown.
2801
2802       -----------------
2803       -- Count_Tasks --
2804       -----------------
2805
2806       function Count_Tasks (T : Entity_Id) return Uint is
2807          C : Entity_Id;
2808          X : Node_Id;
2809          V : Uint;
2810
2811       begin
2812          if Is_Task_Type (T) then
2813             return Uint_1;
2814
2815          elsif Is_Record_Type (T) then
2816             if Has_Discriminants (T) then
2817                Check_Restriction (Max_Tasks, N);
2818                return Uint_0;
2819
2820             else
2821                V := Uint_0;
2822                C := First_Component (T);
2823                while Present (C) loop
2824                   V := V + Count_Tasks (Etype (C));
2825                   Next_Component (C);
2826                end loop;
2827
2828                return V;
2829             end if;
2830
2831          elsif Is_Array_Type (T) then
2832             X := First_Index (T);
2833             V := Count_Tasks (Component_Type (T));
2834             while Present (X) loop
2835                C := Etype (X);
2836
2837                if not Is_Static_Subtype (C) then
2838                   Check_Restriction (Max_Tasks, N);
2839                   return Uint_0;
2840                else
2841                   V := V * (UI_Max (Uint_0,
2842                                     Expr_Value (Type_High_Bound (C)) -
2843                                     Expr_Value (Type_Low_Bound (C)) + Uint_1));
2844                end if;
2845
2846                Next_Index (X);
2847             end loop;
2848
2849             return V;
2850
2851          else
2852             return Uint_0;
2853          end if;
2854       end Count_Tasks;
2855
2856    --  Start of processing for Analyze_Object_Declaration
2857
2858    begin
2859       --  There are three kinds of implicit types generated by an
2860       --  object declaration:
2861
2862       --   1. Those generated by the original Object Definition
2863
2864       --   2. Those generated by the Expression
2865
2866       --   3. Those used to constrained the Object Definition with the
2867       --       expression constraints when it is unconstrained
2868
2869       --  They must be generated in this order to avoid order of elaboration
2870       --  issues. Thus the first step (after entering the name) is to analyze
2871       --  the object definition.
2872
2873       if Constant_Present (N) then
2874          Prev_Entity := Current_Entity_In_Scope (Id);
2875
2876          if Present (Prev_Entity)
2877            and then
2878              --  If the homograph is an implicit subprogram, it is overridden
2879              --  by the current declaration.
2880
2881              ((Is_Overloadable (Prev_Entity)
2882                 and then Is_Inherited_Operation (Prev_Entity))
2883
2884                --  The current object is a discriminal generated for an entry
2885                --  family index. Even though the index is a constant, in this
2886                --  particular context there is no true constant redeclaration.
2887                --  Enter_Name will handle the visibility.
2888
2889                or else
2890                 (Is_Discriminal (Id)
2891                    and then Ekind (Discriminal_Link (Id)) =
2892                               E_Entry_Index_Parameter)
2893
2894                --  The current object is the renaming for a generic declared
2895                --  within the instance.
2896
2897                or else
2898                 (Ekind (Prev_Entity) = E_Package
2899                   and then Nkind (Parent (Prev_Entity)) =
2900                                          N_Package_Renaming_Declaration
2901                   and then not Comes_From_Source (Prev_Entity)
2902                   and then Is_Generic_Instance (Renamed_Entity (Prev_Entity))))
2903          then
2904             Prev_Entity := Empty;
2905          end if;
2906       end if;
2907
2908       if Present (Prev_Entity) then
2909          Constant_Redeclaration (Id, N, T);
2910
2911          Generate_Reference (Prev_Entity, Id, 'c');
2912          Set_Completion_Referenced (Id);
2913
2914          if Error_Posted (N) then
2915
2916             --  Type mismatch or illegal redeclaration, Do not analyze
2917             --  expression to avoid cascaded errors.
2918
2919             T := Find_Type_Of_Object (Object_Definition (N), N);
2920             Set_Etype (Id, T);
2921             Set_Ekind (Id, E_Variable);
2922             goto Leave;
2923          end if;
2924
2925       --  In the normal case, enter identifier at the start to catch premature
2926       --  usage in the initialization expression.
2927
2928       else
2929          Generate_Definition (Id);
2930          Enter_Name (Id);
2931
2932          Mark_Coextensions (N, Object_Definition (N));
2933
2934          T := Find_Type_Of_Object (Object_Definition (N), N);
2935
2936          if Nkind (Object_Definition (N)) = N_Access_Definition
2937            and then Present
2938              (Access_To_Subprogram_Definition (Object_Definition (N)))
2939            and then Protected_Present
2940              (Access_To_Subprogram_Definition (Object_Definition (N)))
2941          then
2942             T := Replace_Anonymous_Access_To_Protected_Subprogram (N);
2943          end if;
2944
2945          if Error_Posted (Id) then
2946             Set_Etype (Id, T);
2947             Set_Ekind (Id, E_Variable);
2948             goto Leave;
2949          end if;
2950       end if;
2951
2952       --  Ada 2005 (AI-231): Propagate the null-excluding attribute and carry
2953       --  out some static checks
2954
2955       if Ada_Version >= Ada_2005
2956         and then Can_Never_Be_Null (T)
2957       then
2958          --  In case of aggregates we must also take care of the correct
2959          --  initialization of nested aggregates bug this is done at the
2960          --  point of the analysis of the aggregate (see sem_aggr.adb)
2961
2962          if Present (Expression (N))
2963            and then Nkind (Expression (N)) = N_Aggregate
2964          then
2965             null;
2966
2967          else
2968             declare
2969                Save_Typ : constant Entity_Id := Etype (Id);
2970             begin
2971                Set_Etype (Id, T); --  Temp. decoration for static checks
2972                Null_Exclusion_Static_Checks (N);
2973                Set_Etype (Id, Save_Typ);
2974             end;
2975          end if;
2976       end if;
2977
2978       Set_Is_Pure (Id, Is_Pure (Current_Scope));
2979
2980       --  If deferred constant, make sure context is appropriate. We detect
2981       --  a deferred constant as a constant declaration with no expression.
2982       --  A deferred constant can appear in a package body if its completion
2983       --  is by means of an interface pragma.
2984
2985       if Constant_Present (N)
2986         and then No (E)
2987       then
2988          --  A deferred constant may appear in the declarative part of the
2989          --  following constructs:
2990
2991          --     blocks
2992          --     entry bodies
2993          --     extended return statements
2994          --     package specs
2995          --     package bodies
2996          --     subprogram bodies
2997          --     task bodies
2998
2999          --  When declared inside a package spec, a deferred constant must be
3000          --  completed by a full constant declaration or pragma Import. In all
3001          --  other cases, the only proper completion is pragma Import. Extended
3002          --  return statements are flagged as invalid contexts because they do
3003          --  not have a declarative part and so cannot accommodate the pragma.
3004
3005          if Ekind (Current_Scope) = E_Return_Statement then
3006             Error_Msg_N
3007               ("invalid context for deferred constant declaration (RM 7.4)",
3008                N);
3009             Error_Msg_N
3010               ("\declaration requires an initialization expression",
3011                 N);
3012             Set_Constant_Present (N, False);
3013
3014          --  In Ada 83, deferred constant must be of private type
3015
3016          elsif not Is_Private_Type (T) then
3017             if Ada_Version = Ada_83 and then Comes_From_Source (N) then
3018                Error_Msg_N
3019                  ("(Ada 83) deferred constant must be private type", N);
3020             end if;
3021          end if;
3022
3023       --  If not a deferred constant, then object declaration freezes its type
3024
3025       else
3026          Check_Fully_Declared (T, N);
3027          Freeze_Before (N, T);
3028       end if;
3029
3030       --  If the object was created by a constrained array definition, then
3031       --  set the link in both the anonymous base type and anonymous subtype
3032       --  that are built to represent the array type to point to the object.
3033
3034       if Nkind (Object_Definition (Declaration_Node (Id))) =
3035                         N_Constrained_Array_Definition
3036       then
3037          Set_Related_Array_Object (T, Id);
3038          Set_Related_Array_Object (Base_Type (T), Id);
3039       end if;
3040
3041       --  Special checks for protected objects not at library level
3042
3043       if Is_Protected_Type (T)
3044         and then not Is_Library_Level_Entity (Id)
3045       then
3046          Check_Restriction (No_Local_Protected_Objects, Id);
3047
3048          --  Protected objects with interrupt handlers must be at library level
3049
3050          --  Ada 2005: this test is not needed (and the corresponding clause
3051          --  in the RM is removed) because accessibility checks are sufficient
3052          --  to make handlers not at the library level illegal.
3053
3054          if Has_Interrupt_Handler (T)
3055            and then Ada_Version < Ada_2005
3056          then
3057             Error_Msg_N
3058               ("interrupt object can only be declared at library level", Id);
3059          end if;
3060       end if;
3061
3062       --  The actual subtype of the object is the nominal subtype, unless
3063       --  the nominal one is unconstrained and obtained from the expression.
3064
3065       Act_T := T;
3066
3067       --  These checks should be performed before the initialization expression
3068       --  is considered, so that the Object_Definition node is still the same
3069       --  as in source code.
3070
3071       --  In SPARK, the nominal subtype shall be given by a subtype mark and
3072       --  shall not be unconstrained. (The only exception to this is the
3073       --  admission of declarations of constants of type String.)
3074
3075       if not
3076         Nkind_In (Object_Definition (N), N_Identifier, N_Expanded_Name)
3077       then
3078          Check_SPARK_Restriction
3079            ("subtype mark required", Object_Definition (N));
3080
3081       elsif Is_Array_Type (T)
3082         and then not Is_Constrained (T)
3083         and then T /= Standard_String
3084       then
3085          Check_SPARK_Restriction
3086            ("subtype mark of constrained type expected",
3087             Object_Definition (N));
3088       end if;
3089
3090       --  There are no aliased objects in SPARK
3091
3092       if Aliased_Present (N) then
3093          Check_SPARK_Restriction ("aliased object is not allowed", N);
3094       end if;
3095
3096       --  Process initialization expression if present and not in error
3097
3098       if Present (E) and then E /= Error then
3099
3100          --  Generate an error in case of CPP class-wide object initialization.
3101          --  Required because otherwise the expansion of the class-wide
3102          --  assignment would try to use 'size to initialize the object
3103          --  (primitive that is not available in CPP tagged types).
3104
3105          if Is_Class_Wide_Type (Act_T)
3106            and then
3107              (Is_CPP_Class (Root_Type (Etype (Act_T)))
3108                or else
3109                  (Present (Full_View (Root_Type (Etype (Act_T))))
3110                    and then
3111                      Is_CPP_Class (Full_View (Root_Type (Etype (Act_T))))))
3112          then
3113             Error_Msg_N
3114               ("predefined assignment not available for 'C'P'P tagged types",
3115                E);
3116          end if;
3117
3118          Mark_Coextensions (N, E);
3119          Analyze (E);
3120
3121          --  In case of errors detected in the analysis of the expression,
3122          --  decorate it with the expected type to avoid cascaded errors
3123
3124          if No (Etype (E)) then
3125             Set_Etype (E, T);
3126          end if;
3127
3128          --  If an initialization expression is present, then we set the
3129          --  Is_True_Constant flag. It will be reset if this is a variable
3130          --  and it is indeed modified.
3131
3132          Set_Is_True_Constant (Id, True);
3133
3134          --  If we are analyzing a constant declaration, set its completion
3135          --  flag after analyzing and resolving the expression.
3136
3137          if Constant_Present (N) then
3138             Set_Has_Completion (Id);
3139          end if;
3140
3141          --  Set type and resolve (type may be overridden later on)
3142
3143          Set_Etype (Id, T);
3144          Resolve (E, T);
3145
3146          --  If E is null and has been replaced by an N_Raise_Constraint_Error
3147          --  node (which was marked already-analyzed), we need to set the type
3148          --  to something other than Any_Access in order to keep gigi happy.
3149
3150          if Etype (E) = Any_Access then
3151             Set_Etype (E, T);
3152          end if;
3153
3154          --  If the object is an access to variable, the initialization
3155          --  expression cannot be an access to constant.
3156
3157          if Is_Access_Type (T)
3158            and then not Is_Access_Constant (T)
3159            and then Is_Access_Type (Etype (E))
3160            and then Is_Access_Constant (Etype (E))
3161          then
3162             Error_Msg_N
3163               ("access to variable cannot be initialized "
3164                & "with an access-to-constant expression", E);
3165          end if;
3166
3167          if not Assignment_OK (N) then
3168             Check_Initialization (T, E);
3169          end if;
3170
3171          Check_Unset_Reference (E);
3172
3173          --  If this is a variable, then set current value. If this is a
3174          --  declared constant of a scalar type with a static expression,
3175          --  indicate that it is always valid.
3176
3177          if not Constant_Present (N) then
3178             if Compile_Time_Known_Value (E) then
3179                Set_Current_Value (Id, E);
3180             end if;
3181
3182          elsif Is_Scalar_Type (T)
3183            and then Is_OK_Static_Expression (E)
3184          then
3185             Set_Is_Known_Valid (Id);
3186          end if;
3187
3188          --  Deal with setting of null flags
3189
3190          if Is_Access_Type (T) then
3191             if Known_Non_Null (E) then
3192                Set_Is_Known_Non_Null (Id, True);
3193             elsif Known_Null (E)
3194               and then not Can_Never_Be_Null (Id)
3195             then
3196                Set_Is_Known_Null (Id, True);
3197             end if;
3198          end if;
3199
3200          --  Check incorrect use of dynamically tagged expressions.
3201
3202          if Is_Tagged_Type (T) then
3203             Check_Dynamically_Tagged_Expression
3204               (Expr        => E,
3205                Typ         => T,
3206                Related_Nod => N);
3207          end if;
3208
3209          Apply_Scalar_Range_Check (E, T);
3210          Apply_Static_Length_Check (E, T);
3211
3212          if Nkind (Original_Node (N)) = N_Object_Declaration
3213            and then Comes_From_Source (Original_Node (N))
3214
3215            --  Only call test if needed
3216
3217            and then Restriction_Check_Required (SPARK)
3218            and then not Is_SPARK_Initialization_Expr (E)
3219          then
3220             Check_SPARK_Restriction
3221               ("initialization expression is not appropriate", E);
3222          end if;
3223       end if;
3224
3225       --  If the No_Streams restriction is set, check that the type of the
3226       --  object is not, and does not contain, any subtype derived from
3227       --  Ada.Streams.Root_Stream_Type. Note that we guard the call to
3228       --  Has_Stream just for efficiency reasons. There is no point in
3229       --  spending time on a Has_Stream check if the restriction is not set.
3230
3231       if Restriction_Check_Required (No_Streams) then
3232          if Has_Stream (T) then
3233             Check_Restriction (No_Streams, N);
3234          end if;
3235       end if;
3236
3237       --  Deal with predicate check before we start to do major rewriting.
3238       --  it is OK to initialize and then check the initialized value, since
3239       --  the object goes out of scope if we get a predicate failure. Note
3240       --  that we do this in the analyzer and not the expander because the
3241       --  analyzer does some substantial rewriting in some cases.
3242
3243       --  We need a predicate check if the type has predicates, and if either
3244       --  there is an initializing expression, or for default initialization
3245       --  when we have at least one case of an explicit default initial value.
3246
3247       if not Suppress_Assignment_Checks (N)
3248         and then Present (Predicate_Function (T))
3249         and then
3250           (Present (E)
3251             or else
3252               Is_Partially_Initialized_Type (T, Include_Implicit => False))
3253       then
3254          Insert_After (N,
3255            Make_Predicate_Check (T, New_Occurrence_Of (Id, Loc)));
3256       end if;
3257
3258       --  Case of unconstrained type
3259
3260       if Is_Indefinite_Subtype (T) then
3261
3262          --  Nothing to do in deferred constant case
3263
3264          if Constant_Present (N) and then No (E) then
3265             null;
3266
3267          --  Case of no initialization present
3268
3269          elsif No (E) then
3270             if No_Initialization (N) then
3271                null;
3272
3273             elsif Is_Class_Wide_Type (T) then
3274                Error_Msg_N
3275                  ("initialization required in class-wide declaration ", N);
3276
3277             else
3278                Error_Msg_N
3279                  ("unconstrained subtype not allowed (need initialization)",
3280                   Object_Definition (N));
3281
3282                if Is_Record_Type (T) and then Has_Discriminants (T) then
3283                   Error_Msg_N
3284                     ("\provide initial value or explicit discriminant values",
3285                      Object_Definition (N));
3286
3287                   Error_Msg_NE
3288                     ("\or give default discriminant values for type&",
3289                      Object_Definition (N), T);
3290
3291                elsif Is_Array_Type (T) then
3292                   Error_Msg_N
3293                     ("\provide initial value or explicit array bounds",
3294                      Object_Definition (N));
3295                end if;
3296             end if;
3297
3298          --  Case of initialization present but in error. Set initial
3299          --  expression as absent (but do not make above complaints)
3300
3301          elsif E = Error then
3302             Set_Expression (N, Empty);
3303             E := Empty;
3304
3305          --  Case of initialization present
3306
3307          else
3308             --  Not allowed in Ada 83
3309
3310             if not Constant_Present (N) then
3311                if Ada_Version = Ada_83
3312                  and then Comes_From_Source (Object_Definition (N))
3313                then
3314                   Error_Msg_N
3315                     ("(Ada 83) unconstrained variable not allowed",
3316                      Object_Definition (N));
3317                end if;
3318             end if;
3319
3320             --  Now we constrain the variable from the initializing expression
3321
3322             --  If the expression is an aggregate, it has been expanded into
3323             --  individual assignments. Retrieve the actual type from the
3324             --  expanded construct.
3325
3326             if Is_Array_Type (T)
3327               and then No_Initialization (N)
3328               and then Nkind (Original_Node (E)) = N_Aggregate
3329             then
3330                Act_T := Etype (E);
3331
3332             --  In case of class-wide interface object declarations we delay
3333             --  the generation of the equivalent record type declarations until
3334             --  its expansion because there are cases in they are not required.
3335
3336             elsif Is_Interface (T) then
3337                null;
3338
3339             else
3340                Expand_Subtype_From_Expr (N, T, Object_Definition (N), E);
3341                Act_T := Find_Type_Of_Object (Object_Definition (N), N);
3342             end if;
3343
3344             Set_Is_Constr_Subt_For_U_Nominal (Act_T);
3345
3346             if Aliased_Present (N) then
3347                Set_Is_Constr_Subt_For_UN_Aliased (Act_T);
3348             end if;
3349
3350             Freeze_Before (N, Act_T);
3351             Freeze_Before (N, T);
3352          end if;
3353
3354       elsif Is_Array_Type (T)
3355         and then No_Initialization (N)
3356         and then Nkind (Original_Node (E)) = N_Aggregate
3357       then
3358          if not Is_Entity_Name (Object_Definition (N)) then
3359             Act_T := Etype (E);
3360             Check_Compile_Time_Size (Act_T);
3361
3362             if Aliased_Present (N) then
3363                Set_Is_Constr_Subt_For_UN_Aliased (Act_T);
3364             end if;
3365          end if;
3366
3367          --  When the given object definition and the aggregate are specified
3368          --  independently, and their lengths might differ do a length check.
3369          --  This cannot happen if the aggregate is of the form (others =>...)
3370
3371          if not Is_Constrained (T) then
3372             null;
3373
3374          elsif Nkind (E) = N_Raise_Constraint_Error then
3375
3376             --  Aggregate is statically illegal. Place back in declaration
3377
3378             Set_Expression (N, E);
3379             Set_No_Initialization (N, False);
3380
3381          elsif T = Etype (E) then
3382             null;
3383
3384          elsif Nkind (E) = N_Aggregate
3385            and then Present (Component_Associations (E))
3386            and then Present (Choices (First (Component_Associations (E))))
3387            and then Nkind (First
3388             (Choices (First (Component_Associations (E))))) = N_Others_Choice
3389          then
3390             null;
3391
3392          else
3393             Apply_Length_Check (E, T);
3394          end if;
3395
3396       --  If the type is limited unconstrained with defaulted discriminants and
3397       --  there is no expression, then the object is constrained by the
3398       --  defaults, so it is worthwhile building the corresponding subtype.
3399
3400       elsif (Is_Limited_Record (T) or else Is_Concurrent_Type (T))
3401         and then not Is_Constrained (T)
3402         and then Has_Discriminants (T)
3403       then
3404          if No (E) then
3405             Act_T := Build_Default_Subtype (T, N);
3406          else
3407             --  Ada 2005:  a limited object may be initialized by means of an
3408             --  aggregate. If the type has default discriminants it has an
3409             --  unconstrained nominal type, Its actual subtype will be obtained
3410             --  from the aggregate, and not from the default discriminants.
3411
3412             Act_T := Etype (E);
3413          end if;
3414
3415          Rewrite (Object_Definition (N), New_Occurrence_Of (Act_T, Loc));
3416
3417       elsif Present (Underlying_Type (T))
3418         and then not Is_Constrained (Underlying_Type (T))
3419         and then Has_Discriminants (Underlying_Type (T))
3420         and then Nkind (E) = N_Function_Call
3421         and then Constant_Present (N)
3422       then
3423          --  The back-end has problems with constants of a discriminated type
3424          --  with defaults, if the initial value is a function call. We
3425          --  generate an intermediate temporary for the result of the call.
3426          --  It is unclear why this should make it acceptable to gcc. ???
3427
3428          Remove_Side_Effects (E);
3429
3430       --  If this is a constant declaration of an unconstrained type and
3431       --  the initialization is an aggregate, we can use the subtype of the
3432       --  aggregate for the declared entity because it is immutable.
3433
3434       elsif not Is_Constrained (T)
3435         and then Has_Discriminants (T)
3436         and then Constant_Present (N)
3437         and then not Has_Unchecked_Union (T)
3438         and then Nkind (E) = N_Aggregate
3439       then
3440          Act_T := Etype (E);
3441       end if;
3442
3443       --  Check No_Wide_Characters restriction
3444
3445       Check_Wide_Character_Restriction (T, Object_Definition (N));
3446
3447       --  Indicate this is not set in source. Certainly true for constants, and
3448       --  true for variables so far (will be reset for a variable if and when
3449       --  we encounter a modification in the source).
3450
3451       Set_Never_Set_In_Source (Id, True);
3452
3453       --  Now establish the proper kind and type of the object
3454
3455       if Constant_Present (N) then
3456          Set_Ekind            (Id, E_Constant);
3457          Set_Is_True_Constant (Id, True);
3458
3459       else
3460          Set_Ekind (Id, E_Variable);
3461
3462          --  A variable is set as shared passive if it appears in a shared
3463          --  passive package, and is at the outer level. This is not done for
3464          --  entities generated during expansion, because those are always
3465          --  manipulated locally.
3466
3467          if Is_Shared_Passive (Current_Scope)
3468            and then Is_Library_Level_Entity (Id)
3469            and then Comes_From_Source (Id)
3470          then
3471             Set_Is_Shared_Passive (Id);
3472             Check_Shared_Var (Id, T, N);
3473          end if;
3474
3475          --  Set Has_Initial_Value if initializing expression present. Note
3476          --  that if there is no initializing expression, we leave the state
3477          --  of this flag unchanged (usually it will be False, but notably in
3478          --  the case of exception choice variables, it will already be true).
3479
3480          if Present (E) then
3481             Set_Has_Initial_Value (Id, True);
3482          end if;
3483       end if;
3484
3485       --  Initialize alignment and size and capture alignment setting
3486
3487       Init_Alignment               (Id);
3488       Init_Esize                   (Id);
3489       Set_Optimize_Alignment_Flags (Id);
3490
3491       --  Deal with aliased case
3492
3493       if Aliased_Present (N) then
3494          Set_Is_Aliased (Id);
3495
3496          --  If the object is aliased and the type is unconstrained with
3497          --  defaulted discriminants and there is no expression, then the
3498          --  object is constrained by the defaults, so it is worthwhile
3499          --  building the corresponding subtype.
3500
3501          --  Ada 2005 (AI-363): If the aliased object is discriminated and
3502          --  unconstrained, then only establish an actual subtype if the
3503          --  nominal subtype is indefinite. In definite cases the object is
3504          --  unconstrained in Ada 2005.
3505
3506          if No (E)
3507            and then Is_Record_Type (T)
3508            and then not Is_Constrained (T)
3509            and then Has_Discriminants (T)
3510            and then (Ada_Version < Ada_2005 or else Is_Indefinite_Subtype (T))
3511          then
3512             Set_Actual_Subtype (Id, Build_Default_Subtype (T, N));
3513          end if;
3514       end if;
3515
3516       --  Now we can set the type of the object
3517
3518       Set_Etype (Id, Act_T);
3519
3520       --  Deal with controlled types
3521
3522       if Has_Controlled_Component (Etype (Id))
3523         or else Is_Controlled (Etype (Id))
3524       then
3525          if not Is_Library_Level_Entity (Id) then
3526             Check_Restriction (No_Nested_Finalization, N);
3527          else
3528             Validate_Controlled_Object (Id);
3529          end if;
3530
3531          --  Generate a warning when an initialization causes an obvious ABE
3532          --  violation. If the init expression is a simple aggregate there
3533          --  shouldn't be any initialize/adjust call generated. This will be
3534          --  true as soon as aggregates are built in place when possible.
3535
3536          --  ??? at the moment we do not generate warnings for temporaries
3537          --  created for those aggregates although Program_Error might be
3538          --  generated if compiled with -gnato.
3539
3540          if Is_Controlled (Etype (Id))
3541             and then Comes_From_Source (Id)
3542          then
3543             declare
3544                BT : constant Entity_Id := Base_Type (Etype (Id));
3545
3546                Implicit_Call : Entity_Id;
3547                pragma Warnings (Off, Implicit_Call);
3548                --  ??? what is this for (never referenced!)
3549
3550                function Is_Aggr (N : Node_Id) return Boolean;
3551                --  Check that N is an aggregate
3552
3553                -------------
3554                -- Is_Aggr --
3555                -------------
3556
3557                function Is_Aggr (N : Node_Id) return Boolean is
3558                begin
3559                   case Nkind (Original_Node (N)) is
3560                      when N_Aggregate | N_Extension_Aggregate =>
3561                         return True;
3562
3563                      when N_Qualified_Expression |
3564                           N_Type_Conversion      |
3565                           N_Unchecked_Type_Conversion =>
3566                         return Is_Aggr (Expression (Original_Node (N)));
3567
3568                      when others =>
3569                         return False;
3570                   end case;
3571                end Is_Aggr;
3572
3573             begin
3574                --  If no underlying type, we already are in an error situation.
3575                --  Do not try to add a warning since we do not have access to
3576                --  prim-op list.
3577
3578                if No (Underlying_Type (BT)) then
3579                   Implicit_Call := Empty;
3580
3581                --  A generic type does not have usable primitive operators.
3582                --  Initialization calls are built for instances.
3583
3584                elsif Is_Generic_Type (BT) then
3585                   Implicit_Call := Empty;
3586
3587                --  If the init expression is not an aggregate, an adjust call
3588                --  will be generated
3589
3590                elsif Present (E) and then not Is_Aggr (E) then
3591                   Implicit_Call := Find_Prim_Op (BT, Name_Adjust);
3592
3593                --  If no init expression and we are not in the deferred
3594                --  constant case, an Initialize call will be generated
3595
3596                elsif No (E) and then not Constant_Present (N) then
3597                   Implicit_Call := Find_Prim_Op (BT, Name_Initialize);
3598
3599                else
3600                   Implicit_Call := Empty;
3601                end if;
3602             end;
3603          end if;
3604       end if;
3605
3606       if Has_Task (Etype (Id)) then
3607          Check_Restriction (No_Tasking, N);
3608
3609          --  Deal with counting max tasks
3610
3611          --  Nothing to do if inside a generic
3612
3613          if Inside_A_Generic then
3614             null;
3615
3616          --  If library level entity, then count tasks
3617
3618          elsif Is_Library_Level_Entity (Id) then
3619             Check_Restriction (Max_Tasks, N, Count_Tasks (Etype (Id)));
3620
3621          --  If not library level entity, then indicate we don't know max
3622          --  tasks and also check task hierarchy restriction and blocking
3623          --  operation (since starting a task is definitely blocking!)
3624
3625          else
3626             Check_Restriction (Max_Tasks, N);
3627             Check_Restriction (No_Task_Hierarchy, N);
3628             Check_Potentially_Blocking_Operation (N);
3629          end if;
3630
3631          --  A rather specialized test. If we see two tasks being declared
3632          --  of the same type in the same object declaration, and the task
3633          --  has an entry with an address clause, we know that program error
3634          --  will be raised at run time since we can't have two tasks with
3635          --  entries at the same address.
3636
3637          if Is_Task_Type (Etype (Id)) and then More_Ids (N) then
3638             declare
3639                E : Entity_Id;
3640
3641             begin
3642                E := First_Entity (Etype (Id));
3643                while Present (E) loop
3644                   if Ekind (E) = E_Entry
3645                     and then Present (Get_Attribute_Definition_Clause
3646                                         (E, Attribute_Address))
3647                   then
3648                      Error_Msg_N
3649                        ("?more than one task with same entry address", N);
3650                      Error_Msg_N
3651                        ("\?Program_Error will be raised at run time", N);
3652                      Insert_Action (N,
3653                        Make_Raise_Program_Error (Loc,
3654                          Reason => PE_Duplicated_Entry_Address));
3655                      exit;
3656                   end if;
3657
3658                   Next_Entity (E);
3659                end loop;
3660             end;
3661          end if;
3662       end if;
3663
3664       --  Some simple constant-propagation: if the expression is a constant
3665       --  string initialized with a literal, share the literal. This avoids
3666       --  a run-time copy.
3667
3668       if Present (E)
3669         and then Is_Entity_Name (E)
3670         and then Ekind (Entity (E)) = E_Constant
3671         and then Base_Type (Etype (E)) = Standard_String
3672       then
3673          declare
3674             Val : constant Node_Id := Constant_Value (Entity (E));
3675          begin
3676             if Present (Val)
3677               and then Nkind (Val) = N_String_Literal
3678             then
3679                Rewrite (E, New_Copy (Val));
3680             end if;
3681          end;
3682       end if;
3683
3684       --  Another optimization: if the nominal subtype is unconstrained and
3685       --  the expression is a function call that returns an unconstrained
3686       --  type, rewrite the declaration as a renaming of the result of the
3687       --  call. The exceptions below are cases where the copy is expected,
3688       --  either by the back end (Aliased case) or by the semantics, as for
3689       --  initializing controlled types or copying tags for classwide types.
3690
3691       if Present (E)
3692         and then Nkind (E) = N_Explicit_Dereference
3693         and then Nkind (Original_Node (E)) = N_Function_Call
3694         and then not Is_Library_Level_Entity (Id)
3695         and then not Is_Constrained (Underlying_Type (T))
3696         and then not Is_Aliased (Id)
3697         and then not Is_Class_Wide_Type (T)
3698         and then not Is_Controlled (T)
3699         and then not Has_Controlled_Component (Base_Type (T))
3700         and then Expander_Active
3701       then
3702          Rewrite (N,
3703            Make_Object_Renaming_Declaration (Loc,
3704              Defining_Identifier => Id,
3705              Access_Definition   => Empty,
3706              Subtype_Mark        => New_Occurrence_Of
3707                                       (Base_Type (Etype (Id)), Loc),
3708              Name                => E));
3709
3710          Set_Renamed_Object (Id, E);
3711
3712          --  Force generation of debugging information for the constant and for
3713          --  the renamed function call.
3714
3715          Set_Debug_Info_Needed (Id);
3716          Set_Debug_Info_Needed (Entity (Prefix (E)));
3717       end if;
3718
3719       if Present (Prev_Entity)
3720         and then Is_Frozen (Prev_Entity)
3721         and then not Error_Posted (Id)
3722       then
3723          Error_Msg_N ("full constant declaration appears too late", N);
3724       end if;
3725
3726       Check_Eliminated (Id);
3727
3728       --  Deal with setting In_Private_Part flag if in private part
3729
3730       if Ekind (Scope (Id)) = E_Package
3731         and then In_Private_Part (Scope (Id))
3732       then
3733          Set_In_Private_Part (Id);
3734       end if;
3735
3736       --  Check for violation of No_Local_Timing_Events
3737
3738       if Restriction_Check_Required (No_Local_Timing_Events)
3739         and then not Is_Library_Level_Entity (Id)
3740         and then Is_RTE (Etype (Id), RE_Timing_Event)
3741       then
3742          Check_Restriction (No_Local_Timing_Events, N);
3743       end if;
3744
3745    <<Leave>>
3746       if Has_Aspects (N) then
3747          Analyze_Aspect_Specifications (N, Id);
3748       end if;
3749    end Analyze_Object_Declaration;
3750
3751    ---------------------------
3752    -- Analyze_Others_Choice --
3753    ---------------------------
3754
3755    --  Nothing to do for the others choice node itself, the semantic analysis
3756    --  of the others choice will occur as part of the processing of the parent
3757
3758    procedure Analyze_Others_Choice (N : Node_Id) is
3759       pragma Warnings (Off, N);
3760    begin
3761       null;
3762    end Analyze_Others_Choice;
3763
3764    -------------------------------------------
3765    -- Analyze_Private_Extension_Declaration --
3766    -------------------------------------------
3767
3768    procedure Analyze_Private_Extension_Declaration (N : Node_Id) is
3769       T           : constant Entity_Id := Defining_Identifier (N);
3770       Indic       : constant Node_Id   := Subtype_Indication (N);
3771       Parent_Type : Entity_Id;
3772       Parent_Base : Entity_Id;
3773
3774    begin
3775       --  Ada 2005 (AI-251): Decorate all names in list of ancestor interfaces
3776
3777       if Is_Non_Empty_List (Interface_List (N)) then
3778          declare
3779             Intf : Node_Id;
3780             T    : Entity_Id;
3781
3782          begin
3783             Intf := First (Interface_List (N));
3784             while Present (Intf) loop
3785                T := Find_Type_Of_Subtype_Indic (Intf);
3786
3787                Diagnose_Interface (Intf, T);
3788                Next (Intf);
3789             end loop;
3790          end;
3791       end if;
3792
3793       Generate_Definition (T);
3794
3795       --  For other than Ada 2012, just enter the name in the current scope
3796
3797       if Ada_Version < Ada_2012 then
3798          Enter_Name (T);
3799
3800       --  Ada 2012 (AI05-0162): Enter the name in the current scope handling
3801       --  case of private type that completes an incomplete type.
3802
3803       else
3804          declare
3805             Prev : Entity_Id;
3806
3807          begin
3808             Prev := Find_Type_Name (N);
3809
3810             pragma Assert (Prev = T
3811               or else (Ekind (Prev) = E_Incomplete_Type
3812                          and then Present (Full_View (Prev))
3813                          and then Full_View (Prev) = T));
3814          end;
3815       end if;
3816
3817       Parent_Type := Find_Type_Of_Subtype_Indic (Indic);
3818       Parent_Base := Base_Type (Parent_Type);
3819
3820       if Parent_Type = Any_Type
3821         or else Etype (Parent_Type) = Any_Type
3822       then
3823          Set_Ekind (T, Ekind (Parent_Type));
3824          Set_Etype (T, Any_Type);
3825          goto Leave;
3826
3827       elsif not Is_Tagged_Type (Parent_Type) then
3828          Error_Msg_N
3829            ("parent of type extension must be a tagged type ", Indic);
3830          goto Leave;
3831
3832       elsif Ekind_In (Parent_Type, E_Void, E_Incomplete_Type) then
3833          Error_Msg_N ("premature derivation of incomplete type", Indic);
3834          goto Leave;
3835
3836       elsif Is_Concurrent_Type (Parent_Type) then
3837          Error_Msg_N
3838            ("parent type of a private extension cannot be "
3839             & "a synchronized tagged type (RM 3.9.1 (3/1))", N);
3840
3841          Set_Etype              (T, Any_Type);
3842          Set_Ekind              (T, E_Limited_Private_Type);
3843          Set_Private_Dependents (T, New_Elmt_List);
3844          Set_Error_Posted       (T);
3845          goto Leave;
3846       end if;
3847
3848       --  Perhaps the parent type should be changed to the class-wide type's
3849       --  specific type in this case to prevent cascading errors ???
3850
3851       if Is_Class_Wide_Type (Parent_Type) then
3852          Error_Msg_N
3853            ("parent of type extension must not be a class-wide type", Indic);
3854          goto Leave;
3855       end if;
3856
3857       if (not Is_Package_Or_Generic_Package (Current_Scope)
3858            and then Nkind (Parent (N)) /= N_Generic_Subprogram_Declaration)
3859         or else In_Private_Part (Current_Scope)
3860
3861       then
3862          Error_Msg_N ("invalid context for private extension", N);
3863       end if;
3864
3865       --  Set common attributes
3866
3867       Set_Is_Pure          (T, Is_Pure (Current_Scope));
3868       Set_Scope            (T, Current_Scope);
3869       Set_Ekind            (T, E_Record_Type_With_Private);
3870       Init_Size_Align      (T);
3871
3872       Set_Etype            (T,            Parent_Base);
3873       Set_Has_Task         (T, Has_Task  (Parent_Base));
3874
3875       Set_Convention       (T, Convention     (Parent_Type));
3876       Set_First_Rep_Item   (T, First_Rep_Item (Parent_Type));
3877       Set_Is_First_Subtype (T);
3878       Make_Class_Wide_Type (T);
3879
3880       if Unknown_Discriminants_Present (N) then
3881          Set_Discriminant_Constraint (T, No_Elist);
3882       end if;
3883
3884       Build_Derived_Record_Type (N, Parent_Type, T);
3885
3886       --  Propagate inherited invariant information. The new type has
3887       --  invariants, if the parent type has inheritable invariants,
3888       --  and these invariants can in turn be inherited.
3889
3890       if Has_Inheritable_Invariants (Parent_Type) then
3891          Set_Has_Inheritable_Invariants (T);
3892          Set_Has_Invariants (T);
3893       end if;
3894
3895       --  Ada 2005 (AI-443): Synchronized private extension or a rewritten
3896       --  synchronized formal derived type.
3897
3898       if Ada_Version >= Ada_2005
3899         and then Synchronized_Present (N)
3900       then
3901          Set_Is_Limited_Record (T);
3902
3903          --  Formal derived type case
3904
3905          if Is_Generic_Type (T) then
3906
3907             --  The parent must be a tagged limited type or a synchronized
3908             --  interface.
3909
3910             if (not Is_Tagged_Type (Parent_Type)
3911                   or else not Is_Limited_Type (Parent_Type))
3912               and then
3913                (not Is_Interface (Parent_Type)
3914                   or else not Is_Synchronized_Interface (Parent_Type))
3915             then
3916                Error_Msg_NE ("parent type of & must be tagged limited " &
3917                              "or synchronized", N, T);
3918             end if;
3919
3920             --  The progenitors (if any) must be limited or synchronized
3921             --  interfaces.
3922
3923             if Present (Interfaces (T)) then
3924                declare
3925                   Iface      : Entity_Id;
3926                   Iface_Elmt : Elmt_Id;
3927
3928                begin
3929                   Iface_Elmt := First_Elmt (Interfaces (T));
3930                   while Present (Iface_Elmt) loop
3931                      Iface := Node (Iface_Elmt);
3932
3933                      if not Is_Limited_Interface (Iface)
3934                        and then not Is_Synchronized_Interface (Iface)
3935                      then
3936                         Error_Msg_NE ("progenitor & must be limited " &
3937                                       "or synchronized", N, Iface);
3938                      end if;
3939
3940                      Next_Elmt (Iface_Elmt);
3941                   end loop;
3942                end;
3943             end if;
3944
3945          --  Regular derived extension, the parent must be a limited or
3946          --  synchronized interface.
3947
3948          else
3949             if not Is_Interface (Parent_Type)
3950               or else (not Is_Limited_Interface (Parent_Type)
3951                          and then
3952                        not Is_Synchronized_Interface (Parent_Type))
3953             then
3954                Error_Msg_NE
3955                  ("parent type of & must be limited interface", N, T);
3956             end if;
3957          end if;
3958
3959       --  A consequence of 3.9.4 (6/2) and 7.3 (7.2/2) is that a private
3960       --  extension with a synchronized parent must be explicitly declared
3961       --  synchronized, because the full view will be a synchronized type.
3962       --  This must be checked before the check for limited types below,
3963       --  to ensure that types declared limited are not allowed to extend
3964       --  synchronized interfaces.
3965
3966       elsif Is_Interface (Parent_Type)
3967         and then Is_Synchronized_Interface (Parent_Type)
3968         and then not Synchronized_Present (N)
3969       then
3970          Error_Msg_NE
3971            ("private extension of& must be explicitly synchronized",
3972              N, Parent_Type);
3973
3974       elsif Limited_Present (N) then
3975          Set_Is_Limited_Record (T);
3976
3977          if not Is_Limited_Type (Parent_Type)
3978            and then
3979              (not Is_Interface (Parent_Type)
3980                or else not Is_Limited_Interface (Parent_Type))
3981          then
3982             Error_Msg_NE ("parent type& of limited extension must be limited",
3983               N, Parent_Type);
3984          end if;
3985       end if;
3986
3987    <<Leave>>
3988       if Has_Aspects (N) then
3989          Analyze_Aspect_Specifications (N, T);
3990       end if;
3991    end Analyze_Private_Extension_Declaration;
3992
3993    ---------------------------------
3994    -- Analyze_Subtype_Declaration --
3995    ---------------------------------
3996
3997    procedure Analyze_Subtype_Declaration
3998      (N    : Node_Id;
3999       Skip : Boolean := False)
4000    is
4001       Id       : constant Entity_Id := Defining_Identifier (N);
4002       T        : Entity_Id;
4003       R_Checks : Check_Result;
4004
4005    begin
4006       Generate_Definition (Id);
4007       Set_Is_Pure (Id, Is_Pure (Current_Scope));
4008       Init_Size_Align (Id);
4009
4010       --  The following guard condition on Enter_Name is to handle cases where
4011       --  the defining identifier has already been entered into the scope but
4012       --  the declaration as a whole needs to be analyzed.
4013
4014       --  This case in particular happens for derived enumeration types. The
4015       --  derived enumeration type is processed as an inserted enumeration type
4016       --  declaration followed by a rewritten subtype declaration. The defining
4017       --  identifier, however, is entered into the name scope very early in the
4018       --  processing of the original type declaration and therefore needs to be
4019       --  avoided here, when the created subtype declaration is analyzed. (See
4020       --  Build_Derived_Types)
4021
4022       --  This also happens when the full view of a private type is derived
4023       --  type with constraints. In this case the entity has been introduced
4024       --  in the private declaration.
4025
4026       if Skip
4027         or else (Present (Etype (Id))
4028                   and then (Is_Private_Type (Etype (Id))
4029                              or else Is_Task_Type (Etype (Id))
4030                              or else Is_Rewrite_Substitution (N)))
4031       then
4032          null;
4033
4034       else
4035          Enter_Name (Id);
4036       end if;
4037
4038       T := Process_Subtype (Subtype_Indication (N), N, Id, 'P');
4039
4040       --  Inherit common attributes
4041
4042       Set_Is_Generic_Type   (Id, Is_Generic_Type   (Base_Type (T)));
4043       Set_Is_Volatile       (Id, Is_Volatile       (T));
4044       Set_Treat_As_Volatile (Id, Treat_As_Volatile (T));
4045       Set_Is_Atomic         (Id, Is_Atomic         (T));
4046       Set_Is_Ada_2005_Only  (Id, Is_Ada_2005_Only  (T));
4047       Set_Is_Ada_2012_Only  (Id, Is_Ada_2012_Only  (T));
4048       Set_Convention        (Id, Convention        (T));
4049
4050       --  If ancestor has predicates then so does the subtype, and in addition
4051       --  we must delay the freeze to properly arrange predicate inheritance.
4052
4053       --  The Ancestor_Type test is a big kludge, there seem to be cases in
4054       --  which T = ID, so the above tests and assignments do nothing???
4055
4056       if Has_Predicates (T)
4057         or else (Present (Ancestor_Subtype (T))
4058                   and then Has_Predicates (Ancestor_Subtype (T)))
4059       then
4060          Set_Has_Predicates (Id);
4061          Set_Has_Delayed_Freeze (Id);
4062       end if;
4063
4064       --  Subtype of Boolean cannot have a constraint in SPARK
4065
4066       if Is_Boolean_Type (T)
4067         and then Nkind (Subtype_Indication (N)) = N_Subtype_Indication
4068       then
4069          Check_SPARK_Restriction
4070            ("subtype of Boolean cannot have constraint", N);
4071       end if;
4072
4073       if Nkind (Subtype_Indication (N)) = N_Subtype_Indication then
4074          declare
4075             Cstr     : constant Node_Id := Constraint (Subtype_Indication (N));
4076             One_Cstr : Node_Id;
4077             Low      : Node_Id;
4078             High     : Node_Id;
4079
4080          begin
4081             if Nkind (Cstr) = N_Index_Or_Discriminant_Constraint then
4082                One_Cstr := First (Constraints (Cstr));
4083                while Present (One_Cstr) loop
4084
4085                   --  Index or discriminant constraint in SPARK must be a
4086                   --  subtype mark.
4087
4088                   if not
4089                     Nkind_In (One_Cstr, N_Identifier, N_Expanded_Name)
4090                   then
4091                      Check_SPARK_Restriction
4092                        ("subtype mark required", One_Cstr);
4093
4094                   --  String subtype must have a lower bound of 1 in SPARK.
4095                   --  Note that we do not need to test for the non-static case
4096                   --  here, since that was already taken care of in
4097                   --  Process_Range_Expr_In_Decl.
4098
4099                   elsif Base_Type (T) = Standard_String then
4100                      Get_Index_Bounds (One_Cstr, Low, High);
4101
4102                      if Is_OK_Static_Expression (Low)
4103                        and then Expr_Value (Low) /= 1
4104                      then
4105                         Check_SPARK_Restriction
4106                           ("String subtype must have lower bound of 1", N);
4107                      end if;
4108                   end if;
4109
4110                   Next (One_Cstr);
4111                end loop;
4112             end if;
4113          end;
4114       end if;
4115
4116       --  In the case where there is no constraint given in the subtype
4117       --  indication, Process_Subtype just returns the Subtype_Mark, so its
4118       --  semantic attributes must be established here.
4119
4120       if Nkind (Subtype_Indication (N)) /= N_Subtype_Indication then
4121          Set_Etype (Id, Base_Type (T));
4122
4123          --  Subtype of unconstrained array without constraint is not allowed
4124          --  in SPARK.
4125
4126          if Is_Array_Type (T)
4127            and then not Is_Constrained (T)
4128          then
4129             Check_SPARK_Restriction
4130               ("subtype of unconstrained array must have constraint", N);
4131          end if;
4132
4133          case Ekind (T) is
4134             when Array_Kind =>
4135                Set_Ekind                       (Id, E_Array_Subtype);
4136                Copy_Array_Subtype_Attributes   (Id, T);
4137
4138             when Decimal_Fixed_Point_Kind =>
4139                Set_Ekind                (Id, E_Decimal_Fixed_Point_Subtype);
4140                Set_Digits_Value         (Id, Digits_Value       (T));
4141                Set_Delta_Value          (Id, Delta_Value        (T));
4142                Set_Scale_Value          (Id, Scale_Value        (T));
4143                Set_Small_Value          (Id, Small_Value        (T));
4144                Set_Scalar_Range         (Id, Scalar_Range       (T));
4145                Set_Machine_Radix_10     (Id, Machine_Radix_10   (T));
4146                Set_Is_Constrained       (Id, Is_Constrained     (T));
4147                Set_Is_Known_Valid       (Id, Is_Known_Valid     (T));
4148                Set_RM_Size              (Id, RM_Size            (T));
4149
4150             when Enumeration_Kind =>
4151                Set_Ekind                (Id, E_Enumeration_Subtype);
4152                Set_First_Literal        (Id, First_Literal (Base_Type (T)));
4153                Set_Scalar_Range         (Id, Scalar_Range       (T));
4154                Set_Is_Character_Type    (Id, Is_Character_Type  (T));
4155                Set_Is_Constrained       (Id, Is_Constrained     (T));
4156                Set_Is_Known_Valid       (Id, Is_Known_Valid     (T));
4157                Set_RM_Size              (Id, RM_Size            (T));
4158
4159             when Ordinary_Fixed_Point_Kind =>
4160                Set_Ekind                (Id, E_Ordinary_Fixed_Point_Subtype);
4161                Set_Scalar_Range         (Id, Scalar_Range       (T));
4162                Set_Small_Value          (Id, Small_Value        (T));
4163                Set_Delta_Value          (Id, Delta_Value        (T));
4164                Set_Is_Constrained       (Id, Is_Constrained     (T));
4165                Set_Is_Known_Valid       (Id, Is_Known_Valid     (T));
4166                Set_RM_Size              (Id, RM_Size            (T));
4167
4168             when Float_Kind =>
4169                Set_Ekind                (Id, E_Floating_Point_Subtype);
4170                Set_Scalar_Range         (Id, Scalar_Range       (T));
4171                Set_Digits_Value         (Id, Digits_Value       (T));
4172                Set_Is_Constrained       (Id, Is_Constrained     (T));
4173
4174             when Signed_Integer_Kind =>
4175                Set_Ekind                (Id, E_Signed_Integer_Subtype);
4176                Set_Scalar_Range         (Id, Scalar_Range       (T));
4177                Set_Is_Constrained       (Id, Is_Constrained     (T));
4178                Set_Is_Known_Valid       (Id, Is_Known_Valid     (T));
4179                Set_RM_Size              (Id, RM_Size            (T));
4180
4181             when Modular_Integer_Kind =>
4182                Set_Ekind                (Id, E_Modular_Integer_Subtype);
4183                Set_Scalar_Range         (Id, Scalar_Range       (T));
4184                Set_Is_Constrained       (Id, Is_Constrained     (T));
4185                Set_Is_Known_Valid       (Id, Is_Known_Valid     (T));
4186                Set_RM_Size              (Id, RM_Size            (T));
4187
4188             when Class_Wide_Kind =>
4189                Set_Ekind                (Id, E_Class_Wide_Subtype);
4190                Set_First_Entity         (Id, First_Entity       (T));
4191                Set_Last_Entity          (Id, Last_Entity        (T));
4192                Set_Class_Wide_Type      (Id, Class_Wide_Type    (T));
4193                Set_Cloned_Subtype       (Id, T);
4194                Set_Is_Tagged_Type       (Id, True);
4195                Set_Has_Unknown_Discriminants
4196                                         (Id, True);
4197
4198                if Ekind (T) = E_Class_Wide_Subtype then
4199                   Set_Equivalent_Type   (Id, Equivalent_Type    (T));
4200                end if;
4201
4202             when E_Record_Type | E_Record_Subtype =>
4203                Set_Ekind                (Id, E_Record_Subtype);
4204
4205                if Ekind (T) = E_Record_Subtype
4206                  and then Present (Cloned_Subtype (T))
4207                then
4208                   Set_Cloned_Subtype    (Id, Cloned_Subtype (T));
4209                else
4210                   Set_Cloned_Subtype    (Id, T);
4211                end if;
4212
4213                Set_First_Entity         (Id, First_Entity       (T));
4214                Set_Last_Entity          (Id, Last_Entity        (T));
4215                Set_Has_Discriminants    (Id, Has_Discriminants  (T));
4216                Set_Is_Constrained       (Id, Is_Constrained     (T));
4217                Set_Is_Limited_Record    (Id, Is_Limited_Record  (T));
4218                Set_Has_Implicit_Dereference
4219                                         (Id, Has_Implicit_Dereference (T));
4220                Set_Has_Unknown_Discriminants
4221                                         (Id, Has_Unknown_Discriminants (T));
4222
4223                if Has_Discriminants (T) then
4224                   Set_Discriminant_Constraint
4225                                         (Id, Discriminant_Constraint (T));
4226                   Set_Stored_Constraint_From_Discriminant_Constraint (Id);
4227
4228                elsif Has_Unknown_Discriminants (Id) then
4229                   Set_Discriminant_Constraint (Id, No_Elist);
4230                end if;
4231
4232                if Is_Tagged_Type (T) then
4233                   Set_Is_Tagged_Type    (Id);
4234                   Set_Is_Abstract_Type  (Id, Is_Abstract_Type (T));
4235                   Set_Direct_Primitive_Operations
4236                                         (Id, Direct_Primitive_Operations (T));
4237                   Set_Class_Wide_Type   (Id, Class_Wide_Type (T));
4238
4239                   if Is_Interface (T) then
4240                      Set_Is_Interface (Id);
4241                      Set_Is_Limited_Interface (Id, Is_Limited_Interface (T));
4242                   end if;
4243                end if;
4244
4245             when Private_Kind =>
4246                Set_Ekind              (Id, Subtype_Kind (Ekind        (T)));
4247                Set_Has_Discriminants  (Id, Has_Discriminants          (T));
4248                Set_Is_Constrained     (Id, Is_Constrained             (T));
4249                Set_First_Entity       (Id, First_Entity               (T));
4250                Set_Last_Entity        (Id, Last_Entity                (T));
4251                Set_Private_Dependents (Id, New_Elmt_List);
4252                Set_Is_Limited_Record  (Id, Is_Limited_Record          (T));
4253                Set_Has_Implicit_Dereference
4254                                       (Id, Has_Implicit_Dereference   (T));
4255                Set_Has_Unknown_Discriminants
4256                                       (Id, Has_Unknown_Discriminants  (T));
4257                Set_Known_To_Have_Preelab_Init
4258                                       (Id, Known_To_Have_Preelab_Init (T));
4259
4260                if Is_Tagged_Type (T) then
4261                   Set_Is_Tagged_Type              (Id);
4262                   Set_Is_Abstract_Type            (Id, Is_Abstract_Type (T));
4263                   Set_Class_Wide_Type             (Id, Class_Wide_Type  (T));
4264                   Set_Direct_Primitive_Operations (Id,
4265                     Direct_Primitive_Operations (T));
4266                end if;
4267
4268                --  In general the attributes of the subtype of a private type
4269                --  are the attributes of the partial view of parent. However,
4270                --  the full view may be a discriminated type, and the subtype
4271                --  must share the discriminant constraint to generate correct
4272                --  calls to initialization procedures.
4273
4274                if Has_Discriminants (T) then
4275                   Set_Discriminant_Constraint
4276                     (Id, Discriminant_Constraint (T));
4277                   Set_Stored_Constraint_From_Discriminant_Constraint (Id);
4278
4279                elsif Present (Full_View (T))
4280                  and then Has_Discriminants (Full_View (T))
4281                then
4282                   Set_Discriminant_Constraint
4283                     (Id, Discriminant_Constraint (Full_View (T)));
4284                   Set_Stored_Constraint_From_Discriminant_Constraint (Id);
4285
4286                   --  This would seem semantically correct, but apparently
4287                   --  confuses the back-end. To be explained and checked with
4288                   --  current version ???
4289
4290                   --  Set_Has_Discriminants (Id);
4291                end if;
4292
4293                Prepare_Private_Subtype_Completion (Id, N);
4294
4295             when Access_Kind =>
4296                Set_Ekind             (Id, E_Access_Subtype);
4297                Set_Is_Constrained    (Id, Is_Constrained        (T));
4298                Set_Is_Access_Constant
4299                                      (Id, Is_Access_Constant    (T));
4300                Set_Directly_Designated_Type
4301                                      (Id, Designated_Type       (T));
4302                Set_Can_Never_Be_Null (Id, Can_Never_Be_Null     (T));
4303
4304                --  A Pure library_item must not contain the declaration of a
4305                --  named access type, except within a subprogram, generic
4306                --  subprogram, task unit, or protected unit, or if it has
4307                --  a specified Storage_Size of zero (RM05-10.2.1(15.4-15.5)).
4308
4309                if Comes_From_Source (Id)
4310                  and then In_Pure_Unit
4311                  and then not In_Subprogram_Task_Protected_Unit
4312                  and then not No_Pool_Assigned (Id)
4313                then
4314                   Error_Msg_N
4315                     ("named access types not allowed in pure unit", N);
4316                end if;
4317
4318             when Concurrent_Kind =>
4319                Set_Ekind                (Id, Subtype_Kind (Ekind   (T)));
4320                Set_Corresponding_Record_Type (Id,
4321                                          Corresponding_Record_Type (T));
4322                Set_First_Entity         (Id, First_Entity          (T));
4323                Set_First_Private_Entity (Id, First_Private_Entity  (T));
4324                Set_Has_Discriminants    (Id, Has_Discriminants     (T));
4325                Set_Is_Constrained       (Id, Is_Constrained        (T));
4326                Set_Is_Tagged_Type       (Id, Is_Tagged_Type        (T));
4327                Set_Last_Entity          (Id, Last_Entity           (T));
4328
4329                if Has_Discriminants (T) then
4330                   Set_Discriminant_Constraint (Id,
4331                                            Discriminant_Constraint (T));
4332                   Set_Stored_Constraint_From_Discriminant_Constraint (Id);
4333                end if;
4334
4335             when E_Incomplete_Type =>
4336                if Ada_Version >= Ada_2005 then
4337                   Set_Ekind (Id, E_Incomplete_Subtype);
4338
4339                   --  Ada 2005 (AI-412): Decorate an incomplete subtype
4340                   --  of an incomplete type visible through a limited
4341                   --  with clause.
4342
4343                   if From_With_Type (T)
4344                     and then Present (Non_Limited_View (T))
4345                   then
4346                      Set_From_With_Type   (Id);
4347                      Set_Non_Limited_View (Id, Non_Limited_View (T));
4348
4349                   --  Ada 2005 (AI-412): Add the regular incomplete subtype
4350                   --  to the private dependents of the original incomplete
4351                   --  type for future transformation.
4352
4353                   else
4354                      Append_Elmt (Id, Private_Dependents (T));
4355                   end if;
4356
4357                --  If the subtype name denotes an incomplete type an error
4358                --  was already reported by Process_Subtype.
4359
4360                else
4361                   Set_Etype (Id, Any_Type);
4362                end if;
4363
4364             when others =>
4365                raise Program_Error;
4366          end case;
4367       end if;
4368
4369       if Etype (Id) = Any_Type then
4370          goto Leave;
4371       end if;
4372
4373       --  Some common processing on all types
4374
4375       Set_Size_Info      (Id,                 T);
4376       Set_First_Rep_Item (Id, First_Rep_Item (T));
4377
4378       T := Etype (Id);
4379
4380       Set_Is_Immediately_Visible   (Id, True);
4381       Set_Depends_On_Private       (Id, Has_Private_Component (T));
4382       Set_Is_Descendent_Of_Address (Id, Is_Descendent_Of_Address (T));
4383
4384       if Is_Interface (T) then
4385          Set_Is_Interface (Id);
4386       end if;
4387
4388       if Present (Generic_Parent_Type (N))
4389         and then
4390           (Nkind
4391             (Parent (Generic_Parent_Type (N))) /= N_Formal_Type_Declaration
4392             or else Nkind
4393               (Formal_Type_Definition (Parent (Generic_Parent_Type (N))))
4394                 /= N_Formal_Private_Type_Definition)
4395       then
4396          if Is_Tagged_Type (Id) then
4397
4398             --  If this is a generic actual subtype for a synchronized type,
4399             --  the primitive operations are those of the corresponding record
4400             --  for which there is a separate subtype declaration.
4401
4402             if Is_Concurrent_Type (Id) then
4403                null;
4404             elsif Is_Class_Wide_Type (Id) then
4405                Derive_Subprograms (Generic_Parent_Type (N), Id, Etype (T));
4406             else
4407                Derive_Subprograms (Generic_Parent_Type (N), Id, T);
4408             end if;
4409
4410          elsif Scope (Etype (Id)) /= Standard_Standard then
4411             Derive_Subprograms (Generic_Parent_Type (N), Id);
4412          end if;
4413       end if;
4414
4415       if Is_Private_Type (T)
4416         and then Present (Full_View (T))
4417       then
4418          Conditional_Delay (Id, Full_View (T));
4419
4420       --  The subtypes of components or subcomponents of protected types
4421       --  do not need freeze nodes, which would otherwise appear in the
4422       --  wrong scope (before the freeze node for the protected type). The
4423       --  proper subtypes are those of the subcomponents of the corresponding
4424       --  record.
4425
4426       elsif Ekind (Scope (Id)) /= E_Protected_Type
4427         and then Present (Scope (Scope (Id))) -- error defense!
4428         and then Ekind (Scope (Scope (Id))) /= E_Protected_Type
4429       then
4430          Conditional_Delay (Id, T);
4431       end if;
4432
4433       --  Check that Constraint_Error is raised for a scalar subtype indication
4434       --  when the lower or upper bound of a non-null range lies outside the
4435       --  range of the type mark.
4436
4437       if Nkind (Subtype_Indication (N)) = N_Subtype_Indication then
4438          if Is_Scalar_Type (Etype (Id))
4439             and then Scalar_Range (Id) /=
4440                      Scalar_Range (Etype (Subtype_Mark
4441                                            (Subtype_Indication (N))))
4442          then
4443             Apply_Range_Check
4444               (Scalar_Range (Id),
4445                Etype (Subtype_Mark (Subtype_Indication (N))));
4446
4447          --  In the array case, check compatibility for each index
4448
4449          elsif Is_Array_Type (Etype (Id))
4450            and then Present (First_Index (Id))
4451          then
4452             --  This really should be a subprogram that finds the indications
4453             --  to check???
4454
4455             declare
4456                Subt_Index   : Node_Id := First_Index (Id);
4457                Target_Index : Node_Id :=
4458                                 First_Index (Etype
4459                                   (Subtype_Mark (Subtype_Indication (N))));
4460                Has_Dyn_Chk  : Boolean := Has_Dynamic_Range_Check (N);
4461
4462             begin
4463                while Present (Subt_Index) loop
4464                   if ((Nkind (Subt_Index) = N_Identifier
4465                          and then Ekind (Entity (Subt_Index)) in Scalar_Kind)
4466                        or else Nkind (Subt_Index) = N_Subtype_Indication)
4467                     and then
4468                       Nkind (Scalar_Range (Etype (Subt_Index))) = N_Range
4469                   then
4470                      declare
4471                         Target_Typ : constant Entity_Id :=
4472                                        Etype (Target_Index);
4473                      begin
4474                         R_Checks :=
4475                           Get_Range_Checks
4476                             (Scalar_Range (Etype (Subt_Index)),
4477                              Target_Typ,
4478                              Etype (Subt_Index),
4479                              Defining_Identifier (N));
4480
4481                         --  Reset Has_Dynamic_Range_Check on the subtype to
4482                         --  prevent elision of the index check due to a dynamic
4483                         --  check generated for a preceding index (needed since
4484                         --  Insert_Range_Checks tries to avoid generating
4485                         --  redundant checks on a given declaration).
4486
4487                         Set_Has_Dynamic_Range_Check (N, False);
4488
4489                         Insert_Range_Checks
4490                           (R_Checks,
4491                            N,
4492                            Target_Typ,
4493                            Sloc (Defining_Identifier (N)));
4494
4495                         --  Record whether this index involved a dynamic check
4496
4497                         Has_Dyn_Chk :=
4498                           Has_Dyn_Chk or else Has_Dynamic_Range_Check (N);
4499                      end;
4500                   end if;
4501
4502                   Next_Index (Subt_Index);
4503                   Next_Index (Target_Index);
4504                end loop;
4505
4506                --  Finally, mark whether the subtype involves dynamic checks
4507
4508                Set_Has_Dynamic_Range_Check (N, Has_Dyn_Chk);
4509             end;
4510          end if;
4511       end if;
4512
4513       --  Make sure that generic actual types are properly frozen. The subtype
4514       --  is marked as a generic actual type when the enclosing instance is
4515       --  analyzed, so here we identify the subtype from the tree structure.
4516
4517       if Expander_Active
4518         and then Is_Generic_Actual_Type (Id)
4519         and then In_Instance
4520         and then not Comes_From_Source (N)
4521         and then Nkind (Subtype_Indication (N)) /= N_Subtype_Indication
4522         and then Is_Frozen (T)
4523       then
4524          Freeze_Before (N, Id);
4525       end if;
4526
4527       Set_Optimize_Alignment_Flags (Id);
4528       Check_Eliminated (Id);
4529
4530    <<Leave>>
4531       if Has_Aspects (N) then
4532          Analyze_Aspect_Specifications (N, Id);
4533       end if;
4534    end Analyze_Subtype_Declaration;
4535
4536    --------------------------------
4537    -- Analyze_Subtype_Indication --
4538    --------------------------------
4539
4540    procedure Analyze_Subtype_Indication (N : Node_Id) is
4541       T : constant Entity_Id := Subtype_Mark (N);
4542       R : constant Node_Id   := Range_Expression (Constraint (N));
4543
4544    begin
4545       Analyze (T);
4546
4547       if R /= Error then
4548          Analyze (R);
4549          Set_Etype (N, Etype (R));
4550          Resolve (R, Entity (T));
4551       else
4552          Set_Error_Posted (R);
4553          Set_Error_Posted (T);
4554       end if;
4555    end Analyze_Subtype_Indication;
4556
4557    --------------------------
4558    -- Analyze_Variant_Part --
4559    --------------------------
4560
4561    procedure Analyze_Variant_Part (N : Node_Id) is
4562
4563       procedure Non_Static_Choice_Error (Choice : Node_Id);
4564       --  Error routine invoked by the generic instantiation below when the
4565       --  variant part has a non static choice.
4566
4567       procedure Process_Declarations (Variant : Node_Id);
4568       --  Analyzes all the declarations associated with a Variant. Needed by
4569       --  the generic instantiation below.
4570
4571       package Variant_Choices_Processing is new
4572         Generic_Choices_Processing
4573           (Get_Alternatives          => Variants,
4574            Get_Choices               => Discrete_Choices,
4575            Process_Empty_Choice      => No_OP,
4576            Process_Non_Static_Choice => Non_Static_Choice_Error,
4577            Process_Associated_Node   => Process_Declarations);
4578       use Variant_Choices_Processing;
4579       --  Instantiation of the generic choice processing package
4580
4581       -----------------------------
4582       -- Non_Static_Choice_Error --
4583       -----------------------------
4584
4585       procedure Non_Static_Choice_Error (Choice : Node_Id) is
4586       begin
4587          Flag_Non_Static_Expr
4588            ("choice given in variant part is not static!", Choice);
4589       end Non_Static_Choice_Error;
4590
4591       --------------------------
4592       -- Process_Declarations --
4593       --------------------------
4594
4595       procedure Process_Declarations (Variant : Node_Id) is
4596       begin
4597          if not Null_Present (Component_List (Variant)) then
4598             Analyze_Declarations (Component_Items (Component_List (Variant)));
4599
4600             if Present (Variant_Part (Component_List (Variant))) then
4601                Analyze (Variant_Part (Component_List (Variant)));
4602             end if;
4603          end if;
4604       end Process_Declarations;
4605
4606       --  Local Variables
4607
4608       Discr_Name : Node_Id;
4609       Discr_Type : Entity_Id;
4610
4611       Dont_Care      : Boolean;
4612       Others_Present : Boolean := False;
4613
4614       pragma Warnings (Off, Dont_Care);
4615       pragma Warnings (Off, Others_Present);
4616       --  We don't care about the assigned values of any of these
4617
4618    --  Start of processing for Analyze_Variant_Part
4619
4620    begin
4621       Discr_Name := Name (N);
4622       Analyze (Discr_Name);
4623
4624       --  If Discr_Name bad, get out (prevent cascaded errors)
4625
4626       if Etype (Discr_Name) = Any_Type then
4627          return;
4628       end if;
4629
4630       --  Check invalid discriminant in variant part
4631
4632       if Ekind (Entity (Discr_Name)) /= E_Discriminant then
4633          Error_Msg_N ("invalid discriminant name in variant part", Discr_Name);
4634       end if;
4635
4636       Discr_Type := Etype (Entity (Discr_Name));
4637
4638       if not Is_Discrete_Type (Discr_Type) then
4639          Error_Msg_N
4640            ("discriminant in a variant part must be of a discrete type",
4641              Name (N));
4642          return;
4643       end if;
4644
4645       --  Call the instantiated Analyze_Choices which does the rest of the work
4646
4647       Analyze_Choices (N, Discr_Type, Dont_Care, Others_Present);
4648    end Analyze_Variant_Part;
4649
4650    ----------------------------
4651    -- Array_Type_Declaration --
4652    ----------------------------
4653
4654    procedure Array_Type_Declaration (T : in out Entity_Id; Def : Node_Id) is
4655       Component_Def : constant Node_Id := Component_Definition (Def);
4656       Component_Typ : constant Node_Id := Subtype_Indication (Component_Def);
4657       Element_Type  : Entity_Id;
4658       Implicit_Base : Entity_Id;
4659       Index         : Node_Id;
4660       Related_Id    : Entity_Id := Empty;
4661       Nb_Index      : Nat;
4662       P             : constant Node_Id := Parent (Def);
4663       Priv          : Entity_Id;
4664
4665    begin
4666       if Nkind (Def) = N_Constrained_Array_Definition then
4667          Index := First (Discrete_Subtype_Definitions (Def));
4668       else
4669          Index := First (Subtype_Marks (Def));
4670       end if;
4671
4672       --  Find proper names for the implicit types which may be public. In case
4673       --  of anonymous arrays we use the name of the first object of that type
4674       --  as prefix.
4675
4676       if No (T) then
4677          Related_Id := Defining_Identifier (P);
4678       else
4679          Related_Id := T;
4680       end if;
4681
4682       Nb_Index := 1;
4683       while Present (Index) loop
4684          Analyze (Index);
4685
4686          if not Nkind_In (Index, N_Identifier, N_Expanded_Name) then
4687             Check_SPARK_Restriction ("subtype mark required", Index);
4688          end if;
4689
4690          --  Add a subtype declaration for each index of private array type
4691          --  declaration whose etype is also private. For example:
4692
4693          --     package Pkg is
4694          --        type Index is private;
4695          --     private
4696          --        type Table is array (Index) of ...
4697          --     end;
4698
4699          --  This is currently required by the expander for the internally
4700          --  generated equality subprogram of records with variant parts in
4701          --  which the etype of some component is such private type.
4702
4703          if Ekind (Current_Scope) = E_Package
4704            and then In_Private_Part (Current_Scope)
4705            and then Has_Private_Declaration (Etype (Index))
4706          then
4707             declare
4708                Loc   : constant Source_Ptr := Sloc (Def);
4709                New_E : Entity_Id;
4710                Decl  : Entity_Id;
4711
4712             begin
4713                New_E := Make_Temporary (Loc, 'T');
4714                Set_Is_Internal (New_E);
4715
4716                Decl :=
4717                  Make_Subtype_Declaration (Loc,
4718                    Defining_Identifier => New_E,
4719                    Subtype_Indication  =>
4720                      New_Occurrence_Of (Etype (Index), Loc));
4721
4722                Insert_Before (Parent (Def), Decl);
4723                Analyze (Decl);
4724                Set_Etype (Index, New_E);
4725
4726                --  If the index is a range the Entity attribute is not
4727                --  available. Example:
4728
4729                --     package Pkg is
4730                --        type T is private;
4731                --     private
4732                --        type T is new Natural;
4733                --        Table : array (T(1) .. T(10)) of Boolean;
4734                --     end Pkg;
4735
4736                if Nkind (Index) /= N_Range then
4737                   Set_Entity (Index, New_E);
4738                end if;
4739             end;
4740          end if;
4741
4742          Make_Index (Index, P, Related_Id, Nb_Index);
4743
4744          --  Check error of subtype with predicate for index type
4745
4746          Bad_Predicated_Subtype_Use
4747            ("subtype& has predicate, not allowed as index subtype",
4748             Index, Etype (Index));
4749
4750          --  Move to next index
4751
4752          Next_Index (Index);
4753          Nb_Index := Nb_Index + 1;
4754       end loop;
4755
4756       --  Process subtype indication if one is present
4757
4758       if Present (Component_Typ) then
4759          Element_Type := Process_Subtype (Component_Typ, P, Related_Id, 'C');
4760
4761          if not Nkind_In (Component_Typ, N_Identifier, N_Expanded_Name) then
4762             Check_SPARK_Restriction ("subtype mark required", Component_Typ);
4763          end if;
4764
4765       --  Ada 2005 (AI-230): Access Definition case
4766
4767       else pragma Assert (Present (Access_Definition (Component_Def)));
4768
4769          --  Indicate that the anonymous access type is created by the
4770          --  array type declaration.
4771
4772          Element_Type := Access_Definition
4773                            (Related_Nod => P,
4774                             N           => Access_Definition (Component_Def));
4775          Set_Is_Local_Anonymous_Access (Element_Type);
4776
4777          --  Propagate the parent. This field is needed if we have to generate
4778          --  the master_id associated with an anonymous access to task type
4779          --  component (see Expand_N_Full_Type_Declaration.Build_Master)
4780
4781          Set_Parent (Element_Type, Parent (T));
4782
4783          --  Ada 2005 (AI-230): In case of components that are anonymous access
4784          --  types the level of accessibility depends on the enclosing type
4785          --  declaration
4786
4787          Set_Scope (Element_Type, Current_Scope); -- Ada 2005 (AI-230)
4788
4789          --  Ada 2005 (AI-254)
4790
4791          declare
4792             CD : constant Node_Id :=
4793                    Access_To_Subprogram_Definition
4794                      (Access_Definition (Component_Def));
4795          begin
4796             if Present (CD) and then Protected_Present (CD) then
4797                Element_Type :=
4798                  Replace_Anonymous_Access_To_Protected_Subprogram (Def);
4799             end if;
4800          end;
4801       end if;
4802
4803       --  Constrained array case
4804
4805       if No (T) then
4806          T := Create_Itype (E_Void, P, Related_Id, 'T');
4807       end if;
4808
4809       if Nkind (Def) = N_Constrained_Array_Definition then
4810
4811          --  Establish Implicit_Base as unconstrained base type
4812
4813          Implicit_Base := Create_Itype (E_Array_Type, P, Related_Id, 'B');
4814
4815          Set_Etype              (Implicit_Base, Implicit_Base);
4816          Set_Scope              (Implicit_Base, Current_Scope);
4817          Set_Has_Delayed_Freeze (Implicit_Base);
4818
4819          --  The constrained array type is a subtype of the unconstrained one
4820
4821          Set_Ekind          (T, E_Array_Subtype);
4822          Init_Size_Align    (T);
4823          Set_Etype          (T, Implicit_Base);
4824          Set_Scope          (T, Current_Scope);
4825          Set_Is_Constrained (T, True);
4826          Set_First_Index    (T, First (Discrete_Subtype_Definitions (Def)));
4827          Set_Has_Delayed_Freeze (T);
4828
4829          --  Complete setup of implicit base type
4830
4831          Set_First_Index       (Implicit_Base, First_Index (T));
4832          Set_Component_Type    (Implicit_Base, Element_Type);
4833          Set_Has_Task          (Implicit_Base, Has_Task (Element_Type));
4834          Set_Component_Size    (Implicit_Base, Uint_0);
4835          Set_Packed_Array_Type (Implicit_Base, Empty);
4836          Set_Has_Controlled_Component
4837                                (Implicit_Base, Has_Controlled_Component
4838                                                         (Element_Type)
4839                                                  or else Is_Controlled
4840                                                         (Element_Type));
4841          Set_Finalize_Storage_Only
4842                                (Implicit_Base, Finalize_Storage_Only
4843                                                         (Element_Type));
4844
4845       --  Unconstrained array case
4846
4847       else
4848          Set_Ekind                    (T, E_Array_Type);
4849          Init_Size_Align              (T);
4850          Set_Etype                    (T, T);
4851          Set_Scope                    (T, Current_Scope);
4852          Set_Component_Size           (T, Uint_0);
4853          Set_Is_Constrained           (T, False);
4854          Set_First_Index              (T, First (Subtype_Marks (Def)));
4855          Set_Has_Delayed_Freeze       (T, True);
4856          Set_Has_Task                 (T, Has_Task      (Element_Type));
4857          Set_Has_Controlled_Component (T, Has_Controlled_Component
4858                                                         (Element_Type)
4859                                             or else
4860                                           Is_Controlled (Element_Type));
4861          Set_Finalize_Storage_Only    (T, Finalize_Storage_Only
4862                                                         (Element_Type));
4863       end if;
4864
4865       --  Common attributes for both cases
4866
4867       Set_Component_Type (Base_Type (T), Element_Type);
4868       Set_Packed_Array_Type (T, Empty);
4869
4870       if Aliased_Present (Component_Definition (Def)) then
4871          Check_SPARK_Restriction
4872            ("aliased is not allowed", Component_Definition (Def));
4873          Set_Has_Aliased_Components (Etype (T));
4874       end if;
4875
4876       --  Ada 2005 (AI-231): Propagate the null-excluding attribute to the
4877       --  array type to ensure that objects of this type are initialized.
4878
4879       if Ada_Version >= Ada_2005
4880         and then Can_Never_Be_Null (Element_Type)
4881       then
4882          Set_Can_Never_Be_Null (T);
4883
4884          if Null_Exclusion_Present (Component_Definition (Def))
4885
4886             --  No need to check itypes because in their case this check was
4887             --  done at their point of creation
4888
4889            and then not Is_Itype (Element_Type)
4890          then
4891             Error_Msg_N
4892               ("`NOT NULL` not allowed (null already excluded)",
4893                Subtype_Indication (Component_Definition (Def)));
4894          end if;
4895       end if;
4896
4897       Priv := Private_Component (Element_Type);
4898
4899       if Present (Priv) then
4900
4901          --  Check for circular definitions
4902
4903          if Priv = Any_Type then
4904             Set_Component_Type (Etype (T), Any_Type);
4905
4906          --  There is a gap in the visibility of operations on the composite
4907          --  type only if the component type is defined in a different scope.
4908
4909          elsif Scope (Priv) = Current_Scope then
4910             null;
4911
4912          elsif Is_Limited_Type (Priv) then
4913             Set_Is_Limited_Composite (Etype (T));
4914             Set_Is_Limited_Composite (T);
4915          else
4916             Set_Is_Private_Composite (Etype (T));
4917             Set_Is_Private_Composite (T);
4918          end if;
4919       end if;
4920
4921       --  A syntax error in the declaration itself may lead to an empty index
4922       --  list, in which case do a minimal patch.
4923
4924       if No (First_Index (T)) then
4925          Error_Msg_N ("missing index definition in array type declaration", T);
4926
4927          declare
4928             Indexes : constant List_Id :=
4929                         New_List (New_Occurrence_Of (Any_Id, Sloc (T)));
4930          begin
4931             Set_Discrete_Subtype_Definitions (Def, Indexes);
4932             Set_First_Index (T, First (Indexes));
4933             return;
4934          end;
4935       end if;
4936
4937       --  Create a concatenation operator for the new type. Internal array
4938       --  types created for packed entities do not need such, they are
4939       --  compatible with the user-defined type.
4940
4941       if Number_Dimensions (T) = 1
4942          and then not Is_Packed_Array_Type (T)
4943       then
4944          New_Concatenation_Op (T);
4945       end if;
4946
4947       --  In the case of an unconstrained array the parser has already verified
4948       --  that all the indexes are unconstrained but we still need to make sure
4949       --  that the element type is constrained.
4950
4951       if Is_Indefinite_Subtype (Element_Type) then
4952          Error_Msg_N
4953            ("unconstrained element type in array declaration",
4954             Subtype_Indication (Component_Def));
4955
4956       elsif Is_Abstract_Type (Element_Type) then
4957          Error_Msg_N
4958            ("the type of a component cannot be abstract",
4959             Subtype_Indication (Component_Def));
4960       end if;
4961    end Array_Type_Declaration;
4962
4963    ------------------------------------------------------
4964    -- Replace_Anonymous_Access_To_Protected_Subprogram --
4965    ------------------------------------------------------
4966
4967    function Replace_Anonymous_Access_To_Protected_Subprogram
4968      (N : Node_Id) return Entity_Id
4969    is
4970       Loc : constant Source_Ptr := Sloc (N);
4971
4972       Curr_Scope : constant Scope_Stack_Entry :=
4973                      Scope_Stack.Table (Scope_Stack.Last);
4974
4975       Anon : constant Entity_Id := Make_Temporary (Loc, 'S');
4976       Acc  : Node_Id;
4977       Comp : Node_Id;
4978       Decl : Node_Id;
4979       P    : Node_Id;
4980
4981    begin
4982       Set_Is_Internal (Anon);
4983
4984       case Nkind (N) is
4985          when N_Component_Declaration       |
4986            N_Unconstrained_Array_Definition |
4987            N_Constrained_Array_Definition   =>
4988             Comp := Component_Definition (N);
4989             Acc  := Access_Definition (Comp);
4990
4991          when N_Discriminant_Specification =>
4992             Comp := Discriminant_Type (N);
4993             Acc  := Comp;
4994
4995          when N_Parameter_Specification =>
4996             Comp := Parameter_Type (N);
4997             Acc  := Comp;
4998
4999          when N_Access_Function_Definition  =>
5000             Comp := Result_Definition (N);
5001             Acc  := Comp;
5002
5003          when N_Object_Declaration  =>
5004             Comp := Object_Definition (N);
5005             Acc  := Comp;
5006
5007          when N_Function_Specification =>
5008             Comp := Result_Definition (N);
5009             Acc  := Comp;
5010
5011          when others =>
5012             raise Program_Error;
5013       end case;
5014
5015       Decl := Make_Full_Type_Declaration (Loc,
5016                 Defining_Identifier => Anon,
5017                 Type_Definition   =>
5018                   Copy_Separate_Tree (Access_To_Subprogram_Definition (Acc)));
5019
5020       Mark_Rewrite_Insertion (Decl);
5021
5022       --  Insert the new declaration in the nearest enclosing scope. If the
5023       --  node is a body and N is its return type, the declaration belongs in
5024       --  the enclosing scope.
5025
5026       P := Parent (N);
5027
5028       if Nkind (P) = N_Subprogram_Body
5029         and then Nkind (N) = N_Function_Specification
5030       then
5031          P := Parent (P);
5032       end if;
5033
5034       while Present (P) and then not Has_Declarations (P) loop
5035          P := Parent (P);
5036       end loop;
5037
5038       pragma Assert (Present (P));
5039
5040       if Nkind (P) = N_Package_Specification then
5041          Prepend (Decl, Visible_Declarations (P));
5042       else
5043          Prepend (Decl, Declarations (P));
5044       end if;
5045
5046       --  Replace the anonymous type with an occurrence of the new declaration.
5047       --  In all cases the rewritten node does not have the null-exclusion
5048       --  attribute because (if present) it was already inherited by the
5049       --  anonymous entity (Anon). Thus, in case of components we do not
5050       --  inherit this attribute.
5051
5052       if Nkind (N) = N_Parameter_Specification then
5053          Rewrite (Comp, New_Occurrence_Of (Anon, Loc));
5054          Set_Etype (Defining_Identifier (N), Anon);
5055          Set_Null_Exclusion_Present (N, False);
5056
5057       elsif Nkind (N) = N_Object_Declaration then
5058          Rewrite (Comp, New_Occurrence_Of (Anon, Loc));
5059          Set_Etype (Defining_Identifier (N), Anon);
5060
5061       elsif Nkind (N) = N_Access_Function_Definition then
5062          Rewrite (Comp, New_Occurrence_Of (Anon, Loc));
5063
5064       elsif Nkind (N) = N_Function_Specification then
5065          Rewrite (Comp, New_Occurrence_Of (Anon, Loc));
5066          Set_Etype (Defining_Unit_Name (N), Anon);
5067
5068       else
5069          Rewrite (Comp,
5070            Make_Component_Definition (Loc,
5071              Subtype_Indication => New_Occurrence_Of (Anon, Loc)));
5072       end if;
5073
5074       Mark_Rewrite_Insertion (Comp);
5075
5076       if Nkind_In (N, N_Object_Declaration, N_Access_Function_Definition) then
5077          Analyze (Decl);
5078
5079       else
5080          --  Temporarily remove the current scope (record or subprogram) from
5081          --  the stack to add the new declarations to the enclosing scope.
5082
5083          Scope_Stack.Decrement_Last;
5084          Analyze (Decl);
5085          Set_Is_Itype (Anon);
5086          Scope_Stack.Append (Curr_Scope);
5087       end if;
5088
5089       Set_Ekind (Anon, E_Anonymous_Access_Protected_Subprogram_Type);
5090       Set_Can_Use_Internal_Rep (Anon, not Always_Compatible_Rep_On_Target);
5091       return Anon;
5092    end Replace_Anonymous_Access_To_Protected_Subprogram;
5093
5094    -------------------------------
5095    -- Build_Derived_Access_Type --
5096    -------------------------------
5097
5098    procedure Build_Derived_Access_Type
5099      (N            : Node_Id;
5100       Parent_Type  : Entity_Id;
5101       Derived_Type : Entity_Id)
5102    is
5103       S : constant Node_Id := Subtype_Indication (Type_Definition (N));
5104
5105       Desig_Type      : Entity_Id;
5106       Discr           : Entity_Id;
5107       Discr_Con_Elist : Elist_Id;
5108       Discr_Con_El    : Elmt_Id;
5109       Subt            : Entity_Id;
5110
5111    begin
5112       --  Set the designated type so it is available in case this is an access
5113       --  to a self-referential type, e.g. a standard list type with a next
5114       --  pointer. Will be reset after subtype is built.
5115
5116       Set_Directly_Designated_Type
5117         (Derived_Type, Designated_Type (Parent_Type));
5118
5119       Subt := Process_Subtype (S, N);
5120
5121       if Nkind (S) /= N_Subtype_Indication
5122         and then Subt /= Base_Type (Subt)
5123       then
5124          Set_Ekind (Derived_Type, E_Access_Subtype);
5125       end if;
5126
5127       if Ekind (Derived_Type) = E_Access_Subtype then
5128          declare
5129             Pbase      : constant Entity_Id := Base_Type (Parent_Type);
5130             Ibase      : constant Entity_Id :=
5131                            Create_Itype (Ekind (Pbase), N, Derived_Type, 'B');
5132             Svg_Chars  : constant Name_Id   := Chars (Ibase);
5133             Svg_Next_E : constant Entity_Id := Next_Entity (Ibase);
5134
5135          begin
5136             Copy_Node (Pbase, Ibase);
5137
5138             Set_Chars             (Ibase, Svg_Chars);
5139             Set_Next_Entity       (Ibase, Svg_Next_E);
5140             Set_Sloc              (Ibase, Sloc (Derived_Type));
5141             Set_Scope             (Ibase, Scope (Derived_Type));
5142             Set_Freeze_Node       (Ibase, Empty);
5143             Set_Is_Frozen         (Ibase, False);
5144             Set_Comes_From_Source (Ibase, False);
5145             Set_Is_First_Subtype  (Ibase, False);
5146
5147             Set_Etype (Ibase, Pbase);
5148             Set_Etype (Derived_Type, Ibase);
5149          end;
5150       end if;
5151
5152       Set_Directly_Designated_Type
5153         (Derived_Type, Designated_Type (Subt));
5154
5155       Set_Is_Constrained     (Derived_Type, Is_Constrained (Subt));
5156       Set_Is_Access_Constant (Derived_Type, Is_Access_Constant (Parent_Type));
5157       Set_Size_Info          (Derived_Type,                     Parent_Type);
5158       Set_RM_Size            (Derived_Type, RM_Size            (Parent_Type));
5159       Set_Depends_On_Private (Derived_Type,
5160                               Has_Private_Component (Derived_Type));
5161       Conditional_Delay      (Derived_Type, Subt);
5162
5163       --  Ada 2005 (AI-231): Set the null-exclusion attribute, and verify
5164       --  that it is not redundant.
5165
5166       if Null_Exclusion_Present (Type_Definition (N)) then
5167          Set_Can_Never_Be_Null (Derived_Type);
5168
5169          if Can_Never_Be_Null (Parent_Type)
5170            and then False
5171          then
5172             Error_Msg_NE
5173               ("`NOT NULL` not allowed (& already excludes null)",
5174                 N, Parent_Type);
5175          end if;
5176
5177       elsif Can_Never_Be_Null (Parent_Type) then
5178          Set_Can_Never_Be_Null (Derived_Type);
5179       end if;
5180
5181       --  Note: we do not copy the Storage_Size_Variable, since we always go to
5182       --  the root type for this information.
5183
5184       --  Apply range checks to discriminants for derived record case
5185       --  ??? THIS CODE SHOULD NOT BE HERE REALLY.
5186
5187       Desig_Type := Designated_Type (Derived_Type);
5188       if Is_Composite_Type (Desig_Type)
5189         and then (not Is_Array_Type (Desig_Type))
5190         and then Has_Discriminants (Desig_Type)
5191         and then Base_Type (Desig_Type) /= Desig_Type
5192       then
5193          Discr_Con_Elist := Discriminant_Constraint (Desig_Type);
5194          Discr_Con_El := First_Elmt (Discr_Con_Elist);
5195
5196          Discr := First_Discriminant (Base_Type (Desig_Type));
5197          while Present (Discr_Con_El) loop
5198             Apply_Range_Check (Node (Discr_Con_El), Etype (Discr));
5199             Next_Elmt (Discr_Con_El);
5200             Next_Discriminant (Discr);
5201          end loop;
5202       end if;
5203    end Build_Derived_Access_Type;
5204
5205    ------------------------------
5206    -- Build_Derived_Array_Type --
5207    ------------------------------
5208
5209    procedure Build_Derived_Array_Type
5210      (N            : Node_Id;
5211       Parent_Type  : Entity_Id;
5212       Derived_Type : Entity_Id)
5213    is
5214       Loc           : constant Source_Ptr := Sloc (N);
5215       Tdef          : constant Node_Id    := Type_Definition (N);
5216       Indic         : constant Node_Id    := Subtype_Indication (Tdef);
5217       Parent_Base   : constant Entity_Id  := Base_Type (Parent_Type);
5218       Implicit_Base : Entity_Id;
5219       New_Indic     : Node_Id;
5220
5221       procedure Make_Implicit_Base;
5222       --  If the parent subtype is constrained, the derived type is a subtype
5223       --  of an implicit base type derived from the parent base.
5224
5225       ------------------------
5226       -- Make_Implicit_Base --
5227       ------------------------
5228
5229       procedure Make_Implicit_Base is
5230       begin
5231          Implicit_Base :=
5232            Create_Itype (Ekind (Parent_Base), N, Derived_Type, 'B');
5233
5234          Set_Ekind (Implicit_Base, Ekind (Parent_Base));
5235          Set_Etype (Implicit_Base, Parent_Base);
5236
5237          Copy_Array_Subtype_Attributes   (Implicit_Base, Parent_Base);
5238          Copy_Array_Base_Type_Attributes (Implicit_Base, Parent_Base);
5239
5240          Set_Has_Delayed_Freeze (Implicit_Base, True);
5241       end Make_Implicit_Base;
5242
5243    --  Start of processing for Build_Derived_Array_Type
5244
5245    begin
5246       if not Is_Constrained (Parent_Type) then
5247          if Nkind (Indic) /= N_Subtype_Indication then
5248             Set_Ekind (Derived_Type, E_Array_Type);
5249
5250             Copy_Array_Subtype_Attributes   (Derived_Type, Parent_Type);
5251             Copy_Array_Base_Type_Attributes (Derived_Type, Parent_Type);
5252
5253             Set_Has_Delayed_Freeze (Derived_Type, True);
5254
5255          else
5256             Make_Implicit_Base;
5257             Set_Etype (Derived_Type, Implicit_Base);
5258
5259             New_Indic :=
5260               Make_Subtype_Declaration (Loc,
5261                 Defining_Identifier => Derived_Type,
5262                 Subtype_Indication  =>
5263                   Make_Subtype_Indication (Loc,
5264                     Subtype_Mark => New_Reference_To (Implicit_Base, Loc),
5265                     Constraint => Constraint (Indic)));
5266
5267             Rewrite (N, New_Indic);
5268             Analyze (N);
5269          end if;
5270
5271       else
5272          if Nkind (Indic) /= N_Subtype_Indication then
5273             Make_Implicit_Base;
5274
5275             Set_Ekind             (Derived_Type, Ekind (Parent_Type));
5276             Set_Etype             (Derived_Type, Implicit_Base);
5277             Copy_Array_Subtype_Attributes (Derived_Type, Parent_Type);
5278
5279          else
5280             Error_Msg_N ("illegal constraint on constrained type", Indic);
5281          end if;
5282       end if;
5283
5284       --  If parent type is not a derived type itself, and is declared in
5285       --  closed scope (e.g. a subprogram), then we must explicitly introduce
5286       --  the new type's concatenation operator since Derive_Subprograms
5287       --  will not inherit the parent's operator. If the parent type is
5288       --  unconstrained, the operator is of the unconstrained base type.
5289
5290       if Number_Dimensions (Parent_Type) = 1
5291         and then not Is_Limited_Type (Parent_Type)
5292         and then not Is_Derived_Type (Parent_Type)
5293         and then not Is_Package_Or_Generic_Package
5294                        (Scope (Base_Type (Parent_Type)))
5295       then
5296          if not Is_Constrained (Parent_Type)
5297            and then Is_Constrained (Derived_Type)
5298          then
5299             New_Concatenation_Op (Implicit_Base);
5300          else
5301             New_Concatenation_Op (Derived_Type);
5302          end if;
5303       end if;
5304    end Build_Derived_Array_Type;
5305
5306    -----------------------------------
5307    -- Build_Derived_Concurrent_Type --
5308    -----------------------------------
5309
5310    procedure Build_Derived_Concurrent_Type
5311      (N            : Node_Id;
5312       Parent_Type  : Entity_Id;
5313       Derived_Type : Entity_Id)
5314    is
5315       Loc : constant Source_Ptr := Sloc (N);
5316
5317       Corr_Record      : constant Entity_Id := Make_Temporary (Loc, 'C');
5318       Corr_Decl        : Node_Id;
5319       Corr_Decl_Needed : Boolean;
5320       --  If the derived type has fewer discriminants than its parent, the
5321       --  corresponding record is also a derived type, in order to account for
5322       --  the bound discriminants. We create a full type declaration for it in
5323       --  this case.
5324
5325       Constraint_Present : constant Boolean :=
5326                              Nkind (Subtype_Indication (Type_Definition (N))) =
5327                                                           N_Subtype_Indication;
5328
5329       D_Constraint   : Node_Id;
5330       New_Constraint : Elist_Id;
5331       Old_Disc       : Entity_Id;
5332       New_Disc       : Entity_Id;
5333       New_N          : Node_Id;
5334
5335    begin
5336       Set_Stored_Constraint (Derived_Type, No_Elist);
5337       Corr_Decl_Needed := False;
5338       Old_Disc := Empty;
5339
5340       if Present (Discriminant_Specifications (N))
5341         and then Constraint_Present
5342       then
5343          Old_Disc := First_Discriminant (Parent_Type);
5344          New_Disc := First (Discriminant_Specifications (N));
5345          while Present (New_Disc) and then Present (Old_Disc) loop
5346             Next_Discriminant (Old_Disc);
5347             Next (New_Disc);
5348          end loop;
5349       end if;
5350
5351       if Present (Old_Disc) and then Expander_Active then
5352
5353          --  The new type has fewer discriminants, so we need to create a new
5354          --  corresponding record, which is derived from the corresponding
5355          --  record of the parent, and has a stored constraint that captures
5356          --  the values of the discriminant constraints. The corresponding
5357          --  record is needed only if expander is active and code generation is
5358          --  enabled.
5359
5360          --  The type declaration for the derived corresponding record has the
5361          --  same discriminant part and constraints as the current declaration.
5362          --  Copy the unanalyzed tree to build declaration.
5363
5364          Corr_Decl_Needed := True;
5365          New_N := Copy_Separate_Tree (N);
5366
5367          Corr_Decl :=
5368            Make_Full_Type_Declaration (Loc,
5369              Defining_Identifier         => Corr_Record,
5370              Discriminant_Specifications =>
5371                 Discriminant_Specifications (New_N),
5372              Type_Definition             =>
5373                Make_Derived_Type_Definition (Loc,
5374                  Subtype_Indication =>
5375                    Make_Subtype_Indication (Loc,
5376                      Subtype_Mark =>
5377                         New_Occurrence_Of
5378                           (Corresponding_Record_Type (Parent_Type), Loc),
5379                      Constraint   =>
5380                        Constraint
5381                          (Subtype_Indication (Type_Definition (New_N))))));
5382       end if;
5383
5384       --  Copy Storage_Size and Relative_Deadline variables if task case
5385
5386       if Is_Task_Type (Parent_Type) then
5387          Set_Storage_Size_Variable (Derived_Type,
5388            Storage_Size_Variable (Parent_Type));
5389          Set_Relative_Deadline_Variable (Derived_Type,
5390            Relative_Deadline_Variable (Parent_Type));
5391       end if;
5392
5393       if Present (Discriminant_Specifications (N)) then
5394          Push_Scope (Derived_Type);
5395          Check_Or_Process_Discriminants (N, Derived_Type);
5396
5397          if Constraint_Present then
5398             New_Constraint :=
5399               Expand_To_Stored_Constraint
5400                 (Parent_Type,
5401                  Build_Discriminant_Constraints
5402                    (Parent_Type,
5403                     Subtype_Indication (Type_Definition (N)), True));
5404          end if;
5405
5406          End_Scope;
5407
5408       elsif Constraint_Present then
5409
5410          --  Build constrained subtype and derive from it
5411
5412          declare
5413             Loc  : constant Source_Ptr := Sloc (N);
5414             Anon : constant Entity_Id :=
5415                      Make_Defining_Identifier (Loc,
5416                        Chars => New_External_Name (Chars (Derived_Type), 'T'));
5417             Decl : Node_Id;
5418
5419          begin
5420             Decl :=
5421               Make_Subtype_Declaration (Loc,
5422                 Defining_Identifier => Anon,
5423                 Subtype_Indication =>
5424                   Subtype_Indication (Type_Definition (N)));
5425             Insert_Before (N, Decl);
5426             Analyze (Decl);
5427
5428             Rewrite (Subtype_Indication (Type_Definition (N)),
5429               New_Occurrence_Of (Anon, Loc));
5430             Set_Analyzed (Derived_Type, False);
5431             Analyze (N);
5432             return;
5433          end;
5434       end if;
5435
5436       --  By default, operations and private data are inherited from parent.
5437       --  However, in the presence of bound discriminants, a new corresponding
5438       --  record will be created, see below.
5439
5440       Set_Has_Discriminants
5441         (Derived_Type, Has_Discriminants         (Parent_Type));
5442       Set_Corresponding_Record_Type
5443         (Derived_Type, Corresponding_Record_Type (Parent_Type));
5444
5445       --  Is_Constrained is set according the parent subtype, but is set to
5446       --  False if the derived type is declared with new discriminants.
5447
5448       Set_Is_Constrained
5449         (Derived_Type,
5450          (Is_Constrained (Parent_Type) or else Constraint_Present)
5451            and then not Present (Discriminant_Specifications (N)));
5452
5453       if Constraint_Present then
5454          if not Has_Discriminants (Parent_Type) then
5455             Error_Msg_N ("untagged parent must have discriminants", N);
5456
5457          elsif Present (Discriminant_Specifications (N)) then
5458
5459             --  Verify that new discriminants are used to constrain old ones
5460
5461             D_Constraint :=
5462               First
5463                 (Constraints
5464                   (Constraint (Subtype_Indication (Type_Definition (N)))));
5465
5466             Old_Disc := First_Discriminant (Parent_Type);
5467
5468             while Present (D_Constraint) loop
5469                if Nkind (D_Constraint) /= N_Discriminant_Association then
5470
5471                   --  Positional constraint. If it is a reference to a new
5472                   --  discriminant, it constrains the corresponding old one.
5473
5474                   if Nkind (D_Constraint) = N_Identifier then
5475                      New_Disc := First_Discriminant (Derived_Type);
5476                      while Present (New_Disc) loop
5477                         exit when Chars (New_Disc) = Chars (D_Constraint);
5478                         Next_Discriminant (New_Disc);
5479                      end loop;
5480
5481                      if Present (New_Disc) then
5482                         Set_Corresponding_Discriminant (New_Disc, Old_Disc);
5483                      end if;
5484                   end if;
5485
5486                   Next_Discriminant (Old_Disc);
5487
5488                   --  if this is a named constraint, search by name for the old
5489                   --  discriminants constrained by the new one.
5490
5491                elsif Nkind (Expression (D_Constraint)) = N_Identifier then
5492
5493                   --  Find new discriminant with that name
5494
5495                   New_Disc := First_Discriminant (Derived_Type);
5496                   while Present (New_Disc) loop
5497                      exit when
5498                        Chars (New_Disc) = Chars (Expression (D_Constraint));
5499                      Next_Discriminant (New_Disc);
5500                   end loop;
5501
5502                   if Present (New_Disc) then
5503
5504                      --  Verify that new discriminant renames some discriminant
5505                      --  of the parent type, and associate the new discriminant
5506                      --  with one or more old ones that it renames.
5507
5508                      declare
5509                         Selector : Node_Id;
5510
5511                      begin
5512                         Selector := First (Selector_Names (D_Constraint));
5513                         while Present (Selector) loop
5514                            Old_Disc := First_Discriminant (Parent_Type);
5515                            while Present (Old_Disc) loop
5516                               exit when Chars (Old_Disc) = Chars (Selector);
5517                               Next_Discriminant (Old_Disc);
5518                            end loop;
5519
5520                            if Present (Old_Disc) then
5521                               Set_Corresponding_Discriminant
5522                                 (New_Disc, Old_Disc);
5523                            end if;
5524
5525                            Next (Selector);
5526                         end loop;
5527                      end;
5528                   end if;
5529                end if;
5530
5531                Next (D_Constraint);
5532             end loop;
5533
5534             New_Disc := First_Discriminant (Derived_Type);
5535             while Present (New_Disc) loop
5536                if No (Corresponding_Discriminant (New_Disc)) then
5537                   Error_Msg_NE
5538                     ("new discriminant& must constrain old one", N, New_Disc);
5539
5540                elsif not
5541                  Subtypes_Statically_Compatible
5542                    (Etype (New_Disc),
5543                     Etype (Corresponding_Discriminant (New_Disc)))
5544                then
5545                   Error_Msg_NE
5546                     ("& not statically compatible with parent discriminant",
5547                       N, New_Disc);
5548                end if;
5549
5550                Next_Discriminant (New_Disc);
5551             end loop;
5552          end if;
5553
5554       elsif Present (Discriminant_Specifications (N)) then
5555          Error_Msg_N
5556            ("missing discriminant constraint in untagged derivation", N);
5557       end if;
5558
5559       --  The entity chain of the derived type includes the new discriminants
5560       --  but shares operations with the parent.
5561
5562       if Present (Discriminant_Specifications (N)) then
5563          Old_Disc := First_Discriminant (Parent_Type);
5564          while Present (Old_Disc) loop
5565             if No (Next_Entity (Old_Disc))
5566               or else Ekind (Next_Entity (Old_Disc)) /= E_Discriminant
5567             then
5568                Set_Next_Entity
5569                  (Last_Entity (Derived_Type), Next_Entity (Old_Disc));
5570                exit;
5571             end if;
5572
5573             Next_Discriminant (Old_Disc);
5574          end loop;
5575
5576       else
5577          Set_First_Entity (Derived_Type, First_Entity (Parent_Type));
5578          if Has_Discriminants (Parent_Type) then
5579             Set_Is_Constrained (Derived_Type, Is_Constrained (Parent_Type));
5580             Set_Discriminant_Constraint (
5581               Derived_Type, Discriminant_Constraint (Parent_Type));
5582          end if;
5583       end if;
5584
5585       Set_Last_Entity  (Derived_Type, Last_Entity  (Parent_Type));
5586
5587       Set_Has_Completion (Derived_Type);
5588
5589       if Corr_Decl_Needed then
5590          Set_Stored_Constraint (Derived_Type, New_Constraint);
5591          Insert_After (N, Corr_Decl);
5592          Analyze (Corr_Decl);
5593          Set_Corresponding_Record_Type (Derived_Type, Corr_Record);
5594       end if;
5595    end Build_Derived_Concurrent_Type;
5596
5597    ------------------------------------
5598    -- Build_Derived_Enumeration_Type --
5599    ------------------------------------
5600
5601    procedure Build_Derived_Enumeration_Type
5602      (N            : Node_Id;
5603       Parent_Type  : Entity_Id;
5604       Derived_Type : Entity_Id)
5605    is
5606       Loc           : constant Source_Ptr := Sloc (N);
5607       Def           : constant Node_Id    := Type_Definition (N);
5608       Indic         : constant Node_Id    := Subtype_Indication (Def);
5609       Implicit_Base : Entity_Id;
5610       Literal       : Entity_Id;
5611       New_Lit       : Entity_Id;
5612       Literals_List : List_Id;
5613       Type_Decl     : Node_Id;
5614       Hi, Lo        : Node_Id;
5615       Rang_Expr     : Node_Id;
5616
5617    begin
5618       --  Since types Standard.Character and Standard.[Wide_]Wide_Character do
5619       --  not have explicit literals lists we need to process types derived
5620       --  from them specially. This is handled by Derived_Standard_Character.
5621       --  If the parent type is a generic type, there are no literals either,
5622       --  and we construct the same skeletal representation as for the generic
5623       --  parent type.
5624
5625       if Is_Standard_Character_Type (Parent_Type) then
5626          Derived_Standard_Character (N, Parent_Type, Derived_Type);
5627
5628       elsif Is_Generic_Type (Root_Type (Parent_Type)) then
5629          declare
5630             Lo : Node_Id;
5631             Hi : Node_Id;
5632
5633          begin
5634             if Nkind (Indic) /= N_Subtype_Indication then
5635                Lo :=
5636                   Make_Attribute_Reference (Loc,
5637                     Attribute_Name => Name_First,
5638                     Prefix         => New_Reference_To (Derived_Type, Loc));
5639                Set_Etype (Lo, Derived_Type);
5640
5641                Hi :=
5642                   Make_Attribute_Reference (Loc,
5643                     Attribute_Name => Name_Last,
5644                     Prefix         => New_Reference_To (Derived_Type, Loc));
5645                Set_Etype (Hi, Derived_Type);
5646
5647                Set_Scalar_Range (Derived_Type,
5648                   Make_Range (Loc,
5649                     Low_Bound  => Lo,
5650                     High_Bound => Hi));
5651             else
5652
5653                --   Analyze subtype indication and verify compatibility
5654                --   with parent type.
5655
5656                if Base_Type (Process_Subtype (Indic, N)) /=
5657                   Base_Type (Parent_Type)
5658                then
5659                   Error_Msg_N
5660                     ("illegal constraint for formal discrete type", N);
5661                end if;
5662             end if;
5663          end;
5664
5665       else
5666          --  If a constraint is present, analyze the bounds to catch
5667          --  premature usage of the derived literals.
5668
5669          if Nkind (Indic) = N_Subtype_Indication
5670            and then Nkind (Range_Expression (Constraint (Indic))) = N_Range
5671          then
5672             Analyze (Low_Bound  (Range_Expression (Constraint (Indic))));
5673             Analyze (High_Bound (Range_Expression (Constraint (Indic))));
5674          end if;
5675
5676          --  Introduce an implicit base type for the derived type even if there
5677          --  is no constraint attached to it, since this seems closer to the
5678          --  Ada semantics. Build a full type declaration tree for the derived
5679          --  type using the implicit base type as the defining identifier. The
5680          --  build a subtype declaration tree which applies the constraint (if
5681          --  any) have it replace the derived type declaration.
5682
5683          Literal := First_Literal (Parent_Type);
5684          Literals_List := New_List;
5685          while Present (Literal)
5686            and then Ekind (Literal) = E_Enumeration_Literal
5687          loop
5688             --  Literals of the derived type have the same representation as
5689             --  those of the parent type, but this representation can be
5690             --  overridden by an explicit representation clause. Indicate
5691             --  that there is no explicit representation given yet. These
5692             --  derived literals are implicit operations of the new type,
5693             --  and can be overridden by explicit ones.
5694
5695             if Nkind (Literal) = N_Defining_Character_Literal then
5696                New_Lit :=
5697                  Make_Defining_Character_Literal (Loc, Chars (Literal));
5698             else
5699                New_Lit := Make_Defining_Identifier (Loc, Chars (Literal));
5700             end if;
5701
5702             Set_Ekind                (New_Lit, E_Enumeration_Literal);
5703             Set_Enumeration_Pos      (New_Lit, Enumeration_Pos (Literal));
5704             Set_Enumeration_Rep      (New_Lit, Enumeration_Rep (Literal));
5705             Set_Enumeration_Rep_Expr (New_Lit, Empty);
5706             Set_Alias                (New_Lit, Literal);
5707             Set_Is_Known_Valid       (New_Lit, True);
5708
5709             Append (New_Lit, Literals_List);
5710             Next_Literal (Literal);
5711          end loop;
5712
5713          Implicit_Base :=
5714            Make_Defining_Identifier (Sloc (Derived_Type),
5715              Chars => New_External_Name (Chars (Derived_Type), 'B'));
5716
5717          --  Indicate the proper nature of the derived type. This must be done
5718          --  before analysis of the literals, to recognize cases when a literal
5719          --  may be hidden by a previous explicit function definition (cf.
5720          --  c83031a).
5721
5722          Set_Ekind (Derived_Type, E_Enumeration_Subtype);
5723          Set_Etype (Derived_Type, Implicit_Base);
5724
5725          Type_Decl :=
5726            Make_Full_Type_Declaration (Loc,
5727              Defining_Identifier => Implicit_Base,
5728              Discriminant_Specifications => No_List,
5729              Type_Definition =>
5730                Make_Enumeration_Type_Definition (Loc, Literals_List));
5731
5732          Mark_Rewrite_Insertion (Type_Decl);
5733          Insert_Before (N, Type_Decl);
5734          Analyze (Type_Decl);
5735
5736          --  After the implicit base is analyzed its Etype needs to be changed
5737          --  to reflect the fact that it is derived from the parent type which
5738          --  was ignored during analysis. We also set the size at this point.
5739
5740          Set_Etype (Implicit_Base, Parent_Type);
5741
5742          Set_Size_Info      (Implicit_Base,                 Parent_Type);
5743          Set_RM_Size        (Implicit_Base, RM_Size        (Parent_Type));
5744          Set_First_Rep_Item (Implicit_Base, First_Rep_Item (Parent_Type));
5745
5746          --  Copy other flags from parent type
5747
5748          Set_Has_Non_Standard_Rep
5749                             (Implicit_Base, Has_Non_Standard_Rep
5750                                                            (Parent_Type));
5751          Set_Has_Pragma_Ordered
5752                             (Implicit_Base, Has_Pragma_Ordered
5753                                                            (Parent_Type));
5754          Set_Has_Delayed_Freeze (Implicit_Base);
5755
5756          --  Process the subtype indication including a validation check on the
5757          --  constraint, if any. If a constraint is given, its bounds must be
5758          --  implicitly converted to the new type.
5759
5760          if Nkind (Indic) = N_Subtype_Indication then
5761             declare
5762                R : constant Node_Id :=
5763                      Range_Expression (Constraint (Indic));
5764
5765             begin
5766                if Nkind (R) = N_Range then
5767                   Hi := Build_Scalar_Bound
5768                           (High_Bound (R), Parent_Type, Implicit_Base);
5769                   Lo := Build_Scalar_Bound
5770                           (Low_Bound  (R), Parent_Type, Implicit_Base);
5771
5772                else
5773                   --  Constraint is a Range attribute. Replace with explicit
5774                   --  mention of the bounds of the prefix, which must be a
5775                   --  subtype.
5776
5777                   Analyze (Prefix (R));
5778                   Hi :=
5779                     Convert_To (Implicit_Base,
5780                       Make_Attribute_Reference (Loc,
5781                         Attribute_Name => Name_Last,
5782                         Prefix =>
5783                           New_Occurrence_Of (Entity (Prefix (R)), Loc)));
5784
5785                   Lo :=
5786                     Convert_To (Implicit_Base,
5787                       Make_Attribute_Reference (Loc,
5788                         Attribute_Name => Name_First,
5789                         Prefix =>
5790                           New_Occurrence_Of (Entity (Prefix (R)), Loc)));
5791                end if;
5792             end;
5793
5794          else
5795             Hi :=
5796               Build_Scalar_Bound
5797                 (Type_High_Bound (Parent_Type),
5798                  Parent_Type, Implicit_Base);
5799             Lo :=
5800                Build_Scalar_Bound
5801                  (Type_Low_Bound (Parent_Type),
5802                   Parent_Type, Implicit_Base);
5803          end if;
5804
5805          Rang_Expr :=
5806            Make_Range (Loc,
5807              Low_Bound  => Lo,
5808              High_Bound => Hi);
5809
5810          --  If we constructed a default range for the case where no range
5811          --  was given, then the expressions in the range must not freeze
5812          --  since they do not correspond to expressions in the source.
5813
5814          if Nkind (Indic) /= N_Subtype_Indication then
5815             Set_Must_Not_Freeze (Lo);
5816             Set_Must_Not_Freeze (Hi);
5817             Set_Must_Not_Freeze (Rang_Expr);
5818          end if;
5819
5820          Rewrite (N,
5821            Make_Subtype_Declaration (Loc,
5822              Defining_Identifier => Derived_Type,
5823              Subtype_Indication =>
5824                Make_Subtype_Indication (Loc,
5825                  Subtype_Mark => New_Occurrence_Of (Implicit_Base, Loc),
5826                  Constraint =>
5827                    Make_Range_Constraint (Loc,
5828                      Range_Expression => Rang_Expr))));
5829
5830          Analyze (N);
5831
5832          --  If pragma Discard_Names applies on the first subtype of the parent
5833          --  type, then it must be applied on this subtype as well.
5834
5835          if Einfo.Discard_Names (First_Subtype (Parent_Type)) then
5836             Set_Discard_Names (Derived_Type);
5837          end if;
5838
5839          --  Apply a range check. Since this range expression doesn't have an
5840          --  Etype, we have to specifically pass the Source_Typ parameter. Is
5841          --  this right???
5842
5843          if Nkind (Indic) = N_Subtype_Indication then
5844             Apply_Range_Check (Range_Expression (Constraint (Indic)),
5845                                Parent_Type,
5846                                Source_Typ => Entity (Subtype_Mark (Indic)));
5847          end if;
5848       end if;
5849    end Build_Derived_Enumeration_Type;
5850
5851    --------------------------------
5852    -- Build_Derived_Numeric_Type --
5853    --------------------------------
5854
5855    procedure Build_Derived_Numeric_Type
5856      (N            : Node_Id;
5857       Parent_Type  : Entity_Id;
5858       Derived_Type : Entity_Id)
5859    is
5860       Loc           : constant Source_Ptr := Sloc (N);
5861       Tdef          : constant Node_Id    := Type_Definition (N);
5862       Indic         : constant Node_Id    := Subtype_Indication (Tdef);
5863       Parent_Base   : constant Entity_Id  := Base_Type (Parent_Type);
5864       No_Constraint : constant Boolean    := Nkind (Indic) /=
5865                                                   N_Subtype_Indication;
5866       Implicit_Base : Entity_Id;
5867
5868       Lo : Node_Id;
5869       Hi : Node_Id;
5870
5871    begin
5872       --  Process the subtype indication including a validation check on
5873       --  the constraint if any.
5874
5875       Discard_Node (Process_Subtype (Indic, N));
5876
5877       --  Introduce an implicit base type for the derived type even if there
5878       --  is no constraint attached to it, since this seems closer to the Ada
5879       --  semantics.
5880
5881       Implicit_Base :=
5882         Create_Itype (Ekind (Parent_Base), N, Derived_Type, 'B');
5883
5884       Set_Etype          (Implicit_Base, Parent_Base);
5885       Set_Ekind          (Implicit_Base, Ekind          (Parent_Base));
5886       Set_Size_Info      (Implicit_Base,                 Parent_Base);
5887       Set_First_Rep_Item (Implicit_Base, First_Rep_Item (Parent_Base));
5888       Set_Parent         (Implicit_Base, Parent (Derived_Type));
5889       Set_Is_Known_Valid (Implicit_Base, Is_Known_Valid (Parent_Base));
5890
5891       --  Set RM Size for discrete type or decimal fixed-point type
5892       --  Ordinary fixed-point is excluded, why???
5893
5894       if Is_Discrete_Type (Parent_Base)
5895         or else Is_Decimal_Fixed_Point_Type (Parent_Base)
5896       then
5897          Set_RM_Size (Implicit_Base, RM_Size (Parent_Base));
5898       end if;
5899
5900       Set_Has_Delayed_Freeze (Implicit_Base);
5901
5902       Lo := New_Copy_Tree (Type_Low_Bound  (Parent_Base));
5903       Hi := New_Copy_Tree (Type_High_Bound (Parent_Base));
5904
5905       Set_Scalar_Range (Implicit_Base,
5906         Make_Range (Loc,
5907           Low_Bound  => Lo,
5908           High_Bound => Hi));
5909
5910       if Has_Infinities (Parent_Base) then
5911          Set_Includes_Infinities (Scalar_Range (Implicit_Base));
5912       end if;
5913
5914       --  The Derived_Type, which is the entity of the declaration, is a
5915       --  subtype of the implicit base. Its Ekind is a subtype, even in the
5916       --  absence of an explicit constraint.
5917
5918       Set_Etype (Derived_Type, Implicit_Base);
5919
5920       --  If we did not have a constraint, then the Ekind is set from the
5921       --  parent type (otherwise Process_Subtype has set the bounds)
5922
5923       if No_Constraint then
5924          Set_Ekind (Derived_Type, Subtype_Kind (Ekind (Parent_Type)));
5925       end if;
5926
5927       --  If we did not have a range constraint, then set the range from the
5928       --  parent type. Otherwise, the Process_Subtype call has set the bounds.
5929
5930       if No_Constraint
5931         or else not Has_Range_Constraint (Indic)
5932       then
5933          Set_Scalar_Range (Derived_Type,
5934            Make_Range (Loc,
5935              Low_Bound  => New_Copy_Tree (Type_Low_Bound  (Parent_Type)),
5936              High_Bound => New_Copy_Tree (Type_High_Bound (Parent_Type))));
5937          Set_Is_Constrained (Derived_Type, Is_Constrained (Parent_Type));
5938
5939          if Has_Infinities (Parent_Type) then
5940             Set_Includes_Infinities (Scalar_Range (Derived_Type));
5941          end if;
5942
5943          Set_Is_Known_Valid (Derived_Type, Is_Known_Valid (Parent_Type));
5944       end if;
5945
5946       Set_Is_Descendent_Of_Address (Derived_Type,
5947         Is_Descendent_Of_Address (Parent_Type));
5948       Set_Is_Descendent_Of_Address (Implicit_Base,
5949         Is_Descendent_Of_Address (Parent_Type));
5950
5951       --  Set remaining type-specific fields, depending on numeric type
5952
5953       if Is_Modular_Integer_Type (Parent_Type) then
5954          Set_Modulus (Implicit_Base, Modulus (Parent_Base));
5955
5956          Set_Non_Binary_Modulus
5957            (Implicit_Base, Non_Binary_Modulus (Parent_Base));
5958
5959          Set_Is_Known_Valid
5960            (Implicit_Base, Is_Known_Valid (Parent_Base));
5961
5962       elsif Is_Floating_Point_Type (Parent_Type) then
5963
5964          --  Digits of base type is always copied from the digits value of
5965          --  the parent base type, but the digits of the derived type will
5966          --  already have been set if there was a constraint present.
5967
5968          Set_Digits_Value (Implicit_Base, Digits_Value (Parent_Base));
5969          Set_Float_Rep    (Implicit_Base, Float_Rep    (Parent_Base));
5970
5971          if No_Constraint then
5972             Set_Digits_Value (Derived_Type, Digits_Value (Parent_Type));
5973          end if;
5974
5975       elsif Is_Fixed_Point_Type (Parent_Type) then
5976
5977          --  Small of base type and derived type are always copied from the
5978          --  parent base type, since smalls never change. The delta of the
5979          --  base type is also copied from the parent base type. However the
5980          --  delta of the derived type will have been set already if a
5981          --  constraint was present.
5982
5983          Set_Small_Value (Derived_Type,  Small_Value (Parent_Base));
5984          Set_Small_Value (Implicit_Base, Small_Value (Parent_Base));
5985          Set_Delta_Value (Implicit_Base, Delta_Value (Parent_Base));
5986
5987          if No_Constraint then
5988             Set_Delta_Value (Derived_Type,  Delta_Value (Parent_Type));
5989          end if;
5990
5991          --  The scale and machine radix in the decimal case are always
5992          --  copied from the parent base type.
5993
5994          if Is_Decimal_Fixed_Point_Type (Parent_Type) then
5995             Set_Scale_Value (Derived_Type,  Scale_Value (Parent_Base));
5996             Set_Scale_Value (Implicit_Base, Scale_Value (Parent_Base));
5997
5998             Set_Machine_Radix_10
5999               (Derived_Type,  Machine_Radix_10 (Parent_Base));
6000             Set_Machine_Radix_10
6001               (Implicit_Base, Machine_Radix_10 (Parent_Base));
6002
6003             Set_Digits_Value (Implicit_Base, Digits_Value (Parent_Base));
6004
6005             if No_Constraint then
6006                Set_Digits_Value (Derived_Type, Digits_Value (Parent_Base));
6007
6008             else
6009                --  the analysis of the subtype_indication sets the
6010                --  digits value of the derived type.
6011
6012                null;
6013             end if;
6014          end if;
6015       end if;
6016
6017       --  The type of the bounds is that of the parent type, and they
6018       --  must be converted to the derived type.
6019
6020       Convert_Scalar_Bounds (N, Parent_Type, Derived_Type, Loc);
6021
6022       --  The implicit_base should be frozen when the derived type is frozen,
6023       --  but note that it is used in the conversions of the bounds. For fixed
6024       --  types we delay the determination of the bounds until the proper
6025       --  freezing point. For other numeric types this is rejected by GCC, for
6026       --  reasons that are currently unclear (???), so we choose to freeze the
6027       --  implicit base now. In the case of integers and floating point types
6028       --  this is harmless because subsequent representation clauses cannot
6029       --  affect anything, but it is still baffling that we cannot use the
6030       --  same mechanism for all derived numeric types.
6031
6032       --  There is a further complication: actually *some* representation
6033       --  clauses can affect the implicit base type. Namely, attribute
6034       --  definition clauses for stream-oriented attributes need to set the
6035       --  corresponding TSS entries on the base type, and this normally cannot
6036       --  be done after the base type is frozen, so the circuitry in
6037       --  Sem_Ch13.New_Stream_Subprogram must account for this possibility and
6038       --  not use Set_TSS in this case.
6039
6040       if Is_Fixed_Point_Type (Parent_Type) then
6041          Conditional_Delay (Implicit_Base, Parent_Type);
6042       else
6043          Freeze_Before (N, Implicit_Base);
6044       end if;
6045    end Build_Derived_Numeric_Type;
6046
6047    --------------------------------
6048    -- Build_Derived_Private_Type --
6049    --------------------------------
6050
6051    procedure Build_Derived_Private_Type
6052      (N             : Node_Id;
6053       Parent_Type   : Entity_Id;
6054       Derived_Type  : Entity_Id;
6055       Is_Completion : Boolean;
6056       Derive_Subps  : Boolean := True)
6057    is
6058       Loc         : constant Source_Ptr := Sloc (N);
6059       Der_Base    : Entity_Id;
6060       Discr       : Entity_Id;
6061       Full_Decl   : Node_Id := Empty;
6062       Full_Der    : Entity_Id;
6063       Full_P      : Entity_Id;
6064       Last_Discr  : Entity_Id;
6065       Par_Scope   : constant Entity_Id := Scope (Base_Type (Parent_Type));
6066       Swapped     : Boolean := False;
6067
6068       procedure Copy_And_Build;
6069       --  Copy derived type declaration, replace parent with its full view,
6070       --  and analyze new declaration.
6071
6072       --------------------
6073       -- Copy_And_Build --
6074       --------------------
6075
6076       procedure Copy_And_Build is
6077          Full_N : Node_Id;
6078
6079       begin
6080          if Ekind (Parent_Type) in Record_Kind
6081            or else
6082              (Ekind (Parent_Type) in Enumeration_Kind
6083                and then not Is_Standard_Character_Type (Parent_Type)
6084                and then not Is_Generic_Type (Root_Type (Parent_Type)))
6085          then
6086             Full_N := New_Copy_Tree (N);
6087             Insert_After (N, Full_N);
6088             Build_Derived_Type (
6089               Full_N, Parent_Type, Full_Der, True, Derive_Subps => False);
6090
6091          else
6092             Build_Derived_Type (
6093               N, Parent_Type, Full_Der, True, Derive_Subps => False);
6094          end if;
6095       end Copy_And_Build;
6096
6097    --  Start of processing for Build_Derived_Private_Type
6098
6099    begin
6100       if Is_Tagged_Type (Parent_Type) then
6101          Full_P := Full_View (Parent_Type);
6102
6103          --  A type extension of a type with unknown discriminants is an
6104          --  indefinite type that the back-end cannot handle directly.
6105          --  We treat it as a private type, and build a completion that is
6106          --  derived from the full view of the parent, and hopefully has
6107          --  known discriminants.
6108
6109          --  If the full view of the parent type has an underlying record view,
6110          --  use it to generate the underlying record view of this derived type
6111          --  (required for chains of derivations with unknown discriminants).
6112
6113          --  Minor optimization: we avoid the generation of useless underlying
6114          --  record view entities if the private type declaration has unknown
6115          --  discriminants but its corresponding full view has no
6116          --  discriminants.
6117
6118          if Has_Unknown_Discriminants (Parent_Type)
6119            and then Present (Full_P)
6120            and then (Has_Discriminants (Full_P)
6121                       or else Present (Underlying_Record_View (Full_P)))
6122            and then not In_Open_Scopes (Par_Scope)
6123            and then Expander_Active
6124          then
6125             declare
6126                Full_Der : constant Entity_Id := Make_Temporary (Loc, 'T');
6127                New_Ext  : constant Node_Id :=
6128                             Copy_Separate_Tree
6129                               (Record_Extension_Part (Type_Definition (N)));
6130                Decl     : Node_Id;
6131
6132             begin
6133                Build_Derived_Record_Type
6134                  (N, Parent_Type, Derived_Type, Derive_Subps);
6135
6136                --  Build anonymous completion, as a derivation from the full
6137                --  view of the parent. This is not a completion in the usual
6138                --  sense, because the current type is not private.
6139
6140                Decl :=
6141                  Make_Full_Type_Declaration (Loc,
6142                    Defining_Identifier => Full_Der,
6143                    Type_Definition     =>
6144                      Make_Derived_Type_Definition (Loc,
6145                        Subtype_Indication =>
6146                          New_Copy_Tree
6147                            (Subtype_Indication (Type_Definition (N))),
6148                        Record_Extension_Part => New_Ext));
6149
6150                --  If the parent type has an underlying record view, use it
6151                --  here to build the new underlying record view.
6152
6153                if Present (Underlying_Record_View (Full_P)) then
6154                   pragma Assert
6155                     (Nkind (Subtype_Indication (Type_Definition (Decl)))
6156                        = N_Identifier);
6157                   Set_Entity (Subtype_Indication (Type_Definition (Decl)),
6158                     Underlying_Record_View (Full_P));
6159                end if;
6160
6161                Install_Private_Declarations (Par_Scope);
6162                Install_Visible_Declarations (Par_Scope);
6163                Insert_Before (N, Decl);
6164
6165                --  Mark entity as an underlying record view before analysis,
6166                --  to avoid generating the list of its primitive operations
6167                --  (which is not really required for this entity) and thus
6168                --  prevent spurious errors associated with missing overriding
6169                --  of abstract primitives (overridden only for Derived_Type).
6170
6171                Set_Ekind (Full_Der, E_Record_Type);
6172                Set_Is_Underlying_Record_View (Full_Der);
6173
6174                Analyze (Decl);
6175
6176                pragma Assert (Has_Discriminants (Full_Der)
6177                  and then not Has_Unknown_Discriminants (Full_Der));
6178
6179                Uninstall_Declarations (Par_Scope);
6180
6181                --  Freeze the underlying record view, to prevent generation of
6182                --  useless dispatching information, which is simply shared with
6183                --  the real derived type.
6184
6185                Set_Is_Frozen (Full_Der);
6186
6187                --  Set up links between real entity and underlying record view
6188
6189                Set_Underlying_Record_View (Derived_Type, Base_Type (Full_Der));
6190                Set_Underlying_Record_View (Base_Type (Full_Der), Derived_Type);
6191             end;
6192
6193          --  If discriminants are known, build derived record
6194
6195          else
6196             Build_Derived_Record_Type
6197               (N, Parent_Type, Derived_Type, Derive_Subps);
6198          end if;
6199
6200          return;
6201
6202       elsif Has_Discriminants (Parent_Type) then
6203          if Present (Full_View (Parent_Type)) then
6204             if not Is_Completion then
6205
6206                --  Copy declaration for subsequent analysis, to provide a
6207                --  completion for what is a private declaration. Indicate that
6208                --  the full type is internally generated.
6209
6210                Full_Decl := New_Copy_Tree (N);
6211                Full_Der  := New_Copy (Derived_Type);
6212                Set_Comes_From_Source (Full_Decl, False);
6213                Set_Comes_From_Source (Full_Der, False);
6214                Set_Parent (Full_Der, Full_Decl);
6215
6216                Insert_After (N, Full_Decl);
6217
6218             else
6219                --  If this is a completion, the full view being built is itself
6220                --  private. We build a subtype of the parent with the same
6221                --  constraints as this full view, to convey to the back end the
6222                --  constrained components and the size of this subtype. If the
6223                --  parent is constrained, its full view can serve as the
6224                --  underlying full view of the derived type.
6225
6226                if No (Discriminant_Specifications (N)) then
6227                   if Nkind (Subtype_Indication (Type_Definition (N))) =
6228                                                         N_Subtype_Indication
6229                   then
6230                      Build_Underlying_Full_View (N, Derived_Type, Parent_Type);
6231
6232                   elsif Is_Constrained (Full_View (Parent_Type)) then
6233                      Set_Underlying_Full_View
6234                        (Derived_Type, Full_View (Parent_Type));
6235                   end if;
6236
6237                else
6238                   --  If there are new discriminants, the parent subtype is
6239                   --  constrained by them, but it is not clear how to build
6240                   --  the Underlying_Full_View in this case???
6241
6242                   null;
6243                end if;
6244             end if;
6245          end if;
6246
6247          --  Build partial view of derived type from partial view of parent
6248
6249          Build_Derived_Record_Type
6250            (N, Parent_Type, Derived_Type, Derive_Subps);
6251
6252          if Present (Full_View (Parent_Type)) and then not Is_Completion then
6253             if not In_Open_Scopes (Par_Scope)
6254               or else not In_Same_Source_Unit (N, Parent_Type)
6255             then
6256                --  Swap partial and full views temporarily
6257
6258                Install_Private_Declarations (Par_Scope);
6259                Install_Visible_Declarations (Par_Scope);
6260                Swapped := True;
6261             end if;
6262
6263             --  Build full view of derived type from full view of parent which
6264             --  is now installed. Subprograms have been derived on the partial
6265             --  view, the completion does not derive them anew.
6266
6267             if not Is_Tagged_Type (Parent_Type) then
6268
6269                --  If the parent is itself derived from another private type,
6270                --  installing the private declarations has not affected its
6271                --  privacy status, so use its own full view explicitly.
6272
6273                if Is_Private_Type (Parent_Type) then
6274                   Build_Derived_Record_Type
6275                     (Full_Decl, Full_View (Parent_Type), Full_Der, False);
6276                else
6277                   Build_Derived_Record_Type
6278                     (Full_Decl, Parent_Type, Full_Der, False);
6279                end if;
6280
6281             else
6282                --  If full view of parent is tagged, the completion inherits
6283                --  the proper primitive operations.
6284
6285                Set_Defining_Identifier (Full_Decl, Full_Der);
6286                Build_Derived_Record_Type
6287                  (Full_Decl, Parent_Type, Full_Der, Derive_Subps);
6288             end if;
6289
6290             --  The full declaration has been introduced into the tree and
6291             --  processed in the step above. It should not be analyzed again
6292             --  (when encountered later in the current list of declarations)
6293             --  to prevent spurious name conflicts. The full entity remains
6294             --  invisible.
6295
6296             Set_Analyzed (Full_Decl);
6297
6298             if Swapped then
6299                Uninstall_Declarations (Par_Scope);
6300
6301                if In_Open_Scopes (Par_Scope) then
6302                   Install_Visible_Declarations (Par_Scope);
6303                end if;
6304             end if;
6305
6306             Der_Base := Base_Type (Derived_Type);
6307             Set_Full_View (Derived_Type, Full_Der);
6308             Set_Full_View (Der_Base, Base_Type (Full_Der));
6309
6310             --  Copy the discriminant list from full view to the partial views
6311             --  (base type and its subtype). Gigi requires that the partial and
6312             --  full views have the same discriminants.
6313
6314             --  Note that since the partial view is pointing to discriminants
6315             --  in the full view, their scope will be that of the full view.
6316             --  This might cause some front end problems and need adjustment???
6317
6318             Discr := First_Discriminant (Base_Type (Full_Der));
6319             Set_First_Entity (Der_Base, Discr);
6320
6321             loop
6322                Last_Discr := Discr;
6323                Next_Discriminant (Discr);
6324                exit when No (Discr);
6325             end loop;
6326
6327             Set_Last_Entity (Der_Base, Last_Discr);
6328
6329             Set_First_Entity (Derived_Type, First_Entity (Der_Base));
6330             Set_Last_Entity  (Derived_Type, Last_Entity  (Der_Base));
6331             Set_Stored_Constraint (Full_Der, Stored_Constraint (Derived_Type));
6332
6333          else
6334             --  If this is a completion, the derived type stays private and
6335             --  there is no need to create a further full view, except in the
6336             --  unusual case when the derivation is nested within a child unit,
6337             --  see below.
6338
6339             null;
6340          end if;
6341
6342       elsif Present (Full_View (Parent_Type))
6343         and then  Has_Discriminants (Full_View (Parent_Type))
6344       then
6345          if Has_Unknown_Discriminants (Parent_Type)
6346            and then Nkind (Subtype_Indication (Type_Definition (N))) =
6347                                                          N_Subtype_Indication
6348          then
6349             Error_Msg_N
6350               ("cannot constrain type with unknown discriminants",
6351                Subtype_Indication (Type_Definition (N)));
6352             return;
6353          end if;
6354
6355          --  If full view of parent is a record type, build full view as a
6356          --  derivation from the parent's full view. Partial view remains
6357          --  private. For code generation and linking, the full view must have
6358          --  the same public status as the partial one. This full view is only
6359          --  needed if the parent type is in an enclosing scope, so that the
6360          --  full view may actually become visible, e.g. in a child unit. This
6361          --  is both more efficient, and avoids order of freezing problems with
6362          --  the added entities.
6363
6364          if not Is_Private_Type (Full_View (Parent_Type))
6365            and then (In_Open_Scopes (Scope (Parent_Type)))
6366          then
6367             Full_Der :=
6368               Make_Defining_Identifier
6369                 (Sloc (Derived_Type), Chars (Derived_Type));
6370             Set_Is_Itype (Full_Der);
6371             Set_Has_Private_Declaration (Full_Der);
6372             Set_Has_Private_Declaration (Derived_Type);
6373             Set_Associated_Node_For_Itype (Full_Der, N);
6374             Set_Parent (Full_Der, Parent (Derived_Type));
6375             Set_Full_View (Derived_Type, Full_Der);
6376             Set_Is_Public (Full_Der, Is_Public (Derived_Type));
6377             Full_P := Full_View (Parent_Type);
6378             Exchange_Declarations (Parent_Type);
6379             Copy_And_Build;
6380             Exchange_Declarations (Full_P);
6381
6382          else
6383             Build_Derived_Record_Type
6384               (N, Full_View (Parent_Type), Derived_Type,
6385                 Derive_Subps => False);
6386          end if;
6387
6388          --  In any case, the primitive operations are inherited from the
6389          --  parent type, not from the internal full view.
6390
6391          Set_Etype (Base_Type (Derived_Type), Base_Type (Parent_Type));
6392
6393          if Derive_Subps then
6394             Derive_Subprograms (Parent_Type, Derived_Type);
6395          end if;
6396
6397       else
6398          --  Untagged type, No discriminants on either view
6399
6400          if Nkind (Subtype_Indication (Type_Definition (N))) =
6401                                                    N_Subtype_Indication
6402          then
6403             Error_Msg_N
6404               ("illegal constraint on type without discriminants", N);
6405          end if;
6406
6407          if Present (Discriminant_Specifications (N))
6408            and then Present (Full_View (Parent_Type))
6409            and then not Is_Tagged_Type (Full_View (Parent_Type))
6410          then
6411             Error_Msg_N ("cannot add discriminants to untagged type", N);
6412          end if;
6413
6414          Set_Stored_Constraint (Derived_Type, No_Elist);
6415          Set_Is_Constrained    (Derived_Type, Is_Constrained (Parent_Type));
6416          Set_Is_Controlled     (Derived_Type, Is_Controlled  (Parent_Type));
6417          Set_Has_Controlled_Component
6418                                (Derived_Type, Has_Controlled_Component
6419                                                              (Parent_Type));
6420
6421          --  Direct controlled types do not inherit Finalize_Storage_Only flag
6422
6423          if not Is_Controlled  (Parent_Type) then
6424             Set_Finalize_Storage_Only
6425               (Base_Type (Derived_Type), Finalize_Storage_Only (Parent_Type));
6426          end if;
6427
6428          --  Construct the implicit full view by deriving from full view of the
6429          --  parent type. In order to get proper visibility, we install the
6430          --  parent scope and its declarations.
6431
6432          --  ??? If the parent is untagged private and its completion is
6433          --  tagged, this mechanism will not work because we cannot derive from
6434          --  the tagged full view unless we have an extension.
6435
6436          if Present (Full_View (Parent_Type))
6437            and then not Is_Tagged_Type (Full_View (Parent_Type))
6438            and then not Is_Completion
6439          then
6440             Full_Der :=
6441               Make_Defining_Identifier
6442                 (Sloc (Derived_Type), Chars (Derived_Type));
6443             Set_Is_Itype (Full_Der);
6444             Set_Has_Private_Declaration (Full_Der);
6445             Set_Has_Private_Declaration (Derived_Type);
6446             Set_Associated_Node_For_Itype (Full_Der, N);
6447             Set_Parent (Full_Der, Parent (Derived_Type));
6448             Set_Full_View (Derived_Type, Full_Der);
6449
6450             if not In_Open_Scopes (Par_Scope) then
6451                Install_Private_Declarations (Par_Scope);
6452                Install_Visible_Declarations (Par_Scope);
6453                Copy_And_Build;
6454                Uninstall_Declarations (Par_Scope);
6455
6456             --  If parent scope is open and in another unit, and parent has a
6457             --  completion, then the derivation is taking place in the visible
6458             --  part of a child unit. In that case retrieve the full view of
6459             --  the parent momentarily.
6460
6461             elsif not In_Same_Source_Unit (N, Parent_Type) then
6462                Full_P := Full_View (Parent_Type);
6463                Exchange_Declarations (Parent_Type);
6464                Copy_And_Build;
6465                Exchange_Declarations (Full_P);
6466
6467             --  Otherwise it is a local derivation
6468
6469             else
6470                Copy_And_Build;
6471             end if;
6472
6473             Set_Scope                (Full_Der, Current_Scope);
6474             Set_Is_First_Subtype     (Full_Der,
6475                                        Is_First_Subtype (Derived_Type));
6476             Set_Has_Size_Clause      (Full_Der, False);
6477             Set_Has_Alignment_Clause (Full_Der, False);
6478             Set_Next_Entity          (Full_Der, Empty);
6479             Set_Has_Delayed_Freeze   (Full_Der);
6480             Set_Is_Frozen            (Full_Der, False);
6481             Set_Freeze_Node          (Full_Der, Empty);
6482             Set_Depends_On_Private   (Full_Der,
6483                                        Has_Private_Component (Full_Der));
6484             Set_Public_Status        (Full_Der);
6485          end if;
6486       end if;
6487
6488       Set_Has_Unknown_Discriminants (Derived_Type,
6489         Has_Unknown_Discriminants (Parent_Type));
6490
6491       if Is_Private_Type (Derived_Type) then
6492          Set_Private_Dependents (Derived_Type, New_Elmt_List);
6493       end if;
6494
6495       if Is_Private_Type (Parent_Type)
6496         and then Base_Type (Parent_Type) = Parent_Type
6497         and then In_Open_Scopes (Scope (Parent_Type))
6498       then
6499          Append_Elmt (Derived_Type, Private_Dependents (Parent_Type));
6500
6501          if Is_Child_Unit (Scope (Current_Scope))
6502            and then Is_Completion
6503            and then In_Private_Part (Current_Scope)
6504            and then Scope (Parent_Type) /= Current_Scope
6505          then
6506             --  This is the unusual case where a type completed by a private
6507             --  derivation occurs within a package nested in a child unit, and
6508             --  the parent is declared in an ancestor. In this case, the full
6509             --  view of the parent type will become visible in the body of
6510             --  the enclosing child, and only then will the current type be
6511             --  possibly non-private. We build a underlying full view that
6512             --  will be installed when the enclosing child body is compiled.
6513
6514             Full_Der :=
6515               Make_Defining_Identifier
6516                 (Sloc (Derived_Type), Chars (Derived_Type));
6517             Set_Is_Itype (Full_Der);
6518             Build_Itype_Reference (Full_Der, N);
6519
6520             --  The full view will be used to swap entities on entry/exit to
6521             --  the body, and must appear in the entity list for the package.
6522
6523             Append_Entity (Full_Der, Scope (Derived_Type));
6524             Set_Has_Private_Declaration (Full_Der);
6525             Set_Has_Private_Declaration (Derived_Type);
6526             Set_Associated_Node_For_Itype (Full_Der, N);
6527             Set_Parent (Full_Der, Parent (Derived_Type));
6528             Full_P := Full_View (Parent_Type);
6529             Exchange_Declarations (Parent_Type);
6530             Copy_And_Build;
6531             Exchange_Declarations (Full_P);
6532             Set_Underlying_Full_View (Derived_Type, Full_Der);
6533          end if;
6534       end if;
6535    end Build_Derived_Private_Type;
6536
6537    -------------------------------
6538    -- Build_Derived_Record_Type --
6539    -------------------------------
6540
6541    --  1. INTRODUCTION
6542
6543    --  Ideally we would like to use the same model of type derivation for
6544    --  tagged and untagged record types. Unfortunately this is not quite
6545    --  possible because the semantics of representation clauses is different
6546    --  for tagged and untagged records under inheritance. Consider the
6547    --  following:
6548
6549    --     type R (...) is [tagged] record ... end record;
6550    --     type T (...) is new R (...) [with ...];
6551
6552    --  The representation clauses for T can specify a completely different
6553    --  record layout from R's. Hence the same component can be placed in two
6554    --  very different positions in objects of type T and R. If R and T are
6555    --  tagged types, representation clauses for T can only specify the layout
6556    --  of non inherited components, thus components that are common in R and T
6557    --  have the same position in objects of type R and T.
6558
6559    --  This has two implications. The first is that the entire tree for R's
6560    --  declaration needs to be copied for T in the untagged case, so that T
6561    --  can be viewed as a record type of its own with its own representation
6562    --  clauses. The second implication is the way we handle discriminants.
6563    --  Specifically, in the untagged case we need a way to communicate to Gigi
6564    --  what are the real discriminants in the record, while for the semantics
6565    --  we need to consider those introduced by the user to rename the
6566    --  discriminants in the parent type. This is handled by introducing the
6567    --  notion of stored discriminants. See below for more.
6568
6569    --  Fortunately the way regular components are inherited can be handled in
6570    --  the same way in tagged and untagged types.
6571
6572    --  To complicate things a bit more the private view of a private extension
6573    --  cannot be handled in the same way as the full view (for one thing the
6574    --  semantic rules are somewhat different). We will explain what differs
6575    --  below.
6576
6577    --  2. DISCRIMINANTS UNDER INHERITANCE
6578
6579    --  The semantic rules governing the discriminants of derived types are
6580    --  quite subtle.
6581
6582    --   type Derived_Type_Name [KNOWN_DISCRIMINANT_PART] is new
6583    --      [abstract] Parent_Type_Name [CONSTRAINT] [RECORD_EXTENSION_PART]
6584
6585    --  If parent type has discriminants, then the discriminants that are
6586    --  declared in the derived type are [3.4 (11)]:
6587
6588    --  o The discriminants specified by a new KNOWN_DISCRIMINANT_PART, if
6589    --    there is one;
6590
6591    --  o Otherwise, each discriminant of the parent type (implicitly declared
6592    --    in the same order with the same specifications). In this case, the
6593    --    discriminants are said to be "inherited", or if unknown in the parent
6594    --    are also unknown in the derived type.
6595
6596    --  Furthermore if a KNOWN_DISCRIMINANT_PART is provided, then [3.7(13-18)]:
6597
6598    --  o The parent subtype shall be constrained;
6599
6600    --  o If the parent type is not a tagged type, then each discriminant of
6601    --    the derived type shall be used in the constraint defining a parent
6602    --    subtype. [Implementation note: This ensures that the new discriminant
6603    --    can share storage with an existing discriminant.]
6604
6605    --  For the derived type each discriminant of the parent type is either
6606    --  inherited, constrained to equal some new discriminant of the derived
6607    --  type, or constrained to the value of an expression.
6608
6609    --  When inherited or constrained to equal some new discriminant, the
6610    --  parent discriminant and the discriminant of the derived type are said
6611    --  to "correspond".
6612
6613    --  If a discriminant of the parent type is constrained to a specific value
6614    --  in the derived type definition, then the discriminant is said to be
6615    --  "specified" by that derived type definition.
6616
6617    --  3. DISCRIMINANTS IN DERIVED UNTAGGED RECORD TYPES
6618
6619    --  We have spoken about stored discriminants in point 1 (introduction)
6620    --  above. There are two sort of stored discriminants: implicit and
6621    --  explicit. As long as the derived type inherits the same discriminants as
6622    --  the root record type, stored discriminants are the same as regular
6623    --  discriminants, and are said to be implicit. However, if any discriminant
6624    --  in the root type was renamed in the derived type, then the derived
6625    --  type will contain explicit stored discriminants. Explicit stored
6626    --  discriminants are discriminants in addition to the semantically visible
6627    --  discriminants defined for the derived type. Stored discriminants are
6628    --  used by Gigi to figure out what are the physical discriminants in
6629    --  objects of the derived type (see precise definition in einfo.ads).
6630    --  As an example, consider the following:
6631
6632    --           type R  (D1, D2, D3 : Int) is record ... end record;
6633    --           type T1 is new R;
6634    --           type T2 (X1, X2: Int) is new T1 (X2, 88, X1);
6635    --           type T3 is new T2;
6636    --           type T4 (Y : Int) is new T3 (Y, 99);
6637
6638    --  The following table summarizes the discriminants and stored
6639    --  discriminants in R and T1 through T4.
6640
6641    --   Type      Discrim     Stored Discrim  Comment
6642    --    R      (D1, D2, D3)   (D1, D2, D3)   Girder discrims implicit in R
6643    --    T1     (D1, D2, D3)   (D1, D2, D3)   Girder discrims implicit in T1
6644    --    T2     (X1, X2)       (D1, D2, D3)   Girder discrims EXPLICIT in T2
6645    --    T3     (X1, X2)       (D1, D2, D3)   Girder discrims EXPLICIT in T3
6646    --    T4     (Y)            (D1, D2, D3)   Girder discrims EXPLICIT in T4
6647
6648    --  Field Corresponding_Discriminant (abbreviated CD below) allows us to
6649    --  find the corresponding discriminant in the parent type, while
6650    --  Original_Record_Component (abbreviated ORC below), the actual physical
6651    --  component that is renamed. Finally the field Is_Completely_Hidden
6652    --  (abbreviated ICH below) is set for all explicit stored discriminants
6653    --  (see einfo.ads for more info). For the above example this gives:
6654
6655    --                 Discrim     CD        ORC     ICH
6656    --                 ^^^^^^^     ^^        ^^^     ^^^
6657    --                 D1 in R    empty     itself    no
6658    --                 D2 in R    empty     itself    no
6659    --                 D3 in R    empty     itself    no
6660
6661    --                 D1 in T1  D1 in R    itself    no
6662    --                 D2 in T1  D2 in R    itself    no
6663    --                 D3 in T1  D3 in R    itself    no
6664
6665    --                 X1 in T2  D3 in T1  D3 in T2   no
6666    --                 X2 in T2  D1 in T1  D1 in T2   no
6667    --                 D1 in T2   empty    itself    yes
6668    --                 D2 in T2   empty    itself    yes
6669    --                 D3 in T2   empty    itself    yes
6670
6671    --                 X1 in T3  X1 in T2  D3 in T3   no
6672    --                 X2 in T3  X2 in T2  D1 in T3   no
6673    --                 D1 in T3   empty    itself    yes
6674    --                 D2 in T3   empty    itself    yes
6675    --                 D3 in T3   empty    itself    yes
6676
6677    --                 Y  in T4  X1 in T3  D3 in T3   no
6678    --                 D1 in T3   empty    itself    yes
6679    --                 D2 in T3   empty    itself    yes
6680    --                 D3 in T3   empty    itself    yes
6681
6682    --  4. DISCRIMINANTS IN DERIVED TAGGED RECORD TYPES
6683
6684    --  Type derivation for tagged types is fairly straightforward. If no
6685    --  discriminants are specified by the derived type, these are inherited
6686    --  from the parent. No explicit stored discriminants are ever necessary.
6687    --  The only manipulation that is done to the tree is that of adding a
6688    --  _parent field with parent type and constrained to the same constraint
6689    --  specified for the parent in the derived type definition. For instance:
6690
6691    --           type R  (D1, D2, D3 : Int) is tagged record ... end record;
6692    --           type T1 is new R with null record;
6693    --           type T2 (X1, X2: Int) is new T1 (X2, 88, X1) with null record;
6694
6695    --  are changed into:
6696
6697    --           type T1 (D1, D2, D3 : Int) is new R (D1, D2, D3) with record
6698    --              _parent : R (D1, D2, D3);
6699    --           end record;
6700
6701    --           type T2 (X1, X2: Int) is new T1 (X2, 88, X1) with record
6702    --              _parent : T1 (X2, 88, X1);
6703    --           end record;
6704
6705    --  The discriminants actually present in R, T1 and T2 as well as their CD,
6706    --  ORC and ICH fields are:
6707
6708    --                 Discrim     CD        ORC     ICH
6709    --                 ^^^^^^^     ^^        ^^^     ^^^
6710    --                 D1 in R    empty     itself    no
6711    --                 D2 in R    empty     itself    no
6712    --                 D3 in R    empty     itself    no
6713
6714    --                 D1 in T1  D1 in R    D1 in R   no
6715    --                 D2 in T1  D2 in R    D2 in R   no
6716    --                 D3 in T1  D3 in R    D3 in R   no
6717
6718    --                 X1 in T2  D3 in T1   D3 in R   no
6719    --                 X2 in T2  D1 in T1   D1 in R   no
6720
6721    --  5. FIRST TRANSFORMATION FOR DERIVED RECORDS
6722    --
6723    --  Regardless of whether we dealing with a tagged or untagged type
6724    --  we will transform all derived type declarations of the form
6725    --
6726    --               type T is new R (...) [with ...];
6727    --  or
6728    --               subtype S is R (...);
6729    --               type T is new S [with ...];
6730    --  into
6731    --               type BT is new R [with ...];
6732    --               subtype T is BT (...);
6733    --
6734    --  That is, the base derived type is constrained only if it has no
6735    --  discriminants. The reason for doing this is that GNAT's semantic model
6736    --  assumes that a base type with discriminants is unconstrained.
6737    --
6738    --  Note that, strictly speaking, the above transformation is not always
6739    --  correct. Consider for instance the following excerpt from ACVC b34011a:
6740    --
6741    --       procedure B34011A is
6742    --          type REC (D : integer := 0) is record
6743    --             I : Integer;
6744    --          end record;
6745
6746    --          package P is
6747    --             type T6 is new Rec;
6748    --             function F return T6;
6749    --          end P;
6750
6751    --          use P;
6752    --          package Q6 is
6753    --             type U is new T6 (Q6.F.I);                   -- ERROR: Q6.F.
6754    --          end Q6;
6755    --
6756    --  The definition of Q6.U is illegal. However transforming Q6.U into
6757
6758    --             type BaseU is new T6;
6759    --             subtype U is BaseU (Q6.F.I)
6760
6761    --  turns U into a legal subtype, which is incorrect. To avoid this problem
6762    --  we always analyze the constraint (in this case (Q6.F.I)) before applying
6763    --  the transformation described above.
6764
6765    --  There is another instance where the above transformation is incorrect.
6766    --  Consider:
6767
6768    --          package Pack is
6769    --             type Base (D : Integer) is tagged null record;
6770    --             procedure P (X : Base);
6771
6772    --             type Der is new Base (2) with null record;
6773    --             procedure P (X : Der);
6774    --          end Pack;
6775
6776    --  Then the above transformation turns this into
6777
6778    --             type Der_Base is new Base with null record;
6779    --             --  procedure P (X : Base) is implicitly inherited here
6780    --             --  as procedure P (X : Der_Base).
6781
6782    --             subtype Der is Der_Base (2);
6783    --             procedure P (X : Der);
6784    --             --  The overriding of P (X : Der_Base) is illegal since we
6785    --             --  have a parameter conformance problem.
6786
6787    --  To get around this problem, after having semantically processed Der_Base
6788    --  and the rewritten subtype declaration for Der, we copy Der_Base field
6789    --  Discriminant_Constraint from Der so that when parameter conformance is
6790    --  checked when P is overridden, no semantic errors are flagged.
6791
6792    --  6. SECOND TRANSFORMATION FOR DERIVED RECORDS
6793
6794    --  Regardless of whether we are dealing with a tagged or untagged type
6795    --  we will transform all derived type declarations of the form
6796
6797    --               type R (D1, .., Dn : ...) is [tagged] record ...;
6798    --               type T is new R [with ...];
6799    --  into
6800    --               type T (D1, .., Dn : ...) is new R (D1, .., Dn) [with ...];
6801
6802    --  The reason for such transformation is that it allows us to implement a
6803    --  very clean form of component inheritance as explained below.
6804
6805    --  Note that this transformation is not achieved by direct tree rewriting
6806    --  and manipulation, but rather by redoing the semantic actions that the
6807    --  above transformation will entail. This is done directly in routine
6808    --  Inherit_Components.
6809
6810    --  7. TYPE DERIVATION AND COMPONENT INHERITANCE
6811
6812    --  In both tagged and untagged derived types, regular non discriminant
6813    --  components are inherited in the derived type from the parent type. In
6814    --  the absence of discriminants component, inheritance is straightforward
6815    --  as components can simply be copied from the parent.
6816
6817    --  If the parent has discriminants, inheriting components constrained with
6818    --  these discriminants requires caution. Consider the following example:
6819
6820    --      type R  (D1, D2 : Positive) is [tagged] record
6821    --         S : String (D1 .. D2);
6822    --      end record;
6823
6824    --      type T1                is new R        [with null record];
6825    --      type T2 (X : positive) is new R (1, X) [with null record];
6826
6827    --  As explained in 6. above, T1 is rewritten as
6828    --      type T1 (D1, D2 : Positive) is new R (D1, D2) [with null record];
6829    --  which makes the treatment for T1 and T2 identical.
6830
6831    --  What we want when inheriting S, is that references to D1 and D2 in R are
6832    --  replaced with references to their correct constraints, i.e. D1 and D2 in
6833    --  T1 and 1 and X in T2. So all R's discriminant references are replaced
6834    --  with either discriminant references in the derived type or expressions.
6835    --  This replacement is achieved as follows: before inheriting R's
6836    --  components, a subtype R (D1, D2) for T1 (resp. R (1, X) for T2) is
6837    --  created in the scope of T1 (resp. scope of T2) so that discriminants D1
6838    --  and D2 of T1 are visible (resp. discriminant X of T2 is visible).
6839    --  For T2, for instance, this has the effect of replacing String (D1 .. D2)
6840    --  by String (1 .. X).
6841
6842    --  8. TYPE DERIVATION IN PRIVATE TYPE EXTENSIONS
6843
6844    --  We explain here the rules governing private type extensions relevant to
6845    --  type derivation. These rules are explained on the following example:
6846
6847    --      type D [(...)] is new A [(...)] with private;      <-- partial view
6848    --      type D [(...)] is new P [(...)] with null record;  <-- full view
6849
6850    --  Type A is called the ancestor subtype of the private extension.
6851    --  Type P is the parent type of the full view of the private extension. It
6852    --  must be A or a type derived from A.
6853
6854    --  The rules concerning the discriminants of private type extensions are
6855    --  [7.3(10-13)]:
6856
6857    --  o If a private extension inherits known discriminants from the ancestor
6858    --    subtype, then the full view shall also inherit its discriminants from
6859    --    the ancestor subtype and the parent subtype of the full view shall be
6860    --    constrained if and only if the ancestor subtype is constrained.
6861
6862    --  o If a partial view has unknown discriminants, then the full view may
6863    --    define a definite or an indefinite subtype, with or without
6864    --    discriminants.
6865
6866    --  o If a partial view has neither known nor unknown discriminants, then
6867    --    the full view shall define a definite subtype.
6868
6869    --  o If the ancestor subtype of a private extension has constrained
6870    --    discriminants, then the parent subtype of the full view shall impose a
6871    --    statically matching constraint on those discriminants.
6872
6873    --  This means that only the following forms of private extensions are
6874    --  allowed:
6875
6876    --      type D is new A with private;      <-- partial view
6877    --      type D is new P with null record;  <-- full view
6878
6879    --  If A has no discriminants than P has no discriminants, otherwise P must
6880    --  inherit A's discriminants.
6881
6882    --      type D is new A (...) with private;      <-- partial view
6883    --      type D is new P (:::) with null record;  <-- full view
6884
6885    --  P must inherit A's discriminants and (...) and (:::) must statically
6886    --  match.
6887
6888    --      subtype A is R (...);
6889    --      type D is new A with private;      <-- partial view
6890    --      type D is new P with null record;  <-- full view
6891
6892    --  P must have inherited R's discriminants and must be derived from A or
6893    --  any of its subtypes.
6894
6895    --      type D (..) is new A with private;              <-- partial view
6896    --      type D (..) is new P [(:::)] with null record;  <-- full view
6897
6898    --  No specific constraints on P's discriminants or constraint (:::).
6899    --  Note that A can be unconstrained, but the parent subtype P must either
6900    --  be constrained or (:::) must be present.
6901
6902    --      type D (..) is new A [(...)] with private;      <-- partial view
6903    --      type D (..) is new P [(:::)] with null record;  <-- full view
6904
6905    --  P's constraints on A's discriminants must statically match those
6906    --  imposed by (...).
6907
6908    --  9. IMPLEMENTATION OF TYPE DERIVATION FOR PRIVATE EXTENSIONS
6909
6910    --  The full view of a private extension is handled exactly as described
6911    --  above. The model chose for the private view of a private extension is
6912    --  the same for what concerns discriminants (i.e. they receive the same
6913    --  treatment as in the tagged case). However, the private view of the
6914    --  private extension always inherits the components of the parent base,
6915    --  without replacing any discriminant reference. Strictly speaking this is
6916    --  incorrect. However, Gigi never uses this view to generate code so this
6917    --  is a purely semantic issue. In theory, a set of transformations similar
6918    --  to those given in 5. and 6. above could be applied to private views of
6919    --  private extensions to have the same model of component inheritance as
6920    --  for non private extensions. However, this is not done because it would
6921    --  further complicate private type processing. Semantically speaking, this
6922    --  leaves us in an uncomfortable situation. As an example consider:
6923
6924    --          package Pack is
6925    --             type R (D : integer) is tagged record
6926    --                S : String (1 .. D);
6927    --             end record;
6928    --             procedure P (X : R);
6929    --             type T is new R (1) with private;
6930    --          private
6931    --             type T is new R (1) with null record;
6932    --          end;
6933
6934    --  This is transformed into:
6935
6936    --          package Pack is
6937    --             type R (D : integer) is tagged record
6938    --                S : String (1 .. D);
6939    --             end record;
6940    --             procedure P (X : R);
6941    --             type T is new R (1) with private;
6942    --          private
6943    --             type BaseT is new R with null record;
6944    --             subtype  T is BaseT (1);
6945    --          end;
6946
6947    --  (strictly speaking the above is incorrect Ada)
6948
6949    --  From the semantic standpoint the private view of private extension T
6950    --  should be flagged as constrained since one can clearly have
6951    --
6952    --             Obj : T;
6953    --
6954    --  in a unit withing Pack. However, when deriving subprograms for the
6955    --  private view of private extension T, T must be seen as unconstrained
6956    --  since T has discriminants (this is a constraint of the current
6957    --  subprogram derivation model). Thus, when processing the private view of
6958    --  a private extension such as T, we first mark T as unconstrained, we
6959    --  process it, we perform program derivation and just before returning from
6960    --  Build_Derived_Record_Type we mark T as constrained.
6961
6962    --  ??? Are there are other uncomfortable cases that we will have to
6963    --      deal with.
6964
6965    --  10. RECORD_TYPE_WITH_PRIVATE complications
6966
6967    --  Types that are derived from a visible record type and have a private
6968    --  extension present other peculiarities. They behave mostly like private
6969    --  types, but if they have primitive operations defined, these will not
6970    --  have the proper signatures for further inheritance, because other
6971    --  primitive operations will use the implicit base that we define for
6972    --  private derivations below. This affect subprogram inheritance (see
6973    --  Derive_Subprograms for details). We also derive the implicit base from
6974    --  the base type of the full view, so that the implicit base is a record
6975    --  type and not another private type, This avoids infinite loops.
6976
6977    procedure Build_Derived_Record_Type
6978      (N            : Node_Id;
6979       Parent_Type  : Entity_Id;
6980       Derived_Type : Entity_Id;
6981       Derive_Subps : Boolean := True)
6982    is
6983       Discriminant_Specs : constant Boolean :=
6984                              Present (Discriminant_Specifications (N));
6985       Is_Tagged          : constant Boolean := Is_Tagged_Type (Parent_Type);
6986       Loc                : constant Source_Ptr := Sloc (N);
6987       Private_Extension  : constant Boolean :=
6988                              Nkind (N) = N_Private_Extension_Declaration;
6989       Assoc_List         : Elist_Id;
6990       Constraint_Present : Boolean;
6991       Constrs            : Elist_Id;
6992       Discrim            : Entity_Id;
6993       Indic              : Node_Id;
6994       Inherit_Discrims   : Boolean := False;
6995       Last_Discrim       : Entity_Id;
6996       New_Base           : Entity_Id;
6997       New_Decl           : Node_Id;
6998       New_Discrs         : Elist_Id;
6999       New_Indic          : Node_Id;
7000       Parent_Base        : Entity_Id;
7001       Save_Etype         : Entity_Id;
7002       Save_Discr_Constr  : Elist_Id;
7003       Save_Next_Entity   : Entity_Id;
7004       Type_Def           : Node_Id;
7005
7006       Discs : Elist_Id := New_Elmt_List;
7007       --  An empty Discs list means that there were no constraints in the
7008       --  subtype indication or that there was an error processing it.
7009
7010    begin
7011       if Ekind (Parent_Type) = E_Record_Type_With_Private
7012         and then Present (Full_View (Parent_Type))
7013         and then Has_Discriminants (Parent_Type)
7014       then
7015          Parent_Base := Base_Type (Full_View (Parent_Type));
7016       else
7017          Parent_Base := Base_Type (Parent_Type);
7018       end if;
7019
7020       --  AI05-0115 : if this is a derivation from a private type in some
7021       --  other scope that may lead to invisible components for the derived
7022       --  type, mark it accordingly.
7023
7024       if Is_Private_Type (Parent_Type) then
7025          if Scope (Parent_Type) = Scope (Derived_Type) then
7026             null;
7027
7028          elsif In_Open_Scopes (Scope (Parent_Type))
7029            and then In_Private_Part (Scope (Parent_Type))
7030          then
7031             null;
7032
7033          else
7034             Set_Has_Private_Ancestor (Derived_Type);
7035          end if;
7036
7037       else
7038          Set_Has_Private_Ancestor
7039            (Derived_Type, Has_Private_Ancestor (Parent_Type));
7040       end if;
7041
7042       --  Before we start the previously documented transformations, here is
7043       --  little fix for size and alignment of tagged types. Normally when we
7044       --  derive type D from type P, we copy the size and alignment of P as the
7045       --  default for D, and in the absence of explicit representation clauses
7046       --  for D, the size and alignment are indeed the same as the parent.
7047
7048       --  But this is wrong for tagged types, since fields may be added, and
7049       --  the default size may need to be larger, and the default alignment may
7050       --  need to be larger.
7051
7052       --  We therefore reset the size and alignment fields in the tagged case.
7053       --  Note that the size and alignment will in any case be at least as
7054       --  large as the parent type (since the derived type has a copy of the
7055       --  parent type in the _parent field)
7056
7057       --  The type is also marked as being tagged here, which is needed when
7058       --  processing components with a self-referential anonymous access type
7059       --  in the call to Check_Anonymous_Access_Components below. Note that
7060       --  this flag is also set later on for completeness.
7061
7062       if Is_Tagged then
7063          Set_Is_Tagged_Type (Derived_Type);
7064          Init_Size_Align    (Derived_Type);
7065       end if;
7066
7067       --  STEP 0a: figure out what kind of derived type declaration we have
7068
7069       if Private_Extension then
7070          Type_Def := N;
7071          Set_Ekind (Derived_Type, E_Record_Type_With_Private);
7072
7073       else
7074          Type_Def := Type_Definition (N);
7075
7076          --  Ekind (Parent_Base) is not necessarily E_Record_Type since
7077          --  Parent_Base can be a private type or private extension. However,
7078          --  for tagged types with an extension the newly added fields are
7079          --  visible and hence the Derived_Type is always an E_Record_Type.
7080          --  (except that the parent may have its own private fields).
7081          --  For untagged types we preserve the Ekind of the Parent_Base.
7082
7083          if Present (Record_Extension_Part (Type_Def)) then
7084             Set_Ekind (Derived_Type, E_Record_Type);
7085
7086             --  Create internal access types for components with anonymous
7087             --  access types.
7088
7089             if Ada_Version >= Ada_2005 then
7090                Check_Anonymous_Access_Components
7091                  (N, Derived_Type, Derived_Type,
7092                    Component_List (Record_Extension_Part (Type_Def)));
7093             end if;
7094
7095          else
7096             Set_Ekind (Derived_Type, Ekind (Parent_Base));
7097          end if;
7098       end if;
7099
7100       --  Indic can either be an N_Identifier if the subtype indication
7101       --  contains no constraint or an N_Subtype_Indication if the subtype
7102       --  indication has a constraint.
7103
7104       Indic := Subtype_Indication (Type_Def);
7105       Constraint_Present := (Nkind (Indic) = N_Subtype_Indication);
7106
7107       --  Check that the type has visible discriminants. The type may be
7108       --  a private type with unknown discriminants whose full view has
7109       --  discriminants which are invisible.
7110
7111       if Constraint_Present then
7112          if not Has_Discriminants (Parent_Base)
7113            or else
7114              (Has_Unknown_Discriminants (Parent_Base)
7115                 and then Is_Private_Type (Parent_Base))
7116          then
7117             Error_Msg_N
7118               ("invalid constraint: type has no discriminant",
7119                  Constraint (Indic));
7120
7121             Constraint_Present := False;
7122             Rewrite (Indic, New_Copy_Tree (Subtype_Mark (Indic)));
7123
7124          elsif Is_Constrained (Parent_Type) then
7125             Error_Msg_N
7126                ("invalid constraint: parent type is already constrained",
7127                   Constraint (Indic));
7128
7129             Constraint_Present := False;
7130             Rewrite (Indic, New_Copy_Tree (Subtype_Mark (Indic)));
7131          end if;
7132       end if;
7133
7134       --  STEP 0b: If needed, apply transformation given in point 5. above
7135
7136       if not Private_Extension
7137         and then Has_Discriminants (Parent_Type)
7138         and then not Discriminant_Specs
7139         and then (Is_Constrained (Parent_Type) or else Constraint_Present)
7140       then
7141          --  First, we must analyze the constraint (see comment in point 5.)
7142
7143          if Constraint_Present then
7144             New_Discrs := Build_Discriminant_Constraints (Parent_Type, Indic);
7145
7146             if Has_Discriminants (Derived_Type)
7147               and then Has_Private_Declaration (Derived_Type)
7148               and then Present (Discriminant_Constraint (Derived_Type))
7149             then
7150                --  Verify that constraints of the full view statically match
7151                --  those given in the partial view.
7152
7153                declare
7154                   C1, C2 : Elmt_Id;
7155
7156                begin
7157                   C1 := First_Elmt (New_Discrs);
7158                   C2 := First_Elmt (Discriminant_Constraint (Derived_Type));
7159                   while Present (C1) and then Present (C2) loop
7160                      if Fully_Conformant_Expressions (Node (C1), Node (C2))
7161                        or else
7162                          (Is_OK_Static_Expression (Node (C1))
7163                             and then
7164                           Is_OK_Static_Expression (Node (C2))
7165                             and then
7166                           Expr_Value (Node (C1)) = Expr_Value (Node (C2)))
7167                      then
7168                         null;
7169
7170                      else
7171                         Error_Msg_N (
7172                           "constraint not conformant to previous declaration",
7173                              Node (C1));
7174                      end if;
7175
7176                      Next_Elmt (C1);
7177                      Next_Elmt (C2);
7178                   end loop;
7179                end;
7180             end if;
7181          end if;
7182
7183          --  Insert and analyze the declaration for the unconstrained base type
7184
7185          New_Base := Create_Itype (Ekind (Derived_Type), N, Derived_Type, 'B');
7186
7187          New_Decl :=
7188            Make_Full_Type_Declaration (Loc,
7189               Defining_Identifier => New_Base,
7190               Type_Definition     =>
7191                 Make_Derived_Type_Definition (Loc,
7192                   Abstract_Present      => Abstract_Present (Type_Def),
7193                   Limited_Present       => Limited_Present (Type_Def),
7194                   Subtype_Indication    =>
7195                     New_Occurrence_Of (Parent_Base, Loc),
7196                   Record_Extension_Part =>
7197                     Relocate_Node (Record_Extension_Part (Type_Def)),
7198                   Interface_List        => Interface_List (Type_Def)));
7199
7200          Set_Parent (New_Decl, Parent (N));
7201          Mark_Rewrite_Insertion (New_Decl);
7202          Insert_Before (N, New_Decl);
7203
7204          --  In the extension case, make sure ancestor is frozen appropriately
7205          --  (see also non-discriminated case below).
7206
7207          if Present (Record_Extension_Part (Type_Def))
7208            or else Is_Interface (Parent_Base)
7209          then
7210             Freeze_Before (New_Decl, Parent_Type);
7211          end if;
7212
7213          --  Note that this call passes False for the Derive_Subps parameter
7214          --  because subprogram derivation is deferred until after creating
7215          --  the subtype (see below).
7216
7217          Build_Derived_Type
7218            (New_Decl, Parent_Base, New_Base,
7219             Is_Completion => True, Derive_Subps => False);
7220
7221          --  ??? This needs re-examination to determine whether the
7222          --  above call can simply be replaced by a call to Analyze.
7223
7224          Set_Analyzed (New_Decl);
7225
7226          --  Insert and analyze the declaration for the constrained subtype
7227
7228          if Constraint_Present then
7229             New_Indic :=
7230               Make_Subtype_Indication (Loc,
7231                 Subtype_Mark => New_Occurrence_Of (New_Base, Loc),
7232                 Constraint   => Relocate_Node (Constraint (Indic)));
7233
7234          else
7235             declare
7236                Constr_List : constant List_Id := New_List;
7237                C           : Elmt_Id;
7238                Expr        : Node_Id;
7239
7240             begin
7241                C := First_Elmt (Discriminant_Constraint (Parent_Type));
7242                while Present (C) loop
7243                   Expr := Node (C);
7244
7245                   --  It is safe here to call New_Copy_Tree since
7246                   --  Force_Evaluation was called on each constraint in
7247                   --  Build_Discriminant_Constraints.
7248
7249                   Append (New_Copy_Tree (Expr), To => Constr_List);
7250
7251                   Next_Elmt (C);
7252                end loop;
7253
7254                New_Indic :=
7255                  Make_Subtype_Indication (Loc,
7256                    Subtype_Mark => New_Occurrence_Of (New_Base, Loc),
7257                    Constraint   =>
7258                      Make_Index_Or_Discriminant_Constraint (Loc, Constr_List));
7259             end;
7260          end if;
7261
7262          Rewrite (N,
7263            Make_Subtype_Declaration (Loc,
7264              Defining_Identifier => Derived_Type,
7265              Subtype_Indication  => New_Indic));
7266
7267          Analyze (N);
7268
7269          --  Derivation of subprograms must be delayed until the full subtype
7270          --  has been established, to ensure proper overriding of subprograms
7271          --  inherited by full types. If the derivations occurred as part of
7272          --  the call to Build_Derived_Type above, then the check for type
7273          --  conformance would fail because earlier primitive subprograms
7274          --  could still refer to the full type prior the change to the new
7275          --  subtype and hence would not match the new base type created here.
7276          --  Subprograms are not derived, however, when Derive_Subps is False
7277          --  (since otherwise there could be redundant derivations).
7278
7279          if Derive_Subps then
7280             Derive_Subprograms (Parent_Type, Derived_Type);
7281          end if;
7282
7283          --  For tagged types the Discriminant_Constraint of the new base itype
7284          --  is inherited from the first subtype so that no subtype conformance
7285          --  problem arise when the first subtype overrides primitive
7286          --  operations inherited by the implicit base type.
7287
7288          if Is_Tagged then
7289             Set_Discriminant_Constraint
7290               (New_Base, Discriminant_Constraint (Derived_Type));
7291          end if;
7292
7293          return;
7294       end if;
7295
7296       --  If we get here Derived_Type will have no discriminants or it will be
7297       --  a discriminated unconstrained base type.
7298
7299       --  STEP 1a: perform preliminary actions/checks for derived tagged types
7300
7301       if Is_Tagged then
7302
7303          --  The parent type is frozen for non-private extensions (RM 13.14(7))
7304          --  The declaration of a specific descendant of an interface type
7305          --  freezes the interface type (RM 13.14).
7306
7307          if not Private_Extension or else Is_Interface (Parent_Base) then
7308             Freeze_Before (N, Parent_Type);
7309          end if;
7310
7311          --  In Ada 2005 (AI-344), the restriction that a derived tagged type
7312          --  cannot be declared at a deeper level than its parent type is
7313          --  removed. The check on derivation within a generic body is also
7314          --  relaxed, but there's a restriction that a derived tagged type
7315          --  cannot be declared in a generic body if it's derived directly
7316          --  or indirectly from a formal type of that generic.
7317
7318          if Ada_Version >= Ada_2005 then
7319             if Present (Enclosing_Generic_Body (Derived_Type)) then
7320                declare
7321                   Ancestor_Type : Entity_Id;
7322
7323                begin
7324                   --  Check to see if any ancestor of the derived type is a
7325                   --  formal type.
7326
7327                   Ancestor_Type := Parent_Type;
7328                   while not Is_Generic_Type (Ancestor_Type)
7329                     and then Etype (Ancestor_Type) /= Ancestor_Type
7330                   loop
7331                      Ancestor_Type := Etype (Ancestor_Type);
7332                   end loop;
7333
7334                   --  If the derived type does have a formal type as an
7335                   --  ancestor, then it's an error if the derived type is
7336                   --  declared within the body of the generic unit that
7337                   --  declares the formal type in its generic formal part. It's
7338                   --  sufficient to check whether the ancestor type is declared
7339                   --  inside the same generic body as the derived type (such as
7340                   --  within a nested generic spec), in which case the
7341                   --  derivation is legal. If the formal type is declared
7342                   --  outside of that generic body, then it's guaranteed that
7343                   --  the derived type is declared within the generic body of
7344                   --  the generic unit declaring the formal type.
7345
7346                   if Is_Generic_Type (Ancestor_Type)
7347                     and then Enclosing_Generic_Body (Ancestor_Type) /=
7348                                Enclosing_Generic_Body (Derived_Type)
7349                   then
7350                      Error_Msg_NE
7351                        ("parent type of& must not be descendant of formal type"
7352                           & " of an enclosing generic body",
7353                             Indic, Derived_Type);
7354                   end if;
7355                end;
7356             end if;
7357
7358          elsif Type_Access_Level (Derived_Type) /=
7359                  Type_Access_Level (Parent_Type)
7360            and then not Is_Generic_Type (Derived_Type)
7361          then
7362             if Is_Controlled (Parent_Type) then
7363                Error_Msg_N
7364                  ("controlled type must be declared at the library level",
7365                   Indic);
7366             else
7367                Error_Msg_N
7368                  ("type extension at deeper accessibility level than parent",
7369                   Indic);
7370             end if;
7371
7372          else
7373             declare
7374                GB : constant Node_Id := Enclosing_Generic_Body (Derived_Type);
7375
7376             begin
7377                if Present (GB)
7378                  and then GB /= Enclosing_Generic_Body (Parent_Base)
7379                then
7380                   Error_Msg_NE
7381                     ("parent type of& must not be outside generic body"
7382                        & " (RM 3.9.1(4))",
7383                          Indic, Derived_Type);
7384                end if;
7385             end;
7386          end if;
7387       end if;
7388
7389       --  Ada 2005 (AI-251)
7390
7391       if Ada_Version >= Ada_2005 and then Is_Tagged then
7392
7393          --  "The declaration of a specific descendant of an interface type
7394          --  freezes the interface type" (RM 13.14).
7395
7396          declare
7397             Iface : Node_Id;
7398          begin
7399             if Is_Non_Empty_List (Interface_List (Type_Def)) then
7400                Iface := First (Interface_List (Type_Def));
7401                while Present (Iface) loop
7402                   Freeze_Before (N, Etype (Iface));
7403                   Next (Iface);
7404                end loop;
7405             end if;
7406          end;
7407       end if;
7408
7409       --  STEP 1b : preliminary cleanup of the full view of private types
7410
7411       --  If the type is already marked as having discriminants, then it's the
7412       --  completion of a private type or private extension and we need to
7413       --  retain the discriminants from the partial view if the current
7414       --  declaration has Discriminant_Specifications so that we can verify
7415       --  conformance. However, we must remove any existing components that
7416       --  were inherited from the parent (and attached in Copy_And_Swap)
7417       --  because the full type inherits all appropriate components anyway, and
7418       --  we do not want the partial view's components interfering.
7419
7420       if Has_Discriminants (Derived_Type) and then Discriminant_Specs then
7421          Discrim := First_Discriminant (Derived_Type);
7422          loop
7423             Last_Discrim := Discrim;
7424             Next_Discriminant (Discrim);
7425             exit when No (Discrim);
7426          end loop;
7427
7428          Set_Last_Entity (Derived_Type, Last_Discrim);
7429
7430       --  In all other cases wipe out the list of inherited components (even
7431       --  inherited discriminants), it will be properly rebuilt here.
7432
7433       else
7434          Set_First_Entity (Derived_Type, Empty);
7435          Set_Last_Entity  (Derived_Type, Empty);
7436       end if;
7437
7438       --  STEP 1c: Initialize some flags for the Derived_Type
7439
7440       --  The following flags must be initialized here so that
7441       --  Process_Discriminants can check that discriminants of tagged types do
7442       --  not have a default initial value and that access discriminants are
7443       --  only specified for limited records. For completeness, these flags are
7444       --  also initialized along with all the other flags below.
7445
7446       --  AI-419: Limitedness is not inherited from an interface parent, so to
7447       --  be limited in that case the type must be explicitly declared as
7448       --  limited. However, task and protected interfaces are always limited.
7449
7450       if Limited_Present (Type_Def) then
7451          Set_Is_Limited_Record (Derived_Type);
7452
7453       elsif Is_Limited_Record (Parent_Type)
7454         or else (Present (Full_View (Parent_Type))
7455                    and then Is_Limited_Record (Full_View (Parent_Type)))
7456       then
7457          if not Is_Interface (Parent_Type)
7458            or else Is_Synchronized_Interface (Parent_Type)
7459            or else Is_Protected_Interface (Parent_Type)
7460            or else Is_Task_Interface (Parent_Type)
7461          then
7462             Set_Is_Limited_Record (Derived_Type);
7463          end if;
7464       end if;
7465
7466       --  STEP 2a: process discriminants of derived type if any
7467
7468       Push_Scope (Derived_Type);
7469
7470       if Discriminant_Specs then
7471          Set_Has_Unknown_Discriminants (Derived_Type, False);
7472
7473          --  The following call initializes fields Has_Discriminants and
7474          --  Discriminant_Constraint, unless we are processing the completion
7475          --  of a private type declaration.
7476
7477          Check_Or_Process_Discriminants (N, Derived_Type);
7478
7479          --  For untagged types, the constraint on the Parent_Type must be
7480          --  present and is used to rename the discriminants.
7481
7482          if not Is_Tagged and then not Has_Discriminants (Parent_Type) then
7483             Error_Msg_N ("untagged parent must have discriminants", Indic);
7484
7485          elsif not Is_Tagged and then not Constraint_Present then
7486             Error_Msg_N
7487               ("discriminant constraint needed for derived untagged records",
7488                Indic);
7489
7490          --  Otherwise the parent subtype must be constrained unless we have a
7491          --  private extension.
7492
7493          elsif not Constraint_Present
7494            and then not Private_Extension
7495            and then not Is_Constrained (Parent_Type)
7496          then
7497             Error_Msg_N
7498               ("unconstrained type not allowed in this context", Indic);
7499
7500          elsif Constraint_Present then
7501             --  The following call sets the field Corresponding_Discriminant
7502             --  for the discriminants in the Derived_Type.
7503
7504             Discs := Build_Discriminant_Constraints (Parent_Type, Indic, True);
7505
7506             --  For untagged types all new discriminants must rename
7507             --  discriminants in the parent. For private extensions new
7508             --  discriminants cannot rename old ones (implied by [7.3(13)]).
7509
7510             Discrim := First_Discriminant (Derived_Type);
7511             while Present (Discrim) loop
7512                if not Is_Tagged
7513                  and then No (Corresponding_Discriminant (Discrim))
7514                then
7515                   Error_Msg_N
7516                     ("new discriminants must constrain old ones", Discrim);
7517
7518                elsif Private_Extension
7519                  and then Present (Corresponding_Discriminant (Discrim))
7520                then
7521                   Error_Msg_N
7522                     ("only static constraints allowed for parent"
7523                      & " discriminants in the partial view", Indic);
7524                   exit;
7525                end if;
7526
7527                --  If a new discriminant is used in the constraint, then its
7528                --  subtype must be statically compatible with the parent
7529                --  discriminant's subtype (3.7(15)).
7530
7531                if Present (Corresponding_Discriminant (Discrim))
7532                  and then
7533                    not Subtypes_Statically_Compatible
7534                          (Etype (Discrim),
7535                           Etype (Corresponding_Discriminant (Discrim)))
7536                then
7537                   Error_Msg_N
7538                     ("subtype must be compatible with parent discriminant",
7539                      Discrim);
7540                end if;
7541
7542                Next_Discriminant (Discrim);
7543             end loop;
7544
7545             --  Check whether the constraints of the full view statically
7546             --  match those imposed by the parent subtype [7.3(13)].
7547
7548             if Present (Stored_Constraint (Derived_Type)) then
7549                declare
7550                   C1, C2 : Elmt_Id;
7551
7552                begin
7553                   C1 := First_Elmt (Discs);
7554                   C2 := First_Elmt (Stored_Constraint (Derived_Type));
7555                   while Present (C1) and then Present (C2) loop
7556                      if not
7557                        Fully_Conformant_Expressions (Node (C1), Node (C2))
7558                      then
7559                         Error_Msg_N
7560                           ("not conformant with previous declaration",
7561                            Node (C1));
7562                      end if;
7563
7564                      Next_Elmt (C1);
7565                      Next_Elmt (C2);
7566                   end loop;
7567                end;
7568             end if;
7569          end if;
7570
7571       --  STEP 2b: No new discriminants, inherit discriminants if any
7572
7573       else
7574          if Private_Extension then
7575             Set_Has_Unknown_Discriminants
7576               (Derived_Type,
7577                Has_Unknown_Discriminants (Parent_Type)
7578                  or else Unknown_Discriminants_Present (N));
7579
7580          --  The partial view of the parent may have unknown discriminants,
7581          --  but if the full view has discriminants and the parent type is
7582          --  in scope they must be inherited.
7583
7584          elsif Has_Unknown_Discriminants (Parent_Type)
7585            and then
7586             (not Has_Discriminants (Parent_Type)
7587               or else not In_Open_Scopes (Scope (Parent_Type)))
7588          then
7589             Set_Has_Unknown_Discriminants (Derived_Type);
7590          end if;
7591
7592          if not Has_Unknown_Discriminants (Derived_Type)
7593            and then not Has_Unknown_Discriminants (Parent_Base)
7594            and then Has_Discriminants (Parent_Type)
7595          then
7596             Inherit_Discrims := True;
7597             Set_Has_Discriminants
7598               (Derived_Type, True);
7599             Set_Discriminant_Constraint
7600               (Derived_Type, Discriminant_Constraint (Parent_Base));
7601          end if;
7602
7603          --  The following test is true for private types (remember
7604          --  transformation 5. is not applied to those) and in an error
7605          --  situation.
7606
7607          if Constraint_Present then
7608             Discs := Build_Discriminant_Constraints (Parent_Type, Indic);
7609          end if;
7610
7611          --  For now mark a new derived type as constrained only if it has no
7612          --  discriminants. At the end of Build_Derived_Record_Type we properly
7613          --  set this flag in the case of private extensions. See comments in
7614          --  point 9. just before body of Build_Derived_Record_Type.
7615
7616          Set_Is_Constrained
7617            (Derived_Type,
7618             not (Inherit_Discrims
7619                    or else Has_Unknown_Discriminants (Derived_Type)));
7620       end if;
7621
7622       --  STEP 3: initialize fields of derived type
7623
7624       Set_Is_Tagged_Type    (Derived_Type, Is_Tagged);
7625       Set_Stored_Constraint (Derived_Type, No_Elist);
7626
7627       --  Ada 2005 (AI-251): Private type-declarations can implement interfaces
7628       --  but cannot be interfaces
7629
7630       if not Private_Extension
7631          and then Ekind (Derived_Type) /= E_Private_Type
7632          and then Ekind (Derived_Type) /= E_Limited_Private_Type
7633       then
7634          if Interface_Present (Type_Def) then
7635             Analyze_Interface_Declaration (Derived_Type, Type_Def);
7636          end if;
7637
7638          Set_Interfaces (Derived_Type, No_Elist);
7639       end if;
7640
7641       --  Fields inherited from the Parent_Type
7642
7643       Set_Discard_Names
7644         (Derived_Type, Einfo.Discard_Names  (Parent_Type));
7645       Set_Has_Specified_Layout
7646         (Derived_Type, Has_Specified_Layout (Parent_Type));
7647       Set_Is_Limited_Composite
7648         (Derived_Type, Is_Limited_Composite (Parent_Type));
7649       Set_Is_Private_Composite
7650         (Derived_Type, Is_Private_Composite (Parent_Type));
7651
7652       --  Fields inherited from the Parent_Base
7653
7654       Set_Has_Controlled_Component
7655         (Derived_Type, Has_Controlled_Component (Parent_Base));
7656       Set_Has_Non_Standard_Rep
7657         (Derived_Type, Has_Non_Standard_Rep     (Parent_Base));
7658       Set_Has_Primitive_Operations
7659         (Derived_Type, Has_Primitive_Operations (Parent_Base));
7660
7661       --  Fields inherited from the Parent_Base in the non-private case
7662
7663       if Ekind (Derived_Type) = E_Record_Type then
7664          Set_Has_Complex_Representation
7665            (Derived_Type, Has_Complex_Representation (Parent_Base));
7666       end if;
7667
7668       --  Fields inherited from the Parent_Base for record types
7669
7670       if Is_Record_Type (Derived_Type) then
7671
7672          --  Ekind (Parent_Base) is not necessarily E_Record_Type since
7673          --  Parent_Base can be a private type or private extension.
7674
7675          if Present (Full_View (Parent_Base)) then
7676             Set_OK_To_Reorder_Components
7677               (Derived_Type,
7678                OK_To_Reorder_Components (Full_View (Parent_Base)));
7679             Set_Reverse_Bit_Order
7680               (Derived_Type, Reverse_Bit_Order (Full_View (Parent_Base)));
7681          else
7682             Set_OK_To_Reorder_Components
7683               (Derived_Type, OK_To_Reorder_Components (Parent_Base));
7684             Set_Reverse_Bit_Order
7685               (Derived_Type, Reverse_Bit_Order (Parent_Base));
7686          end if;
7687       end if;
7688
7689       --  Direct controlled types do not inherit Finalize_Storage_Only flag
7690
7691       if not Is_Controlled (Parent_Type) then
7692          Set_Finalize_Storage_Only
7693            (Derived_Type, Finalize_Storage_Only (Parent_Type));
7694       end if;
7695
7696       --  Set fields for private derived types
7697
7698       if Is_Private_Type (Derived_Type) then
7699          Set_Depends_On_Private (Derived_Type, True);
7700          Set_Private_Dependents (Derived_Type, New_Elmt_List);
7701
7702       --  Inherit fields from non private record types. If this is the
7703       --  completion of a derivation from a private type, the parent itself
7704       --  is private, and the attributes come from its full view, which must
7705       --  be present.
7706
7707       else
7708          if Is_Private_Type (Parent_Base)
7709            and then not Is_Record_Type (Parent_Base)
7710          then
7711             Set_Component_Alignment
7712               (Derived_Type, Component_Alignment (Full_View (Parent_Base)));
7713             Set_C_Pass_By_Copy
7714               (Derived_Type, C_Pass_By_Copy      (Full_View (Parent_Base)));
7715          else
7716             Set_Component_Alignment
7717               (Derived_Type, Component_Alignment (Parent_Base));
7718             Set_C_Pass_By_Copy
7719               (Derived_Type, C_Pass_By_Copy      (Parent_Base));
7720          end if;
7721       end if;
7722
7723       --  Set fields for tagged types
7724
7725       if Is_Tagged then
7726          Set_Direct_Primitive_Operations (Derived_Type, New_Elmt_List);
7727
7728          --  All tagged types defined in Ada.Finalization are controlled
7729
7730          if Chars (Scope (Derived_Type)) = Name_Finalization
7731            and then Chars (Scope (Scope (Derived_Type))) = Name_Ada
7732            and then Scope (Scope (Scope (Derived_Type))) = Standard_Standard
7733          then
7734             Set_Is_Controlled (Derived_Type);
7735          else
7736             Set_Is_Controlled (Derived_Type, Is_Controlled (Parent_Base));
7737          end if;
7738
7739          --  Minor optimization: there is no need to generate the class-wide
7740          --  entity associated with an underlying record view.
7741
7742          if not Is_Underlying_Record_View (Derived_Type) then
7743             Make_Class_Wide_Type (Derived_Type);
7744          end if;
7745
7746          Set_Is_Abstract_Type (Derived_Type, Abstract_Present (Type_Def));
7747
7748          if Has_Discriminants (Derived_Type)
7749            and then Constraint_Present
7750          then
7751             Set_Stored_Constraint
7752               (Derived_Type, Expand_To_Stored_Constraint (Parent_Base, Discs));
7753          end if;
7754
7755          if Ada_Version >= Ada_2005 then
7756             declare
7757                Ifaces_List : Elist_Id;
7758
7759             begin
7760                --  Checks rules 3.9.4 (13/2 and 14/2)
7761
7762                if Comes_From_Source (Derived_Type)
7763                  and then not Is_Private_Type (Derived_Type)
7764                  and then Is_Interface (Parent_Type)
7765                  and then not Is_Interface (Derived_Type)
7766                then
7767                   if Is_Task_Interface (Parent_Type) then
7768                      Error_Msg_N
7769                        ("(Ada 2005) task type required (RM 3.9.4 (13.2))",
7770                         Derived_Type);
7771
7772                   elsif Is_Protected_Interface (Parent_Type) then
7773                      Error_Msg_N
7774                        ("(Ada 2005) protected type required (RM 3.9.4 (14.2))",
7775                         Derived_Type);
7776                   end if;
7777                end if;
7778
7779                --  Check ARM rules 3.9.4 (15/2), 9.1 (9.d/2) and 9.4 (11.d/2)
7780
7781                Check_Interfaces (N, Type_Def);
7782
7783                --  Ada 2005 (AI-251): Collect the list of progenitors that are
7784                --  not already in the parents.
7785
7786                Collect_Interfaces
7787                  (T               => Derived_Type,
7788                   Ifaces_List     => Ifaces_List,
7789                   Exclude_Parents => True);
7790
7791                Set_Interfaces (Derived_Type, Ifaces_List);
7792
7793                --  If the derived type is the anonymous type created for
7794                --  a declaration whose parent has a constraint, propagate
7795                --  the interface list to the source type. This must be done
7796                --  prior to the completion of the analysis of the source type
7797                --  because the components in the extension may contain current
7798                --  instances whose legality depends on some ancestor.
7799
7800                if Is_Itype (Derived_Type) then
7801                   declare
7802                      Def : constant Node_Id :=
7803                        Associated_Node_For_Itype (Derived_Type);
7804                   begin
7805                      if Present (Def)
7806                        and then Nkind (Def) = N_Full_Type_Declaration
7807                      then
7808                         Set_Interfaces
7809                           (Defining_Identifier (Def), Ifaces_List);
7810                      end if;
7811                   end;
7812                end if;
7813             end;
7814          end if;
7815
7816       else
7817          Set_Is_Packed (Derived_Type, Is_Packed (Parent_Base));
7818          Set_Has_Non_Standard_Rep
7819                        (Derived_Type, Has_Non_Standard_Rep (Parent_Base));
7820       end if;
7821
7822       --  STEP 4: Inherit components from the parent base and constrain them.
7823       --          Apply the second transformation described in point 6. above.
7824
7825       if (not Is_Empty_Elmt_List (Discs) or else Inherit_Discrims)
7826         or else not Has_Discriminants (Parent_Type)
7827         or else not Is_Constrained (Parent_Type)
7828       then
7829          Constrs := Discs;
7830       else
7831          Constrs := Discriminant_Constraint (Parent_Type);
7832       end if;
7833
7834       Assoc_List :=
7835         Inherit_Components
7836           (N, Parent_Base, Derived_Type, Is_Tagged, Inherit_Discrims, Constrs);
7837
7838       --  STEP 5a: Copy the parent record declaration for untagged types
7839
7840       if not Is_Tagged then
7841
7842          --  Discriminant_Constraint (Derived_Type) has been properly
7843          --  constructed. Save it and temporarily set it to Empty because we
7844          --  do not want the call to New_Copy_Tree below to mess this list.
7845
7846          if Has_Discriminants (Derived_Type) then
7847             Save_Discr_Constr := Discriminant_Constraint (Derived_Type);
7848             Set_Discriminant_Constraint (Derived_Type, No_Elist);
7849          else
7850             Save_Discr_Constr := No_Elist;
7851          end if;
7852
7853          --  Save the Etype field of Derived_Type. It is correctly set now,
7854          --  but the call to New_Copy tree may remap it to point to itself,
7855          --  which is not what we want. Ditto for the Next_Entity field.
7856
7857          Save_Etype       := Etype (Derived_Type);
7858          Save_Next_Entity := Next_Entity (Derived_Type);
7859
7860          --  Assoc_List maps all stored discriminants in the Parent_Base to
7861          --  stored discriminants in the Derived_Type. It is fundamental that
7862          --  no types or itypes with discriminants other than the stored
7863          --  discriminants appear in the entities declared inside
7864          --  Derived_Type, since the back end cannot deal with it.
7865
7866          New_Decl :=
7867            New_Copy_Tree
7868              (Parent (Parent_Base), Map => Assoc_List, New_Sloc => Loc);
7869
7870          --  Restore the fields saved prior to the New_Copy_Tree call
7871          --  and compute the stored constraint.
7872
7873          Set_Etype       (Derived_Type, Save_Etype);
7874          Set_Next_Entity (Derived_Type, Save_Next_Entity);
7875
7876          if Has_Discriminants (Derived_Type) then
7877             Set_Discriminant_Constraint
7878               (Derived_Type, Save_Discr_Constr);
7879             Set_Stored_Constraint
7880               (Derived_Type, Expand_To_Stored_Constraint (Parent_Type, Discs));
7881             Replace_Components (Derived_Type, New_Decl);
7882             Set_Has_Implicit_Dereference
7883               (Derived_Type, Has_Implicit_Dereference (Parent_Type));
7884          end if;
7885
7886          --  Insert the new derived type declaration
7887
7888          Rewrite (N, New_Decl);
7889
7890       --  STEP 5b: Complete the processing for record extensions in generics
7891
7892       --  There is no completion for record extensions declared in the
7893       --  parameter part of a generic, so we need to complete processing for
7894       --  these generic record extensions here. The Record_Type_Definition call
7895       --  will change the Ekind of the components from E_Void to E_Component.
7896
7897       elsif Private_Extension and then Is_Generic_Type (Derived_Type) then
7898          Record_Type_Definition (Empty, Derived_Type);
7899
7900       --  STEP 5c: Process the record extension for non private tagged types
7901
7902       elsif not Private_Extension then
7903
7904          --  Add the _parent field in the derived type
7905
7906          Expand_Record_Extension (Derived_Type, Type_Def);
7907
7908          --  Ada 2005 (AI-251): Addition of the Tag corresponding to all the
7909          --  implemented interfaces if we are in expansion mode
7910
7911          if Expander_Active
7912            and then Has_Interfaces (Derived_Type)
7913          then
7914             Add_Interface_Tag_Components (N, Derived_Type);
7915          end if;
7916
7917          --  Analyze the record extension
7918
7919          Record_Type_Definition
7920            (Record_Extension_Part (Type_Def), Derived_Type);
7921       end if;
7922
7923       End_Scope;
7924
7925       --  Nothing else to do if there is an error in the derivation.
7926       --  An unusual case: the full view may be derived from a type in an
7927       --  instance, when the partial view was used illegally as an actual
7928       --  in that instance, leading to a circular definition.
7929
7930       if Etype (Derived_Type) = Any_Type
7931         or else Etype (Parent_Type) = Derived_Type
7932       then
7933          return;
7934       end if;
7935
7936       --  Set delayed freeze and then derive subprograms, we need to do
7937       --  this in this order so that derived subprograms inherit the
7938       --  derived freeze if necessary.
7939
7940       Set_Has_Delayed_Freeze (Derived_Type);
7941
7942       if Derive_Subps then
7943          Derive_Subprograms (Parent_Type, Derived_Type);
7944       end if;
7945
7946       --  If we have a private extension which defines a constrained derived
7947       --  type mark as constrained here after we have derived subprograms. See
7948       --  comment on point 9. just above the body of Build_Derived_Record_Type.
7949
7950       if Private_Extension and then Inherit_Discrims then
7951          if Constraint_Present and then not Is_Empty_Elmt_List (Discs) then
7952             Set_Is_Constrained          (Derived_Type, True);
7953             Set_Discriminant_Constraint (Derived_Type, Discs);
7954
7955          elsif Is_Constrained (Parent_Type) then
7956             Set_Is_Constrained
7957               (Derived_Type, True);
7958             Set_Discriminant_Constraint
7959               (Derived_Type, Discriminant_Constraint (Parent_Type));
7960          end if;
7961       end if;
7962
7963       --  Update the class-wide type, which shares the now-completed entity
7964       --  list with its specific type. In case of underlying record views,
7965       --  we do not generate the corresponding class wide entity.
7966
7967       if Is_Tagged
7968         and then not Is_Underlying_Record_View (Derived_Type)
7969       then
7970          Set_First_Entity
7971            (Class_Wide_Type (Derived_Type), First_Entity (Derived_Type));
7972          Set_Last_Entity
7973            (Class_Wide_Type (Derived_Type), Last_Entity (Derived_Type));
7974       end if;
7975
7976       --  Update the scope of anonymous access types of discriminants and other
7977       --  components, to prevent scope anomalies in gigi, when the derivation
7978       --  appears in a scope nested within that of the parent.
7979
7980       declare
7981          D : Entity_Id;
7982
7983       begin
7984          D := First_Entity (Derived_Type);
7985          while Present (D) loop
7986             if Ekind_In (D, E_Discriminant, E_Component) then
7987                if Is_Itype (Etype (D))
7988                   and then Ekind (Etype (D)) = E_Anonymous_Access_Type
7989                then
7990                   Set_Scope (Etype (D), Current_Scope);
7991                end if;
7992             end if;
7993
7994             Next_Entity (D);
7995          end loop;
7996       end;
7997    end Build_Derived_Record_Type;
7998
7999    ------------------------
8000    -- Build_Derived_Type --
8001    ------------------------
8002
8003    procedure Build_Derived_Type
8004      (N             : Node_Id;
8005       Parent_Type   : Entity_Id;
8006       Derived_Type  : Entity_Id;
8007       Is_Completion : Boolean;
8008       Derive_Subps  : Boolean := True)
8009    is
8010       Parent_Base : constant Entity_Id := Base_Type (Parent_Type);
8011
8012    begin
8013       --  Set common attributes
8014
8015       Set_Scope          (Derived_Type, Current_Scope);
8016
8017       Set_Ekind          (Derived_Type, Ekind    (Parent_Base));
8018       Set_Etype          (Derived_Type,           Parent_Base);
8019       Set_Has_Task       (Derived_Type, Has_Task (Parent_Base));
8020
8021       Set_Size_Info      (Derived_Type,                 Parent_Type);
8022       Set_RM_Size        (Derived_Type, RM_Size        (Parent_Type));
8023       Set_Is_Controlled  (Derived_Type, Is_Controlled  (Parent_Type));
8024       Set_Is_Tagged_Type (Derived_Type, Is_Tagged_Type (Parent_Type));
8025
8026       --  If the parent type is a private subtype, the convention on the base
8027       --  type may be set in the private part, and not propagated to the
8028       --  subtype until later, so we obtain the convention from the base type.
8029
8030       Set_Convention     (Derived_Type, Convention     (Parent_Base));
8031
8032       --  Propagate invariant information. The new type has invariants if
8033       --  they are inherited from the parent type, and these invariants can
8034       --  be further inherited, so both flags are set.
8035
8036       if Has_Inheritable_Invariants (Parent_Type) then
8037          Set_Has_Inheritable_Invariants (Derived_Type);
8038          Set_Has_Invariants (Derived_Type);
8039       end if;
8040
8041       --  We similarly inherit predicates
8042
8043       if Has_Predicates (Parent_Type) then
8044          Set_Has_Predicates (Derived_Type);
8045       end if;
8046
8047       --  The derived type inherits the representation clauses of the parent.
8048       --  However, for a private type that is completed by a derivation, there
8049       --  may be operation attributes that have been specified already (stream
8050       --  attributes and External_Tag) and those must be provided. Finally,
8051       --  if the partial view is a private extension, the representation items
8052       --  of the parent have been inherited already, and should not be chained
8053       --  twice to the derived type.
8054
8055       if Is_Tagged_Type (Parent_Type)
8056         and then Present (First_Rep_Item (Derived_Type))
8057       then
8058          --  The existing items are either operational items or items inherited
8059          --  from a private extension declaration.
8060
8061          declare
8062             Rep : Node_Id;
8063             --  Used to iterate over representation items of the derived type
8064
8065             Last_Rep : Node_Id;
8066             --  Last representation item of the (non-empty) representation
8067             --  item list of the derived type.
8068
8069             Found : Boolean := False;
8070
8071          begin
8072             Rep      := First_Rep_Item (Derived_Type);
8073             Last_Rep := Rep;
8074             while Present (Rep) loop
8075                if Rep = First_Rep_Item (Parent_Type) then
8076                   Found := True;
8077                   exit;
8078
8079                else
8080                   Rep := Next_Rep_Item (Rep);
8081
8082                   if Present (Rep) then
8083                      Last_Rep := Rep;
8084                   end if;
8085                end if;
8086             end loop;
8087
8088             --  Here if we either encountered the parent type's first rep
8089             --  item on the derived type's rep item list (in which case
8090             --  Found is True, and we have nothing else to do), or if we
8091             --  reached the last rep item of the derived type, which is
8092             --  Last_Rep, in which case we further chain the parent type's
8093             --  rep items to those of the derived type.
8094
8095             if not Found then
8096                Set_Next_Rep_Item (Last_Rep, First_Rep_Item (Parent_Type));
8097             end if;
8098          end;
8099
8100       else
8101          Set_First_Rep_Item (Derived_Type, First_Rep_Item (Parent_Type));
8102       end if;
8103
8104       case Ekind (Parent_Type) is
8105          when Numeric_Kind =>
8106             Build_Derived_Numeric_Type (N, Parent_Type, Derived_Type);
8107
8108          when Array_Kind =>
8109             Build_Derived_Array_Type (N, Parent_Type,  Derived_Type);
8110
8111          when E_Record_Type
8112             | E_Record_Subtype
8113             | Class_Wide_Kind  =>
8114             Build_Derived_Record_Type
8115               (N, Parent_Type, Derived_Type, Derive_Subps);
8116             return;
8117
8118          when Enumeration_Kind =>
8119             Build_Derived_Enumeration_Type (N, Parent_Type, Derived_Type);
8120
8121          when Access_Kind =>
8122             Build_Derived_Access_Type (N, Parent_Type, Derived_Type);
8123
8124          when Incomplete_Or_Private_Kind =>
8125             Build_Derived_Private_Type
8126               (N, Parent_Type, Derived_Type, Is_Completion, Derive_Subps);
8127
8128             --  For discriminated types, the derivation includes deriving
8129             --  primitive operations. For others it is done below.
8130
8131             if Is_Tagged_Type (Parent_Type)
8132               or else Has_Discriminants (Parent_Type)
8133               or else (Present (Full_View (Parent_Type))
8134                         and then Has_Discriminants (Full_View (Parent_Type)))
8135             then
8136                return;
8137             end if;
8138
8139          when Concurrent_Kind =>
8140             Build_Derived_Concurrent_Type (N, Parent_Type, Derived_Type);
8141
8142          when others =>
8143             raise Program_Error;
8144       end case;
8145
8146       if Etype (Derived_Type) = Any_Type then
8147          return;
8148       end if;
8149
8150       --  Set delayed freeze and then derive subprograms, we need to do this
8151       --  in this order so that derived subprograms inherit the derived freeze
8152       --  if necessary.
8153
8154       Set_Has_Delayed_Freeze (Derived_Type);
8155       if Derive_Subps then
8156          Derive_Subprograms (Parent_Type, Derived_Type);
8157       end if;
8158
8159       Set_Has_Primitive_Operations
8160         (Base_Type (Derived_Type), Has_Primitive_Operations (Parent_Type));
8161    end Build_Derived_Type;
8162
8163    -----------------------
8164    -- Build_Discriminal --
8165    -----------------------
8166
8167    procedure Build_Discriminal (Discrim : Entity_Id) is
8168       D_Minal : Entity_Id;
8169       CR_Disc : Entity_Id;
8170
8171    begin
8172       --  A discriminal has the same name as the discriminant
8173
8174       D_Minal := Make_Defining_Identifier (Sloc (Discrim), Chars (Discrim));
8175
8176       Set_Ekind     (D_Minal, E_In_Parameter);
8177       Set_Mechanism (D_Minal, Default_Mechanism);
8178       Set_Etype     (D_Minal, Etype (Discrim));
8179       Set_Scope     (D_Minal, Current_Scope);
8180
8181       Set_Discriminal (Discrim, D_Minal);
8182       Set_Discriminal_Link (D_Minal, Discrim);
8183
8184       --  For task types, build at once the discriminants of the corresponding
8185       --  record, which are needed if discriminants are used in entry defaults
8186       --  and in family bounds.
8187
8188       if Is_Concurrent_Type (Current_Scope)
8189         or else Is_Limited_Type (Current_Scope)
8190       then
8191          CR_Disc := Make_Defining_Identifier (Sloc (Discrim), Chars (Discrim));
8192
8193          Set_Ekind            (CR_Disc, E_In_Parameter);
8194          Set_Mechanism        (CR_Disc, Default_Mechanism);
8195          Set_Etype            (CR_Disc, Etype (Discrim));
8196          Set_Scope            (CR_Disc, Current_Scope);
8197          Set_Discriminal_Link (CR_Disc, Discrim);
8198          Set_CR_Discriminant  (Discrim, CR_Disc);
8199       end if;
8200    end Build_Discriminal;
8201
8202    ------------------------------------
8203    -- Build_Discriminant_Constraints --
8204    ------------------------------------
8205
8206    function Build_Discriminant_Constraints
8207      (T           : Entity_Id;
8208       Def         : Node_Id;
8209       Derived_Def : Boolean := False) return Elist_Id
8210    is
8211       C        : constant Node_Id := Constraint (Def);
8212       Nb_Discr : constant Nat     := Number_Discriminants (T);
8213
8214       Discr_Expr : array (1 .. Nb_Discr) of Node_Id := (others => Empty);
8215       --  Saves the expression corresponding to a given discriminant in T
8216
8217       function Pos_Of_Discr (T : Entity_Id; D : Entity_Id) return Nat;
8218       --  Return the Position number within array Discr_Expr of a discriminant
8219       --  D within the discriminant list of the discriminated type T.
8220
8221       ------------------
8222       -- Pos_Of_Discr --
8223       ------------------
8224
8225       function Pos_Of_Discr (T : Entity_Id; D : Entity_Id) return Nat is
8226          Disc : Entity_Id;
8227
8228       begin
8229          Disc := First_Discriminant (T);
8230          for J in Discr_Expr'Range loop
8231             if Disc = D then
8232                return J;
8233             end if;
8234
8235             Next_Discriminant (Disc);
8236          end loop;
8237
8238          --  Note: Since this function is called on discriminants that are
8239          --  known to belong to the discriminated type, falling through the
8240          --  loop with no match signals an internal compiler error.
8241
8242          raise Program_Error;
8243       end Pos_Of_Discr;
8244
8245       --  Declarations local to Build_Discriminant_Constraints
8246
8247       Discr : Entity_Id;
8248       E     : Entity_Id;
8249       Elist : constant Elist_Id := New_Elmt_List;
8250
8251       Constr   : Node_Id;
8252       Expr     : Node_Id;
8253       Id       : Node_Id;
8254       Position : Nat;
8255       Found    : Boolean;
8256
8257       Discrim_Present : Boolean := False;
8258
8259    --  Start of processing for Build_Discriminant_Constraints
8260
8261    begin
8262       --  The following loop will process positional associations only.
8263       --  For a positional association, the (single) discriminant is
8264       --  implicitly specified by position, in textual order (RM 3.7.2).
8265
8266       Discr  := First_Discriminant (T);
8267       Constr := First (Constraints (C));
8268       for D in Discr_Expr'Range loop
8269          exit when Nkind (Constr) = N_Discriminant_Association;
8270
8271          if No (Constr) then
8272             Error_Msg_N ("too few discriminants given in constraint", C);
8273             return New_Elmt_List;
8274
8275          elsif Nkind (Constr) = N_Range
8276            or else (Nkind (Constr) = N_Attribute_Reference
8277                      and then
8278                     Attribute_Name (Constr) = Name_Range)
8279          then
8280             Error_Msg_N
8281               ("a range is not a valid discriminant constraint", Constr);
8282             Discr_Expr (D) := Error;
8283
8284          else
8285             Analyze_And_Resolve (Constr, Base_Type (Etype (Discr)));
8286             Discr_Expr (D) := Constr;
8287          end if;
8288
8289          Next_Discriminant (Discr);
8290          Next (Constr);
8291       end loop;
8292
8293       if No (Discr) and then Present (Constr) then
8294          Error_Msg_N ("too many discriminants given in constraint", Constr);
8295          return New_Elmt_List;
8296       end if;
8297
8298       --  Named associations can be given in any order, but if both positional
8299       --  and named associations are used in the same discriminant constraint,
8300       --  then positional associations must occur first, at their normal
8301       --  position. Hence once a named association is used, the rest of the
8302       --  discriminant constraint must use only named associations.
8303
8304       while Present (Constr) loop
8305
8306          --  Positional association forbidden after a named association
8307
8308          if Nkind (Constr) /= N_Discriminant_Association then
8309             Error_Msg_N ("positional association follows named one", Constr);
8310             return New_Elmt_List;
8311
8312          --  Otherwise it is a named association
8313
8314          else
8315             --  E records the type of the discriminants in the named
8316             --  association. All the discriminants specified in the same name
8317             --  association must have the same type.
8318
8319             E := Empty;
8320
8321             --  Search the list of discriminants in T to see if the simple name
8322             --  given in the constraint matches any of them.
8323
8324             Id := First (Selector_Names (Constr));
8325             while Present (Id) loop
8326                Found := False;
8327
8328                --  If Original_Discriminant is present, we are processing a
8329                --  generic instantiation and this is an instance node. We need
8330                --  to find the name of the corresponding discriminant in the
8331                --  actual record type T and not the name of the discriminant in
8332                --  the generic formal. Example:
8333
8334                --    generic
8335                --       type G (D : int) is private;
8336                --    package P is
8337                --       subtype W is G (D => 1);
8338                --    end package;
8339                --    type Rec (X : int) is record ... end record;
8340                --    package Q is new P (G => Rec);
8341
8342                --  At the point of the instantiation, formal type G is Rec
8343                --  and therefore when reanalyzing "subtype W is G (D => 1);"
8344                --  which really looks like "subtype W is Rec (D => 1);" at
8345                --  the point of instantiation, we want to find the discriminant
8346                --  that corresponds to D in Rec, i.e. X.
8347
8348                if Present (Original_Discriminant (Id))
8349                  and then In_Instance
8350                then
8351                   Discr := Find_Corresponding_Discriminant (Id, T);
8352                   Found := True;
8353
8354                else
8355                   Discr := First_Discriminant (T);
8356                   while Present (Discr) loop
8357                      if Chars (Discr) = Chars (Id) then
8358                         Found := True;
8359                         exit;
8360                      end if;
8361
8362                      Next_Discriminant (Discr);
8363                   end loop;
8364
8365                   if not Found then
8366                      Error_Msg_N ("& does not match any discriminant", Id);
8367                      return New_Elmt_List;
8368
8369                   --  If the parent type is a generic formal, preserve the
8370                   --  name of the discriminant for subsequent instances.
8371                   --  see comment at the beginning of this if statement.
8372
8373                   elsif Is_Generic_Type (Root_Type (T)) then
8374                      Set_Original_Discriminant (Id, Discr);
8375                   end if;
8376                end if;
8377
8378                Position := Pos_Of_Discr (T, Discr);
8379
8380                if Present (Discr_Expr (Position)) then
8381                   Error_Msg_N ("duplicate constraint for discriminant&", Id);
8382
8383                else
8384                   --  Each discriminant specified in the same named association
8385                   --  must be associated with a separate copy of the
8386                   --  corresponding expression.
8387
8388                   if Present (Next (Id)) then
8389                      Expr := New_Copy_Tree (Expression (Constr));
8390                      Set_Parent (Expr, Parent (Expression (Constr)));
8391                   else
8392                      Expr := Expression (Constr);
8393                   end if;
8394
8395                   Discr_Expr (Position) := Expr;
8396                   Analyze_And_Resolve (Expr, Base_Type (Etype (Discr)));
8397                end if;
8398
8399                --  A discriminant association with more than one discriminant
8400                --  name is only allowed if the named discriminants are all of
8401                --  the same type (RM 3.7.1(8)).
8402
8403                if E = Empty then
8404                   E := Base_Type (Etype (Discr));
8405
8406                elsif Base_Type (Etype (Discr)) /= E then
8407                   Error_Msg_N
8408                     ("all discriminants in an association " &
8409                      "must have the same type", Id);
8410                end if;
8411
8412                Next (Id);
8413             end loop;
8414          end if;
8415
8416          Next (Constr);
8417       end loop;
8418
8419       --  A discriminant constraint must provide exactly one value for each
8420       --  discriminant of the type (RM 3.7.1(8)).
8421
8422       for J in Discr_Expr'Range loop
8423          if No (Discr_Expr (J)) then
8424             Error_Msg_N ("too few discriminants given in constraint", C);
8425             return New_Elmt_List;
8426          end if;
8427       end loop;
8428
8429       --  Determine if there are discriminant expressions in the constraint
8430
8431       for J in Discr_Expr'Range loop
8432          if Denotes_Discriminant
8433               (Discr_Expr (J), Check_Concurrent => True)
8434          then
8435             Discrim_Present := True;
8436          end if;
8437       end loop;
8438
8439       --  Build an element list consisting of the expressions given in the
8440       --  discriminant constraint and apply the appropriate checks. The list
8441       --  is constructed after resolving any named discriminant associations
8442       --  and therefore the expressions appear in the textual order of the
8443       --  discriminants.
8444
8445       Discr := First_Discriminant (T);
8446       for J in Discr_Expr'Range loop
8447          if Discr_Expr (J) /= Error then
8448             Append_Elmt (Discr_Expr (J), Elist);
8449
8450             --  If any of the discriminant constraints is given by a
8451             --  discriminant and we are in a derived type declaration we
8452             --  have a discriminant renaming. Establish link between new
8453             --  and old discriminant.
8454
8455             if Denotes_Discriminant (Discr_Expr (J)) then
8456                if Derived_Def then
8457                   Set_Corresponding_Discriminant
8458                     (Entity (Discr_Expr (J)), Discr);
8459                end if;
8460
8461             --  Force the evaluation of non-discriminant expressions.
8462             --  If we have found a discriminant in the constraint 3.4(26)
8463             --  and 3.8(18) demand that no range checks are performed are
8464             --  after evaluation. If the constraint is for a component
8465             --  definition that has a per-object constraint, expressions are
8466             --  evaluated but not checked either. In all other cases perform
8467             --  a range check.
8468
8469             else
8470                if Discrim_Present then
8471                   null;
8472
8473                elsif Nkind (Parent (Parent (Def))) = N_Component_Declaration
8474                  and then
8475                    Has_Per_Object_Constraint
8476                      (Defining_Identifier (Parent (Parent (Def))))
8477                then
8478                   null;
8479
8480                elsif Is_Access_Type (Etype (Discr)) then
8481                   Apply_Constraint_Check (Discr_Expr (J), Etype (Discr));
8482
8483                else
8484                   Apply_Range_Check (Discr_Expr (J), Etype (Discr));
8485                end if;
8486
8487                Force_Evaluation (Discr_Expr (J));
8488             end if;
8489
8490             --  Check that the designated type of an access discriminant's
8491             --  expression is not a class-wide type unless the discriminant's
8492             --  designated type is also class-wide.
8493
8494             if Ekind (Etype (Discr)) = E_Anonymous_Access_Type
8495               and then not Is_Class_Wide_Type
8496                          (Designated_Type (Etype (Discr)))
8497               and then Etype (Discr_Expr (J)) /= Any_Type
8498               and then Is_Class_Wide_Type
8499                          (Designated_Type (Etype (Discr_Expr (J))))
8500             then
8501                Wrong_Type (Discr_Expr (J), Etype (Discr));
8502
8503             elsif Is_Access_Type (Etype (Discr))
8504               and then not Is_Access_Constant (Etype (Discr))
8505               and then Is_Access_Type (Etype (Discr_Expr (J)))
8506               and then Is_Access_Constant (Etype (Discr_Expr (J)))
8507             then
8508                Error_Msg_NE
8509                  ("constraint for discriminant& must be access to variable",
8510                     Def, Discr);
8511             end if;
8512          end if;
8513
8514          Next_Discriminant (Discr);
8515       end loop;
8516
8517       return Elist;
8518    end Build_Discriminant_Constraints;
8519
8520    ---------------------------------
8521    -- Build_Discriminated_Subtype --
8522    ---------------------------------
8523
8524    procedure Build_Discriminated_Subtype
8525      (T           : Entity_Id;
8526       Def_Id      : Entity_Id;
8527       Elist       : Elist_Id;
8528       Related_Nod : Node_Id;
8529       For_Access  : Boolean := False)
8530    is
8531       Has_Discrs  : constant Boolean := Has_Discriminants (T);
8532       Constrained : constant Boolean :=
8533                       (Has_Discrs
8534                          and then not Is_Empty_Elmt_List (Elist)
8535                          and then not Is_Class_Wide_Type (T))
8536                         or else Is_Constrained (T);
8537
8538    begin
8539       if Ekind (T) = E_Record_Type then
8540          if For_Access then
8541             Set_Ekind (Def_Id, E_Private_Subtype);
8542             Set_Is_For_Access_Subtype (Def_Id, True);
8543          else
8544             Set_Ekind (Def_Id, E_Record_Subtype);
8545          end if;
8546
8547          --  Inherit preelaboration flag from base, for types for which it
8548          --  may have been set: records, private types, protected types.
8549
8550          Set_Known_To_Have_Preelab_Init
8551            (Def_Id, Known_To_Have_Preelab_Init (T));
8552
8553       elsif Ekind (T) = E_Task_Type then
8554          Set_Ekind (Def_Id, E_Task_Subtype);
8555
8556       elsif Ekind (T) = E_Protected_Type then
8557          Set_Ekind (Def_Id, E_Protected_Subtype);
8558          Set_Known_To_Have_Preelab_Init
8559            (Def_Id, Known_To_Have_Preelab_Init (T));
8560
8561       elsif Is_Private_Type (T) then
8562          Set_Ekind (Def_Id, Subtype_Kind (Ekind (T)));
8563          Set_Known_To_Have_Preelab_Init
8564            (Def_Id, Known_To_Have_Preelab_Init (T));
8565
8566       elsif Is_Class_Wide_Type (T) then
8567          Set_Ekind (Def_Id, E_Class_Wide_Subtype);
8568
8569       else
8570          --  Incomplete type. Attach subtype to list of dependents, to be
8571          --  completed with full view of parent type,  unless is it the
8572          --  designated subtype of a record component within an init_proc.
8573          --  This last case arises for a component of an access type whose
8574          --  designated type is incomplete (e.g. a Taft Amendment type).
8575          --  The designated subtype is within an inner scope, and needs no
8576          --  elaboration, because only the access type is needed in the
8577          --  initialization procedure.
8578
8579          Set_Ekind (Def_Id, Ekind (T));
8580
8581          if For_Access and then Within_Init_Proc then
8582             null;
8583          else
8584             Append_Elmt (Def_Id, Private_Dependents (T));
8585          end if;
8586       end if;
8587
8588       Set_Etype             (Def_Id, T);
8589       Init_Size_Align       (Def_Id);
8590       Set_Has_Discriminants (Def_Id, Has_Discrs);
8591       Set_Is_Constrained    (Def_Id, Constrained);
8592
8593       Set_First_Entity      (Def_Id, First_Entity   (T));
8594       Set_Last_Entity       (Def_Id, Last_Entity    (T));
8595       Set_Has_Implicit_Dereference
8596                             (Def_Id, Has_Implicit_Dereference (T));
8597
8598       --  If the subtype is the completion of a private declaration, there may
8599       --  have been representation clauses for the partial view, and they must
8600       --  be preserved. Build_Derived_Type chains the inherited clauses with
8601       --  the ones appearing on the extension. If this comes from a subtype
8602       --  declaration, all clauses are inherited.
8603
8604       if No (First_Rep_Item (Def_Id)) then
8605          Set_First_Rep_Item (Def_Id, First_Rep_Item (T));
8606       end if;
8607
8608       if Is_Tagged_Type (T) then
8609          Set_Is_Tagged_Type (Def_Id);
8610          Make_Class_Wide_Type (Def_Id);
8611       end if;
8612
8613       Set_Stored_Constraint (Def_Id, No_Elist);
8614
8615       if Has_Discrs then
8616          Set_Discriminant_Constraint (Def_Id, Elist);
8617          Set_Stored_Constraint_From_Discriminant_Constraint (Def_Id);
8618       end if;
8619
8620       if Is_Tagged_Type (T) then
8621
8622          --  Ada 2005 (AI-251): In case of concurrent types we inherit the
8623          --  concurrent record type (which has the list of primitive
8624          --  operations).
8625
8626          if Ada_Version >= Ada_2005
8627            and then Is_Concurrent_Type (T)
8628          then
8629             Set_Corresponding_Record_Type (Def_Id,
8630                Corresponding_Record_Type (T));
8631          else
8632             Set_Direct_Primitive_Operations (Def_Id,
8633               Direct_Primitive_Operations (T));
8634          end if;
8635
8636          Set_Is_Abstract_Type (Def_Id, Is_Abstract_Type (T));
8637       end if;
8638
8639       --  Subtypes introduced by component declarations do not need to be
8640       --  marked as delayed, and do not get freeze nodes, because the semantics
8641       --  verifies that the parents of the subtypes are frozen before the
8642       --  enclosing record is frozen.
8643
8644       if not Is_Type (Scope (Def_Id)) then
8645          Set_Depends_On_Private (Def_Id, Depends_On_Private (T));
8646
8647          if Is_Private_Type (T)
8648            and then Present (Full_View (T))
8649          then
8650             Conditional_Delay (Def_Id, Full_View (T));
8651          else
8652             Conditional_Delay (Def_Id, T);
8653          end if;
8654       end if;
8655
8656       if Is_Record_Type (T) then
8657          Set_Is_Limited_Record (Def_Id, Is_Limited_Record (T));
8658
8659          if Has_Discrs
8660             and then not Is_Empty_Elmt_List (Elist)
8661             and then not For_Access
8662          then
8663             Create_Constrained_Components (Def_Id, Related_Nod, T, Elist);
8664          elsif not For_Access then
8665             Set_Cloned_Subtype (Def_Id, T);
8666          end if;
8667       end if;
8668    end Build_Discriminated_Subtype;
8669
8670    ---------------------------
8671    -- Build_Itype_Reference --
8672    ---------------------------
8673
8674    procedure Build_Itype_Reference
8675      (Ityp : Entity_Id;
8676       Nod  : Node_Id)
8677    is
8678       IR : constant Node_Id := Make_Itype_Reference (Sloc (Nod));
8679    begin
8680
8681       --  Itype references are only created for use by the back-end
8682
8683       if Inside_A_Generic then
8684          return;
8685       else
8686          Set_Itype (IR, Ityp);
8687          Insert_After (Nod, IR);
8688       end if;
8689    end Build_Itype_Reference;
8690
8691    ------------------------
8692    -- Build_Scalar_Bound --
8693    ------------------------
8694
8695    function Build_Scalar_Bound
8696      (Bound : Node_Id;
8697       Par_T : Entity_Id;
8698       Der_T : Entity_Id) return Node_Id
8699    is
8700       New_Bound : Entity_Id;
8701
8702    begin
8703       --  Note: not clear why this is needed, how can the original bound
8704       --  be unanalyzed at this point? and if it is, what business do we
8705       --  have messing around with it? and why is the base type of the
8706       --  parent type the right type for the resolution. It probably is
8707       --  not! It is OK for the new bound we are creating, but not for
8708       --  the old one??? Still if it never happens, no problem!
8709
8710       Analyze_And_Resolve (Bound, Base_Type (Par_T));
8711
8712       if Nkind_In (Bound, N_Integer_Literal, N_Real_Literal) then
8713          New_Bound := New_Copy (Bound);
8714          Set_Etype (New_Bound, Der_T);
8715          Set_Analyzed (New_Bound);
8716
8717       elsif Is_Entity_Name (Bound) then
8718          New_Bound := OK_Convert_To (Der_T, New_Copy (Bound));
8719
8720       --  The following is almost certainly wrong. What business do we have
8721       --  relocating a node (Bound) that is presumably still attached to
8722       --  the tree elsewhere???
8723
8724       else
8725          New_Bound := OK_Convert_To (Der_T, Relocate_Node (Bound));
8726       end if;
8727
8728       Set_Etype (New_Bound, Der_T);
8729       return New_Bound;
8730    end Build_Scalar_Bound;
8731
8732    --------------------------------
8733    -- Build_Underlying_Full_View --
8734    --------------------------------
8735
8736    procedure Build_Underlying_Full_View
8737      (N   : Node_Id;
8738       Typ : Entity_Id;
8739       Par : Entity_Id)
8740    is
8741       Loc  : constant Source_Ptr := Sloc (N);
8742       Subt : constant Entity_Id :=
8743                Make_Defining_Identifier
8744                  (Loc, New_External_Name (Chars (Typ), 'S'));
8745
8746       Constr : Node_Id;
8747       Indic  : Node_Id;
8748       C      : Node_Id;
8749       Id     : Node_Id;
8750
8751       procedure Set_Discriminant_Name (Id : Node_Id);
8752       --  If the derived type has discriminants, they may rename discriminants
8753       --  of the parent. When building the full view of the parent, we need to
8754       --  recover the names of the original discriminants if the constraint is
8755       --  given by named associations.
8756
8757       ---------------------------
8758       -- Set_Discriminant_Name --
8759       ---------------------------
8760
8761       procedure Set_Discriminant_Name (Id : Node_Id) is
8762          Disc : Entity_Id;
8763
8764       begin
8765          Set_Original_Discriminant (Id, Empty);
8766
8767          if Has_Discriminants (Typ) then
8768             Disc := First_Discriminant (Typ);
8769             while Present (Disc) loop
8770                if Chars (Disc) = Chars (Id)
8771                  and then Present (Corresponding_Discriminant (Disc))
8772                then
8773                   Set_Chars (Id, Chars (Corresponding_Discriminant (Disc)));
8774                end if;
8775                Next_Discriminant (Disc);
8776             end loop;
8777          end if;
8778       end Set_Discriminant_Name;
8779
8780    --  Start of processing for Build_Underlying_Full_View
8781
8782    begin
8783       if Nkind (N) = N_Full_Type_Declaration then
8784          Constr := Constraint (Subtype_Indication (Type_Definition (N)));
8785
8786       elsif Nkind (N) = N_Subtype_Declaration then
8787          Constr := New_Copy_Tree (Constraint (Subtype_Indication (N)));
8788
8789       elsif Nkind (N) = N_Component_Declaration then
8790          Constr :=
8791            New_Copy_Tree
8792              (Constraint (Subtype_Indication (Component_Definition (N))));
8793
8794       else
8795          raise Program_Error;
8796       end if;
8797
8798       C := First (Constraints (Constr));
8799       while Present (C) loop
8800          if Nkind (C) = N_Discriminant_Association then
8801             Id := First (Selector_Names (C));
8802             while Present (Id) loop
8803                Set_Discriminant_Name (Id);
8804                Next (Id);
8805             end loop;
8806          end if;
8807
8808          Next (C);
8809       end loop;
8810
8811       Indic :=
8812         Make_Subtype_Declaration (Loc,
8813           Defining_Identifier => Subt,
8814           Subtype_Indication  =>
8815             Make_Subtype_Indication (Loc,
8816               Subtype_Mark => New_Reference_To (Par, Loc),
8817               Constraint   => New_Copy_Tree (Constr)));
8818
8819       --  If this is a component subtype for an outer itype, it is not
8820       --  a list member, so simply set the parent link for analysis: if
8821       --  the enclosing type does not need to be in a declarative list,
8822       --  neither do the components.
8823
8824       if Is_List_Member (N)
8825         and then Nkind (N) /= N_Component_Declaration
8826       then
8827          Insert_Before (N, Indic);
8828       else
8829          Set_Parent (Indic, Parent (N));
8830       end if;
8831
8832       Analyze (Indic);
8833       Set_Underlying_Full_View (Typ, Full_View (Subt));
8834    end Build_Underlying_Full_View;
8835
8836    -------------------------------
8837    -- Check_Abstract_Overriding --
8838    -------------------------------
8839
8840    procedure Check_Abstract_Overriding (T : Entity_Id) is
8841       Alias_Subp : Entity_Id;
8842       Elmt       : Elmt_Id;
8843       Op_List    : Elist_Id;
8844       Subp       : Entity_Id;
8845       Type_Def   : Node_Id;
8846
8847       procedure Check_Pragma_Implemented (Subp : Entity_Id);
8848       --  Ada 2012 (AI05-0030): Subprogram Subp overrides an interface routine
8849       --  which has pragma Implemented already set. Check whether Subp's entity
8850       --  kind conforms to the implementation kind of the overridden routine.
8851
8852       procedure Check_Pragma_Implemented
8853         (Subp       : Entity_Id;
8854          Iface_Subp : Entity_Id);
8855       --  Ada 2012 (AI05-0030): Subprogram Subp overrides interface routine
8856       --  Iface_Subp and both entities have pragma Implemented already set on
8857       --  them. Check whether the two implementation kinds are conforming.
8858
8859       procedure Inherit_Pragma_Implemented
8860         (Subp       : Entity_Id;
8861          Iface_Subp : Entity_Id);
8862       --  Ada 2012 (AI05-0030): Interface primitive Subp overrides interface
8863       --  subprogram Iface_Subp which has been marked by pragma Implemented.
8864       --  Propagate the implementation kind of Iface_Subp to Subp.
8865
8866       ------------------------------
8867       -- Check_Pragma_Implemented --
8868       ------------------------------
8869
8870       procedure Check_Pragma_Implemented (Subp : Entity_Id) is
8871          Iface_Alias : constant Entity_Id := Interface_Alias (Subp);
8872          Impl_Kind   : constant Name_Id   := Implementation_Kind (Iface_Alias);
8873          Contr_Typ   : Entity_Id;
8874
8875       begin
8876          --  Subp must have an alias since it is a hidden entity used to link
8877          --  an interface subprogram to its overriding counterpart.
8878
8879          pragma Assert (Present (Alias (Subp)));
8880
8881          --  Extract the type of the controlling formal
8882
8883          Contr_Typ := Etype (First_Formal (Alias (Subp)));
8884
8885          if Is_Concurrent_Record_Type (Contr_Typ) then
8886             Contr_Typ := Corresponding_Concurrent_Type (Contr_Typ);
8887          end if;
8888
8889          --  An interface subprogram whose implementation kind is By_Entry must
8890          --  be implemented by an entry.
8891
8892          if Impl_Kind = Name_By_Entry
8893            and then Ekind (Wrapped_Entity (Alias (Subp))) /= E_Entry
8894          then
8895             Error_Msg_Node_2 := Iface_Alias;
8896             Error_Msg_NE
8897               ("type & must implement abstract subprogram & with an entry",
8898                Alias (Subp), Contr_Typ);
8899
8900          elsif Impl_Kind = Name_By_Protected_Procedure then
8901
8902             --  An interface subprogram whose implementation kind is By_
8903             --  Protected_Procedure cannot be implemented by a primitive
8904             --  procedure of a task type.
8905
8906             if Ekind (Contr_Typ) /= E_Protected_Type then
8907                Error_Msg_Node_2 := Contr_Typ;
8908                Error_Msg_NE
8909                  ("interface subprogram & cannot be implemented by a " &
8910                   "primitive procedure of task type &", Alias (Subp),
8911                   Iface_Alias);
8912
8913             --  An interface subprogram whose implementation kind is By_
8914             --  Protected_Procedure must be implemented by a procedure.
8915
8916             elsif Is_Primitive_Wrapper (Alias (Subp))
8917               and then Ekind (Wrapped_Entity (Alias (Subp))) /= E_Procedure
8918             then
8919                Error_Msg_Node_2 := Iface_Alias;
8920                Error_Msg_NE
8921                  ("type & must implement abstract subprogram & with a " &
8922                   "procedure", Alias (Subp), Contr_Typ);
8923             end if;
8924          end if;
8925       end Check_Pragma_Implemented;
8926
8927       ------------------------------
8928       -- Check_Pragma_Implemented --
8929       ------------------------------
8930
8931       procedure Check_Pragma_Implemented
8932         (Subp       : Entity_Id;
8933          Iface_Subp : Entity_Id)
8934       is
8935          Iface_Kind : constant Name_Id := Implementation_Kind (Iface_Subp);
8936          Subp_Kind  : constant Name_Id := Implementation_Kind (Subp);
8937
8938       begin
8939          --  Ada 2012 (AI05-0030): The implementation kinds of an overridden
8940          --  and overriding subprogram are different. In general this is an
8941          --  error except when the implementation kind of the overridden
8942          --  subprograms is By_Any.
8943
8944          if Iface_Kind /= Subp_Kind
8945            and then Iface_Kind /= Name_By_Any
8946          then
8947             if Iface_Kind = Name_By_Entry then
8948                Error_Msg_N
8949                  ("incompatible implementation kind, overridden subprogram " &
8950                   "is marked By_Entry", Subp);
8951             else
8952                Error_Msg_N
8953                  ("incompatible implementation kind, overridden subprogram " &
8954                   "is marked By_Protected_Procedure", Subp);
8955             end if;
8956          end if;
8957       end Check_Pragma_Implemented;
8958
8959       --------------------------------
8960       -- Inherit_Pragma_Implemented --
8961       --------------------------------
8962
8963       procedure Inherit_Pragma_Implemented
8964         (Subp       : Entity_Id;
8965          Iface_Subp : Entity_Id)
8966       is
8967          Iface_Kind : constant Name_Id    := Implementation_Kind (Iface_Subp);
8968          Loc        : constant Source_Ptr := Sloc (Subp);
8969          Impl_Prag  : Node_Id;
8970
8971       begin
8972          --  Since the implementation kind is stored as a representation item
8973          --  rather than a flag, create a pragma node.
8974
8975          Impl_Prag :=
8976            Make_Pragma (Loc,
8977              Chars => Name_Implemented,
8978              Pragma_Argument_Associations => New_List (
8979                Make_Pragma_Argument_Association (Loc,
8980                  Expression =>
8981                    New_Reference_To (Subp, Loc)),
8982
8983                Make_Pragma_Argument_Association (Loc,
8984                  Expression => Make_Identifier (Loc, Iface_Kind))));
8985
8986          --  The pragma doesn't need to be analyzed because it is internally
8987          --  build. It is safe to directly register it as a rep item since we
8988          --  are only interested in the characters of the implementation kind.
8989
8990          Record_Rep_Item (Subp, Impl_Prag);
8991       end Inherit_Pragma_Implemented;
8992
8993    --  Start of processing for Check_Abstract_Overriding
8994
8995    begin
8996       Op_List := Primitive_Operations (T);
8997
8998       --  Loop to check primitive operations
8999
9000       Elmt := First_Elmt (Op_List);
9001       while Present (Elmt) loop
9002          Subp := Node (Elmt);
9003          Alias_Subp := Alias (Subp);
9004
9005          --  Inherited subprograms are identified by the fact that they do not
9006          --  come from source, and the associated source location is the
9007          --  location of the first subtype of the derived type.
9008
9009          --  Ada 2005 (AI-228): Apply the rules of RM-3.9.3(6/2) for
9010          --  subprograms that "require overriding".
9011
9012          --  Special exception, do not complain about failure to override the
9013          --  stream routines _Input and _Output, as well as the primitive
9014          --  operations used in dispatching selects since we always provide
9015          --  automatic overridings for these subprograms.
9016
9017          --  Also ignore this rule for convention CIL since .NET libraries
9018          --  do bizarre things with interfaces???
9019
9020          --  The partial view of T may have been a private extension, for
9021          --  which inherited functions dispatching on result are abstract.
9022          --  If the full view is a null extension, there is no need for
9023          --  overriding in Ada2005, but wrappers need to be built for them
9024          --  (see exp_ch3, Build_Controlling_Function_Wrappers).
9025
9026          if Is_Null_Extension (T)
9027            and then Has_Controlling_Result (Subp)
9028            and then Ada_Version >= Ada_2005
9029            and then Present (Alias_Subp)
9030            and then not Comes_From_Source (Subp)
9031            and then not Is_Abstract_Subprogram (Alias_Subp)
9032            and then not Is_Access_Type (Etype (Subp))
9033          then
9034             null;
9035
9036          --  Ada 2005 (AI-251): Internal entities of interfaces need no
9037          --  processing because this check is done with the aliased
9038          --  entity
9039
9040          elsif Present (Interface_Alias (Subp)) then
9041             null;
9042
9043          elsif (Is_Abstract_Subprogram (Subp)
9044                  or else Requires_Overriding (Subp)
9045                  or else
9046                    (Has_Controlling_Result (Subp)
9047                      and then Present (Alias_Subp)
9048                      and then not Comes_From_Source (Subp)
9049                      and then Sloc (Subp) = Sloc (First_Subtype (T))))
9050            and then not Is_TSS (Subp, TSS_Stream_Input)
9051            and then not Is_TSS (Subp, TSS_Stream_Output)
9052            and then not Is_Abstract_Type (T)
9053            and then Convention (T) /= Convention_CIL
9054            and then not Is_Predefined_Interface_Primitive (Subp)
9055
9056             --  Ada 2005 (AI-251): Do not consider hidden entities associated
9057             --  with abstract interface types because the check will be done
9058             --  with the aliased entity (otherwise we generate a duplicated
9059             --  error message).
9060
9061            and then not Present (Interface_Alias (Subp))
9062          then
9063             if Present (Alias_Subp) then
9064
9065                --  Only perform the check for a derived subprogram when the
9066                --  type has an explicit record extension. This avoids incorrect
9067                --  flagging of abstract subprograms for the case of a type
9068                --  without an extension that is derived from a formal type
9069                --  with a tagged actual (can occur within a private part).
9070
9071                --  Ada 2005 (AI-391): In the case of an inherited function with
9072                --  a controlling result of the type, the rule does not apply if
9073                --  the type is a null extension (unless the parent function
9074                --  itself is abstract, in which case the function must still be
9075                --  be overridden). The expander will generate an overriding
9076                --  wrapper function calling the parent subprogram (see
9077                --  Exp_Ch3.Make_Controlling_Wrapper_Functions).
9078
9079                Type_Def := Type_Definition (Parent (T));
9080
9081                if Nkind (Type_Def) = N_Derived_Type_Definition
9082                  and then Present (Record_Extension_Part (Type_Def))
9083                  and then
9084                    (Ada_Version < Ada_2005
9085                       or else not Is_Null_Extension (T)
9086                       or else Ekind (Subp) = E_Procedure
9087                       or else not Has_Controlling_Result (Subp)
9088                       or else Is_Abstract_Subprogram (Alias_Subp)
9089                       or else Requires_Overriding (Subp)
9090                       or else Is_Access_Type (Etype (Subp)))
9091                then
9092                   --  Avoid reporting error in case of abstract predefined
9093                   --  primitive inherited from interface type because the
9094                   --  body of internally generated predefined primitives
9095                   --  of tagged types are generated later by Freeze_Type
9096
9097                   if Is_Interface (Root_Type (T))
9098                     and then Is_Abstract_Subprogram (Subp)
9099                     and then Is_Predefined_Dispatching_Operation (Subp)
9100                     and then not Comes_From_Source (Ultimate_Alias (Subp))
9101                   then
9102                      null;
9103
9104                   else
9105                      Error_Msg_NE
9106                        ("type must be declared abstract or & overridden",
9107                         T, Subp);
9108
9109                      --  Traverse the whole chain of aliased subprograms to
9110                      --  complete the error notification. This is especially
9111                      --  useful for traceability of the chain of entities when
9112                      --  the subprogram corresponds with an interface
9113                      --  subprogram (which may be defined in another package).
9114
9115                      if Present (Alias_Subp) then
9116                         declare
9117                            E : Entity_Id;
9118
9119                         begin
9120                            E := Subp;
9121                            while Present (Alias (E)) loop
9122                               Error_Msg_Sloc := Sloc (E);
9123                               Error_Msg_NE
9124                                 ("\& has been inherited #", T, Subp);
9125                               E := Alias (E);
9126                            end loop;
9127
9128                            Error_Msg_Sloc := Sloc (E);
9129
9130                            --  AI05-0068: report if there is an overriding
9131                            --  non-abstract subprogram that is invisible.
9132
9133                            if Is_Hidden (E)
9134                              and then not Is_Abstract_Subprogram (E)
9135                            then
9136                               Error_Msg_NE
9137                                 ("\& subprogram# is not visible",
9138                                  T, Subp);
9139
9140                            else
9141                               Error_Msg_NE
9142                                 ("\& has been inherited from subprogram #",
9143                                  T, Subp);
9144                            end if;
9145                         end;
9146                      end if;
9147                   end if;
9148
9149                --  Ada 2005 (AI-345): Protected or task type implementing
9150                --  abstract interfaces.
9151
9152                elsif Is_Concurrent_Record_Type (T)
9153                  and then Present (Interfaces (T))
9154                then
9155                   --  The controlling formal of Subp must be of mode "out",
9156                   --  "in out" or an access-to-variable to be overridden.
9157
9158                   --  Error message below needs rewording (remember comma
9159                   --  in -gnatj mode) ???
9160
9161                   if Ekind (First_Formal (Subp)) = E_In_Parameter
9162                     and then Ekind (Subp) /= E_Function
9163                   then
9164                      if not Is_Predefined_Dispatching_Operation (Subp) then
9165                         Error_Msg_NE
9166                           ("first formal of & must be of mode `OUT`, " &
9167                            "`IN OUT` or access-to-variable", T, Subp);
9168                         Error_Msg_N
9169                           ("\to be overridden by protected procedure or " &
9170                            "entry (RM 9.4(11.9/2))", T);
9171                      end if;
9172
9173                   --  Some other kind of overriding failure
9174
9175                   else
9176                      Error_Msg_NE
9177                        ("interface subprogram & must be overridden",
9178                         T, Subp);
9179
9180                      --  Examine primitive operations of synchronized type,
9181                      --  to find homonyms that have the wrong profile.
9182
9183                      declare
9184                         Prim : Entity_Id;
9185
9186                      begin
9187                         Prim :=
9188                           First_Entity (Corresponding_Concurrent_Type (T));
9189                         while Present (Prim) loop
9190                            if Chars (Prim) = Chars (Subp) then
9191                               Error_Msg_NE
9192                                 ("profile is not type conformant with "
9193                                    & "prefixed view profile of "
9194                                    & "inherited operation&", Prim, Subp);
9195                            end if;
9196
9197                            Next_Entity (Prim);
9198                         end loop;
9199                      end;
9200                   end if;
9201                end if;
9202
9203             else
9204                Error_Msg_Node_2 := T;
9205                Error_Msg_N
9206                  ("abstract subprogram& not allowed for type&", Subp);
9207
9208                --  Also post unconditional warning on the type (unconditional
9209                --  so that if there are more than one of these cases, we get
9210                --  them all, and not just the first one).
9211
9212                Error_Msg_Node_2 := Subp;
9213                Error_Msg_N ("nonabstract type& has abstract subprogram&!", T);
9214             end if;
9215          end if;
9216
9217          --  Ada 2012 (AI05-0030): Perform some checks related to pragma
9218          --  Implemented
9219
9220          --  Subp is an expander-generated procedure which maps an interface
9221          --  alias to a protected wrapper. The interface alias is flagged by
9222          --  pragma Implemented. Ensure that Subp is a procedure when the
9223          --  implementation kind is By_Protected_Procedure or an entry when
9224          --  By_Entry.
9225
9226          if Ada_Version >= Ada_2012
9227            and then Is_Hidden (Subp)
9228            and then Present (Interface_Alias (Subp))
9229            and then Has_Rep_Pragma (Interface_Alias (Subp), Name_Implemented)
9230          then
9231             Check_Pragma_Implemented (Subp);
9232          end if;
9233
9234          --  Subp is an interface primitive which overrides another interface
9235          --  primitive marked with pragma Implemented.
9236
9237          if Ada_Version >= Ada_2012
9238            and then Present (Overridden_Operation (Subp))
9239            and then Has_Rep_Pragma
9240                       (Overridden_Operation (Subp), Name_Implemented)
9241          then
9242             --  If the overriding routine is also marked by Implemented, check
9243             --  that the two implementation kinds are conforming.
9244
9245             if Has_Rep_Pragma (Subp, Name_Implemented) then
9246                Check_Pragma_Implemented
9247                  (Subp       => Subp,
9248                   Iface_Subp => Overridden_Operation (Subp));
9249
9250             --  Otherwise the overriding routine inherits the implementation
9251             --  kind from the overridden subprogram.
9252
9253             else
9254                Inherit_Pragma_Implemented
9255                  (Subp       => Subp,
9256                   Iface_Subp => Overridden_Operation (Subp));
9257             end if;
9258          end if;
9259
9260          Next_Elmt (Elmt);
9261       end loop;
9262    end Check_Abstract_Overriding;
9263
9264    ------------------------------------------------
9265    -- Check_Access_Discriminant_Requires_Limited --
9266    ------------------------------------------------
9267
9268    procedure Check_Access_Discriminant_Requires_Limited
9269      (D   : Node_Id;
9270       Loc : Node_Id)
9271    is
9272    begin
9273       --  A discriminant_specification for an access discriminant shall appear
9274       --  only in the declaration for a task or protected type, or for a type
9275       --  with the reserved word 'limited' in its definition or in one of its
9276       --  ancestors (RM 3.7(10)).
9277
9278       --  AI-0063: The proper condition is that type must be immutably limited,
9279       --  or else be a partial view.
9280
9281       if Nkind (Discriminant_Type (D)) = N_Access_Definition then
9282          if Is_Immutably_Limited_Type (Current_Scope)
9283            or else
9284              (Nkind (Parent (Current_Scope)) = N_Private_Type_Declaration
9285                and then Limited_Present (Parent (Current_Scope)))
9286          then
9287             null;
9288
9289          else
9290             Error_Msg_N
9291               ("access discriminants allowed only for limited types", Loc);
9292          end if;
9293       end if;
9294    end Check_Access_Discriminant_Requires_Limited;
9295
9296    -----------------------------------
9297    -- Check_Aliased_Component_Types --
9298    -----------------------------------
9299
9300    procedure Check_Aliased_Component_Types (T : Entity_Id) is
9301       C : Entity_Id;
9302
9303    begin
9304       --  ??? Also need to check components of record extensions, but not
9305       --  components of protected types (which are always limited).
9306
9307       --  Ada 2005: AI-363 relaxes this rule, to allow heap objects of such
9308       --  types to be unconstrained. This is safe because it is illegal to
9309       --  create access subtypes to such types with explicit discriminant
9310       --  constraints.
9311
9312       if not Is_Limited_Type (T) then
9313          if Ekind (T) = E_Record_Type then
9314             C := First_Component (T);
9315             while Present (C) loop
9316                if Is_Aliased (C)
9317                  and then Has_Discriminants (Etype (C))
9318                  and then not Is_Constrained (Etype (C))
9319                  and then not In_Instance_Body
9320                  and then Ada_Version < Ada_2005
9321                then
9322                   Error_Msg_N
9323                     ("aliased component must be constrained (RM 3.6(11))",
9324                       C);
9325                end if;
9326
9327                Next_Component (C);
9328             end loop;
9329
9330          elsif Ekind (T) = E_Array_Type then
9331             if Has_Aliased_Components (T)
9332               and then Has_Discriminants (Component_Type (T))
9333               and then not Is_Constrained (Component_Type (T))
9334               and then not In_Instance_Body
9335               and then Ada_Version < Ada_2005
9336             then
9337                Error_Msg_N
9338                  ("aliased component type must be constrained (RM 3.6(11))",
9339                     T);
9340             end if;
9341          end if;
9342       end if;
9343    end Check_Aliased_Component_Types;
9344
9345    ----------------------
9346    -- Check_Completion --
9347    ----------------------
9348
9349    procedure Check_Completion (Body_Id : Node_Id := Empty) is
9350       E : Entity_Id;
9351
9352       procedure Post_Error;
9353       --  Post error message for lack of completion for entity E
9354
9355       ----------------
9356       -- Post_Error --
9357       ----------------
9358
9359       procedure Post_Error is
9360
9361          procedure Missing_Body;
9362          --  Output missing body message
9363
9364          ------------------
9365          -- Missing_Body --
9366          ------------------
9367
9368          procedure Missing_Body is
9369          begin
9370             --  Spec is in same unit, so we can post on spec
9371
9372             if In_Same_Source_Unit (Body_Id, E) then
9373                Error_Msg_N ("missing body for &", E);
9374
9375             --  Spec is in a separate unit, so we have to post on the body
9376
9377             else
9378                Error_Msg_NE ("missing body for & declared#!", Body_Id, E);
9379             end if;
9380          end Missing_Body;
9381
9382       --  Start of processing for Post_Error
9383
9384       begin
9385          if not Comes_From_Source (E) then
9386
9387             if Ekind_In (E, E_Task_Type, E_Protected_Type) then
9388                --  It may be an anonymous protected type created for a
9389                --  single variable. Post error on variable, if present.
9390
9391                declare
9392                   Var : Entity_Id;
9393
9394                begin
9395                   Var := First_Entity (Current_Scope);
9396                   while Present (Var) loop
9397                      exit when Etype (Var) = E
9398                        and then Comes_From_Source (Var);
9399
9400                      Next_Entity (Var);
9401                   end loop;
9402
9403                   if Present (Var) then
9404                      E := Var;
9405                   end if;
9406                end;
9407             end if;
9408          end if;
9409
9410          --  If a generated entity has no completion, then either previous
9411          --  semantic errors have disabled the expansion phase, or else we had
9412          --  missing subunits, or else we are compiling without expansion,
9413          --  or else something is very wrong.
9414
9415          if not Comes_From_Source (E) then
9416             pragma Assert
9417               (Serious_Errors_Detected > 0
9418                 or else Configurable_Run_Time_Violations > 0
9419                 or else Subunits_Missing
9420                 or else not Expander_Active);
9421             return;
9422
9423          --  Here for source entity
9424
9425          else
9426             --  Here if no body to post the error message, so we post the error
9427             --  on the declaration that has no completion. This is not really
9428             --  the right place to post it, think about this later ???
9429
9430             if No (Body_Id) then
9431                if Is_Type (E) then
9432                   Error_Msg_NE
9433                     ("missing full declaration for }", Parent (E), E);
9434                else
9435                   Error_Msg_NE ("missing body for &", Parent (E), E);
9436                end if;
9437
9438             --  Package body has no completion for a declaration that appears
9439             --  in the corresponding spec. Post error on the body, with a
9440             --  reference to the non-completed declaration.
9441
9442             else
9443                Error_Msg_Sloc := Sloc (E);
9444
9445                if Is_Type (E) then
9446                   Error_Msg_NE ("missing full declaration for }!", Body_Id, E);
9447
9448                elsif Is_Overloadable (E)
9449                  and then Current_Entity_In_Scope (E) /= E
9450                then
9451                   --  It may be that the completion is mistyped and appears as
9452                   --  a distinct overloading of the entity.
9453
9454                   declare
9455                      Candidate : constant Entity_Id :=
9456                                    Current_Entity_In_Scope (E);
9457                      Decl      : constant Node_Id :=
9458                                    Unit_Declaration_Node (Candidate);
9459
9460                   begin
9461                      if Is_Overloadable (Candidate)
9462                        and then Ekind (Candidate) = Ekind (E)
9463                        and then Nkind (Decl) = N_Subprogram_Body
9464                        and then Acts_As_Spec (Decl)
9465                      then
9466                         Check_Type_Conformant (Candidate, E);
9467
9468                      else
9469                         Missing_Body;
9470                      end if;
9471                   end;
9472
9473                else
9474                   Missing_Body;
9475                end if;
9476             end if;
9477          end if;
9478       end Post_Error;
9479
9480    --  Start of processing for Check_Completion
9481
9482    begin
9483       E := First_Entity (Current_Scope);
9484       while Present (E) loop
9485          if Is_Intrinsic_Subprogram (E) then
9486             null;
9487
9488          --  The following situation requires special handling: a child unit
9489          --  that appears in the context clause of the body of its parent:
9490
9491          --    procedure Parent.Child (...);
9492
9493          --    with Parent.Child;
9494          --    package body Parent is
9495
9496          --  Here Parent.Child appears as a local entity, but should not be
9497          --  flagged as requiring completion, because it is a compilation
9498          --  unit.
9499
9500          --  Ignore missing completion for a subprogram that does not come from
9501          --  source (including the _Call primitive operation of RAS types,
9502          --  which has to have the flag Comes_From_Source for other purposes):
9503          --  we assume that the expander will provide the missing completion.
9504          --  In case of previous errors, other expansion actions that provide
9505          --  bodies for null procedures with not be invoked, so inhibit message
9506          --  in those cases.
9507          --  Note that E_Operator is not in the list that follows, because
9508          --  this kind is reserved for predefined operators, that are
9509          --  intrinsic and do not need completion.
9510
9511          elsif     Ekind (E) = E_Function
9512            or else Ekind (E) = E_Procedure
9513            or else Ekind (E) = E_Generic_Function
9514            or else Ekind (E) = E_Generic_Procedure
9515          then
9516             if Has_Completion (E) then
9517                null;
9518
9519             elsif Is_Subprogram (E) and then Is_Abstract_Subprogram (E) then
9520                null;
9521
9522             elsif Is_Subprogram (E)
9523               and then (not Comes_From_Source (E)
9524                           or else Chars (E) = Name_uCall)
9525             then
9526                null;
9527
9528             elsif
9529                Nkind (Parent (Unit_Declaration_Node (E))) = N_Compilation_Unit
9530             then
9531                null;
9532
9533             elsif Nkind (Parent (E)) = N_Procedure_Specification
9534               and then Null_Present (Parent (E))
9535               and then Serious_Errors_Detected > 0
9536             then
9537                null;
9538
9539             else
9540                Post_Error;
9541             end if;
9542
9543          elsif Is_Entry (E) then
9544             if not Has_Completion (E) and then
9545               (Ekind (Scope (E)) = E_Protected_Object
9546                 or else Ekind (Scope (E)) = E_Protected_Type)
9547             then
9548                Post_Error;
9549             end if;
9550
9551          elsif Is_Package_Or_Generic_Package (E) then
9552             if Unit_Requires_Body (E) then
9553                if not Has_Completion (E)
9554                  and then Nkind (Parent (Unit_Declaration_Node (E))) /=
9555                                                        N_Compilation_Unit
9556                then
9557                   Post_Error;
9558                end if;
9559
9560             elsif not Is_Child_Unit (E) then
9561                May_Need_Implicit_Body (E);
9562             end if;
9563
9564          elsif Ekind (E) = E_Incomplete_Type
9565            and then No (Underlying_Type (E))
9566          then
9567             Post_Error;
9568
9569          elsif (Ekind (E) = E_Task_Type or else
9570                 Ekind (E) = E_Protected_Type)
9571            and then not Has_Completion (E)
9572          then
9573             Post_Error;
9574
9575          --  A single task declared in the current scope is a constant, verify
9576          --  that the body of its anonymous type is in the same scope. If the
9577          --  task is defined elsewhere, this may be a renaming declaration for
9578          --  which no completion is needed.
9579
9580          elsif Ekind (E) = E_Constant
9581            and then Ekind (Etype (E)) = E_Task_Type
9582            and then not Has_Completion (Etype (E))
9583            and then Scope (Etype (E)) = Current_Scope
9584          then
9585             Post_Error;
9586
9587          elsif Ekind (E) = E_Protected_Object
9588            and then not Has_Completion (Etype (E))
9589          then
9590             Post_Error;
9591
9592          elsif Ekind (E) = E_Record_Type then
9593             if Is_Tagged_Type (E) then
9594                Check_Abstract_Overriding (E);
9595                Check_Conventions (E);
9596             end if;
9597
9598             Check_Aliased_Component_Types (E);
9599
9600          elsif Ekind (E) = E_Array_Type then
9601             Check_Aliased_Component_Types (E);
9602
9603          end if;
9604
9605          Next_Entity (E);
9606       end loop;
9607    end Check_Completion;
9608
9609    ----------------------------
9610    -- Check_Delta_Expression --
9611    ----------------------------
9612
9613    procedure Check_Delta_Expression (E : Node_Id) is
9614    begin
9615       if not (Is_Real_Type (Etype (E))) then
9616          Wrong_Type (E, Any_Real);
9617
9618       elsif not Is_OK_Static_Expression (E) then
9619          Flag_Non_Static_Expr
9620            ("non-static expression used for delta value!", E);
9621
9622       elsif not UR_Is_Positive (Expr_Value_R (E)) then
9623          Error_Msg_N ("delta expression must be positive", E);
9624
9625       else
9626          return;
9627       end if;
9628
9629       --  If any of above errors occurred, then replace the incorrect
9630       --  expression by the real 0.1, which should prevent further errors.
9631
9632       Rewrite (E,
9633         Make_Real_Literal (Sloc (E), Ureal_Tenth));
9634       Analyze_And_Resolve (E, Standard_Float);
9635    end Check_Delta_Expression;
9636
9637    -----------------------------
9638    -- Check_Digits_Expression --
9639    -----------------------------
9640
9641    procedure Check_Digits_Expression (E : Node_Id) is
9642    begin
9643       if not (Is_Integer_Type (Etype (E))) then
9644          Wrong_Type (E, Any_Integer);
9645
9646       elsif not Is_OK_Static_Expression (E) then
9647          Flag_Non_Static_Expr
9648            ("non-static expression used for digits value!", E);
9649
9650       elsif Expr_Value (E) <= 0 then
9651          Error_Msg_N ("digits value must be greater than zero", E);
9652
9653       else
9654          return;
9655       end if;
9656
9657       --  If any of above errors occurred, then replace the incorrect
9658       --  expression by the integer 1, which should prevent further errors.
9659
9660       Rewrite (E, Make_Integer_Literal (Sloc (E), 1));
9661       Analyze_And_Resolve (E, Standard_Integer);
9662
9663    end Check_Digits_Expression;
9664
9665    --------------------------
9666    -- Check_Initialization --
9667    --------------------------
9668
9669    procedure Check_Initialization (T : Entity_Id; Exp : Node_Id) is
9670    begin
9671       if Is_Limited_Type (T)
9672         and then not In_Instance
9673         and then not In_Inlined_Body
9674       then
9675          if not OK_For_Limited_Init (T, Exp) then
9676
9677             --  In GNAT mode, this is just a warning, to allow it to be evilly
9678             --  turned off. Otherwise it is a real error.
9679
9680             if GNAT_Mode then
9681                Error_Msg_N
9682                  ("?cannot initialize entities of limited type!", Exp);
9683
9684             elsif Ada_Version < Ada_2005 then
9685                Error_Msg_N
9686                  ("cannot initialize entities of limited type", Exp);
9687                Explain_Limited_Type (T, Exp);
9688
9689             else
9690                --  Specialize error message according to kind of illegal
9691                --  initial expression.
9692
9693                if Nkind (Exp) = N_Type_Conversion
9694                  and then Nkind (Expression (Exp)) = N_Function_Call
9695                then
9696                   Error_Msg_N
9697                     ("illegal context for call"
9698                       & " to function with limited result", Exp);
9699
9700                else
9701                   Error_Msg_N
9702                     ("initialization of limited object requires aggregate "
9703                       & "or function call",  Exp);
9704                end if;
9705             end if;
9706          end if;
9707       end if;
9708    end Check_Initialization;
9709
9710    ----------------------
9711    -- Check_Interfaces --
9712    ----------------------
9713
9714    procedure Check_Interfaces (N : Node_Id; Def : Node_Id) is
9715       Parent_Type : constant Entity_Id := Etype (Defining_Identifier (N));
9716
9717       Iface       : Node_Id;
9718       Iface_Def   : Node_Id;
9719       Iface_Typ   : Entity_Id;
9720       Parent_Node : Node_Id;
9721
9722       Is_Task : Boolean := False;
9723       --  Set True if parent type or any progenitor is a task interface
9724
9725       Is_Protected : Boolean := False;
9726       --  Set True if parent type or any progenitor is a protected interface
9727
9728       procedure Check_Ifaces (Iface_Def : Node_Id; Error_Node : Node_Id);
9729       --  Check that a progenitor is compatible with declaration.
9730       --  Error is posted on Error_Node.
9731
9732       ------------------
9733       -- Check_Ifaces --
9734       ------------------
9735
9736       procedure Check_Ifaces (Iface_Def : Node_Id; Error_Node : Node_Id) is
9737          Iface_Id : constant Entity_Id :=
9738                       Defining_Identifier (Parent (Iface_Def));
9739          Type_Def : Node_Id;
9740
9741       begin
9742          if Nkind (N) = N_Private_Extension_Declaration then
9743             Type_Def := N;
9744          else
9745             Type_Def := Type_Definition (N);
9746          end if;
9747
9748          if Is_Task_Interface (Iface_Id) then
9749             Is_Task := True;
9750
9751          elsif Is_Protected_Interface (Iface_Id) then
9752             Is_Protected := True;
9753          end if;
9754
9755          if Is_Synchronized_Interface (Iface_Id) then
9756
9757             --  A consequence of 3.9.4 (6/2) and 7.3 (7.2/2) is that a private
9758             --  extension derived from a synchronized interface must explicitly
9759             --  be declared synchronized, because the full view will be a
9760             --  synchronized type.
9761
9762             if Nkind (N) = N_Private_Extension_Declaration then
9763                if not Synchronized_Present (N) then
9764                   Error_Msg_NE
9765                     ("private extension of& must be explicitly synchronized",
9766                       N, Iface_Id);
9767                end if;
9768
9769             --  However, by 3.9.4(16/2), a full type that is a record extension
9770             --  is never allowed to derive from a synchronized interface (note
9771             --  that interfaces must be excluded from this check, because those
9772             --  are represented by derived type definitions in some cases).
9773
9774             elsif Nkind (Type_Definition (N)) = N_Derived_Type_Definition
9775               and then not Interface_Present (Type_Definition (N))
9776             then
9777                Error_Msg_N ("record extension cannot derive from synchronized"
9778                              & " interface", Error_Node);
9779             end if;
9780          end if;
9781
9782          --  Check that the characteristics of the progenitor are compatible
9783          --  with the explicit qualifier in the declaration.
9784          --  The check only applies to qualifiers that come from source.
9785          --  Limited_Present also appears in the declaration of corresponding
9786          --  records, and the check does not apply to them.
9787
9788          if Limited_Present (Type_Def)
9789            and then not
9790              Is_Concurrent_Record_Type (Defining_Identifier (N))
9791          then
9792             if Is_Limited_Interface (Parent_Type)
9793               and then not Is_Limited_Interface (Iface_Id)
9794             then
9795                Error_Msg_NE
9796                  ("progenitor& must be limited interface",
9797                    Error_Node, Iface_Id);
9798
9799             elsif
9800               (Task_Present (Iface_Def)
9801                 or else Protected_Present (Iface_Def)
9802                 or else Synchronized_Present (Iface_Def))
9803               and then Nkind (N) /= N_Private_Extension_Declaration
9804               and then not Error_Posted (N)
9805             then
9806                Error_Msg_NE
9807                  ("progenitor& must be limited interface",
9808                    Error_Node, Iface_Id);
9809             end if;
9810
9811          --  Protected interfaces can only inherit from limited, synchronized
9812          --  or protected interfaces.
9813
9814          elsif Nkind (N) = N_Full_Type_Declaration
9815            and then  Protected_Present (Type_Def)
9816          then
9817             if Limited_Present (Iface_Def)
9818               or else Synchronized_Present (Iface_Def)
9819               or else Protected_Present (Iface_Def)
9820             then
9821                null;
9822
9823             elsif Task_Present (Iface_Def) then
9824                Error_Msg_N ("(Ada 2005) protected interface cannot inherit"
9825                             & " from task interface", Error_Node);
9826
9827             else
9828                Error_Msg_N ("(Ada 2005) protected interface cannot inherit"
9829                             & " from non-limited interface", Error_Node);
9830             end if;
9831
9832          --  Ada 2005 (AI-345): Synchronized interfaces can only inherit from
9833          --  limited and synchronized.
9834
9835          elsif Synchronized_Present (Type_Def) then
9836             if Limited_Present (Iface_Def)
9837               or else Synchronized_Present (Iface_Def)
9838             then
9839                null;
9840
9841             elsif Protected_Present (Iface_Def)
9842               and then Nkind (N) /= N_Private_Extension_Declaration
9843             then
9844                Error_Msg_N ("(Ada 2005) synchronized interface cannot inherit"
9845                             & " from protected interface", Error_Node);
9846
9847             elsif Task_Present (Iface_Def)
9848               and then Nkind (N) /= N_Private_Extension_Declaration
9849             then
9850                Error_Msg_N ("(Ada 2005) synchronized interface cannot inherit"
9851                             & " from task interface", Error_Node);
9852
9853             elsif not Is_Limited_Interface (Iface_Id) then
9854                Error_Msg_N ("(Ada 2005) synchronized interface cannot inherit"
9855                             & " from non-limited interface", Error_Node);
9856             end if;
9857
9858          --  Ada 2005 (AI-345): Task interfaces can only inherit from limited,
9859          --  synchronized or task interfaces.
9860
9861          elsif Nkind (N) = N_Full_Type_Declaration
9862            and then Task_Present (Type_Def)
9863          then
9864             if Limited_Present (Iface_Def)
9865               or else Synchronized_Present (Iface_Def)
9866               or else Task_Present (Iface_Def)
9867             then
9868                null;
9869
9870             elsif Protected_Present (Iface_Def) then
9871                Error_Msg_N ("(Ada 2005) task interface cannot inherit from"
9872                             & " protected interface", Error_Node);
9873
9874             else
9875                Error_Msg_N ("(Ada 2005) task interface cannot inherit from"
9876                             & " non-limited interface", Error_Node);
9877             end if;
9878          end if;
9879       end Check_Ifaces;
9880
9881    --  Start of processing for Check_Interfaces
9882
9883    begin
9884       if Is_Interface (Parent_Type) then
9885          if Is_Task_Interface (Parent_Type) then
9886             Is_Task := True;
9887
9888          elsif Is_Protected_Interface (Parent_Type) then
9889             Is_Protected := True;
9890          end if;
9891       end if;
9892
9893       if Nkind (N) = N_Private_Extension_Declaration then
9894
9895          --  Check that progenitors are compatible with declaration
9896
9897          Iface := First (Interface_List (Def));
9898          while Present (Iface) loop
9899             Iface_Typ := Find_Type_Of_Subtype_Indic (Iface);
9900
9901             Parent_Node := Parent (Base_Type (Iface_Typ));
9902             Iface_Def   := Type_Definition (Parent_Node);
9903
9904             if not Is_Interface (Iface_Typ) then
9905                Diagnose_Interface (Iface, Iface_Typ);
9906
9907             else
9908                Check_Ifaces (Iface_Def, Iface);
9909             end if;
9910
9911             Next (Iface);
9912          end loop;
9913
9914          if Is_Task and Is_Protected then
9915             Error_Msg_N
9916               ("type cannot derive from task and protected interface", N);
9917          end if;
9918
9919          return;
9920       end if;
9921
9922       --  Full type declaration of derived type.
9923       --  Check compatibility with parent if it is interface type
9924
9925       if Nkind (Type_Definition (N)) = N_Derived_Type_Definition
9926         and then Is_Interface (Parent_Type)
9927       then
9928          Parent_Node := Parent (Parent_Type);
9929
9930          --  More detailed checks for interface varieties
9931
9932          Check_Ifaces
9933            (Iface_Def  => Type_Definition (Parent_Node),
9934             Error_Node => Subtype_Indication (Type_Definition (N)));
9935       end if;
9936
9937       Iface := First (Interface_List (Def));
9938       while Present (Iface) loop
9939          Iface_Typ := Find_Type_Of_Subtype_Indic (Iface);
9940
9941          Parent_Node := Parent (Base_Type (Iface_Typ));
9942          Iface_Def   := Type_Definition (Parent_Node);
9943
9944          if not Is_Interface (Iface_Typ) then
9945             Diagnose_Interface (Iface, Iface_Typ);
9946
9947          else
9948             --  "The declaration of a specific descendant of an interface
9949             --   type freezes the interface type" RM 13.14
9950
9951             Freeze_Before (N, Iface_Typ);
9952             Check_Ifaces (Iface_Def, Error_Node => Iface);
9953          end if;
9954
9955          Next (Iface);
9956       end loop;
9957
9958       if Is_Task and Is_Protected then
9959          Error_Msg_N
9960            ("type cannot derive from task and protected interface", N);
9961       end if;
9962    end Check_Interfaces;
9963
9964    ------------------------------------
9965    -- Check_Or_Process_Discriminants --
9966    ------------------------------------
9967
9968    --  If an incomplete or private type declaration was already given for the
9969    --  type, the discriminants may have already been processed if they were
9970    --  present on the incomplete declaration. In this case a full conformance
9971    --  check has been performed in Find_Type_Name, and we then recheck here
9972    --  some properties that can't be checked on the partial view alone.
9973    --  Otherwise we call Process_Discriminants.
9974
9975    procedure Check_Or_Process_Discriminants
9976      (N    : Node_Id;
9977       T    : Entity_Id;
9978       Prev : Entity_Id := Empty)
9979    is
9980    begin
9981       if Has_Discriminants (T) then
9982
9983          --  Discriminants are already set on T if they were already present
9984          --  on the partial view. Make them visible to component declarations.
9985
9986          declare
9987             D : Entity_Id;
9988             --  Discriminant on T (full view) referencing expr on partial view
9989
9990             Prev_D : Entity_Id;
9991             --  Entity of corresponding discriminant on partial view
9992
9993             New_D : Node_Id;
9994             --  Discriminant specification for full view, expression is the
9995             --  syntactic copy on full view (which has been checked for
9996             --  conformance with partial view), only used here to post error
9997             --  message.
9998
9999          begin
10000             D     := First_Discriminant (T);
10001             New_D := First (Discriminant_Specifications (N));
10002             while Present (D) loop
10003                Prev_D := Current_Entity (D);
10004                Set_Current_Entity (D);
10005                Set_Is_Immediately_Visible (D);
10006                Set_Homonym (D, Prev_D);
10007
10008                --  Handle the case where there is an untagged partial view and
10009                --  the full view is tagged: must disallow discriminants with
10010                --  defaults, unless compiling for Ada 2012, which allows a
10011                --  limited tagged type to have defaulted discriminants (see
10012                --  AI05-0214). However, suppress the error here if it was
10013                --  already reported on the default expression of the partial
10014                --  view.
10015
10016                if Is_Tagged_Type (T)
10017                     and then Present (Expression (Parent (D)))
10018                     and then (not Is_Limited_Type (Current_Scope)
10019                                or else Ada_Version < Ada_2012)
10020                     and then not Error_Posted (Expression (Parent (D)))
10021                then
10022                   if Ada_Version >= Ada_2012 then
10023                      Error_Msg_N
10024                        ("discriminants of nonlimited tagged type cannot have"
10025                           & " defaults",
10026                         Expression (New_D));
10027                   else
10028                      Error_Msg_N
10029                        ("discriminants of tagged type cannot have defaults",
10030                         Expression (New_D));
10031                   end if;
10032                end if;
10033
10034                --  Ada 2005 (AI-230): Access discriminant allowed in
10035                --  non-limited record types.
10036
10037                if Ada_Version < Ada_2005 then
10038
10039                   --  This restriction gets applied to the full type here. It
10040                   --  has already been applied earlier to the partial view.
10041
10042                   Check_Access_Discriminant_Requires_Limited (Parent (D), N);
10043                end if;
10044
10045                Next_Discriminant (D);
10046                Next (New_D);
10047             end loop;
10048          end;
10049
10050       elsif Present (Discriminant_Specifications (N)) then
10051          Process_Discriminants (N, Prev);
10052       end if;
10053    end Check_Or_Process_Discriminants;
10054
10055    ----------------------
10056    -- Check_Real_Bound --
10057    ----------------------
10058
10059    procedure Check_Real_Bound (Bound : Node_Id) is
10060    begin
10061       if not Is_Real_Type (Etype (Bound)) then
10062          Error_Msg_N
10063            ("bound in real type definition must be of real type", Bound);
10064
10065       elsif not Is_OK_Static_Expression (Bound) then
10066          Flag_Non_Static_Expr
10067            ("non-static expression used for real type bound!", Bound);
10068
10069       else
10070          return;
10071       end if;
10072
10073       Rewrite
10074         (Bound, Make_Real_Literal (Sloc (Bound), Ureal_0));
10075       Analyze (Bound);
10076       Resolve (Bound, Standard_Float);
10077    end Check_Real_Bound;
10078
10079    ------------------------------
10080    -- Complete_Private_Subtype --
10081    ------------------------------
10082
10083    procedure Complete_Private_Subtype
10084      (Priv        : Entity_Id;
10085       Full        : Entity_Id;
10086       Full_Base   : Entity_Id;
10087       Related_Nod : Node_Id)
10088    is
10089       Save_Next_Entity : Entity_Id;
10090       Save_Homonym     : Entity_Id;
10091
10092    begin
10093       --  Set semantic attributes for (implicit) private subtype completion.
10094       --  If the full type has no discriminants, then it is a copy of the full
10095       --  view of the base. Otherwise, it is a subtype of the base with a
10096       --  possible discriminant constraint. Save and restore the original
10097       --  Next_Entity field of full to ensure that the calls to Copy_Node
10098       --  do not corrupt the entity chain.
10099
10100       --  Note that the type of the full view is the same entity as the type of
10101       --  the partial view. In this fashion, the subtype has access to the
10102       --  correct view of the parent.
10103
10104       Save_Next_Entity := Next_Entity (Full);
10105       Save_Homonym     := Homonym (Priv);
10106
10107       case Ekind (Full_Base) is
10108          when E_Record_Type    |
10109               E_Record_Subtype |
10110               Class_Wide_Kind  |
10111               Private_Kind     |
10112               Task_Kind        |
10113               Protected_Kind   =>
10114             Copy_Node (Priv, Full);
10115
10116             Set_Has_Discriminants  (Full, Has_Discriminants (Full_Base));
10117             Set_First_Entity       (Full, First_Entity (Full_Base));
10118             Set_Last_Entity        (Full, Last_Entity (Full_Base));
10119
10120          when others =>
10121             Copy_Node (Full_Base, Full);
10122             Set_Chars          (Full, Chars (Priv));
10123             Conditional_Delay  (Full, Priv);
10124             Set_Sloc           (Full, Sloc (Priv));
10125       end case;
10126
10127       Set_Next_Entity (Full, Save_Next_Entity);
10128       Set_Homonym     (Full, Save_Homonym);
10129       Set_Associated_Node_For_Itype (Full, Related_Nod);
10130
10131       --  Set common attributes for all subtypes: kind, convention, etc.
10132
10133       Set_Ekind (Full, Subtype_Kind (Ekind (Full_Base)));
10134       Set_Convention (Full, Convention (Full_Base));
10135
10136       --  The Etype of the full view is inconsistent. Gigi needs to see the
10137       --  structural full view,  which is what the current scheme gives:
10138       --  the Etype of the full view is the etype of the full base. However,
10139       --  if the full base is a derived type, the full view then looks like
10140       --  a subtype of the parent, not a subtype of the full base. If instead
10141       --  we write:
10142
10143       --       Set_Etype (Full, Full_Base);
10144
10145       --  then we get inconsistencies in the front-end (confusion between
10146       --  views). Several outstanding bugs are related to this ???
10147
10148       Set_Is_First_Subtype (Full, False);
10149       Set_Scope            (Full, Scope (Priv));
10150       Set_Size_Info        (Full, Full_Base);
10151       Set_RM_Size          (Full, RM_Size (Full_Base));
10152       Set_Is_Itype         (Full);
10153
10154       --  A subtype of a private-type-without-discriminants, whose full-view
10155       --  has discriminants with default expressions, is not constrained!
10156
10157       if not Has_Discriminants (Priv) then
10158          Set_Is_Constrained (Full, Is_Constrained (Full_Base));
10159
10160          if Has_Discriminants (Full_Base) then
10161             Set_Discriminant_Constraint
10162               (Full, Discriminant_Constraint (Full_Base));
10163
10164             --  The partial view may have been indefinite, the full view
10165             --  might not be.
10166
10167             Set_Has_Unknown_Discriminants
10168               (Full, Has_Unknown_Discriminants (Full_Base));
10169          end if;
10170       end if;
10171
10172       Set_First_Rep_Item     (Full, First_Rep_Item (Full_Base));
10173       Set_Depends_On_Private (Full, Has_Private_Component (Full));
10174
10175       --  Freeze the private subtype entity if its parent is delayed, and not
10176       --  already frozen. We skip this processing if the type is an anonymous
10177       --  subtype of a record component, or is the corresponding record of a
10178       --  protected type, since ???
10179
10180       if not Is_Type (Scope (Full)) then
10181          Set_Has_Delayed_Freeze (Full,
10182            Has_Delayed_Freeze (Full_Base)
10183              and then (not Is_Frozen (Full_Base)));
10184       end if;
10185
10186       Set_Freeze_Node (Full, Empty);
10187       Set_Is_Frozen (Full, False);
10188       Set_Full_View (Priv, Full);
10189
10190       if Has_Discriminants (Full) then
10191          Set_Stored_Constraint_From_Discriminant_Constraint (Full);
10192          Set_Stored_Constraint (Priv, Stored_Constraint (Full));
10193
10194          if Has_Unknown_Discriminants (Full) then
10195             Set_Discriminant_Constraint (Full, No_Elist);
10196          end if;
10197       end if;
10198
10199       if Ekind (Full_Base) = E_Record_Type
10200         and then Has_Discriminants (Full_Base)
10201         and then Has_Discriminants (Priv) -- might not, if errors
10202         and then not Has_Unknown_Discriminants (Priv)
10203         and then not Is_Empty_Elmt_List (Discriminant_Constraint (Priv))
10204       then
10205          Create_Constrained_Components
10206            (Full, Related_Nod, Full_Base, Discriminant_Constraint (Priv));
10207
10208       --  If the full base is itself derived from private, build a congruent
10209       --  subtype of its underlying type, for use by the back end. For a
10210       --  constrained record component, the declaration cannot be placed on
10211       --  the component list, but it must nevertheless be built an analyzed, to
10212       --  supply enough information for Gigi to compute the size of component.
10213
10214       elsif Ekind (Full_Base) in Private_Kind
10215         and then Is_Derived_Type (Full_Base)
10216         and then Has_Discriminants (Full_Base)
10217         and then (Ekind (Current_Scope) /= E_Record_Subtype)
10218       then
10219          if not Is_Itype (Priv)
10220            and then
10221              Nkind (Subtype_Indication (Parent (Priv))) = N_Subtype_Indication
10222          then
10223             Build_Underlying_Full_View
10224               (Parent (Priv), Full, Etype (Full_Base));
10225
10226          elsif Nkind (Related_Nod) = N_Component_Declaration then
10227             Build_Underlying_Full_View (Related_Nod, Full, Etype (Full_Base));
10228          end if;
10229
10230       elsif Is_Record_Type (Full_Base) then
10231
10232          --  Show Full is simply a renaming of Full_Base
10233
10234          Set_Cloned_Subtype (Full, Full_Base);
10235       end if;
10236
10237       --  It is unsafe to share to bounds of a scalar type, because the Itype
10238       --  is elaborated on demand, and if a bound is non-static then different
10239       --  orders of elaboration in different units will lead to different
10240       --  external symbols.
10241
10242       if Is_Scalar_Type (Full_Base) then
10243          Set_Scalar_Range (Full,
10244            Make_Range (Sloc (Related_Nod),
10245              Low_Bound  =>
10246                Duplicate_Subexpr_No_Checks (Type_Low_Bound  (Full_Base)),
10247              High_Bound =>
10248                Duplicate_Subexpr_No_Checks (Type_High_Bound (Full_Base))));
10249
10250          --  This completion inherits the bounds of the full parent, but if
10251          --  the parent is an unconstrained floating point type, so is the
10252          --  completion.
10253
10254          if Is_Floating_Point_Type (Full_Base) then
10255             Set_Includes_Infinities
10256              (Scalar_Range (Full), Has_Infinities (Full_Base));
10257          end if;
10258       end if;
10259
10260       --  ??? It seems that a lot of fields are missing that should be copied
10261       --  from Full_Base to Full. Here are some that are introduced in a
10262       --  non-disruptive way but a cleanup is necessary.
10263
10264       if Is_Tagged_Type (Full_Base) then
10265          Set_Is_Tagged_Type (Full);
10266          Set_Direct_Primitive_Operations (Full,
10267            Direct_Primitive_Operations (Full_Base));
10268
10269          --  Inherit class_wide type of full_base in case the partial view was
10270          --  not tagged. Otherwise it has already been created when the private
10271          --  subtype was analyzed.
10272
10273          if No (Class_Wide_Type (Full)) then
10274             Set_Class_Wide_Type (Full, Class_Wide_Type (Full_Base));
10275          end if;
10276
10277       --  If this is a subtype of a protected or task type, constrain its
10278       --  corresponding record, unless this is a subtype without constraints,
10279       --  i.e. a simple renaming as with an actual subtype in an instance.
10280
10281       elsif Is_Concurrent_Type (Full_Base) then
10282          if Has_Discriminants (Full)
10283            and then Present (Corresponding_Record_Type (Full_Base))
10284            and then
10285              not Is_Empty_Elmt_List (Discriminant_Constraint (Full))
10286          then
10287             Set_Corresponding_Record_Type (Full,
10288               Constrain_Corresponding_Record
10289                 (Full, Corresponding_Record_Type (Full_Base),
10290                   Related_Nod, Full_Base));
10291
10292          else
10293             Set_Corresponding_Record_Type (Full,
10294               Corresponding_Record_Type (Full_Base));
10295          end if;
10296       end if;
10297
10298       --  Link rep item chain, and also setting of Has_Predicates from private
10299       --  subtype to full subtype, since we will need these on the full subtype
10300       --  to create the predicate function. Note that the full subtype may
10301       --  already have rep items, inherited from the full view of the base
10302       --  type, so we must be sure not to overwrite these entries.
10303
10304       declare
10305          Item      : Node_Id;
10306          Next_Item : Node_Id;
10307
10308       begin
10309          Item := First_Rep_Item (Full);
10310
10311          --  If no existing rep items on full type, we can just link directly
10312          --  to the list of items on the private type.
10313
10314          if No (Item) then
10315             Set_First_Rep_Item (Full, First_Rep_Item (Priv));
10316
10317          --  Otherwise, search to the end of items currently linked to the full
10318          --  subtype and append the private items to the end. However, if Priv
10319          --  and Full already have the same list of rep items, then the append
10320          --  is not done, as that would create a circularity.
10321
10322          elsif Item /= First_Rep_Item (Priv) then
10323             loop
10324                Next_Item := Next_Rep_Item (Item);
10325                exit when No (Next_Item);
10326                Item := Next_Item;
10327             end loop;
10328
10329             --  And link the private type items at the end of the chain
10330
10331             Set_Next_Rep_Item (Item, First_Rep_Item (Priv));
10332          end if;
10333       end;
10334
10335       --  Make sure Has_Predicates is set on full type if it is set on the
10336       --  private type. Note that it may already be set on the full type and
10337       --  if so, we don't want to unset it.
10338
10339       if Has_Predicates (Priv) then
10340          Set_Has_Predicates (Full);
10341       end if;
10342    end Complete_Private_Subtype;
10343
10344    ----------------------------
10345    -- Constant_Redeclaration --
10346    ----------------------------
10347
10348    procedure Constant_Redeclaration
10349      (Id : Entity_Id;
10350       N  : Node_Id;
10351       T  : out Entity_Id)
10352    is
10353       Prev    : constant Entity_Id := Current_Entity_In_Scope (Id);
10354       Obj_Def : constant Node_Id := Object_Definition (N);
10355       New_T   : Entity_Id;
10356
10357       procedure Check_Possible_Deferred_Completion
10358         (Prev_Id      : Entity_Id;
10359          Prev_Obj_Def : Node_Id;
10360          Curr_Obj_Def : Node_Id);
10361       --  Determine whether the two object definitions describe the partial
10362       --  and the full view of a constrained deferred constant. Generate
10363       --  a subtype for the full view and verify that it statically matches
10364       --  the subtype of the partial view.
10365
10366       procedure Check_Recursive_Declaration (Typ : Entity_Id);
10367       --  If deferred constant is an access type initialized with an allocator,
10368       --  check whether there is an illegal recursion in the definition,
10369       --  through a default value of some record subcomponent. This is normally
10370       --  detected when generating init procs, but requires this additional
10371       --  mechanism when expansion is disabled.
10372
10373       ----------------------------------------
10374       -- Check_Possible_Deferred_Completion --
10375       ----------------------------------------
10376
10377       procedure Check_Possible_Deferred_Completion
10378         (Prev_Id      : Entity_Id;
10379          Prev_Obj_Def : Node_Id;
10380          Curr_Obj_Def : Node_Id)
10381       is
10382       begin
10383          if Nkind (Prev_Obj_Def) = N_Subtype_Indication
10384            and then Present (Constraint (Prev_Obj_Def))
10385            and then Nkind (Curr_Obj_Def) = N_Subtype_Indication
10386            and then Present (Constraint (Curr_Obj_Def))
10387          then
10388             declare
10389                Loc    : constant Source_Ptr := Sloc (N);
10390                Def_Id : constant Entity_Id  := Make_Temporary (Loc, 'S');
10391                Decl   : constant Node_Id    :=
10392                           Make_Subtype_Declaration (Loc,
10393                             Defining_Identifier => Def_Id,
10394                             Subtype_Indication  =>
10395                               Relocate_Node (Curr_Obj_Def));
10396
10397             begin
10398                Insert_Before_And_Analyze (N, Decl);
10399                Set_Etype (Id, Def_Id);
10400
10401                if not Subtypes_Statically_Match (Etype (Prev_Id), Def_Id) then
10402                   Error_Msg_Sloc := Sloc (Prev_Id);
10403                   Error_Msg_N ("subtype does not statically match deferred " &
10404                                "declaration#", N);
10405                end if;
10406             end;
10407          end if;
10408       end Check_Possible_Deferred_Completion;
10409
10410       ---------------------------------
10411       -- Check_Recursive_Declaration --
10412       ---------------------------------
10413
10414       procedure Check_Recursive_Declaration (Typ : Entity_Id) is
10415          Comp : Entity_Id;
10416
10417       begin
10418          if Is_Record_Type (Typ) then
10419             Comp := First_Component (Typ);
10420             while Present (Comp) loop
10421                if Comes_From_Source (Comp) then
10422                   if Present (Expression (Parent (Comp)))
10423                     and then Is_Entity_Name (Expression (Parent (Comp)))
10424                     and then Entity (Expression (Parent (Comp))) = Prev
10425                   then
10426                      Error_Msg_Sloc := Sloc (Parent (Comp));
10427                      Error_Msg_NE
10428                        ("illegal circularity with declaration for&#",
10429                          N, Comp);
10430                      return;
10431
10432                   elsif Is_Record_Type (Etype (Comp)) then
10433                      Check_Recursive_Declaration (Etype (Comp));
10434                   end if;
10435                end if;
10436
10437                Next_Component (Comp);
10438             end loop;
10439          end if;
10440       end Check_Recursive_Declaration;
10441
10442    --  Start of processing for Constant_Redeclaration
10443
10444    begin
10445       if Nkind (Parent (Prev)) = N_Object_Declaration then
10446          if Nkind (Object_Definition
10447                      (Parent (Prev))) = N_Subtype_Indication
10448          then
10449             --  Find type of new declaration. The constraints of the two
10450             --  views must match statically, but there is no point in
10451             --  creating an itype for the full view.
10452
10453             if Nkind (Obj_Def) = N_Subtype_Indication then
10454                Find_Type (Subtype_Mark (Obj_Def));
10455                New_T := Entity (Subtype_Mark (Obj_Def));
10456
10457             else
10458                Find_Type (Obj_Def);
10459                New_T := Entity (Obj_Def);
10460             end if;
10461
10462             T := Etype (Prev);
10463
10464          else
10465             --  The full view may impose a constraint, even if the partial
10466             --  view does not, so construct the subtype.
10467
10468             New_T := Find_Type_Of_Object (Obj_Def, N);
10469             T     := New_T;
10470          end if;
10471
10472       else
10473          --  Current declaration is illegal, diagnosed below in Enter_Name
10474
10475          T := Empty;
10476          New_T := Any_Type;
10477       end if;
10478
10479       --  If previous full declaration or a renaming declaration exists, or if
10480       --  a homograph is present, let Enter_Name handle it, either with an
10481       --  error or with the removal of an overridden implicit subprogram.
10482
10483       if Ekind (Prev) /= E_Constant
10484         or else Nkind (Parent (Prev)) = N_Object_Renaming_Declaration
10485         or else Present (Expression (Parent (Prev)))
10486         or else Present (Full_View (Prev))
10487       then
10488          Enter_Name (Id);
10489
10490       --  Verify that types of both declarations match, or else that both types
10491       --  are anonymous access types whose designated subtypes statically match
10492       --  (as allowed in Ada 2005 by AI-385).
10493
10494       elsif Base_Type (Etype (Prev)) /= Base_Type (New_T)
10495         and then
10496           (Ekind (Etype (Prev)) /= E_Anonymous_Access_Type
10497              or else Ekind (Etype (New_T)) /= E_Anonymous_Access_Type
10498              or else Is_Access_Constant (Etype (New_T)) /=
10499                      Is_Access_Constant (Etype (Prev))
10500              or else Can_Never_Be_Null (Etype (New_T)) /=
10501                      Can_Never_Be_Null (Etype (Prev))
10502              or else Null_Exclusion_Present (Parent (Prev)) /=
10503                      Null_Exclusion_Present (Parent (Id))
10504              or else not Subtypes_Statically_Match
10505                            (Designated_Type (Etype (Prev)),
10506                             Designated_Type (Etype (New_T))))
10507       then
10508          Error_Msg_Sloc := Sloc (Prev);
10509          Error_Msg_N ("type does not match declaration#", N);
10510          Set_Full_View (Prev, Id);
10511          Set_Etype (Id, Any_Type);
10512
10513       elsif
10514         Null_Exclusion_Present (Parent (Prev))
10515           and then not Null_Exclusion_Present (N)
10516       then
10517          Error_Msg_Sloc := Sloc (Prev);
10518          Error_Msg_N ("null-exclusion does not match declaration#", N);
10519          Set_Full_View (Prev, Id);
10520          Set_Etype (Id, Any_Type);
10521
10522       --  If so, process the full constant declaration
10523
10524       else
10525          --  RM 7.4 (6): If the subtype defined by the subtype_indication in
10526          --  the deferred declaration is constrained, then the subtype defined
10527          --  by the subtype_indication in the full declaration shall match it
10528          --  statically.
10529
10530          Check_Possible_Deferred_Completion
10531            (Prev_Id      => Prev,
10532             Prev_Obj_Def => Object_Definition (Parent (Prev)),
10533             Curr_Obj_Def => Obj_Def);
10534
10535          Set_Full_View (Prev, Id);
10536          Set_Is_Public (Id, Is_Public (Prev));
10537          Set_Is_Internal (Id);
10538          Append_Entity (Id, Current_Scope);
10539
10540          --  Check ALIASED present if present before (RM 7.4(7))
10541
10542          if Is_Aliased (Prev)
10543            and then not Aliased_Present (N)
10544          then
10545             Error_Msg_Sloc := Sloc (Prev);
10546             Error_Msg_N ("ALIASED required (see declaration#)", N);
10547          end if;
10548
10549          --  Check that placement is in private part and that the incomplete
10550          --  declaration appeared in the visible part.
10551
10552          if Ekind (Current_Scope) = E_Package
10553            and then not In_Private_Part (Current_Scope)
10554          then
10555             Error_Msg_Sloc := Sloc (Prev);
10556             Error_Msg_N
10557               ("full constant for declaration#"
10558                & " must be in private part", N);
10559
10560          elsif Ekind (Current_Scope) = E_Package
10561            and then
10562              List_Containing (Parent (Prev)) /=
10563                Visible_Declarations
10564                  (Specification (Unit_Declaration_Node (Current_Scope)))
10565          then
10566             Error_Msg_N
10567               ("deferred constant must be declared in visible part",
10568                  Parent (Prev));
10569          end if;
10570
10571          if Is_Access_Type (T)
10572            and then Nkind (Expression (N)) = N_Allocator
10573          then
10574             Check_Recursive_Declaration (Designated_Type (T));
10575          end if;
10576       end if;
10577    end Constant_Redeclaration;
10578
10579    ----------------------
10580    -- Constrain_Access --
10581    ----------------------
10582
10583    procedure Constrain_Access
10584      (Def_Id      : in out Entity_Id;
10585       S           : Node_Id;
10586       Related_Nod : Node_Id)
10587    is
10588       T             : constant Entity_Id := Entity (Subtype_Mark (S));
10589       Desig_Type    : constant Entity_Id := Designated_Type (T);
10590       Desig_Subtype : Entity_Id := Create_Itype (E_Void, Related_Nod);
10591       Constraint_OK : Boolean := True;
10592
10593       function Has_Defaulted_Discriminants (Typ : Entity_Id) return Boolean;
10594       --  Simple predicate to test for defaulted discriminants
10595       --  Shouldn't this be in sem_util???
10596
10597       ---------------------------------
10598       -- Has_Defaulted_Discriminants --
10599       ---------------------------------
10600
10601       function Has_Defaulted_Discriminants (Typ : Entity_Id) return Boolean is
10602       begin
10603          return Has_Discriminants (Typ)
10604           and then Present (First_Discriminant (Typ))
10605           and then Present
10606             (Discriminant_Default_Value (First_Discriminant (Typ)));
10607       end Has_Defaulted_Discriminants;
10608
10609    --  Start of processing for Constrain_Access
10610
10611    begin
10612       if Is_Array_Type (Desig_Type) then
10613          Constrain_Array (Desig_Subtype, S, Related_Nod, Def_Id, 'P');
10614
10615       elsif (Is_Record_Type (Desig_Type)
10616               or else Is_Incomplete_Or_Private_Type (Desig_Type))
10617         and then not Is_Constrained (Desig_Type)
10618       then
10619          --  ??? The following code is a temporary kludge to ignore a
10620          --  discriminant constraint on access type if it is constraining
10621          --  the current record. Avoid creating the implicit subtype of the
10622          --  record we are currently compiling since right now, we cannot
10623          --  handle these. For now, just return the access type itself.
10624
10625          if Desig_Type = Current_Scope
10626            and then No (Def_Id)
10627          then
10628             Set_Ekind (Desig_Subtype, E_Record_Subtype);
10629             Def_Id := Entity (Subtype_Mark (S));
10630
10631             --  This call added to ensure that the constraint is analyzed
10632             --  (needed for a B test). Note that we still return early from
10633             --  this procedure to avoid recursive processing. ???
10634
10635             Constrain_Discriminated_Type
10636               (Desig_Subtype, S, Related_Nod, For_Access => True);
10637             return;
10638          end if;
10639
10640          if (Ekind (T) = E_General_Access_Type
10641               or else Ada_Version >= Ada_2005)
10642            and then Has_Private_Declaration (Desig_Type)
10643            and then In_Open_Scopes (Scope (Desig_Type))
10644            and then Has_Discriminants (Desig_Type)
10645          then
10646             --  Enforce rule that the constraint is illegal if there is
10647             --  an unconstrained view of the designated type. This means
10648             --  that the partial view (either a private type declaration or
10649             --  a derivation from a private type) has no discriminants.
10650             --  (Defect Report 8652/0008, Technical Corrigendum 1, checked
10651             --  by ACATS B371001).
10652
10653             --  Rule updated for Ada 2005: the private type is said to have
10654             --  a constrained partial view, given that objects of the type
10655             --  can be declared. Furthermore, the rule applies to all access
10656             --  types, unlike the rule concerning default discriminants.
10657
10658             declare
10659                Pack  : constant Node_Id :=
10660                          Unit_Declaration_Node (Scope (Desig_Type));
10661                Decls : List_Id;
10662                Decl  : Node_Id;
10663
10664             begin
10665                if Nkind (Pack) = N_Package_Declaration then
10666                   Decls := Visible_Declarations (Specification (Pack));
10667                   Decl := First (Decls);
10668                   while Present (Decl) loop
10669                      if (Nkind (Decl) = N_Private_Type_Declaration
10670                           and then
10671                             Chars (Defining_Identifier (Decl)) =
10672                                                      Chars (Desig_Type))
10673
10674                        or else
10675                         (Nkind (Decl) = N_Full_Type_Declaration
10676                           and then
10677                             Chars (Defining_Identifier (Decl)) =
10678                                                      Chars (Desig_Type)
10679                           and then Is_Derived_Type (Desig_Type)
10680                           and then
10681                             Has_Private_Declaration (Etype (Desig_Type)))
10682                      then
10683                         if No (Discriminant_Specifications (Decl)) then
10684                            Error_Msg_N
10685                             ("cannot constrain general access type if " &
10686                                "designated type has constrained partial view",
10687                                 S);
10688                         end if;
10689
10690                         exit;
10691                      end if;
10692
10693                      Next (Decl);
10694                   end loop;
10695                end if;
10696             end;
10697          end if;
10698
10699          Constrain_Discriminated_Type (Desig_Subtype, S, Related_Nod,
10700            For_Access => True);
10701
10702       elsif (Is_Task_Type (Desig_Type)
10703               or else Is_Protected_Type (Desig_Type))
10704         and then not Is_Constrained (Desig_Type)
10705       then
10706          Constrain_Concurrent
10707            (Desig_Subtype, S, Related_Nod, Desig_Type, ' ');
10708
10709       else
10710          Error_Msg_N ("invalid constraint on access type", S);
10711          Desig_Subtype := Desig_Type; -- Ignore invalid constraint.
10712          Constraint_OK := False;
10713       end if;
10714
10715       if No (Def_Id) then
10716          Def_Id := Create_Itype (E_Access_Subtype, Related_Nod);
10717       else
10718          Set_Ekind (Def_Id, E_Access_Subtype);
10719       end if;
10720
10721       if Constraint_OK then
10722          Set_Etype (Def_Id, Base_Type (T));
10723
10724          if Is_Private_Type (Desig_Type) then
10725             Prepare_Private_Subtype_Completion (Desig_Subtype, Related_Nod);
10726          end if;
10727       else
10728          Set_Etype (Def_Id, Any_Type);
10729       end if;
10730
10731       Set_Size_Info                (Def_Id, T);
10732       Set_Is_Constrained           (Def_Id, Constraint_OK);
10733       Set_Directly_Designated_Type (Def_Id, Desig_Subtype);
10734       Set_Depends_On_Private       (Def_Id, Has_Private_Component (Def_Id));
10735       Set_Is_Access_Constant       (Def_Id, Is_Access_Constant (T));
10736
10737       Conditional_Delay (Def_Id, T);
10738
10739       --  AI-363 : Subtypes of general access types whose designated types have
10740       --  default discriminants are disallowed. In instances, the rule has to
10741       --  be checked against the actual, of which T is the subtype. In a
10742       --  generic body, the rule is checked assuming that the actual type has
10743       --  defaulted discriminants.
10744
10745       if Ada_Version >= Ada_2005 or else Warn_On_Ada_2005_Compatibility then
10746          if Ekind (Base_Type (T)) = E_General_Access_Type
10747            and then Has_Defaulted_Discriminants (Desig_Type)
10748          then
10749             if Ada_Version < Ada_2005 then
10750                Error_Msg_N
10751                  ("access subtype of general access type would not " &
10752                   "be allowed in Ada 2005?", S);
10753             else
10754                Error_Msg_N
10755                  ("access subtype of general access type not allowed", S);
10756             end if;
10757
10758             Error_Msg_N ("\discriminants have defaults", S);
10759
10760          elsif Is_Access_Type (T)
10761            and then Is_Generic_Type (Desig_Type)
10762            and then Has_Discriminants (Desig_Type)
10763            and then In_Package_Body (Current_Scope)
10764          then
10765             if Ada_Version < Ada_2005 then
10766                Error_Msg_N
10767                  ("access subtype would not be allowed in generic body " &
10768                   "in Ada 2005?", S);
10769             else
10770                Error_Msg_N
10771                  ("access subtype not allowed in generic body", S);
10772             end if;
10773
10774             Error_Msg_N
10775               ("\designated type is a discriminated formal", S);
10776          end if;
10777       end if;
10778    end Constrain_Access;
10779
10780    ---------------------
10781    -- Constrain_Array --
10782    ---------------------
10783
10784    procedure Constrain_Array
10785      (Def_Id      : in out Entity_Id;
10786       SI          : Node_Id;
10787       Related_Nod : Node_Id;
10788       Related_Id  : Entity_Id;
10789       Suffix      : Character)
10790    is
10791       C                     : constant Node_Id := Constraint (SI);
10792       Number_Of_Constraints : Nat := 0;
10793       Index                 : Node_Id;
10794       S, T                  : Entity_Id;
10795       Constraint_OK         : Boolean := True;
10796
10797    begin
10798       T := Entity (Subtype_Mark (SI));
10799
10800       if Ekind (T) in Access_Kind then
10801          T := Designated_Type (T);
10802       end if;
10803
10804       --  If an index constraint follows a subtype mark in a subtype indication
10805       --  then the type or subtype denoted by the subtype mark must not already
10806       --  impose an index constraint. The subtype mark must denote either an
10807       --  unconstrained array type or an access type whose designated type
10808       --  is such an array type... (RM 3.6.1)
10809
10810       if Is_Constrained (T) then
10811          Error_Msg_N ("array type is already constrained", Subtype_Mark (SI));
10812          Constraint_OK := False;
10813
10814       else
10815          S := First (Constraints (C));
10816          while Present (S) loop
10817             Number_Of_Constraints := Number_Of_Constraints + 1;
10818             Next (S);
10819          end loop;
10820
10821          --  In either case, the index constraint must provide a discrete
10822          --  range for each index of the array type and the type of each
10823          --  discrete range must be the same as that of the corresponding
10824          --  index. (RM 3.6.1)
10825
10826          if Number_Of_Constraints /= Number_Dimensions (T) then
10827             Error_Msg_NE ("incorrect number of index constraints for }", C, T);
10828             Constraint_OK := False;
10829
10830          else
10831             S := First (Constraints (C));
10832             Index := First_Index (T);
10833             Analyze (Index);
10834
10835             --  Apply constraints to each index type
10836
10837             for J in 1 .. Number_Of_Constraints loop
10838                Constrain_Index (Index, S, Related_Nod, Related_Id, Suffix, J);
10839                Next (Index);
10840                Next (S);
10841             end loop;
10842
10843          end if;
10844       end if;
10845
10846       if No (Def_Id) then
10847          Def_Id :=
10848            Create_Itype (E_Array_Subtype, Related_Nod, Related_Id, Suffix);
10849          Set_Parent (Def_Id, Related_Nod);
10850
10851       else
10852          Set_Ekind (Def_Id, E_Array_Subtype);
10853       end if;
10854
10855       Set_Size_Info      (Def_Id,                (T));
10856       Set_First_Rep_Item (Def_Id, First_Rep_Item (T));
10857       Set_Etype          (Def_Id, Base_Type      (T));
10858
10859       if Constraint_OK then
10860          Set_First_Index (Def_Id, First (Constraints (C)));
10861       else
10862          Set_First_Index (Def_Id, First_Index (T));
10863       end if;
10864
10865       Set_Is_Constrained     (Def_Id, True);
10866       Set_Is_Aliased         (Def_Id, Is_Aliased (T));
10867       Set_Depends_On_Private (Def_Id, Has_Private_Component (Def_Id));
10868
10869       Set_Is_Private_Composite (Def_Id, Is_Private_Composite (T));
10870       Set_Is_Limited_Composite (Def_Id, Is_Limited_Composite (T));
10871
10872       --  A subtype does not inherit the packed_array_type of is parent. We
10873       --  need to initialize the attribute because if Def_Id is previously
10874       --  analyzed through a limited_with clause, it will have the attributes
10875       --  of an incomplete type, one of which is an Elist that overlaps the
10876       --  Packed_Array_Type field.
10877
10878       Set_Packed_Array_Type (Def_Id, Empty);
10879
10880       --  Build a freeze node if parent still needs one. Also make sure that
10881       --  the Depends_On_Private status is set because the subtype will need
10882       --  reprocessing at the time the base type does, and also we must set a
10883       --  conditional delay.
10884
10885       Set_Depends_On_Private (Def_Id, Depends_On_Private (T));
10886       Conditional_Delay (Def_Id, T);
10887    end Constrain_Array;
10888
10889    ------------------------------
10890    -- Constrain_Component_Type --
10891    ------------------------------
10892
10893    function Constrain_Component_Type
10894      (Comp            : Entity_Id;
10895       Constrained_Typ : Entity_Id;
10896       Related_Node    : Node_Id;
10897       Typ             : Entity_Id;
10898       Constraints     : Elist_Id) return Entity_Id
10899    is
10900       Loc         : constant Source_Ptr := Sloc (Constrained_Typ);
10901       Compon_Type : constant Entity_Id := Etype (Comp);
10902
10903       function Build_Constrained_Array_Type
10904         (Old_Type : Entity_Id) return Entity_Id;
10905       --  If Old_Type is an array type, one of whose indexes is constrained
10906       --  by a discriminant, build an Itype whose constraint replaces the
10907       --  discriminant with its value in the constraint.
10908
10909       function Build_Constrained_Discriminated_Type
10910         (Old_Type : Entity_Id) return Entity_Id;
10911       --  Ditto for record components
10912
10913       function Build_Constrained_Access_Type
10914         (Old_Type : Entity_Id) return Entity_Id;
10915       --  Ditto for access types. Makes use of previous two functions, to
10916       --  constrain designated type.
10917
10918       function Build_Subtype (T : Entity_Id; C : List_Id) return Entity_Id;
10919       --  T is an array or discriminated type, C is a list of constraints
10920       --  that apply to T. This routine builds the constrained subtype.
10921
10922       function Is_Discriminant (Expr : Node_Id) return Boolean;
10923       --  Returns True if Expr is a discriminant
10924
10925       function Get_Discr_Value (Discrim : Entity_Id) return Node_Id;
10926       --  Find the value of discriminant Discrim in Constraint
10927
10928       -----------------------------------
10929       -- Build_Constrained_Access_Type --
10930       -----------------------------------
10931
10932       function Build_Constrained_Access_Type
10933         (Old_Type : Entity_Id) return Entity_Id
10934       is
10935          Desig_Type    : constant Entity_Id := Designated_Type (Old_Type);
10936          Itype         : Entity_Id;
10937          Desig_Subtype : Entity_Id;
10938          Scop          : Entity_Id;
10939
10940       begin
10941          --  if the original access type was not embedded in the enclosing
10942          --  type definition, there is no need to produce a new access
10943          --  subtype. In fact every access type with an explicit constraint
10944          --  generates an itype whose scope is the enclosing record.
10945
10946          if not Is_Type (Scope (Old_Type)) then
10947             return Old_Type;
10948
10949          elsif Is_Array_Type (Desig_Type) then
10950             Desig_Subtype := Build_Constrained_Array_Type (Desig_Type);
10951
10952          elsif Has_Discriminants (Desig_Type) then
10953
10954             --  This may be an access type to an enclosing record type for
10955             --  which we are constructing the constrained components. Return
10956             --  the enclosing record subtype. This is not always correct,
10957             --  but avoids infinite recursion. ???
10958
10959             Desig_Subtype := Any_Type;
10960
10961             for J in reverse 0 .. Scope_Stack.Last loop
10962                Scop := Scope_Stack.Table (J).Entity;
10963
10964                if Is_Type (Scop)
10965                  and then Base_Type (Scop) = Base_Type (Desig_Type)
10966                then
10967                   Desig_Subtype := Scop;
10968                end if;
10969
10970                exit when not Is_Type (Scop);
10971             end loop;
10972
10973             if Desig_Subtype = Any_Type then
10974                Desig_Subtype :=
10975                  Build_Constrained_Discriminated_Type (Desig_Type);
10976             end if;
10977
10978          else
10979             return Old_Type;
10980          end if;
10981
10982          if Desig_Subtype /= Desig_Type then
10983
10984             --  The Related_Node better be here or else we won't be able
10985             --  to attach new itypes to a node in the tree.
10986
10987             pragma Assert (Present (Related_Node));
10988
10989             Itype := Create_Itype (E_Access_Subtype, Related_Node);
10990
10991             Set_Etype                    (Itype, Base_Type      (Old_Type));
10992             Set_Size_Info                (Itype,                (Old_Type));
10993             Set_Directly_Designated_Type (Itype, Desig_Subtype);
10994             Set_Depends_On_Private       (Itype, Has_Private_Component
10995                                                                 (Old_Type));
10996             Set_Is_Access_Constant       (Itype, Is_Access_Constant
10997                                                                 (Old_Type));
10998
10999             --  The new itype needs freezing when it depends on a not frozen
11000             --  type and the enclosing subtype needs freezing.
11001
11002             if Has_Delayed_Freeze (Constrained_Typ)
11003               and then not Is_Frozen (Constrained_Typ)
11004             then
11005                Conditional_Delay (Itype, Base_Type (Old_Type));
11006             end if;
11007
11008             return Itype;
11009
11010          else
11011             return Old_Type;
11012          end if;
11013       end Build_Constrained_Access_Type;
11014
11015       ----------------------------------
11016       -- Build_Constrained_Array_Type --
11017       ----------------------------------
11018
11019       function Build_Constrained_Array_Type
11020         (Old_Type : Entity_Id) return Entity_Id
11021       is
11022          Lo_Expr     : Node_Id;
11023          Hi_Expr     : Node_Id;
11024          Old_Index   : Node_Id;
11025          Range_Node  : Node_Id;
11026          Constr_List : List_Id;
11027
11028          Need_To_Create_Itype : Boolean := False;
11029
11030       begin
11031          Old_Index := First_Index (Old_Type);
11032          while Present (Old_Index) loop
11033             Get_Index_Bounds (Old_Index, Lo_Expr, Hi_Expr);
11034
11035             if Is_Discriminant (Lo_Expr)
11036               or else Is_Discriminant (Hi_Expr)
11037             then
11038                Need_To_Create_Itype := True;
11039             end if;
11040
11041             Next_Index (Old_Index);
11042          end loop;
11043
11044          if Need_To_Create_Itype then
11045             Constr_List := New_List;
11046
11047             Old_Index := First_Index (Old_Type);
11048             while Present (Old_Index) loop
11049                Get_Index_Bounds (Old_Index, Lo_Expr, Hi_Expr);
11050
11051                if Is_Discriminant (Lo_Expr) then
11052                   Lo_Expr := Get_Discr_Value (Lo_Expr);
11053                end if;
11054
11055                if Is_Discriminant (Hi_Expr) then
11056                   Hi_Expr := Get_Discr_Value (Hi_Expr);
11057                end if;
11058
11059                Range_Node :=
11060                  Make_Range
11061                    (Loc, New_Copy_Tree (Lo_Expr), New_Copy_Tree (Hi_Expr));
11062
11063                Append (Range_Node, To => Constr_List);
11064
11065                Next_Index (Old_Index);
11066             end loop;
11067
11068             return Build_Subtype (Old_Type, Constr_List);
11069
11070          else
11071             return Old_Type;
11072          end if;
11073       end Build_Constrained_Array_Type;
11074
11075       ------------------------------------------
11076       -- Build_Constrained_Discriminated_Type --
11077       ------------------------------------------
11078
11079       function Build_Constrained_Discriminated_Type
11080         (Old_Type : Entity_Id) return Entity_Id
11081       is
11082          Expr           : Node_Id;
11083          Constr_List    : List_Id;
11084          Old_Constraint : Elmt_Id;
11085
11086          Need_To_Create_Itype : Boolean := False;
11087
11088       begin
11089          Old_Constraint := First_Elmt (Discriminant_Constraint (Old_Type));
11090          while Present (Old_Constraint) loop
11091             Expr := Node (Old_Constraint);
11092
11093             if Is_Discriminant (Expr) then
11094                Need_To_Create_Itype := True;
11095             end if;
11096
11097             Next_Elmt (Old_Constraint);
11098          end loop;
11099
11100          if Need_To_Create_Itype then
11101             Constr_List := New_List;
11102
11103             Old_Constraint := First_Elmt (Discriminant_Constraint (Old_Type));
11104             while Present (Old_Constraint) loop
11105                Expr := Node (Old_Constraint);
11106
11107                if Is_Discriminant (Expr) then
11108                   Expr := Get_Discr_Value (Expr);
11109                end if;
11110
11111                Append (New_Copy_Tree (Expr), To => Constr_List);
11112
11113                Next_Elmt (Old_Constraint);
11114             end loop;
11115
11116             return Build_Subtype (Old_Type, Constr_List);
11117
11118          else
11119             return Old_Type;
11120          end if;
11121       end Build_Constrained_Discriminated_Type;
11122
11123       -------------------
11124       -- Build_Subtype --
11125       -------------------
11126
11127       function Build_Subtype (T : Entity_Id; C : List_Id) return Entity_Id is
11128          Indic       : Node_Id;
11129          Subtyp_Decl : Node_Id;
11130          Def_Id      : Entity_Id;
11131          Btyp        : Entity_Id := Base_Type (T);
11132
11133       begin
11134          --  The Related_Node better be here or else we won't be able to
11135          --  attach new itypes to a node in the tree.
11136
11137          pragma Assert (Present (Related_Node));
11138
11139          --  If the view of the component's type is incomplete or private
11140          --  with unknown discriminants, then the constraint must be applied
11141          --  to the full type.
11142
11143          if Has_Unknown_Discriminants (Btyp)
11144            and then Present (Underlying_Type (Btyp))
11145          then
11146             Btyp := Underlying_Type (Btyp);
11147          end if;
11148
11149          Indic :=
11150            Make_Subtype_Indication (Loc,
11151              Subtype_Mark => New_Occurrence_Of (Btyp, Loc),
11152              Constraint   => Make_Index_Or_Discriminant_Constraint (Loc, C));
11153
11154          Def_Id := Create_Itype (Ekind (T), Related_Node);
11155
11156          Subtyp_Decl :=
11157            Make_Subtype_Declaration (Loc,
11158              Defining_Identifier => Def_Id,
11159              Subtype_Indication  => Indic);
11160
11161          Set_Parent (Subtyp_Decl, Parent (Related_Node));
11162
11163          --  Itypes must be analyzed with checks off (see package Itypes)
11164
11165          Analyze (Subtyp_Decl, Suppress => All_Checks);
11166
11167          return Def_Id;
11168       end Build_Subtype;
11169
11170       ---------------------
11171       -- Get_Discr_Value --
11172       ---------------------
11173
11174       function Get_Discr_Value (Discrim : Entity_Id) return Node_Id is
11175          D : Entity_Id;
11176          E : Elmt_Id;
11177
11178       begin
11179          --  The discriminant may be declared for the type, in which case we
11180          --  find it by iterating over the list of discriminants. If the
11181          --  discriminant is inherited from a parent type, it appears as the
11182          --  corresponding discriminant of the current type. This will be the
11183          --  case when constraining an inherited component whose constraint is
11184          --  given by a discriminant of the parent.
11185
11186          D := First_Discriminant (Typ);
11187          E := First_Elmt (Constraints);
11188
11189          while Present (D) loop
11190             if D = Entity (Discrim)
11191               or else D = CR_Discriminant (Entity (Discrim))
11192               or else Corresponding_Discriminant (D) = Entity (Discrim)
11193             then
11194                return Node (E);
11195             end if;
11196
11197             Next_Discriminant (D);
11198             Next_Elmt (E);
11199          end loop;
11200
11201          --  The Corresponding_Discriminant mechanism is incomplete, because
11202          --  the correspondence between new and old discriminants is not one
11203          --  to one: one new discriminant can constrain several old ones. In
11204          --  that case, scan sequentially the stored_constraint, the list of
11205          --  discriminants of the parents, and the constraints.
11206          --  Previous code checked for the present of the Stored_Constraint
11207          --  list for the derived type, but did not use it at all. Should it
11208          --  be present when the component is a discriminated task type?
11209
11210          if Is_Derived_Type (Typ)
11211            and then Scope (Entity (Discrim)) = Etype (Typ)
11212          then
11213             D := First_Discriminant (Etype (Typ));
11214             E := First_Elmt (Constraints);
11215             while Present (D) loop
11216                if D = Entity (Discrim) then
11217                   return Node (E);
11218                end if;
11219
11220                Next_Discriminant (D);
11221                Next_Elmt (E);
11222             end loop;
11223          end if;
11224
11225          --  Something is wrong if we did not find the value
11226
11227          raise Program_Error;
11228       end Get_Discr_Value;
11229
11230       ---------------------
11231       -- Is_Discriminant --
11232       ---------------------
11233
11234       function Is_Discriminant (Expr : Node_Id) return Boolean is
11235          Discrim_Scope : Entity_Id;
11236
11237       begin
11238          if Denotes_Discriminant (Expr) then
11239             Discrim_Scope := Scope (Entity (Expr));
11240
11241             --  Either we have a reference to one of Typ's discriminants,
11242
11243             pragma Assert (Discrim_Scope = Typ
11244
11245                --  or to the discriminants of the parent type, in the case
11246                --  of a derivation of a tagged type with variants.
11247
11248                or else Discrim_Scope = Etype (Typ)
11249                or else Full_View (Discrim_Scope) = Etype (Typ)
11250
11251                --  or same as above for the case where the discriminants
11252                --  were declared in Typ's private view.
11253
11254                or else (Is_Private_Type (Discrim_Scope)
11255                         and then Chars (Discrim_Scope) = Chars (Typ))
11256
11257                --  or else we are deriving from the full view and the
11258                --  discriminant is declared in the private entity.
11259
11260                or else (Is_Private_Type (Typ)
11261                          and then Chars (Discrim_Scope) = Chars (Typ))
11262
11263                --  Or we are constrained the corresponding record of a
11264                --  synchronized type that completes a private declaration.
11265
11266                or else (Is_Concurrent_Record_Type (Typ)
11267                          and then
11268                            Corresponding_Concurrent_Type (Typ) = Discrim_Scope)
11269
11270                --  or we have a class-wide type, in which case make sure the
11271                --  discriminant found belongs to the root type.
11272
11273                or else (Is_Class_Wide_Type (Typ)
11274                          and then Etype (Typ) = Discrim_Scope));
11275
11276             return True;
11277          end if;
11278
11279          --  In all other cases we have something wrong
11280
11281          return False;
11282       end Is_Discriminant;
11283
11284    --  Start of processing for Constrain_Component_Type
11285
11286    begin
11287       if Nkind (Parent (Comp)) = N_Component_Declaration
11288         and then Comes_From_Source (Parent (Comp))
11289         and then Comes_From_Source
11290           (Subtype_Indication (Component_Definition (Parent (Comp))))
11291         and then
11292           Is_Entity_Name
11293             (Subtype_Indication (Component_Definition (Parent (Comp))))
11294       then
11295          return Compon_Type;
11296
11297       elsif Is_Array_Type (Compon_Type) then
11298          return Build_Constrained_Array_Type (Compon_Type);
11299
11300       elsif Has_Discriminants (Compon_Type) then
11301          return Build_Constrained_Discriminated_Type (Compon_Type);
11302
11303       elsif Is_Access_Type (Compon_Type) then
11304          return Build_Constrained_Access_Type (Compon_Type);
11305
11306       else
11307          return Compon_Type;
11308       end if;
11309    end Constrain_Component_Type;
11310
11311    --------------------------
11312    -- Constrain_Concurrent --
11313    --------------------------
11314
11315    --  For concurrent types, the associated record value type carries the same
11316    --  discriminants, so when we constrain a concurrent type, we must constrain
11317    --  the corresponding record type as well.
11318
11319    procedure Constrain_Concurrent
11320      (Def_Id      : in out Entity_Id;
11321       SI          : Node_Id;
11322       Related_Nod : Node_Id;
11323       Related_Id  : Entity_Id;
11324       Suffix      : Character)
11325    is
11326       T_Ent : Entity_Id := Entity (Subtype_Mark (SI));
11327       T_Val : Entity_Id;
11328
11329    begin
11330       if Ekind (T_Ent) in Access_Kind then
11331          T_Ent := Designated_Type (T_Ent);
11332       end if;
11333
11334       T_Val := Corresponding_Record_Type (T_Ent);
11335
11336       if Present (T_Val) then
11337
11338          if No (Def_Id) then
11339             Def_Id := Create_Itype (E_Void, Related_Nod, Related_Id, Suffix);
11340          end if;
11341
11342          Constrain_Discriminated_Type (Def_Id, SI, Related_Nod);
11343
11344          Set_Depends_On_Private (Def_Id, Has_Private_Component (Def_Id));
11345          Set_Corresponding_Record_Type (Def_Id,
11346            Constrain_Corresponding_Record
11347              (Def_Id, T_Val, Related_Nod, Related_Id));
11348
11349       else
11350          --  If there is no associated record, expansion is disabled and this
11351          --  is a generic context. Create a subtype in any case, so that
11352          --  semantic analysis can proceed.
11353
11354          if No (Def_Id) then
11355             Def_Id := Create_Itype (E_Void, Related_Nod, Related_Id, Suffix);
11356          end if;
11357
11358          Constrain_Discriminated_Type (Def_Id, SI, Related_Nod);
11359       end if;
11360    end Constrain_Concurrent;
11361
11362    ------------------------------------
11363    -- Constrain_Corresponding_Record --
11364    ------------------------------------
11365
11366    function Constrain_Corresponding_Record
11367      (Prot_Subt   : Entity_Id;
11368       Corr_Rec    : Entity_Id;
11369       Related_Nod : Node_Id;
11370       Related_Id  : Entity_Id) return Entity_Id
11371    is
11372       T_Sub : constant Entity_Id :=
11373                 Create_Itype (E_Record_Subtype, Related_Nod, Related_Id, 'V');
11374
11375    begin
11376       Set_Etype             (T_Sub, Corr_Rec);
11377       Set_Has_Discriminants (T_Sub, Has_Discriminants (Prot_Subt));
11378       Set_Is_Constrained    (T_Sub, True);
11379       Set_First_Entity      (T_Sub, First_Entity (Corr_Rec));
11380       Set_Last_Entity       (T_Sub, Last_Entity  (Corr_Rec));
11381
11382       --  As elsewhere, we do not want to create a freeze node for this itype
11383       --  if it is created for a constrained component of an enclosing record
11384       --  because references to outer discriminants will appear out of scope.
11385
11386       if Ekind (Scope (Prot_Subt)) /= E_Record_Type then
11387          Conditional_Delay (T_Sub, Corr_Rec);
11388       else
11389          Set_Is_Frozen (T_Sub);
11390       end if;
11391
11392       if Has_Discriminants (Prot_Subt) then -- False only if errors.
11393          Set_Discriminant_Constraint
11394            (T_Sub, Discriminant_Constraint (Prot_Subt));
11395          Set_Stored_Constraint_From_Discriminant_Constraint (T_Sub);
11396          Create_Constrained_Components
11397            (T_Sub, Related_Nod, Corr_Rec, Discriminant_Constraint (T_Sub));
11398       end if;
11399
11400       Set_Depends_On_Private      (T_Sub, Has_Private_Component (T_Sub));
11401
11402       return T_Sub;
11403    end Constrain_Corresponding_Record;
11404
11405    -----------------------
11406    -- Constrain_Decimal --
11407    -----------------------
11408
11409    procedure Constrain_Decimal (Def_Id : Node_Id; S : Node_Id) is
11410       T           : constant Entity_Id  := Entity (Subtype_Mark (S));
11411       C           : constant Node_Id    := Constraint (S);
11412       Loc         : constant Source_Ptr := Sloc (C);
11413       Range_Expr  : Node_Id;
11414       Digits_Expr : Node_Id;
11415       Digits_Val  : Uint;
11416       Bound_Val   : Ureal;
11417
11418    begin
11419       Set_Ekind (Def_Id, E_Decimal_Fixed_Point_Subtype);
11420
11421       if Nkind (C) = N_Range_Constraint then
11422          Range_Expr := Range_Expression (C);
11423          Digits_Val := Digits_Value (T);
11424
11425       else
11426          pragma Assert (Nkind (C) = N_Digits_Constraint);
11427
11428          Check_SPARK_Restriction ("digits constraint is not allowed", S);
11429
11430          Digits_Expr := Digits_Expression (C);
11431          Analyze_And_Resolve (Digits_Expr, Any_Integer);
11432
11433          Check_Digits_Expression (Digits_Expr);
11434          Digits_Val := Expr_Value (Digits_Expr);
11435
11436          if Digits_Val > Digits_Value (T) then
11437             Error_Msg_N
11438                ("digits expression is incompatible with subtype", C);
11439             Digits_Val := Digits_Value (T);
11440          end if;
11441
11442          if Present (Range_Constraint (C)) then
11443             Range_Expr := Range_Expression (Range_Constraint (C));
11444          else
11445             Range_Expr := Empty;
11446          end if;
11447       end if;
11448
11449       Set_Etype            (Def_Id, Base_Type        (T));
11450       Set_Size_Info        (Def_Id,                  (T));
11451       Set_First_Rep_Item   (Def_Id, First_Rep_Item   (T));
11452       Set_Delta_Value      (Def_Id, Delta_Value      (T));
11453       Set_Scale_Value      (Def_Id, Scale_Value      (T));
11454       Set_Small_Value      (Def_Id, Small_Value      (T));
11455       Set_Machine_Radix_10 (Def_Id, Machine_Radix_10 (T));
11456       Set_Digits_Value     (Def_Id, Digits_Val);
11457
11458       --  Manufacture range from given digits value if no range present
11459
11460       if No (Range_Expr) then
11461          Bound_Val := (Ureal_10 ** Digits_Val - Ureal_1) * Small_Value (T);
11462          Range_Expr :=
11463            Make_Range (Loc,
11464              Low_Bound =>
11465                Convert_To (T, Make_Real_Literal (Loc, (-Bound_Val))),
11466              High_Bound =>
11467                Convert_To (T, Make_Real_Literal (Loc, Bound_Val)));
11468       end if;
11469
11470       Set_Scalar_Range_For_Subtype (Def_Id, Range_Expr, T);
11471       Set_Discrete_RM_Size (Def_Id);
11472
11473       --  Unconditionally delay the freeze, since we cannot set size
11474       --  information in all cases correctly until the freeze point.
11475
11476       Set_Has_Delayed_Freeze (Def_Id);
11477    end Constrain_Decimal;
11478
11479    ----------------------------------
11480    -- Constrain_Discriminated_Type --
11481    ----------------------------------
11482
11483    procedure Constrain_Discriminated_Type
11484      (Def_Id      : Entity_Id;
11485       S           : Node_Id;
11486       Related_Nod : Node_Id;
11487       For_Access  : Boolean := False)
11488    is
11489       E     : constant Entity_Id := Entity (Subtype_Mark (S));
11490       T     : Entity_Id;
11491       C     : Node_Id;
11492       Elist : Elist_Id := New_Elmt_List;
11493
11494       procedure Fixup_Bad_Constraint;
11495       --  This is called after finding a bad constraint, and after having
11496       --  posted an appropriate error message. The mission is to leave the
11497       --  entity T in as reasonable state as possible!
11498
11499       --------------------------
11500       -- Fixup_Bad_Constraint --
11501       --------------------------
11502
11503       procedure Fixup_Bad_Constraint is
11504       begin
11505          --  Set a reasonable Ekind for the entity. For an incomplete type,
11506          --  we can't do much, but for other types, we can set the proper
11507          --  corresponding subtype kind.
11508
11509          if Ekind (T) = E_Incomplete_Type then
11510             Set_Ekind (Def_Id, Ekind (T));
11511          else
11512             Set_Ekind (Def_Id, Subtype_Kind (Ekind (T)));
11513          end if;
11514
11515          --  Set Etype to the known type, to reduce chances of cascaded errors
11516
11517          Set_Etype (Def_Id, E);
11518          Set_Error_Posted (Def_Id);
11519       end Fixup_Bad_Constraint;
11520
11521    --  Start of processing for Constrain_Discriminated_Type
11522
11523    begin
11524       C := Constraint (S);
11525
11526       --  A discriminant constraint is only allowed in a subtype indication,
11527       --  after a subtype mark. This subtype mark must denote either a type
11528       --  with discriminants, or an access type whose designated type is a
11529       --  type with discriminants. A discriminant constraint specifies the
11530       --  values of these discriminants (RM 3.7.2(5)).
11531
11532       T := Base_Type (Entity (Subtype_Mark (S)));
11533
11534       if Ekind (T) in Access_Kind then
11535          T := Designated_Type (T);
11536       end if;
11537
11538       --  Ada 2005 (AI-412): Constrained incomplete subtypes are illegal.
11539       --  Avoid generating an error for access-to-incomplete subtypes.
11540
11541       if Ada_Version >= Ada_2005
11542         and then Ekind (T) = E_Incomplete_Type
11543         and then Nkind (Parent (S)) = N_Subtype_Declaration
11544         and then not Is_Itype (Def_Id)
11545       then
11546          --  A little sanity check, emit an error message if the type
11547          --  has discriminants to begin with. Type T may be a regular
11548          --  incomplete type or imported via a limited with clause.
11549
11550          if Has_Discriminants (T)
11551            or else
11552              (From_With_Type (T)
11553                 and then Present (Non_Limited_View (T))
11554                 and then Nkind (Parent (Non_Limited_View (T))) =
11555                            N_Full_Type_Declaration
11556                 and then Present (Discriminant_Specifications
11557                           (Parent (Non_Limited_View (T)))))
11558          then
11559             Error_Msg_N
11560               ("(Ada 2005) incomplete subtype may not be constrained", C);
11561          else
11562             Error_Msg_N ("invalid constraint: type has no discriminant", C);
11563          end if;
11564
11565          Fixup_Bad_Constraint;
11566          return;
11567
11568       --  Check that the type has visible discriminants. The type may be
11569       --  a private type with unknown discriminants whose full view has
11570       --  discriminants which are invisible.
11571
11572       elsif not Has_Discriminants (T)
11573         or else
11574           (Has_Unknown_Discriminants (T)
11575              and then Is_Private_Type (T))
11576       then
11577          Error_Msg_N ("invalid constraint: type has no discriminant", C);
11578          Fixup_Bad_Constraint;
11579          return;
11580
11581       elsif Is_Constrained (E)
11582         or else (Ekind (E) = E_Class_Wide_Subtype
11583                   and then Present (Discriminant_Constraint (E)))
11584       then
11585          Error_Msg_N ("type is already constrained", Subtype_Mark (S));
11586          Fixup_Bad_Constraint;
11587          return;
11588       end if;
11589
11590       --  T may be an unconstrained subtype (e.g. a generic actual).
11591       --  Constraint applies to the base type.
11592
11593       T := Base_Type (T);
11594
11595       Elist := Build_Discriminant_Constraints (T, S);
11596
11597       --  If the list returned was empty we had an error in building the
11598       --  discriminant constraint. We have also already signalled an error
11599       --  in the incomplete type case
11600
11601       if Is_Empty_Elmt_List (Elist) then
11602          Fixup_Bad_Constraint;
11603          return;
11604       end if;
11605
11606       Build_Discriminated_Subtype (T, Def_Id, Elist, Related_Nod, For_Access);
11607    end Constrain_Discriminated_Type;
11608
11609    ---------------------------
11610    -- Constrain_Enumeration --
11611    ---------------------------
11612
11613    procedure Constrain_Enumeration (Def_Id : Node_Id; S : Node_Id) is
11614       T : constant Entity_Id := Entity (Subtype_Mark (S));
11615       C : constant Node_Id   := Constraint (S);
11616
11617    begin
11618       Set_Ekind (Def_Id, E_Enumeration_Subtype);
11619
11620       Set_First_Literal     (Def_Id, First_Literal (Base_Type (T)));
11621
11622       Set_Etype             (Def_Id, Base_Type         (T));
11623       Set_Size_Info         (Def_Id,                   (T));
11624       Set_First_Rep_Item    (Def_Id, First_Rep_Item    (T));
11625       Set_Is_Character_Type (Def_Id, Is_Character_Type (T));
11626
11627       Set_Scalar_Range_For_Subtype (Def_Id, Range_Expression (C), T);
11628
11629       Set_Discrete_RM_Size (Def_Id);
11630    end Constrain_Enumeration;
11631
11632    ----------------------
11633    -- Constrain_Float --
11634    ----------------------
11635
11636    procedure Constrain_Float (Def_Id : Node_Id; S : Node_Id) is
11637       T    : constant Entity_Id := Entity (Subtype_Mark (S));
11638       C    : Node_Id;
11639       D    : Node_Id;
11640       Rais : Node_Id;
11641
11642    begin
11643       Set_Ekind (Def_Id, E_Floating_Point_Subtype);
11644
11645       Set_Etype          (Def_Id, Base_Type      (T));
11646       Set_Size_Info      (Def_Id,                (T));
11647       Set_First_Rep_Item (Def_Id, First_Rep_Item (T));
11648
11649       --  Process the constraint
11650
11651       C := Constraint (S);
11652
11653       --  Digits constraint present
11654
11655       if Nkind (C) = N_Digits_Constraint then
11656
11657          Check_SPARK_Restriction ("digits constraint is not allowed", S);
11658          Check_Restriction (No_Obsolescent_Features, C);
11659
11660          if Warn_On_Obsolescent_Feature then
11661             Error_Msg_N
11662               ("subtype digits constraint is an " &
11663                "obsolescent feature (RM J.3(8))?", C);
11664          end if;
11665
11666          D := Digits_Expression (C);
11667          Analyze_And_Resolve (D, Any_Integer);
11668          Check_Digits_Expression (D);
11669          Set_Digits_Value (Def_Id, Expr_Value (D));
11670
11671          --  Check that digits value is in range. Obviously we can do this
11672          --  at compile time, but it is strictly a runtime check, and of
11673          --  course there is an ACVC test that checks this!
11674
11675          if Digits_Value (Def_Id) > Digits_Value (T) then
11676             Error_Msg_Uint_1 := Digits_Value (T);
11677             Error_Msg_N ("?digits value is too large, maximum is ^", D);
11678             Rais :=
11679               Make_Raise_Constraint_Error (Sloc (D),
11680                 Reason => CE_Range_Check_Failed);
11681             Insert_Action (Declaration_Node (Def_Id), Rais);
11682          end if;
11683
11684          C := Range_Constraint (C);
11685
11686       --  No digits constraint present
11687
11688       else
11689          Set_Digits_Value (Def_Id, Digits_Value (T));
11690       end if;
11691
11692       --  Range constraint present
11693
11694       if Nkind (C) = N_Range_Constraint then
11695          Set_Scalar_Range_For_Subtype (Def_Id, Range_Expression (C), T);
11696
11697       --  No range constraint present
11698
11699       else
11700          pragma Assert (No (C));
11701          Set_Scalar_Range (Def_Id, Scalar_Range (T));
11702       end if;
11703
11704       Set_Is_Constrained (Def_Id);
11705    end Constrain_Float;
11706
11707    ---------------------
11708    -- Constrain_Index --
11709    ---------------------
11710
11711    procedure Constrain_Index
11712      (Index        : Node_Id;
11713       S            : Node_Id;
11714       Related_Nod  : Node_Id;
11715       Related_Id   : Entity_Id;
11716       Suffix       : Character;
11717       Suffix_Index : Nat)
11718    is
11719       Def_Id : Entity_Id;
11720       R      : Node_Id := Empty;
11721       T      : constant Entity_Id := Etype (Index);
11722
11723    begin
11724       if Nkind (S) = N_Range
11725         or else
11726           (Nkind (S) = N_Attribute_Reference
11727             and then Attribute_Name (S) = Name_Range)
11728       then
11729          --  A Range attribute will be transformed into N_Range by Resolve
11730
11731          Analyze (S);
11732          Set_Etype (S, T);
11733          R := S;
11734
11735          Process_Range_Expr_In_Decl (R, T, Empty_List);
11736
11737          if not Error_Posted (S)
11738            and then
11739              (Nkind (S) /= N_Range
11740                or else not Covers (T, (Etype (Low_Bound (S))))
11741                or else not Covers (T, (Etype (High_Bound (S)))))
11742          then
11743             if Base_Type (T) /= Any_Type
11744               and then Etype (Low_Bound (S)) /= Any_Type
11745               and then Etype (High_Bound (S)) /= Any_Type
11746             then
11747                Error_Msg_N ("range expected", S);
11748             end if;
11749          end if;
11750
11751       elsif Nkind (S) = N_Subtype_Indication then
11752
11753          --  The parser has verified that this is a discrete indication
11754
11755          Resolve_Discrete_Subtype_Indication (S, T);
11756          R := Range_Expression (Constraint (S));
11757
11758          --  Capture values of bounds and generate temporaries for them if
11759          --  needed, since checks may cause duplication of the expressions
11760          --  which must not be reevaluated.
11761
11762          if Expander_Active then
11763             Force_Evaluation (Low_Bound (R));
11764             Force_Evaluation (High_Bound (R));
11765          end if;
11766
11767       elsif Nkind (S) = N_Discriminant_Association then
11768
11769          --  Syntactically valid in subtype indication
11770
11771          Error_Msg_N ("invalid index constraint", S);
11772          Rewrite (S, New_Occurrence_Of (T, Sloc (S)));
11773          return;
11774
11775       --  Subtype_Mark case, no anonymous subtypes to construct
11776
11777       else
11778          Analyze (S);
11779
11780          if Is_Entity_Name (S) then
11781             if not Is_Type (Entity (S)) then
11782                Error_Msg_N ("expect subtype mark for index constraint", S);
11783
11784             elsif Base_Type (Entity (S)) /= Base_Type (T) then
11785                Wrong_Type (S, Base_Type (T));
11786
11787             --  Check error of subtype with predicate in index constraint
11788
11789             else
11790                Bad_Predicated_Subtype_Use
11791                  ("subtype& has predicate, not allowed in index constraint",
11792                   S, Entity (S));
11793             end if;
11794
11795             return;
11796
11797          else
11798             Error_Msg_N ("invalid index constraint", S);
11799             Rewrite (S, New_Occurrence_Of (T, Sloc (S)));
11800             return;
11801          end if;
11802       end if;
11803
11804       Def_Id :=
11805         Create_Itype (E_Void, Related_Nod, Related_Id, Suffix, Suffix_Index);
11806
11807       Set_Etype (Def_Id, Base_Type (T));
11808
11809       if Is_Modular_Integer_Type (T) then
11810          Set_Ekind (Def_Id, E_Modular_Integer_Subtype);
11811
11812       elsif Is_Integer_Type (T) then
11813          Set_Ekind (Def_Id, E_Signed_Integer_Subtype);
11814
11815       else
11816          Set_Ekind (Def_Id, E_Enumeration_Subtype);
11817          Set_Is_Character_Type (Def_Id, Is_Character_Type (T));
11818          Set_First_Literal     (Def_Id, First_Literal (T));
11819       end if;
11820
11821       Set_Size_Info      (Def_Id,                (T));
11822       Set_RM_Size        (Def_Id, RM_Size        (T));
11823       Set_First_Rep_Item (Def_Id, First_Rep_Item (T));
11824
11825       Set_Scalar_Range   (Def_Id, R);
11826
11827       Set_Etype (S, Def_Id);
11828       Set_Discrete_RM_Size (Def_Id);
11829    end Constrain_Index;
11830
11831    -----------------------
11832    -- Constrain_Integer --
11833    -----------------------
11834
11835    procedure Constrain_Integer (Def_Id : Node_Id; S : Node_Id) is
11836       T : constant Entity_Id := Entity (Subtype_Mark (S));
11837       C : constant Node_Id   := Constraint (S);
11838
11839    begin
11840       Set_Scalar_Range_For_Subtype (Def_Id, Range_Expression (C), T);
11841
11842       if Is_Modular_Integer_Type (T) then
11843          Set_Ekind (Def_Id, E_Modular_Integer_Subtype);
11844       else
11845          Set_Ekind (Def_Id, E_Signed_Integer_Subtype);
11846       end if;
11847
11848       Set_Etype            (Def_Id, Base_Type        (T));
11849       Set_Size_Info        (Def_Id,                  (T));
11850       Set_First_Rep_Item   (Def_Id, First_Rep_Item   (T));
11851       Set_Discrete_RM_Size (Def_Id);
11852    end Constrain_Integer;
11853
11854    ------------------------------
11855    -- Constrain_Ordinary_Fixed --
11856    ------------------------------
11857
11858    procedure Constrain_Ordinary_Fixed (Def_Id : Node_Id; S : Node_Id) is
11859       T    : constant Entity_Id := Entity (Subtype_Mark (S));
11860       C    : Node_Id;
11861       D    : Node_Id;
11862       Rais : Node_Id;
11863
11864    begin
11865       Set_Ekind          (Def_Id, E_Ordinary_Fixed_Point_Subtype);
11866       Set_Etype          (Def_Id, Base_Type        (T));
11867       Set_Size_Info      (Def_Id,                  (T));
11868       Set_First_Rep_Item (Def_Id, First_Rep_Item   (T));
11869       Set_Small_Value    (Def_Id, Small_Value      (T));
11870
11871       --  Process the constraint
11872
11873       C := Constraint (S);
11874
11875       --  Delta constraint present
11876
11877       if Nkind (C) = N_Delta_Constraint then
11878
11879          Check_SPARK_Restriction ("delta constraint is not allowed", S);
11880          Check_Restriction (No_Obsolescent_Features, C);
11881
11882          if Warn_On_Obsolescent_Feature then
11883             Error_Msg_S
11884               ("subtype delta constraint is an " &
11885                "obsolescent feature (RM J.3(7))?");
11886          end if;
11887
11888          D := Delta_Expression (C);
11889          Analyze_And_Resolve (D, Any_Real);
11890          Check_Delta_Expression (D);
11891          Set_Delta_Value (Def_Id, Expr_Value_R (D));
11892
11893          --  Check that delta value is in range. Obviously we can do this
11894          --  at compile time, but it is strictly a runtime check, and of
11895          --  course there is an ACVC test that checks this!
11896
11897          if Delta_Value (Def_Id) < Delta_Value (T) then
11898             Error_Msg_N ("?delta value is too small", D);
11899             Rais :=
11900               Make_Raise_Constraint_Error (Sloc (D),
11901                 Reason => CE_Range_Check_Failed);
11902             Insert_Action (Declaration_Node (Def_Id), Rais);
11903          end if;
11904
11905          C := Range_Constraint (C);
11906
11907       --  No delta constraint present
11908
11909       else
11910          Set_Delta_Value (Def_Id, Delta_Value (T));
11911       end if;
11912
11913       --  Range constraint present
11914
11915       if Nkind (C) = N_Range_Constraint then
11916          Set_Scalar_Range_For_Subtype (Def_Id, Range_Expression (C), T);
11917
11918       --  No range constraint present
11919
11920       else
11921          pragma Assert (No (C));
11922          Set_Scalar_Range (Def_Id, Scalar_Range (T));
11923
11924       end if;
11925
11926       Set_Discrete_RM_Size (Def_Id);
11927
11928       --  Unconditionally delay the freeze, since we cannot set size
11929       --  information in all cases correctly until the freeze point.
11930
11931       Set_Has_Delayed_Freeze (Def_Id);
11932    end Constrain_Ordinary_Fixed;
11933
11934    -----------------------
11935    -- Contain_Interface --
11936    -----------------------
11937
11938    function Contain_Interface
11939      (Iface  : Entity_Id;
11940       Ifaces : Elist_Id) return Boolean
11941    is
11942       Iface_Elmt : Elmt_Id;
11943
11944    begin
11945       if Present (Ifaces) then
11946          Iface_Elmt := First_Elmt (Ifaces);
11947          while Present (Iface_Elmt) loop
11948             if Node (Iface_Elmt) = Iface then
11949                return True;
11950             end if;
11951
11952             Next_Elmt (Iface_Elmt);
11953          end loop;
11954       end if;
11955
11956       return False;
11957    end Contain_Interface;
11958
11959    ---------------------------
11960    -- Convert_Scalar_Bounds --
11961    ---------------------------
11962
11963    procedure Convert_Scalar_Bounds
11964      (N            : Node_Id;
11965       Parent_Type  : Entity_Id;
11966       Derived_Type : Entity_Id;
11967       Loc          : Source_Ptr)
11968    is
11969       Implicit_Base : constant Entity_Id := Base_Type (Derived_Type);
11970
11971       Lo  : Node_Id;
11972       Hi  : Node_Id;
11973       Rng : Node_Id;
11974
11975    begin
11976       --  Defend against previous errors
11977
11978       if No (Scalar_Range (Derived_Type)) then
11979          return;
11980       end if;
11981
11982       Lo := Build_Scalar_Bound
11983               (Type_Low_Bound (Derived_Type),
11984                Parent_Type, Implicit_Base);
11985
11986       Hi := Build_Scalar_Bound
11987               (Type_High_Bound (Derived_Type),
11988                Parent_Type, Implicit_Base);
11989
11990       Rng :=
11991         Make_Range (Loc,
11992           Low_Bound  => Lo,
11993           High_Bound => Hi);
11994
11995       Set_Includes_Infinities (Rng, Has_Infinities (Derived_Type));
11996
11997       Set_Parent (Rng, N);
11998       Set_Scalar_Range (Derived_Type, Rng);
11999
12000       --  Analyze the bounds
12001
12002       Analyze_And_Resolve (Lo, Implicit_Base);
12003       Analyze_And_Resolve (Hi, Implicit_Base);
12004
12005       --  Analyze the range itself, except that we do not analyze it if
12006       --  the bounds are real literals, and we have a fixed-point type.
12007       --  The reason for this is that we delay setting the bounds in this
12008       --  case till we know the final Small and Size values (see circuit
12009       --  in Freeze.Freeze_Fixed_Point_Type for further details).
12010
12011       if Is_Fixed_Point_Type (Parent_Type)
12012         and then Nkind (Lo) = N_Real_Literal
12013         and then Nkind (Hi) = N_Real_Literal
12014       then
12015          return;
12016
12017       --  Here we do the analysis of the range
12018
12019       --  Note: we do this manually, since if we do a normal Analyze and
12020       --  Resolve call, there are problems with the conversions used for
12021       --  the derived type range.
12022
12023       else
12024          Set_Etype    (Rng, Implicit_Base);
12025          Set_Analyzed (Rng, True);
12026       end if;
12027    end Convert_Scalar_Bounds;
12028
12029    -------------------
12030    -- Copy_And_Swap --
12031    -------------------
12032
12033    procedure Copy_And_Swap (Priv, Full : Entity_Id) is
12034    begin
12035       --  Initialize new full declaration entity by copying the pertinent
12036       --  fields of the corresponding private declaration entity.
12037
12038       --  We temporarily set Ekind to a value appropriate for a type to
12039       --  avoid assert failures in Einfo from checking for setting type
12040       --  attributes on something that is not a type. Ekind (Priv) is an
12041       --  appropriate choice, since it allowed the attributes to be set
12042       --  in the first place. This Ekind value will be modified later.
12043
12044       Set_Ekind (Full, Ekind (Priv));
12045
12046       --  Also set Etype temporarily to Any_Type, again, in the absence
12047       --  of errors, it will be properly reset, and if there are errors,
12048       --  then we want a value of Any_Type to remain.
12049
12050       Set_Etype (Full, Any_Type);
12051
12052       --  Now start copying attributes
12053
12054       Set_Has_Discriminants          (Full, Has_Discriminants       (Priv));
12055
12056       if Has_Discriminants (Full) then
12057          Set_Discriminant_Constraint (Full, Discriminant_Constraint (Priv));
12058          Set_Stored_Constraint       (Full, Stored_Constraint       (Priv));
12059       end if;
12060
12061       Set_First_Rep_Item             (Full, First_Rep_Item          (Priv));
12062       Set_Homonym                    (Full, Homonym                 (Priv));
12063       Set_Is_Immediately_Visible     (Full, Is_Immediately_Visible  (Priv));
12064       Set_Is_Public                  (Full, Is_Public               (Priv));
12065       Set_Is_Pure                    (Full, Is_Pure                 (Priv));
12066       Set_Is_Tagged_Type             (Full, Is_Tagged_Type          (Priv));
12067       Set_Has_Pragma_Unmodified      (Full, Has_Pragma_Unmodified   (Priv));
12068       Set_Has_Pragma_Unreferenced    (Full, Has_Pragma_Unreferenced (Priv));
12069       Set_Has_Pragma_Unreferenced_Objects
12070                                      (Full, Has_Pragma_Unreferenced_Objects
12071                                                                     (Priv));
12072
12073       Conditional_Delay              (Full,                          Priv);
12074
12075       if Is_Tagged_Type (Full) then
12076          Set_Direct_Primitive_Operations (Full,
12077            Direct_Primitive_Operations (Priv));
12078
12079          if Is_Base_Type (Priv) then
12080             Set_Class_Wide_Type      (Full, Class_Wide_Type         (Priv));
12081          end if;
12082       end if;
12083
12084       Set_Is_Volatile                (Full, Is_Volatile             (Priv));
12085       Set_Treat_As_Volatile          (Full, Treat_As_Volatile       (Priv));
12086       Set_Scope                      (Full, Scope                   (Priv));
12087       Set_Next_Entity                (Full, Next_Entity             (Priv));
12088       Set_First_Entity               (Full, First_Entity            (Priv));
12089       Set_Last_Entity                (Full, Last_Entity             (Priv));
12090
12091       --  If access types have been recorded for later handling, keep them in
12092       --  the full view so that they get handled when the full view freeze
12093       --  node is expanded.
12094
12095       if Present (Freeze_Node (Priv))
12096         and then Present (Access_Types_To_Process (Freeze_Node (Priv)))
12097       then
12098          Ensure_Freeze_Node (Full);
12099          Set_Access_Types_To_Process
12100            (Freeze_Node (Full),
12101             Access_Types_To_Process (Freeze_Node (Priv)));
12102       end if;
12103
12104       --  Swap the two entities. Now Private is the full type entity and Full
12105       --  is the private one. They will be swapped back at the end of the
12106       --  private part. This swapping ensures that the entity that is visible
12107       --  in the private part is the full declaration.
12108
12109       Exchange_Entities (Priv, Full);
12110       Append_Entity (Full, Scope (Full));
12111    end Copy_And_Swap;
12112
12113    -------------------------------------
12114    -- Copy_Array_Base_Type_Attributes --
12115    -------------------------------------
12116
12117    procedure Copy_Array_Base_Type_Attributes (T1, T2 : Entity_Id) is
12118    begin
12119       Set_Component_Alignment      (T1, Component_Alignment      (T2));
12120       Set_Component_Type           (T1, Component_Type           (T2));
12121       Set_Component_Size           (T1, Component_Size           (T2));
12122       Set_Has_Controlled_Component (T1, Has_Controlled_Component (T2));
12123       Set_Finalize_Storage_Only    (T1, Finalize_Storage_Only    (T2));
12124       Set_Has_Non_Standard_Rep     (T1, Has_Non_Standard_Rep     (T2));
12125       Set_Has_Task                 (T1, Has_Task                 (T2));
12126       Set_Is_Packed                (T1, Is_Packed                (T2));
12127       Set_Has_Aliased_Components   (T1, Has_Aliased_Components   (T2));
12128       Set_Has_Atomic_Components    (T1, Has_Atomic_Components    (T2));
12129       Set_Has_Volatile_Components  (T1, Has_Volatile_Components  (T2));
12130    end Copy_Array_Base_Type_Attributes;
12131
12132    -----------------------------------
12133    -- Copy_Array_Subtype_Attributes --
12134    -----------------------------------
12135
12136    procedure Copy_Array_Subtype_Attributes (T1, T2 : Entity_Id) is
12137    begin
12138       Set_Size_Info (T1, T2);
12139
12140       Set_First_Index          (T1, First_Index           (T2));
12141       Set_Is_Aliased           (T1, Is_Aliased            (T2));
12142       Set_Is_Atomic            (T1, Is_Atomic             (T2));
12143       Set_Is_Volatile          (T1, Is_Volatile           (T2));
12144       Set_Treat_As_Volatile    (T1, Treat_As_Volatile     (T2));
12145       Set_Is_Constrained       (T1, Is_Constrained        (T2));
12146       Set_Depends_On_Private   (T1, Has_Private_Component (T2));
12147       Set_First_Rep_Item       (T1, First_Rep_Item        (T2));
12148       Set_Convention           (T1, Convention            (T2));
12149       Set_Is_Limited_Composite (T1, Is_Limited_Composite  (T2));
12150       Set_Is_Private_Composite (T1, Is_Private_Composite  (T2));
12151       Set_Packed_Array_Type    (T1, Packed_Array_Type     (T2));
12152    end Copy_Array_Subtype_Attributes;
12153
12154    -----------------------------------
12155    -- Create_Constrained_Components --
12156    -----------------------------------
12157
12158    procedure Create_Constrained_Components
12159      (Subt        : Entity_Id;
12160       Decl_Node   : Node_Id;
12161       Typ         : Entity_Id;
12162       Constraints : Elist_Id)
12163    is
12164       Loc         : constant Source_Ptr := Sloc (Subt);
12165       Comp_List   : constant Elist_Id   := New_Elmt_List;
12166       Parent_Type : constant Entity_Id  := Etype (Typ);
12167       Assoc_List  : constant List_Id    := New_List;
12168       Discr_Val   : Elmt_Id;
12169       Errors      : Boolean;
12170       New_C       : Entity_Id;
12171       Old_C       : Entity_Id;
12172       Is_Static   : Boolean := True;
12173
12174       procedure Collect_Fixed_Components (Typ : Entity_Id);
12175       --  Collect parent type components that do not appear in a variant part
12176
12177       procedure Create_All_Components;
12178       --  Iterate over Comp_List to create the components of the subtype
12179
12180       function Create_Component (Old_Compon : Entity_Id) return Entity_Id;
12181       --  Creates a new component from Old_Compon, copying all the fields from
12182       --  it, including its Etype, inserts the new component in the Subt entity
12183       --  chain and returns the new component.
12184
12185       function Is_Variant_Record (T : Entity_Id) return Boolean;
12186       --  If true, and discriminants are static, collect only components from
12187       --  variants selected by discriminant values.
12188
12189       ------------------------------
12190       -- Collect_Fixed_Components --
12191       ------------------------------
12192
12193       procedure Collect_Fixed_Components (Typ : Entity_Id) is
12194       begin
12195       --  Build association list for discriminants, and find components of the
12196       --  variant part selected by the values of the discriminants.
12197
12198          Old_C := First_Discriminant (Typ);
12199          Discr_Val := First_Elmt (Constraints);
12200          while Present (Old_C) loop
12201             Append_To (Assoc_List,
12202               Make_Component_Association (Loc,
12203                  Choices    => New_List (New_Occurrence_Of (Old_C, Loc)),
12204                  Expression => New_Copy (Node (Discr_Val))));
12205
12206             Next_Elmt (Discr_Val);
12207             Next_Discriminant (Old_C);
12208          end loop;
12209
12210          --  The tag and the possible parent component are unconditionally in
12211          --  the subtype.
12212
12213          if Is_Tagged_Type (Typ)
12214            or else Has_Controlled_Component (Typ)
12215          then
12216             Old_C := First_Component (Typ);
12217             while Present (Old_C) loop
12218                if Chars ((Old_C)) = Name_uTag
12219                  or else Chars ((Old_C)) = Name_uParent
12220                then
12221                   Append_Elmt (Old_C, Comp_List);
12222                end if;
12223
12224                Next_Component (Old_C);
12225             end loop;
12226          end if;
12227       end Collect_Fixed_Components;
12228
12229       ---------------------------
12230       -- Create_All_Components --
12231       ---------------------------
12232
12233       procedure Create_All_Components is
12234          Comp : Elmt_Id;
12235
12236       begin
12237          Comp := First_Elmt (Comp_List);
12238          while Present (Comp) loop
12239             Old_C := Node (Comp);
12240             New_C := Create_Component (Old_C);
12241
12242             Set_Etype
12243               (New_C,
12244                Constrain_Component_Type
12245                  (Old_C, Subt, Decl_Node, Typ, Constraints));
12246             Set_Is_Public (New_C, Is_Public (Subt));
12247
12248             Next_Elmt (Comp);
12249          end loop;
12250       end Create_All_Components;
12251
12252       ----------------------
12253       -- Create_Component --
12254       ----------------------
12255
12256       function Create_Component (Old_Compon : Entity_Id) return Entity_Id is
12257          New_Compon : constant Entity_Id := New_Copy (Old_Compon);
12258
12259       begin
12260          if Ekind (Old_Compon) = E_Discriminant
12261            and then Is_Completely_Hidden (Old_Compon)
12262          then
12263             --  This is a shadow discriminant created for a discriminant of
12264             --  the parent type, which needs to be present in the subtype.
12265             --  Give the shadow discriminant an internal name that cannot
12266             --  conflict with that of visible components.
12267
12268             Set_Chars (New_Compon, New_Internal_Name ('C'));
12269          end if;
12270
12271          --  Set the parent so we have a proper link for freezing etc. This is
12272          --  not a real parent pointer, since of course our parent does not own
12273          --  up to us and reference us, we are an illegitimate child of the
12274          --  original parent!
12275
12276          Set_Parent (New_Compon, Parent (Old_Compon));
12277
12278          --  If the old component's Esize was already determined and is a
12279          --  static value, then the new component simply inherits it. Otherwise
12280          --  the old component's size may require run-time determination, but
12281          --  the new component's size still might be statically determinable
12282          --  (if, for example it has a static constraint). In that case we want
12283          --  Layout_Type to recompute the component's size, so we reset its
12284          --  size and positional fields.
12285
12286          if Frontend_Layout_On_Target
12287            and then not Known_Static_Esize (Old_Compon)
12288          then
12289             Set_Esize (New_Compon, Uint_0);
12290             Init_Normalized_First_Bit    (New_Compon);
12291             Init_Normalized_Position     (New_Compon);
12292             Init_Normalized_Position_Max (New_Compon);
12293          end if;
12294
12295          --  We do not want this node marked as Comes_From_Source, since
12296          --  otherwise it would get first class status and a separate cross-
12297          --  reference line would be generated. Illegitimate children do not
12298          --  rate such recognition.
12299
12300          Set_Comes_From_Source (New_Compon, False);
12301
12302          --  But it is a real entity, and a birth certificate must be properly
12303          --  registered by entering it into the entity list.
12304
12305          Enter_Name (New_Compon);
12306
12307          return New_Compon;
12308       end Create_Component;
12309
12310       -----------------------
12311       -- Is_Variant_Record --
12312       -----------------------
12313
12314       function Is_Variant_Record (T : Entity_Id) return Boolean is
12315       begin
12316          return Nkind (Parent (T)) = N_Full_Type_Declaration
12317            and then Nkind (Type_Definition (Parent (T))) = N_Record_Definition
12318            and then Present (Component_List (Type_Definition (Parent (T))))
12319            and then
12320              Present
12321                (Variant_Part (Component_List (Type_Definition (Parent (T)))));
12322       end Is_Variant_Record;
12323
12324    --  Start of processing for Create_Constrained_Components
12325
12326    begin
12327       pragma Assert (Subt /= Base_Type (Subt));
12328       pragma Assert (Typ = Base_Type (Typ));
12329
12330       Set_First_Entity (Subt, Empty);
12331       Set_Last_Entity  (Subt, Empty);
12332
12333       --  Check whether constraint is fully static, in which case we can
12334       --  optimize the list of components.
12335
12336       Discr_Val := First_Elmt (Constraints);
12337       while Present (Discr_Val) loop
12338          if not Is_OK_Static_Expression (Node (Discr_Val)) then
12339             Is_Static := False;
12340             exit;
12341          end if;
12342
12343          Next_Elmt (Discr_Val);
12344       end loop;
12345
12346       Set_Has_Static_Discriminants (Subt, Is_Static);
12347
12348       Push_Scope (Subt);
12349
12350       --  Inherit the discriminants of the parent type
12351
12352       Add_Discriminants : declare
12353          Num_Disc : Int;
12354          Num_Gird : Int;
12355
12356       begin
12357          Num_Disc := 0;
12358          Old_C := First_Discriminant (Typ);
12359
12360          while Present (Old_C) loop
12361             Num_Disc := Num_Disc + 1;
12362             New_C := Create_Component (Old_C);
12363             Set_Is_Public (New_C, Is_Public (Subt));
12364             Next_Discriminant (Old_C);
12365          end loop;
12366
12367          --  For an untagged derived subtype, the number of discriminants may
12368          --  be smaller than the number of inherited discriminants, because
12369          --  several of them may be renamed by a single new discriminant or
12370          --  constrained. In this case, add the hidden discriminants back into
12371          --  the subtype, because they need to be present if the optimizer of
12372          --  the GCC 4.x back-end decides to break apart assignments between
12373          --  objects using the parent view into member-wise assignments.
12374
12375          Num_Gird := 0;
12376
12377          if Is_Derived_Type (Typ)
12378            and then not Is_Tagged_Type (Typ)
12379          then
12380             Old_C := First_Stored_Discriminant (Typ);
12381
12382             while Present (Old_C) loop
12383                Num_Gird := Num_Gird + 1;
12384                Next_Stored_Discriminant (Old_C);
12385             end loop;
12386          end if;
12387
12388          if Num_Gird > Num_Disc then
12389
12390             --  Find out multiple uses of new discriminants, and add hidden
12391             --  components for the extra renamed discriminants. We recognize
12392             --  multiple uses through the Corresponding_Discriminant of a
12393             --  new discriminant: if it constrains several old discriminants,
12394             --  this field points to the last one in the parent type. The
12395             --  stored discriminants of the derived type have the same name
12396             --  as those of the parent.
12397
12398             declare
12399                Constr    : Elmt_Id;
12400                New_Discr : Entity_Id;
12401                Old_Discr : Entity_Id;
12402
12403             begin
12404                Constr    := First_Elmt (Stored_Constraint (Typ));
12405                Old_Discr := First_Stored_Discriminant (Typ);
12406                while Present (Constr) loop
12407                   if Is_Entity_Name (Node (Constr))
12408                     and then Ekind (Entity (Node (Constr))) = E_Discriminant
12409                   then
12410                      New_Discr := Entity (Node (Constr));
12411
12412                      if Chars (Corresponding_Discriminant (New_Discr)) /=
12413                         Chars (Old_Discr)
12414                      then
12415                         --  The new discriminant has been used to rename a
12416                         --  subsequent old discriminant. Introduce a shadow
12417                         --  component for the current old discriminant.
12418
12419                         New_C := Create_Component (Old_Discr);
12420                         Set_Original_Record_Component (New_C, Old_Discr);
12421                      end if;
12422
12423                   else
12424                      --  The constraint has eliminated the old discriminant.
12425                      --  Introduce a shadow component.
12426
12427                      New_C := Create_Component (Old_Discr);
12428                      Set_Original_Record_Component (New_C, Old_Discr);
12429                   end if;
12430
12431                   Next_Elmt (Constr);
12432                   Next_Stored_Discriminant (Old_Discr);
12433                end loop;
12434             end;
12435          end if;
12436       end Add_Discriminants;
12437
12438       if Is_Static
12439         and then Is_Variant_Record (Typ)
12440       then
12441          Collect_Fixed_Components (Typ);
12442
12443          Gather_Components (
12444            Typ,
12445            Component_List (Type_Definition (Parent (Typ))),
12446            Governed_By   => Assoc_List,
12447            Into          => Comp_List,
12448            Report_Errors => Errors);
12449          pragma Assert (not Errors);
12450
12451          Create_All_Components;
12452
12453       --  If the subtype declaration is created for a tagged type derivation
12454       --  with constraints, we retrieve the record definition of the parent
12455       --  type to select the components of the proper variant.
12456
12457       elsif Is_Static
12458         and then Is_Tagged_Type (Typ)
12459         and then Nkind (Parent (Typ)) = N_Full_Type_Declaration
12460         and then
12461           Nkind (Type_Definition (Parent (Typ))) = N_Derived_Type_Definition
12462         and then Is_Variant_Record (Parent_Type)
12463       then
12464          Collect_Fixed_Components (Typ);
12465
12466          Gather_Components (
12467            Typ,
12468            Component_List (Type_Definition (Parent (Parent_Type))),
12469            Governed_By   => Assoc_List,
12470            Into          => Comp_List,
12471            Report_Errors => Errors);
12472          pragma Assert (not Errors);
12473
12474          --  If the tagged derivation has a type extension, collect all the
12475          --  new components therein.
12476
12477          if Present
12478               (Record_Extension_Part (Type_Definition (Parent (Typ))))
12479          then
12480             Old_C := First_Component (Typ);
12481             while Present (Old_C) loop
12482                if Original_Record_Component (Old_C) = Old_C
12483                 and then Chars (Old_C) /= Name_uTag
12484                 and then Chars (Old_C) /= Name_uParent
12485                then
12486                   Append_Elmt (Old_C, Comp_List);
12487                end if;
12488
12489                Next_Component (Old_C);
12490             end loop;
12491          end if;
12492
12493          Create_All_Components;
12494
12495       else
12496          --  If discriminants are not static, or if this is a multi-level type
12497          --  extension, we have to include all components of the parent type.
12498
12499          Old_C := First_Component (Typ);
12500          while Present (Old_C) loop
12501             New_C := Create_Component (Old_C);
12502
12503             Set_Etype
12504               (New_C,
12505                Constrain_Component_Type
12506                  (Old_C, Subt, Decl_Node, Typ, Constraints));
12507             Set_Is_Public (New_C, Is_Public (Subt));
12508
12509             Next_Component (Old_C);
12510          end loop;
12511       end if;
12512
12513       End_Scope;
12514    end Create_Constrained_Components;
12515
12516    ------------------------------------------
12517    -- Decimal_Fixed_Point_Type_Declaration --
12518    ------------------------------------------
12519
12520    procedure Decimal_Fixed_Point_Type_Declaration
12521      (T   : Entity_Id;
12522       Def : Node_Id)
12523    is
12524       Loc           : constant Source_Ptr := Sloc (Def);
12525       Digs_Expr     : constant Node_Id    := Digits_Expression (Def);
12526       Delta_Expr    : constant Node_Id    := Delta_Expression (Def);
12527       Implicit_Base : Entity_Id;
12528       Digs_Val      : Uint;
12529       Delta_Val     : Ureal;
12530       Scale_Val     : Uint;
12531       Bound_Val     : Ureal;
12532
12533    begin
12534       Check_SPARK_Restriction
12535         ("decimal fixed point type is not allowed", Def);
12536       Check_Restriction (No_Fixed_Point, Def);
12537
12538       --  Create implicit base type
12539
12540       Implicit_Base :=
12541         Create_Itype (E_Decimal_Fixed_Point_Type, Parent (Def), T, 'B');
12542       Set_Etype (Implicit_Base, Implicit_Base);
12543
12544       --  Analyze and process delta expression
12545
12546       Analyze_And_Resolve (Delta_Expr, Universal_Real);
12547
12548       Check_Delta_Expression (Delta_Expr);
12549       Delta_Val := Expr_Value_R (Delta_Expr);
12550
12551       --  Check delta is power of 10, and determine scale value from it
12552
12553       declare
12554          Val : Ureal;
12555
12556       begin
12557          Scale_Val := Uint_0;
12558          Val := Delta_Val;
12559
12560          if Val < Ureal_1 then
12561             while Val < Ureal_1 loop
12562                Val := Val * Ureal_10;
12563                Scale_Val := Scale_Val + 1;
12564             end loop;
12565
12566             if Scale_Val > 18 then
12567                Error_Msg_N ("scale exceeds maximum value of 18", Def);
12568                Scale_Val := UI_From_Int (+18);
12569             end if;
12570
12571          else
12572             while Val > Ureal_1 loop
12573                Val := Val / Ureal_10;
12574                Scale_Val := Scale_Val - 1;
12575             end loop;
12576
12577             if Scale_Val < -18 then
12578                Error_Msg_N ("scale is less than minimum value of -18", Def);
12579                Scale_Val := UI_From_Int (-18);
12580             end if;
12581          end if;
12582
12583          if Val /= Ureal_1 then
12584             Error_Msg_N ("delta expression must be a power of 10", Def);
12585             Delta_Val := Ureal_10 ** (-Scale_Val);
12586          end if;
12587       end;
12588
12589       --  Set delta, scale and small (small = delta for decimal type)
12590
12591       Set_Delta_Value (Implicit_Base, Delta_Val);
12592       Set_Scale_Value (Implicit_Base, Scale_Val);
12593       Set_Small_Value (Implicit_Base, Delta_Val);
12594
12595       --  Analyze and process digits expression
12596
12597       Analyze_And_Resolve (Digs_Expr, Any_Integer);
12598       Check_Digits_Expression (Digs_Expr);
12599       Digs_Val := Expr_Value (Digs_Expr);
12600
12601       if Digs_Val > 18 then
12602          Digs_Val := UI_From_Int (+18);
12603          Error_Msg_N ("digits value out of range, maximum is 18", Digs_Expr);
12604       end if;
12605
12606       Set_Digits_Value (Implicit_Base, Digs_Val);
12607       Bound_Val := UR_From_Uint (10 ** Digs_Val - 1) * Delta_Val;
12608
12609       --  Set range of base type from digits value for now. This will be
12610       --  expanded to represent the true underlying base range by Freeze.
12611
12612       Set_Fixed_Range (Implicit_Base, Loc, -Bound_Val, Bound_Val);
12613
12614       --  Note: We leave size as zero for now, size will be set at freeze
12615       --  time. We have to do this for ordinary fixed-point, because the size
12616       --  depends on the specified small, and we might as well do the same for
12617       --  decimal fixed-point.
12618
12619       pragma Assert (Esize (Implicit_Base) = Uint_0);
12620
12621       --  If there are bounds given in the declaration use them as the
12622       --  bounds of the first named subtype.
12623
12624       if Present (Real_Range_Specification (Def)) then
12625          declare
12626             RRS      : constant Node_Id := Real_Range_Specification (Def);
12627             Low      : constant Node_Id := Low_Bound (RRS);
12628             High     : constant Node_Id := High_Bound (RRS);
12629             Low_Val  : Ureal;
12630             High_Val : Ureal;
12631
12632          begin
12633             Analyze_And_Resolve (Low, Any_Real);
12634             Analyze_And_Resolve (High, Any_Real);
12635             Check_Real_Bound (Low);
12636             Check_Real_Bound (High);
12637             Low_Val := Expr_Value_R (Low);
12638             High_Val := Expr_Value_R (High);
12639
12640             if Low_Val < (-Bound_Val) then
12641                Error_Msg_N
12642                  ("range low bound too small for digits value", Low);
12643                Low_Val := -Bound_Val;
12644             end if;
12645
12646             if High_Val > Bound_Val then
12647                Error_Msg_N
12648                  ("range high bound too large for digits value", High);
12649                High_Val := Bound_Val;
12650             end if;
12651
12652             Set_Fixed_Range (T, Loc, Low_Val, High_Val);
12653          end;
12654
12655       --  If no explicit range, use range that corresponds to given
12656       --  digits value. This will end up as the final range for the
12657       --  first subtype.
12658
12659       else
12660          Set_Fixed_Range (T, Loc, -Bound_Val, Bound_Val);
12661       end if;
12662
12663       --  Complete entity for first subtype
12664
12665       Set_Ekind          (T, E_Decimal_Fixed_Point_Subtype);
12666       Set_Etype          (T, Implicit_Base);
12667       Set_Size_Info      (T, Implicit_Base);
12668       Set_First_Rep_Item (T, First_Rep_Item (Implicit_Base));
12669       Set_Digits_Value   (T, Digs_Val);
12670       Set_Delta_Value    (T, Delta_Val);
12671       Set_Small_Value    (T, Delta_Val);
12672       Set_Scale_Value    (T, Scale_Val);
12673       Set_Is_Constrained (T);
12674    end Decimal_Fixed_Point_Type_Declaration;
12675
12676    -----------------------------------
12677    -- Derive_Progenitor_Subprograms --
12678    -----------------------------------
12679
12680    procedure Derive_Progenitor_Subprograms
12681      (Parent_Type : Entity_Id;
12682       Tagged_Type : Entity_Id)
12683    is
12684       E          : Entity_Id;
12685       Elmt       : Elmt_Id;
12686       Iface      : Entity_Id;
12687       Iface_Elmt : Elmt_Id;
12688       Iface_Subp : Entity_Id;
12689       New_Subp   : Entity_Id := Empty;
12690       Prim_Elmt  : Elmt_Id;
12691       Subp       : Entity_Id;
12692       Typ        : Entity_Id;
12693
12694    begin
12695       pragma Assert (Ada_Version >= Ada_2005
12696         and then Is_Record_Type (Tagged_Type)
12697         and then Is_Tagged_Type (Tagged_Type)
12698         and then Has_Interfaces (Tagged_Type));
12699
12700       --  Step 1: Transfer to the full-view primitives associated with the
12701       --  partial-view that cover interface primitives. Conceptually this
12702       --  work should be done later by Process_Full_View; done here to
12703       --  simplify its implementation at later stages. It can be safely
12704       --  done here because interfaces must be visible in the partial and
12705       --  private view (RM 7.3(7.3/2)).
12706
12707       --  Small optimization: This work is only required if the parent is
12708       --  abstract. If the tagged type is not abstract, it cannot have
12709       --  abstract primitives (the only entities in the list of primitives of
12710       --  non-abstract tagged types that can reference abstract primitives
12711       --  through its Alias attribute are the internal entities that have
12712       --  attribute Interface_Alias, and these entities are generated later
12713       --  by Add_Internal_Interface_Entities).
12714
12715       if In_Private_Part (Current_Scope)
12716         and then Is_Abstract_Type (Parent_Type)
12717       then
12718          Elmt := First_Elmt (Primitive_Operations (Tagged_Type));
12719          while Present (Elmt) loop
12720             Subp := Node (Elmt);
12721
12722             --  At this stage it is not possible to have entities in the list
12723             --  of primitives that have attribute Interface_Alias
12724
12725             pragma Assert (No (Interface_Alias (Subp)));
12726
12727             Typ := Find_Dispatching_Type (Ultimate_Alias (Subp));
12728
12729             if Is_Interface (Typ) then
12730                E := Find_Primitive_Covering_Interface
12731                       (Tagged_Type => Tagged_Type,
12732                        Iface_Prim  => Subp);
12733
12734                if Present (E)
12735                  and then Find_Dispatching_Type (Ultimate_Alias (E)) /= Typ
12736                then
12737                   Replace_Elmt (Elmt, E);
12738                   Remove_Homonym (Subp);
12739                end if;
12740             end if;
12741
12742             Next_Elmt (Elmt);
12743          end loop;
12744       end if;
12745
12746       --  Step 2: Add primitives of progenitors that are not implemented by
12747       --  parents of Tagged_Type
12748
12749       if Present (Interfaces (Base_Type (Tagged_Type))) then
12750          Iface_Elmt := First_Elmt (Interfaces (Base_Type (Tagged_Type)));
12751          while Present (Iface_Elmt) loop
12752             Iface := Node (Iface_Elmt);
12753
12754             Prim_Elmt := First_Elmt (Primitive_Operations (Iface));
12755             while Present (Prim_Elmt) loop
12756                Iface_Subp := Node (Prim_Elmt);
12757
12758                --  Exclude derivation of predefined primitives except those
12759                --  that come from source. Required to catch declarations of
12760                --  equality operators of interfaces. For example:
12761
12762                --     type Iface is interface;
12763                --     function "=" (Left, Right : Iface) return Boolean;
12764
12765                if not Is_Predefined_Dispatching_Operation (Iface_Subp)
12766                  or else Comes_From_Source (Iface_Subp)
12767                then
12768                   E := Find_Primitive_Covering_Interface
12769                          (Tagged_Type => Tagged_Type,
12770                           Iface_Prim  => Iface_Subp);
12771
12772                   --  If not found we derive a new primitive leaving its alias
12773                   --  attribute referencing the interface primitive
12774
12775                   if No (E) then
12776                      Derive_Subprogram
12777                        (New_Subp, Iface_Subp, Tagged_Type, Iface);
12778
12779                   --  Ada 2012 (AI05-0197): If the covering primitive's name
12780                   --  differs from the name of the interface primitive then it
12781                   --  is a private primitive inherited from a parent type. In
12782                   --  such case, given that Tagged_Type covers the interface,
12783                   --  the inherited private primitive becomes visible. For such
12784                   --  purpose we add a new entity that renames the inherited
12785                   --  private primitive.
12786
12787                   elsif Chars (E) /= Chars (Iface_Subp) then
12788                      pragma Assert (Has_Suffix (E, 'P'));
12789                      Derive_Subprogram
12790                        (New_Subp, Iface_Subp, Tagged_Type, Iface);
12791                      Set_Alias (New_Subp, E);
12792                      Set_Is_Abstract_Subprogram (New_Subp,
12793                        Is_Abstract_Subprogram (E));
12794
12795                   --  Propagate to the full view interface entities associated
12796                   --  with the partial view
12797
12798                   elsif In_Private_Part (Current_Scope)
12799                     and then Present (Alias (E))
12800                     and then Alias (E) = Iface_Subp
12801                     and then
12802                       List_Containing (Parent (E)) /=
12803                         Private_Declarations
12804                           (Specification
12805                             (Unit_Declaration_Node (Current_Scope)))
12806                   then
12807                      Append_Elmt (E, Primitive_Operations (Tagged_Type));
12808                   end if;
12809                end if;
12810
12811                Next_Elmt (Prim_Elmt);
12812             end loop;
12813
12814             Next_Elmt (Iface_Elmt);
12815          end loop;
12816       end if;
12817    end Derive_Progenitor_Subprograms;
12818
12819    -----------------------
12820    -- Derive_Subprogram --
12821    -----------------------
12822
12823    procedure Derive_Subprogram
12824      (New_Subp     : in out Entity_Id;
12825       Parent_Subp  : Entity_Id;
12826       Derived_Type : Entity_Id;
12827       Parent_Type  : Entity_Id;
12828       Actual_Subp  : Entity_Id := Empty)
12829    is
12830       Formal : Entity_Id;
12831       --  Formal parameter of parent primitive operation
12832
12833       Formal_Of_Actual : Entity_Id;
12834       --  Formal parameter of actual operation, when the derivation is to
12835       --  create a renaming for a primitive operation of an actual in an
12836       --  instantiation.
12837
12838       New_Formal : Entity_Id;
12839       --  Formal of inherited operation
12840
12841       Visible_Subp : Entity_Id := Parent_Subp;
12842
12843       function Is_Private_Overriding return Boolean;
12844       --  If Subp is a private overriding of a visible operation, the inherited
12845       --  operation derives from the overridden op (even though its body is the
12846       --  overriding one) and the inherited operation is visible now. See
12847       --  sem_disp to see the full details of the handling of the overridden
12848       --  subprogram, which is removed from the list of primitive operations of
12849       --  the type. The overridden subprogram is saved locally in Visible_Subp,
12850       --  and used to diagnose abstract operations that need overriding in the
12851       --  derived type.
12852
12853       procedure Replace_Type (Id, New_Id : Entity_Id);
12854       --  When the type is an anonymous access type, create a new access type
12855       --  designating the derived type.
12856
12857       procedure Set_Derived_Name;
12858       --  This procedure sets the appropriate Chars name for New_Subp. This
12859       --  is normally just a copy of the parent name. An exception arises for
12860       --  type support subprograms, where the name is changed to reflect the
12861       --  name of the derived type, e.g. if type foo is derived from type bar,
12862       --  then a procedure barDA is derived with a name fooDA.
12863
12864       ---------------------------
12865       -- Is_Private_Overriding --
12866       ---------------------------
12867
12868       function Is_Private_Overriding return Boolean is
12869          Prev : Entity_Id;
12870
12871       begin
12872          --  If the parent is not a dispatching operation there is no
12873          --  need to investigate overridings
12874
12875          if not Is_Dispatching_Operation (Parent_Subp) then
12876             return False;
12877          end if;
12878
12879          --  The visible operation that is overridden is a homonym of the
12880          --  parent subprogram. We scan the homonym chain to find the one
12881          --  whose alias is the subprogram we are deriving.
12882
12883          Prev := Current_Entity (Parent_Subp);
12884          while Present (Prev) loop
12885             if Ekind (Prev) = Ekind (Parent_Subp)
12886               and then Alias (Prev) = Parent_Subp
12887               and then Scope (Parent_Subp) = Scope (Prev)
12888               and then not Is_Hidden (Prev)
12889             then
12890                Visible_Subp := Prev;
12891                return True;
12892             end if;
12893
12894             Prev := Homonym (Prev);
12895          end loop;
12896
12897          return False;
12898       end Is_Private_Overriding;
12899
12900       ------------------
12901       -- Replace_Type --
12902       ------------------
12903
12904       procedure Replace_Type (Id, New_Id : Entity_Id) is
12905          Acc_Type : Entity_Id;
12906          Par      : constant Node_Id := Parent (Derived_Type);
12907
12908       begin
12909          --  When the type is an anonymous access type, create a new access
12910          --  type designating the derived type. This itype must be elaborated
12911          --  at the point of the derivation, not on subsequent calls that may
12912          --  be out of the proper scope for Gigi, so we insert a reference to
12913          --  it after the derivation.
12914
12915          if Ekind (Etype (Id)) = E_Anonymous_Access_Type then
12916             declare
12917                Desig_Typ : Entity_Id := Designated_Type (Etype (Id));
12918
12919             begin
12920                if Ekind (Desig_Typ) = E_Record_Type_With_Private
12921                  and then Present (Full_View (Desig_Typ))
12922                  and then not Is_Private_Type (Parent_Type)
12923                then
12924                   Desig_Typ := Full_View (Desig_Typ);
12925                end if;
12926
12927                if Base_Type (Desig_Typ) = Base_Type (Parent_Type)
12928
12929                   --  Ada 2005 (AI-251): Handle also derivations of abstract
12930                   --  interface primitives.
12931
12932                  or else (Is_Interface (Desig_Typ)
12933                           and then not Is_Class_Wide_Type (Desig_Typ))
12934                then
12935                   Acc_Type := New_Copy (Etype (Id));
12936                   Set_Etype (Acc_Type, Acc_Type);
12937                   Set_Scope (Acc_Type, New_Subp);
12938
12939                   --  Compute size of anonymous access type
12940
12941                   if Is_Array_Type (Desig_Typ)
12942                     and then not Is_Constrained (Desig_Typ)
12943                   then
12944                      Init_Size (Acc_Type, 2 * System_Address_Size);
12945                   else
12946                      Init_Size (Acc_Type, System_Address_Size);
12947                   end if;
12948
12949                   Init_Alignment (Acc_Type);
12950                   Set_Directly_Designated_Type (Acc_Type, Derived_Type);
12951
12952                   Set_Etype (New_Id, Acc_Type);
12953                   Set_Scope (New_Id, New_Subp);
12954
12955                   --  Create a reference to it
12956                   Build_Itype_Reference (Acc_Type, Parent (Derived_Type));
12957
12958                else
12959                   Set_Etype (New_Id, Etype (Id));
12960                end if;
12961             end;
12962
12963          elsif Base_Type (Etype (Id)) = Base_Type (Parent_Type)
12964            or else
12965              (Ekind (Etype (Id)) = E_Record_Type_With_Private
12966                and then Present (Full_View (Etype (Id)))
12967                and then
12968                  Base_Type (Full_View (Etype (Id))) = Base_Type (Parent_Type))
12969          then
12970             --  Constraint checks on formals are generated during expansion,
12971             --  based on the signature of the original subprogram. The bounds
12972             --  of the derived type are not relevant, and thus we can use
12973             --  the base type for the formals. However, the return type may be
12974             --  used in a context that requires that the proper static bounds
12975             --  be used (a case statement, for example)  and for those cases
12976             --  we must use the derived type (first subtype), not its base.
12977
12978             --  If the derived_type_definition has no constraints, we know that
12979             --  the derived type has the same constraints as the first subtype
12980             --  of the parent, and we can also use it rather than its base,
12981             --  which can lead to more efficient code.
12982
12983             if Etype (Id) = Parent_Type then
12984                if Is_Scalar_Type (Parent_Type)
12985                  and then
12986                    Subtypes_Statically_Compatible (Parent_Type, Derived_Type)
12987                then
12988                   Set_Etype (New_Id, Derived_Type);
12989
12990                elsif Nkind (Par) = N_Full_Type_Declaration
12991                  and then
12992                    Nkind (Type_Definition (Par)) = N_Derived_Type_Definition
12993                  and then
12994                    Is_Entity_Name
12995                      (Subtype_Indication (Type_Definition (Par)))
12996                then
12997                   Set_Etype (New_Id, Derived_Type);
12998
12999                else
13000                   Set_Etype (New_Id, Base_Type (Derived_Type));
13001                end if;
13002
13003             else
13004                Set_Etype (New_Id, Base_Type (Derived_Type));
13005             end if;
13006
13007          else
13008             Set_Etype (New_Id, Etype (Id));
13009          end if;
13010       end Replace_Type;
13011
13012       ----------------------
13013       -- Set_Derived_Name --
13014       ----------------------
13015
13016       procedure Set_Derived_Name is
13017          Nm : constant TSS_Name_Type := Get_TSS_Name (Parent_Subp);
13018       begin
13019          if Nm = TSS_Null then
13020             Set_Chars (New_Subp, Chars (Parent_Subp));
13021          else
13022             Set_Chars (New_Subp, Make_TSS_Name (Base_Type (Derived_Type), Nm));
13023          end if;
13024       end Set_Derived_Name;
13025
13026    --  Start of processing for Derive_Subprogram
13027
13028    begin
13029       New_Subp :=
13030          New_Entity (Nkind (Parent_Subp), Sloc (Derived_Type));
13031       Set_Ekind (New_Subp, Ekind (Parent_Subp));
13032       Set_Contract (New_Subp, Make_Contract (Sloc (New_Subp)));
13033
13034       --  Check whether the inherited subprogram is a private operation that
13035       --  should be inherited but not yet made visible. Such subprograms can
13036       --  become visible at a later point (e.g., the private part of a public
13037       --  child unit) via Declare_Inherited_Private_Subprograms. If the
13038       --  following predicate is true, then this is not such a private
13039       --  operation and the subprogram simply inherits the name of the parent
13040       --  subprogram. Note the special check for the names of controlled
13041       --  operations, which are currently exempted from being inherited with
13042       --  a hidden name because they must be findable for generation of
13043       --  implicit run-time calls.
13044
13045       if not Is_Hidden (Parent_Subp)
13046         or else Is_Internal (Parent_Subp)
13047         or else Is_Private_Overriding
13048         or else Is_Internal_Name (Chars (Parent_Subp))
13049         or else Chars (Parent_Subp) = Name_Initialize
13050         or else Chars (Parent_Subp) = Name_Adjust
13051         or else Chars (Parent_Subp) = Name_Finalize
13052       then
13053          Set_Derived_Name;
13054
13055       --  An inherited dispatching equality will be overridden by an internally
13056       --  generated one, or by an explicit one, so preserve its name and thus
13057       --  its entry in the dispatch table. Otherwise, if Parent_Subp is a
13058       --  private operation it may become invisible if the full view has
13059       --  progenitors, and the dispatch table will be malformed.
13060       --  We check that the type is limited to handle the anomalous declaration
13061       --  of Limited_Controlled, which is derived from a non-limited type, and
13062       --  which is handled specially elsewhere as well.
13063
13064       elsif Chars (Parent_Subp) = Name_Op_Eq
13065         and then Is_Dispatching_Operation (Parent_Subp)
13066         and then Etype (Parent_Subp) = Standard_Boolean
13067         and then not Is_Limited_Type (Etype (First_Formal (Parent_Subp)))
13068         and then
13069           Etype (First_Formal (Parent_Subp)) =
13070             Etype (Next_Formal (First_Formal (Parent_Subp)))
13071       then
13072          Set_Derived_Name;
13073
13074       --  If parent is hidden, this can be a regular derivation if the
13075       --  parent is immediately visible in a non-instantiating context,
13076       --  or if we are in the private part of an instance. This test
13077       --  should still be refined ???
13078
13079       --  The test for In_Instance_Not_Visible avoids inheriting the derived
13080       --  operation as a non-visible operation in cases where the parent
13081       --  subprogram might not be visible now, but was visible within the
13082       --  original generic, so it would be wrong to make the inherited
13083       --  subprogram non-visible now. (Not clear if this test is fully
13084       --  correct; are there any cases where we should declare the inherited
13085       --  operation as not visible to avoid it being overridden, e.g., when
13086       --  the parent type is a generic actual with private primitives ???)
13087
13088       --  (they should be treated the same as other private inherited
13089       --  subprograms, but it's not clear how to do this cleanly). ???
13090
13091       elsif (In_Open_Scopes (Scope (Base_Type (Parent_Type)))
13092               and then Is_Immediately_Visible (Parent_Subp)
13093               and then not In_Instance)
13094         or else In_Instance_Not_Visible
13095       then
13096          Set_Derived_Name;
13097
13098       --  Ada 2005 (AI-251): Regular derivation if the parent subprogram
13099       --  overrides an interface primitive because interface primitives
13100       --  must be visible in the partial view of the parent (RM 7.3 (7.3/2))
13101
13102       elsif Ada_Version >= Ada_2005
13103          and then Is_Dispatching_Operation (Parent_Subp)
13104          and then Covers_Some_Interface (Parent_Subp)
13105       then
13106          Set_Derived_Name;
13107
13108       --  Otherwise, the type is inheriting a private operation, so enter
13109       --  it with a special name so it can't be overridden.
13110
13111       else
13112          Set_Chars (New_Subp, New_External_Name (Chars (Parent_Subp), 'P'));
13113       end if;
13114
13115       Set_Parent (New_Subp, Parent (Derived_Type));
13116
13117       if Present (Actual_Subp) then
13118          Replace_Type (Actual_Subp, New_Subp);
13119       else
13120          Replace_Type (Parent_Subp, New_Subp);
13121       end if;
13122
13123       Conditional_Delay (New_Subp, Parent_Subp);
13124
13125       --  If we are creating a renaming for a primitive operation of an
13126       --  actual of a generic derived type, we must examine the signature
13127       --  of the actual primitive, not that of the generic formal, which for
13128       --  example may be an interface. However the name and initial value
13129       --  of the inherited operation are those of the formal primitive.
13130
13131       Formal := First_Formal (Parent_Subp);
13132
13133       if Present (Actual_Subp) then
13134          Formal_Of_Actual := First_Formal (Actual_Subp);
13135       else
13136          Formal_Of_Actual := Empty;
13137       end if;
13138
13139       while Present (Formal) loop
13140          New_Formal := New_Copy (Formal);
13141
13142          --  Normally we do not go copying parents, but in the case of
13143          --  formals, we need to link up to the declaration (which is the
13144          --  parameter specification), and it is fine to link up to the
13145          --  original formal's parameter specification in this case.
13146
13147          Set_Parent (New_Formal, Parent (Formal));
13148          Append_Entity (New_Formal, New_Subp);
13149
13150          if Present (Formal_Of_Actual) then
13151             Replace_Type (Formal_Of_Actual, New_Formal);
13152             Next_Formal (Formal_Of_Actual);
13153          else
13154             Replace_Type (Formal, New_Formal);
13155          end if;
13156
13157          Next_Formal (Formal);
13158       end loop;
13159
13160       --  If this derivation corresponds to a tagged generic actual, then
13161       --  primitive operations rename those of the actual. Otherwise the
13162       --  primitive operations rename those of the parent type, If the parent
13163       --  renames an intrinsic operator, so does the new subprogram. We except
13164       --  concatenation, which is always properly typed, and does not get
13165       --  expanded as other intrinsic operations.
13166
13167       if No (Actual_Subp) then
13168          if Is_Intrinsic_Subprogram (Parent_Subp) then
13169             Set_Is_Intrinsic_Subprogram (New_Subp);
13170
13171             if Present (Alias (Parent_Subp))
13172               and then Chars (Parent_Subp) /= Name_Op_Concat
13173             then
13174                Set_Alias (New_Subp, Alias (Parent_Subp));
13175             else
13176                Set_Alias (New_Subp, Parent_Subp);
13177             end if;
13178
13179          else
13180             Set_Alias (New_Subp, Parent_Subp);
13181          end if;
13182
13183       else
13184          Set_Alias (New_Subp, Actual_Subp);
13185       end if;
13186
13187       --  Derived subprograms of a tagged type must inherit the convention
13188       --  of the parent subprogram (a requirement of AI-117). Derived
13189       --  subprograms of untagged types simply get convention Ada by default.
13190
13191       if Is_Tagged_Type (Derived_Type) then
13192          Set_Convention (New_Subp, Convention (Parent_Subp));
13193       end if;
13194
13195       --  Predefined controlled operations retain their name even if the parent
13196       --  is hidden (see above), but they are not primitive operations if the
13197       --  ancestor is not visible, for example if the parent is a private
13198       --  extension completed with a controlled extension. Note that a full
13199       --  type that is controlled can break privacy: the flag Is_Controlled is
13200       --  set on both views of the type.
13201
13202       if Is_Controlled (Parent_Type)
13203         and then
13204           (Chars (Parent_Subp) = Name_Initialize
13205             or else Chars (Parent_Subp) = Name_Adjust
13206             or else Chars (Parent_Subp) = Name_Finalize)
13207         and then Is_Hidden (Parent_Subp)
13208         and then not Is_Visibly_Controlled (Parent_Type)
13209       then
13210          Set_Is_Hidden (New_Subp);
13211       end if;
13212
13213       Set_Is_Imported (New_Subp, Is_Imported (Parent_Subp));
13214       Set_Is_Exported (New_Subp, Is_Exported (Parent_Subp));
13215
13216       if Ekind (Parent_Subp) = E_Procedure then
13217          Set_Is_Valued_Procedure
13218            (New_Subp, Is_Valued_Procedure (Parent_Subp));
13219       else
13220          Set_Has_Controlling_Result
13221            (New_Subp, Has_Controlling_Result (Parent_Subp));
13222       end if;
13223
13224       --  No_Return must be inherited properly. If this is overridden in the
13225       --  case of a dispatching operation, then a check is made in Sem_Disp
13226       --  that the overriding operation is also No_Return (no such check is
13227       --  required for the case of non-dispatching operation.
13228
13229       Set_No_Return (New_Subp, No_Return (Parent_Subp));
13230
13231       --  A derived function with a controlling result is abstract. If the
13232       --  Derived_Type is a nonabstract formal generic derived type, then
13233       --  inherited operations are not abstract: the required check is done at
13234       --  instantiation time. If the derivation is for a generic actual, the
13235       --  function is not abstract unless the actual is.
13236
13237       if Is_Generic_Type (Derived_Type)
13238         and then not Is_Abstract_Type (Derived_Type)
13239       then
13240          null;
13241
13242       --  Ada 2005 (AI-228): Calculate the "require overriding" and "abstract"
13243       --  properties of the subprogram, as defined in RM-3.9.3(4/2-6/2).
13244
13245       elsif Ada_Version >= Ada_2005
13246         and then (Is_Abstract_Subprogram (Alias (New_Subp))
13247                    or else (Is_Tagged_Type (Derived_Type)
13248                             and then Etype (New_Subp) = Derived_Type
13249                             and then not Is_Null_Extension (Derived_Type))
13250                    or else (Is_Tagged_Type (Derived_Type)
13251                             and then Ekind (Etype (New_Subp)) =
13252                                                        E_Anonymous_Access_Type
13253                             and then Designated_Type (Etype (New_Subp)) =
13254                                                        Derived_Type
13255                             and then not Is_Null_Extension (Derived_Type)))
13256         and then No (Actual_Subp)
13257       then
13258          if not Is_Tagged_Type (Derived_Type)
13259            or else Is_Abstract_Type (Derived_Type)
13260            or else Is_Abstract_Subprogram (Alias (New_Subp))
13261          then
13262             Set_Is_Abstract_Subprogram (New_Subp);
13263          else
13264             Set_Requires_Overriding (New_Subp);
13265          end if;
13266
13267       elsif Ada_Version < Ada_2005
13268         and then (Is_Abstract_Subprogram (Alias (New_Subp))
13269                    or else (Is_Tagged_Type (Derived_Type)
13270                              and then Etype (New_Subp) = Derived_Type
13271                              and then No (Actual_Subp)))
13272       then
13273          Set_Is_Abstract_Subprogram (New_Subp);
13274
13275       --  AI05-0097 : an inherited operation that dispatches on result is
13276       --  abstract if the derived type is abstract, even if the parent type
13277       --  is concrete and the derived type is a null extension.
13278
13279       elsif Has_Controlling_Result (Alias (New_Subp))
13280         and then Is_Abstract_Type (Etype (New_Subp))
13281       then
13282          Set_Is_Abstract_Subprogram (New_Subp);
13283
13284       --  Finally, if the parent type is abstract we must verify that all
13285       --  inherited operations are either non-abstract or overridden, or that
13286       --  the derived type itself is abstract (this check is performed at the
13287       --  end of a package declaration, in Check_Abstract_Overriding). A
13288       --  private overriding in the parent type will not be visible in the
13289       --  derivation if we are not in an inner package or in a child unit of
13290       --  the parent type, in which case the abstractness of the inherited
13291       --  operation is carried to the new subprogram.
13292
13293       elsif Is_Abstract_Type (Parent_Type)
13294         and then not In_Open_Scopes (Scope (Parent_Type))
13295         and then Is_Private_Overriding
13296         and then Is_Abstract_Subprogram (Visible_Subp)
13297       then
13298          if No (Actual_Subp) then
13299             Set_Alias (New_Subp, Visible_Subp);
13300             Set_Is_Abstract_Subprogram (New_Subp, True);
13301
13302          else
13303             --  If this is a derivation for an instance of a formal derived
13304             --  type, abstractness comes from the primitive operation of the
13305             --  actual, not from the operation inherited from the ancestor.
13306
13307             Set_Is_Abstract_Subprogram
13308               (New_Subp, Is_Abstract_Subprogram (Actual_Subp));
13309          end if;
13310       end if;
13311
13312       New_Overloaded_Entity (New_Subp, Derived_Type);
13313
13314       --  Check for case of a derived subprogram for the instantiation of a
13315       --  formal derived tagged type, if so mark the subprogram as dispatching
13316       --  and inherit the dispatching attributes of the parent subprogram. The
13317       --  derived subprogram is effectively renaming of the actual subprogram,
13318       --  so it needs to have the same attributes as the actual.
13319
13320       if Present (Actual_Subp)
13321         and then Is_Dispatching_Operation (Parent_Subp)
13322       then
13323          Set_Is_Dispatching_Operation (New_Subp);
13324
13325          if Present (DTC_Entity (Parent_Subp)) then
13326             Set_DTC_Entity (New_Subp, DTC_Entity (Parent_Subp));
13327             Set_DT_Position (New_Subp, DT_Position (Parent_Subp));
13328          end if;
13329       end if;
13330
13331       --  Indicate that a derived subprogram does not require a body and that
13332       --  it does not require processing of default expressions.
13333
13334       Set_Has_Completion (New_Subp);
13335       Set_Default_Expressions_Processed (New_Subp);
13336
13337       if Ekind (New_Subp) = E_Function then
13338          Set_Mechanism (New_Subp, Mechanism (Parent_Subp));
13339       end if;
13340    end Derive_Subprogram;
13341
13342    ------------------------
13343    -- Derive_Subprograms --
13344    ------------------------
13345
13346    procedure Derive_Subprograms
13347      (Parent_Type    : Entity_Id;
13348       Derived_Type   : Entity_Id;
13349       Generic_Actual : Entity_Id := Empty)
13350    is
13351       Op_List : constant Elist_Id :=
13352                   Collect_Primitive_Operations (Parent_Type);
13353
13354       function Check_Derived_Type return Boolean;
13355       --  Check that all the entities derived from Parent_Type are found in
13356       --  the list of primitives of Derived_Type exactly in the same order.
13357
13358       procedure Derive_Interface_Subprogram
13359         (New_Subp    : in out Entity_Id;
13360          Subp        : Entity_Id;
13361          Actual_Subp : Entity_Id);
13362       --  Derive New_Subp from the ultimate alias of the parent subprogram Subp
13363       --  (which is an interface primitive). If Generic_Actual is present then
13364       --  Actual_Subp is the actual subprogram corresponding with the generic
13365       --  subprogram Subp.
13366
13367       function Check_Derived_Type return Boolean is
13368          E        : Entity_Id;
13369          Elmt     : Elmt_Id;
13370          List     : Elist_Id;
13371          New_Subp : Entity_Id;
13372          Op_Elmt  : Elmt_Id;
13373          Subp     : Entity_Id;
13374
13375       begin
13376          --  Traverse list of entities in the current scope searching for
13377          --  an incomplete type whose full-view is derived type
13378
13379          E := First_Entity (Scope (Derived_Type));
13380          while Present (E)
13381            and then E /= Derived_Type
13382          loop
13383             if Ekind (E) = E_Incomplete_Type
13384               and then Present (Full_View (E))
13385               and then Full_View (E) = Derived_Type
13386             then
13387                --  Disable this test if Derived_Type completes an incomplete
13388                --  type because in such case more primitives can be added
13389                --  later to the list of primitives of Derived_Type by routine
13390                --  Process_Incomplete_Dependents
13391
13392                return True;
13393             end if;
13394
13395             E := Next_Entity (E);
13396          end loop;
13397
13398          List := Collect_Primitive_Operations (Derived_Type);
13399          Elmt := First_Elmt (List);
13400
13401          Op_Elmt := First_Elmt (Op_List);
13402          while Present (Op_Elmt) loop
13403             Subp     := Node (Op_Elmt);
13404             New_Subp := Node (Elmt);
13405
13406             --  At this early stage Derived_Type has no entities with attribute
13407             --  Interface_Alias. In addition, such primitives are always
13408             --  located at the end of the list of primitives of Parent_Type.
13409             --  Therefore, if found we can safely stop processing pending
13410             --  entities.
13411
13412             exit when Present (Interface_Alias (Subp));
13413
13414             --  Handle hidden entities
13415
13416             if not Is_Predefined_Dispatching_Operation (Subp)
13417               and then Is_Hidden (Subp)
13418             then
13419                if Present (New_Subp)
13420                  and then Primitive_Names_Match (Subp, New_Subp)
13421                then
13422                   Next_Elmt (Elmt);
13423                end if;
13424
13425             else
13426                if not Present (New_Subp)
13427                  or else Ekind (Subp) /= Ekind (New_Subp)
13428                  or else not Primitive_Names_Match (Subp, New_Subp)
13429                then
13430                   return False;
13431                end if;
13432
13433                Next_Elmt (Elmt);
13434             end if;
13435
13436             Next_Elmt (Op_Elmt);
13437          end loop;
13438
13439          return True;
13440       end Check_Derived_Type;
13441
13442       ---------------------------------
13443       -- Derive_Interface_Subprogram --
13444       ---------------------------------
13445
13446       procedure Derive_Interface_Subprogram
13447         (New_Subp    : in out Entity_Id;
13448          Subp        : Entity_Id;
13449          Actual_Subp : Entity_Id)
13450       is
13451          Iface_Subp : constant Entity_Id := Ultimate_Alias (Subp);
13452          Iface_Type : constant Entity_Id := Find_Dispatching_Type (Iface_Subp);
13453
13454       begin
13455          pragma Assert (Is_Interface (Iface_Type));
13456
13457          Derive_Subprogram
13458            (New_Subp     => New_Subp,
13459             Parent_Subp  => Iface_Subp,
13460             Derived_Type => Derived_Type,
13461             Parent_Type  => Iface_Type,
13462             Actual_Subp  => Actual_Subp);
13463
13464          --  Given that this new interface entity corresponds with a primitive
13465          --  of the parent that was not overridden we must leave it associated
13466          --  with its parent primitive to ensure that it will share the same
13467          --  dispatch table slot when overridden.
13468
13469          if No (Actual_Subp) then
13470             Set_Alias (New_Subp, Subp);
13471
13472          --  For instantiations this is not needed since the previous call to
13473          --  Derive_Subprogram leaves the entity well decorated.
13474
13475          else
13476             pragma Assert (Alias (New_Subp) = Actual_Subp);
13477             null;
13478          end if;
13479       end Derive_Interface_Subprogram;
13480
13481       --  Local variables
13482
13483       Alias_Subp   : Entity_Id;
13484       Act_List     : Elist_Id;
13485       Act_Elmt     : Elmt_Id   := No_Elmt;
13486       Act_Subp     : Entity_Id := Empty;
13487       Elmt         : Elmt_Id;
13488       Need_Search  : Boolean   := False;
13489       New_Subp     : Entity_Id := Empty;
13490       Parent_Base  : Entity_Id;
13491       Subp         : Entity_Id;
13492
13493    --  Start of processing for Derive_Subprograms
13494
13495    begin
13496       if Ekind (Parent_Type) = E_Record_Type_With_Private
13497         and then Has_Discriminants (Parent_Type)
13498         and then Present (Full_View (Parent_Type))
13499       then
13500          Parent_Base := Full_View (Parent_Type);
13501       else
13502          Parent_Base := Parent_Type;
13503       end if;
13504
13505       if Present (Generic_Actual) then
13506          Act_List := Collect_Primitive_Operations (Generic_Actual);
13507          Act_Elmt := First_Elmt (Act_List);
13508       end if;
13509
13510       --  Derive primitives inherited from the parent. Note that if the generic
13511       --  actual is present, this is not really a type derivation, it is a
13512       --  completion within an instance.
13513
13514       --  Case 1: Derived_Type does not implement interfaces
13515
13516       if not Is_Tagged_Type (Derived_Type)
13517         or else (not Has_Interfaces (Derived_Type)
13518                   and then not (Present (Generic_Actual)
13519                                   and then
13520                                 Has_Interfaces (Generic_Actual)))
13521       then
13522          Elmt := First_Elmt (Op_List);
13523          while Present (Elmt) loop
13524             Subp := Node (Elmt);
13525
13526             --  Literals are derived earlier in the process of building the
13527             --  derived type, and are skipped here.
13528
13529             if Ekind (Subp) = E_Enumeration_Literal then
13530                null;
13531
13532             --  The actual is a direct descendant and the common primitive
13533             --  operations appear in the same order.
13534
13535             --  If the generic parent type is present, the derived type is an
13536             --  instance of a formal derived type, and within the instance its
13537             --  operations are those of the actual. We derive from the formal
13538             --  type but make the inherited operations aliases of the
13539             --  corresponding operations of the actual.
13540
13541             else
13542                pragma Assert (No (Node (Act_Elmt))
13543                  or else (Primitive_Names_Match (Subp, Node (Act_Elmt))
13544                             and then
13545                           Type_Conformant (Subp, Node (Act_Elmt),
13546                                            Skip_Controlling_Formals => True)));
13547
13548                Derive_Subprogram
13549                  (New_Subp, Subp, Derived_Type, Parent_Base, Node (Act_Elmt));
13550
13551                if Present (Act_Elmt) then
13552                   Next_Elmt (Act_Elmt);
13553                end if;
13554             end if;
13555
13556             Next_Elmt (Elmt);
13557          end loop;
13558
13559       --  Case 2: Derived_Type implements interfaces
13560
13561       else
13562          --  If the parent type has no predefined primitives we remove
13563          --  predefined primitives from the list of primitives of generic
13564          --  actual to simplify the complexity of this algorithm.
13565
13566          if Present (Generic_Actual) then
13567             declare
13568                Has_Predefined_Primitives : Boolean := False;
13569
13570             begin
13571                --  Check if the parent type has predefined primitives
13572
13573                Elmt := First_Elmt (Op_List);
13574                while Present (Elmt) loop
13575                   Subp := Node (Elmt);
13576
13577                   if Is_Predefined_Dispatching_Operation (Subp)
13578                     and then not Comes_From_Source (Ultimate_Alias (Subp))
13579                   then
13580                      Has_Predefined_Primitives := True;
13581                      exit;
13582                   end if;
13583
13584                   Next_Elmt (Elmt);
13585                end loop;
13586
13587                --  Remove predefined primitives of Generic_Actual. We must use
13588                --  an auxiliary list because in case of tagged types the value
13589                --  returned by Collect_Primitive_Operations is the value stored
13590                --  in its Primitive_Operations attribute (and we don't want to
13591                --  modify its current contents).
13592
13593                if not Has_Predefined_Primitives then
13594                   declare
13595                      Aux_List : constant Elist_Id := New_Elmt_List;
13596
13597                   begin
13598                      Elmt := First_Elmt (Act_List);
13599                      while Present (Elmt) loop
13600                         Subp := Node (Elmt);
13601
13602                         if not Is_Predefined_Dispatching_Operation (Subp)
13603                           or else Comes_From_Source (Subp)
13604                         then
13605                            Append_Elmt (Subp, Aux_List);
13606                         end if;
13607
13608                         Next_Elmt (Elmt);
13609                      end loop;
13610
13611                      Act_List := Aux_List;
13612                   end;
13613                end if;
13614
13615                Act_Elmt := First_Elmt (Act_List);
13616                Act_Subp := Node (Act_Elmt);
13617             end;
13618          end if;
13619
13620          --  Stage 1: If the generic actual is not present we derive the
13621          --  primitives inherited from the parent type. If the generic parent
13622          --  type is present, the derived type is an instance of a formal
13623          --  derived type, and within the instance its operations are those of
13624          --  the actual. We derive from the formal type but make the inherited
13625          --  operations aliases of the corresponding operations of the actual.
13626
13627          Elmt := First_Elmt (Op_List);
13628          while Present (Elmt) loop
13629             Subp       := Node (Elmt);
13630             Alias_Subp := Ultimate_Alias (Subp);
13631
13632             --  Do not derive internal entities of the parent that link
13633             --  interface primitives with their covering primitive. These
13634             --  entities will be added to this type when frozen.
13635
13636             if Present (Interface_Alias (Subp)) then
13637                goto Continue;
13638             end if;
13639
13640             --  If the generic actual is present find the corresponding
13641             --  operation in the generic actual. If the parent type is a
13642             --  direct ancestor of the derived type then, even if it is an
13643             --  interface, the operations are inherited from the primary
13644             --  dispatch table and are in the proper order. If we detect here
13645             --  that primitives are not in the same order we traverse the list
13646             --  of primitive operations of the actual to find the one that
13647             --  implements the interface primitive.
13648
13649             if Need_Search
13650               or else
13651                 (Present (Generic_Actual)
13652                   and then Present (Act_Subp)
13653                   and then not
13654                     (Primitive_Names_Match (Subp, Act_Subp)
13655                        and then
13656                      Type_Conformant (Subp, Act_Subp,
13657                                       Skip_Controlling_Formals => True)))
13658             then
13659                pragma Assert (not Is_Ancestor (Parent_Base, Generic_Actual,
13660                                                Use_Full_View => True));
13661
13662                --  Remember that we need searching for all pending primitives
13663
13664                Need_Search := True;
13665
13666                --  Handle entities associated with interface primitives
13667
13668                if Present (Alias_Subp)
13669                  and then Is_Interface (Find_Dispatching_Type (Alias_Subp))
13670                  and then not Is_Predefined_Dispatching_Operation (Subp)
13671                then
13672                   --  Search for the primitive in the homonym chain
13673
13674                   Act_Subp :=
13675                     Find_Primitive_Covering_Interface
13676                       (Tagged_Type => Generic_Actual,
13677                        Iface_Prim  => Alias_Subp);
13678
13679                   --  Previous search may not locate primitives covering
13680                   --  interfaces defined in generics units or instantiations.
13681                   --  (it fails if the covering primitive has formals whose
13682                   --  type is also defined in generics or instantiations).
13683                   --  In such case we search in the list of primitives of the
13684                   --  generic actual for the internal entity that links the
13685                   --  interface primitive and the covering primitive.
13686
13687                   if No (Act_Subp)
13688                     and then Is_Generic_Type (Parent_Type)
13689                   then
13690                      --  This code has been designed to handle only generic
13691                      --  formals that implement interfaces that are defined
13692                      --  in a generic unit or instantiation. If this code is
13693                      --  needed for other cases we must review it because
13694                      --  (given that it relies on Original_Location to locate
13695                      --  the primitive of Generic_Actual that covers the
13696                      --  interface) it could leave linked through attribute
13697                      --  Alias entities of unrelated instantiations).
13698
13699                      pragma Assert
13700                        (Is_Generic_Unit
13701                           (Scope (Find_Dispatching_Type (Alias_Subp)))
13702                        or else
13703                         Instantiation_Depth
13704                           (Sloc (Find_Dispatching_Type (Alias_Subp))) > 0);
13705
13706                      declare
13707                         Iface_Prim_Loc : constant Source_Ptr :=
13708                                          Original_Location (Sloc (Alias_Subp));
13709                         Elmt      : Elmt_Id;
13710                         Prim      : Entity_Id;
13711                      begin
13712                         Elmt :=
13713                           First_Elmt (Primitive_Operations (Generic_Actual));
13714
13715                         Search : while Present (Elmt) loop
13716                            Prim := Node (Elmt);
13717
13718                            if Present (Interface_Alias (Prim))
13719                              and then Original_Location
13720                                         (Sloc (Interface_Alias (Prim)))
13721                                        = Iface_Prim_Loc
13722                            then
13723                               Act_Subp := Alias (Prim);
13724                               exit Search;
13725                            end if;
13726
13727                            Next_Elmt (Elmt);
13728                         end loop Search;
13729                      end;
13730                   end if;
13731
13732                   pragma Assert (Present (Act_Subp)
13733                     or else Is_Abstract_Type (Generic_Actual)
13734                     or else Serious_Errors_Detected > 0);
13735
13736                --  Handle predefined primitives plus the rest of user-defined
13737                --  primitives
13738
13739                else
13740                   Act_Elmt := First_Elmt (Act_List);
13741                   while Present (Act_Elmt) loop
13742                      Act_Subp := Node (Act_Elmt);
13743
13744                      exit when Primitive_Names_Match (Subp, Act_Subp)
13745                        and then Type_Conformant
13746                                   (Subp, Act_Subp,
13747                                    Skip_Controlling_Formals => True)
13748                        and then No (Interface_Alias (Act_Subp));
13749
13750                      Next_Elmt (Act_Elmt);
13751                   end loop;
13752
13753                   if No (Act_Elmt) then
13754                      Act_Subp := Empty;
13755                   end if;
13756                end if;
13757             end if;
13758
13759             --   Case 1: If the parent is a limited interface then it has the
13760             --   predefined primitives of synchronized interfaces. However, the
13761             --   actual type may be a non-limited type and hence it does not
13762             --   have such primitives.
13763
13764             if Present (Generic_Actual)
13765               and then not Present (Act_Subp)
13766               and then Is_Limited_Interface (Parent_Base)
13767               and then Is_Predefined_Interface_Primitive (Subp)
13768             then
13769                null;
13770
13771             --  Case 2: Inherit entities associated with interfaces that were
13772             --  not covered by the parent type. We exclude here null interface
13773             --  primitives because they do not need special management.
13774
13775             --  We also exclude interface operations that are renamings. If the
13776             --  subprogram is an explicit renaming of an interface primitive,
13777             --  it is a regular primitive operation, and the presence of its
13778             --  alias is not relevant: it has to be derived like any other
13779             --  primitive.
13780
13781             elsif Present (Alias (Subp))
13782               and then Nkind (Unit_Declaration_Node (Subp)) /=
13783                                             N_Subprogram_Renaming_Declaration
13784               and then Is_Interface (Find_Dispatching_Type (Alias_Subp))
13785               and then not
13786                 (Nkind (Parent (Alias_Subp)) = N_Procedure_Specification
13787                   and then Null_Present (Parent (Alias_Subp)))
13788             then
13789                --  If this is an abstract private type then we transfer the
13790                --  derivation of the interface primitive from the partial view
13791                --  to the full view. This is safe because all the interfaces
13792                --  must be visible in the partial view. Done to avoid adding
13793                --  a new interface derivation to the private part of the
13794                --  enclosing package; otherwise this new derivation would be
13795                --  decorated as hidden when the analysis of the enclosing
13796                --  package completes.
13797
13798                if Is_Abstract_Type (Derived_Type)
13799                  and then In_Private_Part (Current_Scope)
13800                  and then Has_Private_Declaration (Derived_Type)
13801                then
13802                   declare
13803                      Partial_View : Entity_Id;
13804                      Elmt         : Elmt_Id;
13805                      Ent          : Entity_Id;
13806
13807                   begin
13808                      Partial_View := First_Entity (Current_Scope);
13809                      loop
13810                         exit when No (Partial_View)
13811                           or else (Has_Private_Declaration (Partial_View)
13812                                      and then
13813                                    Full_View (Partial_View) = Derived_Type);
13814
13815                         Next_Entity (Partial_View);
13816                      end loop;
13817
13818                      --  If the partial view was not found then the source code
13819                      --  has errors and the derivation is not needed.
13820
13821                      if Present (Partial_View) then
13822                         Elmt :=
13823                           First_Elmt (Primitive_Operations (Partial_View));
13824                         while Present (Elmt) loop
13825                            Ent := Node (Elmt);
13826
13827                            if Present (Alias (Ent))
13828                              and then Ultimate_Alias (Ent) = Alias (Subp)
13829                            then
13830                               Append_Elmt
13831                                 (Ent, Primitive_Operations (Derived_Type));
13832                               exit;
13833                            end if;
13834
13835                            Next_Elmt (Elmt);
13836                         end loop;
13837
13838                         --  If the interface primitive was not found in the
13839                         --  partial view then this interface primitive was
13840                         --  overridden. We add a derivation to activate in
13841                         --  Derive_Progenitor_Subprograms the machinery to
13842                         --  search for it.
13843
13844                         if No (Elmt) then
13845                            Derive_Interface_Subprogram
13846                              (New_Subp    => New_Subp,
13847                               Subp        => Subp,
13848                               Actual_Subp => Act_Subp);
13849                         end if;
13850                      end if;
13851                   end;
13852                else
13853                   Derive_Interface_Subprogram
13854                     (New_Subp     => New_Subp,
13855                      Subp         => Subp,
13856                      Actual_Subp  => Act_Subp);
13857                end if;
13858
13859             --  Case 3: Common derivation
13860
13861             else
13862                Derive_Subprogram
13863                  (New_Subp     => New_Subp,
13864                   Parent_Subp  => Subp,
13865                   Derived_Type => Derived_Type,
13866                   Parent_Type  => Parent_Base,
13867                   Actual_Subp  => Act_Subp);
13868             end if;
13869
13870             --  No need to update Act_Elm if we must search for the
13871             --  corresponding operation in the generic actual
13872
13873             if not Need_Search
13874               and then Present (Act_Elmt)
13875             then
13876                Next_Elmt (Act_Elmt);
13877                Act_Subp := Node (Act_Elmt);
13878             end if;
13879
13880             <<Continue>>
13881             Next_Elmt (Elmt);
13882          end loop;
13883
13884          --  Inherit additional operations from progenitors. If the derived
13885          --  type is a generic actual, there are not new primitive operations
13886          --  for the type because it has those of the actual, and therefore
13887          --  nothing needs to be done. The renamings generated above are not
13888          --  primitive operations, and their purpose is simply to make the
13889          --  proper operations visible within an instantiation.
13890
13891          if No (Generic_Actual) then
13892             Derive_Progenitor_Subprograms (Parent_Base, Derived_Type);
13893          end if;
13894       end if;
13895
13896       --  Final check: Direct descendants must have their primitives in the
13897       --  same order. We exclude from this test untagged types and instances
13898       --  of formal derived types. We skip this test if we have already
13899       --  reported serious errors in the sources.
13900
13901       pragma Assert (not Is_Tagged_Type (Derived_Type)
13902         or else Present (Generic_Actual)
13903         or else Serious_Errors_Detected > 0
13904         or else Check_Derived_Type);
13905    end Derive_Subprograms;
13906
13907    --------------------------------
13908    -- Derived_Standard_Character --
13909    --------------------------------
13910
13911    procedure Derived_Standard_Character
13912      (N            : Node_Id;
13913       Parent_Type  : Entity_Id;
13914       Derived_Type : Entity_Id)
13915    is
13916       Loc           : constant Source_Ptr := Sloc (N);
13917       Def           : constant Node_Id    := Type_Definition (N);
13918       Indic         : constant Node_Id    := Subtype_Indication (Def);
13919       Parent_Base   : constant Entity_Id  := Base_Type (Parent_Type);
13920       Implicit_Base : constant Entity_Id  :=
13921                         Create_Itype
13922                           (E_Enumeration_Type, N, Derived_Type, 'B');
13923
13924       Lo : Node_Id;
13925       Hi : Node_Id;
13926
13927    begin
13928       Discard_Node (Process_Subtype (Indic, N));
13929
13930       Set_Etype     (Implicit_Base, Parent_Base);
13931       Set_Size_Info (Implicit_Base, Root_Type (Parent_Type));
13932       Set_RM_Size   (Implicit_Base, RM_Size (Root_Type (Parent_Type)));
13933
13934       Set_Is_Character_Type  (Implicit_Base, True);
13935       Set_Has_Delayed_Freeze (Implicit_Base);
13936
13937       --  The bounds of the implicit base are the bounds of the parent base.
13938       --  Note that their type is the parent base.
13939
13940       Lo := New_Copy_Tree (Type_Low_Bound  (Parent_Base));
13941       Hi := New_Copy_Tree (Type_High_Bound (Parent_Base));
13942
13943       Set_Scalar_Range (Implicit_Base,
13944         Make_Range (Loc,
13945           Low_Bound  => Lo,
13946           High_Bound => Hi));
13947
13948       Conditional_Delay (Derived_Type, Parent_Type);
13949
13950       Set_Ekind (Derived_Type, E_Enumeration_Subtype);
13951       Set_Etype (Derived_Type, Implicit_Base);
13952       Set_Size_Info         (Derived_Type, Parent_Type);
13953
13954       if Unknown_RM_Size (Derived_Type) then
13955          Set_RM_Size (Derived_Type, RM_Size (Parent_Type));
13956       end if;
13957
13958       Set_Is_Character_Type (Derived_Type, True);
13959
13960       if Nkind (Indic) /= N_Subtype_Indication then
13961
13962          --  If no explicit constraint, the bounds are those
13963          --  of the parent type.
13964
13965          Lo := New_Copy_Tree (Type_Low_Bound  (Parent_Type));
13966          Hi := New_Copy_Tree (Type_High_Bound (Parent_Type));
13967          Set_Scalar_Range (Derived_Type, Make_Range (Loc, Lo, Hi));
13968       end if;
13969
13970       Convert_Scalar_Bounds (N, Parent_Type, Derived_Type, Loc);
13971
13972       --  Because the implicit base is used in the conversion of the bounds, we
13973       --  have to freeze it now. This is similar to what is done for numeric
13974       --  types, and it equally suspicious, but otherwise a non-static bound
13975       --  will have a reference to an unfrozen type, which is rejected by Gigi
13976       --  (???). This requires specific care for definition of stream
13977       --  attributes. For details, see comments at the end of
13978       --  Build_Derived_Numeric_Type.
13979
13980       Freeze_Before (N, Implicit_Base);
13981    end Derived_Standard_Character;
13982
13983    ------------------------------
13984    -- Derived_Type_Declaration --
13985    ------------------------------
13986
13987    procedure Derived_Type_Declaration
13988      (T             : Entity_Id;
13989       N             : Node_Id;
13990       Is_Completion : Boolean)
13991    is
13992       Parent_Type  : Entity_Id;
13993
13994       function Comes_From_Generic (Typ : Entity_Id) return Boolean;
13995       --  Check whether the parent type is a generic formal, or derives
13996       --  directly or indirectly from one.
13997
13998       ------------------------
13999       -- Comes_From_Generic --
14000       ------------------------
14001
14002       function Comes_From_Generic (Typ : Entity_Id) return Boolean is
14003       begin
14004          if Is_Generic_Type (Typ) then
14005             return True;
14006
14007          elsif Is_Generic_Type (Root_Type (Parent_Type)) then
14008             return True;
14009
14010          elsif Is_Private_Type (Typ)
14011            and then Present (Full_View (Typ))
14012            and then Is_Generic_Type (Root_Type (Full_View (Typ)))
14013          then
14014             return True;
14015
14016          elsif Is_Generic_Actual_Type (Typ) then
14017             return True;
14018
14019          else
14020             return False;
14021          end if;
14022       end Comes_From_Generic;
14023
14024       --  Local variables
14025
14026       Def          : constant Node_Id := Type_Definition (N);
14027       Iface_Def    : Node_Id;
14028       Indic        : constant Node_Id := Subtype_Indication (Def);
14029       Extension    : constant Node_Id := Record_Extension_Part (Def);
14030       Parent_Node  : Node_Id;
14031       Taggd        : Boolean;
14032
14033    --  Start of processing for Derived_Type_Declaration
14034
14035    begin
14036       Parent_Type := Find_Type_Of_Subtype_Indic (Indic);
14037
14038       --  Ada 2005 (AI-251): In case of interface derivation check that the
14039       --  parent is also an interface.
14040
14041       if Interface_Present (Def) then
14042          Check_SPARK_Restriction ("interface is not allowed", Def);
14043
14044          if not Is_Interface (Parent_Type) then
14045             Diagnose_Interface (Indic, Parent_Type);
14046
14047          else
14048             Parent_Node := Parent (Base_Type (Parent_Type));
14049             Iface_Def   := Type_Definition (Parent_Node);
14050
14051             --  Ada 2005 (AI-251): Limited interfaces can only inherit from
14052             --  other limited interfaces.
14053
14054             if Limited_Present (Def) then
14055                if Limited_Present (Iface_Def) then
14056                   null;
14057
14058                elsif Protected_Present (Iface_Def) then
14059                   Error_Msg_NE
14060                     ("descendant of& must be declared"
14061                        & " as a protected interface",
14062                          N, Parent_Type);
14063
14064                elsif Synchronized_Present (Iface_Def) then
14065                   Error_Msg_NE
14066                     ("descendant of& must be declared"
14067                        & " as a synchronized interface",
14068                          N, Parent_Type);
14069
14070                elsif Task_Present (Iface_Def) then
14071                   Error_Msg_NE
14072                     ("descendant of& must be declared as a task interface",
14073                        N, Parent_Type);
14074
14075                else
14076                   Error_Msg_N
14077                     ("(Ada 2005) limited interface cannot "
14078                      & "inherit from non-limited interface", Indic);
14079                end if;
14080
14081             --  Ada 2005 (AI-345): Non-limited interfaces can only inherit
14082             --  from non-limited or limited interfaces.
14083
14084             elsif not Protected_Present (Def)
14085               and then not Synchronized_Present (Def)
14086               and then not Task_Present (Def)
14087             then
14088                if Limited_Present (Iface_Def) then
14089                   null;
14090
14091                elsif Protected_Present (Iface_Def) then
14092                   Error_Msg_NE
14093                     ("descendant of& must be declared"
14094                        & " as a protected interface",
14095                          N, Parent_Type);
14096
14097                elsif Synchronized_Present (Iface_Def) then
14098                   Error_Msg_NE
14099                     ("descendant of& must be declared"
14100                        & " as a synchronized interface",
14101                          N, Parent_Type);
14102
14103                elsif Task_Present (Iface_Def) then
14104                   Error_Msg_NE
14105                     ("descendant of& must be declared as a task interface",
14106                        N, Parent_Type);
14107                else
14108                   null;
14109                end if;
14110             end if;
14111          end if;
14112       end if;
14113
14114       if Is_Tagged_Type (Parent_Type)
14115         and then Is_Concurrent_Type (Parent_Type)
14116         and then not Is_Interface (Parent_Type)
14117       then
14118          Error_Msg_N
14119            ("parent type of a record extension cannot be "
14120             & "a synchronized tagged type (RM 3.9.1 (3/1))", N);
14121          Set_Etype (T, Any_Type);
14122          return;
14123       end if;
14124
14125       --  Ada 2005 (AI-251): Decorate all the names in the list of ancestor
14126       --  interfaces
14127
14128       if Is_Tagged_Type (Parent_Type)
14129         and then Is_Non_Empty_List (Interface_List (Def))
14130       then
14131          declare
14132             Intf : Node_Id;
14133             T    : Entity_Id;
14134
14135          begin
14136             Intf := First (Interface_List (Def));
14137             while Present (Intf) loop
14138                T := Find_Type_Of_Subtype_Indic (Intf);
14139
14140                if not Is_Interface (T) then
14141                   Diagnose_Interface (Intf, T);
14142
14143                --  Check the rules of 3.9.4(12/2) and 7.5(2/2) that disallow
14144                --  a limited type from having a nonlimited progenitor.
14145
14146                elsif (Limited_Present (Def)
14147                        or else (not Is_Interface (Parent_Type)
14148                                  and then Is_Limited_Type (Parent_Type)))
14149                  and then not Is_Limited_Interface (T)
14150                then
14151                   Error_Msg_NE
14152                    ("progenitor interface& of limited type must be limited",
14153                      N, T);
14154                end if;
14155
14156                Next (Intf);
14157             end loop;
14158          end;
14159       end if;
14160
14161       if Parent_Type = Any_Type
14162         or else Etype (Parent_Type) = Any_Type
14163         or else (Is_Class_Wide_Type (Parent_Type)
14164                    and then Etype (Parent_Type) = T)
14165       then
14166          --  If Parent_Type is undefined or illegal, make new type into a
14167          --  subtype of Any_Type, and set a few attributes to prevent cascaded
14168          --  errors. If this is a self-definition, emit error now.
14169
14170          if T = Parent_Type
14171            or else T = Etype (Parent_Type)
14172          then
14173             Error_Msg_N ("type cannot be used in its own definition", Indic);
14174          end if;
14175
14176          Set_Ekind        (T, Ekind (Parent_Type));
14177          Set_Etype        (T, Any_Type);
14178          Set_Scalar_Range (T, Scalar_Range (Any_Type));
14179
14180          if Is_Tagged_Type (T)
14181            and then Is_Record_Type (T)
14182          then
14183             Set_Direct_Primitive_Operations (T, New_Elmt_List);
14184          end if;
14185
14186          return;
14187       end if;
14188
14189       --  Ada 2005 (AI-251): The case in which the parent of the full-view is
14190       --  an interface is special because the list of interfaces in the full
14191       --  view can be given in any order. For example:
14192
14193       --     type A is interface;
14194       --     type B is interface and A;
14195       --     type D is new B with private;
14196       --   private
14197       --     type D is new A and B with null record; -- 1 --
14198
14199       --  In this case we perform the following transformation of -1-:
14200
14201       --     type D is new B and A with null record;
14202
14203       --  If the parent of the full-view covers the parent of the partial-view
14204       --  we have two possible cases:
14205
14206       --     1) They have the same parent
14207       --     2) The parent of the full-view implements some further interfaces
14208
14209       --  In both cases we do not need to perform the transformation. In the
14210       --  first case the source program is correct and the transformation is
14211       --  not needed; in the second case the source program does not fulfill
14212       --  the no-hidden interfaces rule (AI-396) and the error will be reported
14213       --  later.
14214
14215       --  This transformation not only simplifies the rest of the analysis of
14216       --  this type declaration but also simplifies the correct generation of
14217       --  the object layout to the expander.
14218
14219       if In_Private_Part (Current_Scope)
14220         and then Is_Interface (Parent_Type)
14221       then
14222          declare
14223             Iface               : Node_Id;
14224             Partial_View        : Entity_Id;
14225             Partial_View_Parent : Entity_Id;
14226             New_Iface           : Node_Id;
14227
14228          begin
14229             --  Look for the associated private type declaration
14230
14231             Partial_View := First_Entity (Current_Scope);
14232             loop
14233                exit when No (Partial_View)
14234                  or else (Has_Private_Declaration (Partial_View)
14235                            and then Full_View (Partial_View) = T);
14236
14237                Next_Entity (Partial_View);
14238             end loop;
14239
14240             --  If the partial view was not found then the source code has
14241             --  errors and the transformation is not needed.
14242
14243             if Present (Partial_View) then
14244                Partial_View_Parent := Etype (Partial_View);
14245
14246                --  If the parent of the full-view covers the parent of the
14247                --  partial-view we have nothing else to do.
14248
14249                if Interface_Present_In_Ancestor
14250                     (Parent_Type, Partial_View_Parent)
14251                then
14252                   null;
14253
14254                --  Traverse the list of interfaces of the full-view to look
14255                --  for the parent of the partial-view and perform the tree
14256                --  transformation.
14257
14258                else
14259                   Iface := First (Interface_List (Def));
14260                   while Present (Iface) loop
14261                      if Etype (Iface) = Etype (Partial_View) then
14262                         Rewrite (Subtype_Indication (Def),
14263                           New_Copy (Subtype_Indication
14264                                      (Parent (Partial_View))));
14265
14266                         New_Iface :=
14267                           Make_Identifier (Sloc (N), Chars (Parent_Type));
14268                         Append (New_Iface, Interface_List (Def));
14269
14270                         --  Analyze the transformed code
14271
14272                         Derived_Type_Declaration (T, N, Is_Completion);
14273                         return;
14274                      end if;
14275
14276                      Next (Iface);
14277                   end loop;
14278                end if;
14279             end if;
14280          end;
14281       end if;
14282
14283       --  Only composite types other than array types are allowed to have
14284       --  discriminants. In SPARK, no types are allowed to have discriminants.
14285
14286       if Present (Discriminant_Specifications (N)) then
14287          if (Is_Elementary_Type (Parent_Type)
14288               or else Is_Array_Type (Parent_Type))
14289            and then not Error_Posted (N)
14290          then
14291             Error_Msg_N
14292               ("elementary or array type cannot have discriminants",
14293                Defining_Identifier (First (Discriminant_Specifications (N))));
14294             Set_Has_Discriminants (T, False);
14295          else
14296             Check_SPARK_Restriction ("discriminant type is not allowed", N);
14297          end if;
14298       end if;
14299
14300       --  In Ada 83, a derived type defined in a package specification cannot
14301       --  be used for further derivation until the end of its visible part.
14302       --  Note that derivation in the private part of the package is allowed.
14303
14304       if Ada_Version = Ada_83
14305         and then Is_Derived_Type (Parent_Type)
14306         and then In_Visible_Part (Scope (Parent_Type))
14307       then
14308          if Ada_Version = Ada_83 and then Comes_From_Source (Indic) then
14309             Error_Msg_N
14310               ("(Ada 83): premature use of type for derivation", Indic);
14311          end if;
14312       end if;
14313
14314       --  Check for early use of incomplete or private type
14315
14316       if Ekind_In (Parent_Type, E_Void, E_Incomplete_Type) then
14317          Error_Msg_N ("premature derivation of incomplete type", Indic);
14318          return;
14319
14320       elsif (Is_Incomplete_Or_Private_Type (Parent_Type)
14321               and then not Comes_From_Generic (Parent_Type))
14322         or else Has_Private_Component (Parent_Type)
14323       then
14324          --  The ancestor type of a formal type can be incomplete, in which
14325          --  case only the operations of the partial view are available in the
14326          --  generic. Subsequent checks may be required when the full view is
14327          --  analyzed to verify that a derivation from a tagged type has an
14328          --  extension.
14329
14330          if Nkind (Original_Node (N)) = N_Formal_Type_Declaration then
14331             null;
14332
14333          elsif No (Underlying_Type (Parent_Type))
14334            or else Has_Private_Component (Parent_Type)
14335          then
14336             Error_Msg_N
14337               ("premature derivation of derived or private type", Indic);
14338
14339             --  Flag the type itself as being in error, this prevents some
14340             --  nasty problems with subsequent uses of the malformed type.
14341
14342             Set_Error_Posted (T);
14343
14344          --  Check that within the immediate scope of an untagged partial
14345          --  view it's illegal to derive from the partial view if the
14346          --  full view is tagged. (7.3(7))
14347
14348          --  We verify that the Parent_Type is a partial view by checking
14349          --  that it is not a Full_Type_Declaration (i.e. a private type or
14350          --  private extension declaration), to distinguish a partial view
14351          --  from  a derivation from a private type which also appears as
14352          --  E_Private_Type. If the parent base type is not declared in an
14353          --  enclosing scope there is no need to check.
14354
14355          elsif Present (Full_View (Parent_Type))
14356            and then Nkind (Parent (Parent_Type)) /= N_Full_Type_Declaration
14357            and then not Is_Tagged_Type (Parent_Type)
14358            and then Is_Tagged_Type (Full_View (Parent_Type))
14359            and then In_Open_Scopes (Scope (Base_Type (Parent_Type)))
14360          then
14361             Error_Msg_N
14362               ("premature derivation from type with tagged full view",
14363                 Indic);
14364          end if;
14365       end if;
14366
14367       --  Check that form of derivation is appropriate
14368
14369       Taggd := Is_Tagged_Type (Parent_Type);
14370
14371       --  Perhaps the parent type should be changed to the class-wide type's
14372       --  specific type in this case to prevent cascading errors ???
14373
14374       if Present (Extension) and then Is_Class_Wide_Type (Parent_Type) then
14375          Error_Msg_N ("parent type must not be a class-wide type", Indic);
14376          return;
14377       end if;
14378
14379       if Present (Extension) and then not Taggd then
14380          Error_Msg_N
14381            ("type derived from untagged type cannot have extension", Indic);
14382
14383       elsif No (Extension) and then Taggd then
14384
14385          --  If this declaration is within a private part (or body) of a
14386          --  generic instantiation then the derivation is allowed (the parent
14387          --  type can only appear tagged in this case if it's a generic actual
14388          --  type, since it would otherwise have been rejected in the analysis
14389          --  of the generic template).
14390
14391          if not Is_Generic_Actual_Type (Parent_Type)
14392            or else In_Visible_Part (Scope (Parent_Type))
14393          then
14394             if Is_Class_Wide_Type (Parent_Type) then
14395                Error_Msg_N
14396                  ("parent type must not be a class-wide type", Indic);
14397
14398                --  Use specific type to prevent cascaded errors.
14399
14400                Parent_Type := Etype (Parent_Type);
14401
14402             else
14403                Error_Msg_N
14404                  ("type derived from tagged type must have extension", Indic);
14405             end if;
14406          end if;
14407       end if;
14408
14409       --  AI-443: Synchronized formal derived types require a private
14410       --  extension. There is no point in checking the ancestor type or
14411       --  the progenitors since the construct is wrong to begin with.
14412
14413       if Ada_Version >= Ada_2005
14414         and then Is_Generic_Type (T)
14415         and then Present (Original_Node (N))
14416       then
14417          declare
14418             Decl : constant Node_Id := Original_Node (N);
14419
14420          begin
14421             if Nkind (Decl) = N_Formal_Type_Declaration
14422               and then Nkind (Formal_Type_Definition (Decl)) =
14423                          N_Formal_Derived_Type_Definition
14424               and then Synchronized_Present (Formal_Type_Definition (Decl))
14425               and then No (Extension)
14426
14427                --  Avoid emitting a duplicate error message
14428
14429               and then not Error_Posted (Indic)
14430             then
14431                Error_Msg_N
14432                  ("synchronized derived type must have extension", N);
14433             end if;
14434          end;
14435       end if;
14436
14437       if Null_Exclusion_Present (Def)
14438         and then not Is_Access_Type (Parent_Type)
14439       then
14440          Error_Msg_N ("null exclusion can only apply to an access type", N);
14441       end if;
14442
14443       --  Avoid deriving parent primitives of underlying record views
14444
14445       Build_Derived_Type (N, Parent_Type, T, Is_Completion,
14446         Derive_Subps => not Is_Underlying_Record_View (T));
14447
14448       --  AI-419: The parent type of an explicitly limited derived type must
14449       --  be a limited type or a limited interface.
14450
14451       if Limited_Present (Def) then
14452          Set_Is_Limited_Record (T);
14453
14454          if Is_Interface (T) then
14455             Set_Is_Limited_Interface (T);
14456          end if;
14457
14458          if not Is_Limited_Type (Parent_Type)
14459            and then
14460              (not Is_Interface (Parent_Type)
14461                or else not Is_Limited_Interface (Parent_Type))
14462          then
14463             --  AI05-0096: a derivation in the private part of an instance is
14464             --  legal if the generic formal is untagged limited, and the actual
14465             --  is non-limited.
14466
14467             if Is_Generic_Actual_Type (Parent_Type)
14468               and then In_Private_Part (Current_Scope)
14469               and then
14470                 not Is_Tagged_Type
14471                       (Generic_Parent_Type (Parent (Parent_Type)))
14472             then
14473                null;
14474
14475             else
14476                Error_Msg_NE
14477                  ("parent type& of limited type must be limited",
14478                   N, Parent_Type);
14479             end if;
14480          end if;
14481       end if;
14482
14483       --  In SPARK, there are no derived type definitions other than type
14484       --  extensions of tagged record types.
14485
14486       if No (Extension) then
14487          Check_SPARK_Restriction ("derived type is not allowed", N);
14488       end if;
14489    end Derived_Type_Declaration;
14490
14491    ------------------------
14492    -- Diagnose_Interface --
14493    ------------------------
14494
14495    procedure Diagnose_Interface (N : Node_Id;  E : Entity_Id) is
14496    begin
14497       if not Is_Interface (E)
14498         and then  E /= Any_Type
14499       then
14500          Error_Msg_NE ("(Ada 2005) & must be an interface", N, E);
14501       end if;
14502    end Diagnose_Interface;
14503
14504    ----------------------------------
14505    -- Enumeration_Type_Declaration --
14506    ----------------------------------
14507
14508    procedure Enumeration_Type_Declaration (T : Entity_Id; Def : Node_Id) is
14509       Ev     : Uint;
14510       L      : Node_Id;
14511       R_Node : Node_Id;
14512       B_Node : Node_Id;
14513
14514    begin
14515       --  Create identifier node representing lower bound
14516
14517       B_Node := New_Node (N_Identifier, Sloc (Def));
14518       L := First (Literals (Def));
14519       Set_Chars (B_Node, Chars (L));
14520       Set_Entity (B_Node,  L);
14521       Set_Etype (B_Node, T);
14522       Set_Is_Static_Expression (B_Node, True);
14523
14524       R_Node := New_Node (N_Range, Sloc (Def));
14525       Set_Low_Bound  (R_Node, B_Node);
14526
14527       Set_Ekind (T, E_Enumeration_Type);
14528       Set_First_Literal (T, L);
14529       Set_Etype (T, T);
14530       Set_Is_Constrained (T);
14531
14532       Ev := Uint_0;
14533
14534       --  Loop through literals of enumeration type setting pos and rep values
14535       --  except that if the Ekind is already set, then it means the literal
14536       --  was already constructed (case of a derived type declaration and we
14537       --  should not disturb the Pos and Rep values.
14538
14539       while Present (L) loop
14540          if Ekind (L) /= E_Enumeration_Literal then
14541             Set_Ekind (L, E_Enumeration_Literal);
14542             Set_Enumeration_Pos (L, Ev);
14543             Set_Enumeration_Rep (L, Ev);
14544             Set_Is_Known_Valid  (L, True);
14545          end if;
14546
14547          Set_Etype (L, T);
14548          New_Overloaded_Entity (L);
14549          Generate_Definition (L);
14550          Set_Convention (L, Convention_Intrinsic);
14551
14552          --  Case of character literal
14553
14554          if Nkind (L) = N_Defining_Character_Literal then
14555             Set_Is_Character_Type (T, True);
14556
14557             --  Check violation of No_Wide_Characters
14558
14559             if Restriction_Check_Required (No_Wide_Characters) then
14560                Get_Name_String (Chars (L));
14561
14562                if Name_Len >= 3 and then Name_Buffer (1 .. 2) = "QW" then
14563                   Check_Restriction (No_Wide_Characters, L);
14564                end if;
14565             end if;
14566          end if;
14567
14568          Ev := Ev + 1;
14569          Next (L);
14570       end loop;
14571
14572       --  Now create a node representing upper bound
14573
14574       B_Node := New_Node (N_Identifier, Sloc (Def));
14575       Set_Chars (B_Node, Chars (Last (Literals (Def))));
14576       Set_Entity (B_Node,  Last (Literals (Def)));
14577       Set_Etype (B_Node, T);
14578       Set_Is_Static_Expression (B_Node, True);
14579
14580       Set_High_Bound (R_Node, B_Node);
14581
14582       --  Initialize various fields of the type. Some of this information
14583       --  may be overwritten later through rep.clauses.
14584
14585       Set_Scalar_Range    (T, R_Node);
14586       Set_RM_Size         (T, UI_From_Int (Minimum_Size (T)));
14587       Set_Enum_Esize      (T);
14588       Set_Enum_Pos_To_Rep (T, Empty);
14589
14590       --  Set Discard_Names if configuration pragma set, or if there is
14591       --  a parameterless pragma in the current declarative region
14592
14593       if Global_Discard_Names
14594         or else Discard_Names (Scope (T))
14595       then
14596          Set_Discard_Names (T);
14597       end if;
14598
14599       --  Process end label if there is one
14600
14601       if Present (Def) then
14602          Process_End_Label (Def, 'e', T);
14603       end if;
14604    end Enumeration_Type_Declaration;
14605
14606    ---------------------------------
14607    -- Expand_To_Stored_Constraint --
14608    ---------------------------------
14609
14610    function Expand_To_Stored_Constraint
14611      (Typ        : Entity_Id;
14612       Constraint : Elist_Id) return Elist_Id
14613    is
14614       Explicitly_Discriminated_Type : Entity_Id;
14615       Expansion    : Elist_Id;
14616       Discriminant : Entity_Id;
14617
14618       function Type_With_Explicit_Discrims (Id : Entity_Id) return Entity_Id;
14619       --  Find the nearest type that actually specifies discriminants
14620
14621       ---------------------------------
14622       -- Type_With_Explicit_Discrims --
14623       ---------------------------------
14624
14625       function Type_With_Explicit_Discrims (Id : Entity_Id) return Entity_Id is
14626          Typ : constant E := Base_Type (Id);
14627
14628       begin
14629          if Ekind (Typ) in Incomplete_Or_Private_Kind then
14630             if Present (Full_View (Typ)) then
14631                return Type_With_Explicit_Discrims (Full_View (Typ));
14632             end if;
14633
14634          else
14635             if Has_Discriminants (Typ) then
14636                return Typ;
14637             end if;
14638          end if;
14639
14640          if Etype (Typ) = Typ then
14641             return Empty;
14642          elsif Has_Discriminants (Typ) then
14643             return Typ;
14644          else
14645             return Type_With_Explicit_Discrims (Etype (Typ));
14646          end if;
14647
14648       end Type_With_Explicit_Discrims;
14649
14650    --  Start of processing for Expand_To_Stored_Constraint
14651
14652    begin
14653       if No (Constraint)
14654         or else Is_Empty_Elmt_List (Constraint)
14655       then
14656          return No_Elist;
14657       end if;
14658
14659       Explicitly_Discriminated_Type := Type_With_Explicit_Discrims (Typ);
14660
14661       if No (Explicitly_Discriminated_Type) then
14662          return No_Elist;
14663       end if;
14664
14665       Expansion := New_Elmt_List;
14666
14667       Discriminant :=
14668          First_Stored_Discriminant (Explicitly_Discriminated_Type);
14669       while Present (Discriminant) loop
14670          Append_Elmt (
14671            Get_Discriminant_Value (
14672              Discriminant, Explicitly_Discriminated_Type, Constraint),
14673            Expansion);
14674          Next_Stored_Discriminant (Discriminant);
14675       end loop;
14676
14677       return Expansion;
14678    end Expand_To_Stored_Constraint;
14679
14680    ---------------------------
14681    -- Find_Hidden_Interface --
14682    ---------------------------
14683
14684    function Find_Hidden_Interface
14685      (Src  : Elist_Id;
14686       Dest : Elist_Id) return Entity_Id
14687    is
14688       Iface      : Entity_Id;
14689       Iface_Elmt : Elmt_Id;
14690
14691    begin
14692       if Present (Src) and then Present (Dest) then
14693          Iface_Elmt := First_Elmt (Src);
14694          while Present (Iface_Elmt) loop
14695             Iface := Node (Iface_Elmt);
14696
14697             if Is_Interface (Iface)
14698               and then not Contain_Interface (Iface, Dest)
14699             then
14700                return Iface;
14701             end if;
14702
14703             Next_Elmt (Iface_Elmt);
14704          end loop;
14705       end if;
14706
14707       return Empty;
14708    end Find_Hidden_Interface;
14709
14710    --------------------
14711    -- Find_Type_Name --
14712    --------------------
14713
14714    function Find_Type_Name (N : Node_Id) return Entity_Id is
14715       Id       : constant Entity_Id := Defining_Identifier (N);
14716       Prev     : Entity_Id;
14717       New_Id   : Entity_Id;
14718       Prev_Par : Node_Id;
14719
14720       procedure Tag_Mismatch;
14721       --  Diagnose a tagged partial view whose full view is untagged.
14722       --  We post the message on the full view, with a reference to
14723       --  the previous partial view. The partial view can be private
14724       --  or incomplete, and these are handled in a different manner,
14725       --  so we determine the position of the error message from the
14726       --  respective slocs of both.
14727
14728       ------------------
14729       -- Tag_Mismatch --
14730       ------------------
14731
14732       procedure Tag_Mismatch is
14733       begin
14734          if Sloc (Prev) < Sloc (Id) then
14735             if Ada_Version >= Ada_2012
14736               and then Nkind (N) = N_Private_Type_Declaration
14737             then
14738                Error_Msg_NE
14739                  ("declaration of private } must be a tagged type ", Id, Prev);
14740             else
14741                Error_Msg_NE
14742                  ("full declaration of } must be a tagged type ", Id, Prev);
14743             end if;
14744          else
14745             if Ada_Version >= Ada_2012
14746               and then Nkind (N) = N_Private_Type_Declaration
14747             then
14748                Error_Msg_NE
14749                  ("declaration of private } must be a tagged type ", Prev, Id);
14750             else
14751                Error_Msg_NE
14752                  ("full declaration of } must be a tagged type ", Prev, Id);
14753             end if;
14754          end if;
14755       end Tag_Mismatch;
14756
14757    --  Start of processing for Find_Type_Name
14758
14759    begin
14760       --  Find incomplete declaration, if one was given
14761
14762       Prev := Current_Entity_In_Scope (Id);
14763
14764       --  New type declaration
14765
14766       if No (Prev) then
14767          Enter_Name (Id);
14768          return Id;
14769
14770       --  Previous declaration exists
14771
14772       else
14773          Prev_Par := Parent (Prev);
14774
14775          --  Error if not incomplete/private case except if previous
14776          --  declaration is implicit, etc. Enter_Name will emit error if
14777          --  appropriate.
14778
14779          if not Is_Incomplete_Or_Private_Type (Prev) then
14780             Enter_Name (Id);
14781             New_Id := Id;
14782
14783          --  Check invalid completion of private or incomplete type
14784
14785          elsif not Nkind_In (N, N_Full_Type_Declaration,
14786                                 N_Task_Type_Declaration,
14787                                 N_Protected_Type_Declaration)
14788            and then
14789              (Ada_Version < Ada_2012
14790                 or else not Is_Incomplete_Type (Prev)
14791                 or else not Nkind_In (N, N_Private_Type_Declaration,
14792                                          N_Private_Extension_Declaration))
14793          then
14794             --  Completion must be a full type declarations (RM 7.3(4))
14795
14796             Error_Msg_Sloc := Sloc (Prev);
14797             Error_Msg_NE ("invalid completion of }", Id, Prev);
14798
14799             --  Set scope of Id to avoid cascaded errors. Entity is never
14800             --  examined again, except when saving globals in generics.
14801
14802             Set_Scope (Id, Current_Scope);
14803             New_Id := Id;
14804
14805             --  If this is a repeated incomplete declaration, no further
14806             --  checks are possible.
14807
14808             if Nkind (N) = N_Incomplete_Type_Declaration then
14809                return Prev;
14810             end if;
14811
14812          --  Case of full declaration of incomplete type
14813
14814          elsif Ekind (Prev) = E_Incomplete_Type
14815            and then (Ada_Version < Ada_2012
14816                       or else No (Full_View (Prev))
14817                       or else not Is_Private_Type (Full_View (Prev)))
14818          then
14819
14820             --  Indicate that the incomplete declaration has a matching full
14821             --  declaration. The defining occurrence of the incomplete
14822             --  declaration remains the visible one, and the procedure
14823             --  Get_Full_View dereferences it whenever the type is used.
14824
14825             if Present (Full_View (Prev)) then
14826                Error_Msg_NE ("invalid redeclaration of }", Id, Prev);
14827             end if;
14828
14829             Set_Full_View (Prev, Id);
14830             Append_Entity (Id, Current_Scope);
14831             Set_Is_Public (Id, Is_Public (Prev));
14832             Set_Is_Internal (Id);
14833             New_Id := Prev;
14834
14835             --  If the incomplete view is tagged, a class_wide type has been
14836             --  created already. Use it for the private type as well, in order
14837             --  to prevent multiple incompatible class-wide types that may be
14838             --  created for self-referential anonymous access components.
14839
14840             if Is_Tagged_Type (Prev)
14841               and then Present (Class_Wide_Type (Prev))
14842             then
14843                Set_Ekind (Id, Ekind (Prev));         --  will be reset later
14844                Set_Class_Wide_Type (Id, Class_Wide_Type (Prev));
14845                Set_Etype (Class_Wide_Type (Id), Id);
14846             end if;
14847
14848          --  Case of full declaration of private type
14849
14850          else
14851             --  If the private type was a completion of an incomplete type then
14852             --  update Prev to reference the private type
14853
14854             if Ada_Version >= Ada_2012
14855               and then Ekind (Prev) = E_Incomplete_Type
14856               and then Present (Full_View (Prev))
14857               and then Is_Private_Type (Full_View (Prev))
14858             then
14859                Prev := Full_View (Prev);
14860                Prev_Par := Parent (Prev);
14861             end if;
14862
14863             if Nkind (Parent (Prev)) /= N_Private_Extension_Declaration then
14864                if Etype (Prev) /= Prev then
14865
14866                   --  Prev is a private subtype or a derived type, and needs
14867                   --  no completion.
14868
14869                   Error_Msg_NE ("invalid redeclaration of }", Id, Prev);
14870                   New_Id := Id;
14871
14872                elsif Ekind (Prev) = E_Private_Type
14873                  and then Nkind_In (N, N_Task_Type_Declaration,
14874                                        N_Protected_Type_Declaration)
14875                then
14876                   Error_Msg_N
14877                    ("completion of nonlimited type cannot be limited", N);
14878
14879                elsif Ekind (Prev) = E_Record_Type_With_Private
14880                  and then Nkind_In (N, N_Task_Type_Declaration,
14881                                        N_Protected_Type_Declaration)
14882                then
14883                   if not Is_Limited_Record (Prev) then
14884                      Error_Msg_N
14885                         ("completion of nonlimited type cannot be limited", N);
14886
14887                   elsif No (Interface_List (N)) then
14888                      Error_Msg_N
14889                         ("completion of tagged private type must be tagged",
14890                          N);
14891                   end if;
14892
14893                elsif Nkind (N) = N_Full_Type_Declaration
14894                  and then
14895                    Nkind (Type_Definition (N)) = N_Record_Definition
14896                  and then Interface_Present (Type_Definition (N))
14897                then
14898                   Error_Msg_N
14899                     ("completion of private type cannot be an interface", N);
14900                end if;
14901
14902             --  Ada 2005 (AI-251): Private extension declaration of a task
14903             --  type or a protected type. This case arises when covering
14904             --  interface types.
14905
14906             elsif Nkind_In (N, N_Task_Type_Declaration,
14907                                N_Protected_Type_Declaration)
14908             then
14909                null;
14910
14911             elsif Nkind (N) /= N_Full_Type_Declaration
14912               or else Nkind (Type_Definition (N)) /= N_Derived_Type_Definition
14913             then
14914                Error_Msg_N
14915                  ("full view of private extension must be an extension", N);
14916
14917             elsif not (Abstract_Present (Parent (Prev)))
14918               and then Abstract_Present (Type_Definition (N))
14919             then
14920                Error_Msg_N
14921                  ("full view of non-abstract extension cannot be abstract", N);
14922             end if;
14923
14924             if not In_Private_Part (Current_Scope) then
14925                Error_Msg_N
14926                  ("declaration of full view must appear in private part", N);
14927             end if;
14928
14929             Copy_And_Swap (Prev, Id);
14930             Set_Has_Private_Declaration (Prev);
14931             Set_Has_Private_Declaration (Id);
14932
14933             --  If no error, propagate freeze_node from private to full view.
14934             --  It may have been generated for an early operational item.
14935
14936             if Present (Freeze_Node (Id))
14937               and then Serious_Errors_Detected = 0
14938               and then No (Full_View (Id))
14939             then
14940                Set_Freeze_Node (Prev, Freeze_Node (Id));
14941                Set_Freeze_Node (Id, Empty);
14942                Set_First_Rep_Item (Prev, First_Rep_Item (Id));
14943             end if;
14944
14945             Set_Full_View (Id, Prev);
14946             New_Id := Prev;
14947          end if;
14948
14949          --  Verify that full declaration conforms to partial one
14950
14951          if Is_Incomplete_Or_Private_Type (Prev)
14952            and then Present (Discriminant_Specifications (Prev_Par))
14953          then
14954             if Present (Discriminant_Specifications (N)) then
14955                if Ekind (Prev) = E_Incomplete_Type then
14956                   Check_Discriminant_Conformance (N, Prev, Prev);
14957                else
14958                   Check_Discriminant_Conformance (N, Prev, Id);
14959                end if;
14960
14961             else
14962                Error_Msg_N
14963                  ("missing discriminants in full type declaration", N);
14964
14965                --  To avoid cascaded errors on subsequent use, share the
14966                --  discriminants of the partial view.
14967
14968                Set_Discriminant_Specifications (N,
14969                  Discriminant_Specifications (Prev_Par));
14970             end if;
14971          end if;
14972
14973          --  A prior untagged partial view can have an associated class-wide
14974          --  type due to use of the class attribute, and in this case the full
14975          --  type must also be tagged. This Ada 95 usage is deprecated in favor
14976          --  of incomplete tagged declarations, but we check for it.
14977
14978          if Is_Type (Prev)
14979            and then (Is_Tagged_Type (Prev)
14980                        or else Present (Class_Wide_Type (Prev)))
14981          then
14982             --  Ada 2012 (AI05-0162): A private type may be the completion of
14983             --  an incomplete type
14984
14985             if Ada_Version >= Ada_2012
14986               and then Is_Incomplete_Type (Prev)
14987               and then Nkind_In (N, N_Private_Type_Declaration,
14988                                     N_Private_Extension_Declaration)
14989             then
14990                --  No need to check private extensions since they are tagged
14991
14992                if Nkind (N) = N_Private_Type_Declaration
14993                  and then not Tagged_Present (N)
14994                then
14995                   Tag_Mismatch;
14996                end if;
14997
14998             --  The full declaration is either a tagged type (including
14999             --  a synchronized type that implements interfaces) or a
15000             --  type extension, otherwise this is an error.
15001
15002             elsif Nkind_In (N, N_Task_Type_Declaration,
15003                                N_Protected_Type_Declaration)
15004             then
15005                if No (Interface_List (N))
15006                  and then not Error_Posted (N)
15007                then
15008                   Tag_Mismatch;
15009                end if;
15010
15011             elsif Nkind (Type_Definition (N)) = N_Record_Definition then
15012
15013                --  Indicate that the previous declaration (tagged incomplete
15014                --  or private declaration) requires the same on the full one.
15015
15016                if not Tagged_Present (Type_Definition (N)) then
15017                   Tag_Mismatch;
15018                   Set_Is_Tagged_Type (Id);
15019                end if;
15020
15021             elsif Nkind (Type_Definition (N)) = N_Derived_Type_Definition then
15022                if No (Record_Extension_Part (Type_Definition (N))) then
15023                   Error_Msg_NE
15024                     ("full declaration of } must be a record extension",
15025                      Prev, Id);
15026
15027                   --  Set some attributes to produce a usable full view
15028
15029                   Set_Is_Tagged_Type (Id);
15030                end if;
15031
15032             else
15033                Tag_Mismatch;
15034             end if;
15035          end if;
15036
15037          return New_Id;
15038       end if;
15039    end Find_Type_Name;
15040
15041    -------------------------
15042    -- Find_Type_Of_Object --
15043    -------------------------
15044
15045    function Find_Type_Of_Object
15046      (Obj_Def     : Node_Id;
15047       Related_Nod : Node_Id) return Entity_Id
15048    is
15049       Def_Kind : constant Node_Kind := Nkind (Obj_Def);
15050       P        : Node_Id := Parent (Obj_Def);
15051       T        : Entity_Id;
15052       Nam      : Name_Id;
15053
15054    begin
15055       --  If the parent is a component_definition node we climb to the
15056       --  component_declaration node
15057
15058       if Nkind (P) = N_Component_Definition then
15059          P := Parent (P);
15060       end if;
15061
15062       --  Case of an anonymous array subtype
15063
15064       if Nkind_In (Def_Kind, N_Constrained_Array_Definition,
15065                              N_Unconstrained_Array_Definition)
15066       then
15067          T := Empty;
15068          Array_Type_Declaration (T, Obj_Def);
15069
15070       --  Create an explicit subtype whenever possible
15071
15072       elsif Nkind (P) /= N_Component_Declaration
15073         and then Def_Kind = N_Subtype_Indication
15074       then
15075          --  Base name of subtype on object name, which will be unique in
15076          --  the current scope.
15077
15078          --  If this is a duplicate declaration, return base type, to avoid
15079          --  generating duplicate anonymous types.
15080
15081          if Error_Posted (P) then
15082             Analyze (Subtype_Mark (Obj_Def));
15083             return Entity (Subtype_Mark (Obj_Def));
15084          end if;
15085
15086          Nam :=
15087             New_External_Name
15088              (Chars (Defining_Identifier (Related_Nod)), 'S', 0, 'T');
15089
15090          T := Make_Defining_Identifier (Sloc (P), Nam);
15091
15092          Insert_Action (Obj_Def,
15093            Make_Subtype_Declaration (Sloc (P),
15094              Defining_Identifier => T,
15095              Subtype_Indication  => Relocate_Node (Obj_Def)));
15096
15097          --  This subtype may need freezing, and this will not be done
15098          --  automatically if the object declaration is not in declarative
15099          --  part. Since this is an object declaration, the type cannot always
15100          --  be frozen here. Deferred constants do not freeze their type
15101          --  (which often enough will be private).
15102
15103          if Nkind (P) = N_Object_Declaration
15104            and then Constant_Present (P)
15105            and then No (Expression (P))
15106          then
15107             null;
15108          else
15109             Insert_Actions (Obj_Def, Freeze_Entity (T, P));
15110          end if;
15111
15112       --  Ada 2005 AI-406: the object definition in an object declaration
15113       --  can be an access definition.
15114
15115       elsif Def_Kind = N_Access_Definition then
15116          T := Access_Definition (Related_Nod, Obj_Def);
15117          Set_Is_Local_Anonymous_Access (T);
15118
15119       --  Otherwise, the object definition is just a subtype_mark
15120
15121       else
15122          T := Process_Subtype (Obj_Def, Related_Nod);
15123
15124          --  If expansion is disabled an object definition that is an aggregate
15125          --  will not get expanded and may lead to scoping problems in the back
15126          --  end, if the object is referenced in an inner scope. In that case
15127          --  create an itype reference for the object definition now. This
15128          --  may be redundant in some cases, but harmless.
15129
15130          if Is_Itype (T)
15131            and then Nkind (Related_Nod) = N_Object_Declaration
15132            and then ASIS_Mode
15133          then
15134             Build_Itype_Reference (T, Related_Nod);
15135          end if;
15136       end if;
15137
15138       return T;
15139    end Find_Type_Of_Object;
15140
15141    --------------------------------
15142    -- Find_Type_Of_Subtype_Indic --
15143    --------------------------------
15144
15145    function Find_Type_Of_Subtype_Indic (S : Node_Id) return Entity_Id is
15146       Typ : Entity_Id;
15147
15148    begin
15149       --  Case of subtype mark with a constraint
15150
15151       if Nkind (S) = N_Subtype_Indication then
15152          Find_Type (Subtype_Mark (S));
15153          Typ := Entity (Subtype_Mark (S));
15154
15155          if not
15156            Is_Valid_Constraint_Kind (Ekind (Typ), Nkind (Constraint (S)))
15157          then
15158             Error_Msg_N
15159               ("incorrect constraint for this kind of type", Constraint (S));
15160             Rewrite (S, New_Copy_Tree (Subtype_Mark (S)));
15161          end if;
15162
15163       --  Otherwise we have a subtype mark without a constraint
15164
15165       elsif Error_Posted (S) then
15166          Rewrite (S, New_Occurrence_Of (Any_Id, Sloc (S)));
15167          return Any_Type;
15168
15169       else
15170          Find_Type (S);
15171          Typ := Entity (S);
15172       end if;
15173
15174       --  Check No_Wide_Characters restriction
15175
15176       Check_Wide_Character_Restriction (Typ, S);
15177
15178       return Typ;
15179    end Find_Type_Of_Subtype_Indic;
15180
15181    -------------------------------------
15182    -- Floating_Point_Type_Declaration --
15183    -------------------------------------
15184
15185    procedure Floating_Point_Type_Declaration (T : Entity_Id; Def : Node_Id) is
15186       Digs          : constant Node_Id := Digits_Expression (Def);
15187       Max_Digs_Val  : constant Uint := Digits_Value (Standard_Long_Long_Float);
15188       Digs_Val      : Uint;
15189       Base_Typ      : Entity_Id;
15190       Implicit_Base : Entity_Id;
15191       Bound         : Node_Id;
15192
15193       function Can_Derive_From (E : Entity_Id) return Boolean;
15194       --  Find if given digits value, and possibly a specified range, allows
15195       --  derivation from specified type
15196
15197       function Find_Base_Type return Entity_Id;
15198       --  Find a predefined base type that Def can derive from, or generate
15199       --  an error and substitute Long_Long_Float if none exists.
15200
15201       ---------------------
15202       -- Can_Derive_From --
15203       ---------------------
15204
15205       function Can_Derive_From (E : Entity_Id) return Boolean is
15206          Spec : constant Entity_Id := Real_Range_Specification (Def);
15207
15208       begin
15209          if Digs_Val > Digits_Value (E) then
15210             return False;
15211          end if;
15212
15213          if Present (Spec) then
15214             if Expr_Value_R (Type_Low_Bound (E)) >
15215                Expr_Value_R (Low_Bound (Spec))
15216             then
15217                return False;
15218             end if;
15219
15220             if Expr_Value_R (Type_High_Bound (E)) <
15221                Expr_Value_R (High_Bound (Spec))
15222             then
15223                return False;
15224             end if;
15225          end if;
15226
15227          return True;
15228       end Can_Derive_From;
15229
15230       --------------------
15231       -- Find_Base_Type --
15232       --------------------
15233
15234       function Find_Base_Type return Entity_Id is
15235          Choice : Elmt_Id := First_Elmt (Predefined_Float_Types);
15236
15237       begin
15238          --  Iterate over the predefined types in order, returning the first
15239          --  one that Def can derive from.
15240
15241          while Present (Choice) loop
15242             if Can_Derive_From (Node (Choice)) then
15243                return Node (Choice);
15244             end if;
15245
15246             Next_Elmt (Choice);
15247          end loop;
15248
15249          --  If we can't derive from any existing type, use Long_Long_Float
15250          --  and give appropriate message explaining the problem.
15251
15252          if Digs_Val > Max_Digs_Val then
15253             --  It might be the case that there is a type with the requested
15254             --  range, just not the combination of digits and range.
15255
15256             Error_Msg_N
15257               ("no predefined type has requested range and precision",
15258                Real_Range_Specification (Def));
15259
15260          else
15261             Error_Msg_N
15262               ("range too large for any predefined type",
15263                Real_Range_Specification (Def));
15264          end if;
15265
15266          return Standard_Long_Long_Float;
15267       end Find_Base_Type;
15268
15269    --  Start of processing for Floating_Point_Type_Declaration
15270
15271    begin
15272       Check_Restriction (No_Floating_Point, Def);
15273
15274       --  Create an implicit base type
15275
15276       Implicit_Base :=
15277         Create_Itype (E_Floating_Point_Type, Parent (Def), T, 'B');
15278
15279       --  Analyze and verify digits value
15280
15281       Analyze_And_Resolve (Digs, Any_Integer);
15282       Check_Digits_Expression (Digs);
15283       Digs_Val := Expr_Value (Digs);
15284
15285       --  Process possible range spec and find correct type to derive from
15286
15287       Process_Real_Range_Specification (Def);
15288
15289       --  Check that requested number of digits is not too high.
15290
15291       if Digs_Val > Max_Digs_Val then
15292          --  The check for Max_Base_Digits may be somewhat expensive, as it
15293          --  requires reading System, so only do it when necessary.
15294
15295          declare
15296             Max_Base_Digits : constant Uint :=
15297                                 Expr_Value
15298                                   (Expression
15299                                      (Parent (RTE (RE_Max_Base_Digits))));
15300
15301          begin
15302             if Digs_Val > Max_Base_Digits then
15303                Error_Msg_Uint_1 := Max_Base_Digits;
15304                Error_Msg_N ("digits value out of range, maximum is ^", Digs);
15305
15306             elsif No (Real_Range_Specification (Def)) then
15307                Error_Msg_Uint_1 := Max_Digs_Val;
15308                Error_Msg_N ("types with more than ^ digits need range spec "
15309                  & "(RM 3.5.7(6))", Digs);
15310             end if;
15311          end;
15312       end if;
15313
15314       --  Find a suitable type to derive from or complain and use a substitute
15315
15316       Base_Typ := Find_Base_Type;
15317
15318       --  If there are bounds given in the declaration use them as the bounds
15319       --  of the type, otherwise use the bounds of the predefined base type
15320       --  that was chosen based on the Digits value.
15321
15322       if Present (Real_Range_Specification (Def)) then
15323          Set_Scalar_Range (T, Real_Range_Specification (Def));
15324          Set_Is_Constrained (T);
15325
15326          --  The bounds of this range must be converted to machine numbers
15327          --  in accordance with RM 4.9(38).
15328
15329          Bound := Type_Low_Bound (T);
15330
15331          if Nkind (Bound) = N_Real_Literal then
15332             Set_Realval
15333               (Bound, Machine (Base_Typ, Realval (Bound), Round, Bound));
15334             Set_Is_Machine_Number (Bound);
15335          end if;
15336
15337          Bound := Type_High_Bound (T);
15338
15339          if Nkind (Bound) = N_Real_Literal then
15340             Set_Realval
15341               (Bound, Machine (Base_Typ, Realval (Bound), Round, Bound));
15342             Set_Is_Machine_Number (Bound);
15343          end if;
15344
15345       else
15346          Set_Scalar_Range (T, Scalar_Range (Base_Typ));
15347       end if;
15348
15349       --  Complete definition of implicit base and declared first subtype
15350
15351       Set_Etype          (Implicit_Base, Base_Typ);
15352
15353       Set_Scalar_Range   (Implicit_Base, Scalar_Range   (Base_Typ));
15354       Set_Size_Info      (Implicit_Base,                (Base_Typ));
15355       Set_RM_Size        (Implicit_Base, RM_Size        (Base_Typ));
15356       Set_First_Rep_Item (Implicit_Base, First_Rep_Item (Base_Typ));
15357       Set_Digits_Value   (Implicit_Base, Digits_Value   (Base_Typ));
15358       Set_Float_Rep      (Implicit_Base, Float_Rep      (Base_Typ));
15359
15360       Set_Ekind          (T, E_Floating_Point_Subtype);
15361       Set_Etype          (T, Implicit_Base);
15362
15363       Set_Size_Info      (T,                (Implicit_Base));
15364       Set_RM_Size        (T, RM_Size        (Implicit_Base));
15365       Set_First_Rep_Item (T, First_Rep_Item (Implicit_Base));
15366       Set_Digits_Value   (T, Digs_Val);
15367    end Floating_Point_Type_Declaration;
15368
15369    ----------------------------
15370    -- Get_Discriminant_Value --
15371    ----------------------------
15372
15373    --  This is the situation:
15374
15375    --  There is a non-derived type
15376
15377    --       type T0 (Dx, Dy, Dz...)
15378
15379    --  There are zero or more levels of derivation, with each derivation
15380    --  either purely inheriting the discriminants, or defining its own.
15381
15382    --       type Ti      is new Ti-1
15383    --  or
15384    --       type Ti (Dw) is new Ti-1(Dw, 1, X+Y)
15385    --  or
15386    --       subtype Ti is ...
15387
15388    --  The subtype issue is avoided by the use of Original_Record_Component,
15389    --  and the fact that derived subtypes also derive the constraints.
15390
15391    --  This chain leads back from
15392
15393    --       Typ_For_Constraint
15394
15395    --  Typ_For_Constraint has discriminants, and the value for each
15396    --  discriminant is given by its corresponding Elmt of Constraints.
15397
15398    --  Discriminant is some discriminant in this hierarchy
15399
15400    --  We need to return its value
15401
15402    --  We do this by recursively searching each level, and looking for
15403    --  Discriminant. Once we get to the bottom, we start backing up
15404    --  returning the value for it which may in turn be a discriminant
15405    --  further up, so on the backup we continue the substitution.
15406
15407    function Get_Discriminant_Value
15408      (Discriminant       : Entity_Id;
15409       Typ_For_Constraint : Entity_Id;
15410       Constraint         : Elist_Id) return Node_Id
15411    is
15412       function Search_Derivation_Levels
15413         (Ti                    : Entity_Id;
15414          Discrim_Values        : Elist_Id;
15415          Stored_Discrim_Values : Boolean) return Node_Or_Entity_Id;
15416       --  This is the routine that performs the recursive search of levels
15417       --  as described above.
15418
15419       ------------------------------
15420       -- Search_Derivation_Levels --
15421       ------------------------------
15422
15423       function Search_Derivation_Levels
15424         (Ti                    : Entity_Id;
15425          Discrim_Values        : Elist_Id;
15426          Stored_Discrim_Values : Boolean) return Node_Or_Entity_Id
15427       is
15428          Assoc          : Elmt_Id;
15429          Disc           : Entity_Id;
15430          Result         : Node_Or_Entity_Id;
15431          Result_Entity  : Node_Id;
15432
15433       begin
15434          --  If inappropriate type, return Error, this happens only in
15435          --  cascaded error situations, and we want to avoid a blow up.
15436
15437          if not Is_Composite_Type (Ti) or else Is_Array_Type (Ti) then
15438             return Error;
15439          end if;
15440
15441          --  Look deeper if possible. Use Stored_Constraints only for
15442          --  untagged types. For tagged types use the given constraint.
15443          --  This asymmetry needs explanation???
15444
15445          if not Stored_Discrim_Values
15446            and then Present (Stored_Constraint (Ti))
15447            and then not Is_Tagged_Type (Ti)
15448          then
15449             Result :=
15450               Search_Derivation_Levels (Ti, Stored_Constraint (Ti), True);
15451          else
15452             declare
15453                Td : constant Entity_Id := Etype (Ti);
15454
15455             begin
15456                if Td = Ti then
15457                   Result := Discriminant;
15458
15459                else
15460                   if Present (Stored_Constraint (Ti)) then
15461                      Result :=
15462                         Search_Derivation_Levels
15463                           (Td, Stored_Constraint (Ti), True);
15464                   else
15465                      Result :=
15466                         Search_Derivation_Levels
15467                           (Td, Discrim_Values, Stored_Discrim_Values);
15468                   end if;
15469                end if;
15470             end;
15471          end if;
15472
15473          --  Extra underlying places to search, if not found above. For
15474          --  concurrent types, the relevant discriminant appears in the
15475          --  corresponding record. For a type derived from a private type
15476          --  without discriminant, the full view inherits the discriminants
15477          --  of the full view of the parent.
15478
15479          if Result = Discriminant then
15480             if Is_Concurrent_Type (Ti)
15481               and then Present (Corresponding_Record_Type (Ti))
15482             then
15483                Result :=
15484                  Search_Derivation_Levels (
15485                    Corresponding_Record_Type (Ti),
15486                    Discrim_Values,
15487                    Stored_Discrim_Values);
15488
15489             elsif Is_Private_Type (Ti)
15490               and then not Has_Discriminants (Ti)
15491               and then Present (Full_View (Ti))
15492               and then Etype (Full_View (Ti)) /= Ti
15493             then
15494                Result :=
15495                  Search_Derivation_Levels (
15496                    Full_View (Ti),
15497                    Discrim_Values,
15498                    Stored_Discrim_Values);
15499             end if;
15500          end if;
15501
15502          --  If Result is not a (reference to a) discriminant, return it,
15503          --  otherwise set Result_Entity to the discriminant.
15504
15505          if Nkind (Result) = N_Defining_Identifier then
15506             pragma Assert (Result = Discriminant);
15507             Result_Entity := Result;
15508
15509          else
15510             if not Denotes_Discriminant (Result) then
15511                return Result;
15512             end if;
15513
15514             Result_Entity := Entity (Result);
15515          end if;
15516
15517          --  See if this level of derivation actually has discriminants
15518          --  because tagged derivations can add them, hence the lower
15519          --  levels need not have any.
15520
15521          if not Has_Discriminants (Ti) then
15522             return Result;
15523          end if;
15524
15525          --  Scan Ti's discriminants for Result_Entity,
15526          --  and return its corresponding value, if any.
15527
15528          Result_Entity := Original_Record_Component (Result_Entity);
15529
15530          Assoc := First_Elmt (Discrim_Values);
15531
15532          if Stored_Discrim_Values then
15533             Disc := First_Stored_Discriminant (Ti);
15534          else
15535             Disc := First_Discriminant (Ti);
15536          end if;
15537
15538          while Present (Disc) loop
15539             pragma Assert (Present (Assoc));
15540
15541             if Original_Record_Component (Disc) = Result_Entity then
15542                return Node (Assoc);
15543             end if;
15544
15545             Next_Elmt (Assoc);
15546
15547             if Stored_Discrim_Values then
15548                Next_Stored_Discriminant (Disc);
15549             else
15550                Next_Discriminant (Disc);
15551             end if;
15552          end loop;
15553
15554          --  Could not find it
15555          --
15556          return Result;
15557       end Search_Derivation_Levels;
15558
15559       --  Local Variables
15560
15561       Result : Node_Or_Entity_Id;
15562
15563    --  Start of processing for Get_Discriminant_Value
15564
15565    begin
15566       --  ??? This routine is a gigantic mess and will be deleted. For the
15567       --  time being just test for the trivial case before calling recurse.
15568
15569       if Base_Type (Scope (Discriminant)) = Base_Type (Typ_For_Constraint) then
15570          declare
15571             D : Entity_Id;
15572             E : Elmt_Id;
15573
15574          begin
15575             D := First_Discriminant (Typ_For_Constraint);
15576             E := First_Elmt (Constraint);
15577             while Present (D) loop
15578                if Chars (D) = Chars (Discriminant) then
15579                   return Node (E);
15580                end if;
15581
15582                Next_Discriminant (D);
15583                Next_Elmt (E);
15584             end loop;
15585          end;
15586       end if;
15587
15588       Result := Search_Derivation_Levels
15589         (Typ_For_Constraint, Constraint, False);
15590
15591       --  ??? hack to disappear when this routine is gone
15592
15593       if  Nkind (Result) = N_Defining_Identifier then
15594          declare
15595             D : Entity_Id;
15596             E : Elmt_Id;
15597
15598          begin
15599             D := First_Discriminant (Typ_For_Constraint);
15600             E := First_Elmt (Constraint);
15601             while Present (D) loop
15602                if Corresponding_Discriminant (D) = Discriminant then
15603                   return Node (E);
15604                end if;
15605
15606                Next_Discriminant (D);
15607                Next_Elmt (E);
15608             end loop;
15609          end;
15610       end if;
15611
15612       pragma Assert (Nkind (Result) /= N_Defining_Identifier);
15613       return Result;
15614    end Get_Discriminant_Value;
15615
15616    --------------------------
15617    -- Has_Range_Constraint --
15618    --------------------------
15619
15620    function Has_Range_Constraint (N : Node_Id) return Boolean is
15621       C : constant Node_Id := Constraint (N);
15622
15623    begin
15624       if Nkind (C) = N_Range_Constraint then
15625          return True;
15626
15627       elsif Nkind (C) = N_Digits_Constraint then
15628          return
15629             Is_Decimal_Fixed_Point_Type (Entity (Subtype_Mark (N)))
15630               or else
15631             Present (Range_Constraint (C));
15632
15633       elsif Nkind (C) = N_Delta_Constraint then
15634          return Present (Range_Constraint (C));
15635
15636       else
15637          return False;
15638       end if;
15639    end Has_Range_Constraint;
15640
15641    ------------------------
15642    -- Inherit_Components --
15643    ------------------------
15644
15645    function Inherit_Components
15646      (N             : Node_Id;
15647       Parent_Base   : Entity_Id;
15648       Derived_Base  : Entity_Id;
15649       Is_Tagged     : Boolean;
15650       Inherit_Discr : Boolean;
15651       Discs         : Elist_Id) return Elist_Id
15652    is
15653       Assoc_List : constant Elist_Id := New_Elmt_List;
15654
15655       procedure Inherit_Component
15656         (Old_C          : Entity_Id;
15657          Plain_Discrim  : Boolean := False;
15658          Stored_Discrim : Boolean := False);
15659       --  Inherits component Old_C from Parent_Base to the Derived_Base. If
15660       --  Plain_Discrim is True, Old_C is a discriminant. If Stored_Discrim is
15661       --  True, Old_C is a stored discriminant. If they are both false then
15662       --  Old_C is a regular component.
15663
15664       -----------------------
15665       -- Inherit_Component --
15666       -----------------------
15667
15668       procedure Inherit_Component
15669         (Old_C          : Entity_Id;
15670          Plain_Discrim  : Boolean := False;
15671          Stored_Discrim : Boolean := False)
15672       is
15673          New_C : constant Entity_Id := New_Copy (Old_C);
15674
15675          Discrim      : Entity_Id;
15676          Corr_Discrim : Entity_Id;
15677
15678       begin
15679          pragma Assert (not Is_Tagged or else not Stored_Discrim);
15680
15681          Set_Parent (New_C, Parent (Old_C));
15682
15683          --  Regular discriminants and components must be inserted in the scope
15684          --  of the Derived_Base. Do it here.
15685
15686          if not Stored_Discrim then
15687             Enter_Name (New_C);
15688          end if;
15689
15690          --  For tagged types the Original_Record_Component must point to
15691          --  whatever this field was pointing to in the parent type. This has
15692          --  already been achieved by the call to New_Copy above.
15693
15694          if not Is_Tagged then
15695             Set_Original_Record_Component (New_C, New_C);
15696          end if;
15697
15698          --  If we have inherited a component then see if its Etype contains
15699          --  references to Parent_Base discriminants. In this case, replace
15700          --  these references with the constraints given in Discs. We do not
15701          --  do this for the partial view of private types because this is
15702          --  not needed (only the components of the full view will be used
15703          --  for code generation) and cause problem. We also avoid this
15704          --  transformation in some error situations.
15705
15706          if Ekind (New_C) = E_Component then
15707             if (Is_Private_Type (Derived_Base)
15708                  and then not Is_Generic_Type (Derived_Base))
15709               or else (Is_Empty_Elmt_List (Discs)
15710                         and then  not Expander_Active)
15711             then
15712                Set_Etype (New_C, Etype (Old_C));
15713
15714             else
15715                --  The current component introduces a circularity of the
15716                --  following kind:
15717
15718                --     limited with Pack_2;
15719                --     package Pack_1 is
15720                --        type T_1 is tagged record
15721                --           Comp : access Pack_2.T_2;
15722                --           ...
15723                --        end record;
15724                --     end Pack_1;
15725
15726                --     with Pack_1;
15727                --     package Pack_2 is
15728                --        type T_2 is new Pack_1.T_1 with ...;
15729                --     end Pack_2;
15730
15731                Set_Etype
15732                  (New_C,
15733                   Constrain_Component_Type
15734                   (Old_C, Derived_Base, N, Parent_Base, Discs));
15735             end if;
15736          end if;
15737
15738          --  In derived tagged types it is illegal to reference a non
15739          --  discriminant component in the parent type. To catch this, mark
15740          --  these components with an Ekind of E_Void. This will be reset in
15741          --  Record_Type_Definition after processing the record extension of
15742          --  the derived type.
15743
15744          --  If the declaration is a private extension, there is no further
15745          --  record extension to process, and the components retain their
15746          --  current kind, because they are visible at this point.
15747
15748          if Is_Tagged and then Ekind (New_C) = E_Component
15749            and then Nkind (N) /= N_Private_Extension_Declaration
15750          then
15751             Set_Ekind (New_C, E_Void);
15752          end if;
15753
15754          if Plain_Discrim then
15755             Set_Corresponding_Discriminant (New_C, Old_C);
15756             Build_Discriminal (New_C);
15757
15758          --  If we are explicitly inheriting a stored discriminant it will be
15759          --  completely hidden.
15760
15761          elsif Stored_Discrim then
15762             Set_Corresponding_Discriminant (New_C, Empty);
15763             Set_Discriminal (New_C, Empty);
15764             Set_Is_Completely_Hidden (New_C);
15765
15766             --  Set the Original_Record_Component of each discriminant in the
15767             --  derived base to point to the corresponding stored that we just
15768             --  created.
15769
15770             Discrim := First_Discriminant (Derived_Base);
15771             while Present (Discrim) loop
15772                Corr_Discrim := Corresponding_Discriminant (Discrim);
15773
15774                --  Corr_Discrim could be missing in an error situation
15775
15776                if Present (Corr_Discrim)
15777                  and then Original_Record_Component (Corr_Discrim) = Old_C
15778                then
15779                   Set_Original_Record_Component (Discrim, New_C);
15780                end if;
15781
15782                Next_Discriminant (Discrim);
15783             end loop;
15784
15785             Append_Entity (New_C, Derived_Base);
15786          end if;
15787
15788          if not Is_Tagged then
15789             Append_Elmt (Old_C, Assoc_List);
15790             Append_Elmt (New_C, Assoc_List);
15791          end if;
15792       end Inherit_Component;
15793
15794       --  Variables local to Inherit_Component
15795
15796       Loc : constant Source_Ptr := Sloc (N);
15797
15798       Parent_Discrim : Entity_Id;
15799       Stored_Discrim : Entity_Id;
15800       D              : Entity_Id;
15801       Component      : Entity_Id;
15802
15803    --  Start of processing for Inherit_Components
15804
15805    begin
15806       if not Is_Tagged then
15807          Append_Elmt (Parent_Base,  Assoc_List);
15808          Append_Elmt (Derived_Base, Assoc_List);
15809       end if;
15810
15811       --  Inherit parent discriminants if needed
15812
15813       if Inherit_Discr then
15814          Parent_Discrim := First_Discriminant (Parent_Base);
15815          while Present (Parent_Discrim) loop
15816             Inherit_Component (Parent_Discrim, Plain_Discrim => True);
15817             Next_Discriminant (Parent_Discrim);
15818          end loop;
15819       end if;
15820
15821       --  Create explicit stored discrims for untagged types when necessary
15822
15823       if not Has_Unknown_Discriminants (Derived_Base)
15824         and then Has_Discriminants (Parent_Base)
15825         and then not Is_Tagged
15826         and then
15827           (not Inherit_Discr
15828              or else First_Discriminant (Parent_Base) /=
15829                      First_Stored_Discriminant (Parent_Base))
15830       then
15831          Stored_Discrim := First_Stored_Discriminant (Parent_Base);
15832          while Present (Stored_Discrim) loop
15833             Inherit_Component (Stored_Discrim, Stored_Discrim => True);
15834             Next_Stored_Discriminant (Stored_Discrim);
15835          end loop;
15836       end if;
15837
15838       --  See if we can apply the second transformation for derived types, as
15839       --  explained in point 6. in the comments above Build_Derived_Record_Type
15840       --  This is achieved by appending Derived_Base discriminants into Discs,
15841       --  which has the side effect of returning a non empty Discs list to the
15842       --  caller of Inherit_Components, which is what we want. This must be
15843       --  done for private derived types if there are explicit stored
15844       --  discriminants, to ensure that we can retrieve the values of the
15845       --  constraints provided in the ancestors.
15846
15847       if Inherit_Discr
15848         and then Is_Empty_Elmt_List (Discs)
15849         and then Present (First_Discriminant (Derived_Base))
15850         and then
15851           (not Is_Private_Type (Derived_Base)
15852              or else Is_Completely_Hidden
15853                (First_Stored_Discriminant (Derived_Base))
15854              or else Is_Generic_Type (Derived_Base))
15855       then
15856          D := First_Discriminant (Derived_Base);
15857          while Present (D) loop
15858             Append_Elmt (New_Reference_To (D, Loc), Discs);
15859             Next_Discriminant (D);
15860          end loop;
15861       end if;
15862
15863       --  Finally, inherit non-discriminant components unless they are not
15864       --  visible because defined or inherited from the full view of the
15865       --  parent. Don't inherit the _parent field of the parent type.
15866
15867       Component := First_Entity (Parent_Base);
15868       while Present (Component) loop
15869
15870          --  Ada 2005 (AI-251): Do not inherit components associated with
15871          --  secondary tags of the parent.
15872
15873          if Ekind (Component) = E_Component
15874            and then Present (Related_Type (Component))
15875          then
15876             null;
15877
15878          elsif Ekind (Component) /= E_Component
15879            or else Chars (Component) = Name_uParent
15880          then
15881             null;
15882
15883          --  If the derived type is within the parent type's declarative
15884          --  region, then the components can still be inherited even though
15885          --  they aren't visible at this point. This can occur for cases
15886          --  such as within public child units where the components must
15887          --  become visible upon entering the child unit's private part.
15888
15889          elsif not Is_Visible_Component (Component)
15890            and then not In_Open_Scopes (Scope (Parent_Base))
15891          then
15892             null;
15893
15894          elsif Ekind_In (Derived_Base, E_Private_Type,
15895                                        E_Limited_Private_Type)
15896          then
15897             null;
15898
15899          else
15900             Inherit_Component (Component);
15901          end if;
15902
15903          Next_Entity (Component);
15904       end loop;
15905
15906       --  For tagged derived types, inherited discriminants cannot be used in
15907       --  component declarations of the record extension part. To achieve this
15908       --  we mark the inherited discriminants as not visible.
15909
15910       if Is_Tagged and then Inherit_Discr then
15911          D := First_Discriminant (Derived_Base);
15912          while Present (D) loop
15913             Set_Is_Immediately_Visible (D, False);
15914             Next_Discriminant (D);
15915          end loop;
15916       end if;
15917
15918       return Assoc_List;
15919    end Inherit_Components;
15920
15921    -----------------------
15922    -- Is_Constant_Bound --
15923    -----------------------
15924
15925    function Is_Constant_Bound (Exp : Node_Id) return Boolean is
15926    begin
15927       if Compile_Time_Known_Value (Exp) then
15928          return True;
15929
15930       elsif Is_Entity_Name (Exp)
15931         and then Present (Entity (Exp))
15932       then
15933          return Is_Constant_Object (Entity (Exp))
15934            or else Ekind (Entity (Exp)) = E_Enumeration_Literal;
15935
15936       elsif Nkind (Exp) in N_Binary_Op then
15937          return Is_Constant_Bound (Left_Opnd (Exp))
15938            and then Is_Constant_Bound (Right_Opnd (Exp))
15939            and then Scope (Entity (Exp)) = Standard_Standard;
15940
15941       else
15942          return False;
15943       end if;
15944    end Is_Constant_Bound;
15945
15946    -----------------------
15947    -- Is_Null_Extension --
15948    -----------------------
15949
15950    function Is_Null_Extension (T : Entity_Id) return Boolean is
15951       Type_Decl : constant Node_Id := Parent (Base_Type (T));
15952       Comp_List : Node_Id;
15953       Comp      : Node_Id;
15954
15955    begin
15956       if Nkind (Type_Decl) /= N_Full_Type_Declaration
15957         or else not Is_Tagged_Type (T)
15958         or else Nkind (Type_Definition (Type_Decl)) /=
15959                                               N_Derived_Type_Definition
15960         or else No (Record_Extension_Part (Type_Definition (Type_Decl)))
15961       then
15962          return False;
15963       end if;
15964
15965       Comp_List :=
15966         Component_List (Record_Extension_Part (Type_Definition (Type_Decl)));
15967
15968       if Present (Discriminant_Specifications (Type_Decl)) then
15969          return False;
15970
15971       elsif Present (Comp_List)
15972         and then Is_Non_Empty_List (Component_Items (Comp_List))
15973       then
15974          Comp := First (Component_Items (Comp_List));
15975
15976          --  Only user-defined components are relevant. The component list
15977          --  may also contain a parent component and internal components
15978          --  corresponding to secondary tags, but these do not determine
15979          --  whether this is a null extension.
15980
15981          while Present (Comp) loop
15982             if Comes_From_Source (Comp) then
15983                return False;
15984             end if;
15985
15986             Next (Comp);
15987          end loop;
15988
15989          return True;
15990       else
15991          return True;
15992       end if;
15993    end Is_Null_Extension;
15994
15995    ------------------------------
15996    -- Is_Valid_Constraint_Kind --
15997    ------------------------------
15998
15999    function Is_Valid_Constraint_Kind
16000      (T_Kind          : Type_Kind;
16001       Constraint_Kind : Node_Kind) return Boolean
16002    is
16003    begin
16004       case T_Kind is
16005          when Enumeration_Kind |
16006               Integer_Kind =>
16007             return Constraint_Kind = N_Range_Constraint;
16008
16009          when Decimal_Fixed_Point_Kind =>
16010             return Nkind_In (Constraint_Kind, N_Digits_Constraint,
16011                                               N_Range_Constraint);
16012
16013          when Ordinary_Fixed_Point_Kind =>
16014             return Nkind_In (Constraint_Kind, N_Delta_Constraint,
16015                                               N_Range_Constraint);
16016
16017          when Float_Kind =>
16018             return Nkind_In (Constraint_Kind, N_Digits_Constraint,
16019                                               N_Range_Constraint);
16020
16021          when Access_Kind       |
16022               Array_Kind        |
16023               E_Record_Type     |
16024               E_Record_Subtype  |
16025               Class_Wide_Kind   |
16026               E_Incomplete_Type |
16027               Private_Kind      |
16028               Concurrent_Kind  =>
16029             return Constraint_Kind = N_Index_Or_Discriminant_Constraint;
16030
16031          when others =>
16032             return True; -- Error will be detected later
16033       end case;
16034    end Is_Valid_Constraint_Kind;
16035
16036    --------------------------
16037    -- Is_Visible_Component --
16038    --------------------------
16039
16040    function Is_Visible_Component (C : Entity_Id) return Boolean is
16041       Original_Comp  : Entity_Id := Empty;
16042       Original_Scope : Entity_Id;
16043       Type_Scope     : Entity_Id;
16044
16045       function Is_Local_Type (Typ : Entity_Id) return Boolean;
16046       --  Check whether parent type of inherited component is declared locally,
16047       --  possibly within a nested package or instance. The current scope is
16048       --  the derived record itself.
16049
16050       -------------------
16051       -- Is_Local_Type --
16052       -------------------
16053
16054       function Is_Local_Type (Typ : Entity_Id) return Boolean is
16055          Scop : Entity_Id;
16056
16057       begin
16058          Scop := Scope (Typ);
16059          while Present (Scop)
16060            and then Scop /= Standard_Standard
16061          loop
16062             if Scop = Scope (Current_Scope) then
16063                return True;
16064             end if;
16065
16066             Scop := Scope (Scop);
16067          end loop;
16068
16069          return False;
16070       end Is_Local_Type;
16071
16072    --  Start of processing for Is_Visible_Component
16073
16074    begin
16075       if Ekind_In (C, E_Component, E_Discriminant) then
16076          Original_Comp := Original_Record_Component (C);
16077       end if;
16078
16079       if No (Original_Comp) then
16080
16081          --  Premature usage, or previous error
16082
16083          return False;
16084
16085       else
16086          Original_Scope := Scope (Original_Comp);
16087          Type_Scope     := Scope (Base_Type (Scope (C)));
16088       end if;
16089
16090       --  This test only concerns tagged types
16091
16092       if not Is_Tagged_Type (Original_Scope) then
16093          return True;
16094
16095       --  If it is _Parent or _Tag, there is no visibility issue
16096
16097       elsif not Comes_From_Source (Original_Comp) then
16098          return True;
16099
16100       --  If we are in the body of an instantiation, the component is visible
16101       --  even when the parent type (possibly defined in an enclosing unit or
16102       --  in a parent unit) might not.
16103
16104       elsif In_Instance_Body then
16105          return True;
16106
16107       --  Discriminants are always visible
16108
16109       elsif Ekind (Original_Comp) = E_Discriminant
16110         and then not Has_Unknown_Discriminants (Original_Scope)
16111       then
16112          return True;
16113
16114       --  If the component has been declared in an ancestor which is currently
16115       --  a private type, then it is not visible. The same applies if the
16116       --  component's containing type is not in an open scope and the original
16117       --  component's enclosing type is a visible full view of a private type
16118       --  (which can occur in cases where an attempt is being made to reference
16119       --  a component in a sibling package that is inherited from a visible
16120       --  component of a type in an ancestor package; the component in the
16121       --  sibling package should not be visible even though the component it
16122       --  inherited from is visible). This does not apply however in the case
16123       --  where the scope of the type is a private child unit, or when the
16124       --  parent comes from a local package in which the ancestor is currently
16125       --  visible. The latter suppression of visibility is needed for cases
16126       --  that are tested in B730006.
16127
16128       elsif Is_Private_Type (Original_Scope)
16129         or else
16130           (not Is_Private_Descendant (Type_Scope)
16131             and then not In_Open_Scopes (Type_Scope)
16132             and then Has_Private_Declaration (Original_Scope))
16133       then
16134          --  If the type derives from an entity in a formal package, there
16135          --  are no additional visible components.
16136
16137          if Nkind (Original_Node (Unit_Declaration_Node (Type_Scope))) =
16138             N_Formal_Package_Declaration
16139          then
16140             return False;
16141
16142          --  if we are not in the private part of the current package, there
16143          --  are no additional visible components.
16144
16145          elsif Ekind (Scope (Current_Scope)) = E_Package
16146            and then not In_Private_Part (Scope (Current_Scope))
16147          then
16148             return False;
16149          else
16150             return
16151               Is_Child_Unit (Cunit_Entity (Current_Sem_Unit))
16152                 and then In_Open_Scopes (Scope (Original_Scope))
16153                 and then Is_Local_Type (Type_Scope);
16154          end if;
16155
16156       --  There is another weird way in which a component may be invisible
16157       --  when the private and the full view are not derived from the same
16158       --  ancestor. Here is an example :
16159
16160       --       type A1 is tagged      record F1 : integer; end record;
16161       --       type A2 is new A1 with record F2 : integer; end record;
16162       --       type T is new A1 with private;
16163       --     private
16164       --       type T is new A2 with null record;
16165
16166       --  In this case, the full view of T inherits F1 and F2 but the private
16167       --  view inherits only F1
16168
16169       else
16170          declare
16171             Ancestor : Entity_Id := Scope (C);
16172
16173          begin
16174             loop
16175                if Ancestor = Original_Scope then
16176                   return True;
16177                elsif Ancestor = Etype (Ancestor) then
16178                   return False;
16179                end if;
16180
16181                Ancestor := Etype (Ancestor);
16182             end loop;
16183          end;
16184       end if;
16185    end Is_Visible_Component;
16186
16187    --------------------------
16188    -- Make_Class_Wide_Type --
16189    --------------------------
16190
16191    procedure Make_Class_Wide_Type (T : Entity_Id) is
16192       CW_Type : Entity_Id;
16193       CW_Name : Name_Id;
16194       Next_E  : Entity_Id;
16195
16196    begin
16197       if Present (Class_Wide_Type (T)) then
16198
16199          --  The class-wide type is a partially decorated entity created for a
16200          --  unanalyzed tagged type referenced through a limited with clause.
16201          --  When the tagged type is analyzed, its class-wide type needs to be
16202          --  redecorated. Note that we reuse the entity created by Decorate_
16203          --  Tagged_Type in order to preserve all links.
16204
16205          if Materialize_Entity (Class_Wide_Type (T)) then
16206             CW_Type := Class_Wide_Type (T);
16207             Set_Materialize_Entity (CW_Type, False);
16208
16209          --  The class wide type can have been defined by the partial view, in
16210          --  which case everything is already done.
16211
16212          else
16213             return;
16214          end if;
16215
16216       --  Default case, we need to create a new class-wide type
16217
16218       else
16219          CW_Type :=
16220            New_External_Entity (E_Void, Scope (T), Sloc (T), T, 'C', 0, 'T');
16221       end if;
16222
16223       --  Inherit root type characteristics
16224
16225       CW_Name := Chars (CW_Type);
16226       Next_E  := Next_Entity (CW_Type);
16227       Copy_Node (T, CW_Type);
16228       Set_Comes_From_Source (CW_Type, False);
16229       Set_Chars (CW_Type, CW_Name);
16230       Set_Parent (CW_Type, Parent (T));
16231       Set_Next_Entity (CW_Type, Next_E);
16232
16233       --  Ensure we have a new freeze node for the class-wide type. The partial
16234       --  view may have freeze action of its own, requiring a proper freeze
16235       --  node, and the same freeze node cannot be shared between the two
16236       --  types.
16237
16238       Set_Has_Delayed_Freeze (CW_Type);
16239       Set_Freeze_Node (CW_Type, Empty);
16240
16241       --  Customize the class-wide type: It has no prim. op., it cannot be
16242       --  abstract and its Etype points back to the specific root type.
16243
16244       Set_Ekind                       (CW_Type, E_Class_Wide_Type);
16245       Set_Is_Tagged_Type              (CW_Type, True);
16246       Set_Direct_Primitive_Operations (CW_Type, New_Elmt_List);
16247       Set_Is_Abstract_Type            (CW_Type, False);
16248       Set_Is_Constrained              (CW_Type, False);
16249       Set_Is_First_Subtype            (CW_Type, Is_First_Subtype (T));
16250
16251       if Ekind (T) = E_Class_Wide_Subtype then
16252          Set_Etype             (CW_Type, Etype (Base_Type (T)));
16253       else
16254          Set_Etype             (CW_Type, T);
16255       end if;
16256
16257       --  If this is the class_wide type of a constrained subtype, it does
16258       --  not have discriminants.
16259
16260       Set_Has_Discriminants (CW_Type,
16261         Has_Discriminants (T) and then not Is_Constrained (T));
16262
16263       Set_Has_Unknown_Discriminants (CW_Type, True);
16264       Set_Class_Wide_Type (T, CW_Type);
16265       Set_Equivalent_Type (CW_Type, Empty);
16266
16267       --  The class-wide type of a class-wide type is itself (RM 3.9(14))
16268
16269       Set_Class_Wide_Type (CW_Type, CW_Type);
16270    end Make_Class_Wide_Type;
16271
16272    ----------------
16273    -- Make_Index --
16274    ----------------
16275
16276    procedure Make_Index
16277      (I            : Node_Id;
16278       Related_Nod  : Node_Id;
16279       Related_Id   : Entity_Id := Empty;
16280       Suffix_Index : Nat := 1;
16281       In_Iter_Schm : Boolean := False)
16282    is
16283       R      : Node_Id;
16284       T      : Entity_Id;
16285       Def_Id : Entity_Id := Empty;
16286       Found  : Boolean := False;
16287
16288    begin
16289       --  For a discrete range used in a constrained array definition and
16290       --  defined by a range, an implicit conversion to the predefined type
16291       --  INTEGER is assumed if each bound is either a numeric literal, a named
16292       --  number, or an attribute, and the type of both bounds (prior to the
16293       --  implicit conversion) is the type universal_integer. Otherwise, both
16294       --  bounds must be of the same discrete type, other than universal
16295       --  integer; this type must be determinable independently of the
16296       --  context, but using the fact that the type must be discrete and that
16297       --  both bounds must have the same type.
16298
16299       --  Character literals also have a universal type in the absence of
16300       --  of additional context,  and are resolved to Standard_Character.
16301
16302       if Nkind (I) = N_Range then
16303
16304          --  The index is given by a range constraint. The bounds are known
16305          --  to be of a consistent type.
16306
16307          if not Is_Overloaded (I) then
16308             T := Etype (I);
16309
16310             --  For universal bounds, choose the specific predefined type
16311
16312             if T = Universal_Integer then
16313                T := Standard_Integer;
16314
16315             elsif T = Any_Character then
16316                Ambiguous_Character (Low_Bound (I));
16317
16318                T := Standard_Character;
16319             end if;
16320
16321          --  The node may be overloaded because some user-defined operators
16322          --  are available, but if a universal interpretation exists it is
16323          --  also the selected one.
16324
16325          elsif Universal_Interpretation (I) = Universal_Integer then
16326             T := Standard_Integer;
16327
16328          else
16329             T := Any_Type;
16330
16331             declare
16332                Ind : Interp_Index;
16333                It  : Interp;
16334
16335             begin
16336                Get_First_Interp (I, Ind, It);
16337                while Present (It.Typ) loop
16338                   if Is_Discrete_Type (It.Typ) then
16339
16340                      if Found
16341                        and then not Covers (It.Typ, T)
16342                        and then not Covers (T, It.Typ)
16343                      then
16344                         Error_Msg_N ("ambiguous bounds in discrete range", I);
16345                         exit;
16346                      else
16347                         T := It.Typ;
16348                         Found := True;
16349                      end if;
16350                   end if;
16351
16352                   Get_Next_Interp (Ind, It);
16353                end loop;
16354
16355                if T = Any_Type then
16356                   Error_Msg_N ("discrete type required for range", I);
16357                   Set_Etype (I, Any_Type);
16358                   return;
16359
16360                elsif T = Universal_Integer then
16361                   T := Standard_Integer;
16362                end if;
16363             end;
16364          end if;
16365
16366          if not Is_Discrete_Type (T) then
16367             Error_Msg_N ("discrete type required for range", I);
16368             Set_Etype (I, Any_Type);
16369             return;
16370          end if;
16371
16372          if Nkind (Low_Bound (I)) = N_Attribute_Reference
16373            and then Attribute_Name (Low_Bound (I)) = Name_First
16374            and then Is_Entity_Name (Prefix (Low_Bound (I)))
16375            and then Is_Type (Entity (Prefix (Low_Bound (I))))
16376            and then Is_Discrete_Type (Entity (Prefix (Low_Bound (I))))
16377          then
16378             --  The type of the index will be the type of the prefix, as long
16379             --  as the upper bound is 'Last of the same type.
16380
16381             Def_Id := Entity (Prefix (Low_Bound (I)));
16382
16383             if Nkind (High_Bound (I)) /= N_Attribute_Reference
16384               or else Attribute_Name (High_Bound (I)) /= Name_Last
16385               or else not Is_Entity_Name (Prefix (High_Bound (I)))
16386               or else Entity (Prefix (High_Bound (I))) /= Def_Id
16387             then
16388                Def_Id := Empty;
16389             end if;
16390          end if;
16391
16392          R := I;
16393          Process_Range_Expr_In_Decl (R, T, In_Iter_Schm => In_Iter_Schm);
16394
16395       elsif Nkind (I) = N_Subtype_Indication then
16396
16397          --  The index is given by a subtype with a range constraint
16398
16399          T :=  Base_Type (Entity (Subtype_Mark (I)));
16400
16401          if not Is_Discrete_Type (T) then
16402             Error_Msg_N ("discrete type required for range", I);
16403             Set_Etype (I, Any_Type);
16404             return;
16405          end if;
16406
16407          R := Range_Expression (Constraint (I));
16408
16409          Resolve (R, T);
16410          Process_Range_Expr_In_Decl
16411            (R, Entity (Subtype_Mark (I)), In_Iter_Schm => In_Iter_Schm);
16412
16413       elsif Nkind (I) = N_Attribute_Reference then
16414
16415          --  The parser guarantees that the attribute is a RANGE attribute
16416
16417          --  If the node denotes the range of a type mark, that is also the
16418          --  resulting type, and we do no need to create an Itype for it.
16419
16420          if Is_Entity_Name (Prefix (I))
16421            and then Comes_From_Source (I)
16422            and then Is_Type (Entity (Prefix (I)))
16423            and then Is_Discrete_Type (Entity (Prefix (I)))
16424          then
16425             Def_Id := Entity (Prefix (I));
16426          end if;
16427
16428          Analyze_And_Resolve (I);
16429          T := Etype (I);
16430          R := I;
16431
16432       --  If none of the above, must be a subtype. We convert this to a
16433       --  range attribute reference because in the case of declared first
16434       --  named subtypes, the types in the range reference can be different
16435       --  from the type of the entity. A range attribute normalizes the
16436       --  reference and obtains the correct types for the bounds.
16437
16438       --  This transformation is in the nature of an expansion, is only
16439       --  done if expansion is active. In particular, it is not done on
16440       --  formal generic types,  because we need to retain the name of the
16441       --  original index for instantiation purposes.
16442
16443       else
16444          if not Is_Entity_Name (I) or else not Is_Type (Entity (I)) then
16445             Error_Msg_N ("invalid subtype mark in discrete range ", I);
16446             Set_Etype (I, Any_Integer);
16447             return;
16448
16449          else
16450             --  The type mark may be that of an incomplete type. It is only
16451             --  now that we can get the full view, previous analysis does
16452             --  not look specifically for a type mark.
16453
16454             Set_Entity (I, Get_Full_View (Entity (I)));
16455             Set_Etype  (I, Entity (I));
16456             Def_Id := Entity (I);
16457
16458             if not Is_Discrete_Type (Def_Id) then
16459                Error_Msg_N ("discrete type required for index", I);
16460                Set_Etype (I, Any_Type);
16461                return;
16462             end if;
16463          end if;
16464
16465          if Expander_Active then
16466             Rewrite (I,
16467               Make_Attribute_Reference (Sloc (I),
16468                 Attribute_Name => Name_Range,
16469                 Prefix         => Relocate_Node (I)));
16470
16471             --  The original was a subtype mark that does not freeze. This
16472             --  means that the rewritten version must not freeze either.
16473
16474             Set_Must_Not_Freeze (I);
16475             Set_Must_Not_Freeze (Prefix (I));
16476
16477             --  Is order critical??? if so, document why, if not
16478             --  use Analyze_And_Resolve
16479
16480             Analyze_And_Resolve (I);
16481             T := Etype (I);
16482             R := I;
16483
16484          --  If expander is inactive, type is legal, nothing else to construct
16485
16486          else
16487             return;
16488          end if;
16489       end if;
16490
16491       if not Is_Discrete_Type (T) then
16492          Error_Msg_N ("discrete type required for range", I);
16493          Set_Etype (I, Any_Type);
16494          return;
16495
16496       elsif T = Any_Type then
16497          Set_Etype (I, Any_Type);
16498          return;
16499       end if;
16500
16501       --  We will now create the appropriate Itype to describe the range, but
16502       --  first a check. If we originally had a subtype, then we just label
16503       --  the range with this subtype. Not only is there no need to construct
16504       --  a new subtype, but it is wrong to do so for two reasons:
16505
16506       --    1. A legality concern, if we have a subtype, it must not freeze,
16507       --       and the Itype would cause freezing incorrectly
16508
16509       --    2. An efficiency concern, if we created an Itype, it would not be
16510       --       recognized as the same type for the purposes of eliminating
16511       --       checks in some circumstances.
16512
16513       --  We signal this case by setting the subtype entity in Def_Id
16514
16515       if No (Def_Id) then
16516          Def_Id :=
16517            Create_Itype (E_Void, Related_Nod, Related_Id, 'D', Suffix_Index);
16518          Set_Etype (Def_Id, Base_Type (T));
16519
16520          if Is_Signed_Integer_Type (T) then
16521             Set_Ekind (Def_Id, E_Signed_Integer_Subtype);
16522
16523          elsif Is_Modular_Integer_Type (T) then
16524             Set_Ekind (Def_Id, E_Modular_Integer_Subtype);
16525
16526          else
16527             Set_Ekind             (Def_Id, E_Enumeration_Subtype);
16528             Set_Is_Character_Type (Def_Id, Is_Character_Type (T));
16529             Set_First_Literal     (Def_Id, First_Literal (T));
16530          end if;
16531
16532          Set_Size_Info      (Def_Id,                  (T));
16533          Set_RM_Size        (Def_Id, RM_Size          (T));
16534          Set_First_Rep_Item (Def_Id, First_Rep_Item   (T));
16535
16536          Set_Scalar_Range   (Def_Id, R);
16537          Conditional_Delay  (Def_Id, T);
16538
16539          --  In the subtype indication case, if the immediate parent of the
16540          --  new subtype is non-static, then the subtype we create is non-
16541          --  static, even if its bounds are static.
16542
16543          if Nkind (I) = N_Subtype_Indication
16544            and then not Is_Static_Subtype (Entity (Subtype_Mark (I)))
16545          then
16546             Set_Is_Non_Static_Subtype (Def_Id);
16547          end if;
16548       end if;
16549
16550       --  Final step is to label the index with this constructed type
16551
16552       Set_Etype (I, Def_Id);
16553    end Make_Index;
16554
16555    ------------------------------
16556    -- Modular_Type_Declaration --
16557    ------------------------------
16558
16559    procedure Modular_Type_Declaration (T : Entity_Id; Def : Node_Id) is
16560       Mod_Expr : constant Node_Id := Expression (Def);
16561       M_Val    : Uint;
16562
16563       procedure Set_Modular_Size (Bits : Int);
16564       --  Sets RM_Size to Bits, and Esize to normal word size above this
16565
16566       ----------------------
16567       -- Set_Modular_Size --
16568       ----------------------
16569
16570       procedure Set_Modular_Size (Bits : Int) is
16571       begin
16572          Set_RM_Size (T, UI_From_Int (Bits));
16573
16574          if Bits <= 8 then
16575             Init_Esize (T, 8);
16576
16577          elsif Bits <= 16 then
16578             Init_Esize (T, 16);
16579
16580          elsif Bits <= 32 then
16581             Init_Esize (T, 32);
16582
16583          else
16584             Init_Esize (T, System_Max_Binary_Modulus_Power);
16585          end if;
16586
16587          if not Non_Binary_Modulus (T)
16588            and then Esize (T) = RM_Size (T)
16589          then
16590             Set_Is_Known_Valid (T);
16591          end if;
16592       end Set_Modular_Size;
16593
16594    --  Start of processing for Modular_Type_Declaration
16595
16596    begin
16597       Analyze_And_Resolve (Mod_Expr, Any_Integer);
16598       Set_Etype (T, T);
16599       Set_Ekind (T, E_Modular_Integer_Type);
16600       Init_Alignment (T);
16601       Set_Is_Constrained (T);
16602
16603       if not Is_OK_Static_Expression (Mod_Expr) then
16604          Flag_Non_Static_Expr
16605            ("non-static expression used for modular type bound!", Mod_Expr);
16606          M_Val := 2 ** System_Max_Binary_Modulus_Power;
16607       else
16608          M_Val := Expr_Value (Mod_Expr);
16609       end if;
16610
16611       if M_Val < 1 then
16612          Error_Msg_N ("modulus value must be positive", Mod_Expr);
16613          M_Val := 2 ** System_Max_Binary_Modulus_Power;
16614       end if;
16615
16616       Set_Modulus (T, M_Val);
16617
16618       --   Create bounds for the modular type based on the modulus given in
16619       --   the type declaration and then analyze and resolve those bounds.
16620
16621       Set_Scalar_Range (T,
16622         Make_Range (Sloc (Mod_Expr),
16623           Low_Bound  => Make_Integer_Literal (Sloc (Mod_Expr), 0),
16624           High_Bound => Make_Integer_Literal (Sloc (Mod_Expr), M_Val - 1)));
16625
16626       --  Properly analyze the literals for the range. We do this manually
16627       --  because we can't go calling Resolve, since we are resolving these
16628       --  bounds with the type, and this type is certainly not complete yet!
16629
16630       Set_Etype (Low_Bound  (Scalar_Range (T)), T);
16631       Set_Etype (High_Bound (Scalar_Range (T)), T);
16632       Set_Is_Static_Expression (Low_Bound  (Scalar_Range (T)));
16633       Set_Is_Static_Expression (High_Bound (Scalar_Range (T)));
16634
16635       --  Loop through powers of two to find number of bits required
16636
16637       for Bits in Int range 0 .. System_Max_Binary_Modulus_Power loop
16638
16639          --  Binary case
16640
16641          if M_Val = 2 ** Bits then
16642             Set_Modular_Size (Bits);
16643             return;
16644
16645          --  Non-binary case
16646
16647          elsif M_Val < 2 ** Bits then
16648             Check_SPARK_Restriction ("modulus should be a power of 2", T);
16649             Set_Non_Binary_Modulus (T);
16650
16651             if Bits > System_Max_Nonbinary_Modulus_Power then
16652                Error_Msg_Uint_1 :=
16653                  UI_From_Int (System_Max_Nonbinary_Modulus_Power);
16654                Error_Msg_F
16655                  ("nonbinary modulus exceeds limit (2 '*'*^ - 1)", Mod_Expr);
16656                Set_Modular_Size (System_Max_Binary_Modulus_Power);
16657                return;
16658
16659             else
16660                --  In the non-binary case, set size as per RM 13.3(55)
16661
16662                Set_Modular_Size (Bits);
16663                return;
16664             end if;
16665          end if;
16666
16667       end loop;
16668
16669       --  If we fall through, then the size exceed System.Max_Binary_Modulus
16670       --  so we just signal an error and set the maximum size.
16671
16672       Error_Msg_Uint_1 := UI_From_Int (System_Max_Binary_Modulus_Power);
16673       Error_Msg_F ("modulus exceeds limit (2 '*'*^)", Mod_Expr);
16674
16675       Set_Modular_Size (System_Max_Binary_Modulus_Power);
16676       Init_Alignment (T);
16677
16678    end Modular_Type_Declaration;
16679
16680    --------------------------
16681    -- New_Concatenation_Op --
16682    --------------------------
16683
16684    procedure New_Concatenation_Op (Typ : Entity_Id) is
16685       Loc : constant Source_Ptr := Sloc (Typ);
16686       Op  : Entity_Id;
16687
16688       function Make_Op_Formal (Typ, Op : Entity_Id) return Entity_Id;
16689       --  Create abbreviated declaration for the formal of a predefined
16690       --  Operator 'Op' of type 'Typ'
16691
16692       --------------------
16693       -- Make_Op_Formal --
16694       --------------------
16695
16696       function Make_Op_Formal (Typ, Op : Entity_Id) return Entity_Id is
16697          Formal : Entity_Id;
16698       begin
16699          Formal := New_Internal_Entity (E_In_Parameter, Op, Loc, 'P');
16700          Set_Etype (Formal, Typ);
16701          Set_Mechanism (Formal, Default_Mechanism);
16702          return Formal;
16703       end Make_Op_Formal;
16704
16705    --  Start of processing for New_Concatenation_Op
16706
16707    begin
16708       Op := Make_Defining_Operator_Symbol (Loc, Name_Op_Concat);
16709
16710       Set_Ekind                   (Op, E_Operator);
16711       Set_Scope                   (Op, Current_Scope);
16712       Set_Etype                   (Op, Typ);
16713       Set_Homonym                 (Op, Get_Name_Entity_Id (Name_Op_Concat));
16714       Set_Is_Immediately_Visible  (Op);
16715       Set_Is_Intrinsic_Subprogram (Op);
16716       Set_Has_Completion          (Op);
16717       Append_Entity               (Op, Current_Scope);
16718
16719       Set_Name_Entity_Id (Name_Op_Concat, Op);
16720
16721       Append_Entity (Make_Op_Formal (Typ, Op), Op);
16722       Append_Entity (Make_Op_Formal (Typ, Op), Op);
16723    end New_Concatenation_Op;
16724
16725    -------------------------
16726    -- OK_For_Limited_Init --
16727    -------------------------
16728
16729    --  ???Check all calls of this, and compare the conditions under which it's
16730    --  called.
16731
16732    function OK_For_Limited_Init
16733      (Typ : Entity_Id;
16734       Exp : Node_Id) return Boolean
16735    is
16736    begin
16737       return Is_CPP_Constructor_Call (Exp)
16738         or else (Ada_Version >= Ada_2005
16739                   and then not Debug_Flag_Dot_L
16740                   and then OK_For_Limited_Init_In_05 (Typ, Exp));
16741    end OK_For_Limited_Init;
16742
16743    -------------------------------
16744    -- OK_For_Limited_Init_In_05 --
16745    -------------------------------
16746
16747    function OK_For_Limited_Init_In_05
16748      (Typ : Entity_Id;
16749       Exp : Node_Id) return Boolean
16750    is
16751    begin
16752       --  An object of a limited interface type can be initialized with any
16753       --  expression of a nonlimited descendant type.
16754
16755       if Is_Class_Wide_Type (Typ)
16756         and then Is_Limited_Interface (Typ)
16757         and then not Is_Limited_Type (Etype (Exp))
16758       then
16759          return True;
16760       end if;
16761
16762       --  Ada 2005 (AI-287, AI-318): Relax the strictness of the front end in
16763       --  case of limited aggregates (including extension aggregates), and
16764       --  function calls. The function call may have been given in prefixed
16765       --  notation, in which case the original node is an indexed component.
16766       --  If the function is parameterless, the original node was an explicit
16767       --  dereference.
16768
16769       case Nkind (Original_Node (Exp)) is
16770          when N_Aggregate | N_Extension_Aggregate | N_Function_Call | N_Op =>
16771             return True;
16772
16773          when N_Qualified_Expression =>
16774             return
16775               OK_For_Limited_Init_In_05
16776                 (Typ, Expression (Original_Node (Exp)));
16777
16778          --  Ada 2005 (AI-251): If a class-wide interface object is initialized
16779          --  with a function call, the expander has rewritten the call into an
16780          --  N_Type_Conversion node to force displacement of the pointer to
16781          --  reference the component containing the secondary dispatch table.
16782          --  Otherwise a type conversion is not a legal context.
16783          --  A return statement for a build-in-place function returning a
16784          --  synchronized type also introduces an unchecked conversion.
16785
16786          when N_Type_Conversion           |
16787               N_Unchecked_Type_Conversion =>
16788             return not Comes_From_Source (Exp)
16789               and then
16790                 OK_For_Limited_Init_In_05
16791                   (Typ, Expression (Original_Node (Exp)));
16792
16793          when N_Indexed_Component     |
16794               N_Selected_Component    |
16795               N_Explicit_Dereference  =>
16796             return Nkind (Exp) = N_Function_Call;
16797
16798          --  A use of 'Input is a function call, hence allowed. Normally the
16799          --  attribute will be changed to a call, but the attribute by itself
16800          --  can occur with -gnatc.
16801
16802          when N_Attribute_Reference =>
16803             return Attribute_Name (Original_Node (Exp)) = Name_Input;
16804
16805          when others =>
16806             return False;
16807       end case;
16808    end OK_For_Limited_Init_In_05;
16809
16810    -------------------------------------------
16811    -- Ordinary_Fixed_Point_Type_Declaration --
16812    -------------------------------------------
16813
16814    procedure Ordinary_Fixed_Point_Type_Declaration
16815      (T   : Entity_Id;
16816       Def : Node_Id)
16817    is
16818       Loc           : constant Source_Ptr := Sloc (Def);
16819       Delta_Expr    : constant Node_Id    := Delta_Expression (Def);
16820       RRS           : constant Node_Id    := Real_Range_Specification (Def);
16821       Implicit_Base : Entity_Id;
16822       Delta_Val     : Ureal;
16823       Small_Val     : Ureal;
16824       Low_Val       : Ureal;
16825       High_Val      : Ureal;
16826
16827    begin
16828       Check_Restriction (No_Fixed_Point, Def);
16829
16830       --  Create implicit base type
16831
16832       Implicit_Base :=
16833         Create_Itype (E_Ordinary_Fixed_Point_Type, Parent (Def), T, 'B');
16834       Set_Etype (Implicit_Base, Implicit_Base);
16835
16836       --  Analyze and process delta expression
16837
16838       Analyze_And_Resolve (Delta_Expr, Any_Real);
16839
16840       Check_Delta_Expression (Delta_Expr);
16841       Delta_Val := Expr_Value_R (Delta_Expr);
16842
16843       Set_Delta_Value (Implicit_Base, Delta_Val);
16844
16845       --  Compute default small from given delta, which is the largest power
16846       --  of two that does not exceed the given delta value.
16847
16848       declare
16849          Tmp   : Ureal;
16850          Scale : Int;
16851
16852       begin
16853          Tmp := Ureal_1;
16854          Scale := 0;
16855
16856          if Delta_Val < Ureal_1 then
16857             while Delta_Val < Tmp loop
16858                Tmp := Tmp / Ureal_2;
16859                Scale := Scale + 1;
16860             end loop;
16861
16862          else
16863             loop
16864                Tmp := Tmp * Ureal_2;
16865                exit when Tmp > Delta_Val;
16866                Scale := Scale - 1;
16867             end loop;
16868          end if;
16869
16870          Small_Val := UR_From_Components (Uint_1, UI_From_Int (Scale), 2);
16871       end;
16872
16873       Set_Small_Value (Implicit_Base, Small_Val);
16874
16875       --  If no range was given, set a dummy range
16876
16877       if RRS <= Empty_Or_Error then
16878          Low_Val  := -Small_Val;
16879          High_Val := Small_Val;
16880
16881       --  Otherwise analyze and process given range
16882
16883       else
16884          declare
16885             Low  : constant Node_Id := Low_Bound  (RRS);
16886             High : constant Node_Id := High_Bound (RRS);
16887
16888          begin
16889             Analyze_And_Resolve (Low, Any_Real);
16890             Analyze_And_Resolve (High, Any_Real);
16891             Check_Real_Bound (Low);
16892             Check_Real_Bound (High);
16893
16894             --  Obtain and set the range
16895
16896             Low_Val  := Expr_Value_R (Low);
16897             High_Val := Expr_Value_R (High);
16898
16899             if Low_Val > High_Val then
16900                Error_Msg_NE ("?fixed point type& has null range", Def, T);
16901             end if;
16902          end;
16903       end if;
16904
16905       --  The range for both the implicit base and the declared first subtype
16906       --  cannot be set yet, so we use the special routine Set_Fixed_Range to
16907       --  set a temporary range in place. Note that the bounds of the base
16908       --  type will be widened to be symmetrical and to fill the available
16909       --  bits when the type is frozen.
16910
16911       --  We could do this with all discrete types, and probably should, but
16912       --  we absolutely have to do it for fixed-point, since the end-points
16913       --  of the range and the size are determined by the small value, which
16914       --  could be reset before the freeze point.
16915
16916       Set_Fixed_Range (Implicit_Base, Loc, Low_Val, High_Val);
16917       Set_Fixed_Range (T, Loc, Low_Val, High_Val);
16918
16919       --  Complete definition of first subtype
16920
16921       Set_Ekind          (T, E_Ordinary_Fixed_Point_Subtype);
16922       Set_Etype          (T, Implicit_Base);
16923       Init_Size_Align    (T);
16924       Set_First_Rep_Item (T, First_Rep_Item (Implicit_Base));
16925       Set_Small_Value    (T, Small_Val);
16926       Set_Delta_Value    (T, Delta_Val);
16927       Set_Is_Constrained (T);
16928
16929    end Ordinary_Fixed_Point_Type_Declaration;
16930
16931    ----------------------------------------
16932    -- Prepare_Private_Subtype_Completion --
16933    ----------------------------------------
16934
16935    procedure Prepare_Private_Subtype_Completion
16936      (Id          : Entity_Id;
16937       Related_Nod : Node_Id)
16938    is
16939       Id_B   : constant Entity_Id := Base_Type (Id);
16940       Full_B : constant Entity_Id := Full_View (Id_B);
16941       Full   : Entity_Id;
16942
16943    begin
16944       if Present (Full_B) then
16945
16946          --  The Base_Type is already completed, we can complete the subtype
16947          --  now. We have to create a new entity with the same name, Thus we
16948          --  can't use Create_Itype.
16949
16950          --  This is messy, should be fixed ???
16951
16952          Full := Make_Defining_Identifier (Sloc (Id), Chars (Id));
16953          Set_Is_Itype (Full);
16954          Set_Associated_Node_For_Itype (Full, Related_Nod);
16955          Complete_Private_Subtype (Id, Full, Full_B, Related_Nod);
16956       end if;
16957
16958       --  The parent subtype may be private, but the base might not, in some
16959       --  nested instances. In that case, the subtype does not need to be
16960       --  exchanged. It would still be nice to make private subtypes and their
16961       --  bases consistent at all times ???
16962
16963       if Is_Private_Type (Id_B) then
16964          Append_Elmt (Id, Private_Dependents (Id_B));
16965       end if;
16966
16967    end Prepare_Private_Subtype_Completion;
16968
16969    ---------------------------
16970    -- Process_Discriminants --
16971    ---------------------------
16972
16973    procedure Process_Discriminants
16974      (N    : Node_Id;
16975       Prev : Entity_Id := Empty)
16976    is
16977       Elist               : constant Elist_Id := New_Elmt_List;
16978       Id                  : Node_Id;
16979       Discr               : Node_Id;
16980       Discr_Number        : Uint;
16981       Discr_Type          : Entity_Id;
16982       Default_Present     : Boolean := False;
16983       Default_Not_Present : Boolean := False;
16984
16985    begin
16986       --  A composite type other than an array type can have discriminants.
16987       --  On entry, the current scope is the composite type.
16988
16989       --  The discriminants are initially entered into the scope of the type
16990       --  via Enter_Name with the default Ekind of E_Void to prevent premature
16991       --  use, as explained at the end of this procedure.
16992
16993       Discr := First (Discriminant_Specifications (N));
16994       while Present (Discr) loop
16995          Enter_Name (Defining_Identifier (Discr));
16996
16997          --  For navigation purposes we add a reference to the discriminant
16998          --  in the entity for the type. If the current declaration is a
16999          --  completion, place references on the partial view. Otherwise the
17000          --  type is the current scope.
17001
17002          if Present (Prev) then
17003
17004             --  The references go on the partial view, if present. If the
17005             --  partial view has discriminants, the references have been
17006             --  generated already.
17007
17008             if not Has_Discriminants (Prev) then
17009                Generate_Reference (Prev, Defining_Identifier (Discr), 'd');
17010             end if;
17011          else
17012             Generate_Reference
17013               (Current_Scope, Defining_Identifier (Discr), 'd');
17014          end if;
17015
17016          if Nkind (Discriminant_Type (Discr)) = N_Access_Definition then
17017             Discr_Type := Access_Definition (Discr, Discriminant_Type (Discr));
17018
17019             --  Ada 2005 (AI-254)
17020
17021             if Present (Access_To_Subprogram_Definition
17022                          (Discriminant_Type (Discr)))
17023               and then Protected_Present (Access_To_Subprogram_Definition
17024                                            (Discriminant_Type (Discr)))
17025             then
17026                Discr_Type :=
17027                  Replace_Anonymous_Access_To_Protected_Subprogram (Discr);
17028             end if;
17029
17030          else
17031             Find_Type (Discriminant_Type (Discr));
17032             Discr_Type := Etype (Discriminant_Type (Discr));
17033
17034             if Error_Posted (Discriminant_Type (Discr)) then
17035                Discr_Type := Any_Type;
17036             end if;
17037          end if;
17038
17039          if Is_Access_Type (Discr_Type) then
17040
17041             --  Ada 2005 (AI-230): Access discriminant allowed in non-limited
17042             --  record types
17043
17044             if Ada_Version < Ada_2005 then
17045                Check_Access_Discriminant_Requires_Limited
17046                  (Discr, Discriminant_Type (Discr));
17047             end if;
17048
17049             if Ada_Version = Ada_83 and then Comes_From_Source (Discr) then
17050                Error_Msg_N
17051                  ("(Ada 83) access discriminant not allowed", Discr);
17052             end if;
17053
17054          elsif not Is_Discrete_Type (Discr_Type) then
17055             Error_Msg_N ("discriminants must have a discrete or access type",
17056               Discriminant_Type (Discr));
17057          end if;
17058
17059          Set_Etype (Defining_Identifier (Discr), Discr_Type);
17060
17061          --  If a discriminant specification includes the assignment compound
17062          --  delimiter followed by an expression, the expression is the default
17063          --  expression of the discriminant; the default expression must be of
17064          --  the type of the discriminant. (RM 3.7.1) Since this expression is
17065          --  a default expression, we do the special preanalysis, since this
17066          --  expression does not freeze (see "Handling of Default and Per-
17067          --  Object Expressions" in spec of package Sem).
17068
17069          if Present (Expression (Discr)) then
17070             Preanalyze_Spec_Expression (Expression (Discr), Discr_Type);
17071
17072             if Nkind (N) = N_Formal_Type_Declaration then
17073                Error_Msg_N
17074                  ("discriminant defaults not allowed for formal type",
17075                   Expression (Discr));
17076
17077             --  Flag an error for a tagged type with defaulted discriminants,
17078             --  excluding limited tagged types when compiling for Ada 2012
17079             --  (see AI05-0214).
17080
17081             elsif Is_Tagged_Type (Current_Scope)
17082               and then (not Is_Limited_Type (Current_Scope)
17083                          or else Ada_Version < Ada_2012)
17084               and then Comes_From_Source (N)
17085             then
17086                --  Note: see similar test in Check_Or_Process_Discriminants, to
17087                --  handle the (illegal) case of the completion of an untagged
17088                --  view with discriminants with defaults by a tagged full view.
17089                --  We skip the check if Discr does not come from source, to
17090                --  account for the case of an untagged derived type providing
17091                --  defaults for a renamed discriminant from a private untagged
17092                --  ancestor with a tagged full view (ACATS B460006).
17093
17094                if Ada_Version >= Ada_2012 then
17095                   Error_Msg_N
17096                     ("discriminants of nonlimited tagged type cannot have"
17097                        & " defaults",
17098                      Expression (Discr));
17099                else
17100                   Error_Msg_N
17101                     ("discriminants of tagged type cannot have defaults",
17102                      Expression (Discr));
17103                end if;
17104
17105             else
17106                Default_Present := True;
17107                Append_Elmt (Expression (Discr), Elist);
17108
17109                --  Tag the defining identifiers for the discriminants with
17110                --  their corresponding default expressions from the tree.
17111
17112                Set_Discriminant_Default_Value
17113                  (Defining_Identifier (Discr), Expression (Discr));
17114             end if;
17115
17116          else
17117             Default_Not_Present := True;
17118          end if;
17119
17120          --  Ada 2005 (AI-231): Create an Itype that is a duplicate of
17121          --  Discr_Type but with the null-exclusion attribute
17122
17123          if Ada_Version >= Ada_2005 then
17124
17125             --  Ada 2005 (AI-231): Static checks
17126
17127             if Can_Never_Be_Null (Discr_Type) then
17128                Null_Exclusion_Static_Checks (Discr);
17129
17130             elsif Is_Access_Type (Discr_Type)
17131               and then Null_Exclusion_Present (Discr)
17132
17133                --  No need to check itypes because in their case this check
17134                --  was done at their point of creation
17135
17136               and then not Is_Itype (Discr_Type)
17137             then
17138                if Can_Never_Be_Null (Discr_Type) then
17139                   Error_Msg_NE
17140                     ("`NOT NULL` not allowed (& already excludes null)",
17141                      Discr,
17142                      Discr_Type);
17143                end if;
17144
17145                Set_Etype (Defining_Identifier (Discr),
17146                  Create_Null_Excluding_Itype
17147                    (T           => Discr_Type,
17148                     Related_Nod => Discr));
17149
17150             --  Check for improper null exclusion if the type is otherwise
17151             --  legal for a discriminant.
17152
17153             elsif Null_Exclusion_Present (Discr)
17154               and then Is_Discrete_Type (Discr_Type)
17155             then
17156                Error_Msg_N
17157                  ("null exclusion can only apply to an access type", Discr);
17158             end if;
17159
17160             --  Ada 2005 (AI-402): access discriminants of nonlimited types
17161             --  can't have defaults. Synchronized types, or types that are
17162             --  explicitly limited are fine, but special tests apply to derived
17163             --  types in generics: in a generic body we have to assume the
17164             --  worst, and therefore defaults are not allowed if the parent is
17165             --  a generic formal private type (see ACATS B370001).
17166
17167             if Is_Access_Type (Discr_Type) then
17168                if Ekind (Discr_Type) /= E_Anonymous_Access_Type
17169                  or else not Default_Present
17170                  or else Is_Limited_Record (Current_Scope)
17171                  or else Is_Concurrent_Type (Current_Scope)
17172                  or else Is_Concurrent_Record_Type (Current_Scope)
17173                  or else Ekind (Current_Scope) = E_Limited_Private_Type
17174                then
17175                   if not Is_Derived_Type (Current_Scope)
17176                     or else not Is_Generic_Type (Etype (Current_Scope))
17177                     or else not In_Package_Body (Scope (Etype (Current_Scope)))
17178                     or else Limited_Present
17179                               (Type_Definition (Parent (Current_Scope)))
17180                   then
17181                      null;
17182
17183                   else
17184                      Error_Msg_N ("access discriminants of nonlimited types",
17185                          Expression (Discr));
17186                      Error_Msg_N ("\cannot have defaults", Expression (Discr));
17187                   end if;
17188
17189                elsif Present (Expression (Discr)) then
17190                   Error_Msg_N
17191                     ("(Ada 2005) access discriminants of nonlimited types",
17192                      Expression (Discr));
17193                   Error_Msg_N ("\cannot have defaults", Expression (Discr));
17194                end if;
17195             end if;
17196          end if;
17197
17198          Next (Discr);
17199       end loop;
17200
17201       --  An element list consisting of the default expressions of the
17202       --  discriminants is constructed in the above loop and used to set
17203       --  the Discriminant_Constraint attribute for the type. If an object
17204       --  is declared of this (record or task) type without any explicit
17205       --  discriminant constraint given, this element list will form the
17206       --  actual parameters for the corresponding initialization procedure
17207       --  for the type.
17208
17209       Set_Discriminant_Constraint (Current_Scope, Elist);
17210       Set_Stored_Constraint (Current_Scope, No_Elist);
17211
17212       --  Default expressions must be provided either for all or for none
17213       --  of the discriminants of a discriminant part. (RM 3.7.1)
17214
17215       if Default_Present and then Default_Not_Present then
17216          Error_Msg_N
17217            ("incomplete specification of defaults for discriminants", N);
17218       end if;
17219
17220       --  The use of the name of a discriminant is not allowed in default
17221       --  expressions of a discriminant part if the specification of the
17222       --  discriminant is itself given in the discriminant part. (RM 3.7.1)
17223
17224       --  To detect this, the discriminant names are entered initially with an
17225       --  Ekind of E_Void (which is the default Ekind given by Enter_Name). Any
17226       --  attempt to use a void entity (for example in an expression that is
17227       --  type-checked) produces the error message: premature usage. Now after
17228       --  completing the semantic analysis of the discriminant part, we can set
17229       --  the Ekind of all the discriminants appropriately.
17230
17231       Discr := First (Discriminant_Specifications (N));
17232       Discr_Number := Uint_1;
17233       while Present (Discr) loop
17234          Id := Defining_Identifier (Discr);
17235          Set_Ekind (Id, E_Discriminant);
17236          Init_Component_Location (Id);
17237          Init_Esize (Id);
17238          Set_Discriminant_Number (Id, Discr_Number);
17239
17240          --  Make sure this is always set, even in illegal programs
17241
17242          Set_Corresponding_Discriminant (Id, Empty);
17243
17244          --  Initialize the Original_Record_Component to the entity itself.
17245          --  Inherit_Components will propagate the right value to
17246          --  discriminants in derived record types.
17247
17248          Set_Original_Record_Component (Id, Id);
17249
17250          --  Create the discriminal for the discriminant
17251
17252          Build_Discriminal (Id);
17253
17254          Next (Discr);
17255          Discr_Number := Discr_Number + 1;
17256       end loop;
17257
17258       Set_Has_Discriminants (Current_Scope);
17259    end Process_Discriminants;
17260
17261    -----------------------
17262    -- Process_Full_View --
17263    -----------------------
17264
17265    procedure Process_Full_View (N : Node_Id; Full_T, Priv_T : Entity_Id) is
17266       Priv_Parent : Entity_Id;
17267       Full_Parent : Entity_Id;
17268       Full_Indic  : Node_Id;
17269
17270       procedure Collect_Implemented_Interfaces
17271         (Typ    : Entity_Id;
17272          Ifaces : Elist_Id);
17273       --  Ada 2005: Gather all the interfaces that Typ directly or
17274       --  inherently implements. Duplicate entries are not added to
17275       --  the list Ifaces.
17276
17277       ------------------------------------
17278       -- Collect_Implemented_Interfaces --
17279       ------------------------------------
17280
17281       procedure Collect_Implemented_Interfaces
17282         (Typ    : Entity_Id;
17283          Ifaces : Elist_Id)
17284       is
17285          Iface      : Entity_Id;
17286          Iface_Elmt : Elmt_Id;
17287
17288       begin
17289          --  Abstract interfaces are only associated with tagged record types
17290
17291          if not Is_Tagged_Type (Typ)
17292            or else not Is_Record_Type (Typ)
17293          then
17294             return;
17295          end if;
17296
17297          --  Recursively climb to the ancestors
17298
17299          if Etype (Typ) /= Typ
17300
17301             --  Protect the frontend against wrong cyclic declarations like:
17302
17303             --     type B is new A with private;
17304             --     type C is new A with private;
17305             --  private
17306             --     type B is new C with null record;
17307             --     type C is new B with null record;
17308
17309            and then Etype (Typ) /= Priv_T
17310            and then Etype (Typ) /= Full_T
17311          then
17312             --  Keep separate the management of private type declarations
17313
17314             if Ekind (Typ) = E_Record_Type_With_Private then
17315
17316                --  Handle the following erroneous case:
17317                --      type Private_Type is tagged private;
17318                --   private
17319                --      type Private_Type is new Type_Implementing_Iface;
17320
17321                if Present (Full_View (Typ))
17322                  and then Etype (Typ) /= Full_View (Typ)
17323                then
17324                   if Is_Interface (Etype (Typ)) then
17325                      Append_Unique_Elmt (Etype (Typ), Ifaces);
17326                   end if;
17327
17328                   Collect_Implemented_Interfaces (Etype (Typ), Ifaces);
17329                end if;
17330
17331             --  Non-private types
17332
17333             else
17334                if Is_Interface (Etype (Typ)) then
17335                   Append_Unique_Elmt (Etype (Typ), Ifaces);
17336                end if;
17337
17338                Collect_Implemented_Interfaces (Etype (Typ), Ifaces);
17339             end if;
17340          end if;
17341
17342          --  Handle entities in the list of abstract interfaces
17343
17344          if Present (Interfaces (Typ)) then
17345             Iface_Elmt := First_Elmt (Interfaces (Typ));
17346             while Present (Iface_Elmt) loop
17347                Iface := Node (Iface_Elmt);
17348
17349                pragma Assert (Is_Interface (Iface));
17350
17351                if not Contain_Interface (Iface, Ifaces) then
17352                   Append_Elmt (Iface, Ifaces);
17353                   Collect_Implemented_Interfaces (Iface, Ifaces);
17354                end if;
17355
17356                Next_Elmt (Iface_Elmt);
17357             end loop;
17358          end if;
17359       end Collect_Implemented_Interfaces;
17360
17361    --  Start of processing for Process_Full_View
17362
17363    begin
17364       --  First some sanity checks that must be done after semantic
17365       --  decoration of the full view and thus cannot be placed with other
17366       --  similar checks in Find_Type_Name
17367
17368       if not Is_Limited_Type (Priv_T)
17369         and then (Is_Limited_Type (Full_T)
17370                    or else Is_Limited_Composite (Full_T))
17371       then
17372          Error_Msg_N
17373            ("completion of nonlimited type cannot be limited", Full_T);
17374          Explain_Limited_Type (Full_T, Full_T);
17375
17376       elsif Is_Abstract_Type (Full_T)
17377         and then not Is_Abstract_Type (Priv_T)
17378       then
17379          Error_Msg_N
17380            ("completion of nonabstract type cannot be abstract", Full_T);
17381
17382       elsif Is_Tagged_Type (Priv_T)
17383         and then Is_Limited_Type (Priv_T)
17384         and then not Is_Limited_Type (Full_T)
17385       then
17386          --  If pragma CPP_Class was applied to the private declaration
17387          --  propagate the limitedness to the full-view
17388
17389          if Is_CPP_Class (Priv_T) then
17390             Set_Is_Limited_Record (Full_T);
17391
17392          --  GNAT allow its own definition of Limited_Controlled to disobey
17393          --  this rule in order in ease the implementation. This test is safe
17394          --  because Root_Controlled is defined in a child of System that
17395          --  normal programs are not supposed to use.
17396
17397          elsif Is_RTE (Etype (Full_T), RE_Root_Controlled) then
17398             Set_Is_Limited_Composite (Full_T);
17399          else
17400             Error_Msg_N
17401               ("completion of limited tagged type must be limited", Full_T);
17402          end if;
17403
17404       elsif Is_Generic_Type (Priv_T) then
17405          Error_Msg_N ("generic type cannot have a completion", Full_T);
17406       end if;
17407
17408       --  Check that ancestor interfaces of private and full views are
17409       --  consistent. We omit this check for synchronized types because
17410       --  they are performed on the corresponding record type when frozen.
17411
17412       if Ada_Version >= Ada_2005
17413         and then Is_Tagged_Type (Priv_T)
17414         and then Is_Tagged_Type (Full_T)
17415         and then not Is_Concurrent_Type (Full_T)
17416       then
17417          declare
17418             Iface         : Entity_Id;
17419             Priv_T_Ifaces : constant Elist_Id := New_Elmt_List;
17420             Full_T_Ifaces : constant Elist_Id := New_Elmt_List;
17421
17422          begin
17423             Collect_Implemented_Interfaces (Priv_T, Priv_T_Ifaces);
17424             Collect_Implemented_Interfaces (Full_T, Full_T_Ifaces);
17425
17426             --  Ada 2005 (AI-251): The partial view shall be a descendant of
17427             --  an interface type if and only if the full type is descendant
17428             --  of the interface type (AARM 7.3 (7.3/2).
17429
17430             Iface := Find_Hidden_Interface (Priv_T_Ifaces, Full_T_Ifaces);
17431
17432             if Present (Iface) then
17433                Error_Msg_NE
17434                  ("interface & not implemented by full type " &
17435                   "(RM-2005 7.3 (7.3/2))", Priv_T, Iface);
17436             end if;
17437
17438             Iface := Find_Hidden_Interface (Full_T_Ifaces, Priv_T_Ifaces);
17439
17440             if Present (Iface) then
17441                Error_Msg_NE
17442                  ("interface & not implemented by partial view " &
17443                   "(RM-2005 7.3 (7.3/2))", Full_T, Iface);
17444             end if;
17445          end;
17446       end if;
17447
17448       if Is_Tagged_Type (Priv_T)
17449         and then Nkind (Parent (Priv_T)) = N_Private_Extension_Declaration
17450         and then Is_Derived_Type (Full_T)
17451       then
17452          Priv_Parent := Etype (Priv_T);
17453
17454          --  The full view of a private extension may have been transformed
17455          --  into an unconstrained derived type declaration and a subtype
17456          --  declaration (see build_derived_record_type for details).
17457
17458          if Nkind (N) = N_Subtype_Declaration then
17459             Full_Indic  := Subtype_Indication (N);
17460             Full_Parent := Etype (Base_Type (Full_T));
17461          else
17462             Full_Indic  := Subtype_Indication (Type_Definition (N));
17463             Full_Parent := Etype (Full_T);
17464          end if;
17465
17466          --  Check that the parent type of the full type is a descendant of
17467          --  the ancestor subtype given in the private extension. If either
17468          --  entity has an Etype equal to Any_Type then we had some previous
17469          --  error situation [7.3(8)].
17470
17471          if Priv_Parent = Any_Type or else Full_Parent = Any_Type then
17472             return;
17473
17474          --  Ada 2005 (AI-251): Interfaces in the full-typ can be given in
17475          --  any order. Therefore we don't have to check that its parent must
17476          --  be a descendant of the parent of the private type declaration.
17477
17478          elsif Is_Interface (Priv_Parent)
17479            and then Is_Interface (Full_Parent)
17480          then
17481             null;
17482
17483          --  Ada 2005 (AI-251): If the parent of the private type declaration
17484          --  is an interface there is no need to check that it is an ancestor
17485          --  of the associated full type declaration. The required tests for
17486          --  this case are performed by Build_Derived_Record_Type.
17487
17488          elsif not Is_Interface (Base_Type (Priv_Parent))
17489            and then not Is_Ancestor (Base_Type (Priv_Parent), Full_Parent)
17490          then
17491             Error_Msg_N
17492               ("parent of full type must descend from parent"
17493                   & " of private extension", Full_Indic);
17494
17495          --  First check a formal restriction, and then proceed with checking
17496          --  Ada rules. Since the formal restriction is not a serious error, we
17497          --  don't prevent further error detection for this check, hence the
17498          --  ELSE.
17499
17500          else
17501
17502             --  In formal mode, when completing a private extension the type
17503             --  named in the private part must be exactly the same as that
17504             --  named in the visible part.
17505
17506             if Priv_Parent /= Full_Parent then
17507                Error_Msg_Name_1 := Chars (Priv_Parent);
17508                Check_SPARK_Restriction ("% expected", Full_Indic);
17509             end if;
17510
17511             --  Check the rules of 7.3(10): if the private extension inherits
17512             --  known discriminants, then the full type must also inherit those
17513             --  discriminants from the same (ancestor) type, and the parent
17514             --  subtype of the full type must be constrained if and only if
17515             --  the ancestor subtype of the private extension is constrained.
17516
17517             if No (Discriminant_Specifications (Parent (Priv_T)))
17518               and then not Has_Unknown_Discriminants (Priv_T)
17519               and then Has_Discriminants (Base_Type (Priv_Parent))
17520             then
17521                declare
17522                   Priv_Indic  : constant Node_Id :=
17523                                   Subtype_Indication (Parent (Priv_T));
17524
17525                   Priv_Constr : constant Boolean :=
17526                                   Is_Constrained (Priv_Parent)
17527                                     or else
17528                                       Nkind (Priv_Indic) = N_Subtype_Indication
17529                                     or else
17530                                       Is_Constrained (Entity (Priv_Indic));
17531
17532                   Full_Constr : constant Boolean :=
17533                                   Is_Constrained (Full_Parent)
17534                                     or else
17535                                       Nkind (Full_Indic) = N_Subtype_Indication
17536                                     or else
17537                                       Is_Constrained (Entity (Full_Indic));
17538
17539                   Priv_Discr : Entity_Id;
17540                   Full_Discr : Entity_Id;
17541
17542                begin
17543                   Priv_Discr := First_Discriminant (Priv_Parent);
17544                   Full_Discr := First_Discriminant (Full_Parent);
17545                   while Present (Priv_Discr) and then Present (Full_Discr) loop
17546                      if Original_Record_Component (Priv_Discr) =
17547                         Original_Record_Component (Full_Discr)
17548                        or else
17549                          Corresponding_Discriminant (Priv_Discr) =
17550                          Corresponding_Discriminant (Full_Discr)
17551                      then
17552                         null;
17553                      else
17554                         exit;
17555                      end if;
17556
17557                      Next_Discriminant (Priv_Discr);
17558                      Next_Discriminant (Full_Discr);
17559                   end loop;
17560
17561                   if Present (Priv_Discr) or else Present (Full_Discr) then
17562                      Error_Msg_N
17563                        ("full view must inherit discriminants of the parent"
17564                         & " type used in the private extension", Full_Indic);
17565
17566                   elsif Priv_Constr and then not Full_Constr then
17567                      Error_Msg_N
17568                        ("parent subtype of full type must be constrained",
17569                         Full_Indic);
17570
17571                   elsif Full_Constr and then not Priv_Constr then
17572                      Error_Msg_N
17573                        ("parent subtype of full type must be unconstrained",
17574                         Full_Indic);
17575                   end if;
17576                end;
17577
17578                --  Check the rules of 7.3(12): if a partial view has neither
17579                --  known or unknown discriminants, then the full type
17580                --  declaration shall define a definite subtype.
17581
17582             elsif      not Has_Unknown_Discriminants (Priv_T)
17583               and then not Has_Discriminants (Priv_T)
17584               and then not Is_Constrained (Full_T)
17585             then
17586                Error_Msg_N
17587                  ("full view must define a constrained type if partial view"
17588                   & " has no discriminants", Full_T);
17589             end if;
17590
17591             --  ??????? Do we implement the following properly ?????
17592             --  If the ancestor subtype of a private extension has constrained
17593             --  discriminants, then the parent subtype of the full view shall
17594             --  impose a statically matching constraint on those discriminants
17595             --  [7.3(13)].
17596          end if;
17597
17598       else
17599          --  For untagged types, verify that a type without discriminants
17600          --  is not completed with an unconstrained type.
17601
17602          if not Is_Indefinite_Subtype (Priv_T)
17603            and then Is_Indefinite_Subtype (Full_T)
17604          then
17605             Error_Msg_N ("full view of type must be definite subtype", Full_T);
17606          end if;
17607       end if;
17608
17609       --  AI-419: verify that the use of "limited" is consistent
17610
17611       declare
17612          Orig_Decl : constant Node_Id := Original_Node (N);
17613
17614       begin
17615          if Nkind (Parent (Priv_T)) = N_Private_Extension_Declaration
17616            and then not Limited_Present (Parent (Priv_T))
17617            and then not Synchronized_Present (Parent (Priv_T))
17618            and then Nkind (Orig_Decl) = N_Full_Type_Declaration
17619            and then Nkind
17620              (Type_Definition (Orig_Decl)) = N_Derived_Type_Definition
17621            and then Limited_Present (Type_Definition (Orig_Decl))
17622          then
17623             Error_Msg_N
17624               ("full view of non-limited extension cannot be limited", N);
17625          end if;
17626       end;
17627
17628       --  Ada 2005 (AI-443): A synchronized private extension must be
17629       --  completed by a task or protected type.
17630
17631       if Ada_Version >= Ada_2005
17632         and then Nkind (Parent (Priv_T)) = N_Private_Extension_Declaration
17633         and then Synchronized_Present (Parent (Priv_T))
17634         and then not Is_Concurrent_Type (Full_T)
17635       then
17636          Error_Msg_N ("full view of synchronized extension must " &
17637                       "be synchronized type", N);
17638       end if;
17639
17640       --  Ada 2005 AI-363: if the full view has discriminants with
17641       --  defaults, it is illegal to declare constrained access subtypes
17642       --  whose designated type is the current type. This allows objects
17643       --  of the type that are declared in the heap to be unconstrained.
17644
17645       if not Has_Unknown_Discriminants (Priv_T)
17646         and then not Has_Discriminants (Priv_T)
17647         and then Has_Discriminants (Full_T)
17648         and then
17649           Present (Discriminant_Default_Value (First_Discriminant (Full_T)))
17650       then
17651          Set_Has_Constrained_Partial_View (Full_T);
17652          Set_Has_Constrained_Partial_View (Priv_T);
17653       end if;
17654
17655       --  Create a full declaration for all its subtypes recorded in
17656       --  Private_Dependents and swap them similarly to the base type. These
17657       --  are subtypes that have been define before the full declaration of
17658       --  the private type. We also swap the entry in Private_Dependents list
17659       --  so we can properly restore the private view on exit from the scope.
17660
17661       declare
17662          Priv_Elmt : Elmt_Id;
17663          Priv      : Entity_Id;
17664          Full      : Entity_Id;
17665
17666       begin
17667          Priv_Elmt := First_Elmt (Private_Dependents (Priv_T));
17668          while Present (Priv_Elmt) loop
17669             Priv := Node (Priv_Elmt);
17670
17671             if Ekind_In (Priv, E_Private_Subtype,
17672                                E_Limited_Private_Subtype,
17673                                E_Record_Subtype_With_Private)
17674             then
17675                Full := Make_Defining_Identifier (Sloc (Priv), Chars (Priv));
17676                Set_Is_Itype (Full);
17677                Set_Parent (Full, Parent (Priv));
17678                Set_Associated_Node_For_Itype (Full, N);
17679
17680                --  Now we need to complete the private subtype, but since the
17681                --  base type has already been swapped, we must also swap the
17682                --  subtypes (and thus, reverse the arguments in the call to
17683                --  Complete_Private_Subtype).
17684
17685                Copy_And_Swap (Priv, Full);
17686                Complete_Private_Subtype (Full, Priv, Full_T, N);
17687                Replace_Elmt (Priv_Elmt, Full);
17688             end if;
17689
17690             Next_Elmt (Priv_Elmt);
17691          end loop;
17692       end;
17693
17694       --  If the private view was tagged, copy the new primitive operations
17695       --  from the private view to the full view.
17696
17697       if Is_Tagged_Type (Full_T) then
17698          declare
17699             Disp_Typ  : Entity_Id;
17700             Full_List : Elist_Id;
17701             Prim      : Entity_Id;
17702             Prim_Elmt : Elmt_Id;
17703             Priv_List : Elist_Id;
17704
17705             function Contains
17706               (E : Entity_Id;
17707                L : Elist_Id) return Boolean;
17708             --  Determine whether list L contains element E
17709
17710             --------------
17711             -- Contains --
17712             --------------
17713
17714             function Contains
17715               (E : Entity_Id;
17716                L : Elist_Id) return Boolean
17717             is
17718                List_Elmt : Elmt_Id;
17719
17720             begin
17721                List_Elmt := First_Elmt (L);
17722                while Present (List_Elmt) loop
17723                   if Node (List_Elmt) = E then
17724                      return True;
17725                   end if;
17726
17727                   Next_Elmt (List_Elmt);
17728                end loop;
17729
17730                return False;
17731             end Contains;
17732
17733          --  Start of processing
17734
17735          begin
17736             if Is_Tagged_Type (Priv_T) then
17737                Priv_List := Primitive_Operations (Priv_T);
17738                Prim_Elmt := First_Elmt (Priv_List);
17739
17740                --  In the case of a concurrent type completing a private tagged
17741                --  type, primitives may have been declared in between the two
17742                --  views. These subprograms need to be wrapped the same way
17743                --  entries and protected procedures are handled because they
17744                --  cannot be directly shared by the two views.
17745
17746                if Is_Concurrent_Type (Full_T) then
17747                   declare
17748                      Conc_Typ  : constant Entity_Id :=
17749                                    Corresponding_Record_Type (Full_T);
17750                      Curr_Nod  : Node_Id := Parent (Conc_Typ);
17751                      Wrap_Spec : Node_Id;
17752
17753                   begin
17754                      while Present (Prim_Elmt) loop
17755                         Prim := Node (Prim_Elmt);
17756
17757                         if Comes_From_Source (Prim)
17758                           and then not Is_Abstract_Subprogram (Prim)
17759                         then
17760                            Wrap_Spec :=
17761                              Make_Subprogram_Declaration (Sloc (Prim),
17762                                Specification =>
17763                                  Build_Wrapper_Spec
17764                                    (Subp_Id => Prim,
17765                                     Obj_Typ => Conc_Typ,
17766                                     Formals =>
17767                                       Parameter_Specifications (
17768                                         Parent (Prim))));
17769
17770                            Insert_After (Curr_Nod, Wrap_Spec);
17771                            Curr_Nod := Wrap_Spec;
17772
17773                            Analyze (Wrap_Spec);
17774                         end if;
17775
17776                         Next_Elmt (Prim_Elmt);
17777                      end loop;
17778
17779                      return;
17780                   end;
17781
17782                --  For non-concurrent types, transfer explicit primitives, but
17783                --  omit those inherited from the parent of the private view
17784                --  since they will be re-inherited later on.
17785
17786                else
17787                   Full_List := Primitive_Operations (Full_T);
17788
17789                   while Present (Prim_Elmt) loop
17790                      Prim := Node (Prim_Elmt);
17791
17792                      if Comes_From_Source (Prim)
17793                        and then not Contains (Prim, Full_List)
17794                      then
17795                         Append_Elmt (Prim, Full_List);
17796                      end if;
17797
17798                      Next_Elmt (Prim_Elmt);
17799                   end loop;
17800                end if;
17801
17802             --  Untagged private view
17803
17804             else
17805                Full_List := Primitive_Operations (Full_T);
17806
17807                --  In this case the partial view is untagged, so here we locate
17808                --  all of the earlier primitives that need to be treated as
17809                --  dispatching (those that appear between the two views). Note
17810                --  that these additional operations must all be new operations
17811                --  (any earlier operations that override inherited operations
17812                --  of the full view will already have been inserted in the
17813                --  primitives list, marked by Check_Operation_From_Private_View
17814                --  as dispatching. Note that implicit "/=" operators are
17815                --  excluded from being added to the primitives list since they
17816                --  shouldn't be treated as dispatching (tagged "/=" is handled
17817                --  specially).
17818
17819                Prim := Next_Entity (Full_T);
17820                while Present (Prim) and then Prim /= Priv_T loop
17821                   if Ekind_In (Prim, E_Procedure, E_Function) then
17822                      Disp_Typ := Find_Dispatching_Type (Prim);
17823
17824                      if Disp_Typ = Full_T
17825                        and then (Chars (Prim) /= Name_Op_Ne
17826                                   or else Comes_From_Source (Prim))
17827                      then
17828                         Check_Controlling_Formals (Full_T, Prim);
17829
17830                         if not Is_Dispatching_Operation (Prim) then
17831                            Append_Elmt (Prim, Full_List);
17832                            Set_Is_Dispatching_Operation (Prim, True);
17833                            Set_DT_Position (Prim, No_Uint);
17834                         end if;
17835
17836                      elsif Is_Dispatching_Operation (Prim)
17837                        and then Disp_Typ  /= Full_T
17838                      then
17839
17840                         --  Verify that it is not otherwise controlled by a
17841                         --  formal or a return value of type T.
17842
17843                         Check_Controlling_Formals (Disp_Typ, Prim);
17844                      end if;
17845                   end if;
17846
17847                   Next_Entity (Prim);
17848                end loop;
17849             end if;
17850
17851             --  For the tagged case, the two views can share the same primitive
17852             --  operations list and the same class-wide type. Update attributes
17853             --  of the class-wide type which depend on the full declaration.
17854
17855             if Is_Tagged_Type (Priv_T) then
17856                Set_Direct_Primitive_Operations (Priv_T, Full_List);
17857                Set_Class_Wide_Type
17858                  (Base_Type (Full_T), Class_Wide_Type (Priv_T));
17859
17860                Set_Has_Task (Class_Wide_Type (Priv_T), Has_Task (Full_T));
17861             end if;
17862          end;
17863       end if;
17864
17865       --  Ada 2005 AI 161: Check preelaboratable initialization consistency
17866
17867       if Known_To_Have_Preelab_Init (Priv_T) then
17868
17869          --  Case where there is a pragma Preelaborable_Initialization. We
17870          --  always allow this in predefined units, which is a bit of a kludge,
17871          --  but it means we don't have to struggle to meet the requirements in
17872          --  the RM for having Preelaborable Initialization. Otherwise we
17873          --  require that the type meets the RM rules. But we can't check that
17874          --  yet, because of the rule about overriding Initialize, so we simply
17875          --  set a flag that will be checked at freeze time.
17876
17877          if not In_Predefined_Unit (Full_T) then
17878             Set_Must_Have_Preelab_Init (Full_T);
17879          end if;
17880       end if;
17881
17882       --  If pragma CPP_Class was applied to the private type declaration,
17883       --  propagate it now to the full type declaration.
17884
17885       if Is_CPP_Class (Priv_T) then
17886          Set_Is_CPP_Class (Full_T);
17887          Set_Convention   (Full_T, Convention_CPP);
17888       end if;
17889
17890       --  If the private view has user specified stream attributes, then so has
17891       --  the full view.
17892
17893       --  Why the test, how could these flags be already set in Full_T ???
17894
17895       if Has_Specified_Stream_Read (Priv_T) then
17896          Set_Has_Specified_Stream_Read (Full_T);
17897       end if;
17898
17899       if Has_Specified_Stream_Write (Priv_T) then
17900          Set_Has_Specified_Stream_Write (Full_T);
17901       end if;
17902
17903       if Has_Specified_Stream_Input (Priv_T) then
17904          Set_Has_Specified_Stream_Input (Full_T);
17905       end if;
17906
17907       if Has_Specified_Stream_Output (Priv_T) then
17908          Set_Has_Specified_Stream_Output (Full_T);
17909       end if;
17910
17911       --  Propagate invariants to full type
17912
17913       if Has_Invariants (Priv_T) then
17914          Set_Has_Invariants (Full_T);
17915          Set_Invariant_Procedure (Full_T, Invariant_Procedure (Priv_T));
17916       end if;
17917
17918       if Has_Inheritable_Invariants (Priv_T) then
17919          Set_Has_Inheritable_Invariants (Full_T);
17920       end if;
17921
17922       --  Propagate predicates to full type
17923
17924       if Has_Predicates (Priv_T) then
17925          Set_Predicate_Function (Priv_T, Predicate_Function (Full_T));
17926          Set_Has_Predicates (Priv_T);
17927       end if;
17928    end Process_Full_View;
17929
17930    -----------------------------------
17931    -- Process_Incomplete_Dependents --
17932    -----------------------------------
17933
17934    procedure Process_Incomplete_Dependents
17935      (N      : Node_Id;
17936       Full_T : Entity_Id;
17937       Inc_T  : Entity_Id)
17938    is
17939       Inc_Elmt : Elmt_Id;
17940       Priv_Dep : Entity_Id;
17941       New_Subt : Entity_Id;
17942
17943       Disc_Constraint : Elist_Id;
17944
17945    begin
17946       if No (Private_Dependents (Inc_T)) then
17947          return;
17948       end if;
17949
17950       --  Itypes that may be generated by the completion of an incomplete
17951       --  subtype are not used by the back-end and not attached to the tree.
17952       --  They are created only for constraint-checking purposes.
17953
17954       Inc_Elmt := First_Elmt (Private_Dependents (Inc_T));
17955       while Present (Inc_Elmt) loop
17956          Priv_Dep := Node (Inc_Elmt);
17957
17958          if Ekind (Priv_Dep) = E_Subprogram_Type then
17959
17960             --  An Access_To_Subprogram type may have a return type or a
17961             --  parameter type that is incomplete. Replace with the full view.
17962
17963             if Etype (Priv_Dep) = Inc_T then
17964                Set_Etype (Priv_Dep, Full_T);
17965             end if;
17966
17967             declare
17968                Formal : Entity_Id;
17969
17970             begin
17971                Formal := First_Formal (Priv_Dep);
17972                while Present (Formal) loop
17973                   if Etype (Formal) = Inc_T then
17974                      Set_Etype (Formal, Full_T);
17975                   end if;
17976
17977                   Next_Formal (Formal);
17978                end loop;
17979             end;
17980
17981          elsif Is_Overloadable (Priv_Dep) then
17982
17983             --  If a subprogram in the incomplete dependents list is primitive
17984             --  for a tagged full type then mark it as a dispatching operation,
17985             --  check whether it overrides an inherited subprogram, and check
17986             --  restrictions on its controlling formals. Note that a protected
17987             --  operation is never dispatching: only its wrapper operation
17988             --  (which has convention Ada) is.
17989
17990             if Is_Tagged_Type (Full_T)
17991               and then Is_Primitive (Priv_Dep)
17992               and then Convention (Priv_Dep) /= Convention_Protected
17993             then
17994                Check_Operation_From_Incomplete_Type (Priv_Dep, Inc_T);
17995                Set_Is_Dispatching_Operation (Priv_Dep);
17996                Check_Controlling_Formals (Full_T, Priv_Dep);
17997             end if;
17998
17999          elsif Ekind (Priv_Dep) = E_Subprogram_Body then
18000
18001             --  Can happen during processing of a body before the completion
18002             --  of a TA type. Ignore, because spec is also on dependent list.
18003
18004             return;
18005
18006          --  Ada 2005 (AI-412): Transform a regular incomplete subtype into a
18007          --  corresponding subtype of the full view.
18008
18009          elsif Ekind (Priv_Dep) = E_Incomplete_Subtype then
18010             Set_Subtype_Indication
18011               (Parent (Priv_Dep), New_Reference_To (Full_T, Sloc (Priv_Dep)));
18012             Set_Etype (Priv_Dep, Full_T);
18013             Set_Ekind (Priv_Dep, Subtype_Kind (Ekind (Full_T)));
18014             Set_Analyzed (Parent (Priv_Dep), False);
18015
18016             --  Reanalyze the declaration, suppressing the call to
18017             --  Enter_Name to avoid duplicate names.
18018
18019             Analyze_Subtype_Declaration
18020               (N    => Parent (Priv_Dep),
18021                Skip => True);
18022
18023          --  Dependent is a subtype
18024
18025          else
18026             --  We build a new subtype indication using the full view of the
18027             --  incomplete parent. The discriminant constraints have been
18028             --  elaborated already at the point of the subtype declaration.
18029
18030             New_Subt := Create_Itype (E_Void, N);
18031
18032             if Has_Discriminants (Full_T) then
18033                Disc_Constraint := Discriminant_Constraint (Priv_Dep);
18034             else
18035                Disc_Constraint := No_Elist;
18036             end if;
18037
18038             Build_Discriminated_Subtype (Full_T, New_Subt, Disc_Constraint, N);
18039             Set_Full_View (Priv_Dep, New_Subt);
18040          end if;
18041
18042          Next_Elmt (Inc_Elmt);
18043       end loop;
18044    end Process_Incomplete_Dependents;
18045
18046    --------------------------------
18047    -- Process_Range_Expr_In_Decl --
18048    --------------------------------
18049
18050    procedure Process_Range_Expr_In_Decl
18051      (R            : Node_Id;
18052       T            : Entity_Id;
18053       Check_List   : List_Id := Empty_List;
18054       R_Check_Off  : Boolean := False;
18055       In_Iter_Schm : Boolean := False)
18056    is
18057       Lo, Hi      : Node_Id;
18058       R_Checks    : Check_Result;
18059       Insert_Node : Node_Id;
18060       Def_Id      : Entity_Id;
18061
18062    begin
18063       Analyze_And_Resolve (R, Base_Type (T));
18064
18065       if Nkind (R) = N_Range then
18066
18067          --  In SPARK, all ranges should be static, with the exception of the
18068          --  discrete type definition of a loop parameter specification.
18069
18070          if not In_Iter_Schm
18071            and then not Is_Static_Range (R)
18072          then
18073             Check_SPARK_Restriction ("range should be static", R);
18074          end if;
18075
18076          Lo := Low_Bound (R);
18077          Hi := High_Bound (R);
18078
18079          --  We need to ensure validity of the bounds here, because if we
18080          --  go ahead and do the expansion, then the expanded code will get
18081          --  analyzed with range checks suppressed and we miss the check.
18082
18083          Validity_Check_Range (R);
18084
18085          --  If there were errors in the declaration, try and patch up some
18086          --  common mistakes in the bounds. The cases handled are literals
18087          --  which are Integer where the expected type is Real and vice versa.
18088          --  These corrections allow the compilation process to proceed further
18089          --  along since some basic assumptions of the format of the bounds
18090          --  are guaranteed.
18091
18092          if Etype (R) = Any_Type then
18093
18094             if Nkind (Lo) = N_Integer_Literal and then Is_Real_Type (T) then
18095                Rewrite (Lo,
18096                  Make_Real_Literal (Sloc (Lo), UR_From_Uint (Intval (Lo))));
18097
18098             elsif Nkind (Hi) = N_Integer_Literal and then Is_Real_Type (T) then
18099                Rewrite (Hi,
18100                  Make_Real_Literal (Sloc (Hi), UR_From_Uint (Intval (Hi))));
18101
18102             elsif Nkind (Lo) = N_Real_Literal and then Is_Integer_Type (T) then
18103                Rewrite (Lo,
18104                  Make_Integer_Literal (Sloc (Lo), UR_To_Uint (Realval (Lo))));
18105
18106             elsif Nkind (Hi) = N_Real_Literal and then Is_Integer_Type (T) then
18107                Rewrite (Hi,
18108                  Make_Integer_Literal (Sloc (Hi), UR_To_Uint (Realval (Hi))));
18109             end if;
18110
18111             Set_Etype (Lo, T);
18112             Set_Etype (Hi, T);
18113          end if;
18114
18115          --  If the bounds of the range have been mistakenly given as string
18116          --  literals (perhaps in place of character literals), then an error
18117          --  has already been reported, but we rewrite the string literal as a
18118          --  bound of the range's type to avoid blowups in later processing
18119          --  that looks at static values.
18120
18121          if Nkind (Lo) = N_String_Literal then
18122             Rewrite (Lo,
18123               Make_Attribute_Reference (Sloc (Lo),
18124                 Attribute_Name => Name_First,
18125                 Prefix => New_Reference_To (T, Sloc (Lo))));
18126             Analyze_And_Resolve (Lo);
18127          end if;
18128
18129          if Nkind (Hi) = N_String_Literal then
18130             Rewrite (Hi,
18131               Make_Attribute_Reference (Sloc (Hi),
18132                 Attribute_Name => Name_First,
18133                 Prefix => New_Reference_To (T, Sloc (Hi))));
18134             Analyze_And_Resolve (Hi);
18135          end if;
18136
18137          --  If bounds aren't scalar at this point then exit, avoiding
18138          --  problems with further processing of the range in this procedure.
18139
18140          if not Is_Scalar_Type (Etype (Lo)) then
18141             return;
18142          end if;
18143
18144          --  Resolve (actually Sem_Eval) has checked that the bounds are in
18145          --  then range of the base type. Here we check whether the bounds
18146          --  are in the range of the subtype itself. Note that if the bounds
18147          --  represent the null range the Constraint_Error exception should
18148          --  not be raised.
18149
18150          --  ??? The following code should be cleaned up as follows
18151
18152          --  1. The Is_Null_Range (Lo, Hi) test should disappear since it
18153          --     is done in the call to Range_Check (R, T); below
18154
18155          --  2. The use of R_Check_Off should be investigated and possibly
18156          --     removed, this would clean up things a bit.
18157
18158          if Is_Null_Range (Lo, Hi) then
18159             null;
18160
18161          else
18162             --  Capture values of bounds and generate temporaries for them
18163             --  if needed, before applying checks, since checks may cause
18164             --  duplication of the expression without forcing evaluation.
18165
18166             if Expander_Active then
18167                Force_Evaluation (Lo);
18168                Force_Evaluation (Hi);
18169             end if;
18170
18171             --  We use a flag here instead of suppressing checks on the
18172             --  type because the type we check against isn't necessarily
18173             --  the place where we put the check.
18174
18175             if not R_Check_Off then
18176                R_Checks := Get_Range_Checks (R, T);
18177
18178                --  Look up tree to find an appropriate insertion point. We
18179                --  can't just use insert_actions because later processing
18180                --  depends on the insertion node. Prior to Ada2012 the
18181                --  insertion point could only be a declaration or a loop, but
18182                --  quantified expressions can appear within any context in an
18183                --  expression, and the insertion point can be any statement,
18184                --  pragma, or declaration.
18185
18186                Insert_Node := Parent (R);
18187                while Present (Insert_Node) loop
18188                   exit when
18189                     Nkind (Insert_Node) in N_Declaration
18190                     and then
18191                       not Nkind_In
18192                         (Insert_Node, N_Component_Declaration,
18193                                       N_Loop_Parameter_Specification,
18194                                       N_Function_Specification,
18195                                       N_Procedure_Specification);
18196
18197                   exit when Nkind (Insert_Node) in N_Later_Decl_Item
18198                     or else Nkind (Insert_Node) in
18199                               N_Statement_Other_Than_Procedure_Call
18200                     or else Nkind_In (Insert_Node, N_Procedure_Call_Statement,
18201                                                    N_Pragma);
18202
18203                   Insert_Node := Parent (Insert_Node);
18204                end loop;
18205
18206                --  Why would Type_Decl not be present???  Without this test,
18207                --  short regression tests fail.
18208
18209                if Present (Insert_Node) then
18210
18211                   --  Case of loop statement. Verify that the range is part
18212                   --  of the subtype indication of the iteration scheme.
18213
18214                   if Nkind (Insert_Node) = N_Loop_Statement then
18215                      declare
18216                         Indic : Node_Id;
18217
18218                      begin
18219                         Indic := Parent (R);
18220                         while Present (Indic)
18221                           and then Nkind (Indic) /= N_Subtype_Indication
18222                         loop
18223                            Indic := Parent (Indic);
18224                         end loop;
18225
18226                         if Present (Indic) then
18227                            Def_Id := Etype (Subtype_Mark (Indic));
18228
18229                            Insert_Range_Checks
18230                              (R_Checks,
18231                               Insert_Node,
18232                               Def_Id,
18233                               Sloc (Insert_Node),
18234                               R,
18235                               Do_Before => True);
18236                         end if;
18237                      end;
18238
18239                   --  Insertion before a declaration. If the declaration
18240                   --  includes discriminants, the list of applicable checks
18241                   --  is given by the caller.
18242
18243                   elsif Nkind (Insert_Node) in N_Declaration then
18244                      Def_Id := Defining_Identifier (Insert_Node);
18245
18246                      if (Ekind (Def_Id) = E_Record_Type
18247                           and then Depends_On_Discriminant (R))
18248                        or else
18249                         (Ekind (Def_Id) = E_Protected_Type
18250                           and then Has_Discriminants (Def_Id))
18251                      then
18252                         Append_Range_Checks
18253                           (R_Checks,
18254                             Check_List, Def_Id, Sloc (Insert_Node), R);
18255
18256                      else
18257                         Insert_Range_Checks
18258                           (R_Checks,
18259                             Insert_Node, Def_Id, Sloc (Insert_Node), R);
18260
18261                      end if;
18262
18263                   --  Insertion before a statement. Range appears in the
18264                   --  context of a quantified expression. Insertion will
18265                   --  take place when expression is expanded.
18266
18267                   else
18268                      null;
18269                   end if;
18270                end if;
18271             end if;
18272          end if;
18273
18274       --  Case of other than an explicit N_Range node
18275
18276       elsif Expander_Active then
18277          Get_Index_Bounds (R, Lo, Hi);
18278          Force_Evaluation (Lo);
18279          Force_Evaluation (Hi);
18280       end if;
18281    end Process_Range_Expr_In_Decl;
18282
18283    --------------------------------------
18284    -- Process_Real_Range_Specification --
18285    --------------------------------------
18286
18287    procedure Process_Real_Range_Specification (Def : Node_Id) is
18288       Spec : constant Node_Id := Real_Range_Specification (Def);
18289       Lo   : Node_Id;
18290       Hi   : Node_Id;
18291       Err  : Boolean := False;
18292
18293       procedure Analyze_Bound (N : Node_Id);
18294       --  Analyze and check one bound
18295
18296       -------------------
18297       -- Analyze_Bound --
18298       -------------------
18299
18300       procedure Analyze_Bound (N : Node_Id) is
18301       begin
18302          Analyze_And_Resolve (N, Any_Real);
18303
18304          if not Is_OK_Static_Expression (N) then
18305             Flag_Non_Static_Expr
18306               ("bound in real type definition is not static!", N);
18307             Err := True;
18308          end if;
18309       end Analyze_Bound;
18310
18311    --  Start of processing for Process_Real_Range_Specification
18312
18313    begin
18314       if Present (Spec) then
18315          Lo := Low_Bound (Spec);
18316          Hi := High_Bound (Spec);
18317          Analyze_Bound (Lo);
18318          Analyze_Bound (Hi);
18319
18320          --  If error, clear away junk range specification
18321
18322          if Err then
18323             Set_Real_Range_Specification (Def, Empty);
18324          end if;
18325       end if;
18326    end Process_Real_Range_Specification;
18327
18328    ---------------------
18329    -- Process_Subtype --
18330    ---------------------
18331
18332    function Process_Subtype
18333      (S           : Node_Id;
18334       Related_Nod : Node_Id;
18335       Related_Id  : Entity_Id := Empty;
18336       Suffix      : Character := ' ') return Entity_Id
18337    is
18338       P               : Node_Id;
18339       Def_Id          : Entity_Id;
18340       Error_Node      : Node_Id;
18341       Full_View_Id    : Entity_Id;
18342       Subtype_Mark_Id : Entity_Id;
18343
18344       May_Have_Null_Exclusion : Boolean;
18345
18346       procedure Check_Incomplete (T : Entity_Id);
18347       --  Called to verify that an incomplete type is not used prematurely
18348
18349       ----------------------
18350       -- Check_Incomplete --
18351       ----------------------
18352
18353       procedure Check_Incomplete (T : Entity_Id) is
18354       begin
18355          --  Ada 2005 (AI-412): Incomplete subtypes are legal
18356
18357          if Ekind (Root_Type (Entity (T))) = E_Incomplete_Type
18358            and then
18359              not (Ada_Version >= Ada_2005
18360                     and then
18361                        (Nkind (Parent (T)) = N_Subtype_Declaration
18362                           or else
18363                             (Nkind (Parent (T)) = N_Subtype_Indication
18364                                and then Nkind (Parent (Parent (T))) =
18365                                           N_Subtype_Declaration)))
18366          then
18367             Error_Msg_N ("invalid use of type before its full declaration", T);
18368          end if;
18369       end Check_Incomplete;
18370
18371    --  Start of processing for Process_Subtype
18372
18373    begin
18374       --  Case of no constraints present
18375
18376       if Nkind (S) /= N_Subtype_Indication then
18377          Find_Type (S);
18378          Check_Incomplete (S);
18379          P := Parent (S);
18380
18381          --  Ada 2005 (AI-231): Static check
18382
18383          if Ada_Version >= Ada_2005
18384            and then Present (P)
18385            and then Null_Exclusion_Present (P)
18386            and then Nkind (P) /= N_Access_To_Object_Definition
18387            and then not Is_Access_Type (Entity (S))
18388          then
18389             Error_Msg_N ("`NOT NULL` only allowed for an access type", S);
18390          end if;
18391
18392          --  The following is ugly, can't we have a range or even a flag???
18393
18394          May_Have_Null_Exclusion :=
18395            Nkind_In (P, N_Access_Definition,
18396                         N_Access_Function_Definition,
18397                         N_Access_Procedure_Definition,
18398                         N_Access_To_Object_Definition,
18399                         N_Allocator,
18400                         N_Component_Definition)
18401              or else
18402            Nkind_In (P, N_Derived_Type_Definition,
18403                         N_Discriminant_Specification,
18404                         N_Formal_Object_Declaration,
18405                         N_Object_Declaration,
18406                         N_Object_Renaming_Declaration,
18407                         N_Parameter_Specification,
18408                         N_Subtype_Declaration);
18409
18410          --  Create an Itype that is a duplicate of Entity (S) but with the
18411          --  null-exclusion attribute.
18412
18413          if May_Have_Null_Exclusion
18414            and then Is_Access_Type (Entity (S))
18415            and then Null_Exclusion_Present (P)
18416
18417             --  No need to check the case of an access to object definition.
18418             --  It is correct to define double not-null pointers.
18419
18420             --  Example:
18421             --     type Not_Null_Int_Ptr is not null access Integer;
18422             --     type Acc is not null access Not_Null_Int_Ptr;
18423
18424            and then Nkind (P) /= N_Access_To_Object_Definition
18425          then
18426             if Can_Never_Be_Null (Entity (S)) then
18427                case Nkind (Related_Nod) is
18428                   when N_Full_Type_Declaration =>
18429                      if Nkind (Type_Definition (Related_Nod))
18430                        in N_Array_Type_Definition
18431                      then
18432                         Error_Node :=
18433                           Subtype_Indication
18434                             (Component_Definition
18435                              (Type_Definition (Related_Nod)));
18436                      else
18437                         Error_Node :=
18438                           Subtype_Indication (Type_Definition (Related_Nod));
18439                      end if;
18440
18441                   when N_Subtype_Declaration =>
18442                      Error_Node := Subtype_Indication (Related_Nod);
18443
18444                   when N_Object_Declaration =>
18445                      Error_Node := Object_Definition (Related_Nod);
18446
18447                   when N_Component_Declaration =>
18448                      Error_Node :=
18449                        Subtype_Indication (Component_Definition (Related_Nod));
18450
18451                   when N_Allocator =>
18452                      Error_Node := Expression (Related_Nod);
18453
18454                   when others =>
18455                      pragma Assert (False);
18456                      Error_Node := Related_Nod;
18457                end case;
18458
18459                Error_Msg_NE
18460                  ("`NOT NULL` not allowed (& already excludes null)",
18461                   Error_Node,
18462                   Entity (S));
18463             end if;
18464
18465             Set_Etype  (S,
18466               Create_Null_Excluding_Itype
18467                 (T           => Entity (S),
18468                  Related_Nod => P));
18469             Set_Entity (S, Etype (S));
18470          end if;
18471
18472          return Entity (S);
18473
18474       --  Case of constraint present, so that we have an N_Subtype_Indication
18475       --  node (this node is created only if constraints are present).
18476
18477       else
18478          Find_Type (Subtype_Mark (S));
18479
18480          if Nkind (Parent (S)) /= N_Access_To_Object_Definition
18481            and then not
18482             (Nkind (Parent (S)) = N_Subtype_Declaration
18483               and then Is_Itype (Defining_Identifier (Parent (S))))
18484          then
18485             Check_Incomplete (Subtype_Mark (S));
18486          end if;
18487
18488          P := Parent (S);
18489          Subtype_Mark_Id := Entity (Subtype_Mark (S));
18490
18491          --  Explicit subtype declaration case
18492
18493          if Nkind (P) = N_Subtype_Declaration then
18494             Def_Id := Defining_Identifier (P);
18495
18496          --  Explicit derived type definition case
18497
18498          elsif Nkind (P) = N_Derived_Type_Definition then
18499             Def_Id := Defining_Identifier (Parent (P));
18500
18501          --  Implicit case, the Def_Id must be created as an implicit type.
18502          --  The one exception arises in the case of concurrent types, array
18503          --  and access types, where other subsidiary implicit types may be
18504          --  created and must appear before the main implicit type. In these
18505          --  cases we leave Def_Id set to Empty as a signal that Create_Itype
18506          --  has not yet been called to create Def_Id.
18507
18508          else
18509             if Is_Array_Type (Subtype_Mark_Id)
18510               or else Is_Concurrent_Type (Subtype_Mark_Id)
18511               or else Is_Access_Type (Subtype_Mark_Id)
18512             then
18513                Def_Id := Empty;
18514
18515             --  For the other cases, we create a new unattached Itype,
18516             --  and set the indication to ensure it gets attached later.
18517
18518             else
18519                Def_Id :=
18520                  Create_Itype (E_Void, Related_Nod, Related_Id, Suffix);
18521             end if;
18522          end if;
18523
18524          --  If the kind of constraint is invalid for this kind of type,
18525          --  then give an error, and then pretend no constraint was given.
18526
18527          if not Is_Valid_Constraint_Kind
18528                    (Ekind (Subtype_Mark_Id), Nkind (Constraint (S)))
18529          then
18530             Error_Msg_N
18531               ("incorrect constraint for this kind of type", Constraint (S));
18532
18533             Rewrite (S, New_Copy_Tree (Subtype_Mark (S)));
18534
18535             --  Set Ekind of orphan itype, to prevent cascaded errors
18536
18537             if Present (Def_Id) then
18538                Set_Ekind (Def_Id, Ekind (Any_Type));
18539             end if;
18540
18541             --  Make recursive call, having got rid of the bogus constraint
18542
18543             return Process_Subtype (S, Related_Nod, Related_Id, Suffix);
18544          end if;
18545
18546          --  Remaining processing depends on type
18547
18548          case Ekind (Subtype_Mark_Id) is
18549             when Access_Kind =>
18550                Constrain_Access (Def_Id, S, Related_Nod);
18551
18552                if Expander_Active
18553                  and then  Is_Itype (Designated_Type (Def_Id))
18554                  and then Nkind (Related_Nod) = N_Subtype_Declaration
18555                  and then not Is_Incomplete_Type (Designated_Type (Def_Id))
18556                then
18557                   Build_Itype_Reference
18558                     (Designated_Type (Def_Id), Related_Nod);
18559                end if;
18560
18561             when Array_Kind =>
18562                Constrain_Array (Def_Id, S, Related_Nod, Related_Id, Suffix);
18563
18564             when Decimal_Fixed_Point_Kind =>
18565                Constrain_Decimal (Def_Id, S);
18566
18567             when Enumeration_Kind =>
18568                Constrain_Enumeration (Def_Id, S);
18569
18570             when Ordinary_Fixed_Point_Kind =>
18571                Constrain_Ordinary_Fixed (Def_Id, S);
18572
18573             when Float_Kind =>
18574                Constrain_Float (Def_Id, S);
18575
18576             when Integer_Kind =>
18577                Constrain_Integer (Def_Id, S);
18578
18579             when E_Record_Type     |
18580                  E_Record_Subtype  |
18581                  Class_Wide_Kind   |
18582                  E_Incomplete_Type =>
18583                Constrain_Discriminated_Type (Def_Id, S, Related_Nod);
18584
18585                if Ekind (Def_Id) = E_Incomplete_Type then
18586                   Set_Private_Dependents (Def_Id, New_Elmt_List);
18587                end if;
18588
18589             when Private_Kind =>
18590                Constrain_Discriminated_Type (Def_Id, S, Related_Nod);
18591                Set_Private_Dependents (Def_Id, New_Elmt_List);
18592
18593                --  In case of an invalid constraint prevent further processing
18594                --  since the type constructed is missing expected fields.
18595
18596                if Etype (Def_Id) = Any_Type then
18597                   return Def_Id;
18598                end if;
18599
18600                --  If the full view is that of a task with discriminants,
18601                --  we must constrain both the concurrent type and its
18602                --  corresponding record type. Otherwise we will just propagate
18603                --  the constraint to the full view, if available.
18604
18605                if Present (Full_View (Subtype_Mark_Id))
18606                  and then Has_Discriminants (Subtype_Mark_Id)
18607                  and then Is_Concurrent_Type (Full_View (Subtype_Mark_Id))
18608                then
18609                   Full_View_Id :=
18610                     Create_Itype (E_Void, Related_Nod, Related_Id, Suffix);
18611
18612                   Set_Entity (Subtype_Mark (S), Full_View (Subtype_Mark_Id));
18613                   Constrain_Concurrent (Full_View_Id, S,
18614                     Related_Nod, Related_Id, Suffix);
18615                   Set_Entity (Subtype_Mark (S), Subtype_Mark_Id);
18616                   Set_Full_View (Def_Id, Full_View_Id);
18617
18618                   --  Introduce an explicit reference to the private subtype,
18619                   --  to prevent scope anomalies in gigi if first use appears
18620                   --  in a nested context, e.g. a later function body.
18621                   --  Should this be generated in other contexts than a full
18622                   --  type declaration?
18623
18624                   if Is_Itype (Def_Id)
18625                     and then
18626                       Nkind (Parent (P)) = N_Full_Type_Declaration
18627                   then
18628                      Build_Itype_Reference (Def_Id, Parent (P));
18629                   end if;
18630
18631                else
18632                   Prepare_Private_Subtype_Completion (Def_Id, Related_Nod);
18633                end if;
18634
18635             when Concurrent_Kind  =>
18636                Constrain_Concurrent (Def_Id, S,
18637                  Related_Nod, Related_Id, Suffix);
18638
18639             when others =>
18640                Error_Msg_N ("invalid subtype mark in subtype indication", S);
18641          end case;
18642
18643          --  Size and Convention are always inherited from the base type
18644
18645          Set_Size_Info  (Def_Id,            (Subtype_Mark_Id));
18646          Set_Convention (Def_Id, Convention (Subtype_Mark_Id));
18647
18648          return Def_Id;
18649       end if;
18650    end Process_Subtype;
18651
18652    ---------------------------------------
18653    -- Check_Anonymous_Access_Components --
18654    ---------------------------------------
18655
18656    procedure Check_Anonymous_Access_Components
18657       (Typ_Decl  : Node_Id;
18658        Typ       : Entity_Id;
18659        Prev      : Entity_Id;
18660        Comp_List : Node_Id)
18661    is
18662       Loc         : constant Source_Ptr := Sloc (Typ_Decl);
18663       Anon_Access : Entity_Id;
18664       Acc_Def     : Node_Id;
18665       Comp        : Node_Id;
18666       Comp_Def    : Node_Id;
18667       Decl        : Node_Id;
18668       Type_Def    : Node_Id;
18669
18670       procedure Build_Incomplete_Type_Declaration;
18671       --  If the record type contains components that include an access to the
18672       --  current record, then create an incomplete type declaration for the
18673       --  record, to be used as the designated type of the anonymous access.
18674       --  This is done only once, and only if there is no previous partial
18675       --  view of the type.
18676
18677       function Designates_T (Subt : Node_Id) return Boolean;
18678       --  Check whether a node designates the enclosing record type, or 'Class
18679       --  of that type
18680
18681       function Mentions_T (Acc_Def : Node_Id) return Boolean;
18682       --  Check whether an access definition includes a reference to
18683       --  the enclosing record type. The reference can be a subtype mark
18684       --  in the access definition itself, a 'Class attribute reference, or
18685       --  recursively a reference appearing in a parameter specification
18686       --  or result definition of an access_to_subprogram definition.
18687
18688       --------------------------------------
18689       -- Build_Incomplete_Type_Declaration --
18690       --------------------------------------
18691
18692       procedure Build_Incomplete_Type_Declaration is
18693          Decl  : Node_Id;
18694          Inc_T : Entity_Id;
18695          H     : Entity_Id;
18696
18697          --  Is_Tagged indicates whether the type is tagged. It is tagged if
18698          --  it's "is new ... with record" or else "is tagged record ...".
18699
18700          Is_Tagged : constant Boolean :=
18701              (Nkind (Type_Definition (Typ_Decl)) = N_Derived_Type_Definition
18702                  and then
18703                    Present
18704                      (Record_Extension_Part (Type_Definition (Typ_Decl))))
18705            or else
18706              (Nkind (Type_Definition (Typ_Decl)) = N_Record_Definition
18707                  and then Tagged_Present (Type_Definition (Typ_Decl)));
18708
18709       begin
18710          --  If there is a previous partial view, no need to create a new one
18711          --  If the partial view, given by Prev, is incomplete,  If Prev is
18712          --  a private declaration, full declaration is flagged accordingly.
18713
18714          if Prev /= Typ then
18715             if Is_Tagged then
18716                Make_Class_Wide_Type (Prev);
18717                Set_Class_Wide_Type (Typ, Class_Wide_Type (Prev));
18718                Set_Etype (Class_Wide_Type (Typ), Typ);
18719             end if;
18720
18721             return;
18722
18723          elsif Has_Private_Declaration (Typ) then
18724
18725             --  If we refer to T'Class inside T, and T is the completion of a
18726             --  private type, then we need to make sure the class-wide type
18727             --  exists.
18728
18729             if Is_Tagged then
18730                Make_Class_Wide_Type (Typ);
18731             end if;
18732
18733             return;
18734
18735          --  If there was a previous anonymous access type, the incomplete
18736          --  type declaration will have been created already.
18737
18738          elsif Present (Current_Entity (Typ))
18739            and then Ekind (Current_Entity (Typ)) = E_Incomplete_Type
18740            and then Full_View (Current_Entity (Typ)) = Typ
18741          then
18742             if Is_Tagged
18743               and then Comes_From_Source (Current_Entity (Typ))
18744               and then not Is_Tagged_Type (Current_Entity (Typ))
18745             then
18746                Make_Class_Wide_Type (Typ);
18747                Error_Msg_N
18748                  ("incomplete view of tagged type should be declared tagged?",
18749                   Parent (Current_Entity (Typ)));
18750             end if;
18751             return;
18752
18753          else
18754             Inc_T := Make_Defining_Identifier (Loc, Chars (Typ));
18755             Decl  := Make_Incomplete_Type_Declaration (Loc, Inc_T);
18756
18757             --  Type has already been inserted into the current scope. Remove
18758             --  it, and add incomplete declaration for type, so that subsequent
18759             --  anonymous access types can use it. The entity is unchained from
18760             --  the homonym list and from immediate visibility. After analysis,
18761             --  the entity in the incomplete declaration becomes immediately
18762             --  visible in the record declaration that follows.
18763
18764             H := Current_Entity (Typ);
18765
18766             if H = Typ then
18767                Set_Name_Entity_Id (Chars (Typ), Homonym (Typ));
18768             else
18769                while Present (H)
18770                  and then Homonym (H) /= Typ
18771                loop
18772                   H := Homonym (Typ);
18773                end loop;
18774
18775                Set_Homonym (H, Homonym (Typ));
18776             end if;
18777
18778             Insert_Before (Typ_Decl, Decl);
18779             Analyze (Decl);
18780             Set_Full_View (Inc_T, Typ);
18781
18782             if Is_Tagged then
18783
18784                --  Create a common class-wide type for both views, and set the
18785                --  Etype of the class-wide type to the full view.
18786
18787                Make_Class_Wide_Type (Inc_T);
18788                Set_Class_Wide_Type (Typ, Class_Wide_Type (Inc_T));
18789                Set_Etype (Class_Wide_Type (Typ), Typ);
18790             end if;
18791          end if;
18792       end Build_Incomplete_Type_Declaration;
18793
18794       ------------------
18795       -- Designates_T --
18796       ------------------
18797
18798       function Designates_T (Subt : Node_Id) return Boolean is
18799          Type_Id : constant Name_Id := Chars (Typ);
18800
18801          function Names_T (Nam : Node_Id) return Boolean;
18802          --  The record type has not been introduced in the current scope
18803          --  yet, so we must examine the name of the type itself, either
18804          --  an identifier T, or an expanded name of the form P.T, where
18805          --  P denotes the current scope.
18806
18807          -------------
18808          -- Names_T --
18809          -------------
18810
18811          function Names_T (Nam : Node_Id) return Boolean is
18812          begin
18813             if Nkind (Nam) = N_Identifier then
18814                return Chars (Nam) = Type_Id;
18815
18816             elsif Nkind (Nam) = N_Selected_Component then
18817                if Chars (Selector_Name (Nam)) = Type_Id then
18818                   if Nkind (Prefix (Nam)) = N_Identifier then
18819                      return Chars (Prefix (Nam)) = Chars (Current_Scope);
18820
18821                   elsif Nkind (Prefix (Nam)) = N_Selected_Component then
18822                      return Chars (Selector_Name (Prefix (Nam))) =
18823                             Chars (Current_Scope);
18824                   else
18825                      return False;
18826                   end if;
18827
18828                else
18829                   return False;
18830                end if;
18831
18832             else
18833                return False;
18834             end if;
18835          end Names_T;
18836
18837       --  Start of processing for Designates_T
18838
18839       begin
18840          if Nkind (Subt) = N_Identifier then
18841             return Chars (Subt) = Type_Id;
18842
18843             --  Reference can be through an expanded name which has not been
18844             --  analyzed yet, and which designates enclosing scopes.
18845
18846          elsif Nkind (Subt) = N_Selected_Component then
18847             if Names_T (Subt) then
18848                return True;
18849
18850             --  Otherwise it must denote an entity that is already visible.
18851             --  The access definition may name a subtype of the enclosing
18852             --  type, if there is a previous incomplete declaration for it.
18853
18854             else
18855                Find_Selected_Component (Subt);
18856                return
18857                  Is_Entity_Name (Subt)
18858                    and then Scope (Entity (Subt)) = Current_Scope
18859                    and then
18860                      (Chars (Base_Type (Entity (Subt))) = Type_Id
18861                        or else
18862                          (Is_Class_Wide_Type (Entity (Subt))
18863                            and then
18864                            Chars (Etype (Base_Type (Entity (Subt)))) =
18865                                                                   Type_Id));
18866             end if;
18867
18868          --  A reference to the current type may appear as the prefix of
18869          --  a 'Class attribute.
18870
18871          elsif Nkind (Subt) = N_Attribute_Reference
18872            and then Attribute_Name (Subt) = Name_Class
18873          then
18874             return Names_T (Prefix (Subt));
18875
18876          else
18877             return False;
18878          end if;
18879       end Designates_T;
18880
18881       ----------------
18882       -- Mentions_T --
18883       ----------------
18884
18885       function Mentions_T (Acc_Def : Node_Id) return Boolean is
18886          Param_Spec : Node_Id;
18887
18888          Acc_Subprg : constant Node_Id :=
18889                         Access_To_Subprogram_Definition (Acc_Def);
18890
18891       begin
18892          if No (Acc_Subprg) then
18893             return Designates_T (Subtype_Mark (Acc_Def));
18894          end if;
18895
18896          --  Component is an access_to_subprogram: examine its formals,
18897          --  and result definition in the case of an access_to_function.
18898
18899          Param_Spec := First (Parameter_Specifications (Acc_Subprg));
18900          while Present (Param_Spec) loop
18901             if Nkind (Parameter_Type (Param_Spec)) = N_Access_Definition
18902               and then Mentions_T (Parameter_Type (Param_Spec))
18903             then
18904                return True;
18905
18906             elsif Designates_T (Parameter_Type (Param_Spec)) then
18907                return True;
18908             end if;
18909
18910             Next (Param_Spec);
18911          end loop;
18912
18913          if Nkind (Acc_Subprg) = N_Access_Function_Definition then
18914             if Nkind (Result_Definition (Acc_Subprg)) =
18915                  N_Access_Definition
18916             then
18917                return Mentions_T (Result_Definition (Acc_Subprg));
18918             else
18919                return Designates_T (Result_Definition (Acc_Subprg));
18920             end if;
18921          end if;
18922
18923          return False;
18924       end Mentions_T;
18925
18926    --  Start of processing for Check_Anonymous_Access_Components
18927
18928    begin
18929       if No (Comp_List) then
18930          return;
18931       end if;
18932
18933       Comp := First (Component_Items (Comp_List));
18934       while Present (Comp) loop
18935          if Nkind (Comp) = N_Component_Declaration
18936            and then Present
18937              (Access_Definition (Component_Definition (Comp)))
18938            and then
18939              Mentions_T (Access_Definition (Component_Definition (Comp)))
18940          then
18941             Comp_Def := Component_Definition (Comp);
18942             Acc_Def :=
18943               Access_To_Subprogram_Definition
18944                 (Access_Definition (Comp_Def));
18945
18946             Build_Incomplete_Type_Declaration;
18947             Anon_Access := Make_Temporary (Loc, 'S');
18948
18949             --  Create a declaration for the anonymous access type: either
18950             --  an access_to_object or an access_to_subprogram.
18951
18952             if Present (Acc_Def) then
18953                if Nkind (Acc_Def) = N_Access_Function_Definition then
18954                   Type_Def :=
18955                     Make_Access_Function_Definition (Loc,
18956                       Parameter_Specifications =>
18957                         Parameter_Specifications (Acc_Def),
18958                       Result_Definition => Result_Definition (Acc_Def));
18959                else
18960                   Type_Def :=
18961                     Make_Access_Procedure_Definition (Loc,
18962                       Parameter_Specifications =>
18963                         Parameter_Specifications (Acc_Def));
18964                end if;
18965
18966             else
18967                Type_Def :=
18968                  Make_Access_To_Object_Definition (Loc,
18969                    Subtype_Indication =>
18970                       Relocate_Node
18971                         (Subtype_Mark
18972                           (Access_Definition (Comp_Def))));
18973
18974                Set_Constant_Present
18975                  (Type_Def, Constant_Present (Access_Definition (Comp_Def)));
18976                Set_All_Present
18977                  (Type_Def, All_Present (Access_Definition (Comp_Def)));
18978             end if;
18979
18980             Set_Null_Exclusion_Present
18981               (Type_Def,
18982                Null_Exclusion_Present (Access_Definition (Comp_Def)));
18983
18984             Decl :=
18985               Make_Full_Type_Declaration (Loc,
18986                 Defining_Identifier => Anon_Access,
18987                 Type_Definition     => Type_Def);
18988
18989             Insert_Before (Typ_Decl, Decl);
18990             Analyze (Decl);
18991
18992             --  If an access to subprogram, create the extra formals
18993
18994             if Present (Acc_Def) then
18995                Create_Extra_Formals (Designated_Type (Anon_Access));
18996
18997             --  If an access to object, preserve entity of designated type,
18998             --  for ASIS use, before rewriting the component definition.
18999
19000             else
19001                declare
19002                   Desig : Entity_Id;
19003
19004                begin
19005                   Desig := Entity (Subtype_Indication (Type_Def));
19006
19007                   --  If the access definition is to the current  record,
19008                   --  the visible entity at this point is an  incomplete
19009                   --  type. Retrieve the full view to simplify  ASIS queries
19010
19011                   if Ekind (Desig) = E_Incomplete_Type then
19012                      Desig := Full_View (Desig);
19013                   end if;
19014
19015                   Set_Entity
19016                     (Subtype_Mark (Access_Definition  (Comp_Def)), Desig);
19017                end;
19018             end if;
19019
19020             Rewrite (Comp_Def,
19021               Make_Component_Definition (Loc,
19022                 Subtype_Indication =>
19023                New_Occurrence_Of (Anon_Access, Loc)));
19024
19025             if Ekind (Designated_Type (Anon_Access)) = E_Subprogram_Type then
19026                Set_Ekind (Anon_Access, E_Anonymous_Access_Subprogram_Type);
19027             else
19028                Set_Ekind (Anon_Access, E_Anonymous_Access_Type);
19029             end if;
19030
19031             Set_Is_Local_Anonymous_Access (Anon_Access);
19032          end if;
19033
19034          Next (Comp);
19035       end loop;
19036
19037       if Present (Variant_Part (Comp_List)) then
19038          declare
19039             V : Node_Id;
19040          begin
19041             V := First_Non_Pragma (Variants (Variant_Part (Comp_List)));
19042             while Present (V) loop
19043                Check_Anonymous_Access_Components
19044                  (Typ_Decl, Typ, Prev, Component_List (V));
19045                Next_Non_Pragma (V);
19046             end loop;
19047          end;
19048       end if;
19049    end Check_Anonymous_Access_Components;
19050
19051    --------------------------------
19052    -- Preanalyze_Spec_Expression --
19053    --------------------------------
19054
19055    procedure Preanalyze_Spec_Expression (N : Node_Id; T : Entity_Id) is
19056       Save_In_Spec_Expression : constant Boolean := In_Spec_Expression;
19057    begin
19058       In_Spec_Expression := True;
19059       Preanalyze_And_Resolve (N, T);
19060       In_Spec_Expression := Save_In_Spec_Expression;
19061    end Preanalyze_Spec_Expression;
19062
19063    -----------------------------
19064    -- Record_Type_Declaration --
19065    -----------------------------
19066
19067    procedure Record_Type_Declaration
19068      (T    : Entity_Id;
19069       N    : Node_Id;
19070       Prev : Entity_Id)
19071    is
19072       Def       : constant Node_Id := Type_Definition (N);
19073       Is_Tagged : Boolean;
19074       Tag_Comp  : Entity_Id;
19075
19076    begin
19077       --  These flags must be initialized before calling Process_Discriminants
19078       --  because this routine makes use of them.
19079
19080       Set_Ekind             (T, E_Record_Type);
19081       Set_Etype             (T, T);
19082       Init_Size_Align       (T);
19083       Set_Interfaces        (T, No_Elist);
19084       Set_Stored_Constraint (T, No_Elist);
19085
19086       --  Normal case
19087
19088       if Ada_Version < Ada_2005
19089         or else not Interface_Present (Def)
19090       then
19091          if Limited_Present (Def) then
19092             Check_SPARK_Restriction ("limited is not allowed", N);
19093          end if;
19094
19095          if Abstract_Present (Def) then
19096             Check_SPARK_Restriction ("abstract is not allowed", N);
19097          end if;
19098
19099          --  The flag Is_Tagged_Type might have already been set by
19100          --  Find_Type_Name if it detected an error for declaration T. This
19101          --  arises in the case of private tagged types where the full view
19102          --  omits the word tagged.
19103
19104          Is_Tagged :=
19105            Tagged_Present (Def)
19106              or else (Serious_Errors_Detected > 0 and then Is_Tagged_Type (T));
19107
19108          Set_Is_Tagged_Type      (T, Is_Tagged);
19109          Set_Is_Limited_Record   (T, Limited_Present (Def));
19110
19111          --  Type is abstract if full declaration carries keyword, or if
19112          --  previous partial view did.
19113
19114          Set_Is_Abstract_Type    (T, Is_Abstract_Type (T)
19115                                       or else Abstract_Present (Def));
19116
19117       else
19118          Check_SPARK_Restriction ("interface is not allowed", N);
19119
19120          Is_Tagged := True;
19121          Analyze_Interface_Declaration (T, Def);
19122
19123          if Present (Discriminant_Specifications (N)) then
19124             Error_Msg_N
19125               ("interface types cannot have discriminants",
19126                 Defining_Identifier
19127                   (First (Discriminant_Specifications (N))));
19128          end if;
19129       end if;
19130
19131       --  First pass: if there are self-referential access components,
19132       --  create the required anonymous access type declarations, and if
19133       --  need be an incomplete type declaration for T itself.
19134
19135       Check_Anonymous_Access_Components (N, T, Prev, Component_List (Def));
19136
19137       if Ada_Version >= Ada_2005
19138         and then Present (Interface_List (Def))
19139       then
19140          Check_Interfaces (N, Def);
19141
19142          declare
19143             Ifaces_List : Elist_Id;
19144
19145          begin
19146             --  Ada 2005 (AI-251): Collect the list of progenitors that are not
19147             --  already in the parents.
19148
19149             Collect_Interfaces
19150               (T               => T,
19151                Ifaces_List     => Ifaces_List,
19152                Exclude_Parents => True);
19153
19154             Set_Interfaces (T, Ifaces_List);
19155          end;
19156       end if;
19157
19158       --  Records constitute a scope for the component declarations within.
19159       --  The scope is created prior to the processing of these declarations.
19160       --  Discriminants are processed first, so that they are visible when
19161       --  processing the other components. The Ekind of the record type itself
19162       --  is set to E_Record_Type (subtypes appear as E_Record_Subtype).
19163
19164       --  Enter record scope
19165
19166       Push_Scope (T);
19167
19168       --  If an incomplete or private type declaration was already given for
19169       --  the type, then this scope already exists, and the discriminants have
19170       --  been declared within. We must verify that the full declaration
19171       --  matches the incomplete one.
19172
19173       Check_Or_Process_Discriminants (N, T, Prev);
19174
19175       Set_Is_Constrained     (T, not Has_Discriminants (T));
19176       Set_Has_Delayed_Freeze (T, True);
19177
19178       --  For tagged types add a manually analyzed component corresponding
19179       --  to the component _tag, the corresponding piece of tree will be
19180       --  expanded as part of the freezing actions if it is not a CPP_Class.
19181
19182       if Is_Tagged then
19183
19184          --  Do not add the tag unless we are in expansion mode
19185
19186          if Expander_Active then
19187             Tag_Comp := Make_Defining_Identifier (Sloc (Def), Name_uTag);
19188             Enter_Name (Tag_Comp);
19189
19190             Set_Ekind                     (Tag_Comp, E_Component);
19191             Set_Is_Tag                    (Tag_Comp);
19192             Set_Is_Aliased                (Tag_Comp);
19193             Set_Etype                     (Tag_Comp, RTE (RE_Tag));
19194             Set_DT_Entry_Count            (Tag_Comp, No_Uint);
19195             Set_Original_Record_Component (Tag_Comp, Tag_Comp);
19196             Init_Component_Location       (Tag_Comp);
19197
19198             --  Ada 2005 (AI-251): Addition of the Tag corresponding to all the
19199             --  implemented interfaces.
19200
19201             if Has_Interfaces (T) then
19202                Add_Interface_Tag_Components (N, T);
19203             end if;
19204          end if;
19205
19206          Make_Class_Wide_Type (T);
19207          Set_Direct_Primitive_Operations (T, New_Elmt_List);
19208       end if;
19209
19210       --  We must suppress range checks when processing record components in
19211       --  the presence of discriminants, since we don't want spurious checks to
19212       --  be generated during their analysis, but Suppress_Range_Checks flags
19213       --  must be reset the after processing the record definition.
19214
19215       --  Note: this is the only use of Kill_Range_Checks, and is a bit odd,
19216       --  couldn't we just use the normal range check suppression method here.
19217       --  That would seem cleaner ???
19218
19219       if Has_Discriminants (T) and then not Range_Checks_Suppressed (T) then
19220          Set_Kill_Range_Checks (T, True);
19221          Record_Type_Definition (Def, Prev);
19222          Set_Kill_Range_Checks (T, False);
19223       else
19224          Record_Type_Definition (Def, Prev);
19225       end if;
19226
19227       --  Exit from record scope
19228
19229       End_Scope;
19230
19231       --  Ada 2005 (AI-251 and AI-345): Derive the interface subprograms of all
19232       --  the implemented interfaces and associate them an aliased entity.
19233
19234       if Is_Tagged
19235         and then not Is_Empty_List (Interface_List (Def))
19236       then
19237          Derive_Progenitor_Subprograms (T, T);
19238       end if;
19239    end Record_Type_Declaration;
19240
19241    ----------------------------
19242    -- Record_Type_Definition --
19243    ----------------------------
19244
19245    procedure Record_Type_Definition (Def : Node_Id; Prev_T : Entity_Id) is
19246       Component          : Entity_Id;
19247       Ctrl_Components    : Boolean := False;
19248       Final_Storage_Only : Boolean;
19249       T                  : Entity_Id;
19250
19251    begin
19252       if Ekind (Prev_T) = E_Incomplete_Type then
19253          T := Full_View (Prev_T);
19254       else
19255          T := Prev_T;
19256       end if;
19257
19258       --  In SPARK, tagged types and type extensions may only be declared in
19259       --  the specification of library unit packages.
19260
19261       if Present (Def) and then Is_Tagged_Type (T) then
19262          declare
19263             Typ  : Node_Id;
19264             Ctxt : Node_Id;
19265
19266          begin
19267             if Nkind (Parent (Def)) = N_Full_Type_Declaration then
19268                Typ := Parent (Def);
19269             else
19270                pragma Assert
19271                  (Nkind (Parent (Def)) = N_Derived_Type_Definition);
19272                Typ := Parent (Parent (Def));
19273             end if;
19274
19275             Ctxt := Parent (Typ);
19276
19277             if Nkind (Ctxt) = N_Package_Body
19278               and then Nkind (Parent (Ctxt)) = N_Compilation_Unit
19279             then
19280                Check_SPARK_Restriction
19281                  ("type should be defined in package specification", Typ);
19282
19283             elsif Nkind (Ctxt) /= N_Package_Specification
19284               or else Nkind (Parent (Parent (Ctxt))) /= N_Compilation_Unit
19285             then
19286                Check_SPARK_Restriction
19287                  ("type should be defined in library unit package", Typ);
19288             end if;
19289          end;
19290       end if;
19291
19292       Final_Storage_Only := not Is_Controlled (T);
19293
19294       --  Ada 2005: check whether an explicit Limited is present in a derived
19295       --  type declaration.
19296
19297       if Nkind (Parent (Def)) = N_Derived_Type_Definition
19298         and then Limited_Present (Parent (Def))
19299       then
19300          Set_Is_Limited_Record (T);
19301       end if;
19302
19303       --  If the component list of a record type is defined by the reserved
19304       --  word null and there is no discriminant part, then the record type has
19305       --  no components and all records of the type are null records (RM 3.7)
19306       --  This procedure is also called to process the extension part of a
19307       --  record extension, in which case the current scope may have inherited
19308       --  components.
19309
19310       if No (Def)
19311         or else No (Component_List (Def))
19312         or else Null_Present (Component_List (Def))
19313       then
19314          if not Is_Tagged_Type (T) then
19315             Check_SPARK_Restriction ("non-tagged record cannot be null", Def);
19316          end if;
19317
19318       else
19319          Analyze_Declarations (Component_Items (Component_List (Def)));
19320
19321          if Present (Variant_Part (Component_List (Def))) then
19322             Check_SPARK_Restriction ("variant part is not allowed", Def);
19323             Analyze (Variant_Part (Component_List (Def)));
19324          end if;
19325       end if;
19326
19327       --  After completing the semantic analysis of the record definition,
19328       --  record components, both new and inherited, are accessible. Set their
19329       --  kind accordingly. Exclude malformed itypes from illegal declarations,
19330       --  whose Ekind may be void.
19331
19332       Component := First_Entity (Current_Scope);
19333       while Present (Component) loop
19334          if Ekind (Component) = E_Void
19335            and then not Is_Itype (Component)
19336          then
19337             Set_Ekind (Component, E_Component);
19338             Init_Component_Location (Component);
19339          end if;
19340
19341          if Has_Task (Etype (Component)) then
19342             Set_Has_Task (T);
19343          end if;
19344
19345          if Ekind (Component) /= E_Component then
19346             null;
19347
19348          --  Do not set Has_Controlled_Component on a class-wide equivalent
19349          --  type. See Make_CW_Equivalent_Type.
19350
19351          elsif not Is_Class_Wide_Equivalent_Type (T)
19352            and then (Has_Controlled_Component (Etype (Component))
19353                       or else (Chars (Component) /= Name_uParent
19354                                 and then Is_Controlled (Etype (Component))))
19355          then
19356             Set_Has_Controlled_Component (T, True);
19357             Final_Storage_Only :=
19358               Final_Storage_Only
19359                 and then Finalize_Storage_Only (Etype (Component));
19360             Ctrl_Components := True;
19361          end if;
19362
19363          Next_Entity (Component);
19364       end loop;
19365
19366       --  A Type is Finalize_Storage_Only only if all its controlled components
19367       --  are also.
19368
19369       if Ctrl_Components then
19370          Set_Finalize_Storage_Only (T, Final_Storage_Only);
19371       end if;
19372
19373       --  Place reference to end record on the proper entity, which may
19374       --  be a partial view.
19375
19376       if Present (Def) then
19377          Process_End_Label (Def, 'e', Prev_T);
19378       end if;
19379    end Record_Type_Definition;
19380
19381    ------------------------
19382    -- Replace_Components --
19383    ------------------------
19384
19385    procedure Replace_Components (Typ : Entity_Id; Decl : Node_Id) is
19386       function Process (N : Node_Id) return Traverse_Result;
19387
19388       -------------
19389       -- Process --
19390       -------------
19391
19392       function Process (N : Node_Id) return Traverse_Result is
19393          Comp : Entity_Id;
19394
19395       begin
19396          if Nkind (N) = N_Discriminant_Specification then
19397             Comp := First_Discriminant (Typ);
19398             while Present (Comp) loop
19399                if Chars (Comp) = Chars (Defining_Identifier (N)) then
19400                   Set_Defining_Identifier (N, Comp);
19401                   exit;
19402                end if;
19403
19404                Next_Discriminant (Comp);
19405             end loop;
19406
19407          elsif Nkind (N) = N_Component_Declaration then
19408             Comp := First_Component (Typ);
19409             while Present (Comp) loop
19410                if Chars (Comp) = Chars (Defining_Identifier (N)) then
19411                   Set_Defining_Identifier (N, Comp);
19412                   exit;
19413                end if;
19414
19415                Next_Component (Comp);
19416             end loop;
19417          end if;
19418
19419          return OK;
19420       end Process;
19421
19422       procedure Replace is new Traverse_Proc (Process);
19423
19424    --  Start of processing for Replace_Components
19425
19426    begin
19427       Replace (Decl);
19428    end Replace_Components;
19429
19430    -------------------------------
19431    -- Set_Completion_Referenced --
19432    -------------------------------
19433
19434    procedure Set_Completion_Referenced (E : Entity_Id) is
19435    begin
19436       --  If in main unit, mark entity that is a completion as referenced,
19437       --  warnings go on the partial view when needed.
19438
19439       if In_Extended_Main_Source_Unit (E) then
19440          Set_Referenced (E);
19441       end if;
19442    end Set_Completion_Referenced;
19443
19444    ---------------------
19445    -- Set_Fixed_Range --
19446    ---------------------
19447
19448    --  The range for fixed-point types is complicated by the fact that we
19449    --  do not know the exact end points at the time of the declaration. This
19450    --  is true for three reasons:
19451
19452    --     A size clause may affect the fudging of the end-points
19453    --     A small clause may affect the values of the end-points
19454    --     We try to include the end-points if it does not affect the size
19455
19456    --  This means that the actual end-points must be established at the point
19457    --  when the type is frozen. Meanwhile, we first narrow the range as
19458    --  permitted (so that it will fit if necessary in a small specified size),
19459    --  and then build a range subtree with these narrowed bounds.
19460
19461    --  Set_Fixed_Range constructs the range from real literal values, and sets
19462    --  the range as the Scalar_Range of the given fixed-point type entity.
19463
19464    --  The parent of this range is set to point to the entity so that it is
19465    --  properly hooked into the tree (unlike normal Scalar_Range entries for
19466    --  other scalar types, which are just pointers to the range in the
19467    --  original tree, this would otherwise be an orphan).
19468
19469    --  The tree is left unanalyzed. When the type is frozen, the processing
19470    --  in Freeze.Freeze_Fixed_Point_Type notices that the range is not
19471    --  analyzed, and uses this as an indication that it should complete
19472    --  work on the range (it will know the final small and size values).
19473
19474    procedure Set_Fixed_Range
19475      (E   : Entity_Id;
19476       Loc : Source_Ptr;
19477       Lo  : Ureal;
19478       Hi  : Ureal)
19479    is
19480       S : constant Node_Id :=
19481             Make_Range (Loc,
19482               Low_Bound  => Make_Real_Literal (Loc, Lo),
19483               High_Bound => Make_Real_Literal (Loc, Hi));
19484    begin
19485       Set_Scalar_Range (E, S);
19486       Set_Parent (S, E);
19487    end Set_Fixed_Range;
19488
19489    ----------------------------------
19490    -- Set_Scalar_Range_For_Subtype --
19491    ----------------------------------
19492
19493    procedure Set_Scalar_Range_For_Subtype
19494      (Def_Id : Entity_Id;
19495       R      : Node_Id;
19496       Subt   : Entity_Id)
19497    is
19498       Kind : constant Entity_Kind :=  Ekind (Def_Id);
19499
19500    begin
19501       --  Defend against previous error
19502
19503       if Nkind (R) = N_Error then
19504          return;
19505       end if;
19506
19507       Set_Scalar_Range (Def_Id, R);
19508
19509       --  We need to link the range into the tree before resolving it so
19510       --  that types that are referenced, including importantly the subtype
19511       --  itself, are properly frozen (Freeze_Expression requires that the
19512       --  expression be properly linked into the tree). Of course if it is
19513       --  already linked in, then we do not disturb the current link.
19514
19515       if No (Parent (R)) then
19516          Set_Parent (R, Def_Id);
19517       end if;
19518
19519       --  Reset the kind of the subtype during analysis of the range, to
19520       --  catch possible premature use in the bounds themselves.
19521
19522       Set_Ekind (Def_Id, E_Void);
19523       Process_Range_Expr_In_Decl (R, Subt);
19524       Set_Ekind (Def_Id, Kind);
19525    end Set_Scalar_Range_For_Subtype;
19526
19527    --------------------------------------------------------
19528    -- Set_Stored_Constraint_From_Discriminant_Constraint --
19529    --------------------------------------------------------
19530
19531    procedure Set_Stored_Constraint_From_Discriminant_Constraint
19532      (E : Entity_Id)
19533    is
19534    begin
19535       --  Make sure set if encountered during Expand_To_Stored_Constraint
19536
19537       Set_Stored_Constraint (E, No_Elist);
19538
19539       --  Give it the right value
19540
19541       if Is_Constrained (E) and then Has_Discriminants (E) then
19542          Set_Stored_Constraint (E,
19543            Expand_To_Stored_Constraint (E, Discriminant_Constraint (E)));
19544       end if;
19545    end Set_Stored_Constraint_From_Discriminant_Constraint;
19546
19547    -------------------------------------
19548    -- Signed_Integer_Type_Declaration --
19549    -------------------------------------
19550
19551    procedure Signed_Integer_Type_Declaration (T : Entity_Id; Def : Node_Id) is
19552       Implicit_Base : Entity_Id;
19553       Base_Typ      : Entity_Id;
19554       Lo_Val        : Uint;
19555       Hi_Val        : Uint;
19556       Errs          : Boolean := False;
19557       Lo            : Node_Id;
19558       Hi            : Node_Id;
19559
19560       function Can_Derive_From (E : Entity_Id) return Boolean;
19561       --  Determine whether given bounds allow derivation from specified type
19562
19563       procedure Check_Bound (Expr : Node_Id);
19564       --  Check bound to make sure it is integral and static. If not, post
19565       --  appropriate error message and set Errs flag
19566
19567       ---------------------
19568       -- Can_Derive_From --
19569       ---------------------
19570
19571       --  Note we check both bounds against both end values, to deal with
19572       --  strange types like ones with a range of 0 .. -12341234.
19573
19574       function Can_Derive_From (E : Entity_Id) return Boolean is
19575          Lo : constant Uint := Expr_Value (Type_Low_Bound (E));
19576          Hi : constant Uint := Expr_Value (Type_High_Bound (E));
19577       begin
19578          return Lo <= Lo_Val and then Lo_Val <= Hi
19579                   and then
19580                 Lo <= Hi_Val and then Hi_Val <= Hi;
19581       end Can_Derive_From;
19582
19583       -----------------
19584       -- Check_Bound --
19585       -----------------
19586
19587       procedure Check_Bound (Expr : Node_Id) is
19588       begin
19589          --  If a range constraint is used as an integer type definition, each
19590          --  bound of the range must be defined by a static expression of some
19591          --  integer type, but the two bounds need not have the same integer
19592          --  type (Negative bounds are allowed.) (RM 3.5.4)
19593
19594          if not Is_Integer_Type (Etype (Expr)) then
19595             Error_Msg_N
19596               ("integer type definition bounds must be of integer type", Expr);
19597             Errs := True;
19598
19599          elsif not Is_OK_Static_Expression (Expr) then
19600             Flag_Non_Static_Expr
19601               ("non-static expression used for integer type bound!", Expr);
19602             Errs := True;
19603
19604          --  The bounds are folded into literals, and we set their type to be
19605          --  universal, to avoid typing difficulties: we cannot set the type
19606          --  of the literal to the new type, because this would be a forward
19607          --  reference for the back end,  and if the original type is user-
19608          --  defined this can lead to spurious semantic errors (e.g. 2928-003).
19609
19610          else
19611             if Is_Entity_Name (Expr) then
19612                Fold_Uint (Expr, Expr_Value (Expr), True);
19613             end if;
19614
19615             Set_Etype (Expr, Universal_Integer);
19616          end if;
19617       end Check_Bound;
19618
19619    --  Start of processing for Signed_Integer_Type_Declaration
19620
19621    begin
19622       --  Create an anonymous base type
19623
19624       Implicit_Base :=
19625         Create_Itype (E_Signed_Integer_Type, Parent (Def), T, 'B');
19626
19627       --  Analyze and check the bounds, they can be of any integer type
19628
19629       Lo := Low_Bound (Def);
19630       Hi := High_Bound (Def);
19631
19632       --  Arbitrarily use Integer as the type if either bound had an error
19633
19634       if Hi = Error or else Lo = Error then
19635          Base_Typ := Any_Integer;
19636          Set_Error_Posted (T, True);
19637
19638       --  Here both bounds are OK expressions
19639
19640       else
19641          Analyze_And_Resolve (Lo, Any_Integer);
19642          Analyze_And_Resolve (Hi, Any_Integer);
19643
19644          Check_Bound (Lo);
19645          Check_Bound (Hi);
19646
19647          if Errs then
19648             Hi := Type_High_Bound (Standard_Long_Long_Integer);
19649             Lo := Type_Low_Bound (Standard_Long_Long_Integer);
19650          end if;
19651
19652          --  Find type to derive from
19653
19654          Lo_Val := Expr_Value (Lo);
19655          Hi_Val := Expr_Value (Hi);
19656
19657          if Can_Derive_From (Standard_Short_Short_Integer) then
19658             Base_Typ := Base_Type (Standard_Short_Short_Integer);
19659
19660          elsif Can_Derive_From (Standard_Short_Integer) then
19661             Base_Typ := Base_Type (Standard_Short_Integer);
19662
19663          elsif Can_Derive_From (Standard_Integer) then
19664             Base_Typ := Base_Type (Standard_Integer);
19665
19666          elsif Can_Derive_From (Standard_Long_Integer) then
19667             Base_Typ := Base_Type (Standard_Long_Integer);
19668
19669          elsif Can_Derive_From (Standard_Long_Long_Integer) then
19670             Base_Typ := Base_Type (Standard_Long_Long_Integer);
19671
19672          else
19673             Base_Typ := Base_Type (Standard_Long_Long_Integer);
19674             Error_Msg_N ("integer type definition bounds out of range", Def);
19675             Hi := Type_High_Bound (Standard_Long_Long_Integer);
19676             Lo := Type_Low_Bound (Standard_Long_Long_Integer);
19677          end if;
19678       end if;
19679
19680       --  Complete both implicit base and declared first subtype entities
19681
19682       Set_Etype          (Implicit_Base, Base_Typ);
19683       Set_Scalar_Range   (Implicit_Base, Scalar_Range   (Base_Typ));
19684       Set_Size_Info      (Implicit_Base,                (Base_Typ));
19685       Set_RM_Size        (Implicit_Base, RM_Size        (Base_Typ));
19686       Set_First_Rep_Item (Implicit_Base, First_Rep_Item (Base_Typ));
19687
19688       Set_Ekind          (T, E_Signed_Integer_Subtype);
19689       Set_Etype          (T, Implicit_Base);
19690
19691       --  In formal verification mode, override partially the decisions above
19692       --  to restrict base type's range to the minimum allowed by RM 3.5.4,
19693       --  namely the smallest symmetric range around zero with a possible extra
19694       --  negative value that contains the subtype range. Keep Size, RM_Size
19695       --  and First_Rep_Item info, which should not be relied upon in formal
19696       --  verification.
19697
19698       if ALFA_Mode then
19699
19700          --  If the range of the type is already symmetric with a possible
19701          --  extra negative value, just make the type its own base type.
19702
19703          if UI_Le (Lo_Val, Hi_Val)
19704            and then (UI_Eq (Lo_Val, UI_Negate (Hi_Val))
19705                       or else
19706                         UI_Eq (Lo_Val, UI_Sub (UI_Negate (Hi_Val), Uint_1)))
19707          then
19708             Set_Etype (T, T);
19709
19710          else
19711             declare
19712                Sym_Hi_Val : Uint;
19713                Sym_Lo_Val : Uint;
19714                Decl       : Node_Id;
19715                Dloc       : constant Source_Ptr := Sloc (Def);
19716                Lbound     : Node_Id;
19717                Ubound     : Node_Id;
19718
19719             begin
19720                --  If the subtype range is empty, the smallest base type range
19721                --  is the symmetric range around zero containing Lo_Val and
19722                --  Hi_Val.
19723
19724                if UI_Gt (Lo_Val, Hi_Val) then
19725                   Sym_Hi_Val := UI_Max (UI_Abs (Lo_Val), UI_Abs (Hi_Val));
19726                   Sym_Lo_Val := UI_Negate (Sym_Hi_Val);
19727
19728                --  Otherwise, if the subtype range is not empty and Hi_Val has
19729                --  the largest absolute value, Hi_Val is non negative and the
19730                --  smallest base type range is the symmetric range around zero
19731                --  containing Hi_Val.
19732
19733                elsif UI_Le (UI_Abs (Lo_Val), UI_Abs (Hi_Val)) then
19734                   Sym_Hi_Val := Hi_Val;
19735                   Sym_Lo_Val := UI_Negate (Hi_Val);
19736
19737                --  Otherwise, the subtype range is not empty, Lo_Val has the
19738                --  strictly largest absolute value, Lo_Val is negative and the
19739                --  smallest base type range is the symmetric range around zero
19740                --  with an extra negative value Lo_Val.
19741
19742                else
19743                   Sym_Lo_Val := Lo_Val;
19744                   Sym_Hi_Val := UI_Sub (UI_Negate (Lo_Val), Uint_1);
19745                end if;
19746
19747                Lbound := Make_Integer_Literal (Dloc, Sym_Lo_Val);
19748                Ubound := Make_Integer_Literal (Dloc, Sym_Hi_Val);
19749                Set_Is_Static_Expression (Lbound);
19750                Set_Is_Static_Expression (Ubound);
19751
19752                Decl := Make_Full_Type_Declaration (Dloc,
19753                  Defining_Identifier => Implicit_Base,
19754                  Type_Definition     =>
19755                    Make_Signed_Integer_Type_Definition (Dloc,
19756                      Low_Bound  => Lbound,
19757                      High_Bound => Ubound));
19758
19759                Analyze (Decl);
19760                Set_Etype (Implicit_Base, Implicit_Base);
19761                Insert_Before (Parent (Def), Decl);
19762             end;
19763          end if;
19764       end if;
19765
19766       Set_Size_Info      (T,                (Implicit_Base));
19767       Set_First_Rep_Item (T, First_Rep_Item (Implicit_Base));
19768       Set_Scalar_Range   (T, Def);
19769       Set_RM_Size        (T, UI_From_Int (Minimum_Size (T)));
19770       Set_Is_Constrained (T);
19771    end Signed_Integer_Type_Declaration;
19772
19773 end Sem_Ch3;