OSDN Git Service

2012-01-05 Richard Guenther <rguenther@suse.de>
[pf3gnuchains/gcc-fork.git] / gcc / ada / sem_util.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                             S E M _ U T I L                              --
6 --                                                                          --
7 --                                 B o d y                                  --
8 --                                                                          --
9 --          Copyright (C) 1992-2011, Free Software Foundation, Inc.         --
10 --                                                                          --
11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
12 -- terms of the  GNU General Public License as published  by the Free Soft- --
13 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
17 -- for  more details.  You should have  received  a copy of the GNU General --
18 -- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
19 -- http://www.gnu.org/licenses for a complete copy of the license.          --
20 --                                                                          --
21 -- GNAT was originally developed  by the GNAT team at  New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
23 --                                                                          --
24 ------------------------------------------------------------------------------
25
26 with Atree;    use Atree;
27 with Casing;   use Casing;
28 with Checks;   use Checks;
29 with Debug;    use Debug;
30 with Errout;   use Errout;
31 with Elists;   use Elists;
32 with Exp_Ch11; use Exp_Ch11;
33 with Exp_Disp; use Exp_Disp;
34 with Exp_Util; use Exp_Util;
35 with Fname;    use Fname;
36 with Freeze;   use Freeze;
37 with Lib;      use Lib;
38 with Lib.Xref; use Lib.Xref;
39 with Nlists;   use Nlists;
40 with Output;   use Output;
41 with Opt;      use Opt;
42 with Restrict; use Restrict;
43 with Rident;   use Rident;
44 with Rtsfind;  use Rtsfind;
45 with Sem;      use Sem;
46 with Sem_Aux;  use Sem_Aux;
47 with Sem_Attr; use Sem_Attr;
48 with Sem_Ch8;  use Sem_Ch8;
49 with Sem_Disp; use Sem_Disp;
50 with Sem_Eval; use Sem_Eval;
51 with Sem_Res;  use Sem_Res;
52 with Sem_Type; use Sem_Type;
53 with Sinfo;    use Sinfo;
54 with Sinput;   use Sinput;
55 with Stand;    use Stand;
56 with Style;
57 with Stringt;  use Stringt;
58 with Table;
59 with Targparm; use Targparm;
60 with Tbuild;   use Tbuild;
61 with Ttypes;   use Ttypes;
62 with Uname;    use Uname;
63
64 with GNAT.HTable; use GNAT.HTable;
65
66 package body Sem_Util is
67
68    ----------------------------------------
69    -- Global_Variables for New_Copy_Tree --
70    ----------------------------------------
71
72    --  These global variables are used by New_Copy_Tree. See description
73    --  of the body of this subprogram for details. Global variables can be
74    --  safely used by New_Copy_Tree, since there is no case of a recursive
75    --  call from the processing inside New_Copy_Tree.
76
77    NCT_Hash_Threshold : constant := 20;
78    --  If there are more than this number of pairs of entries in the
79    --  map, then Hash_Tables_Used will be set, and the hash tables will
80    --  be initialized and used for the searches.
81
82    NCT_Hash_Tables_Used : Boolean := False;
83    --  Set to True if hash tables are in use
84
85    NCT_Table_Entries : Nat;
86    --  Count entries in table to see if threshold is reached
87
88    NCT_Hash_Table_Setup : Boolean := False;
89    --  Set to True if hash table contains data. We set this True if we
90    --  setup the hash table with data, and leave it set permanently
91    --  from then on, this is a signal that second and subsequent users
92    --  of the hash table must clear the old entries before reuse.
93
94    subtype NCT_Header_Num is Int range 0 .. 511;
95    --  Defines range of headers in hash tables (512 headers)
96
97    ----------------------------------
98    -- Order Dependence (AI05-0144) --
99    ----------------------------------
100
101    --  Each actual in a call is entered into the table below. A flag indicates
102    --  whether the corresponding formal is OUT or IN OUT. Each top-level call
103    --  (procedure call, condition, assignment) examines all the actuals for a
104    --  possible order dependence. The table is reset after each such check.
105    --  The actuals to be checked in a call to Check_Order_Dependence are at
106    --  positions 1 .. Last.
107
108    type Actual_Name is record
109       Act         : Node_Id;
110       Is_Writable : Boolean;
111    end record;
112
113    package Actuals_In_Call is new Table.Table (
114       Table_Component_Type => Actual_Name,
115       Table_Index_Type     => Int,
116       Table_Low_Bound      => 0,
117       Table_Initial        => 10,
118       Table_Increment      => 100,
119       Table_Name           => "Actuals");
120
121    -----------------------
122    -- Local Subprograms --
123    -----------------------
124
125    function Build_Component_Subtype
126      (C   : List_Id;
127       Loc : Source_Ptr;
128       T   : Entity_Id) return Node_Id;
129    --  This function builds the subtype for Build_Actual_Subtype_Of_Component
130    --  and Build_Discriminal_Subtype_Of_Component. C is a list of constraints,
131    --  Loc is the source location, T is the original subtype.
132
133    function Is_Fully_Initialized_Variant (Typ : Entity_Id) return Boolean;
134    --  Subsidiary to Is_Fully_Initialized_Type. For an unconstrained type
135    --  with discriminants whose default values are static, examine only the
136    --  components in the selected variant to determine whether all of them
137    --  have a default.
138
139    function Has_Null_Extension (T : Entity_Id) return Boolean;
140    --  T is a derived tagged type. Check whether the type extension is null.
141    --  If the parent type is fully initialized, T can be treated as such.
142
143    ------------------------------
144    --  Abstract_Interface_List --
145    ------------------------------
146
147    function Abstract_Interface_List (Typ : Entity_Id) return List_Id is
148       Nod : Node_Id;
149
150    begin
151       if Is_Concurrent_Type (Typ) then
152
153          --  If we are dealing with a synchronized subtype, go to the base
154          --  type, whose declaration has the interface list.
155
156          --  Shouldn't this be Declaration_Node???
157
158          Nod := Parent (Base_Type (Typ));
159
160          if Nkind (Nod) = N_Full_Type_Declaration then
161             return Empty_List;
162          end if;
163
164       elsif Ekind (Typ) = E_Record_Type_With_Private then
165          if Nkind (Parent (Typ)) = N_Full_Type_Declaration then
166             Nod := Type_Definition (Parent (Typ));
167
168          elsif Nkind (Parent (Typ)) = N_Private_Type_Declaration then
169             if Present (Full_View (Typ))
170               and then Nkind (Parent (Full_View (Typ)))
171                          = N_Full_Type_Declaration
172             then
173                Nod := Type_Definition (Parent (Full_View (Typ)));
174
175             --  If the full-view is not available we cannot do anything else
176             --  here (the source has errors).
177
178             else
179                return Empty_List;
180             end if;
181
182          --  Support for generic formals with interfaces is still missing ???
183
184          elsif Nkind (Parent (Typ)) = N_Formal_Type_Declaration then
185             return Empty_List;
186
187          else
188             pragma Assert
189               (Nkind (Parent (Typ)) = N_Private_Extension_Declaration);
190             Nod := Parent (Typ);
191          end if;
192
193       elsif Ekind (Typ) = E_Record_Subtype then
194          Nod := Type_Definition (Parent (Etype (Typ)));
195
196       elsif Ekind (Typ) = E_Record_Subtype_With_Private then
197
198          --  Recurse, because parent may still be a private extension. Also
199          --  note that the full view of the subtype or the full view of its
200          --  base type may (both) be unavailable.
201
202          return Abstract_Interface_List (Etype (Typ));
203
204       else pragma Assert ((Ekind (Typ)) = E_Record_Type);
205          if Nkind (Parent (Typ)) = N_Formal_Type_Declaration then
206             Nod := Formal_Type_Definition (Parent (Typ));
207          else
208             Nod := Type_Definition (Parent (Typ));
209          end if;
210       end if;
211
212       return Interface_List (Nod);
213    end Abstract_Interface_List;
214
215    --------------------------------
216    -- Add_Access_Type_To_Process --
217    --------------------------------
218
219    procedure Add_Access_Type_To_Process (E : Entity_Id; A : Entity_Id) is
220       L : Elist_Id;
221
222    begin
223       Ensure_Freeze_Node (E);
224       L := Access_Types_To_Process (Freeze_Node (E));
225
226       if No (L) then
227          L := New_Elmt_List;
228          Set_Access_Types_To_Process (Freeze_Node (E), L);
229       end if;
230
231       Append_Elmt (A, L);
232    end Add_Access_Type_To_Process;
233
234    ----------------------------
235    -- Add_Global_Declaration --
236    ----------------------------
237
238    procedure Add_Global_Declaration (N : Node_Id) is
239       Aux_Node : constant Node_Id := Aux_Decls_Node (Cunit (Current_Sem_Unit));
240
241    begin
242       if No (Declarations (Aux_Node)) then
243          Set_Declarations (Aux_Node, New_List);
244       end if;
245
246       Append_To (Declarations (Aux_Node), N);
247       Analyze (N);
248    end Add_Global_Declaration;
249
250    -----------------
251    -- Addressable --
252    -----------------
253
254    --  For now, just 8/16/32/64. but analyze later if AAMP is special???
255
256    function Addressable (V : Uint) return Boolean is
257    begin
258       return V = Uint_8  or else
259              V = Uint_16 or else
260              V = Uint_32 or else
261              V = Uint_64;
262    end Addressable;
263
264    function Addressable (V : Int) return Boolean is
265    begin
266       return V = 8  or else
267              V = 16 or else
268              V = 32 or else
269              V = 64;
270    end Addressable;
271
272    -----------------------
273    -- Alignment_In_Bits --
274    -----------------------
275
276    function Alignment_In_Bits (E : Entity_Id) return Uint is
277    begin
278       return Alignment (E) * System_Storage_Unit;
279    end Alignment_In_Bits;
280
281    -----------------------------------------
282    -- Apply_Compile_Time_Constraint_Error --
283    -----------------------------------------
284
285    procedure Apply_Compile_Time_Constraint_Error
286      (N      : Node_Id;
287       Msg    : String;
288       Reason : RT_Exception_Code;
289       Ent    : Entity_Id  := Empty;
290       Typ    : Entity_Id  := Empty;
291       Loc    : Source_Ptr := No_Location;
292       Rep    : Boolean    := True;
293       Warn   : Boolean    := False)
294    is
295       Stat   : constant Boolean := Is_Static_Expression (N);
296       R_Stat : constant Node_Id :=
297                  Make_Raise_Constraint_Error (Sloc (N), Reason => Reason);
298       Rtyp   : Entity_Id;
299
300    begin
301       if No (Typ) then
302          Rtyp := Etype (N);
303       else
304          Rtyp := Typ;
305       end if;
306
307       Discard_Node
308         (Compile_Time_Constraint_Error (N, Msg, Ent, Loc, Warn => Warn));
309
310       if not Rep then
311          return;
312       end if;
313
314       --  Now we replace the node by an N_Raise_Constraint_Error node
315       --  This does not need reanalyzing, so set it as analyzed now.
316
317       Rewrite (N, R_Stat);
318       Set_Analyzed (N, True);
319
320       Set_Etype (N, Rtyp);
321       Set_Raises_Constraint_Error (N);
322
323       --  Now deal with possible local raise handling
324
325       Possible_Local_Raise (N, Standard_Constraint_Error);
326
327       --  If the original expression was marked as static, the result is
328       --  still marked as static, but the Raises_Constraint_Error flag is
329       --  always set so that further static evaluation is not attempted.
330
331       if Stat then
332          Set_Is_Static_Expression (N);
333       end if;
334    end Apply_Compile_Time_Constraint_Error;
335
336    --------------------------------------
337    -- Available_Full_View_Of_Component --
338    --------------------------------------
339
340    function Available_Full_View_Of_Component (T : Entity_Id) return Boolean is
341       ST  : constant Entity_Id := Scope (T);
342       SCT : constant Entity_Id := Scope (Component_Type (T));
343    begin
344       return In_Open_Scopes (ST)
345         and then In_Open_Scopes (SCT)
346         and then Scope_Depth (ST) >= Scope_Depth (SCT);
347    end Available_Full_View_Of_Component;
348
349    --------------------------------
350    -- Bad_Predicated_Subtype_Use --
351    --------------------------------
352
353    procedure Bad_Predicated_Subtype_Use
354      (Msg : String;
355       N   : Node_Id;
356       Typ : Entity_Id)
357    is
358    begin
359       if Has_Predicates (Typ) then
360          if Is_Generic_Actual_Type (Typ) then
361             Error_Msg_FE (Msg & '?', N, Typ);
362             Error_Msg_F ("\Program_Error will be raised at run time?", N);
363             Insert_Action (N,
364               Make_Raise_Program_Error (Sloc (N),
365                 Reason => PE_Bad_Predicated_Generic_Type));
366
367          else
368             Error_Msg_FE (Msg, N, Typ);
369          end if;
370       end if;
371    end Bad_Predicated_Subtype_Use;
372
373    --------------------------
374    -- Build_Actual_Subtype --
375    --------------------------
376
377    function Build_Actual_Subtype
378      (T : Entity_Id;
379       N : Node_Or_Entity_Id) return Node_Id
380    is
381       Loc : Source_Ptr;
382       --  Normally Sloc (N), but may point to corresponding body in some cases
383
384       Constraints : List_Id;
385       Decl        : Node_Id;
386       Discr       : Entity_Id;
387       Hi          : Node_Id;
388       Lo          : Node_Id;
389       Subt        : Entity_Id;
390       Disc_Type   : Entity_Id;
391       Obj         : Node_Id;
392
393    begin
394       Loc := Sloc (N);
395
396       if Nkind (N) = N_Defining_Identifier then
397          Obj := New_Reference_To (N, Loc);
398
399          --  If this is a formal parameter of a subprogram declaration, and
400          --  we are compiling the body, we want the declaration for the
401          --  actual subtype to carry the source position of the body, to
402          --  prevent anomalies in gdb when stepping through the code.
403
404          if Is_Formal (N) then
405             declare
406                Decl : constant Node_Id := Unit_Declaration_Node (Scope (N));
407             begin
408                if Nkind (Decl) = N_Subprogram_Declaration
409                  and then Present (Corresponding_Body (Decl))
410                then
411                   Loc := Sloc (Corresponding_Body (Decl));
412                end if;
413             end;
414          end if;
415
416       else
417          Obj := N;
418       end if;
419
420       if Is_Array_Type (T) then
421          Constraints := New_List;
422          for J in 1 .. Number_Dimensions (T) loop
423
424             --  Build an array subtype declaration with the nominal subtype and
425             --  the bounds of the actual. Add the declaration in front of the
426             --  local declarations for the subprogram, for analysis before any
427             --  reference to the formal in the body.
428
429             Lo :=
430               Make_Attribute_Reference (Loc,
431                 Prefix         =>
432                   Duplicate_Subexpr_No_Checks (Obj, Name_Req => True),
433                 Attribute_Name => Name_First,
434                 Expressions    => New_List (
435                   Make_Integer_Literal (Loc, J)));
436
437             Hi :=
438               Make_Attribute_Reference (Loc,
439                 Prefix         =>
440                   Duplicate_Subexpr_No_Checks (Obj, Name_Req => True),
441                 Attribute_Name => Name_Last,
442                 Expressions    => New_List (
443                   Make_Integer_Literal (Loc, J)));
444
445             Append (Make_Range (Loc, Lo, Hi), Constraints);
446          end loop;
447
448       --  If the type has unknown discriminants there is no constrained
449       --  subtype to build. This is never called for a formal or for a
450       --  lhs, so returning the type is ok ???
451
452       elsif Has_Unknown_Discriminants (T) then
453          return T;
454
455       else
456          Constraints := New_List;
457
458          --  Type T is a generic derived type, inherit the discriminants from
459          --  the parent type.
460
461          if Is_Private_Type (T)
462            and then No (Full_View (T))
463
464             --  T was flagged as an error if it was declared as a formal
465             --  derived type with known discriminants. In this case there
466             --  is no need to look at the parent type since T already carries
467             --  its own discriminants.
468
469            and then not Error_Posted (T)
470          then
471             Disc_Type := Etype (Base_Type (T));
472          else
473             Disc_Type := T;
474          end if;
475
476          Discr := First_Discriminant (Disc_Type);
477          while Present (Discr) loop
478             Append_To (Constraints,
479               Make_Selected_Component (Loc,
480                 Prefix =>
481                   Duplicate_Subexpr_No_Checks (Obj),
482                 Selector_Name => New_Occurrence_Of (Discr, Loc)));
483             Next_Discriminant (Discr);
484          end loop;
485       end if;
486
487       Subt := Make_Temporary (Loc, 'S', Related_Node => N);
488       Set_Is_Internal (Subt);
489
490       Decl :=
491         Make_Subtype_Declaration (Loc,
492           Defining_Identifier => Subt,
493           Subtype_Indication =>
494             Make_Subtype_Indication (Loc,
495               Subtype_Mark => New_Reference_To (T,  Loc),
496               Constraint  =>
497                 Make_Index_Or_Discriminant_Constraint (Loc,
498                   Constraints => Constraints)));
499
500       Mark_Rewrite_Insertion (Decl);
501       return Decl;
502    end Build_Actual_Subtype;
503
504    ---------------------------------------
505    -- Build_Actual_Subtype_Of_Component --
506    ---------------------------------------
507
508    function Build_Actual_Subtype_Of_Component
509      (T : Entity_Id;
510       N : Node_Id) return Node_Id
511    is
512       Loc       : constant Source_Ptr := Sloc (N);
513       P         : constant Node_Id    := Prefix (N);
514       D         : Elmt_Id;
515       Id        : Node_Id;
516       Index_Typ : Entity_Id;
517
518       Desig_Typ : Entity_Id;
519       --  This is either a copy of T, or if T is an access type, then it is
520       --  the directly designated type of this access type.
521
522       function Build_Actual_Array_Constraint return List_Id;
523       --  If one or more of the bounds of the component depends on
524       --  discriminants, build  actual constraint using the discriminants
525       --  of the prefix.
526
527       function Build_Actual_Record_Constraint return List_Id;
528       --  Similar to previous one, for discriminated components constrained
529       --  by the discriminant of the enclosing object.
530
531       -----------------------------------
532       -- Build_Actual_Array_Constraint --
533       -----------------------------------
534
535       function Build_Actual_Array_Constraint return List_Id is
536          Constraints : constant List_Id := New_List;
537          Indx        : Node_Id;
538          Hi          : Node_Id;
539          Lo          : Node_Id;
540          Old_Hi      : Node_Id;
541          Old_Lo      : Node_Id;
542
543       begin
544          Indx := First_Index (Desig_Typ);
545          while Present (Indx) loop
546             Old_Lo := Type_Low_Bound  (Etype (Indx));
547             Old_Hi := Type_High_Bound (Etype (Indx));
548
549             if Denotes_Discriminant (Old_Lo) then
550                Lo :=
551                  Make_Selected_Component (Loc,
552                    Prefix => New_Copy_Tree (P),
553                    Selector_Name => New_Occurrence_Of (Entity (Old_Lo), Loc));
554
555             else
556                Lo := New_Copy_Tree (Old_Lo);
557
558                --  The new bound will be reanalyzed in the enclosing
559                --  declaration. For literal bounds that come from a type
560                --  declaration, the type of the context must be imposed, so
561                --  insure that analysis will take place. For non-universal
562                --  types this is not strictly necessary.
563
564                Set_Analyzed (Lo, False);
565             end if;
566
567             if Denotes_Discriminant (Old_Hi) then
568                Hi :=
569                  Make_Selected_Component (Loc,
570                    Prefix => New_Copy_Tree (P),
571                    Selector_Name => New_Occurrence_Of (Entity (Old_Hi), Loc));
572
573             else
574                Hi := New_Copy_Tree (Old_Hi);
575                Set_Analyzed (Hi, False);
576             end if;
577
578             Append (Make_Range (Loc, Lo, Hi), Constraints);
579             Next_Index (Indx);
580          end loop;
581
582          return Constraints;
583       end Build_Actual_Array_Constraint;
584
585       ------------------------------------
586       -- Build_Actual_Record_Constraint --
587       ------------------------------------
588
589       function Build_Actual_Record_Constraint return List_Id is
590          Constraints : constant List_Id := New_List;
591          D           : Elmt_Id;
592          D_Val       : Node_Id;
593
594       begin
595          D := First_Elmt (Discriminant_Constraint (Desig_Typ));
596          while Present (D) loop
597             if Denotes_Discriminant (Node (D)) then
598                D_Val :=  Make_Selected_Component (Loc,
599                  Prefix => New_Copy_Tree (P),
600                 Selector_Name => New_Occurrence_Of (Entity (Node (D)), Loc));
601
602             else
603                D_Val := New_Copy_Tree (Node (D));
604             end if;
605
606             Append (D_Val, Constraints);
607             Next_Elmt (D);
608          end loop;
609
610          return Constraints;
611       end Build_Actual_Record_Constraint;
612
613    --  Start of processing for Build_Actual_Subtype_Of_Component
614
615    begin
616       --  Why the test for Spec_Expression mode here???
617
618       if In_Spec_Expression then
619          return Empty;
620
621       --  More comments for the rest of this body would be good ???
622
623       elsif Nkind (N) = N_Explicit_Dereference then
624          if Is_Composite_Type (T)
625            and then not Is_Constrained (T)
626            and then not (Is_Class_Wide_Type (T)
627                           and then Is_Constrained (Root_Type (T)))
628            and then not Has_Unknown_Discriminants (T)
629          then
630             --  If the type of the dereference is already constrained, it is an
631             --  actual subtype.
632
633             if Is_Array_Type (Etype (N))
634               and then Is_Constrained (Etype (N))
635             then
636                return Empty;
637             else
638                Remove_Side_Effects (P);
639                return Build_Actual_Subtype (T, N);
640             end if;
641          else
642             return Empty;
643          end if;
644       end if;
645
646       if Ekind (T) = E_Access_Subtype then
647          Desig_Typ := Designated_Type (T);
648       else
649          Desig_Typ := T;
650       end if;
651
652       if Ekind (Desig_Typ) = E_Array_Subtype then
653          Id := First_Index (Desig_Typ);
654          while Present (Id) loop
655             Index_Typ := Underlying_Type (Etype (Id));
656
657             if Denotes_Discriminant (Type_Low_Bound  (Index_Typ))
658                  or else
659                Denotes_Discriminant (Type_High_Bound (Index_Typ))
660             then
661                Remove_Side_Effects (P);
662                return
663                  Build_Component_Subtype
664                    (Build_Actual_Array_Constraint, Loc, Base_Type (T));
665             end if;
666
667             Next_Index (Id);
668          end loop;
669
670       elsif Is_Composite_Type (Desig_Typ)
671         and then Has_Discriminants (Desig_Typ)
672         and then not Has_Unknown_Discriminants (Desig_Typ)
673       then
674          if Is_Private_Type (Desig_Typ)
675            and then No (Discriminant_Constraint (Desig_Typ))
676          then
677             Desig_Typ := Full_View (Desig_Typ);
678          end if;
679
680          D := First_Elmt (Discriminant_Constraint (Desig_Typ));
681          while Present (D) loop
682             if Denotes_Discriminant (Node (D)) then
683                Remove_Side_Effects (P);
684                return
685                  Build_Component_Subtype (
686                    Build_Actual_Record_Constraint, Loc, Base_Type (T));
687             end if;
688
689             Next_Elmt (D);
690          end loop;
691       end if;
692
693       --  If none of the above, the actual and nominal subtypes are the same
694
695       return Empty;
696    end Build_Actual_Subtype_Of_Component;
697
698    -----------------------------
699    -- Build_Component_Subtype --
700    -----------------------------
701
702    function Build_Component_Subtype
703      (C   : List_Id;
704       Loc : Source_Ptr;
705       T   : Entity_Id) return Node_Id
706    is
707       Subt : Entity_Id;
708       Decl : Node_Id;
709
710    begin
711       --  Unchecked_Union components do not require component subtypes
712
713       if Is_Unchecked_Union (T) then
714          return Empty;
715       end if;
716
717       Subt := Make_Temporary (Loc, 'S');
718       Set_Is_Internal (Subt);
719
720       Decl :=
721         Make_Subtype_Declaration (Loc,
722           Defining_Identifier => Subt,
723           Subtype_Indication =>
724             Make_Subtype_Indication (Loc,
725               Subtype_Mark => New_Reference_To (Base_Type (T),  Loc),
726               Constraint  =>
727                 Make_Index_Or_Discriminant_Constraint (Loc,
728                   Constraints => C)));
729
730       Mark_Rewrite_Insertion (Decl);
731       return Decl;
732    end Build_Component_Subtype;
733
734    ---------------------------
735    -- Build_Default_Subtype --
736    ---------------------------
737
738    function Build_Default_Subtype
739      (T : Entity_Id;
740       N : Node_Id) return Entity_Id
741    is
742       Loc  : constant Source_Ptr := Sloc (N);
743       Disc : Entity_Id;
744
745    begin
746       if not Has_Discriminants (T) or else Is_Constrained (T) then
747          return T;
748       end if;
749
750       Disc := First_Discriminant (T);
751
752       if No (Discriminant_Default_Value (Disc)) then
753          return T;
754       end if;
755
756       declare
757          Act         : constant Entity_Id := Make_Temporary (Loc, 'S');
758          Constraints : constant List_Id := New_List;
759          Decl        : Node_Id;
760
761       begin
762          while Present (Disc) loop
763             Append_To (Constraints,
764               New_Copy_Tree (Discriminant_Default_Value (Disc)));
765             Next_Discriminant (Disc);
766          end loop;
767
768          Decl :=
769            Make_Subtype_Declaration (Loc,
770              Defining_Identifier => Act,
771              Subtype_Indication =>
772                Make_Subtype_Indication (Loc,
773                  Subtype_Mark => New_Occurrence_Of (T, Loc),
774                  Constraint =>
775                    Make_Index_Or_Discriminant_Constraint (Loc,
776                      Constraints => Constraints)));
777
778          Insert_Action (N, Decl);
779          Analyze (Decl);
780          return Act;
781       end;
782    end Build_Default_Subtype;
783
784    --------------------------------------------
785    -- Build_Discriminal_Subtype_Of_Component --
786    --------------------------------------------
787
788    function Build_Discriminal_Subtype_Of_Component
789      (T : Entity_Id) return Node_Id
790    is
791       Loc : constant Source_Ptr := Sloc (T);
792       D   : Elmt_Id;
793       Id  : Node_Id;
794
795       function Build_Discriminal_Array_Constraint return List_Id;
796       --  If one or more of the bounds of the component depends on
797       --  discriminants, build  actual constraint using the discriminants
798       --  of the prefix.
799
800       function Build_Discriminal_Record_Constraint return List_Id;
801       --  Similar to previous one, for discriminated components constrained
802       --  by the discriminant of the enclosing object.
803
804       ----------------------------------------
805       -- Build_Discriminal_Array_Constraint --
806       ----------------------------------------
807
808       function Build_Discriminal_Array_Constraint return List_Id is
809          Constraints : constant List_Id := New_List;
810          Indx        : Node_Id;
811          Hi          : Node_Id;
812          Lo          : Node_Id;
813          Old_Hi      : Node_Id;
814          Old_Lo      : Node_Id;
815
816       begin
817          Indx := First_Index (T);
818          while Present (Indx) loop
819             Old_Lo := Type_Low_Bound  (Etype (Indx));
820             Old_Hi := Type_High_Bound (Etype (Indx));
821
822             if Denotes_Discriminant (Old_Lo) then
823                Lo := New_Occurrence_Of (Discriminal (Entity (Old_Lo)), Loc);
824
825             else
826                Lo := New_Copy_Tree (Old_Lo);
827             end if;
828
829             if Denotes_Discriminant (Old_Hi) then
830                Hi := New_Occurrence_Of (Discriminal (Entity (Old_Hi)), Loc);
831
832             else
833                Hi := New_Copy_Tree (Old_Hi);
834             end if;
835
836             Append (Make_Range (Loc, Lo, Hi), Constraints);
837             Next_Index (Indx);
838          end loop;
839
840          return Constraints;
841       end Build_Discriminal_Array_Constraint;
842
843       -----------------------------------------
844       -- Build_Discriminal_Record_Constraint --
845       -----------------------------------------
846
847       function Build_Discriminal_Record_Constraint return List_Id is
848          Constraints : constant List_Id := New_List;
849          D           : Elmt_Id;
850          D_Val       : Node_Id;
851
852       begin
853          D := First_Elmt (Discriminant_Constraint (T));
854          while Present (D) loop
855             if Denotes_Discriminant (Node (D)) then
856                D_Val :=
857                  New_Occurrence_Of (Discriminal (Entity (Node (D))), Loc);
858
859             else
860                D_Val := New_Copy_Tree (Node (D));
861             end if;
862
863             Append (D_Val, Constraints);
864             Next_Elmt (D);
865          end loop;
866
867          return Constraints;
868       end Build_Discriminal_Record_Constraint;
869
870    --  Start of processing for Build_Discriminal_Subtype_Of_Component
871
872    begin
873       if Ekind (T) = E_Array_Subtype then
874          Id := First_Index (T);
875          while Present (Id) loop
876             if Denotes_Discriminant (Type_Low_Bound  (Etype (Id))) or else
877                Denotes_Discriminant (Type_High_Bound (Etype (Id)))
878             then
879                return Build_Component_Subtype
880                  (Build_Discriminal_Array_Constraint, Loc, T);
881             end if;
882
883             Next_Index (Id);
884          end loop;
885
886       elsif Ekind (T) = E_Record_Subtype
887         and then Has_Discriminants (T)
888         and then not Has_Unknown_Discriminants (T)
889       then
890          D := First_Elmt (Discriminant_Constraint (T));
891          while Present (D) loop
892             if Denotes_Discriminant (Node (D)) then
893                return Build_Component_Subtype
894                  (Build_Discriminal_Record_Constraint, Loc, T);
895             end if;
896
897             Next_Elmt (D);
898          end loop;
899       end if;
900
901       --  If none of the above, the actual and nominal subtypes are the same
902
903       return Empty;
904    end Build_Discriminal_Subtype_Of_Component;
905
906    ------------------------------
907    -- Build_Elaboration_Entity --
908    ------------------------------
909
910    procedure Build_Elaboration_Entity (N : Node_Id; Spec_Id : Entity_Id) is
911       Loc      : constant Source_Ptr := Sloc (N);
912       Decl     : Node_Id;
913       Elab_Ent : Entity_Id;
914
915       procedure Set_Package_Name (Ent : Entity_Id);
916       --  Given an entity, sets the fully qualified name of the entity in
917       --  Name_Buffer, with components separated by double underscores. This
918       --  is a recursive routine that climbs the scope chain to Standard.
919
920       ----------------------
921       -- Set_Package_Name --
922       ----------------------
923
924       procedure Set_Package_Name (Ent : Entity_Id) is
925       begin
926          if Scope (Ent) /= Standard_Standard then
927             Set_Package_Name (Scope (Ent));
928
929             declare
930                Nam : constant String := Get_Name_String (Chars (Ent));
931             begin
932                Name_Buffer (Name_Len + 1) := '_';
933                Name_Buffer (Name_Len + 2) := '_';
934                Name_Buffer (Name_Len + 3 .. Name_Len + Nam'Length + 2) := Nam;
935                Name_Len := Name_Len + Nam'Length + 2;
936             end;
937
938          else
939             Get_Name_String (Chars (Ent));
940          end if;
941       end Set_Package_Name;
942
943    --  Start of processing for Build_Elaboration_Entity
944
945    begin
946       --  Ignore if already constructed
947
948       if Present (Elaboration_Entity (Spec_Id)) then
949          return;
950       end if;
951
952       --  Construct name of elaboration entity as xxx_E, where xxx is the unit
953       --  name with dots replaced by double underscore. We have to manually
954       --  construct this name, since it will be elaborated in the outer scope,
955       --  and thus will not have the unit name automatically prepended.
956
957       Set_Package_Name (Spec_Id);
958
959       --  Append _E
960
961       Name_Buffer (Name_Len + 1) := '_';
962       Name_Buffer (Name_Len + 2) := 'E';
963       Name_Len := Name_Len + 2;
964
965       --  Create elaboration counter
966
967       Elab_Ent := Make_Defining_Identifier (Loc, Chars => Name_Find);
968       Set_Elaboration_Entity (Spec_Id, Elab_Ent);
969
970       Decl :=
971         Make_Object_Declaration (Loc,
972           Defining_Identifier => Elab_Ent,
973           Object_Definition   =>
974             New_Occurrence_Of (Standard_Short_Integer, Loc),
975           Expression          => Make_Integer_Literal (Loc, Uint_0));
976
977       Push_Scope (Standard_Standard);
978       Add_Global_Declaration (Decl);
979       Pop_Scope;
980
981       --  Reset True_Constant indication, since we will indeed assign a value
982       --  to the variable in the binder main. We also kill the Current_Value
983       --  and Last_Assignment fields for the same reason.
984
985       Set_Is_True_Constant (Elab_Ent, False);
986       Set_Current_Value    (Elab_Ent, Empty);
987       Set_Last_Assignment  (Elab_Ent, Empty);
988
989       --  We do not want any further qualification of the name (if we did
990       --  not do this, we would pick up the name of the generic package
991       --  in the case of a library level generic instantiation).
992
993       Set_Has_Qualified_Name       (Elab_Ent);
994       Set_Has_Fully_Qualified_Name (Elab_Ent);
995    end Build_Elaboration_Entity;
996
997    --------------------------------
998    -- Build_Explicit_Dereference --
999    --------------------------------
1000
1001    procedure Build_Explicit_Dereference
1002      (Expr : Node_Id;
1003       Disc : Entity_Id)
1004    is
1005       Loc : constant Source_Ptr := Sloc (Expr);
1006    begin
1007       Set_Is_Overloaded (Expr, False);
1008       Rewrite (Expr,
1009         Make_Explicit_Dereference (Loc,
1010           Prefix =>
1011             Make_Selected_Component (Loc,
1012               Prefix        => Relocate_Node (Expr),
1013               Selector_Name => New_Occurrence_Of (Disc, Loc))));
1014       Set_Etype (Prefix (Expr), Etype (Disc));
1015       Set_Etype (Expr, Designated_Type (Etype (Disc)));
1016    end Build_Explicit_Dereference;
1017
1018    -----------------------------------
1019    -- Cannot_Raise_Constraint_Error --
1020    -----------------------------------
1021
1022    function Cannot_Raise_Constraint_Error (Expr : Node_Id) return Boolean is
1023    begin
1024       if Compile_Time_Known_Value (Expr) then
1025          return True;
1026
1027       elsif Do_Range_Check (Expr) then
1028          return False;
1029
1030       elsif Raises_Constraint_Error (Expr) then
1031          return False;
1032
1033       else
1034          case Nkind (Expr) is
1035             when N_Identifier =>
1036                return True;
1037
1038             when N_Expanded_Name =>
1039                return True;
1040
1041             when N_Selected_Component =>
1042                return not Do_Discriminant_Check (Expr);
1043
1044             when N_Attribute_Reference =>
1045                if Do_Overflow_Check (Expr) then
1046                   return False;
1047
1048                elsif No (Expressions (Expr)) then
1049                   return True;
1050
1051                else
1052                   declare
1053                      N : Node_Id;
1054
1055                   begin
1056                      N := First (Expressions (Expr));
1057                      while Present (N) loop
1058                         if Cannot_Raise_Constraint_Error (N) then
1059                            Next (N);
1060                         else
1061                            return False;
1062                         end if;
1063                      end loop;
1064
1065                      return True;
1066                   end;
1067                end if;
1068
1069             when N_Type_Conversion =>
1070                if Do_Overflow_Check (Expr)
1071                  or else Do_Length_Check (Expr)
1072                  or else Do_Tag_Check (Expr)
1073                then
1074                   return False;
1075                else
1076                   return
1077                     Cannot_Raise_Constraint_Error (Expression (Expr));
1078                end if;
1079
1080             when N_Unchecked_Type_Conversion =>
1081                return Cannot_Raise_Constraint_Error (Expression (Expr));
1082
1083             when N_Unary_Op =>
1084                if Do_Overflow_Check (Expr) then
1085                   return False;
1086                else
1087                   return
1088                     Cannot_Raise_Constraint_Error (Right_Opnd (Expr));
1089                end if;
1090
1091             when N_Op_Divide |
1092                  N_Op_Mod    |
1093                  N_Op_Rem
1094             =>
1095                if Do_Division_Check (Expr)
1096                  or else Do_Overflow_Check (Expr)
1097                then
1098                   return False;
1099                else
1100                   return
1101                     Cannot_Raise_Constraint_Error (Left_Opnd (Expr))
1102                       and then
1103                     Cannot_Raise_Constraint_Error (Right_Opnd (Expr));
1104                end if;
1105
1106             when N_Op_Add                    |
1107                  N_Op_And                    |
1108                  N_Op_Concat                 |
1109                  N_Op_Eq                     |
1110                  N_Op_Expon                  |
1111                  N_Op_Ge                     |
1112                  N_Op_Gt                     |
1113                  N_Op_Le                     |
1114                  N_Op_Lt                     |
1115                  N_Op_Multiply               |
1116                  N_Op_Ne                     |
1117                  N_Op_Or                     |
1118                  N_Op_Rotate_Left            |
1119                  N_Op_Rotate_Right           |
1120                  N_Op_Shift_Left             |
1121                  N_Op_Shift_Right            |
1122                  N_Op_Shift_Right_Arithmetic |
1123                  N_Op_Subtract               |
1124                  N_Op_Xor
1125             =>
1126                if Do_Overflow_Check (Expr) then
1127                   return False;
1128                else
1129                   return
1130                     Cannot_Raise_Constraint_Error (Left_Opnd (Expr))
1131                       and then
1132                     Cannot_Raise_Constraint_Error (Right_Opnd (Expr));
1133                end if;
1134
1135             when others =>
1136                return False;
1137          end case;
1138       end if;
1139    end Cannot_Raise_Constraint_Error;
1140
1141    --------------------------------
1142    -- Check_Implicit_Dereference --
1143    --------------------------------
1144
1145    procedure Check_Implicit_Dereference (Nam : Node_Id;  Typ : Entity_Id)
1146    is
1147       Disc  : Entity_Id;
1148       Desig : Entity_Id;
1149
1150    begin
1151       if Ada_Version < Ada_2012
1152         or else not Has_Implicit_Dereference (Base_Type (Typ))
1153       then
1154          return;
1155
1156       elsif not Comes_From_Source (Nam) then
1157          return;
1158
1159       elsif Is_Entity_Name (Nam)
1160         and then Is_Type (Entity (Nam))
1161       then
1162          null;
1163
1164       else
1165          Disc := First_Discriminant (Typ);
1166          while Present (Disc) loop
1167             if Has_Implicit_Dereference (Disc) then
1168                Desig := Designated_Type (Etype (Disc));
1169                Add_One_Interp (Nam, Disc, Desig);
1170                exit;
1171             end if;
1172
1173             Next_Discriminant (Disc);
1174          end loop;
1175       end if;
1176    end Check_Implicit_Dereference;
1177
1178    ---------------------------------------
1179    -- Check_Later_Vs_Basic_Declarations --
1180    ---------------------------------------
1181
1182    procedure Check_Later_Vs_Basic_Declarations
1183      (Decls          : List_Id;
1184       During_Parsing : Boolean)
1185    is
1186       Body_Sloc : Source_Ptr;
1187       Decl      : Node_Id;
1188
1189       function Is_Later_Declarative_Item (Decl : Node_Id) return Boolean;
1190       --  Return whether Decl is considered as a declarative item.
1191       --  When During_Parsing is True, the semantics of Ada 83 is followed.
1192       --  When During_Parsing is False, the semantics of SPARK is followed.
1193
1194       -------------------------------
1195       -- Is_Later_Declarative_Item --
1196       -------------------------------
1197
1198       function Is_Later_Declarative_Item (Decl : Node_Id) return Boolean is
1199       begin
1200          if Nkind (Decl) in N_Later_Decl_Item then
1201             return True;
1202
1203          elsif Nkind (Decl) = N_Pragma then
1204             return True;
1205
1206          elsif During_Parsing then
1207             return False;
1208
1209          --  In SPARK, a package declaration is not considered as a later
1210          --  declarative item.
1211
1212          elsif Nkind (Decl) = N_Package_Declaration then
1213             return False;
1214
1215          --  In SPARK, a renaming is considered as a later declarative item
1216
1217          elsif Nkind (Decl) in N_Renaming_Declaration then
1218             return True;
1219
1220          else
1221             return False;
1222          end if;
1223       end Is_Later_Declarative_Item;
1224
1225    --  Start of Check_Later_Vs_Basic_Declarations
1226
1227    begin
1228       Decl := First (Decls);
1229
1230       --  Loop through sequence of basic declarative items
1231
1232       Outer : while Present (Decl) loop
1233          if Nkind (Decl) /= N_Subprogram_Body
1234            and then Nkind (Decl) /= N_Package_Body
1235            and then Nkind (Decl) /= N_Task_Body
1236            and then Nkind (Decl) not in N_Body_Stub
1237          then
1238             Next (Decl);
1239
1240             --  Once a body is encountered, we only allow later declarative
1241             --  items. The inner loop checks the rest of the list.
1242
1243          else
1244             Body_Sloc := Sloc (Decl);
1245
1246             Inner : while Present (Decl) loop
1247                if not Is_Later_Declarative_Item (Decl) then
1248                   if During_Parsing then
1249                      if Ada_Version = Ada_83 then
1250                         Error_Msg_Sloc := Body_Sloc;
1251                         Error_Msg_N
1252                           ("(Ada 83) decl cannot appear after body#", Decl);
1253                      end if;
1254                   else
1255                      Error_Msg_Sloc := Body_Sloc;
1256                      Check_SPARK_Restriction
1257                        ("decl cannot appear after body#", Decl);
1258                   end if;
1259                end if;
1260
1261                Next (Decl);
1262             end loop Inner;
1263          end if;
1264       end loop Outer;
1265    end Check_Later_Vs_Basic_Declarations;
1266
1267    -----------------------------------------
1268    -- Check_Dynamically_Tagged_Expression --
1269    -----------------------------------------
1270
1271    procedure Check_Dynamically_Tagged_Expression
1272      (Expr        : Node_Id;
1273       Typ         : Entity_Id;
1274       Related_Nod : Node_Id)
1275    is
1276    begin
1277       pragma Assert (Is_Tagged_Type (Typ));
1278
1279       --  In order to avoid spurious errors when analyzing the expanded code,
1280       --  this check is done only for nodes that come from source and for
1281       --  actuals of generic instantiations.
1282
1283       if (Comes_From_Source (Related_Nod)
1284            or else In_Generic_Actual (Expr))
1285         and then (Is_Class_Wide_Type (Etype (Expr))
1286                    or else Is_Dynamically_Tagged (Expr))
1287         and then Is_Tagged_Type (Typ)
1288         and then not Is_Class_Wide_Type (Typ)
1289       then
1290          Error_Msg_N ("dynamically tagged expression not allowed!", Expr);
1291       end if;
1292    end Check_Dynamically_Tagged_Expression;
1293
1294    --------------------------
1295    -- Check_Fully_Declared --
1296    --------------------------
1297
1298    procedure Check_Fully_Declared (T : Entity_Id; N : Node_Id) is
1299    begin
1300       if Ekind (T) = E_Incomplete_Type then
1301
1302          --  Ada 2005 (AI-50217): If the type is available through a limited
1303          --  with_clause, verify that its full view has been analyzed.
1304
1305          if From_With_Type (T)
1306            and then Present (Non_Limited_View (T))
1307            and then Ekind (Non_Limited_View (T)) /= E_Incomplete_Type
1308          then
1309             --  The non-limited view is fully declared
1310             null;
1311
1312          else
1313             Error_Msg_NE
1314               ("premature usage of incomplete}", N, First_Subtype (T));
1315          end if;
1316
1317       --  Need comments for these tests ???
1318
1319       elsif Has_Private_Component (T)
1320         and then not Is_Generic_Type (Root_Type (T))
1321         and then not In_Spec_Expression
1322       then
1323          --  Special case: if T is the anonymous type created for a single
1324          --  task or protected object, use the name of the source object.
1325
1326          if Is_Concurrent_Type (T)
1327            and then not Comes_From_Source (T)
1328            and then Nkind (N) = N_Object_Declaration
1329          then
1330             Error_Msg_NE ("type of& has incomplete component", N,
1331               Defining_Identifier (N));
1332
1333          else
1334             Error_Msg_NE
1335               ("premature usage of incomplete}", N, First_Subtype (T));
1336          end if;
1337       end if;
1338    end Check_Fully_Declared;
1339
1340    -------------------------
1341    -- Check_Nested_Access --
1342    -------------------------
1343
1344    procedure Check_Nested_Access (Ent : Entity_Id) is
1345       Scop         : constant Entity_Id := Current_Scope;
1346       Current_Subp : Entity_Id;
1347       Enclosing    : Entity_Id;
1348
1349    begin
1350       --  Currently only enabled for VM back-ends for efficiency, should we
1351       --  enable it more systematically ???
1352
1353       --  Check for Is_Imported needs commenting below ???
1354
1355       if VM_Target /= No_VM
1356         and then (Ekind (Ent) = E_Variable
1357                     or else
1358                   Ekind (Ent) = E_Constant
1359                     or else
1360                   Ekind (Ent) = E_Loop_Parameter)
1361         and then Scope (Ent) /= Empty
1362         and then not Is_Library_Level_Entity (Ent)
1363         and then not Is_Imported (Ent)
1364       then
1365          if Is_Subprogram (Scop)
1366            or else Is_Generic_Subprogram (Scop)
1367            or else Is_Entry (Scop)
1368          then
1369             Current_Subp := Scop;
1370          else
1371             Current_Subp := Current_Subprogram;
1372          end if;
1373
1374          Enclosing := Enclosing_Subprogram (Ent);
1375
1376          if Enclosing /= Empty
1377            and then Enclosing /= Current_Subp
1378          then
1379             Set_Has_Up_Level_Access (Ent, True);
1380          end if;
1381       end if;
1382    end Check_Nested_Access;
1383
1384    ----------------------------
1385    -- Check_Order_Dependence --
1386    ----------------------------
1387
1388    procedure Check_Order_Dependence is
1389       Act1 : Node_Id;
1390       Act2 : Node_Id;
1391
1392    begin
1393       if Ada_Version < Ada_2012 then
1394          return;
1395       end if;
1396
1397       --  Ada 2012 AI05-0144-2: Dangerous order dependence. Actuals in nested
1398       --  calls within a construct have been collected. If one of them is
1399       --  writable and overlaps with another one, evaluation of the enclosing
1400       --  construct is nondeterministic. This is illegal in Ada 2012, but is
1401       --  treated as a warning for now.
1402
1403       for J in 1 .. Actuals_In_Call.Last loop
1404          if Actuals_In_Call.Table (J).Is_Writable then
1405             Act1 := Actuals_In_Call.Table (J).Act;
1406
1407             if Nkind (Act1) = N_Attribute_Reference then
1408                Act1 := Prefix (Act1);
1409             end if;
1410
1411             for K in 1 .. Actuals_In_Call.Last loop
1412                if K /= J then
1413                   Act2 := Actuals_In_Call.Table (K).Act;
1414
1415                   if Nkind (Act2) = N_Attribute_Reference then
1416                      Act2 := Prefix (Act2);
1417                   end if;
1418
1419                   if Actuals_In_Call.Table (K).Is_Writable
1420                     and then K < J
1421                   then
1422                      --  Already checked
1423
1424                      null;
1425
1426                   elsif Denotes_Same_Object (Act1, Act2)
1427                     and then Parent (Act1) /= Parent (Act2)
1428                   then
1429                      Error_Msg_N
1430                        ("result may differ if evaluated "
1431                         & "after other actual in expression?", Act1);
1432                   end if;
1433                end if;
1434             end loop;
1435          end if;
1436       end loop;
1437
1438       --  Remove checked actuals from table
1439
1440       Actuals_In_Call.Set_Last (0);
1441    end Check_Order_Dependence;
1442
1443    ------------------------------------------
1444    -- Check_Potentially_Blocking_Operation --
1445    ------------------------------------------
1446
1447    procedure Check_Potentially_Blocking_Operation (N : Node_Id) is
1448       S : Entity_Id;
1449
1450    begin
1451       --  N is one of the potentially blocking operations listed in 9.5.1(8).
1452       --  When pragma Detect_Blocking is active, the run time will raise
1453       --  Program_Error. Here we only issue a warning, since we generally
1454       --  support the use of potentially blocking operations in the absence
1455       --  of the pragma.
1456
1457       --  Indirect blocking through a subprogram call cannot be diagnosed
1458       --  statically without interprocedural analysis, so we do not attempt
1459       --  to do it here.
1460
1461       S := Scope (Current_Scope);
1462       while Present (S) and then S /= Standard_Standard loop
1463          if Is_Protected_Type (S) then
1464             Error_Msg_N
1465               ("potentially blocking operation in protected operation?", N);
1466             return;
1467          end if;
1468
1469          S := Scope (S);
1470       end loop;
1471    end Check_Potentially_Blocking_Operation;
1472
1473    ------------------------------
1474    -- Check_Unprotected_Access --
1475    ------------------------------
1476
1477    procedure Check_Unprotected_Access
1478      (Context : Node_Id;
1479       Expr    : Node_Id)
1480    is
1481       Cont_Encl_Typ : Entity_Id;
1482       Pref_Encl_Typ : Entity_Id;
1483
1484       function Enclosing_Protected_Type (Obj : Node_Id) return Entity_Id;
1485       --  Check whether Obj is a private component of a protected object.
1486       --  Return the protected type where the component resides, Empty
1487       --  otherwise.
1488
1489       function Is_Public_Operation return Boolean;
1490       --  Verify that the enclosing operation is callable from outside the
1491       --  protected object, to minimize false positives.
1492
1493       ------------------------------
1494       -- Enclosing_Protected_Type --
1495       ------------------------------
1496
1497       function Enclosing_Protected_Type (Obj : Node_Id) return Entity_Id is
1498       begin
1499          if Is_Entity_Name (Obj) then
1500             declare
1501                Ent : Entity_Id := Entity (Obj);
1502
1503             begin
1504                --  The object can be a renaming of a private component, use
1505                --  the original record component.
1506
1507                if Is_Prival (Ent) then
1508                   Ent := Prival_Link (Ent);
1509                end if;
1510
1511                if Is_Protected_Type (Scope (Ent)) then
1512                   return Scope (Ent);
1513                end if;
1514             end;
1515          end if;
1516
1517          --  For indexed and selected components, recursively check the prefix
1518
1519          if Nkind_In (Obj, N_Indexed_Component, N_Selected_Component) then
1520             return Enclosing_Protected_Type (Prefix (Obj));
1521
1522          --  The object does not denote a protected component
1523
1524          else
1525             return Empty;
1526          end if;
1527       end Enclosing_Protected_Type;
1528
1529       -------------------------
1530       -- Is_Public_Operation --
1531       -------------------------
1532
1533       function Is_Public_Operation return Boolean is
1534          S : Entity_Id;
1535          E : Entity_Id;
1536
1537       begin
1538          S := Current_Scope;
1539          while Present (S)
1540            and then S /= Pref_Encl_Typ
1541          loop
1542             if Scope (S) = Pref_Encl_Typ then
1543                E := First_Entity (Pref_Encl_Typ);
1544                while Present (E)
1545                  and then E /= First_Private_Entity (Pref_Encl_Typ)
1546                loop
1547                   if E = S then
1548                      return True;
1549                   end if;
1550                   Next_Entity (E);
1551                end loop;
1552             end if;
1553
1554             S := Scope (S);
1555          end loop;
1556
1557          return False;
1558       end Is_Public_Operation;
1559
1560    --  Start of processing for Check_Unprotected_Access
1561
1562    begin
1563       if Nkind (Expr) = N_Attribute_Reference
1564         and then Attribute_Name (Expr) = Name_Unchecked_Access
1565       then
1566          Cont_Encl_Typ := Enclosing_Protected_Type (Context);
1567          Pref_Encl_Typ := Enclosing_Protected_Type (Prefix (Expr));
1568
1569          --  Check whether we are trying to export a protected component to a
1570          --  context with an equal or lower access level.
1571
1572          if Present (Pref_Encl_Typ)
1573            and then No (Cont_Encl_Typ)
1574            and then Is_Public_Operation
1575            and then Scope_Depth (Pref_Encl_Typ) >=
1576                       Object_Access_Level (Context)
1577          then
1578             Error_Msg_N
1579               ("?possible unprotected access to protected data", Expr);
1580          end if;
1581       end if;
1582    end Check_Unprotected_Access;
1583
1584    ---------------
1585    -- Check_VMS --
1586    ---------------
1587
1588    procedure Check_VMS (Construct : Node_Id) is
1589    begin
1590       if not OpenVMS_On_Target then
1591          Error_Msg_N
1592            ("this construct is allowed only in Open'V'M'S", Construct);
1593       end if;
1594    end Check_VMS;
1595
1596    ------------------------
1597    -- Collect_Interfaces --
1598    ------------------------
1599
1600    procedure Collect_Interfaces
1601      (T               : Entity_Id;
1602       Ifaces_List     : out Elist_Id;
1603       Exclude_Parents : Boolean := False;
1604       Use_Full_View   : Boolean := True)
1605    is
1606       procedure Collect (Typ : Entity_Id);
1607       --  Subsidiary subprogram used to traverse the whole list
1608       --  of directly and indirectly implemented interfaces
1609
1610       -------------
1611       -- Collect --
1612       -------------
1613
1614       procedure Collect (Typ : Entity_Id) is
1615          Ancestor   : Entity_Id;
1616          Full_T     : Entity_Id;
1617          Id         : Node_Id;
1618          Iface      : Entity_Id;
1619
1620       begin
1621          Full_T := Typ;
1622
1623          --  Handle private types
1624
1625          if Use_Full_View
1626            and then Is_Private_Type (Typ)
1627            and then Present (Full_View (Typ))
1628          then
1629             Full_T := Full_View (Typ);
1630          end if;
1631
1632          --  Include the ancestor if we are generating the whole list of
1633          --  abstract interfaces.
1634
1635          if Etype (Full_T) /= Typ
1636
1637             --  Protect the frontend against wrong sources. For example:
1638
1639             --    package P is
1640             --      type A is tagged null record;
1641             --      type B is new A with private;
1642             --      type C is new A with private;
1643             --    private
1644             --      type B is new C with null record;
1645             --      type C is new B with null record;
1646             --    end P;
1647
1648            and then Etype (Full_T) /= T
1649          then
1650             Ancestor := Etype (Full_T);
1651             Collect (Ancestor);
1652
1653             if Is_Interface (Ancestor)
1654               and then not Exclude_Parents
1655             then
1656                Append_Unique_Elmt (Ancestor, Ifaces_List);
1657             end if;
1658          end if;
1659
1660          --  Traverse the graph of ancestor interfaces
1661
1662          if Is_Non_Empty_List (Abstract_Interface_List (Full_T)) then
1663             Id := First (Abstract_Interface_List (Full_T));
1664             while Present (Id) loop
1665                Iface := Etype (Id);
1666
1667                --  Protect against wrong uses. For example:
1668                --    type I is interface;
1669                --    type O is tagged null record;
1670                --    type Wrong is new I and O with null record; -- ERROR
1671
1672                if Is_Interface (Iface) then
1673                   if Exclude_Parents
1674                     and then Etype (T) /= T
1675                     and then Interface_Present_In_Ancestor (Etype (T), Iface)
1676                   then
1677                      null;
1678                   else
1679                      Collect (Iface);
1680                      Append_Unique_Elmt (Iface, Ifaces_List);
1681                   end if;
1682                end if;
1683
1684                Next (Id);
1685             end loop;
1686          end if;
1687       end Collect;
1688
1689    --  Start of processing for Collect_Interfaces
1690
1691    begin
1692       pragma Assert (Is_Tagged_Type (T) or else Is_Concurrent_Type (T));
1693       Ifaces_List := New_Elmt_List;
1694       Collect (T);
1695    end Collect_Interfaces;
1696
1697    ----------------------------------
1698    -- Collect_Interface_Components --
1699    ----------------------------------
1700
1701    procedure Collect_Interface_Components
1702      (Tagged_Type     : Entity_Id;
1703       Components_List : out Elist_Id)
1704    is
1705       procedure Collect (Typ : Entity_Id);
1706       --  Subsidiary subprogram used to climb to the parents
1707
1708       -------------
1709       -- Collect --
1710       -------------
1711
1712       procedure Collect (Typ : Entity_Id) is
1713          Tag_Comp   : Entity_Id;
1714          Parent_Typ : Entity_Id;
1715
1716       begin
1717          --  Handle private types
1718
1719          if Present (Full_View (Etype (Typ))) then
1720             Parent_Typ := Full_View (Etype (Typ));
1721          else
1722             Parent_Typ := Etype (Typ);
1723          end if;
1724
1725          if Parent_Typ /= Typ
1726
1727             --  Protect the frontend against wrong sources. For example:
1728
1729             --    package P is
1730             --      type A is tagged null record;
1731             --      type B is new A with private;
1732             --      type C is new A with private;
1733             --    private
1734             --      type B is new C with null record;
1735             --      type C is new B with null record;
1736             --    end P;
1737
1738            and then Parent_Typ /= Tagged_Type
1739          then
1740             Collect (Parent_Typ);
1741          end if;
1742
1743          --  Collect the components containing tags of secondary dispatch
1744          --  tables.
1745
1746          Tag_Comp := Next_Tag_Component (First_Tag_Component (Typ));
1747          while Present (Tag_Comp) loop
1748             pragma Assert (Present (Related_Type (Tag_Comp)));
1749             Append_Elmt (Tag_Comp, Components_List);
1750
1751             Tag_Comp := Next_Tag_Component (Tag_Comp);
1752          end loop;
1753       end Collect;
1754
1755    --  Start of processing for Collect_Interface_Components
1756
1757    begin
1758       pragma Assert (Ekind (Tagged_Type) = E_Record_Type
1759         and then Is_Tagged_Type (Tagged_Type));
1760
1761       Components_List := New_Elmt_List;
1762       Collect (Tagged_Type);
1763    end Collect_Interface_Components;
1764
1765    -----------------------------
1766    -- Collect_Interfaces_Info --
1767    -----------------------------
1768
1769    procedure Collect_Interfaces_Info
1770      (T               : Entity_Id;
1771       Ifaces_List     : out Elist_Id;
1772       Components_List : out Elist_Id;
1773       Tags_List       : out Elist_Id)
1774    is
1775       Comps_List : Elist_Id;
1776       Comp_Elmt  : Elmt_Id;
1777       Comp_Iface : Entity_Id;
1778       Iface_Elmt : Elmt_Id;
1779       Iface      : Entity_Id;
1780
1781       function Search_Tag (Iface : Entity_Id) return Entity_Id;
1782       --  Search for the secondary tag associated with the interface type
1783       --  Iface that is implemented by T.
1784
1785       ----------------
1786       -- Search_Tag --
1787       ----------------
1788
1789       function Search_Tag (Iface : Entity_Id) return Entity_Id is
1790          ADT : Elmt_Id;
1791       begin
1792          if not Is_CPP_Class (T) then
1793             ADT := Next_Elmt (Next_Elmt (First_Elmt (Access_Disp_Table (T))));
1794          else
1795             ADT := Next_Elmt (First_Elmt (Access_Disp_Table (T)));
1796          end if;
1797
1798          while Present (ADT)
1799             and then Is_Tag (Node (ADT))
1800             and then Related_Type (Node (ADT)) /= Iface
1801          loop
1802             --  Skip secondary dispatch table referencing thunks to user
1803             --  defined primitives covered by this interface.
1804
1805             pragma Assert (Has_Suffix (Node (ADT), 'P'));
1806             Next_Elmt (ADT);
1807
1808             --  Skip secondary dispatch tables of Ada types
1809
1810             if not Is_CPP_Class (T) then
1811
1812                --  Skip secondary dispatch table referencing thunks to
1813                --  predefined primitives.
1814
1815                pragma Assert (Has_Suffix (Node (ADT), 'Y'));
1816                Next_Elmt (ADT);
1817
1818                --  Skip secondary dispatch table referencing user-defined
1819                --  primitives covered by this interface.
1820
1821                pragma Assert (Has_Suffix (Node (ADT), 'D'));
1822                Next_Elmt (ADT);
1823
1824                --  Skip secondary dispatch table referencing predefined
1825                --  primitives.
1826
1827                pragma Assert (Has_Suffix (Node (ADT), 'Z'));
1828                Next_Elmt (ADT);
1829             end if;
1830          end loop;
1831
1832          pragma Assert (Is_Tag (Node (ADT)));
1833          return Node (ADT);
1834       end Search_Tag;
1835
1836    --  Start of processing for Collect_Interfaces_Info
1837
1838    begin
1839       Collect_Interfaces (T, Ifaces_List);
1840       Collect_Interface_Components (T, Comps_List);
1841
1842       --  Search for the record component and tag associated with each
1843       --  interface type of T.
1844
1845       Components_List := New_Elmt_List;
1846       Tags_List       := New_Elmt_List;
1847
1848       Iface_Elmt := First_Elmt (Ifaces_List);
1849       while Present (Iface_Elmt) loop
1850          Iface := Node (Iface_Elmt);
1851
1852          --  Associate the primary tag component and the primary dispatch table
1853          --  with all the interfaces that are parents of T
1854
1855          if Is_Ancestor (Iface, T, Use_Full_View => True) then
1856             Append_Elmt (First_Tag_Component (T), Components_List);
1857             Append_Elmt (Node (First_Elmt (Access_Disp_Table (T))), Tags_List);
1858
1859          --  Otherwise search for the tag component and secondary dispatch
1860          --  table of Iface
1861
1862          else
1863             Comp_Elmt := First_Elmt (Comps_List);
1864             while Present (Comp_Elmt) loop
1865                Comp_Iface := Related_Type (Node (Comp_Elmt));
1866
1867                if Comp_Iface = Iface
1868                  or else Is_Ancestor (Iface, Comp_Iface, Use_Full_View => True)
1869                then
1870                   Append_Elmt (Node (Comp_Elmt), Components_List);
1871                   Append_Elmt (Search_Tag (Comp_Iface), Tags_List);
1872                   exit;
1873                end if;
1874
1875                Next_Elmt (Comp_Elmt);
1876             end loop;
1877             pragma Assert (Present (Comp_Elmt));
1878          end if;
1879
1880          Next_Elmt (Iface_Elmt);
1881       end loop;
1882    end Collect_Interfaces_Info;
1883
1884    ---------------------
1885    -- Collect_Parents --
1886    ---------------------
1887
1888    procedure Collect_Parents
1889      (T             : Entity_Id;
1890       List          : out Elist_Id;
1891       Use_Full_View : Boolean := True)
1892    is
1893       Current_Typ : Entity_Id := T;
1894       Parent_Typ  : Entity_Id;
1895
1896    begin
1897       List := New_Elmt_List;
1898
1899       --  No action if the if the type has no parents
1900
1901       if T = Etype (T) then
1902          return;
1903       end if;
1904
1905       loop
1906          Parent_Typ := Etype (Current_Typ);
1907
1908          if Is_Private_Type (Parent_Typ)
1909            and then Present (Full_View (Parent_Typ))
1910            and then Use_Full_View
1911          then
1912             Parent_Typ := Full_View (Base_Type (Parent_Typ));
1913          end if;
1914
1915          Append_Elmt (Parent_Typ, List);
1916
1917          exit when Parent_Typ = Current_Typ;
1918          Current_Typ := Parent_Typ;
1919       end loop;
1920    end Collect_Parents;
1921
1922    ----------------------------------
1923    -- Collect_Primitive_Operations --
1924    ----------------------------------
1925
1926    function Collect_Primitive_Operations (T : Entity_Id) return Elist_Id is
1927       B_Type         : constant Entity_Id := Base_Type (T);
1928       B_Decl         : constant Node_Id   := Original_Node (Parent (B_Type));
1929       B_Scope        : Entity_Id          := Scope (B_Type);
1930       Op_List        : Elist_Id;
1931       Formal         : Entity_Id;
1932       Is_Prim        : Boolean;
1933       Formal_Derived : Boolean := False;
1934       Id             : Entity_Id;
1935
1936       function Match (E : Entity_Id) return Boolean;
1937       --  True if E's base type is B_Type, or E is of an anonymous access type
1938       --  and the base type of its designated type is B_Type.
1939
1940       -----------
1941       -- Match --
1942       -----------
1943
1944       function Match (E : Entity_Id) return Boolean is
1945          Etyp : Entity_Id := Etype (E);
1946
1947       begin
1948          if Ekind (Etyp) = E_Anonymous_Access_Type then
1949             Etyp := Designated_Type (Etyp);
1950          end if;
1951
1952          return Base_Type (Etyp) = B_Type;
1953       end Match;
1954
1955    --  Start of processing for Collect_Primitive_Operations
1956
1957    begin
1958       --  For tagged types, the primitive operations are collected as they
1959       --  are declared, and held in an explicit list which is simply returned.
1960
1961       if Is_Tagged_Type (B_Type) then
1962          return Primitive_Operations (B_Type);
1963
1964       --  An untagged generic type that is a derived type inherits the
1965       --  primitive operations of its parent type. Other formal types only
1966       --  have predefined operators, which are not explicitly represented.
1967
1968       elsif Is_Generic_Type (B_Type) then
1969          if Nkind (B_Decl) = N_Formal_Type_Declaration
1970            and then Nkind (Formal_Type_Definition (B_Decl))
1971              = N_Formal_Derived_Type_Definition
1972          then
1973             Formal_Derived := True;
1974          else
1975             return New_Elmt_List;
1976          end if;
1977       end if;
1978
1979       Op_List := New_Elmt_List;
1980
1981       if B_Scope = Standard_Standard then
1982          if B_Type = Standard_String then
1983             Append_Elmt (Standard_Op_Concat, Op_List);
1984
1985          elsif B_Type = Standard_Wide_String then
1986             Append_Elmt (Standard_Op_Concatw, Op_List);
1987
1988          else
1989             null;
1990          end if;
1991
1992       elsif (Is_Package_Or_Generic_Package (B_Scope)
1993               and then
1994                 Nkind (Parent (Declaration_Node (First_Subtype (T)))) /=
1995                                                             N_Package_Body)
1996         or else Is_Derived_Type (B_Type)
1997       then
1998          --  The primitive operations appear after the base type, except
1999          --  if the derivation happens within the private part of B_Scope
2000          --  and the type is a private type, in which case both the type
2001          --  and some primitive operations may appear before the base
2002          --  type, and the list of candidates starts after the type.
2003
2004          if In_Open_Scopes (B_Scope)
2005            and then Scope (T) = B_Scope
2006            and then In_Private_Part (B_Scope)
2007          then
2008             Id := Next_Entity (T);
2009          else
2010             Id := Next_Entity (B_Type);
2011          end if;
2012
2013          while Present (Id) loop
2014
2015             --  Note that generic formal subprograms are not
2016             --  considered to be primitive operations and thus
2017             --  are never inherited.
2018
2019             if Is_Overloadable (Id)
2020               and then Nkind (Parent (Parent (Id)))
2021                          not in N_Formal_Subprogram_Declaration
2022             then
2023                Is_Prim := False;
2024
2025                if Match (Id) then
2026                   Is_Prim := True;
2027
2028                else
2029                   Formal := First_Formal (Id);
2030                   while Present (Formal) loop
2031                      if Match (Formal) then
2032                         Is_Prim := True;
2033                         exit;
2034                      end if;
2035
2036                      Next_Formal (Formal);
2037                   end loop;
2038                end if;
2039
2040                --  For a formal derived type, the only primitives are the
2041                --  ones inherited from the parent type. Operations appearing
2042                --  in the package declaration are not primitive for it.
2043
2044                if Is_Prim
2045                  and then (not Formal_Derived
2046                             or else Present (Alias (Id)))
2047                then
2048                   --  In the special case of an equality operator aliased to
2049                   --  an overriding dispatching equality belonging to the same
2050                   --  type, we don't include it in the list of primitives.
2051                   --  This avoids inheriting multiple equality operators when
2052                   --  deriving from untagged private types whose full type is
2053                   --  tagged, which can otherwise cause ambiguities. Note that
2054                   --  this should only happen for this kind of untagged parent
2055                   --  type, since normally dispatching operations are inherited
2056                   --  using the type's Primitive_Operations list.
2057
2058                   if Chars (Id) = Name_Op_Eq
2059                     and then Is_Dispatching_Operation (Id)
2060                     and then Present (Alias (Id))
2061                     and then Present (Overridden_Operation (Alias (Id)))
2062                     and then Base_Type (Etype (First_Entity (Id))) =
2063                                Base_Type (Etype (First_Entity (Alias (Id))))
2064                   then
2065                      null;
2066
2067                   --  Include the subprogram in the list of primitives
2068
2069                   else
2070                      Append_Elmt (Id, Op_List);
2071                   end if;
2072                end if;
2073             end if;
2074
2075             Next_Entity (Id);
2076
2077             --  For a type declared in System, some of its operations may
2078             --  appear in the target-specific extension to System.
2079
2080             if No (Id)
2081               and then B_Scope = RTU_Entity (System)
2082               and then Present_System_Aux
2083             then
2084                B_Scope := System_Aux_Id;
2085                Id := First_Entity (System_Aux_Id);
2086             end if;
2087          end loop;
2088       end if;
2089
2090       return Op_List;
2091    end Collect_Primitive_Operations;
2092
2093    -----------------------------------
2094    -- Compile_Time_Constraint_Error --
2095    -----------------------------------
2096
2097    function Compile_Time_Constraint_Error
2098      (N    : Node_Id;
2099       Msg  : String;
2100       Ent  : Entity_Id  := Empty;
2101       Loc  : Source_Ptr := No_Location;
2102       Warn : Boolean    := False) return Node_Id
2103    is
2104       Msgc : String (1 .. Msg'Length + 2);
2105       --  Copy of message, with room for possible ? and ! at end
2106
2107       Msgl : Natural;
2108       Wmsg : Boolean;
2109       P    : Node_Id;
2110       OldP : Node_Id;
2111       Msgs : Boolean;
2112       Eloc : Source_Ptr;
2113
2114    begin
2115       --  A static constraint error in an instance body is not a fatal error.
2116       --  we choose to inhibit the message altogether, because there is no
2117       --  obvious node (for now) on which to post it. On the other hand the
2118       --  offending node must be replaced with a constraint_error in any case.
2119
2120       --  No messages are generated if we already posted an error on this node
2121
2122       if not Error_Posted (N) then
2123          if Loc /= No_Location then
2124             Eloc := Loc;
2125          else
2126             Eloc := Sloc (N);
2127          end if;
2128
2129          Msgc (1 .. Msg'Length) := Msg;
2130          Msgl := Msg'Length;
2131
2132          --  Message is a warning, even in Ada 95 case
2133
2134          if Msg (Msg'Last) = '?' then
2135             Wmsg := True;
2136
2137          --  In Ada 83, all messages are warnings. In the private part and
2138          --  the body of an instance, constraint_checks are only warnings.
2139          --  We also make this a warning if the Warn parameter is set.
2140
2141          elsif Warn
2142            or else (Ada_Version = Ada_83 and then Comes_From_Source (N))
2143          then
2144             Msgl := Msgl + 1;
2145             Msgc (Msgl) := '?';
2146             Wmsg := True;
2147
2148          elsif In_Instance_Not_Visible then
2149             Msgl := Msgl + 1;
2150             Msgc (Msgl) := '?';
2151             Wmsg := True;
2152
2153          --  Otherwise we have a real error message (Ada 95 static case)
2154          --  and we make this an unconditional message. Note that in the
2155          --  warning case we do not make the message unconditional, it seems
2156          --  quite reasonable to delete messages like this (about exceptions
2157          --  that will be raised) in dead code.
2158
2159          else
2160             Wmsg := False;
2161             Msgl := Msgl + 1;
2162             Msgc (Msgl) := '!';
2163          end if;
2164
2165          --  Should we generate a warning? The answer is not quite yes. The
2166          --  very annoying exception occurs in the case of a short circuit
2167          --  operator where the left operand is static and decisive. Climb
2168          --  parents to see if that is the case we have here. Conditional
2169          --  expressions with decisive conditions are a similar situation.
2170
2171          Msgs := True;
2172          P := N;
2173          loop
2174             OldP := P;
2175             P := Parent (P);
2176
2177             --  And then with False as left operand
2178
2179             if Nkind (P) = N_And_Then
2180               and then Compile_Time_Known_Value (Left_Opnd (P))
2181               and then Is_False (Expr_Value (Left_Opnd (P)))
2182             then
2183                Msgs := False;
2184                exit;
2185
2186             --  OR ELSE with True as left operand
2187
2188             elsif Nkind (P) = N_Or_Else
2189               and then Compile_Time_Known_Value (Left_Opnd (P))
2190               and then Is_True (Expr_Value (Left_Opnd (P)))
2191             then
2192                Msgs := False;
2193                exit;
2194
2195             --  Conditional expression
2196
2197             elsif Nkind (P) = N_Conditional_Expression then
2198                declare
2199                   Cond : constant Node_Id := First (Expressions (P));
2200                   Texp : constant Node_Id := Next (Cond);
2201                   Fexp : constant Node_Id := Next (Texp);
2202
2203                begin
2204                   if Compile_Time_Known_Value (Cond) then
2205
2206                      --  Condition is True and we are in the right operand
2207
2208                      if Is_True (Expr_Value (Cond))
2209                        and then OldP = Fexp
2210                      then
2211                         Msgs := False;
2212                         exit;
2213
2214                      --  Condition is False and we are in the left operand
2215
2216                      elsif Is_False (Expr_Value (Cond))
2217                        and then OldP = Texp
2218                      then
2219                         Msgs := False;
2220                         exit;
2221                      end if;
2222                   end if;
2223                end;
2224
2225             --  Special case for component association in aggregates, where
2226             --  we want to keep climbing up to the parent aggregate.
2227
2228             elsif Nkind (P) = N_Component_Association
2229               and then Nkind (Parent (P)) = N_Aggregate
2230             then
2231                null;
2232
2233             --  Keep going if within subexpression
2234
2235             else
2236                exit when Nkind (P) not in N_Subexpr;
2237             end if;
2238          end loop;
2239
2240          if Msgs then
2241             if Present (Ent) then
2242                Error_Msg_NEL (Msgc (1 .. Msgl), N, Ent, Eloc);
2243             else
2244                Error_Msg_NEL (Msgc (1 .. Msgl), N, Etype (N), Eloc);
2245             end if;
2246
2247             if Wmsg then
2248                if Inside_Init_Proc then
2249                   Error_Msg_NEL
2250                     ("\?& will be raised for objects of this type",
2251                      N, Standard_Constraint_Error, Eloc);
2252                else
2253                   Error_Msg_NEL
2254                     ("\?& will be raised at run time",
2255                      N, Standard_Constraint_Error, Eloc);
2256                end if;
2257
2258             else
2259                Error_Msg
2260                  ("\static expression fails Constraint_Check", Eloc);
2261                Set_Error_Posted (N);
2262             end if;
2263          end if;
2264       end if;
2265
2266       return N;
2267    end Compile_Time_Constraint_Error;
2268
2269    -----------------------
2270    -- Conditional_Delay --
2271    -----------------------
2272
2273    procedure Conditional_Delay (New_Ent, Old_Ent : Entity_Id) is
2274    begin
2275       if Has_Delayed_Freeze (Old_Ent) and then not Is_Frozen (Old_Ent) then
2276          Set_Has_Delayed_Freeze (New_Ent);
2277       end if;
2278    end Conditional_Delay;
2279
2280    -------------------------
2281    -- Copy_Component_List --
2282    -------------------------
2283
2284    function Copy_Component_List
2285      (R_Typ : Entity_Id;
2286       Loc   : Source_Ptr) return List_Id
2287    is
2288       Comp  : Node_Id;
2289       Comps : constant List_Id := New_List;
2290
2291    begin
2292       Comp := First_Component (Underlying_Type (R_Typ));
2293       while Present (Comp) loop
2294          if Comes_From_Source (Comp) then
2295             declare
2296                Comp_Decl : constant Node_Id := Declaration_Node (Comp);
2297             begin
2298                Append_To (Comps,
2299                  Make_Component_Declaration (Loc,
2300                    Defining_Identifier =>
2301                      Make_Defining_Identifier (Loc, Chars (Comp)),
2302                    Component_Definition =>
2303                      New_Copy_Tree
2304                        (Component_Definition (Comp_Decl), New_Sloc => Loc)));
2305             end;
2306          end if;
2307
2308          Next_Component (Comp);
2309       end loop;
2310
2311       return Comps;
2312    end Copy_Component_List;
2313
2314    -------------------------
2315    -- Copy_Parameter_List --
2316    -------------------------
2317
2318    function Copy_Parameter_List (Subp_Id : Entity_Id) return List_Id is
2319       Loc    : constant Source_Ptr := Sloc (Subp_Id);
2320       Plist  : List_Id;
2321       Formal : Entity_Id;
2322
2323    begin
2324       if No (First_Formal (Subp_Id)) then
2325          return No_List;
2326       else
2327          Plist := New_List;
2328          Formal := First_Formal (Subp_Id);
2329          while Present (Formal) loop
2330             Append
2331               (Make_Parameter_Specification (Loc,
2332                 Defining_Identifier =>
2333                   Make_Defining_Identifier (Sloc (Formal),
2334                     Chars => Chars (Formal)),
2335                 In_Present  => In_Present (Parent (Formal)),
2336                 Out_Present => Out_Present (Parent (Formal)),
2337              Parameter_Type =>
2338                   New_Reference_To (Etype (Formal), Loc),
2339                 Expression =>
2340                   New_Copy_Tree (Expression (Parent (Formal)))),
2341               Plist);
2342
2343             Next_Formal (Formal);
2344          end loop;
2345       end if;
2346
2347       return Plist;
2348    end Copy_Parameter_List;
2349
2350    --------------------
2351    -- Current_Entity --
2352    --------------------
2353
2354    --  The currently visible definition for a given identifier is the
2355    --  one most chained at the start of the visibility chain, i.e. the
2356    --  one that is referenced by the Node_Id value of the name of the
2357    --  given identifier.
2358
2359    function Current_Entity (N : Node_Id) return Entity_Id is
2360    begin
2361       return Get_Name_Entity_Id (Chars (N));
2362    end Current_Entity;
2363
2364    -----------------------------
2365    -- Current_Entity_In_Scope --
2366    -----------------------------
2367
2368    function Current_Entity_In_Scope (N : Node_Id) return Entity_Id is
2369       E  : Entity_Id;
2370       CS : constant Entity_Id := Current_Scope;
2371
2372       Transient_Case : constant Boolean := Scope_Is_Transient;
2373
2374    begin
2375       E := Get_Name_Entity_Id (Chars (N));
2376       while Present (E)
2377         and then Scope (E) /= CS
2378         and then (not Transient_Case or else Scope (E) /= Scope (CS))
2379       loop
2380          E := Homonym (E);
2381       end loop;
2382
2383       return E;
2384    end Current_Entity_In_Scope;
2385
2386    -------------------
2387    -- Current_Scope --
2388    -------------------
2389
2390    function Current_Scope return Entity_Id is
2391    begin
2392       if Scope_Stack.Last = -1 then
2393          return Standard_Standard;
2394       else
2395          declare
2396             C : constant Entity_Id :=
2397                   Scope_Stack.Table (Scope_Stack.Last).Entity;
2398          begin
2399             if Present (C) then
2400                return C;
2401             else
2402                return Standard_Standard;
2403             end if;
2404          end;
2405       end if;
2406    end Current_Scope;
2407
2408    ------------------------
2409    -- Current_Subprogram --
2410    ------------------------
2411
2412    function Current_Subprogram return Entity_Id is
2413       Scop : constant Entity_Id := Current_Scope;
2414    begin
2415       if Is_Subprogram (Scop) or else Is_Generic_Subprogram (Scop) then
2416          return Scop;
2417       else
2418          return Enclosing_Subprogram (Scop);
2419       end if;
2420    end Current_Subprogram;
2421
2422    ----------------------------------
2423    -- Deepest_Type_Access_Level --
2424    ----------------------------------
2425
2426    function Deepest_Type_Access_Level (Typ : Entity_Id) return Uint is
2427    begin
2428       if Ekind (Typ) = E_Anonymous_Access_Type
2429         and then not Is_Local_Anonymous_Access (Typ)
2430         and then Nkind (Associated_Node_For_Itype (Typ)) = N_Object_Declaration
2431       then
2432          --  Typ is the type of an Ada 2012 stand-alone object of an anonymous
2433          --  access type.
2434
2435          return
2436            Scope_Depth (Enclosing_Dynamic_Scope
2437                          (Defining_Identifier
2438                            (Associated_Node_For_Itype (Typ))));
2439
2440       --  For generic formal type, return Int'Last (infinite).
2441       --  See comment preceding Is_Generic_Type call in Type_Access_Level.
2442
2443       elsif Is_Generic_Type (Root_Type (Typ)) then
2444          return UI_From_Int (Int'Last);
2445
2446       else
2447          return Type_Access_Level (Typ);
2448       end if;
2449    end Deepest_Type_Access_Level;
2450
2451    ---------------------
2452    -- Defining_Entity --
2453    ---------------------
2454
2455    function Defining_Entity (N : Node_Id) return Entity_Id is
2456       K   : constant Node_Kind := Nkind (N);
2457       Err : Entity_Id := Empty;
2458
2459    begin
2460       case K is
2461          when
2462            N_Subprogram_Declaration                 |
2463            N_Abstract_Subprogram_Declaration        |
2464            N_Subprogram_Body                        |
2465            N_Package_Declaration                    |
2466            N_Subprogram_Renaming_Declaration        |
2467            N_Subprogram_Body_Stub                   |
2468            N_Generic_Subprogram_Declaration         |
2469            N_Generic_Package_Declaration            |
2470            N_Formal_Subprogram_Declaration          |
2471            N_Expression_Function
2472          =>
2473             return Defining_Entity (Specification (N));
2474
2475          when
2476            N_Component_Declaration                  |
2477            N_Defining_Program_Unit_Name             |
2478            N_Discriminant_Specification             |
2479            N_Entry_Body                             |
2480            N_Entry_Declaration                      |
2481            N_Entry_Index_Specification              |
2482            N_Exception_Declaration                  |
2483            N_Exception_Renaming_Declaration         |
2484            N_Formal_Object_Declaration              |
2485            N_Formal_Package_Declaration             |
2486            N_Formal_Type_Declaration                |
2487            N_Full_Type_Declaration                  |
2488            N_Implicit_Label_Declaration             |
2489            N_Incomplete_Type_Declaration            |
2490            N_Loop_Parameter_Specification           |
2491            N_Number_Declaration                     |
2492            N_Object_Declaration                     |
2493            N_Object_Renaming_Declaration            |
2494            N_Package_Body_Stub                      |
2495            N_Parameter_Specification                |
2496            N_Private_Extension_Declaration          |
2497            N_Private_Type_Declaration               |
2498            N_Protected_Body                         |
2499            N_Protected_Body_Stub                    |
2500            N_Protected_Type_Declaration             |
2501            N_Single_Protected_Declaration           |
2502            N_Single_Task_Declaration                |
2503            N_Subtype_Declaration                    |
2504            N_Task_Body                              |
2505            N_Task_Body_Stub                         |
2506            N_Task_Type_Declaration
2507          =>
2508             return Defining_Identifier (N);
2509
2510          when N_Subunit =>
2511             return Defining_Entity (Proper_Body (N));
2512
2513          when
2514            N_Function_Instantiation                 |
2515            N_Function_Specification                 |
2516            N_Generic_Function_Renaming_Declaration  |
2517            N_Generic_Package_Renaming_Declaration   |
2518            N_Generic_Procedure_Renaming_Declaration |
2519            N_Package_Body                           |
2520            N_Package_Instantiation                  |
2521            N_Package_Renaming_Declaration           |
2522            N_Package_Specification                  |
2523            N_Procedure_Instantiation                |
2524            N_Procedure_Specification
2525          =>
2526             declare
2527                Nam : constant Node_Id := Defining_Unit_Name (N);
2528
2529             begin
2530                if Nkind (Nam) in N_Entity then
2531                   return Nam;
2532
2533                --  For Error, make up a name and attach to declaration
2534                --  so we can continue semantic analysis
2535
2536                elsif Nam = Error then
2537                   Err := Make_Temporary (Sloc (N), 'T');
2538                   Set_Defining_Unit_Name (N, Err);
2539
2540                   return Err;
2541                --  If not an entity, get defining identifier
2542
2543                else
2544                   return Defining_Identifier (Nam);
2545                end if;
2546             end;
2547
2548          when N_Block_Statement =>
2549             return Entity (Identifier (N));
2550
2551          when others =>
2552             raise Program_Error;
2553
2554       end case;
2555    end Defining_Entity;
2556
2557    --------------------------
2558    -- Denotes_Discriminant --
2559    --------------------------
2560
2561    function Denotes_Discriminant
2562      (N                : Node_Id;
2563       Check_Concurrent : Boolean := False) return Boolean
2564    is
2565       E : Entity_Id;
2566    begin
2567       if not Is_Entity_Name (N)
2568         or else No (Entity (N))
2569       then
2570          return False;
2571       else
2572          E := Entity (N);
2573       end if;
2574
2575       --  If we are checking for a protected type, the discriminant may have
2576       --  been rewritten as the corresponding discriminal of the original type
2577       --  or of the corresponding concurrent record, depending on whether we
2578       --  are in the spec or body of the protected type.
2579
2580       return Ekind (E) = E_Discriminant
2581         or else
2582           (Check_Concurrent
2583             and then Ekind (E) = E_In_Parameter
2584             and then Present (Discriminal_Link (E))
2585             and then
2586               (Is_Concurrent_Type (Scope (Discriminal_Link (E)))
2587                 or else
2588                   Is_Concurrent_Record_Type (Scope (Discriminal_Link (E)))));
2589
2590    end Denotes_Discriminant;
2591
2592    -------------------------
2593    -- Denotes_Same_Object --
2594    -------------------------
2595
2596    function Denotes_Same_Object (A1, A2 : Node_Id) return Boolean is
2597       Obj1 : Node_Id := A1;
2598       Obj2 : Node_Id := A2;
2599
2600       procedure Check_Renaming (Obj : in out Node_Id);
2601       --  If an object is a renaming, examine renamed object. If it is a
2602       --  dereference of a variable, or an indexed expression with non-constant
2603       --  indexes, no overlap check can be reported.
2604
2605       --------------------
2606       -- Check_Renaming --
2607       --------------------
2608
2609       procedure Check_Renaming (Obj : in out Node_Id) is
2610       begin
2611          if Is_Entity_Name (Obj)
2612            and then Present (Renamed_Entity (Entity (Obj)))
2613          then
2614             Obj := Renamed_Entity (Entity (Obj));
2615             if Nkind (Obj) = N_Explicit_Dereference
2616               and then Is_Variable (Prefix (Obj))
2617             then
2618                Obj := Empty;
2619
2620             elsif Nkind (Obj) = N_Indexed_Component then
2621                declare
2622                   Indx : Node_Id;
2623
2624                begin
2625                   Indx := First (Expressions (Obj));
2626                   while Present (Indx) loop
2627                      if not Is_OK_Static_Expression (Indx) then
2628                         Obj := Empty;
2629                         exit;
2630                      end if;
2631
2632                      Next_Index (Indx);
2633                   end loop;
2634                end;
2635             end if;
2636          end if;
2637       end Check_Renaming;
2638
2639    --  Start of processing for Denotes_Same_Object
2640
2641    begin
2642       Check_Renaming (Obj1);
2643       Check_Renaming (Obj2);
2644
2645       if No (Obj1)
2646         or else No (Obj2)
2647       then
2648          return False;
2649       end if;
2650
2651       --  If we have entity names, then must be same entity
2652
2653       if Is_Entity_Name (Obj1) then
2654          if Is_Entity_Name (Obj2) then
2655             return Entity (Obj1) = Entity (Obj2);
2656          else
2657             return False;
2658          end if;
2659
2660       --  No match if not same node kind
2661
2662       elsif Nkind (Obj1) /= Nkind (Obj2) then
2663          return False;
2664
2665       --  For selected components, must have same prefix and selector
2666
2667       elsif Nkind (Obj1) = N_Selected_Component then
2668          return Denotes_Same_Object (Prefix (Obj1), Prefix (Obj2))
2669            and then
2670          Entity (Selector_Name (Obj1)) = Entity (Selector_Name (Obj2));
2671
2672       --  For explicit dereferences, prefixes must be same
2673
2674       elsif Nkind (Obj1) = N_Explicit_Dereference then
2675          return Denotes_Same_Object (Prefix (Obj1), Prefix (Obj2));
2676
2677       --  For indexed components, prefixes and all subscripts must be the same
2678
2679       elsif Nkind (Obj1) = N_Indexed_Component then
2680          if Denotes_Same_Object (Prefix (Obj1), Prefix (Obj2)) then
2681             declare
2682                Indx1 : Node_Id;
2683                Indx2 : Node_Id;
2684
2685             begin
2686                Indx1 := First (Expressions (Obj1));
2687                Indx2 := First (Expressions (Obj2));
2688                while Present (Indx1) loop
2689
2690                   --  Indexes must denote the same static value or same object
2691
2692                   if Is_OK_Static_Expression (Indx1) then
2693                      if not Is_OK_Static_Expression (Indx2) then
2694                         return False;
2695
2696                      elsif Expr_Value (Indx1) /= Expr_Value (Indx2) then
2697                         return False;
2698                      end if;
2699
2700                   elsif not Denotes_Same_Object (Indx1, Indx2) then
2701                      return False;
2702                   end if;
2703
2704                   Next (Indx1);
2705                   Next (Indx2);
2706                end loop;
2707
2708                return True;
2709             end;
2710          else
2711             return False;
2712          end if;
2713
2714       --  For slices, prefixes must match and bounds must match
2715
2716       elsif Nkind (Obj1) = N_Slice
2717         and then Denotes_Same_Object (Prefix (Obj1), Prefix (Obj2))
2718       then
2719          declare
2720             Lo1, Lo2, Hi1, Hi2 : Node_Id;
2721
2722          begin
2723             Get_Index_Bounds (Etype (Obj1), Lo1, Hi1);
2724             Get_Index_Bounds (Etype (Obj2), Lo2, Hi2);
2725
2726             --  Check whether bounds are statically identical. There is no
2727             --  attempt to detect partial overlap of slices.
2728
2729             return Denotes_Same_Object (Lo1, Lo2)
2730               and then Denotes_Same_Object (Hi1, Hi2);
2731          end;
2732
2733          --  Literals will appear as indexes. Isn't this where we should check
2734          --  Known_At_Compile_Time at least if we are generating warnings ???
2735
2736       elsif Nkind (Obj1) = N_Integer_Literal then
2737          return Intval (Obj1) = Intval (Obj2);
2738
2739       else
2740          return False;
2741       end if;
2742    end Denotes_Same_Object;
2743
2744    -------------------------
2745    -- Denotes_Same_Prefix --
2746    -------------------------
2747
2748    function Denotes_Same_Prefix (A1, A2 : Node_Id) return Boolean is
2749
2750    begin
2751       if Is_Entity_Name (A1) then
2752          if Nkind_In (A2, N_Selected_Component, N_Indexed_Component)
2753            and then not Is_Access_Type (Etype (A1))
2754          then
2755             return Denotes_Same_Object (A1, Prefix (A2))
2756               or else Denotes_Same_Prefix (A1, Prefix (A2));
2757          else
2758             return False;
2759          end if;
2760
2761       elsif Is_Entity_Name (A2) then
2762          return Denotes_Same_Prefix (A1 => A2, A2 => A1);
2763
2764       elsif Nkind_In (A1, N_Selected_Component, N_Indexed_Component, N_Slice)
2765               and then
2766             Nkind_In (A2, N_Selected_Component, N_Indexed_Component, N_Slice)
2767       then
2768          declare
2769             Root1, Root2 : Node_Id;
2770             Depth1, Depth2 : Int := 0;
2771
2772          begin
2773             Root1 := Prefix (A1);
2774             while not Is_Entity_Name (Root1) loop
2775                if not Nkind_In
2776                  (Root1, N_Selected_Component, N_Indexed_Component)
2777                then
2778                   return False;
2779                else
2780                   Root1 := Prefix (Root1);
2781                end if;
2782
2783                Depth1 := Depth1 + 1;
2784             end loop;
2785
2786             Root2 := Prefix (A2);
2787             while not Is_Entity_Name (Root2) loop
2788                if not Nkind_In
2789                  (Root2, N_Selected_Component, N_Indexed_Component)
2790                then
2791                   return False;
2792                else
2793                   Root2 := Prefix (Root2);
2794                end if;
2795
2796                Depth2 := Depth2 + 1;
2797             end loop;
2798
2799             --  If both have the same depth and they do not denote the same
2800             --  object, they are disjoint and not warning is needed.
2801
2802             if Depth1 = Depth2 then
2803                return False;
2804
2805             elsif Depth1 > Depth2 then
2806                Root1 := Prefix (A1);
2807                for I in 1 .. Depth1 - Depth2 - 1 loop
2808                   Root1 := Prefix (Root1);
2809                end loop;
2810
2811                return Denotes_Same_Object (Root1, A2);
2812
2813             else
2814                Root2 := Prefix (A2);
2815                for I in 1 .. Depth2 - Depth1 - 1 loop
2816                   Root2 := Prefix (Root2);
2817                end loop;
2818
2819                return Denotes_Same_Object (A1, Root2);
2820             end if;
2821          end;
2822
2823       else
2824          return False;
2825       end if;
2826    end Denotes_Same_Prefix;
2827
2828    ----------------------
2829    -- Denotes_Variable --
2830    ----------------------
2831
2832    function Denotes_Variable (N : Node_Id) return Boolean is
2833    begin
2834       return Is_Variable (N) and then Paren_Count (N) = 0;
2835    end Denotes_Variable;
2836
2837    -----------------------------
2838    -- Depends_On_Discriminant --
2839    -----------------------------
2840
2841    function Depends_On_Discriminant (N : Node_Id) return Boolean is
2842       L : Node_Id;
2843       H : Node_Id;
2844
2845    begin
2846       Get_Index_Bounds (N, L, H);
2847       return Denotes_Discriminant (L) or else Denotes_Discriminant (H);
2848    end Depends_On_Discriminant;
2849
2850    -------------------------
2851    -- Designate_Same_Unit --
2852    -------------------------
2853
2854    function Designate_Same_Unit
2855      (Name1 : Node_Id;
2856       Name2 : Node_Id) return Boolean
2857    is
2858       K1 : constant Node_Kind := Nkind (Name1);
2859       K2 : constant Node_Kind := Nkind (Name2);
2860
2861       function Prefix_Node (N : Node_Id) return Node_Id;
2862       --  Returns the parent unit name node of a defining program unit name
2863       --  or the prefix if N is a selected component or an expanded name.
2864
2865       function Select_Node (N : Node_Id) return Node_Id;
2866       --  Returns the defining identifier node of a defining program unit
2867       --  name or  the selector node if N is a selected component or an
2868       --  expanded name.
2869
2870       -----------------
2871       -- Prefix_Node --
2872       -----------------
2873
2874       function Prefix_Node (N : Node_Id) return Node_Id is
2875       begin
2876          if Nkind (N) = N_Defining_Program_Unit_Name then
2877             return Name (N);
2878
2879          else
2880             return Prefix (N);
2881          end if;
2882       end Prefix_Node;
2883
2884       -----------------
2885       -- Select_Node --
2886       -----------------
2887
2888       function Select_Node (N : Node_Id) return Node_Id is
2889       begin
2890          if Nkind (N) = N_Defining_Program_Unit_Name then
2891             return Defining_Identifier (N);
2892
2893          else
2894             return Selector_Name (N);
2895          end if;
2896       end Select_Node;
2897
2898    --  Start of processing for Designate_Next_Unit
2899
2900    begin
2901       if (K1 = N_Identifier or else
2902           K1 = N_Defining_Identifier)
2903         and then
2904          (K2 = N_Identifier or else
2905           K2 = N_Defining_Identifier)
2906       then
2907          return Chars (Name1) = Chars (Name2);
2908
2909       elsif
2910          (K1 = N_Expanded_Name      or else
2911           K1 = N_Selected_Component or else
2912           K1 = N_Defining_Program_Unit_Name)
2913         and then
2914          (K2 = N_Expanded_Name      or else
2915           K2 = N_Selected_Component or else
2916           K2 = N_Defining_Program_Unit_Name)
2917       then
2918          return
2919            (Chars (Select_Node (Name1)) = Chars (Select_Node (Name2)))
2920              and then
2921                Designate_Same_Unit (Prefix_Node (Name1), Prefix_Node (Name2));
2922
2923       else
2924          return False;
2925       end if;
2926    end Designate_Same_Unit;
2927
2928    ------------------------------------------
2929    -- function Dynamic_Accessibility_Level --
2930    ------------------------------------------
2931
2932    function Dynamic_Accessibility_Level (Expr : Node_Id) return Node_Id is
2933       E : Entity_Id;
2934       Loc : constant Source_Ptr := Sloc (Expr);
2935
2936       function Make_Level_Literal (Level : Uint) return Node_Id;
2937       --  Construct an integer literal representing an accessibility level
2938       --  with its type set to Natural.
2939
2940       ------------------------
2941       -- Make_Level_Literal --
2942       ------------------------
2943
2944       function Make_Level_Literal (Level : Uint) return Node_Id is
2945          Result : constant Node_Id := Make_Integer_Literal (Loc, Level);
2946       begin
2947          Set_Etype (Result, Standard_Natural);
2948          return Result;
2949       end Make_Level_Literal;
2950
2951    --  Start of processing for Dynamic_Accessibility_Level
2952
2953    begin
2954       if Is_Entity_Name (Expr) then
2955          E := Entity (Expr);
2956
2957          if Present (Renamed_Object (E)) then
2958             return Dynamic_Accessibility_Level (Renamed_Object (E));
2959          end if;
2960
2961          if Is_Formal (E) or else Ekind_In (E, E_Variable, E_Constant) then
2962             if Present (Extra_Accessibility (E)) then
2963                return New_Occurrence_Of (Extra_Accessibility (E), Loc);
2964             end if;
2965          end if;
2966       end if;
2967
2968       --  Unimplemented: Ptr.all'Access, where Ptr has Extra_Accessibility ???
2969
2970       case Nkind (Expr) is
2971
2972          --  For access discriminant, the level of the enclosing object
2973
2974          when N_Selected_Component =>
2975             if Ekind (Entity (Selector_Name (Expr))) = E_Discriminant
2976               and then Ekind (Etype (Entity (Selector_Name (Expr)))) =
2977                                             E_Anonymous_Access_Type
2978             then
2979                return Make_Level_Literal (Object_Access_Level (Expr));
2980             end if;
2981
2982          when N_Attribute_Reference =>
2983             case Get_Attribute_Id (Attribute_Name (Expr)) is
2984
2985                --  For X'Access, the level of the prefix X
2986
2987                when Attribute_Access =>
2988                   return Make_Level_Literal
2989                            (Object_Access_Level (Prefix (Expr)));
2990
2991                --  Treat the unchecked attributes as library-level
2992
2993                when Attribute_Unchecked_Access    |
2994                     Attribute_Unrestricted_Access =>
2995                   return Make_Level_Literal (Scope_Depth (Standard_Standard));
2996
2997                --  No other access-valued attributes
2998
2999                when others =>
3000                   raise Program_Error;
3001             end case;
3002
3003          when N_Allocator =>
3004
3005             --  Unimplemented: depends on context. As an actual parameter where
3006             --  formal type is anonymous, use
3007             --    Scope_Depth (Current_Scope) + 1.
3008             --  For other cases, see 3.10.2(14/3) and following. ???
3009
3010             null;
3011
3012          when N_Type_Conversion =>
3013             if not Is_Local_Anonymous_Access (Etype (Expr)) then
3014
3015                --  Handle type conversions introduced for a rename of an
3016                --  Ada 2012 stand-alone object of an anonymous access type.
3017
3018                return Dynamic_Accessibility_Level (Expression (Expr));
3019             end if;
3020
3021          when others =>
3022             null;
3023       end case;
3024
3025       return Make_Level_Literal (Type_Access_Level (Etype (Expr)));
3026    end Dynamic_Accessibility_Level;
3027
3028    -----------------------------------
3029    -- Effective_Extra_Accessibility --
3030    -----------------------------------
3031
3032    function Effective_Extra_Accessibility (Id : Entity_Id) return Entity_Id is
3033    begin
3034       if Present (Renamed_Object (Id))
3035         and then Is_Entity_Name (Renamed_Object (Id))
3036       then
3037          return Effective_Extra_Accessibility (Entity (Renamed_Object (Id)));
3038       end if;
3039
3040       return Extra_Accessibility (Id);
3041    end Effective_Extra_Accessibility;
3042
3043    --------------------------
3044    -- Enclosing_CPP_Parent --
3045    --------------------------
3046
3047    function Enclosing_CPP_Parent (Typ : Entity_Id) return Entity_Id is
3048       Parent_Typ : Entity_Id := Typ;
3049
3050    begin
3051       while not Is_CPP_Class (Parent_Typ)
3052          and then Etype (Parent_Typ) /= Parent_Typ
3053       loop
3054          Parent_Typ := Etype (Parent_Typ);
3055
3056          if Is_Private_Type (Parent_Typ) then
3057             Parent_Typ := Full_View (Base_Type (Parent_Typ));
3058          end if;
3059       end loop;
3060
3061       pragma Assert (Is_CPP_Class (Parent_Typ));
3062       return Parent_Typ;
3063    end Enclosing_CPP_Parent;
3064
3065    ----------------------------
3066    -- Enclosing_Generic_Body --
3067    ----------------------------
3068
3069    function Enclosing_Generic_Body
3070      (N : Node_Id) return Node_Id
3071    is
3072       P    : Node_Id;
3073       Decl : Node_Id;
3074       Spec : Node_Id;
3075
3076    begin
3077       P := Parent (N);
3078       while Present (P) loop
3079          if Nkind (P) = N_Package_Body
3080            or else Nkind (P) = N_Subprogram_Body
3081          then
3082             Spec := Corresponding_Spec (P);
3083
3084             if Present (Spec) then
3085                Decl := Unit_Declaration_Node (Spec);
3086
3087                if Nkind (Decl) = N_Generic_Package_Declaration
3088                  or else Nkind (Decl) = N_Generic_Subprogram_Declaration
3089                then
3090                   return P;
3091                end if;
3092             end if;
3093          end if;
3094
3095          P := Parent (P);
3096       end loop;
3097
3098       return Empty;
3099    end Enclosing_Generic_Body;
3100
3101    ----------------------------
3102    -- Enclosing_Generic_Unit --
3103    ----------------------------
3104
3105    function Enclosing_Generic_Unit
3106      (N : Node_Id) return Node_Id
3107    is
3108       P    : Node_Id;
3109       Decl : Node_Id;
3110       Spec : Node_Id;
3111
3112    begin
3113       P := Parent (N);
3114       while Present (P) loop
3115          if Nkind (P) = N_Generic_Package_Declaration
3116            or else Nkind (P) = N_Generic_Subprogram_Declaration
3117          then
3118             return P;
3119
3120          elsif Nkind (P) = N_Package_Body
3121            or else Nkind (P) = N_Subprogram_Body
3122          then
3123             Spec := Corresponding_Spec (P);
3124
3125             if Present (Spec) then
3126                Decl := Unit_Declaration_Node (Spec);
3127
3128                if Nkind (Decl) = N_Generic_Package_Declaration
3129                  or else Nkind (Decl) = N_Generic_Subprogram_Declaration
3130                then
3131                   return Decl;
3132                end if;
3133             end if;
3134          end if;
3135
3136          P := Parent (P);
3137       end loop;
3138
3139       return Empty;
3140    end Enclosing_Generic_Unit;
3141
3142    -------------------------------
3143    -- Enclosing_Lib_Unit_Entity --
3144    -------------------------------
3145
3146    function Enclosing_Lib_Unit_Entity return Entity_Id is
3147       Unit_Entity : Entity_Id;
3148
3149    begin
3150       --  Look for enclosing library unit entity by following scope links.
3151       --  Equivalent to, but faster than indexing through the scope stack.
3152
3153       Unit_Entity := Current_Scope;
3154       while (Present (Scope (Unit_Entity))
3155         and then Scope (Unit_Entity) /= Standard_Standard)
3156         and not Is_Child_Unit (Unit_Entity)
3157       loop
3158          Unit_Entity := Scope (Unit_Entity);
3159       end loop;
3160
3161       return Unit_Entity;
3162    end Enclosing_Lib_Unit_Entity;
3163
3164    -----------------------------
3165    -- Enclosing_Lib_Unit_Node --
3166    -----------------------------
3167
3168    function Enclosing_Lib_Unit_Node (N : Node_Id) return Node_Id is
3169       Current_Node : Node_Id;
3170
3171    begin
3172       Current_Node := N;
3173       while Present (Current_Node)
3174         and then Nkind (Current_Node) /= N_Compilation_Unit
3175       loop
3176          Current_Node := Parent (Current_Node);
3177       end loop;
3178
3179       if Nkind (Current_Node) /= N_Compilation_Unit then
3180          return Empty;
3181       end if;
3182
3183       return Current_Node;
3184    end Enclosing_Lib_Unit_Node;
3185
3186    -----------------------
3187    -- Enclosing_Package --
3188    -----------------------
3189
3190    function Enclosing_Package (E : Entity_Id) return Entity_Id is
3191       Dynamic_Scope : constant Entity_Id := Enclosing_Dynamic_Scope (E);
3192
3193    begin
3194       if Dynamic_Scope = Standard_Standard then
3195          return Standard_Standard;
3196
3197       elsif Dynamic_Scope = Empty then
3198          return Empty;
3199
3200       elsif Ekind_In (Dynamic_Scope, E_Package, E_Package_Body,
3201                       E_Generic_Package)
3202       then
3203          return Dynamic_Scope;
3204
3205       else
3206          return Enclosing_Package (Dynamic_Scope);
3207       end if;
3208    end Enclosing_Package;
3209
3210    --------------------------
3211    -- Enclosing_Subprogram --
3212    --------------------------
3213
3214    function Enclosing_Subprogram (E : Entity_Id) return Entity_Id is
3215       Dynamic_Scope : constant Entity_Id := Enclosing_Dynamic_Scope (E);
3216
3217    begin
3218       if Dynamic_Scope = Standard_Standard then
3219          return Empty;
3220
3221       elsif Dynamic_Scope = Empty then
3222          return Empty;
3223
3224       elsif Ekind (Dynamic_Scope) = E_Subprogram_Body then
3225          return Corresponding_Spec (Parent (Parent (Dynamic_Scope)));
3226
3227       elsif Ekind (Dynamic_Scope) = E_Block
3228         or else Ekind (Dynamic_Scope) = E_Return_Statement
3229       then
3230          return Enclosing_Subprogram (Dynamic_Scope);
3231
3232       elsif Ekind (Dynamic_Scope) = E_Task_Type then
3233          return Get_Task_Body_Procedure (Dynamic_Scope);
3234
3235       elsif Ekind (Dynamic_Scope) = E_Limited_Private_Type
3236         and then Present (Full_View (Dynamic_Scope))
3237         and then Ekind (Full_View (Dynamic_Scope)) = E_Task_Type
3238       then
3239          return Get_Task_Body_Procedure (Full_View (Dynamic_Scope));
3240
3241       --  No body is generated if the protected operation is eliminated
3242
3243       elsif Convention (Dynamic_Scope) = Convention_Protected
3244         and then not Is_Eliminated (Dynamic_Scope)
3245         and then Present (Protected_Body_Subprogram (Dynamic_Scope))
3246       then
3247          return Protected_Body_Subprogram (Dynamic_Scope);
3248
3249       else
3250          return Dynamic_Scope;
3251       end if;
3252    end Enclosing_Subprogram;
3253
3254    ------------------------
3255    -- Ensure_Freeze_Node --
3256    ------------------------
3257
3258    procedure Ensure_Freeze_Node (E : Entity_Id) is
3259       FN : Node_Id;
3260
3261    begin
3262       if No (Freeze_Node (E)) then
3263          FN := Make_Freeze_Entity (Sloc (E));
3264          Set_Has_Delayed_Freeze (E);
3265          Set_Freeze_Node (E, FN);
3266          Set_Access_Types_To_Process (FN, No_Elist);
3267          Set_TSS_Elist (FN, No_Elist);
3268          Set_Entity (FN, E);
3269       end if;
3270    end Ensure_Freeze_Node;
3271
3272    ----------------
3273    -- Enter_Name --
3274    ----------------
3275
3276    procedure Enter_Name (Def_Id : Entity_Id) is
3277       C : constant Entity_Id := Current_Entity (Def_Id);
3278       E : constant Entity_Id := Current_Entity_In_Scope (Def_Id);
3279       S : constant Entity_Id := Current_Scope;
3280
3281    begin
3282       Generate_Definition (Def_Id);
3283
3284       --  Add new name to current scope declarations. Check for duplicate
3285       --  declaration, which may or may not be a genuine error.
3286
3287       if Present (E) then
3288
3289          --  Case of previous entity entered because of a missing declaration
3290          --  or else a bad subtype indication. Best is to use the new entity,
3291          --  and make the previous one invisible.
3292
3293          if Etype (E) = Any_Type then
3294             Set_Is_Immediately_Visible (E, False);
3295
3296          --  Case of renaming declaration constructed for package instances.
3297          --  if there is an explicit declaration with the same identifier,
3298          --  the renaming is not immediately visible any longer, but remains
3299          --  visible through selected component notation.
3300
3301          elsif Nkind (Parent (E)) = N_Package_Renaming_Declaration
3302            and then not Comes_From_Source (E)
3303          then
3304             Set_Is_Immediately_Visible (E, False);
3305
3306          --  The new entity may be the package renaming, which has the same
3307          --  same name as a generic formal which has been seen already.
3308
3309          elsif Nkind (Parent (Def_Id)) = N_Package_Renaming_Declaration
3310             and then not Comes_From_Source (Def_Id)
3311          then
3312             Set_Is_Immediately_Visible (E, False);
3313
3314          --  For a fat pointer corresponding to a remote access to subprogram,
3315          --  we use the same identifier as the RAS type, so that the proper
3316          --  name appears in the stub. This type is only retrieved through
3317          --  the RAS type and never by visibility, and is not added to the
3318          --  visibility list (see below).
3319
3320          elsif Nkind (Parent (Def_Id)) = N_Full_Type_Declaration
3321            and then Present (Corresponding_Remote_Type (Def_Id))
3322          then
3323             null;
3324
3325          --  Case of an implicit operation or derived literal. The new entity
3326          --  hides the implicit one,  which is removed from all visibility,
3327          --  i.e. the entity list of its scope, and homonym chain of its name.
3328
3329          elsif (Is_Overloadable (E) and then Is_Inherited_Operation (E))
3330            or else Is_Internal (E)
3331          then
3332             declare
3333                Prev     : Entity_Id;
3334                Prev_Vis : Entity_Id;
3335                Decl     : constant Node_Id := Parent (E);
3336
3337             begin
3338                --  If E is an implicit declaration, it cannot be the first
3339                --  entity in the scope.
3340
3341                Prev := First_Entity (Current_Scope);
3342                while Present (Prev)
3343                  and then Next_Entity (Prev) /= E
3344                loop
3345                   Next_Entity (Prev);
3346                end loop;
3347
3348                if No (Prev) then
3349
3350                   --  If E is not on the entity chain of the current scope,
3351                   --  it is an implicit declaration in the generic formal
3352                   --  part of a generic subprogram. When analyzing the body,
3353                   --  the generic formals are visible but not on the entity
3354                   --  chain of the subprogram. The new entity will become
3355                   --  the visible one in the body.
3356
3357                   pragma Assert
3358                     (Nkind (Parent (Decl)) = N_Generic_Subprogram_Declaration);
3359                   null;
3360
3361                else
3362                   Set_Next_Entity (Prev, Next_Entity (E));
3363
3364                   if No (Next_Entity (Prev)) then
3365                      Set_Last_Entity (Current_Scope, Prev);
3366                   end if;
3367
3368                   if E = Current_Entity (E) then
3369                      Prev_Vis := Empty;
3370
3371                   else
3372                      Prev_Vis := Current_Entity (E);
3373                      while Homonym (Prev_Vis) /= E loop
3374                         Prev_Vis := Homonym (Prev_Vis);
3375                      end loop;
3376                   end if;
3377
3378                   if Present (Prev_Vis)  then
3379
3380                      --  Skip E in the visibility chain
3381
3382                      Set_Homonym (Prev_Vis, Homonym (E));
3383
3384                   else
3385                      Set_Name_Entity_Id (Chars (E), Homonym (E));
3386                   end if;
3387                end if;
3388             end;
3389
3390          --  This section of code could use a comment ???
3391
3392          elsif Present (Etype (E))
3393            and then Is_Concurrent_Type (Etype (E))
3394            and then E = Def_Id
3395          then
3396             return;
3397
3398          --  If the homograph is a protected component renaming, it should not
3399          --  be hiding the current entity. Such renamings are treated as weak
3400          --  declarations.
3401
3402          elsif Is_Prival (E) then
3403             Set_Is_Immediately_Visible (E, False);
3404
3405          --  In this case the current entity is a protected component renaming.
3406          --  Perform minimal decoration by setting the scope and return since
3407          --  the prival should not be hiding other visible entities.
3408
3409          elsif Is_Prival (Def_Id) then
3410             Set_Scope (Def_Id, Current_Scope);
3411             return;
3412
3413          --  Analogous to privals, the discriminal generated for an entry index
3414          --  parameter acts as a weak declaration. Perform minimal decoration
3415          --  to avoid bogus errors.
3416
3417          elsif Is_Discriminal (Def_Id)
3418            and then Ekind (Discriminal_Link (Def_Id)) = E_Entry_Index_Parameter
3419          then
3420             Set_Scope (Def_Id, Current_Scope);
3421             return;
3422
3423          --  In the body or private part of an instance, a type extension may
3424          --  introduce a component with the same name as that of an actual. The
3425          --  legality rule is not enforced, but the semantics of the full type
3426          --  with two components of same name are not clear at this point???
3427
3428          elsif In_Instance_Not_Visible then
3429             null;
3430
3431          --  When compiling a package body, some child units may have become
3432          --  visible. They cannot conflict with local entities that hide them.
3433
3434          elsif Is_Child_Unit (E)
3435            and then In_Open_Scopes (Scope (E))
3436            and then not Is_Immediately_Visible (E)
3437          then
3438             null;
3439
3440          --  Conversely, with front-end inlining we may compile the parent body
3441          --  first, and a child unit subsequently. The context is now the
3442          --  parent spec, and body entities are not visible.
3443
3444          elsif Is_Child_Unit (Def_Id)
3445            and then Is_Package_Body_Entity (E)
3446            and then not In_Package_Body (Current_Scope)
3447          then
3448             null;
3449
3450          --  Case of genuine duplicate declaration
3451
3452          else
3453             Error_Msg_Sloc := Sloc (E);
3454
3455             --  If the previous declaration is an incomplete type declaration
3456             --  this may be an attempt to complete it with a private type. The
3457             --  following avoids confusing cascaded errors.
3458
3459             if Nkind (Parent (E)) = N_Incomplete_Type_Declaration
3460               and then Nkind (Parent (Def_Id)) = N_Private_Type_Declaration
3461             then
3462                Error_Msg_N
3463                  ("incomplete type cannot be completed with a private " &
3464                   "declaration", Parent (Def_Id));
3465                Set_Is_Immediately_Visible (E, False);
3466                Set_Full_View (E, Def_Id);
3467
3468             --  An inherited component of a record conflicts with a new
3469             --  discriminant. The discriminant is inserted first in the scope,
3470             --  but the error should be posted on it, not on the component.
3471
3472             elsif Ekind (E) = E_Discriminant
3473               and then Present (Scope (Def_Id))
3474               and then Scope (Def_Id) /= Current_Scope
3475             then
3476                Error_Msg_Sloc := Sloc (Def_Id);
3477                Error_Msg_N ("& conflicts with declaration#", E);
3478                return;
3479
3480             --  If the name of the unit appears in its own context clause, a
3481             --  dummy package with the name has already been created, and the
3482             --  error emitted. Try to continue quietly.
3483
3484             elsif Error_Posted (E)
3485               and then Sloc (E) = No_Location
3486               and then Nkind (Parent (E)) = N_Package_Specification
3487               and then Current_Scope = Standard_Standard
3488             then
3489                Set_Scope (Def_Id, Current_Scope);
3490                return;
3491
3492             else
3493                Error_Msg_N ("& conflicts with declaration#", Def_Id);
3494
3495                --  Avoid cascaded messages with duplicate components in
3496                --  derived types.
3497
3498                if Ekind_In (E, E_Component, E_Discriminant) then
3499                   return;
3500                end if;
3501             end if;
3502
3503             if Nkind (Parent (Parent (Def_Id))) =
3504                 N_Generic_Subprogram_Declaration
3505               and then Def_Id =
3506                 Defining_Entity (Specification (Parent (Parent (Def_Id))))
3507             then
3508                Error_Msg_N ("\generic units cannot be overloaded", Def_Id);
3509             end if;
3510
3511             --  If entity is in standard, then we are in trouble, because it
3512             --  means that we have a library package with a duplicated name.
3513             --  That's hard to recover from, so abort!
3514
3515             if S = Standard_Standard then
3516                raise Unrecoverable_Error;
3517
3518             --  Otherwise we continue with the declaration. Having two
3519             --  identical declarations should not cause us too much trouble!
3520
3521             else
3522                null;
3523             end if;
3524          end if;
3525       end if;
3526
3527       --  If we fall through, declaration is OK, at least OK enough to continue
3528
3529       --  If Def_Id is a discriminant or a record component we are in the midst
3530       --  of inheriting components in a derived record definition. Preserve
3531       --  their Ekind and Etype.
3532
3533       if Ekind_In (Def_Id, E_Discriminant, E_Component) then
3534          null;
3535
3536       --  If a type is already set, leave it alone (happens when a type
3537       --  declaration is reanalyzed following a call to the optimizer).
3538
3539       elsif Present (Etype (Def_Id)) then
3540          null;
3541
3542       --  Otherwise, the kind E_Void insures that premature uses of the entity
3543       --  will be detected. Any_Type insures that no cascaded errors will occur
3544
3545       else
3546          Set_Ekind (Def_Id, E_Void);
3547          Set_Etype (Def_Id, Any_Type);
3548       end if;
3549
3550       --  Inherited discriminants and components in derived record types are
3551       --  immediately visible. Itypes are not.
3552
3553       if Ekind_In (Def_Id, E_Discriminant, E_Component)
3554         or else (No (Corresponding_Remote_Type (Def_Id))
3555                  and then not Is_Itype (Def_Id))
3556       then
3557          Set_Is_Immediately_Visible (Def_Id);
3558          Set_Current_Entity         (Def_Id);
3559       end if;
3560
3561       Set_Homonym       (Def_Id, C);
3562       Append_Entity     (Def_Id, S);
3563       Set_Public_Status (Def_Id);
3564
3565       --  Declaring a homonym is not allowed in SPARK ...
3566
3567       if Present (C)
3568         and then Restriction_Check_Required (SPARK)
3569       then
3570
3571          declare
3572             Enclosing_Subp : constant Node_Id := Enclosing_Subprogram (Def_Id);
3573             Enclosing_Pack : constant Node_Id := Enclosing_Package (Def_Id);
3574             Other_Scope    : constant Node_Id := Enclosing_Dynamic_Scope (C);
3575          begin
3576
3577             --  ... unless the new declaration is in a subprogram, and the
3578             --  visible declaration is a variable declaration or a parameter
3579             --  specification outside that subprogram.
3580
3581             if Present (Enclosing_Subp)
3582               and then Nkind_In (Parent (C), N_Object_Declaration,
3583                                  N_Parameter_Specification)
3584               and then not Scope_Within_Or_Same (Other_Scope, Enclosing_Subp)
3585             then
3586                null;
3587
3588             --  ... or the new declaration is in a package, and the visible
3589             --  declaration occurs outside that package.
3590
3591             elsif Present (Enclosing_Pack)
3592               and then not Scope_Within_Or_Same (Other_Scope, Enclosing_Pack)
3593             then
3594                null;
3595
3596             --  ... or the new declaration is a component declaration in a
3597             --  record type definition.
3598
3599             elsif Nkind (Parent (Def_Id)) = N_Component_Declaration then
3600                null;
3601
3602             --  Don't issue error for non-source entities
3603
3604             elsif Comes_From_Source (Def_Id)
3605               and then Comes_From_Source (C)
3606             then
3607                Error_Msg_Sloc := Sloc (C);
3608                Check_SPARK_Restriction
3609                  ("redeclaration of identifier &#", Def_Id);
3610             end if;
3611          end;
3612       end if;
3613
3614       --  Warn if new entity hides an old one
3615
3616       if Warn_On_Hiding and then Present (C)
3617
3618          --  Don't warn for record components since they always have a well
3619          --  defined scope which does not confuse other uses. Note that in
3620          --  some cases, Ekind has not been set yet.
3621
3622          and then Ekind (C) /= E_Component
3623          and then Ekind (C) /= E_Discriminant
3624          and then Nkind (Parent (C)) /= N_Component_Declaration
3625          and then Ekind (Def_Id) /= E_Component
3626          and then Ekind (Def_Id) /= E_Discriminant
3627          and then Nkind (Parent (Def_Id)) /= N_Component_Declaration
3628
3629          --  Don't warn for one character variables. It is too common to use
3630          --  such variables as locals and will just cause too many false hits.
3631
3632          and then Length_Of_Name (Chars (C)) /= 1
3633
3634          --  Don't warn for non-source entities
3635
3636          and then Comes_From_Source (C)
3637          and then Comes_From_Source (Def_Id)
3638
3639          --  Don't warn unless entity in question is in extended main source
3640
3641          and then In_Extended_Main_Source_Unit (Def_Id)
3642
3643          --  Finally, the hidden entity must be either immediately visible or
3644          --  use visible (i.e. from a used package).
3645
3646          and then
3647            (Is_Immediately_Visible (C)
3648               or else
3649             Is_Potentially_Use_Visible (C))
3650       then
3651          Error_Msg_Sloc := Sloc (C);
3652          Error_Msg_N ("declaration hides &#?", Def_Id);
3653       end if;
3654    end Enter_Name;
3655
3656    --------------------------
3657    -- Explain_Limited_Type --
3658    --------------------------
3659
3660    procedure Explain_Limited_Type (T : Entity_Id; N : Node_Id) is
3661       C : Entity_Id;
3662
3663    begin
3664       --  For array, component type must be limited
3665
3666       if Is_Array_Type (T) then
3667          Error_Msg_Node_2 := T;
3668          Error_Msg_NE
3669            ("\component type& of type& is limited", N, Component_Type (T));
3670          Explain_Limited_Type (Component_Type (T), N);
3671
3672       elsif Is_Record_Type (T) then
3673
3674          --  No need for extra messages if explicit limited record
3675
3676          if Is_Limited_Record (Base_Type (T)) then
3677             return;
3678          end if;
3679
3680          --  Otherwise find a limited component. Check only components that
3681          --  come from source, or inherited components that appear in the
3682          --  source of the ancestor.
3683
3684          C := First_Component (T);
3685          while Present (C) loop
3686             if Is_Limited_Type (Etype (C))
3687               and then
3688                 (Comes_From_Source (C)
3689                    or else
3690                      (Present (Original_Record_Component (C))
3691                        and then
3692                          Comes_From_Source (Original_Record_Component (C))))
3693             then
3694                Error_Msg_Node_2 := T;
3695                Error_Msg_NE ("\component& of type& has limited type", N, C);
3696                Explain_Limited_Type (Etype (C), N);
3697                return;
3698             end if;
3699
3700             Next_Component (C);
3701          end loop;
3702
3703          --  The type may be declared explicitly limited, even if no component
3704          --  of it is limited, in which case we fall out of the loop.
3705          return;
3706       end if;
3707    end Explain_Limited_Type;
3708
3709    -----------------
3710    -- Find_Actual --
3711    -----------------
3712
3713    procedure Find_Actual
3714      (N        : Node_Id;
3715       Formal   : out Entity_Id;
3716       Call     : out Node_Id)
3717    is
3718       Parnt  : constant Node_Id := Parent (N);
3719       Actual : Node_Id;
3720
3721    begin
3722       if (Nkind (Parnt) = N_Indexed_Component
3723             or else
3724           Nkind (Parnt) = N_Selected_Component)
3725         and then N = Prefix (Parnt)
3726       then
3727          Find_Actual (Parnt, Formal, Call);
3728          return;
3729
3730       elsif Nkind (Parnt) = N_Parameter_Association
3731         and then N = Explicit_Actual_Parameter (Parnt)
3732       then
3733          Call := Parent (Parnt);
3734
3735       elsif Nkind_In (Parnt, N_Procedure_Call_Statement, N_Function_Call) then
3736          Call := Parnt;
3737
3738       else
3739          Formal := Empty;
3740          Call   := Empty;
3741          return;
3742       end if;
3743
3744       --  If we have a call to a subprogram look for the parameter. Note that
3745       --  we exclude overloaded calls, since we don't know enough to be sure
3746       --  of giving the right answer in this case.
3747
3748       if Is_Entity_Name (Name (Call))
3749         and then Present (Entity (Name (Call)))
3750         and then Is_Overloadable (Entity (Name (Call)))
3751         and then not Is_Overloaded (Name (Call))
3752       then
3753          --  Fall here if we are definitely a parameter
3754
3755          Actual := First_Actual (Call);
3756          Formal := First_Formal (Entity (Name (Call)));
3757          while Present (Formal) and then Present (Actual) loop
3758             if Actual = N then
3759                return;
3760             else
3761                Actual := Next_Actual (Actual);
3762                Formal := Next_Formal (Formal);
3763             end if;
3764          end loop;
3765       end if;
3766
3767       --  Fall through here if we did not find matching actual
3768
3769       Formal := Empty;
3770       Call   := Empty;
3771    end Find_Actual;
3772
3773    ---------------------------
3774    -- Find_Body_Discriminal --
3775    ---------------------------
3776
3777    function Find_Body_Discriminal
3778      (Spec_Discriminant : Entity_Id) return Entity_Id
3779    is
3780       Tsk  : Entity_Id;
3781       Disc : Entity_Id;
3782
3783    begin
3784       --  If expansion is suppressed, then the scope can be the concurrent type
3785       --  itself rather than a corresponding concurrent record type.
3786
3787       if Is_Concurrent_Type (Scope (Spec_Discriminant)) then
3788          Tsk := Scope (Spec_Discriminant);
3789
3790       else
3791          pragma Assert (Is_Concurrent_Record_Type (Scope (Spec_Discriminant)));
3792
3793          Tsk := Corresponding_Concurrent_Type (Scope (Spec_Discriminant));
3794       end if;
3795
3796       --  Find discriminant of original concurrent type, and use its current
3797       --  discriminal, which is the renaming within the task/protected body.
3798
3799       Disc := First_Discriminant (Tsk);
3800       while Present (Disc) loop
3801          if Chars (Disc) = Chars (Spec_Discriminant) then
3802             return Discriminal (Disc);
3803          end if;
3804
3805          Next_Discriminant (Disc);
3806       end loop;
3807
3808       --  That loop should always succeed in finding a matching entry and
3809       --  returning. Fatal error if not.
3810
3811       raise Program_Error;
3812    end Find_Body_Discriminal;
3813
3814    -------------------------------------
3815    -- Find_Corresponding_Discriminant --
3816    -------------------------------------
3817
3818    function Find_Corresponding_Discriminant
3819      (Id  : Node_Id;
3820       Typ : Entity_Id) return Entity_Id
3821    is
3822       Par_Disc : Entity_Id;
3823       Old_Disc : Entity_Id;
3824       New_Disc : Entity_Id;
3825
3826    begin
3827       Par_Disc := Original_Record_Component (Original_Discriminant (Id));
3828
3829       --  The original type may currently be private, and the discriminant
3830       --  only appear on its full view.
3831
3832       if Is_Private_Type (Scope (Par_Disc))
3833         and then not Has_Discriminants (Scope (Par_Disc))
3834         and then Present (Full_View (Scope (Par_Disc)))
3835       then
3836          Old_Disc := First_Discriminant (Full_View (Scope (Par_Disc)));
3837       else
3838          Old_Disc := First_Discriminant (Scope (Par_Disc));
3839       end if;
3840
3841       if Is_Class_Wide_Type (Typ) then
3842          New_Disc := First_Discriminant (Root_Type (Typ));
3843       else
3844          New_Disc := First_Discriminant (Typ);
3845       end if;
3846
3847       while Present (Old_Disc) and then Present (New_Disc) loop
3848          if Old_Disc = Par_Disc  then
3849             return New_Disc;
3850          else
3851             Next_Discriminant (Old_Disc);
3852             Next_Discriminant (New_Disc);
3853          end if;
3854       end loop;
3855
3856       --  Should always find it
3857
3858       raise Program_Error;
3859    end Find_Corresponding_Discriminant;
3860
3861    --------------------------
3862    -- Find_Overlaid_Entity --
3863    --------------------------
3864
3865    procedure Find_Overlaid_Entity
3866      (N   : Node_Id;
3867       Ent : out Entity_Id;
3868       Off : out Boolean)
3869    is
3870       Expr : Node_Id;
3871
3872    begin
3873       --  We are looking for one of the two following forms:
3874
3875       --    for X'Address use Y'Address
3876
3877       --  or
3878
3879       --    Const : constant Address := expr;
3880       --    ...
3881       --    for X'Address use Const;
3882
3883       --  In the second case, the expr is either Y'Address, or recursively a
3884       --  constant that eventually references Y'Address.
3885
3886       Ent := Empty;
3887       Off := False;
3888
3889       if Nkind (N) = N_Attribute_Definition_Clause
3890         and then Chars (N) = Name_Address
3891       then
3892          Expr := Expression (N);
3893
3894          --  This loop checks the form of the expression for Y'Address,
3895          --  using recursion to deal with intermediate constants.
3896
3897          loop
3898             --  Check for Y'Address
3899
3900             if Nkind (Expr) = N_Attribute_Reference
3901               and then Attribute_Name (Expr) = Name_Address
3902             then
3903                Expr := Prefix (Expr);
3904                exit;
3905
3906                --  Check for Const where Const is a constant entity
3907
3908             elsif Is_Entity_Name (Expr)
3909               and then Ekind (Entity (Expr)) = E_Constant
3910             then
3911                Expr := Constant_Value (Entity (Expr));
3912
3913             --  Anything else does not need checking
3914
3915             else
3916                return;
3917             end if;
3918          end loop;
3919
3920          --  This loop checks the form of the prefix for an entity, using
3921          --  recursion to deal with intermediate components.
3922
3923          loop
3924             --  Check for Y where Y is an entity
3925
3926             if Is_Entity_Name (Expr) then
3927                Ent := Entity (Expr);
3928                return;
3929
3930             --  Check for components
3931
3932             elsif
3933               Nkind_In (Expr, N_Selected_Component, N_Indexed_Component)
3934             then
3935                Expr := Prefix (Expr);
3936                Off := True;
3937
3938             --  Anything else does not need checking
3939
3940             else
3941                return;
3942             end if;
3943          end loop;
3944       end if;
3945    end Find_Overlaid_Entity;
3946
3947    -------------------------
3948    -- Find_Parameter_Type --
3949    -------------------------
3950
3951    function Find_Parameter_Type (Param : Node_Id) return Entity_Id is
3952    begin
3953       if Nkind (Param) /= N_Parameter_Specification then
3954          return Empty;
3955
3956       --  For an access parameter, obtain the type from the formal entity
3957       --  itself, because access to subprogram nodes do not carry a type.
3958       --  Shouldn't we always use the formal entity ???
3959
3960       elsif Nkind (Parameter_Type (Param)) = N_Access_Definition then
3961          return Etype (Defining_Identifier (Param));
3962
3963       else
3964          return Etype (Parameter_Type (Param));
3965       end if;
3966    end Find_Parameter_Type;
3967
3968    -----------------------------
3969    -- Find_Static_Alternative --
3970    -----------------------------
3971
3972    function Find_Static_Alternative (N : Node_Id) return Node_Id is
3973       Expr   : constant Node_Id := Expression (N);
3974       Val    : constant Uint    := Expr_Value (Expr);
3975       Alt    : Node_Id;
3976       Choice : Node_Id;
3977
3978    begin
3979       Alt := First (Alternatives (N));
3980
3981       Search : loop
3982          if Nkind (Alt) /= N_Pragma then
3983             Choice := First (Discrete_Choices (Alt));
3984             while Present (Choice) loop
3985
3986                --  Others choice, always matches
3987
3988                if Nkind (Choice) = N_Others_Choice then
3989                   exit Search;
3990
3991                --  Range, check if value is in the range
3992
3993                elsif Nkind (Choice) = N_Range then
3994                   exit Search when
3995                     Val >= Expr_Value (Low_Bound (Choice))
3996                       and then
3997                     Val <= Expr_Value (High_Bound (Choice));
3998
3999                --  Choice is a subtype name. Note that we know it must
4000                --  be a static subtype, since otherwise it would have
4001                --  been diagnosed as illegal.
4002
4003                elsif Is_Entity_Name (Choice)
4004                  and then Is_Type (Entity (Choice))
4005                then
4006                   exit Search when Is_In_Range (Expr, Etype (Choice),
4007                                                 Assume_Valid => False);
4008
4009                --  Choice is a subtype indication
4010
4011                elsif Nkind (Choice) = N_Subtype_Indication then
4012                   declare
4013                      C : constant Node_Id := Constraint (Choice);
4014                      R : constant Node_Id := Range_Expression (C);
4015
4016                   begin
4017                      exit Search when
4018                        Val >= Expr_Value (Low_Bound (R))
4019                          and then
4020                        Val <= Expr_Value (High_Bound (R));
4021                   end;
4022
4023                --  Choice is a simple expression
4024
4025                else
4026                   exit Search when Val = Expr_Value (Choice);
4027                end if;
4028
4029                Next (Choice);
4030             end loop;
4031          end if;
4032
4033          Next (Alt);
4034          pragma Assert (Present (Alt));
4035       end loop Search;
4036
4037       --  The above loop *must* terminate by finding a match, since
4038       --  we know the case statement is valid, and the value of the
4039       --  expression is known at compile time. When we fall out of
4040       --  the loop, Alt points to the alternative that we know will
4041       --  be selected at run time.
4042
4043       return Alt;
4044    end Find_Static_Alternative;
4045
4046    ------------------
4047    -- First_Actual --
4048    ------------------
4049
4050    function First_Actual (Node : Node_Id) return Node_Id is
4051       N : Node_Id;
4052
4053    begin
4054       if No (Parameter_Associations (Node)) then
4055          return Empty;
4056       end if;
4057
4058       N := First (Parameter_Associations (Node));
4059
4060       if Nkind (N) = N_Parameter_Association then
4061          return First_Named_Actual (Node);
4062       else
4063          return N;
4064       end if;
4065    end First_Actual;
4066
4067    -----------------------
4068    -- Gather_Components --
4069    -----------------------
4070
4071    procedure Gather_Components
4072      (Typ           : Entity_Id;
4073       Comp_List     : Node_Id;
4074       Governed_By   : List_Id;
4075       Into          : Elist_Id;
4076       Report_Errors : out Boolean)
4077    is
4078       Assoc           : Node_Id;
4079       Variant         : Node_Id;
4080       Discrete_Choice : Node_Id;
4081       Comp_Item       : Node_Id;
4082
4083       Discrim       : Entity_Id;
4084       Discrim_Name  : Node_Id;
4085       Discrim_Value : Node_Id;
4086
4087    begin
4088       Report_Errors := False;
4089
4090       if No (Comp_List) or else Null_Present (Comp_List) then
4091          return;
4092
4093       elsif Present (Component_Items (Comp_List)) then
4094          Comp_Item := First (Component_Items (Comp_List));
4095
4096       else
4097          Comp_Item := Empty;
4098       end if;
4099
4100       while Present (Comp_Item) loop
4101
4102          --  Skip the tag of a tagged record, the interface tags, as well
4103          --  as all items that are not user components (anonymous types,
4104          --  rep clauses, Parent field, controller field).
4105
4106          if Nkind (Comp_Item) = N_Component_Declaration then
4107             declare
4108                Comp : constant Entity_Id := Defining_Identifier (Comp_Item);
4109             begin
4110                if not Is_Tag (Comp)
4111                  and then Chars (Comp) /= Name_uParent
4112                then
4113                   Append_Elmt (Comp, Into);
4114                end if;
4115             end;
4116          end if;
4117
4118          Next (Comp_Item);
4119       end loop;
4120
4121       if No (Variant_Part (Comp_List)) then
4122          return;
4123       else
4124          Discrim_Name := Name (Variant_Part (Comp_List));
4125          Variant := First_Non_Pragma (Variants (Variant_Part (Comp_List)));
4126       end if;
4127
4128       --  Look for the discriminant that governs this variant part.
4129       --  The discriminant *must* be in the Governed_By List
4130
4131       Assoc := First (Governed_By);
4132       Find_Constraint : loop
4133          Discrim := First (Choices (Assoc));
4134          exit Find_Constraint when Chars (Discrim_Name) = Chars (Discrim)
4135            or else (Present (Corresponding_Discriminant (Entity (Discrim)))
4136                       and then
4137                     Chars (Corresponding_Discriminant (Entity (Discrim)))
4138                          = Chars  (Discrim_Name))
4139            or else Chars (Original_Record_Component (Entity (Discrim)))
4140                          = Chars (Discrim_Name);
4141
4142          if No (Next (Assoc)) then
4143             if not Is_Constrained (Typ)
4144               and then Is_Derived_Type (Typ)
4145               and then Present (Stored_Constraint (Typ))
4146             then
4147                --  If the type is a tagged type with inherited discriminants,
4148                --  use the stored constraint on the parent in order to find
4149                --  the values of discriminants that are otherwise hidden by an
4150                --  explicit constraint. Renamed discriminants are handled in
4151                --  the code above.
4152
4153                --  If several parent discriminants are renamed by a single
4154                --  discriminant of the derived type, the call to obtain the
4155                --  Corresponding_Discriminant field only retrieves the last
4156                --  of them. We recover the constraint on the others from the
4157                --  Stored_Constraint as well.
4158
4159                declare
4160                   D : Entity_Id;
4161                   C : Elmt_Id;
4162
4163                begin
4164                   D := First_Discriminant (Etype (Typ));
4165                   C := First_Elmt (Stored_Constraint (Typ));
4166                   while Present (D) and then Present (C) loop
4167                      if Chars (Discrim_Name) = Chars (D) then
4168                         if Is_Entity_Name (Node (C))
4169                           and then Entity (Node (C)) = Entity (Discrim)
4170                         then
4171                            --  D is renamed by Discrim, whose value is given in
4172                            --  Assoc.
4173
4174                            null;
4175
4176                         else
4177                            Assoc :=
4178                              Make_Component_Association (Sloc (Typ),
4179                                New_List
4180                                  (New_Occurrence_Of (D, Sloc (Typ))),
4181                                   Duplicate_Subexpr_No_Checks (Node (C)));
4182                         end if;
4183                         exit Find_Constraint;
4184                      end if;
4185
4186                      Next_Discriminant (D);
4187                      Next_Elmt (C);
4188                   end loop;
4189                end;
4190             end if;
4191          end if;
4192
4193          if No (Next (Assoc)) then
4194             Error_Msg_NE (" missing value for discriminant&",
4195               First (Governed_By), Discrim_Name);
4196             Report_Errors := True;
4197             return;
4198          end if;
4199
4200          Next (Assoc);
4201       end loop Find_Constraint;
4202
4203       Discrim_Value := Expression (Assoc);
4204
4205       if not Is_OK_Static_Expression (Discrim_Value) then
4206          Error_Msg_FE
4207            ("value for discriminant & must be static!",
4208             Discrim_Value, Discrim);
4209          Why_Not_Static (Discrim_Value);
4210          Report_Errors := True;
4211          return;
4212       end if;
4213
4214       Search_For_Discriminant_Value : declare
4215          Low  : Node_Id;
4216          High : Node_Id;
4217
4218          UI_High          : Uint;
4219          UI_Low           : Uint;
4220          UI_Discrim_Value : constant Uint := Expr_Value (Discrim_Value);
4221
4222       begin
4223          Find_Discrete_Value : while Present (Variant) loop
4224             Discrete_Choice := First (Discrete_Choices (Variant));
4225             while Present (Discrete_Choice) loop
4226
4227                exit Find_Discrete_Value when
4228                  Nkind (Discrete_Choice) = N_Others_Choice;
4229
4230                Get_Index_Bounds (Discrete_Choice, Low, High);
4231
4232                UI_Low  := Expr_Value (Low);
4233                UI_High := Expr_Value (High);
4234
4235                exit Find_Discrete_Value when
4236                  UI_Low <= UI_Discrim_Value
4237                    and then
4238                  UI_High >= UI_Discrim_Value;
4239
4240                Next (Discrete_Choice);
4241             end loop;
4242
4243             Next_Non_Pragma (Variant);
4244          end loop Find_Discrete_Value;
4245       end Search_For_Discriminant_Value;
4246
4247       if No (Variant) then
4248          Error_Msg_NE
4249            ("value of discriminant & is out of range", Discrim_Value, Discrim);
4250          Report_Errors := True;
4251          return;
4252       end  if;
4253
4254       --  If we have found the corresponding choice, recursively add its
4255       --  components to the Into list.
4256
4257       Gather_Components (Empty,
4258         Component_List (Variant), Governed_By, Into, Report_Errors);
4259    end Gather_Components;
4260
4261    ------------------------
4262    -- Get_Actual_Subtype --
4263    ------------------------
4264
4265    function Get_Actual_Subtype (N : Node_Id) return Entity_Id is
4266       Typ  : constant Entity_Id := Etype (N);
4267       Utyp : Entity_Id := Underlying_Type (Typ);
4268       Decl : Node_Id;
4269       Atyp : Entity_Id;
4270
4271    begin
4272       if No (Utyp) then
4273          Utyp := Typ;
4274       end if;
4275
4276       --  If what we have is an identifier that references a subprogram
4277       --  formal, or a variable or constant object, then we get the actual
4278       --  subtype from the referenced entity if one has been built.
4279
4280       if Nkind (N) = N_Identifier
4281         and then
4282           (Is_Formal (Entity (N))
4283             or else Ekind (Entity (N)) = E_Constant
4284             or else Ekind (Entity (N)) = E_Variable)
4285         and then Present (Actual_Subtype (Entity (N)))
4286       then
4287          return Actual_Subtype (Entity (N));
4288
4289       --  Actual subtype of unchecked union is always itself. We never need
4290       --  the "real" actual subtype. If we did, we couldn't get it anyway
4291       --  because the discriminant is not available. The restrictions on
4292       --  Unchecked_Union are designed to make sure that this is OK.
4293
4294       elsif Is_Unchecked_Union (Base_Type (Utyp)) then
4295          return Typ;
4296
4297       --  Here for the unconstrained case, we must find actual subtype
4298       --  No actual subtype is available, so we must build it on the fly.
4299
4300       --  Checking the type, not the underlying type, for constrainedness
4301       --  seems to be necessary. Maybe all the tests should be on the type???
4302
4303       elsif (not Is_Constrained (Typ))
4304            and then (Is_Array_Type (Utyp)
4305                       or else (Is_Record_Type (Utyp)
4306                                 and then Has_Discriminants (Utyp)))
4307            and then not Has_Unknown_Discriminants (Utyp)
4308            and then not (Ekind (Utyp) = E_String_Literal_Subtype)
4309       then
4310          --  Nothing to do if in spec expression (why not???)
4311
4312          if In_Spec_Expression then
4313             return Typ;
4314
4315          elsif Is_Private_Type (Typ)
4316            and then not Has_Discriminants (Typ)
4317          then
4318             --  If the type has no discriminants, there is no subtype to
4319             --  build, even if the underlying type is discriminated.
4320
4321             return Typ;
4322
4323          --  Else build the actual subtype
4324
4325          else
4326             Decl := Build_Actual_Subtype (Typ, N);
4327             Atyp := Defining_Identifier (Decl);
4328
4329             --  If Build_Actual_Subtype generated a new declaration then use it
4330
4331             if Atyp /= Typ then
4332
4333                --  The actual subtype is an Itype, so analyze the declaration,
4334                --  but do not attach it to the tree, to get the type defined.
4335
4336                Set_Parent (Decl, N);
4337                Set_Is_Itype (Atyp);
4338                Analyze (Decl, Suppress => All_Checks);
4339                Set_Associated_Node_For_Itype (Atyp, N);
4340                Set_Has_Delayed_Freeze (Atyp, False);
4341
4342                --  We need to freeze the actual subtype immediately. This is
4343                --  needed, because otherwise this Itype will not get frozen
4344                --  at all, and it is always safe to freeze on creation because
4345                --  any associated types must be frozen at this point.
4346
4347                Freeze_Itype (Atyp, N);
4348                return Atyp;
4349
4350             --  Otherwise we did not build a declaration, so return original
4351
4352             else
4353                return Typ;
4354             end if;
4355          end if;
4356
4357       --  For all remaining cases, the actual subtype is the same as
4358       --  the nominal type.
4359
4360       else
4361          return Typ;
4362       end if;
4363    end Get_Actual_Subtype;
4364
4365    -------------------------------------
4366    -- Get_Actual_Subtype_If_Available --
4367    -------------------------------------
4368
4369    function Get_Actual_Subtype_If_Available (N : Node_Id) return Entity_Id is
4370       Typ  : constant Entity_Id := Etype (N);
4371
4372    begin
4373       --  If what we have is an identifier that references a subprogram
4374       --  formal, or a variable or constant object, then we get the actual
4375       --  subtype from the referenced entity if one has been built.
4376
4377       if Nkind (N) = N_Identifier
4378         and then
4379           (Is_Formal (Entity (N))
4380             or else Ekind (Entity (N)) = E_Constant
4381             or else Ekind (Entity (N)) = E_Variable)
4382         and then Present (Actual_Subtype (Entity (N)))
4383       then
4384          return Actual_Subtype (Entity (N));
4385
4386       --  Otherwise the Etype of N is returned unchanged
4387
4388       else
4389          return Typ;
4390       end if;
4391    end Get_Actual_Subtype_If_Available;
4392
4393    ------------------------
4394    -- Get_Body_From_Stub --
4395    ------------------------
4396
4397    function Get_Body_From_Stub (N : Node_Id) return Node_Id is
4398    begin
4399       return Proper_Body (Unit (Library_Unit (N)));
4400    end Get_Body_From_Stub;
4401
4402    -------------------------------
4403    -- Get_Default_External_Name --
4404    -------------------------------
4405
4406    function Get_Default_External_Name (E : Node_Or_Entity_Id) return Node_Id is
4407    begin
4408       Get_Decoded_Name_String (Chars (E));
4409
4410       if Opt.External_Name_Imp_Casing = Uppercase then
4411          Set_Casing (All_Upper_Case);
4412       else
4413          Set_Casing (All_Lower_Case);
4414       end if;
4415
4416       return
4417         Make_String_Literal (Sloc (E),
4418           Strval => String_From_Name_Buffer);
4419    end Get_Default_External_Name;
4420
4421    --------------------------
4422    -- Get_Enclosing_Object --
4423    --------------------------
4424
4425    function Get_Enclosing_Object (N : Node_Id) return Entity_Id is
4426    begin
4427       if Is_Entity_Name (N) then
4428          return Entity (N);
4429       else
4430          case Nkind (N) is
4431             when N_Indexed_Component  |
4432                  N_Slice              |
4433                  N_Selected_Component =>
4434
4435                --  If not generating code, a dereference may be left implicit.
4436                --  In thoses cases, return Empty.
4437
4438                if Is_Access_Type (Etype (Prefix (N))) then
4439                   return Empty;
4440                else
4441                   return Get_Enclosing_Object (Prefix (N));
4442                end if;
4443
4444             when N_Type_Conversion =>
4445                return Get_Enclosing_Object (Expression (N));
4446
4447             when others =>
4448                return Empty;
4449          end case;
4450       end if;
4451    end Get_Enclosing_Object;
4452
4453    ---------------------------
4454    -- Get_Enum_Lit_From_Pos --
4455    ---------------------------
4456
4457    function Get_Enum_Lit_From_Pos
4458      (T   : Entity_Id;
4459       Pos : Uint;
4460       Loc : Source_Ptr) return Node_Id
4461    is
4462       Lit : Node_Id;
4463
4464    begin
4465       --  In the case where the literal is of type Character, Wide_Character
4466       --  or Wide_Wide_Character or of a type derived from them, there needs
4467       --  to be some special handling since there is no explicit chain of
4468       --  literals to search. Instead, an N_Character_Literal node is created
4469       --  with the appropriate Char_Code and Chars fields.
4470
4471       if Is_Standard_Character_Type (T) then
4472          Set_Character_Literal_Name (UI_To_CC (Pos));
4473          return
4474            Make_Character_Literal (Loc,
4475              Chars              => Name_Find,
4476              Char_Literal_Value => Pos);
4477
4478       --  For all other cases, we have a complete table of literals, and
4479       --  we simply iterate through the chain of literal until the one
4480       --  with the desired position value is found.
4481       --
4482
4483       else
4484          Lit := First_Literal (Base_Type (T));
4485          for J in 1 .. UI_To_Int (Pos) loop
4486             Next_Literal (Lit);
4487          end loop;
4488
4489          return New_Occurrence_Of (Lit, Loc);
4490       end if;
4491    end Get_Enum_Lit_From_Pos;
4492
4493    ---------------------------------------
4494    -- Get_Ensures_From_Test_Case_Pragma --
4495    ---------------------------------------
4496
4497    function Get_Ensures_From_Test_Case_Pragma (N : Node_Id) return Node_Id is
4498       Args : constant List_Id := Pragma_Argument_Associations (N);
4499       Res  : Node_Id;
4500
4501    begin
4502       if List_Length (Args) = 4 then
4503          Res := Pick (Args, 4);
4504
4505       elsif List_Length (Args) = 3 then
4506          Res := Pick (Args, 3);
4507
4508          if Chars (Res) /= Name_Ensures then
4509             Res := Empty;
4510          end if;
4511
4512       else
4513          Res := Empty;
4514       end if;
4515
4516       return Res;
4517    end Get_Ensures_From_Test_Case_Pragma;
4518
4519    ------------------------
4520    -- Get_Generic_Entity --
4521    ------------------------
4522
4523    function Get_Generic_Entity (N : Node_Id) return Entity_Id is
4524       Ent : constant Entity_Id := Entity (Name (N));
4525    begin
4526       if Present (Renamed_Object (Ent)) then
4527          return Renamed_Object (Ent);
4528       else
4529          return Ent;
4530       end if;
4531    end Get_Generic_Entity;
4532
4533    ----------------------
4534    -- Get_Index_Bounds --
4535    ----------------------
4536
4537    procedure Get_Index_Bounds (N : Node_Id; L, H : out Node_Id) is
4538       Kind : constant Node_Kind := Nkind (N);
4539       R    : Node_Id;
4540
4541    begin
4542       if Kind = N_Range then
4543          L := Low_Bound (N);
4544          H := High_Bound (N);
4545
4546       elsif Kind = N_Subtype_Indication then
4547          R := Range_Expression (Constraint (N));
4548
4549          if R = Error then
4550             L := Error;
4551             H := Error;
4552             return;
4553
4554          else
4555             L := Low_Bound  (Range_Expression (Constraint (N)));
4556             H := High_Bound (Range_Expression (Constraint (N)));
4557          end if;
4558
4559       elsif Is_Entity_Name (N) and then Is_Type (Entity (N)) then
4560          if Error_Posted (Scalar_Range (Entity (N))) then
4561             L := Error;
4562             H := Error;
4563
4564          elsif Nkind (Scalar_Range (Entity (N))) = N_Subtype_Indication then
4565             Get_Index_Bounds (Scalar_Range (Entity (N)), L, H);
4566
4567          else
4568             L := Low_Bound  (Scalar_Range (Entity (N)));
4569             H := High_Bound (Scalar_Range (Entity (N)));
4570          end if;
4571
4572       else
4573          --  N is an expression, indicating a range with one value
4574
4575          L := N;
4576          H := N;
4577       end if;
4578    end Get_Index_Bounds;
4579
4580    ----------------------------------
4581    -- Get_Library_Unit_Name_string --
4582    ----------------------------------
4583
4584    procedure Get_Library_Unit_Name_String (Decl_Node : Node_Id) is
4585       Unit_Name_Id : constant Unit_Name_Type := Get_Unit_Name (Decl_Node);
4586
4587    begin
4588       Get_Unit_Name_String (Unit_Name_Id);
4589
4590       --  Remove seven last character (" (spec)" or " (body)")
4591
4592       Name_Len := Name_Len - 7;
4593       pragma Assert (Name_Buffer (Name_Len + 1) = ' ');
4594    end Get_Library_Unit_Name_String;
4595
4596    ------------------------
4597    -- Get_Name_Entity_Id --
4598    ------------------------
4599
4600    function Get_Name_Entity_Id (Id : Name_Id) return Entity_Id is
4601    begin
4602       return Entity_Id (Get_Name_Table_Info (Id));
4603    end Get_Name_Entity_Id;
4604
4605    ------------------------------------
4606    -- Get_Name_From_Test_Case_Pragma --
4607    ------------------------------------
4608
4609    function Get_Name_From_Test_Case_Pragma (N : Node_Id) return String_Id is
4610       Arg : constant Node_Id :=
4611               Get_Pragma_Arg (First (Pragma_Argument_Associations (N)));
4612    begin
4613       return Strval (Expr_Value_S (Arg));
4614    end Get_Name_From_Test_Case_Pragma;
4615
4616    -------------------
4617    -- Get_Pragma_Id --
4618    -------------------
4619
4620    function Get_Pragma_Id (N : Node_Id) return Pragma_Id is
4621    begin
4622       return Get_Pragma_Id (Pragma_Name (N));
4623    end Get_Pragma_Id;
4624
4625    ---------------------------
4626    -- Get_Referenced_Object --
4627    ---------------------------
4628
4629    function Get_Referenced_Object (N : Node_Id) return Node_Id is
4630       R : Node_Id;
4631
4632    begin
4633       R := N;
4634       while Is_Entity_Name (R)
4635         and then Present (Renamed_Object (Entity (R)))
4636       loop
4637          R := Renamed_Object (Entity (R));
4638       end loop;
4639
4640       return R;
4641    end Get_Referenced_Object;
4642
4643    ------------------------
4644    -- Get_Renamed_Entity --
4645    ------------------------
4646
4647    function Get_Renamed_Entity (E : Entity_Id) return Entity_Id is
4648       R : Entity_Id;
4649
4650    begin
4651       R := E;
4652       while Present (Renamed_Entity (R)) loop
4653          R := Renamed_Entity (R);
4654       end loop;
4655
4656       return R;
4657    end Get_Renamed_Entity;
4658
4659    ----------------------------------------
4660    -- Get_Requires_From_Test_Case_Pragma --
4661    ----------------------------------------
4662
4663    function Get_Requires_From_Test_Case_Pragma (N : Node_Id) return Node_Id is
4664       Args : constant List_Id := Pragma_Argument_Associations (N);
4665       Res  : Node_Id;
4666
4667    begin
4668       if List_Length (Args) >= 3 then
4669          Res := Pick (Args, 3);
4670
4671          if Chars (Res) /= Name_Requires then
4672             Res := Empty;
4673          end if;
4674
4675       else
4676          Res := Empty;
4677       end if;
4678
4679       return Res;
4680    end Get_Requires_From_Test_Case_Pragma;
4681
4682    -------------------------
4683    -- Get_Subprogram_Body --
4684    -------------------------
4685
4686    function Get_Subprogram_Body (E : Entity_Id) return Node_Id is
4687       Decl : Node_Id;
4688
4689    begin
4690       Decl := Unit_Declaration_Node (E);
4691
4692       if Nkind (Decl) = N_Subprogram_Body then
4693          return Decl;
4694
4695       --  The below comment is bad, because it is possible for
4696       --  Nkind (Decl) to be an N_Subprogram_Body_Stub ???
4697
4698       else           --  Nkind (Decl) = N_Subprogram_Declaration
4699
4700          if Present (Corresponding_Body (Decl)) then
4701             return Unit_Declaration_Node (Corresponding_Body (Decl));
4702
4703          --  Imported subprogram case
4704
4705          else
4706             return Empty;
4707          end if;
4708       end if;
4709    end Get_Subprogram_Body;
4710
4711    ---------------------------
4712    -- Get_Subprogram_Entity --
4713    ---------------------------
4714
4715    function Get_Subprogram_Entity (Nod : Node_Id) return Entity_Id is
4716       Nam  : Node_Id;
4717       Proc : Entity_Id;
4718
4719    begin
4720       if Nkind (Nod) = N_Accept_Statement then
4721          Nam := Entry_Direct_Name (Nod);
4722
4723       --  For an entry call, the prefix of the call is a selected component.
4724       --  Need additional code for internal calls ???
4725
4726       elsif Nkind (Nod) = N_Entry_Call_Statement then
4727          if Nkind (Name (Nod)) = N_Selected_Component then
4728             Nam := Entity (Selector_Name (Name (Nod)));
4729          else
4730             Nam := Empty;
4731          end if;
4732
4733       else
4734          Nam := Name (Nod);
4735       end if;
4736
4737       if Nkind (Nam) = N_Explicit_Dereference then
4738          Proc := Etype (Prefix (Nam));
4739       elsif Is_Entity_Name (Nam) then
4740          Proc := Entity (Nam);
4741       else
4742          return Empty;
4743       end if;
4744
4745       if Is_Object (Proc) then
4746          Proc := Etype (Proc);
4747       end if;
4748
4749       if Ekind (Proc) = E_Access_Subprogram_Type then
4750          Proc := Directly_Designated_Type (Proc);
4751       end if;
4752
4753       if not Is_Subprogram (Proc)
4754         and then Ekind (Proc) /= E_Subprogram_Type
4755       then
4756          return Empty;
4757       else
4758          return Proc;
4759       end if;
4760    end Get_Subprogram_Entity;
4761
4762    -----------------------------
4763    -- Get_Task_Body_Procedure --
4764    -----------------------------
4765
4766    function Get_Task_Body_Procedure (E : Entity_Id) return Node_Id is
4767    begin
4768       --  Note: A task type may be the completion of a private type with
4769       --  discriminants. When performing elaboration checks on a task
4770       --  declaration, the current view of the type may be the private one,
4771       --  and the procedure that holds the body of the task is held in its
4772       --  underlying type.
4773
4774       --  This is an odd function, why not have Task_Body_Procedure do
4775       --  the following digging???
4776
4777       return Task_Body_Procedure (Underlying_Type (Root_Type (E)));
4778    end Get_Task_Body_Procedure;
4779
4780    -----------------------
4781    -- Has_Access_Values --
4782    -----------------------
4783
4784    function Has_Access_Values (T : Entity_Id) return Boolean is
4785       Typ : constant Entity_Id := Underlying_Type (T);
4786
4787    begin
4788       --  Case of a private type which is not completed yet. This can only
4789       --  happen in the case of a generic format type appearing directly, or
4790       --  as a component of the type to which this function is being applied
4791       --  at the top level. Return False in this case, since we certainly do
4792       --  not know that the type contains access types.
4793
4794       if No (Typ) then
4795          return False;
4796
4797       elsif Is_Access_Type (Typ) then
4798          return True;
4799
4800       elsif Is_Array_Type (Typ) then
4801          return Has_Access_Values (Component_Type (Typ));
4802
4803       elsif Is_Record_Type (Typ) then
4804          declare
4805             Comp : Entity_Id;
4806
4807          begin
4808             --  Loop to Check components
4809
4810             Comp := First_Component_Or_Discriminant (Typ);
4811             while Present (Comp) loop
4812
4813                --  Check for access component, tag field does not count, even
4814                --  though it is implemented internally using an access type.
4815
4816                if Has_Access_Values (Etype (Comp))
4817                  and then Chars (Comp) /= Name_uTag
4818                then
4819                   return True;
4820                end if;
4821
4822                Next_Component_Or_Discriminant (Comp);
4823             end loop;
4824          end;
4825
4826          return False;
4827
4828       else
4829          return False;
4830       end if;
4831    end Has_Access_Values;
4832
4833    ------------------------------
4834    -- Has_Compatible_Alignment --
4835    ------------------------------
4836
4837    function Has_Compatible_Alignment
4838      (Obj  : Entity_Id;
4839       Expr : Node_Id) return Alignment_Result
4840    is
4841       function Has_Compatible_Alignment_Internal
4842         (Obj     : Entity_Id;
4843          Expr    : Node_Id;
4844          Default : Alignment_Result) return Alignment_Result;
4845       --  This is the internal recursive function that actually does the work.
4846       --  There is one additional parameter, which says what the result should
4847       --  be if no alignment information is found, and there is no definite
4848       --  indication of compatible alignments. At the outer level, this is set
4849       --  to Unknown, but for internal recursive calls in the case where types
4850       --  are known to be correct, it is set to Known_Compatible.
4851
4852       ---------------------------------------
4853       -- Has_Compatible_Alignment_Internal --
4854       ---------------------------------------
4855
4856       function Has_Compatible_Alignment_Internal
4857         (Obj     : Entity_Id;
4858          Expr    : Node_Id;
4859          Default : Alignment_Result) return Alignment_Result
4860       is
4861          Result : Alignment_Result := Known_Compatible;
4862          --  Holds the current status of the result. Note that once a value of
4863          --  Known_Incompatible is set, it is sticky and does not get changed
4864          --  to Unknown (the value in Result only gets worse as we go along,
4865          --  never better).
4866
4867          Offs : Uint := No_Uint;
4868          --  Set to a factor of the offset from the base object when Expr is a
4869          --  selected or indexed component, based on Component_Bit_Offset and
4870          --  Component_Size respectively. A negative value is used to represent
4871          --  a value which is not known at compile time.
4872
4873          procedure Check_Prefix;
4874          --  Checks the prefix recursively in the case where the expression
4875          --  is an indexed or selected component.
4876
4877          procedure Set_Result (R : Alignment_Result);
4878          --  If R represents a worse outcome (unknown instead of known
4879          --  compatible, or known incompatible), then set Result to R.
4880
4881          ------------------
4882          -- Check_Prefix --
4883          ------------------
4884
4885          procedure Check_Prefix is
4886          begin
4887             --  The subtlety here is that in doing a recursive call to check
4888             --  the prefix, we have to decide what to do in the case where we
4889             --  don't find any specific indication of an alignment problem.
4890
4891             --  At the outer level, we normally set Unknown as the result in
4892             --  this case, since we can only set Known_Compatible if we really
4893             --  know that the alignment value is OK, but for the recursive
4894             --  call, in the case where the types match, and we have not
4895             --  specified a peculiar alignment for the object, we are only
4896             --  concerned about suspicious rep clauses, the default case does
4897             --  not affect us, since the compiler will, in the absence of such
4898             --  rep clauses, ensure that the alignment is correct.
4899
4900             if Default = Known_Compatible
4901               or else
4902                 (Etype (Obj) = Etype (Expr)
4903                   and then (Unknown_Alignment (Obj)
4904                              or else
4905                                Alignment (Obj) = Alignment (Etype (Obj))))
4906             then
4907                Set_Result
4908                  (Has_Compatible_Alignment_Internal
4909                     (Obj, Prefix (Expr), Known_Compatible));
4910
4911             --  In all other cases, we need a full check on the prefix
4912
4913             else
4914                Set_Result
4915                  (Has_Compatible_Alignment_Internal
4916                     (Obj, Prefix (Expr), Unknown));
4917             end if;
4918          end Check_Prefix;
4919
4920          ----------------
4921          -- Set_Result --
4922          ----------------
4923
4924          procedure Set_Result (R : Alignment_Result) is
4925          begin
4926             if R > Result then
4927                Result := R;
4928             end if;
4929          end Set_Result;
4930
4931       --  Start of processing for Has_Compatible_Alignment_Internal
4932
4933       begin
4934          --  If Expr is a selected component, we must make sure there is no
4935          --  potentially troublesome component clause, and that the record is
4936          --  not packed.
4937
4938          if Nkind (Expr) = N_Selected_Component then
4939
4940             --  Packed record always generate unknown alignment
4941
4942             if Is_Packed (Etype (Prefix (Expr))) then
4943                Set_Result (Unknown);
4944             end if;
4945
4946             --  Check prefix and component offset
4947
4948             Check_Prefix;
4949             Offs := Component_Bit_Offset (Entity (Selector_Name (Expr)));
4950
4951          --  If Expr is an indexed component, we must make sure there is no
4952          --  potentially troublesome Component_Size clause and that the array
4953          --  is not bit-packed.
4954
4955          elsif Nkind (Expr) = N_Indexed_Component then
4956             declare
4957                Typ : constant Entity_Id := Etype (Prefix (Expr));
4958                Ind : constant Node_Id   := First_Index (Typ);
4959
4960             begin
4961                --  Bit packed array always generates unknown alignment
4962
4963                if Is_Bit_Packed_Array (Typ) then
4964                   Set_Result (Unknown);
4965                end if;
4966
4967                --  Check prefix and component offset
4968
4969                Check_Prefix;
4970                Offs := Component_Size (Typ);
4971
4972                --  Small optimization: compute the full offset when possible
4973
4974                if Offs /= No_Uint
4975                  and then Offs > Uint_0
4976                  and then Present (Ind)
4977                  and then Nkind (Ind) = N_Range
4978                  and then Compile_Time_Known_Value (Low_Bound (Ind))
4979                  and then Compile_Time_Known_Value (First (Expressions (Expr)))
4980                then
4981                   Offs := Offs * (Expr_Value (First (Expressions (Expr)))
4982                                     - Expr_Value (Low_Bound ((Ind))));
4983                end if;
4984             end;
4985          end if;
4986
4987          --  If we have a null offset, the result is entirely determined by
4988          --  the base object and has already been computed recursively.
4989
4990          if Offs = Uint_0 then
4991             null;
4992
4993          --  Case where we know the alignment of the object
4994
4995          elsif Known_Alignment (Obj) then
4996             declare
4997                ObjA : constant Uint := Alignment (Obj);
4998                ExpA : Uint          := No_Uint;
4999                SizA : Uint          := No_Uint;
5000
5001             begin
5002                --  If alignment of Obj is 1, then we are always OK
5003
5004                if ObjA = 1 then
5005                   Set_Result (Known_Compatible);
5006
5007                --  Alignment of Obj is greater than 1, so we need to check
5008
5009                else
5010                   --  If we have an offset, see if it is compatible
5011
5012                   if Offs /= No_Uint and Offs > Uint_0 then
5013                      if Offs mod (System_Storage_Unit * ObjA) /= 0 then
5014                         Set_Result (Known_Incompatible);
5015                      end if;
5016
5017                      --  See if Expr is an object with known alignment
5018
5019                   elsif Is_Entity_Name (Expr)
5020                     and then Known_Alignment (Entity (Expr))
5021                   then
5022                      ExpA := Alignment (Entity (Expr));
5023
5024                      --  Otherwise, we can use the alignment of the type of
5025                      --  Expr given that we already checked for
5026                      --  discombobulating rep clauses for the cases of indexed
5027                      --  and selected components above.
5028
5029                   elsif Known_Alignment (Etype (Expr)) then
5030                      ExpA := Alignment (Etype (Expr));
5031
5032                      --  Otherwise the alignment is unknown
5033
5034                   else
5035                      Set_Result (Default);
5036                   end if;
5037
5038                   --  If we got an alignment, see if it is acceptable
5039
5040                   if ExpA /= No_Uint and then ExpA < ObjA then
5041                      Set_Result (Known_Incompatible);
5042                   end if;
5043
5044                   --  If Expr is not a piece of a larger object, see if size
5045                   --  is given. If so, check that it is not too small for the
5046                   --  required alignment.
5047
5048                   if Offs /= No_Uint then
5049                      null;
5050
5051                      --  See if Expr is an object with known size
5052
5053                   elsif Is_Entity_Name (Expr)
5054                     and then Known_Static_Esize (Entity (Expr))
5055                   then
5056                      SizA := Esize (Entity (Expr));
5057
5058                      --  Otherwise, we check the object size of the Expr type
5059
5060                   elsif Known_Static_Esize (Etype (Expr)) then
5061                      SizA := Esize (Etype (Expr));
5062                   end if;
5063
5064                   --  If we got a size, see if it is a multiple of the Obj
5065                   --  alignment, if not, then the alignment cannot be
5066                   --  acceptable, since the size is always a multiple of the
5067                   --  alignment.
5068
5069                   if SizA /= No_Uint then
5070                      if SizA mod (ObjA * Ttypes.System_Storage_Unit) /= 0 then
5071                         Set_Result (Known_Incompatible);
5072                      end if;
5073                   end if;
5074                end if;
5075             end;
5076
5077          --  If we do not know required alignment, any non-zero offset is a
5078          --  potential problem (but certainly may be OK, so result is unknown).
5079
5080          elsif Offs /= No_Uint then
5081             Set_Result (Unknown);
5082
5083          --  If we can't find the result by direct comparison of alignment
5084          --  values, then there is still one case that we can determine known
5085          --  result, and that is when we can determine that the types are the
5086          --  same, and no alignments are specified. Then we known that the
5087          --  alignments are compatible, even if we don't know the alignment
5088          --  value in the front end.
5089
5090          elsif Etype (Obj) = Etype (Expr) then
5091
5092             --  Types are the same, but we have to check for possible size
5093             --  and alignments on the Expr object that may make the alignment
5094             --  different, even though the types are the same.
5095
5096             if Is_Entity_Name (Expr) then
5097
5098                --  First check alignment of the Expr object. Any alignment less
5099                --  than Maximum_Alignment is worrisome since this is the case
5100                --  where we do not know the alignment of Obj.
5101
5102                if Known_Alignment (Entity (Expr))
5103                  and then
5104                    UI_To_Int (Alignment (Entity (Expr))) <
5105                                                     Ttypes.Maximum_Alignment
5106                then
5107                   Set_Result (Unknown);
5108
5109                   --  Now check size of Expr object. Any size that is not an
5110                   --  even multiple of Maximum_Alignment is also worrisome
5111                   --  since it may cause the alignment of the object to be less
5112                   --  than the alignment of the type.
5113
5114                elsif Known_Static_Esize (Entity (Expr))
5115                  and then
5116                    (UI_To_Int (Esize (Entity (Expr))) mod
5117                      (Ttypes.Maximum_Alignment * Ttypes.System_Storage_Unit))
5118                                                                         /= 0
5119                then
5120                   Set_Result (Unknown);
5121
5122                   --  Otherwise same type is decisive
5123
5124                else
5125                   Set_Result (Known_Compatible);
5126                end if;
5127             end if;
5128
5129          --  Another case to deal with is when there is an explicit size or
5130          --  alignment clause when the types are not the same. If so, then the
5131          --  result is Unknown. We don't need to do this test if the Default is
5132          --  Unknown, since that result will be set in any case.
5133
5134          elsif Default /= Unknown
5135            and then (Has_Size_Clause      (Etype (Expr))
5136                       or else
5137                      Has_Alignment_Clause (Etype (Expr)))
5138          then
5139             Set_Result (Unknown);
5140
5141          --  If no indication found, set default
5142
5143          else
5144             Set_Result (Default);
5145          end if;
5146
5147          --  Return worst result found
5148
5149          return Result;
5150       end Has_Compatible_Alignment_Internal;
5151
5152    --  Start of processing for Has_Compatible_Alignment
5153
5154    begin
5155       --  If Obj has no specified alignment, then set alignment from the type
5156       --  alignment. Perhaps we should always do this, but for sure we should
5157       --  do it when there is an address clause since we can do more if the
5158       --  alignment is known.
5159
5160       if Unknown_Alignment (Obj) then
5161          Set_Alignment (Obj, Alignment (Etype (Obj)));
5162       end if;
5163
5164       --  Now do the internal call that does all the work
5165
5166       return Has_Compatible_Alignment_Internal (Obj, Expr, Unknown);
5167    end Has_Compatible_Alignment;
5168
5169    ----------------------
5170    -- Has_Declarations --
5171    ----------------------
5172
5173    function Has_Declarations (N : Node_Id) return Boolean is
5174    begin
5175       return Nkind_In (Nkind (N), N_Accept_Statement,
5176                                   N_Block_Statement,
5177                                   N_Compilation_Unit_Aux,
5178                                   N_Entry_Body,
5179                                   N_Package_Body,
5180                                   N_Protected_Body,
5181                                   N_Subprogram_Body,
5182                                   N_Task_Body,
5183                                   N_Package_Specification);
5184    end Has_Declarations;
5185
5186    -------------------------------------------
5187    -- Has_Discriminant_Dependent_Constraint --
5188    -------------------------------------------
5189
5190    function Has_Discriminant_Dependent_Constraint
5191      (Comp : Entity_Id) return Boolean
5192    is
5193       Comp_Decl  : constant Node_Id := Parent (Comp);
5194       Subt_Indic : constant Node_Id :=
5195                      Subtype_Indication (Component_Definition (Comp_Decl));
5196       Constr     : Node_Id;
5197       Assn       : Node_Id;
5198
5199    begin
5200       if Nkind (Subt_Indic) = N_Subtype_Indication then
5201          Constr := Constraint (Subt_Indic);
5202
5203          if Nkind (Constr) = N_Index_Or_Discriminant_Constraint then
5204             Assn := First (Constraints (Constr));
5205             while Present (Assn) loop
5206                case Nkind (Assn) is
5207                   when N_Subtype_Indication |
5208                        N_Range              |
5209                        N_Identifier
5210                   =>
5211                      if Depends_On_Discriminant (Assn) then
5212                         return True;
5213                      end if;
5214
5215                   when N_Discriminant_Association =>
5216                      if Depends_On_Discriminant (Expression (Assn)) then
5217                         return True;
5218                      end if;
5219
5220                   when others =>
5221                      null;
5222
5223                end case;
5224
5225                Next (Assn);
5226             end loop;
5227          end if;
5228       end if;
5229
5230       return False;
5231    end Has_Discriminant_Dependent_Constraint;
5232
5233    --------------------
5234    -- Has_Infinities --
5235    --------------------
5236
5237    function Has_Infinities (E : Entity_Id) return Boolean is
5238    begin
5239       return
5240         Is_Floating_Point_Type (E)
5241           and then Nkind (Scalar_Range (E)) = N_Range
5242           and then Includes_Infinities (Scalar_Range (E));
5243    end Has_Infinities;
5244
5245    --------------------
5246    -- Has_Interfaces --
5247    --------------------
5248
5249    function Has_Interfaces
5250      (T             : Entity_Id;
5251       Use_Full_View : Boolean := True) return Boolean
5252    is
5253       Typ : Entity_Id := Base_Type (T);
5254
5255    begin
5256       --  Handle concurrent types
5257
5258       if Is_Concurrent_Type (Typ) then
5259          Typ := Corresponding_Record_Type (Typ);
5260       end if;
5261
5262       if not Present (Typ)
5263         or else not Is_Record_Type (Typ)
5264         or else not Is_Tagged_Type (Typ)
5265       then
5266          return False;
5267       end if;
5268
5269       --  Handle private types
5270
5271       if Use_Full_View
5272         and then Present (Full_View (Typ))
5273       then
5274          Typ := Full_View (Typ);
5275       end if;
5276
5277       --  Handle concurrent record types
5278
5279       if Is_Concurrent_Record_Type (Typ)
5280         and then Is_Non_Empty_List (Abstract_Interface_List (Typ))
5281       then
5282          return True;
5283       end if;
5284
5285       loop
5286          if Is_Interface (Typ)
5287            or else
5288              (Is_Record_Type (Typ)
5289                and then Present (Interfaces (Typ))
5290                and then not Is_Empty_Elmt_List (Interfaces (Typ)))
5291          then
5292             return True;
5293          end if;
5294
5295          exit when Etype (Typ) = Typ
5296
5297             --  Handle private types
5298
5299             or else (Present (Full_View (Etype (Typ)))
5300                        and then Full_View (Etype (Typ)) = Typ)
5301
5302             --  Protect the frontend against wrong source with cyclic
5303             --  derivations
5304
5305             or else Etype (Typ) = T;
5306
5307          --  Climb to the ancestor type handling private types
5308
5309          if Present (Full_View (Etype (Typ))) then
5310             Typ := Full_View (Etype (Typ));
5311          else
5312             Typ := Etype (Typ);
5313          end if;
5314       end loop;
5315
5316       return False;
5317    end Has_Interfaces;
5318
5319    ------------------------
5320    -- Has_Null_Exclusion --
5321    ------------------------
5322
5323    function Has_Null_Exclusion (N : Node_Id) return Boolean is
5324    begin
5325       case Nkind (N) is
5326          when N_Access_Definition               |
5327               N_Access_Function_Definition      |
5328               N_Access_Procedure_Definition     |
5329               N_Access_To_Object_Definition     |
5330               N_Allocator                       |
5331               N_Derived_Type_Definition         |
5332               N_Function_Specification          |
5333               N_Subtype_Declaration             =>
5334             return Null_Exclusion_Present (N);
5335
5336          when N_Component_Definition            |
5337               N_Formal_Object_Declaration       |
5338               N_Object_Renaming_Declaration     =>
5339             if Present (Subtype_Mark (N)) then
5340                return Null_Exclusion_Present (N);
5341             else pragma Assert (Present (Access_Definition (N)));
5342                return Null_Exclusion_Present (Access_Definition (N));
5343             end if;
5344
5345          when N_Discriminant_Specification =>
5346             if Nkind (Discriminant_Type (N)) = N_Access_Definition then
5347                return Null_Exclusion_Present (Discriminant_Type (N));
5348             else
5349                return Null_Exclusion_Present (N);
5350             end if;
5351
5352          when N_Object_Declaration =>
5353             if Nkind (Object_Definition (N)) = N_Access_Definition then
5354                return Null_Exclusion_Present (Object_Definition (N));
5355             else
5356                return Null_Exclusion_Present (N);
5357             end if;
5358
5359          when N_Parameter_Specification =>
5360             if Nkind (Parameter_Type (N)) = N_Access_Definition then
5361                return Null_Exclusion_Present (Parameter_Type (N));
5362             else
5363                return Null_Exclusion_Present (N);
5364             end if;
5365
5366          when others =>
5367             return False;
5368
5369       end case;
5370    end Has_Null_Exclusion;
5371
5372    ------------------------
5373    -- Has_Null_Extension --
5374    ------------------------
5375
5376    function Has_Null_Extension (T : Entity_Id) return Boolean is
5377       B     : constant Entity_Id := Base_Type (T);
5378       Comps : Node_Id;
5379       Ext   : Node_Id;
5380
5381    begin
5382       if Nkind (Parent (B)) = N_Full_Type_Declaration
5383         and then Present (Record_Extension_Part (Type_Definition (Parent (B))))
5384       then
5385          Ext := Record_Extension_Part (Type_Definition (Parent (B)));
5386
5387          if Present (Ext) then
5388             if Null_Present (Ext) then
5389                return True;
5390             else
5391                Comps := Component_List (Ext);
5392
5393                --  The null component list is rewritten during analysis to
5394                --  include the parent component. Any other component indicates
5395                --  that the extension was not originally null.
5396
5397                return Null_Present (Comps)
5398                  or else No (Next (First (Component_Items (Comps))));
5399             end if;
5400          else
5401             return False;
5402          end if;
5403
5404       else
5405          return False;
5406       end if;
5407    end Has_Null_Extension;
5408
5409    -------------------------------
5410    -- Has_Overriding_Initialize --
5411    -------------------------------
5412
5413    function Has_Overriding_Initialize (T : Entity_Id) return Boolean is
5414       BT   : constant Entity_Id := Base_Type (T);
5415       P    : Elmt_Id;
5416
5417    begin
5418       if Is_Controlled (BT) then
5419          if Is_RTU (Scope (BT), Ada_Finalization) then
5420             return False;
5421
5422          elsif Present (Primitive_Operations (BT)) then
5423             P := First_Elmt (Primitive_Operations (BT));
5424             while Present (P) loop
5425                declare
5426                   Init : constant Entity_Id := Node (P);
5427                   Formal : constant Entity_Id := First_Formal (Init);
5428                begin
5429                   if Ekind (Init) = E_Procedure
5430                        and then Chars (Init) = Name_Initialize
5431                        and then Comes_From_Source (Init)
5432                        and then Present (Formal)
5433                        and then Etype (Formal) = BT
5434                        and then No (Next_Formal (Formal))
5435                        and then (Ada_Version < Ada_2012
5436                                    or else not Null_Present (Parent (Init)))
5437                   then
5438                      return True;
5439                   end if;
5440                end;
5441
5442                Next_Elmt (P);
5443             end loop;
5444          end if;
5445
5446          --  Here if type itself does not have a non-null Initialize operation:
5447          --  check immediate ancestor.
5448
5449          if Is_Derived_Type (BT)
5450            and then Has_Overriding_Initialize (Etype (BT))
5451          then
5452             return True;
5453          end if;
5454       end if;
5455
5456       return False;
5457    end Has_Overriding_Initialize;
5458
5459    --------------------------------------
5460    -- Has_Preelaborable_Initialization --
5461    --------------------------------------
5462
5463    function Has_Preelaborable_Initialization (E : Entity_Id) return Boolean is
5464       Has_PE : Boolean;
5465
5466       procedure Check_Components (E : Entity_Id);
5467       --  Check component/discriminant chain, sets Has_PE False if a component
5468       --  or discriminant does not meet the preelaborable initialization rules.
5469
5470       ----------------------
5471       -- Check_Components --
5472       ----------------------
5473
5474       procedure Check_Components (E : Entity_Id) is
5475          Ent : Entity_Id;
5476          Exp : Node_Id;
5477
5478          function Is_Preelaborable_Expression (N : Node_Id) return Boolean;
5479          --  Returns True if and only if the expression denoted by N does not
5480          --  violate restrictions on preelaborable constructs (RM-10.2.1(5-9)).
5481
5482          ---------------------------------
5483          -- Is_Preelaborable_Expression --
5484          ---------------------------------
5485
5486          function Is_Preelaborable_Expression (N : Node_Id) return Boolean is
5487             Exp           : Node_Id;
5488             Assn          : Node_Id;
5489             Choice        : Node_Id;
5490             Comp_Type     : Entity_Id;
5491             Is_Array_Aggr : Boolean;
5492
5493          begin
5494             if Is_Static_Expression (N) then
5495                return True;
5496
5497             elsif Nkind (N) = N_Null then
5498                return True;
5499
5500             --  Attributes are allowed in general, even if their prefix is a
5501             --  formal type. (It seems that certain attributes known not to be
5502             --  static might not be allowed, but there are no rules to prevent
5503             --  them.)
5504
5505             elsif Nkind (N) = N_Attribute_Reference then
5506                return True;
5507
5508             --  The name of a discriminant evaluated within its parent type is
5509             --  defined to be preelaborable (10.2.1(8)). Note that we test for
5510             --  names that denote discriminals as well as discriminants to
5511             --  catch references occurring within init procs.
5512
5513             elsif Is_Entity_Name (N)
5514               and then
5515                 (Ekind (Entity (N)) = E_Discriminant
5516                   or else
5517                     ((Ekind (Entity (N)) = E_Constant
5518                        or else Ekind (Entity (N)) = E_In_Parameter)
5519                      and then Present (Discriminal_Link (Entity (N)))))
5520             then
5521                return True;
5522
5523             elsif Nkind (N) = N_Qualified_Expression then
5524                return Is_Preelaborable_Expression (Expression (N));
5525
5526             --  For aggregates we have to check that each of the associations
5527             --  is preelaborable.
5528
5529             elsif Nkind (N) = N_Aggregate
5530               or else Nkind (N) = N_Extension_Aggregate
5531             then
5532                Is_Array_Aggr := Is_Array_Type (Etype (N));
5533
5534                if Is_Array_Aggr then
5535                   Comp_Type := Component_Type (Etype (N));
5536                end if;
5537
5538                --  Check the ancestor part of extension aggregates, which must
5539                --  be either the name of a type that has preelaborable init or
5540                --  an expression that is preelaborable.
5541
5542                if Nkind (N) = N_Extension_Aggregate then
5543                   declare
5544                      Anc_Part : constant Node_Id := Ancestor_Part (N);
5545
5546                   begin
5547                      if Is_Entity_Name (Anc_Part)
5548                        and then Is_Type (Entity (Anc_Part))
5549                      then
5550                         if not Has_Preelaborable_Initialization
5551                                  (Entity (Anc_Part))
5552                         then
5553                            return False;
5554                         end if;
5555
5556                      elsif not Is_Preelaborable_Expression (Anc_Part) then
5557                         return False;
5558                      end if;
5559                   end;
5560                end if;
5561
5562                --  Check positional associations
5563
5564                Exp := First (Expressions (N));
5565                while Present (Exp) loop
5566                   if not Is_Preelaborable_Expression (Exp) then
5567                      return False;
5568                   end if;
5569
5570                   Next (Exp);
5571                end loop;
5572
5573                --  Check named associations
5574
5575                Assn := First (Component_Associations (N));
5576                while Present (Assn) loop
5577                   Choice := First (Choices (Assn));
5578                   while Present (Choice) loop
5579                      if Is_Array_Aggr then
5580                         if Nkind (Choice) = N_Others_Choice then
5581                            null;
5582
5583                         elsif Nkind (Choice) = N_Range then
5584                            if not Is_Static_Range (Choice) then
5585                               return False;
5586                            end if;
5587
5588                         elsif not Is_Static_Expression (Choice) then
5589                            return False;
5590                         end if;
5591
5592                      else
5593                         Comp_Type := Etype (Choice);
5594                      end if;
5595
5596                      Next (Choice);
5597                   end loop;
5598
5599                   --  If the association has a <> at this point, then we have
5600                   --  to check whether the component's type has preelaborable
5601                   --  initialization. Note that this only occurs when the
5602                   --  association's corresponding component does not have a
5603                   --  default expression, the latter case having already been
5604                   --  expanded as an expression for the association.
5605
5606                   if Box_Present (Assn) then
5607                      if not Has_Preelaborable_Initialization (Comp_Type) then
5608                         return False;
5609                      end if;
5610
5611                   --  In the expression case we check whether the expression
5612                   --  is preelaborable.
5613
5614                   elsif
5615                     not Is_Preelaborable_Expression (Expression (Assn))
5616                   then
5617                      return False;
5618                   end if;
5619
5620                   Next (Assn);
5621                end loop;
5622
5623                --  If we get here then aggregate as a whole is preelaborable
5624
5625                return True;
5626
5627             --  All other cases are not preelaborable
5628
5629             else
5630                return False;
5631             end if;
5632          end Is_Preelaborable_Expression;
5633
5634       --  Start of processing for Check_Components
5635
5636       begin
5637          --  Loop through entities of record or protected type
5638
5639          Ent := E;
5640          while Present (Ent) loop
5641
5642             --  We are interested only in components and discriminants
5643
5644             Exp := Empty;
5645
5646             case Ekind (Ent) is
5647                when E_Component =>
5648
5649                   --  Get default expression if any. If there is no declaration
5650                   --  node, it means we have an internal entity. The parent and
5651                   --  tag fields are examples of such entities. For such cases,
5652                   --  we just test the type of the entity.
5653
5654                   if Present (Declaration_Node (Ent)) then
5655                      Exp := Expression (Declaration_Node (Ent));
5656                   end if;
5657
5658                when E_Discriminant =>
5659
5660                   --  Note: for a renamed discriminant, the Declaration_Node
5661                   --  may point to the one from the ancestor, and have a
5662                   --  different expression, so use the proper attribute to
5663                   --  retrieve the expression from the derived constraint.
5664
5665                   Exp := Discriminant_Default_Value (Ent);
5666
5667                when others =>
5668                   goto Check_Next_Entity;
5669             end case;
5670
5671             --  A component has PI if it has no default expression and the
5672             --  component type has PI.
5673
5674             if No (Exp) then
5675                if not Has_Preelaborable_Initialization (Etype (Ent)) then
5676                   Has_PE := False;
5677                   exit;
5678                end if;
5679
5680             --  Require the default expression to be preelaborable
5681
5682             elsif not Is_Preelaborable_Expression (Exp) then
5683                Has_PE := False;
5684                exit;
5685             end if;
5686
5687          <<Check_Next_Entity>>
5688             Next_Entity (Ent);
5689          end loop;
5690       end Check_Components;
5691
5692    --  Start of processing for Has_Preelaborable_Initialization
5693
5694    begin
5695       --  Immediate return if already marked as known preelaborable init. This
5696       --  covers types for which this function has already been called once
5697       --  and returned True (in which case the result is cached), and also
5698       --  types to which a pragma Preelaborable_Initialization applies.
5699
5700       if Known_To_Have_Preelab_Init (E) then
5701          return True;
5702       end if;
5703
5704       --  If the type is a subtype representing a generic actual type, then
5705       --  test whether its base type has preelaborable initialization since
5706       --  the subtype representing the actual does not inherit this attribute
5707       --  from the actual or formal. (but maybe it should???)
5708
5709       if Is_Generic_Actual_Type (E) then
5710          return Has_Preelaborable_Initialization (Base_Type (E));
5711       end if;
5712
5713       --  All elementary types have preelaborable initialization
5714
5715       if Is_Elementary_Type (E) then
5716          Has_PE := True;
5717
5718       --  Array types have PI if the component type has PI
5719
5720       elsif Is_Array_Type (E) then
5721          Has_PE := Has_Preelaborable_Initialization (Component_Type (E));
5722
5723       --  A derived type has preelaborable initialization if its parent type
5724       --  has preelaborable initialization and (in the case of a derived record
5725       --  extension) if the non-inherited components all have preelaborable
5726       --  initialization. However, a user-defined controlled type with an
5727       --  overriding Initialize procedure does not have preelaborable
5728       --  initialization.
5729
5730       elsif Is_Derived_Type (E) then
5731
5732          --  If the derived type is a private extension then it doesn't have
5733          --  preelaborable initialization.
5734
5735          if Ekind (Base_Type (E)) = E_Record_Type_With_Private then
5736             return False;
5737          end if;
5738
5739          --  First check whether ancestor type has preelaborable initialization
5740
5741          Has_PE := Has_Preelaborable_Initialization (Etype (Base_Type (E)));
5742
5743          --  If OK, check extension components (if any)
5744
5745          if Has_PE and then Is_Record_Type (E) then
5746             Check_Components (First_Entity (E));
5747          end if;
5748
5749          --  Check specifically for 10.2.1(11.4/2) exception: a controlled type
5750          --  with a user defined Initialize procedure does not have PI.
5751
5752          if Has_PE
5753            and then Is_Controlled (E)
5754            and then Has_Overriding_Initialize (E)
5755          then
5756             Has_PE := False;
5757          end if;
5758
5759       --  Private types not derived from a type having preelaborable init and
5760       --  that are not marked with pragma Preelaborable_Initialization do not
5761       --  have preelaborable initialization.
5762
5763       elsif Is_Private_Type (E) then
5764          return False;
5765
5766       --  Record type has PI if it is non private and all components have PI
5767
5768       elsif Is_Record_Type (E) then
5769          Has_PE := True;
5770          Check_Components (First_Entity (E));
5771
5772       --  Protected types must not have entries, and components must meet
5773       --  same set of rules as for record components.
5774
5775       elsif Is_Protected_Type (E) then
5776          if Has_Entries (E) then
5777             Has_PE := False;
5778          else
5779             Has_PE := True;
5780             Check_Components (First_Entity (E));
5781             Check_Components (First_Private_Entity (E));
5782          end if;
5783
5784       --  Type System.Address always has preelaborable initialization
5785
5786       elsif Is_RTE (E, RE_Address) then
5787          Has_PE := True;
5788
5789       --  In all other cases, type does not have preelaborable initialization
5790
5791       else
5792          return False;
5793       end if;
5794
5795       --  If type has preelaborable initialization, cache result
5796
5797       if Has_PE then
5798          Set_Known_To_Have_Preelab_Init (E);
5799       end if;
5800
5801       return Has_PE;
5802    end Has_Preelaborable_Initialization;
5803
5804    ---------------------------
5805    -- Has_Private_Component --
5806    ---------------------------
5807
5808    function Has_Private_Component (Type_Id : Entity_Id) return Boolean is
5809       Btype     : Entity_Id := Base_Type (Type_Id);
5810       Component : Entity_Id;
5811
5812    begin
5813       if Error_Posted (Type_Id)
5814         or else Error_Posted (Btype)
5815       then
5816          return False;
5817       end if;
5818
5819       if Is_Class_Wide_Type (Btype) then
5820          Btype := Root_Type (Btype);
5821       end if;
5822
5823       if Is_Private_Type (Btype) then
5824          declare
5825             UT : constant Entity_Id := Underlying_Type (Btype);
5826          begin
5827             if No (UT) then
5828                if No (Full_View (Btype)) then
5829                   return not Is_Generic_Type (Btype)
5830                     and then not Is_Generic_Type (Root_Type (Btype));
5831                else
5832                   return not Is_Generic_Type (Root_Type (Full_View (Btype)));
5833                end if;
5834             else
5835                return not Is_Frozen (UT) and then Has_Private_Component (UT);
5836             end if;
5837          end;
5838
5839       elsif Is_Array_Type (Btype) then
5840          return Has_Private_Component (Component_Type (Btype));
5841
5842       elsif Is_Record_Type (Btype) then
5843          Component := First_Component (Btype);
5844          while Present (Component) loop
5845             if Has_Private_Component (Etype (Component)) then
5846                return True;
5847             end if;
5848
5849             Next_Component (Component);
5850          end loop;
5851
5852          return False;
5853
5854       elsif Is_Protected_Type (Btype)
5855         and then Present (Corresponding_Record_Type (Btype))
5856       then
5857          return Has_Private_Component (Corresponding_Record_Type (Btype));
5858
5859       else
5860          return False;
5861       end if;
5862    end Has_Private_Component;
5863
5864    -----------------------------
5865    -- Has_Static_Array_Bounds --
5866    -----------------------------
5867
5868    function Has_Static_Array_Bounds (Typ : Node_Id) return Boolean is
5869       Ndims : constant Nat := Number_Dimensions (Typ);
5870
5871       Index : Node_Id;
5872       Low   : Node_Id;
5873       High  : Node_Id;
5874
5875    begin
5876       --  Unconstrained types do not have static bounds
5877
5878       if not Is_Constrained (Typ) then
5879          return False;
5880       end if;
5881
5882       --  First treat string literals specially, as the lower bound and length
5883       --  of string literals are not stored like those of arrays.
5884
5885       --  A string literal always has static bounds
5886
5887       if Ekind (Typ) = E_String_Literal_Subtype then
5888          return True;
5889       end if;
5890
5891       --  Treat all dimensions in turn
5892
5893       Index := First_Index (Typ);
5894       for Indx in 1 .. Ndims loop
5895
5896          --  In case of an erroneous index which is not a discrete type, return
5897          --  that the type is not static.
5898
5899          if not Is_Discrete_Type (Etype (Index))
5900            or else Etype (Index) = Any_Type
5901          then
5902             return False;
5903          end if;
5904
5905          Get_Index_Bounds (Index, Low, High);
5906
5907          if Error_Posted (Low) or else Error_Posted (High) then
5908             return False;
5909          end if;
5910
5911          if Is_OK_Static_Expression (Low)
5912               and then
5913             Is_OK_Static_Expression (High)
5914          then
5915             null;
5916          else
5917             return False;
5918          end if;
5919
5920          Next (Index);
5921       end loop;
5922
5923       --  If we fall through the loop, all indexes matched
5924
5925       return True;
5926    end Has_Static_Array_Bounds;
5927
5928    ----------------
5929    -- Has_Stream --
5930    ----------------
5931
5932    function Has_Stream (T : Entity_Id) return Boolean is
5933       E : Entity_Id;
5934
5935    begin
5936       if No (T) then
5937          return False;
5938
5939       elsif Is_RTE (Root_Type (T), RE_Root_Stream_Type) then
5940          return True;
5941
5942       elsif Is_Array_Type (T) then
5943          return Has_Stream (Component_Type (T));
5944
5945       elsif Is_Record_Type (T) then
5946          E := First_Component (T);
5947          while Present (E) loop
5948             if Has_Stream (Etype (E)) then
5949                return True;
5950             else
5951                Next_Component (E);
5952             end if;
5953          end loop;
5954
5955          return False;
5956
5957       elsif Is_Private_Type (T) then
5958          return Has_Stream (Underlying_Type (T));
5959
5960       else
5961          return False;
5962       end if;
5963    end Has_Stream;
5964
5965    ----------------
5966    -- Has_Suffix --
5967    ----------------
5968
5969    function Has_Suffix (E : Entity_Id; Suffix : Character) return Boolean is
5970    begin
5971       Get_Name_String (Chars (E));
5972       return Name_Buffer (Name_Len) = Suffix;
5973    end Has_Suffix;
5974
5975    ----------------
5976    -- Add_Suffix --
5977    ----------------
5978
5979    function Add_Suffix (E : Entity_Id; Suffix : Character) return Name_Id is
5980    begin
5981       Get_Name_String (Chars (E));
5982       Add_Char_To_Name_Buffer (Suffix);
5983       return Name_Find;
5984    end Add_Suffix;
5985
5986    -------------------
5987    -- Remove_Suffix --
5988    -------------------
5989
5990    function Remove_Suffix (E : Entity_Id; Suffix : Character) return Name_Id is
5991    begin
5992       pragma Assert (Has_Suffix (E, Suffix));
5993       Get_Name_String (Chars (E));
5994       Name_Len := Name_Len - 1;
5995       return Name_Find;
5996    end Remove_Suffix;
5997
5998    --------------------------
5999    -- Has_Tagged_Component --
6000    --------------------------
6001
6002    function Has_Tagged_Component (Typ : Entity_Id) return Boolean is
6003       Comp : Entity_Id;
6004
6005    begin
6006       if Is_Private_Type (Typ)
6007         and then Present (Underlying_Type (Typ))
6008       then
6009          return Has_Tagged_Component (Underlying_Type (Typ));
6010
6011       elsif Is_Array_Type (Typ) then
6012          return Has_Tagged_Component (Component_Type (Typ));
6013
6014       elsif Is_Tagged_Type (Typ) then
6015          return True;
6016
6017       elsif Is_Record_Type (Typ) then
6018          Comp := First_Component (Typ);
6019          while Present (Comp) loop
6020             if Has_Tagged_Component (Etype (Comp)) then
6021                return True;
6022             end if;
6023
6024             Next_Component (Comp);
6025          end loop;
6026
6027          return False;
6028
6029       else
6030          return False;
6031       end if;
6032    end Has_Tagged_Component;
6033
6034    -------------------------
6035    -- Implementation_Kind --
6036    -------------------------
6037
6038    function Implementation_Kind (Subp : Entity_Id) return Name_Id is
6039       Impl_Prag : constant Node_Id := Get_Rep_Pragma (Subp, Name_Implemented);
6040    begin
6041       pragma Assert (Present (Impl_Prag));
6042       return
6043         Chars (Expression (Last (Pragma_Argument_Associations (Impl_Prag))));
6044    end Implementation_Kind;
6045
6046    --------------------------
6047    -- Implements_Interface --
6048    --------------------------
6049
6050    function Implements_Interface
6051      (Typ_Ent         : Entity_Id;
6052       Iface_Ent       : Entity_Id;
6053       Exclude_Parents : Boolean := False) return Boolean
6054    is
6055       Ifaces_List : Elist_Id;
6056       Elmt        : Elmt_Id;
6057       Iface       : Entity_Id := Base_Type (Iface_Ent);
6058       Typ         : Entity_Id := Base_Type (Typ_Ent);
6059
6060    begin
6061       if Is_Class_Wide_Type (Typ) then
6062          Typ := Root_Type (Typ);
6063       end if;
6064
6065       if not Has_Interfaces (Typ) then
6066          return False;
6067       end if;
6068
6069       if Is_Class_Wide_Type (Iface) then
6070          Iface := Root_Type (Iface);
6071       end if;
6072
6073       Collect_Interfaces (Typ, Ifaces_List);
6074
6075       Elmt := First_Elmt (Ifaces_List);
6076       while Present (Elmt) loop
6077          if Is_Ancestor (Node (Elmt), Typ, Use_Full_View => True)
6078            and then Exclude_Parents
6079          then
6080             null;
6081
6082          elsif Node (Elmt) = Iface then
6083             return True;
6084          end if;
6085
6086          Next_Elmt (Elmt);
6087       end loop;
6088
6089       return False;
6090    end Implements_Interface;
6091
6092    -----------------
6093    -- In_Instance --
6094    -----------------
6095
6096    function In_Instance return Boolean is
6097       Curr_Unit : constant Entity_Id := Cunit_Entity (Current_Sem_Unit);
6098       S         : Entity_Id;
6099
6100    begin
6101       S := Current_Scope;
6102       while Present (S)
6103         and then S /= Standard_Standard
6104       loop
6105          if (Ekind (S) = E_Function
6106               or else Ekind (S) = E_Package
6107               or else Ekind (S) = E_Procedure)
6108            and then Is_Generic_Instance (S)
6109          then
6110             --  A child instance is always compiled in the context of a parent
6111             --  instance. Nevertheless, the actuals are not analyzed in an
6112             --  instance context. We detect this case by examining the current
6113             --  compilation unit, which must be a child instance, and checking
6114             --  that it is not currently on the scope stack.
6115
6116             if Is_Child_Unit (Curr_Unit)
6117               and then
6118                 Nkind (Unit (Cunit (Current_Sem_Unit)))
6119                   = N_Package_Instantiation
6120               and then not In_Open_Scopes (Curr_Unit)
6121             then
6122                return False;
6123             else
6124                return True;
6125             end if;
6126          end if;
6127
6128          S := Scope (S);
6129       end loop;
6130
6131       return False;
6132    end In_Instance;
6133
6134    ----------------------
6135    -- In_Instance_Body --
6136    ----------------------
6137
6138    function In_Instance_Body return Boolean is
6139       S : Entity_Id;
6140
6141    begin
6142       S := Current_Scope;
6143       while Present (S)
6144         and then S /= Standard_Standard
6145       loop
6146          if (Ekind (S) = E_Function
6147               or else Ekind (S) = E_Procedure)
6148            and then Is_Generic_Instance (S)
6149          then
6150             return True;
6151
6152          elsif Ekind (S) = E_Package
6153            and then In_Package_Body (S)
6154            and then Is_Generic_Instance (S)
6155          then
6156             return True;
6157          end if;
6158
6159          S := Scope (S);
6160       end loop;
6161
6162       return False;
6163    end In_Instance_Body;
6164
6165    -----------------------------
6166    -- In_Instance_Not_Visible --
6167    -----------------------------
6168
6169    function In_Instance_Not_Visible return Boolean is
6170       S : Entity_Id;
6171
6172    begin
6173       S := Current_Scope;
6174       while Present (S)
6175         and then S /= Standard_Standard
6176       loop
6177          if (Ekind (S) = E_Function
6178               or else Ekind (S) = E_Procedure)
6179            and then Is_Generic_Instance (S)
6180          then
6181             return True;
6182
6183          elsif Ekind (S) = E_Package
6184            and then (In_Package_Body (S) or else In_Private_Part (S))
6185            and then Is_Generic_Instance (S)
6186          then
6187             return True;
6188          end if;
6189
6190          S := Scope (S);
6191       end loop;
6192
6193       return False;
6194    end In_Instance_Not_Visible;
6195
6196    ------------------------------
6197    -- In_Instance_Visible_Part --
6198    ------------------------------
6199
6200    function In_Instance_Visible_Part return Boolean is
6201       S : Entity_Id;
6202
6203    begin
6204       S := Current_Scope;
6205       while Present (S)
6206         and then S /= Standard_Standard
6207       loop
6208          if Ekind (S) = E_Package
6209            and then Is_Generic_Instance (S)
6210            and then not In_Package_Body (S)
6211            and then not In_Private_Part (S)
6212          then
6213             return True;
6214          end if;
6215
6216          S := Scope (S);
6217       end loop;
6218
6219       return False;
6220    end In_Instance_Visible_Part;
6221
6222    ---------------------
6223    -- In_Package_Body --
6224    ---------------------
6225
6226    function In_Package_Body return Boolean is
6227       S : Entity_Id;
6228
6229    begin
6230       S := Current_Scope;
6231       while Present (S)
6232         and then S /= Standard_Standard
6233       loop
6234          if Ekind (S) = E_Package
6235            and then In_Package_Body (S)
6236          then
6237             return True;
6238          else
6239             S := Scope (S);
6240          end if;
6241       end loop;
6242
6243       return False;
6244    end In_Package_Body;
6245
6246    --------------------------------
6247    -- In_Parameter_Specification --
6248    --------------------------------
6249
6250    function In_Parameter_Specification (N : Node_Id) return Boolean is
6251       PN : Node_Id;
6252
6253    begin
6254       PN := Parent (N);
6255       while Present (PN) loop
6256          if Nkind (PN) = N_Parameter_Specification then
6257             return True;
6258          end if;
6259
6260          PN := Parent (PN);
6261       end loop;
6262
6263       return False;
6264    end In_Parameter_Specification;
6265
6266    --------------------------------------
6267    -- In_Subprogram_Or_Concurrent_Unit --
6268    --------------------------------------
6269
6270    function In_Subprogram_Or_Concurrent_Unit return Boolean is
6271       E : Entity_Id;
6272       K : Entity_Kind;
6273
6274    begin
6275       --  Use scope chain to check successively outer scopes
6276
6277       E := Current_Scope;
6278       loop
6279          K := Ekind (E);
6280
6281          if K in Subprogram_Kind
6282            or else K in Concurrent_Kind
6283            or else K in Generic_Subprogram_Kind
6284          then
6285             return True;
6286
6287          elsif E = Standard_Standard then
6288             return False;
6289          end if;
6290
6291          E := Scope (E);
6292       end loop;
6293    end In_Subprogram_Or_Concurrent_Unit;
6294
6295    ---------------------
6296    -- In_Visible_Part --
6297    ---------------------
6298
6299    function In_Visible_Part (Scope_Id : Entity_Id) return Boolean is
6300    begin
6301       return
6302         Is_Package_Or_Generic_Package (Scope_Id)
6303           and then In_Open_Scopes (Scope_Id)
6304           and then not In_Package_Body (Scope_Id)
6305           and then not In_Private_Part (Scope_Id);
6306    end In_Visible_Part;
6307
6308    --------------------------------
6309    -- Incomplete_Or_Private_View --
6310    --------------------------------
6311
6312    function Incomplete_Or_Private_View (Typ : Entity_Id) return Entity_Id is
6313       function Inspect_Decls
6314         (Decls : List_Id;
6315          Taft  : Boolean := False) return Entity_Id;
6316       --  Check whether a declarative region contains the incomplete or private
6317       --  view of Typ.
6318
6319       -------------------
6320       -- Inspect_Decls --
6321       -------------------
6322
6323       function Inspect_Decls
6324         (Decls : List_Id;
6325          Taft  : Boolean := False) return Entity_Id
6326       is
6327          Decl  : Node_Id;
6328          Match : Node_Id;
6329
6330       begin
6331          Decl := First (Decls);
6332          while Present (Decl) loop
6333             Match := Empty;
6334
6335             if Taft then
6336                if Nkind (Decl) = N_Incomplete_Type_Declaration then
6337                   Match := Defining_Identifier (Decl);
6338                end if;
6339
6340             else
6341                if Nkind_In (Decl, N_Private_Extension_Declaration,
6342                                   N_Private_Type_Declaration)
6343                then
6344                   Match := Defining_Identifier (Decl);
6345                end if;
6346             end if;
6347
6348             if Present (Match)
6349               and then Present (Full_View (Match))
6350               and then Full_View (Match) = Typ
6351             then
6352                return Match;
6353             end if;
6354
6355             Next (Decl);
6356          end loop;
6357
6358          return Empty;
6359       end Inspect_Decls;
6360
6361       --  Local variables
6362
6363       Prev : Entity_Id;
6364
6365    --  Start of processing for Incomplete_Or_Partial_View
6366
6367    begin
6368       --  Incomplete type case
6369
6370       Prev := Current_Entity_In_Scope (Typ);
6371
6372       if Present (Prev)
6373         and then Is_Incomplete_Type (Prev)
6374         and then Present (Full_View (Prev))
6375         and then Full_View (Prev) = Typ
6376       then
6377          return Prev;
6378       end if;
6379
6380       --  Private or Taft amendment type case
6381
6382       declare
6383          Pkg      : constant Entity_Id := Scope (Typ);
6384          Pkg_Decl : Node_Id := Pkg;
6385
6386       begin
6387          if Ekind (Pkg) = E_Package then
6388             while Nkind (Pkg_Decl) /= N_Package_Specification loop
6389                Pkg_Decl := Parent (Pkg_Decl);
6390             end loop;
6391
6392             --  It is knows that Typ has a private view, look for it in the
6393             --  visible declarations of the enclosing scope. A special case
6394             --  of this is when the two views have been exchanged - the full
6395             --  appears earlier than the private.
6396
6397             if Has_Private_Declaration (Typ) then
6398                Prev := Inspect_Decls (Visible_Declarations (Pkg_Decl));
6399
6400                --  Exchanged view case, look in the private declarations
6401
6402                if No (Prev) then
6403                   Prev := Inspect_Decls (Private_Declarations (Pkg_Decl));
6404                end if;
6405
6406                return Prev;
6407
6408             --  Otherwise if this is the package body, then Typ is a potential
6409             --  Taft amendment type. The incomplete view should be located in
6410             --  the private declarations of the enclosing scope.
6411
6412             elsif In_Package_Body (Pkg) then
6413                return Inspect_Decls (Private_Declarations (Pkg_Decl), True);
6414             end if;
6415          end if;
6416       end;
6417
6418       --  The type has no incomplete or private view
6419
6420       return Empty;
6421    end Incomplete_Or_Private_View;
6422
6423    ---------------------------------
6424    -- Insert_Explicit_Dereference --
6425    ---------------------------------
6426
6427    procedure Insert_Explicit_Dereference (N : Node_Id) is
6428       New_Prefix : constant Node_Id := Relocate_Node (N);
6429       Ent        : Entity_Id := Empty;
6430       Pref       : Node_Id;
6431       I          : Interp_Index;
6432       It         : Interp;
6433       T          : Entity_Id;
6434
6435    begin
6436       Save_Interps (N, New_Prefix);
6437
6438       Rewrite (N,
6439         Make_Explicit_Dereference (Sloc (Parent (N)),
6440           Prefix => New_Prefix));
6441
6442       Set_Etype (N, Designated_Type (Etype (New_Prefix)));
6443
6444       if Is_Overloaded (New_Prefix) then
6445
6446          --  The dereference is also overloaded, and its interpretations are
6447          --  the designated types of the interpretations of the original node.
6448
6449          Set_Etype (N, Any_Type);
6450
6451          Get_First_Interp (New_Prefix, I, It);
6452          while Present (It.Nam) loop
6453             T := It.Typ;
6454
6455             if Is_Access_Type (T) then
6456                Add_One_Interp (N, Designated_Type (T), Designated_Type (T));
6457             end if;
6458
6459             Get_Next_Interp (I, It);
6460          end loop;
6461
6462          End_Interp_List;
6463
6464       else
6465          --  Prefix is unambiguous: mark the original prefix (which might
6466          --  Come_From_Source) as a reference, since the new (relocated) one
6467          --  won't be taken into account.
6468
6469          if Is_Entity_Name (New_Prefix) then
6470             Ent := Entity (New_Prefix);
6471             Pref := New_Prefix;
6472
6473          --  For a retrieval of a subcomponent of some composite object,
6474          --  retrieve the ultimate entity if there is one.
6475
6476          elsif Nkind (New_Prefix) = N_Selected_Component
6477            or else Nkind (New_Prefix) = N_Indexed_Component
6478          then
6479             Pref := Prefix (New_Prefix);
6480             while Present (Pref)
6481               and then
6482                 (Nkind (Pref) = N_Selected_Component
6483                   or else Nkind (Pref) = N_Indexed_Component)
6484             loop
6485                Pref := Prefix (Pref);
6486             end loop;
6487
6488             if Present (Pref) and then Is_Entity_Name (Pref) then
6489                Ent := Entity (Pref);
6490             end if;
6491          end if;
6492
6493          --  Place the reference on the entity node
6494
6495          if Present (Ent) then
6496             Generate_Reference (Ent, Pref);
6497          end if;
6498       end if;
6499    end Insert_Explicit_Dereference;
6500
6501    ------------------------------------------
6502    -- Inspect_Deferred_Constant_Completion --
6503    ------------------------------------------
6504
6505    procedure Inspect_Deferred_Constant_Completion (Decls : List_Id) is
6506       Decl   : Node_Id;
6507
6508    begin
6509       Decl := First (Decls);
6510       while Present (Decl) loop
6511
6512          --  Deferred constant signature
6513
6514          if Nkind (Decl) = N_Object_Declaration
6515            and then Constant_Present (Decl)
6516            and then No (Expression (Decl))
6517
6518             --  No need to check internally generated constants
6519
6520            and then Comes_From_Source (Decl)
6521
6522             --  The constant is not completed. A full object declaration or a
6523             --  pragma Import complete a deferred constant.
6524
6525            and then not Has_Completion (Defining_Identifier (Decl))
6526          then
6527             Error_Msg_N
6528               ("constant declaration requires initialization expression",
6529               Defining_Identifier (Decl));
6530          end if;
6531
6532          Decl := Next (Decl);
6533       end loop;
6534    end Inspect_Deferred_Constant_Completion;
6535
6536    -----------------------------
6537    -- Is_Actual_Out_Parameter --
6538    -----------------------------
6539
6540    function Is_Actual_Out_Parameter (N : Node_Id) return Boolean is
6541       Formal : Entity_Id;
6542       Call   : Node_Id;
6543    begin
6544       Find_Actual (N, Formal, Call);
6545       return Present (Formal) and then Ekind (Formal) = E_Out_Parameter;
6546    end Is_Actual_Out_Parameter;
6547
6548    -------------------------
6549    -- Is_Actual_Parameter --
6550    -------------------------
6551
6552    function Is_Actual_Parameter (N : Node_Id) return Boolean is
6553       PK : constant Node_Kind := Nkind (Parent (N));
6554
6555    begin
6556       case PK is
6557          when N_Parameter_Association =>
6558             return N = Explicit_Actual_Parameter (Parent (N));
6559
6560          when N_Function_Call | N_Procedure_Call_Statement =>
6561             return Is_List_Member (N)
6562               and then
6563                 List_Containing (N) = Parameter_Associations (Parent (N));
6564
6565          when others =>
6566             return False;
6567       end case;
6568    end Is_Actual_Parameter;
6569
6570    --------------------------------
6571    -- Is_Actual_Tagged_Parameter --
6572    --------------------------------
6573
6574    function Is_Actual_Tagged_Parameter (N : Node_Id) return Boolean is
6575       Formal : Entity_Id;
6576       Call   : Node_Id;
6577    begin
6578       Find_Actual (N, Formal, Call);
6579       return Present (Formal) and then Is_Tagged_Type (Etype (Formal));
6580    end Is_Actual_Tagged_Parameter;
6581
6582    ---------------------
6583    -- Is_Aliased_View --
6584    ---------------------
6585
6586    function Is_Aliased_View (Obj : Node_Id) return Boolean is
6587       E : Entity_Id;
6588
6589    begin
6590       if Is_Entity_Name (Obj) then
6591          E := Entity (Obj);
6592
6593          return
6594            (Is_Object (E)
6595              and then
6596                (Is_Aliased (E)
6597                  or else (Present (Renamed_Object (E))
6598                            and then Is_Aliased_View (Renamed_Object (E)))))
6599
6600            or else ((Is_Formal (E)
6601                       or else Ekind (E) = E_Generic_In_Out_Parameter
6602                       or else Ekind (E) = E_Generic_In_Parameter)
6603                     and then Is_Tagged_Type (Etype (E)))
6604
6605            or else (Is_Concurrent_Type (E) and then In_Open_Scopes (E))
6606
6607            --  Current instance of type, either directly or as rewritten
6608            --  reference to the current object.
6609
6610            or else (Is_Entity_Name (Original_Node (Obj))
6611                      and then Present (Entity (Original_Node (Obj)))
6612                      and then Is_Type (Entity (Original_Node (Obj))))
6613
6614            or else (Is_Type (E) and then E = Current_Scope)
6615
6616            or else (Is_Incomplete_Or_Private_Type (E)
6617                      and then Full_View (E) = Current_Scope)
6618
6619            --  Ada 2012 AI05-0053: the return object of an extended return
6620            --  statement is aliased if its type is immutably limited.
6621
6622            or else (Is_Return_Object (E)
6623                      and then Is_Immutably_Limited_Type (Etype (E)));
6624
6625       elsif Nkind (Obj) = N_Selected_Component then
6626          return Is_Aliased (Entity (Selector_Name (Obj)));
6627
6628       elsif Nkind (Obj) = N_Indexed_Component then
6629          return Has_Aliased_Components (Etype (Prefix (Obj)))
6630            or else
6631              (Is_Access_Type (Etype (Prefix (Obj)))
6632                and then Has_Aliased_Components
6633                           (Designated_Type (Etype (Prefix (Obj)))));
6634
6635       elsif Nkind_In (Obj, N_Unchecked_Type_Conversion, N_Type_Conversion) then
6636          return Is_Tagged_Type (Etype (Obj))
6637            and then Is_Aliased_View (Expression (Obj));
6638
6639       elsif Nkind (Obj) = N_Explicit_Dereference then
6640          return Nkind (Original_Node (Obj)) /= N_Function_Call;
6641
6642       else
6643          return False;
6644       end if;
6645    end Is_Aliased_View;
6646
6647    -------------------------
6648    -- Is_Ancestor_Package --
6649    -------------------------
6650
6651    function Is_Ancestor_Package
6652      (E1 : Entity_Id;
6653       E2 : Entity_Id) return Boolean
6654    is
6655       Par : Entity_Id;
6656
6657    begin
6658       Par := E2;
6659       while Present (Par)
6660         and then Par /= Standard_Standard
6661       loop
6662          if Par = E1 then
6663             return True;
6664          end if;
6665
6666          Par := Scope (Par);
6667       end loop;
6668
6669       return False;
6670    end Is_Ancestor_Package;
6671
6672    ----------------------
6673    -- Is_Atomic_Object --
6674    ----------------------
6675
6676    function Is_Atomic_Object (N : Node_Id) return Boolean is
6677
6678       function Object_Has_Atomic_Components (N : Node_Id) return Boolean;
6679       --  Determines if given object has atomic components
6680
6681       function Is_Atomic_Prefix (N : Node_Id) return Boolean;
6682       --  If prefix is an implicit dereference, examine designated type
6683
6684       ----------------------
6685       -- Is_Atomic_Prefix --
6686       ----------------------
6687
6688       function Is_Atomic_Prefix (N : Node_Id) return Boolean is
6689       begin
6690          if Is_Access_Type (Etype (N)) then
6691             return
6692               Has_Atomic_Components (Designated_Type (Etype (N)));
6693          else
6694             return Object_Has_Atomic_Components (N);
6695          end if;
6696       end Is_Atomic_Prefix;
6697
6698       ----------------------------------
6699       -- Object_Has_Atomic_Components --
6700       ----------------------------------
6701
6702       function Object_Has_Atomic_Components (N : Node_Id) return Boolean is
6703       begin
6704          if Has_Atomic_Components (Etype (N))
6705            or else Is_Atomic (Etype (N))
6706          then
6707             return True;
6708
6709          elsif Is_Entity_Name (N)
6710            and then (Has_Atomic_Components (Entity (N))
6711                       or else Is_Atomic (Entity (N)))
6712          then
6713             return True;
6714
6715          elsif Nkind (N) = N_Indexed_Component
6716            or else Nkind (N) = N_Selected_Component
6717          then
6718             return Is_Atomic_Prefix (Prefix (N));
6719
6720          else
6721             return False;
6722          end if;
6723       end Object_Has_Atomic_Components;
6724
6725    --  Start of processing for Is_Atomic_Object
6726
6727    begin
6728       --  Predicate is not relevant to subprograms
6729
6730       if Is_Entity_Name (N) and then Is_Overloadable (Entity (N)) then
6731          return False;
6732
6733       elsif Is_Atomic (Etype (N))
6734         or else (Is_Entity_Name (N) and then Is_Atomic (Entity (N)))
6735       then
6736          return True;
6737
6738       elsif Nkind (N) = N_Indexed_Component
6739         or else Nkind (N) = N_Selected_Component
6740       then
6741          return Is_Atomic_Prefix (Prefix (N));
6742
6743       else
6744          return False;
6745       end if;
6746    end Is_Atomic_Object;
6747
6748    -----------------------------
6749    -- Is_Concurrent_Interface --
6750    -----------------------------
6751
6752    function Is_Concurrent_Interface (T : Entity_Id) return Boolean is
6753    begin
6754       return
6755         Is_Interface (T)
6756           and then
6757             (Is_Protected_Interface (T)
6758                or else Is_Synchronized_Interface (T)
6759                or else Is_Task_Interface (T));
6760    end Is_Concurrent_Interface;
6761
6762    --------------------------------------
6763    -- Is_Controlling_Limited_Procedure --
6764    --------------------------------------
6765
6766    function Is_Controlling_Limited_Procedure
6767      (Proc_Nam : Entity_Id) return Boolean
6768    is
6769       Param_Typ : Entity_Id := Empty;
6770
6771    begin
6772       if Ekind (Proc_Nam) = E_Procedure
6773         and then Present (Parameter_Specifications (Parent (Proc_Nam)))
6774       then
6775          Param_Typ := Etype (Parameter_Type (First (
6776                         Parameter_Specifications (Parent (Proc_Nam)))));
6777
6778       --  In this case where an Itype was created, the procedure call has been
6779       --  rewritten.
6780
6781       elsif Present (Associated_Node_For_Itype (Proc_Nam))
6782         and then Present (Original_Node (Associated_Node_For_Itype (Proc_Nam)))
6783         and then
6784           Present (Parameter_Associations
6785                      (Associated_Node_For_Itype (Proc_Nam)))
6786       then
6787          Param_Typ :=
6788            Etype (First (Parameter_Associations
6789                           (Associated_Node_For_Itype (Proc_Nam))));
6790       end if;
6791
6792       if Present (Param_Typ) then
6793          return
6794            Is_Interface (Param_Typ)
6795              and then Is_Limited_Record (Param_Typ);
6796       end if;
6797
6798       return False;
6799    end Is_Controlling_Limited_Procedure;
6800
6801    -----------------------------
6802    -- Is_CPP_Constructor_Call --
6803    -----------------------------
6804
6805    function Is_CPP_Constructor_Call (N : Node_Id) return Boolean is
6806    begin
6807       return Nkind (N) = N_Function_Call
6808         and then Is_CPP_Class (Etype (Etype (N)))
6809         and then Is_Constructor (Entity (Name (N)))
6810         and then Is_Imported (Entity (Name (N)));
6811    end Is_CPP_Constructor_Call;
6812
6813    -----------------
6814    -- Is_Delegate --
6815    -----------------
6816
6817    function Is_Delegate (T : Entity_Id) return Boolean is
6818       Desig_Type : Entity_Id;
6819
6820    begin
6821       if VM_Target /= CLI_Target then
6822          return False;
6823       end if;
6824
6825       --  Access-to-subprograms are delegates in CIL
6826
6827       if Ekind (T) = E_Access_Subprogram_Type then
6828          return True;
6829       end if;
6830
6831       if Ekind (T) not in Access_Kind then
6832
6833          --  A delegate is a managed pointer. If no designated type is defined
6834          --  it means that it's not a delegate.
6835
6836          return False;
6837       end if;
6838
6839       Desig_Type := Etype (Directly_Designated_Type (T));
6840
6841       if not Is_Tagged_Type (Desig_Type) then
6842          return False;
6843       end if;
6844
6845       --  Test if the type is inherited from [mscorlib]System.Delegate
6846
6847       while Etype (Desig_Type) /= Desig_Type loop
6848          if Chars (Scope (Desig_Type)) /= No_Name
6849            and then Is_Imported (Scope (Desig_Type))
6850            and then Get_Name_String (Chars (Scope (Desig_Type))) = "delegate"
6851          then
6852             return True;
6853          end if;
6854
6855          Desig_Type := Etype (Desig_Type);
6856       end loop;
6857
6858       return False;
6859    end Is_Delegate;
6860
6861    ----------------------------------------------
6862    -- Is_Dependent_Component_Of_Mutable_Object --
6863    ----------------------------------------------
6864
6865    function Is_Dependent_Component_Of_Mutable_Object
6866      (Object : Node_Id) return Boolean
6867    is
6868       P           : Node_Id;
6869       Prefix_Type : Entity_Id;
6870       P_Aliased   : Boolean := False;
6871       Comp        : Entity_Id;
6872
6873       function Is_Declared_Within_Variant (Comp : Entity_Id) return Boolean;
6874       --  Returns True if and only if Comp is declared within a variant part
6875
6876       --------------------------------
6877       -- Is_Declared_Within_Variant --
6878       --------------------------------
6879
6880       function Is_Declared_Within_Variant (Comp : Entity_Id) return Boolean is
6881          Comp_Decl : constant Node_Id   := Parent (Comp);
6882          Comp_List : constant Node_Id   := Parent (Comp_Decl);
6883       begin
6884          return Nkind (Parent (Comp_List)) = N_Variant;
6885       end Is_Declared_Within_Variant;
6886
6887    --  Start of processing for Is_Dependent_Component_Of_Mutable_Object
6888
6889    begin
6890       if Is_Variable (Object) then
6891
6892          if Nkind (Object) = N_Selected_Component then
6893             P := Prefix (Object);
6894             Prefix_Type := Etype (P);
6895
6896             if Is_Entity_Name (P) then
6897
6898                if Ekind (Entity (P)) = E_Generic_In_Out_Parameter then
6899                   Prefix_Type := Base_Type (Prefix_Type);
6900                end if;
6901
6902                if Is_Aliased (Entity (P)) then
6903                   P_Aliased := True;
6904                end if;
6905
6906             --  A discriminant check on a selected component may be expanded
6907             --  into a dereference when removing side-effects. Recover the
6908             --  original node and its type, which may be unconstrained.
6909
6910             elsif Nkind (P) = N_Explicit_Dereference
6911               and then not (Comes_From_Source (P))
6912             then
6913                P := Original_Node (P);
6914                Prefix_Type := Etype (P);
6915
6916             else
6917                --  Check for prefix being an aliased component???
6918
6919                null;
6920
6921             end if;
6922
6923             --  A heap object is constrained by its initial value
6924
6925             --  Ada 2005 (AI-363): Always assume the object could be mutable in
6926             --  the dereferenced case, since the access value might denote an
6927             --  unconstrained aliased object, whereas in Ada 95 the designated
6928             --  object is guaranteed to be constrained. A worst-case assumption
6929             --  has to apply in Ada 2005 because we can't tell at compile time
6930             --  whether the object is "constrained by its initial value"
6931             --  (despite the fact that 3.10.2(26/2) and 8.5.1(5/2) are
6932             --  semantic rules -- these rules are acknowledged to need fixing).
6933
6934             if Ada_Version < Ada_2005 then
6935                if Is_Access_Type (Prefix_Type)
6936                  or else Nkind (P) = N_Explicit_Dereference
6937                then
6938                   return False;
6939                end if;
6940
6941             elsif Ada_Version >= Ada_2005 then
6942                if Is_Access_Type (Prefix_Type) then
6943
6944                   --  If the access type is pool-specific, and there is no
6945                   --  constrained partial view of the designated type, then the
6946                   --  designated object is known to be constrained.
6947
6948                   if Ekind (Prefix_Type) = E_Access_Type
6949                     and then not Effectively_Has_Constrained_Partial_View
6950                                    (Typ  => Designated_Type (Prefix_Type),
6951                                     Scop => Current_Scope)
6952                   then
6953                      return False;
6954
6955                   --  Otherwise (general access type, or there is a constrained
6956                   --  partial view of the designated type), we need to check
6957                   --  based on the designated type.
6958
6959                   else
6960                      Prefix_Type := Designated_Type (Prefix_Type);
6961                   end if;
6962                end if;
6963             end if;
6964
6965             Comp :=
6966               Original_Record_Component (Entity (Selector_Name (Object)));
6967
6968             --  As per AI-0017, the renaming is illegal in a generic body, even
6969             --  if the subtype is indefinite.
6970
6971             --  Ada 2005 (AI-363): In Ada 2005 an aliased object can be mutable
6972
6973             if not Is_Constrained (Prefix_Type)
6974               and then (not Is_Indefinite_Subtype (Prefix_Type)
6975                          or else
6976                           (Is_Generic_Type (Prefix_Type)
6977                             and then Ekind (Current_Scope) = E_Generic_Package
6978                             and then In_Package_Body (Current_Scope)))
6979
6980               and then (Is_Declared_Within_Variant (Comp)
6981                           or else Has_Discriminant_Dependent_Constraint (Comp))
6982               and then (not P_Aliased or else Ada_Version >= Ada_2005)
6983             then
6984                return True;
6985
6986             else
6987                return
6988                  Is_Dependent_Component_Of_Mutable_Object (Prefix (Object));
6989
6990             end if;
6991
6992          elsif Nkind (Object) = N_Indexed_Component
6993            or else Nkind (Object) = N_Slice
6994          then
6995             return Is_Dependent_Component_Of_Mutable_Object (Prefix (Object));
6996
6997          --  A type conversion that Is_Variable is a view conversion:
6998          --  go back to the denoted object.
6999
7000          elsif Nkind (Object) = N_Type_Conversion then
7001             return
7002               Is_Dependent_Component_Of_Mutable_Object (Expression (Object));
7003          end if;
7004       end if;
7005
7006       return False;
7007    end Is_Dependent_Component_Of_Mutable_Object;
7008
7009    ---------------------
7010    -- Is_Dereferenced --
7011    ---------------------
7012
7013    function Is_Dereferenced (N : Node_Id) return Boolean is
7014       P : constant Node_Id := Parent (N);
7015    begin
7016       return
7017          (Nkind (P) = N_Selected_Component
7018             or else
7019           Nkind (P) = N_Explicit_Dereference
7020             or else
7021           Nkind (P) = N_Indexed_Component
7022             or else
7023           Nkind (P) = N_Slice)
7024         and then Prefix (P) = N;
7025    end Is_Dereferenced;
7026
7027    ----------------------
7028    -- Is_Descendent_Of --
7029    ----------------------
7030
7031    function Is_Descendent_Of (T1 : Entity_Id; T2 : Entity_Id) return Boolean is
7032       T    : Entity_Id;
7033       Etyp : Entity_Id;
7034
7035    begin
7036       pragma Assert (Nkind (T1) in N_Entity);
7037       pragma Assert (Nkind (T2) in N_Entity);
7038
7039       T := Base_Type (T1);
7040
7041       --  Immediate return if the types match
7042
7043       if T = T2 then
7044          return True;
7045
7046       --  Comment needed here ???
7047
7048       elsif Ekind (T) = E_Class_Wide_Type then
7049          return Etype (T) = T2;
7050
7051       --  All other cases
7052
7053       else
7054          loop
7055             Etyp := Etype (T);
7056
7057             --  Done if we found the type we are looking for
7058
7059             if Etyp = T2 then
7060                return True;
7061
7062             --  Done if no more derivations to check
7063
7064             elsif T = T1
7065               or else T = Etyp
7066             then
7067                return False;
7068
7069             --  Following test catches error cases resulting from prev errors
7070
7071             elsif No (Etyp) then
7072                return False;
7073
7074             elsif Is_Private_Type (T) and then Etyp = Full_View (T) then
7075                return False;
7076
7077             elsif Is_Private_Type (Etyp) and then Full_View (Etyp) = T then
7078                return False;
7079             end if;
7080
7081             T := Base_Type (Etyp);
7082          end loop;
7083       end if;
7084    end Is_Descendent_Of;
7085
7086    ----------------------------
7087    -- Is_Expression_Function --
7088    ----------------------------
7089
7090    function Is_Expression_Function (Subp : Entity_Id) return Boolean is
7091       Decl : constant Node_Id := Unit_Declaration_Node (Subp);
7092
7093    begin
7094       return Ekind (Subp) = E_Function
7095         and then Nkind (Decl) = N_Subprogram_Declaration
7096         and then
7097           (Nkind (Original_Node (Decl)) = N_Expression_Function
7098             or else
7099               (Present (Corresponding_Body (Decl))
7100                 and then
7101                   Nkind (Original_Node
7102                      (Unit_Declaration_Node (Corresponding_Body (Decl))))
7103                  = N_Expression_Function));
7104    end Is_Expression_Function;
7105
7106    --------------
7107    -- Is_False --
7108    --------------
7109
7110    function Is_False (U : Uint) return Boolean is
7111    begin
7112       return (U = 0);
7113    end Is_False;
7114
7115    ---------------------------
7116    -- Is_Fixed_Model_Number --
7117    ---------------------------
7118
7119    function Is_Fixed_Model_Number (U : Ureal; T : Entity_Id) return Boolean is
7120       S : constant Ureal := Small_Value (T);
7121       M : Urealp.Save_Mark;
7122       R : Boolean;
7123    begin
7124       M := Urealp.Mark;
7125       R := (U = UR_Trunc (U / S) * S);
7126       Urealp.Release (M);
7127       return R;
7128    end Is_Fixed_Model_Number;
7129
7130    -------------------------------
7131    -- Is_Fully_Initialized_Type --
7132    -------------------------------
7133
7134    function Is_Fully_Initialized_Type (Typ : Entity_Id) return Boolean is
7135    begin
7136       if Is_Scalar_Type (Typ) then
7137          return False;
7138
7139       elsif Is_Access_Type (Typ) then
7140          return True;
7141
7142       elsif Is_Array_Type (Typ) then
7143          if Is_Fully_Initialized_Type (Component_Type (Typ)) then
7144             return True;
7145          end if;
7146
7147          --  An interesting case, if we have a constrained type one of whose
7148          --  bounds is known to be null, then there are no elements to be
7149          --  initialized, so all the elements are initialized!
7150
7151          if Is_Constrained (Typ) then
7152             declare
7153                Indx     : Node_Id;
7154                Indx_Typ : Entity_Id;
7155                Lbd, Hbd : Node_Id;
7156
7157             begin
7158                Indx := First_Index (Typ);
7159                while Present (Indx) loop
7160                   if Etype (Indx) = Any_Type then
7161                      return False;
7162
7163                   --  If index is a range, use directly
7164
7165                   elsif Nkind (Indx) = N_Range then
7166                      Lbd := Low_Bound  (Indx);
7167                      Hbd := High_Bound (Indx);
7168
7169                   else
7170                      Indx_Typ := Etype (Indx);
7171
7172                      if Is_Private_Type (Indx_Typ)  then
7173                         Indx_Typ := Full_View (Indx_Typ);
7174                      end if;
7175
7176                      if No (Indx_Typ) or else Etype (Indx_Typ) = Any_Type then
7177                         return False;
7178                      else
7179                         Lbd := Type_Low_Bound  (Indx_Typ);
7180                         Hbd := Type_High_Bound (Indx_Typ);
7181                      end if;
7182                   end if;
7183
7184                   if Compile_Time_Known_Value (Lbd)
7185                     and then Compile_Time_Known_Value (Hbd)
7186                   then
7187                      if Expr_Value (Hbd) < Expr_Value (Lbd) then
7188                         return True;
7189                      end if;
7190                   end if;
7191
7192                   Next_Index (Indx);
7193                end loop;
7194             end;
7195          end if;
7196
7197          --  If no null indexes, then type is not fully initialized
7198
7199          return False;
7200
7201       --  Record types
7202
7203       elsif Is_Record_Type (Typ) then
7204          if Has_Discriminants (Typ)
7205            and then
7206              Present (Discriminant_Default_Value (First_Discriminant (Typ)))
7207            and then Is_Fully_Initialized_Variant (Typ)
7208          then
7209             return True;
7210          end if;
7211
7212          --  Controlled records are considered to be fully initialized if
7213          --  there is a user defined Initialize routine. This may not be
7214          --  entirely correct, but as the spec notes, we are guessing here
7215          --  what is best from the point of view of issuing warnings.
7216
7217          if Is_Controlled (Typ) then
7218             declare
7219                Utyp : constant Entity_Id := Underlying_Type (Typ);
7220
7221             begin
7222                if Present (Utyp) then
7223                   declare
7224                      Init : constant Entity_Id :=
7225                               (Find_Prim_Op
7226                                  (Underlying_Type (Typ), Name_Initialize));
7227
7228                   begin
7229                      if Present (Init)
7230                        and then Comes_From_Source (Init)
7231                        and then not
7232                          Is_Predefined_File_Name
7233                            (File_Name (Get_Source_File_Index (Sloc (Init))))
7234                      then
7235                         return True;
7236
7237                      elsif Has_Null_Extension (Typ)
7238                         and then
7239                           Is_Fully_Initialized_Type
7240                             (Etype (Base_Type (Typ)))
7241                      then
7242                         return True;
7243                      end if;
7244                   end;
7245                end if;
7246             end;
7247          end if;
7248
7249          --  Otherwise see if all record components are initialized
7250
7251          declare
7252             Ent : Entity_Id;
7253
7254          begin
7255             Ent := First_Entity (Typ);
7256             while Present (Ent) loop
7257                if Ekind (Ent) = E_Component
7258                  and then (No (Parent (Ent))
7259                              or else No (Expression (Parent (Ent))))
7260                  and then not Is_Fully_Initialized_Type (Etype (Ent))
7261
7262                   --  Special VM case for tag components, which need to be
7263                   --  defined in this case, but are never initialized as VMs
7264                   --  are using other dispatching mechanisms. Ignore this
7265                   --  uninitialized case. Note that this applies both to the
7266                   --  uTag entry and the main vtable pointer (CPP_Class case).
7267
7268                  and then (Tagged_Type_Expansion or else not Is_Tag (Ent))
7269                then
7270                   return False;
7271                end if;
7272
7273                Next_Entity (Ent);
7274             end loop;
7275          end;
7276
7277          --  No uninitialized components, so type is fully initialized.
7278          --  Note that this catches the case of no components as well.
7279
7280          return True;
7281
7282       elsif Is_Concurrent_Type (Typ) then
7283          return True;
7284
7285       elsif Is_Private_Type (Typ) then
7286          declare
7287             U : constant Entity_Id := Underlying_Type (Typ);
7288
7289          begin
7290             if No (U) then
7291                return False;
7292             else
7293                return Is_Fully_Initialized_Type (U);
7294             end if;
7295          end;
7296
7297       else
7298          return False;
7299       end if;
7300    end Is_Fully_Initialized_Type;
7301
7302    ----------------------------------
7303    -- Is_Fully_Initialized_Variant --
7304    ----------------------------------
7305
7306    function Is_Fully_Initialized_Variant (Typ : Entity_Id) return Boolean is
7307       Loc           : constant Source_Ptr := Sloc (Typ);
7308       Constraints   : constant List_Id    := New_List;
7309       Components    : constant Elist_Id   := New_Elmt_List;
7310       Comp_Elmt     : Elmt_Id;
7311       Comp_Id       : Node_Id;
7312       Comp_List     : Node_Id;
7313       Discr         : Entity_Id;
7314       Discr_Val     : Node_Id;
7315
7316       Report_Errors : Boolean;
7317       pragma Warnings (Off, Report_Errors);
7318
7319    begin
7320       if Serious_Errors_Detected > 0 then
7321          return False;
7322       end if;
7323
7324       if Is_Record_Type (Typ)
7325         and then Nkind (Parent (Typ)) = N_Full_Type_Declaration
7326         and then Nkind (Type_Definition (Parent (Typ))) = N_Record_Definition
7327       then
7328          Comp_List := Component_List (Type_Definition (Parent (Typ)));
7329
7330          Discr := First_Discriminant (Typ);
7331          while Present (Discr) loop
7332             if Nkind (Parent (Discr)) = N_Discriminant_Specification then
7333                Discr_Val := Expression (Parent (Discr));
7334
7335                if Present (Discr_Val)
7336                  and then Is_OK_Static_Expression (Discr_Val)
7337                then
7338                   Append_To (Constraints,
7339                     Make_Component_Association (Loc,
7340                       Choices    => New_List (New_Occurrence_Of (Discr, Loc)),
7341                       Expression => New_Copy (Discr_Val)));
7342                else
7343                   return False;
7344                end if;
7345             else
7346                return False;
7347             end if;
7348
7349             Next_Discriminant (Discr);
7350          end loop;
7351
7352          Gather_Components
7353            (Typ           => Typ,
7354             Comp_List     => Comp_List,
7355             Governed_By   => Constraints,
7356             Into          => Components,
7357             Report_Errors => Report_Errors);
7358
7359          --  Check that each component present is fully initialized
7360
7361          Comp_Elmt := First_Elmt (Components);
7362          while Present (Comp_Elmt) loop
7363             Comp_Id := Node (Comp_Elmt);
7364
7365             if Ekind (Comp_Id) = E_Component
7366               and then (No (Parent (Comp_Id))
7367                          or else No (Expression (Parent (Comp_Id))))
7368               and then not Is_Fully_Initialized_Type (Etype (Comp_Id))
7369             then
7370                return False;
7371             end if;
7372
7373             Next_Elmt (Comp_Elmt);
7374          end loop;
7375
7376          return True;
7377
7378       elsif Is_Private_Type (Typ) then
7379          declare
7380             U : constant Entity_Id := Underlying_Type (Typ);
7381
7382          begin
7383             if No (U) then
7384                return False;
7385             else
7386                return Is_Fully_Initialized_Variant (U);
7387             end if;
7388          end;
7389       else
7390          return False;
7391       end if;
7392    end Is_Fully_Initialized_Variant;
7393
7394    ----------------------------
7395    -- Is_Inherited_Operation --
7396    ----------------------------
7397
7398    function Is_Inherited_Operation (E : Entity_Id) return Boolean is
7399       pragma Assert (Is_Overloadable (E));
7400       Kind : constant Node_Kind := Nkind (Parent (E));
7401    begin
7402       return Kind = N_Full_Type_Declaration
7403         or else Kind = N_Private_Extension_Declaration
7404         or else Kind = N_Subtype_Declaration
7405         or else (Ekind (E) = E_Enumeration_Literal
7406                   and then Is_Derived_Type (Etype (E)));
7407    end Is_Inherited_Operation;
7408
7409    -------------------------------------
7410    -- Is_Inherited_Operation_For_Type --
7411    -------------------------------------
7412
7413    function Is_Inherited_Operation_For_Type
7414      (E   : Entity_Id;
7415       Typ : Entity_Id) return Boolean
7416    is
7417    begin
7418       return Is_Inherited_Operation (E)
7419         and then Etype (Parent (E)) = Typ;
7420    end Is_Inherited_Operation_For_Type;
7421
7422    -----------------
7423    -- Is_Iterator --
7424    -----------------
7425
7426    function Is_Iterator (Typ : Entity_Id) return Boolean is
7427       Ifaces_List : Elist_Id;
7428       Iface_Elmt  : Elmt_Id;
7429       Iface       : Entity_Id;
7430
7431    begin
7432       if Is_Class_Wide_Type (Typ)
7433         and then
7434           (Chars (Etype (Typ)) = Name_Forward_Iterator
7435              or else
7436            Chars (Etype (Typ)) = Name_Reversible_Iterator)
7437         and then
7438           Is_Predefined_File_Name
7439             (Unit_File_Name (Get_Source_Unit (Etype (Typ))))
7440       then
7441          return True;
7442
7443       elsif not Is_Tagged_Type (Typ) or else not Is_Derived_Type (Typ) then
7444          return False;
7445
7446       else
7447          Collect_Interfaces (Typ, Ifaces_List);
7448
7449          Iface_Elmt := First_Elmt (Ifaces_List);
7450          while Present (Iface_Elmt) loop
7451             Iface := Node (Iface_Elmt);
7452             if Chars (Iface) = Name_Forward_Iterator
7453               and then
7454                 Is_Predefined_File_Name
7455                   (Unit_File_Name (Get_Source_Unit (Iface)))
7456             then
7457                return True;
7458             end if;
7459
7460             Next_Elmt (Iface_Elmt);
7461          end loop;
7462
7463          return False;
7464       end if;
7465    end Is_Iterator;
7466
7467    ------------
7468    -- Is_LHS --
7469    ------------
7470
7471    --  We seem to have a lot of overlapping functions that do similar things
7472    --  (testing for left hand sides or lvalues???). Anyway, since this one is
7473    --  purely syntactic, it should be in Sem_Aux I would think???
7474
7475    function Is_LHS (N : Node_Id) return Boolean is
7476       P : constant Node_Id := Parent (N);
7477
7478    begin
7479       if Nkind (P) = N_Assignment_Statement then
7480          return Name (P) = N;
7481
7482       elsif
7483         Nkind_In (P, N_Indexed_Component, N_Selected_Component, N_Slice)
7484       then
7485          return N = Prefix (P) and then Is_LHS (P);
7486
7487       else
7488          return False;
7489       end if;
7490    end Is_LHS;
7491
7492    -----------------------------
7493    -- Is_Library_Level_Entity --
7494    -----------------------------
7495
7496    function Is_Library_Level_Entity (E : Entity_Id) return Boolean is
7497    begin
7498       --  The following is a small optimization, and it also properly handles
7499       --  discriminals, which in task bodies might appear in expressions before
7500       --  the corresponding procedure has been created, and which therefore do
7501       --  not have an assigned scope.
7502
7503       if Is_Formal (E) then
7504          return False;
7505       end if;
7506
7507       --  Normal test is simply that the enclosing dynamic scope is Standard
7508
7509       return Enclosing_Dynamic_Scope (E) = Standard_Standard;
7510    end Is_Library_Level_Entity;
7511
7512    --------------------------------
7513    -- Is_Limited_Class_Wide_Type --
7514    --------------------------------
7515
7516    function Is_Limited_Class_Wide_Type (Typ : Entity_Id) return Boolean is
7517    begin
7518       return
7519         Is_Class_Wide_Type (Typ)
7520           and then Is_Limited_Type (Typ);
7521    end Is_Limited_Class_Wide_Type;
7522
7523    ---------------------------------
7524    -- Is_Local_Variable_Reference --
7525    ---------------------------------
7526
7527    function Is_Local_Variable_Reference (Expr : Node_Id) return Boolean is
7528    begin
7529       if not Is_Entity_Name (Expr) then
7530          return False;
7531
7532       else
7533          declare
7534             Ent : constant Entity_Id := Entity (Expr);
7535             Sub : constant Entity_Id := Enclosing_Subprogram (Ent);
7536          begin
7537             if not Ekind_In (Ent, E_Variable, E_In_Out_Parameter) then
7538                return False;
7539             else
7540                return Present (Sub) and then Sub = Current_Subprogram;
7541             end if;
7542          end;
7543       end if;
7544    end Is_Local_Variable_Reference;
7545
7546    -------------------------
7547    -- Is_Object_Reference --
7548    -------------------------
7549
7550    function Is_Object_Reference (N : Node_Id) return Boolean is
7551    begin
7552       if Is_Entity_Name (N) then
7553          return Present (Entity (N)) and then Is_Object (Entity (N));
7554
7555       else
7556          case Nkind (N) is
7557             when N_Indexed_Component | N_Slice =>
7558                return
7559                  Is_Object_Reference (Prefix (N))
7560                    or else Is_Access_Type (Etype (Prefix (N)));
7561
7562             --  In Ada 95, a function call is a constant object; a procedure
7563             --  call is not.
7564
7565             when N_Function_Call =>
7566                return Etype (N) /= Standard_Void_Type;
7567
7568             --  A reference to the stream attribute Input is a function call
7569
7570             when N_Attribute_Reference =>
7571                return Attribute_Name (N) = Name_Input;
7572
7573             when N_Selected_Component =>
7574                return
7575                  Is_Object_Reference (Selector_Name (N))
7576                    and then
7577                      (Is_Object_Reference (Prefix (N))
7578                         or else Is_Access_Type (Etype (Prefix (N))));
7579
7580             when N_Explicit_Dereference =>
7581                return True;
7582
7583             --  A view conversion of a tagged object is an object reference
7584
7585             when N_Type_Conversion =>
7586                return Is_Tagged_Type (Etype (Subtype_Mark (N)))
7587                  and then Is_Tagged_Type (Etype (Expression (N)))
7588                  and then Is_Object_Reference (Expression (N));
7589
7590             --  An unchecked type conversion is considered to be an object if
7591             --  the operand is an object (this construction arises only as a
7592             --  result of expansion activities).
7593
7594             when N_Unchecked_Type_Conversion =>
7595                return True;
7596
7597             when others =>
7598                return False;
7599          end case;
7600       end if;
7601    end Is_Object_Reference;
7602
7603    -----------------------------------
7604    -- Is_OK_Variable_For_Out_Formal --
7605    -----------------------------------
7606
7607    function Is_OK_Variable_For_Out_Formal (AV : Node_Id) return Boolean is
7608    begin
7609       Note_Possible_Modification (AV, Sure => True);
7610
7611       --  We must reject parenthesized variable names. The check for
7612       --  Comes_From_Source is present because there are currently
7613       --  cases where the compiler violates this rule (e.g. passing
7614       --  a task object to its controlled Initialize routine).
7615
7616       if Paren_Count (AV) > 0 and then Comes_From_Source (AV) then
7617          return False;
7618
7619       --  A variable is always allowed
7620
7621       elsif Is_Variable (AV) then
7622          return True;
7623
7624       --  Unchecked conversions are allowed only if they come from the
7625       --  generated code, which sometimes uses unchecked conversions for out
7626       --  parameters in cases where code generation is unaffected. We tell
7627       --  source unchecked conversions by seeing if they are rewrites of an
7628       --  original Unchecked_Conversion function call, or of an explicit
7629       --  conversion of a function call.
7630
7631       elsif Nkind (AV) = N_Unchecked_Type_Conversion then
7632          if Nkind (Original_Node (AV)) = N_Function_Call then
7633             return False;
7634
7635          elsif Comes_From_Source (AV)
7636            and then Nkind (Original_Node (Expression (AV))) = N_Function_Call
7637          then
7638             return False;
7639
7640          elsif Nkind (Original_Node (AV)) = N_Type_Conversion then
7641             return Is_OK_Variable_For_Out_Formal (Expression (AV));
7642
7643          else
7644             return True;
7645          end if;
7646
7647       --  Normal type conversions are allowed if argument is a variable
7648
7649       elsif Nkind (AV) = N_Type_Conversion then
7650          if Is_Variable (Expression (AV))
7651            and then Paren_Count (Expression (AV)) = 0
7652          then
7653             Note_Possible_Modification (Expression (AV), Sure => True);
7654             return True;
7655
7656          --  We also allow a non-parenthesized expression that raises
7657          --  constraint error if it rewrites what used to be a variable
7658
7659          elsif Raises_Constraint_Error (Expression (AV))
7660             and then Paren_Count (Expression (AV)) = 0
7661             and then Is_Variable (Original_Node (Expression (AV)))
7662          then
7663             return True;
7664
7665          --  Type conversion of something other than a variable
7666
7667          else
7668             return False;
7669          end if;
7670
7671       --  If this node is rewritten, then test the original form, if that is
7672       --  OK, then we consider the rewritten node OK (for example, if the
7673       --  original node is a conversion, then Is_Variable will not be true
7674       --  but we still want to allow the conversion if it converts a variable).
7675
7676       elsif Original_Node (AV) /= AV then
7677
7678          --  In Ada 2012, the explicit dereference may be a rewritten call to a
7679          --  Reference function.
7680
7681          if Ada_Version >= Ada_2012
7682            and then Nkind (Original_Node (AV)) = N_Function_Call
7683            and then
7684              Has_Implicit_Dereference (Etype (Name (Original_Node (AV))))
7685          then
7686             return True;
7687
7688          else
7689             return Is_OK_Variable_For_Out_Formal (Original_Node (AV));
7690          end if;
7691
7692       --  All other non-variables are rejected
7693
7694       else
7695          return False;
7696       end if;
7697    end Is_OK_Variable_For_Out_Formal;
7698
7699    -----------------------------------
7700    -- Is_Partially_Initialized_Type --
7701    -----------------------------------
7702
7703    function Is_Partially_Initialized_Type
7704      (Typ              : Entity_Id;
7705       Include_Implicit : Boolean := True) return Boolean
7706    is
7707    begin
7708       if Is_Scalar_Type (Typ) then
7709          return False;
7710
7711       elsif Is_Access_Type (Typ) then
7712          return Include_Implicit;
7713
7714       elsif Is_Array_Type (Typ) then
7715
7716          --  If component type is partially initialized, so is array type
7717
7718          if Is_Partially_Initialized_Type
7719               (Component_Type (Typ), Include_Implicit)
7720          then
7721             return True;
7722
7723          --  Otherwise we are only partially initialized if we are fully
7724          --  initialized (this is the empty array case, no point in us
7725          --  duplicating that code here).
7726
7727          else
7728             return Is_Fully_Initialized_Type (Typ);
7729          end if;
7730
7731       elsif Is_Record_Type (Typ) then
7732
7733          --  A discriminated type is always partially initialized if in
7734          --  all mode
7735
7736          if Has_Discriminants (Typ) and then Include_Implicit then
7737             return True;
7738
7739          --  A tagged type is always partially initialized
7740
7741          elsif Is_Tagged_Type (Typ) then
7742             return True;
7743
7744          --  Case of non-discriminated record
7745
7746          else
7747             declare
7748                Ent : Entity_Id;
7749
7750                Component_Present : Boolean := False;
7751                --  Set True if at least one component is present. If no
7752                --  components are present, then record type is fully
7753                --  initialized (another odd case, like the null array).
7754
7755             begin
7756                --  Loop through components
7757
7758                Ent := First_Entity (Typ);
7759                while Present (Ent) loop
7760                   if Ekind (Ent) = E_Component then
7761                      Component_Present := True;
7762
7763                      --  If a component has an initialization expression then
7764                      --  the enclosing record type is partially initialized
7765
7766                      if Present (Parent (Ent))
7767                        and then Present (Expression (Parent (Ent)))
7768                      then
7769                         return True;
7770
7771                      --  If a component is of a type which is itself partially
7772                      --  initialized, then the enclosing record type is also.
7773
7774                      elsif Is_Partially_Initialized_Type
7775                              (Etype (Ent), Include_Implicit)
7776                      then
7777                         return True;
7778                      end if;
7779                   end if;
7780
7781                   Next_Entity (Ent);
7782                end loop;
7783
7784                --  No initialized components found. If we found any components
7785                --  they were all uninitialized so the result is false.
7786
7787                if Component_Present then
7788                   return False;
7789
7790                --  But if we found no components, then all the components are
7791                --  initialized so we consider the type to be initialized.
7792
7793                else
7794                   return True;
7795                end if;
7796             end;
7797          end if;
7798
7799       --  Concurrent types are always fully initialized
7800
7801       elsif Is_Concurrent_Type (Typ) then
7802          return True;
7803
7804       --  For a private type, go to underlying type. If there is no underlying
7805       --  type then just assume this partially initialized. Not clear if this
7806       --  can happen in a non-error case, but no harm in testing for this.
7807
7808       elsif Is_Private_Type (Typ) then
7809          declare
7810             U : constant Entity_Id := Underlying_Type (Typ);
7811          begin
7812             if No (U) then
7813                return True;
7814             else
7815                return Is_Partially_Initialized_Type (U, Include_Implicit);
7816             end if;
7817          end;
7818
7819       --  For any other type (are there any?) assume partially initialized
7820
7821       else
7822          return True;
7823       end if;
7824    end Is_Partially_Initialized_Type;
7825
7826    ------------------------------------
7827    -- Is_Potentially_Persistent_Type --
7828    ------------------------------------
7829
7830    function Is_Potentially_Persistent_Type (T : Entity_Id) return Boolean is
7831       Comp : Entity_Id;
7832       Indx : Node_Id;
7833
7834    begin
7835       --  For private type, test corresponding full type
7836
7837       if Is_Private_Type (T) then
7838          return Is_Potentially_Persistent_Type (Full_View (T));
7839
7840       --  Scalar types are potentially persistent
7841
7842       elsif Is_Scalar_Type (T) then
7843          return True;
7844
7845       --  Record type is potentially persistent if not tagged and the types of
7846       --  all it components are potentially persistent, and no component has
7847       --  an initialization expression.
7848
7849       elsif Is_Record_Type (T)
7850         and then not Is_Tagged_Type (T)
7851         and then not Is_Partially_Initialized_Type (T)
7852       then
7853          Comp := First_Component (T);
7854          while Present (Comp) loop
7855             if not Is_Potentially_Persistent_Type (Etype (Comp)) then
7856                return False;
7857             else
7858                Next_Entity (Comp);
7859             end if;
7860          end loop;
7861
7862          return True;
7863
7864       --  Array type is potentially persistent if its component type is
7865       --  potentially persistent and if all its constraints are static.
7866
7867       elsif Is_Array_Type (T) then
7868          if not Is_Potentially_Persistent_Type (Component_Type (T)) then
7869             return False;
7870          end if;
7871
7872          Indx := First_Index (T);
7873          while Present (Indx) loop
7874             if not Is_OK_Static_Subtype (Etype (Indx)) then
7875                return False;
7876             else
7877                Next_Index (Indx);
7878             end if;
7879          end loop;
7880
7881          return True;
7882
7883       --  All other types are not potentially persistent
7884
7885       else
7886          return False;
7887       end if;
7888    end Is_Potentially_Persistent_Type;
7889
7890    ---------------------------------
7891    -- Is_Protected_Self_Reference --
7892    ---------------------------------
7893
7894    function Is_Protected_Self_Reference (N : Node_Id) return Boolean is
7895
7896       function In_Access_Definition (N : Node_Id) return Boolean;
7897       --  Returns true if N belongs to an access definition
7898
7899       --------------------------
7900       -- In_Access_Definition --
7901       --------------------------
7902
7903       function In_Access_Definition (N : Node_Id) return Boolean is
7904          P : Node_Id;
7905
7906       begin
7907          P := Parent (N);
7908          while Present (P) loop
7909             if Nkind (P) = N_Access_Definition then
7910                return True;
7911             end if;
7912
7913             P := Parent (P);
7914          end loop;
7915
7916          return False;
7917       end In_Access_Definition;
7918
7919    --  Start of processing for Is_Protected_Self_Reference
7920
7921    begin
7922       --  Verify that prefix is analyzed and has the proper form. Note that
7923       --  the attributes Elab_Spec, Elab_Body, Elab_Subp_Body and UET_Address,
7924       --  which also produce the address of an entity, do not analyze their
7925       --  prefix because they denote entities that are not necessarily visible.
7926       --  Neither of them can apply to a protected type.
7927
7928       return Ada_Version >= Ada_2005
7929         and then Is_Entity_Name (N)
7930         and then Present (Entity (N))
7931         and then Is_Protected_Type (Entity (N))
7932         and then In_Open_Scopes (Entity (N))
7933         and then not In_Access_Definition (N);
7934    end Is_Protected_Self_Reference;
7935
7936    -----------------------------
7937    -- Is_RCI_Pkg_Spec_Or_Body --
7938    -----------------------------
7939
7940    function Is_RCI_Pkg_Spec_Or_Body (Cunit : Node_Id) return Boolean is
7941
7942       function Is_RCI_Pkg_Decl_Cunit (Cunit : Node_Id) return Boolean;
7943       --  Return True if the unit of Cunit is an RCI package declaration
7944
7945       ---------------------------
7946       -- Is_RCI_Pkg_Decl_Cunit --
7947       ---------------------------
7948
7949       function Is_RCI_Pkg_Decl_Cunit (Cunit : Node_Id) return Boolean is
7950          The_Unit : constant Node_Id := Unit (Cunit);
7951
7952       begin
7953          if Nkind (The_Unit) /= N_Package_Declaration then
7954             return False;
7955          end if;
7956
7957          return Is_Remote_Call_Interface (Defining_Entity (The_Unit));
7958       end Is_RCI_Pkg_Decl_Cunit;
7959
7960    --  Start of processing for Is_RCI_Pkg_Spec_Or_Body
7961
7962    begin
7963       return Is_RCI_Pkg_Decl_Cunit (Cunit)
7964         or else
7965          (Nkind (Unit (Cunit)) = N_Package_Body
7966            and then Is_RCI_Pkg_Decl_Cunit (Library_Unit (Cunit)));
7967    end Is_RCI_Pkg_Spec_Or_Body;
7968
7969    -----------------------------------------
7970    -- Is_Remote_Access_To_Class_Wide_Type --
7971    -----------------------------------------
7972
7973    function Is_Remote_Access_To_Class_Wide_Type
7974      (E : Entity_Id) return Boolean
7975    is
7976    begin
7977       --  A remote access to class-wide type is a general access to object type
7978       --  declared in the visible part of a Remote_Types or Remote_Call_
7979       --  Interface unit.
7980
7981       return Ekind (E) = E_General_Access_Type
7982         and then (Is_Remote_Call_Interface (E) or else Is_Remote_Types (E));
7983    end Is_Remote_Access_To_Class_Wide_Type;
7984
7985    -----------------------------------------
7986    -- Is_Remote_Access_To_Subprogram_Type --
7987    -----------------------------------------
7988
7989    function Is_Remote_Access_To_Subprogram_Type
7990      (E : Entity_Id) return Boolean
7991    is
7992    begin
7993       return (Ekind (E) = E_Access_Subprogram_Type
7994                 or else (Ekind (E) = E_Record_Type
7995                            and then Present (Corresponding_Remote_Type (E))))
7996         and then (Is_Remote_Call_Interface (E) or else Is_Remote_Types (E));
7997    end Is_Remote_Access_To_Subprogram_Type;
7998
7999    --------------------
8000    -- Is_Remote_Call --
8001    --------------------
8002
8003    function Is_Remote_Call (N : Node_Id) return Boolean is
8004    begin
8005       if Nkind (N) /= N_Procedure_Call_Statement
8006         and then Nkind (N) /= N_Function_Call
8007       then
8008          --  An entry call cannot be remote
8009
8010          return False;
8011
8012       elsif Nkind (Name (N)) in N_Has_Entity
8013         and then Is_Remote_Call_Interface (Entity (Name (N)))
8014       then
8015          --  A subprogram declared in the spec of a RCI package is remote
8016
8017          return True;
8018
8019       elsif Nkind (Name (N)) = N_Explicit_Dereference
8020         and then Is_Remote_Access_To_Subprogram_Type
8021                    (Etype (Prefix (Name (N))))
8022       then
8023          --  The dereference of a RAS is a remote call
8024
8025          return True;
8026
8027       elsif Present (Controlling_Argument (N))
8028         and then Is_Remote_Access_To_Class_Wide_Type
8029           (Etype (Controlling_Argument (N)))
8030       then
8031          --  Any primitive operation call with a controlling argument of
8032          --  a RACW type is a remote call.
8033
8034          return True;
8035       end if;
8036
8037       --  All other calls are local calls
8038
8039       return False;
8040    end Is_Remote_Call;
8041
8042    ----------------------
8043    -- Is_Renamed_Entry --
8044    ----------------------
8045
8046    function Is_Renamed_Entry (Proc_Nam : Entity_Id) return Boolean is
8047       Orig_Node : Node_Id := Empty;
8048       Subp_Decl : Node_Id := Parent (Parent (Proc_Nam));
8049
8050       function Is_Entry (Nam : Node_Id) return Boolean;
8051       --  Determine whether Nam is an entry. Traverse selectors if there are
8052       --  nested selected components.
8053
8054       --------------
8055       -- Is_Entry --
8056       --------------
8057
8058       function Is_Entry (Nam : Node_Id) return Boolean is
8059       begin
8060          if Nkind (Nam) = N_Selected_Component then
8061             return Is_Entry (Selector_Name (Nam));
8062          end if;
8063
8064          return Ekind (Entity (Nam)) = E_Entry;
8065       end Is_Entry;
8066
8067    --  Start of processing for Is_Renamed_Entry
8068
8069    begin
8070       if Present (Alias (Proc_Nam)) then
8071          Subp_Decl := Parent (Parent (Alias (Proc_Nam)));
8072       end if;
8073
8074       --  Look for a rewritten subprogram renaming declaration
8075
8076       if Nkind (Subp_Decl) = N_Subprogram_Declaration
8077         and then Present (Original_Node (Subp_Decl))
8078       then
8079          Orig_Node := Original_Node (Subp_Decl);
8080       end if;
8081
8082       --  The rewritten subprogram is actually an entry
8083
8084       if Present (Orig_Node)
8085         and then Nkind (Orig_Node) = N_Subprogram_Renaming_Declaration
8086         and then Is_Entry (Name (Orig_Node))
8087       then
8088          return True;
8089       end if;
8090
8091       return False;
8092    end Is_Renamed_Entry;
8093
8094    ----------------------------
8095    -- Is_Reversible_Iterator --
8096    ----------------------------
8097
8098    function Is_Reversible_Iterator (Typ : Entity_Id) return Boolean is
8099       Ifaces_List : Elist_Id;
8100       Iface_Elmt  : Elmt_Id;
8101       Iface       : Entity_Id;
8102
8103    begin
8104       if Is_Class_Wide_Type (Typ)
8105         and then  Chars (Etype (Typ)) = Name_Reversible_Iterator
8106         and then
8107           Is_Predefined_File_Name
8108             (Unit_File_Name (Get_Source_Unit (Etype (Typ))))
8109       then
8110          return True;
8111
8112       elsif not Is_Tagged_Type (Typ)
8113         or else not Is_Derived_Type (Typ)
8114       then
8115          return False;
8116
8117       else
8118          Collect_Interfaces (Typ, Ifaces_List);
8119
8120          Iface_Elmt := First_Elmt (Ifaces_List);
8121          while Present (Iface_Elmt) loop
8122             Iface := Node (Iface_Elmt);
8123             if Chars (Iface) = Name_Reversible_Iterator
8124               and then
8125                 Is_Predefined_File_Name
8126                   (Unit_File_Name (Get_Source_Unit (Iface)))
8127             then
8128                return True;
8129             end if;
8130
8131             Next_Elmt (Iface_Elmt);
8132          end loop;
8133       end if;
8134
8135       return False;
8136    end Is_Reversible_Iterator;
8137
8138    ----------------------
8139    -- Is_Selector_Name --
8140    ----------------------
8141
8142    function Is_Selector_Name (N : Node_Id) return Boolean is
8143    begin
8144       if not Is_List_Member (N) then
8145          declare
8146             P : constant Node_Id   := Parent (N);
8147             K : constant Node_Kind := Nkind (P);
8148          begin
8149             return
8150               (K = N_Expanded_Name          or else
8151                K = N_Generic_Association    or else
8152                K = N_Parameter_Association  or else
8153                K = N_Selected_Component)
8154               and then Selector_Name (P) = N;
8155          end;
8156
8157       else
8158          declare
8159             L : constant List_Id := List_Containing (N);
8160             P : constant Node_Id := Parent (L);
8161          begin
8162             return (Nkind (P) = N_Discriminant_Association
8163                      and then Selector_Names (P) = L)
8164               or else
8165                    (Nkind (P) = N_Component_Association
8166                      and then Choices (P) = L);
8167          end;
8168       end if;
8169    end Is_Selector_Name;
8170
8171    ----------------------------------
8172    -- Is_SPARK_Initialization_Expr --
8173    ----------------------------------
8174
8175    function Is_SPARK_Initialization_Expr (N : Node_Id) return Boolean is
8176       Is_Ok     : Boolean;
8177       Expr      : Node_Id;
8178       Comp_Assn : Node_Id;
8179       Orig_N    : constant Node_Id := Original_Node (N);
8180
8181    begin
8182       Is_Ok := True;
8183
8184       if not Comes_From_Source (Orig_N) then
8185          goto Done;
8186       end if;
8187
8188       pragma Assert (Nkind (Orig_N) in N_Subexpr);
8189
8190       case Nkind (Orig_N) is
8191          when N_Character_Literal |
8192               N_Integer_Literal   |
8193               N_Real_Literal      |
8194               N_String_Literal    =>
8195             null;
8196
8197          when N_Identifier    |
8198               N_Expanded_Name =>
8199             if Is_Entity_Name (Orig_N)
8200               and then Present (Entity (Orig_N))  --  needed in some cases
8201             then
8202                case Ekind (Entity (Orig_N)) is
8203                   when E_Constant            |
8204                        E_Enumeration_Literal |
8205                        E_Named_Integer       |
8206                        E_Named_Real          =>
8207                      null;
8208                   when others =>
8209                      if Is_Type (Entity (Orig_N)) then
8210                         null;
8211                      else
8212                         Is_Ok := False;
8213                      end if;
8214                end case;
8215             end if;
8216
8217          when N_Qualified_Expression |
8218               N_Type_Conversion      =>
8219             Is_Ok := Is_SPARK_Initialization_Expr (Expression (Orig_N));
8220
8221          when N_Unary_Op =>
8222             Is_Ok := Is_SPARK_Initialization_Expr (Right_Opnd (Orig_N));
8223
8224          when N_Binary_Op       |
8225               N_Short_Circuit   |
8226               N_Membership_Test =>
8227             Is_Ok := Is_SPARK_Initialization_Expr (Left_Opnd (Orig_N))
8228               and then Is_SPARK_Initialization_Expr (Right_Opnd (Orig_N));
8229
8230          when N_Aggregate           |
8231               N_Extension_Aggregate =>
8232             if Nkind (Orig_N) = N_Extension_Aggregate then
8233                Is_Ok := Is_SPARK_Initialization_Expr (Ancestor_Part (Orig_N));
8234             end if;
8235
8236             Expr := First (Expressions (Orig_N));
8237             while Present (Expr) loop
8238                if not Is_SPARK_Initialization_Expr (Expr) then
8239                   Is_Ok := False;
8240                   goto Done;
8241                end if;
8242
8243                Next (Expr);
8244             end loop;
8245
8246             Comp_Assn := First (Component_Associations (Orig_N));
8247             while Present (Comp_Assn) loop
8248                Expr := Expression (Comp_Assn);
8249                if Present (Expr)  --  needed for box association
8250                  and then not Is_SPARK_Initialization_Expr (Expr)
8251                then
8252                   Is_Ok := False;
8253                   goto Done;
8254                end if;
8255
8256                Next (Comp_Assn);
8257             end loop;
8258
8259          when N_Attribute_Reference =>
8260             if Nkind (Prefix (Orig_N)) in N_Subexpr then
8261                Is_Ok := Is_SPARK_Initialization_Expr (Prefix (Orig_N));
8262             end if;
8263
8264             Expr := First (Expressions (Orig_N));
8265             while Present (Expr) loop
8266                if not Is_SPARK_Initialization_Expr (Expr) then
8267                   Is_Ok := False;
8268                   goto Done;
8269                end if;
8270
8271                Next (Expr);
8272             end loop;
8273
8274          --  Selected components might be expanded named not yet resolved, so
8275          --  default on the safe side. (Eg on sparklex.ads)
8276
8277          when N_Selected_Component =>
8278             null;
8279
8280          when others =>
8281             Is_Ok := False;
8282       end case;
8283
8284    <<Done>>
8285       return Is_Ok;
8286    end Is_SPARK_Initialization_Expr;
8287
8288    -------------------------------
8289    -- Is_SPARK_Object_Reference --
8290    -------------------------------
8291
8292    function Is_SPARK_Object_Reference (N : Node_Id) return Boolean is
8293    begin
8294       if Is_Entity_Name (N) then
8295          return Present (Entity (N))
8296            and then
8297              (Ekind_In (Entity (N), E_Constant, E_Variable)
8298               or else Ekind (Entity (N)) in Formal_Kind);
8299
8300       else
8301          case Nkind (N) is
8302             when N_Selected_Component =>
8303                return Is_SPARK_Object_Reference (Prefix (N));
8304
8305             when others =>
8306                return False;
8307          end case;
8308       end if;
8309    end Is_SPARK_Object_Reference;
8310
8311    ------------------
8312    -- Is_Statement --
8313    ------------------
8314
8315    function Is_Statement (N : Node_Id) return Boolean is
8316    begin
8317       return
8318         Nkind (N) in N_Statement_Other_Than_Procedure_Call
8319           or else Nkind (N) = N_Procedure_Call_Statement;
8320    end Is_Statement;
8321
8322    --------------------------------------------------
8323    -- Is_Subprogram_Stub_Without_Prior_Declaration --
8324    --------------------------------------------------
8325
8326    function Is_Subprogram_Stub_Without_Prior_Declaration
8327      (N : Node_Id) return Boolean
8328    is
8329    begin
8330       --  A subprogram stub without prior declaration serves as declaration for
8331       --  the actual subprogram body. As such, it has an attached defining
8332       --  entity of E_[Generic_]Function or E_[Generic_]Procedure.
8333
8334       return Nkind (N) = N_Subprogram_Body_Stub
8335         and then Ekind (Defining_Entity (N)) /= E_Subprogram_Body;
8336    end Is_Subprogram_Stub_Without_Prior_Declaration;
8337
8338    ---------------------------------
8339    -- Is_Synchronized_Tagged_Type --
8340    ---------------------------------
8341
8342    function Is_Synchronized_Tagged_Type (E : Entity_Id) return Boolean is
8343       Kind : constant Entity_Kind := Ekind (Base_Type (E));
8344
8345    begin
8346       --  A task or protected type derived from an interface is a tagged type.
8347       --  Such a tagged type is called a synchronized tagged type, as are
8348       --  synchronized interfaces and private extensions whose declaration
8349       --  includes the reserved word synchronized.
8350
8351       return (Is_Tagged_Type (E)
8352                 and then (Kind = E_Task_Type
8353                            or else Kind = E_Protected_Type))
8354             or else
8355              (Is_Interface (E)
8356                 and then Is_Synchronized_Interface (E))
8357             or else
8358              (Ekind (E) = E_Record_Type_With_Private
8359                 and then Nkind (Parent (E)) = N_Private_Extension_Declaration
8360                 and then (Synchronized_Present (Parent (E))
8361                            or else Is_Synchronized_Interface (Etype (E))));
8362    end Is_Synchronized_Tagged_Type;
8363
8364    -----------------
8365    -- Is_Transfer --
8366    -----------------
8367
8368    function Is_Transfer (N : Node_Id) return Boolean is
8369       Kind : constant Node_Kind := Nkind (N);
8370
8371    begin
8372       if Kind = N_Simple_Return_Statement
8373            or else
8374          Kind = N_Extended_Return_Statement
8375            or else
8376          Kind = N_Goto_Statement
8377            or else
8378          Kind = N_Raise_Statement
8379            or else
8380          Kind = N_Requeue_Statement
8381       then
8382          return True;
8383
8384       elsif (Kind = N_Exit_Statement or else Kind in N_Raise_xxx_Error)
8385         and then No (Condition (N))
8386       then
8387          return True;
8388
8389       elsif Kind = N_Procedure_Call_Statement
8390         and then Is_Entity_Name (Name (N))
8391         and then Present (Entity (Name (N)))
8392         and then No_Return (Entity (Name (N)))
8393       then
8394          return True;
8395
8396       elsif Nkind (Original_Node (N)) = N_Raise_Statement then
8397          return True;
8398
8399       else
8400          return False;
8401       end if;
8402    end Is_Transfer;
8403
8404    -------------
8405    -- Is_True --
8406    -------------
8407
8408    function Is_True (U : Uint) return Boolean is
8409    begin
8410       return (U /= 0);
8411    end Is_True;
8412
8413    -------------------------------
8414    -- Is_Universal_Numeric_Type --
8415    -------------------------------
8416
8417    function Is_Universal_Numeric_Type (T : Entity_Id) return Boolean is
8418    begin
8419       return T = Universal_Integer or else T = Universal_Real;
8420    end Is_Universal_Numeric_Type;
8421
8422    -------------------
8423    -- Is_Value_Type --
8424    -------------------
8425
8426    function Is_Value_Type (T : Entity_Id) return Boolean is
8427    begin
8428       return VM_Target = CLI_Target
8429         and then Nkind (T) in N_Has_Chars
8430         and then Chars (T) /= No_Name
8431         and then Get_Name_String (Chars (T)) = "valuetype";
8432    end Is_Value_Type;
8433
8434    ---------------------
8435    -- Is_VMS_Operator --
8436    ---------------------
8437
8438    function Is_VMS_Operator (Op : Entity_Id) return Boolean is
8439    begin
8440       --  The VMS operators are declared in a child of System that is loaded
8441       --  through pragma Extend_System. In some rare cases a program is run
8442       --  with this extension but without indicating that the target is VMS.
8443
8444       return Ekind (Op) = E_Function
8445         and then Is_Intrinsic_Subprogram (Op)
8446         and then
8447           ((Present_System_Aux
8448             and then Scope (Op) = System_Aux_Id)
8449            or else
8450            (True_VMS_Target
8451              and then Scope (Scope (Op)) = RTU_Entity (System)));
8452    end Is_VMS_Operator;
8453
8454    -----------------
8455    -- Is_Variable --
8456    -----------------
8457
8458    function Is_Variable
8459      (N                 : Node_Id;
8460       Use_Original_Node : Boolean := True) return Boolean
8461    is
8462       Orig_Node : Node_Id;
8463
8464       function In_Protected_Function (E : Entity_Id) return Boolean;
8465       --  Within a protected function, the private components of the enclosing
8466       --  protected type are constants. A function nested within a (protected)
8467       --  procedure is not itself protected.
8468
8469       function Is_Variable_Prefix (P : Node_Id) return Boolean;
8470       --  Prefixes can involve implicit dereferences, in which case we must
8471       --  test for the case of a reference of a constant access type, which can
8472       --  can never be a variable.
8473
8474       ---------------------------
8475       -- In_Protected_Function --
8476       ---------------------------
8477
8478       function In_Protected_Function (E : Entity_Id) return Boolean is
8479          Prot : constant Entity_Id := Scope (E);
8480          S    : Entity_Id;
8481
8482       begin
8483          if not Is_Protected_Type (Prot) then
8484             return False;
8485          else
8486             S := Current_Scope;
8487             while Present (S) and then S /= Prot loop
8488                if Ekind (S) = E_Function and then Scope (S) = Prot then
8489                   return True;
8490                end if;
8491
8492                S := Scope (S);
8493             end loop;
8494
8495             return False;
8496          end if;
8497       end In_Protected_Function;
8498
8499       ------------------------
8500       -- Is_Variable_Prefix --
8501       ------------------------
8502
8503       function Is_Variable_Prefix (P : Node_Id) return Boolean is
8504       begin
8505          if Is_Access_Type (Etype (P)) then
8506             return not Is_Access_Constant (Root_Type (Etype (P)));
8507
8508          --  For the case of an indexed component whose prefix has a packed
8509          --  array type, the prefix has been rewritten into a type conversion.
8510          --  Determine variable-ness from the converted expression.
8511
8512          elsif Nkind (P) = N_Type_Conversion
8513            and then not Comes_From_Source (P)
8514            and then Is_Array_Type (Etype (P))
8515            and then Is_Packed (Etype (P))
8516          then
8517             return Is_Variable (Expression (P));
8518
8519          else
8520             return Is_Variable (P);
8521          end if;
8522       end Is_Variable_Prefix;
8523
8524    --  Start of processing for Is_Variable
8525
8526    begin
8527       --  Check if we perform the test on the original node since this may be a
8528       --  test of syntactic categories which must not be disturbed by whatever
8529       --  rewriting might have occurred. For example, an aggregate, which is
8530       --  certainly NOT a variable, could be turned into a variable by
8531       --  expansion.
8532
8533       if Use_Original_Node then
8534          Orig_Node := Original_Node (N);
8535       else
8536          Orig_Node := N;
8537       end if;
8538
8539       --  Definitely OK if Assignment_OK is set. Since this is something that
8540       --  only gets set for expanded nodes, the test is on N, not Orig_Node.
8541
8542       if Nkind (N) in N_Subexpr and then Assignment_OK (N) then
8543          return True;
8544
8545       --  Normally we go to the original node, but there is one exception where
8546       --  we use the rewritten node, namely when it is an explicit dereference.
8547       --  The generated code may rewrite a prefix which is an access type with
8548       --  an explicit dereference. The dereference is a variable, even though
8549       --  the original node may not be (since it could be a constant of the
8550       --  access type).
8551
8552       --  In Ada 2005 we have a further case to consider: the prefix may be a
8553       --  function call given in prefix notation. The original node appears to
8554       --  be a selected component, but we need to examine the call.
8555
8556       elsif Nkind (N) = N_Explicit_Dereference
8557         and then Nkind (Orig_Node) /= N_Explicit_Dereference
8558         and then Present (Etype (Orig_Node))
8559         and then Is_Access_Type (Etype (Orig_Node))
8560       then
8561          --  Note that if the prefix is an explicit dereference that does not
8562          --  come from source, we must check for a rewritten function call in
8563          --  prefixed notation before other forms of rewriting, to prevent a
8564          --  compiler crash.
8565
8566          return
8567            (Nkind (Orig_Node) = N_Function_Call
8568              and then not Is_Access_Constant (Etype (Prefix (N))))
8569            or else
8570              Is_Variable_Prefix (Original_Node (Prefix (N)));
8571
8572       --  A function call is never a variable
8573
8574       elsif Nkind (N) = N_Function_Call then
8575          return False;
8576
8577       --  All remaining checks use the original node
8578
8579       elsif Is_Entity_Name (Orig_Node)
8580         and then Present (Entity (Orig_Node))
8581       then
8582          declare
8583             E : constant Entity_Id := Entity (Orig_Node);
8584             K : constant Entity_Kind := Ekind (E);
8585
8586          begin
8587             return (K = E_Variable
8588                       and then Nkind (Parent (E)) /= N_Exception_Handler)
8589               or else  (K = E_Component
8590                           and then not In_Protected_Function (E))
8591               or else  K = E_Out_Parameter
8592               or else  K = E_In_Out_Parameter
8593               or else  K = E_Generic_In_Out_Parameter
8594
8595                --  Current instance of type
8596
8597               or else (Is_Type (E) and then In_Open_Scopes (E))
8598               or else (Is_Incomplete_Or_Private_Type (E)
8599                         and then In_Open_Scopes (Full_View (E)));
8600          end;
8601
8602       else
8603          case Nkind (Orig_Node) is
8604             when N_Indexed_Component | N_Slice =>
8605                return Is_Variable_Prefix (Prefix (Orig_Node));
8606
8607             when N_Selected_Component =>
8608                return Is_Variable_Prefix (Prefix (Orig_Node))
8609                  and then Is_Variable (Selector_Name (Orig_Node));
8610
8611             --  For an explicit dereference, the type of the prefix cannot
8612             --  be an access to constant or an access to subprogram.
8613
8614             when N_Explicit_Dereference =>
8615                declare
8616                   Typ : constant Entity_Id := Etype (Prefix (Orig_Node));
8617                begin
8618                   return Is_Access_Type (Typ)
8619                     and then not Is_Access_Constant (Root_Type (Typ))
8620                     and then Ekind (Typ) /= E_Access_Subprogram_Type;
8621                end;
8622
8623             --  The type conversion is the case where we do not deal with the
8624             --  context dependent special case of an actual parameter. Thus
8625             --  the type conversion is only considered a variable for the
8626             --  purposes of this routine if the target type is tagged. However,
8627             --  a type conversion is considered to be a variable if it does not
8628             --  come from source (this deals for example with the conversions
8629             --  of expressions to their actual subtypes).
8630
8631             when N_Type_Conversion =>
8632                return Is_Variable (Expression (Orig_Node))
8633                  and then
8634                    (not Comes_From_Source (Orig_Node)
8635                       or else
8636                         (Is_Tagged_Type (Etype (Subtype_Mark (Orig_Node)))
8637                           and then
8638                          Is_Tagged_Type (Etype (Expression (Orig_Node)))));
8639
8640             --  GNAT allows an unchecked type conversion as a variable. This
8641             --  only affects the generation of internal expanded code, since
8642             --  calls to instantiations of Unchecked_Conversion are never
8643             --  considered variables (since they are function calls).
8644             --  This is also true for expression actions.
8645
8646             when N_Unchecked_Type_Conversion =>
8647                return Is_Variable (Expression (Orig_Node));
8648
8649             when others =>
8650                return False;
8651          end case;
8652       end if;
8653    end Is_Variable;
8654
8655    ---------------------------
8656    -- Is_Visibly_Controlled --
8657    ---------------------------
8658
8659    function Is_Visibly_Controlled (T : Entity_Id) return Boolean is
8660       Root : constant Entity_Id := Root_Type (T);
8661    begin
8662       return Chars (Scope (Root)) = Name_Finalization
8663         and then Chars (Scope (Scope (Root))) = Name_Ada
8664         and then Scope (Scope (Scope (Root))) = Standard_Standard;
8665    end Is_Visibly_Controlled;
8666
8667    ------------------------
8668    -- Is_Volatile_Object --
8669    ------------------------
8670
8671    function Is_Volatile_Object (N : Node_Id) return Boolean is
8672
8673       function Object_Has_Volatile_Components (N : Node_Id) return Boolean;
8674       --  Determines if given object has volatile components
8675
8676       function Is_Volatile_Prefix (N : Node_Id) return Boolean;
8677       --  If prefix is an implicit dereference, examine designated type
8678
8679       ------------------------
8680       -- Is_Volatile_Prefix --
8681       ------------------------
8682
8683       function Is_Volatile_Prefix (N : Node_Id) return Boolean is
8684          Typ  : constant Entity_Id := Etype (N);
8685
8686       begin
8687          if Is_Access_Type (Typ) then
8688             declare
8689                Dtyp : constant Entity_Id := Designated_Type (Typ);
8690
8691             begin
8692                return Is_Volatile (Dtyp)
8693                  or else Has_Volatile_Components (Dtyp);
8694             end;
8695
8696          else
8697             return Object_Has_Volatile_Components (N);
8698          end if;
8699       end Is_Volatile_Prefix;
8700
8701       ------------------------------------
8702       -- Object_Has_Volatile_Components --
8703       ------------------------------------
8704
8705       function Object_Has_Volatile_Components (N : Node_Id) return Boolean is
8706          Typ : constant Entity_Id := Etype (N);
8707
8708       begin
8709          if Is_Volatile (Typ)
8710            or else Has_Volatile_Components (Typ)
8711          then
8712             return True;
8713
8714          elsif Is_Entity_Name (N)
8715            and then (Has_Volatile_Components (Entity (N))
8716                       or else Is_Volatile (Entity (N)))
8717          then
8718             return True;
8719
8720          elsif Nkind (N) = N_Indexed_Component
8721            or else Nkind (N) = N_Selected_Component
8722          then
8723             return Is_Volatile_Prefix (Prefix (N));
8724
8725          else
8726             return False;
8727          end if;
8728       end Object_Has_Volatile_Components;
8729
8730    --  Start of processing for Is_Volatile_Object
8731
8732    begin
8733       if Is_Volatile (Etype (N))
8734         or else (Is_Entity_Name (N) and then Is_Volatile (Entity (N)))
8735       then
8736          return True;
8737
8738       elsif Nkind_In (N, N_Indexed_Component, N_Selected_Component)
8739         and then Is_Volatile_Prefix (Prefix (N))
8740       then
8741          return True;
8742
8743       elsif Nkind (N) = N_Selected_Component
8744         and then Is_Volatile (Entity (Selector_Name (N)))
8745       then
8746          return True;
8747
8748       else
8749          return False;
8750       end if;
8751    end Is_Volatile_Object;
8752
8753    ---------------------------
8754    -- Itype_Has_Declaration --
8755    ---------------------------
8756
8757    function Itype_Has_Declaration (Id : Entity_Id) return Boolean is
8758    begin
8759       pragma Assert (Is_Itype (Id));
8760       return Present (Parent (Id))
8761         and then Nkind_In (Parent (Id), N_Full_Type_Declaration,
8762                                         N_Subtype_Declaration)
8763         and then Defining_Entity (Parent (Id)) = Id;
8764    end Itype_Has_Declaration;
8765
8766    -------------------------
8767    -- Kill_Current_Values --
8768    -------------------------
8769
8770    procedure Kill_Current_Values
8771      (Ent                  : Entity_Id;
8772       Last_Assignment_Only : Boolean := False)
8773    is
8774    begin
8775       --  ??? do we have to worry about clearing cached checks?
8776
8777       if Is_Assignable (Ent) then
8778          Set_Last_Assignment (Ent, Empty);
8779       end if;
8780
8781       if Is_Object (Ent) then
8782          if not Last_Assignment_Only then
8783             Kill_Checks (Ent);
8784             Set_Current_Value (Ent, Empty);
8785
8786             if not Can_Never_Be_Null (Ent) then
8787                Set_Is_Known_Non_Null (Ent, False);
8788             end if;
8789
8790             Set_Is_Known_Null (Ent, False);
8791
8792             --  Reset Is_Known_Valid unless type is always valid, or if we have
8793             --  a loop parameter (loop parameters are always valid, since their
8794             --  bounds are defined by the bounds given in the loop header).
8795
8796             if not Is_Known_Valid (Etype (Ent))
8797               and then Ekind (Ent) /= E_Loop_Parameter
8798             then
8799                Set_Is_Known_Valid (Ent, False);
8800             end if;
8801          end if;
8802       end if;
8803    end Kill_Current_Values;
8804
8805    procedure Kill_Current_Values (Last_Assignment_Only : Boolean := False) is
8806       S : Entity_Id;
8807
8808       procedure Kill_Current_Values_For_Entity_Chain (E : Entity_Id);
8809       --  Clear current value for entity E and all entities chained to E
8810
8811       ------------------------------------------
8812       -- Kill_Current_Values_For_Entity_Chain --
8813       ------------------------------------------
8814
8815       procedure Kill_Current_Values_For_Entity_Chain (E : Entity_Id) is
8816          Ent : Entity_Id;
8817       begin
8818          Ent := E;
8819          while Present (Ent) loop
8820             Kill_Current_Values (Ent, Last_Assignment_Only);
8821             Next_Entity (Ent);
8822          end loop;
8823       end Kill_Current_Values_For_Entity_Chain;
8824
8825    --  Start of processing for Kill_Current_Values
8826
8827    begin
8828       --  Kill all saved checks, a special case of killing saved values
8829
8830       if not Last_Assignment_Only then
8831          Kill_All_Checks;
8832       end if;
8833
8834       --  Loop through relevant scopes, which includes the current scope and
8835       --  any parent scopes if the current scope is a block or a package.
8836
8837       S := Current_Scope;
8838       Scope_Loop : loop
8839
8840          --  Clear current values of all entities in current scope
8841
8842          Kill_Current_Values_For_Entity_Chain (First_Entity (S));
8843
8844          --  If scope is a package, also clear current values of all private
8845          --  entities in the scope.
8846
8847          if Is_Package_Or_Generic_Package (S)
8848            or else Is_Concurrent_Type (S)
8849          then
8850             Kill_Current_Values_For_Entity_Chain (First_Private_Entity (S));
8851          end if;
8852
8853          --  If this is a not a subprogram, deal with parents
8854
8855          if not Is_Subprogram (S) then
8856             S := Scope (S);
8857             exit Scope_Loop when S = Standard_Standard;
8858          else
8859             exit Scope_Loop;
8860          end if;
8861       end loop Scope_Loop;
8862    end Kill_Current_Values;
8863
8864    --------------------------
8865    -- Kill_Size_Check_Code --
8866    --------------------------
8867
8868    procedure Kill_Size_Check_Code (E : Entity_Id) is
8869    begin
8870       if (Ekind (E) = E_Constant or else Ekind (E) = E_Variable)
8871         and then Present (Size_Check_Code (E))
8872       then
8873          Remove (Size_Check_Code (E));
8874          Set_Size_Check_Code (E, Empty);
8875       end if;
8876    end Kill_Size_Check_Code;
8877
8878    --------------------------
8879    -- Known_To_Be_Assigned --
8880    --------------------------
8881
8882    function Known_To_Be_Assigned (N : Node_Id) return Boolean is
8883       P : constant Node_Id := Parent (N);
8884
8885    begin
8886       case Nkind (P) is
8887
8888          --  Test left side of assignment
8889
8890          when N_Assignment_Statement =>
8891             return N = Name (P);
8892
8893             --  Function call arguments are never lvalues
8894
8895          when N_Function_Call =>
8896             return False;
8897
8898          --  Positional parameter for procedure or accept call
8899
8900          when N_Procedure_Call_Statement |
8901               N_Accept_Statement
8902           =>
8903             declare
8904                Proc : Entity_Id;
8905                Form : Entity_Id;
8906                Act  : Node_Id;
8907
8908             begin
8909                Proc := Get_Subprogram_Entity (P);
8910
8911                if No (Proc) then
8912                   return False;
8913                end if;
8914
8915                --  If we are not a list member, something is strange, so
8916                --  be conservative and return False.
8917
8918                if not Is_List_Member (N) then
8919                   return False;
8920                end if;
8921
8922                --  We are going to find the right formal by stepping forward
8923                --  through the formals, as we step backwards in the actuals.
8924
8925                Form := First_Formal (Proc);
8926                Act  := N;
8927                loop
8928                   --  If no formal, something is weird, so be conservative
8929                   --  and return False.
8930
8931                   if No (Form) then
8932                      return False;
8933                   end if;
8934
8935                   Prev (Act);
8936                   exit when No (Act);
8937                   Next_Formal (Form);
8938                end loop;
8939
8940                return Ekind (Form) /= E_In_Parameter;
8941             end;
8942
8943          --  Named parameter for procedure or accept call
8944
8945          when N_Parameter_Association =>
8946             declare
8947                Proc : Entity_Id;
8948                Form : Entity_Id;
8949
8950             begin
8951                Proc := Get_Subprogram_Entity (Parent (P));
8952
8953                if No (Proc) then
8954                   return False;
8955                end if;
8956
8957                --  Loop through formals to find the one that matches
8958
8959                Form := First_Formal (Proc);
8960                loop
8961                   --  If no matching formal, that's peculiar, some kind of
8962                   --  previous error, so return False to be conservative.
8963
8964                   if No (Form) then
8965                      return False;
8966                   end if;
8967
8968                   --  Else test for match
8969
8970                   if Chars (Form) = Chars (Selector_Name (P)) then
8971                      return Ekind (Form) /= E_In_Parameter;
8972                   end if;
8973
8974                   Next_Formal (Form);
8975                end loop;
8976             end;
8977
8978          --  Test for appearing in a conversion that itself appears
8979          --  in an lvalue context, since this should be an lvalue.
8980
8981          when N_Type_Conversion =>
8982             return Known_To_Be_Assigned (P);
8983
8984          --  All other references are definitely not known to be modifications
8985
8986          when others =>
8987             return False;
8988
8989       end case;
8990    end Known_To_Be_Assigned;
8991
8992    ---------------------------
8993    -- Last_Source_Statement --
8994    ---------------------------
8995
8996    function Last_Source_Statement (HSS : Node_Id) return Node_Id is
8997       N : Node_Id;
8998
8999    begin
9000       N := Last (Statements (HSS));
9001       while Present (N) loop
9002          exit when Comes_From_Source (N);
9003          Prev (N);
9004       end loop;
9005
9006       return N;
9007    end Last_Source_Statement;
9008
9009    ----------------------------------
9010    -- Matching_Static_Array_Bounds --
9011    ----------------------------------
9012
9013    function Matching_Static_Array_Bounds
9014      (L_Typ : Node_Id;
9015       R_Typ : Node_Id) return Boolean
9016    is
9017       L_Ndims : constant Nat := Number_Dimensions (L_Typ);
9018       R_Ndims : constant Nat := Number_Dimensions (R_Typ);
9019
9020       L_Index : Node_Id;
9021       R_Index : Node_Id;
9022       L_Low   : Node_Id;
9023       L_High  : Node_Id;
9024       L_Len   : Uint;
9025       R_Low   : Node_Id;
9026       R_High  : Node_Id;
9027       R_Len   : Uint;
9028
9029    begin
9030       if L_Ndims /= R_Ndims then
9031          return False;
9032       end if;
9033
9034       --  Unconstrained types do not have static bounds
9035
9036       if not Is_Constrained (L_Typ) or else not Is_Constrained (R_Typ) then
9037          return False;
9038       end if;
9039
9040       --  First treat specially the first dimension, as the lower bound and
9041       --  length of string literals are not stored like those of arrays.
9042
9043       if Ekind (L_Typ) = E_String_Literal_Subtype then
9044          L_Low := String_Literal_Low_Bound (L_Typ);
9045          L_Len := String_Literal_Length (L_Typ);
9046       else
9047          L_Index := First_Index (L_Typ);
9048          Get_Index_Bounds (L_Index, L_Low, L_High);
9049
9050          if         Is_OK_Static_Expression (L_Low)
9051            and then Is_OK_Static_Expression (L_High)
9052          then
9053             if Expr_Value (L_High) < Expr_Value (L_Low) then
9054                L_Len := Uint_0;
9055             else
9056                L_Len := (Expr_Value (L_High) - Expr_Value (L_Low)) + 1;
9057             end if;
9058          else
9059             return False;
9060          end if;
9061       end if;
9062
9063       if Ekind (R_Typ) = E_String_Literal_Subtype then
9064          R_Low := String_Literal_Low_Bound (R_Typ);
9065          R_Len := String_Literal_Length (R_Typ);
9066       else
9067          R_Index := First_Index (R_Typ);
9068          Get_Index_Bounds (R_Index, R_Low, R_High);
9069
9070          if         Is_OK_Static_Expression (R_Low)
9071            and then Is_OK_Static_Expression (R_High)
9072          then
9073             if Expr_Value (R_High) < Expr_Value (R_Low) then
9074                R_Len := Uint_0;
9075             else
9076                R_Len := (Expr_Value (R_High) - Expr_Value (R_Low)) + 1;
9077             end if;
9078          else
9079             return False;
9080          end if;
9081       end if;
9082
9083       if         Is_OK_Static_Expression (L_Low)
9084         and then Is_OK_Static_Expression (R_Low)
9085         and then Expr_Value (L_Low) = Expr_Value (R_Low)
9086         and then L_Len = R_Len
9087       then
9088          null;
9089       else
9090          return False;
9091       end if;
9092
9093       --  Then treat all other dimensions
9094
9095       for Indx in 2 .. L_Ndims loop
9096          Next (L_Index);
9097          Next (R_Index);
9098
9099          Get_Index_Bounds (L_Index, L_Low, L_High);
9100          Get_Index_Bounds (R_Index, R_Low, R_High);
9101
9102          if         Is_OK_Static_Expression (L_Low)
9103            and then Is_OK_Static_Expression (L_High)
9104            and then Is_OK_Static_Expression (R_Low)
9105            and then Is_OK_Static_Expression (R_High)
9106            and then Expr_Value (L_Low)  = Expr_Value (R_Low)
9107            and then Expr_Value (L_High) = Expr_Value (R_High)
9108          then
9109             null;
9110          else
9111             return False;
9112          end if;
9113       end loop;
9114
9115       --  If we fall through the loop, all indexes matched
9116
9117       return True;
9118    end Matching_Static_Array_Bounds;
9119
9120    -------------------
9121    -- May_Be_Lvalue --
9122    -------------------
9123
9124    function May_Be_Lvalue (N : Node_Id) return Boolean is
9125       P : constant Node_Id := Parent (N);
9126
9127    begin
9128       case Nkind (P) is
9129
9130          --  Test left side of assignment
9131
9132          when N_Assignment_Statement =>
9133             return N = Name (P);
9134
9135          --  Test prefix of component or attribute. Note that the prefix of an
9136          --  explicit or implicit dereference cannot be an l-value.
9137
9138          when N_Attribute_Reference =>
9139             return N = Prefix (P)
9140               and then Name_Implies_Lvalue_Prefix (Attribute_Name (P));
9141
9142          --  For an expanded name, the name is an lvalue if the expanded name
9143          --  is an lvalue, but the prefix is never an lvalue, since it is just
9144          --  the scope where the name is found.
9145
9146          when N_Expanded_Name =>
9147             if N = Prefix (P) then
9148                return May_Be_Lvalue (P);
9149             else
9150                return False;
9151             end if;
9152
9153          --  For a selected component A.B, A is certainly an lvalue if A.B is.
9154          --  B is a little interesting, if we have A.B := 3, there is some
9155          --  discussion as to whether B is an lvalue or not, we choose to say
9156          --  it is. Note however that A is not an lvalue if it is of an access
9157          --  type since this is an implicit dereference.
9158
9159          when N_Selected_Component =>
9160             if N = Prefix (P)
9161               and then Present (Etype (N))
9162               and then Is_Access_Type (Etype (N))
9163             then
9164                return False;
9165             else
9166                return May_Be_Lvalue (P);
9167             end if;
9168
9169          --  For an indexed component or slice, the index or slice bounds is
9170          --  never an lvalue. The prefix is an lvalue if the indexed component
9171          --  or slice is an lvalue, except if it is an access type, where we
9172          --  have an implicit dereference.
9173
9174          when N_Indexed_Component | N_Slice =>
9175             if N /= Prefix (P)
9176               or else (Present (Etype (N)) and then Is_Access_Type (Etype (N)))
9177             then
9178                return False;
9179             else
9180                return May_Be_Lvalue (P);
9181             end if;
9182
9183          --  Prefix of a reference is an lvalue if the reference is an lvalue
9184
9185          when N_Reference =>
9186             return May_Be_Lvalue (P);
9187
9188          --  Prefix of explicit dereference is never an lvalue
9189
9190          when N_Explicit_Dereference =>
9191             return False;
9192
9193          --  Positional parameter for subprogram, entry, or accept call.
9194          --  In older versions of Ada function call arguments are never
9195          --  lvalues. In Ada 2012 functions can have in-out parameters.
9196
9197          when N_Function_Call            |
9198               N_Procedure_Call_Statement |
9199               N_Entry_Call_Statement     |
9200               N_Accept_Statement
9201          =>
9202             if Nkind (P) = N_Function_Call and then Ada_Version < Ada_2012 then
9203                return False;
9204             end if;
9205
9206             --  The following mechanism is clumsy and fragile. A single flag
9207             --  set in Resolve_Actuals would be preferable ???
9208
9209             declare
9210                Proc : Entity_Id;
9211                Form : Entity_Id;
9212                Act  : Node_Id;
9213
9214             begin
9215                Proc := Get_Subprogram_Entity (P);
9216
9217                if No (Proc) then
9218                   return True;
9219                end if;
9220
9221                --  If we are not a list member, something is strange, so be
9222                --  conservative and return True.
9223
9224                if not Is_List_Member (N) then
9225                   return True;
9226                end if;
9227
9228                --  We are going to find the right formal by stepping forward
9229                --  through the formals, as we step backwards in the actuals.
9230
9231                Form := First_Formal (Proc);
9232                Act  := N;
9233                loop
9234                   --  If no formal, something is weird, so be conservative and
9235                   --  return True.
9236
9237                   if No (Form) then
9238                      return True;
9239                   end if;
9240
9241                   Prev (Act);
9242                   exit when No (Act);
9243                   Next_Formal (Form);
9244                end loop;
9245
9246                return Ekind (Form) /= E_In_Parameter;
9247             end;
9248
9249          --  Named parameter for procedure or accept call
9250
9251          when N_Parameter_Association =>
9252             declare
9253                Proc : Entity_Id;
9254                Form : Entity_Id;
9255
9256             begin
9257                Proc := Get_Subprogram_Entity (Parent (P));
9258
9259                if No (Proc) then
9260                   return True;
9261                end if;
9262
9263                --  Loop through formals to find the one that matches
9264
9265                Form := First_Formal (Proc);
9266                loop
9267                   --  If no matching formal, that's peculiar, some kind of
9268                   --  previous error, so return True to be conservative.
9269
9270                   if No (Form) then
9271                      return True;
9272                   end if;
9273
9274                   --  Else test for match
9275
9276                   if Chars (Form) = Chars (Selector_Name (P)) then
9277                      return Ekind (Form) /= E_In_Parameter;
9278                   end if;
9279
9280                   Next_Formal (Form);
9281                end loop;
9282             end;
9283
9284          --  Test for appearing in a conversion that itself appears in an
9285          --  lvalue context, since this should be an lvalue.
9286
9287          when N_Type_Conversion =>
9288             return May_Be_Lvalue (P);
9289
9290          --  Test for appearance in object renaming declaration
9291
9292          when N_Object_Renaming_Declaration =>
9293             return True;
9294
9295          --  All other references are definitely not lvalues
9296
9297          when others =>
9298             return False;
9299
9300       end case;
9301    end May_Be_Lvalue;
9302
9303    -----------------------
9304    -- Mark_Coextensions --
9305    -----------------------
9306
9307    procedure Mark_Coextensions (Context_Nod : Node_Id; Root_Nod : Node_Id) is
9308       Is_Dynamic : Boolean;
9309       --  Indicates whether the context causes nested coextensions to be
9310       --  dynamic or static
9311
9312       function Mark_Allocator (N : Node_Id) return Traverse_Result;
9313       --  Recognize an allocator node and label it as a dynamic coextension
9314
9315       --------------------
9316       -- Mark_Allocator --
9317       --------------------
9318
9319       function Mark_Allocator (N : Node_Id) return Traverse_Result is
9320       begin
9321          if Nkind (N) = N_Allocator then
9322             if Is_Dynamic then
9323                Set_Is_Dynamic_Coextension (N);
9324
9325             --  If the allocator expression is potentially dynamic, it may
9326             --  be expanded out of order and require dynamic allocation
9327             --  anyway, so we treat the coextension itself as dynamic.
9328             --  Potential optimization ???
9329
9330             elsif Nkind (Expression (N)) = N_Qualified_Expression
9331               and then Nkind (Expression (Expression (N))) = N_Op_Concat
9332             then
9333                Set_Is_Dynamic_Coextension (N);
9334             else
9335                Set_Is_Static_Coextension (N);
9336             end if;
9337          end if;
9338
9339          return OK;
9340       end Mark_Allocator;
9341
9342       procedure Mark_Allocators is new Traverse_Proc (Mark_Allocator);
9343
9344    --  Start of processing Mark_Coextensions
9345
9346    begin
9347       case Nkind (Context_Nod) is
9348
9349          --  Comment here ???
9350
9351          when N_Assignment_Statement    =>
9352             Is_Dynamic := Nkind (Expression (Context_Nod)) = N_Allocator;
9353
9354          --  An allocator that is a component of a returned aggregate
9355          --  must be dynamic.
9356
9357          when N_Simple_Return_Statement =>
9358             declare
9359                Expr : constant Node_Id := Expression (Context_Nod);
9360             begin
9361                Is_Dynamic :=
9362                  Nkind (Expr) = N_Allocator
9363                    or else
9364                      (Nkind (Expr) = N_Qualified_Expression
9365                        and then Nkind (Expression (Expr)) = N_Aggregate);
9366             end;
9367
9368          --  An alloctor within an object declaration in an extended return
9369          --  statement is of necessity dynamic.
9370
9371          when N_Object_Declaration =>
9372             Is_Dynamic := Nkind (Root_Nod) = N_Allocator
9373               or else
9374                 Nkind (Parent (Context_Nod)) = N_Extended_Return_Statement;
9375
9376          --  This routine should not be called for constructs which may not
9377          --  contain coextensions.
9378
9379          when others =>
9380             raise Program_Error;
9381       end case;
9382
9383       Mark_Allocators (Root_Nod);
9384    end Mark_Coextensions;
9385
9386    ----------------------
9387    -- Needs_One_Actual --
9388    ----------------------
9389
9390    function Needs_One_Actual (E : Entity_Id) return Boolean is
9391       Formal : Entity_Id;
9392
9393    begin
9394       --  Ada 2005 or later, and formals present
9395
9396       if Ada_Version >= Ada_2005 and then Present (First_Formal (E)) then
9397          Formal := Next_Formal (First_Formal (E));
9398          while Present (Formal) loop
9399             if No (Default_Value (Formal)) then
9400                return False;
9401             end if;
9402
9403             Next_Formal (Formal);
9404          end loop;
9405
9406          return True;
9407
9408       --  Ada 83/95 or no formals
9409
9410       else
9411          return False;
9412       end if;
9413    end Needs_One_Actual;
9414
9415    ------------------------
9416    -- New_Copy_List_Tree --
9417    ------------------------
9418
9419    function New_Copy_List_Tree (List : List_Id) return List_Id is
9420       NL : List_Id;
9421       E  : Node_Id;
9422
9423    begin
9424       if List = No_List then
9425          return No_List;
9426
9427       else
9428          NL := New_List;
9429          E := First (List);
9430
9431          while Present (E) loop
9432             Append (New_Copy_Tree (E), NL);
9433             E := Next (E);
9434          end loop;
9435
9436          return NL;
9437       end if;
9438    end New_Copy_List_Tree;
9439
9440    -------------------
9441    -- New_Copy_Tree --
9442    -------------------
9443
9444    use Atree.Unchecked_Access;
9445    use Atree_Private_Part;
9446
9447    --  Our approach here requires a two pass traversal of the tree. The
9448    --  first pass visits all nodes that eventually will be copied looking
9449    --  for defining Itypes. If any defining Itypes are found, then they are
9450    --  copied, and an entry is added to the replacement map. In the second
9451    --  phase, the tree is copied, using the replacement map to replace any
9452    --  Itype references within the copied tree.
9453
9454    --  The following hash tables are used if the Map supplied has more
9455    --  than hash threshold entries to speed up access to the map. If
9456    --  there are fewer entries, then the map is searched sequentially
9457    --  (because setting up a hash table for only a few entries takes
9458    --  more time than it saves.
9459
9460    function New_Copy_Hash (E : Entity_Id) return NCT_Header_Num;
9461    --  Hash function used for hash operations
9462
9463    -------------------
9464    -- New_Copy_Hash --
9465    -------------------
9466
9467    function New_Copy_Hash (E : Entity_Id) return NCT_Header_Num is
9468    begin
9469       return Nat (E) mod (NCT_Header_Num'Last + 1);
9470    end New_Copy_Hash;
9471
9472    ---------------
9473    -- NCT_Assoc --
9474    ---------------
9475
9476    --  The hash table NCT_Assoc associates old entities in the table
9477    --  with their corresponding new entities (i.e. the pairs of entries
9478    --  presented in the original Map argument are Key-Element pairs).
9479
9480    package NCT_Assoc is new Simple_HTable (
9481      Header_Num => NCT_Header_Num,
9482      Element    => Entity_Id,
9483      No_Element => Empty,
9484      Key        => Entity_Id,
9485      Hash       => New_Copy_Hash,
9486      Equal      => Types."=");
9487
9488    ---------------------
9489    -- NCT_Itype_Assoc --
9490    ---------------------
9491
9492    --  The hash table NCT_Itype_Assoc contains entries only for those
9493    --  old nodes which have a non-empty Associated_Node_For_Itype set.
9494    --  The key is the associated node, and the element is the new node
9495    --  itself (NOT the associated node for the new node).
9496
9497    package NCT_Itype_Assoc is new Simple_HTable (
9498      Header_Num => NCT_Header_Num,
9499      Element    => Entity_Id,
9500      No_Element => Empty,
9501      Key        => Entity_Id,
9502      Hash       => New_Copy_Hash,
9503      Equal      => Types."=");
9504
9505    --  Start of processing for New_Copy_Tree function
9506
9507    function New_Copy_Tree
9508      (Source    : Node_Id;
9509       Map       : Elist_Id := No_Elist;
9510       New_Sloc  : Source_Ptr := No_Location;
9511       New_Scope : Entity_Id := Empty) return Node_Id
9512    is
9513       Actual_Map : Elist_Id := Map;
9514       --  This is the actual map for the copy. It is initialized with the
9515       --  given elements, and then enlarged as required for Itypes that are
9516       --  copied during the first phase of the copy operation. The visit
9517       --  procedures add elements to this map as Itypes are encountered.
9518       --  The reason we cannot use Map directly, is that it may well be
9519       --  (and normally is) initialized to No_Elist, and if we have mapped
9520       --  entities, we have to reset it to point to a real Elist.
9521
9522       function Assoc (N : Node_Or_Entity_Id) return Node_Id;
9523       --  Called during second phase to map entities into their corresponding
9524       --  copies using Actual_Map. If the argument is not an entity, or is not
9525       --  in Actual_Map, then it is returned unchanged.
9526
9527       procedure Build_NCT_Hash_Tables;
9528       --  Builds hash tables (number of elements >= threshold value)
9529
9530       function Copy_Elist_With_Replacement
9531         (Old_Elist : Elist_Id) return Elist_Id;
9532       --  Called during second phase to copy element list doing replacements
9533
9534       procedure Copy_Itype_With_Replacement (New_Itype : Entity_Id);
9535       --  Called during the second phase to process a copied Itype. The actual
9536       --  copy happened during the first phase (so that we could make the entry
9537       --  in the mapping), but we still have to deal with the descendents of
9538       --  the copied Itype and copy them where necessary.
9539
9540       function Copy_List_With_Replacement (Old_List : List_Id) return List_Id;
9541       --  Called during second phase to copy list doing replacements
9542
9543       function Copy_Node_With_Replacement (Old_Node : Node_Id) return Node_Id;
9544       --  Called during second phase to copy node doing replacements
9545
9546       procedure Visit_Elist (E : Elist_Id);
9547       --  Called during first phase to visit all elements of an Elist
9548
9549       procedure Visit_Field (F : Union_Id; N : Node_Id);
9550       --  Visit a single field, recursing to call Visit_Node or Visit_List
9551       --  if the field is a syntactic descendent of the current node (i.e.
9552       --  its parent is Node N).
9553
9554       procedure Visit_Itype (Old_Itype : Entity_Id);
9555       --  Called during first phase to visit subsidiary fields of a defining
9556       --  Itype, and also create a copy and make an entry in the replacement
9557       --  map for the new copy.
9558
9559       procedure Visit_List (L : List_Id);
9560       --  Called during first phase to visit all elements of a List
9561
9562       procedure Visit_Node (N : Node_Or_Entity_Id);
9563       --  Called during first phase to visit a node and all its subtrees
9564
9565       -----------
9566       -- Assoc --
9567       -----------
9568
9569       function Assoc (N : Node_Or_Entity_Id) return Node_Id is
9570          E   : Elmt_Id;
9571          Ent : Entity_Id;
9572
9573       begin
9574          if not Has_Extension (N) or else No (Actual_Map) then
9575             return N;
9576
9577          elsif NCT_Hash_Tables_Used then
9578             Ent := NCT_Assoc.Get (Entity_Id (N));
9579
9580             if Present (Ent) then
9581                return Ent;
9582             else
9583                return N;
9584             end if;
9585
9586          --  No hash table used, do serial search
9587
9588          else
9589             E := First_Elmt (Actual_Map);
9590             while Present (E) loop
9591                if Node (E) = N then
9592                   return Node (Next_Elmt (E));
9593                else
9594                   E := Next_Elmt (Next_Elmt (E));
9595                end if;
9596             end loop;
9597          end if;
9598
9599          return N;
9600       end Assoc;
9601
9602       ---------------------------
9603       -- Build_NCT_Hash_Tables --
9604       ---------------------------
9605
9606       procedure Build_NCT_Hash_Tables is
9607          Elmt : Elmt_Id;
9608          Ent  : Entity_Id;
9609       begin
9610          if NCT_Hash_Table_Setup then
9611             NCT_Assoc.Reset;
9612             NCT_Itype_Assoc.Reset;
9613          end if;
9614
9615          Elmt := First_Elmt (Actual_Map);
9616          while Present (Elmt) loop
9617             Ent := Node (Elmt);
9618
9619             --  Get new entity, and associate old and new
9620
9621             Next_Elmt (Elmt);
9622             NCT_Assoc.Set (Ent, Node (Elmt));
9623
9624             if Is_Type (Ent) then
9625                declare
9626                   Anode : constant Entity_Id :=
9627                             Associated_Node_For_Itype (Ent);
9628
9629                begin
9630                   if Present (Anode) then
9631
9632                      --  Enter a link between the associated node of the
9633                      --  old Itype and the new Itype, for updating later
9634                      --  when node is copied.
9635
9636                      NCT_Itype_Assoc.Set (Anode, Node (Elmt));
9637                   end if;
9638                end;
9639             end if;
9640
9641             Next_Elmt (Elmt);
9642          end loop;
9643
9644          NCT_Hash_Tables_Used := True;
9645          NCT_Hash_Table_Setup := True;
9646       end Build_NCT_Hash_Tables;
9647
9648       ---------------------------------
9649       -- Copy_Elist_With_Replacement --
9650       ---------------------------------
9651
9652       function Copy_Elist_With_Replacement
9653         (Old_Elist : Elist_Id) return Elist_Id
9654       is
9655          M         : Elmt_Id;
9656          New_Elist : Elist_Id;
9657
9658       begin
9659          if No (Old_Elist) then
9660             return No_Elist;
9661
9662          else
9663             New_Elist := New_Elmt_List;
9664
9665             M := First_Elmt (Old_Elist);
9666             while Present (M) loop
9667                Append_Elmt (Copy_Node_With_Replacement (Node (M)), New_Elist);
9668                Next_Elmt (M);
9669             end loop;
9670          end if;
9671
9672          return New_Elist;
9673       end Copy_Elist_With_Replacement;
9674
9675       ---------------------------------
9676       -- Copy_Itype_With_Replacement --
9677       ---------------------------------
9678
9679       --  This routine exactly parallels its phase one analog Visit_Itype,
9680
9681       procedure Copy_Itype_With_Replacement (New_Itype : Entity_Id) is
9682       begin
9683          --  Translate Next_Entity, Scope and Etype fields, in case they
9684          --  reference entities that have been mapped into copies.
9685
9686          Set_Next_Entity (New_Itype, Assoc (Next_Entity (New_Itype)));
9687          Set_Etype       (New_Itype, Assoc (Etype       (New_Itype)));
9688
9689          if Present (New_Scope) then
9690             Set_Scope    (New_Itype, New_Scope);
9691          else
9692             Set_Scope    (New_Itype, Assoc (Scope       (New_Itype)));
9693          end if;
9694
9695          --  Copy referenced fields
9696
9697          if Is_Discrete_Type (New_Itype) then
9698             Set_Scalar_Range (New_Itype,
9699               Copy_Node_With_Replacement (Scalar_Range (New_Itype)));
9700
9701          elsif Has_Discriminants (Base_Type (New_Itype)) then
9702             Set_Discriminant_Constraint (New_Itype,
9703               Copy_Elist_With_Replacement
9704                 (Discriminant_Constraint (New_Itype)));
9705
9706          elsif Is_Array_Type (New_Itype) then
9707             if Present (First_Index (New_Itype)) then
9708                Set_First_Index (New_Itype,
9709                  First (Copy_List_With_Replacement
9710                          (List_Containing (First_Index (New_Itype)))));
9711             end if;
9712
9713             if Is_Packed (New_Itype) then
9714                Set_Packed_Array_Type (New_Itype,
9715                  Copy_Node_With_Replacement
9716                    (Packed_Array_Type (New_Itype)));
9717             end if;
9718          end if;
9719       end Copy_Itype_With_Replacement;
9720
9721       --------------------------------
9722       -- Copy_List_With_Replacement --
9723       --------------------------------
9724
9725       function Copy_List_With_Replacement
9726         (Old_List : List_Id) return List_Id
9727       is
9728          New_List : List_Id;
9729          E        : Node_Id;
9730
9731       begin
9732          if Old_List = No_List then
9733             return No_List;
9734
9735          else
9736             New_List := Empty_List;
9737
9738             E := First (Old_List);
9739             while Present (E) loop
9740                Append (Copy_Node_With_Replacement (E), New_List);
9741                Next (E);
9742             end loop;
9743
9744             return New_List;
9745          end if;
9746       end Copy_List_With_Replacement;
9747
9748       --------------------------------
9749       -- Copy_Node_With_Replacement --
9750       --------------------------------
9751
9752       function Copy_Node_With_Replacement
9753         (Old_Node : Node_Id) return Node_Id
9754       is
9755          New_Node : Node_Id;
9756
9757          procedure Adjust_Named_Associations
9758            (Old_Node : Node_Id;
9759             New_Node : Node_Id);
9760          --  If a call node has named associations, these are chained through
9761          --  the First_Named_Actual, Next_Named_Actual links. These must be
9762          --  propagated separately to the new parameter list, because these
9763          --  are not syntactic fields.
9764
9765          function Copy_Field_With_Replacement
9766            (Field : Union_Id) return Union_Id;
9767          --  Given Field, which is a field of Old_Node, return a copy of it
9768          --  if it is a syntactic field (i.e. its parent is Node), setting
9769          --  the parent of the copy to poit to New_Node. Otherwise returns
9770          --  the field (possibly mapped if it is an entity).
9771
9772          -------------------------------
9773          -- Adjust_Named_Associations --
9774          -------------------------------
9775
9776          procedure Adjust_Named_Associations
9777            (Old_Node : Node_Id;
9778             New_Node : Node_Id)
9779          is
9780             Old_E : Node_Id;
9781             New_E : Node_Id;
9782
9783             Old_Next : Node_Id;
9784             New_Next : Node_Id;
9785
9786          begin
9787             Old_E := First (Parameter_Associations (Old_Node));
9788             New_E := First (Parameter_Associations (New_Node));
9789             while Present (Old_E) loop
9790                if Nkind (Old_E) = N_Parameter_Association
9791                  and then Present (Next_Named_Actual (Old_E))
9792                then
9793                   if First_Named_Actual (Old_Node)
9794                     =  Explicit_Actual_Parameter (Old_E)
9795                   then
9796                      Set_First_Named_Actual
9797                        (New_Node, Explicit_Actual_Parameter (New_E));
9798                   end if;
9799
9800                   --  Now scan parameter list from the beginning,to locate
9801                   --  next named actual, which can be out of order.
9802
9803                   Old_Next := First (Parameter_Associations (Old_Node));
9804                   New_Next := First (Parameter_Associations (New_Node));
9805
9806                   while Nkind (Old_Next) /= N_Parameter_Association
9807                     or else  Explicit_Actual_Parameter (Old_Next)
9808                       /= Next_Named_Actual (Old_E)
9809                   loop
9810                      Next (Old_Next);
9811                      Next (New_Next);
9812                   end loop;
9813
9814                   Set_Next_Named_Actual
9815                     (New_E, Explicit_Actual_Parameter (New_Next));
9816                end if;
9817
9818                Next (Old_E);
9819                Next (New_E);
9820             end loop;
9821          end Adjust_Named_Associations;
9822
9823          ---------------------------------
9824          -- Copy_Field_With_Replacement --
9825          ---------------------------------
9826
9827          function Copy_Field_With_Replacement
9828            (Field : Union_Id) return Union_Id
9829          is
9830          begin
9831             if Field = Union_Id (Empty) then
9832                return Field;
9833
9834             elsif Field in Node_Range then
9835                declare
9836                   Old_N : constant Node_Id := Node_Id (Field);
9837                   New_N : Node_Id;
9838
9839                begin
9840                   --  If syntactic field, as indicated by the parent pointer
9841                   --  being set, then copy the referenced node recursively.
9842
9843                   if Parent (Old_N) = Old_Node then
9844                      New_N := Copy_Node_With_Replacement (Old_N);
9845
9846                      if New_N /= Old_N then
9847                         Set_Parent (New_N, New_Node);
9848                      end if;
9849
9850                   --  For semantic fields, update possible entity reference
9851                   --  from the replacement map.
9852
9853                   else
9854                      New_N := Assoc (Old_N);
9855                   end if;
9856
9857                   return Union_Id (New_N);
9858                end;
9859
9860             elsif Field in List_Range then
9861                declare
9862                   Old_L : constant List_Id := List_Id (Field);
9863                   New_L : List_Id;
9864
9865                begin
9866                   --  If syntactic field, as indicated by the parent pointer,
9867                   --  then recursively copy the entire referenced list.
9868
9869                   if Parent (Old_L) = Old_Node then
9870                      New_L := Copy_List_With_Replacement (Old_L);
9871                      Set_Parent (New_L, New_Node);
9872
9873                   --  For semantic list, just returned unchanged
9874
9875                   else
9876                      New_L := Old_L;
9877                   end if;
9878
9879                   return Union_Id (New_L);
9880                end;
9881
9882             --  Anything other than a list or a node is returned unchanged
9883
9884             else
9885                return Field;
9886             end if;
9887          end Copy_Field_With_Replacement;
9888
9889       --  Start of processing for Copy_Node_With_Replacement
9890
9891       begin
9892          if Old_Node <= Empty_Or_Error then
9893             return Old_Node;
9894
9895          elsif Has_Extension (Old_Node) then
9896             return Assoc (Old_Node);
9897
9898          else
9899             New_Node := New_Copy (Old_Node);
9900
9901             --  If the node we are copying is the associated node of a
9902             --  previously copied Itype, then adjust the associated node
9903             --  of the copy of that Itype accordingly.
9904
9905             if Present (Actual_Map) then
9906                declare
9907                   E   : Elmt_Id;
9908                   Ent : Entity_Id;
9909
9910                begin
9911                   --  Case of hash table used
9912
9913                   if NCT_Hash_Tables_Used then
9914                      Ent := NCT_Itype_Assoc.Get (Old_Node);
9915
9916                      if Present (Ent) then
9917                         Set_Associated_Node_For_Itype (Ent, New_Node);
9918                      end if;
9919
9920                   --  Case of no hash table used
9921
9922                   else
9923                      E := First_Elmt (Actual_Map);
9924                      while Present (E) loop
9925                         if Is_Itype (Node (E))
9926                           and then
9927                             Old_Node = Associated_Node_For_Itype (Node (E))
9928                         then
9929                            Set_Associated_Node_For_Itype
9930                              (Node (Next_Elmt (E)), New_Node);
9931                         end if;
9932
9933                         E := Next_Elmt (Next_Elmt (E));
9934                      end loop;
9935                   end if;
9936                end;
9937             end if;
9938
9939             --  Recursively copy descendents
9940
9941             Set_Field1
9942               (New_Node, Copy_Field_With_Replacement (Field1 (New_Node)));
9943             Set_Field2
9944               (New_Node, Copy_Field_With_Replacement (Field2 (New_Node)));
9945             Set_Field3
9946               (New_Node, Copy_Field_With_Replacement (Field3 (New_Node)));
9947             Set_Field4
9948               (New_Node, Copy_Field_With_Replacement (Field4 (New_Node)));
9949             Set_Field5
9950               (New_Node, Copy_Field_With_Replacement (Field5 (New_Node)));
9951
9952             --  Adjust Sloc of new node if necessary
9953
9954             if New_Sloc /= No_Location then
9955                Set_Sloc (New_Node, New_Sloc);
9956
9957                --  If we adjust the Sloc, then we are essentially making
9958                --  a completely new node, so the Comes_From_Source flag
9959                --  should be reset to the proper default value.
9960
9961                Nodes.Table (New_Node).Comes_From_Source :=
9962                  Default_Node.Comes_From_Source;
9963             end if;
9964
9965             --  If the node is call and has named associations,
9966             --  set the corresponding links in the copy.
9967
9968             if (Nkind (Old_Node) = N_Function_Call
9969                  or else Nkind (Old_Node) = N_Entry_Call_Statement
9970                  or else
9971                    Nkind (Old_Node) = N_Procedure_Call_Statement)
9972               and then Present (First_Named_Actual (Old_Node))
9973             then
9974                Adjust_Named_Associations (Old_Node, New_Node);
9975             end if;
9976
9977             --  Reset First_Real_Statement for Handled_Sequence_Of_Statements.
9978             --  The replacement mechanism applies to entities, and is not used
9979             --  here. Eventually we may need a more general graph-copying
9980             --  routine. For now, do a sequential search to find desired node.
9981
9982             if Nkind (Old_Node) = N_Handled_Sequence_Of_Statements
9983               and then Present (First_Real_Statement (Old_Node))
9984             then
9985                declare
9986                   Old_F  : constant Node_Id := First_Real_Statement (Old_Node);
9987                   N1, N2 : Node_Id;
9988
9989                begin
9990                   N1 := First (Statements (Old_Node));
9991                   N2 := First (Statements (New_Node));
9992
9993                   while N1 /= Old_F loop
9994                      Next (N1);
9995                      Next (N2);
9996                   end loop;
9997
9998                   Set_First_Real_Statement (New_Node, N2);
9999                end;
10000             end if;
10001          end if;
10002
10003          --  All done, return copied node
10004
10005          return New_Node;
10006       end Copy_Node_With_Replacement;
10007
10008       -----------------
10009       -- Visit_Elist --
10010       -----------------
10011
10012       procedure Visit_Elist (E : Elist_Id) is
10013          Elmt : Elmt_Id;
10014       begin
10015          if Present (E) then
10016             Elmt := First_Elmt (E);
10017
10018             while Elmt /= No_Elmt loop
10019                Visit_Node (Node (Elmt));
10020                Next_Elmt (Elmt);
10021             end loop;
10022          end if;
10023       end Visit_Elist;
10024
10025       -----------------
10026       -- Visit_Field --
10027       -----------------
10028
10029       procedure Visit_Field (F : Union_Id; N : Node_Id) is
10030       begin
10031          if F = Union_Id (Empty) then
10032             return;
10033
10034          elsif F in Node_Range then
10035
10036             --  Copy node if it is syntactic, i.e. its parent pointer is
10037             --  set to point to the field that referenced it (certain
10038             --  Itypes will also meet this criterion, which is fine, since
10039             --  these are clearly Itypes that do need to be copied, since
10040             --  we are copying their parent.)
10041
10042             if Parent (Node_Id (F)) = N then
10043                Visit_Node (Node_Id (F));
10044                return;
10045
10046             --  Another case, if we are pointing to an Itype, then we want
10047             --  to copy it if its associated node is somewhere in the tree
10048             --  being copied.
10049
10050             --  Note: the exclusion of self-referential copies is just an
10051             --  optimization, since the search of the already copied list
10052             --  would catch it, but it is a common case (Etype pointing
10053             --  to itself for an Itype that is a base type).
10054
10055             elsif Has_Extension (Node_Id (F))
10056               and then Is_Itype (Entity_Id (F))
10057               and then Node_Id (F) /= N
10058             then
10059                declare
10060                   P : Node_Id;
10061
10062                begin
10063                   P := Associated_Node_For_Itype (Node_Id (F));
10064                   while Present (P) loop
10065                      if P = Source then
10066                         Visit_Node (Node_Id (F));
10067                         return;
10068                      else
10069                         P := Parent (P);
10070                      end if;
10071                   end loop;
10072
10073                   --  An Itype whose parent is not being copied definitely
10074                   --  should NOT be copied, since it does not belong in any
10075                   --  sense to the copied subtree.
10076
10077                   return;
10078                end;
10079             end if;
10080
10081          elsif F in List_Range
10082            and then Parent (List_Id (F)) = N
10083          then
10084             Visit_List (List_Id (F));
10085             return;
10086          end if;
10087       end Visit_Field;
10088
10089       -----------------
10090       -- Visit_Itype --
10091       -----------------
10092
10093       procedure Visit_Itype (Old_Itype : Entity_Id) is
10094          New_Itype : Entity_Id;
10095          E         : Elmt_Id;
10096          Ent       : Entity_Id;
10097
10098       begin
10099          --  Itypes that describe the designated type of access to subprograms
10100          --  have the structure of subprogram declarations, with signatures,
10101          --  etc. Either we duplicate the signatures completely, or choose to
10102          --  share such itypes, which is fine because their elaboration will
10103          --  have no side effects.
10104
10105          if Ekind (Old_Itype) = E_Subprogram_Type then
10106             return;
10107          end if;
10108
10109          New_Itype := New_Copy (Old_Itype);
10110
10111          --  The new Itype has all the attributes of the old one, and
10112          --  we just copy the contents of the entity. However, the back-end
10113          --  needs different names for debugging purposes, so we create a
10114          --  new internal name for it in all cases.
10115
10116          Set_Chars (New_Itype, New_Internal_Name ('T'));
10117
10118          --  If our associated node is an entity that has already been copied,
10119          --  then set the associated node of the copy to point to the right
10120          --  copy. If we have copied an Itype that is itself the associated
10121          --  node of some previously copied Itype, then we set the right
10122          --  pointer in the other direction.
10123
10124          if Present (Actual_Map) then
10125
10126             --  Case of hash tables used
10127
10128             if NCT_Hash_Tables_Used then
10129
10130                Ent := NCT_Assoc.Get (Associated_Node_For_Itype (Old_Itype));
10131
10132                if Present (Ent) then
10133                   Set_Associated_Node_For_Itype (New_Itype, Ent);
10134                end if;
10135
10136                Ent := NCT_Itype_Assoc.Get (Old_Itype);
10137                if Present (Ent) then
10138                   Set_Associated_Node_For_Itype (Ent, New_Itype);
10139
10140                --  If the hash table has no association for this Itype and
10141                --  its associated node, enter one now.
10142
10143                else
10144                   NCT_Itype_Assoc.Set
10145                     (Associated_Node_For_Itype (Old_Itype), New_Itype);
10146                end if;
10147
10148             --  Case of hash tables not used
10149
10150             else
10151                E := First_Elmt (Actual_Map);
10152                while Present (E) loop
10153                   if Associated_Node_For_Itype (Old_Itype) = Node (E) then
10154                      Set_Associated_Node_For_Itype
10155                        (New_Itype, Node (Next_Elmt (E)));
10156                   end if;
10157
10158                   if Is_Type (Node (E))
10159                     and then
10160                       Old_Itype = Associated_Node_For_Itype (Node (E))
10161                   then
10162                      Set_Associated_Node_For_Itype
10163                        (Node (Next_Elmt (E)), New_Itype);
10164                   end if;
10165
10166                   E := Next_Elmt (Next_Elmt (E));
10167                end loop;
10168             end if;
10169          end if;
10170
10171          if Present (Freeze_Node (New_Itype)) then
10172             Set_Is_Frozen (New_Itype, False);
10173             Set_Freeze_Node (New_Itype, Empty);
10174          end if;
10175
10176          --  Add new association to map
10177
10178          if No (Actual_Map) then
10179             Actual_Map := New_Elmt_List;
10180          end if;
10181
10182          Append_Elmt (Old_Itype, Actual_Map);
10183          Append_Elmt (New_Itype, Actual_Map);
10184
10185          if NCT_Hash_Tables_Used then
10186             NCT_Assoc.Set (Old_Itype, New_Itype);
10187
10188          else
10189             NCT_Table_Entries := NCT_Table_Entries + 1;
10190
10191             if NCT_Table_Entries > NCT_Hash_Threshold then
10192                Build_NCT_Hash_Tables;
10193             end if;
10194          end if;
10195
10196          --  If a record subtype is simply copied, the entity list will be
10197          --  shared. Thus cloned_Subtype must be set to indicate the sharing.
10198
10199          if Ekind_In (Old_Itype, E_Record_Subtype, E_Class_Wide_Subtype) then
10200             Set_Cloned_Subtype (New_Itype, Old_Itype);
10201          end if;
10202
10203          --  Visit descendents that eventually get copied
10204
10205          Visit_Field (Union_Id (Etype (Old_Itype)), Old_Itype);
10206
10207          if Is_Discrete_Type (Old_Itype) then
10208             Visit_Field (Union_Id (Scalar_Range (Old_Itype)), Old_Itype);
10209
10210          elsif Has_Discriminants (Base_Type (Old_Itype)) then
10211             --  ??? This should involve call to Visit_Field
10212             Visit_Elist (Discriminant_Constraint (Old_Itype));
10213
10214          elsif Is_Array_Type (Old_Itype) then
10215             if Present (First_Index (Old_Itype)) then
10216                Visit_Field (Union_Id (List_Containing
10217                                 (First_Index (Old_Itype))),
10218                             Old_Itype);
10219             end if;
10220
10221             if Is_Packed (Old_Itype) then
10222                Visit_Field (Union_Id (Packed_Array_Type (Old_Itype)),
10223                             Old_Itype);
10224             end if;
10225          end if;
10226       end Visit_Itype;
10227
10228       ----------------
10229       -- Visit_List --
10230       ----------------
10231
10232       procedure Visit_List (L : List_Id) is
10233          N : Node_Id;
10234       begin
10235          if L /= No_List then
10236             N := First (L);
10237
10238             while Present (N) loop
10239                Visit_Node (N);
10240                Next (N);
10241             end loop;
10242          end if;
10243       end Visit_List;
10244
10245       ----------------
10246       -- Visit_Node --
10247       ----------------
10248
10249       procedure Visit_Node (N : Node_Or_Entity_Id) is
10250
10251       --  Start of processing for Visit_Node
10252
10253       begin
10254          --  Handle case of an Itype, which must be copied
10255
10256          if Has_Extension (N)
10257            and then Is_Itype (N)
10258          then
10259             --  Nothing to do if already in the list. This can happen with an
10260             --  Itype entity that appears more than once in the tree.
10261             --  Note that we do not want to visit descendents in this case.
10262
10263             --  Test for already in list when hash table is used
10264
10265             if NCT_Hash_Tables_Used then
10266                if Present (NCT_Assoc.Get (Entity_Id (N))) then
10267                   return;
10268                end if;
10269
10270             --  Test for already in list when hash table not used
10271
10272             else
10273                declare
10274                   E : Elmt_Id;
10275                begin
10276                   if Present (Actual_Map) then
10277                      E := First_Elmt (Actual_Map);
10278                      while Present (E) loop
10279                         if Node (E) = N then
10280                            return;
10281                         else
10282                            E := Next_Elmt (Next_Elmt (E));
10283                         end if;
10284                      end loop;
10285                   end if;
10286                end;
10287             end if;
10288
10289             Visit_Itype (N);
10290          end if;
10291
10292          --  Visit descendents
10293
10294          Visit_Field (Field1 (N), N);
10295          Visit_Field (Field2 (N), N);
10296          Visit_Field (Field3 (N), N);
10297          Visit_Field (Field4 (N), N);
10298          Visit_Field (Field5 (N), N);
10299       end Visit_Node;
10300
10301    --  Start of processing for New_Copy_Tree
10302
10303    begin
10304       Actual_Map := Map;
10305
10306       --  See if we should use hash table
10307
10308       if No (Actual_Map) then
10309          NCT_Hash_Tables_Used := False;
10310
10311       else
10312          declare
10313             Elmt : Elmt_Id;
10314
10315          begin
10316             NCT_Table_Entries := 0;
10317
10318             Elmt := First_Elmt (Actual_Map);
10319             while Present (Elmt) loop
10320                NCT_Table_Entries := NCT_Table_Entries + 1;
10321                Next_Elmt (Elmt);
10322                Next_Elmt (Elmt);
10323             end loop;
10324
10325             if NCT_Table_Entries > NCT_Hash_Threshold then
10326                Build_NCT_Hash_Tables;
10327             else
10328                NCT_Hash_Tables_Used := False;
10329             end if;
10330          end;
10331       end if;
10332
10333       --  Hash table set up if required, now start phase one by visiting
10334       --  top node (we will recursively visit the descendents).
10335
10336       Visit_Node (Source);
10337
10338       --  Now the second phase of the copy can start. First we process
10339       --  all the mapped entities, copying their descendents.
10340
10341       if Present (Actual_Map) then
10342          declare
10343             Elmt      : Elmt_Id;
10344             New_Itype : Entity_Id;
10345          begin
10346             Elmt := First_Elmt (Actual_Map);
10347             while Present (Elmt) loop
10348                Next_Elmt (Elmt);
10349                New_Itype := Node (Elmt);
10350                Copy_Itype_With_Replacement (New_Itype);
10351                Next_Elmt (Elmt);
10352             end loop;
10353          end;
10354       end if;
10355
10356       --  Now we can copy the actual tree
10357
10358       return Copy_Node_With_Replacement (Source);
10359    end New_Copy_Tree;
10360
10361    -------------------------
10362    -- New_External_Entity --
10363    -------------------------
10364
10365    function New_External_Entity
10366      (Kind         : Entity_Kind;
10367       Scope_Id     : Entity_Id;
10368       Sloc_Value   : Source_Ptr;
10369       Related_Id   : Entity_Id;
10370       Suffix       : Character;
10371       Suffix_Index : Nat := 0;
10372       Prefix       : Character := ' ') return Entity_Id
10373    is
10374       N : constant Entity_Id :=
10375             Make_Defining_Identifier (Sloc_Value,
10376               New_External_Name
10377                 (Chars (Related_Id), Suffix, Suffix_Index, Prefix));
10378
10379    begin
10380       Set_Ekind          (N, Kind);
10381       Set_Is_Internal    (N, True);
10382       Append_Entity      (N, Scope_Id);
10383       Set_Public_Status  (N);
10384
10385       if Kind in Type_Kind then
10386          Init_Size_Align (N);
10387       end if;
10388
10389       return N;
10390    end New_External_Entity;
10391
10392    -------------------------
10393    -- New_Internal_Entity --
10394    -------------------------
10395
10396    function New_Internal_Entity
10397      (Kind       : Entity_Kind;
10398       Scope_Id   : Entity_Id;
10399       Sloc_Value : Source_Ptr;
10400       Id_Char    : Character) return Entity_Id
10401    is
10402       N : constant Entity_Id := Make_Temporary (Sloc_Value, Id_Char);
10403
10404    begin
10405       Set_Ekind          (N, Kind);
10406       Set_Is_Internal    (N, True);
10407       Append_Entity      (N, Scope_Id);
10408
10409       if Kind in Type_Kind then
10410          Init_Size_Align (N);
10411       end if;
10412
10413       return N;
10414    end New_Internal_Entity;
10415
10416    -----------------
10417    -- Next_Actual --
10418    -----------------
10419
10420    function Next_Actual (Actual_Id : Node_Id) return Node_Id is
10421       N  : Node_Id;
10422
10423    begin
10424       --  If we are pointing at a positional parameter, it is a member of a
10425       --  node list (the list of parameters), and the next parameter is the
10426       --  next node on the list, unless we hit a parameter association, then
10427       --  we shift to using the chain whose head is the First_Named_Actual in
10428       --  the parent, and then is threaded using the Next_Named_Actual of the
10429       --  Parameter_Association. All this fiddling is because the original node
10430       --  list is in the textual call order, and what we need is the
10431       --  declaration order.
10432
10433       if Is_List_Member (Actual_Id) then
10434          N := Next (Actual_Id);
10435
10436          if Nkind (N) = N_Parameter_Association then
10437             return First_Named_Actual (Parent (Actual_Id));
10438          else
10439             return N;
10440          end if;
10441
10442       else
10443          return Next_Named_Actual (Parent (Actual_Id));
10444       end if;
10445    end Next_Actual;
10446
10447    procedure Next_Actual (Actual_Id : in out Node_Id) is
10448    begin
10449       Actual_Id := Next_Actual (Actual_Id);
10450    end Next_Actual;
10451
10452    -----------------------
10453    -- Normalize_Actuals --
10454    -----------------------
10455
10456    --  Chain actuals according to formals of subprogram. If there are no named
10457    --  associations, the chain is simply the list of Parameter Associations,
10458    --  since the order is the same as the declaration order. If there are named
10459    --  associations, then the First_Named_Actual field in the N_Function_Call
10460    --  or N_Procedure_Call_Statement node points to the Parameter_Association
10461    --  node for the parameter that comes first in declaration order. The
10462    --  remaining named parameters are then chained in declaration order using
10463    --  Next_Named_Actual.
10464
10465    --  This routine also verifies that the number of actuals is compatible with
10466    --  the number and default values of formals, but performs no type checking
10467    --  (type checking is done by the caller).
10468
10469    --  If the matching succeeds, Success is set to True and the caller proceeds
10470    --  with type-checking. If the match is unsuccessful, then Success is set to
10471    --  False, and the caller attempts a different interpretation, if there is
10472    --  one.
10473
10474    --  If the flag Report is on, the call is not overloaded, and a failure to
10475    --  match can be reported here, rather than in the caller.
10476
10477    procedure Normalize_Actuals
10478      (N       : Node_Id;
10479       S       : Entity_Id;
10480       Report  : Boolean;
10481       Success : out Boolean)
10482    is
10483       Actuals     : constant List_Id := Parameter_Associations (N);
10484       Actual      : Node_Id := Empty;
10485       Formal      : Entity_Id;
10486       Last        : Node_Id := Empty;
10487       First_Named : Node_Id := Empty;
10488       Found       : Boolean;
10489
10490       Formals_To_Match : Integer := 0;
10491       Actuals_To_Match : Integer := 0;
10492
10493       procedure Chain (A : Node_Id);
10494       --  Add named actual at the proper place in the list, using the
10495       --  Next_Named_Actual link.
10496
10497       function Reporting return Boolean;
10498       --  Determines if an error is to be reported. To report an error, we
10499       --  need Report to be True, and also we do not report errors caused
10500       --  by calls to init procs that occur within other init procs. Such
10501       --  errors must always be cascaded errors, since if all the types are
10502       --  declared correctly, the compiler will certainly build decent calls!
10503
10504       -----------
10505       -- Chain --
10506       -----------
10507
10508       procedure Chain (A : Node_Id) is
10509       begin
10510          if No (Last) then
10511
10512             --  Call node points to first actual in list
10513
10514             Set_First_Named_Actual (N, Explicit_Actual_Parameter (A));
10515
10516          else
10517             Set_Next_Named_Actual (Last, Explicit_Actual_Parameter (A));
10518          end if;
10519
10520          Last := A;
10521          Set_Next_Named_Actual (Last, Empty);
10522       end Chain;
10523
10524       ---------------
10525       -- Reporting --
10526       ---------------
10527
10528       function Reporting return Boolean is
10529       begin
10530          if not Report then
10531             return False;
10532
10533          elsif not Within_Init_Proc then
10534             return True;
10535
10536          elsif Is_Init_Proc (Entity (Name (N))) then
10537             return False;
10538
10539          else
10540             return True;
10541          end if;
10542       end Reporting;
10543
10544    --  Start of processing for Normalize_Actuals
10545
10546    begin
10547       if Is_Access_Type (S) then
10548
10549          --  The name in the call is a function call that returns an access
10550          --  to subprogram. The designated type has the list of formals.
10551
10552          Formal := First_Formal (Designated_Type (S));
10553       else
10554          Formal := First_Formal (S);
10555       end if;
10556
10557       while Present (Formal) loop
10558          Formals_To_Match := Formals_To_Match + 1;
10559          Next_Formal (Formal);
10560       end loop;
10561
10562       --  Find if there is a named association, and verify that no positional
10563       --  associations appear after named ones.
10564
10565       if Present (Actuals) then
10566          Actual := First (Actuals);
10567       end if;
10568
10569       while Present (Actual)
10570         and then Nkind (Actual) /= N_Parameter_Association
10571       loop
10572          Actuals_To_Match := Actuals_To_Match + 1;
10573          Next (Actual);
10574       end loop;
10575
10576       if No (Actual) and Actuals_To_Match = Formals_To_Match then
10577
10578          --  Most common case: positional notation, no defaults
10579
10580          Success := True;
10581          return;
10582
10583       elsif Actuals_To_Match > Formals_To_Match then
10584
10585          --  Too many actuals: will not work
10586
10587          if Reporting then
10588             if Is_Entity_Name (Name (N)) then
10589                Error_Msg_N ("too many arguments in call to&", Name (N));
10590             else
10591                Error_Msg_N ("too many arguments in call", N);
10592             end if;
10593          end if;
10594
10595          Success := False;
10596          return;
10597       end if;
10598
10599       First_Named := Actual;
10600
10601       while Present (Actual) loop
10602          if Nkind (Actual) /= N_Parameter_Association then
10603             Error_Msg_N
10604               ("positional parameters not allowed after named ones", Actual);
10605             Success := False;
10606             return;
10607
10608          else
10609             Actuals_To_Match := Actuals_To_Match + 1;
10610          end if;
10611
10612          Next (Actual);
10613       end loop;
10614
10615       if Present (Actuals) then
10616          Actual := First (Actuals);
10617       end if;
10618
10619       Formal := First_Formal (S);
10620       while Present (Formal) loop
10621
10622          --  Match the formals in order. If the corresponding actual is
10623          --  positional, nothing to do. Else scan the list of named actuals
10624          --  to find the one with the right name.
10625
10626          if Present (Actual)
10627            and then Nkind (Actual) /= N_Parameter_Association
10628          then
10629             Next (Actual);
10630             Actuals_To_Match := Actuals_To_Match - 1;
10631             Formals_To_Match := Formals_To_Match - 1;
10632
10633          else
10634             --  For named parameters, search the list of actuals to find
10635             --  one that matches the next formal name.
10636
10637             Actual := First_Named;
10638             Found  := False;
10639             while Present (Actual) loop
10640                if Chars (Selector_Name (Actual)) = Chars (Formal) then
10641                   Found := True;
10642                   Chain (Actual);
10643                   Actuals_To_Match := Actuals_To_Match - 1;
10644                   Formals_To_Match := Formals_To_Match - 1;
10645                   exit;
10646                end if;
10647
10648                Next (Actual);
10649             end loop;
10650
10651             if not Found then
10652                if Ekind (Formal) /= E_In_Parameter
10653                  or else No (Default_Value (Formal))
10654                then
10655                   if Reporting then
10656                      if (Comes_From_Source (S)
10657                           or else Sloc (S) = Standard_Location)
10658                        and then Is_Overloadable (S)
10659                      then
10660                         if No (Actuals)
10661                           and then
10662                            (Nkind (Parent (N)) = N_Procedure_Call_Statement
10663                              or else
10664                            (Nkind (Parent (N)) = N_Function_Call
10665                              or else
10666                             Nkind (Parent (N)) = N_Parameter_Association))
10667                           and then Ekind (S) /= E_Function
10668                         then
10669                            Set_Etype (N, Etype (S));
10670                         else
10671                            Error_Msg_Name_1 := Chars (S);
10672                            Error_Msg_Sloc := Sloc (S);
10673                            Error_Msg_NE
10674                              ("missing argument for parameter & " &
10675                                 "in call to % declared #", N, Formal);
10676                         end if;
10677
10678                      elsif Is_Overloadable (S) then
10679                         Error_Msg_Name_1 := Chars (S);
10680
10681                         --  Point to type derivation that generated the
10682                         --  operation.
10683
10684                         Error_Msg_Sloc := Sloc (Parent (S));
10685
10686                         Error_Msg_NE
10687                           ("missing argument for parameter & " &
10688                              "in call to % (inherited) #", N, Formal);
10689
10690                      else
10691                         Error_Msg_NE
10692                           ("missing argument for parameter &", N, Formal);
10693                      end if;
10694                   end if;
10695
10696                   Success := False;
10697                   return;
10698
10699                else
10700                   Formals_To_Match := Formals_To_Match - 1;
10701                end if;
10702             end if;
10703          end if;
10704
10705          Next_Formal (Formal);
10706       end loop;
10707
10708       if Formals_To_Match = 0 and then Actuals_To_Match = 0 then
10709          Success := True;
10710          return;
10711
10712       else
10713          if Reporting then
10714
10715             --  Find some superfluous named actual that did not get
10716             --  attached to the list of associations.
10717
10718             Actual := First (Actuals);
10719             while Present (Actual) loop
10720                if Nkind (Actual) = N_Parameter_Association
10721                  and then Actual /= Last
10722                  and then No (Next_Named_Actual (Actual))
10723                then
10724                   Error_Msg_N ("unmatched actual & in call",
10725                     Selector_Name (Actual));
10726                   exit;
10727                end if;
10728
10729                Next (Actual);
10730             end loop;
10731          end if;
10732
10733          Success := False;
10734          return;
10735       end if;
10736    end Normalize_Actuals;
10737
10738    --------------------------------
10739    -- Note_Possible_Modification --
10740    --------------------------------
10741
10742    procedure Note_Possible_Modification (N : Node_Id; Sure : Boolean) is
10743       Modification_Comes_From_Source : constant Boolean :=
10744                                          Comes_From_Source (Parent (N));
10745
10746       Ent : Entity_Id;
10747       Exp : Node_Id;
10748
10749    begin
10750       --  Loop to find referenced entity, if there is one
10751
10752       Exp := N;
10753       loop
10754          <<Continue>>
10755          Ent := Empty;
10756
10757          if Is_Entity_Name (Exp) then
10758             Ent := Entity (Exp);
10759
10760             --  If the entity is missing, it is an undeclared identifier,
10761             --  and there is nothing to annotate.
10762
10763             if No (Ent) then
10764                return;
10765             end if;
10766
10767          elsif Nkind (Exp) = N_Explicit_Dereference then
10768             declare
10769                P : constant Node_Id := Prefix (Exp);
10770
10771             begin
10772                --  In formal verification mode, keep track of all reads and
10773                --  writes through explicit dereferences.
10774
10775                if Alfa_Mode then
10776                   Alfa.Generate_Dereference (N, 'm');
10777                end if;
10778
10779                if Nkind (P) = N_Selected_Component
10780                  and then Present (
10781                    Entry_Formal (Entity (Selector_Name (P))))
10782                then
10783                   --  Case of a reference to an entry formal
10784
10785                   Ent := Entry_Formal (Entity (Selector_Name (P)));
10786
10787                elsif Nkind (P) = N_Identifier
10788                  and then Nkind (Parent (Entity (P))) = N_Object_Declaration
10789                  and then Present (Expression (Parent (Entity (P))))
10790                  and then Nkind (Expression (Parent (Entity (P))))
10791                    = N_Reference
10792                then
10793                   --  Case of a reference to a value on which side effects have
10794                   --  been removed.
10795
10796                   Exp := Prefix (Expression (Parent (Entity (P))));
10797                   goto Continue;
10798
10799                else
10800                   return;
10801
10802                end if;
10803             end;
10804
10805          elsif     Nkind (Exp) = N_Type_Conversion
10806            or else Nkind (Exp) = N_Unchecked_Type_Conversion
10807          then
10808             Exp := Expression (Exp);
10809             goto Continue;
10810
10811          elsif     Nkind (Exp) = N_Slice
10812            or else Nkind (Exp) = N_Indexed_Component
10813            or else Nkind (Exp) = N_Selected_Component
10814          then
10815             Exp := Prefix (Exp);
10816             goto Continue;
10817
10818          else
10819             return;
10820          end if;
10821
10822          --  Now look for entity being referenced
10823
10824          if Present (Ent) then
10825             if Is_Object (Ent) then
10826                if Comes_From_Source (Exp)
10827                  or else Modification_Comes_From_Source
10828                then
10829                   --  Give warning if pragma unmodified given and we are
10830                   --  sure this is a modification.
10831
10832                   if Has_Pragma_Unmodified (Ent) and then Sure then
10833                      Error_Msg_NE ("?pragma Unmodified given for &!", N, Ent);
10834                   end if;
10835
10836                   Set_Never_Set_In_Source (Ent, False);
10837                end if;
10838
10839                Set_Is_True_Constant (Ent, False);
10840                Set_Current_Value    (Ent, Empty);
10841                Set_Is_Known_Null    (Ent, False);
10842
10843                if not Can_Never_Be_Null (Ent) then
10844                   Set_Is_Known_Non_Null (Ent, False);
10845                end if;
10846
10847                --  Follow renaming chain
10848
10849                if (Ekind (Ent) = E_Variable or else Ekind (Ent) = E_Constant)
10850                  and then Present (Renamed_Object (Ent))
10851                then
10852                   Exp := Renamed_Object (Ent);
10853                   goto Continue;
10854
10855                --  The expression may be the renaming of a subcomponent of an
10856                --  array or container. The assignment to the subcomponent is
10857                --  a modification of the container.
10858
10859                elsif Comes_From_Source (Original_Node (Exp))
10860                  and then Nkind_In (Original_Node (Exp), N_Selected_Component,
10861                                                          N_Indexed_Component)
10862                then
10863                   Exp := Prefix (Original_Node (Exp));
10864                   goto Continue;
10865                end if;
10866
10867                --  Generate a reference only if the assignment comes from
10868                --  source. This excludes, for example, calls to a dispatching
10869                --  assignment operation when the left-hand side is tagged.
10870
10871                if Modification_Comes_From_Source or else Alfa_Mode then
10872                   Generate_Reference (Ent, Exp, 'm');
10873
10874                   --  If the target of the assignment is the bound variable
10875                   --  in an iterator, indicate that the corresponding array
10876                   --  or container is also modified.
10877
10878                   if Ada_Version >= Ada_2012
10879                     and then
10880                       Nkind (Parent (Ent)) = N_Iterator_Specification
10881                   then
10882                      declare
10883                         Domain : constant Node_Id := Name (Parent (Ent));
10884
10885                      begin
10886                         --  TBD : in the full version of the construct, the
10887                         --  domain of iteration can be given by an expression.
10888
10889                         if Is_Entity_Name (Domain) then
10890                            Generate_Reference      (Entity (Domain), Exp, 'm');
10891                            Set_Is_True_Constant    (Entity (Domain), False);
10892                            Set_Never_Set_In_Source (Entity (Domain), False);
10893                         end if;
10894                      end;
10895                   end if;
10896                end if;
10897
10898                Check_Nested_Access (Ent);
10899             end if;
10900
10901             Kill_Checks (Ent);
10902
10903             --  If we are sure this is a modification from source, and we know
10904             --  this modifies a constant, then give an appropriate warning.
10905
10906             if Overlays_Constant (Ent)
10907               and then Modification_Comes_From_Source
10908               and then Sure
10909             then
10910                declare
10911                   A : constant Node_Id := Address_Clause (Ent);
10912                begin
10913                   if Present (A) then
10914                      declare
10915                         Exp : constant Node_Id := Expression (A);
10916                      begin
10917                         if Nkind (Exp) = N_Attribute_Reference
10918                           and then Attribute_Name (Exp) = Name_Address
10919                           and then Is_Entity_Name (Prefix (Exp))
10920                         then
10921                            Error_Msg_Sloc := Sloc (A);
10922                            Error_Msg_NE
10923                              ("constant& may be modified via address clause#?",
10924                               N, Entity (Prefix (Exp)));
10925                         end if;
10926                      end;
10927                   end if;
10928                end;
10929             end if;
10930
10931             return;
10932          end if;
10933       end loop;
10934    end Note_Possible_Modification;
10935
10936    -------------------------
10937    -- Object_Access_Level --
10938    -------------------------
10939
10940    function Object_Access_Level (Obj : Node_Id) return Uint is
10941       E : Entity_Id;
10942
10943    --  Returns the static accessibility level of the view denoted by Obj. Note
10944    --  that the value returned is the result of a call to Scope_Depth. Only
10945    --  scope depths associated with dynamic scopes can actually be returned.
10946    --  Since only relative levels matter for accessibility checking, the fact
10947    --  that the distance between successive levels of accessibility is not
10948    --  always one is immaterial (invariant: if level(E2) is deeper than
10949    --  level(E1), then Scope_Depth(E1) < Scope_Depth(E2)).
10950
10951       function Reference_To (Obj : Node_Id) return Node_Id;
10952       --  An explicit dereference is created when removing side-effects from
10953       --  expressions for constraint checking purposes. In this case a local
10954       --  access type is created for it. The correct access level is that of
10955       --  the original source node. We detect this case by noting that the
10956       --  prefix of the dereference is created by an object declaration whose
10957       --  initial expression is a reference.
10958
10959       ------------------
10960       -- Reference_To --
10961       ------------------
10962
10963       function Reference_To (Obj : Node_Id) return Node_Id is
10964          Pref : constant Node_Id := Prefix (Obj);
10965       begin
10966          if Is_Entity_Name (Pref)
10967            and then Nkind (Parent (Entity (Pref))) = N_Object_Declaration
10968            and then Present (Expression (Parent (Entity (Pref))))
10969            and then Nkind (Expression (Parent (Entity (Pref)))) = N_Reference
10970          then
10971             return (Prefix (Expression (Parent (Entity (Pref)))));
10972          else
10973             return Empty;
10974          end if;
10975       end Reference_To;
10976
10977    --  Start of processing for Object_Access_Level
10978
10979    begin
10980       if Nkind (Obj) = N_Defining_Identifier
10981         or else Is_Entity_Name (Obj)
10982       then
10983          if Nkind (Obj) = N_Defining_Identifier then
10984             E := Obj;
10985          else
10986             E := Entity (Obj);
10987          end if;
10988
10989          if Is_Prival (E) then
10990             E := Prival_Link (E);
10991          end if;
10992
10993          --  If E is a type then it denotes a current instance. For this case
10994          --  we add one to the normal accessibility level of the type to ensure
10995          --  that current instances are treated as always being deeper than
10996          --  than the level of any visible named access type (see 3.10.2(21)).
10997
10998          if Is_Type (E) then
10999             return Type_Access_Level (E) +  1;
11000
11001          elsif Present (Renamed_Object (E)) then
11002             return Object_Access_Level (Renamed_Object (E));
11003
11004          --  Similarly, if E is a component of the current instance of a
11005          --  protected type, any instance of it is assumed to be at a deeper
11006          --  level than the type. For a protected object (whose type is an
11007          --  anonymous protected type) its components are at the same level
11008          --  as the type itself.
11009
11010          elsif not Is_Overloadable (E)
11011            and then Ekind (Scope (E)) = E_Protected_Type
11012            and then Comes_From_Source (Scope (E))
11013          then
11014             return Type_Access_Level (Scope (E)) + 1;
11015
11016          else
11017             return Scope_Depth (Enclosing_Dynamic_Scope (E));
11018          end if;
11019
11020       elsif Nkind (Obj) = N_Selected_Component then
11021          if Is_Access_Type (Etype (Prefix (Obj))) then
11022             return Type_Access_Level (Etype (Prefix (Obj)));
11023          else
11024             return Object_Access_Level (Prefix (Obj));
11025          end if;
11026
11027       elsif Nkind (Obj) = N_Indexed_Component then
11028          if Is_Access_Type (Etype (Prefix (Obj))) then
11029             return Type_Access_Level (Etype (Prefix (Obj)));
11030          else
11031             return Object_Access_Level (Prefix (Obj));
11032          end if;
11033
11034       elsif Nkind (Obj) = N_Explicit_Dereference then
11035
11036          --  If the prefix is a selected access discriminant then we make a
11037          --  recursive call on the prefix, which will in turn check the level
11038          --  of the prefix object of the selected discriminant.
11039
11040          if Nkind (Prefix (Obj)) = N_Selected_Component
11041            and then Ekind (Etype (Prefix (Obj))) = E_Anonymous_Access_Type
11042            and then
11043              Ekind (Entity (Selector_Name (Prefix (Obj)))) = E_Discriminant
11044          then
11045             return Object_Access_Level (Prefix (Obj));
11046
11047          elsif not (Comes_From_Source (Obj)) then
11048             declare
11049                Ref : constant Node_Id := Reference_To (Obj);
11050             begin
11051                if Present (Ref) then
11052                   return Object_Access_Level (Ref);
11053                else
11054                   return Type_Access_Level (Etype (Prefix (Obj)));
11055                end if;
11056             end;
11057
11058          else
11059             return Type_Access_Level (Etype (Prefix (Obj)));
11060          end if;
11061
11062       elsif Nkind (Obj) = N_Type_Conversion
11063         or else Nkind (Obj) = N_Unchecked_Type_Conversion
11064       then
11065          return Object_Access_Level (Expression (Obj));
11066
11067       elsif Nkind (Obj) = N_Function_Call then
11068
11069          --  Function results are objects, so we get either the access level of
11070          --  the function or, in the case of an indirect call, the level of the
11071          --  access-to-subprogram type. (This code is used for Ada 95, but it
11072          --  looks wrong, because it seems that we should be checking the level
11073          --  of the call itself, even for Ada 95. However, using the Ada 2005
11074          --  version of the code causes regressions in several tests that are
11075          --  compiled with -gnat95. ???)
11076
11077          if Ada_Version < Ada_2005 then
11078             if Is_Entity_Name (Name (Obj)) then
11079                return Subprogram_Access_Level (Entity (Name (Obj)));
11080             else
11081                return Type_Access_Level (Etype (Prefix (Name (Obj))));
11082             end if;
11083
11084          --  For Ada 2005, the level of the result object of a function call is
11085          --  defined to be the level of the call's innermost enclosing master.
11086          --  We determine that by querying the depth of the innermost enclosing
11087          --  dynamic scope.
11088
11089          else
11090             Return_Master_Scope_Depth_Of_Call : declare
11091
11092                function Innermost_Master_Scope_Depth
11093                  (N : Node_Id) return Uint;
11094                --  Returns the scope depth of the given node's innermost
11095                --  enclosing dynamic scope (effectively the accessibility
11096                --  level of the innermost enclosing master).
11097
11098                ----------------------------------
11099                -- Innermost_Master_Scope_Depth --
11100                ----------------------------------
11101
11102                function Innermost_Master_Scope_Depth
11103                  (N : Node_Id) return Uint
11104                is
11105                   Node_Par : Node_Id := Parent (N);
11106
11107                begin
11108                   --  Locate the nearest enclosing node (by traversing Parents)
11109                   --  that Defining_Entity can be applied to, and return the
11110                   --  depth of that entity's nearest enclosing dynamic scope.
11111
11112                   while Present (Node_Par) loop
11113                      case Nkind (Node_Par) is
11114                         when N_Component_Declaration           |
11115                              N_Entry_Declaration               |
11116                              N_Formal_Object_Declaration       |
11117                              N_Formal_Type_Declaration         |
11118                              N_Full_Type_Declaration           |
11119                              N_Incomplete_Type_Declaration     |
11120                              N_Loop_Parameter_Specification    |
11121                              N_Object_Declaration              |
11122                              N_Protected_Type_Declaration      |
11123                              N_Private_Extension_Declaration   |
11124                              N_Private_Type_Declaration        |
11125                              N_Subtype_Declaration             |
11126                              N_Function_Specification          |
11127                              N_Procedure_Specification         |
11128                              N_Task_Type_Declaration           |
11129                              N_Body_Stub                       |
11130                              N_Generic_Instantiation           |
11131                              N_Proper_Body                     |
11132                              N_Implicit_Label_Declaration      |
11133                              N_Package_Declaration             |
11134                              N_Single_Task_Declaration         |
11135                              N_Subprogram_Declaration          |
11136                              N_Generic_Declaration             |
11137                              N_Renaming_Declaration            |
11138                              N_Block_Statement                 |
11139                              N_Formal_Subprogram_Declaration   |
11140                              N_Abstract_Subprogram_Declaration |
11141                              N_Entry_Body                      |
11142                              N_Exception_Declaration           |
11143                              N_Formal_Package_Declaration      |
11144                              N_Number_Declaration              |
11145                              N_Package_Specification           |
11146                              N_Parameter_Specification         |
11147                              N_Single_Protected_Declaration    |
11148                              N_Subunit                         =>
11149
11150                            return Scope_Depth
11151                                     (Nearest_Dynamic_Scope
11152                                        (Defining_Entity (Node_Par)));
11153
11154                         when others =>
11155                            null;
11156                      end case;
11157
11158                      Node_Par := Parent (Node_Par);
11159                   end loop;
11160
11161                   pragma Assert (False);
11162
11163                   --  Should never reach the following return
11164
11165                   return Scope_Depth (Current_Scope) + 1;
11166                end Innermost_Master_Scope_Depth;
11167
11168             --  Start of processing for Return_Master_Scope_Depth_Of_Call
11169
11170             begin
11171                return Innermost_Master_Scope_Depth (Obj);
11172             end Return_Master_Scope_Depth_Of_Call;
11173          end if;
11174
11175       --  For convenience we handle qualified expressions, even though
11176       --  they aren't technically object names.
11177
11178       elsif Nkind (Obj) = N_Qualified_Expression then
11179          return Object_Access_Level (Expression (Obj));
11180
11181       --  Otherwise return the scope level of Standard.
11182       --  (If there are cases that fall through
11183       --  to this point they will be treated as
11184       --  having global accessibility for now. ???)
11185
11186       else
11187          return Scope_Depth (Standard_Standard);
11188       end if;
11189    end Object_Access_Level;
11190
11191    --------------------------------------
11192    -- Original_Corresponding_Operation --
11193    --------------------------------------
11194
11195    function Original_Corresponding_Operation (S : Entity_Id) return Entity_Id
11196    is
11197       Typ : constant Entity_Id := Find_Dispatching_Type (S);
11198
11199    begin
11200       --  If S is an inherited primitive S2 the original corresponding
11201       --  operation of S is the original corresponding operation of S2
11202
11203       if Present (Alias (S))
11204         and then Find_Dispatching_Type (Alias (S)) /= Typ
11205       then
11206          return Original_Corresponding_Operation (Alias (S));
11207
11208       --  If S overrides an inherited subprogram S2 the original corresponding
11209       --  operation of S is the original corresponding operation of S2
11210
11211       elsif Present (Overridden_Operation (S)) then
11212          return Original_Corresponding_Operation (Overridden_Operation (S));
11213
11214       --  otherwise it is S itself
11215
11216       else
11217          return S;
11218       end if;
11219    end Original_Corresponding_Operation;
11220
11221    -----------------------
11222    -- Private_Component --
11223    -----------------------
11224
11225    function Private_Component (Type_Id : Entity_Id) return Entity_Id is
11226       Ancestor  : constant Entity_Id := Base_Type (Type_Id);
11227
11228       function Trace_Components
11229         (T     : Entity_Id;
11230          Check : Boolean) return Entity_Id;
11231       --  Recursive function that does the work, and checks against circular
11232       --  definition for each subcomponent type.
11233
11234       ----------------------
11235       -- Trace_Components --
11236       ----------------------
11237
11238       function Trace_Components
11239          (T     : Entity_Id;
11240           Check : Boolean) return Entity_Id
11241        is
11242          Btype     : constant Entity_Id := Base_Type (T);
11243          Component : Entity_Id;
11244          P         : Entity_Id;
11245          Candidate : Entity_Id := Empty;
11246
11247       begin
11248          if Check and then Btype = Ancestor then
11249             Error_Msg_N ("circular type definition", Type_Id);
11250             return Any_Type;
11251          end if;
11252
11253          if Is_Private_Type (Btype)
11254            and then not Is_Generic_Type (Btype)
11255          then
11256             if Present (Full_View (Btype))
11257               and then Is_Record_Type (Full_View (Btype))
11258               and then not Is_Frozen (Btype)
11259             then
11260                --  To indicate that the ancestor depends on a private type, the
11261                --  current Btype is sufficient. However, to check for circular
11262                --  definition we must recurse on the full view.
11263
11264                Candidate := Trace_Components (Full_View (Btype), True);
11265
11266                if Candidate = Any_Type then
11267                   return Any_Type;
11268                else
11269                   return Btype;
11270                end if;
11271
11272             else
11273                return Btype;
11274             end if;
11275
11276          elsif Is_Array_Type (Btype) then
11277             return Trace_Components (Component_Type (Btype), True);
11278
11279          elsif Is_Record_Type (Btype) then
11280             Component := First_Entity (Btype);
11281             while Present (Component)
11282               and then Comes_From_Source (Component)
11283             loop
11284                --  Skip anonymous types generated by constrained components
11285
11286                if not Is_Type (Component) then
11287                   P := Trace_Components (Etype (Component), True);
11288
11289                   if Present (P) then
11290                      if P = Any_Type then
11291                         return P;
11292                      else
11293                         Candidate := P;
11294                      end if;
11295                   end if;
11296                end if;
11297
11298                Next_Entity (Component);
11299             end loop;
11300
11301             return Candidate;
11302
11303          else
11304             return Empty;
11305          end if;
11306       end Trace_Components;
11307
11308    --  Start of processing for Private_Component
11309
11310    begin
11311       return Trace_Components (Type_Id, False);
11312    end Private_Component;
11313
11314    ---------------------------
11315    -- Primitive_Names_Match --
11316    ---------------------------
11317
11318    function Primitive_Names_Match (E1, E2 : Entity_Id) return Boolean is
11319
11320       function Non_Internal_Name (E : Entity_Id) return Name_Id;
11321       --  Given an internal name, returns the corresponding non-internal name
11322
11323       ------------------------
11324       --  Non_Internal_Name --
11325       ------------------------
11326
11327       function Non_Internal_Name (E : Entity_Id) return Name_Id is
11328       begin
11329          Get_Name_String (Chars (E));
11330          Name_Len := Name_Len - 1;
11331          return Name_Find;
11332       end Non_Internal_Name;
11333
11334    --  Start of processing for Primitive_Names_Match
11335
11336    begin
11337       pragma Assert (Present (E1) and then Present (E2));
11338
11339       return Chars (E1) = Chars (E2)
11340         or else
11341            (not Is_Internal_Name (Chars (E1))
11342               and then Is_Internal_Name (Chars (E2))
11343               and then Non_Internal_Name (E2) = Chars (E1))
11344         or else
11345            (not Is_Internal_Name (Chars (E2))
11346               and then Is_Internal_Name (Chars (E1))
11347               and then Non_Internal_Name (E1) = Chars (E2))
11348         or else
11349            (Is_Predefined_Dispatching_Operation (E1)
11350               and then Is_Predefined_Dispatching_Operation (E2)
11351               and then Same_TSS (E1, E2))
11352         or else
11353            (Is_Init_Proc (E1) and then Is_Init_Proc (E2));
11354    end Primitive_Names_Match;
11355
11356    -----------------------
11357    -- Process_End_Label --
11358    -----------------------
11359
11360    procedure Process_End_Label
11361      (N   : Node_Id;
11362       Typ : Character;
11363       Ent : Entity_Id)
11364    is
11365       Loc  : Source_Ptr;
11366       Nam  : Node_Id;
11367       Scop : Entity_Id;
11368
11369       Label_Ref : Boolean;
11370       --  Set True if reference to end label itself is required
11371
11372       Endl : Node_Id;
11373       --  Gets set to the operator symbol or identifier that references the
11374       --  entity Ent. For the child unit case, this is the identifier from the
11375       --  designator. For other cases, this is simply Endl.
11376
11377       procedure Generate_Parent_Ref (N : Node_Id; E : Entity_Id);
11378       --  N is an identifier node that appears as a parent unit reference in
11379       --  the case where Ent is a child unit. This procedure generates an
11380       --  appropriate cross-reference entry. E is the corresponding entity.
11381
11382       -------------------------
11383       -- Generate_Parent_Ref --
11384       -------------------------
11385
11386       procedure Generate_Parent_Ref (N : Node_Id; E : Entity_Id) is
11387       begin
11388          --  If names do not match, something weird, skip reference
11389
11390          if Chars (E) = Chars (N) then
11391
11392             --  Generate the reference. We do NOT consider this as a reference
11393             --  for unreferenced symbol purposes.
11394
11395             Generate_Reference (E, N, 'r', Set_Ref => False, Force => True);
11396
11397             if Style_Check then
11398                Style.Check_Identifier (N, E);
11399             end if;
11400          end if;
11401       end Generate_Parent_Ref;
11402
11403    --  Start of processing for Process_End_Label
11404
11405    begin
11406       --  If no node, ignore. This happens in some error situations, and
11407       --  also for some internally generated structures where no end label
11408       --  references are required in any case.
11409
11410       if No (N) then
11411          return;
11412       end if;
11413
11414       --  Nothing to do if no End_Label, happens for internally generated
11415       --  constructs where we don't want an end label reference anyway. Also
11416       --  nothing to do if Endl is a string literal, which means there was
11417       --  some prior error (bad operator symbol)
11418
11419       Endl := End_Label (N);
11420
11421       if No (Endl) or else Nkind (Endl) = N_String_Literal then
11422          return;
11423       end if;
11424
11425       --  Reference node is not in extended main source unit
11426
11427       if not In_Extended_Main_Source_Unit (N) then
11428
11429          --  Generally we do not collect references except for the extended
11430          --  main source unit. The one exception is the 'e' entry for a
11431          --  package spec, where it is useful for a client to have the
11432          --  ending information to define scopes.
11433
11434          if Typ /= 'e' then
11435             return;
11436
11437          else
11438             Label_Ref := False;
11439
11440             --  For this case, we can ignore any parent references, but we
11441             --  need the package name itself for the 'e' entry.
11442
11443             if Nkind (Endl) = N_Designator then
11444                Endl := Identifier (Endl);
11445             end if;
11446          end if;
11447
11448       --  Reference is in extended main source unit
11449
11450       else
11451          Label_Ref := True;
11452
11453          --  For designator, generate references for the parent entries
11454
11455          if Nkind (Endl) = N_Designator then
11456
11457             --  Generate references for the prefix if the END line comes from
11458             --  source (otherwise we do not need these references) We climb the
11459             --  scope stack to find the expected entities.
11460
11461             if Comes_From_Source (Endl) then
11462                Nam  := Name (Endl);
11463                Scop := Current_Scope;
11464                while Nkind (Nam) = N_Selected_Component loop
11465                   Scop := Scope (Scop);
11466                   exit when No (Scop);
11467                   Generate_Parent_Ref (Selector_Name (Nam), Scop);
11468                   Nam := Prefix (Nam);
11469                end loop;
11470
11471                if Present (Scop) then
11472                   Generate_Parent_Ref (Nam, Scope (Scop));
11473                end if;
11474             end if;
11475
11476             Endl := Identifier (Endl);
11477          end if;
11478       end if;
11479
11480       --  If the end label is not for the given entity, then either we have
11481       --  some previous error, or this is a generic instantiation for which
11482       --  we do not need to make a cross-reference in this case anyway. In
11483       --  either case we simply ignore the call.
11484
11485       if Chars (Ent) /= Chars (Endl) then
11486          return;
11487       end if;
11488
11489       --  If label was really there, then generate a normal reference and then
11490       --  adjust the location in the end label to point past the name (which
11491       --  should almost always be the semicolon).
11492
11493       Loc := Sloc (Endl);
11494
11495       if Comes_From_Source (Endl) then
11496
11497          --  If a label reference is required, then do the style check and
11498          --  generate an l-type cross-reference entry for the label
11499
11500          if Label_Ref then
11501             if Style_Check then
11502                Style.Check_Identifier (Endl, Ent);
11503             end if;
11504
11505             Generate_Reference (Ent, Endl, 'l', Set_Ref => False);
11506          end if;
11507
11508          --  Set the location to point past the label (normally this will
11509          --  mean the semicolon immediately following the label). This is
11510          --  done for the sake of the 'e' or 't' entry generated below.
11511
11512          Get_Decoded_Name_String (Chars (Endl));
11513          Set_Sloc (Endl, Sloc (Endl) + Source_Ptr (Name_Len));
11514
11515       else
11516          --  In SPARK mode, no missing label is allowed for packages and
11517          --  subprogram bodies. Detect those cases by testing whether
11518          --  Process_End_Label was called for a body (Typ = 't') or a package.
11519
11520          if Restriction_Check_Required (SPARK)
11521            and then (Typ = 't' or else Ekind (Ent) = E_Package)
11522          then
11523             Error_Msg_Node_1 := Endl;
11524             Check_SPARK_Restriction ("`END &` required", Endl, Force => True);
11525          end if;
11526       end if;
11527
11528       --  Now generate the e/t reference
11529
11530       Generate_Reference (Ent, Endl, Typ, Set_Ref => False, Force => True);
11531
11532       --  Restore Sloc, in case modified above, since we have an identifier
11533       --  and the normal Sloc should be left set in the tree.
11534
11535       Set_Sloc (Endl, Loc);
11536    end Process_End_Label;
11537
11538    ------------------------------------
11539    -- References_Generic_Formal_Type --
11540    ------------------------------------
11541
11542    function References_Generic_Formal_Type (N : Node_Id) return Boolean is
11543
11544       function Process (N : Node_Id) return Traverse_Result;
11545       --  Process one node in search for generic formal type
11546
11547       -------------
11548       -- Process --
11549       -------------
11550
11551       function Process (N : Node_Id) return Traverse_Result is
11552       begin
11553          if Nkind (N) in N_Has_Entity then
11554             declare
11555                E : constant Entity_Id := Entity (N);
11556             begin
11557                if Present (E) then
11558                   if Is_Generic_Type (E) then
11559                      return Abandon;
11560                   elsif Present (Etype (E))
11561                     and then Is_Generic_Type (Etype (E))
11562                   then
11563                      return Abandon;
11564                   end if;
11565                end if;
11566             end;
11567          end if;
11568
11569          return Atree.OK;
11570       end Process;
11571
11572       function Traverse is new Traverse_Func (Process);
11573       --  Traverse tree to look for generic type
11574
11575    begin
11576       if Inside_A_Generic then
11577          return Traverse (N) = Abandon;
11578       else
11579          return False;
11580       end if;
11581    end References_Generic_Formal_Type;
11582
11583    --------------------
11584    -- Remove_Homonym --
11585    --------------------
11586
11587    procedure Remove_Homonym (E : Entity_Id) is
11588       Prev  : Entity_Id := Empty;
11589       H     : Entity_Id;
11590
11591    begin
11592       if E = Current_Entity (E) then
11593          if Present (Homonym (E)) then
11594             Set_Current_Entity (Homonym (E));
11595          else
11596             Set_Name_Entity_Id (Chars (E), Empty);
11597          end if;
11598       else
11599          H := Current_Entity (E);
11600          while Present (H) and then H /= E loop
11601             Prev := H;
11602             H    := Homonym (H);
11603          end loop;
11604
11605          Set_Homonym (Prev, Homonym (E));
11606       end if;
11607    end Remove_Homonym;
11608
11609    ---------------------
11610    -- Rep_To_Pos_Flag --
11611    ---------------------
11612
11613    function Rep_To_Pos_Flag (E : Entity_Id; Loc : Source_Ptr) return Node_Id is
11614    begin
11615       return New_Occurrence_Of
11616                (Boolean_Literals (not Range_Checks_Suppressed (E)), Loc);
11617    end Rep_To_Pos_Flag;
11618
11619    --------------------
11620    -- Require_Entity --
11621    --------------------
11622
11623    procedure Require_Entity (N : Node_Id) is
11624    begin
11625       if Is_Entity_Name (N) and then No (Entity (N)) then
11626          if Total_Errors_Detected /= 0 then
11627             Set_Entity (N, Any_Id);
11628          else
11629             raise Program_Error;
11630          end if;
11631       end if;
11632    end Require_Entity;
11633
11634    ------------------------------
11635    -- Requires_Transient_Scope --
11636    ------------------------------
11637
11638    --  A transient scope is required when variable-sized temporaries are
11639    --  allocated in the primary or secondary stack, or when finalization
11640    --  actions must be generated before the next instruction.
11641
11642    function Requires_Transient_Scope (Id : Entity_Id) return Boolean is
11643       Typ : constant Entity_Id := Underlying_Type (Id);
11644
11645    --  Start of processing for Requires_Transient_Scope
11646
11647    begin
11648       --  This is a private type which is not completed yet. This can only
11649       --  happen in a default expression (of a formal parameter or of a
11650       --  record component). Do not expand transient scope in this case
11651
11652       if No (Typ) then
11653          return False;
11654
11655       --  Do not expand transient scope for non-existent procedure return
11656
11657       elsif Typ = Standard_Void_Type then
11658          return False;
11659
11660       --  Elementary types do not require a transient scope
11661
11662       elsif Is_Elementary_Type (Typ) then
11663          return False;
11664
11665       --  Generally, indefinite subtypes require a transient scope, since the
11666       --  back end cannot generate temporaries, since this is not a valid type
11667       --  for declaring an object. It might be possible to relax this in the
11668       --  future, e.g. by declaring the maximum possible space for the type.
11669
11670       elsif Is_Indefinite_Subtype (Typ) then
11671          return True;
11672
11673       --  Functions returning tagged types may dispatch on result so their
11674       --  returned value is allocated on the secondary stack. Controlled
11675       --  type temporaries need finalization.
11676
11677       elsif Is_Tagged_Type (Typ)
11678         or else Has_Controlled_Component (Typ)
11679       then
11680          return not Is_Value_Type (Typ);
11681
11682       --  Record type
11683
11684       elsif Is_Record_Type (Typ) then
11685          declare
11686             Comp : Entity_Id;
11687          begin
11688             Comp := First_Entity (Typ);
11689             while Present (Comp) loop
11690                if Ekind (Comp) = E_Component
11691                   and then Requires_Transient_Scope (Etype (Comp))
11692                then
11693                   return True;
11694                else
11695                   Next_Entity (Comp);
11696                end if;
11697             end loop;
11698          end;
11699
11700          return False;
11701
11702       --  String literal types never require transient scope
11703
11704       elsif Ekind (Typ) = E_String_Literal_Subtype then
11705          return False;
11706
11707       --  Array type. Note that we already know that this is a constrained
11708       --  array, since unconstrained arrays will fail the indefinite test.
11709
11710       elsif Is_Array_Type (Typ) then
11711
11712          --  If component type requires a transient scope, the array does too
11713
11714          if Requires_Transient_Scope (Component_Type (Typ)) then
11715             return True;
11716
11717          --  Otherwise, we only need a transient scope if the size depends on
11718          --  the value of one or more discriminants.
11719
11720          else
11721             return Size_Depends_On_Discriminant (Typ);
11722          end if;
11723
11724       --  All other cases do not require a transient scope
11725
11726       else
11727          return False;
11728       end if;
11729    end Requires_Transient_Scope;
11730
11731    --------------------------
11732    -- Reset_Analyzed_Flags --
11733    --------------------------
11734
11735    procedure Reset_Analyzed_Flags (N : Node_Id) is
11736
11737       function Clear_Analyzed (N : Node_Id) return Traverse_Result;
11738       --  Function used to reset Analyzed flags in tree. Note that we do
11739       --  not reset Analyzed flags in entities, since there is no need to
11740       --  reanalyze entities, and indeed, it is wrong to do so, since it
11741       --  can result in generating auxiliary stuff more than once.
11742
11743       --------------------
11744       -- Clear_Analyzed --
11745       --------------------
11746
11747       function Clear_Analyzed (N : Node_Id) return Traverse_Result is
11748       begin
11749          if not Has_Extension (N) then
11750             Set_Analyzed (N, False);
11751          end if;
11752
11753          return OK;
11754       end Clear_Analyzed;
11755
11756       procedure Reset_Analyzed is new Traverse_Proc (Clear_Analyzed);
11757
11758    --  Start of processing for Reset_Analyzed_Flags
11759
11760    begin
11761       Reset_Analyzed (N);
11762    end Reset_Analyzed_Flags;
11763
11764    ---------------------------
11765    -- Safe_To_Capture_Value --
11766    ---------------------------
11767
11768    function Safe_To_Capture_Value
11769      (N    : Node_Id;
11770       Ent  : Entity_Id;
11771       Cond : Boolean := False) return Boolean
11772    is
11773    begin
11774       --  The only entities for which we track constant values are variables
11775       --  which are not renamings, constants, out parameters, and in out
11776       --  parameters, so check if we have this case.
11777
11778       --  Note: it may seem odd to track constant values for constants, but in
11779       --  fact this routine is used for other purposes than simply capturing
11780       --  the value. In particular, the setting of Known[_Non]_Null.
11781
11782       if (Ekind (Ent) = E_Variable and then No (Renamed_Object (Ent)))
11783             or else
11784           Ekind (Ent) = E_Constant
11785             or else
11786           Ekind (Ent) = E_Out_Parameter
11787             or else
11788           Ekind (Ent) = E_In_Out_Parameter
11789       then
11790          null;
11791
11792       --  For conditionals, we also allow loop parameters and all formals,
11793       --  including in parameters.
11794
11795       elsif Cond
11796         and then
11797           (Ekind (Ent) = E_Loop_Parameter
11798              or else
11799            Ekind (Ent) = E_In_Parameter)
11800       then
11801          null;
11802
11803       --  For all other cases, not just unsafe, but impossible to capture
11804       --  Current_Value, since the above are the only entities which have
11805       --  Current_Value fields.
11806
11807       else
11808          return False;
11809       end if;
11810
11811       --  Skip if volatile or aliased, since funny things might be going on in
11812       --  these cases which we cannot necessarily track. Also skip any variable
11813       --  for which an address clause is given, or whose address is taken. Also
11814       --  never capture value of library level variables (an attempt to do so
11815       --  can occur in the case of package elaboration code).
11816
11817       if Treat_As_Volatile (Ent)
11818         or else Is_Aliased (Ent)
11819         or else Present (Address_Clause (Ent))
11820         or else Address_Taken (Ent)
11821         or else (Is_Library_Level_Entity (Ent)
11822                    and then Ekind (Ent) = E_Variable)
11823       then
11824          return False;
11825       end if;
11826
11827       --  OK, all above conditions are met. We also require that the scope of
11828       --  the reference be the same as the scope of the entity, not counting
11829       --  packages and blocks and loops.
11830
11831       declare
11832          E_Scope : constant Entity_Id := Scope (Ent);
11833          R_Scope : Entity_Id;
11834
11835       begin
11836          R_Scope := Current_Scope;
11837          while R_Scope /= Standard_Standard loop
11838             exit when R_Scope = E_Scope;
11839
11840             if not Ekind_In (R_Scope, E_Package, E_Block, E_Loop) then
11841                return False;
11842             else
11843                R_Scope := Scope (R_Scope);
11844             end if;
11845          end loop;
11846       end;
11847
11848       --  We also require that the reference does not appear in a context
11849       --  where it is not sure to be executed (i.e. a conditional context
11850       --  or an exception handler). We skip this if Cond is True, since the
11851       --  capturing of values from conditional tests handles this ok.
11852
11853       if Cond then
11854          return True;
11855       end if;
11856
11857       declare
11858          Desc : Node_Id;
11859          P    : Node_Id;
11860
11861       begin
11862          Desc := N;
11863
11864          P := Parent (N);
11865          while Present (P) loop
11866             if         Nkind (P) = N_If_Statement
11867               or else  Nkind (P) = N_Case_Statement
11868               or else (Nkind (P) in N_Short_Circuit
11869                          and then Desc = Right_Opnd (P))
11870               or else (Nkind (P) = N_Conditional_Expression
11871                          and then Desc /= First (Expressions (P)))
11872               or else  Nkind (P) = N_Exception_Handler
11873               or else  Nkind (P) = N_Selective_Accept
11874               or else  Nkind (P) = N_Conditional_Entry_Call
11875               or else  Nkind (P) = N_Timed_Entry_Call
11876               or else  Nkind (P) = N_Asynchronous_Select
11877             then
11878                return False;
11879             else
11880                Desc := P;
11881                P    := Parent (P);
11882             end if;
11883          end loop;
11884       end;
11885
11886       --  OK, looks safe to set value
11887
11888       return True;
11889    end Safe_To_Capture_Value;
11890
11891    ---------------
11892    -- Same_Name --
11893    ---------------
11894
11895    function Same_Name (N1, N2 : Node_Id) return Boolean is
11896       K1 : constant Node_Kind := Nkind (N1);
11897       K2 : constant Node_Kind := Nkind (N2);
11898
11899    begin
11900       if (K1 = N_Identifier or else K1 = N_Defining_Identifier)
11901         and then (K2 = N_Identifier or else K2 = N_Defining_Identifier)
11902       then
11903          return Chars (N1) = Chars (N2);
11904
11905       elsif (K1 = N_Selected_Component or else K1 = N_Expanded_Name)
11906         and then (K2 = N_Selected_Component or else K2 = N_Expanded_Name)
11907       then
11908          return Same_Name (Selector_Name (N1), Selector_Name (N2))
11909            and then Same_Name (Prefix (N1), Prefix (N2));
11910
11911       else
11912          return False;
11913       end if;
11914    end Same_Name;
11915
11916    -----------------
11917    -- Same_Object --
11918    -----------------
11919
11920    function Same_Object (Node1, Node2 : Node_Id) return Boolean is
11921       N1 : constant Node_Id := Original_Node (Node1);
11922       N2 : constant Node_Id := Original_Node (Node2);
11923       --  We do the tests on original nodes, since we are most interested
11924       --  in the original source, not any expansion that got in the way.
11925
11926       K1 : constant Node_Kind := Nkind (N1);
11927       K2 : constant Node_Kind := Nkind (N2);
11928
11929    begin
11930       --  First case, both are entities with same entity
11931
11932       if K1 in N_Has_Entity and then K2 in N_Has_Entity then
11933          declare
11934             EN1 : constant Entity_Id := Entity (N1);
11935             EN2 : constant Entity_Id := Entity (N2);
11936          begin
11937             if Present (EN1) and then Present (EN2)
11938               and then (Ekind_In (EN1, E_Variable, E_Constant)
11939                          or else Is_Formal (EN1))
11940               and then EN1 = EN2
11941             then
11942                return True;
11943             end if;
11944          end;
11945       end if;
11946
11947       --  Second case, selected component with same selector, same record
11948
11949       if K1 = N_Selected_Component
11950         and then K2 = N_Selected_Component
11951         and then Chars (Selector_Name (N1)) = Chars (Selector_Name (N2))
11952       then
11953          return Same_Object (Prefix (N1), Prefix (N2));
11954
11955       --  Third case, indexed component with same subscripts, same array
11956
11957       elsif K1 = N_Indexed_Component
11958         and then K2 = N_Indexed_Component
11959         and then Same_Object (Prefix (N1), Prefix (N2))
11960       then
11961          declare
11962             E1, E2 : Node_Id;
11963          begin
11964             E1 := First (Expressions (N1));
11965             E2 := First (Expressions (N2));
11966             while Present (E1) loop
11967                if not Same_Value (E1, E2) then
11968                   return False;
11969                else
11970                   Next (E1);
11971                   Next (E2);
11972                end if;
11973             end loop;
11974
11975             return True;
11976          end;
11977
11978       --  Fourth case, slice of same array with same bounds
11979
11980       elsif K1 = N_Slice
11981         and then K2 = N_Slice
11982         and then Nkind (Discrete_Range (N1)) = N_Range
11983         and then Nkind (Discrete_Range (N2)) = N_Range
11984         and then Same_Value (Low_Bound (Discrete_Range (N1)),
11985                              Low_Bound (Discrete_Range (N2)))
11986         and then Same_Value (High_Bound (Discrete_Range (N1)),
11987                              High_Bound (Discrete_Range (N2)))
11988       then
11989          return Same_Name (Prefix (N1), Prefix (N2));
11990
11991       --  All other cases, not clearly the same object
11992
11993       else
11994          return False;
11995       end if;
11996    end Same_Object;
11997
11998    ---------------
11999    -- Same_Type --
12000    ---------------
12001
12002    function Same_Type (T1, T2 : Entity_Id) return Boolean is
12003    begin
12004       if T1 = T2 then
12005          return True;
12006
12007       elsif not Is_Constrained (T1)
12008         and then not Is_Constrained (T2)
12009         and then Base_Type (T1) = Base_Type (T2)
12010       then
12011          return True;
12012
12013       --  For now don't bother with case of identical constraints, to be
12014       --  fiddled with later on perhaps (this is only used for optimization
12015       --  purposes, so it is not critical to do a best possible job)
12016
12017       else
12018          return False;
12019       end if;
12020    end Same_Type;
12021
12022    ----------------
12023    -- Same_Value --
12024    ----------------
12025
12026    function Same_Value (Node1, Node2 : Node_Id) return Boolean is
12027    begin
12028       if Compile_Time_Known_Value (Node1)
12029         and then Compile_Time_Known_Value (Node2)
12030         and then Expr_Value (Node1) = Expr_Value (Node2)
12031       then
12032          return True;
12033       elsif Same_Object (Node1, Node2) then
12034          return True;
12035       else
12036          return False;
12037       end if;
12038    end Same_Value;
12039
12040    -----------------
12041    -- Save_Actual --
12042    -----------------
12043
12044    procedure Save_Actual (N : Node_Id;  Writable : Boolean := False) is
12045    begin
12046       if Ada_Version < Ada_2012 then
12047          return;
12048
12049       elsif Is_Entity_Name (N)
12050         or else
12051           Nkind_In (N, N_Indexed_Component, N_Selected_Component, N_Slice)
12052         or else
12053           (Nkind (N) = N_Attribute_Reference
12054             and then Attribute_Name (N) = Name_Access)
12055
12056       then
12057          --  We are only interested in IN OUT parameters of inner calls
12058
12059          if not Writable
12060            or else Nkind (Parent (N)) = N_Function_Call
12061            or else Nkind (Parent (N)) in N_Op
12062          then
12063             Actuals_In_Call.Increment_Last;
12064             Actuals_In_Call.Table (Actuals_In_Call.Last) := (N, Writable);
12065          end if;
12066       end if;
12067    end Save_Actual;
12068
12069    ------------------------
12070    -- Scope_Is_Transient --
12071    ------------------------
12072
12073    function Scope_Is_Transient return Boolean is
12074    begin
12075       return Scope_Stack.Table (Scope_Stack.Last).Is_Transient;
12076    end Scope_Is_Transient;
12077
12078    ------------------
12079    -- Scope_Within --
12080    ------------------
12081
12082    function Scope_Within (Scope1, Scope2 : Entity_Id) return Boolean is
12083       Scop : Entity_Id;
12084
12085    begin
12086       Scop := Scope1;
12087       while Scop /= Standard_Standard loop
12088          Scop := Scope (Scop);
12089
12090          if Scop = Scope2 then
12091             return True;
12092          end if;
12093       end loop;
12094
12095       return False;
12096    end Scope_Within;
12097
12098    --------------------------
12099    -- Scope_Within_Or_Same --
12100    --------------------------
12101
12102    function Scope_Within_Or_Same (Scope1, Scope2 : Entity_Id) return Boolean is
12103       Scop : Entity_Id;
12104
12105    begin
12106       Scop := Scope1;
12107       while Scop /= Standard_Standard loop
12108          if Scop = Scope2 then
12109             return True;
12110          else
12111             Scop := Scope (Scop);
12112          end if;
12113       end loop;
12114
12115       return False;
12116    end Scope_Within_Or_Same;
12117
12118    --------------------
12119    -- Set_Convention --
12120    --------------------
12121
12122    procedure Set_Convention (E : Entity_Id; Val : Snames.Convention_Id) is
12123    begin
12124       Basic_Set_Convention (E, Val);
12125
12126       if Is_Type (E)
12127         and then Is_Access_Subprogram_Type (Base_Type (E))
12128         and then Has_Foreign_Convention (E)
12129       then
12130          Set_Can_Use_Internal_Rep (E, False);
12131       end if;
12132    end Set_Convention;
12133
12134    ------------------------
12135    -- Set_Current_Entity --
12136    ------------------------
12137
12138    --  The given entity is to be set as the currently visible definition of its
12139    --  associated name (i.e. the Node_Id associated with its name). All we have
12140    --  to do is to get the name from the identifier, and then set the
12141    --  associated Node_Id to point to the given entity.
12142
12143    procedure Set_Current_Entity (E : Entity_Id) is
12144    begin
12145       Set_Name_Entity_Id (Chars (E), E);
12146    end Set_Current_Entity;
12147
12148    ---------------------------
12149    -- Set_Debug_Info_Needed --
12150    ---------------------------
12151
12152    procedure Set_Debug_Info_Needed (T : Entity_Id) is
12153
12154       procedure Set_Debug_Info_Needed_If_Not_Set (E : Entity_Id);
12155       pragma Inline (Set_Debug_Info_Needed_If_Not_Set);
12156       --  Used to set debug info in a related node if not set already
12157
12158       --------------------------------------
12159       -- Set_Debug_Info_Needed_If_Not_Set --
12160       --------------------------------------
12161
12162       procedure Set_Debug_Info_Needed_If_Not_Set (E : Entity_Id) is
12163       begin
12164          if Present (E)
12165            and then not Needs_Debug_Info (E)
12166          then
12167             Set_Debug_Info_Needed (E);
12168
12169             --  For a private type, indicate that the full view also needs
12170             --  debug information.
12171
12172             if Is_Type (E)
12173               and then Is_Private_Type (E)
12174               and then Present (Full_View (E))
12175             then
12176                Set_Debug_Info_Needed (Full_View (E));
12177             end if;
12178          end if;
12179       end Set_Debug_Info_Needed_If_Not_Set;
12180
12181    --  Start of processing for Set_Debug_Info_Needed
12182
12183    begin
12184       --  Nothing to do if argument is Empty or has Debug_Info_Off set, which
12185       --  indicates that Debug_Info_Needed is never required for the entity.
12186
12187       if No (T)
12188         or else Debug_Info_Off (T)
12189       then
12190          return;
12191       end if;
12192
12193       --  Set flag in entity itself. Note that we will go through the following
12194       --  circuitry even if the flag is already set on T. That's intentional,
12195       --  it makes sure that the flag will be set in subsidiary entities.
12196
12197       Set_Needs_Debug_Info (T);
12198
12199       --  Set flag on subsidiary entities if not set already
12200
12201       if Is_Object (T) then
12202          Set_Debug_Info_Needed_If_Not_Set (Etype (T));
12203
12204       elsif Is_Type (T) then
12205          Set_Debug_Info_Needed_If_Not_Set (Etype (T));
12206
12207          if Is_Record_Type (T) then
12208             declare
12209                Ent : Entity_Id := First_Entity (T);
12210             begin
12211                while Present (Ent) loop
12212                   Set_Debug_Info_Needed_If_Not_Set (Ent);
12213                   Next_Entity (Ent);
12214                end loop;
12215             end;
12216
12217             --  For a class wide subtype, we also need debug information
12218             --  for the equivalent type.
12219
12220             if Ekind (T) = E_Class_Wide_Subtype then
12221                Set_Debug_Info_Needed_If_Not_Set (Equivalent_Type (T));
12222             end if;
12223
12224          elsif Is_Array_Type (T) then
12225             Set_Debug_Info_Needed_If_Not_Set (Component_Type (T));
12226
12227             declare
12228                Indx : Node_Id := First_Index (T);
12229             begin
12230                while Present (Indx) loop
12231                   Set_Debug_Info_Needed_If_Not_Set (Etype (Indx));
12232                   Indx := Next_Index (Indx);
12233                end loop;
12234             end;
12235
12236             --  For a packed array type, we also need debug information for
12237             --  the type used to represent the packed array. Conversely, we
12238             --  also need it for the former if we need it for the latter.
12239
12240             if Is_Packed (T) then
12241                Set_Debug_Info_Needed_If_Not_Set (Packed_Array_Type (T));
12242             end if;
12243
12244             if Is_Packed_Array_Type (T) then
12245                Set_Debug_Info_Needed_If_Not_Set (Original_Array_Type (T));
12246             end if;
12247
12248          elsif Is_Access_Type (T) then
12249             Set_Debug_Info_Needed_If_Not_Set (Directly_Designated_Type (T));
12250
12251          elsif Is_Private_Type (T) then
12252             Set_Debug_Info_Needed_If_Not_Set (Full_View (T));
12253
12254          elsif Is_Protected_Type (T) then
12255             Set_Debug_Info_Needed_If_Not_Set (Corresponding_Record_Type (T));
12256          end if;
12257       end if;
12258    end Set_Debug_Info_Needed;
12259
12260    ---------------------------------
12261    -- Set_Entity_With_Style_Check --
12262    ---------------------------------
12263
12264    procedure Set_Entity_With_Style_Check (N : Node_Id; Val : Entity_Id) is
12265       Val_Actual : Entity_Id;
12266       Nod        : Node_Id;
12267
12268    begin
12269       --  Unconditionally set the entity
12270
12271       Set_Entity (N, Val);
12272
12273       --  Check for No_Implementation_Identifiers
12274
12275       if Restriction_Check_Required (No_Implementation_Identifiers) then
12276
12277          --  We have an implementation defined entity if it is marked as
12278          --  implementation defined, or is defined in a package marked as
12279          --  implementation defined. However, library packages themselves
12280          --  are excluded (we don't want to flag Interfaces itself, just
12281          --  the entities within it).
12282
12283          if (Is_Implementation_Defined (Val)
12284               and then not (Ekind_In (Val, E_Package, E_Generic_Package)
12285                               and then Is_Library_Level_Entity (Val)))
12286            or else Is_Implementation_Defined (Scope (Val))
12287          then
12288             Check_Restriction (No_Implementation_Identifiers, N);
12289          end if;
12290       end if;
12291
12292       --  Do the style check
12293
12294       if Style_Check
12295         and then not Suppress_Style_Checks (Val)
12296         and then not In_Instance
12297       then
12298          if Nkind (N) = N_Identifier then
12299             Nod := N;
12300          elsif Nkind (N) = N_Expanded_Name then
12301             Nod := Selector_Name (N);
12302          else
12303             return;
12304          end if;
12305
12306          --  A special situation arises for derived operations, where we want
12307          --  to do the check against the parent (since the Sloc of the derived
12308          --  operation points to the derived type declaration itself).
12309
12310          Val_Actual := Val;
12311          while not Comes_From_Source (Val_Actual)
12312            and then Nkind (Val_Actual) in N_Entity
12313            and then (Ekind (Val_Actual) = E_Enumeration_Literal
12314                       or else Is_Subprogram (Val_Actual)
12315                       or else Is_Generic_Subprogram (Val_Actual))
12316            and then Present (Alias (Val_Actual))
12317          loop
12318             Val_Actual := Alias (Val_Actual);
12319          end loop;
12320
12321          --  Renaming declarations for generic actuals do not come from source,
12322          --  and have a different name from that of the entity they rename, so
12323          --  there is no style check to perform here.
12324
12325          if Chars (Nod) = Chars (Val_Actual) then
12326             Style.Check_Identifier (Nod, Val_Actual);
12327          end if;
12328       end if;
12329
12330       Set_Entity (N, Val);
12331    end Set_Entity_With_Style_Check;
12332
12333    ------------------------
12334    -- Set_Name_Entity_Id --
12335    ------------------------
12336
12337    procedure Set_Name_Entity_Id (Id : Name_Id; Val : Entity_Id) is
12338    begin
12339       Set_Name_Table_Info (Id, Int (Val));
12340    end Set_Name_Entity_Id;
12341
12342    ---------------------
12343    -- Set_Next_Actual --
12344    ---------------------
12345
12346    procedure Set_Next_Actual (Ass1_Id : Node_Id; Ass2_Id : Node_Id) is
12347    begin
12348       if Nkind (Parent (Ass1_Id)) = N_Parameter_Association then
12349          Set_First_Named_Actual (Parent (Ass1_Id), Ass2_Id);
12350       end if;
12351    end Set_Next_Actual;
12352
12353    ----------------------------------
12354    -- Set_Optimize_Alignment_Flags --
12355    ----------------------------------
12356
12357    procedure Set_Optimize_Alignment_Flags (E : Entity_Id) is
12358    begin
12359       if Optimize_Alignment = 'S' then
12360          Set_Optimize_Alignment_Space (E);
12361       elsif Optimize_Alignment = 'T' then
12362          Set_Optimize_Alignment_Time (E);
12363       end if;
12364    end Set_Optimize_Alignment_Flags;
12365
12366    -----------------------
12367    -- Set_Public_Status --
12368    -----------------------
12369
12370    procedure Set_Public_Status (Id : Entity_Id) is
12371       S : constant Entity_Id := Current_Scope;
12372
12373       function Within_HSS_Or_If (E : Entity_Id) return Boolean;
12374       --  Determines if E is defined within handled statement sequence or
12375       --  an if statement, returns True if so, False otherwise.
12376
12377       ----------------------
12378       -- Within_HSS_Or_If --
12379       ----------------------
12380
12381       function Within_HSS_Or_If (E : Entity_Id) return Boolean is
12382          N : Node_Id;
12383       begin
12384          N := Declaration_Node (E);
12385          loop
12386             N := Parent (N);
12387
12388             if No (N) then
12389                return False;
12390
12391             elsif Nkind_In (N, N_Handled_Sequence_Of_Statements,
12392                                N_If_Statement)
12393             then
12394                return True;
12395             end if;
12396          end loop;
12397       end Within_HSS_Or_If;
12398
12399    --  Start of processing for Set_Public_Status
12400
12401    begin
12402       --  Everything in the scope of Standard is public
12403
12404       if S = Standard_Standard then
12405          Set_Is_Public (Id);
12406
12407       --  Entity is definitely not public if enclosing scope is not public
12408
12409       elsif not Is_Public (S) then
12410          return;
12411
12412       --  An object or function declaration that occurs in a handled sequence
12413       --  of statements or within an if statement is the declaration for a
12414       --  temporary object or local subprogram generated by the expander. It
12415       --  never needs to be made public and furthermore, making it public can
12416       --  cause back end problems.
12417
12418       elsif Nkind_In (Parent (Id), N_Object_Declaration,
12419                                    N_Function_Specification)
12420         and then Within_HSS_Or_If (Id)
12421       then
12422          return;
12423
12424       --  Entities in public packages or records are public
12425
12426       elsif Ekind (S) = E_Package or Is_Record_Type (S) then
12427          Set_Is_Public (Id);
12428
12429       --  The bounds of an entry family declaration can generate object
12430       --  declarations that are visible to the back-end, e.g. in the
12431       --  the declaration of a composite type that contains tasks.
12432
12433       elsif Is_Concurrent_Type (S)
12434         and then not Has_Completion (S)
12435         and then Nkind (Parent (Id)) = N_Object_Declaration
12436       then
12437          Set_Is_Public (Id);
12438       end if;
12439    end Set_Public_Status;
12440
12441    -----------------------------
12442    -- Set_Referenced_Modified --
12443    -----------------------------
12444
12445    procedure Set_Referenced_Modified (N : Node_Id; Out_Param : Boolean) is
12446       Pref : Node_Id;
12447
12448    begin
12449       --  Deal with indexed or selected component where prefix is modified
12450
12451       if Nkind_In (N, N_Indexed_Component, N_Selected_Component) then
12452          Pref := Prefix (N);
12453
12454          --  If prefix is access type, then it is the designated object that is
12455          --  being modified, which means we have no entity to set the flag on.
12456
12457          if No (Etype (Pref)) or else Is_Access_Type (Etype (Pref)) then
12458             return;
12459
12460             --  Otherwise chase the prefix
12461
12462          else
12463             Set_Referenced_Modified (Pref, Out_Param);
12464          end if;
12465
12466       --  Otherwise see if we have an entity name (only other case to process)
12467
12468       elsif Is_Entity_Name (N) and then Present (Entity (N)) then
12469          Set_Referenced_As_LHS           (Entity (N), not Out_Param);
12470          Set_Referenced_As_Out_Parameter (Entity (N), Out_Param);
12471       end if;
12472    end Set_Referenced_Modified;
12473
12474    ----------------------------
12475    -- Set_Scope_Is_Transient --
12476    ----------------------------
12477
12478    procedure Set_Scope_Is_Transient (V : Boolean := True) is
12479    begin
12480       Scope_Stack.Table (Scope_Stack.Last).Is_Transient := V;
12481    end Set_Scope_Is_Transient;
12482
12483    -------------------
12484    -- Set_Size_Info --
12485    -------------------
12486
12487    procedure Set_Size_Info (T1, T2 : Entity_Id) is
12488    begin
12489       --  We copy Esize, but not RM_Size, since in general RM_Size is
12490       --  subtype specific and does not get inherited by all subtypes.
12491
12492       Set_Esize                     (T1, Esize                     (T2));
12493       Set_Has_Biased_Representation (T1, Has_Biased_Representation (T2));
12494
12495       if Is_Discrete_Or_Fixed_Point_Type (T1)
12496            and then
12497          Is_Discrete_Or_Fixed_Point_Type (T2)
12498       then
12499          Set_Is_Unsigned_Type       (T1, Is_Unsigned_Type          (T2));
12500       end if;
12501
12502       Set_Alignment                 (T1, Alignment                 (T2));
12503    end Set_Size_Info;
12504
12505    --------------------
12506    -- Static_Boolean --
12507    --------------------
12508
12509    function Static_Boolean (N : Node_Id) return Uint is
12510    begin
12511       Analyze_And_Resolve (N, Standard_Boolean);
12512
12513       if N = Error
12514         or else Error_Posted (N)
12515         or else Etype (N) = Any_Type
12516       then
12517          return No_Uint;
12518       end if;
12519
12520       if Is_Static_Expression (N) then
12521          if not Raises_Constraint_Error (N) then
12522             return Expr_Value (N);
12523          else
12524             return No_Uint;
12525          end if;
12526
12527       elsif Etype (N) = Any_Type then
12528          return No_Uint;
12529
12530       else
12531          Flag_Non_Static_Expr
12532            ("static boolean expression required here", N);
12533          return No_Uint;
12534       end if;
12535    end Static_Boolean;
12536
12537    --------------------
12538    -- Static_Integer --
12539    --------------------
12540
12541    function Static_Integer (N : Node_Id) return Uint is
12542    begin
12543       Analyze_And_Resolve (N, Any_Integer);
12544
12545       if N = Error
12546         or else Error_Posted (N)
12547         or else Etype (N) = Any_Type
12548       then
12549          return No_Uint;
12550       end if;
12551
12552       if Is_Static_Expression (N) then
12553          if not Raises_Constraint_Error (N) then
12554             return Expr_Value (N);
12555          else
12556             return No_Uint;
12557          end if;
12558
12559       elsif Etype (N) = Any_Type then
12560          return No_Uint;
12561
12562       else
12563          Flag_Non_Static_Expr
12564            ("static integer expression required here", N);
12565          return No_Uint;
12566       end if;
12567    end Static_Integer;
12568
12569    --------------------------
12570    -- Statically_Different --
12571    --------------------------
12572
12573    function Statically_Different (E1, E2 : Node_Id) return Boolean is
12574       R1 : constant Node_Id := Get_Referenced_Object (E1);
12575       R2 : constant Node_Id := Get_Referenced_Object (E2);
12576    begin
12577       return     Is_Entity_Name (R1)
12578         and then Is_Entity_Name (R2)
12579         and then Entity (R1) /= Entity (R2)
12580         and then not Is_Formal (Entity (R1))
12581         and then not Is_Formal (Entity (R2));
12582    end Statically_Different;
12583
12584    -----------------------------
12585    -- Subprogram_Access_Level --
12586    -----------------------------
12587
12588    function Subprogram_Access_Level (Subp : Entity_Id) return Uint is
12589    begin
12590       if Present (Alias (Subp)) then
12591          return Subprogram_Access_Level (Alias (Subp));
12592       else
12593          return Scope_Depth (Enclosing_Dynamic_Scope (Subp));
12594       end if;
12595    end Subprogram_Access_Level;
12596
12597    -----------------
12598    -- Trace_Scope --
12599    -----------------
12600
12601    procedure Trace_Scope (N : Node_Id; E : Entity_Id; Msg : String) is
12602    begin
12603       if Debug_Flag_W then
12604          for J in 0 .. Scope_Stack.Last loop
12605             Write_Str ("  ");
12606          end loop;
12607
12608          Write_Str (Msg);
12609          Write_Name (Chars (E));
12610          Write_Str (" from ");
12611          Write_Location (Sloc (N));
12612          Write_Eol;
12613       end if;
12614    end Trace_Scope;
12615
12616    -----------------------
12617    -- Transfer_Entities --
12618    -----------------------
12619
12620    procedure Transfer_Entities (From : Entity_Id; To : Entity_Id) is
12621       Ent : Entity_Id := First_Entity (From);
12622
12623    begin
12624       if No (Ent) then
12625          return;
12626       end if;
12627
12628       if (Last_Entity (To)) = Empty then
12629          Set_First_Entity (To, Ent);
12630       else
12631          Set_Next_Entity (Last_Entity (To), Ent);
12632       end if;
12633
12634       Set_Last_Entity (To, Last_Entity (From));
12635
12636       while Present (Ent) loop
12637          Set_Scope (Ent, To);
12638
12639          if not Is_Public (Ent) then
12640             Set_Public_Status (Ent);
12641
12642             if Is_Public (Ent)
12643               and then Ekind (Ent) = E_Record_Subtype
12644
12645             then
12646                --  The components of the propagated Itype must be public
12647                --  as well.
12648
12649                declare
12650                   Comp : Entity_Id;
12651                begin
12652                   Comp := First_Entity (Ent);
12653                   while Present (Comp) loop
12654                      Set_Is_Public (Comp);
12655                      Next_Entity (Comp);
12656                   end loop;
12657                end;
12658             end if;
12659          end if;
12660
12661          Next_Entity (Ent);
12662       end loop;
12663
12664       Set_First_Entity (From, Empty);
12665       Set_Last_Entity (From, Empty);
12666    end Transfer_Entities;
12667
12668    -----------------------
12669    -- Type_Access_Level --
12670    -----------------------
12671
12672    function Type_Access_Level (Typ : Entity_Id) return Uint is
12673       Btyp : Entity_Id;
12674
12675    begin
12676       Btyp := Base_Type (Typ);
12677
12678       --  Ada 2005 (AI-230): For most cases of anonymous access types, we
12679       --  simply use the level where the type is declared. This is true for
12680       --  stand-alone object declarations, and for anonymous access types
12681       --  associated with components the level is the same as that of the
12682       --  enclosing composite type. However, special treatment is needed for
12683       --  the cases of access parameters, return objects of an anonymous access
12684       --  type, and, in Ada 95, access discriminants of limited types.
12685
12686       if Ekind (Btyp) in Access_Kind then
12687          if Ekind (Btyp) = E_Anonymous_Access_Type then
12688
12689             --  If the type is a nonlocal anonymous access type (such as for
12690             --  an access parameter) we treat it as being declared at the
12691             --  library level to ensure that names such as X.all'access don't
12692             --  fail static accessibility checks.
12693
12694             if not Is_Local_Anonymous_Access (Typ) then
12695                return Scope_Depth (Standard_Standard);
12696
12697             --  If this is a return object, the accessibility level is that of
12698             --  the result subtype of the enclosing function. The test here is
12699             --  little complicated, because we have to account for extended
12700             --  return statements that have been rewritten as blocks, in which
12701             --  case we have to find and the Is_Return_Object attribute of the
12702             --  itype's associated object. It would be nice to find a way to
12703             --  simplify this test, but it doesn't seem worthwhile to add a new
12704             --  flag just for purposes of this test. ???
12705
12706             elsif Ekind (Scope (Btyp)) = E_Return_Statement
12707               or else
12708                 (Is_Itype (Btyp)
12709                   and then Nkind (Associated_Node_For_Itype (Btyp)) =
12710                              N_Object_Declaration
12711                   and then Is_Return_Object
12712                              (Defining_Identifier
12713                                 (Associated_Node_For_Itype (Btyp))))
12714             then
12715                declare
12716                   Scop : Entity_Id;
12717
12718                begin
12719                   Scop := Scope (Scope (Btyp));
12720                   while Present (Scop) loop
12721                      exit when Ekind (Scop) = E_Function;
12722                      Scop := Scope (Scop);
12723                   end loop;
12724
12725                   --  Treat the return object's type as having the level of the
12726                   --  function's result subtype (as per RM05-6.5(5.3/2)).
12727
12728                   return Type_Access_Level (Etype (Scop));
12729                end;
12730             end if;
12731          end if;
12732
12733          Btyp := Root_Type (Btyp);
12734
12735          --  The accessibility level of anonymous access types associated with
12736          --  discriminants is that of the current instance of the type, and
12737          --  that's deeper than the type itself (AARM 3.10.2 (12.3.21)).
12738
12739          --  AI-402: access discriminants have accessibility based on the
12740          --  object rather than the type in Ada 2005, so the above paragraph
12741          --  doesn't apply.
12742
12743          --  ??? Needs completion with rules from AI-416
12744
12745          if Ada_Version <= Ada_95
12746            and then Ekind (Typ) = E_Anonymous_Access_Type
12747            and then Present (Associated_Node_For_Itype (Typ))
12748            and then Nkind (Associated_Node_For_Itype (Typ)) =
12749                                                  N_Discriminant_Specification
12750          then
12751             return Scope_Depth (Enclosing_Dynamic_Scope (Btyp)) + 1;
12752          end if;
12753       end if;
12754
12755       --  Return library level for a generic formal type. This is done because
12756       --  RM(10.3.2) says that "The statically deeper relationship does not
12757       --  apply to ... a descendant of a generic formal type". Rather than
12758       --  checking at each point where a static accessibility check is
12759       --  performed to see if we are dealing with a formal type, this rule is
12760       --  implemented by having Type_Access_Level and Deepest_Type_Access_Level
12761       --  return extreme values for a formal type; Deepest_Type_Access_Level
12762       --  returns Int'Last. By calling the appropriate function from among the
12763       --  two, we ensure that the static accessibility check will pass if we
12764       --  happen to run into a formal type. More specifically, we should call
12765       --  Deepest_Type_Access_Level instead of Type_Access_Level whenever the
12766       --  call occurs as part of a static accessibility check and the error
12767       --  case is the case where the type's level is too shallow (as opposed
12768       --  to too deep).
12769
12770       if Is_Generic_Type (Root_Type (Btyp)) then
12771          return Scope_Depth (Standard_Standard);
12772       end if;
12773
12774       return Scope_Depth (Enclosing_Dynamic_Scope (Btyp));
12775    end Type_Access_Level;
12776
12777    ------------------------------------
12778    -- Type_Without_Stream_Operation  --
12779    ------------------------------------
12780
12781    function Type_Without_Stream_Operation
12782      (T  : Entity_Id;
12783       Op : TSS_Name_Type := TSS_Null) return Entity_Id
12784    is
12785       BT         : constant Entity_Id := Base_Type (T);
12786       Op_Missing : Boolean;
12787
12788    begin
12789       if not Restriction_Active (No_Default_Stream_Attributes) then
12790          return Empty;
12791       end if;
12792
12793       if Is_Elementary_Type (T) then
12794          if Op = TSS_Null then
12795             Op_Missing :=
12796               No (TSS (BT, TSS_Stream_Read))
12797                 or else No (TSS (BT, TSS_Stream_Write));
12798
12799          else
12800             Op_Missing := No (TSS (BT, Op));
12801          end if;
12802
12803          if Op_Missing then
12804             return T;
12805          else
12806             return Empty;
12807          end if;
12808
12809       elsif Is_Array_Type (T) then
12810          return Type_Without_Stream_Operation (Component_Type (T), Op);
12811
12812       elsif Is_Record_Type (T) then
12813          declare
12814             Comp  : Entity_Id;
12815             C_Typ : Entity_Id;
12816
12817          begin
12818             Comp := First_Component (T);
12819             while Present (Comp) loop
12820                C_Typ := Type_Without_Stream_Operation (Etype (Comp), Op);
12821
12822                if Present (C_Typ) then
12823                   return C_Typ;
12824                end if;
12825
12826                Next_Component (Comp);
12827             end loop;
12828
12829             return Empty;
12830          end;
12831
12832       elsif Is_Private_Type (T)
12833         and then Present (Full_View (T))
12834       then
12835          return Type_Without_Stream_Operation (Full_View (T), Op);
12836       else
12837          return Empty;
12838       end if;
12839    end Type_Without_Stream_Operation;
12840
12841    ----------------------------
12842    -- Unique_Defining_Entity --
12843    ----------------------------
12844
12845    function Unique_Defining_Entity (N : Node_Id) return Entity_Id is
12846    begin
12847       return Unique_Entity (Defining_Entity (N));
12848    end Unique_Defining_Entity;
12849
12850    -------------------
12851    -- Unique_Entity --
12852    -------------------
12853
12854    function Unique_Entity (E : Entity_Id) return Entity_Id is
12855       U : Entity_Id := E;
12856       P : Node_Id;
12857
12858    begin
12859       case Ekind (E) is
12860          when E_Constant =>
12861             if Present (Full_View (E)) then
12862                U := Full_View (E);
12863             end if;
12864
12865          when Type_Kind =>
12866             if Present (Full_View (E)) then
12867                U := Full_View (E);
12868             end if;
12869
12870          when E_Package_Body =>
12871             P := Parent (E);
12872
12873             if Nkind (P) = N_Defining_Program_Unit_Name then
12874                P := Parent (P);
12875             end if;
12876
12877             U := Corresponding_Spec (P);
12878
12879          when E_Subprogram_Body =>
12880             P := Parent (E);
12881
12882             if Nkind (P) = N_Defining_Program_Unit_Name then
12883                P := Parent (P);
12884             end if;
12885
12886             P := Parent (P);
12887
12888             if Nkind (P) = N_Subprogram_Body_Stub then
12889                if Present (Library_Unit (P)) then
12890
12891                   --  Get to the function or procedure (generic) entity through
12892                   --  the body entity.
12893
12894                   U :=
12895                     Unique_Entity (Defining_Entity (Get_Body_From_Stub (P)));
12896                end if;
12897             else
12898                U := Corresponding_Spec (P);
12899             end if;
12900
12901          when Formal_Kind =>
12902             if Present (Spec_Entity (E)) then
12903                U := Spec_Entity (E);
12904             end if;
12905
12906          when others =>
12907             null;
12908       end case;
12909
12910       return U;
12911    end Unique_Entity;
12912
12913    -----------------
12914    -- Unique_Name --
12915    -----------------
12916
12917    function Unique_Name (E : Entity_Id) return String is
12918
12919       --  Names of E_Subprogram_Body or E_Package_Body entities are not
12920       --  reliable, as they may not include the overloading suffix. Instead,
12921       --  when looking for the name of E or one of its enclosing scope, we get
12922       --  the name of the corresponding Unique_Entity.
12923
12924       function Get_Scoped_Name (E : Entity_Id) return String;
12925       --  Return the name of E prefixed by all the names of the scopes to which
12926       --  E belongs, except for Standard.
12927
12928       ---------------------
12929       -- Get_Scoped_Name --
12930       ---------------------
12931
12932       function Get_Scoped_Name (E : Entity_Id) return String is
12933          Name : constant String := Get_Name_String (Chars (E));
12934       begin
12935          if Has_Fully_Qualified_Name (E)
12936            or else Scope (E) = Standard_Standard
12937          then
12938             return Name;
12939          else
12940             return Get_Scoped_Name (Unique_Entity (Scope (E))) & "__" & Name;
12941          end if;
12942       end Get_Scoped_Name;
12943
12944    --  Start of processing for Unique_Name
12945
12946    begin
12947       if E = Standard_Standard then
12948          return Get_Name_String (Name_Standard);
12949
12950       elsif Scope (E) = Standard_Standard
12951         and then not (Ekind (E) = E_Package or else Is_Subprogram (E))
12952       then
12953          return Get_Name_String (Name_Standard) & "__" &
12954            Get_Name_String (Chars (E));
12955
12956       elsif Ekind (E) = E_Enumeration_Literal then
12957          return Unique_Name (Etype (E)) & "__" & Get_Name_String (Chars (E));
12958
12959       else
12960          return Get_Scoped_Name (Unique_Entity (E));
12961       end if;
12962    end Unique_Name;
12963
12964    ---------------------
12965    -- Unit_Is_Visible --
12966    ---------------------
12967
12968    function Unit_Is_Visible (U : Entity_Id) return Boolean is
12969       Curr        : constant Node_Id   := Cunit (Current_Sem_Unit);
12970       Curr_Entity : constant Entity_Id := Cunit_Entity (Current_Sem_Unit);
12971
12972       function Unit_In_Parent_Context (Par_Unit : Node_Id) return Boolean;
12973       --  For a child unit, check whether unit appears in a with_clause
12974       --  of a parent.
12975
12976       function Unit_In_Context (Comp_Unit : Node_Id) return Boolean;
12977       --  Scan the context clause of one compilation unit looking for a
12978       --  with_clause for the unit in question.
12979
12980       ----------------------------
12981       -- Unit_In_Parent_Context --
12982       ----------------------------
12983
12984       function Unit_In_Parent_Context (Par_Unit : Node_Id) return Boolean is
12985       begin
12986          if Unit_In_Context (Par_Unit) then
12987             return True;
12988
12989          elsif Is_Child_Unit (Defining_Entity (Unit (Par_Unit))) then
12990             return Unit_In_Parent_Context (Parent_Spec (Unit (Par_Unit)));
12991
12992          else
12993             return False;
12994          end if;
12995       end Unit_In_Parent_Context;
12996
12997       ---------------------
12998       -- Unit_In_Context --
12999       ---------------------
13000
13001       function Unit_In_Context (Comp_Unit : Node_Id) return Boolean is
13002          Clause : Node_Id;
13003
13004       begin
13005          Clause := First (Context_Items (Comp_Unit));
13006          while Present (Clause) loop
13007             if Nkind (Clause) = N_With_Clause then
13008                if Library_Unit (Clause) = U then
13009                   return True;
13010
13011                --  The with_clause may denote a renaming of the unit we are
13012                --  looking for, eg. Text_IO which renames Ada.Text_IO.
13013
13014                elsif
13015                  Renamed_Entity (Entity (Name (Clause))) =
13016                                                 Defining_Entity (Unit (U))
13017                then
13018                   return True;
13019                end if;
13020             end if;
13021
13022             Next (Clause);
13023          end loop;
13024
13025          return False;
13026       end Unit_In_Context;
13027
13028    --  Start of processing for Unit_Is_Visible
13029
13030    begin
13031       --  The currrent unit is directly visible
13032
13033       if Curr = U then
13034          return True;
13035
13036       elsif Unit_In_Context (Curr) then
13037          return True;
13038
13039       --  If the current unit is a body, check the context of the spec
13040
13041       elsif Nkind (Unit (Curr)) = N_Package_Body
13042         or else
13043           (Nkind (Unit (Curr)) = N_Subprogram_Body
13044             and then not Acts_As_Spec (Unit (Curr)))
13045       then
13046          if Unit_In_Context (Library_Unit (Curr)) then
13047             return True;
13048          end if;
13049       end if;
13050
13051       --  If the spec is a child unit, examine the parents
13052
13053       if Is_Child_Unit (Curr_Entity) then
13054          if Nkind (Unit (Curr)) in N_Unit_Body then
13055             return
13056               Unit_In_Parent_Context
13057                 (Parent_Spec (Unit (Library_Unit (Curr))));
13058          else
13059             return Unit_In_Parent_Context (Parent_Spec (Unit (Curr)));
13060          end if;
13061
13062       else
13063          return False;
13064       end if;
13065    end Unit_Is_Visible;
13066
13067    ------------------------------
13068    -- Universal_Interpretation --
13069    ------------------------------
13070
13071    function Universal_Interpretation (Opnd : Node_Id) return Entity_Id is
13072       Index : Interp_Index;
13073       It    : Interp;
13074
13075    begin
13076       --  The argument may be a formal parameter of an operator or subprogram
13077       --  with multiple interpretations, or else an expression for an actual.
13078
13079       if Nkind (Opnd) = N_Defining_Identifier
13080         or else not Is_Overloaded (Opnd)
13081       then
13082          if Etype (Opnd) = Universal_Integer
13083            or else Etype (Opnd) = Universal_Real
13084          then
13085             return Etype (Opnd);
13086          else
13087             return Empty;
13088          end if;
13089
13090       else
13091          Get_First_Interp (Opnd, Index, It);
13092          while Present (It.Typ) loop
13093             if It.Typ = Universal_Integer
13094               or else It.Typ = Universal_Real
13095             then
13096                return It.Typ;
13097             end if;
13098
13099             Get_Next_Interp (Index, It);
13100          end loop;
13101
13102          return Empty;
13103       end if;
13104    end Universal_Interpretation;
13105
13106    ---------------
13107    -- Unqualify --
13108    ---------------
13109
13110    function Unqualify (Expr : Node_Id) return Node_Id is
13111    begin
13112       --  Recurse to handle unlikely case of multiple levels of qualification
13113
13114       if Nkind (Expr) = N_Qualified_Expression then
13115          return Unqualify (Expression (Expr));
13116
13117       --  Normal case, not a qualified expression
13118
13119       else
13120          return Expr;
13121       end if;
13122    end Unqualify;
13123
13124    -----------------------
13125    -- Visible_Ancestors --
13126    -----------------------
13127
13128    function Visible_Ancestors (Typ : Entity_Id) return Elist_Id is
13129       List_1 : Elist_Id;
13130       List_2 : Elist_Id;
13131       Elmt   : Elmt_Id;
13132
13133    begin
13134       pragma Assert (Is_Record_Type (Typ)
13135         and then Is_Tagged_Type (Typ));
13136
13137       --  Collect all the parents and progenitors of Typ. If the full-view of
13138       --  private parents and progenitors is available then it is used to
13139       --  generate the list of visible ancestors; otherwise their partial
13140       --  view is added to the resulting list.
13141
13142       Collect_Parents
13143         (T               => Typ,
13144          List            => List_1,
13145          Use_Full_View   => True);
13146
13147       Collect_Interfaces
13148         (T               => Typ,
13149          Ifaces_List     => List_2,
13150          Exclude_Parents => True,
13151          Use_Full_View   => True);
13152
13153       --  Join the two lists. Avoid duplications because an interface may
13154       --  simultaneously be parent and progenitor of a type.
13155
13156       Elmt := First_Elmt (List_2);
13157       while Present (Elmt) loop
13158          Append_Unique_Elmt (Node (Elmt), List_1);
13159          Next_Elmt (Elmt);
13160       end loop;
13161
13162       return List_1;
13163    end Visible_Ancestors;
13164
13165    ----------------------
13166    -- Within_Init_Proc --
13167    ----------------------
13168
13169    function Within_Init_Proc return Boolean is
13170       S : Entity_Id;
13171
13172    begin
13173       S := Current_Scope;
13174       while not Is_Overloadable (S) loop
13175          if S = Standard_Standard then
13176             return False;
13177          else
13178             S := Scope (S);
13179          end if;
13180       end loop;
13181
13182       return Is_Init_Proc (S);
13183    end Within_Init_Proc;
13184
13185    ----------------
13186    -- Wrong_Type --
13187    ----------------
13188
13189    procedure Wrong_Type (Expr : Node_Id; Expected_Type : Entity_Id) is
13190       Found_Type : constant Entity_Id := First_Subtype (Etype (Expr));
13191       Expec_Type : constant Entity_Id := First_Subtype (Expected_Type);
13192
13193       Matching_Field : Entity_Id;
13194       --  Entity to give a more precise suggestion on how to write a one-
13195       --  element positional aggregate.
13196
13197       function Has_One_Matching_Field return Boolean;
13198       --  Determines if Expec_Type is a record type with a single component or
13199       --  discriminant whose type matches the found type or is one dimensional
13200       --  array whose component type matches the found type.
13201
13202       ----------------------------
13203       -- Has_One_Matching_Field --
13204       ----------------------------
13205
13206       function Has_One_Matching_Field return Boolean is
13207          E : Entity_Id;
13208
13209       begin
13210          Matching_Field := Empty;
13211
13212          if Is_Array_Type (Expec_Type)
13213            and then Number_Dimensions (Expec_Type) = 1
13214            and then
13215              Covers (Etype (Component_Type (Expec_Type)), Found_Type)
13216          then
13217             --  Use type name if available. This excludes multidimensional
13218             --  arrays and anonymous arrays.
13219
13220             if Comes_From_Source (Expec_Type) then
13221                Matching_Field := Expec_Type;
13222
13223             --  For an assignment, use name of target
13224
13225             elsif Nkind (Parent (Expr)) = N_Assignment_Statement
13226               and then Is_Entity_Name (Name (Parent (Expr)))
13227             then
13228                Matching_Field := Entity (Name (Parent (Expr)));
13229             end if;
13230
13231             return True;
13232
13233          elsif not Is_Record_Type (Expec_Type) then
13234             return False;
13235
13236          else
13237             E := First_Entity (Expec_Type);
13238             loop
13239                if No (E) then
13240                   return False;
13241
13242                elsif (Ekind (E) /= E_Discriminant
13243                        and then Ekind (E) /= E_Component)
13244                  or else (Chars (E) = Name_uTag
13245                            or else Chars (E) = Name_uParent)
13246                then
13247                   Next_Entity (E);
13248
13249                else
13250                   exit;
13251                end if;
13252             end loop;
13253
13254             if not Covers (Etype (E), Found_Type) then
13255                return False;
13256
13257             elsif Present (Next_Entity (E)) then
13258                return False;
13259
13260             else
13261                Matching_Field := E;
13262                return True;
13263             end if;
13264          end if;
13265       end Has_One_Matching_Field;
13266
13267    --  Start of processing for Wrong_Type
13268
13269    begin
13270       --  Don't output message if either type is Any_Type, or if a message
13271       --  has already been posted for this node. We need to do the latter
13272       --  check explicitly (it is ordinarily done in Errout), because we
13273       --  are using ! to force the output of the error messages.
13274
13275       if Expec_Type = Any_Type
13276         or else Found_Type = Any_Type
13277         or else Error_Posted (Expr)
13278       then
13279          return;
13280
13281       --  If one of the types is a Taft-Amendment type and the other it its
13282       --  completion, it must be an illegal use of a TAT in the spec, for
13283       --  which an error was already emitted. Avoid cascaded errors.
13284
13285       elsif Is_Incomplete_Type (Expec_Type)
13286         and then Has_Completion_In_Body (Expec_Type)
13287         and then Full_View (Expec_Type) = Etype (Expr)
13288       then
13289          return;
13290
13291       elsif Is_Incomplete_Type (Etype (Expr))
13292         and then Has_Completion_In_Body (Etype (Expr))
13293         and then Full_View (Etype (Expr)) = Expec_Type
13294       then
13295          return;
13296
13297       --  In  an instance, there is an ongoing problem with completion of
13298       --  type derived from private types. Their structure is what Gigi
13299       --  expects, but the  Etype is the parent type rather than the
13300       --  derived private type itself. Do not flag error in this case. The
13301       --  private completion is an entity without a parent, like an Itype.
13302       --  Similarly, full and partial views may be incorrect in the instance.
13303       --  There is no simple way to insure that it is consistent ???
13304
13305       elsif In_Instance then
13306          if Etype (Etype (Expr)) = Etype (Expected_Type)
13307            and then
13308              (Has_Private_Declaration (Expected_Type)
13309                or else Has_Private_Declaration (Etype (Expr)))
13310            and then No (Parent (Expected_Type))
13311          then
13312             return;
13313          end if;
13314       end if;
13315
13316       --  An interesting special check. If the expression is parenthesized
13317       --  and its type corresponds to the type of the sole component of the
13318       --  expected record type, or to the component type of the expected one
13319       --  dimensional array type, then assume we have a bad aggregate attempt.
13320
13321       if Nkind (Expr) in N_Subexpr
13322         and then Paren_Count (Expr) /= 0
13323         and then Has_One_Matching_Field
13324       then
13325          Error_Msg_N ("positional aggregate cannot have one component", Expr);
13326          if Present (Matching_Field) then
13327             if Is_Array_Type (Expec_Type) then
13328                Error_Msg_NE
13329                  ("\write instead `&''First ='> ...`", Expr, Matching_Field);
13330
13331             else
13332                Error_Msg_NE
13333                  ("\write instead `& ='> ...`", Expr, Matching_Field);
13334             end if;
13335          end if;
13336
13337       --  Another special check, if we are looking for a pool-specific access
13338       --  type and we found an E_Access_Attribute_Type, then we have the case
13339       --  of an Access attribute being used in a context which needs a pool-
13340       --  specific type, which is never allowed. The one extra check we make
13341       --  is that the expected designated type covers the Found_Type.
13342
13343       elsif Is_Access_Type (Expec_Type)
13344         and then Ekind (Found_Type) = E_Access_Attribute_Type
13345         and then Ekind (Base_Type (Expec_Type)) /= E_General_Access_Type
13346         and then Ekind (Base_Type (Expec_Type)) /= E_Anonymous_Access_Type
13347         and then Covers
13348           (Designated_Type (Expec_Type), Designated_Type (Found_Type))
13349       then
13350          Error_Msg_N -- CODEFIX
13351            ("result must be general access type!", Expr);
13352          Error_Msg_NE -- CODEFIX
13353            ("add ALL to }!", Expr, Expec_Type);
13354
13355       --  Another special check, if the expected type is an integer type,
13356       --  but the expression is of type System.Address, and the parent is
13357       --  an addition or subtraction operation whose left operand is the
13358       --  expression in question and whose right operand is of an integral
13359       --  type, then this is an attempt at address arithmetic, so give
13360       --  appropriate message.
13361
13362       elsif Is_Integer_Type (Expec_Type)
13363         and then Is_RTE (Found_Type, RE_Address)
13364         and then (Nkind (Parent (Expr)) = N_Op_Add
13365                     or else
13366                   Nkind (Parent (Expr)) = N_Op_Subtract)
13367         and then Expr = Left_Opnd (Parent (Expr))
13368         and then Is_Integer_Type (Etype (Right_Opnd (Parent (Expr))))
13369       then
13370          Error_Msg_N
13371            ("address arithmetic not predefined in package System",
13372             Parent (Expr));
13373          Error_Msg_N
13374            ("\possible missing with/use of System.Storage_Elements",
13375             Parent (Expr));
13376          return;
13377
13378       --  If the expected type is an anonymous access type, as for access
13379       --  parameters and discriminants, the error is on the designated types.
13380
13381       elsif Ekind (Expec_Type) = E_Anonymous_Access_Type then
13382          if Comes_From_Source (Expec_Type) then
13383             Error_Msg_NE ("expected}!", Expr, Expec_Type);
13384          else
13385             Error_Msg_NE
13386               ("expected an access type with designated}",
13387                  Expr, Designated_Type (Expec_Type));
13388          end if;
13389
13390          if Is_Access_Type (Found_Type)
13391            and then not Comes_From_Source (Found_Type)
13392          then
13393             Error_Msg_NE
13394               ("\\found an access type with designated}!",
13395                 Expr, Designated_Type (Found_Type));
13396          else
13397             if From_With_Type (Found_Type) then
13398                Error_Msg_NE ("\\found incomplete}!", Expr, Found_Type);
13399                Error_Msg_Qual_Level := 99;
13400                Error_Msg_NE -- CODEFIX
13401                  ("\\missing `WITH &;", Expr, Scope (Found_Type));
13402                Error_Msg_Qual_Level := 0;
13403             else
13404                Error_Msg_NE ("found}!", Expr, Found_Type);
13405             end if;
13406          end if;
13407
13408       --  Normal case of one type found, some other type expected
13409
13410       else
13411          --  If the names of the two types are the same, see if some number
13412          --  of levels of qualification will help. Don't try more than three
13413          --  levels, and if we get to standard, it's no use (and probably
13414          --  represents an error in the compiler) Also do not bother with
13415          --  internal scope names.
13416
13417          declare
13418             Expec_Scope : Entity_Id;
13419             Found_Scope : Entity_Id;
13420
13421          begin
13422             Expec_Scope := Expec_Type;
13423             Found_Scope := Found_Type;
13424
13425             for Levels in Int range 0 .. 3 loop
13426                if Chars (Expec_Scope) /= Chars (Found_Scope) then
13427                   Error_Msg_Qual_Level := Levels;
13428                   exit;
13429                end if;
13430
13431                Expec_Scope := Scope (Expec_Scope);
13432                Found_Scope := Scope (Found_Scope);
13433
13434                exit when Expec_Scope = Standard_Standard
13435                  or else Found_Scope = Standard_Standard
13436                  or else not Comes_From_Source (Expec_Scope)
13437                  or else not Comes_From_Source (Found_Scope);
13438             end loop;
13439          end;
13440
13441          if Is_Record_Type (Expec_Type)
13442            and then Present (Corresponding_Remote_Type (Expec_Type))
13443          then
13444             Error_Msg_NE ("expected}!", Expr,
13445                           Corresponding_Remote_Type (Expec_Type));
13446          else
13447             Error_Msg_NE ("expected}!", Expr, Expec_Type);
13448          end if;
13449
13450          if Is_Entity_Name (Expr)
13451            and then Is_Package_Or_Generic_Package (Entity (Expr))
13452          then
13453             Error_Msg_N ("\\found package name!", Expr);
13454
13455          elsif Is_Entity_Name (Expr)
13456            and then
13457              (Ekind (Entity (Expr)) = E_Procedure
13458                 or else
13459               Ekind (Entity (Expr)) = E_Generic_Procedure)
13460          then
13461             if Ekind (Expec_Type) = E_Access_Subprogram_Type then
13462                Error_Msg_N
13463                  ("found procedure name, possibly missing Access attribute!",
13464                    Expr);
13465             else
13466                Error_Msg_N
13467                  ("\\found procedure name instead of function!", Expr);
13468             end if;
13469
13470          elsif Nkind (Expr) = N_Function_Call
13471            and then Ekind (Expec_Type) = E_Access_Subprogram_Type
13472            and then Etype (Designated_Type (Expec_Type)) = Etype (Expr)
13473            and then No (Parameter_Associations (Expr))
13474          then
13475             Error_Msg_N
13476               ("found function name, possibly missing Access attribute!",
13477                Expr);
13478
13479          --  Catch common error: a prefix or infix operator which is not
13480          --  directly visible because the type isn't.
13481
13482          elsif Nkind (Expr) in N_Op
13483             and then Is_Overloaded (Expr)
13484             and then not Is_Immediately_Visible (Expec_Type)
13485             and then not Is_Potentially_Use_Visible (Expec_Type)
13486             and then not In_Use (Expec_Type)
13487             and then Has_Compatible_Type (Right_Opnd (Expr), Expec_Type)
13488          then
13489             Error_Msg_N
13490               ("operator of the type is not directly visible!", Expr);
13491
13492          elsif Ekind (Found_Type) = E_Void
13493            and then Present (Parent (Found_Type))
13494            and then Nkind (Parent (Found_Type)) = N_Full_Type_Declaration
13495          then
13496             Error_Msg_NE ("\\found premature usage of}!", Expr, Found_Type);
13497
13498          else
13499             Error_Msg_NE ("\\found}!", Expr, Found_Type);
13500          end if;
13501
13502          --  A special check for cases like M1 and M2 = 0 where M1 and M2 are
13503          --  of the same modular type, and (M1 and M2) = 0 was intended.
13504
13505          if Expec_Type = Standard_Boolean
13506            and then Is_Modular_Integer_Type (Found_Type)
13507            and then Nkind_In (Parent (Expr), N_Op_And, N_Op_Or, N_Op_Xor)
13508            and then Nkind (Right_Opnd (Parent (Expr))) in N_Op_Compare
13509          then
13510             declare
13511                Op : constant Node_Id := Right_Opnd (Parent (Expr));
13512                L  : constant Node_Id := Left_Opnd (Op);
13513                R  : constant Node_Id := Right_Opnd (Op);
13514             begin
13515                --  The case for the message is when the left operand of the
13516                --  comparison is the same modular type, or when it is an
13517                --  integer literal (or other universal integer expression),
13518                --  which would have been typed as the modular type if the
13519                --  parens had been there.
13520
13521                if (Etype (L) = Found_Type
13522                      or else
13523                    Etype (L) = Universal_Integer)
13524                  and then Is_Integer_Type (Etype (R))
13525                then
13526                   Error_Msg_N
13527                     ("\\possible missing parens for modular operation", Expr);
13528                end if;
13529             end;
13530          end if;
13531
13532          --  Reset error message qualification indication
13533
13534          Error_Msg_Qual_Level := 0;
13535       end if;
13536    end Wrong_Type;
13537
13538 end Sem_Util;