OSDN Git Service

Add Fariborz to my last change.
[pf3gnuchains/gcc-fork.git] / gcc / ada / sem_aggr.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                             S E M _ A G G R                              --
6 --                                                                          --
7 --                                 B o d y                                  --
8 --                                                                          --
9 --          Copyright (C) 1992-2004 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 2,  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 COPYING.  If not, write --
19 -- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
20 -- MA 02111-1307, USA.                                                      --
21 --                                                                          --
22 -- GNAT was originally developed  by the GNAT team at  New York University. --
23 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
24 --                                                                          --
25 ------------------------------------------------------------------------------
26
27 with Atree;    use Atree;
28 with Checks;   use Checks;
29 with Einfo;    use Einfo;
30 with Elists;   use Elists;
31 with Errout;   use Errout;
32 with Exp_Util; use Exp_Util;
33 with Freeze;   use Freeze;
34 with Itypes;   use Itypes;
35 with Lib.Xref; use Lib.Xref;
36 with Namet;    use Namet;
37 with Nmake;    use Nmake;
38 with Nlists;   use Nlists;
39 with Opt;      use Opt;
40 with Sem;      use Sem;
41 with Sem_Cat;  use Sem_Cat;
42 with Sem_Ch8;  use Sem_Ch8;
43 with Sem_Ch13; use Sem_Ch13;
44 with Sem_Eval; use Sem_Eval;
45 with Sem_Res;  use Sem_Res;
46 with Sem_Util; use Sem_Util;
47 with Sem_Type; use Sem_Type;
48 with Sem_Warn; use Sem_Warn;
49 with Sinfo;    use Sinfo;
50 with Snames;   use Snames;
51 with Stringt;  use Stringt;
52 with Stand;    use Stand;
53 with Targparm; use Targparm;
54 with Tbuild;   use Tbuild;
55 with Uintp;    use Uintp;
56
57 with GNAT.Spelling_Checker; use GNAT.Spelling_Checker;
58
59 package body Sem_Aggr is
60
61    type Case_Bounds is record
62      Choice_Lo   : Node_Id;
63      Choice_Hi   : Node_Id;
64      Choice_Node : Node_Id;
65    end record;
66
67    type Case_Table_Type is array (Nat range <>) of Case_Bounds;
68    --  Table type used by Check_Case_Choices procedure
69
70    -----------------------
71    -- Local Subprograms --
72    -----------------------
73
74    procedure Sort_Case_Table (Case_Table : in out Case_Table_Type);
75    --  Sort the Case Table using the Lower Bound of each Choice as the key.
76    --  A simple insertion sort is used since the number of choices in a case
77    --  statement of variant part will usually be small and probably in near
78    --  sorted order.
79
80    procedure Check_Can_Never_Be_Null (N : Node_Id; Expr : Node_Id);
81    --  Ada 2005 (AI-231): Check bad usage of the null-exclusion issue
82
83    ------------------------------------------------------
84    -- Subprograms used for RECORD AGGREGATE Processing --
85    ------------------------------------------------------
86
87    procedure Resolve_Record_Aggregate (N : Node_Id; Typ : Entity_Id);
88    --  This procedure performs all the semantic checks required for record
89    --  aggregates. Note that for aggregates analysis and resolution go
90    --  hand in hand. Aggregate analysis has been delayed up to here and
91    --  it is done while resolving the aggregate.
92    --
93    --    N is the N_Aggregate node.
94    --    Typ is the record type for the aggregate resolution
95    --
96    --  While performing the semantic checks, this procedure
97    --  builds a new Component_Association_List where each record field
98    --  appears alone in a Component_Choice_List along with its corresponding
99    --  expression. The record fields in the Component_Association_List
100    --  appear in the same order in which they appear in the record type Typ.
101    --
102    --  Once this new Component_Association_List is built and all the
103    --  semantic checks performed, the original aggregate subtree is replaced
104    --  with the new named record aggregate just built. Note that the subtree
105    --  substitution is performed with Rewrite so as to be
106    --  able to retrieve the original aggregate.
107    --
108    --  The aggregate subtree manipulation performed by Resolve_Record_Aggregate
109    --  yields the aggregate format expected by Gigi. Typically, this kind of
110    --  tree manipulations are done in the expander. However, because the
111    --  semantic checks that need to be performed on record aggregates really
112    --  go hand in hand with the record aggregate normalization, the aggregate
113    --  subtree transformation is performed during resolution rather than
114    --  expansion. Had we decided otherwise we would have had to duplicate
115    --  most of the code in the expansion procedure Expand_Record_Aggregate.
116    --  Note, however, that all the expansion concerning aggegates for tagged
117    --  records is done in Expand_Record_Aggregate.
118    --
119    --  The algorithm of Resolve_Record_Aggregate proceeds as follows:
120    --
121    --  1. Make sure that the record type against which the record aggregate
122    --     has to be resolved is not abstract. Furthermore if the type is
123    --     a null aggregate make sure the input aggregate N is also null.
124    --
125    --  2. Verify that the structure of the aggregate is that of a record
126    --     aggregate. Specifically, look for component associations and ensure
127    --     that each choice list only has identifiers or the N_Others_Choice
128    --     node. Also make sure that if present, the N_Others_Choice occurs
129    --     last and by itself.
130    --
131    --  3. If Typ contains discriminants, the values for each discriminant
132    --     is looked for. If the record type Typ has variants, we check
133    --     that the expressions corresponding to each discriminant ruling
134    --     the (possibly nested) variant parts of Typ, are static. This
135    --     allows us to determine the variant parts to which the rest of
136    --     the aggregate must conform. The names of discriminants with their
137    --     values are saved in a new association list, New_Assoc_List which
138    --     is later augmented with the names and values of the remaining
139    --     components in the record type.
140    --
141    --     During this phase we also make sure that every discriminant is
142    --     assigned exactly one value. Note that when several values
143    --     for a given discriminant are found, semantic processing continues
144    --     looking for further errors. In this case it's the first
145    --     discriminant value found which we will be recorded.
146    --
147    --     IMPORTANT NOTE: For derived tagged types this procedure expects
148    --     First_Discriminant and Next_Discriminant to give the correct list
149    --     of discriminants, in the correct order.
150    --
151    --  4. After all the discriminant values have been gathered, we can
152    --     set the Etype of the record aggregate. If Typ contains no
153    --     discriminants this is straightforward: the Etype of N is just
154    --     Typ, otherwise a new implicit constrained subtype of Typ is
155    --     built to be the Etype of N.
156    --
157    --  5. Gather the remaining record components according to the discriminant
158    --     values. This involves recursively traversing the record type
159    --     structure to see what variants are selected by the given discriminant
160    --     values. This processing is a little more convoluted if Typ is a
161    --     derived tagged types since we need to retrieve the record structure
162    --     of all the ancestors of Typ.
163    --
164    --  6. After gathering the record components we look for their values
165    --     in the record aggregate and emit appropriate error messages
166    --     should we not find such values or should they be duplicated.
167    --
168    --  7. We then make sure no illegal component names appear in the
169    --     record aggegate and make sure that the type of the record
170    --     components appearing in a same choice list is the same.
171    --     Finally we ensure that the others choice, if present, is
172    --     used to provide the value of at least a record component.
173    --
174    --  8. The original aggregate node is replaced with the new named
175    --     aggregate built in steps 3 through 6, as explained earlier.
176    --
177    --  Given the complexity of record aggregate resolution, the primary
178    --  goal of this routine is clarity and simplicity rather than execution
179    --  and storage efficiency. If there are only positional components in the
180    --  aggregate the running time is linear. If there are associations
181    --  the running time is still linear as long as the order of the
182    --  associations is not too far off the order of the components in the
183    --  record type. If this is not the case the running time is at worst
184    --  quadratic in the size of the association list.
185
186    procedure Check_Misspelled_Component
187      (Elements      : Elist_Id;
188       Component     : Node_Id);
189    --  Give possible misspelling diagnostic if Component is likely to be
190    --  a misspelling of one of the components of the Assoc_List.
191    --  This is called by Resolv_Aggr_Expr after producing
192    --  an invalid component error message.
193
194    procedure Check_Static_Discriminated_Subtype (T : Entity_Id; V : Node_Id);
195    --  An optimization: determine whether a discriminated subtype has a
196    --  static constraint, and contains array components whose length is also
197    --  static, either because they are constrained by the discriminant, or
198    --  because the original component bounds are static.
199
200    -----------------------------------------------------
201    -- Subprograms used for ARRAY AGGREGATE Processing --
202    -----------------------------------------------------
203
204    function Resolve_Array_Aggregate
205      (N              : Node_Id;
206       Index          : Node_Id;
207       Index_Constr   : Node_Id;
208       Component_Typ  : Entity_Id;
209       Others_Allowed : Boolean)
210       return           Boolean;
211    --  This procedure performs the semantic checks for an array aggregate.
212    --  True is returned if the aggregate resolution succeeds.
213    --  The procedure works by recursively checking each nested aggregate.
214    --  Specifically, after checking a sub-aggregate nested at the i-th level
215    --  we recursively check all the subaggregates at the i+1-st level (if any).
216    --  Note that for aggregates analysis and resolution go hand in hand.
217    --  Aggregate analysis has been delayed up to here and it is done while
218    --  resolving the aggregate.
219    --
220    --    N is the current N_Aggregate node to be checked.
221    --
222    --    Index is the index node corresponding to the array sub-aggregate that
223    --    we are currently checking (RM 4.3.3 (8)). Its Etype is the
224    --    corresponding index type (or subtype).
225    --
226    --    Index_Constr is the node giving the applicable index constraint if
227    --    any (RM 4.3.3 (10)). It "is a constraint provided by certain
228    --    contexts [...] that can be used to determine the bounds of the array
229    --    value specified by the aggregate". If Others_Allowed below is False
230    --    there is no applicable index constraint and this node is set to Index.
231    --
232    --    Component_Typ is the array component type.
233    --
234    --    Others_Allowed indicates whether an others choice is allowed
235    --    in the context where the top-level aggregate appeared.
236    --
237    --  The algorithm of Resolve_Array_Aggregate proceeds as follows:
238    --
239    --  1. Make sure that the others choice, if present, is by itself and
240    --     appears last in the sub-aggregate. Check that we do not have
241    --     positional and named components in the array sub-aggregate (unless
242    --     the named association is an others choice). Finally if an others
243    --     choice is present, make sure it is allowed in the aggregate contex.
244    --
245    --  2. If the array sub-aggregate contains discrete_choices:
246    --
247    --     (A) Verify their validity. Specifically verify that:
248    --
249    --        (a) If a null range is present it must be the only possible
250    --            choice in the array aggregate.
251    --
252    --        (b) Ditto for a non static range.
253    --
254    --        (c) Ditto for a non static expression.
255    --
256    --        In addition this step analyzes and resolves each discrete_choice,
257    --        making sure that its type is the type of the corresponding Index.
258    --        If we are not at the lowest array aggregate level (in the case of
259    --        multi-dimensional aggregates) then invoke Resolve_Array_Aggregate
260    --        recursively on each component expression. Otherwise, resolve the
261    --        bottom level component expressions against the expected component
262    --        type ONLY IF the component corresponds to a single discrete choice
263    --        which is not an others choice (to see why read the DELAYED
264    --        COMPONENT RESOLUTION below).
265    --
266    --     (B) Determine the bounds of the sub-aggregate and lowest and
267    --         highest choice values.
268    --
269    --  3. For positional aggregates:
270    --
271    --     (A) Loop over the component expressions either recursively invoking
272    --         Resolve_Array_Aggregate on each of these for multi-dimensional
273    --         array aggregates or resolving the bottom level component
274    --         expressions against the expected component type.
275    --
276    --     (B) Determine the bounds of the positional sub-aggregates.
277    --
278    --  4. Try to determine statically whether the evaluation of the array
279    --     sub-aggregate raises Constraint_Error. If yes emit proper
280    --     warnings. The precise checks are the following:
281    --
282    --     (A) Check that the index range defined by aggregate bounds is
283    --         compatible with corresponding index subtype.
284    --         We also check against the base type. In fact it could be that
285    --         Low/High bounds of the base type are static whereas those of
286    --         the index subtype are not. Thus if we can statically catch
287    --         a problem with respect to the base type we are guaranteed
288    --         that the same problem will arise with the index subtype
289    --
290    --     (B) If we are dealing with a named aggregate containing an others
291    --         choice and at least one discrete choice then make sure the range
292    --         specified by the discrete choices does not overflow the
293    --         aggregate bounds. We also check against the index type and base
294    --         type bounds for the same reasons given in (A).
295    --
296    --     (C) If we are dealing with a positional aggregate with an others
297    --         choice make sure the number of positional elements specified
298    --         does not overflow the aggregate bounds. We also check against
299    --         the index type and base type bounds as mentioned in (A).
300    --
301    --     Finally construct an N_Range node giving the sub-aggregate bounds.
302    --     Set the Aggregate_Bounds field of the sub-aggregate to be this
303    --     N_Range. The routine Array_Aggr_Subtype below uses such N_Ranges
304    --     to build the appropriate aggregate subtype. Aggregate_Bounds
305    --     information is needed during expansion.
306    --
307    --  DELAYED COMPONENT RESOLUTION: The resolution of bottom level component
308    --  expressions in an array aggregate may call Duplicate_Subexpr or some
309    --  other routine that inserts code just outside the outermost aggregate.
310    --  If the array aggregate contains discrete choices or an others choice,
311    --  this may be wrong. Consider for instance the following example.
312    --
313    --    type Rec is record
314    --       V : Integer := 0;
315    --    end record;
316    --
317    --    type Acc_Rec is access Rec;
318    --    Arr : array (1..3) of Acc_Rec := (1 .. 3 => new Rec);
319    --
320    --  Then the transformation of "new Rec" that occurs during resolution
321    --  entails the following code modifications
322    --
323    --    P7b : constant Acc_Rec := new Rec;
324    --    RecIP (P7b.all);
325    --    Arr : array (1..3) of Acc_Rec := (1 .. 3 => P7b);
326    --
327    --  This code transformation is clearly wrong, since we need to call
328    --  "new Rec" for each of the 3 array elements. To avoid this problem we
329    --  delay resolution of the components of non positional array aggregates
330    --  to the expansion phase. As an optimization, if the discrete choice
331    --  specifies a single value we do not delay resolution.
332
333    function Array_Aggr_Subtype (N : Node_Id; Typ : Node_Id) return Entity_Id;
334    --  This routine returns the type or subtype of an array aggregate.
335    --
336    --    N is the array aggregate node whose type we return.
337    --
338    --    Typ is the context type in which N occurs.
339    --
340    --  This routine creates an implicit array subtype whose bounds are
341    --  those defined by the aggregate. When this routine is invoked
342    --  Resolve_Array_Aggregate has already processed aggregate N. Thus the
343    --  Aggregate_Bounds of each sub-aggregate, is an N_Range node giving the
344    --  sub-aggregate bounds. When building the aggegate itype, this function
345    --  traverses the array aggregate N collecting such Aggregate_Bounds and
346    --  constructs the proper array aggregate itype.
347    --
348    --  Note that in the case of multidimensional aggregates each inner
349    --  sub-aggregate corresponding to a given array dimension, may provide a
350    --  different bounds. If it is possible to determine statically that
351    --  some sub-aggregates corresponding to the same index do not have the
352    --  same bounds, then a warning is emitted. If such check is not possible
353    --  statically (because some sub-aggregate bounds are dynamic expressions)
354    --  then this job is left to the expander. In all cases the particular
355    --  bounds that this function will chose for a given dimension is the first
356    --  N_Range node for a sub-aggregate corresponding to that dimension.
357    --
358    --  Note that the Raises_Constraint_Error flag of an array aggregate
359    --  whose evaluation is determined to raise CE by Resolve_Array_Aggregate,
360    --  is set in Resolve_Array_Aggregate but the aggregate is not
361    --  immediately replaced with a raise CE. In fact, Array_Aggr_Subtype must
362    --  first construct the proper itype for the aggregate (Gigi needs
363    --  this). After constructing the proper itype we will eventually  replace
364    --  the top-level aggregate with a raise CE (done in Resolve_Aggregate).
365    --  Of course in cases such as:
366    --
367    --     type Arr is array (integer range <>) of Integer;
368    --     A : Arr := (positive range -1 .. 2 => 0);
369    --
370    --  The bounds of the aggregate itype are cooked up to look reasonable
371    --  (in this particular case the bounds will be 1 .. 2).
372
373    procedure Aggregate_Constraint_Checks
374      (Exp       : Node_Id;
375       Check_Typ : Entity_Id);
376    --  Checks expression Exp against subtype Check_Typ. If Exp is an
377    --  aggregate and Check_Typ a constrained record type with discriminants,
378    --  we generate the appropriate discriminant checks. If Exp is an array
379    --  aggregate then emit the appropriate length checks. If Exp is a scalar
380    --  type, or a string literal, Exp is changed into Check_Typ'(Exp) to
381    --  ensure that range checks are performed at run time.
382
383    procedure Make_String_Into_Aggregate (N : Node_Id);
384    --  A string literal can appear in  a context in  which a one dimensional
385    --  array of characters is expected. This procedure simply rewrites the
386    --  string as an aggregate, prior to resolution.
387
388    ---------------------------------
389    -- Aggregate_Constraint_Checks --
390    ---------------------------------
391
392    procedure Aggregate_Constraint_Checks
393      (Exp       : Node_Id;
394       Check_Typ : Entity_Id)
395    is
396       Exp_Typ : constant Entity_Id  := Etype (Exp);
397
398    begin
399       if Raises_Constraint_Error (Exp) then
400          return;
401       end if;
402
403       --  This is really expansion activity, so make sure that expansion
404       --  is on and is allowed.
405
406       if not Expander_Active or else In_Default_Expression then
407          return;
408       end if;
409
410       --  First check if we have to insert discriminant checks
411
412       if Has_Discriminants (Exp_Typ) then
413          Apply_Discriminant_Check (Exp, Check_Typ);
414
415       --  Next emit length checks for array aggregates
416
417       elsif Is_Array_Type (Exp_Typ) then
418          Apply_Length_Check (Exp, Check_Typ);
419
420       --  Finally emit scalar and string checks. If we are dealing with a
421       --  scalar literal we need to check by hand because the Etype of
422       --  literals is not necessarily correct.
423
424       elsif Is_Scalar_Type (Exp_Typ)
425         and then Compile_Time_Known_Value (Exp)
426       then
427          if Is_Out_Of_Range (Exp, Base_Type (Check_Typ)) then
428             Apply_Compile_Time_Constraint_Error
429               (Exp, "value not in range of}?", CE_Range_Check_Failed,
430                Ent => Base_Type (Check_Typ),
431                Typ => Base_Type (Check_Typ));
432
433          elsif Is_Out_Of_Range (Exp, Check_Typ) then
434             Apply_Compile_Time_Constraint_Error
435               (Exp, "value not in range of}?", CE_Range_Check_Failed,
436                Ent => Check_Typ,
437                Typ => Check_Typ);
438
439          elsif not Range_Checks_Suppressed (Check_Typ) then
440             Apply_Scalar_Range_Check (Exp, Check_Typ);
441          end if;
442
443       elsif (Is_Scalar_Type (Exp_Typ)
444              or else Nkind (Exp) = N_String_Literal)
445         and then Exp_Typ /= Check_Typ
446       then
447          if Is_Entity_Name (Exp)
448            and then Ekind (Entity (Exp)) = E_Constant
449          then
450             --  If expression is a constant, it is worthwhile checking whether
451             --  it is a bound of the type.
452
453             if (Is_Entity_Name (Type_Low_Bound (Check_Typ))
454                  and then Entity (Exp) = Entity (Type_Low_Bound (Check_Typ)))
455               or else (Is_Entity_Name (Type_High_Bound (Check_Typ))
456                 and then Entity (Exp) = Entity (Type_High_Bound (Check_Typ)))
457             then
458                return;
459
460             else
461                Rewrite (Exp, Convert_To (Check_Typ, Relocate_Node (Exp)));
462                Analyze_And_Resolve (Exp, Check_Typ);
463                Check_Unset_Reference (Exp);
464             end if;
465          else
466             Rewrite (Exp, Convert_To (Check_Typ, Relocate_Node (Exp)));
467             Analyze_And_Resolve (Exp, Check_Typ);
468             Check_Unset_Reference (Exp);
469          end if;
470
471       --  Ada 2005 (AI-231): Generate conversion to the null-excluding
472       --  type to force the corresponding run-time check
473
474       elsif Is_Access_Type (Check_Typ)
475         and then Can_Never_Be_Null (Check_Typ)
476         and then not Can_Never_Be_Null (Exp_Typ)
477       then
478          Rewrite (Exp, Convert_To (Check_Typ, Relocate_Node (Exp)));
479          Analyze_And_Resolve (Exp, Check_Typ);
480          Check_Unset_Reference (Exp);
481       end if;
482    end Aggregate_Constraint_Checks;
483
484    ------------------------
485    -- Array_Aggr_Subtype --
486    ------------------------
487
488    function Array_Aggr_Subtype
489      (N    : Node_Id;
490       Typ  : Entity_Id)
491       return Entity_Id
492    is
493       Aggr_Dimension : constant Pos := Number_Dimensions (Typ);
494       --  Number of aggregate index dimensions.
495
496       Aggr_Range : array (1 .. Aggr_Dimension) of Node_Id := (others => Empty);
497       --  Constrained N_Range of each index dimension in our aggregate itype.
498
499       Aggr_Low   : array (1 .. Aggr_Dimension) of Node_Id := (others => Empty);
500       Aggr_High  : array (1 .. Aggr_Dimension) of Node_Id := (others => Empty);
501       --  Low and High bounds for each index dimension in our aggregate itype.
502
503       Is_Fully_Positional : Boolean := True;
504
505       procedure Collect_Aggr_Bounds (N : Node_Id; Dim : Pos);
506       --  N is an array (sub-)aggregate. Dim is the dimension corresponding to
507       --  (sub-)aggregate N. This procedure collects the constrained N_Range
508       --  nodes corresponding to each index dimension of our aggregate itype.
509       --  These N_Range nodes are collected in Aggr_Range above.
510       --  Likewise collect in Aggr_Low & Aggr_High above the low and high
511       --  bounds of each index dimension. If, when collecting, two bounds
512       --  corresponding to the same dimension are static and found to differ,
513       --  then emit a warning, and mark N as raising Constraint_Error.
514
515       -------------------------
516       -- Collect_Aggr_Bounds --
517       -------------------------
518
519       procedure Collect_Aggr_Bounds (N : Node_Id; Dim : Pos) is
520          This_Range : constant Node_Id := Aggregate_Bounds (N);
521          --  The aggregate range node of this specific sub-aggregate.
522
523          This_Low  : constant Node_Id := Low_Bound (Aggregate_Bounds (N));
524          This_High : constant Node_Id := High_Bound (Aggregate_Bounds (N));
525          --  The aggregate bounds of this specific sub-aggregate.
526
527          Assoc : Node_Id;
528          Expr  : Node_Id;
529
530       begin
531          --  Collect the first N_Range for a given dimension that you find.
532          --  For a given dimension they must be all equal anyway.
533
534          if No (Aggr_Range (Dim)) then
535             Aggr_Low (Dim)   := This_Low;
536             Aggr_High (Dim)  := This_High;
537             Aggr_Range (Dim) := This_Range;
538
539          else
540             if Compile_Time_Known_Value (This_Low) then
541                if not Compile_Time_Known_Value (Aggr_Low (Dim)) then
542                   Aggr_Low (Dim)  := This_Low;
543
544                elsif Expr_Value (This_Low) /= Expr_Value (Aggr_Low (Dim)) then
545                   Set_Raises_Constraint_Error (N);
546                   Error_Msg_N ("Sub-aggregate low bound mismatch?", N);
547                   Error_Msg_N ("Constraint_Error will be raised at run-time?",
548                                N);
549                end if;
550             end if;
551
552             if Compile_Time_Known_Value (This_High) then
553                if not Compile_Time_Known_Value (Aggr_High (Dim)) then
554                   Aggr_High (Dim)  := This_High;
555
556                elsif
557                  Expr_Value (This_High) /= Expr_Value (Aggr_High (Dim))
558                then
559                   Set_Raises_Constraint_Error (N);
560                   Error_Msg_N ("Sub-aggregate high bound mismatch?", N);
561                   Error_Msg_N ("Constraint_Error will be raised at run-time?",
562                                N);
563                end if;
564             end if;
565          end if;
566
567          if Dim < Aggr_Dimension then
568
569             --  Process positional components
570
571             if Present (Expressions (N)) then
572                Expr := First (Expressions (N));
573                while Present (Expr) loop
574                   Collect_Aggr_Bounds (Expr, Dim + 1);
575                   Next (Expr);
576                end loop;
577             end if;
578
579             --  Process component associations
580
581             if Present (Component_Associations (N)) then
582                Is_Fully_Positional := False;
583
584                Assoc := First (Component_Associations (N));
585                while Present (Assoc) loop
586                   Expr := Expression (Assoc);
587                   Collect_Aggr_Bounds (Expr, Dim + 1);
588                   Next (Assoc);
589                end loop;
590             end if;
591          end if;
592       end Collect_Aggr_Bounds;
593
594       --  Array_Aggr_Subtype variables
595
596       Itype : Entity_Id;
597       --  the final itype of the overall aggregate
598
599       Index_Constraints : constant List_Id := New_List;
600       --  The list of index constraints of the aggregate itype.
601
602    --  Start of processing for Array_Aggr_Subtype
603
604    begin
605       --  Make sure that the list of index constraints is properly attached
606       --  to the tree, and then collect the aggregate bounds.
607
608       Set_Parent (Index_Constraints, N);
609       Collect_Aggr_Bounds (N, 1);
610
611       --  Build the list of constrained indices of our aggregate itype.
612
613       for J in 1 .. Aggr_Dimension loop
614          Create_Index : declare
615             Index_Base : constant Entity_Id :=
616                            Base_Type (Etype (Aggr_Range (J)));
617             Index_Typ  : Entity_Id;
618
619          begin
620             --  Construct the Index subtype
621
622             Index_Typ := Create_Itype (Subtype_Kind (Ekind (Index_Base)), N);
623
624             Set_Etype (Index_Typ, Index_Base);
625
626             if Is_Character_Type (Index_Base) then
627                Set_Is_Character_Type (Index_Typ);
628             end if;
629
630             Set_Size_Info      (Index_Typ,                (Index_Base));
631             Set_RM_Size        (Index_Typ, RM_Size        (Index_Base));
632             Set_First_Rep_Item (Index_Typ, First_Rep_Item (Index_Base));
633             Set_Scalar_Range   (Index_Typ, Aggr_Range (J));
634
635             if Is_Discrete_Or_Fixed_Point_Type (Index_Typ) then
636                Set_RM_Size (Index_Typ, UI_From_Int (Minimum_Size (Index_Typ)));
637             end if;
638
639             Set_Etype (Aggr_Range (J), Index_Typ);
640
641             Append (Aggr_Range (J), To => Index_Constraints);
642          end Create_Index;
643       end loop;
644
645       --  Now build the Itype
646
647       Itype := Create_Itype (E_Array_Subtype, N);
648
649       Set_First_Rep_Item         (Itype, First_Rep_Item         (Typ));
650       Set_Convention             (Itype, Convention             (Typ));
651       Set_Depends_On_Private     (Itype, Has_Private_Component  (Typ));
652       Set_Etype                  (Itype, Base_Type              (Typ));
653       Set_Has_Alignment_Clause   (Itype, Has_Alignment_Clause   (Typ));
654       Set_Is_Aliased             (Itype, Is_Aliased             (Typ));
655       Set_Depends_On_Private     (Itype, Depends_On_Private     (Typ));
656
657       Copy_Suppress_Status (Index_Check,  Typ, Itype);
658       Copy_Suppress_Status (Length_Check, Typ, Itype);
659
660       Set_First_Index    (Itype, First (Index_Constraints));
661       Set_Is_Constrained (Itype, True);
662       Set_Is_Internal    (Itype, True);
663       Init_Size_Align    (Itype);
664
665       --  A simple optimization: purely positional aggregates of static
666       --  components should be passed to gigi unexpanded whenever possible,
667       --  and regardless of the staticness of the bounds themselves. Subse-
668       --  quent checks in exp_aggr verify that type is not packed, etc.
669
670       Set_Size_Known_At_Compile_Time (Itype,
671          Is_Fully_Positional
672            and then Comes_From_Source (N)
673            and then Size_Known_At_Compile_Time (Component_Type (Typ)));
674
675       --  We always need a freeze node for a packed array subtype, so that
676       --  we can build the Packed_Array_Type corresponding to the subtype.
677       --  If expansion is disabled, the packed array subtype is not built,
678       --  and we must not generate a freeze node for the type, or else it
679       --  will appear incomplete to gigi.
680
681       if Is_Packed (Itype) and then not In_Default_Expression
682         and then Expander_Active
683       then
684          Freeze_Itype (Itype, N);
685       end if;
686
687       return Itype;
688    end Array_Aggr_Subtype;
689
690    --------------------------------
691    -- Check_Misspelled_Component --
692    --------------------------------
693
694    procedure Check_Misspelled_Component
695      (Elements      : Elist_Id;
696       Component     : Node_Id)
697    is
698       Max_Suggestions   : constant := 2;
699
700       Nr_Of_Suggestions : Natural := 0;
701       Suggestion_1      : Entity_Id := Empty;
702       Suggestion_2      : Entity_Id := Empty;
703       Component_Elmt    : Elmt_Id;
704
705    begin
706       --  All the components of List are matched against Component and
707       --  a count is maintained of possible misspellings. When at the
708       --  end of the analysis there are one or two (not more!) possible
709       --  misspellings, these misspellings will be suggested as
710       --  possible correction.
711
712       Get_Name_String (Chars (Component));
713
714       declare
715          S  : constant String (1 .. Name_Len) :=
716                 Name_Buffer (1 .. Name_Len);
717
718       begin
719
720          Component_Elmt := First_Elmt (Elements);
721
722          while Nr_Of_Suggestions <= Max_Suggestions
723             and then Present (Component_Elmt)
724          loop
725
726             Get_Name_String (Chars (Node (Component_Elmt)));
727
728             if Is_Bad_Spelling_Of (Name_Buffer (1 .. Name_Len), S) then
729                Nr_Of_Suggestions := Nr_Of_Suggestions + 1;
730
731                case Nr_Of_Suggestions is
732                   when 1      => Suggestion_1 := Node (Component_Elmt);
733                   when 2      => Suggestion_2 := Node (Component_Elmt);
734                   when others => exit;
735                end case;
736             end if;
737
738             Next_Elmt (Component_Elmt);
739          end loop;
740
741          --  Report at most two suggestions
742
743          if Nr_Of_Suggestions = 1 then
744             Error_Msg_NE ("\possible misspelling of&",
745                Component, Suggestion_1);
746
747          elsif Nr_Of_Suggestions = 2 then
748             Error_Msg_Node_2 := Suggestion_2;
749             Error_Msg_NE ("\possible misspelling of& or&",
750               Component, Suggestion_1);
751          end if;
752       end;
753    end Check_Misspelled_Component;
754
755    ----------------------------------------
756    -- Check_Static_Discriminated_Subtype --
757    ----------------------------------------
758
759    procedure Check_Static_Discriminated_Subtype (T : Entity_Id; V : Node_Id) is
760       Disc : constant Entity_Id := First_Discriminant (T);
761       Comp : Entity_Id;
762       Ind  : Entity_Id;
763
764    begin
765       if Has_Record_Rep_Clause (T) then
766          return;
767
768       elsif Present (Next_Discriminant (Disc)) then
769          return;
770
771       elsif Nkind (V) /= N_Integer_Literal then
772          return;
773       end if;
774
775       Comp := First_Component (T);
776
777       while Present (Comp) loop
778
779          if Is_Scalar_Type (Etype (Comp)) then
780             null;
781
782          elsif Is_Private_Type (Etype (Comp))
783            and then Present (Full_View (Etype (Comp)))
784            and then Is_Scalar_Type (Full_View (Etype (Comp)))
785          then
786             null;
787
788          elsif Is_Array_Type (Etype (Comp)) then
789
790             if Is_Bit_Packed_Array (Etype (Comp)) then
791                return;
792             end if;
793
794             Ind := First_Index (Etype (Comp));
795
796             while Present (Ind) loop
797
798                if Nkind (Ind) /= N_Range
799                  or else Nkind (Low_Bound (Ind)) /= N_Integer_Literal
800                  or else Nkind (High_Bound (Ind)) /= N_Integer_Literal
801                then
802                   return;
803                end if;
804
805                Next_Index (Ind);
806             end loop;
807
808          else
809             return;
810          end if;
811
812          Next_Component (Comp);
813       end loop;
814
815       --  On exit, all components have statically known sizes.
816
817       Set_Size_Known_At_Compile_Time (T);
818    end Check_Static_Discriminated_Subtype;
819
820    --------------------------------
821    -- Make_String_Into_Aggregate --
822    --------------------------------
823
824    procedure Make_String_Into_Aggregate (N : Node_Id) is
825       Exprs  : constant List_Id    := New_List;
826       Loc    : constant Source_Ptr := Sloc (N);
827       Str    : constant String_Id  := Strval (N);
828       Strlen : constant Nat        := String_Length (Str);
829       C      : Char_Code;
830       C_Node : Node_Id;
831       New_N  : Node_Id;
832       P      : Source_Ptr;
833
834    begin
835       P := Loc + 1;
836       for J in  1 .. Strlen loop
837          C := Get_String_Char (Str, J);
838          Set_Character_Literal_Name (C);
839
840          C_Node :=  Make_Character_Literal (P, Name_Find, C);
841          Set_Etype (C_Node, Any_Character);
842          Append_To (Exprs, C_Node);
843
844          P := P + 1;
845          --  something special for wide strings ???
846       end loop;
847
848       New_N := Make_Aggregate (Loc, Expressions => Exprs);
849       Set_Analyzed (New_N);
850       Set_Etype (New_N, Any_Composite);
851
852       Rewrite (N, New_N);
853    end Make_String_Into_Aggregate;
854
855    -----------------------
856    -- Resolve_Aggregate --
857    -----------------------
858
859    procedure Resolve_Aggregate (N : Node_Id; Typ : Entity_Id) is
860       Pkind : constant Node_Kind := Nkind (Parent (N));
861
862       Aggr_Subtyp : Entity_Id;
863       --  The actual aggregate subtype. This is not necessarily the same as Typ
864       --  which is the subtype of the context in which the aggregate was found.
865
866    begin
867       --  Check for aggregates not allowed in configurable run-time mode.
868       --  We allow all cases of aggregates that do not come from source,
869       --  since these are all assumed to be small (e.g. bounds of a string
870       --  literal). We also allow aggregates of types we know to be small.
871
872       if not Support_Aggregates_On_Target
873         and then Comes_From_Source (N)
874         and then (not Known_Static_Esize (Typ) or else Esize (Typ) > 64)
875       then
876          Error_Msg_CRT ("aggregate", N);
877       end if;
878
879       if Is_Limited_Composite (Typ) then
880          Error_Msg_N ("aggregate type cannot have limited component", N);
881          Explain_Limited_Type (Typ, N);
882
883       --  Ada 2005 (AI-287): Limited aggregates allowed
884
885       elsif Is_Limited_Type (Typ)
886         and Ada_Version < Ada_05
887       then
888          Error_Msg_N ("aggregate type cannot be limited", N);
889          Explain_Limited_Type (Typ, N);
890
891       elsif Is_Class_Wide_Type (Typ) then
892          Error_Msg_N ("type of aggregate cannot be class-wide", N);
893
894       elsif Typ = Any_String
895         or else Typ = Any_Composite
896       then
897          Error_Msg_N ("no unique type for aggregate", N);
898          Set_Etype (N, Any_Composite);
899
900       elsif Is_Array_Type (Typ) and then Null_Record_Present (N) then
901          Error_Msg_N ("null record forbidden in array aggregate", N);
902
903       elsif Is_Record_Type (Typ) then
904          Resolve_Record_Aggregate (N, Typ);
905
906       elsif Is_Array_Type (Typ) then
907
908          --  First a special test, for the case of a positional aggregate
909          --  of characters which can be replaced by a string literal.
910          --  Do not perform this transformation if this was a string literal
911          --  to start with, whose components needed constraint checks, or if
912          --  the component type is non-static, because it will require those
913          --  checks and be transformed back into an aggregate.
914
915          if Number_Dimensions (Typ) = 1
916            and then
917              (Root_Type (Component_Type (Typ)) = Standard_Character
918                or else
919               Root_Type (Component_Type (Typ)) = Standard_Wide_Character)
920            and then No (Component_Associations (N))
921            and then not Is_Limited_Composite (Typ)
922            and then not Is_Private_Composite (Typ)
923            and then not Is_Bit_Packed_Array (Typ)
924            and then Nkind (Original_Node (Parent (N))) /= N_String_Literal
925            and then Is_Static_Subtype (Component_Type (Typ))
926          then
927             declare
928                Expr : Node_Id;
929
930             begin
931                Expr := First (Expressions (N));
932                while Present (Expr) loop
933                   exit when Nkind (Expr) /= N_Character_Literal;
934                   Next (Expr);
935                end loop;
936
937                if No (Expr) then
938                   Start_String;
939
940                   Expr := First (Expressions (N));
941                   while Present (Expr) loop
942                      Store_String_Char (Char_Literal_Value (Expr));
943                      Next (Expr);
944                   end loop;
945
946                   Rewrite (N,
947                     Make_String_Literal (Sloc (N), End_String));
948
949                   Analyze_And_Resolve (N, Typ);
950                   return;
951                end if;
952             end;
953          end if;
954
955          --  Here if we have a real aggregate to deal with
956
957          Array_Aggregate : declare
958             Aggr_Resolved : Boolean;
959
960             Aggr_Typ : constant Entity_Id := Etype (Typ);
961             --  This is the unconstrained array type, which is the type
962             --  against which the aggregate is to be resolved. Typ itself
963             --  is the array type of the context which may not be the same
964             --  subtype as the subtype for the final aggregate.
965
966          begin
967             --  In the following we determine whether an others choice is
968             --  allowed inside the array aggregate. The test checks the context
969             --  in which the array aggregate occurs. If the context does not
970             --  permit it, or the aggregate type is unconstrained, an others
971             --  choice is not allowed.
972             --
973             --  Note that there is no node for Explicit_Actual_Parameter.
974             --  To test for this context we therefore have to test for node
975             --  N_Parameter_Association which itself appears only if there is a
976             --  formal parameter. Consequently we also need to test for
977             --  N_Procedure_Call_Statement or N_Function_Call.
978
979             Set_Etype (N, Aggr_Typ);  --  may be overridden later on
980
981             --  Ada 2005 (AI-231): Propagate the null_exclusion attribute to
982             --  the components of the array aggregate
983
984             if Ada_Version >= Ada_05 then
985                Set_Can_Never_Be_Null (Aggr_Typ, Can_Never_Be_Null (Typ));
986             end if;
987
988             if Is_Constrained (Typ) and then
989               (Pkind = N_Assignment_Statement      or else
990                Pkind = N_Parameter_Association     or else
991                Pkind = N_Function_Call             or else
992                Pkind = N_Procedure_Call_Statement  or else
993                Pkind = N_Generic_Association       or else
994                Pkind = N_Formal_Object_Declaration or else
995                Pkind = N_Return_Statement          or else
996                Pkind = N_Object_Declaration        or else
997                Pkind = N_Component_Declaration     or else
998                Pkind = N_Parameter_Specification   or else
999                Pkind = N_Qualified_Expression      or else
1000                Pkind = N_Aggregate                 or else
1001                Pkind = N_Extension_Aggregate       or else
1002                Pkind = N_Component_Association)
1003             then
1004                Aggr_Resolved :=
1005                  Resolve_Array_Aggregate
1006                    (N,
1007                     Index          => First_Index (Aggr_Typ),
1008                     Index_Constr   => First_Index (Typ),
1009                     Component_Typ  => Component_Type (Typ),
1010                     Others_Allowed => True);
1011
1012             else
1013                Aggr_Resolved :=
1014                  Resolve_Array_Aggregate
1015                    (N,
1016                     Index          => First_Index (Aggr_Typ),
1017                     Index_Constr   => First_Index (Aggr_Typ),
1018                     Component_Typ  => Component_Type (Typ),
1019                     Others_Allowed => False);
1020             end if;
1021
1022             if not Aggr_Resolved then
1023                Aggr_Subtyp := Any_Composite;
1024             else
1025                Aggr_Subtyp := Array_Aggr_Subtype (N, Typ);
1026             end if;
1027
1028             Set_Etype (N, Aggr_Subtyp);
1029          end Array_Aggregate;
1030
1031       else
1032          Error_Msg_N ("illegal context for aggregate", N);
1033
1034       end if;
1035
1036       --  If we can determine statically that the evaluation of the
1037       --  aggregate raises Constraint_Error, then replace the
1038       --  aggregate with an N_Raise_Constraint_Error node, but set the
1039       --  Etype to the right aggregate subtype. Gigi needs this.
1040
1041       if Raises_Constraint_Error (N) then
1042          Aggr_Subtyp := Etype (N);
1043          Rewrite (N,
1044            Make_Raise_Constraint_Error (Sloc (N),
1045              Reason => CE_Range_Check_Failed));
1046          Set_Raises_Constraint_Error (N);
1047          Set_Etype (N, Aggr_Subtyp);
1048          Set_Analyzed (N);
1049       end if;
1050    end Resolve_Aggregate;
1051
1052    -----------------------------
1053    -- Resolve_Array_Aggregate --
1054    -----------------------------
1055
1056    function Resolve_Array_Aggregate
1057      (N              : Node_Id;
1058       Index          : Node_Id;
1059       Index_Constr   : Node_Id;
1060       Component_Typ  : Entity_Id;
1061       Others_Allowed : Boolean)
1062       return           Boolean
1063    is
1064       Loc : constant Source_Ptr := Sloc (N);
1065
1066       Failure : constant Boolean := False;
1067       Success : constant Boolean := True;
1068
1069       Index_Typ      : constant Entity_Id := Etype (Index);
1070       Index_Typ_Low  : constant Node_Id   := Type_Low_Bound  (Index_Typ);
1071       Index_Typ_High : constant Node_Id   := Type_High_Bound (Index_Typ);
1072       --  The type of the index corresponding to the array sub-aggregate
1073       --  along with its low and upper bounds
1074
1075       Index_Base      : constant Entity_Id := Base_Type (Index_Typ);
1076       Index_Base_Low  : constant Node_Id   := Type_Low_Bound (Index_Base);
1077       Index_Base_High : constant Node_Id   := Type_High_Bound (Index_Base);
1078       --  ditto for the base type
1079
1080       function Add (Val : Uint; To : Node_Id) return Node_Id;
1081       --  Creates a new expression node where Val is added to expression To.
1082       --  Tries to constant fold whenever possible. To must be an already
1083       --  analyzed expression.
1084
1085       procedure Check_Bound (BH : Node_Id; AH : in out Node_Id);
1086       --  Checks that AH (the upper bound of an array aggregate) is <= BH
1087       --  (the upper bound of the index base type). If the check fails a
1088       --  warning is emitted, the Raises_Constraint_Error Flag of N is set,
1089       --  and AH is replaced with a duplicate of BH.
1090
1091       procedure Check_Bounds (L, H : Node_Id; AL, AH : Node_Id);
1092       --  Checks that range AL .. AH is compatible with range L .. H. Emits a
1093       --  warning if not and sets the Raises_Constraint_Error Flag in N.
1094
1095       procedure Check_Length (L, H : Node_Id; Len : Uint);
1096       --  Checks that range L .. H contains at least Len elements. Emits a
1097       --  warning if not and sets the Raises_Constraint_Error Flag in N.
1098
1099       function Dynamic_Or_Null_Range (L, H : Node_Id) return Boolean;
1100       --  Returns True if range L .. H is dynamic or null.
1101
1102       procedure Get (Value : out Uint; From : Node_Id; OK : out Boolean);
1103       --  Given expression node From, this routine sets OK to False if it
1104       --  cannot statically evaluate From. Otherwise it stores this static
1105       --  value into Value.
1106
1107       function Resolve_Aggr_Expr
1108         (Expr        : Node_Id;
1109          Single_Elmt : Boolean)
1110          return        Boolean;
1111       --  Resolves aggregate expression Expr. Returs False if resolution
1112       --  fails. If Single_Elmt is set to False, the expression Expr may be
1113       --  used to initialize several array aggregate elements (this can
1114       --  happen for discrete choices such as "L .. H => Expr" or the others
1115       --  choice). In this event we do not resolve Expr unless expansion is
1116       --  disabled. To know why, see the DELAYED COMPONENT RESOLUTION
1117       --  note above.
1118
1119       ---------
1120       -- Add --
1121       ---------
1122
1123       function Add (Val : Uint; To : Node_Id) return Node_Id is
1124          Expr_Pos : Node_Id;
1125          Expr     : Node_Id;
1126          To_Pos   : Node_Id;
1127
1128       begin
1129          if Raises_Constraint_Error (To) then
1130             return To;
1131          end if;
1132
1133          --  First test if we can do constant folding
1134
1135          if Compile_Time_Known_Value (To)
1136            or else Nkind (To) = N_Integer_Literal
1137          then
1138             Expr_Pos := Make_Integer_Literal (Loc, Expr_Value (To) + Val);
1139             Set_Is_Static_Expression (Expr_Pos);
1140             Set_Etype (Expr_Pos, Etype (To));
1141             Set_Analyzed (Expr_Pos, Analyzed (To));
1142
1143             if not Is_Enumeration_Type (Index_Typ) then
1144                Expr := Expr_Pos;
1145
1146             --  If we are dealing with enumeration return
1147             --     Index_Typ'Val (Expr_Pos)
1148
1149             else
1150                Expr :=
1151                  Make_Attribute_Reference
1152                    (Loc,
1153                     Prefix         => New_Reference_To (Index_Typ, Loc),
1154                     Attribute_Name => Name_Val,
1155                     Expressions    => New_List (Expr_Pos));
1156             end if;
1157
1158             return Expr;
1159          end if;
1160
1161          --  If we are here no constant folding possible
1162
1163          if not Is_Enumeration_Type (Index_Base) then
1164             Expr :=
1165               Make_Op_Add (Loc,
1166                            Left_Opnd  => Duplicate_Subexpr (To),
1167                            Right_Opnd => Make_Integer_Literal (Loc, Val));
1168
1169          --  If we are dealing with enumeration return
1170          --    Index_Typ'Val (Index_Typ'Pos (To) + Val)
1171
1172          else
1173             To_Pos :=
1174               Make_Attribute_Reference
1175                 (Loc,
1176                  Prefix         => New_Reference_To (Index_Typ, Loc),
1177                  Attribute_Name => Name_Pos,
1178                  Expressions    => New_List (Duplicate_Subexpr (To)));
1179
1180             Expr_Pos :=
1181               Make_Op_Add (Loc,
1182                            Left_Opnd  => To_Pos,
1183                            Right_Opnd => Make_Integer_Literal (Loc, Val));
1184
1185             Expr :=
1186               Make_Attribute_Reference
1187                 (Loc,
1188                  Prefix         => New_Reference_To (Index_Typ, Loc),
1189                  Attribute_Name => Name_Val,
1190                  Expressions    => New_List (Expr_Pos));
1191          end if;
1192
1193          return Expr;
1194       end Add;
1195
1196       -----------------
1197       -- Check_Bound --
1198       -----------------
1199
1200       procedure Check_Bound (BH : Node_Id; AH : in out Node_Id) is
1201          Val_BH : Uint;
1202          Val_AH : Uint;
1203
1204          OK_BH : Boolean;
1205          OK_AH : Boolean;
1206
1207       begin
1208          Get (Value => Val_BH, From => BH, OK => OK_BH);
1209          Get (Value => Val_AH, From => AH, OK => OK_AH);
1210
1211          if OK_BH and then OK_AH and then Val_BH < Val_AH then
1212             Set_Raises_Constraint_Error (N);
1213             Error_Msg_N ("upper bound out of range?", AH);
1214             Error_Msg_N ("Constraint_Error will be raised at run-time?", AH);
1215
1216             --  You need to set AH to BH or else in the case of enumerations
1217             --  indices we will not be able to resolve the aggregate bounds.
1218
1219             AH := Duplicate_Subexpr (BH);
1220          end if;
1221       end Check_Bound;
1222
1223       ------------------
1224       -- Check_Bounds --
1225       ------------------
1226
1227       procedure Check_Bounds (L, H : Node_Id; AL, AH : Node_Id) is
1228          Val_L  : Uint;
1229          Val_H  : Uint;
1230          Val_AL : Uint;
1231          Val_AH : Uint;
1232
1233          OK_L  : Boolean;
1234          OK_H  : Boolean;
1235          OK_AL : Boolean;
1236          OK_AH : Boolean;
1237
1238       begin
1239          if Raises_Constraint_Error (N)
1240            or else Dynamic_Or_Null_Range (AL, AH)
1241          then
1242             return;
1243          end if;
1244
1245          Get (Value => Val_L, From => L, OK => OK_L);
1246          Get (Value => Val_H, From => H, OK => OK_H);
1247
1248          Get (Value => Val_AL, From => AL, OK => OK_AL);
1249          Get (Value => Val_AH, From => AH, OK => OK_AH);
1250
1251          if OK_L and then Val_L > Val_AL then
1252             Set_Raises_Constraint_Error (N);
1253             Error_Msg_N ("lower bound of aggregate out of range?", N);
1254             Error_Msg_N ("\Constraint_Error will be raised at run-time?", N);
1255          end if;
1256
1257          if OK_H and then Val_H < Val_AH then
1258             Set_Raises_Constraint_Error (N);
1259             Error_Msg_N ("upper bound of aggregate out of range?", N);
1260             Error_Msg_N ("\Constraint_Error will be raised at run-time?", N);
1261          end if;
1262       end Check_Bounds;
1263
1264       ------------------
1265       -- Check_Length --
1266       ------------------
1267
1268       procedure Check_Length (L, H : Node_Id; Len : Uint) is
1269          Val_L  : Uint;
1270          Val_H  : Uint;
1271
1272          OK_L  : Boolean;
1273          OK_H  : Boolean;
1274
1275          Range_Len : Uint;
1276
1277       begin
1278          if Raises_Constraint_Error (N) then
1279             return;
1280          end if;
1281
1282          Get (Value => Val_L, From => L, OK => OK_L);
1283          Get (Value => Val_H, From => H, OK => OK_H);
1284
1285          if not OK_L or else not OK_H then
1286             return;
1287          end if;
1288
1289          --  If null range length is zero
1290
1291          if Val_L > Val_H then
1292             Range_Len := Uint_0;
1293          else
1294             Range_Len := Val_H - Val_L + 1;
1295          end if;
1296
1297          if Range_Len < Len then
1298             Set_Raises_Constraint_Error (N);
1299             Error_Msg_N ("Too many elements?", N);
1300             Error_Msg_N ("Constraint_Error will be raised at run-time?", N);
1301          end if;
1302       end Check_Length;
1303
1304       ---------------------------
1305       -- Dynamic_Or_Null_Range --
1306       ---------------------------
1307
1308       function Dynamic_Or_Null_Range (L, H : Node_Id) return Boolean is
1309          Val_L : Uint;
1310          Val_H : Uint;
1311
1312          OK_L  : Boolean;
1313          OK_H  : Boolean;
1314
1315       begin
1316          Get (Value => Val_L, From => L, OK => OK_L);
1317          Get (Value => Val_H, From => H, OK => OK_H);
1318
1319          return not OK_L or else not OK_H
1320            or else not Is_OK_Static_Expression (L)
1321            or else not Is_OK_Static_Expression (H)
1322            or else Val_L > Val_H;
1323       end Dynamic_Or_Null_Range;
1324
1325       ---------
1326       -- Get --
1327       ---------
1328
1329       procedure Get (Value : out Uint; From : Node_Id; OK : out Boolean) is
1330       begin
1331          OK := True;
1332
1333          if Compile_Time_Known_Value (From) then
1334             Value := Expr_Value (From);
1335
1336          --  If expression From is something like Some_Type'Val (10) then
1337          --  Value = 10
1338
1339          elsif Nkind (From) = N_Attribute_Reference
1340            and then Attribute_Name (From) = Name_Val
1341            and then Compile_Time_Known_Value (First (Expressions (From)))
1342          then
1343             Value := Expr_Value (First (Expressions (From)));
1344
1345          else
1346             Value := Uint_0;
1347             OK := False;
1348          end if;
1349       end Get;
1350
1351       -----------------------
1352       -- Resolve_Aggr_Expr --
1353       -----------------------
1354
1355       function Resolve_Aggr_Expr
1356         (Expr        : Node_Id;
1357          Single_Elmt : Boolean)
1358          return        Boolean
1359       is
1360          Nxt_Ind        : constant Node_Id := Next_Index (Index);
1361          Nxt_Ind_Constr : constant Node_Id := Next_Index (Index_Constr);
1362          --  Index is the current index corresponding to the expresion.
1363
1364          Resolution_OK : Boolean := True;
1365          --  Set to False if resolution of the expression failed.
1366
1367       begin
1368          --  If the array type against which we are resolving the aggregate
1369          --  has several dimensions, the expressions nested inside the
1370          --  aggregate must be further aggregates (or strings).
1371
1372          if Present (Nxt_Ind) then
1373             if Nkind (Expr) /= N_Aggregate then
1374
1375                --  A string literal can appear where a one-dimensional array
1376                --  of characters is expected. If the literal looks like an
1377                --  operator, it is still an operator symbol, which will be
1378                --  transformed into a string when analyzed.
1379
1380                if Is_Character_Type (Component_Typ)
1381                  and then No (Next_Index (Nxt_Ind))
1382                  and then (Nkind (Expr) = N_String_Literal
1383                             or else Nkind (Expr) = N_Operator_Symbol)
1384                then
1385                   --  A string literal used in a multidimensional array
1386                   --  aggregate in place of the final one-dimensional
1387                   --  aggregate must not be enclosed in parentheses.
1388
1389                   if Paren_Count (Expr) /= 0 then
1390                      Error_Msg_N ("No parenthesis allowed here", Expr);
1391                   end if;
1392
1393                   Make_String_Into_Aggregate (Expr);
1394
1395                else
1396                   Error_Msg_N ("nested array aggregate expected", Expr);
1397                   return Failure;
1398                end if;
1399             end if;
1400
1401             --  Ada 2005 (AI-231): Propagate the type to the nested aggregate.
1402             --  Required to check the null-exclusion attribute (if present).
1403             --  This value may be overridden later on.
1404
1405             Set_Etype (Expr, Etype (N));
1406
1407             Resolution_OK := Resolve_Array_Aggregate
1408               (Expr, Nxt_Ind, Nxt_Ind_Constr, Component_Typ, Others_Allowed);
1409
1410          --  Do not resolve the expressions of discrete or others choices
1411          --  unless the expression covers a single component, or the expander
1412          --  is inactive.
1413
1414          elsif Single_Elmt
1415            or else not Expander_Active
1416            or else In_Default_Expression
1417          then
1418             Analyze_And_Resolve (Expr, Component_Typ);
1419             Check_Non_Static_Context (Expr);
1420             Aggregate_Constraint_Checks (Expr, Component_Typ);
1421             Check_Unset_Reference (Expr);
1422          end if;
1423
1424          if Raises_Constraint_Error (Expr)
1425            and then Nkind (Parent (Expr)) /= N_Component_Association
1426          then
1427             Set_Raises_Constraint_Error (N);
1428          end if;
1429
1430          return Resolution_OK;
1431       end Resolve_Aggr_Expr;
1432
1433       --  Variables local to Resolve_Array_Aggregate
1434
1435       Assoc   : Node_Id;
1436       Choice  : Node_Id;
1437       Expr    : Node_Id;
1438
1439       Who_Cares : Node_Id;
1440
1441       Aggr_Low  : Node_Id := Empty;
1442       Aggr_High : Node_Id := Empty;
1443       --  The actual low and high bounds of this sub-aggegate
1444
1445       Choices_Low  : Node_Id := Empty;
1446       Choices_High : Node_Id := Empty;
1447       --  The lowest and highest discrete choices values for a named aggregate
1448
1449       Nb_Elements : Uint := Uint_0;
1450       --  The number of elements in a positional aggegate
1451
1452       Others_Present : Boolean := False;
1453
1454       Nb_Choices : Nat := 0;
1455       --  Contains the overall number of named choices in this sub-aggregate
1456
1457       Nb_Discrete_Choices : Nat := 0;
1458       --  The overall number of discrete choices (not counting others choice)
1459
1460       Case_Table_Size : Nat;
1461       --  Contains the size of the case table needed to sort aggregate choices
1462
1463    --  Start of processing for Resolve_Array_Aggregate
1464
1465    begin
1466       --  STEP 1: make sure the aggregate is correctly formatted
1467
1468       if Present (Component_Associations (N)) then
1469          Assoc := First (Component_Associations (N));
1470          while Present (Assoc) loop
1471             Choice := First (Choices (Assoc));
1472             while Present (Choice) loop
1473                if Nkind (Choice) = N_Others_Choice then
1474                   Others_Present := True;
1475
1476                   if Choice /= First (Choices (Assoc))
1477                     or else Present (Next (Choice))
1478                   then
1479                      Error_Msg_N
1480                        ("OTHERS must appear alone in a choice list", Choice);
1481                      return Failure;
1482                   end if;
1483
1484                   if Present (Next (Assoc)) then
1485                      Error_Msg_N
1486                        ("OTHERS must appear last in an aggregate", Choice);
1487                      return Failure;
1488                   end if;
1489
1490                   if Ada_Version = Ada_83
1491                     and then Assoc /= First (Component_Associations (N))
1492                     and then (Nkind (Parent (N)) = N_Assignment_Statement
1493                                or else
1494                                  Nkind (Parent (N)) = N_Object_Declaration)
1495                   then
1496                      Error_Msg_N
1497                        ("(Ada 83) illegal context for OTHERS choice", N);
1498                   end if;
1499                end if;
1500
1501                Nb_Choices := Nb_Choices + 1;
1502                Next (Choice);
1503             end loop;
1504
1505             Next (Assoc);
1506          end loop;
1507       end if;
1508
1509       --  At this point we know that the others choice, if present, is by
1510       --  itself and appears last in the aggregate. Check if we have mixed
1511       --  positional and discrete associations (other than the others choice).
1512
1513       if Present (Expressions (N))
1514         and then (Nb_Choices > 1
1515                    or else (Nb_Choices = 1 and then not Others_Present))
1516       then
1517          Error_Msg_N
1518            ("named association cannot follow positional association",
1519             First (Choices (First (Component_Associations (N)))));
1520          return Failure;
1521       end if;
1522
1523       --  Test for the validity of an others choice if present
1524
1525       if Others_Present and then not Others_Allowed then
1526          Error_Msg_N
1527            ("OTHERS choice not allowed here",
1528             First (Choices (First (Component_Associations (N)))));
1529          return Failure;
1530       end if;
1531
1532       --  Protect against cascaded errors
1533
1534       if Etype (Index_Typ) = Any_Type then
1535          return Failure;
1536       end if;
1537
1538       --  STEP 2: Process named components
1539
1540       if No (Expressions (N)) then
1541
1542          if Others_Present then
1543             Case_Table_Size := Nb_Choices - 1;
1544          else
1545             Case_Table_Size := Nb_Choices;
1546          end if;
1547
1548          Step_2 : declare
1549             Low  : Node_Id;
1550             High : Node_Id;
1551             --  Denote the lowest and highest values in an aggregate choice
1552
1553             Hi_Val : Uint;
1554             Lo_Val : Uint;
1555             --  High end of one range and Low end of the next. Should be
1556             --  contiguous if there is no hole in the list of values.
1557
1558             Missing_Values : Boolean;
1559             --  Set True if missing index values
1560
1561             S_Low  : Node_Id := Empty;
1562             S_High : Node_Id := Empty;
1563             --  if a choice in an aggregate is a subtype indication these
1564             --  denote the lowest and highest values of the subtype
1565
1566             Table : Case_Table_Type (1 .. Case_Table_Size);
1567             --  Used to sort all the different choice values
1568
1569             Single_Choice : Boolean;
1570             --  Set to true every time there is a single discrete choice in a
1571             --  discrete association
1572
1573             Prev_Nb_Discrete_Choices : Nat;
1574             --  Used to keep track of the number of discrete choices
1575             --  in the current association.
1576
1577          begin
1578             --  STEP 2 (A): Check discrete choices validity.
1579
1580             Assoc := First (Component_Associations (N));
1581             while Present (Assoc) loop
1582
1583                Prev_Nb_Discrete_Choices := Nb_Discrete_Choices;
1584                Choice := First (Choices (Assoc));
1585                loop
1586                   Analyze (Choice);
1587
1588                   if Nkind (Choice) = N_Others_Choice then
1589                      Single_Choice := False;
1590                      exit;
1591
1592                   --  Test for subtype mark without constraint
1593
1594                   elsif Is_Entity_Name (Choice) and then
1595                     Is_Type (Entity (Choice))
1596                   then
1597                      if Base_Type (Entity (Choice)) /= Index_Base then
1598                         Error_Msg_N
1599                           ("invalid subtype mark in aggregate choice",
1600                            Choice);
1601                         return Failure;
1602                      end if;
1603
1604                   elsif Nkind (Choice) = N_Subtype_Indication then
1605                      Resolve_Discrete_Subtype_Indication (Choice, Index_Base);
1606
1607                      --  Does the subtype indication evaluation raise CE ?
1608
1609                      Get_Index_Bounds (Subtype_Mark (Choice), S_Low, S_High);
1610                      Get_Index_Bounds (Choice, Low, High);
1611                      Check_Bounds (S_Low, S_High, Low, High);
1612
1613                   else  --  Choice is a range or an expression
1614                      Resolve (Choice, Index_Base);
1615                      Check_Unset_Reference (Choice);
1616                      Check_Non_Static_Context (Choice);
1617
1618                      --  Do not range check a choice. This check is redundant
1619                      --  since this test is already performed when we check
1620                      --  that the bounds of the array aggregate are within
1621                      --  range.
1622
1623                      Set_Do_Range_Check (Choice, False);
1624                   end if;
1625
1626                   --  If we could not resolve the discrete choice stop here
1627
1628                   if Etype (Choice) = Any_Type then
1629                      return Failure;
1630
1631                   --  If the discrete choice raises CE get its original bounds.
1632
1633                   elsif Nkind (Choice) = N_Raise_Constraint_Error then
1634                      Set_Raises_Constraint_Error (N);
1635                      Get_Index_Bounds (Original_Node (Choice), Low, High);
1636
1637                   --  Otherwise get its bounds as usual
1638
1639                   else
1640                      Get_Index_Bounds (Choice, Low, High);
1641                   end if;
1642
1643                   if (Dynamic_Or_Null_Range (Low, High)
1644                        or else (Nkind (Choice) = N_Subtype_Indication
1645                                  and then
1646                                    Dynamic_Or_Null_Range (S_Low, S_High)))
1647                     and then Nb_Choices /= 1
1648                   then
1649                      Error_Msg_N
1650                        ("dynamic or empty choice in aggregate " &
1651                         "must be the only choice", Choice);
1652                      return Failure;
1653                   end if;
1654
1655                   Nb_Discrete_Choices := Nb_Discrete_Choices + 1;
1656                   Table (Nb_Discrete_Choices).Choice_Lo := Low;
1657                   Table (Nb_Discrete_Choices).Choice_Hi := High;
1658
1659                   Next (Choice);
1660
1661                   if No (Choice) then
1662                      --  Check if we have a single discrete choice and whether
1663                      --  this discrete choice specifies a single value.
1664
1665                      Single_Choice :=
1666                        (Nb_Discrete_Choices = Prev_Nb_Discrete_Choices + 1)
1667                          and then (Low = High);
1668
1669                      exit;
1670                   end if;
1671                end loop;
1672
1673                --  Ada 2005 (AI-231)
1674
1675                Check_Can_Never_Be_Null (N, Expression (Assoc));
1676
1677                --  Ada 2005 (AI-287): In case of default initialized component
1678                --  we delay the resolution to the expansion phase
1679
1680                if Box_Present (Assoc) then
1681
1682                   --  Ada 2005 (AI-287): In case of default initialization
1683                   --  of a component the expander will generate calls to
1684                   --  the corresponding initialization subprogram.
1685
1686                   null;
1687
1688                elsif not Resolve_Aggr_Expr (Expression (Assoc),
1689                                             Single_Elmt => Single_Choice)
1690                then
1691                   return Failure;
1692                end if;
1693
1694                Next (Assoc);
1695             end loop;
1696
1697             --  If aggregate contains more than one choice then these must be
1698             --  static. Sort them and check that they are contiguous
1699
1700             if Nb_Discrete_Choices > 1 then
1701                Sort_Case_Table (Table);
1702                Missing_Values := False;
1703
1704                Outer : for J in 1 .. Nb_Discrete_Choices - 1 loop
1705                   if Expr_Value (Table (J).Choice_Hi) >=
1706                        Expr_Value (Table (J + 1).Choice_Lo)
1707                   then
1708                      Error_Msg_N
1709                        ("duplicate choice values in array aggregate",
1710                         Table (J).Choice_Hi);
1711                      return Failure;
1712
1713                   elsif not Others_Present then
1714
1715                      Hi_Val := Expr_Value (Table (J).Choice_Hi);
1716                      Lo_Val := Expr_Value (Table (J + 1).Choice_Lo);
1717
1718                      --  If missing values, output error messages
1719
1720                      if Lo_Val - Hi_Val > 1 then
1721
1722                         --  Header message if not first missing value
1723
1724                         if not Missing_Values then
1725                            Error_Msg_N
1726                              ("missing index value(s) in array aggregate", N);
1727                            Missing_Values := True;
1728                         end if;
1729
1730                         --  Output values of missing indexes
1731
1732                         Lo_Val := Lo_Val - 1;
1733                         Hi_Val := Hi_Val + 1;
1734
1735                         --  Enumeration type case
1736
1737                         if Is_Enumeration_Type (Index_Typ) then
1738                            Error_Msg_Name_1 :=
1739                              Chars
1740                                (Get_Enum_Lit_From_Pos
1741                                  (Index_Typ, Hi_Val, Loc));
1742
1743                            if Lo_Val = Hi_Val then
1744                               Error_Msg_N ("\  %", N);
1745                            else
1746                               Error_Msg_Name_2 :=
1747                                 Chars
1748                                   (Get_Enum_Lit_From_Pos
1749                                     (Index_Typ, Lo_Val, Loc));
1750                               Error_Msg_N ("\  % .. %", N);
1751                            end if;
1752
1753                         --  Integer types case
1754
1755                         else
1756                            Error_Msg_Uint_1 := Hi_Val;
1757
1758                            if Lo_Val = Hi_Val then
1759                               Error_Msg_N ("\  ^", N);
1760                            else
1761                               Error_Msg_Uint_2 := Lo_Val;
1762                               Error_Msg_N ("\  ^ .. ^", N);
1763                            end if;
1764                         end if;
1765                      end if;
1766                   end if;
1767                end loop Outer;
1768
1769                if Missing_Values then
1770                   Set_Etype (N, Any_Composite);
1771                   return Failure;
1772                end if;
1773             end if;
1774
1775             --  STEP 2 (B): Compute aggregate bounds and min/max choices values
1776
1777             if Nb_Discrete_Choices > 0 then
1778                Choices_Low  := Table (1).Choice_Lo;
1779                Choices_High := Table (Nb_Discrete_Choices).Choice_Hi;
1780             end if;
1781
1782             if Others_Present then
1783                Get_Index_Bounds (Index_Constr, Aggr_Low, Aggr_High);
1784
1785             else
1786                Aggr_Low  := Choices_Low;
1787                Aggr_High := Choices_High;
1788             end if;
1789          end Step_2;
1790
1791       --  STEP 3: Process positional components
1792
1793       else
1794          --  STEP 3 (A): Process positional elements
1795
1796          Expr := First (Expressions (N));
1797          Nb_Elements := Uint_0;
1798          while Present (Expr) loop
1799             Nb_Elements := Nb_Elements + 1;
1800
1801             Check_Can_Never_Be_Null (N, Expr); -- Ada 2005 (AI-231)
1802
1803             if not Resolve_Aggr_Expr (Expr, Single_Elmt => True) then
1804                return Failure;
1805             end if;
1806
1807             Next (Expr);
1808          end loop;
1809
1810          if Others_Present then
1811             Assoc := Last (Component_Associations (N));
1812
1813             Check_Can_Never_Be_Null
1814               (N, Expression (Assoc)); -- Ada 2005 (AI-231)
1815
1816             --  Ada 2005 (AI-287): In case of default initialized component
1817             --  we delay the resolution to the expansion phase.
1818
1819             if Box_Present (Assoc) then
1820
1821                --  Ada 2005 (AI-287): In case of default initialization
1822                --  of a component the expander will generate calls to
1823                --  the corresponding initialization subprogram.
1824
1825                null;
1826
1827             elsif not Resolve_Aggr_Expr (Expression (Assoc),
1828                                          Single_Elmt => False)
1829             then
1830                return Failure;
1831             end if;
1832          end if;
1833
1834          --  STEP 3 (B): Compute the aggregate bounds
1835
1836          if Others_Present then
1837             Get_Index_Bounds (Index_Constr, Aggr_Low, Aggr_High);
1838
1839          else
1840             if Others_Allowed then
1841                Get_Index_Bounds (Index_Constr, Aggr_Low, Who_Cares);
1842             else
1843                Aggr_Low := Index_Typ_Low;
1844             end if;
1845
1846             Aggr_High := Add (Nb_Elements - 1, To => Aggr_Low);
1847             Check_Bound (Index_Base_High, Aggr_High);
1848          end if;
1849       end if;
1850
1851       --  STEP 4: Perform static aggregate checks and save the bounds
1852
1853       --  Check (A)
1854
1855       Check_Bounds (Index_Typ_Low, Index_Typ_High, Aggr_Low, Aggr_High);
1856       Check_Bounds (Index_Base_Low, Index_Base_High, Aggr_Low, Aggr_High);
1857
1858       --  Check (B)
1859
1860       if Others_Present and then Nb_Discrete_Choices > 0 then
1861          Check_Bounds (Aggr_Low, Aggr_High, Choices_Low, Choices_High);
1862          Check_Bounds (Index_Typ_Low, Index_Typ_High,
1863                        Choices_Low, Choices_High);
1864          Check_Bounds (Index_Base_Low, Index_Base_High,
1865                        Choices_Low, Choices_High);
1866
1867       --  Check (C)
1868
1869       elsif Others_Present and then Nb_Elements > 0 then
1870          Check_Length (Aggr_Low, Aggr_High, Nb_Elements);
1871          Check_Length (Index_Typ_Low, Index_Typ_High, Nb_Elements);
1872          Check_Length (Index_Base_Low, Index_Base_High, Nb_Elements);
1873
1874       end if;
1875
1876       if Raises_Constraint_Error (Aggr_Low)
1877         or else Raises_Constraint_Error (Aggr_High)
1878       then
1879          Set_Raises_Constraint_Error (N);
1880       end if;
1881
1882       Aggr_Low := Duplicate_Subexpr (Aggr_Low);
1883
1884       --  Do not duplicate Aggr_High if Aggr_High = Aggr_Low + Nb_Elements
1885       --  since the addition node returned by Add is not yet analyzed. Attach
1886       --  to tree and analyze first. Reset analyzed flag to insure it will get
1887       --  analyzed when it is a literal bound whose type must be properly
1888       --  set.
1889
1890       if Others_Present or else Nb_Discrete_Choices > 0 then
1891          Aggr_High := Duplicate_Subexpr (Aggr_High);
1892
1893          if Etype (Aggr_High) = Universal_Integer then
1894             Set_Analyzed (Aggr_High, False);
1895          end if;
1896       end if;
1897
1898       Set_Aggregate_Bounds
1899         (N, Make_Range (Loc, Low_Bound => Aggr_Low, High_Bound => Aggr_High));
1900
1901       --  The bounds may contain expressions that must be inserted upwards.
1902       --  Attach them fully to the tree. After analysis, remove side effects
1903       --  from upper bound, if still needed.
1904
1905       Set_Parent (Aggregate_Bounds (N), N);
1906       Analyze_And_Resolve (Aggregate_Bounds (N), Index_Typ);
1907       Check_Unset_Reference (Aggregate_Bounds (N));
1908
1909       if not Others_Present and then Nb_Discrete_Choices = 0 then
1910          Set_High_Bound (Aggregate_Bounds (N),
1911              Duplicate_Subexpr (High_Bound (Aggregate_Bounds (N))));
1912       end if;
1913
1914       return Success;
1915    end Resolve_Array_Aggregate;
1916
1917    ---------------------------------
1918    -- Resolve_Extension_Aggregate --
1919    ---------------------------------
1920
1921    --  There are two cases to consider:
1922
1923    --  a) If the ancestor part is a type mark, the components needed are
1924    --  the difference between the components of the expected type and the
1925    --  components of the given type mark.
1926
1927    --  b) If the ancestor part is an expression, it must be unambiguous,
1928    --  and once we have its type we can also compute the needed  components
1929    --  as in the previous case. In both cases, if the ancestor type is not
1930    --  the immediate ancestor, we have to build this ancestor recursively.
1931
1932    --  In both cases discriminants of the ancestor type do not play a
1933    --  role in the resolution of the needed components, because inherited
1934    --  discriminants cannot be used in a type extension. As a result we can
1935    --  compute independently the list of components of the ancestor type and
1936    --  of the expected type.
1937
1938    procedure Resolve_Extension_Aggregate (N : Node_Id; Typ : Entity_Id) is
1939       A      : constant Node_Id := Ancestor_Part (N);
1940       A_Type : Entity_Id;
1941       I      : Interp_Index;
1942       It     : Interp;
1943
1944       function Valid_Ancestor_Type return Boolean;
1945       --  Verify that the type of the ancestor part is a non-private ancestor
1946       --  of the expected type.
1947
1948       -------------------------
1949       -- Valid_Ancestor_Type --
1950       -------------------------
1951
1952       function Valid_Ancestor_Type return Boolean is
1953          Imm_Type : Entity_Id;
1954
1955       begin
1956          Imm_Type := Base_Type (Typ);
1957          while Is_Derived_Type (Imm_Type)
1958            and then Etype (Imm_Type) /= Base_Type (A_Type)
1959          loop
1960             Imm_Type := Etype (Base_Type (Imm_Type));
1961          end loop;
1962
1963          if Etype (Imm_Type) /= Base_Type (A_Type) then
1964             Error_Msg_NE ("expect ancestor type of &", A, Typ);
1965             return False;
1966          else
1967             return True;
1968          end if;
1969       end Valid_Ancestor_Type;
1970
1971    --  Start of processing for Resolve_Extension_Aggregate
1972
1973    begin
1974       Analyze (A);
1975
1976       if not Is_Tagged_Type (Typ) then
1977          Error_Msg_N ("type of extension aggregate must be tagged", N);
1978          return;
1979
1980       elsif Is_Limited_Type (Typ) then
1981
1982          --  Ada 2005 (AI-287): Limited aggregates are allowed
1983
1984          if Ada_Version < Ada_05 then
1985             Error_Msg_N ("aggregate type cannot be limited", N);
1986             Explain_Limited_Type (Typ, N);
1987             return;
1988          end if;
1989
1990       elsif Is_Class_Wide_Type (Typ) then
1991          Error_Msg_N ("aggregate cannot be of a class-wide type", N);
1992          return;
1993       end if;
1994
1995       if Is_Entity_Name (A)
1996         and then Is_Type (Entity (A))
1997       then
1998          A_Type := Get_Full_View (Entity (A));
1999
2000          if Valid_Ancestor_Type then
2001             Set_Entity (A, A_Type);
2002             Set_Etype  (A, A_Type);
2003
2004             Validate_Ancestor_Part (N);
2005             Resolve_Record_Aggregate (N, Typ);
2006          end if;
2007
2008       elsif Nkind (A) /= N_Aggregate then
2009          if Is_Overloaded (A) then
2010             A_Type := Any_Type;
2011             Get_First_Interp (A, I, It);
2012
2013             while Present (It.Typ) loop
2014
2015                if Is_Tagged_Type (It.Typ)
2016                   and then not Is_Limited_Type (It.Typ)
2017                then
2018                   if A_Type /= Any_Type then
2019                      Error_Msg_N ("cannot resolve expression", A);
2020                      return;
2021                   else
2022                      A_Type := It.Typ;
2023                   end if;
2024                end if;
2025
2026                Get_Next_Interp (I, It);
2027             end loop;
2028
2029             if A_Type = Any_Type then
2030                Error_Msg_N
2031                  ("ancestor part must be non-limited tagged type", A);
2032                return;
2033             end if;
2034
2035          else
2036             A_Type := Etype (A);
2037          end if;
2038
2039          if Valid_Ancestor_Type then
2040             Resolve (A, A_Type);
2041             Check_Unset_Reference (A);
2042             Check_Non_Static_Context (A);
2043
2044             if Is_Class_Wide_Type (Etype (A))
2045               and then Nkind (Original_Node (A)) = N_Function_Call
2046             then
2047                --  If the ancestor part is a dispatching call, it appears
2048                --  statically to be a legal ancestor, but it yields any
2049                --  member of the class, and it is not possible to determine
2050                --  whether it is an ancestor of the extension aggregate (much
2051                --  less which ancestor). It is not possible to determine the
2052                --  required components of the extension part.
2053
2054                Error_Msg_N ("ancestor part must be statically tagged", A);
2055             else
2056                Resolve_Record_Aggregate (N, Typ);
2057             end if;
2058          end if;
2059
2060       else
2061          Error_Msg_N (" No unique type for this aggregate",  A);
2062       end if;
2063    end Resolve_Extension_Aggregate;
2064
2065    ------------------------------
2066    -- Resolve_Record_Aggregate --
2067    ------------------------------
2068
2069    procedure Resolve_Record_Aggregate (N : Node_Id; Typ : Entity_Id) is
2070       New_Assoc_List : constant List_Id := New_List;
2071       New_Assoc      : Node_Id;
2072       --  New_Assoc_List is the newly built list of N_Component_Association
2073       --  nodes. New_Assoc is one such N_Component_Association node in it.
2074       --  Please note that while Assoc and New_Assoc contain the same
2075       --  kind of nodes, they are used to iterate over two different
2076       --  N_Component_Association lists.
2077
2078       Others_Etype : Entity_Id := Empty;
2079       --  This variable is used to save the Etype of the last record component
2080       --  that takes its value from the others choice. Its purpose is:
2081       --
2082       --    (a) make sure the others choice is useful
2083       --
2084       --    (b) make sure the type of all the components whose value is
2085       --        subsumed by the others choice are the same.
2086       --
2087       --  This variable is updated as a side effect of function Get_Value
2088
2089       Mbox_Present : Boolean := False;
2090       Others_Mbox  : Boolean := False;
2091       --  Ada 2005 (AI-287): Variables used in case of default initialization
2092       --  to provide a functionality similar to Others_Etype. Mbox_Present
2093       --  indicates that the component takes its default initialization;
2094       --  Others_Mbox indicates that at least one component takes its default
2095       --  initialization. Similar to Others_Etype, they are also updated as a
2096       --  side effect of function Get_Value.
2097
2098       procedure Add_Association
2099         (Component   : Entity_Id;
2100          Expr        : Node_Id;
2101          Box_Present : Boolean := False);
2102       --  Builds a new N_Component_Association node which associates
2103       --  Component to expression Expr and adds it to the new association
2104       --  list New_Assoc_List being built.
2105
2106       function Discr_Present (Discr : Entity_Id) return Boolean;
2107       --  If aggregate N is a regular aggregate this routine will return True.
2108       --  Otherwise, if N is an extension aggregate, Discr is a discriminant
2109       --  whose value may already have been specified by N's ancestor part,
2110       --  this routine checks whether this is indeed the case and if so
2111       --  returns False, signaling that no value for Discr should appear in the
2112       --  N's aggregate part. Also, in this case, the routine appends to
2113       --  New_Assoc_List Discr the discriminant value specified in the ancestor
2114       --  part.
2115
2116       function Get_Value
2117         (Compon                 : Node_Id;
2118          From                   : List_Id;
2119          Consider_Others_Choice : Boolean := False)
2120          return                   Node_Id;
2121       --  Given a record component stored in parameter Compon, the
2122       --  following function returns its value as it appears in the list
2123       --  From, which is a list of N_Component_Association nodes. If no
2124       --  component association has a choice for the searched component,
2125       --  the value provided by the others choice is returned, if there
2126       --  is  one and Consider_Others_Choice is set to true. Otherwise
2127       --  Empty is returned. If there is more than one component association
2128       --  giving a value for the searched record component, an error message
2129       --  is emitted and the first found value is returned.
2130       --
2131       --  If Consider_Others_Choice is set and the returned expression comes
2132       --  from the others choice, then Others_Etype is set as a side effect.
2133       --  An error message is emitted if the components taking their value
2134       --  from the others choice do not have same type.
2135
2136       procedure Resolve_Aggr_Expr (Expr : Node_Id; Component : Node_Id);
2137       --  Analyzes and resolves expression Expr against the Etype of the
2138       --  Component. This routine also applies all appropriate checks to Expr.
2139       --  It finally saves a Expr in the newly created association list that
2140       --  will be attached to the final record aggregate. Note that if the
2141       --  Parent pointer of Expr is not set then Expr was produced with a
2142       --  New_Copy_Tree or some such.
2143
2144       ---------------------
2145       -- Add_Association --
2146       ---------------------
2147
2148       procedure Add_Association
2149         (Component   : Entity_Id;
2150          Expr        : Node_Id;
2151          Box_Present : Boolean := False)
2152       is
2153          Choice_List : constant List_Id := New_List;
2154          New_Assoc   : Node_Id;
2155
2156       begin
2157          Append (New_Occurrence_Of (Component, Sloc (Expr)), Choice_List);
2158          New_Assoc :=
2159            Make_Component_Association (Sloc (Expr),
2160              Choices     => Choice_List,
2161              Expression  => Expr,
2162              Box_Present => Box_Present);
2163          Append (New_Assoc, New_Assoc_List);
2164       end Add_Association;
2165
2166       -------------------
2167       -- Discr_Present --
2168       -------------------
2169
2170       function Discr_Present (Discr : Entity_Id) return Boolean is
2171          Regular_Aggr : constant Boolean := Nkind (N) /= N_Extension_Aggregate;
2172
2173          Loc : Source_Ptr;
2174
2175          Ancestor     : Node_Id;
2176          Discr_Expr   : Node_Id;
2177
2178          Ancestor_Typ : Entity_Id;
2179          Orig_Discr   : Entity_Id;
2180          D            : Entity_Id;
2181          D_Val        : Elmt_Id := No_Elmt; -- stop junk warning
2182
2183          Ancestor_Is_Subtyp : Boolean;
2184
2185       begin
2186          if Regular_Aggr then
2187             return True;
2188          end if;
2189
2190          Ancestor     := Ancestor_Part (N);
2191          Ancestor_Typ := Etype (Ancestor);
2192          Loc          := Sloc (Ancestor);
2193
2194          Ancestor_Is_Subtyp :=
2195            Is_Entity_Name (Ancestor) and then Is_Type (Entity (Ancestor));
2196
2197          --  If the ancestor part has no discriminants clearly N's aggregate
2198          --  part must provide a value for Discr.
2199
2200          if not Has_Discriminants (Ancestor_Typ) then
2201             return True;
2202
2203          --  If the ancestor part is an unconstrained subtype mark then the
2204          --  Discr must be present in N's aggregate part.
2205
2206          elsif Ancestor_Is_Subtyp
2207            and then not Is_Constrained (Entity (Ancestor))
2208          then
2209             return True;
2210          end if;
2211
2212          --  Now look to see if Discr was specified in the ancestor part.
2213
2214          Orig_Discr := Original_Record_Component (Discr);
2215          D          := First_Discriminant (Ancestor_Typ);
2216
2217          if Ancestor_Is_Subtyp then
2218             D_Val := First_Elmt (Discriminant_Constraint (Entity (Ancestor)));
2219          end if;
2220
2221          while Present (D) loop
2222             --  If Ancestor has already specified Disc value than
2223             --  insert its value in the final aggregate.
2224
2225             if Original_Record_Component (D) = Orig_Discr then
2226                if Ancestor_Is_Subtyp then
2227                   Discr_Expr := New_Copy_Tree (Node (D_Val));
2228                else
2229                   Discr_Expr :=
2230                     Make_Selected_Component (Loc,
2231                       Prefix        => Duplicate_Subexpr (Ancestor),
2232                       Selector_Name => New_Occurrence_Of (Discr, Loc));
2233                end if;
2234
2235                Resolve_Aggr_Expr (Discr_Expr, Discr);
2236                return False;
2237             end if;
2238
2239             Next_Discriminant (D);
2240
2241             if Ancestor_Is_Subtyp then
2242                Next_Elmt (D_Val);
2243             end if;
2244          end loop;
2245
2246          return True;
2247       end Discr_Present;
2248
2249       ---------------
2250       -- Get_Value --
2251       ---------------
2252
2253       function Get_Value
2254         (Compon                 : Node_Id;
2255          From                   : List_Id;
2256          Consider_Others_Choice : Boolean := False)
2257          return                   Node_Id
2258       is
2259          Assoc         : Node_Id;
2260          Expr          : Node_Id := Empty;
2261          Selector_Name : Node_Id;
2262
2263          procedure Check_Non_Limited_Type;
2264          --  Relax check to allow the default initialization of limited types.
2265          --  For example:
2266          --      record
2267          --         C : Lim := (..., others => <>);
2268          --      end record;
2269
2270          ----------------------------
2271          -- Check_Non_Limited_Type --
2272          ----------------------------
2273
2274          procedure Check_Non_Limited_Type is
2275          begin
2276             if Is_Limited_Type (Etype (Compon))
2277                and then Comes_From_Source (Compon)
2278                and then not In_Instance_Body
2279             then
2280                --  Ada 2005 (AI-287): Limited aggregates are allowed
2281
2282                if Ada_Version >= Ada_05
2283                  and then Present (Expression (Assoc))
2284                  and then Nkind (Expression (Assoc)) = N_Aggregate
2285                then
2286                   null;
2287                else
2288                   Error_Msg_N
2289                     ("initialization not allowed for limited types", N);
2290                   Explain_Limited_Type (Etype (Compon), Compon);
2291                end if;
2292
2293             end if;
2294          end Check_Non_Limited_Type;
2295
2296       --  Start of processing for Get_Value
2297
2298       begin
2299          Mbox_Present := False;
2300
2301          if Present (From) then
2302             Assoc := First (From);
2303          else
2304             return Empty;
2305          end if;
2306
2307          while Present (Assoc) loop
2308             Selector_Name := First (Choices (Assoc));
2309             while Present (Selector_Name) loop
2310                if Nkind (Selector_Name) = N_Others_Choice then
2311                   if Consider_Others_Choice and then No (Expr) then
2312
2313                      --  We need to duplicate the expression for each
2314                      --  successive component covered by the others choice.
2315                      --  This is redundant if the others_choice covers only
2316                      --  one component (small optimization possible???), but
2317                      --  indispensable otherwise, because each one must be
2318                      --  expanded individually to preserve side-effects.
2319
2320                      --  Ada 2005 (AI-287): In case of default initialization
2321                      --  of components, we duplicate the corresponding default
2322                      --  expression (from the record type declaration).
2323
2324                      if Box_Present (Assoc) then
2325                         Others_Mbox  := True;
2326                         Mbox_Present := True;
2327
2328                         if Expander_Active then
2329                            return New_Copy_Tree (Expression (Parent (Compon)));
2330                         else
2331                            return Expression (Parent (Compon));
2332                         end if;
2333
2334                      else
2335                         Check_Non_Limited_Type;
2336
2337                         if Present (Others_Etype) and then
2338                            Base_Type (Others_Etype) /= Base_Type (Etype
2339                                                                    (Compon))
2340                         then
2341                            Error_Msg_N ("components in OTHERS choice must " &
2342                                         "have same type", Selector_Name);
2343                         end if;
2344
2345                         Others_Etype := Etype (Compon);
2346
2347                         if Expander_Active then
2348                            return New_Copy_Tree (Expression (Assoc));
2349                         else
2350                            return Expression (Assoc);
2351                         end if;
2352                      end if;
2353                   end if;
2354
2355                elsif Chars (Compon) = Chars (Selector_Name) then
2356                   if No (Expr) then
2357
2358                      --  Ada 2005 (AI-231)
2359
2360                      if Ada_Version >= Ada_05
2361                        and then Present (Expression (Assoc))
2362                        and then Nkind (Expression (Assoc)) = N_Null
2363                        and then Can_Never_Be_Null (Compon)
2364                      then
2365                         Error_Msg_N
2366                           ("(Ada 2005) NULL not allowed in null-excluding " &
2367                            "components", Expression (Assoc));
2368                      end if;
2369
2370                      --  We need to duplicate the expression when several
2371                      --  components are grouped together with a "|" choice.
2372                      --  For instance "filed1 | filed2 => Expr"
2373
2374                      --  Ada 2005 (AI-287)
2375
2376                      if Box_Present (Assoc) then
2377                         Mbox_Present := True;
2378
2379                         --  Duplicate the default expression of the component
2380                         --  from the record type declaration
2381
2382                         if Present (Next (Selector_Name)) then
2383                            Expr :=
2384                              New_Copy_Tree (Expression (Parent (Compon)));
2385                         else
2386                            Expr := Expression (Parent (Compon));
2387                         end if;
2388
2389                      else
2390                         Check_Non_Limited_Type;
2391
2392                         if Present (Next (Selector_Name)) then
2393                            Expr := New_Copy_Tree (Expression (Assoc));
2394                         else
2395                            Expr := Expression (Assoc);
2396                         end if;
2397                      end if;
2398
2399                      Generate_Reference (Compon, Selector_Name);
2400
2401                   else
2402                      Error_Msg_NE
2403                        ("more than one value supplied for &",
2404                         Selector_Name, Compon);
2405
2406                   end if;
2407                end if;
2408
2409                Next (Selector_Name);
2410             end loop;
2411
2412             Next (Assoc);
2413          end loop;
2414
2415          return Expr;
2416       end Get_Value;
2417
2418       -----------------------
2419       -- Resolve_Aggr_Expr --
2420       -----------------------
2421
2422       procedure Resolve_Aggr_Expr (Expr : Node_Id; Component : Node_Id) is
2423          New_C     : Entity_Id := Component;
2424          Expr_Type : Entity_Id := Empty;
2425
2426          function Has_Expansion_Delayed (Expr : Node_Id) return Boolean;
2427          --  If the expression is an aggregate (possibly qualified) then its
2428          --  expansion is delayed until the enclosing aggregate is expanded
2429          --  into assignments. In that case, do not generate checks on the
2430          --  expression, because they will be generated later, and will other-
2431          --  wise force a copy (to remove side-effects) that would leave a
2432          --  dynamic-sized aggregate in the code, something that gigi cannot
2433          --  handle.
2434
2435          Relocate  : Boolean;
2436          --  Set to True if the resolved Expr node needs to be relocated
2437          --  when attached to the newly created association list. This node
2438          --  need not be relocated if its parent pointer is not set.
2439          --  In fact in this case Expr is the output of a New_Copy_Tree call.
2440          --  if Relocate is True then we have analyzed the expression node
2441          --  in the original aggregate and hence it needs to be relocated
2442          --  when moved over the new association list.
2443
2444          function Has_Expansion_Delayed (Expr : Node_Id) return Boolean is
2445             Kind : constant Node_Kind := Nkind (Expr);
2446
2447          begin
2448             return ((Kind = N_Aggregate
2449                        or else Kind = N_Extension_Aggregate)
2450                      and then Present (Etype (Expr))
2451                      and then Is_Record_Type (Etype (Expr))
2452                      and then Expansion_Delayed (Expr))
2453
2454               or else (Kind = N_Qualified_Expression
2455                         and then Has_Expansion_Delayed (Expression (Expr)));
2456          end Has_Expansion_Delayed;
2457
2458       --  Start of processing for  Resolve_Aggr_Expr
2459
2460       begin
2461          --  If the type of the component is elementary or the type of the
2462          --  aggregate does not contain discriminants, use the type of the
2463          --  component to resolve Expr.
2464
2465          if Is_Elementary_Type (Etype (Component))
2466            or else not Has_Discriminants (Etype (N))
2467          then
2468             Expr_Type := Etype (Component);
2469
2470          --  Otherwise we have to pick up the new type of the component from
2471          --  the new costrained subtype of the aggregate. In fact components
2472          --  which are of a composite type might be constrained by a
2473          --  discriminant, and we want to resolve Expr against the subtype were
2474          --  all discriminant occurrences are replaced with their actual value.
2475
2476          else
2477             New_C := First_Component (Etype (N));
2478             while Present (New_C) loop
2479                if Chars (New_C) = Chars (Component) then
2480                   Expr_Type := Etype (New_C);
2481                   exit;
2482                end if;
2483
2484                Next_Component (New_C);
2485             end loop;
2486
2487             pragma Assert (Present (Expr_Type));
2488
2489             --  For each range in an array type where a discriminant has been
2490             --  replaced with the constraint, check that this range is within
2491             --  the range of the base type. This checks is done in the
2492             --  init proc for regular objects, but has to be done here for
2493             --  aggregates since no init proc is called for them.
2494
2495             if Is_Array_Type (Expr_Type) then
2496                declare
2497                   Index          : Node_Id := First_Index (Expr_Type);
2498                   --  Range of the current constrained index in the array.
2499
2500                   Orig_Index     : Node_Id := First_Index (Etype (Component));
2501                   --  Range corresponding to the range Index above in the
2502                   --  original unconstrained record type. The bounds of this
2503                   --  range may be governed by discriminants.
2504
2505                   Unconstr_Index : Node_Id := First_Index (Etype (Expr_Type));
2506                   --  Range corresponding to the range Index above for the
2507                   --  unconstrained array type. This range is needed to apply
2508                   --  range checks.
2509
2510                begin
2511                   while Present (Index) loop
2512                      if Depends_On_Discriminant (Orig_Index) then
2513                         Apply_Range_Check (Index, Etype (Unconstr_Index));
2514                      end if;
2515
2516                      Next_Index (Index);
2517                      Next_Index (Orig_Index);
2518                      Next_Index (Unconstr_Index);
2519                   end loop;
2520                end;
2521             end if;
2522          end if;
2523
2524          --  If the Parent pointer of Expr is not set, Expr is an expression
2525          --  duplicated by New_Tree_Copy (this happens for record aggregates
2526          --  that look like (Field1 | Filed2 => Expr) or (others => Expr)).
2527          --  Such a duplicated expression must be attached to the tree
2528          --  before analysis and resolution to enforce the rule that a tree
2529          --  fragment should never be analyzed or resolved unless it is
2530          --  attached to the current compilation unit.
2531
2532          if No (Parent (Expr)) then
2533             Set_Parent (Expr, N);
2534             Relocate := False;
2535          else
2536             Relocate := True;
2537          end if;
2538
2539          Analyze_And_Resolve (Expr, Expr_Type);
2540          Check_Non_Static_Context (Expr);
2541          Check_Unset_Reference (Expr);
2542
2543          if not Has_Expansion_Delayed (Expr) then
2544             Aggregate_Constraint_Checks (Expr, Expr_Type);
2545          end if;
2546
2547          if Raises_Constraint_Error (Expr) then
2548             Set_Raises_Constraint_Error (N);
2549          end if;
2550
2551          if Relocate then
2552             Add_Association (New_C, Relocate_Node (Expr));
2553          else
2554             Add_Association (New_C, Expr);
2555          end if;
2556       end Resolve_Aggr_Expr;
2557
2558       --  Resolve_Record_Aggregate local variables
2559
2560       Assoc : Node_Id;
2561       --  N_Component_Association node belonging to the input aggregate N
2562
2563       Expr            : Node_Id;
2564       Positional_Expr : Node_Id;
2565       Component       : Entity_Id;
2566       Component_Elmt  : Elmt_Id;
2567
2568       Components : constant Elist_Id := New_Elmt_List;
2569       --  Components is the list of the record components whose value must
2570       --  be provided in the aggregate. This list does include discriminants.
2571
2572    --  Start of processing for Resolve_Record_Aggregate
2573
2574    begin
2575       --  We may end up calling Duplicate_Subexpr on expressions that are
2576       --  attached to New_Assoc_List. For this reason we need to attach it
2577       --  to the tree by setting its parent pointer to N. This parent point
2578       --  will change in STEP 8 below.
2579
2580       Set_Parent (New_Assoc_List, N);
2581
2582       --  STEP 1: abstract type and null record verification
2583
2584       if Is_Abstract (Typ) then
2585          Error_Msg_N ("type of aggregate cannot be abstract",  N);
2586       end if;
2587
2588       if No (First_Entity (Typ)) and then Null_Record_Present (N) then
2589          Set_Etype (N, Typ);
2590          return;
2591
2592       elsif Present (First_Entity (Typ))
2593         and then Null_Record_Present (N)
2594         and then not Is_Tagged_Type (Typ)
2595       then
2596          Error_Msg_N ("record aggregate cannot be null", N);
2597          return;
2598
2599       elsif No (First_Entity (Typ)) then
2600          Error_Msg_N ("record aggregate must be null", N);
2601          return;
2602       end if;
2603
2604       --  STEP 2: Verify aggregate structure
2605
2606       Step_2 : declare
2607          Selector_Name : Node_Id;
2608          Bad_Aggregate : Boolean := False;
2609
2610       begin
2611          if Present (Component_Associations (N)) then
2612             Assoc := First (Component_Associations (N));
2613          else
2614             Assoc := Empty;
2615          end if;
2616
2617          while Present (Assoc) loop
2618             Selector_Name := First (Choices (Assoc));
2619             while Present (Selector_Name) loop
2620                if Nkind (Selector_Name) = N_Identifier then
2621                   null;
2622
2623                elsif Nkind (Selector_Name) = N_Others_Choice then
2624                   if Selector_Name /= First (Choices (Assoc))
2625                     or else Present (Next (Selector_Name))
2626                   then
2627                      Error_Msg_N ("OTHERS must appear alone in a choice list",
2628                                   Selector_Name);
2629                      return;
2630
2631                   elsif Present (Next (Assoc)) then
2632                      Error_Msg_N ("OTHERS must appear last in an aggregate",
2633                                   Selector_Name);
2634                      return;
2635                   end if;
2636
2637                else
2638                   Error_Msg_N
2639                     ("selector name should be identifier or OTHERS",
2640                      Selector_Name);
2641                   Bad_Aggregate := True;
2642                end if;
2643
2644                Next (Selector_Name);
2645             end loop;
2646
2647             Next (Assoc);
2648          end loop;
2649
2650          if Bad_Aggregate then
2651             return;
2652          end if;
2653       end Step_2;
2654
2655       --  STEP 3: Find discriminant Values
2656
2657       Step_3 : declare
2658          Discrim               : Entity_Id;
2659          Missing_Discriminants : Boolean := False;
2660
2661       begin
2662          if Present (Expressions (N)) then
2663             Positional_Expr := First (Expressions (N));
2664          else
2665             Positional_Expr := Empty;
2666          end if;
2667
2668          if Has_Discriminants (Typ) then
2669             Discrim := First_Discriminant (Typ);
2670          else
2671             Discrim := Empty;
2672          end if;
2673
2674          --  First find the discriminant values in the positional components
2675
2676          while Present (Discrim) and then Present (Positional_Expr) loop
2677             if Discr_Present (Discrim) then
2678                Resolve_Aggr_Expr (Positional_Expr, Discrim);
2679
2680                --  Ada 2005 (AI-231)
2681
2682                if Ada_Version >= Ada_05
2683                  and then Nkind (Positional_Expr) = N_Null
2684                  and then Can_Never_Be_Null (Discrim)
2685                then
2686                   Error_Msg_N
2687                     ("(Ada 2005) NULL not allowed in null-excluding " &
2688                      "components", Positional_Expr);
2689                end if;
2690
2691                Next (Positional_Expr);
2692             end if;
2693
2694             if Present (Get_Value (Discrim, Component_Associations (N))) then
2695                Error_Msg_NE
2696                  ("more than one value supplied for discriminant&",
2697                   N, Discrim);
2698             end if;
2699
2700             Next_Discriminant (Discrim);
2701          end loop;
2702
2703          --  Find remaining discriminant values, if any, among named components
2704
2705          while Present (Discrim) loop
2706             Expr := Get_Value (Discrim, Component_Associations (N), True);
2707
2708             if not Discr_Present (Discrim) then
2709                if Present (Expr) then
2710                   Error_Msg_NE
2711                     ("more than one value supplied for discriminant&",
2712                      N, Discrim);
2713                end if;
2714
2715             elsif No (Expr) then
2716                Error_Msg_NE
2717                  ("no value supplied for discriminant &", N, Discrim);
2718                Missing_Discriminants := True;
2719
2720             else
2721                Resolve_Aggr_Expr (Expr, Discrim);
2722             end if;
2723
2724             Next_Discriminant (Discrim);
2725          end loop;
2726
2727          if Missing_Discriminants then
2728             return;
2729          end if;
2730
2731          --  At this point and until the beginning of STEP 6, New_Assoc_List
2732          --  contains only the discriminants and their values.
2733
2734       end Step_3;
2735
2736       --  STEP 4: Set the Etype of the record aggregate
2737
2738       --  ??? This code is pretty much a copy of Sem_Ch3.Build_Subtype. That
2739       --  routine should really be exported in sem_util or some such and used
2740       --  in sem_ch3 and here rather than have a copy of the code which is a
2741       --  maintenance nightmare.
2742
2743       --  ??? Performace WARNING. The current implementation creates a new
2744       --  itype for all aggregates whose base type is discriminated.
2745       --  This means that for record aggregates nested inside an array
2746       --  aggregate we will create a new itype for each record aggregate
2747       --  if the array cmponent type has discriminants. For large aggregates
2748       --  this may be a problem. What should be done in this case is
2749       --  to reuse itypes as much as possible.
2750
2751       if Has_Discriminants (Typ) then
2752          Build_Constrained_Itype : declare
2753             Loc         : constant Source_Ptr := Sloc (N);
2754             Indic       : Node_Id;
2755             Subtyp_Decl : Node_Id;
2756             Def_Id      : Entity_Id;
2757
2758             C : constant List_Id := New_List;
2759
2760          begin
2761             New_Assoc := First (New_Assoc_List);
2762             while Present (New_Assoc) loop
2763                Append (Duplicate_Subexpr (Expression (New_Assoc)), To => C);
2764                Next (New_Assoc);
2765             end loop;
2766
2767             Indic :=
2768               Make_Subtype_Indication (Loc,
2769                 Subtype_Mark => New_Occurrence_Of (Base_Type (Typ), Loc),
2770                 Constraint  => Make_Index_Or_Discriminant_Constraint (Loc, C));
2771
2772             Def_Id := Create_Itype (Ekind (Typ), N);
2773
2774             Subtyp_Decl :=
2775               Make_Subtype_Declaration (Loc,
2776                 Defining_Identifier => Def_Id,
2777                 Subtype_Indication  => Indic);
2778             Set_Parent (Subtyp_Decl, Parent (N));
2779
2780             --  Itypes must be analyzed with checks off (see itypes.ads).
2781
2782             Analyze (Subtyp_Decl, Suppress => All_Checks);
2783
2784             Set_Etype (N, Def_Id);
2785             Check_Static_Discriminated_Subtype
2786               (Def_Id, Expression (First (New_Assoc_List)));
2787          end Build_Constrained_Itype;
2788
2789       else
2790          Set_Etype (N, Typ);
2791       end if;
2792
2793       --  STEP 5: Get remaining components according to discriminant values
2794
2795       Step_5 : declare
2796          Record_Def      : Node_Id;
2797          Parent_Typ      : Entity_Id;
2798          Root_Typ        : Entity_Id;
2799          Parent_Typ_List : Elist_Id;
2800          Parent_Elmt     : Elmt_Id;
2801          Errors_Found    : Boolean := False;
2802          Dnode           : Node_Id;
2803
2804       begin
2805          if Is_Derived_Type (Typ) and then Is_Tagged_Type (Typ) then
2806             Parent_Typ_List := New_Elmt_List;
2807
2808             --  If this is an extension aggregate, the component list must
2809             --  include all components that are not in the given ancestor
2810             --  type. Otherwise, the component list must include components
2811             --  of all ancestors, starting with the root.
2812
2813             if Nkind (N) = N_Extension_Aggregate then
2814                Root_Typ := Base_Type (Etype (Ancestor_Part (N)));
2815             else
2816                Root_Typ := Root_Type (Typ);
2817
2818                if Nkind (Parent (Base_Type (Root_Typ)))
2819                     = N_Private_Type_Declaration
2820                then
2821                   Error_Msg_NE
2822                     ("type of aggregate has private ancestor&!",
2823                      N, Root_Typ);
2824                   Error_Msg_N  ("must use extension aggregate!", N);
2825                   return;
2826                end if;
2827
2828                Dnode := Declaration_Node (Base_Type (Root_Typ));
2829
2830                --  If we don't get a full declaration, then we have some
2831                --  error which will get signalled later so skip this part.
2832                --  Otherwise, gather components of root that apply to the
2833                --  aggregate type. We use the base type in case there is an
2834                --  applicable stored constraint that renames the discriminants
2835                --  of the root.
2836
2837                if Nkind (Dnode) = N_Full_Type_Declaration then
2838                   Record_Def := Type_Definition (Dnode);
2839                   Gather_Components (Base_Type (Typ),
2840                     Component_List (Record_Def),
2841                     Governed_By   => New_Assoc_List,
2842                     Into          => Components,
2843                     Report_Errors => Errors_Found);
2844                end if;
2845             end if;
2846
2847             Parent_Typ  := Base_Type (Typ);
2848             while Parent_Typ /= Root_Typ loop
2849
2850                Prepend_Elmt (Parent_Typ, To => Parent_Typ_List);
2851                Parent_Typ := Etype (Parent_Typ);
2852
2853                if Nkind (Parent (Base_Type (Parent_Typ))) =
2854                                         N_Private_Type_Declaration
2855                  or else Nkind (Parent (Base_Type (Parent_Typ))) =
2856                                         N_Private_Extension_Declaration
2857                then
2858                   if Nkind (N) /= N_Extension_Aggregate then
2859                      Error_Msg_NE
2860                        ("type of aggregate has private ancestor&!",
2861                         N, Parent_Typ);
2862                      Error_Msg_N  ("must use extension aggregate!", N);
2863                      return;
2864
2865                   elsif Parent_Typ /= Root_Typ then
2866                      Error_Msg_NE
2867                        ("ancestor part of aggregate must be private type&",
2868                          Ancestor_Part (N), Parent_Typ);
2869                      return;
2870                   end if;
2871                end if;
2872             end loop;
2873
2874             --  Now collect components from all other ancestors.
2875
2876             Parent_Elmt := First_Elmt (Parent_Typ_List);
2877             while Present (Parent_Elmt) loop
2878                Parent_Typ := Node (Parent_Elmt);
2879                Record_Def := Type_Definition (Parent (Base_Type (Parent_Typ)));
2880                Gather_Components (Empty,
2881                  Component_List (Record_Extension_Part (Record_Def)),
2882                  Governed_By   => New_Assoc_List,
2883                  Into          => Components,
2884                  Report_Errors => Errors_Found);
2885
2886                Next_Elmt (Parent_Elmt);
2887             end loop;
2888
2889          else
2890             Record_Def := Type_Definition (Parent (Base_Type (Typ)));
2891
2892             if Null_Present (Record_Def) then
2893                null;
2894             else
2895                Gather_Components (Base_Type (Typ),
2896                  Component_List (Record_Def),
2897                  Governed_By   => New_Assoc_List,
2898                  Into          => Components,
2899                  Report_Errors => Errors_Found);
2900             end if;
2901          end if;
2902
2903          if Errors_Found then
2904             return;
2905          end if;
2906       end Step_5;
2907
2908       --  STEP 6: Find component Values
2909
2910       Component := Empty;
2911       Component_Elmt := First_Elmt (Components);
2912
2913       --  First scan the remaining positional associations in the aggregate.
2914       --  Remember that at this point Positional_Expr contains the current
2915       --  positional association if any is left after looking for discriminant
2916       --  values in step 3.
2917
2918       while Present (Positional_Expr) and then Present (Component_Elmt) loop
2919          Component := Node (Component_Elmt);
2920          Resolve_Aggr_Expr (Positional_Expr, Component);
2921
2922          --  Ada 2005 (AI-231)
2923
2924          if Ada_Version >= Ada_05
2925            and then Nkind (Positional_Expr) = N_Null
2926            and then Can_Never_Be_Null (Component)
2927          then
2928             Error_Msg_N
2929               ("(Ada 2005) NULL not allowed in null-excluding components",
2930                Positional_Expr);
2931          end if;
2932
2933          if Present (Get_Value (Component, Component_Associations (N))) then
2934             Error_Msg_NE
2935               ("more than one value supplied for Component &", N, Component);
2936          end if;
2937
2938          Next (Positional_Expr);
2939          Next_Elmt (Component_Elmt);
2940       end loop;
2941
2942       if Present (Positional_Expr) then
2943          Error_Msg_N
2944            ("too many components for record aggregate", Positional_Expr);
2945       end if;
2946
2947       --  Now scan for the named arguments of the aggregate
2948
2949       while Present (Component_Elmt) loop
2950          Component := Node (Component_Elmt);
2951          Expr := Get_Value (Component, Component_Associations (N), True);
2952
2953          --  Ada 2005 (AI-287): Default initialized limited component are
2954          --  passed to the expander, that will generate calls to the
2955          --  corresponding IP.
2956
2957          if Mbox_Present and then Is_Limited_Type (Etype (Component)) then
2958             Add_Association
2959               (Component   => Component,
2960                Expr        => Empty,
2961                Box_Present => True);
2962
2963          --  Ada 2005 (AI-287): No value supplied for component
2964
2965          elsif Mbox_Present and No (Expr) then
2966             null;
2967
2968          elsif No (Expr) then
2969             Error_Msg_NE ("no value supplied for component &!", N, Component);
2970
2971          else
2972             Resolve_Aggr_Expr (Expr, Component);
2973          end if;
2974
2975          Next_Elmt (Component_Elmt);
2976       end loop;
2977
2978       --  STEP 7: check for invalid components + check type in choice list
2979
2980       Step_7 : declare
2981          Selectr : Node_Id;
2982          --  Selector name
2983
2984          Typech  : Entity_Id;
2985          --  Type of first component in choice list
2986
2987       begin
2988          if Present (Component_Associations (N)) then
2989             Assoc := First (Component_Associations (N));
2990          else
2991             Assoc := Empty;
2992          end if;
2993
2994          Verification : while Present (Assoc) loop
2995             Selectr := First (Choices (Assoc));
2996             Typech := Empty;
2997
2998             if Nkind (Selectr) = N_Others_Choice then
2999
3000                --  Ada 2005 (AI-287): others choice may have expression or mbox
3001
3002                if No (Others_Etype)
3003                   and then not Others_Mbox
3004                then
3005                   Error_Msg_N
3006                     ("OTHERS must represent at least one component", Selectr);
3007                end if;
3008
3009                exit Verification;
3010             end if;
3011
3012             while Present (Selectr) loop
3013                New_Assoc := First (New_Assoc_List);
3014                while Present (New_Assoc) loop
3015                   Component := First (Choices (New_Assoc));
3016                   exit when Chars (Selectr) = Chars (Component);
3017                   Next (New_Assoc);
3018                end loop;
3019
3020                --  If no association, this is not a legal component of
3021                --  of the type in question,  except if this is an internal
3022                --  component supplied by a previous expansion.
3023
3024                if No (New_Assoc) then
3025                   if Box_Present (Parent (Selectr)) then
3026                      null;
3027
3028                   elsif Chars (Selectr) /= Name_uTag
3029                     and then Chars (Selectr) /= Name_uParent
3030                     and then Chars (Selectr) /= Name_uController
3031                   then
3032                      if not Has_Discriminants (Typ) then
3033                         Error_Msg_Node_2 := Typ;
3034                         Error_Msg_N
3035                           ("& is not a component of}",
3036                             Selectr);
3037                      else
3038                         Error_Msg_N
3039                           ("& is not a component of the aggregate subtype",
3040                             Selectr);
3041                      end if;
3042
3043                      Check_Misspelled_Component (Components, Selectr);
3044                   end if;
3045
3046                elsif No (Typech) then
3047                   Typech := Base_Type (Etype (Component));
3048
3049                elsif Typech /= Base_Type (Etype (Component)) then
3050                   if not Box_Present (Parent (Selectr)) then
3051                      Error_Msg_N
3052                        ("components in choice list must have same type",
3053                         Selectr);
3054                   end if;
3055                end if;
3056
3057                Next (Selectr);
3058             end loop;
3059
3060             Next (Assoc);
3061          end loop Verification;
3062       end Step_7;
3063
3064       --  STEP 8: replace the original aggregate
3065
3066       Step_8 : declare
3067          New_Aggregate : constant Node_Id := New_Copy (N);
3068
3069       begin
3070          Set_Expressions            (New_Aggregate, No_List);
3071          Set_Etype                  (New_Aggregate, Etype (N));
3072          Set_Component_Associations (New_Aggregate, New_Assoc_List);
3073
3074          Rewrite (N, New_Aggregate);
3075       end Step_8;
3076    end Resolve_Record_Aggregate;
3077
3078    -----------------------------
3079    -- Check_Can_Never_Be_Null --
3080    -----------------------------
3081
3082    procedure Check_Can_Never_Be_Null (N : Node_Id; Expr : Node_Id) is
3083    begin
3084       if Ada_Version >= Ada_05
3085         and then Nkind (Expr) = N_Null
3086         and then Can_Never_Be_Null (Etype (N))
3087       then
3088          Error_Msg_N
3089            ("(Ada 2005) NULL not allowed in null-excluding components", Expr);
3090       end if;
3091    end Check_Can_Never_Be_Null;
3092
3093    ---------------------
3094    -- Sort_Case_Table --
3095    ---------------------
3096
3097    procedure Sort_Case_Table (Case_Table : in out Case_Table_Type) is
3098       L : constant Int := Case_Table'First;
3099       U : constant Int := Case_Table'Last;
3100       K : Int;
3101       J : Int;
3102       T : Case_Bounds;
3103
3104    begin
3105       K := L;
3106
3107       while K /= U loop
3108          T := Case_Table (K + 1);
3109          J := K + 1;
3110
3111          while J /= L
3112            and then Expr_Value (Case_Table (J - 1).Choice_Lo) >
3113                     Expr_Value (T.Choice_Lo)
3114          loop
3115             Case_Table (J) := Case_Table (J - 1);
3116             J := J - 1;
3117          end loop;
3118
3119          Case_Table (J) := T;
3120          K := K + 1;
3121       end loop;
3122    end Sort_Case_Table;
3123
3124 end Sem_Aggr;