[multiple changes]
[platform/upstream/gcc.git] / gcc / ada / sem_res.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                              S E M _ R E S                               --
6 --                                                                          --
7 --                                 B o d y                                  --
8 --                                                                          --
9 --          Copyright (C) 1992-2014, Free Software Foundation, Inc.         --
10 --                                                                          --
11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
12 -- terms of the  GNU General Public License as published  by the Free Soft- --
13 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
17 -- for  more details.  You should have  received  a copy of the GNU General --
18 -- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
19 -- http://www.gnu.org/licenses for a complete copy of the license.          --
20 --                                                                          --
21 -- GNAT was originally developed  by the GNAT team at  New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
23 --                                                                          --
24 ------------------------------------------------------------------------------
25
26 with Atree;    use Atree;
27 with Checks;   use Checks;
28 with Debug;    use Debug;
29 with Debug_A;  use Debug_A;
30 with Einfo;    use Einfo;
31 with Errout;   use Errout;
32 with Expander; use Expander;
33 with Exp_Disp; use Exp_Disp;
34 with Exp_Ch6;  use Exp_Ch6;
35 with Exp_Ch7;  use Exp_Ch7;
36 with Exp_Tss;  use Exp_Tss;
37 with Exp_Util; use Exp_Util;
38 with Fname;    use Fname;
39 with Freeze;   use Freeze;
40 with Inline;   use Inline;
41 with Itypes;   use Itypes;
42 with Lib;      use Lib;
43 with Lib.Xref; use Lib.Xref;
44 with Namet;    use Namet;
45 with Nmake;    use Nmake;
46 with Nlists;   use Nlists;
47 with Opt;      use Opt;
48 with Output;   use Output;
49 with Restrict; use Restrict;
50 with Rident;   use Rident;
51 with Rtsfind;  use Rtsfind;
52 with Sem;      use Sem;
53 with Sem_Aux;  use Sem_Aux;
54 with Sem_Aggr; use Sem_Aggr;
55 with Sem_Attr; use Sem_Attr;
56 with Sem_Cat;  use Sem_Cat;
57 with Sem_Ch4;  use Sem_Ch4;
58 with Sem_Ch6;  use Sem_Ch6;
59 with Sem_Ch8;  use Sem_Ch8;
60 with Sem_Ch13; use Sem_Ch13;
61 with Sem_Dim;  use Sem_Dim;
62 with Sem_Disp; use Sem_Disp;
63 with Sem_Dist; use Sem_Dist;
64 with Sem_Elim; use Sem_Elim;
65 with Sem_Elab; use Sem_Elab;
66 with Sem_Eval; use Sem_Eval;
67 with Sem_Intr; use Sem_Intr;
68 with Sem_Util; use Sem_Util;
69 with Targparm; use Targparm;
70 with Sem_Type; use Sem_Type;
71 with Sem_Warn; use Sem_Warn;
72 with Sinfo;    use Sinfo;
73 with Sinfo.CN; use Sinfo.CN;
74 with Snames;   use Snames;
75 with Stand;    use Stand;
76 with Stringt;  use Stringt;
77 with Style;    use Style;
78 with Tbuild;   use Tbuild;
79 with Uintp;    use Uintp;
80 with Urealp;   use Urealp;
81
82 package body Sem_Res is
83
84    -----------------------
85    -- Local Subprograms --
86    -----------------------
87
88    --  Second pass (top-down) type checking and overload resolution procedures
89    --  Typ is the type required by context. These procedures propagate the type
90    --  information recursively to the descendants of N. If the node is not
91    --  overloaded, its Etype is established in the first pass. If overloaded,
92    --  the Resolve routines set the correct type. For arith. operators, the
93    --  Etype is the base type of the context.
94
95    --  Note that Resolve_Attribute is separated off in Sem_Attr
96
97    procedure Check_Discriminant_Use (N : Node_Id);
98    --  Enforce the restrictions on the use of discriminants when constraining
99    --  a component of a discriminated type (record or concurrent type).
100
101    procedure Check_For_Visible_Operator (N : Node_Id; T : Entity_Id);
102    --  Given a node for an operator associated with type T, check that
103    --  the operator is visible. Operators all of whose operands are
104    --  universal must be checked for visibility during resolution
105    --  because their type is not determinable based on their operands.
106
107    procedure Check_Fully_Declared_Prefix
108      (Typ  : Entity_Id;
109       Pref : Node_Id);
110    --  Check that the type of the prefix of a dereference is not incomplete
111
112    procedure Check_Ghost_Context (Ghost_Id : Entity_Id; Ghost_Ref : Node_Id);
113    --  Determine whether node Ghost_Ref appears within a Ghost-friendly context
114    --  where Ghost entity Ghost_Id can safely reside.
115
116    function Check_Infinite_Recursion (N : Node_Id) return Boolean;
117    --  Given a call node, N, which is known to occur immediately within the
118    --  subprogram being called, determines whether it is a detectable case of
119    --  an infinite recursion, and if so, outputs appropriate messages. Returns
120    --  True if an infinite recursion is detected, and False otherwise.
121
122    procedure Check_Initialization_Call (N : Entity_Id; Nam : Entity_Id);
123    --  If the type of the object being initialized uses the secondary stack
124    --  directly or indirectly, create a transient scope for the call to the
125    --  init proc. This is because we do not create transient scopes for the
126    --  initialization of individual components within the init proc itself.
127    --  Could be optimized away perhaps?
128
129    procedure Check_No_Direct_Boolean_Operators (N : Node_Id);
130    --  N is the node for a logical operator. If the operator is predefined, and
131    --  the root type of the operands is Standard.Boolean, then a check is made
132    --  for restriction No_Direct_Boolean_Operators. This procedure also handles
133    --  the style check for Style_Check_Boolean_And_Or.
134
135    function Is_Atomic_Ref_With_Address (N : Node_Id) return Boolean;
136    --  N is either an indexed component or a selected component. This function
137    --  returns true if the prefix refers to an object that has an address
138    --  clause (the case in which we may want to issue a warning).
139
140    function Is_Definite_Access_Type (E : Entity_Id) return Boolean;
141    --  Determine whether E is an access type declared by an access declaration,
142    --  and not an (anonymous) allocator type.
143
144    function Is_Predefined_Op (Nam : Entity_Id) return Boolean;
145    --  Utility to check whether the entity for an operator is a predefined
146    --  operator, in which case the expression is left as an operator in the
147    --  tree (else it is rewritten into a call). An instance of an intrinsic
148    --  conversion operation may be given an operator name, but is not treated
149    --  like an operator. Note that an operator that is an imported back-end
150    --  builtin has convention Intrinsic, but is expected to be rewritten into
151    --  a call, so such an operator is not treated as predefined by this
152    --  predicate.
153
154    procedure Replace_Actual_Discriminants (N : Node_Id; Default : Node_Id);
155    --  If a default expression in entry call N depends on the discriminants
156    --  of the task, it must be replaced with a reference to the discriminant
157    --  of the task being called.
158
159    procedure Resolve_Op_Concat_Arg
160      (N       : Node_Id;
161       Arg     : Node_Id;
162       Typ     : Entity_Id;
163       Is_Comp : Boolean);
164    --  Internal procedure for Resolve_Op_Concat to resolve one operand of
165    --  concatenation operator.  The operand is either of the array type or of
166    --  the component type. If the operand is an aggregate, and the component
167    --  type is composite, this is ambiguous if component type has aggregates.
168
169    procedure Resolve_Op_Concat_First (N : Node_Id; Typ : Entity_Id);
170    --  Does the first part of the work of Resolve_Op_Concat
171
172    procedure Resolve_Op_Concat_Rest (N : Node_Id; Typ : Entity_Id);
173    --  Does the "rest" of the work of Resolve_Op_Concat, after the left operand
174    --  has been resolved. See Resolve_Op_Concat for details.
175
176    procedure Resolve_Allocator                 (N : Node_Id; Typ : Entity_Id);
177    procedure Resolve_Arithmetic_Op             (N : Node_Id; Typ : Entity_Id);
178    procedure Resolve_Call                      (N : Node_Id; Typ : Entity_Id);
179    procedure Resolve_Case_Expression           (N : Node_Id; Typ : Entity_Id);
180    procedure Resolve_Character_Literal         (N : Node_Id; Typ : Entity_Id);
181    procedure Resolve_Comparison_Op             (N : Node_Id; Typ : Entity_Id);
182    procedure Resolve_Entity_Name               (N : Node_Id; Typ : Entity_Id);
183    procedure Resolve_Equality_Op               (N : Node_Id; Typ : Entity_Id);
184    procedure Resolve_Explicit_Dereference      (N : Node_Id; Typ : Entity_Id);
185    procedure Resolve_Expression_With_Actions   (N : Node_Id; Typ : Entity_Id);
186    procedure Resolve_If_Expression             (N : Node_Id; Typ : Entity_Id);
187    procedure Resolve_Generalized_Indexing      (N : Node_Id; Typ : Entity_Id);
188    procedure Resolve_Indexed_Component         (N : Node_Id; Typ : Entity_Id);
189    procedure Resolve_Integer_Literal           (N : Node_Id; Typ : Entity_Id);
190    procedure Resolve_Logical_Op                (N : Node_Id; Typ : Entity_Id);
191    procedure Resolve_Membership_Op             (N : Node_Id; Typ : Entity_Id);
192    procedure Resolve_Null                      (N : Node_Id; Typ : Entity_Id);
193    procedure Resolve_Operator_Symbol           (N : Node_Id; Typ : Entity_Id);
194    procedure Resolve_Op_Concat                 (N : Node_Id; Typ : Entity_Id);
195    procedure Resolve_Op_Expon                  (N : Node_Id; Typ : Entity_Id);
196    procedure Resolve_Op_Not                    (N : Node_Id; Typ : Entity_Id);
197    procedure Resolve_Qualified_Expression      (N : Node_Id; Typ : Entity_Id);
198    procedure Resolve_Raise_Expression          (N : Node_Id; Typ : Entity_Id);
199    procedure Resolve_Range                     (N : Node_Id; Typ : Entity_Id);
200    procedure Resolve_Real_Literal              (N : Node_Id; Typ : Entity_Id);
201    procedure Resolve_Reference                 (N : Node_Id; Typ : Entity_Id);
202    procedure Resolve_Selected_Component        (N : Node_Id; Typ : Entity_Id);
203    procedure Resolve_Shift                     (N : Node_Id; Typ : Entity_Id);
204    procedure Resolve_Short_Circuit             (N : Node_Id; Typ : Entity_Id);
205    procedure Resolve_Slice                     (N : Node_Id; Typ : Entity_Id);
206    procedure Resolve_String_Literal            (N : Node_Id; Typ : Entity_Id);
207    procedure Resolve_Type_Conversion           (N : Node_Id; Typ : Entity_Id);
208    procedure Resolve_Unary_Op                  (N : Node_Id; Typ : Entity_Id);
209    procedure Resolve_Unchecked_Expression      (N : Node_Id; Typ : Entity_Id);
210    procedure Resolve_Unchecked_Type_Conversion (N : Node_Id; Typ : Entity_Id);
211
212    function Operator_Kind
213      (Op_Name   : Name_Id;
214       Is_Binary : Boolean) return Node_Kind;
215    --  Utility to map the name of an operator into the corresponding Node. Used
216    --  by other node rewriting procedures.
217
218    procedure Resolve_Actuals (N : Node_Id; Nam : Entity_Id);
219    --  Resolve actuals of call, and add default expressions for missing ones.
220    --  N is the Node_Id for the subprogram call, and Nam is the entity of the
221    --  called subprogram.
222
223    procedure Resolve_Entry_Call (N : Node_Id; Typ : Entity_Id);
224    --  Called from Resolve_Call, when the prefix denotes an entry or element
225    --  of entry family. Actuals are resolved as for subprograms, and the node
226    --  is rebuilt as an entry call. Also called for protected operations. Typ
227    --  is the context type, which is used when the operation is a protected
228    --  function with no arguments, and the return value is indexed.
229
230    procedure Resolve_Intrinsic_Operator (N : Node_Id; Typ : Entity_Id);
231    --  A call to a user-defined intrinsic operator is rewritten as a call to
232    --  the corresponding predefined operator, with suitable conversions. Note
233    --  that this applies only for intrinsic operators that denote predefined
234    --  operators, not ones that are intrinsic imports of back-end builtins.
235
236    procedure Resolve_Intrinsic_Unary_Operator (N : Node_Id; Typ : Entity_Id);
237    --  Ditto, for arithmetic unary operators
238
239    procedure Rewrite_Operator_As_Call (N : Node_Id; Nam : Entity_Id);
240    --  If an operator node resolves to a call to a user-defined operator,
241    --  rewrite the node as a function call.
242
243    procedure Make_Call_Into_Operator
244      (N     : Node_Id;
245       Typ   : Entity_Id;
246       Op_Id : Entity_Id);
247    --  Inverse transformation: if an operator is given in functional notation,
248    --  then after resolving the node, transform into an operator node, so
249    --  that operands are resolved properly. Recall that predefined operators
250    --  do not have a full signature and special resolution rules apply.
251
252    procedure Rewrite_Renamed_Operator
253      (N   : Node_Id;
254       Op  : Entity_Id;
255       Typ : Entity_Id);
256    --  An operator can rename another, e.g. in  an instantiation. In that
257    --  case, the proper operator node must be constructed and resolved.
258
259    procedure Set_String_Literal_Subtype (N : Node_Id; Typ : Entity_Id);
260    --  The String_Literal_Subtype is built for all strings that are not
261    --  operands of a static concatenation operation. If the argument is
262    --  not a N_String_Literal node, then the call has no effect.
263
264    procedure Set_Slice_Subtype (N : Node_Id);
265    --  Build subtype of array type, with the range specified by the slice
266
267    procedure Simplify_Type_Conversion (N : Node_Id);
268    --  Called after N has been resolved and evaluated, but before range checks
269    --  have been applied. Currently simplifies a combination of floating-point
270    --  to integer conversion and Rounding or Truncation attribute.
271
272    function Unique_Fixed_Point_Type (N : Node_Id) return Entity_Id;
273    --  A universal_fixed expression in an universal context is unambiguous if
274    --  there is only one applicable fixed point type. Determining whether there
275    --  is only one requires a search over all visible entities, and happens
276    --  only in very pathological cases (see 6115-006).
277
278    -------------------------
279    -- Ambiguous_Character --
280    -------------------------
281
282    procedure Ambiguous_Character (C : Node_Id) is
283       E : Entity_Id;
284
285    begin
286       if Nkind (C) = N_Character_Literal then
287          Error_Msg_N ("ambiguous character literal", C);
288
289          --  First the ones in Standard
290
291          Error_Msg_N ("\\possible interpretation: Character!", C);
292          Error_Msg_N ("\\possible interpretation: Wide_Character!", C);
293
294          --  Include Wide_Wide_Character in Ada 2005 mode
295
296          if Ada_Version >= Ada_2005 then
297             Error_Msg_N ("\\possible interpretation: Wide_Wide_Character!", C);
298          end if;
299
300          --  Now any other types that match
301
302          E := Current_Entity (C);
303          while Present (E) loop
304             Error_Msg_NE ("\\possible interpretation:}!", C, Etype (E));
305             E := Homonym (E);
306          end loop;
307       end if;
308    end Ambiguous_Character;
309
310    -------------------------
311    -- Analyze_And_Resolve --
312    -------------------------
313
314    procedure Analyze_And_Resolve (N : Node_Id) is
315    begin
316       Analyze (N);
317       Resolve (N);
318    end Analyze_And_Resolve;
319
320    procedure Analyze_And_Resolve (N : Node_Id; Typ : Entity_Id) is
321    begin
322       Analyze (N);
323       Resolve (N, Typ);
324    end Analyze_And_Resolve;
325
326    --  Versions with check(s) suppressed
327
328    procedure Analyze_And_Resolve
329      (N        : Node_Id;
330       Typ      : Entity_Id;
331       Suppress : Check_Id)
332    is
333       Scop : constant Entity_Id := Current_Scope;
334
335    begin
336       if Suppress = All_Checks then
337          declare
338             Sva : constant Suppress_Array := Scope_Suppress.Suppress;
339          begin
340             Scope_Suppress.Suppress := (others => True);
341             Analyze_And_Resolve (N, Typ);
342             Scope_Suppress.Suppress := Sva;
343          end;
344
345       else
346          declare
347             Svg : constant Boolean := Scope_Suppress.Suppress (Suppress);
348          begin
349             Scope_Suppress.Suppress (Suppress) := True;
350             Analyze_And_Resolve (N, Typ);
351             Scope_Suppress.Suppress (Suppress) := Svg;
352          end;
353       end if;
354
355       if Current_Scope /= Scop
356         and then Scope_Is_Transient
357       then
358          --  This can only happen if a transient scope was created for an inner
359          --  expression, which will be removed upon completion of the analysis
360          --  of an enclosing construct. The transient scope must have the
361          --  suppress status of the enclosing environment, not of this Analyze
362          --  call.
363
364          Scope_Stack.Table (Scope_Stack.Last).Save_Scope_Suppress :=
365            Scope_Suppress;
366       end if;
367    end Analyze_And_Resolve;
368
369    procedure Analyze_And_Resolve
370      (N        : Node_Id;
371       Suppress : Check_Id)
372    is
373       Scop : constant Entity_Id := Current_Scope;
374
375    begin
376       if Suppress = All_Checks then
377          declare
378             Sva : constant Suppress_Array := Scope_Suppress.Suppress;
379          begin
380             Scope_Suppress.Suppress := (others => True);
381             Analyze_And_Resolve (N);
382             Scope_Suppress.Suppress := Sva;
383          end;
384
385       else
386          declare
387             Svg : constant Boolean := Scope_Suppress.Suppress (Suppress);
388          begin
389             Scope_Suppress.Suppress (Suppress) := True;
390             Analyze_And_Resolve (N);
391             Scope_Suppress.Suppress (Suppress) := Svg;
392          end;
393       end if;
394
395       if Current_Scope /= Scop and then Scope_Is_Transient then
396          Scope_Stack.Table (Scope_Stack.Last).Save_Scope_Suppress :=
397            Scope_Suppress;
398       end if;
399    end Analyze_And_Resolve;
400
401    ----------------------------
402    -- Check_Discriminant_Use --
403    ----------------------------
404
405    procedure Check_Discriminant_Use (N : Node_Id) is
406       PN   : constant Node_Id   := Parent (N);
407       Disc : constant Entity_Id := Entity (N);
408       P    : Node_Id;
409       D    : Node_Id;
410
411    begin
412       --  Any use in a spec-expression is legal
413
414       if In_Spec_Expression then
415          null;
416
417       elsif Nkind (PN) = N_Range then
418
419          --  Discriminant cannot be used to constrain a scalar type
420
421          P := Parent (PN);
422
423          if Nkind (P) = N_Range_Constraint
424            and then Nkind (Parent (P)) = N_Subtype_Indication
425            and then Nkind (Parent (Parent (P))) = N_Component_Definition
426          then
427             Error_Msg_N ("discriminant cannot constrain scalar type", N);
428
429          elsif Nkind (P) = N_Index_Or_Discriminant_Constraint then
430
431             --  The following check catches the unusual case where a
432             --  discriminant appears within an index constraint that is part of
433             --  a larger expression within a constraint on a component, e.g. "C
434             --  : Int range 1 .. F (new A(1 .. D))". For now we only check case
435             --  of record components, and note that a similar check should also
436             --  apply in the case of discriminant constraints below. ???
437
438             --  Note that the check for N_Subtype_Declaration below is to
439             --  detect the valid use of discriminants in the constraints of a
440             --  subtype declaration when this subtype declaration appears
441             --  inside the scope of a record type (which is syntactically
442             --  illegal, but which may be created as part of derived type
443             --  processing for records). See Sem_Ch3.Build_Derived_Record_Type
444             --  for more info.
445
446             if Ekind (Current_Scope) = E_Record_Type
447               and then Scope (Disc) = Current_Scope
448               and then not
449                 (Nkind (Parent (P)) = N_Subtype_Indication
450                   and then
451                     Nkind_In (Parent (Parent (P)), N_Component_Definition,
452                                                    N_Subtype_Declaration)
453                   and then Paren_Count (N) = 0)
454             then
455                Error_Msg_N
456                  ("discriminant must appear alone in component constraint", N);
457                return;
458             end if;
459
460             --   Detect a common error:
461
462             --   type R (D : Positive := 100) is record
463             --     Name : String (1 .. D);
464             --   end record;
465
466             --  The default value causes an object of type R to be allocated
467             --  with room for Positive'Last characters. The RM does not mandate
468             --  the allocation of the maximum size, but that is what GNAT does
469             --  so we should warn the programmer that there is a problem.
470
471             Check_Large : declare
472                SI : Node_Id;
473                T  : Entity_Id;
474                TB : Node_Id;
475                CB : Entity_Id;
476
477                function Large_Storage_Type (T : Entity_Id) return Boolean;
478                --  Return True if type T has a large enough range that any
479                --  array whose index type covered the whole range of the type
480                --  would likely raise Storage_Error.
481
482                ------------------------
483                -- Large_Storage_Type --
484                ------------------------
485
486                function Large_Storage_Type (T : Entity_Id) return Boolean is
487                begin
488                   --  The type is considered large if its bounds are known at
489                   --  compile time and if it requires at least as many bits as
490                   --  a Positive to store the possible values.
491
492                   return Compile_Time_Known_Value (Type_Low_Bound (T))
493                     and then Compile_Time_Known_Value (Type_High_Bound (T))
494                     and then
495                       Minimum_Size (T, Biased => True) >=
496                         RM_Size (Standard_Positive);
497                end Large_Storage_Type;
498
499             --  Start of processing for Check_Large
500
501             begin
502                --  Check that the Disc has a large range
503
504                if not Large_Storage_Type (Etype (Disc)) then
505                   goto No_Danger;
506                end if;
507
508                --  If the enclosing type is limited, we allocate only the
509                --  default value, not the maximum, and there is no need for
510                --  a warning.
511
512                if Is_Limited_Type (Scope (Disc)) then
513                   goto No_Danger;
514                end if;
515
516                --  Check that it is the high bound
517
518                if N /= High_Bound (PN)
519                  or else No (Discriminant_Default_Value (Disc))
520                then
521                   goto No_Danger;
522                end if;
523
524                --  Check the array allows a large range at this bound. First
525                --  find the array
526
527                SI := Parent (P);
528
529                if Nkind (SI) /= N_Subtype_Indication then
530                   goto No_Danger;
531                end if;
532
533                T := Entity (Subtype_Mark (SI));
534
535                if not Is_Array_Type (T) then
536                   goto No_Danger;
537                end if;
538
539                --  Next, find the dimension
540
541                TB := First_Index (T);
542                CB := First (Constraints (P));
543                while True
544                  and then Present (TB)
545                  and then Present (CB)
546                  and then CB /= PN
547                loop
548                   Next_Index (TB);
549                   Next (CB);
550                end loop;
551
552                if CB /= PN then
553                   goto No_Danger;
554                end if;
555
556                --  Now, check the dimension has a large range
557
558                if not Large_Storage_Type (Etype (TB)) then
559                   goto No_Danger;
560                end if;
561
562                --  Warn about the danger
563
564                Error_Msg_N
565                  ("??creation of & object may raise Storage_Error!",
566                   Scope (Disc));
567
568                <<No_Danger>>
569                   null;
570
571             end Check_Large;
572          end if;
573
574       --  Legal case is in index or discriminant constraint
575
576       elsif Nkind_In (PN, N_Index_Or_Discriminant_Constraint,
577                           N_Discriminant_Association)
578       then
579          if Paren_Count (N) > 0 then
580             Error_Msg_N
581               ("discriminant in constraint must appear alone",  N);
582
583          elsif Nkind (N) = N_Expanded_Name
584            and then Comes_From_Source (N)
585          then
586             Error_Msg_N
587               ("discriminant must appear alone as a direct name", N);
588          end if;
589
590          return;
591
592       --  Otherwise, context is an expression. It should not be within (i.e. a
593       --  subexpression of) a constraint for a component.
594
595       else
596          D := PN;
597          P := Parent (PN);
598          while not Nkind_In (P, N_Component_Declaration,
599                                 N_Subtype_Indication,
600                                 N_Entry_Declaration)
601          loop
602             D := P;
603             P := Parent (P);
604             exit when No (P);
605          end loop;
606
607          --  If the discriminant is used in an expression that is a bound of a
608          --  scalar type, an Itype is created and the bounds are attached to
609          --  its range, not to the original subtype indication. Such use is of
610          --  course a double fault.
611
612          if (Nkind (P) = N_Subtype_Indication
613               and then Nkind_In (Parent (P), N_Component_Definition,
614                                              N_Derived_Type_Definition)
615               and then D = Constraint (P))
616
617            --  The constraint itself may be given by a subtype indication,
618            --  rather than by a more common discrete range.
619
620            or else (Nkind (P) = N_Subtype_Indication
621                       and then
622                     Nkind (Parent (P)) = N_Index_Or_Discriminant_Constraint)
623            or else Nkind (P) = N_Entry_Declaration
624            or else Nkind (D) = N_Defining_Identifier
625          then
626             Error_Msg_N
627               ("discriminant in constraint must appear alone",  N);
628          end if;
629       end if;
630    end Check_Discriminant_Use;
631
632    --------------------------------
633    -- Check_For_Visible_Operator --
634    --------------------------------
635
636    procedure Check_For_Visible_Operator (N : Node_Id; T : Entity_Id) is
637    begin
638       if Is_Invisible_Operator (N, T) then
639          Error_Msg_NE -- CODEFIX
640            ("operator for} is not directly visible!", N, First_Subtype (T));
641          Error_Msg_N -- CODEFIX
642            ("use clause would make operation legal!", N);
643       end if;
644    end Check_For_Visible_Operator;
645
646    ----------------------------------
647    --  Check_Fully_Declared_Prefix --
648    ----------------------------------
649
650    procedure Check_Fully_Declared_Prefix
651      (Typ  : Entity_Id;
652       Pref : Node_Id)
653    is
654    begin
655       --  Check that the designated type of the prefix of a dereference is
656       --  not an incomplete type. This cannot be done unconditionally, because
657       --  dereferences of private types are legal in default expressions. This
658       --  case is taken care of in Check_Fully_Declared, called below. There
659       --  are also 2005 cases where it is legal for the prefix to be unfrozen.
660
661       --  This consideration also applies to similar checks for allocators,
662       --  qualified expressions, and type conversions.
663
664       --  An additional exception concerns other per-object expressions that
665       --  are not directly related to component declarations, in particular
666       --  representation pragmas for tasks. These will be per-object
667       --  expressions if they depend on discriminants or some global entity.
668       --  If the task has access discriminants, the designated type may be
669       --  incomplete at the point the expression is resolved. This resolution
670       --  takes place within the body of the initialization procedure, where
671       --  the discriminant is replaced by its discriminal.
672
673       if Is_Entity_Name (Pref)
674         and then Ekind (Entity (Pref)) = E_In_Parameter
675       then
676          null;
677
678       --  Ada 2005 (AI-326): Tagged incomplete types allowed. The wrong usages
679       --  are handled by Analyze_Access_Attribute, Analyze_Assignment,
680       --  Analyze_Object_Renaming, and Freeze_Entity.
681
682       elsif Ada_Version >= Ada_2005
683         and then Is_Entity_Name (Pref)
684         and then Is_Access_Type (Etype (Pref))
685         and then Ekind (Directly_Designated_Type (Etype (Pref))) =
686                                                        E_Incomplete_Type
687         and then Is_Tagged_Type (Directly_Designated_Type (Etype (Pref)))
688       then
689          null;
690       else
691          Check_Fully_Declared (Typ, Parent (Pref));
692       end if;
693    end Check_Fully_Declared_Prefix;
694
695    -------------------------
696    -- Check_Ghost_Context --
697    -------------------------
698
699    procedure Check_Ghost_Context (Ghost_Id : Entity_Id; Ghost_Ref : Node_Id) is
700       procedure Check_Ghost_Policy (Id : Entity_Id; Err_N : Node_Id);
701       --  Verify that the Ghost policy at the point of declaration of entity Id
702       --  matches the policy at the point of reference. If this is not the case
703       --  emit an error at Err_N.
704
705       function Is_OK_Ghost_Context (Context : Node_Id) return Boolean;
706       --  Determine whether node Context denotes a Ghost-friendly context where
707       --  a Ghost entity can safely reside.
708
709       -------------------------
710       -- Is_OK_Ghost_Context --
711       -------------------------
712
713       function Is_OK_Ghost_Context (Context : Node_Id) return Boolean is
714          function Is_Ghost_Declaration (Decl : Node_Id) return Boolean;
715          --  Determine whether node Decl is a Ghost declaration or appears
716          --  within a Ghost declaration.
717
718          --------------------------
719          -- Is_Ghost_Declaration --
720          --------------------------
721
722          function Is_Ghost_Declaration (Decl : Node_Id) return Boolean is
723             Par       : Node_Id;
724             Subp_Decl : Node_Id;
725             Subp_Id   : Entity_Id;
726
727          begin
728             --  Climb the parent chain looking for an object declaration
729
730             Par := Decl;
731             while Present (Par) loop
732                case Nkind (Par) is
733                   when N_Abstract_Subprogram_Declaration        |
734                        N_Exception_Declaration                  |
735                        N_Exception_Renaming_Declaration         |
736                        N_Full_Type_Declaration                  |
737                        N_Generic_Function_Renaming_Declaration  |
738                        N_Generic_Package_Declaration            |
739                        N_Generic_Package_Renaming_Declaration   |
740                        N_Generic_Procedure_Renaming_Declaration |
741                        N_Generic_Subprogram_Declaration         |
742                        N_Number_Declaration                     |
743                        N_Object_Declaration                     |
744                        N_Object_Renaming_Declaration            |
745                        N_Package_Declaration                    |
746                        N_Package_Renaming_Declaration           |
747                        N_Private_Extension_Declaration          |
748                        N_Private_Type_Declaration               |
749                        N_Subprogram_Declaration                 |
750                        N_Subprogram_Renaming_Declaration        |
751                        N_Subtype_Declaration                    =>
752                      return Is_Subject_To_Ghost (Par);
753
754                   when others                                   =>
755                      null;
756                end case;
757
758                --  Special cases
759
760                --  A reference to a Ghost entity may appear as the default
761                --  expression of a formal parameter of a subprogram body. This
762                --  context must be treated as suitable because the relation
763                --  between the spec and the body has not been established and
764                --  the body is not marked as Ghost yet. The real check was
765                --  performed on the spec.
766
767                if Nkind (Par) = N_Parameter_Specification
768                  and then Nkind (Parent (Parent (Par))) = N_Subprogram_Body
769                then
770                   return True;
771
772                --  References to Ghost entities may be relocated in internally
773                --  generated bodies.
774
775                elsif Nkind (Par) = N_Subprogram_Body
776                  and then not Comes_From_Source (Par)
777                then
778                   Subp_Id := Corresponding_Spec (Par);
779
780                   --  The original context is an expression function that has
781                   --  been split into a spec and a body. The context is OK as
782                   --  long as the the initial declaration is Ghost.
783
784                   if Present (Subp_Id) then
785                      Subp_Decl :=
786                        Original_Node (Unit_Declaration_Node (Subp_Id));
787
788                      if Nkind (Subp_Decl) = N_Expression_Function then
789                         return Is_Subject_To_Ghost (Subp_Decl);
790                      end if;
791                   end if;
792
793                   --  Otherwise this is either an internal body or an internal
794                   --  completion. Both are OK because the real check was done
795                   --  before expansion activities.
796
797                   return True;
798                end if;
799
800                --  Prevent the search from going too far
801
802                if Is_Body_Or_Package_Declaration (Par) then
803                   return False;
804                end if;
805
806                Par := Parent (Par);
807             end loop;
808
809             return False;
810          end Is_Ghost_Declaration;
811
812       --  Start of processing for Is_OK_Ghost_Context
813
814       begin
815          --  The Ghost entity appears within an assertion expression
816
817          if In_Assertion_Expr > 0 then
818             return True;
819
820          --  The Ghost entity is part of a declaration or its completion
821
822          elsif Is_Ghost_Declaration (Context) then
823             return True;
824
825          --  The Ghost entity is referenced within a Ghost statement
826
827          elsif Is_Ghost_Statement_Or_Pragma (Context) then
828             return True;
829
830          else
831             return False;
832          end if;
833       end Is_OK_Ghost_Context;
834
835       ------------------------
836       -- Check_Ghost_Policy --
837       ------------------------
838
839       procedure Check_Ghost_Policy (Id : Entity_Id; Err_N : Node_Id) is
840          Policy : constant Name_Id := Policy_In_Effect (Name_Ghost);
841
842       begin
843          --  The Ghost policy in effect a the point of declaration and at the
844          --  point of use must match (SPARK RM 6.9(14)).
845
846          if Is_Checked_Ghost_Entity (Id) and then Policy = Name_Ignore then
847             Error_Msg_Sloc := Sloc (Err_N);
848
849             Error_Msg_N  ("incompatible ghost policies in effect", Err_N);
850             Error_Msg_NE ("\& declared with ghost policy Check", Err_N, Id);
851             Error_Msg_NE ("\& used # with ghost policy Ignore", Err_N, Id);
852
853          elsif Is_Ignored_Ghost_Entity (Id) and then Policy = Name_Check then
854             Error_Msg_Sloc := Sloc (Err_N);
855
856             Error_Msg_N  ("incompatible ghost policies in effect", Err_N);
857             Error_Msg_NE ("\& declared with ghost policy Ignore", Err_N, Id);
858             Error_Msg_NE ("\& used # with ghost policy Check", Err_N, Id);
859          end if;
860       end Check_Ghost_Policy;
861
862    --  Start of processing for Check_Ghost_Context
863
864    begin
865       --  Once it has been established that the reference to the Ghost entity
866       --  is within a suitable context, ensure that the policy at the point of
867       --  declaration and at the point of use match.
868
869       if Is_OK_Ghost_Context (Ghost_Ref) then
870          Check_Ghost_Policy (Ghost_Id, Ghost_Ref);
871
872       --  Otherwise the Ghost entity appears in a non-Ghost context and affects
873       --  its behavior or value.
874
875       else
876          Error_Msg_N
877            ("ghost entity cannot appear in this context (SPARK RM 6.9(12))",
878             Ghost_Ref);
879       end if;
880    end Check_Ghost_Context;
881
882    ------------------------------
883    -- Check_Infinite_Recursion --
884    ------------------------------
885
886    function Check_Infinite_Recursion (N : Node_Id) return Boolean is
887       P : Node_Id;
888       C : Node_Id;
889
890       function Same_Argument_List return Boolean;
891       --  Check whether list of actuals is identical to list of formals of
892       --  called function (which is also the enclosing scope).
893
894       ------------------------
895       -- Same_Argument_List --
896       ------------------------
897
898       function Same_Argument_List return Boolean is
899          A    : Node_Id;
900          F    : Entity_Id;
901          Subp : Entity_Id;
902
903       begin
904          if not Is_Entity_Name (Name (N)) then
905             return False;
906          else
907             Subp := Entity (Name (N));
908          end if;
909
910          F := First_Formal (Subp);
911          A := First_Actual (N);
912          while Present (F) and then Present (A) loop
913             if not Is_Entity_Name (A)
914               or else Entity (A) /= F
915             then
916                return False;
917             end if;
918
919             Next_Actual (A);
920             Next_Formal (F);
921          end loop;
922
923          return True;
924       end Same_Argument_List;
925
926    --  Start of processing for Check_Infinite_Recursion
927
928    begin
929       --  Special case, if this is a procedure call and is a call to the
930       --  current procedure with the same argument list, then this is for
931       --  sure an infinite recursion and we insert a call to raise SE.
932
933       if Is_List_Member (N)
934         and then List_Length (List_Containing (N)) = 1
935         and then Same_Argument_List
936       then
937          declare
938             P : constant Node_Id := Parent (N);
939          begin
940             if Nkind (P) = N_Handled_Sequence_Of_Statements
941               and then Nkind (Parent (P)) = N_Subprogram_Body
942               and then Is_Empty_List (Declarations (Parent (P)))
943             then
944                Error_Msg_Warn := SPARK_Mode /= On;
945                Error_Msg_N ("!infinite recursion<<", N);
946                Error_Msg_N ("\!Storage_Error [<<", N);
947                Insert_Action (N,
948                  Make_Raise_Storage_Error (Sloc (N),
949                    Reason => SE_Infinite_Recursion));
950                return True;
951             end if;
952          end;
953       end if;
954
955       --  If not that special case, search up tree, quitting if we reach a
956       --  construct (e.g. a conditional) that tells us that this is not a
957       --  case for an infinite recursion warning.
958
959       C := N;
960       loop
961          P := Parent (C);
962
963          --  If no parent, then we were not inside a subprogram, this can for
964          --  example happen when processing certain pragmas in a spec. Just
965          --  return False in this case.
966
967          if No (P) then
968             return False;
969          end if;
970
971          --  Done if we get to subprogram body, this is definitely an infinite
972          --  recursion case if we did not find anything to stop us.
973
974          exit when Nkind (P) = N_Subprogram_Body;
975
976          --  If appearing in conditional, result is false
977
978          if Nkind_In (P, N_Or_Else,
979                          N_And_Then,
980                          N_Case_Expression,
981                          N_Case_Statement,
982                          N_If_Expression,
983                          N_If_Statement)
984          then
985             return False;
986
987          elsif Nkind (P) = N_Handled_Sequence_Of_Statements
988            and then C /= First (Statements (P))
989          then
990             --  If the call is the expression of a return statement and the
991             --  actuals are identical to the formals, it's worth a warning.
992             --  However, we skip this if there is an immediately preceding
993             --  raise statement, since the call is never executed.
994
995             --  Furthermore, this corresponds to a common idiom:
996
997             --    function F (L : Thing) return Boolean is
998             --    begin
999             --       raise Program_Error;
1000             --       return F (L);
1001             --    end F;
1002
1003             --  for generating a stub function
1004
1005             if Nkind (Parent (N)) = N_Simple_Return_Statement
1006               and then Same_Argument_List
1007             then
1008                exit when not Is_List_Member (Parent (N));
1009
1010                --  OK, return statement is in a statement list, look for raise
1011
1012                declare
1013                   Nod : Node_Id;
1014
1015                begin
1016                   --  Skip past N_Freeze_Entity nodes generated by expansion
1017
1018                   Nod := Prev (Parent (N));
1019                   while Present (Nod)
1020                     and then Nkind (Nod) = N_Freeze_Entity
1021                   loop
1022                      Prev (Nod);
1023                   end loop;
1024
1025                   --  If no raise statement, give warning. We look at the
1026                   --  original node, because in the case of "raise ... with
1027                   --  ...", the node has been transformed into a call.
1028
1029                   exit when Nkind (Original_Node (Nod)) /= N_Raise_Statement
1030                     and then
1031                       (Nkind (Nod) not in N_Raise_xxx_Error
1032                         or else Present (Condition (Nod)));
1033                end;
1034             end if;
1035
1036             return False;
1037
1038          else
1039             C := P;
1040          end if;
1041       end loop;
1042
1043       Error_Msg_Warn := SPARK_Mode /= On;
1044       Error_Msg_N ("!possible infinite recursion<<", N);
1045       Error_Msg_N ("\!??Storage_Error ]<<", N);
1046
1047       return True;
1048    end Check_Infinite_Recursion;
1049
1050    -------------------------------
1051    -- Check_Initialization_Call --
1052    -------------------------------
1053
1054    procedure Check_Initialization_Call (N : Entity_Id; Nam : Entity_Id) is
1055       Typ : constant Entity_Id := Etype (First_Formal (Nam));
1056
1057       function Uses_SS (T : Entity_Id) return Boolean;
1058       --  Check whether the creation of an object of the type will involve
1059       --  use of the secondary stack. If T is a record type, this is true
1060       --  if the expression for some component uses the secondary stack, e.g.
1061       --  through a call to a function that returns an unconstrained value.
1062       --  False if T is controlled, because cleanups occur elsewhere.
1063
1064       -------------
1065       -- Uses_SS --
1066       -------------
1067
1068       function Uses_SS (T : Entity_Id) return Boolean is
1069          Comp      : Entity_Id;
1070          Expr      : Node_Id;
1071          Full_Type : Entity_Id := Underlying_Type (T);
1072
1073       begin
1074          --  Normally we want to use the underlying type, but if it's not set
1075          --  then continue with T.
1076
1077          if not Present (Full_Type) then
1078             Full_Type := T;
1079          end if;
1080
1081          if Is_Controlled (Full_Type) then
1082             return False;
1083
1084          elsif Is_Array_Type (Full_Type) then
1085             return Uses_SS (Component_Type (Full_Type));
1086
1087          elsif Is_Record_Type (Full_Type) then
1088             Comp := First_Component (Full_Type);
1089             while Present (Comp) loop
1090                if Ekind (Comp) = E_Component
1091                  and then Nkind (Parent (Comp)) = N_Component_Declaration
1092                then
1093                   --  The expression for a dynamic component may be rewritten
1094                   --  as a dereference, so retrieve original node.
1095
1096                   Expr := Original_Node (Expression (Parent (Comp)));
1097
1098                   --  Return True if the expression is a call to a function
1099                   --  (including an attribute function such as Image, or a
1100                   --  user-defined operator) with a result that requires a
1101                   --  transient scope.
1102
1103                   if (Nkind (Expr) = N_Function_Call
1104                        or else Nkind (Expr) in N_Op
1105                        or else (Nkind (Expr) = N_Attribute_Reference
1106                                  and then Present (Expressions (Expr))))
1107                     and then Requires_Transient_Scope (Etype (Expr))
1108                   then
1109                      return True;
1110
1111                   elsif Uses_SS (Etype (Comp)) then
1112                      return True;
1113                   end if;
1114                end if;
1115
1116                Next_Component (Comp);
1117             end loop;
1118
1119             return False;
1120
1121          else
1122             return False;
1123          end if;
1124       end Uses_SS;
1125
1126    --  Start of processing for Check_Initialization_Call
1127
1128    begin
1129       --  Establish a transient scope if the type needs it
1130
1131       if Uses_SS (Typ) then
1132          Establish_Transient_Scope (First_Actual (N), Sec_Stack => True);
1133       end if;
1134    end Check_Initialization_Call;
1135
1136    ---------------------------------------
1137    -- Check_No_Direct_Boolean_Operators --
1138    ---------------------------------------
1139
1140    procedure Check_No_Direct_Boolean_Operators (N : Node_Id) is
1141    begin
1142       if Scope (Entity (N)) = Standard_Standard
1143         and then Root_Type (Etype (Left_Opnd (N))) = Standard_Boolean
1144       then
1145          --  Restriction only applies to original source code
1146
1147          if Comes_From_Source (N) then
1148             Check_Restriction (No_Direct_Boolean_Operators, N);
1149          end if;
1150       end if;
1151
1152       --  Do style check (but skip if in instance, error is on template)
1153
1154       if Style_Check then
1155          if not In_Instance then
1156             Check_Boolean_Operator (N);
1157          end if;
1158       end if;
1159    end Check_No_Direct_Boolean_Operators;
1160
1161    ------------------------------
1162    -- Check_Parameterless_Call --
1163    ------------------------------
1164
1165    procedure Check_Parameterless_Call (N : Node_Id) is
1166       Nam : Node_Id;
1167
1168       function Prefix_Is_Access_Subp return Boolean;
1169       --  If the prefix is of an access_to_subprogram type, the node must be
1170       --  rewritten as a call. Ditto if the prefix is overloaded and all its
1171       --  interpretations are access to subprograms.
1172
1173       ---------------------------
1174       -- Prefix_Is_Access_Subp --
1175       ---------------------------
1176
1177       function Prefix_Is_Access_Subp return Boolean is
1178          I   : Interp_Index;
1179          It  : Interp;
1180
1181       begin
1182          --  If the context is an attribute reference that can apply to
1183          --  functions, this is never a parameterless call (RM 4.1.4(6)).
1184
1185          if Nkind (Parent (N)) = N_Attribute_Reference
1186             and then Nam_In (Attribute_Name (Parent (N)), Name_Address,
1187                                                           Name_Code_Address,
1188                                                           Name_Access)
1189          then
1190             return False;
1191          end if;
1192
1193          if not Is_Overloaded (N) then
1194             return
1195               Ekind (Etype (N)) = E_Subprogram_Type
1196                 and then Base_Type (Etype (Etype (N))) /= Standard_Void_Type;
1197          else
1198             Get_First_Interp (N, I, It);
1199             while Present (It.Typ) loop
1200                if Ekind (It.Typ) /= E_Subprogram_Type
1201                  or else Base_Type (Etype (It.Typ)) = Standard_Void_Type
1202                then
1203                   return False;
1204                end if;
1205
1206                Get_Next_Interp (I, It);
1207             end loop;
1208
1209             return True;
1210          end if;
1211       end Prefix_Is_Access_Subp;
1212
1213    --  Start of processing for Check_Parameterless_Call
1214
1215    begin
1216       --  Defend against junk stuff if errors already detected
1217
1218       if Total_Errors_Detected /= 0 then
1219          if Nkind (N) in N_Has_Etype and then Etype (N) = Any_Type then
1220             return;
1221          elsif Nkind (N) in N_Has_Chars
1222            and then Chars (N) in Error_Name_Or_No_Name
1223          then
1224             return;
1225          end if;
1226
1227          Require_Entity (N);
1228       end if;
1229
1230       --  If the context expects a value, and the name is a procedure, this is
1231       --  most likely a missing 'Access. Don't try to resolve the parameterless
1232       --  call, error will be caught when the outer call is analyzed.
1233
1234       if Is_Entity_Name (N)
1235         and then Ekind (Entity (N)) = E_Procedure
1236         and then not Is_Overloaded (N)
1237         and then
1238          Nkind_In (Parent (N), N_Parameter_Association,
1239                                N_Function_Call,
1240                                N_Procedure_Call_Statement)
1241       then
1242          return;
1243       end if;
1244
1245       --  Rewrite as call if overloadable entity that is (or could be, in the
1246       --  overloaded case) a function call. If we know for sure that the entity
1247       --  is an enumeration literal, we do not rewrite it.
1248
1249       --  If the entity is the name of an operator, it cannot be a call because
1250       --  operators cannot have default parameters. In this case, this must be
1251       --  a string whose contents coincide with an operator name. Set the kind
1252       --  of the node appropriately.
1253
1254       if (Is_Entity_Name (N)
1255             and then Nkind (N) /= N_Operator_Symbol
1256             and then Is_Overloadable (Entity (N))
1257             and then (Ekind (Entity (N)) /= E_Enumeration_Literal
1258                        or else Is_Overloaded (N)))
1259
1260       --  Rewrite as call if it is an explicit dereference of an expression of
1261       --  a subprogram access type, and the subprogram type is not that of a
1262       --  procedure or entry.
1263
1264       or else
1265         (Nkind (N) = N_Explicit_Dereference and then Prefix_Is_Access_Subp)
1266
1267       --  Rewrite as call if it is a selected component which is a function,
1268       --  this is the case of a call to a protected function (which may be
1269       --  overloaded with other protected operations).
1270
1271       or else
1272         (Nkind (N) = N_Selected_Component
1273           and then (Ekind (Entity (Selector_Name (N))) = E_Function
1274                      or else
1275                        (Ekind_In (Entity (Selector_Name (N)), E_Entry,
1276                                                               E_Procedure)
1277                          and then Is_Overloaded (Selector_Name (N)))))
1278
1279       --  If one of the above three conditions is met, rewrite as call. Apply
1280       --  the rewriting only once.
1281
1282       then
1283          if Nkind (Parent (N)) /= N_Function_Call
1284            or else N /= Name (Parent (N))
1285          then
1286
1287             --  This may be a prefixed call that was not fully analyzed, e.g.
1288             --  an actual in an instance.
1289
1290             if Ada_Version >= Ada_2005
1291               and then Nkind (N) = N_Selected_Component
1292               and then Is_Dispatching_Operation (Entity (Selector_Name (N)))
1293             then
1294                Analyze_Selected_Component (N);
1295
1296                if Nkind (N) /= N_Selected_Component then
1297                   return;
1298                end if;
1299             end if;
1300
1301             --  The node is the name of the parameterless call. Preserve its
1302             --  descendants, which may be complex expressions.
1303
1304             Nam := Relocate_Node (N);
1305
1306             --  If overloaded, overload set belongs to new copy
1307
1308             Save_Interps (N, Nam);
1309
1310             --  Change node to parameterless function call (note that the
1311             --  Parameter_Associations associations field is left set to Empty,
1312             --  its normal default value since there are no parameters)
1313
1314             Change_Node (N, N_Function_Call);
1315             Set_Name (N, Nam);
1316             Set_Sloc (N, Sloc (Nam));
1317             Analyze_Call (N);
1318          end if;
1319
1320       elsif Nkind (N) = N_Parameter_Association then
1321          Check_Parameterless_Call (Explicit_Actual_Parameter (N));
1322
1323       elsif Nkind (N) = N_Operator_Symbol then
1324          Change_Operator_Symbol_To_String_Literal (N);
1325          Set_Is_Overloaded (N, False);
1326          Set_Etype (N, Any_String);
1327       end if;
1328    end Check_Parameterless_Call;
1329
1330    --------------------------------
1331    -- Is_Atomic_Ref_With_Address --
1332    --------------------------------
1333
1334    function Is_Atomic_Ref_With_Address (N : Node_Id) return Boolean is
1335       Pref : constant Node_Id := Prefix (N);
1336
1337    begin
1338       if not Is_Entity_Name (Pref) then
1339          return False;
1340
1341       else
1342          declare
1343             Pent : constant Entity_Id := Entity (Pref);
1344             Ptyp : constant Entity_Id := Etype (Pent);
1345          begin
1346             return not Is_Access_Type (Ptyp)
1347               and then (Is_Atomic (Ptyp) or else Is_Atomic (Pent))
1348               and then Present (Address_Clause (Pent));
1349          end;
1350       end if;
1351    end Is_Atomic_Ref_With_Address;
1352
1353    -----------------------------
1354    -- Is_Definite_Access_Type --
1355    -----------------------------
1356
1357    function Is_Definite_Access_Type (E : Entity_Id) return Boolean is
1358       Btyp : constant Entity_Id := Base_Type (E);
1359    begin
1360       return Ekind (Btyp) = E_Access_Type
1361         or else (Ekind (Btyp) = E_Access_Subprogram_Type
1362                   and then Comes_From_Source (Btyp));
1363    end Is_Definite_Access_Type;
1364
1365    ----------------------
1366    -- Is_Predefined_Op --
1367    ----------------------
1368
1369    function Is_Predefined_Op (Nam : Entity_Id) return Boolean is
1370    begin
1371       --  Predefined operators are intrinsic subprograms
1372
1373       if not Is_Intrinsic_Subprogram (Nam) then
1374          return False;
1375       end if;
1376
1377       --  A call to a back-end builtin is never a predefined operator
1378
1379       if Is_Imported (Nam) and then Present (Interface_Name (Nam)) then
1380          return False;
1381       end if;
1382
1383       return not Is_Generic_Instance (Nam)
1384         and then Chars (Nam) in Any_Operator_Name
1385         and then (No (Alias (Nam)) or else Is_Predefined_Op (Alias (Nam)));
1386    end Is_Predefined_Op;
1387
1388    -----------------------------
1389    -- Make_Call_Into_Operator --
1390    -----------------------------
1391
1392    procedure Make_Call_Into_Operator
1393      (N     : Node_Id;
1394       Typ   : Entity_Id;
1395       Op_Id : Entity_Id)
1396    is
1397       Op_Name   : constant Name_Id := Chars (Op_Id);
1398       Act1      : Node_Id := First_Actual (N);
1399       Act2      : Node_Id := Next_Actual (Act1);
1400       Error     : Boolean := False;
1401       Func      : constant Entity_Id := Entity (Name (N));
1402       Is_Binary : constant Boolean   := Present (Act2);
1403       Op_Node   : Node_Id;
1404       Opnd_Type : Entity_Id;
1405       Orig_Type : Entity_Id := Empty;
1406       Pack      : Entity_Id;
1407
1408       type Kind_Test is access function (E : Entity_Id) return Boolean;
1409
1410       function Operand_Type_In_Scope (S : Entity_Id) return Boolean;
1411       --  If the operand is not universal, and the operator is given by an
1412       --  expanded name, verify that the operand has an interpretation with a
1413       --  type defined in the given scope of the operator.
1414
1415       function Type_In_P (Test : Kind_Test) return Entity_Id;
1416       --  Find a type of the given class in package Pack that contains the
1417       --  operator.
1418
1419       ---------------------------
1420       -- Operand_Type_In_Scope --
1421       ---------------------------
1422
1423       function Operand_Type_In_Scope (S : Entity_Id) return Boolean is
1424          Nod : constant Node_Id := Right_Opnd (Op_Node);
1425          I   : Interp_Index;
1426          It  : Interp;
1427
1428       begin
1429          if not Is_Overloaded (Nod) then
1430             return Scope (Base_Type (Etype (Nod))) = S;
1431
1432          else
1433             Get_First_Interp (Nod, I, It);
1434             while Present (It.Typ) loop
1435                if Scope (Base_Type (It.Typ)) = S then
1436                   return True;
1437                end if;
1438
1439                Get_Next_Interp (I, It);
1440             end loop;
1441
1442             return False;
1443          end if;
1444       end Operand_Type_In_Scope;
1445
1446       ---------------
1447       -- Type_In_P --
1448       ---------------
1449
1450       function Type_In_P (Test : Kind_Test) return Entity_Id is
1451          E : Entity_Id;
1452
1453          function In_Decl return Boolean;
1454          --  Verify that node is not part of the type declaration for the
1455          --  candidate type, which would otherwise be invisible.
1456
1457          -------------
1458          -- In_Decl --
1459          -------------
1460
1461          function In_Decl return Boolean is
1462             Decl_Node : constant Node_Id := Parent (E);
1463             N2        : Node_Id;
1464
1465          begin
1466             N2 := N;
1467
1468             if Etype (E) = Any_Type then
1469                return True;
1470
1471             elsif No (Decl_Node) then
1472                return False;
1473
1474             else
1475                while Present (N2)
1476                  and then Nkind (N2) /= N_Compilation_Unit
1477                loop
1478                   if N2 = Decl_Node then
1479                      return True;
1480                   else
1481                      N2 := Parent (N2);
1482                   end if;
1483                end loop;
1484
1485                return False;
1486             end if;
1487          end In_Decl;
1488
1489       --  Start of processing for Type_In_P
1490
1491       begin
1492          --  If the context type is declared in the prefix package, this is the
1493          --  desired base type.
1494
1495          if Scope (Base_Type (Typ)) = Pack and then Test (Typ) then
1496             return Base_Type (Typ);
1497
1498          else
1499             E := First_Entity (Pack);
1500             while Present (E) loop
1501                if Test (E)
1502                  and then not In_Decl
1503                then
1504                   return E;
1505                end if;
1506
1507                Next_Entity (E);
1508             end loop;
1509
1510             return Empty;
1511          end if;
1512       end Type_In_P;
1513
1514    --  Start of processing for Make_Call_Into_Operator
1515
1516    begin
1517       Op_Node := New_Node (Operator_Kind (Op_Name, Is_Binary), Sloc (N));
1518
1519       --  Binary operator
1520
1521       if Is_Binary then
1522          Set_Left_Opnd  (Op_Node, Relocate_Node (Act1));
1523          Set_Right_Opnd (Op_Node, Relocate_Node (Act2));
1524          Save_Interps (Act1, Left_Opnd  (Op_Node));
1525          Save_Interps (Act2, Right_Opnd (Op_Node));
1526          Act1 := Left_Opnd (Op_Node);
1527          Act2 := Right_Opnd (Op_Node);
1528
1529       --  Unary operator
1530
1531       else
1532          Set_Right_Opnd (Op_Node, Relocate_Node (Act1));
1533          Save_Interps (Act1, Right_Opnd (Op_Node));
1534          Act1 := Right_Opnd (Op_Node);
1535       end if;
1536
1537       --  If the operator is denoted by an expanded name, and the prefix is
1538       --  not Standard, but the operator is a predefined one whose scope is
1539       --  Standard, then this is an implicit_operator, inserted as an
1540       --  interpretation by the procedure of the same name. This procedure
1541       --  overestimates the presence of implicit operators, because it does
1542       --  not examine the type of the operands. Verify now that the operand
1543       --  type appears in the given scope. If right operand is universal,
1544       --  check the other operand. In the case of concatenation, either
1545       --  argument can be the component type, so check the type of the result.
1546       --  If both arguments are literals, look for a type of the right kind
1547       --  defined in the given scope. This elaborate nonsense is brought to
1548       --  you courtesy of b33302a. The type itself must be frozen, so we must
1549       --  find the type of the proper class in the given scope.
1550
1551       --  A final wrinkle is the multiplication operator for fixed point types,
1552       --  which is defined in Standard only, and not in the scope of the
1553       --  fixed point type itself.
1554
1555       if Nkind (Name (N)) = N_Expanded_Name then
1556          Pack := Entity (Prefix (Name (N)));
1557
1558          --  If this is a package renaming, get renamed entity, which will be
1559          --  the scope of the operands if operaton is type-correct.
1560
1561          if Present (Renamed_Entity (Pack)) then
1562             Pack := Renamed_Entity (Pack);
1563          end if;
1564
1565          --  If the entity being called is defined in the given package, it is
1566          --  a renaming of a predefined operator, and known to be legal.
1567
1568          if Scope (Entity (Name (N))) = Pack
1569             and then Pack /= Standard_Standard
1570          then
1571             null;
1572
1573          --  Visibility does not need to be checked in an instance: if the
1574          --  operator was not visible in the generic it has been diagnosed
1575          --  already, else there is an implicit copy of it in the instance.
1576
1577          elsif In_Instance then
1578             null;
1579
1580          elsif Nam_In (Op_Name, Name_Op_Multiply, Name_Op_Divide)
1581            and then Is_Fixed_Point_Type (Etype (Left_Opnd  (Op_Node)))
1582            and then Is_Fixed_Point_Type (Etype (Right_Opnd (Op_Node)))
1583          then
1584             if Pack /= Standard_Standard then
1585                Error := True;
1586             end if;
1587
1588          --  Ada 2005 AI-420: Predefined equality on Universal_Access is
1589          --  available.
1590
1591          elsif Ada_Version >= Ada_2005
1592            and then Nam_In (Op_Name, Name_Op_Eq, Name_Op_Ne)
1593            and then Ekind (Etype (Act1)) = E_Anonymous_Access_Type
1594          then
1595             null;
1596
1597          else
1598             Opnd_Type := Base_Type (Etype (Right_Opnd (Op_Node)));
1599
1600             if Op_Name = Name_Op_Concat then
1601                Opnd_Type := Base_Type (Typ);
1602
1603             elsif (Scope (Opnd_Type) = Standard_Standard
1604                      and then Is_Binary)
1605               or else (Nkind (Right_Opnd (Op_Node)) = N_Attribute_Reference
1606                         and then Is_Binary
1607                         and then not Comes_From_Source (Opnd_Type))
1608             then
1609                Opnd_Type := Base_Type (Etype (Left_Opnd (Op_Node)));
1610             end if;
1611
1612             if Scope (Opnd_Type) = Standard_Standard then
1613
1614                --  Verify that the scope contains a type that corresponds to
1615                --  the given literal. Optimize the case where Pack is Standard.
1616
1617                if Pack /= Standard_Standard then
1618
1619                   if Opnd_Type = Universal_Integer then
1620                      Orig_Type := Type_In_P (Is_Integer_Type'Access);
1621
1622                   elsif Opnd_Type = Universal_Real then
1623                      Orig_Type := Type_In_P (Is_Real_Type'Access);
1624
1625                   elsif Opnd_Type = Any_String then
1626                      Orig_Type := Type_In_P (Is_String_Type'Access);
1627
1628                   elsif Opnd_Type = Any_Access then
1629                      Orig_Type := Type_In_P (Is_Definite_Access_Type'Access);
1630
1631                   elsif Opnd_Type = Any_Composite then
1632                      Orig_Type := Type_In_P (Is_Composite_Type'Access);
1633
1634                      if Present (Orig_Type) then
1635                         if Has_Private_Component (Orig_Type) then
1636                            Orig_Type := Empty;
1637                         else
1638                            Set_Etype (Act1, Orig_Type);
1639
1640                            if Is_Binary then
1641                               Set_Etype (Act2, Orig_Type);
1642                            end if;
1643                         end if;
1644                      end if;
1645
1646                   else
1647                      Orig_Type := Empty;
1648                   end if;
1649
1650                   Error := No (Orig_Type);
1651                end if;
1652
1653             elsif Ekind (Opnd_Type) = E_Allocator_Type
1654                and then No (Type_In_P (Is_Definite_Access_Type'Access))
1655             then
1656                Error := True;
1657
1658             --  If the type is defined elsewhere, and the operator is not
1659             --  defined in the given scope (by a renaming declaration, e.g.)
1660             --  then this is an error as well. If an extension of System is
1661             --  present, and the type may be defined there, Pack must be
1662             --  System itself.
1663
1664             elsif Scope (Opnd_Type) /= Pack
1665               and then Scope (Op_Id) /= Pack
1666               and then (No (System_Aux_Id)
1667                          or else Scope (Opnd_Type) /= System_Aux_Id
1668                          or else Pack /= Scope (System_Aux_Id))
1669             then
1670                if not Is_Overloaded (Right_Opnd (Op_Node)) then
1671                   Error := True;
1672                else
1673                   Error := not Operand_Type_In_Scope (Pack);
1674                end if;
1675
1676             elsif Pack = Standard_Standard
1677               and then not Operand_Type_In_Scope (Standard_Standard)
1678             then
1679                Error := True;
1680             end if;
1681          end if;
1682
1683          if Error then
1684             Error_Msg_Node_2 := Pack;
1685             Error_Msg_NE
1686               ("& not declared in&", N, Selector_Name (Name (N)));
1687             Set_Etype (N, Any_Type);
1688             return;
1689
1690          --  Detect a mismatch between the context type and the result type
1691          --  in the named package, which is otherwise not detected if the
1692          --  operands are universal. Check is only needed if source entity is
1693          --  an operator, not a function that renames an operator.
1694
1695          elsif Nkind (Parent (N)) /= N_Type_Conversion
1696            and then Ekind (Entity (Name (N))) = E_Operator
1697            and then Is_Numeric_Type (Typ)
1698            and then not Is_Universal_Numeric_Type (Typ)
1699            and then Scope (Base_Type (Typ)) /= Pack
1700            and then not In_Instance
1701          then
1702             if Is_Fixed_Point_Type (Typ)
1703               and then Nam_In (Op_Name, Name_Op_Multiply, Name_Op_Divide)
1704             then
1705                --  Already checked above
1706
1707                null;
1708
1709             --  Operator may be defined in an extension of System
1710
1711             elsif Present (System_Aux_Id)
1712               and then Scope (Opnd_Type) = System_Aux_Id
1713             then
1714                null;
1715
1716             else
1717                --  Could we use Wrong_Type here??? (this would require setting
1718                --  Etype (N) to the actual type found where Typ was expected).
1719
1720                Error_Msg_NE ("expect }", N, Typ);
1721             end if;
1722          end if;
1723       end if;
1724
1725       Set_Chars  (Op_Node, Op_Name);
1726
1727       if not Is_Private_Type (Etype (N)) then
1728          Set_Etype (Op_Node, Base_Type (Etype (N)));
1729       else
1730          Set_Etype (Op_Node, Etype (N));
1731       end if;
1732
1733       --  If this is a call to a function that renames a predefined equality,
1734       --  the renaming declaration provides a type that must be used to
1735       --  resolve the operands. This must be done now because resolution of
1736       --  the equality node will not resolve any remaining ambiguity, and it
1737       --  assumes that the first operand is not overloaded.
1738
1739       if Nam_In (Op_Name, Name_Op_Eq, Name_Op_Ne)
1740         and then Ekind (Func) = E_Function
1741         and then Is_Overloaded (Act1)
1742       then
1743          Resolve (Act1, Base_Type (Etype (First_Formal (Func))));
1744          Resolve (Act2, Base_Type (Etype (First_Formal (Func))));
1745       end if;
1746
1747       Set_Entity (Op_Node, Op_Id);
1748       Generate_Reference (Op_Id, N, ' ');
1749
1750       --  Do rewrite setting Comes_From_Source on the result if the original
1751       --  call came from source. Although it is not strictly the case that the
1752       --  operator as such comes from the source, logically it corresponds
1753       --  exactly to the function call in the source, so it should be marked
1754       --  this way (e.g. to make sure that validity checks work fine).
1755
1756       declare
1757          CS : constant Boolean := Comes_From_Source (N);
1758       begin
1759          Rewrite (N, Op_Node);
1760          Set_Comes_From_Source (N, CS);
1761       end;
1762
1763       --  If this is an arithmetic operator and the result type is private,
1764       --  the operands and the result must be wrapped in conversion to
1765       --  expose the underlying numeric type and expand the proper checks,
1766       --  e.g. on division.
1767
1768       if Is_Private_Type (Typ) then
1769          case Nkind (N) is
1770             when N_Op_Add   | N_Op_Subtract | N_Op_Multiply | N_Op_Divide |
1771                  N_Op_Expon | N_Op_Mod      | N_Op_Rem      =>
1772                Resolve_Intrinsic_Operator (N, Typ);
1773
1774             when N_Op_Plus  | N_Op_Minus    | N_Op_Abs      =>
1775                Resolve_Intrinsic_Unary_Operator (N, Typ);
1776
1777             when others =>
1778                Resolve (N, Typ);
1779          end case;
1780       else
1781          Resolve (N, Typ);
1782       end if;
1783
1784       --  If in ASIS_Mode, propagate operand types to original actuals of
1785       --  function call, which would otherwise not be fully resolved. If
1786       --  the call has already been constant-folded, nothing to do. We
1787       --  relocate the operand nodes rather than copy them, to preserve
1788       --  original_node pointers, given that the operands themselves may
1789       --  have been rewritten. If the call was itself a rewriting of an
1790       --  operator node, nothing to do.
1791
1792       if ASIS_Mode
1793         and then Nkind (N) in N_Op
1794         and then Nkind (Original_Node (N)) = N_Function_Call
1795       then
1796          declare
1797             L : Node_Id;
1798             R : constant Node_Id := Right_Opnd (N);
1799
1800             Old_First : constant Node_Id :=
1801                           First (Parameter_Associations (Original_Node (N)));
1802             Old_Sec   : Node_Id;
1803
1804          begin
1805             if Is_Binary then
1806                L       := Left_Opnd (N);
1807                Old_Sec := Next (Old_First);
1808
1809                --  If the original call has named associations, replace the
1810                --  explicit actual parameter in the association with the proper
1811                --  resolved operand.
1812
1813                if Nkind (Old_First) = N_Parameter_Association then
1814                   if Chars (Selector_Name (Old_First)) =
1815                      Chars (First_Entity (Op_Id))
1816                   then
1817                      Rewrite (Explicit_Actual_Parameter (Old_First),
1818                        Relocate_Node (L));
1819                   else
1820                      Rewrite (Explicit_Actual_Parameter (Old_First),
1821                        Relocate_Node (R));
1822                   end if;
1823
1824                else
1825                   Rewrite (Old_First, Relocate_Node (L));
1826                end if;
1827
1828                if Nkind (Old_Sec) = N_Parameter_Association then
1829                   if Chars (Selector_Name (Old_Sec))  =
1830                      Chars (First_Entity (Op_Id))
1831                   then
1832                      Rewrite (Explicit_Actual_Parameter (Old_Sec),
1833                        Relocate_Node (L));
1834                   else
1835                      Rewrite (Explicit_Actual_Parameter (Old_Sec),
1836                        Relocate_Node (R));
1837                   end if;
1838
1839                else
1840                   Rewrite (Old_Sec, Relocate_Node (R));
1841                end if;
1842
1843             else
1844                if Nkind (Old_First) = N_Parameter_Association then
1845                   Rewrite (Explicit_Actual_Parameter (Old_First),
1846                     Relocate_Node (R));
1847                else
1848                   Rewrite (Old_First, Relocate_Node (R));
1849                end if;
1850             end if;
1851          end;
1852
1853          Set_Parent (Original_Node (N), Parent (N));
1854       end if;
1855    end Make_Call_Into_Operator;
1856
1857    -------------------
1858    -- Operator_Kind --
1859    -------------------
1860
1861    function Operator_Kind
1862      (Op_Name   : Name_Id;
1863       Is_Binary : Boolean) return Node_Kind
1864    is
1865       Kind : Node_Kind;
1866
1867    begin
1868       --  Use CASE statement or array???
1869
1870       if Is_Binary then
1871          if    Op_Name =  Name_Op_And      then
1872             Kind := N_Op_And;
1873          elsif Op_Name =  Name_Op_Or       then
1874             Kind := N_Op_Or;
1875          elsif Op_Name =  Name_Op_Xor      then
1876             Kind := N_Op_Xor;
1877          elsif Op_Name =  Name_Op_Eq       then
1878             Kind := N_Op_Eq;
1879          elsif Op_Name =  Name_Op_Ne       then
1880             Kind := N_Op_Ne;
1881          elsif Op_Name =  Name_Op_Lt       then
1882             Kind := N_Op_Lt;
1883          elsif Op_Name =  Name_Op_Le       then
1884             Kind := N_Op_Le;
1885          elsif Op_Name =  Name_Op_Gt       then
1886             Kind := N_Op_Gt;
1887          elsif Op_Name =  Name_Op_Ge       then
1888             Kind := N_Op_Ge;
1889          elsif Op_Name =  Name_Op_Add      then
1890             Kind := N_Op_Add;
1891          elsif Op_Name =  Name_Op_Subtract then
1892             Kind := N_Op_Subtract;
1893          elsif Op_Name =  Name_Op_Concat   then
1894             Kind := N_Op_Concat;
1895          elsif Op_Name =  Name_Op_Multiply then
1896             Kind := N_Op_Multiply;
1897          elsif Op_Name =  Name_Op_Divide   then
1898             Kind := N_Op_Divide;
1899          elsif Op_Name =  Name_Op_Mod      then
1900             Kind := N_Op_Mod;
1901          elsif Op_Name =  Name_Op_Rem      then
1902             Kind := N_Op_Rem;
1903          elsif Op_Name =  Name_Op_Expon    then
1904             Kind := N_Op_Expon;
1905          else
1906             raise Program_Error;
1907          end if;
1908
1909       --  Unary operators
1910
1911       else
1912          if    Op_Name =  Name_Op_Add      then
1913             Kind := N_Op_Plus;
1914          elsif Op_Name =  Name_Op_Subtract then
1915             Kind := N_Op_Minus;
1916          elsif Op_Name =  Name_Op_Abs      then
1917             Kind := N_Op_Abs;
1918          elsif Op_Name =  Name_Op_Not      then
1919             Kind := N_Op_Not;
1920          else
1921             raise Program_Error;
1922          end if;
1923       end if;
1924
1925       return Kind;
1926    end Operator_Kind;
1927
1928    ----------------------------
1929    -- Preanalyze_And_Resolve --
1930    ----------------------------
1931
1932    procedure Preanalyze_And_Resolve (N : Node_Id; T : Entity_Id) is
1933       Save_Full_Analysis : constant Boolean := Full_Analysis;
1934
1935    begin
1936       Full_Analysis := False;
1937       Expander_Mode_Save_And_Set (False);
1938
1939       --  Normally, we suppress all checks for this preanalysis. There is no
1940       --  point in processing them now, since they will be applied properly
1941       --  and in the proper location when the default expressions reanalyzed
1942       --  and reexpanded later on. We will also have more information at that
1943       --  point for possible suppression of individual checks.
1944
1945       --  However, in SPARK mode, most expansion is suppressed, and this
1946       --  later reanalysis and reexpansion may not occur. SPARK mode does
1947       --  require the setting of checking flags for proof purposes, so we
1948       --  do the SPARK preanalysis without suppressing checks.
1949
1950       --  This special handling for SPARK mode is required for example in the
1951       --  case of Ada 2012 constructs such as quantified expressions, which are
1952       --  expanded in two separate steps.
1953
1954       if GNATprove_Mode then
1955          Analyze_And_Resolve (N, T);
1956       else
1957          Analyze_And_Resolve (N, T, Suppress => All_Checks);
1958       end if;
1959
1960       Expander_Mode_Restore;
1961       Full_Analysis := Save_Full_Analysis;
1962    end Preanalyze_And_Resolve;
1963
1964    --  Version without context type
1965
1966    procedure Preanalyze_And_Resolve (N : Node_Id) is
1967       Save_Full_Analysis : constant Boolean := Full_Analysis;
1968
1969    begin
1970       Full_Analysis := False;
1971       Expander_Mode_Save_And_Set (False);
1972
1973       Analyze (N);
1974       Resolve (N, Etype (N), Suppress => All_Checks);
1975
1976       Expander_Mode_Restore;
1977       Full_Analysis := Save_Full_Analysis;
1978    end Preanalyze_And_Resolve;
1979
1980    ----------------------------------
1981    -- Replace_Actual_Discriminants --
1982    ----------------------------------
1983
1984    procedure Replace_Actual_Discriminants (N : Node_Id; Default : Node_Id) is
1985       Loc : constant Source_Ptr := Sloc (N);
1986       Tsk : Node_Id := Empty;
1987
1988       function Process_Discr (Nod : Node_Id) return Traverse_Result;
1989       --  Comment needed???
1990
1991       -------------------
1992       -- Process_Discr --
1993       -------------------
1994
1995       function Process_Discr (Nod : Node_Id) return Traverse_Result is
1996          Ent : Entity_Id;
1997
1998       begin
1999          if Nkind (Nod) = N_Identifier then
2000             Ent := Entity (Nod);
2001
2002             if Present (Ent)
2003               and then Ekind (Ent) = E_Discriminant
2004             then
2005                Rewrite (Nod,
2006                  Make_Selected_Component (Loc,
2007                    Prefix        => New_Copy_Tree (Tsk, New_Sloc => Loc),
2008                    Selector_Name => Make_Identifier (Loc, Chars (Ent))));
2009
2010                Set_Etype (Nod, Etype (Ent));
2011             end if;
2012
2013          end if;
2014
2015          return OK;
2016       end Process_Discr;
2017
2018       procedure Replace_Discrs is new Traverse_Proc (Process_Discr);
2019
2020    --  Start of processing for Replace_Actual_Discriminants
2021
2022    begin
2023       if not Expander_Active then
2024          return;
2025       end if;
2026
2027       if Nkind (Name (N)) = N_Selected_Component then
2028          Tsk := Prefix (Name (N));
2029
2030       elsif Nkind (Name (N)) = N_Indexed_Component then
2031          Tsk := Prefix (Prefix (Name (N)));
2032       end if;
2033
2034       if No (Tsk) then
2035          return;
2036       else
2037          Replace_Discrs (Default);
2038       end if;
2039    end Replace_Actual_Discriminants;
2040
2041    -------------
2042    -- Resolve --
2043    -------------
2044
2045    procedure Resolve (N : Node_Id; Typ : Entity_Id) is
2046       Ambiguous : Boolean   := False;
2047       Ctx_Type  : Entity_Id := Typ;
2048       Expr_Type : Entity_Id := Empty; -- prevent junk warning
2049       Err_Type  : Entity_Id := Empty;
2050       Found     : Boolean   := False;
2051       From_Lib  : Boolean;
2052       I         : Interp_Index;
2053       I1        : Interp_Index := 0;  -- prevent junk warning
2054       It        : Interp;
2055       It1       : Interp;
2056       Seen      : Entity_Id := Empty; -- prevent junk warning
2057
2058       function Comes_From_Predefined_Lib_Unit (Nod : Node_Id) return Boolean;
2059       --  Determine whether a node comes from a predefined library unit or
2060       --  Standard.
2061
2062       procedure Patch_Up_Value (N : Node_Id; Typ : Entity_Id);
2063       --  Try and fix up a literal so that it matches its expected type. New
2064       --  literals are manufactured if necessary to avoid cascaded errors.
2065
2066       procedure Report_Ambiguous_Argument;
2067       --  Additional diagnostics when an ambiguous call has an ambiguous
2068       --  argument (typically a controlling actual).
2069
2070       procedure Resolution_Failed;
2071       --  Called when attempt at resolving current expression fails
2072
2073       ------------------------------------
2074       -- Comes_From_Predefined_Lib_Unit --
2075       -------------------------------------
2076
2077       function Comes_From_Predefined_Lib_Unit (Nod : Node_Id) return Boolean is
2078       begin
2079          return
2080            Sloc (Nod) = Standard_Location
2081              or else Is_Predefined_File_Name
2082                        (Unit_File_Name (Get_Source_Unit (Sloc (Nod))));
2083       end Comes_From_Predefined_Lib_Unit;
2084
2085       --------------------
2086       -- Patch_Up_Value --
2087       --------------------
2088
2089       procedure Patch_Up_Value (N : Node_Id; Typ : Entity_Id) is
2090       begin
2091          if Nkind (N) = N_Integer_Literal and then Is_Real_Type (Typ) then
2092             Rewrite (N,
2093               Make_Real_Literal (Sloc (N),
2094                 Realval => UR_From_Uint (Intval (N))));
2095             Set_Etype (N, Universal_Real);
2096             Set_Is_Static_Expression (N);
2097
2098          elsif Nkind (N) = N_Real_Literal and then Is_Integer_Type (Typ) then
2099             Rewrite (N,
2100               Make_Integer_Literal (Sloc (N),
2101                 Intval => UR_To_Uint (Realval (N))));
2102             Set_Etype (N, Universal_Integer);
2103             Set_Is_Static_Expression (N);
2104
2105          elsif Nkind (N) = N_String_Literal
2106                  and then Is_Character_Type (Typ)
2107          then
2108             Set_Character_Literal_Name (Char_Code (Character'Pos ('A')));
2109             Rewrite (N,
2110               Make_Character_Literal (Sloc (N),
2111                 Chars => Name_Find,
2112                 Char_Literal_Value =>
2113                   UI_From_Int (Character'Pos ('A'))));
2114             Set_Etype (N, Any_Character);
2115             Set_Is_Static_Expression (N);
2116
2117          elsif Nkind (N) /= N_String_Literal and then Is_String_Type (Typ) then
2118             Rewrite (N,
2119               Make_String_Literal (Sloc (N),
2120                 Strval => End_String));
2121
2122          elsif Nkind (N) = N_Range then
2123             Patch_Up_Value (Low_Bound (N),  Typ);
2124             Patch_Up_Value (High_Bound (N), Typ);
2125          end if;
2126       end Patch_Up_Value;
2127
2128       -------------------------------
2129       -- Report_Ambiguous_Argument --
2130       -------------------------------
2131
2132       procedure Report_Ambiguous_Argument is
2133          Arg : constant Node_Id := First (Parameter_Associations (N));
2134          I   : Interp_Index;
2135          It  : Interp;
2136
2137       begin
2138          if Nkind (Arg) = N_Function_Call
2139            and then Is_Entity_Name (Name (Arg))
2140            and then Is_Overloaded (Name (Arg))
2141          then
2142             Error_Msg_NE ("ambiguous call to&", Arg, Name (Arg));
2143
2144             --  Could use comments on what is going on here???
2145
2146             Get_First_Interp (Name (Arg), I, It);
2147             while Present (It.Nam) loop
2148                Error_Msg_Sloc := Sloc (It.Nam);
2149
2150                if Nkind (Parent (It.Nam)) = N_Full_Type_Declaration then
2151                   Error_Msg_N ("interpretation (inherited) #!", Arg);
2152                else
2153                   Error_Msg_N ("interpretation #!", Arg);
2154                end if;
2155
2156                Get_Next_Interp (I, It);
2157             end loop;
2158          end if;
2159       end Report_Ambiguous_Argument;
2160
2161       -----------------------
2162       -- Resolution_Failed --
2163       -----------------------
2164
2165       procedure Resolution_Failed is
2166       begin
2167          Patch_Up_Value (N, Typ);
2168          Set_Etype (N, Typ);
2169          Debug_A_Exit ("resolving  ", N, " (done, resolution failed)");
2170          Set_Is_Overloaded (N, False);
2171
2172          --  The caller will return without calling the expander, so we need
2173          --  to set the analyzed flag. Note that it is fine to set Analyzed
2174          --  to True even if we are in the middle of a shallow analysis,
2175          --  (see the spec of sem for more details) since this is an error
2176          --  situation anyway, and there is no point in repeating the
2177          --  analysis later (indeed it won't work to repeat it later, since
2178          --  we haven't got a clear resolution of which entity is being
2179          --  referenced.)
2180
2181          Set_Analyzed (N, True);
2182          return;
2183       end Resolution_Failed;
2184
2185    --  Start of processing for Resolve
2186
2187    begin
2188       if N = Error then
2189          return;
2190       end if;
2191
2192       --  Access attribute on remote subprogram cannot be used for a non-remote
2193       --  access-to-subprogram type.
2194
2195       if Nkind (N) = N_Attribute_Reference
2196         and then Nam_In (Attribute_Name (N), Name_Access,
2197                                              Name_Unrestricted_Access,
2198                                              Name_Unchecked_Access)
2199         and then Comes_From_Source (N)
2200         and then Is_Entity_Name (Prefix (N))
2201         and then Is_Subprogram (Entity (Prefix (N)))
2202         and then Is_Remote_Call_Interface (Entity (Prefix (N)))
2203         and then not Is_Remote_Access_To_Subprogram_Type (Typ)
2204       then
2205          Error_Msg_N
2206            ("prefix must statically denote a non-remote subprogram", N);
2207       end if;
2208
2209       From_Lib := Comes_From_Predefined_Lib_Unit (N);
2210
2211       --  If the context is a Remote_Access_To_Subprogram, access attributes
2212       --  must be resolved with the corresponding fat pointer. There is no need
2213       --  to check for the attribute name since the return type of an
2214       --  attribute is never a remote type.
2215
2216       if Nkind (N) = N_Attribute_Reference
2217         and then Comes_From_Source (N)
2218         and then (Is_Remote_Call_Interface (Typ) or else Is_Remote_Types (Typ))
2219       then
2220          declare
2221             Attr      : constant Attribute_Id :=
2222                           Get_Attribute_Id (Attribute_Name (N));
2223             Pref      : constant Node_Id      := Prefix (N);
2224             Decl      : Node_Id;
2225             Spec      : Node_Id;
2226             Is_Remote : Boolean := True;
2227
2228          begin
2229             --  Check that Typ is a remote access-to-subprogram type
2230
2231             if Is_Remote_Access_To_Subprogram_Type (Typ) then
2232
2233                --  Prefix (N) must statically denote a remote subprogram
2234                --  declared in a package specification.
2235
2236                if Attr = Attribute_Access           or else
2237                   Attr = Attribute_Unchecked_Access or else
2238                   Attr = Attribute_Unrestricted_Access
2239                then
2240                   Decl := Unit_Declaration_Node (Entity (Pref));
2241
2242                   if Nkind (Decl) = N_Subprogram_Body then
2243                      Spec := Corresponding_Spec (Decl);
2244
2245                      if Present (Spec) then
2246                         Decl := Unit_Declaration_Node (Spec);
2247                      end if;
2248                   end if;
2249
2250                   Spec := Parent (Decl);
2251
2252                   if not Is_Entity_Name (Prefix (N))
2253                     or else Nkind (Spec) /= N_Package_Specification
2254                     or else
2255                       not Is_Remote_Call_Interface (Defining_Entity (Spec))
2256                   then
2257                      Is_Remote := False;
2258                      Error_Msg_N
2259                        ("prefix must statically denote a remote subprogram ",
2260                         N);
2261                   end if;
2262
2263                   --  If we are generating code in distributed mode, perform
2264                   --  semantic checks against corresponding remote entities.
2265
2266                   if Expander_Active
2267                     and then Get_PCS_Name /= Name_No_DSA
2268                   then
2269                      Check_Subtype_Conformant
2270                        (New_Id  => Entity (Prefix (N)),
2271                         Old_Id  => Designated_Type
2272                                      (Corresponding_Remote_Type (Typ)),
2273                         Err_Loc => N);
2274
2275                      if Is_Remote then
2276                         Process_Remote_AST_Attribute (N, Typ);
2277                      end if;
2278                   end if;
2279                end if;
2280             end if;
2281          end;
2282       end if;
2283
2284       Debug_A_Entry ("resolving  ", N);
2285
2286       if Debug_Flag_V then
2287          Write_Overloads (N);
2288       end if;
2289
2290       if Comes_From_Source (N) then
2291          if Is_Fixed_Point_Type (Typ) then
2292             Check_Restriction (No_Fixed_Point, N);
2293
2294          elsif Is_Floating_Point_Type (Typ)
2295            and then Typ /= Universal_Real
2296            and then Typ /= Any_Real
2297          then
2298             Check_Restriction (No_Floating_Point, N);
2299          end if;
2300       end if;
2301
2302       --  Return if already analyzed
2303
2304       if Analyzed (N) then
2305          Debug_A_Exit ("resolving  ", N, "  (done, already analyzed)");
2306          Analyze_Dimension (N);
2307          return;
2308
2309       --  Any case of Any_Type as the Etype value means that we had a
2310       --  previous error.
2311
2312       elsif Etype (N) = Any_Type then
2313          Debug_A_Exit ("resolving  ", N, "  (done, Etype = Any_Type)");
2314          return;
2315       end if;
2316
2317       Check_Parameterless_Call (N);
2318
2319       --  The resolution of an Expression_With_Actions is determined by
2320       --  its Expression.
2321
2322       if Nkind (N) = N_Expression_With_Actions then
2323          Resolve (Expression (N), Typ);
2324
2325          Found := True;
2326          Expr_Type := Etype (Expression (N));
2327
2328       --  If not overloaded, then we know the type, and all that needs doing
2329       --  is to check that this type is compatible with the context.
2330
2331       elsif not Is_Overloaded (N) then
2332          Found := Covers (Typ, Etype (N));
2333          Expr_Type := Etype (N);
2334
2335       --  In the overloaded case, we must select the interpretation that
2336       --  is compatible with the context (i.e. the type passed to Resolve)
2337
2338       else
2339          --  Loop through possible interpretations
2340
2341          Get_First_Interp (N, I, It);
2342          Interp_Loop : while Present (It.Typ) loop
2343
2344             if Debug_Flag_V then
2345                Write_Str ("Interp: ");
2346                Write_Interp (It);
2347             end if;
2348
2349             --  We are only interested in interpretations that are compatible
2350             --  with the expected type, any other interpretations are ignored.
2351
2352             if not Covers (Typ, It.Typ) then
2353                if Debug_Flag_V then
2354                   Write_Str ("    interpretation incompatible with context");
2355                   Write_Eol;
2356                end if;
2357
2358             else
2359                --  Skip the current interpretation if it is disabled by an
2360                --  abstract operator. This action is performed only when the
2361                --  type against which we are resolving is the same as the
2362                --  type of the interpretation.
2363
2364                if Ada_Version >= Ada_2005
2365                  and then It.Typ = Typ
2366                  and then Typ /= Universal_Integer
2367                  and then Typ /= Universal_Real
2368                  and then Present (It.Abstract_Op)
2369                then
2370                   if Debug_Flag_V then
2371                      Write_Line ("Skip.");
2372                   end if;
2373
2374                   goto Continue;
2375                end if;
2376
2377                --  First matching interpretation
2378
2379                if not Found then
2380                   Found := True;
2381                   I1    := I;
2382                   Seen  := It.Nam;
2383                   Expr_Type := It.Typ;
2384
2385                --  Matching interpretation that is not the first, maybe an
2386                --  error, but there are some cases where preference rules are
2387                --  used to choose between the two possibilities. These and
2388                --  some more obscure cases are handled in Disambiguate.
2389
2390                else
2391                   --  If the current statement is part of a predefined library
2392                   --  unit, then all interpretations which come from user level
2393                   --  packages should not be considered. Check previous and
2394                   --  current one.
2395
2396                   if From_Lib then
2397                      if not Comes_From_Predefined_Lib_Unit (It.Nam) then
2398                         goto Continue;
2399
2400                      elsif not Comes_From_Predefined_Lib_Unit (Seen) then
2401
2402                         --  Previous interpretation must be discarded
2403
2404                         I1 := I;
2405                         Seen := It.Nam;
2406                         Expr_Type := It.Typ;
2407                         Set_Entity (N, Seen);
2408                         goto Continue;
2409                      end if;
2410                   end if;
2411
2412                   --  Otherwise apply further disambiguation steps
2413
2414                   Error_Msg_Sloc := Sloc (Seen);
2415                   It1 := Disambiguate (N, I1, I, Typ);
2416
2417                   --  Disambiguation has succeeded. Skip the remaining
2418                   --  interpretations.
2419
2420                   if It1 /= No_Interp then
2421                      Seen := It1.Nam;
2422                      Expr_Type := It1.Typ;
2423
2424                      while Present (It.Typ) loop
2425                         Get_Next_Interp (I, It);
2426                      end loop;
2427
2428                   else
2429                      --  Before we issue an ambiguity complaint, check for
2430                      --  the case of a subprogram call where at least one
2431                      --  of the arguments is Any_Type, and if so, suppress
2432                      --  the message, since it is a cascaded error.
2433
2434                      if Nkind (N) in N_Subprogram_Call then
2435                         declare
2436                            A : Node_Id;
2437                            E : Node_Id;
2438
2439                         begin
2440                            A := First_Actual (N);
2441                            while Present (A) loop
2442                               E := A;
2443
2444                               if Nkind (E) = N_Parameter_Association then
2445                                  E := Explicit_Actual_Parameter (E);
2446                               end if;
2447
2448                               if Etype (E) = Any_Type then
2449                                  if Debug_Flag_V then
2450                                     Write_Str ("Any_Type in call");
2451                                     Write_Eol;
2452                                  end if;
2453
2454                                  exit Interp_Loop;
2455                               end if;
2456
2457                               Next_Actual (A);
2458                            end loop;
2459                         end;
2460
2461                      elsif Nkind (N) in N_Binary_Op
2462                        and then (Etype (Left_Opnd (N)) = Any_Type
2463                                   or else Etype (Right_Opnd (N)) = Any_Type)
2464                      then
2465                         exit Interp_Loop;
2466
2467                      elsif Nkind (N) in  N_Unary_Op
2468                        and then Etype (Right_Opnd (N)) = Any_Type
2469                      then
2470                         exit Interp_Loop;
2471                      end if;
2472
2473                      --  Not that special case, so issue message using the
2474                      --  flag Ambiguous to control printing of the header
2475                      --  message only at the start of an ambiguous set.
2476
2477                      if not Ambiguous then
2478                         if Nkind (N) = N_Function_Call
2479                           and then Nkind (Name (N)) = N_Explicit_Dereference
2480                         then
2481                            Error_Msg_N
2482                              ("ambiguous expression "
2483                                & "(cannot resolve indirect call)!", N);
2484                         else
2485                            Error_Msg_NE -- CODEFIX
2486                              ("ambiguous expression (cannot resolve&)!",
2487                               N, It.Nam);
2488                         end if;
2489
2490                         Ambiguous := True;
2491
2492                         if Nkind (Parent (Seen)) = N_Full_Type_Declaration then
2493                            Error_Msg_N
2494                              ("\\possible interpretation (inherited)#!", N);
2495                         else
2496                            Error_Msg_N -- CODEFIX
2497                              ("\\possible interpretation#!", N);
2498                         end if;
2499
2500                         if Nkind (N) in N_Subprogram_Call
2501                           and then Present (Parameter_Associations (N))
2502                         then
2503                            Report_Ambiguous_Argument;
2504                         end if;
2505                      end if;
2506
2507                      Error_Msg_Sloc := Sloc (It.Nam);
2508
2509                      --  By default, the error message refers to the candidate
2510                      --  interpretation. But if it is a predefined operator, it
2511                      --  is implicitly declared at the declaration of the type
2512                      --  of the operand. Recover the sloc of that declaration
2513                      --  for the error message.
2514
2515                      if Nkind (N) in N_Op
2516                        and then Scope (It.Nam) = Standard_Standard
2517                        and then not Is_Overloaded (Right_Opnd (N))
2518                        and then Scope (Base_Type (Etype (Right_Opnd (N)))) /=
2519                                                              Standard_Standard
2520                      then
2521                         Err_Type := First_Subtype (Etype (Right_Opnd (N)));
2522
2523                         if Comes_From_Source (Err_Type)
2524                           and then Present (Parent (Err_Type))
2525                         then
2526                            Error_Msg_Sloc := Sloc (Parent (Err_Type));
2527                         end if;
2528
2529                      elsif Nkind (N) in N_Binary_Op
2530                        and then Scope (It.Nam) = Standard_Standard
2531                        and then not Is_Overloaded (Left_Opnd (N))
2532                        and then Scope (Base_Type (Etype (Left_Opnd (N)))) /=
2533                                                              Standard_Standard
2534                      then
2535                         Err_Type := First_Subtype (Etype (Left_Opnd (N)));
2536
2537                         if Comes_From_Source (Err_Type)
2538                           and then Present (Parent (Err_Type))
2539                         then
2540                            Error_Msg_Sloc := Sloc (Parent (Err_Type));
2541                         end if;
2542
2543                      --  If this is an indirect call, use the subprogram_type
2544                      --  in the message, to have a meaningful location. Also
2545                      --  indicate if this is an inherited operation, created
2546                      --  by a type declaration.
2547
2548                      elsif Nkind (N) = N_Function_Call
2549                        and then Nkind (Name (N)) = N_Explicit_Dereference
2550                        and then Is_Type (It.Nam)
2551                      then
2552                         Err_Type := It.Nam;
2553                         Error_Msg_Sloc :=
2554                           Sloc (Associated_Node_For_Itype (Err_Type));
2555                      else
2556                         Err_Type := Empty;
2557                      end if;
2558
2559                      if Nkind (N) in N_Op
2560                        and then Scope (It.Nam) = Standard_Standard
2561                        and then Present (Err_Type)
2562                      then
2563                         --  Special-case the message for universal_fixed
2564                         --  operators, which are not declared with the type
2565                         --  of the operand, but appear forever in Standard.
2566
2567                         if  It.Typ = Universal_Fixed
2568                           and then Scope (It.Nam) = Standard_Standard
2569                         then
2570                            Error_Msg_N
2571                              ("\\possible interpretation as universal_fixed "
2572                               & "operation (RM 4.5.5 (19))", N);
2573                         else
2574                            Error_Msg_N
2575                              ("\\possible interpretation (predefined)#!", N);
2576                         end if;
2577
2578                      elsif
2579                        Nkind (Parent (It.Nam)) = N_Full_Type_Declaration
2580                      then
2581                         Error_Msg_N
2582                           ("\\possible interpretation (inherited)#!", N);
2583                      else
2584                         Error_Msg_N -- CODEFIX
2585                           ("\\possible interpretation#!", N);
2586                      end if;
2587
2588                   end if;
2589                end if;
2590
2591                --  We have a matching interpretation, Expr_Type is the type
2592                --  from this interpretation, and Seen is the entity.
2593
2594                --  For an operator, just set the entity name. The type will be
2595                --  set by the specific operator resolution routine.
2596
2597                if Nkind (N) in N_Op then
2598                   Set_Entity (N, Seen);
2599                   Generate_Reference (Seen, N);
2600
2601                elsif Nkind (N) = N_Case_Expression then
2602                   Set_Etype (N, Expr_Type);
2603
2604                elsif Nkind (N) = N_Character_Literal then
2605                   Set_Etype (N, Expr_Type);
2606
2607                elsif Nkind (N) = N_If_Expression then
2608                   Set_Etype (N, Expr_Type);
2609
2610                --  AI05-0139-2: Expression is overloaded because type has
2611                --  implicit dereference. If type matches context, no implicit
2612                --  dereference is involved.
2613
2614                elsif Has_Implicit_Dereference (Expr_Type) then
2615                   Set_Etype (N, Expr_Type);
2616                   Set_Is_Overloaded (N, False);
2617                   exit Interp_Loop;
2618
2619                elsif Is_Overloaded (N)
2620                  and then Present (It.Nam)
2621                  and then Ekind (It.Nam) = E_Discriminant
2622                  and then Has_Implicit_Dereference (It.Nam)
2623                then
2624                   --  If the node is a general indexing, the dereference is
2625                   --  is inserted when resolving the rewritten form, else
2626                   --  insert it now.
2627
2628                   if Nkind (N) /= N_Indexed_Component
2629                     or else No (Generalized_Indexing (N))
2630                   then
2631                      Build_Explicit_Dereference (N, It.Nam);
2632                   end if;
2633
2634                --  For an explicit dereference, attribute reference, range,
2635                --  short-circuit form (which is not an operator node), or call
2636                --  with a name that is an explicit dereference, there is
2637                --  nothing to be done at this point.
2638
2639                elsif Nkind_In (N, N_Explicit_Dereference,
2640                                   N_Attribute_Reference,
2641                                   N_And_Then,
2642                                   N_Indexed_Component,
2643                                   N_Or_Else,
2644                                   N_Range,
2645                                   N_Selected_Component,
2646                                   N_Slice)
2647                  or else Nkind (Name (N)) = N_Explicit_Dereference
2648                then
2649                   null;
2650
2651                --  For procedure or function calls, set the type of the name,
2652                --  and also the entity pointer for the prefix.
2653
2654                elsif Nkind (N) in N_Subprogram_Call
2655                  and then Is_Entity_Name (Name (N))
2656                then
2657                   Set_Etype  (Name (N), Expr_Type);
2658                   Set_Entity (Name (N), Seen);
2659                   Generate_Reference (Seen, Name (N));
2660
2661                elsif Nkind (N) = N_Function_Call
2662                  and then Nkind (Name (N)) = N_Selected_Component
2663                then
2664                   Set_Etype (Name (N), Expr_Type);
2665                   Set_Entity (Selector_Name (Name (N)), Seen);
2666                   Generate_Reference (Seen, Selector_Name (Name (N)));
2667
2668                --  For all other cases, just set the type of the Name
2669
2670                else
2671                   Set_Etype (Name (N), Expr_Type);
2672                end if;
2673
2674             end if;
2675
2676             <<Continue>>
2677
2678             --  Move to next interpretation
2679
2680             exit Interp_Loop when No (It.Typ);
2681
2682             Get_Next_Interp (I, It);
2683          end loop Interp_Loop;
2684       end if;
2685
2686       --  At this stage Found indicates whether or not an acceptable
2687       --  interpretation exists. If not, then we have an error, except that if
2688       --  the context is Any_Type as a result of some other error, then we
2689       --  suppress the error report.
2690
2691       if not Found then
2692          if Typ /= Any_Type then
2693
2694             --  If type we are looking for is Void, then this is the procedure
2695             --  call case, and the error is simply that what we gave is not a
2696             --  procedure name (we think of procedure calls as expressions with
2697             --  types internally, but the user doesn't think of them this way).
2698
2699             if Typ = Standard_Void_Type then
2700
2701                --  Special case message if function used as a procedure
2702
2703                if Nkind (N) = N_Procedure_Call_Statement
2704                  and then Is_Entity_Name (Name (N))
2705                  and then Ekind (Entity (Name (N))) = E_Function
2706                then
2707                   Error_Msg_NE
2708                     ("cannot use function & in a procedure call",
2709                      Name (N), Entity (Name (N)));
2710
2711                --  Otherwise give general message (not clear what cases this
2712                --  covers, but no harm in providing for them).
2713
2714                else
2715                   Error_Msg_N ("expect procedure name in procedure call", N);
2716                end if;
2717
2718                Found := True;
2719
2720             --  Otherwise we do have a subexpression with the wrong type
2721
2722             --  Check for the case of an allocator which uses an access type
2723             --  instead of the designated type. This is a common error and we
2724             --  specialize the message, posting an error on the operand of the
2725             --  allocator, complaining that we expected the designated type of
2726             --  the allocator.
2727
2728             elsif Nkind (N) = N_Allocator
2729               and then Is_Access_Type (Typ)
2730               and then Is_Access_Type (Etype (N))
2731               and then Designated_Type (Etype (N)) = Typ
2732             then
2733                Wrong_Type (Expression (N), Designated_Type (Typ));
2734                Found := True;
2735
2736             --  Check for view mismatch on Null in instances, for which the
2737             --  view-swapping mechanism has no identifier.
2738
2739             elsif (In_Instance or else In_Inlined_Body)
2740               and then (Nkind (N) = N_Null)
2741               and then Is_Private_Type (Typ)
2742               and then Is_Access_Type (Full_View (Typ))
2743             then
2744                Resolve (N, Full_View (Typ));
2745                Set_Etype (N, Typ);
2746                return;
2747
2748             --  Check for an aggregate. Sometimes we can get bogus aggregates
2749             --  from misuse of parentheses, and we are about to complain about
2750             --  the aggregate without even looking inside it.
2751
2752             --  Instead, if we have an aggregate of type Any_Composite, then
2753             --  analyze and resolve the component fields, and then only issue
2754             --  another message if we get no errors doing this (otherwise
2755             --  assume that the errors in the aggregate caused the problem).
2756
2757             elsif Nkind (N) = N_Aggregate
2758               and then Etype (N) = Any_Composite
2759             then
2760                --  Disable expansion in any case. If there is a type mismatch
2761                --  it may be fatal to try to expand the aggregate. The flag
2762                --  would otherwise be set to false when the error is posted.
2763
2764                Expander_Active := False;
2765
2766                declare
2767                   procedure Check_Aggr (Aggr : Node_Id);
2768                   --  Check one aggregate, and set Found to True if we have a
2769                   --  definite error in any of its elements
2770
2771                   procedure Check_Elmt (Aelmt : Node_Id);
2772                   --  Check one element of aggregate and set Found to True if
2773                   --  we definitely have an error in the element.
2774
2775                   ----------------
2776                   -- Check_Aggr --
2777                   ----------------
2778
2779                   procedure Check_Aggr (Aggr : Node_Id) is
2780                      Elmt : Node_Id;
2781
2782                   begin
2783                      if Present (Expressions (Aggr)) then
2784                         Elmt := First (Expressions (Aggr));
2785                         while Present (Elmt) loop
2786                            Check_Elmt (Elmt);
2787                            Next (Elmt);
2788                         end loop;
2789                      end if;
2790
2791                      if Present (Component_Associations (Aggr)) then
2792                         Elmt := First (Component_Associations (Aggr));
2793                         while Present (Elmt) loop
2794
2795                            --  If this is a default-initialized component, then
2796                            --  there is nothing to check. The box will be
2797                            --  replaced by the appropriate call during late
2798                            --  expansion.
2799
2800                            if not Box_Present (Elmt) then
2801                               Check_Elmt (Expression (Elmt));
2802                            end if;
2803
2804                            Next (Elmt);
2805                         end loop;
2806                      end if;
2807                   end Check_Aggr;
2808
2809                   ----------------
2810                   -- Check_Elmt --
2811                   ----------------
2812
2813                   procedure Check_Elmt (Aelmt : Node_Id) is
2814                   begin
2815                      --  If we have a nested aggregate, go inside it (to
2816                      --  attempt a naked analyze-resolve of the aggregate can
2817                      --  cause undesirable cascaded errors). Do not resolve
2818                      --  expression if it needs a type from context, as for
2819                      --  integer * fixed expression.
2820
2821                      if Nkind (Aelmt) = N_Aggregate then
2822                         Check_Aggr (Aelmt);
2823
2824                      else
2825                         Analyze (Aelmt);
2826
2827                         if not Is_Overloaded (Aelmt)
2828                           and then Etype (Aelmt) /= Any_Fixed
2829                         then
2830                            Resolve (Aelmt);
2831                         end if;
2832
2833                         if Etype (Aelmt) = Any_Type then
2834                            Found := True;
2835                         end if;
2836                      end if;
2837                   end Check_Elmt;
2838
2839                begin
2840                   Check_Aggr (N);
2841                end;
2842             end if;
2843
2844             --  Looks like we have a type error, but check for special case
2845             --  of Address wanted, integer found, with the configuration pragma
2846             --  Allow_Integer_Address active. If we have this case, introduce
2847             --  an unchecked conversion to allow the integer expression to be
2848             --  treated as an Address. The reverse case of integer wanted,
2849             --  Address found, is treated in an analogous manner.
2850
2851             if Address_Integer_Convert_OK (Typ, Etype (N)) then
2852                Rewrite (N, Unchecked_Convert_To (Typ, Relocate_Node (N)));
2853                Analyze_And_Resolve (N, Typ);
2854                return;
2855             end if;
2856
2857             --  That special Allow_Integer_Address check did not appply, so we
2858             --  have a real type error. If an error message was issued already,
2859             --  Found got reset to True, so if it's still False, issue standard
2860             --  Wrong_Type message.
2861
2862             if not Found then
2863                if Is_Overloaded (N) and then Nkind (N) = N_Function_Call then
2864                   declare
2865                      Subp_Name : Node_Id;
2866
2867                   begin
2868                      if Is_Entity_Name (Name (N)) then
2869                         Subp_Name := Name (N);
2870
2871                      elsif Nkind (Name (N)) = N_Selected_Component then
2872
2873                         --  Protected operation: retrieve operation name
2874
2875                         Subp_Name := Selector_Name (Name (N));
2876
2877                      else
2878                         raise Program_Error;
2879                      end if;
2880
2881                      Error_Msg_Node_2 := Typ;
2882                      Error_Msg_NE
2883                        ("no visible interpretation of& "
2884                         & "matches expected type&", N, Subp_Name);
2885                   end;
2886
2887                   if All_Errors_Mode then
2888                      declare
2889                         Index : Interp_Index;
2890                         It    : Interp;
2891
2892                      begin
2893                         Error_Msg_N ("\\possible interpretations:", N);
2894
2895                         Get_First_Interp (Name (N), Index, It);
2896                         while Present (It.Nam) loop
2897                            Error_Msg_Sloc := Sloc (It.Nam);
2898                            Error_Msg_Node_2 := It.Nam;
2899                            Error_Msg_NE
2900                              ("\\  type& for & declared#", N, It.Typ);
2901                            Get_Next_Interp (Index, It);
2902                         end loop;
2903                      end;
2904
2905                   else
2906                      Error_Msg_N ("\use -gnatf for details", N);
2907                   end if;
2908
2909                else
2910                   Wrong_Type (N, Typ);
2911                end if;
2912             end if;
2913          end if;
2914
2915          Resolution_Failed;
2916          return;
2917
2918       --  Test if we have more than one interpretation for the context
2919
2920       elsif Ambiguous then
2921          Resolution_Failed;
2922          return;
2923
2924       --  Only one intepretation
2925
2926       else
2927          --  In Ada 2005, if we have something like "X : T := 2 + 2;", where
2928          --  the "+" on T is abstract, and the operands are of universal type,
2929          --  the above code will have (incorrectly) resolved the "+" to the
2930          --  universal one in Standard. Therefore check for this case and give
2931          --  an error. We can't do this earlier, because it would cause legal
2932          --  cases to get errors (when some other type has an abstract "+").
2933
2934          if Ada_Version >= Ada_2005
2935            and then Nkind (N) in N_Op
2936            and then Is_Overloaded (N)
2937            and then Is_Universal_Numeric_Type (Etype (Entity (N)))
2938          then
2939             Get_First_Interp (N, I, It);
2940             while Present (It.Typ) loop
2941                if Present (It.Abstract_Op) and then
2942                  Etype (It.Abstract_Op) = Typ
2943                then
2944                   Error_Msg_NE
2945                     ("cannot call abstract subprogram &!", N, It.Abstract_Op);
2946                   return;
2947                end if;
2948
2949                Get_Next_Interp (I, It);
2950             end loop;
2951          end if;
2952
2953          --  Here we have an acceptable interpretation for the context
2954
2955          --  Propagate type information and normalize tree for various
2956          --  predefined operations. If the context only imposes a class of
2957          --  types, rather than a specific type, propagate the actual type
2958          --  downward.
2959
2960          if Typ = Any_Integer or else
2961             Typ = Any_Boolean or else
2962             Typ = Any_Modular or else
2963             Typ = Any_Real    or else
2964             Typ = Any_Discrete
2965          then
2966             Ctx_Type := Expr_Type;
2967
2968             --  Any_Fixed is legal in a real context only if a specific fixed-
2969             --  point type is imposed. If Norman Cohen can be confused by this,
2970             --  it deserves a separate message.
2971
2972             if Typ = Any_Real
2973               and then Expr_Type = Any_Fixed
2974             then
2975                Error_Msg_N ("illegal context for mixed mode operation", N);
2976                Set_Etype (N, Universal_Real);
2977                Ctx_Type := Universal_Real;
2978             end if;
2979          end if;
2980
2981          --  A user-defined operator is transformed into a function call at
2982          --  this point, so that further processing knows that operators are
2983          --  really operators (i.e. are predefined operators). User-defined
2984          --  operators that are intrinsic are just renamings of the predefined
2985          --  ones, and need not be turned into calls either, but if they rename
2986          --  a different operator, we must transform the node accordingly.
2987          --  Instantiations of Unchecked_Conversion are intrinsic but are
2988          --  treated as functions, even if given an operator designator.
2989
2990          if Nkind (N) in N_Op
2991            and then Present (Entity (N))
2992            and then Ekind (Entity (N)) /= E_Operator
2993          then
2994
2995             if not Is_Predefined_Op (Entity (N)) then
2996                Rewrite_Operator_As_Call (N, Entity (N));
2997
2998             elsif Present (Alias (Entity (N)))
2999               and then
3000                 Nkind (Parent (Parent (Entity (N)))) =
3001                                     N_Subprogram_Renaming_Declaration
3002             then
3003                Rewrite_Renamed_Operator (N, Alias (Entity (N)), Typ);
3004
3005                --  If the node is rewritten, it will be fully resolved in
3006                --  Rewrite_Renamed_Operator.
3007
3008                if Analyzed (N) then
3009                   return;
3010                end if;
3011             end if;
3012          end if;
3013
3014          case N_Subexpr'(Nkind (N)) is
3015
3016             when N_Aggregate => Resolve_Aggregate                (N, Ctx_Type);
3017
3018             when N_Allocator => Resolve_Allocator                (N, Ctx_Type);
3019
3020             when N_Short_Circuit
3021                              => Resolve_Short_Circuit            (N, Ctx_Type);
3022
3023             when N_Attribute_Reference
3024                              => Resolve_Attribute                (N, Ctx_Type);
3025
3026             when N_Case_Expression
3027                              => Resolve_Case_Expression          (N, Ctx_Type);
3028
3029             when N_Character_Literal
3030                              => Resolve_Character_Literal        (N, Ctx_Type);
3031
3032             when N_Expanded_Name
3033                              => Resolve_Entity_Name              (N, Ctx_Type);
3034
3035             when N_Explicit_Dereference
3036                              => Resolve_Explicit_Dereference     (N, Ctx_Type);
3037
3038             when N_Expression_With_Actions
3039                              => Resolve_Expression_With_Actions  (N, Ctx_Type);
3040
3041             when N_Extension_Aggregate
3042                              => Resolve_Extension_Aggregate      (N, Ctx_Type);
3043
3044             when N_Function_Call
3045                              => Resolve_Call                     (N, Ctx_Type);
3046
3047             when N_Identifier
3048                              => Resolve_Entity_Name              (N, Ctx_Type);
3049
3050             when N_If_Expression
3051                              => Resolve_If_Expression            (N, Ctx_Type);
3052
3053             when N_Indexed_Component
3054                              => Resolve_Indexed_Component        (N, Ctx_Type);
3055
3056             when N_Integer_Literal
3057                              => Resolve_Integer_Literal          (N, Ctx_Type);
3058
3059             when N_Membership_Test
3060                              => Resolve_Membership_Op            (N, Ctx_Type);
3061
3062             when N_Null      => Resolve_Null                     (N, Ctx_Type);
3063
3064             when N_Op_And | N_Op_Or | N_Op_Xor
3065                              => Resolve_Logical_Op               (N, Ctx_Type);
3066
3067             when N_Op_Eq | N_Op_Ne
3068                              => Resolve_Equality_Op              (N, Ctx_Type);
3069
3070             when N_Op_Lt | N_Op_Le | N_Op_Gt | N_Op_Ge
3071                              => Resolve_Comparison_Op            (N, Ctx_Type);
3072
3073             when N_Op_Not    => Resolve_Op_Not                   (N, Ctx_Type);
3074
3075             when N_Op_Add    | N_Op_Subtract | N_Op_Multiply |
3076                  N_Op_Divide | N_Op_Mod      | N_Op_Rem
3077
3078                              => Resolve_Arithmetic_Op            (N, Ctx_Type);
3079
3080             when N_Op_Concat => Resolve_Op_Concat                (N, Ctx_Type);
3081
3082             when N_Op_Expon  => Resolve_Op_Expon                 (N, Ctx_Type);
3083
3084             when N_Op_Plus | N_Op_Minus  | N_Op_Abs
3085                              => Resolve_Unary_Op                 (N, Ctx_Type);
3086
3087             when N_Op_Shift  => Resolve_Shift                    (N, Ctx_Type);
3088
3089             when N_Procedure_Call_Statement
3090                              => Resolve_Call                     (N, Ctx_Type);
3091
3092             when N_Operator_Symbol
3093                              => Resolve_Operator_Symbol          (N, Ctx_Type);
3094
3095             when N_Qualified_Expression
3096                              => Resolve_Qualified_Expression     (N, Ctx_Type);
3097
3098             --  Why is the following null, needs a comment ???
3099
3100             when N_Quantified_Expression
3101                              => null;
3102
3103             when N_Raise_Expression
3104                              => Resolve_Raise_Expression         (N, Ctx_Type);
3105
3106             when N_Raise_xxx_Error
3107                              => Set_Etype (N, Ctx_Type);
3108
3109             when N_Range     => Resolve_Range                    (N, Ctx_Type);
3110
3111             when N_Real_Literal
3112                              => Resolve_Real_Literal             (N, Ctx_Type);
3113
3114             when N_Reference => Resolve_Reference                (N, Ctx_Type);
3115
3116             when N_Selected_Component
3117                              => Resolve_Selected_Component       (N, Ctx_Type);
3118
3119             when N_Slice     => Resolve_Slice                    (N, Ctx_Type);
3120
3121             when N_String_Literal
3122                              => Resolve_String_Literal           (N, Ctx_Type);
3123
3124             when N_Type_Conversion
3125                              => Resolve_Type_Conversion          (N, Ctx_Type);
3126
3127             when N_Unchecked_Expression =>
3128                Resolve_Unchecked_Expression                      (N, Ctx_Type);
3129
3130             when N_Unchecked_Type_Conversion =>
3131                Resolve_Unchecked_Type_Conversion                 (N, Ctx_Type);
3132          end case;
3133
3134          --  Ada 2012 (AI05-0149): Apply an (implicit) conversion to an
3135          --  expression of an anonymous access type that occurs in the context
3136          --  of a named general access type, except when the expression is that
3137          --  of a membership test. This ensures proper legality checking in
3138          --  terms of allowed conversions (expressions that would be illegal to
3139          --  convert implicitly are allowed in membership tests).
3140
3141          if Ada_Version >= Ada_2012
3142            and then Ekind (Ctx_Type) = E_General_Access_Type
3143            and then Ekind (Etype (N)) = E_Anonymous_Access_Type
3144            and then Nkind (Parent (N)) not in N_Membership_Test
3145          then
3146             Rewrite (N, Convert_To (Ctx_Type, Relocate_Node (N)));
3147             Analyze_And_Resolve (N, Ctx_Type);
3148          end if;
3149
3150          --  If the subexpression was replaced by a non-subexpression, then
3151          --  all we do is to expand it. The only legitimate case we know of
3152          --  is converting procedure call statement to entry call statements,
3153          --  but there may be others, so we are making this test general.
3154
3155          if Nkind (N) not in N_Subexpr then
3156             Debug_A_Exit ("resolving  ", N, "  (done)");
3157             Expand (N);
3158             return;
3159          end if;
3160
3161          --  The expression is definitely NOT overloaded at this point, so
3162          --  we reset the Is_Overloaded flag to avoid any confusion when
3163          --  reanalyzing the node.
3164
3165          Set_Is_Overloaded (N, False);
3166
3167          --  Freeze expression type, entity if it is a name, and designated
3168          --  type if it is an allocator (RM 13.14(10,11,13)).
3169
3170          --  Now that the resolution of the type of the node is complete, and
3171          --  we did not detect an error, we can expand this node. We skip the
3172          --  expand call if we are in a default expression, see section
3173          --  "Handling of Default Expressions" in Sem spec.
3174
3175          Debug_A_Exit ("resolving  ", N, "  (done)");
3176
3177          --  We unconditionally freeze the expression, even if we are in
3178          --  default expression mode (the Freeze_Expression routine tests this
3179          --  flag and only freezes static types if it is set).
3180
3181          --  Ada 2012 (AI05-177): The declaration of an expression function
3182          --  does not cause freezing, but we never reach here in that case.
3183          --  Here we are resolving the corresponding expanded body, so we do
3184          --  need to perform normal freezing.
3185
3186          Freeze_Expression (N);
3187
3188          --  Now we can do the expansion
3189
3190          Expand (N);
3191       end if;
3192    end Resolve;
3193
3194    -------------
3195    -- Resolve --
3196    -------------
3197
3198    --  Version with check(s) suppressed
3199
3200    procedure Resolve (N : Node_Id; Typ : Entity_Id; Suppress : Check_Id) is
3201    begin
3202       if Suppress = All_Checks then
3203          declare
3204             Sva : constant Suppress_Array := Scope_Suppress.Suppress;
3205          begin
3206             Scope_Suppress.Suppress := (others => True);
3207             Resolve (N, Typ);
3208             Scope_Suppress.Suppress := Sva;
3209          end;
3210
3211       else
3212          declare
3213             Svg : constant Boolean := Scope_Suppress.Suppress (Suppress);
3214          begin
3215             Scope_Suppress.Suppress (Suppress) := True;
3216             Resolve (N, Typ);
3217             Scope_Suppress.Suppress (Suppress) := Svg;
3218          end;
3219       end if;
3220    end Resolve;
3221
3222    -------------
3223    -- Resolve --
3224    -------------
3225
3226    --  Version with implicit type
3227
3228    procedure Resolve (N : Node_Id) is
3229    begin
3230       Resolve (N, Etype (N));
3231    end Resolve;
3232
3233    ---------------------
3234    -- Resolve_Actuals --
3235    ---------------------
3236
3237    procedure Resolve_Actuals (N : Node_Id; Nam : Entity_Id) is
3238       Loc    : constant Source_Ptr := Sloc (N);
3239       A      : Node_Id;
3240       A_Id   : Entity_Id;
3241       A_Typ  : Entity_Id;
3242       F      : Entity_Id;
3243       F_Typ  : Entity_Id;
3244       Prev   : Node_Id := Empty;
3245       Orig_A : Node_Id;
3246
3247       procedure Check_Aliased_Parameter;
3248       --  Check rules on aliased parameters and related accessibility rules
3249       --  in (RM 3.10.2 (10.2-10.4)).
3250
3251       procedure Check_Argument_Order;
3252       --  Performs a check for the case where the actuals are all simple
3253       --  identifiers that correspond to the formal names, but in the wrong
3254       --  order, which is considered suspicious and cause for a warning.
3255
3256       procedure Check_Prefixed_Call;
3257       --  If the original node is an overloaded call in prefix notation,
3258       --  insert an 'Access or a dereference as needed over the first actual.
3259       --  Try_Object_Operation has already verified that there is a valid
3260       --  interpretation, but the form of the actual can only be determined
3261       --  once the primitive operation is identified.
3262
3263       procedure Insert_Default;
3264       --  If the actual is missing in a call, insert in the actuals list
3265       --  an instance of the default expression. The insertion is always
3266       --  a named association.
3267
3268       procedure Property_Error
3269         (Var      : Node_Id;
3270          Var_Id   : Entity_Id;
3271          Prop_Nam : Name_Id);
3272       --  Emit an error concerning variable Var with entity Var_Id that has
3273       --  enabled property Prop_Nam when it acts as an actual parameter in a
3274       --  call and the corresponding formal parameter is of mode IN.
3275
3276       function Same_Ancestor (T1, T2 : Entity_Id) return Boolean;
3277       --  Check whether T1 and T2, or their full views, are derived from a
3278       --  common type. Used to enforce the restrictions on array conversions
3279       --  of AI95-00246.
3280
3281       function Static_Concatenation (N : Node_Id) return Boolean;
3282       --  Predicate to determine whether an actual that is a concatenation
3283       --  will be evaluated statically and does not need a transient scope.
3284       --  This must be determined before the actual is resolved and expanded
3285       --  because if needed the transient scope must be introduced earlier.
3286
3287       ------------------------------
3288       --  Check_Aliased_Parameter --
3289       ------------------------------
3290
3291       procedure Check_Aliased_Parameter is
3292          Nominal_Subt : Entity_Id;
3293
3294       begin
3295          if Is_Aliased (F) then
3296             if Is_Tagged_Type (A_Typ) then
3297                null;
3298
3299             elsif Is_Aliased_View (A) then
3300                if Is_Constr_Subt_For_U_Nominal (A_Typ) then
3301                   Nominal_Subt := Base_Type (A_Typ);
3302                else
3303                   Nominal_Subt := A_Typ;
3304                end if;
3305
3306                if Subtypes_Statically_Match (F_Typ, Nominal_Subt) then
3307                   null;
3308
3309                --  In a generic body assume the worst for generic formals:
3310                --  they can have a constrained partial view (AI05-041).
3311
3312                elsif Has_Discriminants (F_Typ)
3313                  and then not Is_Constrained (F_Typ)
3314                  and then not Has_Constrained_Partial_View (F_Typ)
3315                  and then not Is_Generic_Type (F_Typ)
3316                then
3317                   null;
3318
3319                else
3320                   Error_Msg_NE ("untagged actual does not match "
3321                                 & "aliased formal&", A, F);
3322                end if;
3323
3324             else
3325                Error_Msg_NE ("actual for aliased formal& must be "
3326                              & "aliased object", A, F);
3327             end if;
3328
3329             if Ekind (Nam) = E_Procedure then
3330                null;
3331
3332             elsif Ekind (Etype (Nam)) = E_Anonymous_Access_Type then
3333                if Nkind (Parent (N)) = N_Type_Conversion
3334                  and then Type_Access_Level (Etype (Parent (N))) <
3335                                                         Object_Access_Level (A)
3336                then
3337                   Error_Msg_N ("aliased actual has wrong accessibility", A);
3338                end if;
3339
3340             elsif Nkind (Parent (N)) = N_Qualified_Expression
3341               and then Nkind (Parent (Parent (N))) = N_Allocator
3342               and then Type_Access_Level (Etype (Parent (Parent (N)))) <
3343                                                         Object_Access_Level (A)
3344             then
3345                Error_Msg_N
3346                  ("aliased actual in allocator has wrong accessibility", A);
3347             end if;
3348          end if;
3349       end Check_Aliased_Parameter;
3350
3351       --------------------------
3352       -- Check_Argument_Order --
3353       --------------------------
3354
3355       procedure Check_Argument_Order is
3356       begin
3357          --  Nothing to do if no parameters, or original node is neither a
3358          --  function call nor a procedure call statement (happens in the
3359          --  operator-transformed-to-function call case), or the call does
3360          --  not come from source, or this warning is off.
3361
3362          if not Warn_On_Parameter_Order
3363            or else No (Parameter_Associations (N))
3364            or else Nkind (Original_Node (N)) not in N_Subprogram_Call
3365            or else not Comes_From_Source (N)
3366          then
3367             return;
3368          end if;
3369
3370          declare
3371             Nargs : constant Nat := List_Length (Parameter_Associations (N));
3372
3373          begin
3374             --  Nothing to do if only one parameter
3375
3376             if Nargs < 2 then
3377                return;
3378             end if;
3379
3380             --  Here if at least two arguments
3381
3382             declare
3383                Actuals : array (1 .. Nargs) of Node_Id;
3384                Actual  : Node_Id;
3385                Formal  : Node_Id;
3386
3387                Wrong_Order : Boolean := False;
3388                --  Set True if an out of order case is found
3389
3390             begin
3391                --  Collect identifier names of actuals, fail if any actual is
3392                --  not a simple identifier, and record max length of name.
3393
3394                Actual := First (Parameter_Associations (N));
3395                for J in Actuals'Range loop
3396                   if Nkind (Actual) /= N_Identifier then
3397                      return;
3398                   else
3399                      Actuals (J) := Actual;
3400                      Next (Actual);
3401                   end if;
3402                end loop;
3403
3404                --  If we got this far, all actuals are identifiers and the list
3405                --  of their names is stored in the Actuals array.
3406
3407                Formal := First_Formal (Nam);
3408                for J in Actuals'Range loop
3409
3410                   --  If we ran out of formals, that's odd, probably an error
3411                   --  which will be detected elsewhere, but abandon the search.
3412
3413                   if No (Formal) then
3414                      return;
3415                   end if;
3416
3417                   --  If name matches and is in order OK
3418
3419                   if Chars (Formal) = Chars (Actuals (J)) then
3420                      null;
3421
3422                   else
3423                      --  If no match, see if it is elsewhere in list and if so
3424                      --  flag potential wrong order if type is compatible.
3425
3426                      for K in Actuals'Range loop
3427                         if Chars (Formal) = Chars (Actuals (K))
3428                           and then
3429                             Has_Compatible_Type (Actuals (K), Etype (Formal))
3430                         then
3431                            Wrong_Order := True;
3432                            goto Continue;
3433                         end if;
3434                      end loop;
3435
3436                      --  No match
3437
3438                      return;
3439                   end if;
3440
3441                   <<Continue>> Next_Formal (Formal);
3442                end loop;
3443
3444                --  If Formals left over, also probably an error, skip warning
3445
3446                if Present (Formal) then
3447                   return;
3448                end if;
3449
3450                --  Here we give the warning if something was out of order
3451
3452                if Wrong_Order then
3453                   Error_Msg_N
3454                     ("?P?actuals for this call may be in wrong order", N);
3455                end if;
3456             end;
3457          end;
3458       end Check_Argument_Order;
3459
3460       -------------------------
3461       -- Check_Prefixed_Call --
3462       -------------------------
3463
3464       procedure Check_Prefixed_Call is
3465          Act    : constant Node_Id   := First_Actual (N);
3466          A_Type : constant Entity_Id := Etype (Act);
3467          F_Type : constant Entity_Id := Etype (First_Formal (Nam));
3468          Orig   : constant Node_Id := Original_Node (N);
3469          New_A  : Node_Id;
3470
3471       begin
3472          --  Check whether the call is a prefixed call, with or without
3473          --  additional actuals.
3474
3475          if Nkind (Orig) = N_Selected_Component
3476            or else
3477              (Nkind (Orig) = N_Indexed_Component
3478                and then Nkind (Prefix (Orig)) = N_Selected_Component
3479                and then Is_Entity_Name (Prefix (Prefix (Orig)))
3480                and then Is_Entity_Name (Act)
3481                and then Chars (Act) = Chars (Prefix (Prefix (Orig))))
3482          then
3483             if Is_Access_Type (A_Type)
3484               and then not Is_Access_Type (F_Type)
3485             then
3486                --  Introduce dereference on object in prefix
3487
3488                New_A :=
3489                  Make_Explicit_Dereference (Sloc (Act),
3490                    Prefix => Relocate_Node (Act));
3491                Rewrite (Act, New_A);
3492                Analyze (Act);
3493
3494             elsif Is_Access_Type (F_Type)
3495               and then not Is_Access_Type (A_Type)
3496             then
3497                --  Introduce an implicit 'Access in prefix
3498
3499                if not Is_Aliased_View (Act) then
3500                   Error_Msg_NE
3501                     ("object in prefixed call to& must be aliased "
3502                      & "(RM 4.1.3 (13 1/2))",
3503                     Prefix (Act), Nam);
3504                end if;
3505
3506                Rewrite (Act,
3507                  Make_Attribute_Reference (Loc,
3508                    Attribute_Name => Name_Access,
3509                    Prefix         => Relocate_Node (Act)));
3510             end if;
3511
3512             Analyze (Act);
3513          end if;
3514       end Check_Prefixed_Call;
3515
3516       --------------------
3517       -- Insert_Default --
3518       --------------------
3519
3520       procedure Insert_Default is
3521          Actval : Node_Id;
3522          Assoc  : Node_Id;
3523
3524       begin
3525          --  Missing argument in call, nothing to insert
3526
3527          if No (Default_Value (F)) then
3528             return;
3529
3530          else
3531             --  Note that we do a full New_Copy_Tree, so that any associated
3532             --  Itypes are properly copied. This may not be needed any more,
3533             --  but it does no harm as a safety measure. Defaults of a generic
3534             --  formal may be out of bounds of the corresponding actual (see
3535             --  cc1311b) and an additional check may be required.
3536
3537             Actval :=
3538               New_Copy_Tree
3539                 (Default_Value (F),
3540                  New_Scope => Current_Scope,
3541                  New_Sloc  => Loc);
3542
3543             if Is_Concurrent_Type (Scope (Nam))
3544               and then Has_Discriminants (Scope (Nam))
3545             then
3546                Replace_Actual_Discriminants (N, Actval);
3547             end if;
3548
3549             if Is_Overloadable (Nam)
3550               and then Present (Alias (Nam))
3551             then
3552                if Base_Type (Etype (F)) /= Base_Type (Etype (Actval))
3553                  and then not Is_Tagged_Type (Etype (F))
3554                then
3555                   --  If default is a real literal, do not introduce a
3556                   --  conversion whose effect may depend on the run-time
3557                   --  size of universal real.
3558
3559                   if Nkind (Actval) = N_Real_Literal then
3560                      Set_Etype (Actval, Base_Type (Etype (F)));
3561                   else
3562                      Actval := Unchecked_Convert_To (Etype (F), Actval);
3563                   end if;
3564                end if;
3565
3566                if Is_Scalar_Type (Etype (F)) then
3567                   Enable_Range_Check (Actval);
3568                end if;
3569
3570                Set_Parent (Actval, N);
3571
3572                --  Resolve aggregates with their base type, to avoid scope
3573                --  anomalies: the subtype was first built in the subprogram
3574                --  declaration, and the current call may be nested.
3575
3576                if Nkind (Actval) = N_Aggregate then
3577                   Analyze_And_Resolve (Actval, Etype (F));
3578                else
3579                   Analyze_And_Resolve (Actval, Etype (Actval));
3580                end if;
3581
3582             else
3583                Set_Parent (Actval, N);
3584
3585                --  See note above concerning aggregates
3586
3587                if Nkind (Actval) = N_Aggregate
3588                  and then Has_Discriminants (Etype (Actval))
3589                then
3590                   Analyze_And_Resolve (Actval, Base_Type (Etype (Actval)));
3591
3592                --  Resolve entities with their own type, which may differ from
3593                --  the type of a reference in a generic context (the view
3594                --  swapping mechanism did not anticipate the re-analysis of
3595                --  default values in calls).
3596
3597                elsif Is_Entity_Name (Actval) then
3598                   Analyze_And_Resolve (Actval, Etype (Entity (Actval)));
3599
3600                else
3601                   Analyze_And_Resolve (Actval, Etype (Actval));
3602                end if;
3603             end if;
3604
3605             --  If default is a tag indeterminate function call, propagate tag
3606             --  to obtain proper dispatching.
3607
3608             if Is_Controlling_Formal (F)
3609               and then Nkind (Default_Value (F)) = N_Function_Call
3610             then
3611                Set_Is_Controlling_Actual (Actval);
3612             end if;
3613
3614          end if;
3615
3616          --  If the default expression raises constraint error, then just
3617          --  silently replace it with an N_Raise_Constraint_Error node, since
3618          --  we already gave the warning on the subprogram spec. If node is
3619          --  already a Raise_Constraint_Error leave as is, to prevent loops in
3620          --  the warnings removal machinery.
3621
3622          if Raises_Constraint_Error (Actval)
3623            and then Nkind (Actval) /= N_Raise_Constraint_Error
3624          then
3625             Rewrite (Actval,
3626               Make_Raise_Constraint_Error (Loc,
3627                 Reason => CE_Range_Check_Failed));
3628             Set_Raises_Constraint_Error (Actval);
3629             Set_Etype (Actval, Etype (F));
3630          end if;
3631
3632          Assoc :=
3633            Make_Parameter_Association (Loc,
3634              Explicit_Actual_Parameter => Actval,
3635              Selector_Name => Make_Identifier (Loc, Chars (F)));
3636
3637          --  Case of insertion is first named actual
3638
3639          if No (Prev) or else
3640             Nkind (Parent (Prev)) /= N_Parameter_Association
3641          then
3642             Set_Next_Named_Actual (Assoc, First_Named_Actual (N));
3643             Set_First_Named_Actual (N, Actval);
3644
3645             if No (Prev) then
3646                if No (Parameter_Associations (N)) then
3647                   Set_Parameter_Associations (N, New_List (Assoc));
3648                else
3649                   Append (Assoc, Parameter_Associations (N));
3650                end if;
3651
3652             else
3653                Insert_After (Prev, Assoc);
3654             end if;
3655
3656          --  Case of insertion is not first named actual
3657
3658          else
3659             Set_Next_Named_Actual
3660               (Assoc, Next_Named_Actual (Parent (Prev)));
3661             Set_Next_Named_Actual (Parent (Prev), Actval);
3662             Append (Assoc, Parameter_Associations (N));
3663          end if;
3664
3665          Mark_Rewrite_Insertion (Assoc);
3666          Mark_Rewrite_Insertion (Actval);
3667
3668          Prev := Actval;
3669       end Insert_Default;
3670
3671       --------------------
3672       -- Property_Error --
3673       --------------------
3674
3675       procedure Property_Error
3676         (Var      : Node_Id;
3677          Var_Id   : Entity_Id;
3678          Prop_Nam : Name_Id)
3679       is
3680       begin
3681          Error_Msg_Name_1 := Prop_Nam;
3682          Error_Msg_NE
3683            ("external variable & with enabled property % cannot appear as "
3684             & "actual in procedure call (SPARK RM 7.1.3(11))", Var, Var_Id);
3685          Error_Msg_N ("\\corresponding formal parameter has mode In", Var);
3686       end Property_Error;
3687
3688       -------------------
3689       -- Same_Ancestor --
3690       -------------------
3691
3692       function Same_Ancestor (T1, T2 : Entity_Id) return Boolean is
3693          FT1 : Entity_Id := T1;
3694          FT2 : Entity_Id := T2;
3695
3696       begin
3697          if Is_Private_Type (T1)
3698            and then Present (Full_View (T1))
3699          then
3700             FT1 := Full_View (T1);
3701          end if;
3702
3703          if Is_Private_Type (T2)
3704            and then Present (Full_View (T2))
3705          then
3706             FT2 := Full_View (T2);
3707          end if;
3708
3709          return Root_Type (Base_Type (FT1)) = Root_Type (Base_Type (FT2));
3710       end Same_Ancestor;
3711
3712       --------------------------
3713       -- Static_Concatenation --
3714       --------------------------
3715
3716       function Static_Concatenation (N : Node_Id) return Boolean is
3717       begin
3718          case Nkind (N) is
3719             when N_String_Literal =>
3720                return True;
3721
3722             when N_Op_Concat =>
3723
3724                --  Concatenation is static when both operands are static and
3725                --  the concatenation operator is a predefined one.
3726
3727                return Scope (Entity (N)) = Standard_Standard
3728                         and then
3729                       Static_Concatenation (Left_Opnd (N))
3730                         and then
3731                       Static_Concatenation (Right_Opnd (N));
3732
3733             when others =>
3734                if Is_Entity_Name (N) then
3735                   declare
3736                      Ent : constant Entity_Id := Entity (N);
3737                   begin
3738                      return Ekind (Ent) = E_Constant
3739                               and then Present (Constant_Value (Ent))
3740                               and then
3741                                 Is_OK_Static_Expression (Constant_Value (Ent));
3742                   end;
3743
3744                else
3745                   return False;
3746                end if;
3747          end case;
3748       end Static_Concatenation;
3749
3750    --  Start of processing for Resolve_Actuals
3751
3752    begin
3753       Check_Argument_Order;
3754       Check_Function_Writable_Actuals (N);
3755
3756       if Present (First_Actual (N)) then
3757          Check_Prefixed_Call;
3758       end if;
3759
3760       A := First_Actual (N);
3761       F := First_Formal (Nam);
3762       while Present (F) loop
3763          if No (A) and then Needs_No_Actuals (Nam) then
3764             null;
3765
3766          --  If we have an error in any actual or formal, indicated by a type
3767          --  of Any_Type, then abandon resolution attempt, and set result type
3768          --  to Any_Type. Skip this if the actual is a Raise_Expression, whose
3769          --  type is imposed from context.
3770
3771          elsif (Present (A) and then Etype (A) = Any_Type)
3772            or else Etype (F) = Any_Type
3773          then
3774             if Nkind (A) /= N_Raise_Expression then
3775                Set_Etype (N, Any_Type);
3776                return;
3777             end if;
3778          end if;
3779
3780          --  Case where actual is present
3781
3782          --  If the actual is an entity, generate a reference to it now. We
3783          --  do this before the actual is resolved, because a formal of some
3784          --  protected subprogram, or a task discriminant, will be rewritten
3785          --  during expansion, and the source entity reference may be lost.
3786
3787          if Present (A)
3788            and then Is_Entity_Name (A)
3789            and then Comes_From_Source (N)
3790          then
3791             Orig_A := Entity (A);
3792
3793             if Present (Orig_A) then
3794                if Is_Formal (Orig_A)
3795                  and then Ekind (F) /= E_In_Parameter
3796                then
3797                   Generate_Reference (Orig_A, A, 'm');
3798
3799                elsif not Is_Overloaded (A) then
3800                   if Ekind (F) /= E_Out_Parameter then
3801                      Generate_Reference (Orig_A, A);
3802
3803                   --  RM 6.4.1(12): For an out parameter that is passed by
3804                   --  copy, the formal parameter object is created, and:
3805
3806                   --  * For an access type, the formal parameter is initialized
3807                   --    from the value of the actual, without checking that the
3808                   --    value satisfies any constraint, any predicate, or any
3809                   --    exclusion of the null value.
3810
3811                   --  * For a scalar type that has the Default_Value aspect
3812                   --    specified, the formal parameter is initialized from the
3813                   --    value of the actual, without checking that the value
3814                   --    satisfies any constraint or any predicate.
3815                   --  I do not understand why this case is included??? this is
3816                   --  not a case where an OUT parameter is treated as IN OUT.
3817
3818                   --  * For a composite type with discriminants or that has
3819                   --    implicit initial values for any subcomponents, the
3820                   --    behavior is as for an in out parameter passed by copy.
3821
3822                   --  Hence for these cases we generate the read reference now
3823                   --  (the write reference will be generated later by
3824                   --   Note_Possible_Modification).
3825
3826                   elsif Is_By_Copy_Type (Etype (F))
3827                     and then
3828                       (Is_Access_Type (Etype (F))
3829                          or else
3830                            (Is_Scalar_Type (Etype (F))
3831                               and then
3832                                 Present (Default_Aspect_Value (Etype (F))))
3833                          or else
3834                            (Is_Composite_Type (Etype (F))
3835                               and then (Has_Discriminants (Etype (F))
3836                                          or else Is_Partially_Initialized_Type
3837                                                    (Etype (F)))))
3838                   then
3839                      Generate_Reference (Orig_A, A);
3840                   end if;
3841                end if;
3842             end if;
3843          end if;
3844
3845          if Present (A)
3846            and then (Nkind (Parent (A)) /= N_Parameter_Association
3847                       or else Chars (Selector_Name (Parent (A))) = Chars (F))
3848          then
3849             --  If style checking mode on, check match of formal name
3850
3851             if Style_Check then
3852                if Nkind (Parent (A)) = N_Parameter_Association then
3853                   Check_Identifier (Selector_Name (Parent (A)), F);
3854                end if;
3855             end if;
3856
3857             --  If the formal is Out or In_Out, do not resolve and expand the
3858             --  conversion, because it is subsequently expanded into explicit
3859             --  temporaries and assignments. However, the object of the
3860             --  conversion can be resolved. An exception is the case of tagged
3861             --  type conversion with a class-wide actual. In that case we want
3862             --  the tag check to occur and no temporary will be needed (no
3863             --  representation change can occur) and the parameter is passed by
3864             --  reference, so we go ahead and resolve the type conversion.
3865             --  Another exception is the case of reference to component or
3866             --  subcomponent of a bit-packed array, in which case we want to
3867             --  defer expansion to the point the in and out assignments are
3868             --  performed.
3869
3870             if Ekind (F) /= E_In_Parameter
3871               and then Nkind (A) = N_Type_Conversion
3872               and then not Is_Class_Wide_Type (Etype (Expression (A)))
3873             then
3874                if Ekind (F) = E_In_Out_Parameter
3875                  and then Is_Array_Type (Etype (F))
3876                then
3877                   --  In a view conversion, the conversion must be legal in
3878                   --  both directions, and thus both component types must be
3879                   --  aliased, or neither (4.6 (8)).
3880
3881                   --  The extra rule in 4.6 (24.9.2) seems unduly restrictive:
3882                   --  the privacy requirement should not apply to generic
3883                   --  types, and should be checked in an instance. ARG query
3884                   --  is in order ???
3885
3886                   if Has_Aliased_Components (Etype (Expression (A))) /=
3887                      Has_Aliased_Components (Etype (F))
3888                   then
3889                      Error_Msg_N
3890                        ("both component types in a view conversion must be"
3891                          & " aliased, or neither", A);
3892
3893                   --  Comment here??? what set of cases???
3894
3895                   elsif
3896                      not Same_Ancestor (Etype (F), Etype (Expression (A)))
3897                   then
3898                      --  Check view conv between unrelated by ref array types
3899
3900                      if Is_By_Reference_Type (Etype (F))
3901                         or else Is_By_Reference_Type (Etype (Expression (A)))
3902                      then
3903                         Error_Msg_N
3904                           ("view conversion between unrelated by reference "
3905                            & "array types not allowed (\'A'I-00246)", A);
3906
3907                      --  In Ada 2005 mode, check view conversion component
3908                      --  type cannot be private, tagged, or volatile. Note
3909                      --  that we only apply this to source conversions. The
3910                      --  generated code can contain conversions which are
3911                      --  not subject to this test, and we cannot extract the
3912                      --  component type in such cases since it is not present.
3913
3914                      elsif Comes_From_Source (A)
3915                        and then Ada_Version >= Ada_2005
3916                      then
3917                         declare
3918                            Comp_Type : constant Entity_Id :=
3919                                          Component_Type
3920                                            (Etype (Expression (A)));
3921                         begin
3922                            if (Is_Private_Type (Comp_Type)
3923                                  and then not Is_Generic_Type (Comp_Type))
3924                              or else Is_Tagged_Type (Comp_Type)
3925                              or else Is_Volatile (Comp_Type)
3926                            then
3927                               Error_Msg_N
3928                                 ("component type of a view conversion cannot"
3929                                    & " be private, tagged, or volatile"
3930                                    & " (RM 4.6 (24))",
3931                                    Expression (A));
3932                            end if;
3933                         end;
3934                      end if;
3935                   end if;
3936                end if;
3937
3938                --  Resolve expression if conversion is all OK
3939
3940                if (Conversion_OK (A)
3941                     or else Valid_Conversion (A, Etype (A), Expression (A)))
3942                  and then not Is_Ref_To_Bit_Packed_Array (Expression (A))
3943                then
3944                   Resolve (Expression (A));
3945                end if;
3946
3947             --  If the actual is a function call that returns a limited
3948             --  unconstrained object that needs finalization, create a
3949             --  transient scope for it, so that it can receive the proper
3950             --  finalization list.
3951
3952             elsif Nkind (A) = N_Function_Call
3953               and then Is_Limited_Record (Etype (F))
3954               and then not Is_Constrained (Etype (F))
3955               and then Expander_Active
3956               and then (Is_Controlled (Etype (F)) or else Has_Task (Etype (F)))
3957             then
3958                Establish_Transient_Scope (A, Sec_Stack => False);
3959                Resolve (A, Etype (F));
3960
3961             --  A small optimization: if one of the actuals is a concatenation
3962             --  create a block around a procedure call to recover stack space.
3963             --  This alleviates stack usage when several procedure calls in
3964             --  the same statement list use concatenation. We do not perform
3965             --  this wrapping for code statements, where the argument is a
3966             --  static string, and we want to preserve warnings involving
3967             --  sequences of such statements.
3968
3969             elsif Nkind (A) = N_Op_Concat
3970               and then Nkind (N) = N_Procedure_Call_Statement
3971               and then Expander_Active
3972               and then
3973                 not (Is_Intrinsic_Subprogram (Nam)
3974                       and then Chars (Nam) = Name_Asm)
3975               and then not Static_Concatenation (A)
3976             then
3977                Establish_Transient_Scope (A, Sec_Stack => False);
3978                Resolve (A, Etype (F));
3979
3980             else
3981                if Nkind (A) = N_Type_Conversion
3982                  and then Is_Array_Type (Etype (F))
3983                  and then not Same_Ancestor (Etype (F), Etype (Expression (A)))
3984                  and then
3985                   (Is_Limited_Type (Etype (F))
3986                     or else Is_Limited_Type (Etype (Expression (A))))
3987                then
3988                   Error_Msg_N
3989                     ("conversion between unrelated limited array types "
3990                      & "not allowed ('A'I-00246)", A);
3991
3992                   if Is_Limited_Type (Etype (F)) then
3993                      Explain_Limited_Type (Etype (F), A);
3994                   end if;
3995
3996                   if Is_Limited_Type (Etype (Expression (A))) then
3997                      Explain_Limited_Type (Etype (Expression (A)), A);
3998                   end if;
3999                end if;
4000
4001                --  (Ada 2005: AI-251): If the actual is an allocator whose
4002                --  directly designated type is a class-wide interface, we build
4003                --  an anonymous access type to use it as the type of the
4004                --  allocator. Later, when the subprogram call is expanded, if
4005                --  the interface has a secondary dispatch table the expander
4006                --  will add a type conversion to force the correct displacement
4007                --  of the pointer.
4008
4009                if Nkind (A) = N_Allocator then
4010                   declare
4011                      DDT : constant Entity_Id :=
4012                              Directly_Designated_Type (Base_Type (Etype (F)));
4013
4014                      New_Itype : Entity_Id;
4015
4016                   begin
4017                      if Is_Class_Wide_Type (DDT)
4018                        and then Is_Interface (DDT)
4019                      then
4020                         New_Itype := Create_Itype (E_Anonymous_Access_Type, A);
4021                         Set_Etype (New_Itype, Etype (A));
4022                         Set_Directly_Designated_Type
4023                           (New_Itype, Directly_Designated_Type (Etype (A)));
4024                         Set_Etype (A, New_Itype);
4025                      end if;
4026
4027                      --  Ada 2005, AI-162:If the actual is an allocator, the
4028                      --  innermost enclosing statement is the master of the
4029                      --  created object. This needs to be done with expansion
4030                      --  enabled only, otherwise the transient scope will not
4031                      --  be removed in the expansion of the wrapped construct.
4032
4033                      if (Is_Controlled (DDT) or else Has_Task (DDT))
4034                        and then Expander_Active
4035                      then
4036                         Establish_Transient_Scope (A, Sec_Stack => False);
4037                      end if;
4038                   end;
4039
4040                   if Ekind (Etype (F)) = E_Anonymous_Access_Type then
4041                      Check_Restriction (No_Access_Parameter_Allocators, A);
4042                   end if;
4043                end if;
4044
4045                --  (Ada 2005): The call may be to a primitive operation of a
4046                --  tagged synchronized type, declared outside of the type. In
4047                --  this case the controlling actual must be converted to its
4048                --  corresponding record type, which is the formal type. The
4049                --  actual may be a subtype, either because of a constraint or
4050                --  because it is a generic actual, so use base type to locate
4051                --  concurrent type.
4052
4053                F_Typ := Base_Type (Etype (F));
4054
4055                if Is_Tagged_Type (F_Typ)
4056                  and then (Is_Concurrent_Type (F_Typ)
4057                             or else Is_Concurrent_Record_Type (F_Typ))
4058                then
4059                   --  If the actual is overloaded, look for an interpretation
4060                   --  that has a synchronized type.
4061
4062                   if not Is_Overloaded (A) then
4063                      A_Typ := Base_Type (Etype (A));
4064
4065                   else
4066                      declare
4067                         Index : Interp_Index;
4068                         It    : Interp;
4069
4070                      begin
4071                         Get_First_Interp (A, Index, It);
4072                         while Present (It.Typ) loop
4073                            if Is_Concurrent_Type (It.Typ)
4074                              or else Is_Concurrent_Record_Type (It.Typ)
4075                            then
4076                               A_Typ := Base_Type (It.Typ);
4077                               exit;
4078                            end if;
4079
4080                            Get_Next_Interp (Index, It);
4081                         end loop;
4082                      end;
4083                   end if;
4084
4085                   declare
4086                      Full_A_Typ : Entity_Id;
4087
4088                   begin
4089                      if Present (Full_View (A_Typ)) then
4090                         Full_A_Typ := Base_Type (Full_View (A_Typ));
4091                      else
4092                         Full_A_Typ := A_Typ;
4093                      end if;
4094
4095                      --  Tagged synchronized type (case 1): the actual is a
4096                      --  concurrent type.
4097
4098                      if Is_Concurrent_Type (A_Typ)
4099                        and then Corresponding_Record_Type (A_Typ) = F_Typ
4100                      then
4101                         Rewrite (A,
4102                           Unchecked_Convert_To
4103                             (Corresponding_Record_Type (A_Typ), A));
4104                         Resolve (A, Etype (F));
4105
4106                      --  Tagged synchronized type (case 2): the formal is a
4107                      --  concurrent type.
4108
4109                      elsif Ekind (Full_A_Typ) = E_Record_Type
4110                        and then Present
4111                                (Corresponding_Concurrent_Type (Full_A_Typ))
4112                        and then Is_Concurrent_Type (F_Typ)
4113                        and then Present (Corresponding_Record_Type (F_Typ))
4114                        and then Full_A_Typ = Corresponding_Record_Type (F_Typ)
4115                      then
4116                         Resolve (A, Corresponding_Record_Type (F_Typ));
4117
4118                      --  Common case
4119
4120                      else
4121                         Resolve (A, Etype (F));
4122                      end if;
4123                   end;
4124
4125                --  Not a synchronized operation
4126
4127                else
4128                   Resolve (A, Etype (F));
4129                end if;
4130             end if;
4131
4132             A_Typ := Etype (A);
4133             F_Typ := Etype (F);
4134
4135             --  An actual cannot be an untagged formal incomplete type
4136
4137             if Ekind (A_Typ) = E_Incomplete_Type
4138               and then not Is_Tagged_Type (A_Typ)
4139               and then Is_Generic_Type (A_Typ)
4140             then
4141                Error_Msg_N
4142                  ("invalid use of untagged formal incomplete type", A);
4143             end if;
4144
4145             if Comes_From_Source (Original_Node (N))
4146               and then Nkind_In (Original_Node (N), N_Function_Call,
4147                                                     N_Procedure_Call_Statement)
4148             then
4149                --  In formal mode, check that actual parameters matching
4150                --  formals of tagged types are objects (or ancestor type
4151                --  conversions of objects), not general expressions.
4152
4153                if Is_Actual_Tagged_Parameter (A) then
4154                   if Is_SPARK_05_Object_Reference (A) then
4155                      null;
4156
4157                   elsif Nkind (A) = N_Type_Conversion then
4158                      declare
4159                         Operand     : constant Node_Id   := Expression (A);
4160                         Operand_Typ : constant Entity_Id := Etype (Operand);
4161                         Target_Typ  : constant Entity_Id := A_Typ;
4162
4163                      begin
4164                         if not Is_SPARK_05_Object_Reference (Operand) then
4165                            Check_SPARK_05_Restriction
4166                              ("object required", Operand);
4167
4168                         --  In formal mode, the only view conversions are those
4169                         --  involving ancestor conversion of an extended type.
4170
4171                         elsif not
4172                           (Is_Tagged_Type (Target_Typ)
4173                            and then not Is_Class_Wide_Type (Target_Typ)
4174                            and then Is_Tagged_Type (Operand_Typ)
4175                            and then not Is_Class_Wide_Type (Operand_Typ)
4176                            and then Is_Ancestor (Target_Typ, Operand_Typ))
4177                         then
4178                            if Ekind_In
4179                              (F, E_Out_Parameter, E_In_Out_Parameter)
4180                            then
4181                               Check_SPARK_05_Restriction
4182                                 ("ancestor conversion is the only permitted "
4183                                  & "view conversion", A);
4184                            else
4185                               Check_SPARK_05_Restriction
4186                                 ("ancestor conversion required", A);
4187                            end if;
4188
4189                         else
4190                            null;
4191                         end if;
4192                      end;
4193
4194                   else
4195                      Check_SPARK_05_Restriction ("object required", A);
4196                   end if;
4197
4198                --  In formal mode, the only view conversions are those
4199                --  involving ancestor conversion of an extended type.
4200
4201                elsif Nkind (A) = N_Type_Conversion
4202                  and then Ekind_In (F, E_Out_Parameter, E_In_Out_Parameter)
4203                then
4204                   Check_SPARK_05_Restriction
4205                     ("ancestor conversion is the only permitted view "
4206                      & "conversion", A);
4207                end if;
4208             end if;
4209
4210             --  has warnings suppressed, then we reset Never_Set_In_Source for
4211             --  the calling entity. The reason for this is to catch cases like
4212             --  GNAT.Spitbol.Patterns.Vstring_Var where the called subprogram
4213             --  uses trickery to modify an IN parameter.
4214
4215             if Ekind (F) = E_In_Parameter
4216               and then Is_Entity_Name (A)
4217               and then Present (Entity (A))
4218               and then Ekind (Entity (A)) = E_Variable
4219               and then Has_Warnings_Off (F_Typ)
4220             then
4221                Set_Never_Set_In_Source (Entity (A), False);
4222             end if;
4223
4224             --  Perform error checks for IN and IN OUT parameters
4225
4226             if Ekind (F) /= E_Out_Parameter then
4227
4228                --  Check unset reference. For scalar parameters, it is clearly
4229                --  wrong to pass an uninitialized value as either an IN or
4230                --  IN-OUT parameter. For composites, it is also clearly an
4231                --  error to pass a completely uninitialized value as an IN
4232                --  parameter, but the case of IN OUT is trickier. We prefer
4233                --  not to give a warning here. For example, suppose there is
4234                --  a routine that sets some component of a record to False.
4235                --  It is perfectly reasonable to make this IN-OUT and allow
4236                --  either initialized or uninitialized records to be passed
4237                --  in this case.
4238
4239                --  For partially initialized composite values, we also avoid
4240                --  warnings, since it is quite likely that we are passing a
4241                --  partially initialized value and only the initialized fields
4242                --  will in fact be read in the subprogram.
4243
4244                if Is_Scalar_Type (A_Typ)
4245                  or else (Ekind (F) = E_In_Parameter
4246                            and then not Is_Partially_Initialized_Type (A_Typ))
4247                then
4248                   Check_Unset_Reference (A);
4249                end if;
4250
4251                --  In Ada 83 we cannot pass an OUT parameter as an IN or IN OUT
4252                --  actual to a nested call, since this is case of reading an
4253                --  out parameter, which is not allowed.
4254
4255                if Ada_Version = Ada_83
4256                  and then Is_Entity_Name (A)
4257                  and then Ekind (Entity (A)) = E_Out_Parameter
4258                then
4259                   Error_Msg_N ("(Ada 83) illegal reading of out parameter", A);
4260                end if;
4261             end if;
4262
4263             --  Case of OUT or IN OUT parameter
4264
4265             if Ekind (F) /= E_In_Parameter then
4266
4267                --  For an Out parameter, check for useless assignment. Note
4268                --  that we can't set Last_Assignment this early, because we may
4269                --  kill current values in Resolve_Call, and that call would
4270                --  clobber the Last_Assignment field.
4271
4272                --  Note: call Warn_On_Useless_Assignment before doing the check
4273                --  below for Is_OK_Variable_For_Out_Formal so that the setting
4274                --  of Referenced_As_LHS/Referenced_As_Out_Formal properly
4275                --  reflects the last assignment, not this one.
4276
4277                if Ekind (F) = E_Out_Parameter then
4278                   if Warn_On_Modified_As_Out_Parameter (F)
4279                     and then Is_Entity_Name (A)
4280                     and then Present (Entity (A))
4281                     and then Comes_From_Source (N)
4282                   then
4283                      Warn_On_Useless_Assignment (Entity (A), A);
4284                   end if;
4285                end if;
4286
4287                --  Validate the form of the actual. Note that the call to
4288                --  Is_OK_Variable_For_Out_Formal generates the required
4289                --  reference in this case.
4290
4291                --  A call to an initialization procedure for an aggregate
4292                --  component may initialize a nested component of a constant
4293                --  designated object. In this context the object is variable.
4294
4295                if not Is_OK_Variable_For_Out_Formal (A)
4296                  and then not Is_Init_Proc (Nam)
4297                then
4298                   Error_Msg_NE ("actual for& must be a variable", A, F);
4299
4300                   if Is_Subprogram (Current_Scope)
4301                     and then
4302                       (Is_Invariant_Procedure (Current_Scope)
4303                         or else Is_Predicate_Function (Current_Scope))
4304                   then
4305                      Error_Msg_N
4306                        ("function used in predicate cannot "
4307                         & "modify its argument", F);
4308                   end if;
4309                end if;
4310
4311                --  What's the following about???
4312
4313                if Is_Entity_Name (A) then
4314                   Kill_Checks (Entity (A));
4315                else
4316                   Kill_All_Checks;
4317                end if;
4318             end if;
4319
4320             if Etype (A) = Any_Type then
4321                Set_Etype (N, Any_Type);
4322                return;
4323             end if;
4324
4325             --  Apply appropriate constraint/predicate checks for IN [OUT] case
4326
4327             if Ekind_In (F, E_In_Parameter, E_In_Out_Parameter) then
4328
4329                --  Apply predicate tests except in certain special cases. Note
4330                --  that it might be more consistent to apply these only when
4331                --  expansion is active (in Exp_Ch6.Expand_Actuals), as we do
4332                --  for the outbound predicate tests ???
4333
4334                if Predicate_Tests_On_Arguments (Nam) then
4335                   Apply_Predicate_Check (A, F_Typ);
4336                end if;
4337
4338                --  Apply required constraint checks
4339
4340                --  Gigi looks at the check flag and uses the appropriate types.
4341                --  For now since one flag is used there is an optimization
4342                --  which might not be done in the IN OUT case since Gigi does
4343                --  not do any analysis. More thought required about this ???
4344
4345                --  In fact is this comment obsolete??? doesn't the expander now
4346                --  generate all these tests anyway???
4347
4348                if Is_Scalar_Type (Etype (A)) then
4349                   Apply_Scalar_Range_Check (A, F_Typ);
4350
4351                elsif Is_Array_Type (Etype (A)) then
4352                   Apply_Length_Check (A, F_Typ);
4353
4354                elsif Is_Record_Type (F_Typ)
4355                  and then Has_Discriminants (F_Typ)
4356                  and then Is_Constrained (F_Typ)
4357                  and then (not Is_Derived_Type (F_Typ)
4358                             or else Comes_From_Source (Nam))
4359                then
4360                   Apply_Discriminant_Check (A, F_Typ);
4361
4362                   --  For view conversions of a discriminated object, apply
4363                   --  check to object itself, the conversion alreay has the
4364                   --  proper type.
4365
4366                   if Nkind (A) = N_Type_Conversion
4367                     and then Is_Constrained (Etype (Expression (A)))
4368                   then
4369                      Apply_Discriminant_Check (Expression (A), F_Typ);
4370                   end if;
4371
4372                elsif Is_Access_Type (F_Typ)
4373                  and then Is_Array_Type (Designated_Type (F_Typ))
4374                  and then Is_Constrained (Designated_Type (F_Typ))
4375                then
4376                   Apply_Length_Check (A, F_Typ);
4377
4378                elsif Is_Access_Type (F_Typ)
4379                  and then Has_Discriminants (Designated_Type (F_Typ))
4380                  and then Is_Constrained (Designated_Type (F_Typ))
4381                then
4382                   Apply_Discriminant_Check (A, F_Typ);
4383
4384                else
4385                   Apply_Range_Check (A, F_Typ);
4386                end if;
4387
4388                --  Ada 2005 (AI-231): Note that the controlling parameter case
4389                --  already existed in Ada 95, which is partially checked
4390                --  elsewhere (see Checks), and we don't want the warning
4391                --  message to differ.
4392
4393                if Is_Access_Type (F_Typ)
4394                  and then Can_Never_Be_Null (F_Typ)
4395                  and then Known_Null (A)
4396                then
4397                   if Is_Controlling_Formal (F) then
4398                      Apply_Compile_Time_Constraint_Error
4399                        (N      => A,
4400                         Msg    => "null value not allowed here??",
4401                         Reason => CE_Access_Check_Failed);
4402
4403                   elsif Ada_Version >= Ada_2005 then
4404                      Apply_Compile_Time_Constraint_Error
4405                        (N      => A,
4406                         Msg    => "(Ada 2005) null not allowed in "
4407                                   & "null-excluding formal??",
4408                         Reason => CE_Null_Not_Allowed);
4409                   end if;
4410                end if;
4411             end if;
4412
4413             --  Checks for OUT parameters and IN OUT parameters
4414
4415             if Ekind_In (F, E_Out_Parameter, E_In_Out_Parameter) then
4416
4417                --  If there is a type conversion, to make sure the return value
4418                --  meets the constraints of the variable before the conversion.
4419
4420                if Nkind (A) = N_Type_Conversion then
4421                   if Is_Scalar_Type (A_Typ) then
4422                      Apply_Scalar_Range_Check
4423                        (Expression (A), Etype (Expression (A)), A_Typ);
4424                   else
4425                      Apply_Range_Check
4426                        (Expression (A), Etype (Expression (A)), A_Typ);
4427                   end if;
4428
4429                --  If no conversion apply scalar range checks and length checks
4430                --  base on the subtype of the actual (NOT that of the formal).
4431
4432                else
4433                   if Is_Scalar_Type (F_Typ) then
4434                      Apply_Scalar_Range_Check (A, A_Typ, F_Typ);
4435                   elsif Is_Array_Type (F_Typ)
4436                     and then Ekind (F) = E_Out_Parameter
4437                   then
4438                      Apply_Length_Check (A, F_Typ);
4439                   else
4440                      Apply_Range_Check (A, A_Typ, F_Typ);
4441                   end if;
4442                end if;
4443
4444                --  Note: we do not apply the predicate checks for the case of
4445                --  OUT and IN OUT parameters. They are instead applied in the
4446                --  Expand_Actuals routine in Exp_Ch6.
4447             end if;
4448
4449             --  An actual associated with an access parameter is implicitly
4450             --  converted to the anonymous access type of the formal and must
4451             --  satisfy the legality checks for access conversions.
4452
4453             if Ekind (F_Typ) = E_Anonymous_Access_Type then
4454                if not Valid_Conversion (A, F_Typ, A) then
4455                   Error_Msg_N
4456                     ("invalid implicit conversion for access parameter", A);
4457                end if;
4458
4459                --  If the actual is an access selected component of a variable,
4460                --  the call may modify its designated object. It is reasonable
4461                --  to treat this as a potential modification of the enclosing
4462                --  record, to prevent spurious warnings that it should be
4463                --  declared as a constant, because intuitively programmers
4464                --  regard the designated subcomponent as part of the record.
4465
4466                if Nkind (A) = N_Selected_Component
4467                  and then Is_Entity_Name (Prefix (A))
4468                  and then not Is_Constant_Object (Entity (Prefix (A)))
4469                then
4470                   Note_Possible_Modification (A, Sure => False);
4471                end if;
4472             end if;
4473
4474             --  Check bad case of atomic/volatile argument (RM C.6(12))
4475
4476             if Is_By_Reference_Type (Etype (F))
4477               and then Comes_From_Source (N)
4478             then
4479                if Is_Atomic_Object (A)
4480                  and then not Is_Atomic (Etype (F))
4481                then
4482                   Error_Msg_NE
4483                     ("cannot pass atomic argument to non-atomic formal&",
4484                      A, F);
4485
4486                elsif Is_Volatile_Object (A)
4487                  and then not Is_Volatile (Etype (F))
4488                then
4489                   Error_Msg_NE
4490                     ("cannot pass volatile argument to non-volatile formal&",
4491                      A, F);
4492                end if;
4493             end if;
4494
4495             --  Check that subprograms don't have improper controlling
4496             --  arguments (RM 3.9.2 (9)).
4497
4498             --  A primitive operation may have an access parameter of an
4499             --  incomplete tagged type, but a dispatching call is illegal
4500             --  if the type is still incomplete.
4501
4502             if Is_Controlling_Formal (F) then
4503                Set_Is_Controlling_Actual (A);
4504
4505                if Ekind (Etype (F)) = E_Anonymous_Access_Type then
4506                   declare
4507                      Desig : constant Entity_Id := Designated_Type (Etype (F));
4508                   begin
4509                      if Ekind (Desig) = E_Incomplete_Type
4510                        and then No (Full_View (Desig))
4511                        and then No (Non_Limited_View (Desig))
4512                      then
4513                         Error_Msg_NE
4514                           ("premature use of incomplete type& "
4515                            & "in dispatching call", A, Desig);
4516                      end if;
4517                   end;
4518                end if;
4519
4520             elsif Nkind (A) = N_Explicit_Dereference then
4521                Validate_Remote_Access_To_Class_Wide_Type (A);
4522             end if;
4523
4524             --  Apply legality rule 3.9.2  (9/1)
4525
4526             if (Is_Class_Wide_Type (A_Typ) or else Is_Dynamically_Tagged (A))
4527               and then not Is_Class_Wide_Type (F_Typ)
4528               and then not Is_Controlling_Formal (F)
4529               and then not In_Instance
4530             then
4531                Error_Msg_N ("class-wide argument not allowed here!", A);
4532
4533                if Is_Subprogram (Nam) and then Comes_From_Source (Nam) then
4534                   Error_Msg_Node_2 := F_Typ;
4535                   Error_Msg_NE
4536                     ("& is not a dispatching operation of &!", A, Nam);
4537                end if;
4538
4539             --  Apply the checks described in 3.10.2(27): if the context is a
4540             --  specific access-to-object, the actual cannot be class-wide.
4541             --  Use base type to exclude access_to_subprogram cases.
4542
4543             elsif Is_Access_Type (A_Typ)
4544               and then Is_Access_Type (F_Typ)
4545               and then not Is_Access_Subprogram_Type (Base_Type (F_Typ))
4546               and then (Is_Class_Wide_Type (Designated_Type (A_Typ))
4547                          or else (Nkind (A) = N_Attribute_Reference
4548                                    and then
4549                                      Is_Class_Wide_Type (Etype (Prefix (A)))))
4550               and then not Is_Class_Wide_Type (Designated_Type (F_Typ))
4551               and then not Is_Controlling_Formal (F)
4552
4553               --  Disable these checks for call to imported C++ subprograms
4554
4555               and then not
4556                 (Is_Entity_Name (Name (N))
4557                   and then Is_Imported (Entity (Name (N)))
4558                   and then Convention (Entity (Name (N))) = Convention_CPP)
4559             then
4560                Error_Msg_N
4561                  ("access to class-wide argument not allowed here!", A);
4562
4563                if Is_Subprogram (Nam) and then Comes_From_Source (Nam) then
4564                   Error_Msg_Node_2 := Designated_Type (F_Typ);
4565                   Error_Msg_NE
4566                     ("& is not a dispatching operation of &!", A, Nam);
4567                end if;
4568             end if;
4569
4570             Check_Aliased_Parameter;
4571
4572             Eval_Actual (A);
4573
4574             --  If it is a named association, treat the selector_name as a
4575             --  proper identifier, and mark the corresponding entity.
4576
4577             if Nkind (Parent (A)) = N_Parameter_Association
4578
4579               --  Ignore reference in SPARK mode, as it refers to an entity not
4580               --  in scope at the point of reference, so the reference should
4581               --  be ignored for computing effects of subprograms.
4582
4583               and then not GNATprove_Mode
4584             then
4585                Set_Entity (Selector_Name (Parent (A)), F);
4586                Generate_Reference (F, Selector_Name (Parent (A)));
4587                Set_Etype (Selector_Name (Parent (A)), F_Typ);
4588                Generate_Reference (F_Typ, N, ' ');
4589             end if;
4590
4591             Prev := A;
4592
4593             if Ekind (F) /= E_Out_Parameter then
4594                Check_Unset_Reference (A);
4595             end if;
4596
4597             --  The following checks are only relevant when SPARK_Mode is on as
4598             --  they are not standard Ada legality rule. Internally generated
4599             --  temporaries are ignored.
4600
4601             if SPARK_Mode = On
4602               and then Is_Effectively_Volatile_Object (A)
4603               and then Comes_From_Source (A)
4604             then
4605                --  An effectively volatile object may act as an actual
4606                --  parameter when the corresponding formal is of a non-scalar
4607                --  volatile type.
4608
4609                if Is_Volatile (Etype (F))
4610                  and then not Is_Scalar_Type (Etype (F))
4611                then
4612                   null;
4613
4614                --  An effectively volatile object may act as an actual
4615                --  parameter in a call to an instance of Unchecked_Conversion.
4616
4617                elsif Is_Unchecked_Conversion_Instance (Nam) then
4618                   null;
4619
4620                else
4621                   Error_Msg_N
4622                     ("volatile object cannot act as actual in a call (SPARK "
4623                      & "RM 7.1.3(12))", A);
4624                end if;
4625
4626                --  Detect an external variable with an enabled property that
4627                --  does not match the mode of the corresponding formal in a
4628                --  procedure call. Functions are not considered because they
4629                --  cannot have effectively volatile formal parameters in the
4630                --  first place.
4631
4632                if Ekind (Nam) = E_Procedure
4633                  and then Is_Entity_Name (A)
4634                  and then Present (Entity (A))
4635                  and then Ekind (Entity (A)) = E_Variable
4636                then
4637                   A_Id := Entity (A);
4638
4639                   if Ekind (F) = E_In_Parameter then
4640                      if Async_Readers_Enabled (A_Id) then
4641                         Property_Error (A, A_Id, Name_Async_Readers);
4642                      elsif Effective_Reads_Enabled (A_Id) then
4643                         Property_Error (A, A_Id, Name_Effective_Reads);
4644                      elsif Effective_Writes_Enabled (A_Id) then
4645                         Property_Error (A, A_Id, Name_Effective_Writes);
4646                      end if;
4647
4648                   elsif Ekind (F) = E_Out_Parameter
4649                     and then Async_Writers_Enabled (A_Id)
4650                   then
4651                      Error_Msg_Name_1 := Name_Async_Writers;
4652                      Error_Msg_NE
4653                        ("external variable & with enabled property % cannot "
4654                         & "appear as actual in procedure call "
4655                         & "(SPARK RM 7.1.3(11))", A, A_Id);
4656                      Error_Msg_N
4657                        ("\\corresponding formal parameter has mode Out", A);
4658                   end if;
4659                end if;
4660             end if;
4661
4662             --  A formal parameter of a specific tagged type whose related
4663             --  subprogram is subject to pragma Extensions_Visible with value
4664             --  "False" cannot act as an actual in a subprogram with value
4665             --  "True" (SPARK RM 6.1.7(3)).
4666
4667             if Is_EVF_Expression (A)
4668               and then Extensions_Visible_Status (Nam) =
4669                        Extensions_Visible_True
4670             then
4671                Error_Msg_N
4672                  ("formal parameter with Extensions_Visible False cannot act "
4673                   & "as actual parameter", A);
4674                Error_Msg_NE
4675                  ("\subprogram & has Extensions_Visible True", A, Nam);
4676             end if;
4677
4678             --  The actual parameter of a Ghost subprogram whose formal is of
4679             --  mode IN OUT or OUT must be a Ghost variable (SPARK RM 6.9(13)).
4680
4681             if Is_Ghost_Entity (Nam)
4682               and then Ekind_In (F, E_In_Out_Parameter, E_Out_Parameter)
4683               and then Is_Entity_Name (A)
4684               and then Present (Entity (A))
4685               and then not Is_Ghost_Entity (Entity (A))
4686             then
4687                Error_Msg_NE
4688                  ("non-ghost variable & cannot appear as actual in call to "
4689                   & "ghost procedure", A, Entity (A));
4690
4691                if Ekind (F) = E_In_Out_Parameter then
4692                   Error_Msg_N ("\corresponding formal has mode `IN OUT`", A);
4693                else
4694                   Error_Msg_N ("\corresponding formal has mode OUT", A);
4695                end if;
4696             end if;
4697
4698             Next_Actual (A);
4699
4700          --  Case where actual is not present
4701
4702          else
4703             Insert_Default;
4704          end if;
4705
4706          Next_Formal (F);
4707       end loop;
4708    end Resolve_Actuals;
4709
4710    -----------------------
4711    -- Resolve_Allocator --
4712    -----------------------
4713
4714    procedure Resolve_Allocator (N : Node_Id; Typ : Entity_Id) is
4715       Desig_T  : constant Entity_Id := Designated_Type (Typ);
4716       E        : constant Node_Id   := Expression (N);
4717       Subtyp   : Entity_Id;
4718       Discrim  : Entity_Id;
4719       Constr   : Node_Id;
4720       Aggr     : Node_Id;
4721       Assoc    : Node_Id := Empty;
4722       Disc_Exp : Node_Id;
4723
4724       procedure Check_Allocator_Discrim_Accessibility
4725         (Disc_Exp  : Node_Id;
4726          Alloc_Typ : Entity_Id);
4727       --  Check that accessibility level associated with an access discriminant
4728       --  initialized in an allocator by the expression Disc_Exp is not deeper
4729       --  than the level of the allocator type Alloc_Typ. An error message is
4730       --  issued if this condition is violated. Specialized checks are done for
4731       --  the cases of a constraint expression which is an access attribute or
4732       --  an access discriminant.
4733
4734       function In_Dispatching_Context return Boolean;
4735       --  If the allocator is an actual in a call, it is allowed to be class-
4736       --  wide when the context is not because it is a controlling actual.
4737
4738       -------------------------------------------
4739       -- Check_Allocator_Discrim_Accessibility --
4740       -------------------------------------------
4741
4742       procedure Check_Allocator_Discrim_Accessibility
4743         (Disc_Exp  : Node_Id;
4744          Alloc_Typ : Entity_Id)
4745       is
4746       begin
4747          if Type_Access_Level (Etype (Disc_Exp)) >
4748             Deepest_Type_Access_Level (Alloc_Typ)
4749          then
4750             Error_Msg_N
4751               ("operand type has deeper level than allocator type", Disc_Exp);
4752
4753          --  When the expression is an Access attribute the level of the prefix
4754          --  object must not be deeper than that of the allocator's type.
4755
4756          elsif Nkind (Disc_Exp) = N_Attribute_Reference
4757            and then Get_Attribute_Id (Attribute_Name (Disc_Exp)) =
4758                       Attribute_Access
4759            and then Object_Access_Level (Prefix (Disc_Exp)) >
4760                       Deepest_Type_Access_Level (Alloc_Typ)
4761          then
4762             Error_Msg_N
4763               ("prefix of attribute has deeper level than allocator type",
4764                Disc_Exp);
4765
4766          --  When the expression is an access discriminant the check is against
4767          --  the level of the prefix object.
4768
4769          elsif Ekind (Etype (Disc_Exp)) = E_Anonymous_Access_Type
4770            and then Nkind (Disc_Exp) = N_Selected_Component
4771            and then Object_Access_Level (Prefix (Disc_Exp)) >
4772                       Deepest_Type_Access_Level (Alloc_Typ)
4773          then
4774             Error_Msg_N
4775               ("access discriminant has deeper level than allocator type",
4776                Disc_Exp);
4777
4778          --  All other cases are legal
4779
4780          else
4781             null;
4782          end if;
4783       end Check_Allocator_Discrim_Accessibility;
4784
4785       ----------------------------
4786       -- In_Dispatching_Context --
4787       ----------------------------
4788
4789       function In_Dispatching_Context return Boolean is
4790          Par : constant Node_Id := Parent (N);
4791
4792       begin
4793          return Nkind (Par) in N_Subprogram_Call
4794            and then Is_Entity_Name (Name (Par))
4795            and then Is_Dispatching_Operation (Entity (Name (Par)));
4796       end In_Dispatching_Context;
4797
4798    --  Start of processing for Resolve_Allocator
4799
4800    begin
4801       --  Replace general access with specific type
4802
4803       if Ekind (Etype (N)) = E_Allocator_Type then
4804          Set_Etype (N, Base_Type (Typ));
4805       end if;
4806
4807       if Is_Abstract_Type (Typ) then
4808          Error_Msg_N ("type of allocator cannot be abstract",  N);
4809       end if;
4810
4811       --  For qualified expression, resolve the expression using the given
4812       --  subtype (nothing to do for type mark, subtype indication)
4813
4814       if Nkind (E) = N_Qualified_Expression then
4815          if Is_Class_Wide_Type (Etype (E))
4816            and then not Is_Class_Wide_Type (Desig_T)
4817            and then not In_Dispatching_Context
4818          then
4819             Error_Msg_N
4820               ("class-wide allocator not allowed for this access type", N);
4821          end if;
4822
4823          Resolve (Expression (E), Etype (E));
4824          Check_Non_Static_Context (Expression (E));
4825          Check_Unset_Reference (Expression (E));
4826
4827          --  A qualified expression requires an exact match of the type.
4828          --  Class-wide matching is not allowed.
4829
4830          if (Is_Class_Wide_Type (Etype (Expression (E)))
4831               or else Is_Class_Wide_Type (Etype (E)))
4832            and then Base_Type (Etype (Expression (E))) /= Base_Type (Etype (E))
4833          then
4834             Wrong_Type (Expression (E), Etype (E));
4835          end if;
4836
4837          --  Calls to build-in-place functions are not currently supported in
4838          --  allocators for access types associated with a simple storage pool.
4839          --  Supporting such allocators may require passing additional implicit
4840          --  parameters to build-in-place functions (or a significant revision
4841          --  of the current b-i-p implementation to unify the handling for
4842          --  multiple kinds of storage pools). ???
4843
4844          if Is_Limited_View (Desig_T)
4845            and then Nkind (Expression (E)) = N_Function_Call
4846          then
4847             declare
4848                Pool : constant Entity_Id :=
4849                         Associated_Storage_Pool (Root_Type (Typ));
4850             begin
4851                if Present (Pool)
4852                  and then
4853                    Present (Get_Rep_Pragma
4854                               (Etype (Pool), Name_Simple_Storage_Pool_Type))
4855                then
4856                   Error_Msg_N
4857                     ("limited function calls not yet supported in simple "
4858                      & "storage pool allocators", Expression (E));
4859                end if;
4860             end;
4861          end if;
4862
4863          --  A special accessibility check is needed for allocators that
4864          --  constrain access discriminants. The level of the type of the
4865          --  expression used to constrain an access discriminant cannot be
4866          --  deeper than the type of the allocator (in contrast to access
4867          --  parameters, where the level of the actual can be arbitrary).
4868
4869          --  We can't use Valid_Conversion to perform this check because in
4870          --  general the type of the allocator is unrelated to the type of
4871          --  the access discriminant.
4872
4873          if Ekind (Typ) /= E_Anonymous_Access_Type
4874            or else Is_Local_Anonymous_Access (Typ)
4875          then
4876             Subtyp := Entity (Subtype_Mark (E));
4877
4878             Aggr := Original_Node (Expression (E));
4879
4880             if Has_Discriminants (Subtyp)
4881               and then Nkind_In (Aggr, N_Aggregate, N_Extension_Aggregate)
4882             then
4883                Discrim := First_Discriminant (Base_Type (Subtyp));
4884
4885                --  Get the first component expression of the aggregate
4886
4887                if Present (Expressions (Aggr)) then
4888                   Disc_Exp := First (Expressions (Aggr));
4889
4890                elsif Present (Component_Associations (Aggr)) then
4891                   Assoc := First (Component_Associations (Aggr));
4892
4893                   if Present (Assoc) then
4894                      Disc_Exp := Expression (Assoc);
4895                   else
4896                      Disc_Exp := Empty;
4897                   end if;
4898
4899                else
4900                   Disc_Exp := Empty;
4901                end if;
4902
4903                while Present (Discrim) and then Present (Disc_Exp) loop
4904                   if Ekind (Etype (Discrim)) = E_Anonymous_Access_Type then
4905                      Check_Allocator_Discrim_Accessibility (Disc_Exp, Typ);
4906                   end if;
4907
4908                   Next_Discriminant (Discrim);
4909
4910                   if Present (Discrim) then
4911                      if Present (Assoc) then
4912                         Next (Assoc);
4913                         Disc_Exp := Expression (Assoc);
4914
4915                      elsif Present (Next (Disc_Exp)) then
4916                         Next (Disc_Exp);
4917
4918                      else
4919                         Assoc := First (Component_Associations (Aggr));
4920
4921                         if Present (Assoc) then
4922                            Disc_Exp := Expression (Assoc);
4923                         else
4924                            Disc_Exp := Empty;
4925                         end if;
4926                      end if;
4927                   end if;
4928                end loop;
4929             end if;
4930          end if;
4931
4932       --  For a subtype mark or subtype indication, freeze the subtype
4933
4934       else
4935          Freeze_Expression (E);
4936
4937          if Is_Access_Constant (Typ) and then not No_Initialization (N) then
4938             Error_Msg_N
4939               ("initialization required for access-to-constant allocator", N);
4940          end if;
4941
4942          --  A special accessibility check is needed for allocators that
4943          --  constrain access discriminants. The level of the type of the
4944          --  expression used to constrain an access discriminant cannot be
4945          --  deeper than the type of the allocator (in contrast to access
4946          --  parameters, where the level of the actual can be arbitrary).
4947          --  We can't use Valid_Conversion to perform this check because
4948          --  in general the type of the allocator is unrelated to the type
4949          --  of the access discriminant.
4950
4951          if Nkind (Original_Node (E)) = N_Subtype_Indication
4952            and then (Ekind (Typ) /= E_Anonymous_Access_Type
4953                       or else Is_Local_Anonymous_Access (Typ))
4954          then
4955             Subtyp := Entity (Subtype_Mark (Original_Node (E)));
4956
4957             if Has_Discriminants (Subtyp) then
4958                Discrim := First_Discriminant (Base_Type (Subtyp));
4959                Constr := First (Constraints (Constraint (Original_Node (E))));
4960                while Present (Discrim) and then Present (Constr) loop
4961                   if Ekind (Etype (Discrim)) = E_Anonymous_Access_Type then
4962                      if Nkind (Constr) = N_Discriminant_Association then
4963                         Disc_Exp := Original_Node (Expression (Constr));
4964                      else
4965                         Disc_Exp := Original_Node (Constr);
4966                      end if;
4967
4968                      Check_Allocator_Discrim_Accessibility (Disc_Exp, Typ);
4969                   end if;
4970
4971                   Next_Discriminant (Discrim);
4972                   Next (Constr);
4973                end loop;
4974             end if;
4975          end if;
4976       end if;
4977
4978       --  Ada 2005 (AI-344): A class-wide allocator requires an accessibility
4979       --  check that the level of the type of the created object is not deeper
4980       --  than the level of the allocator's access type, since extensions can
4981       --  now occur at deeper levels than their ancestor types. This is a
4982       --  static accessibility level check; a run-time check is also needed in
4983       --  the case of an initialized allocator with a class-wide argument (see
4984       --  Expand_Allocator_Expression).
4985
4986       if Ada_Version >= Ada_2005
4987         and then Is_Class_Wide_Type (Desig_T)
4988       then
4989          declare
4990             Exp_Typ : Entity_Id;
4991
4992          begin
4993             if Nkind (E) = N_Qualified_Expression then
4994                Exp_Typ := Etype (E);
4995             elsif Nkind (E) = N_Subtype_Indication then
4996                Exp_Typ := Entity (Subtype_Mark (Original_Node (E)));
4997             else
4998                Exp_Typ := Entity (E);
4999             end if;
5000
5001             if Type_Access_Level (Exp_Typ) >
5002                  Deepest_Type_Access_Level (Typ)
5003             then
5004                if In_Instance_Body then
5005                   Error_Msg_Warn := SPARK_Mode /= On;
5006                   Error_Msg_N
5007                     ("type in allocator has deeper level than "
5008                      & "designated class-wide type<<", E);
5009                   Error_Msg_N ("\Program_Error [<<", E);
5010                   Rewrite (N,
5011                     Make_Raise_Program_Error (Sloc (N),
5012                       Reason => PE_Accessibility_Check_Failed));
5013                   Set_Etype (N, Typ);
5014
5015                --  Do not apply Ada 2005 accessibility checks on a class-wide
5016                --  allocator if the type given in the allocator is a formal
5017                --  type. A run-time check will be performed in the instance.
5018
5019                elsif not Is_Generic_Type (Exp_Typ) then
5020                   Error_Msg_N ("type in allocator has deeper level than "
5021                                & "designated class-wide type", E);
5022                end if;
5023             end if;
5024          end;
5025       end if;
5026
5027       --  Check for allocation from an empty storage pool
5028
5029       if No_Pool_Assigned (Typ) then
5030          Error_Msg_N ("allocation from empty storage pool!", N);
5031
5032       --  If the context is an unchecked conversion, as may happen within an
5033       --  inlined subprogram, the allocator is being resolved with its own
5034       --  anonymous type. In that case, if the target type has a specific
5035       --  storage pool, it must be inherited explicitly by the allocator type.
5036
5037       elsif Nkind (Parent (N)) = N_Unchecked_Type_Conversion
5038         and then No (Associated_Storage_Pool (Typ))
5039       then
5040          Set_Associated_Storage_Pool
5041            (Typ, Associated_Storage_Pool (Etype (Parent (N))));
5042       end if;
5043
5044       if Ekind (Etype (N)) = E_Anonymous_Access_Type then
5045          Check_Restriction (No_Anonymous_Allocators, N);
5046       end if;
5047
5048       --  Check that an allocator with task parts isn't for a nested access
5049       --  type when restriction No_Task_Hierarchy applies.
5050
5051       if not Is_Library_Level_Entity (Base_Type (Typ))
5052         and then Has_Task (Base_Type (Desig_T))
5053       then
5054          Check_Restriction (No_Task_Hierarchy, N);
5055       end if;
5056
5057       --  An illegal allocator may be rewritten as a raise Program_Error
5058       --  statement.
5059
5060       if Nkind (N) = N_Allocator then
5061
5062          --  An anonymous access discriminant is the definition of a
5063          --  coextension.
5064
5065          if Ekind (Typ) = E_Anonymous_Access_Type
5066            and then Nkind (Associated_Node_For_Itype (Typ)) =
5067                       N_Discriminant_Specification
5068          then
5069             declare
5070                Discr : constant Entity_Id :=
5071                          Defining_Identifier (Associated_Node_For_Itype (Typ));
5072
5073             begin
5074                Check_Restriction (No_Coextensions, N);
5075
5076                --  Ada 2012 AI05-0052: If the designated type of the allocator
5077                --  is limited, then the allocator shall not be used to define
5078                --  the value of an access discriminant unless the discriminated
5079                --  type is immutably limited.
5080
5081                if Ada_Version >= Ada_2012
5082                  and then Is_Limited_Type (Desig_T)
5083                  and then not Is_Limited_View (Scope (Discr))
5084                then
5085                   Error_Msg_N
5086                     ("only immutably limited types can have anonymous "
5087                      & "access discriminants designating a limited type", N);
5088                end if;
5089             end;
5090
5091             --  Avoid marking an allocator as a dynamic coextension if it is
5092             --  within a static construct.
5093
5094             if not Is_Static_Coextension (N) then
5095                Set_Is_Dynamic_Coextension (N);
5096             end if;
5097
5098          --  Cleanup for potential static coextensions
5099
5100          else
5101             Set_Is_Dynamic_Coextension (N, False);
5102             Set_Is_Static_Coextension  (N, False);
5103          end if;
5104       end if;
5105
5106       --  Report a simple error: if the designated object is a local task,
5107       --  its body has not been seen yet, and its activation will fail an
5108       --  elaboration check.
5109
5110       if Is_Task_Type (Desig_T)
5111         and then Scope (Base_Type (Desig_T)) = Current_Scope
5112         and then Is_Compilation_Unit (Current_Scope)
5113         and then Ekind (Current_Scope) = E_Package
5114         and then not In_Package_Body (Current_Scope)
5115       then
5116          Error_Msg_Warn := SPARK_Mode /= On;
5117          Error_Msg_N ("cannot activate task before body seen<<", N);
5118          Error_Msg_N ("\Program_Error [<<", N);
5119       end if;
5120
5121       --  Ada 2012 (AI05-0111-3): Detect an attempt to allocate a task or a
5122       --  type with a task component on a subpool. This action must raise
5123       --  Program_Error at runtime.
5124
5125       if Ada_Version >= Ada_2012
5126         and then Nkind (N) = N_Allocator
5127         and then Present (Subpool_Handle_Name (N))
5128         and then Has_Task (Desig_T)
5129       then
5130          Error_Msg_Warn := SPARK_Mode /= On;
5131          Error_Msg_N ("cannot allocate task on subpool<<", N);
5132          Error_Msg_N ("\Program_Error [<<", N);
5133
5134          Rewrite (N,
5135            Make_Raise_Program_Error (Sloc (N),
5136              Reason => PE_Explicit_Raise));
5137          Set_Etype (N, Typ);
5138       end if;
5139    end Resolve_Allocator;
5140
5141    ---------------------------
5142    -- Resolve_Arithmetic_Op --
5143    ---------------------------
5144
5145    --  Used for resolving all arithmetic operators except exponentiation
5146
5147    procedure Resolve_Arithmetic_Op (N : Node_Id; Typ : Entity_Id) is
5148       L   : constant Node_Id := Left_Opnd (N);
5149       R   : constant Node_Id := Right_Opnd (N);
5150       TL  : constant Entity_Id := Base_Type (Etype (L));
5151       TR  : constant Entity_Id := Base_Type (Etype (R));
5152       T   : Entity_Id;
5153       Rop : Node_Id;
5154
5155       B_Typ : constant Entity_Id := Base_Type (Typ);
5156       --  We do the resolution using the base type, because intermediate values
5157       --  in expressions always are of the base type, not a subtype of it.
5158
5159       function Expected_Type_Is_Any_Real (N : Node_Id) return Boolean;
5160       --  Returns True if N is in a context that expects "any real type"
5161
5162       function Is_Integer_Or_Universal (N : Node_Id) return Boolean;
5163       --  Return True iff given type is Integer or universal real/integer
5164
5165       procedure Set_Mixed_Mode_Operand (N : Node_Id; T : Entity_Id);
5166       --  Choose type of integer literal in fixed-point operation to conform
5167       --  to available fixed-point type. T is the type of the other operand,
5168       --  which is needed to determine the expected type of N.
5169
5170       procedure Set_Operand_Type (N : Node_Id);
5171       --  Set operand type to T if universal
5172
5173       -------------------------------
5174       -- Expected_Type_Is_Any_Real --
5175       -------------------------------
5176
5177       function Expected_Type_Is_Any_Real (N : Node_Id) return Boolean is
5178       begin
5179          --  N is the expression after "delta" in a fixed_point_definition;
5180          --  see RM-3.5.9(6):
5181
5182          return Nkind_In (Parent (N), N_Ordinary_Fixed_Point_Definition,
5183                                       N_Decimal_Fixed_Point_Definition,
5184
5185          --  N is one of the bounds in a real_range_specification;
5186          --  see RM-3.5.7(5):
5187
5188                                       N_Real_Range_Specification,
5189
5190          --  N is the expression of a delta_constraint;
5191          --  see RM-J.3(3):
5192
5193                                       N_Delta_Constraint);
5194       end Expected_Type_Is_Any_Real;
5195
5196       -----------------------------
5197       -- Is_Integer_Or_Universal --
5198       -----------------------------
5199
5200       function Is_Integer_Or_Universal (N : Node_Id) return Boolean is
5201          T     : Entity_Id;
5202          Index : Interp_Index;
5203          It    : Interp;
5204
5205       begin
5206          if not Is_Overloaded (N) then
5207             T := Etype (N);
5208             return Base_Type (T) = Base_Type (Standard_Integer)
5209               or else T = Universal_Integer
5210               or else T = Universal_Real;
5211          else
5212             Get_First_Interp (N, Index, It);
5213             while Present (It.Typ) loop
5214                if Base_Type (It.Typ) = Base_Type (Standard_Integer)
5215                  or else It.Typ = Universal_Integer
5216                  or else It.Typ = Universal_Real
5217                then
5218                   return True;
5219                end if;
5220
5221                Get_Next_Interp (Index, It);
5222             end loop;
5223          end if;
5224
5225          return False;
5226       end Is_Integer_Or_Universal;
5227
5228       ----------------------------
5229       -- Set_Mixed_Mode_Operand --
5230       ----------------------------
5231
5232       procedure Set_Mixed_Mode_Operand (N : Node_Id; T : Entity_Id) is
5233          Index : Interp_Index;
5234          It    : Interp;
5235
5236       begin
5237          if Universal_Interpretation (N) = Universal_Integer then
5238
5239             --  A universal integer literal is resolved as standard integer
5240             --  except in the case of a fixed-point result, where we leave it
5241             --  as universal (to be handled by Exp_Fixd later on)
5242
5243             if Is_Fixed_Point_Type (T) then
5244                Resolve (N, Universal_Integer);
5245             else
5246                Resolve (N, Standard_Integer);
5247             end if;
5248
5249          elsif Universal_Interpretation (N) = Universal_Real
5250            and then (T = Base_Type (Standard_Integer)
5251                       or else T = Universal_Integer
5252                       or else T = Universal_Real)
5253          then
5254             --  A universal real can appear in a fixed-type context. We resolve
5255             --  the literal with that context, even though this might raise an
5256             --  exception prematurely (the other operand may be zero).
5257
5258             Resolve (N, B_Typ);
5259
5260          elsif Etype (N) = Base_Type (Standard_Integer)
5261            and then T = Universal_Real
5262            and then Is_Overloaded (N)
5263          then
5264             --  Integer arg in mixed-mode operation. Resolve with universal
5265             --  type, in case preference rule must be applied.
5266
5267             Resolve (N, Universal_Integer);
5268
5269          elsif Etype (N) = T
5270            and then B_Typ /= Universal_Fixed
5271          then
5272             --  Not a mixed-mode operation, resolve with context
5273
5274             Resolve (N, B_Typ);
5275
5276          elsif Etype (N) = Any_Fixed then
5277
5278             --  N may itself be a mixed-mode operation, so use context type
5279
5280             Resolve (N, B_Typ);
5281
5282          elsif Is_Fixed_Point_Type (T)
5283            and then B_Typ = Universal_Fixed
5284            and then Is_Overloaded (N)
5285          then
5286             --  Must be (fixed * fixed) operation, operand must have one
5287             --  compatible interpretation.
5288
5289             Resolve (N, Any_Fixed);
5290
5291          elsif Is_Fixed_Point_Type (B_Typ)
5292            and then (T = Universal_Real or else Is_Fixed_Point_Type (T))
5293            and then Is_Overloaded (N)
5294          then
5295             --  C * F(X) in a fixed context, where C is a real literal or a
5296             --  fixed-point expression. F must have either a fixed type
5297             --  interpretation or an integer interpretation, but not both.
5298
5299             Get_First_Interp (N, Index, It);
5300             while Present (It.Typ) loop
5301                if Base_Type (It.Typ) = Base_Type (Standard_Integer) then
5302                   if Analyzed (N) then
5303                      Error_Msg_N ("ambiguous operand in fixed operation", N);
5304                   else
5305                      Resolve (N, Standard_Integer);
5306                   end if;
5307
5308                elsif Is_Fixed_Point_Type (It.Typ) then
5309                   if Analyzed (N) then
5310                      Error_Msg_N ("ambiguous operand in fixed operation", N);
5311                   else
5312                      Resolve (N, It.Typ);
5313                   end if;
5314                end if;
5315
5316                Get_Next_Interp (Index, It);
5317             end loop;
5318
5319             --  Reanalyze the literal with the fixed type of the context. If
5320             --  context is Universal_Fixed, we are within a conversion, leave
5321             --  the literal as a universal real because there is no usable
5322             --  fixed type, and the target of the conversion plays no role in
5323             --  the resolution.
5324
5325             declare
5326                Op2 : Node_Id;
5327                T2  : Entity_Id;
5328
5329             begin
5330                if N = L then
5331                   Op2 := R;
5332                else
5333                   Op2 := L;
5334                end if;
5335
5336                if B_Typ = Universal_Fixed
5337                   and then Nkind (Op2) = N_Real_Literal
5338                then
5339                   T2 := Universal_Real;
5340                else
5341                   T2 := B_Typ;
5342                end if;
5343
5344                Set_Analyzed (Op2, False);
5345                Resolve (Op2, T2);
5346             end;
5347
5348          else
5349             Resolve (N);
5350          end if;
5351       end Set_Mixed_Mode_Operand;
5352
5353       ----------------------
5354       -- Set_Operand_Type --
5355       ----------------------
5356
5357       procedure Set_Operand_Type (N : Node_Id) is
5358       begin
5359          if Etype (N) = Universal_Integer
5360            or else Etype (N) = Universal_Real
5361          then
5362             Set_Etype (N, T);
5363          end if;
5364       end Set_Operand_Type;
5365
5366    --  Start of processing for Resolve_Arithmetic_Op
5367
5368    begin
5369       if Comes_From_Source (N)
5370         and then Ekind (Entity (N)) = E_Function
5371         and then Is_Imported (Entity (N))
5372         and then Is_Intrinsic_Subprogram (Entity (N))
5373       then
5374          Resolve_Intrinsic_Operator (N, Typ);
5375          return;
5376
5377       --  Special-case for mixed-mode universal expressions or fixed point type
5378       --  operation: each argument is resolved separately. The same treatment
5379       --  is required if one of the operands of a fixed point operation is
5380       --  universal real, since in this case we don't do a conversion to a
5381       --  specific fixed-point type (instead the expander handles the case).
5382
5383       --  Set the type of the node to its universal interpretation because
5384       --  legality checks on an exponentiation operand need the context.
5385
5386       elsif (B_Typ = Universal_Integer or else B_Typ = Universal_Real)
5387         and then Present (Universal_Interpretation (L))
5388         and then Present (Universal_Interpretation (R))
5389       then
5390          Set_Etype (N, B_Typ);
5391          Resolve (L, Universal_Interpretation (L));
5392          Resolve (R, Universal_Interpretation (R));
5393
5394       elsif (B_Typ = Universal_Real
5395               or else Etype (N) = Universal_Fixed
5396               or else (Etype (N) = Any_Fixed
5397                         and then Is_Fixed_Point_Type (B_Typ))
5398               or else (Is_Fixed_Point_Type (B_Typ)
5399                         and then (Is_Integer_Or_Universal (L)
5400                                     or else
5401                                   Is_Integer_Or_Universal (R))))
5402         and then Nkind_In (N, N_Op_Multiply, N_Op_Divide)
5403       then
5404          if TL = Universal_Integer or else TR = Universal_Integer then
5405             Check_For_Visible_Operator (N, B_Typ);
5406          end if;
5407
5408          --  If context is a fixed type and one operand is integer, the other
5409          --  is resolved with the type of the context.
5410
5411          if Is_Fixed_Point_Type (B_Typ)
5412            and then (Base_Type (TL) = Base_Type (Standard_Integer)
5413                       or else TL = Universal_Integer)
5414          then
5415             Resolve (R, B_Typ);
5416             Resolve (L, TL);
5417
5418          elsif Is_Fixed_Point_Type (B_Typ)
5419            and then (Base_Type (TR) = Base_Type (Standard_Integer)
5420                       or else TR = Universal_Integer)
5421          then
5422             Resolve (L, B_Typ);
5423             Resolve (R, TR);
5424
5425          else
5426             Set_Mixed_Mode_Operand (L, TR);
5427             Set_Mixed_Mode_Operand (R, TL);
5428          end if;
5429
5430          --  Check the rule in RM05-4.5.5(19.1/2) disallowing universal_fixed
5431          --  multiplying operators from being used when the expected type is
5432          --  also universal_fixed. Note that B_Typ will be Universal_Fixed in
5433          --  some cases where the expected type is actually Any_Real;
5434          --  Expected_Type_Is_Any_Real takes care of that case.
5435
5436          if Etype (N) = Universal_Fixed
5437            or else Etype (N) = Any_Fixed
5438          then
5439             if B_Typ = Universal_Fixed
5440               and then not Expected_Type_Is_Any_Real (N)
5441               and then not Nkind_In (Parent (N), N_Type_Conversion,
5442                                                  N_Unchecked_Type_Conversion)
5443             then
5444                Error_Msg_N ("type cannot be determined from context!", N);
5445                Error_Msg_N ("\explicit conversion to result type required", N);
5446
5447                Set_Etype (L, Any_Type);
5448                Set_Etype (R, Any_Type);
5449
5450             else
5451                if Ada_Version = Ada_83
5452                  and then Etype (N) = Universal_Fixed
5453                  and then not
5454                    Nkind_In (Parent (N), N_Type_Conversion,
5455                                          N_Unchecked_Type_Conversion)
5456                then
5457                   Error_Msg_N
5458                     ("(Ada 83) fixed-point operation "
5459                      & "needs explicit conversion", N);
5460                end if;
5461
5462                --  The expected type is "any real type" in contexts like
5463
5464                --    type T is delta <universal_fixed-expression> ...
5465
5466                --  in which case we need to set the type to Universal_Real
5467                --  so that static expression evaluation will work properly.
5468
5469                if Expected_Type_Is_Any_Real (N) then
5470                   Set_Etype (N, Universal_Real);
5471                else
5472                   Set_Etype (N, B_Typ);
5473                end if;
5474             end if;
5475
5476          elsif Is_Fixed_Point_Type (B_Typ)
5477            and then (Is_Integer_Or_Universal (L)
5478                        or else Nkind (L) = N_Real_Literal
5479                        or else Nkind (R) = N_Real_Literal
5480                        or else Is_Integer_Or_Universal (R))
5481          then
5482             Set_Etype (N, B_Typ);
5483
5484          elsif Etype (N) = Any_Fixed then
5485
5486             --  If no previous errors, this is only possible if one operand is
5487             --  overloaded and the context is universal. Resolve as such.
5488
5489             Set_Etype (N, B_Typ);
5490          end if;
5491
5492       else
5493          if (TL = Universal_Integer or else TL = Universal_Real)
5494                and then
5495             (TR = Universal_Integer or else TR = Universal_Real)
5496          then
5497             Check_For_Visible_Operator (N, B_Typ);
5498          end if;
5499
5500          --  If the context is Universal_Fixed and the operands are also
5501          --  universal fixed, this is an error, unless there is only one
5502          --  applicable fixed_point type (usually Duration).
5503
5504          if B_Typ = Universal_Fixed and then Etype (L) = Universal_Fixed then
5505             T := Unique_Fixed_Point_Type (N);
5506
5507             if T  = Any_Type then
5508                Set_Etype (N, T);
5509                return;
5510             else
5511                Resolve (L, T);
5512                Resolve (R, T);
5513             end if;
5514
5515          else
5516             Resolve (L, B_Typ);
5517             Resolve (R, B_Typ);
5518          end if;
5519
5520          --  If one of the arguments was resolved to a non-universal type.
5521          --  label the result of the operation itself with the same type.
5522          --  Do the same for the universal argument, if any.
5523
5524          T := Intersect_Types (L, R);
5525          Set_Etype (N, Base_Type (T));
5526          Set_Operand_Type (L);
5527          Set_Operand_Type (R);
5528       end if;
5529
5530       Generate_Operator_Reference (N, Typ);
5531       Analyze_Dimension (N);
5532       Eval_Arithmetic_Op (N);
5533
5534       --  In SPARK, a multiplication or division with operands of fixed point
5535       --  types must be qualified or explicitly converted to identify the
5536       --  result type.
5537
5538       if (Is_Fixed_Point_Type (Etype (L))
5539            or else Is_Fixed_Point_Type (Etype (R)))
5540         and then Nkind_In (N, N_Op_Multiply, N_Op_Divide)
5541         and then
5542           not Nkind_In (Parent (N), N_Qualified_Expression, N_Type_Conversion)
5543       then
5544          Check_SPARK_05_Restriction
5545            ("operation should be qualified or explicitly converted", N);
5546       end if;
5547
5548       --  Set overflow and division checking bit
5549
5550       if Nkind (N) in N_Op then
5551          if not Overflow_Checks_Suppressed (Etype (N)) then
5552             Enable_Overflow_Check (N);
5553          end if;
5554
5555          --  Give warning if explicit division by zero
5556
5557          if Nkind_In (N, N_Op_Divide, N_Op_Rem, N_Op_Mod)
5558            and then not Division_Checks_Suppressed (Etype (N))
5559          then
5560             Rop := Right_Opnd (N);
5561
5562             if Compile_Time_Known_Value (Rop)
5563               and then ((Is_Integer_Type (Etype (Rop))
5564                           and then Expr_Value (Rop) = Uint_0)
5565                          or else
5566                            (Is_Real_Type (Etype (Rop))
5567                              and then Expr_Value_R (Rop) = Ureal_0))
5568             then
5569                --  Specialize the warning message according to the operation.
5570                --  The following warnings are for the case
5571
5572                case Nkind (N) is
5573                   when N_Op_Divide =>
5574
5575                      --  For division, we have two cases, for float division
5576                      --  of an unconstrained float type, on a machine where
5577                      --  Machine_Overflows is false, we don't get an exception
5578                      --  at run-time, but rather an infinity or Nan. The Nan
5579                      --  case is pretty obscure, so just warn about infinities.
5580
5581                      if Is_Floating_Point_Type (Typ)
5582                        and then not Is_Constrained (Typ)
5583                        and then not Machine_Overflows_On_Target
5584                      then
5585                         Error_Msg_N
5586                           ("float division by zero, may generate "
5587                            & "'+'/'- infinity??", Right_Opnd (N));
5588
5589                         --  For all other cases, we get a Constraint_Error
5590
5591                      else
5592                         Apply_Compile_Time_Constraint_Error
5593                           (N, "division by zero??", CE_Divide_By_Zero,
5594                            Loc => Sloc (Right_Opnd (N)));
5595                      end if;
5596
5597                   when N_Op_Rem =>
5598                      Apply_Compile_Time_Constraint_Error
5599                        (N, "rem with zero divisor??", CE_Divide_By_Zero,
5600                         Loc => Sloc (Right_Opnd (N)));
5601
5602                   when N_Op_Mod =>
5603                      Apply_Compile_Time_Constraint_Error
5604                        (N, "mod with zero divisor??", CE_Divide_By_Zero,
5605                         Loc => Sloc (Right_Opnd (N)));
5606
5607                   --  Division by zero can only happen with division, rem,
5608                   --  and mod operations.
5609
5610                   when others =>
5611                      raise Program_Error;
5612                end case;
5613
5614             --  Otherwise just set the flag to check at run time
5615
5616             else
5617                Activate_Division_Check (N);
5618             end if;
5619          end if;
5620
5621          --  If Restriction No_Implicit_Conditionals is active, then it is
5622          --  violated if either operand can be negative for mod, or for rem
5623          --  if both operands can be negative.
5624
5625          if Restriction_Check_Required (No_Implicit_Conditionals)
5626            and then Nkind_In (N, N_Op_Rem, N_Op_Mod)
5627          then
5628             declare
5629                Lo : Uint;
5630                Hi : Uint;
5631                OK : Boolean;
5632
5633                LNeg : Boolean;
5634                RNeg : Boolean;
5635                --  Set if corresponding operand might be negative
5636
5637             begin
5638                Determine_Range
5639                  (Left_Opnd (N), OK, Lo, Hi, Assume_Valid => True);
5640                LNeg := (not OK) or else Lo < 0;
5641
5642                Determine_Range
5643                  (Right_Opnd (N), OK, Lo, Hi, Assume_Valid => True);
5644                RNeg := (not OK) or else Lo < 0;
5645
5646                --  Check if we will be generating conditionals. There are two
5647                --  cases where that can happen, first for REM, the only case
5648                --  is largest negative integer mod -1, where the division can
5649                --  overflow, but we still have to give the right result. The
5650                --  front end generates a test for this annoying case. Here we
5651                --  just test if both operands can be negative (that's what the
5652                --  expander does, so we match its logic here).
5653
5654                --  The second case is mod where either operand can be negative.
5655                --  In this case, the back end has to generate additional tests.
5656
5657                if (Nkind (N) = N_Op_Rem and then (LNeg and RNeg))
5658                      or else
5659                   (Nkind (N) = N_Op_Mod and then (LNeg or RNeg))
5660                then
5661                   Check_Restriction (No_Implicit_Conditionals, N);
5662                end if;
5663             end;
5664          end if;
5665       end if;
5666
5667       Check_Unset_Reference (L);
5668       Check_Unset_Reference (R);
5669       Check_Function_Writable_Actuals (N);
5670    end Resolve_Arithmetic_Op;
5671
5672    ------------------
5673    -- Resolve_Call --
5674    ------------------
5675
5676    procedure Resolve_Call (N : Node_Id; Typ : Entity_Id) is
5677       function Same_Or_Aliased_Subprograms
5678         (S : Entity_Id;
5679          E : Entity_Id) return Boolean;
5680       --  Returns True if the subprogram entity S is the same as E or else
5681       --  S is an alias of E.
5682
5683       ---------------------------------
5684       -- Same_Or_Aliased_Subprograms --
5685       ---------------------------------
5686
5687       function Same_Or_Aliased_Subprograms
5688         (S : Entity_Id;
5689          E : Entity_Id) return Boolean
5690       is
5691          Subp_Alias : constant Entity_Id := Alias (S);
5692       begin
5693          return S = E or else (Present (Subp_Alias) and then Subp_Alias = E);
5694       end Same_Or_Aliased_Subprograms;
5695
5696       --  Local variables
5697
5698       Loc      : constant Source_Ptr := Sloc (N);
5699       Subp     : constant Node_Id    := Name (N);
5700       Body_Id  : Entity_Id;
5701       I        : Interp_Index;
5702       It       : Interp;
5703       Nam      : Entity_Id;
5704       Nam_Decl : Node_Id;
5705       Nam_UA   : Entity_Id;
5706       Norm_OK  : Boolean;
5707       Rtype    : Entity_Id;
5708       Scop     : Entity_Id;
5709
5710    --  Start of processing for Resolve_Call
5711
5712    begin
5713       --  The context imposes a unique interpretation with type Typ on a
5714       --  procedure or function call. Find the entity of the subprogram that
5715       --  yields the expected type, and propagate the corresponding formal
5716       --  constraints on the actuals. The caller has established that an
5717       --  interpretation exists, and emitted an error if not unique.
5718
5719       --  First deal with the case of a call to an access-to-subprogram,
5720       --  dereference made explicit in Analyze_Call.
5721
5722       if Ekind (Etype (Subp)) = E_Subprogram_Type then
5723          if not Is_Overloaded (Subp) then
5724             Nam := Etype (Subp);
5725
5726          else
5727             --  Find the interpretation whose type (a subprogram type) has a
5728             --  return type that is compatible with the context. Analysis of
5729             --  the node has established that one exists.
5730
5731             Nam := Empty;
5732
5733             Get_First_Interp (Subp,  I, It);
5734             while Present (It.Typ) loop
5735                if Covers (Typ, Etype (It.Typ)) then
5736                   Nam := It.Typ;
5737                   exit;
5738                end if;
5739
5740                Get_Next_Interp (I, It);
5741             end loop;
5742
5743             if No (Nam) then
5744                raise Program_Error;
5745             end if;
5746          end if;
5747
5748          --  If the prefix is not an entity, then resolve it
5749
5750          if not Is_Entity_Name (Subp) then
5751             Resolve (Subp, Nam);
5752          end if;
5753
5754          --  For an indirect call, we always invalidate checks, since we do not
5755          --  know whether the subprogram is local or global. Yes we could do
5756          --  better here, e.g. by knowing that there are no local subprograms,
5757          --  but it does not seem worth the effort. Similarly, we kill all
5758          --  knowledge of current constant values.
5759
5760          Kill_Current_Values;
5761
5762       --  If this is a procedure call which is really an entry call, do
5763       --  the conversion of the procedure call to an entry call. Protected
5764       --  operations use the same circuitry because the name in the call
5765       --  can be an arbitrary expression with special resolution rules.
5766
5767       elsif Nkind_In (Subp, N_Selected_Component, N_Indexed_Component)
5768         or else (Is_Entity_Name (Subp)
5769                   and then Ekind (Entity (Subp)) = E_Entry)
5770       then
5771          Resolve_Entry_Call (N, Typ);
5772          Check_Elab_Call (N);
5773
5774          --  Kill checks and constant values, as above for indirect case
5775          --  Who knows what happens when another task is activated?
5776
5777          Kill_Current_Values;
5778          return;
5779
5780       --  Normal subprogram call with name established in Resolve
5781
5782       elsif not (Is_Type (Entity (Subp))) then
5783          Nam := Entity (Subp);
5784          Set_Entity_With_Checks (Subp, Nam);
5785
5786       --  Otherwise we must have the case of an overloaded call
5787
5788       else
5789          pragma Assert (Is_Overloaded (Subp));
5790
5791          --  Initialize Nam to prevent warning (we know it will be assigned
5792          --  in the loop below, but the compiler does not know that).
5793
5794          Nam := Empty;
5795
5796          Get_First_Interp (Subp,  I, It);
5797          while Present (It.Typ) loop
5798             if Covers (Typ, It.Typ) then
5799                Nam := It.Nam;
5800                Set_Entity_With_Checks (Subp, Nam);
5801                exit;
5802             end if;
5803
5804             Get_Next_Interp (I, It);
5805          end loop;
5806       end if;
5807
5808       if Is_Access_Subprogram_Type (Base_Type (Etype (Nam)))
5809         and then not Is_Access_Subprogram_Type (Base_Type (Typ))
5810         and then Nkind (Subp) /= N_Explicit_Dereference
5811         and then Present (Parameter_Associations (N))
5812       then
5813          --  The prefix is a parameterless function call that returns an access
5814          --  to subprogram. If parameters are present in the current call, add
5815          --  add an explicit dereference. We use the base type here because
5816          --  within an instance these may be subtypes.
5817
5818          --  The dereference is added either in Analyze_Call or here. Should
5819          --  be consolidated ???
5820
5821          Set_Is_Overloaded (Subp, False);
5822          Set_Etype (Subp, Etype (Nam));
5823          Insert_Explicit_Dereference (Subp);
5824          Nam := Designated_Type (Etype (Nam));
5825          Resolve (Subp, Nam);
5826       end if;
5827
5828       --  Check that a call to Current_Task does not occur in an entry body
5829
5830       if Is_RTE (Nam, RE_Current_Task) then
5831          declare
5832             P : Node_Id;
5833
5834          begin
5835             P := N;
5836             loop
5837                P := Parent (P);
5838
5839                --  Exclude calls that occur within the default of a formal
5840                --  parameter of the entry, since those are evaluated outside
5841                --  of the body.
5842
5843                exit when No (P) or else Nkind (P) = N_Parameter_Specification;
5844
5845                if Nkind (P) = N_Entry_Body
5846                  or else (Nkind (P) = N_Subprogram_Body
5847                            and then Is_Entry_Barrier_Function (P))
5848                then
5849                   Rtype := Etype (N);
5850                   Error_Msg_Warn := SPARK_Mode /= On;
5851                   Error_Msg_NE
5852                     ("& should not be used in entry body (RM C.7(17))<<",
5853                      N, Nam);
5854                   Error_Msg_NE ("\Program_Error [<<", N, Nam);
5855                   Rewrite (N,
5856                     Make_Raise_Program_Error (Loc,
5857                       Reason => PE_Current_Task_In_Entry_Body));
5858                   Set_Etype (N, Rtype);
5859                   return;
5860                end if;
5861             end loop;
5862          end;
5863       end if;
5864
5865       --  Check that a procedure call does not occur in the context of the
5866       --  entry call statement of a conditional or timed entry call. Note that
5867       --  the case of a call to a subprogram renaming of an entry will also be
5868       --  rejected. The test for N not being an N_Entry_Call_Statement is
5869       --  defensive, covering the possibility that the processing of entry
5870       --  calls might reach this point due to later modifications of the code
5871       --  above.
5872
5873       if Nkind (Parent (N)) = N_Entry_Call_Alternative
5874         and then Nkind (N) /= N_Entry_Call_Statement
5875         and then Entry_Call_Statement (Parent (N)) = N
5876       then
5877          if Ada_Version < Ada_2005 then
5878             Error_Msg_N ("entry call required in select statement", N);
5879
5880          --  Ada 2005 (AI-345): If a procedure_call_statement is used
5881          --  for a procedure_or_entry_call, the procedure_name or
5882          --  procedure_prefix of the procedure_call_statement shall denote
5883          --  an entry renamed by a procedure, or (a view of) a primitive
5884          --  subprogram of a limited interface whose first parameter is
5885          --  a controlling parameter.
5886
5887          elsif Nkind (N) = N_Procedure_Call_Statement
5888            and then not Is_Renamed_Entry (Nam)
5889            and then not Is_Controlling_Limited_Procedure (Nam)
5890          then
5891             Error_Msg_N
5892              ("entry call or dispatching primitive of interface required", N);
5893          end if;
5894       end if;
5895
5896       --  If the SPARK_05 restriction is active, we are not allowed
5897       --  to have a call to a subprogram before we see its completion.
5898
5899       if not Has_Completion (Nam)
5900         and then Restriction_Check_Required (SPARK_05)
5901
5902         --  Don't flag strange internal calls
5903
5904         and then Comes_From_Source (N)
5905         and then Comes_From_Source (Nam)
5906
5907         --  Only flag calls in extended main source
5908
5909         and then In_Extended_Main_Source_Unit (Nam)
5910         and then In_Extended_Main_Source_Unit (N)
5911
5912         --  Exclude enumeration literals from this processing
5913
5914         and then Ekind (Nam) /= E_Enumeration_Literal
5915       then
5916          Check_SPARK_05_Restriction
5917            ("call to subprogram cannot appear before its body", N);
5918       end if;
5919
5920       --  Check that this is not a call to a protected procedure or entry from
5921       --  within a protected function.
5922
5923       Check_Internal_Protected_Use (N, Nam);
5924
5925       --  Freeze the subprogram name if not in a spec-expression. Note that
5926       --  we freeze procedure calls as well as function calls. Procedure calls
5927       --  are not frozen according to the rules (RM 13.14(14)) because it is
5928       --  impossible to have a procedure call to a non-frozen procedure in
5929       --  pure Ada, but in the code that we generate in the expander, this
5930       --  rule needs extending because we can generate procedure calls that
5931       --  need freezing.
5932
5933       --  In Ada 2012, expression functions may be called within pre/post
5934       --  conditions of subsequent functions or expression functions. Such
5935       --  calls do not freeze when they appear within generated bodies,
5936       --  (including the body of another expression function) which would
5937       --  place the freeze node in the wrong scope. An expression function
5938       --  is frozen in the usual fashion, by the appearance of a real body,
5939       --  or at the end of a declarative part.
5940
5941       if Is_Entity_Name (Subp) and then not In_Spec_Expression
5942         and then not Is_Expression_Function (Current_Scope)
5943         and then
5944           (not Is_Expression_Function (Entity (Subp))
5945             or else Scope (Entity (Subp)) = Current_Scope)
5946       then
5947          Freeze_Expression (Subp);
5948       end if;
5949
5950       --  For a predefined operator, the type of the result is the type imposed
5951       --  by context, except for a predefined operation on universal fixed.
5952       --  Otherwise The type of the call is the type returned by the subprogram
5953       --  being called.
5954
5955       if Is_Predefined_Op (Nam) then
5956          if Etype (N) /= Universal_Fixed then
5957             Set_Etype (N, Typ);
5958          end if;
5959
5960       --  If the subprogram returns an array type, and the context requires the
5961       --  component type of that array type, the node is really an indexing of
5962       --  the parameterless call. Resolve as such. A pathological case occurs
5963       --  when the type of the component is an access to the array type. In
5964       --  this case the call is truly ambiguous.
5965
5966       elsif (Needs_No_Actuals (Nam) or else Needs_One_Actual (Nam))
5967         and then
5968           ((Is_Array_Type (Etype (Nam))
5969              and then Covers (Typ, Component_Type (Etype (Nam))))
5970            or else
5971              (Is_Access_Type (Etype (Nam))
5972                and then Is_Array_Type (Designated_Type (Etype (Nam)))
5973                and then
5974                  Covers (Typ, Component_Type (Designated_Type (Etype (Nam))))))
5975       then
5976          declare
5977             Index_Node : Node_Id;
5978             New_Subp   : Node_Id;
5979             Ret_Type   : constant Entity_Id := Etype (Nam);
5980
5981          begin
5982             if Is_Access_Type (Ret_Type)
5983               and then Ret_Type = Component_Type (Designated_Type (Ret_Type))
5984             then
5985                Error_Msg_N
5986                  ("cannot disambiguate function call and indexing", N);
5987             else
5988                New_Subp := Relocate_Node (Subp);
5989
5990                --  The called entity may be an explicit dereference, in which
5991                --  case there is no entity to set.
5992
5993                if Nkind (New_Subp) /= N_Explicit_Dereference then
5994                   Set_Entity (Subp, Nam);
5995                end if;
5996
5997                if (Is_Array_Type (Ret_Type)
5998                     and then Component_Type (Ret_Type) /= Any_Type)
5999                  or else
6000                   (Is_Access_Type (Ret_Type)
6001                     and then
6002                       Component_Type (Designated_Type (Ret_Type)) /= Any_Type)
6003                then
6004                   if Needs_No_Actuals (Nam) then
6005
6006                      --  Indexed call to a parameterless function
6007
6008                      Index_Node :=
6009                        Make_Indexed_Component (Loc,
6010                          Prefix      =>
6011                            Make_Function_Call (Loc, Name => New_Subp),
6012                          Expressions => Parameter_Associations (N));
6013                   else
6014                      --  An Ada 2005 prefixed call to a primitive operation
6015                      --  whose first parameter is the prefix. This prefix was
6016                      --  prepended to the parameter list, which is actually a
6017                      --  list of indexes. Remove the prefix in order to build
6018                      --  the proper indexed component.
6019
6020                      Index_Node :=
6021                         Make_Indexed_Component (Loc,
6022                           Prefix       =>
6023                             Make_Function_Call (Loc,
6024                                Name                   => New_Subp,
6025                                Parameter_Associations =>
6026                                  New_List
6027                                    (Remove_Head (Parameter_Associations (N)))),
6028                            Expressions => Parameter_Associations (N));
6029                   end if;
6030
6031                   --  Preserve the parenthesis count of the node
6032
6033                   Set_Paren_Count (Index_Node, Paren_Count (N));
6034
6035                   --  Since we are correcting a node classification error made
6036                   --  by the parser, we call Replace rather than Rewrite.
6037
6038                   Replace (N, Index_Node);
6039
6040                   Set_Etype (Prefix (N), Ret_Type);
6041                   Set_Etype (N, Typ);
6042                   Resolve_Indexed_Component (N, Typ);
6043                   Check_Elab_Call (Prefix (N));
6044                end if;
6045             end if;
6046
6047             return;
6048          end;
6049
6050       else
6051          Set_Etype (N, Etype (Nam));
6052       end if;
6053
6054       --  In the case where the call is to an overloaded subprogram, Analyze
6055       --  calls Normalize_Actuals once per overloaded subprogram. Therefore in
6056       --  such a case Normalize_Actuals needs to be called once more to order
6057       --  the actuals correctly. Otherwise the call will have the ordering
6058       --  given by the last overloaded subprogram whether this is the correct
6059       --  one being called or not.
6060
6061       if Is_Overloaded (Subp) then
6062          Normalize_Actuals (N, Nam, False, Norm_OK);
6063          pragma Assert (Norm_OK);
6064       end if;
6065
6066       --  In any case, call is fully resolved now. Reset Overload flag, to
6067       --  prevent subsequent overload resolution if node is analyzed again
6068
6069       Set_Is_Overloaded (Subp, False);
6070       Set_Is_Overloaded (N, False);
6071
6072       --  A Ghost entity must appear in a specific context
6073
6074       if Is_Ghost_Entity (Nam) and then Comes_From_Source (N) then
6075          Check_Ghost_Context (Nam, N);
6076       end if;
6077
6078       --  If we are calling the current subprogram from immediately within its
6079       --  body, then that is the case where we can sometimes detect cases of
6080       --  infinite recursion statically. Do not try this in case restriction
6081       --  No_Recursion is in effect anyway, and do it only for source calls.
6082
6083       if Comes_From_Source (N) then
6084          Scop := Current_Scope;
6085
6086          --  Check violation of SPARK_05 restriction which does not permit
6087          --  a subprogram body to contain a call to the subprogram directly.
6088
6089          if Restriction_Check_Required (SPARK_05)
6090            and then Same_Or_Aliased_Subprograms (Nam, Scop)
6091          then
6092             Check_SPARK_05_Restriction
6093               ("subprogram may not contain direct call to itself", N);
6094          end if;
6095
6096          --  Issue warning for possible infinite recursion in the absence
6097          --  of the No_Recursion restriction.
6098
6099          if Same_Or_Aliased_Subprograms (Nam, Scop)
6100            and then not Restriction_Active (No_Recursion)
6101            and then Check_Infinite_Recursion (N)
6102          then
6103             --  Here we detected and flagged an infinite recursion, so we do
6104             --  not need to test the case below for further warnings. Also we
6105             --  are all done if we now have a raise SE node.
6106
6107             if Nkind (N) = N_Raise_Storage_Error then
6108                return;
6109             end if;
6110
6111          --  If call is to immediately containing subprogram, then check for
6112          --  the case of a possible run-time detectable infinite recursion.
6113
6114          else
6115             Scope_Loop : while Scop /= Standard_Standard loop
6116                if Same_Or_Aliased_Subprograms (Nam, Scop) then
6117
6118                   --  Although in general case, recursion is not statically
6119                   --  checkable, the case of calling an immediately containing
6120                   --  subprogram is easy to catch.
6121
6122                   Check_Restriction (No_Recursion, N);
6123
6124                   --  If the recursive call is to a parameterless subprogram,
6125                   --  then even if we can't statically detect infinite
6126                   --  recursion, this is pretty suspicious, and we output a
6127                   --  warning. Furthermore, we will try later to detect some
6128                   --  cases here at run time by expanding checking code (see
6129                   --  Detect_Infinite_Recursion in package Exp_Ch6).
6130
6131                   --  If the recursive call is within a handler, do not emit a
6132                   --  warning, because this is a common idiom: loop until input
6133                   --  is correct, catch illegal input in handler and restart.
6134
6135                   if No (First_Formal (Nam))
6136                     and then Etype (Nam) = Standard_Void_Type
6137                     and then not Error_Posted (N)
6138                     and then Nkind (Parent (N)) /= N_Exception_Handler
6139                   then
6140                      --  For the case of a procedure call. We give the message
6141                      --  only if the call is the first statement in a sequence
6142                      --  of statements, or if all previous statements are
6143                      --  simple assignments. This is simply a heuristic to
6144                      --  decrease false positives, without losing too many good
6145                      --  warnings. The idea is that these previous statements
6146                      --  may affect global variables the procedure depends on.
6147                      --  We also exclude raise statements, that may arise from
6148                      --  constraint checks and are probably unrelated to the
6149                      --  intended control flow.
6150
6151                      if Nkind (N) = N_Procedure_Call_Statement
6152                        and then Is_List_Member (N)
6153                      then
6154                         declare
6155                            P : Node_Id;
6156                         begin
6157                            P := Prev (N);
6158                            while Present (P) loop
6159                               if not Nkind_In (P, N_Assignment_Statement,
6160                                                   N_Raise_Constraint_Error)
6161                               then
6162                                  exit Scope_Loop;
6163                               end if;
6164
6165                               Prev (P);
6166                            end loop;
6167                         end;
6168                      end if;
6169
6170                      --  Do not give warning if we are in a conditional context
6171
6172                      declare
6173                         K : constant Node_Kind := Nkind (Parent (N));
6174                      begin
6175                         if (K = N_Loop_Statement
6176                              and then Present (Iteration_Scheme (Parent (N))))
6177                           or else K = N_If_Statement
6178                           or else K = N_Elsif_Part
6179                           or else K = N_Case_Statement_Alternative
6180                         then
6181                            exit Scope_Loop;
6182                         end if;
6183                      end;
6184
6185                      --  Here warning is to be issued
6186
6187                      Set_Has_Recursive_Call (Nam);
6188                      Error_Msg_Warn := SPARK_Mode /= On;
6189                      Error_Msg_N ("possible infinite recursion<<!", N);
6190                      Error_Msg_N ("\Storage_Error ]<<!", N);
6191                   end if;
6192
6193                   exit Scope_Loop;
6194                end if;
6195
6196                Scop := Scope (Scop);
6197             end loop Scope_Loop;
6198          end if;
6199       end if;
6200
6201       --  Check obsolescent reference to Ada.Characters.Handling subprogram
6202
6203       Check_Obsolescent_2005_Entity (Nam, Subp);
6204
6205       --  If subprogram name is a predefined operator, it was given in
6206       --  functional notation. Replace call node with operator node, so
6207       --  that actuals can be resolved appropriately.
6208
6209       if Is_Predefined_Op (Nam) or else Ekind (Nam) = E_Operator then
6210          Make_Call_Into_Operator (N, Typ, Entity (Name (N)));
6211          return;
6212
6213       elsif Present (Alias (Nam))
6214         and then Is_Predefined_Op (Alias (Nam))
6215       then
6216          Resolve_Actuals (N, Nam);
6217          Make_Call_Into_Operator (N, Typ, Alias (Nam));
6218          return;
6219       end if;
6220
6221       --  Create a transient scope if the resulting type requires it
6222
6223       --  There are several notable exceptions:
6224
6225       --  a) In init procs, the transient scope overhead is not needed, and is
6226       --  even incorrect when the call is a nested initialization call for a
6227       --  component whose expansion may generate adjust calls. However, if the
6228       --  call is some other procedure call within an initialization procedure
6229       --  (for example a call to Create_Task in the init_proc of the task
6230       --  run-time record) a transient scope must be created around this call.
6231
6232       --  b) Enumeration literal pseudo-calls need no transient scope
6233
6234       --  c) Intrinsic subprograms (Unchecked_Conversion and source info
6235       --  functions) do not use the secondary stack even though the return
6236       --  type may be unconstrained.
6237
6238       --  d) Calls to a build-in-place function, since such functions may
6239       --  allocate their result directly in a target object, and cases where
6240       --  the result does get allocated in the secondary stack are checked for
6241       --  within the specialized Exp_Ch6 procedures for expanding those
6242       --  build-in-place calls.
6243
6244       --  e) If the subprogram is marked Inline_Always, then even if it returns
6245       --  an unconstrained type the call does not require use of the secondary
6246       --  stack. However, inlining will only take place if the body to inline
6247       --  is already present. It may not be available if e.g. the subprogram is
6248       --  declared in a child instance.
6249
6250       --  If this is an initialization call for a type whose construction
6251       --  uses the secondary stack, and it is not a nested call to initialize
6252       --  a component, we do need to create a transient scope for it. We
6253       --  check for this by traversing the type in Check_Initialization_Call.
6254
6255       if Is_Inlined (Nam)
6256         and then Has_Pragma_Inline (Nam)
6257         and then Nkind (Unit_Declaration_Node (Nam)) = N_Subprogram_Declaration
6258         and then Present (Body_To_Inline (Unit_Declaration_Node (Nam)))
6259       then
6260          null;
6261
6262       elsif Ekind (Nam) = E_Enumeration_Literal
6263         or else Is_Build_In_Place_Function (Nam)
6264         or else Is_Intrinsic_Subprogram (Nam)
6265       then
6266          null;
6267
6268       elsif Expander_Active
6269         and then Is_Type (Etype (Nam))
6270         and then Requires_Transient_Scope (Etype (Nam))
6271         and then
6272           (not Within_Init_Proc
6273             or else
6274               (not Is_Init_Proc (Nam) and then Ekind (Nam) /= E_Function))
6275       then
6276          Establish_Transient_Scope (N, Sec_Stack => True);
6277
6278          --  If the call appears within the bounds of a loop, it will
6279          --  be rewritten and reanalyzed, nothing left to do here.
6280
6281          if Nkind (N) /= N_Function_Call then
6282             return;
6283          end if;
6284
6285       elsif Is_Init_Proc (Nam)
6286         and then not Within_Init_Proc
6287       then
6288          Check_Initialization_Call (N, Nam);
6289       end if;
6290
6291       --  A protected function cannot be called within the definition of the
6292       --  enclosing protected type, unless it is part of a pre/postcondition
6293       --  on another protected operation.
6294
6295       if Is_Protected_Type (Scope (Nam))
6296         and then In_Open_Scopes (Scope (Nam))
6297         and then not Has_Completion (Scope (Nam))
6298         and then not In_Spec_Expression
6299       then
6300          Error_Msg_NE
6301            ("& cannot be called before end of protected definition", N, Nam);
6302       end if;
6303
6304       --  Propagate interpretation to actuals, and add default expressions
6305       --  where needed.
6306
6307       if Present (First_Formal (Nam)) then
6308          Resolve_Actuals (N, Nam);
6309
6310       --  Overloaded literals are rewritten as function calls, for purpose of
6311       --  resolution. After resolution, we can replace the call with the
6312       --  literal itself.
6313
6314       elsif Ekind (Nam) = E_Enumeration_Literal then
6315          Copy_Node (Subp, N);
6316          Resolve_Entity_Name (N, Typ);
6317
6318          --  Avoid validation, since it is a static function call
6319
6320          Generate_Reference (Nam, Subp);
6321          return;
6322       end if;
6323
6324       --  If the subprogram is not global, then kill all saved values and
6325       --  checks. This is a bit conservative, since in many cases we could do
6326       --  better, but it is not worth the effort. Similarly, we kill constant
6327       --  values. However we do not need to do this for internal entities
6328       --  (unless they are inherited user-defined subprograms), since they
6329       --  are not in the business of molesting local values.
6330
6331       --  If the flag Suppress_Value_Tracking_On_Calls is set, then we also
6332       --  kill all checks and values for calls to global subprograms. This
6333       --  takes care of the case where an access to a local subprogram is
6334       --  taken, and could be passed directly or indirectly and then called
6335       --  from almost any context.
6336
6337       --  Note: we do not do this step till after resolving the actuals. That
6338       --  way we still take advantage of the current value information while
6339       --  scanning the actuals.
6340
6341       --  We suppress killing values if we are processing the nodes associated
6342       --  with N_Freeze_Entity nodes. Otherwise the declaration of a tagged
6343       --  type kills all the values as part of analyzing the code that
6344       --  initializes the dispatch tables.
6345
6346       if Inside_Freezing_Actions = 0
6347         and then (not Is_Library_Level_Entity (Nam)
6348                    or else Suppress_Value_Tracking_On_Call
6349                              (Nearest_Dynamic_Scope (Current_Scope)))
6350         and then (Comes_From_Source (Nam)
6351                    or else (Present (Alias (Nam))
6352                              and then Comes_From_Source (Alias (Nam))))
6353       then
6354          Kill_Current_Values;
6355       end if;
6356
6357       --  If we are warning about unread OUT parameters, this is the place to
6358       --  set Last_Assignment for OUT and IN OUT parameters. We have to do this
6359       --  after the above call to Kill_Current_Values (since that call clears
6360       --  the Last_Assignment field of all local variables).
6361
6362       if (Warn_On_Modified_Unread or Warn_On_All_Unread_Out_Parameters)
6363         and then Comes_From_Source (N)
6364         and then In_Extended_Main_Source_Unit (N)
6365       then
6366          declare
6367             F : Entity_Id;
6368             A : Node_Id;
6369
6370          begin
6371             F := First_Formal (Nam);
6372             A := First_Actual (N);
6373             while Present (F) and then Present (A) loop
6374                if Ekind_In (F, E_Out_Parameter, E_In_Out_Parameter)
6375                  and then Warn_On_Modified_As_Out_Parameter (F)
6376                  and then Is_Entity_Name (A)
6377                  and then Present (Entity (A))
6378                  and then Comes_From_Source (N)
6379                  and then Safe_To_Capture_Value (N, Entity (A))
6380                then
6381                   Set_Last_Assignment (Entity (A), A);
6382                end if;
6383
6384                Next_Formal (F);
6385                Next_Actual (A);
6386             end loop;
6387          end;
6388       end if;
6389
6390       --  If the subprogram is a primitive operation, check whether or not
6391       --  it is a correct dispatching call.
6392
6393       if Is_Overloadable (Nam)
6394         and then Is_Dispatching_Operation (Nam)
6395       then
6396          Check_Dispatching_Call (N);
6397
6398       elsif Ekind (Nam) /= E_Subprogram_Type
6399         and then Is_Abstract_Subprogram (Nam)
6400         and then not In_Instance
6401       then
6402          Error_Msg_NE ("cannot call abstract subprogram &!", N, Nam);
6403       end if;
6404
6405       --  If this is a dispatching call, generate the appropriate reference,
6406       --  for better source navigation in GPS.
6407
6408       if Is_Overloadable (Nam)
6409         and then Present (Controlling_Argument (N))
6410       then
6411          Generate_Reference (Nam, Subp, 'R');
6412
6413       --  Normal case, not a dispatching call: generate a call reference
6414
6415       else
6416          Generate_Reference (Nam, Subp, 's');
6417       end if;
6418
6419       if Is_Intrinsic_Subprogram (Nam) then
6420          Check_Intrinsic_Call (N);
6421       end if;
6422
6423       --  Check for violation of restriction No_Specific_Termination_Handlers
6424       --  and warn on a potentially blocking call to Abort_Task.
6425
6426       if Restriction_Check_Required (No_Specific_Termination_Handlers)
6427         and then (Is_RTE (Nam, RE_Set_Specific_Handler)
6428                     or else
6429                   Is_RTE (Nam, RE_Specific_Handler))
6430       then
6431          Check_Restriction (No_Specific_Termination_Handlers, N);
6432
6433       elsif Is_RTE (Nam, RE_Abort_Task) then
6434          Check_Potentially_Blocking_Operation (N);
6435       end if;
6436
6437       --  A call to Ada.Real_Time.Timing_Events.Set_Handler to set a relative
6438       --  timing event violates restriction No_Relative_Delay (AI-0211). We
6439       --  need to check the second argument to determine whether it is an
6440       --  absolute or relative timing event.
6441
6442       if Restriction_Check_Required (No_Relative_Delay)
6443         and then Is_RTE (Nam, RE_Set_Handler)
6444         and then Is_RTE (Etype (Next_Actual (First_Actual (N))), RE_Time_Span)
6445       then
6446          Check_Restriction (No_Relative_Delay, N);
6447       end if;
6448
6449       --  Issue an error for a call to an eliminated subprogram. This routine
6450       --  will not perform the check if the call appears within a default
6451       --  expression.
6452
6453       Check_For_Eliminated_Subprogram (Subp, Nam);
6454
6455       --  In formal mode, the primitive operations of a tagged type or type
6456       --  extension do not include functions that return the tagged type.
6457
6458       if Nkind (N) = N_Function_Call
6459         and then Is_Tagged_Type (Etype (N))
6460         and then Is_Entity_Name (Name (N))
6461         and then Is_Inherited_Operation_For_Type (Entity (Name (N)), Etype (N))
6462       then
6463          Check_SPARK_05_Restriction ("function not inherited", N);
6464       end if;
6465
6466       --  Implement rule in 12.5.1 (23.3/2): In an instance, if the actual is
6467       --  class-wide and the call dispatches on result in a context that does
6468       --  not provide a tag, the call raises Program_Error.
6469
6470       if Nkind (N) = N_Function_Call
6471         and then In_Instance
6472         and then Is_Generic_Actual_Type (Typ)
6473         and then Is_Class_Wide_Type (Typ)
6474         and then Has_Controlling_Result (Nam)
6475         and then Nkind (Parent (N)) = N_Object_Declaration
6476       then
6477          --  Verify that none of the formals are controlling
6478
6479          declare
6480             Call_OK : Boolean := False;
6481             F       : Entity_Id;
6482
6483          begin
6484             F := First_Formal (Nam);
6485             while Present (F) loop
6486                if Is_Controlling_Formal (F) then
6487                   Call_OK := True;
6488                   exit;
6489                end if;
6490
6491                Next_Formal (F);
6492             end loop;
6493
6494             if not Call_OK then
6495                Error_Msg_Warn := SPARK_Mode /= On;
6496                Error_Msg_N ("!cannot determine tag of result<<", N);
6497                Error_Msg_N ("\Program_Error [<<!", N);
6498                Insert_Action (N,
6499                  Make_Raise_Program_Error (Sloc (N),
6500                     Reason => PE_Explicit_Raise));
6501             end if;
6502          end;
6503       end if;
6504
6505       --  Check for calling a function with OUT or IN OUT parameter when the
6506       --  calling context (us right now) is not Ada 2012, so does not allow
6507       --  OUT or IN OUT parameters in function calls.
6508
6509       if Ada_Version < Ada_2012
6510         and then Ekind (Nam) = E_Function
6511         and then Has_Out_Or_In_Out_Parameter (Nam)
6512       then
6513          Error_Msg_NE ("& has at least one OUT or `IN OUT` parameter", N, Nam);
6514          Error_Msg_N ("\call to this function only allowed in Ada 2012", N);
6515       end if;
6516
6517       --  Check the dimensions of the actuals in the call. For function calls,
6518       --  propagate the dimensions from the returned type to N.
6519
6520       Analyze_Dimension_Call (N, Nam);
6521
6522       --  All done, evaluate call and deal with elaboration issues
6523
6524       Eval_Call (N);
6525       Check_Elab_Call (N);
6526
6527       --  In GNATprove mode, expansion is disabled, but we want to inline some
6528       --  subprograms to facilitate formal verification. Indirect calls through
6529       --  a subprogram type or within a generic cannot be inlined. Inlining is
6530       --  performed only for calls subject to SPARK_Mode on.
6531
6532       if GNATprove_Mode
6533         and then SPARK_Mode = On
6534         and then Is_Overloadable (Nam)
6535         and then not Inside_A_Generic
6536       then
6537          Nam_UA   := Ultimate_Alias (Nam);
6538          Nam_Decl := Unit_Declaration_Node (Nam_UA);
6539
6540          if Nkind (Nam_Decl) = N_Subprogram_Declaration then
6541             Body_Id := Corresponding_Body (Nam_Decl);
6542
6543             --  Nothing to do if the subprogram is not eligible for inlining in
6544             --  GNATprove mode.
6545
6546             if not Is_Inlined_Always (Nam_UA)
6547               or else not Can_Be_Inlined_In_GNATprove_Mode (Nam_UA, Body_Id)
6548             then
6549                null;
6550
6551             --  Calls cannot be inlined inside assertions, as GNATprove treats
6552             --  assertions as logic expressions.
6553
6554             elsif In_Assertion_Expr /= 0 then
6555                Error_Msg_NE ("?no contextual analysis of &", N, Nam);
6556                Error_Msg_N ("\call appears in assertion expression", N);
6557                Set_Is_Inlined_Always (Nam_UA, False);
6558
6559             --  Calls cannot be inlined inside default expressions
6560
6561             elsif In_Default_Expr then
6562                Error_Msg_NE ("?no contextual analysis of &", N, Nam);
6563                Error_Msg_N ("\call appears in default expression", N);
6564                Set_Is_Inlined_Always (Nam_UA, False);
6565
6566             --  Inlining should not be performed during pre-analysis
6567
6568             elsif Full_Analysis then
6569
6570                --  With the one-pass inlining technique, a call cannot be
6571                --  inlined if the corresponding body has not been seen yet.
6572
6573                if No (Body_Id) then
6574                   Error_Msg_NE
6575                     ("?no contextual analysis of & (body not seen yet)",
6576                      N, Nam);
6577                   Set_Is_Inlined_Always (Nam_UA, False);
6578
6579                --  Nothing to do if there is no body to inline, indicating that
6580                --  the subprogram is not suitable for inlining in GNATprove
6581                --  mode.
6582
6583                elsif No (Body_To_Inline (Nam_Decl)) then
6584                   null;
6585
6586                --  Calls cannot be inlined inside potentially unevaluated
6587                --  expressions, as this would create complex actions inside
6588                --  expressions, that are not handled by GNATprove.
6589
6590                elsif Is_Potentially_Unevaluated (N) then
6591                   Error_Msg_NE ("?no contextual analysis of &", N, Nam);
6592                   Error_Msg_N
6593                     ("\call appears in potentially unevaluated context", N);
6594                   Set_Is_Inlined_Always (Nam_UA, False);
6595
6596                --  Otherwise, inline the call
6597
6598                else
6599                   Expand_Inlined_Call (N, Nam_UA, Nam);
6600                end if;
6601             end if;
6602          end if;
6603       end if;
6604
6605       Warn_On_Overlapping_Actuals (Nam, N);
6606    end Resolve_Call;
6607
6608    -----------------------------
6609    -- Resolve_Case_Expression --
6610    -----------------------------
6611
6612    procedure Resolve_Case_Expression (N : Node_Id; Typ : Entity_Id) is
6613       Alt : Node_Id;
6614
6615    begin
6616       Alt := First (Alternatives (N));
6617       while Present (Alt) loop
6618          Resolve (Expression (Alt), Typ);
6619          Next (Alt);
6620       end loop;
6621
6622       Set_Etype (N, Typ);
6623       Eval_Case_Expression (N);
6624    end Resolve_Case_Expression;
6625
6626    -------------------------------
6627    -- Resolve_Character_Literal --
6628    -------------------------------
6629
6630    procedure Resolve_Character_Literal (N : Node_Id; Typ : Entity_Id) is
6631       B_Typ : constant Entity_Id := Base_Type (Typ);
6632       C     : Entity_Id;
6633
6634    begin
6635       --  Verify that the character does belong to the type of the context
6636
6637       Set_Etype (N, B_Typ);
6638       Eval_Character_Literal (N);
6639
6640       --  Wide_Wide_Character literals must always be defined, since the set
6641       --  of wide wide character literals is complete, i.e. if a character
6642       --  literal is accepted by the parser, then it is OK for wide wide
6643       --  character (out of range character literals are rejected).
6644
6645       if Root_Type (B_Typ) = Standard_Wide_Wide_Character then
6646          return;
6647
6648       --  Always accept character literal for type Any_Character, which
6649       --  occurs in error situations and in comparisons of literals, both
6650       --  of which should accept all literals.
6651
6652       elsif B_Typ = Any_Character then
6653          return;
6654
6655       --  For Standard.Character or a type derived from it, check that the
6656       --  literal is in range.
6657
6658       elsif Root_Type (B_Typ) = Standard_Character then
6659          if In_Character_Range (UI_To_CC (Char_Literal_Value (N))) then
6660             return;
6661          end if;
6662
6663       --  For Standard.Wide_Character or a type derived from it, check that the
6664       --  literal is in range.
6665
6666       elsif Root_Type (B_Typ) = Standard_Wide_Character then
6667          if In_Wide_Character_Range (UI_To_CC (Char_Literal_Value (N))) then
6668             return;
6669          end if;
6670
6671       --  For Standard.Wide_Wide_Character or a type derived from it, we
6672       --  know the literal is in range, since the parser checked.
6673
6674       elsif Root_Type (B_Typ) = Standard_Wide_Wide_Character then
6675          return;
6676
6677       --  If the entity is already set, this has already been resolved in a
6678       --  generic context, or comes from expansion. Nothing else to do.
6679
6680       elsif Present (Entity (N)) then
6681          return;
6682
6683       --  Otherwise we have a user defined character type, and we can use the
6684       --  standard visibility mechanisms to locate the referenced entity.
6685
6686       else
6687          C := Current_Entity (N);
6688          while Present (C) loop
6689             if Etype (C) = B_Typ then
6690                Set_Entity_With_Checks (N, C);
6691                Generate_Reference (C, N);
6692                return;
6693             end if;
6694
6695             C := Homonym (C);
6696          end loop;
6697       end if;
6698
6699       --  If we fall through, then the literal does not match any of the
6700       --  entries of the enumeration type. This isn't just a constraint error
6701       --  situation, it is an illegality (see RM 4.2).
6702
6703       Error_Msg_NE
6704         ("character not defined for }", N, First_Subtype (B_Typ));
6705    end Resolve_Character_Literal;
6706
6707    ---------------------------
6708    -- Resolve_Comparison_Op --
6709    ---------------------------
6710
6711    --  Context requires a boolean type, and plays no role in resolution.
6712    --  Processing identical to that for equality operators. The result type is
6713    --  the base type, which matters when pathological subtypes of booleans with
6714    --  limited ranges are used.
6715
6716    procedure Resolve_Comparison_Op (N : Node_Id; Typ : Entity_Id) is
6717       L : constant Node_Id := Left_Opnd (N);
6718       R : constant Node_Id := Right_Opnd (N);
6719       T : Entity_Id;
6720
6721    begin
6722       --  If this is an intrinsic operation which is not predefined, use the
6723       --  types of its declared arguments to resolve the possibly overloaded
6724       --  operands. Otherwise the operands are unambiguous and specify the
6725       --  expected type.
6726
6727       if Scope (Entity (N)) /= Standard_Standard then
6728          T := Etype (First_Entity (Entity (N)));
6729
6730       else
6731          T := Find_Unique_Type (L, R);
6732
6733          if T = Any_Fixed then
6734             T := Unique_Fixed_Point_Type (L);
6735          end if;
6736       end if;
6737
6738       Set_Etype (N, Base_Type (Typ));
6739       Generate_Reference (T, N, ' ');
6740
6741       --  Skip remaining processing if already set to Any_Type
6742
6743       if T = Any_Type then
6744          return;
6745       end if;
6746
6747       --  Deal with other error cases
6748
6749       if T = Any_String    or else
6750          T = Any_Composite or else
6751          T = Any_Character
6752       then
6753          if T = Any_Character then
6754             Ambiguous_Character (L);
6755          else
6756             Error_Msg_N ("ambiguous operands for comparison", N);
6757          end if;
6758
6759          Set_Etype (N, Any_Type);
6760          return;
6761       end if;
6762
6763       --  Resolve the operands if types OK
6764
6765       Resolve (L, T);
6766       Resolve (R, T);
6767       Check_Unset_Reference (L);
6768       Check_Unset_Reference (R);
6769       Generate_Operator_Reference (N, T);
6770       Check_Low_Bound_Tested (N);
6771
6772       --  In SPARK, ordering operators <, <=, >, >= are not defined for Boolean
6773       --  types or array types except String.
6774
6775       if Is_Boolean_Type (T) then
6776          Check_SPARK_05_Restriction
6777            ("comparison is not defined on Boolean type", N);
6778
6779       elsif Is_Array_Type (T)
6780         and then Base_Type (T) /= Standard_String
6781       then
6782          Check_SPARK_05_Restriction
6783            ("comparison is not defined on array types other than String", N);
6784       end if;
6785
6786       --  Check comparison on unordered enumeration
6787
6788       if Bad_Unordered_Enumeration_Reference (N, Etype (L)) then
6789          Error_Msg_Sloc := Sloc (Etype (L));
6790          Error_Msg_NE
6791            ("comparison on unordered enumeration type& declared#?U?",
6792             N, Etype (L));
6793       end if;
6794
6795       --  Evaluate the relation (note we do this after the above check since
6796       --  this Eval call may change N to True/False.
6797
6798       Analyze_Dimension (N);
6799       Eval_Relational_Op (N);
6800    end Resolve_Comparison_Op;
6801
6802    -----------------------------------------
6803    -- Resolve_Discrete_Subtype_Indication --
6804    -----------------------------------------
6805
6806    procedure Resolve_Discrete_Subtype_Indication
6807      (N   : Node_Id;
6808       Typ : Entity_Id)
6809    is
6810       R : Node_Id;
6811       S : Entity_Id;
6812
6813    begin
6814       Analyze (Subtype_Mark (N));
6815       S := Entity (Subtype_Mark (N));
6816
6817       if Nkind (Constraint (N)) /= N_Range_Constraint then
6818          Error_Msg_N ("expect range constraint for discrete type", N);
6819          Set_Etype (N, Any_Type);
6820
6821       else
6822          R := Range_Expression (Constraint (N));
6823
6824          if R = Error then
6825             return;
6826          end if;
6827
6828          Analyze (R);
6829
6830          if Base_Type (S) /= Base_Type (Typ) then
6831             Error_Msg_NE
6832               ("expect subtype of }", N, First_Subtype (Typ));
6833
6834             --  Rewrite the constraint as a range of Typ
6835             --  to allow compilation to proceed further.
6836
6837             Set_Etype (N, Typ);
6838             Rewrite (Low_Bound (R),
6839               Make_Attribute_Reference (Sloc (Low_Bound (R)),
6840                 Prefix         => New_Occurrence_Of (Typ, Sloc (R)),
6841                 Attribute_Name => Name_First));
6842             Rewrite (High_Bound (R),
6843               Make_Attribute_Reference (Sloc (High_Bound (R)),
6844                 Prefix         => New_Occurrence_Of (Typ, Sloc (R)),
6845                 Attribute_Name => Name_First));
6846
6847          else
6848             Resolve (R, Typ);
6849             Set_Etype (N, Etype (R));
6850
6851             --  Additionally, we must check that the bounds are compatible
6852             --  with the given subtype, which might be different from the
6853             --  type of the context.
6854
6855             Apply_Range_Check (R, S);
6856
6857             --  ??? If the above check statically detects a Constraint_Error
6858             --  it replaces the offending bound(s) of the range R with a
6859             --  Constraint_Error node. When the itype which uses these bounds
6860             --  is frozen the resulting call to Duplicate_Subexpr generates
6861             --  a new temporary for the bounds.
6862
6863             --  Unfortunately there are other itypes that are also made depend
6864             --  on these bounds, so when Duplicate_Subexpr is called they get
6865             --  a forward reference to the newly created temporaries and Gigi
6866             --  aborts on such forward references. This is probably sign of a
6867             --  more fundamental problem somewhere else in either the order of
6868             --  itype freezing or the way certain itypes are constructed.
6869
6870             --  To get around this problem we call Remove_Side_Effects right
6871             --  away if either bounds of R are a Constraint_Error.
6872
6873             declare
6874                L : constant Node_Id := Low_Bound (R);
6875                H : constant Node_Id := High_Bound (R);
6876
6877             begin
6878                if Nkind (L) = N_Raise_Constraint_Error then
6879                   Remove_Side_Effects (L);
6880                end if;
6881
6882                if Nkind (H) = N_Raise_Constraint_Error then
6883                   Remove_Side_Effects (H);
6884                end if;
6885             end;
6886
6887             Check_Unset_Reference (Low_Bound  (R));
6888             Check_Unset_Reference (High_Bound (R));
6889          end if;
6890       end if;
6891    end Resolve_Discrete_Subtype_Indication;
6892
6893    -------------------------
6894    -- Resolve_Entity_Name --
6895    -------------------------
6896
6897    --  Used to resolve identifiers and expanded names
6898
6899    procedure Resolve_Entity_Name (N : Node_Id; Typ : Entity_Id) is
6900       function Is_OK_Volatile_Context
6901         (Context : Node_Id;
6902          Obj_Ref : Node_Id) return Boolean;
6903       --  Determine whether node Context denotes a "non-interfering context"
6904       --  (as defined in SPARK RM 7.1.3(13)) where volatile reference Obj_Ref
6905       --  can safely reside.
6906
6907       ----------------------------
6908       -- Is_OK_Volatile_Context --
6909       ----------------------------
6910
6911       function Is_OK_Volatile_Context
6912         (Context : Node_Id;
6913          Obj_Ref : Node_Id) return Boolean
6914       is
6915          function Within_Check (Nod : Node_Id) return Boolean;
6916          --  Determine whether an arbitrary node appears in a check node
6917
6918          function Within_Procedure_Call (Nod : Node_Id) return Boolean;
6919          --  Determine whether an arbitrary node appears in a procedure call
6920
6921          ------------------
6922          -- Within_Check --
6923          ------------------
6924
6925          function Within_Check (Nod : Node_Id) return Boolean is
6926             Par : Node_Id;
6927
6928          begin
6929             --  Climb the parent chain looking for a check node
6930
6931             Par := Nod;
6932             while Present (Par) loop
6933                if Nkind (Par) in N_Raise_xxx_Error then
6934                   return True;
6935
6936                --  Prevent the search from going too far
6937
6938                elsif Is_Body_Or_Package_Declaration (Par) then
6939                   exit;
6940                end if;
6941
6942                Par := Parent (Par);
6943             end loop;
6944
6945             return False;
6946          end Within_Check;
6947
6948          ---------------------------
6949          -- Within_Procedure_Call --
6950          ---------------------------
6951
6952          function Within_Procedure_Call (Nod : Node_Id) return Boolean is
6953             Par : Node_Id;
6954
6955          begin
6956             --  Climb the parent chain looking for a procedure call
6957
6958             Par := Nod;
6959             while Present (Par) loop
6960                if Nkind (Par) = N_Procedure_Call_Statement then
6961                   return True;
6962
6963                --  Prevent the search from going too far
6964
6965                elsif Is_Body_Or_Package_Declaration (Par) then
6966                   exit;
6967                end if;
6968
6969                Par := Parent (Par);
6970             end loop;
6971
6972             return False;
6973          end Within_Procedure_Call;
6974
6975       --  Start of processing for Is_OK_Volatile_Context
6976
6977       begin
6978          --  The volatile object appears on either side of an assignment
6979
6980          if Nkind (Context) = N_Assignment_Statement then
6981             return True;
6982
6983          --  The volatile object is part of the initialization expression of
6984          --  another object. Ensure that the climb of the parent chain came
6985          --  from the expression side and not from the name side.
6986
6987          elsif Nkind (Context) = N_Object_Declaration
6988            and then Present (Expression (Context))
6989            and then Expression (Context) = Obj_Ref
6990          then
6991             return True;
6992
6993          --  The volatile object appears as an actual parameter in a call to an
6994          --  instance of Unchecked_Conversion whose result is renamed.
6995
6996          elsif Nkind (Context) = N_Function_Call
6997            and then Is_Unchecked_Conversion_Instance (Entity (Name (Context)))
6998            and then Nkind (Parent (Context)) = N_Object_Renaming_Declaration
6999          then
7000             return True;
7001
7002          --  The volatile object appears as the prefix of a name occurring
7003          --  in a non-interfering context.
7004
7005          elsif Nkind_In (Context, N_Attribute_Reference,
7006                                   N_Indexed_Component,
7007                                   N_Selected_Component,
7008                                   N_Slice)
7009            and then Prefix (Context) = Obj_Ref
7010            and then Is_OK_Volatile_Context
7011                       (Context => Parent (Context),
7012                        Obj_Ref => Context)
7013          then
7014             return True;
7015
7016          --  The volatile object appears as the expression of a type conversion
7017          --  occurring in a non-interfering context.
7018
7019          elsif Nkind_In (Context, N_Type_Conversion,
7020                                   N_Unchecked_Type_Conversion)
7021            and then Expression (Context) = Obj_Ref
7022            and then Is_OK_Volatile_Context
7023                       (Context => Parent (Context),
7024                        Obj_Ref => Context)
7025          then
7026             return True;
7027
7028          --  Allow references to volatile objects in various checks. This is
7029          --  not a direct SPARK 2014 requirement.
7030
7031          elsif Within_Check (Context) then
7032             return True;
7033
7034          --  Assume that references to effectively volatile objects that appear
7035          --  as actual parameters in a procedure call are always legal. A full
7036          --  legality check is done when the actuals are resolved.
7037
7038          elsif Within_Procedure_Call (Context) then
7039             return True;
7040
7041          --  Otherwise the context is not suitable for an effectively volatile
7042          --  object.
7043
7044          else
7045             return False;
7046          end if;
7047       end Is_OK_Volatile_Context;
7048
7049       --  Local variables
7050
7051       E   : constant Entity_Id := Entity (N);
7052       Par : Node_Id;
7053
7054    --  Start of processing for Resolve_Entity_Name
7055
7056    begin
7057       --  If garbage from errors, set to Any_Type and return
7058
7059       if No (E) and then Total_Errors_Detected /= 0 then
7060          Set_Etype (N, Any_Type);
7061          return;
7062       end if;
7063
7064       --  Replace named numbers by corresponding literals. Note that this is
7065       --  the one case where Resolve_Entity_Name must reset the Etype, since
7066       --  it is currently marked as universal.
7067
7068       if Ekind (E) = E_Named_Integer then
7069          Set_Etype (N, Typ);
7070          Eval_Named_Integer (N);
7071
7072       elsif Ekind (E) = E_Named_Real then
7073          Set_Etype (N, Typ);
7074          Eval_Named_Real (N);
7075
7076       --  For enumeration literals, we need to make sure that a proper style
7077       --  check is done, since such literals are overloaded, and thus we did
7078       --  not do a style check during the first phase of analysis.
7079
7080       elsif Ekind (E) = E_Enumeration_Literal then
7081          Set_Entity_With_Checks (N, E);
7082          Eval_Entity_Name (N);
7083
7084       --  Case of subtype name appearing as an operand in expression
7085
7086       elsif Is_Type (E) then
7087
7088          --  Allow use of subtype if it is a concurrent type where we are
7089          --  currently inside the body. This will eventually be expanded into a
7090          --  call to Self (for tasks) or _object (for protected objects). Any
7091          --  other use of a subtype is invalid.
7092
7093          if Is_Concurrent_Type (E)
7094            and then In_Open_Scopes (E)
7095          then
7096             null;
7097
7098          --  Any other use is an error
7099
7100          else
7101             Error_Msg_N
7102                ("invalid use of subtype mark in expression or call", N);
7103          end if;
7104
7105       --  Check discriminant use if entity is discriminant in current scope,
7106       --  i.e. discriminant of record or concurrent type currently being
7107       --  analyzed. Uses in corresponding body are unrestricted.
7108
7109       elsif Ekind (E) = E_Discriminant
7110         and then Scope (E) = Current_Scope
7111         and then not Has_Completion (Current_Scope)
7112       then
7113          Check_Discriminant_Use (N);
7114
7115       --  A parameterless generic function cannot appear in a context that
7116       --  requires resolution.
7117
7118       elsif Ekind (E) = E_Generic_Function then
7119          Error_Msg_N ("illegal use of generic function", N);
7120
7121       elsif Ekind (E) = E_Out_Parameter
7122         and then Ada_Version = Ada_83
7123         and then (Nkind (Parent (N)) in N_Op
7124                    or else (Nkind (Parent (N)) = N_Assignment_Statement
7125                              and then N = Expression (Parent (N)))
7126                    or else Nkind (Parent (N)) = N_Explicit_Dereference)
7127       then
7128          Error_Msg_N ("(Ada 83) illegal reading of out parameter", N);
7129
7130       --  In all other cases, just do the possible static evaluation
7131
7132       else
7133          --  A deferred constant that appears in an expression must have a
7134          --  completion, unless it has been removed by in-place expansion of
7135          --  an aggregate.
7136
7137          if Ekind (E) = E_Constant
7138            and then Comes_From_Source (E)
7139            and then No (Constant_Value (E))
7140            and then Is_Frozen (Etype (E))
7141            and then not In_Spec_Expression
7142            and then not Is_Imported (E)
7143          then
7144             if No_Initialization (Parent (E))
7145               or else (Present (Full_View (E))
7146                         and then No_Initialization (Parent (Full_View (E))))
7147             then
7148                null;
7149             else
7150                Error_Msg_N (
7151                  "deferred constant is frozen before completion", N);
7152             end if;
7153          end if;
7154
7155          Eval_Entity_Name (N);
7156       end if;
7157
7158       Par := Parent (N);
7159
7160       --  When the entity appears in a parameter association, retrieve the
7161       --  related subprogram call.
7162
7163       if Nkind (Par) = N_Parameter_Association then
7164          Par := Parent (Par);
7165       end if;
7166
7167       --  The following checks are only relevant when SPARK_Mode is on as they
7168       --  are not standard Ada legality rules. An effectively volatile object
7169       --  subject to enabled properties Async_Writers or Effective_Reads must
7170       --  appear in a specific context.
7171
7172       if SPARK_Mode = On
7173         and then Is_Object (E)
7174         and then Is_Effectively_Volatile (E)
7175         and then
7176           (Async_Writers_Enabled (E) or else Effective_Reads_Enabled (E))
7177         and then Comes_From_Source (N)
7178       then
7179          --  The effectively volatile objects appears in a "non-interfering
7180          --  context" as defined in SPARK RM 7.1.3(13).
7181
7182          if Is_OK_Volatile_Context (Par, N) then
7183             null;
7184
7185          --  Otherwise the context causes a side effect with respect to the
7186          --  effectively volatile object.
7187
7188          else
7189             SPARK_Msg_N
7190               ("volatile object cannot appear in this context "
7191                & "(SPARK RM 7.1.3(13))", N);
7192          end if;
7193       end if;
7194
7195       --  A Ghost entity must appear in a specific context
7196
7197       if Is_Ghost_Entity (E) and then Comes_From_Source (N) then
7198          Check_Ghost_Context (E, N);
7199       end if;
7200    end Resolve_Entity_Name;
7201
7202    -------------------
7203    -- Resolve_Entry --
7204    -------------------
7205
7206    procedure Resolve_Entry (Entry_Name : Node_Id) is
7207       Loc    : constant Source_Ptr := Sloc (Entry_Name);
7208       Nam    : Entity_Id;
7209       New_N  : Node_Id;
7210       S      : Entity_Id;
7211       Tsk    : Entity_Id;
7212       E_Name : Node_Id;
7213       Index  : Node_Id;
7214
7215       function Actual_Index_Type (E : Entity_Id) return Entity_Id;
7216       --  If the bounds of the entry family being called depend on task
7217       --  discriminants, build a new index subtype where a discriminant is
7218       --  replaced with the value of the discriminant of the target task.
7219       --  The target task is the prefix of the entry name in the call.
7220
7221       -----------------------
7222       -- Actual_Index_Type --
7223       -----------------------
7224
7225       function Actual_Index_Type (E : Entity_Id) return Entity_Id is
7226          Typ   : constant Entity_Id := Entry_Index_Type (E);
7227          Tsk   : constant Entity_Id := Scope (E);
7228          Lo    : constant Node_Id   := Type_Low_Bound  (Typ);
7229          Hi    : constant Node_Id   := Type_High_Bound (Typ);
7230          New_T : Entity_Id;
7231
7232          function Actual_Discriminant_Ref (Bound : Node_Id) return Node_Id;
7233          --  If the bound is given by a discriminant, replace with a reference
7234          --  to the discriminant of the same name in the target task. If the
7235          --  entry name is the target of a requeue statement and the entry is
7236          --  in the current protected object, the bound to be used is the
7237          --  discriminal of the object (see Apply_Range_Checks for details of
7238          --  the transformation).
7239
7240          -----------------------------
7241          -- Actual_Discriminant_Ref --
7242          -----------------------------
7243
7244          function Actual_Discriminant_Ref (Bound : Node_Id) return Node_Id is
7245             Typ : constant Entity_Id := Etype (Bound);
7246             Ref : Node_Id;
7247
7248          begin
7249             Remove_Side_Effects (Bound);
7250
7251             if not Is_Entity_Name (Bound)
7252               or else Ekind (Entity (Bound)) /= E_Discriminant
7253             then
7254                return Bound;
7255
7256             elsif Is_Protected_Type (Tsk)
7257               and then In_Open_Scopes (Tsk)
7258               and then Nkind (Parent (Entry_Name)) = N_Requeue_Statement
7259             then
7260                --  Note: here Bound denotes a discriminant of the corresponding
7261                --  record type tskV, whose discriminal is a formal of the
7262                --  init-proc tskVIP. What we want is the body discriminal,
7263                --  which is associated to the discriminant of the original
7264                --  concurrent type tsk.
7265
7266                return New_Occurrence_Of
7267                         (Find_Body_Discriminal (Entity (Bound)), Loc);
7268
7269             else
7270                Ref :=
7271                  Make_Selected_Component (Loc,
7272                    Prefix => New_Copy_Tree (Prefix (Prefix (Entry_Name))),
7273                    Selector_Name => New_Occurrence_Of (Entity (Bound), Loc));
7274                Analyze (Ref);
7275                Resolve (Ref, Typ);
7276                return Ref;
7277             end if;
7278          end Actual_Discriminant_Ref;
7279
7280       --  Start of processing for Actual_Index_Type
7281
7282       begin
7283          if not Has_Discriminants (Tsk)
7284            or else (not Is_Entity_Name (Lo) and then not Is_Entity_Name (Hi))
7285          then
7286             return Entry_Index_Type (E);
7287
7288          else
7289             New_T := Create_Itype (Ekind (Typ), Parent (Entry_Name));
7290             Set_Etype        (New_T, Base_Type (Typ));
7291             Set_Size_Info    (New_T, Typ);
7292             Set_RM_Size      (New_T, RM_Size (Typ));
7293             Set_Scalar_Range (New_T,
7294               Make_Range (Sloc (Entry_Name),
7295                 Low_Bound  => Actual_Discriminant_Ref (Lo),
7296                 High_Bound => Actual_Discriminant_Ref (Hi)));
7297
7298             return New_T;
7299          end if;
7300       end Actual_Index_Type;
7301
7302    --  Start of processing of Resolve_Entry
7303
7304    begin
7305       --  Find name of entry being called, and resolve prefix of name with its
7306       --  own type. The prefix can be overloaded, and the name and signature of
7307       --  the entry must be taken into account.
7308
7309       if Nkind (Entry_Name) = N_Indexed_Component then
7310
7311          --  Case of dealing with entry family within the current tasks
7312
7313          E_Name := Prefix (Entry_Name);
7314
7315       else
7316          E_Name := Entry_Name;
7317       end if;
7318
7319       if Is_Entity_Name (E_Name) then
7320
7321          --  Entry call to an entry (or entry family) in the current task. This
7322          --  is legal even though the task will deadlock. Rewrite as call to
7323          --  current task.
7324
7325          --  This can also be a call to an entry in an enclosing task. If this
7326          --  is a single task, we have to retrieve its name, because the scope
7327          --  of the entry is the task type, not the object. If the enclosing
7328          --  task is a task type, the identity of the task is given by its own
7329          --  self variable.
7330
7331          --  Finally this can be a requeue on an entry of the same task or
7332          --  protected object.
7333
7334          S := Scope (Entity (E_Name));
7335
7336          for J in reverse 0 .. Scope_Stack.Last loop
7337             if Is_Task_Type (Scope_Stack.Table (J).Entity)
7338               and then not Comes_From_Source (S)
7339             then
7340                --  S is an enclosing task or protected object. The concurrent
7341                --  declaration has been converted into a type declaration, and
7342                --  the object itself has an object declaration that follows
7343                --  the type in the same declarative part.
7344
7345                Tsk := Next_Entity (S);
7346                while Etype (Tsk) /= S loop
7347                   Next_Entity (Tsk);
7348                end loop;
7349
7350                S := Tsk;
7351                exit;
7352
7353             elsif S = Scope_Stack.Table (J).Entity then
7354
7355                --  Call to current task. Will be transformed into call to Self
7356
7357                exit;
7358
7359             end if;
7360          end loop;
7361
7362          New_N :=
7363            Make_Selected_Component (Loc,
7364              Prefix => New_Occurrence_Of (S, Loc),
7365              Selector_Name =>
7366                New_Occurrence_Of (Entity (E_Name), Loc));
7367          Rewrite (E_Name, New_N);
7368          Analyze (E_Name);
7369
7370       elsif Nkind (Entry_Name) = N_Selected_Component
7371         and then Is_Overloaded (Prefix (Entry_Name))
7372       then
7373          --  Use the entry name (which must be unique at this point) to find
7374          --  the prefix that returns the corresponding task/protected type.
7375
7376          declare
7377             Pref : constant Node_Id := Prefix (Entry_Name);
7378             Ent  : constant Entity_Id :=  Entity (Selector_Name (Entry_Name));
7379             I    : Interp_Index;
7380             It   : Interp;
7381
7382          begin
7383             Get_First_Interp (Pref, I, It);
7384             while Present (It.Typ) loop
7385                if Scope (Ent) = It.Typ then
7386                   Set_Etype (Pref, It.Typ);
7387                   exit;
7388                end if;
7389
7390                Get_Next_Interp (I, It);
7391             end loop;
7392          end;
7393       end if;
7394
7395       if Nkind (Entry_Name) = N_Selected_Component then
7396          Resolve (Prefix (Entry_Name));
7397
7398       else pragma Assert (Nkind (Entry_Name) = N_Indexed_Component);
7399          Nam := Entity (Selector_Name (Prefix (Entry_Name)));
7400          Resolve (Prefix (Prefix (Entry_Name)));
7401          Index :=  First (Expressions (Entry_Name));
7402          Resolve (Index, Entry_Index_Type (Nam));
7403
7404          --  Up to this point the expression could have been the actual in a
7405          --  simple entry call, and be given by a named association.
7406
7407          if Nkind (Index) = N_Parameter_Association then
7408             Error_Msg_N ("expect expression for entry index", Index);
7409          else
7410             Apply_Range_Check (Index, Actual_Index_Type (Nam));
7411          end if;
7412       end if;
7413    end Resolve_Entry;
7414
7415    ------------------------
7416    -- Resolve_Entry_Call --
7417    ------------------------
7418
7419    procedure Resolve_Entry_Call (N : Node_Id; Typ : Entity_Id) is
7420       Entry_Name  : constant Node_Id    := Name (N);
7421       Loc         : constant Source_Ptr := Sloc (Entry_Name);
7422       Actuals     : List_Id;
7423       First_Named : Node_Id;
7424       Nam         : Entity_Id;
7425       Norm_OK     : Boolean;
7426       Obj         : Node_Id;
7427       Was_Over    : Boolean;
7428
7429    begin
7430       --  We kill all checks here, because it does not seem worth the effort to
7431       --  do anything better, an entry call is a big operation.
7432
7433       Kill_All_Checks;
7434
7435       --  Processing of the name is similar for entry calls and protected
7436       --  operation calls. Once the entity is determined, we can complete
7437       --  the resolution of the actuals.
7438
7439       --  The selector may be overloaded, in the case of a protected object
7440       --  with overloaded functions. The type of the context is used for
7441       --  resolution.
7442
7443       if Nkind (Entry_Name) = N_Selected_Component
7444         and then Is_Overloaded (Selector_Name (Entry_Name))
7445         and then Typ /= Standard_Void_Type
7446       then
7447          declare
7448             I  : Interp_Index;
7449             It : Interp;
7450
7451          begin
7452             Get_First_Interp (Selector_Name (Entry_Name), I, It);
7453             while Present (It.Typ) loop
7454                if Covers (Typ, It.Typ) then
7455                   Set_Entity (Selector_Name (Entry_Name), It.Nam);
7456                   Set_Etype  (Entry_Name, It.Typ);
7457
7458                   Generate_Reference (It.Typ, N, ' ');
7459                end if;
7460
7461                Get_Next_Interp (I, It);
7462             end loop;
7463          end;
7464       end if;
7465
7466       Resolve_Entry (Entry_Name);
7467
7468       if Nkind (Entry_Name) = N_Selected_Component then
7469
7470          --  Simple entry call
7471
7472          Nam := Entity (Selector_Name (Entry_Name));
7473          Obj := Prefix (Entry_Name);
7474          Was_Over := Is_Overloaded (Selector_Name (Entry_Name));
7475
7476       else pragma Assert (Nkind (Entry_Name) = N_Indexed_Component);
7477
7478          --  Call to member of entry family
7479
7480          Nam := Entity (Selector_Name (Prefix (Entry_Name)));
7481          Obj := Prefix (Prefix (Entry_Name));
7482          Was_Over := Is_Overloaded (Selector_Name (Prefix (Entry_Name)));
7483       end if;
7484
7485       --  We cannot in general check the maximum depth of protected entry calls
7486       --  at compile time. But we can tell that any protected entry call at all
7487       --  violates a specified nesting depth of zero.
7488
7489       if Is_Protected_Type (Scope (Nam)) then
7490          Check_Restriction (Max_Entry_Queue_Length, N);
7491       end if;
7492
7493       --  Use context type to disambiguate a protected function that can be
7494       --  called without actuals and that returns an array type, and where the
7495       --  argument list may be an indexing of the returned value.
7496
7497       if Ekind (Nam) = E_Function
7498         and then Needs_No_Actuals (Nam)
7499         and then Present (Parameter_Associations (N))
7500         and then
7501           ((Is_Array_Type (Etype (Nam))
7502              and then Covers (Typ, Component_Type (Etype (Nam))))
7503
7504             or else (Is_Access_Type (Etype (Nam))
7505                       and then Is_Array_Type (Designated_Type (Etype (Nam)))
7506                       and then
7507                         Covers
7508                          (Typ,
7509                           Component_Type (Designated_Type (Etype (Nam))))))
7510       then
7511          declare
7512             Index_Node : Node_Id;
7513
7514          begin
7515             Index_Node :=
7516               Make_Indexed_Component (Loc,
7517                 Prefix =>
7518                   Make_Function_Call (Loc, Name => Relocate_Node (Entry_Name)),
7519                 Expressions => Parameter_Associations (N));
7520
7521             --  Since we are correcting a node classification error made by the
7522             --  parser, we call Replace rather than Rewrite.
7523
7524             Replace (N, Index_Node);
7525             Set_Etype (Prefix (N), Etype (Nam));
7526             Set_Etype (N, Typ);
7527             Resolve_Indexed_Component (N, Typ);
7528             return;
7529          end;
7530       end if;
7531
7532       if Ekind_In (Nam, E_Entry, E_Entry_Family)
7533         and then Present (PPC_Wrapper (Nam))
7534         and then Current_Scope /= PPC_Wrapper (Nam)
7535       then
7536          --  Rewrite as call to the precondition wrapper, adding the task
7537          --  object to the list of actuals. If the call is to a member of an
7538          --  entry family, include the index as well.
7539
7540          declare
7541             New_Call    : Node_Id;
7542             New_Actuals : List_Id;
7543
7544          begin
7545             New_Actuals := New_List (Obj);
7546
7547             if  Nkind (Entry_Name) = N_Indexed_Component then
7548                Append_To (New_Actuals,
7549                  New_Copy_Tree (First (Expressions (Entry_Name))));
7550             end if;
7551
7552             Append_List (Parameter_Associations (N), New_Actuals);
7553             New_Call :=
7554               Make_Procedure_Call_Statement (Loc,
7555                 Name                   =>
7556                   New_Occurrence_Of (PPC_Wrapper (Nam), Loc),
7557                 Parameter_Associations => New_Actuals);
7558             Rewrite (N, New_Call);
7559
7560             --  Preanalyze and resolve new call. Current procedure is called
7561             --  from Resolve_Call, after which expansion will take place.
7562
7563             Preanalyze_And_Resolve (N);
7564             return;
7565          end;
7566       end if;
7567
7568       --  The operation name may have been overloaded. Order the actuals
7569       --  according to the formals of the resolved entity, and set the return
7570       --  type to that of the operation.
7571
7572       if Was_Over then
7573          Normalize_Actuals (N, Nam, False, Norm_OK);
7574          pragma Assert (Norm_OK);
7575          Set_Etype (N, Etype (Nam));
7576       end if;
7577
7578       Resolve_Actuals (N, Nam);
7579       Check_Internal_Protected_Use (N, Nam);
7580
7581       --  Create a call reference to the entry
7582
7583       Generate_Reference (Nam, Entry_Name, 's');
7584
7585       if Ekind_In (Nam, E_Entry, E_Entry_Family) then
7586          Check_Potentially_Blocking_Operation (N);
7587       end if;
7588
7589       --  Verify that a procedure call cannot masquerade as an entry
7590       --  call where an entry call is expected.
7591
7592       if Ekind (Nam) = E_Procedure then
7593          if Nkind (Parent (N)) = N_Entry_Call_Alternative
7594            and then N = Entry_Call_Statement (Parent (N))
7595          then
7596             Error_Msg_N ("entry call required in select statement", N);
7597
7598          elsif Nkind (Parent (N)) = N_Triggering_Alternative
7599            and then N = Triggering_Statement (Parent (N))
7600          then
7601             Error_Msg_N ("triggering statement cannot be procedure call", N);
7602
7603          elsif Ekind (Scope (Nam)) = E_Task_Type
7604            and then not In_Open_Scopes (Scope (Nam))
7605          then
7606             Error_Msg_N ("task has no entry with this name", Entry_Name);
7607          end if;
7608       end if;
7609
7610       --  After resolution, entry calls and protected procedure calls are
7611       --  changed into entry calls, for expansion. The structure of the node
7612       --  does not change, so it can safely be done in place. Protected
7613       --  function calls must keep their structure because they are
7614       --  subexpressions.
7615
7616       if Ekind (Nam) /= E_Function then
7617
7618          --  A protected operation that is not a function may modify the
7619          --  corresponding object, and cannot apply to a constant. If this
7620          --  is an internal call, the prefix is the type itself.
7621
7622          if Is_Protected_Type (Scope (Nam))
7623            and then not Is_Variable (Obj)
7624            and then (not Is_Entity_Name (Obj)
7625                        or else not Is_Type (Entity (Obj)))
7626          then
7627             Error_Msg_N
7628               ("prefix of protected procedure or entry call must be variable",
7629                Entry_Name);
7630          end if;
7631
7632          Actuals := Parameter_Associations (N);
7633          First_Named := First_Named_Actual (N);
7634
7635          Rewrite (N,
7636            Make_Entry_Call_Statement (Loc,
7637              Name                   => Entry_Name,
7638              Parameter_Associations => Actuals));
7639
7640          Set_First_Named_Actual (N, First_Named);
7641          Set_Analyzed (N, True);
7642
7643       --  Protected functions can return on the secondary stack, in which
7644       --  case we must trigger the transient scope mechanism.
7645
7646       elsif Expander_Active
7647         and then Requires_Transient_Scope (Etype (Nam))
7648       then
7649          Establish_Transient_Scope (N, Sec_Stack => True);
7650       end if;
7651    end Resolve_Entry_Call;
7652
7653    -------------------------
7654    -- Resolve_Equality_Op --
7655    -------------------------
7656
7657    --  Both arguments must have the same type, and the boolean context does
7658    --  not participate in the resolution. The first pass verifies that the
7659    --  interpretation is not ambiguous, and the type of the left argument is
7660    --  correctly set, or is Any_Type in case of ambiguity. If both arguments
7661    --  are strings or aggregates, allocators, or Null, they are ambiguous even
7662    --  though they carry a single (universal) type. Diagnose this case here.
7663
7664    procedure Resolve_Equality_Op (N : Node_Id; Typ : Entity_Id) is
7665       L : constant Node_Id   := Left_Opnd (N);
7666       R : constant Node_Id   := Right_Opnd (N);
7667       T : Entity_Id := Find_Unique_Type (L, R);
7668
7669       procedure Check_If_Expression (Cond : Node_Id);
7670       --  The resolution rule for if expressions requires that each such must
7671       --  have a unique type. This means that if several dependent expressions
7672       --  are of a non-null anonymous access type, and the context does not
7673       --  impose an expected type (as can be the case in an equality operation)
7674       --  the expression must be rejected.
7675
7676       procedure Explain_Redundancy (N : Node_Id);
7677       --  Attempt to explain the nature of a redundant comparison with True. If
7678       --  the expression N is too complex, this routine issues a general error
7679       --  message.
7680
7681       function Find_Unique_Access_Type return Entity_Id;
7682       --  In the case of allocators and access attributes, the context must
7683       --  provide an indication of the specific access type to be used. If
7684       --  one operand is of such a "generic" access type, check whether there
7685       --  is a specific visible access type that has the same designated type.
7686       --  This is semantically dubious, and of no interest to any real code,
7687       --  but c48008a makes it all worthwhile.
7688
7689       -------------------------
7690       -- Check_If_Expression --
7691       -------------------------
7692
7693       procedure Check_If_Expression (Cond : Node_Id) is
7694          Then_Expr : Node_Id;
7695          Else_Expr : Node_Id;
7696
7697       begin
7698          if Nkind (Cond) = N_If_Expression then
7699             Then_Expr := Next (First (Expressions (Cond)));
7700             Else_Expr := Next (Then_Expr);
7701
7702             if Nkind (Then_Expr) /= N_Null
7703               and then Nkind (Else_Expr) /= N_Null
7704             then
7705                Error_Msg_N ("cannot determine type of if expression", Cond);
7706             end if;
7707          end if;
7708       end Check_If_Expression;
7709
7710       ------------------------
7711       -- Explain_Redundancy --
7712       ------------------------
7713
7714       procedure Explain_Redundancy (N : Node_Id) is
7715          Error  : Name_Id;
7716          Val    : Node_Id;
7717          Val_Id : Entity_Id;
7718
7719       begin
7720          Val := N;
7721
7722          --  Strip the operand down to an entity
7723
7724          loop
7725             if Nkind (Val) = N_Selected_Component then
7726                Val := Selector_Name (Val);
7727             else
7728                exit;
7729             end if;
7730          end loop;
7731
7732          --  The construct denotes an entity
7733
7734          if Is_Entity_Name (Val) and then Present (Entity (Val)) then
7735             Val_Id := Entity (Val);
7736
7737             --  Do not generate an error message when the comparison is done
7738             --  against the enumeration literal Standard.True.
7739
7740             if Ekind (Val_Id) /= E_Enumeration_Literal then
7741
7742                --  Build a customized error message
7743
7744                Name_Len := 0;
7745                Add_Str_To_Name_Buffer ("?r?");
7746
7747                if Ekind (Val_Id) = E_Component then
7748                   Add_Str_To_Name_Buffer ("component ");
7749
7750                elsif Ekind (Val_Id) = E_Constant then
7751                   Add_Str_To_Name_Buffer ("constant ");
7752
7753                elsif Ekind (Val_Id) = E_Discriminant then
7754                   Add_Str_To_Name_Buffer ("discriminant ");
7755
7756                elsif Is_Formal (Val_Id) then
7757                   Add_Str_To_Name_Buffer ("parameter ");
7758
7759                elsif Ekind (Val_Id) = E_Variable then
7760                   Add_Str_To_Name_Buffer ("variable ");
7761                end if;
7762
7763                Add_Str_To_Name_Buffer ("& is always True!");
7764                Error := Name_Find;
7765
7766                Error_Msg_NE (Get_Name_String (Error), Val, Val_Id);
7767             end if;
7768
7769          --  The construct is too complex to disect, issue a general message
7770
7771          else
7772             Error_Msg_N ("?r?expression is always True!", Val);
7773          end if;
7774       end Explain_Redundancy;
7775
7776       -----------------------------
7777       -- Find_Unique_Access_Type --
7778       -----------------------------
7779
7780       function Find_Unique_Access_Type return Entity_Id is
7781          Acc : Entity_Id;
7782          E   : Entity_Id;
7783          S   : Entity_Id;
7784
7785       begin
7786          if Ekind_In (Etype (R), E_Allocator_Type,
7787                                  E_Access_Attribute_Type)
7788          then
7789             Acc := Designated_Type (Etype (R));
7790
7791          elsif Ekind_In (Etype (L), E_Allocator_Type,
7792                                     E_Access_Attribute_Type)
7793          then
7794             Acc := Designated_Type (Etype (L));
7795          else
7796             return Empty;
7797          end if;
7798
7799          S := Current_Scope;
7800          while S /= Standard_Standard loop
7801             E := First_Entity (S);
7802             while Present (E) loop
7803                if Is_Type (E)
7804                  and then Is_Access_Type (E)
7805                  and then Ekind (E) /= E_Allocator_Type
7806                  and then Designated_Type (E) = Base_Type (Acc)
7807                then
7808                   return E;
7809                end if;
7810
7811                Next_Entity (E);
7812             end loop;
7813
7814             S := Scope (S);
7815          end loop;
7816
7817          return Empty;
7818       end Find_Unique_Access_Type;
7819
7820    --  Start of processing for Resolve_Equality_Op
7821
7822    begin
7823       Set_Etype (N, Base_Type (Typ));
7824       Generate_Reference (T, N, ' ');
7825
7826       if T = Any_Fixed then
7827          T := Unique_Fixed_Point_Type (L);
7828       end if;
7829
7830       if T /= Any_Type then
7831          if T = Any_String    or else
7832             T = Any_Composite or else
7833             T = Any_Character
7834          then
7835             if T = Any_Character then
7836                Ambiguous_Character (L);
7837             else
7838                Error_Msg_N ("ambiguous operands for equality", N);
7839             end if;
7840
7841             Set_Etype (N, Any_Type);
7842             return;
7843
7844          elsif T = Any_Access
7845            or else Ekind_In (T, E_Allocator_Type, E_Access_Attribute_Type)
7846          then
7847             T := Find_Unique_Access_Type;
7848
7849             if No (T) then
7850                Error_Msg_N ("ambiguous operands for equality", N);
7851                Set_Etype (N, Any_Type);
7852                return;
7853             end if;
7854
7855          --  If expressions must have a single type, and if the context does
7856          --  not impose one the dependent expressions cannot be anonymous
7857          --  access types.
7858
7859          --  Why no similar processing for case expressions???
7860
7861          elsif Ada_Version >= Ada_2012
7862            and then Ekind_In (Etype (L), E_Anonymous_Access_Type,
7863                                          E_Anonymous_Access_Subprogram_Type)
7864            and then Ekind_In (Etype (R), E_Anonymous_Access_Type,
7865                                          E_Anonymous_Access_Subprogram_Type)
7866          then
7867             Check_If_Expression (L);
7868             Check_If_Expression (R);
7869          end if;
7870
7871          Resolve (L, T);
7872          Resolve (R, T);
7873
7874          --  In SPARK, equality operators = and /= for array types other than
7875          --  String are only defined when, for each index position, the
7876          --  operands have equal static bounds.
7877
7878          if Is_Array_Type (T) then
7879
7880             --  Protect call to Matching_Static_Array_Bounds to avoid costly
7881             --  operation if not needed.
7882
7883             if Restriction_Check_Required (SPARK_05)
7884               and then Base_Type (T) /= Standard_String
7885               and then Base_Type (Etype (L)) = Base_Type (Etype (R))
7886               and then Etype (L) /= Any_Composite  --  or else L in error
7887               and then Etype (R) /= Any_Composite  --  or else R in error
7888               and then not Matching_Static_Array_Bounds (Etype (L), Etype (R))
7889             then
7890                Check_SPARK_05_Restriction
7891                  ("array types should have matching static bounds", N);
7892             end if;
7893          end if;
7894
7895          --  If the unique type is a class-wide type then it will be expanded
7896          --  into a dispatching call to the predefined primitive. Therefore we
7897          --  check here for potential violation of such restriction.
7898
7899          if Is_Class_Wide_Type (T) then
7900             Check_Restriction (No_Dispatching_Calls, N);
7901          end if;
7902
7903          if Warn_On_Redundant_Constructs
7904            and then Comes_From_Source (N)
7905            and then Comes_From_Source (R)
7906            and then Is_Entity_Name (R)
7907            and then Entity (R) = Standard_True
7908          then
7909             Error_Msg_N -- CODEFIX
7910               ("?r?comparison with True is redundant!", N);
7911             Explain_Redundancy (Original_Node (R));
7912          end if;
7913
7914          Check_Unset_Reference (L);
7915          Check_Unset_Reference (R);
7916          Generate_Operator_Reference (N, T);
7917          Check_Low_Bound_Tested (N);
7918
7919          --  If this is an inequality, it may be the implicit inequality
7920          --  created for a user-defined operation, in which case the corres-
7921          --  ponding equality operation is not intrinsic, and the operation
7922          --  cannot be constant-folded. Else fold.
7923
7924          if Nkind (N) = N_Op_Eq
7925            or else Comes_From_Source (Entity (N))
7926            or else Ekind (Entity (N)) = E_Operator
7927            or else Is_Intrinsic_Subprogram
7928                      (Corresponding_Equality (Entity (N)))
7929          then
7930             Analyze_Dimension (N);
7931             Eval_Relational_Op (N);
7932
7933          elsif Nkind (N) = N_Op_Ne
7934            and then Is_Abstract_Subprogram (Entity (N))
7935          then
7936             Error_Msg_NE ("cannot call abstract subprogram &!", N, Entity (N));
7937          end if;
7938
7939          --  Ada 2005: If one operand is an anonymous access type, convert the
7940          --  other operand to it, to ensure that the underlying types match in
7941          --  the back-end. Same for access_to_subprogram, and the conversion
7942          --  verifies that the types are subtype conformant.
7943
7944          --  We apply the same conversion in the case one of the operands is a
7945          --  private subtype of the type of the other.
7946
7947          --  Why the Expander_Active test here ???
7948
7949          if Expander_Active
7950            and then
7951              (Ekind_In (T, E_Anonymous_Access_Type,
7952                            E_Anonymous_Access_Subprogram_Type)
7953                or else Is_Private_Type (T))
7954          then
7955             if Etype (L) /= T then
7956                Rewrite (L,
7957                  Make_Unchecked_Type_Conversion (Sloc (L),
7958                    Subtype_Mark => New_Occurrence_Of (T, Sloc (L)),
7959                    Expression   => Relocate_Node (L)));
7960                Analyze_And_Resolve (L, T);
7961             end if;
7962
7963             if (Etype (R)) /= T then
7964                Rewrite (R,
7965                   Make_Unchecked_Type_Conversion (Sloc (R),
7966                     Subtype_Mark => New_Occurrence_Of (Etype (L), Sloc (R)),
7967                     Expression   => Relocate_Node (R)));
7968                Analyze_And_Resolve (R, T);
7969             end if;
7970          end if;
7971       end if;
7972    end Resolve_Equality_Op;
7973
7974    ----------------------------------
7975    -- Resolve_Explicit_Dereference --
7976    ----------------------------------
7977
7978    procedure Resolve_Explicit_Dereference (N : Node_Id; Typ : Entity_Id) is
7979       Loc   : constant Source_Ptr := Sloc (N);
7980       New_N : Node_Id;
7981       P     : constant Node_Id := Prefix (N);
7982
7983       P_Typ : Entity_Id;
7984       --  The candidate prefix type, if overloaded
7985
7986       I     : Interp_Index;
7987       It    : Interp;
7988
7989    begin
7990       Check_Fully_Declared_Prefix (Typ, P);
7991       P_Typ := Empty;
7992
7993       --  A useful optimization:  check whether the dereference denotes an
7994       --  element of a container, and if so rewrite it as a call to the
7995       --  corresponding Element function.
7996
7997       --  Disabled for now, on advice of ARG. A more restricted form of the
7998       --  predicate might be acceptable ???
7999
8000       --  if Is_Container_Element (N) then
8001       --     return;
8002       --  end if;
8003
8004       if Is_Overloaded (P) then
8005
8006          --  Use the context type to select the prefix that has the correct
8007          --  designated type. Keep the first match, which will be the inner-
8008          --  most.
8009
8010          Get_First_Interp (P, I, It);
8011
8012          while Present (It.Typ) loop
8013             if Is_Access_Type (It.Typ)
8014               and then Covers (Typ, Designated_Type (It.Typ))
8015             then
8016                if No (P_Typ) then
8017                   P_Typ := It.Typ;
8018                end if;
8019
8020             --  Remove access types that do not match, but preserve access
8021             --  to subprogram interpretations, in case a further dereference
8022             --  is needed (see below).
8023
8024             elsif Ekind (It.Typ) /= E_Access_Subprogram_Type then
8025                Remove_Interp (I);
8026             end if;
8027
8028             Get_Next_Interp (I, It);
8029          end loop;
8030
8031          if Present (P_Typ) then
8032             Resolve (P, P_Typ);
8033             Set_Etype (N, Designated_Type (P_Typ));
8034
8035          else
8036             --  If no interpretation covers the designated type of the prefix,
8037             --  this is the pathological case where not all implementations of
8038             --  the prefix allow the interpretation of the node as a call. Now
8039             --  that the expected type is known, Remove other interpretations
8040             --  from prefix, rewrite it as a call, and resolve again, so that
8041             --  the proper call node is generated.
8042
8043             Get_First_Interp (P, I, It);
8044             while Present (It.Typ) loop
8045                if Ekind (It.Typ) /= E_Access_Subprogram_Type then
8046                   Remove_Interp (I);
8047                end if;
8048
8049                Get_Next_Interp (I, It);
8050             end loop;
8051
8052             New_N :=
8053               Make_Function_Call (Loc,
8054                 Name =>
8055                   Make_Explicit_Dereference (Loc,
8056                     Prefix => P),
8057                 Parameter_Associations => New_List);
8058
8059             Save_Interps (N, New_N);
8060             Rewrite (N, New_N);
8061             Analyze_And_Resolve (N, Typ);
8062             return;
8063          end if;
8064
8065       --  If not overloaded, resolve P with its own type
8066
8067       else
8068          Resolve (P);
8069       end if;
8070
8071       if Is_Access_Type (Etype (P)) then
8072          Apply_Access_Check (N);
8073       end if;
8074
8075       --  If the designated type is a packed unconstrained array type, and the
8076       --  explicit dereference is not in the context of an attribute reference,
8077       --  then we must compute and set the actual subtype, since it is needed
8078       --  by Gigi. The reason we exclude the attribute case is that this is
8079       --  handled fine by Gigi, and in fact we use such attributes to build the
8080       --  actual subtype. We also exclude generated code (which builds actual
8081       --  subtypes directly if they are needed).
8082
8083       if Is_Array_Type (Etype (N))
8084         and then Is_Packed (Etype (N))
8085         and then not Is_Constrained (Etype (N))
8086         and then Nkind (Parent (N)) /= N_Attribute_Reference
8087         and then Comes_From_Source (N)
8088       then
8089          Set_Etype (N, Get_Actual_Subtype (N));
8090       end if;
8091
8092       --  Note: No Eval processing is required for an explicit dereference,
8093       --  because such a name can never be static.
8094
8095    end Resolve_Explicit_Dereference;
8096
8097    -------------------------------------
8098    -- Resolve_Expression_With_Actions --
8099    -------------------------------------
8100
8101    procedure Resolve_Expression_With_Actions (N : Node_Id; Typ : Entity_Id) is
8102    begin
8103       Set_Etype (N, Typ);
8104
8105       --  If N has no actions, and its expression has been constant folded,
8106       --  then rewrite N as just its expression. Note, we can't do this in
8107       --  the general case of Is_Empty_List (Actions (N)) as this would cause
8108       --  Expression (N) to be expanded again.
8109
8110       if Is_Empty_List (Actions (N))
8111         and then Compile_Time_Known_Value (Expression (N))
8112       then
8113          Rewrite (N, Expression (N));
8114       end if;
8115    end Resolve_Expression_With_Actions;
8116
8117    ----------------------------------
8118    -- Resolve_Generalized_Indexing --
8119    ----------------------------------
8120
8121    procedure Resolve_Generalized_Indexing (N : Node_Id; Typ : Entity_Id) is
8122       Indexing : constant Node_Id := Generalized_Indexing (N);
8123       Call     : Node_Id;
8124       Indices  : List_Id;
8125       Pref     : Node_Id;
8126
8127    begin
8128       --  In ASIS mode, propagate the information about the indices back to
8129       --  to the original indexing node. The generalized indexing is either
8130       --  a function call, or a dereference of one. The actuals include the
8131       --  prefix of the original node, which is the container expression.
8132
8133       if ASIS_Mode then
8134          Resolve (Indexing, Typ);
8135          Set_Etype  (N, Etype (Indexing));
8136          Set_Is_Overloaded (N, False);
8137
8138          Call := Indexing;
8139          while Nkind_In (Call, N_Explicit_Dereference, N_Selected_Component)
8140          loop
8141             Call := Prefix (Call);
8142          end loop;
8143
8144          if Nkind (Call) = N_Function_Call then
8145             Indices := Parameter_Associations (Call);
8146             Pref := Remove_Head (Indices);
8147             Set_Expressions (N, Indices);
8148             Set_Prefix (N, Pref);
8149          end if;
8150
8151       else
8152          Rewrite (N, Indexing);
8153          Resolve (N, Typ);
8154       end if;
8155    end Resolve_Generalized_Indexing;
8156
8157    ---------------------------
8158    -- Resolve_If_Expression --
8159    ---------------------------
8160
8161    procedure Resolve_If_Expression (N : Node_Id; Typ : Entity_Id) is
8162       Condition : constant Node_Id := First (Expressions (N));
8163       Then_Expr : constant Node_Id := Next (Condition);
8164       Else_Expr : Node_Id          := Next (Then_Expr);
8165       Else_Typ  : Entity_Id;
8166       Then_Typ  : Entity_Id;
8167
8168    begin
8169       Resolve (Condition, Any_Boolean);
8170       Resolve (Then_Expr, Typ);
8171       Then_Typ := Etype (Then_Expr);
8172
8173       --  When the "then" expression is of a scalar subtype different from the
8174       --  result subtype, then insert a conversion to ensure the generation of
8175       --  a constraint check. The same is done for the else part below, again
8176       --  comparing subtypes rather than base types.
8177
8178       if Is_Scalar_Type (Then_Typ)
8179         and then Then_Typ /= Typ
8180       then
8181          Rewrite (Then_Expr, Convert_To (Typ, Then_Expr));
8182          Analyze_And_Resolve (Then_Expr, Typ);
8183       end if;
8184
8185       --  If ELSE expression present, just resolve using the determined type
8186
8187       if Present (Else_Expr) then
8188          Resolve (Else_Expr, Typ);
8189          Else_Typ := Etype (Else_Expr);
8190
8191          if Is_Scalar_Type (Else_Typ)
8192            and then Else_Typ /= Typ
8193          then
8194             Rewrite (Else_Expr, Convert_To (Typ, Else_Expr));
8195             Analyze_And_Resolve (Else_Expr, Typ);
8196          end if;
8197
8198       --  If no ELSE expression is present, root type must be Standard.Boolean
8199       --  and we provide a Standard.True result converted to the appropriate
8200       --  Boolean type (in case it is a derived boolean type).
8201
8202       elsif Root_Type (Typ) = Standard_Boolean then
8203          Else_Expr :=
8204            Convert_To (Typ, New_Occurrence_Of (Standard_True, Sloc (N)));
8205          Analyze_And_Resolve (Else_Expr, Typ);
8206          Append_To (Expressions (N), Else_Expr);
8207
8208       else
8209          Error_Msg_N ("can only omit ELSE expression in Boolean case", N);
8210          Append_To (Expressions (N), Error);
8211       end if;
8212
8213       Set_Etype (N, Typ);
8214       Eval_If_Expression (N);
8215    end Resolve_If_Expression;
8216
8217    -------------------------------
8218    -- Resolve_Indexed_Component --
8219    -------------------------------
8220
8221    procedure Resolve_Indexed_Component (N : Node_Id; Typ : Entity_Id) is
8222       Name       : constant Node_Id := Prefix  (N);
8223       Expr       : Node_Id;
8224       Array_Type : Entity_Id := Empty; -- to prevent junk warning
8225       Index      : Node_Id;
8226
8227    begin
8228       if Present (Generalized_Indexing (N)) then
8229          Resolve_Generalized_Indexing (N, Typ);
8230          return;
8231       end if;
8232
8233       if Is_Overloaded (Name) then
8234
8235          --  Use the context type to select the prefix that yields the correct
8236          --  component type.
8237
8238          declare
8239             I     : Interp_Index;
8240             It    : Interp;
8241             I1    : Interp_Index := 0;
8242             P     : constant Node_Id := Prefix (N);
8243             Found : Boolean := False;
8244
8245          begin
8246             Get_First_Interp (P, I, It);
8247             while Present (It.Typ) loop
8248                if (Is_Array_Type (It.Typ)
8249                      and then Covers (Typ, Component_Type (It.Typ)))
8250                  or else (Is_Access_Type (It.Typ)
8251                             and then Is_Array_Type (Designated_Type (It.Typ))
8252                             and then
8253                               Covers
8254                                 (Typ,
8255                                  Component_Type (Designated_Type (It.Typ))))
8256                then
8257                   if Found then
8258                      It := Disambiguate (P, I1, I, Any_Type);
8259
8260                      if It = No_Interp then
8261                         Error_Msg_N ("ambiguous prefix for indexing",  N);
8262                         Set_Etype (N, Typ);
8263                         return;
8264
8265                      else
8266                         Found := True;
8267                         Array_Type := It.Typ;
8268                         I1 := I;
8269                      end if;
8270
8271                   else
8272                      Found := True;
8273                      Array_Type := It.Typ;
8274                      I1 := I;
8275                   end if;
8276                end if;
8277
8278                Get_Next_Interp (I, It);
8279             end loop;
8280          end;
8281
8282       else
8283          Array_Type := Etype (Name);
8284       end if;
8285
8286       Resolve (Name, Array_Type);
8287       Array_Type := Get_Actual_Subtype_If_Available (Name);
8288
8289       --  If prefix is access type, dereference to get real array type.
8290       --  Note: we do not apply an access check because the expander always
8291       --  introduces an explicit dereference, and the check will happen there.
8292
8293       if Is_Access_Type (Array_Type) then
8294          Array_Type := Designated_Type (Array_Type);
8295       end if;
8296
8297       --  If name was overloaded, set component type correctly now
8298       --  If a misplaced call to an entry family (which has no index types)
8299       --  return. Error will be diagnosed from calling context.
8300
8301       if Is_Array_Type (Array_Type) then
8302          Set_Etype (N, Component_Type (Array_Type));
8303       else
8304          return;
8305       end if;
8306
8307       Index := First_Index (Array_Type);
8308       Expr  := First (Expressions (N));
8309
8310       --  The prefix may have resolved to a string literal, in which case its
8311       --  etype has a special representation. This is only possible currently
8312       --  if the prefix is a static concatenation, written in functional
8313       --  notation.
8314
8315       if Ekind (Array_Type) = E_String_Literal_Subtype then
8316          Resolve (Expr, Standard_Positive);
8317
8318       else
8319          while Present (Index) and Present (Expr) loop
8320             Resolve (Expr, Etype (Index));
8321             Check_Unset_Reference (Expr);
8322
8323             if Is_Scalar_Type (Etype (Expr)) then
8324                Apply_Scalar_Range_Check (Expr, Etype (Index));
8325             else
8326                Apply_Range_Check (Expr, Get_Actual_Subtype (Index));
8327             end if;
8328
8329             Next_Index (Index);
8330             Next (Expr);
8331          end loop;
8332       end if;
8333
8334       Analyze_Dimension (N);
8335
8336       --  Do not generate the warning on suspicious index if we are analyzing
8337       --  package Ada.Tags; otherwise we will report the warning with the
8338       --  Prims_Ptr field of the dispatch table.
8339
8340       if Scope (Etype (Prefix (N))) = Standard_Standard
8341         or else not
8342           Is_RTU (Cunit_Entity (Get_Source_Unit (Etype (Prefix (N)))),
8343                   Ada_Tags)
8344       then
8345          Warn_On_Suspicious_Index (Name, First (Expressions (N)));
8346          Eval_Indexed_Component (N);
8347       end if;
8348
8349       --  If the array type is atomic, and the component is not atomic, then
8350       --  this is worth a warning, since we have a situation where the access
8351       --  to the component may cause extra read/writes of the atomic array
8352       --  object, or partial word accesses, which could be unexpected.
8353
8354       if Nkind (N) = N_Indexed_Component
8355         and then Is_Atomic_Ref_With_Address (N)
8356         and then not (Has_Atomic_Components (Array_Type)
8357                        or else (Is_Entity_Name (Prefix (N))
8358                                  and then Has_Atomic_Components
8359                                             (Entity (Prefix (N)))))
8360         and then not Is_Atomic (Component_Type (Array_Type))
8361       then
8362          Error_Msg_N ("??access to non-atomic component of atomic array",
8363                       Prefix (N));
8364          Error_Msg_N ("??\may cause unexpected accesses to atomic object",
8365                       Prefix (N));
8366       end if;
8367    end Resolve_Indexed_Component;
8368
8369    -----------------------------
8370    -- Resolve_Integer_Literal --
8371    -----------------------------
8372
8373    procedure Resolve_Integer_Literal (N : Node_Id; Typ : Entity_Id) is
8374    begin
8375       Set_Etype (N, Typ);
8376       Eval_Integer_Literal (N);
8377    end Resolve_Integer_Literal;
8378
8379    --------------------------------
8380    -- Resolve_Intrinsic_Operator --
8381    --------------------------------
8382
8383    procedure Resolve_Intrinsic_Operator  (N : Node_Id; Typ : Entity_Id) is
8384       Btyp : constant Entity_Id := Base_Type (Underlying_Type (Typ));
8385       Op   : Entity_Id;
8386       Arg1 : Node_Id;
8387       Arg2 : Node_Id;
8388
8389       function Convert_Operand (Opnd : Node_Id) return Node_Id;
8390       --  If the operand is a literal, it cannot be the expression in a
8391       --  conversion. Use a qualified expression instead.
8392
8393       function Convert_Operand (Opnd : Node_Id) return Node_Id is
8394          Loc : constant Source_Ptr := Sloc (Opnd);
8395          Res : Node_Id;
8396       begin
8397          if Nkind_In (Opnd, N_Integer_Literal, N_Real_Literal) then
8398             Res :=
8399               Make_Qualified_Expression (Loc,
8400                 Subtype_Mark => New_Occurrence_Of (Btyp, Loc),
8401                 Expression   => Relocate_Node (Opnd));
8402             Analyze (Res);
8403
8404          else
8405             Res := Unchecked_Convert_To (Btyp, Opnd);
8406          end if;
8407
8408          return Res;
8409       end Convert_Operand;
8410
8411    --  Start of processing for Resolve_Intrinsic_Operator
8412
8413    begin
8414       --  We must preserve the original entity in a generic setting, so that
8415       --  the legality of the operation can be verified in an instance.
8416
8417       if not Expander_Active then
8418          return;
8419       end if;
8420
8421       Op := Entity (N);
8422       while Scope (Op) /= Standard_Standard loop
8423          Op := Homonym (Op);
8424          pragma Assert (Present (Op));
8425       end loop;
8426
8427       Set_Entity (N, Op);
8428       Set_Is_Overloaded (N, False);
8429
8430       --  If the result or operand types are private, rewrite with unchecked
8431       --  conversions on the operands and the result, to expose the proper
8432       --  underlying numeric type.
8433
8434       if Is_Private_Type (Typ)
8435         or else Is_Private_Type (Etype (Left_Opnd (N)))
8436         or else Is_Private_Type (Etype (Right_Opnd (N)))
8437       then
8438          Arg1 := Convert_Operand (Left_Opnd (N));
8439          --  Unchecked_Convert_To (Btyp, Left_Opnd  (N));
8440          --  What on earth is this commented out fragment of code???
8441
8442          if Nkind (N) = N_Op_Expon then
8443             Arg2 := Unchecked_Convert_To (Standard_Integer, Right_Opnd (N));
8444          else
8445             Arg2 := Convert_Operand (Right_Opnd (N));
8446          end if;
8447
8448          if Nkind (Arg1) = N_Type_Conversion then
8449             Save_Interps (Left_Opnd (N),  Expression (Arg1));
8450          end if;
8451
8452          if Nkind (Arg2) = N_Type_Conversion then
8453             Save_Interps (Right_Opnd (N), Expression (Arg2));
8454          end if;
8455
8456          Set_Left_Opnd  (N, Arg1);
8457          Set_Right_Opnd (N, Arg2);
8458
8459          Set_Etype (N, Btyp);
8460          Rewrite (N, Unchecked_Convert_To (Typ, N));
8461          Resolve (N, Typ);
8462
8463       elsif Typ /= Etype (Left_Opnd (N))
8464         or else Typ /= Etype (Right_Opnd (N))
8465       then
8466          --  Add explicit conversion where needed, and save interpretations in
8467          --  case operands are overloaded.
8468
8469          Arg1 := Convert_To (Typ, Left_Opnd  (N));
8470          Arg2 := Convert_To (Typ, Right_Opnd (N));
8471
8472          if Nkind (Arg1) = N_Type_Conversion then
8473             Save_Interps (Left_Opnd (N), Expression (Arg1));
8474          else
8475             Save_Interps (Left_Opnd (N), Arg1);
8476          end if;
8477
8478          if Nkind (Arg2) = N_Type_Conversion then
8479             Save_Interps (Right_Opnd (N), Expression (Arg2));
8480          else
8481             Save_Interps (Right_Opnd (N), Arg2);
8482          end if;
8483
8484          Rewrite (Left_Opnd  (N), Arg1);
8485          Rewrite (Right_Opnd (N), Arg2);
8486          Analyze (Arg1);
8487          Analyze (Arg2);
8488          Resolve_Arithmetic_Op (N, Typ);
8489
8490       else
8491          Resolve_Arithmetic_Op (N, Typ);
8492       end if;
8493    end Resolve_Intrinsic_Operator;
8494
8495    --------------------------------------
8496    -- Resolve_Intrinsic_Unary_Operator --
8497    --------------------------------------
8498
8499    procedure Resolve_Intrinsic_Unary_Operator
8500      (N   : Node_Id;
8501       Typ : Entity_Id)
8502    is
8503       Btyp : constant Entity_Id := Base_Type (Underlying_Type (Typ));
8504       Op   : Entity_Id;
8505       Arg2 : Node_Id;
8506
8507    begin
8508       Op := Entity (N);
8509       while Scope (Op) /= Standard_Standard loop
8510          Op := Homonym (Op);
8511          pragma Assert (Present (Op));
8512       end loop;
8513
8514       Set_Entity (N, Op);
8515
8516       if Is_Private_Type (Typ) then
8517          Arg2 := Unchecked_Convert_To (Btyp, Right_Opnd (N));
8518          Save_Interps (Right_Opnd (N), Expression (Arg2));
8519
8520          Set_Right_Opnd (N, Arg2);
8521
8522          Set_Etype (N, Btyp);
8523          Rewrite (N, Unchecked_Convert_To (Typ, N));
8524          Resolve (N, Typ);
8525
8526       else
8527          Resolve_Unary_Op (N, Typ);
8528       end if;
8529    end Resolve_Intrinsic_Unary_Operator;
8530
8531    ------------------------
8532    -- Resolve_Logical_Op --
8533    ------------------------
8534
8535    procedure Resolve_Logical_Op (N : Node_Id; Typ : Entity_Id) is
8536       B_Typ : Entity_Id;
8537
8538    begin
8539       Check_No_Direct_Boolean_Operators (N);
8540
8541       --  Predefined operations on scalar types yield the base type. On the
8542       --  other hand, logical operations on arrays yield the type of the
8543       --  arguments (and the context).
8544
8545       if Is_Array_Type (Typ) then
8546          B_Typ := Typ;
8547       else
8548          B_Typ := Base_Type (Typ);
8549       end if;
8550
8551       --  The following test is required because the operands of the operation
8552       --  may be literals, in which case the resulting type appears to be
8553       --  compatible with a signed integer type, when in fact it is compatible
8554       --  only with modular types. If the context itself is universal, the
8555       --  operation is illegal.
8556
8557       if not Valid_Boolean_Arg (Typ) then
8558          Error_Msg_N ("invalid context for logical operation", N);
8559          Set_Etype (N, Any_Type);
8560          return;
8561
8562       elsif Typ = Any_Modular then
8563          Error_Msg_N
8564            ("no modular type available in this context", N);
8565          Set_Etype (N, Any_Type);
8566          return;
8567
8568       elsif Is_Modular_Integer_Type (Typ)
8569         and then Etype (Left_Opnd (N)) = Universal_Integer
8570         and then Etype (Right_Opnd (N)) = Universal_Integer
8571       then
8572          Check_For_Visible_Operator (N, B_Typ);
8573       end if;
8574
8575       --  Replace AND by AND THEN, or OR by OR ELSE, if Short_Circuit_And_Or
8576       --  is active and the result type is standard Boolean (do not mess with
8577       --  ops that return a nonstandard Boolean type, because something strange
8578       --  is going on).
8579
8580       --  Note: you might expect this replacement to be done during expansion,
8581       --  but that doesn't work, because when the pragma Short_Circuit_And_Or
8582       --  is used, no part of the right operand of an "and" or "or" operator
8583       --  should be executed if the left operand would short-circuit the
8584       --  evaluation of the corresponding "and then" or "or else". If we left
8585       --  the replacement to expansion time, then run-time checks associated
8586       --  with such operands would be evaluated unconditionally, due to being
8587       --  before the condition prior to the rewriting as short-circuit forms
8588       --  during expansion.
8589
8590       if Short_Circuit_And_Or
8591         and then B_Typ = Standard_Boolean
8592         and then Nkind_In (N, N_Op_And, N_Op_Or)
8593       then
8594          if Nkind (N) = N_Op_And then
8595             Rewrite (N,
8596               Make_And_Then (Sloc (N),
8597                 Left_Opnd  => Relocate_Node (Left_Opnd (N)),
8598                 Right_Opnd => Relocate_Node (Right_Opnd (N))));
8599             Analyze_And_Resolve (N, B_Typ);
8600
8601          --  Case of OR changed to OR ELSE
8602
8603          else
8604             Rewrite (N,
8605               Make_Or_Else (Sloc (N),
8606                 Left_Opnd  => Relocate_Node (Left_Opnd (N)),
8607                 Right_Opnd => Relocate_Node (Right_Opnd (N))));
8608             Analyze_And_Resolve (N, B_Typ);
8609          end if;
8610
8611          --  Return now, since analysis of the rewritten ops will take care of
8612          --  other reference bookkeeping and expression folding.
8613
8614          return;
8615       end if;
8616
8617       Resolve (Left_Opnd (N), B_Typ);
8618       Resolve (Right_Opnd (N), B_Typ);
8619
8620       Check_Unset_Reference (Left_Opnd  (N));
8621       Check_Unset_Reference (Right_Opnd (N));
8622
8623       Set_Etype (N, B_Typ);
8624       Generate_Operator_Reference (N, B_Typ);
8625       Eval_Logical_Op (N);
8626
8627       --  In SPARK, logical operations AND, OR and XOR for arrays are defined
8628       --  only when both operands have same static lower and higher bounds. Of
8629       --  course the types have to match, so only check if operands are
8630       --  compatible and the node itself has no errors.
8631
8632       if Is_Array_Type (B_Typ)
8633         and then Nkind (N) in N_Binary_Op
8634       then
8635          declare
8636             Left_Typ  : constant Node_Id := Etype (Left_Opnd (N));
8637             Right_Typ : constant Node_Id := Etype (Right_Opnd (N));
8638
8639          begin
8640             --  Protect call to Matching_Static_Array_Bounds to avoid costly
8641             --  operation if not needed.
8642
8643             if Restriction_Check_Required (SPARK_05)
8644               and then Base_Type (Left_Typ) = Base_Type (Right_Typ)
8645               and then Left_Typ /= Any_Composite  --  or Left_Opnd in error
8646               and then Right_Typ /= Any_Composite  --  or Right_Opnd in error
8647               and then not Matching_Static_Array_Bounds (Left_Typ, Right_Typ)
8648             then
8649                Check_SPARK_05_Restriction
8650                  ("array types should have matching static bounds", N);
8651             end if;
8652          end;
8653       end if;
8654
8655       Check_Function_Writable_Actuals (N);
8656    end Resolve_Logical_Op;
8657
8658    ---------------------------
8659    -- Resolve_Membership_Op --
8660    ---------------------------
8661
8662    --  The context can only be a boolean type, and does not determine the
8663    --  arguments. Arguments should be unambiguous, but the preference rule for
8664    --  universal types applies.
8665
8666    procedure Resolve_Membership_Op (N : Node_Id; Typ : Entity_Id) is
8667       pragma Warnings (Off, Typ);
8668
8669       L : constant Node_Id := Left_Opnd  (N);
8670       R : constant Node_Id := Right_Opnd (N);
8671       T : Entity_Id;
8672
8673       procedure Resolve_Set_Membership;
8674       --  Analysis has determined a unique type for the left operand. Use it to
8675       --  resolve the disjuncts.
8676
8677       ----------------------------
8678       -- Resolve_Set_Membership --
8679       ----------------------------
8680
8681       procedure Resolve_Set_Membership is
8682          Alt  : Node_Id;
8683          Ltyp : constant Entity_Id := Etype (L);
8684
8685       begin
8686          Resolve (L, Ltyp);
8687
8688          Alt := First (Alternatives (N));
8689          while Present (Alt) loop
8690
8691             --  Alternative is an expression, a range
8692             --  or a subtype mark.
8693
8694             if not Is_Entity_Name (Alt)
8695               or else not Is_Type (Entity (Alt))
8696             then
8697                Resolve (Alt, Ltyp);
8698             end if;
8699
8700             Next (Alt);
8701          end loop;
8702
8703          --  Check for duplicates for discrete case
8704
8705          if Is_Discrete_Type (Ltyp) then
8706             declare
8707                type Ent is record
8708                   Alt : Node_Id;
8709                   Val : Uint;
8710                end record;
8711
8712                Alts  : array (0 .. List_Length (Alternatives (N))) of Ent;
8713                Nalts : Nat;
8714
8715             begin
8716                --  Loop checking duplicates. This is quadratic, but giant sets
8717                --  are unlikely in this context so it's a reasonable choice.
8718
8719                Nalts := 0;
8720                Alt := First (Alternatives (N));
8721                while Present (Alt) loop
8722                   if Is_OK_Static_Expression (Alt)
8723                     and then (Nkind_In (Alt, N_Integer_Literal,
8724                                              N_Character_Literal)
8725                                or else Nkind (Alt) in N_Has_Entity)
8726                   then
8727                      Nalts := Nalts + 1;
8728                      Alts (Nalts) := (Alt, Expr_Value (Alt));
8729
8730                      for J in 1 .. Nalts - 1 loop
8731                         if Alts (J).Val = Alts (Nalts).Val then
8732                            Error_Msg_Sloc := Sloc (Alts (J).Alt);
8733                            Error_Msg_N ("duplicate of value given#??", Alt);
8734                         end if;
8735                      end loop;
8736                   end if;
8737
8738                   Alt := Next (Alt);
8739                end loop;
8740             end;
8741          end if;
8742       end Resolve_Set_Membership;
8743
8744    --  Start of processing for Resolve_Membership_Op
8745
8746    begin
8747       if L = Error or else R = Error then
8748          return;
8749       end if;
8750
8751       if Present (Alternatives (N)) then
8752          Resolve_Set_Membership;
8753          goto SM_Exit;
8754
8755       elsif not Is_Overloaded (R)
8756         and then
8757           (Etype (R) = Universal_Integer
8758              or else
8759            Etype (R) = Universal_Real)
8760         and then Is_Overloaded (L)
8761       then
8762          T := Etype (R);
8763
8764       --  Ada 2005 (AI-251): Support the following case:
8765
8766       --      type I is interface;
8767       --      type T is tagged ...
8768
8769       --      function Test (O : I'Class) is
8770       --      begin
8771       --         return O in T'Class.
8772       --      end Test;
8773
8774       --  In this case we have nothing else to do. The membership test will be
8775       --  done at run time.
8776
8777       elsif Ada_Version >= Ada_2005
8778         and then Is_Class_Wide_Type (Etype (L))
8779         and then Is_Interface (Etype (L))
8780         and then Is_Class_Wide_Type (Etype (R))
8781         and then not Is_Interface (Etype (R))
8782       then
8783          return;
8784       else
8785          T := Intersect_Types (L, R);
8786       end if;
8787
8788       --  If mixed-mode operations are present and operands are all literal,
8789       --  the only interpretation involves Duration, which is probably not
8790       --  the intention of the programmer.
8791
8792       if T = Any_Fixed then
8793          T := Unique_Fixed_Point_Type (N);
8794
8795          if T = Any_Type then
8796             return;
8797          end if;
8798       end if;
8799
8800       Resolve (L, T);
8801       Check_Unset_Reference (L);
8802
8803       if Nkind (R) = N_Range
8804         and then not Is_Scalar_Type (T)
8805       then
8806          Error_Msg_N ("scalar type required for range", R);
8807       end if;
8808
8809       if Is_Entity_Name (R) then
8810          Freeze_Expression (R);
8811       else
8812          Resolve (R, T);
8813          Check_Unset_Reference (R);
8814       end if;
8815
8816       --  Here after resolving membership operation
8817
8818       <<SM_Exit>>
8819
8820       Eval_Membership_Op (N);
8821       Check_Function_Writable_Actuals (N);
8822    end Resolve_Membership_Op;
8823
8824    ------------------
8825    -- Resolve_Null --
8826    ------------------
8827
8828    procedure Resolve_Null (N : Node_Id; Typ : Entity_Id) is
8829       Loc : constant Source_Ptr := Sloc (N);
8830
8831    begin
8832       --  Handle restriction against anonymous null access values This
8833       --  restriction can be turned off using -gnatdj.
8834
8835       --  Ada 2005 (AI-231): Remove restriction
8836
8837       if Ada_Version < Ada_2005
8838         and then not Debug_Flag_J
8839         and then Ekind (Typ) = E_Anonymous_Access_Type
8840         and then Comes_From_Source (N)
8841       then
8842          --  In the common case of a call which uses an explicitly null value
8843          --  for an access parameter, give specialized error message.
8844
8845          if Nkind (Parent (N)) in N_Subprogram_Call then
8846             Error_Msg_N
8847               ("null is not allowed as argument for an access parameter", N);
8848
8849          --  Standard message for all other cases (are there any?)
8850
8851          else
8852             Error_Msg_N
8853               ("null cannot be of an anonymous access type", N);
8854          end if;
8855       end if;
8856
8857       --  Ada 2005 (AI-231): Generate the null-excluding check in case of
8858       --  assignment to a null-excluding object
8859
8860       if Ada_Version >= Ada_2005
8861         and then Can_Never_Be_Null (Typ)
8862         and then Nkind (Parent (N)) = N_Assignment_Statement
8863       then
8864          if not Inside_Init_Proc then
8865             Insert_Action
8866               (Compile_Time_Constraint_Error (N,
8867                  "(Ada 2005) null not allowed in null-excluding objects??"),
8868                Make_Raise_Constraint_Error (Loc,
8869                  Reason => CE_Access_Check_Failed));
8870          else
8871             Insert_Action (N,
8872               Make_Raise_Constraint_Error (Loc,
8873                 Reason => CE_Access_Check_Failed));
8874          end if;
8875       end if;
8876
8877       --  In a distributed context, null for a remote access to subprogram may
8878       --  need to be replaced with a special record aggregate. In this case,
8879       --  return after having done the transformation.
8880
8881       if (Ekind (Typ) = E_Record_Type
8882            or else Is_Remote_Access_To_Subprogram_Type (Typ))
8883         and then Remote_AST_Null_Value (N, Typ)
8884       then
8885          return;
8886       end if;
8887
8888       --  The null literal takes its type from the context
8889
8890       Set_Etype (N, Typ);
8891    end Resolve_Null;
8892
8893    -----------------------
8894    -- Resolve_Op_Concat --
8895    -----------------------
8896
8897    procedure Resolve_Op_Concat (N : Node_Id; Typ : Entity_Id) is
8898
8899       --  We wish to avoid deep recursion, because concatenations are often
8900       --  deeply nested, as in A&B&...&Z. Therefore, we walk down the left
8901       --  operands nonrecursively until we find something that is not a simple
8902       --  concatenation (A in this case). We resolve that, and then walk back
8903       --  up the tree following Parent pointers, calling Resolve_Op_Concat_Rest
8904       --  to do the rest of the work at each level. The Parent pointers allow
8905       --  us to avoid recursion, and thus avoid running out of memory. See also
8906       --  Sem_Ch4.Analyze_Concatenation, where a similar approach is used.
8907
8908       NN  : Node_Id := N;
8909       Op1 : Node_Id;
8910
8911    begin
8912       --  The following code is equivalent to:
8913
8914       --    Resolve_Op_Concat_First (NN, Typ);
8915       --    Resolve_Op_Concat_Arg (N, ...);
8916       --    Resolve_Op_Concat_Rest (N, Typ);
8917
8918       --  where the Resolve_Op_Concat_Arg call recurses back here if the left
8919       --  operand is a concatenation.
8920
8921       --  Walk down left operands
8922
8923       loop
8924          Resolve_Op_Concat_First (NN, Typ);
8925          Op1 := Left_Opnd (NN);
8926          exit when not (Nkind (Op1) = N_Op_Concat
8927                          and then not Is_Array_Type (Component_Type (Typ))
8928                          and then Entity (Op1) = Entity (NN));
8929          NN := Op1;
8930       end loop;
8931
8932       --  Now (given the above example) NN is A&B and Op1 is A
8933
8934       --  First resolve Op1 ...
8935
8936       Resolve_Op_Concat_Arg (NN, Op1, Typ, Is_Component_Left_Opnd  (NN));
8937
8938       --  ... then walk NN back up until we reach N (where we started), calling
8939       --  Resolve_Op_Concat_Rest along the way.
8940
8941       loop
8942          Resolve_Op_Concat_Rest (NN, Typ);
8943          exit when NN = N;
8944          NN := Parent (NN);
8945       end loop;
8946
8947       if Base_Type (Etype (N)) /= Standard_String then
8948          Check_SPARK_05_Restriction
8949            ("result of concatenation should have type String", N);
8950       end if;
8951    end Resolve_Op_Concat;
8952
8953    ---------------------------
8954    -- Resolve_Op_Concat_Arg --
8955    ---------------------------
8956
8957    procedure Resolve_Op_Concat_Arg
8958      (N       : Node_Id;
8959       Arg     : Node_Id;
8960       Typ     : Entity_Id;
8961       Is_Comp : Boolean)
8962    is
8963       Btyp : constant Entity_Id := Base_Type (Typ);
8964       Ctyp : constant Entity_Id := Component_Type (Typ);
8965
8966    begin
8967       if In_Instance then
8968          if Is_Comp
8969            or else (not Is_Overloaded (Arg)
8970                      and then Etype (Arg) /= Any_Composite
8971                      and then Covers (Ctyp, Etype (Arg)))
8972          then
8973             Resolve (Arg, Ctyp);
8974          else
8975             Resolve (Arg, Btyp);
8976          end if;
8977
8978       --  If both Array & Array and Array & Component are visible, there is a
8979       --  potential ambiguity that must be reported.
8980
8981       elsif Has_Compatible_Type (Arg, Ctyp) then
8982          if Nkind (Arg) = N_Aggregate
8983            and then Is_Composite_Type (Ctyp)
8984          then
8985             if Is_Private_Type (Ctyp) then
8986                Resolve (Arg, Btyp);
8987
8988             --  If the operation is user-defined and not overloaded use its
8989             --  profile. The operation may be a renaming, in which case it has
8990             --  been rewritten, and we want the original profile.
8991
8992             elsif not Is_Overloaded (N)
8993               and then Comes_From_Source (Entity (Original_Node (N)))
8994               and then Ekind (Entity (Original_Node (N))) = E_Function
8995             then
8996                Resolve (Arg,
8997                  Etype
8998                    (Next_Formal (First_Formal (Entity (Original_Node (N))))));
8999                return;
9000
9001             --  Otherwise an aggregate may match both the array type and the
9002             --  component type.
9003
9004             else
9005                Error_Msg_N ("ambiguous aggregate must be qualified", Arg);
9006                Set_Etype (Arg, Any_Type);
9007             end if;
9008
9009          else
9010             if Is_Overloaded (Arg)
9011               and then Has_Compatible_Type (Arg, Typ)
9012               and then Etype (Arg) /= Any_Type
9013             then
9014                declare
9015                   I    : Interp_Index;
9016                   It   : Interp;
9017                   Func : Entity_Id;
9018
9019                begin
9020                   Get_First_Interp (Arg, I, It);
9021                   Func := It.Nam;
9022                   Get_Next_Interp (I, It);
9023
9024                   --  Special-case the error message when the overloading is
9025                   --  caused by a function that yields an array and can be
9026                   --  called without parameters.
9027
9028                   if It.Nam = Func then
9029                      Error_Msg_Sloc := Sloc (Func);
9030                      Error_Msg_N ("ambiguous call to function#", Arg);
9031                      Error_Msg_NE
9032                        ("\\interpretation as call yields&", Arg, Typ);
9033                      Error_Msg_NE
9034                        ("\\interpretation as indexing of call yields&",
9035                          Arg, Component_Type (Typ));
9036
9037                   else
9038                      Error_Msg_N ("ambiguous operand for concatenation!", Arg);
9039
9040                      Get_First_Interp (Arg, I, It);
9041                      while Present (It.Nam) loop
9042                         Error_Msg_Sloc := Sloc (It.Nam);
9043
9044                         if Base_Type (It.Typ) = Btyp
9045                              or else
9046                            Base_Type (It.Typ) = Base_Type (Ctyp)
9047                         then
9048                            Error_Msg_N -- CODEFIX
9049                              ("\\possible interpretation#", Arg);
9050                         end if;
9051
9052                         Get_Next_Interp (I, It);
9053                      end loop;
9054                   end if;
9055                end;
9056             end if;
9057
9058             Resolve (Arg, Component_Type (Typ));
9059
9060             if Nkind (Arg) = N_String_Literal then
9061                Set_Etype (Arg, Component_Type (Typ));
9062             end if;
9063
9064             if Arg = Left_Opnd (N) then
9065                Set_Is_Component_Left_Opnd (N);
9066             else
9067                Set_Is_Component_Right_Opnd (N);
9068             end if;
9069          end if;
9070
9071       else
9072          Resolve (Arg, Btyp);
9073       end if;
9074
9075       --  Concatenation is restricted in SPARK: each operand must be either a
9076       --  string literal, the name of a string constant, a static character or
9077       --  string expression, or another concatenation. Arg cannot be a
9078       --  concatenation here as callers of Resolve_Op_Concat_Arg call it
9079       --  separately on each final operand, past concatenation operations.
9080
9081       if Is_Character_Type (Etype (Arg)) then
9082          if not Is_OK_Static_Expression (Arg) then
9083             Check_SPARK_05_Restriction
9084               ("character operand for concatenation should be static", Arg);
9085          end if;
9086
9087       elsif Is_String_Type (Etype (Arg)) then
9088          if not (Nkind_In (Arg, N_Identifier, N_Expanded_Name)
9089                   and then Is_Constant_Object (Entity (Arg)))
9090            and then not Is_OK_Static_Expression (Arg)
9091          then
9092             Check_SPARK_05_Restriction
9093               ("string operand for concatenation should be static", Arg);
9094          end if;
9095
9096       --  Do not issue error on an operand that is neither a character nor a
9097       --  string, as the error is issued in Resolve_Op_Concat.
9098
9099       else
9100          null;
9101       end if;
9102
9103       Check_Unset_Reference (Arg);
9104    end Resolve_Op_Concat_Arg;
9105
9106    -----------------------------
9107    -- Resolve_Op_Concat_First --
9108    -----------------------------
9109
9110    procedure Resolve_Op_Concat_First (N : Node_Id; Typ : Entity_Id) is
9111       Btyp : constant Entity_Id := Base_Type (Typ);
9112       Op1  : constant Node_Id := Left_Opnd (N);
9113       Op2  : constant Node_Id := Right_Opnd (N);
9114
9115    begin
9116       --  The parser folds an enormous sequence of concatenations of string
9117       --  literals into "" & "...", where the Is_Folded_In_Parser flag is set
9118       --  in the right operand. If the expression resolves to a predefined "&"
9119       --  operator, all is well. Otherwise, the parser's folding is wrong, so
9120       --  we give an error. See P_Simple_Expression in Par.Ch4.
9121
9122       if Nkind (Op2) = N_String_Literal
9123         and then Is_Folded_In_Parser (Op2)
9124         and then Ekind (Entity (N)) = E_Function
9125       then
9126          pragma Assert (Nkind (Op1) = N_String_Literal  --  should be ""
9127                and then String_Length (Strval (Op1)) = 0);
9128          Error_Msg_N ("too many user-defined concatenations", N);
9129          return;
9130       end if;
9131
9132       Set_Etype (N, Btyp);
9133
9134       if Is_Limited_Composite (Btyp) then
9135          Error_Msg_N ("concatenation not available for limited array", N);
9136          Explain_Limited_Type (Btyp, N);
9137       end if;
9138    end Resolve_Op_Concat_First;
9139
9140    ----------------------------
9141    -- Resolve_Op_Concat_Rest --
9142    ----------------------------
9143
9144    procedure Resolve_Op_Concat_Rest (N : Node_Id; Typ : Entity_Id) is
9145       Op1  : constant Node_Id := Left_Opnd (N);
9146       Op2  : constant Node_Id := Right_Opnd (N);
9147
9148    begin
9149       Resolve_Op_Concat_Arg (N, Op2, Typ, Is_Component_Right_Opnd  (N));
9150
9151       Generate_Operator_Reference (N, Typ);
9152
9153       if Is_String_Type (Typ) then
9154          Eval_Concatenation (N);
9155       end if;
9156
9157       --  If this is not a static concatenation, but the result is a string
9158       --  type (and not an array of strings) ensure that static string operands
9159       --  have their subtypes properly constructed.
9160
9161       if Nkind (N) /= N_String_Literal
9162         and then Is_Character_Type (Component_Type (Typ))
9163       then
9164          Set_String_Literal_Subtype (Op1, Typ);
9165          Set_String_Literal_Subtype (Op2, Typ);
9166       end if;
9167    end Resolve_Op_Concat_Rest;
9168
9169    ----------------------
9170    -- Resolve_Op_Expon --
9171    ----------------------
9172
9173    procedure Resolve_Op_Expon (N : Node_Id; Typ : Entity_Id) is
9174       B_Typ : constant Entity_Id := Base_Type (Typ);
9175
9176    begin
9177       --  Catch attempts to do fixed-point exponentiation with universal
9178       --  operands, which is a case where the illegality is not caught during
9179       --  normal operator analysis. This is not done in preanalysis mode
9180       --  since the tree is not fully decorated during preanalysis.
9181
9182       if Full_Analysis then
9183          if Is_Fixed_Point_Type (Typ) and then Comes_From_Source (N) then
9184             Error_Msg_N ("exponentiation not available for fixed point", N);
9185             return;
9186
9187          elsif Nkind (Parent (N)) in N_Op
9188            and then Is_Fixed_Point_Type (Etype (Parent (N)))
9189            and then Etype (N) = Universal_Real
9190            and then Comes_From_Source (N)
9191          then
9192             Error_Msg_N ("exponentiation not available for fixed point", N);
9193             return;
9194          end if;
9195       end if;
9196
9197       if Comes_From_Source (N)
9198         and then Ekind (Entity (N)) = E_Function
9199         and then Is_Imported (Entity (N))
9200         and then Is_Intrinsic_Subprogram (Entity (N))
9201       then
9202          Resolve_Intrinsic_Operator (N, Typ);
9203          return;
9204       end if;
9205
9206       if Etype (Left_Opnd (N)) = Universal_Integer
9207         or else Etype (Left_Opnd (N)) = Universal_Real
9208       then
9209          Check_For_Visible_Operator (N, B_Typ);
9210       end if;
9211
9212       --  We do the resolution using the base type, because intermediate values
9213       --  in expressions are always of the base type, not a subtype of it.
9214
9215       Resolve (Left_Opnd (N), B_Typ);
9216       Resolve (Right_Opnd (N), Standard_Integer);
9217
9218       --  For integer types, right argument must be in Natural range
9219
9220       if Is_Integer_Type (Typ) then
9221          Apply_Scalar_Range_Check (Right_Opnd (N), Standard_Natural);
9222       end if;
9223
9224       Check_Unset_Reference (Left_Opnd  (N));
9225       Check_Unset_Reference (Right_Opnd (N));
9226
9227       Set_Etype (N, B_Typ);
9228       Generate_Operator_Reference (N, B_Typ);
9229
9230       Analyze_Dimension (N);
9231
9232       if Ada_Version >= Ada_2012 and then Has_Dimension_System (B_Typ) then
9233          --  Evaluate the exponentiation operator for dimensioned type
9234
9235          Eval_Op_Expon_For_Dimensioned_Type (N, B_Typ);
9236       else
9237          Eval_Op_Expon (N);
9238       end if;
9239
9240       --  Set overflow checking bit. Much cleverer code needed here eventually
9241       --  and perhaps the Resolve routines should be separated for the various
9242       --  arithmetic operations, since they will need different processing. ???
9243
9244       if Nkind (N) in N_Op then
9245          if not Overflow_Checks_Suppressed (Etype (N)) then
9246             Enable_Overflow_Check (N);
9247          end if;
9248       end if;
9249    end Resolve_Op_Expon;
9250
9251    --------------------
9252    -- Resolve_Op_Not --
9253    --------------------
9254
9255    procedure Resolve_Op_Not (N : Node_Id; Typ : Entity_Id) is
9256       B_Typ : Entity_Id;
9257
9258       function Parent_Is_Boolean return Boolean;
9259       --  This function determines if the parent node is a boolean operator or
9260       --  operation (comparison op, membership test, or short circuit form) and
9261       --  the not in question is the left operand of this operation. Note that
9262       --  if the not is in parens, then false is returned.
9263
9264       -----------------------
9265       -- Parent_Is_Boolean --
9266       -----------------------
9267
9268       function Parent_Is_Boolean return Boolean is
9269       begin
9270          if Paren_Count (N) /= 0 then
9271             return False;
9272
9273          else
9274             case Nkind (Parent (N)) is
9275                when N_Op_And   |
9276                     N_Op_Eq    |
9277                     N_Op_Ge    |
9278                     N_Op_Gt    |
9279                     N_Op_Le    |
9280                     N_Op_Lt    |
9281                     N_Op_Ne    |
9282                     N_Op_Or    |
9283                     N_Op_Xor   |
9284                     N_In       |
9285                     N_Not_In   |
9286                     N_And_Then |
9287                     N_Or_Else  =>
9288
9289                   return Left_Opnd (Parent (N)) = N;
9290
9291                when others =>
9292                   return False;
9293             end case;
9294          end if;
9295       end Parent_Is_Boolean;
9296
9297    --  Start of processing for Resolve_Op_Not
9298
9299    begin
9300       --  Predefined operations on scalar types yield the base type. On the
9301       --  other hand, logical operations on arrays yield the type of the
9302       --  arguments (and the context).
9303
9304       if Is_Array_Type (Typ) then
9305          B_Typ := Typ;
9306       else
9307          B_Typ := Base_Type (Typ);
9308       end if;
9309
9310       --  Straightforward case of incorrect arguments
9311
9312       if not Valid_Boolean_Arg (Typ) then
9313          Error_Msg_N ("invalid operand type for operator&", N);
9314          Set_Etype (N, Any_Type);
9315          return;
9316
9317       --  Special case of probable missing parens
9318
9319       elsif Typ = Universal_Integer or else Typ = Any_Modular then
9320          if Parent_Is_Boolean then
9321             Error_Msg_N
9322               ("operand of not must be enclosed in parentheses",
9323                Right_Opnd (N));
9324          else
9325             Error_Msg_N
9326               ("no modular type available in this context", N);
9327          end if;
9328
9329          Set_Etype (N, Any_Type);
9330          return;
9331
9332       --  OK resolution of NOT
9333
9334       else
9335          --  Warn if non-boolean types involved. This is a case like not a < b
9336          --  where a and b are modular, where we will get (not a) < b and most
9337          --  likely not (a < b) was intended.
9338
9339          if Warn_On_Questionable_Missing_Parens
9340            and then not Is_Boolean_Type (Typ)
9341            and then Parent_Is_Boolean
9342          then
9343             Error_Msg_N ("?q?not expression should be parenthesized here!", N);
9344          end if;
9345
9346          --  Warn on double negation if checking redundant constructs
9347
9348          if Warn_On_Redundant_Constructs
9349            and then Comes_From_Source (N)
9350            and then Comes_From_Source (Right_Opnd (N))
9351            and then Root_Type (Typ) = Standard_Boolean
9352            and then Nkind (Right_Opnd (N)) = N_Op_Not
9353          then
9354             Error_Msg_N ("redundant double negation?r?", N);
9355          end if;
9356
9357          --  Complete resolution and evaluation of NOT
9358
9359          Resolve (Right_Opnd (N), B_Typ);
9360          Check_Unset_Reference (Right_Opnd (N));
9361          Set_Etype (N, B_Typ);
9362          Generate_Operator_Reference (N, B_Typ);
9363          Eval_Op_Not (N);
9364       end if;
9365    end Resolve_Op_Not;
9366
9367    -----------------------------
9368    -- Resolve_Operator_Symbol --
9369    -----------------------------
9370
9371    --  Nothing to be done, all resolved already
9372
9373    procedure Resolve_Operator_Symbol (N : Node_Id; Typ : Entity_Id) is
9374       pragma Warnings (Off, N);
9375       pragma Warnings (Off, Typ);
9376
9377    begin
9378       null;
9379    end Resolve_Operator_Symbol;
9380
9381    ----------------------------------
9382    -- Resolve_Qualified_Expression --
9383    ----------------------------------
9384
9385    procedure Resolve_Qualified_Expression (N : Node_Id; Typ : Entity_Id) is
9386       pragma Warnings (Off, Typ);
9387
9388       Target_Typ : constant Entity_Id := Entity (Subtype_Mark (N));
9389       Expr       : constant Node_Id   := Expression (N);
9390
9391    begin
9392       Resolve (Expr, Target_Typ);
9393
9394       --  Protect call to Matching_Static_Array_Bounds to avoid costly
9395       --  operation if not needed.
9396
9397       if Restriction_Check_Required (SPARK_05)
9398         and then Is_Array_Type (Target_Typ)
9399         and then Is_Array_Type (Etype (Expr))
9400         and then Etype (Expr) /= Any_Composite  --  or else Expr in error
9401         and then not Matching_Static_Array_Bounds (Target_Typ, Etype (Expr))
9402       then
9403          Check_SPARK_05_Restriction
9404            ("array types should have matching static bounds", N);
9405       end if;
9406
9407       --  A qualified expression requires an exact match of the type, class-
9408       --  wide matching is not allowed. However, if the qualifying type is
9409       --  specific and the expression has a class-wide type, it may still be
9410       --  okay, since it can be the result of the expansion of a call to a
9411       --  dispatching function, so we also have to check class-wideness of the
9412       --  type of the expression's original node.
9413
9414       if (Is_Class_Wide_Type (Target_Typ)
9415            or else
9416              (Is_Class_Wide_Type (Etype (Expr))
9417                and then Is_Class_Wide_Type (Etype (Original_Node (Expr)))))
9418         and then Base_Type (Etype (Expr)) /= Base_Type (Target_Typ)
9419       then
9420          Wrong_Type (Expr, Target_Typ);
9421       end if;
9422
9423       --  If the target type is unconstrained, then we reset the type of the
9424       --  result from the type of the expression. For other cases, the actual
9425       --  subtype of the expression is the target type.
9426
9427       if Is_Composite_Type (Target_Typ)
9428         and then not Is_Constrained (Target_Typ)
9429       then
9430          Set_Etype (N, Etype (Expr));
9431       end if;
9432
9433       Analyze_Dimension (N);
9434       Eval_Qualified_Expression (N);
9435
9436       --  If we still have a qualified expression after the static evaluation,
9437       --  then apply a scalar range check if needed. The reason that we do this
9438       --  after the Eval call is that otherwise, the application of the range
9439       --  check may convert an illegal static expression and result in warning
9440       --  rather than giving an error (e.g Integer'(Integer'Last + 1)).
9441
9442       if Nkind (N) = N_Qualified_Expression and then Is_Scalar_Type (Typ) then
9443          Apply_Scalar_Range_Check (Expr, Typ);
9444       end if;
9445    end Resolve_Qualified_Expression;
9446
9447    ------------------------------
9448    -- Resolve_Raise_Expression --
9449    ------------------------------
9450
9451    procedure Resolve_Raise_Expression (N : Node_Id; Typ : Entity_Id) is
9452    begin
9453       if Typ = Raise_Type then
9454          Error_Msg_N ("cannot find unique type for raise expression", N);
9455          Set_Etype (N, Any_Type);
9456       else
9457          Set_Etype (N, Typ);
9458       end if;
9459    end Resolve_Raise_Expression;
9460
9461    -------------------
9462    -- Resolve_Range --
9463    -------------------
9464
9465    procedure Resolve_Range (N : Node_Id; Typ : Entity_Id) is
9466       L : constant Node_Id := Low_Bound (N);
9467       H : constant Node_Id := High_Bound (N);
9468
9469       function First_Last_Ref return Boolean;
9470       --  Returns True if N is of the form X'First .. X'Last where X is the
9471       --  same entity for both attributes.
9472
9473       --------------------
9474       -- First_Last_Ref --
9475       --------------------
9476
9477       function First_Last_Ref return Boolean is
9478          Lorig : constant Node_Id := Original_Node (L);
9479          Horig : constant Node_Id := Original_Node (H);
9480
9481       begin
9482          if Nkind (Lorig) = N_Attribute_Reference
9483            and then Nkind (Horig) = N_Attribute_Reference
9484            and then Attribute_Name (Lorig) = Name_First
9485            and then Attribute_Name (Horig) = Name_Last
9486          then
9487             declare
9488                PL : constant Node_Id := Prefix (Lorig);
9489                PH : constant Node_Id := Prefix (Horig);
9490             begin
9491                if Is_Entity_Name (PL)
9492                  and then Is_Entity_Name (PH)
9493                  and then Entity (PL) = Entity (PH)
9494                then
9495                   return True;
9496                end if;
9497             end;
9498          end if;
9499
9500          return False;
9501       end First_Last_Ref;
9502
9503    --  Start of processing for Resolve_Range
9504
9505    begin
9506       Set_Etype (N, Typ);
9507       Resolve (L, Typ);
9508       Resolve (H, Typ);
9509
9510       --  Check for inappropriate range on unordered enumeration type
9511
9512       if Bad_Unordered_Enumeration_Reference (N, Typ)
9513
9514         --  Exclude X'First .. X'Last if X is the same entity for both
9515
9516         and then not First_Last_Ref
9517       then
9518          Error_Msg_Sloc := Sloc (Typ);
9519          Error_Msg_NE
9520            ("subrange of unordered enumeration type& declared#?U?", N, Typ);
9521       end if;
9522
9523       Check_Unset_Reference (L);
9524       Check_Unset_Reference (H);
9525
9526       --  We have to check the bounds for being within the base range as
9527       --  required for a non-static context. Normally this is automatic and
9528       --  done as part of evaluating expressions, but the N_Range node is an
9529       --  exception, since in GNAT we consider this node to be a subexpression,
9530       --  even though in Ada it is not. The circuit in Sem_Eval could check for
9531       --  this, but that would put the test on the main evaluation path for
9532       --  expressions.
9533
9534       Check_Non_Static_Context (L);
9535       Check_Non_Static_Context (H);
9536
9537       --  Check for an ambiguous range over character literals. This will
9538       --  happen with a membership test involving only literals.
9539
9540       if Typ = Any_Character then
9541          Ambiguous_Character (L);
9542          Set_Etype (N, Any_Type);
9543          return;
9544       end if;
9545
9546       --  If bounds are static, constant-fold them, so size computations are
9547       --  identical between front-end and back-end. Do not perform this
9548       --  transformation while analyzing generic units, as type information
9549       --  would be lost when reanalyzing the constant node in the instance.
9550
9551       if Is_Discrete_Type (Typ) and then Expander_Active then
9552          if Is_OK_Static_Expression (L) then
9553             Fold_Uint (L, Expr_Value (L), Is_OK_Static_Expression (L));
9554          end if;
9555
9556          if Is_OK_Static_Expression (H) then
9557             Fold_Uint (H, Expr_Value (H), Is_OK_Static_Expression (H));
9558          end if;
9559       end if;
9560    end Resolve_Range;
9561
9562    --------------------------
9563    -- Resolve_Real_Literal --
9564    --------------------------
9565
9566    procedure Resolve_Real_Literal (N : Node_Id; Typ : Entity_Id) is
9567       Actual_Typ : constant Entity_Id := Etype (N);
9568
9569    begin
9570       --  Special processing for fixed-point literals to make sure that the
9571       --  value is an exact multiple of small where this is required. We skip
9572       --  this for the universal real case, and also for generic types.
9573
9574       if Is_Fixed_Point_Type (Typ)
9575         and then Typ /= Universal_Fixed
9576         and then Typ /= Any_Fixed
9577         and then not Is_Generic_Type (Typ)
9578       then
9579          declare
9580             Val   : constant Ureal := Realval (N);
9581             Cintr : constant Ureal := Val / Small_Value (Typ);
9582             Cint  : constant Uint  := UR_Trunc (Cintr);
9583             Den   : constant Uint  := Norm_Den (Cintr);
9584             Stat  : Boolean;
9585
9586          begin
9587             --  Case of literal is not an exact multiple of the Small
9588
9589             if Den /= 1 then
9590
9591                --  For a source program literal for a decimal fixed-point type,
9592                --  this is statically illegal (RM 4.9(36)).
9593
9594                if Is_Decimal_Fixed_Point_Type (Typ)
9595                  and then Actual_Typ = Universal_Real
9596                  and then Comes_From_Source (N)
9597                then
9598                   Error_Msg_N ("value has extraneous low order digits", N);
9599                end if;
9600
9601                --  Generate a warning if literal from source
9602
9603                if Is_OK_Static_Expression (N)
9604                  and then Warn_On_Bad_Fixed_Value
9605                then
9606                   Error_Msg_N
9607                     ("?b?static fixed-point value is not a multiple of Small!",
9608                      N);
9609                end if;
9610
9611                --  Replace literal by a value that is the exact representation
9612                --  of a value of the type, i.e. a multiple of the small value,
9613                --  by truncation, since Machine_Rounds is false for all GNAT
9614                --  fixed-point types (RM 4.9(38)).
9615
9616                Stat := Is_OK_Static_Expression (N);
9617                Rewrite (N,
9618                  Make_Real_Literal (Sloc (N),
9619                    Realval => Small_Value (Typ) * Cint));
9620
9621                Set_Is_Static_Expression (N, Stat);
9622             end if;
9623
9624             --  In all cases, set the corresponding integer field
9625
9626             Set_Corresponding_Integer_Value (N, Cint);
9627          end;
9628       end if;
9629
9630       --  Now replace the actual type by the expected type as usual
9631
9632       Set_Etype (N, Typ);
9633       Eval_Real_Literal (N);
9634    end Resolve_Real_Literal;
9635
9636    -----------------------
9637    -- Resolve_Reference --
9638    -----------------------
9639
9640    procedure Resolve_Reference (N : Node_Id; Typ : Entity_Id) is
9641       P : constant Node_Id := Prefix (N);
9642
9643    begin
9644       --  Replace general access with specific type
9645
9646       if Ekind (Etype (N)) = E_Allocator_Type then
9647          Set_Etype (N, Base_Type (Typ));
9648       end if;
9649
9650       Resolve (P, Designated_Type (Etype (N)));
9651
9652       --  If we are taking the reference of a volatile entity, then treat it as
9653       --  a potential modification of this entity. This is too conservative,
9654       --  but necessary because remove side effects can cause transformations
9655       --  of normal assignments into reference sequences that otherwise fail to
9656       --  notice the modification.
9657
9658       if Is_Entity_Name (P) and then Treat_As_Volatile (Entity (P)) then
9659          Note_Possible_Modification (P, Sure => False);
9660       end if;
9661    end Resolve_Reference;
9662
9663    --------------------------------
9664    -- Resolve_Selected_Component --
9665    --------------------------------
9666
9667    procedure Resolve_Selected_Component (N : Node_Id; Typ : Entity_Id) is
9668       Comp  : Entity_Id;
9669       Comp1 : Entity_Id        := Empty; -- prevent junk warning
9670       P     : constant Node_Id := Prefix (N);
9671       S     : constant Node_Id := Selector_Name (N);
9672       T     : Entity_Id        := Etype (P);
9673       I     : Interp_Index;
9674       I1    : Interp_Index := 0; -- prevent junk warning
9675       It    : Interp;
9676       It1   : Interp;
9677       Found : Boolean;
9678
9679       function Init_Component return Boolean;
9680       --  Check whether this is the initialization of a component within an
9681       --  init proc (by assignment or call to another init proc). If true,
9682       --  there is no need for a discriminant check.
9683
9684       --------------------
9685       -- Init_Component --
9686       --------------------
9687
9688       function Init_Component return Boolean is
9689       begin
9690          return Inside_Init_Proc
9691            and then Nkind (Prefix (N)) = N_Identifier
9692            and then Chars (Prefix (N)) = Name_uInit
9693            and then Nkind (Parent (Parent (N))) = N_Case_Statement_Alternative;
9694       end Init_Component;
9695
9696    --  Start of processing for Resolve_Selected_Component
9697
9698    begin
9699       if Is_Overloaded (P) then
9700
9701          --  Use the context type to select the prefix that has a selector
9702          --  of the correct name and type.
9703
9704          Found := False;
9705          Get_First_Interp (P, I, It);
9706
9707          Search : while Present (It.Typ) loop
9708             if Is_Access_Type (It.Typ) then
9709                T := Designated_Type (It.Typ);
9710             else
9711                T := It.Typ;
9712             end if;
9713
9714             --  Locate selected component. For a private prefix the selector
9715             --  can denote a discriminant.
9716
9717             if Is_Record_Type (T) or else Is_Private_Type (T) then
9718
9719                --  The visible components of a class-wide type are those of
9720                --  the root type.
9721
9722                if Is_Class_Wide_Type (T) then
9723                   T := Etype (T);
9724                end if;
9725
9726                Comp := First_Entity (T);
9727                while Present (Comp) loop
9728                   if Chars (Comp) = Chars (S)
9729                     and then Covers (Typ, Etype (Comp))
9730                   then
9731                      if not Found then
9732                         Found := True;
9733                         I1  := I;
9734                         It1 := It;
9735                         Comp1 := Comp;
9736
9737                      else
9738                         It := Disambiguate (P, I1, I, Any_Type);
9739
9740                         if It = No_Interp then
9741                            Error_Msg_N
9742                              ("ambiguous prefix for selected component",  N);
9743                            Set_Etype (N, Typ);
9744                            return;
9745
9746                         else
9747                            It1 := It;
9748
9749                            --  There may be an implicit dereference. Retrieve
9750                            --  designated record type.
9751
9752                            if Is_Access_Type (It1.Typ) then
9753                               T := Designated_Type (It1.Typ);
9754                            else
9755                               T := It1.Typ;
9756                            end if;
9757
9758                            if Scope (Comp1) /= T then
9759
9760                               --  Resolution chooses the new interpretation.
9761                               --  Find the component with the right name.
9762
9763                               Comp1 := First_Entity (T);
9764                               while Present (Comp1)
9765                                 and then Chars (Comp1) /= Chars (S)
9766                               loop
9767                                  Comp1 := Next_Entity (Comp1);
9768                               end loop;
9769                            end if;
9770
9771                            exit Search;
9772                         end if;
9773                      end if;
9774                   end if;
9775
9776                   Comp := Next_Entity (Comp);
9777                end loop;
9778             end if;
9779
9780             Get_Next_Interp (I, It);
9781          end loop Search;
9782
9783          --  There must be a legal interpretation at this point
9784
9785          pragma Assert (Found);
9786          Resolve (P, It1.Typ);
9787          Set_Etype (N, Typ);
9788          Set_Entity_With_Checks (S, Comp1);
9789
9790       else
9791          --  Resolve prefix with its type
9792
9793          Resolve (P, T);
9794       end if;
9795
9796       --  Generate cross-reference. We needed to wait until full overloading
9797       --  resolution was complete to do this, since otherwise we can't tell if
9798       --  we are an lvalue or not.
9799
9800       if May_Be_Lvalue (N) then
9801          Generate_Reference (Entity (S), S, 'm');
9802       else
9803          Generate_Reference (Entity (S), S, 'r');
9804       end if;
9805
9806       --  If prefix is an access type, the node will be transformed into an
9807       --  explicit dereference during expansion. The type of the node is the
9808       --  designated type of that of the prefix.
9809
9810       if Is_Access_Type (Etype (P)) then
9811          T := Designated_Type (Etype (P));
9812          Check_Fully_Declared_Prefix (T, P);
9813       else
9814          T := Etype (P);
9815       end if;
9816
9817       --  Set flag for expander if discriminant check required
9818
9819       if Has_Discriminants (T)
9820         and then Ekind_In (Entity (S), E_Component, E_Discriminant)
9821         and then Present (Original_Record_Component (Entity (S)))
9822         and then Ekind (Original_Record_Component (Entity (S))) = E_Component
9823         and then not Discriminant_Checks_Suppressed (T)
9824         and then not Init_Component
9825       then
9826          Set_Do_Discriminant_Check (N);
9827       end if;
9828
9829       if Ekind (Entity (S)) = E_Void then
9830          Error_Msg_N ("premature use of component", S);
9831       end if;
9832
9833       --  If the prefix is a record conversion, this may be a renamed
9834       --  discriminant whose bounds differ from those of the original
9835       --  one, so we must ensure that a range check is performed.
9836
9837       if Nkind (P) = N_Type_Conversion
9838         and then Ekind (Entity (S)) = E_Discriminant
9839         and then Is_Discrete_Type (Typ)
9840       then
9841          Set_Etype (N, Base_Type (Typ));
9842       end if;
9843
9844       --  Note: No Eval processing is required, because the prefix is of a
9845       --  record type, or protected type, and neither can possibly be static.
9846
9847       --  If the record type is atomic, and the component is non-atomic, then
9848       --  this is worth a warning, since we have a situation where the access
9849       --  to the component may cause extra read/writes of the atomic array
9850       --  object, or partial word accesses, both of which may be unexpected.
9851
9852       if Nkind (N) = N_Selected_Component
9853         and then Is_Atomic_Ref_With_Address (N)
9854         and then not Is_Atomic (Entity (S))
9855         and then not Is_Atomic (Etype (Entity (S)))
9856       then
9857          Error_Msg_N
9858            ("??access to non-atomic component of atomic record",
9859             Prefix (N));
9860          Error_Msg_N
9861            ("\??may cause unexpected accesses to atomic object",
9862             Prefix (N));
9863       end if;
9864
9865       Analyze_Dimension (N);
9866    end Resolve_Selected_Component;
9867
9868    -------------------
9869    -- Resolve_Shift --
9870    -------------------
9871
9872    procedure Resolve_Shift (N : Node_Id; Typ : Entity_Id) is
9873       B_Typ : constant Entity_Id := Base_Type (Typ);
9874       L     : constant Node_Id   := Left_Opnd  (N);
9875       R     : constant Node_Id   := Right_Opnd (N);
9876
9877    begin
9878       --  We do the resolution using the base type, because intermediate values
9879       --  in expressions always are of the base type, not a subtype of it.
9880
9881       Resolve (L, B_Typ);
9882       Resolve (R, Standard_Natural);
9883
9884       Check_Unset_Reference (L);
9885       Check_Unset_Reference (R);
9886
9887       Set_Etype (N, B_Typ);
9888       Generate_Operator_Reference (N, B_Typ);
9889       Eval_Shift (N);
9890    end Resolve_Shift;
9891
9892    ---------------------------
9893    -- Resolve_Short_Circuit --
9894    ---------------------------
9895
9896    procedure Resolve_Short_Circuit (N : Node_Id; Typ : Entity_Id) is
9897       B_Typ : constant Entity_Id := Base_Type (Typ);
9898       L     : constant Node_Id   := Left_Opnd  (N);
9899       R     : constant Node_Id   := Right_Opnd (N);
9900
9901    begin
9902       --  Ensure all actions associated with the left operand (e.g.
9903       --  finalization of transient controlled objects) are fully evaluated
9904       --  locally within an expression with actions. This is particularly
9905       --  helpful for coverage analysis. However this should not happen in
9906       --  generics.
9907
9908       if Expander_Active then
9909          declare
9910             Reloc_L : constant Node_Id := Relocate_Node (L);
9911          begin
9912             Save_Interps (Old_N => L, New_N => Reloc_L);
9913
9914             Rewrite (L,
9915               Make_Expression_With_Actions (Sloc (L),
9916                 Actions    => New_List,
9917                 Expression => Reloc_L));
9918
9919             --  Set Comes_From_Source on L to preserve warnings for unset
9920             --  reference.
9921
9922             Set_Comes_From_Source (L, Comes_From_Source (Reloc_L));
9923          end;
9924       end if;
9925
9926       Resolve (L, B_Typ);
9927       Resolve (R, B_Typ);
9928
9929       --  Check for issuing warning for always False assert/check, this happens
9930       --  when assertions are turned off, in which case the pragma Assert/Check
9931       --  was transformed into:
9932
9933       --     if False and then <condition> then ...
9934
9935       --  and we detect this pattern
9936
9937       if Warn_On_Assertion_Failure
9938         and then Is_Entity_Name (R)
9939         and then Entity (R) = Standard_False
9940         and then Nkind (Parent (N)) = N_If_Statement
9941         and then Nkind (N) = N_And_Then
9942         and then Is_Entity_Name (L)
9943         and then Entity (L) = Standard_False
9944       then
9945          declare
9946             Orig : constant Node_Id := Original_Node (Parent (N));
9947
9948          begin
9949             --  Special handling of Asssert pragma
9950
9951             if Nkind (Orig) = N_Pragma
9952               and then Pragma_Name (Orig) = Name_Assert
9953             then
9954                declare
9955                   Expr : constant Node_Id :=
9956                            Original_Node
9957                              (Expression
9958                                (First (Pragma_Argument_Associations (Orig))));
9959
9960                begin
9961                   --  Don't warn if original condition is explicit False,
9962                   --  since obviously the failure is expected in this case.
9963
9964                   if Is_Entity_Name (Expr)
9965                     and then Entity (Expr) = Standard_False
9966                   then
9967                      null;
9968
9969                   --  Issue warning. We do not want the deletion of the
9970                   --  IF/AND-THEN to take this message with it. We achieve this
9971                   --  by making sure that the expanded code points to the Sloc
9972                   --  of the expression, not the original pragma.
9973
9974                   else
9975                      --  Note: Use Error_Msg_F here rather than Error_Msg_N.
9976                      --  The source location of the expression is not usually
9977                      --  the best choice here. For example, it gets located on
9978                      --  the last AND keyword in a chain of boolean expressiond
9979                      --  AND'ed together. It is best to put the message on the
9980                      --  first character of the assertion, which is the effect
9981                      --  of the First_Node call here.
9982
9983                      Error_Msg_F
9984                        ("?A?assertion would fail at run time!",
9985                         Expression
9986                           (First (Pragma_Argument_Associations (Orig))));
9987                   end if;
9988                end;
9989
9990             --  Similar processing for Check pragma
9991
9992             elsif Nkind (Orig) = N_Pragma
9993               and then Pragma_Name (Orig) = Name_Check
9994             then
9995                --  Don't want to warn if original condition is explicit False
9996
9997                declare
9998                   Expr : constant Node_Id :=
9999                     Original_Node
10000                       (Expression
10001                         (Next (First (Pragma_Argument_Associations (Orig)))));
10002                begin
10003                   if Is_Entity_Name (Expr)
10004                     and then Entity (Expr) = Standard_False
10005                   then
10006                      null;
10007
10008                   --  Post warning
10009
10010                   else
10011                      --  Again use Error_Msg_F rather than Error_Msg_N, see
10012                      --  comment above for an explanation of why we do this.
10013
10014                      Error_Msg_F
10015                        ("?A?check would fail at run time!",
10016                         Expression
10017                           (Last (Pragma_Argument_Associations (Orig))));
10018                   end if;
10019                end;
10020             end if;
10021          end;
10022       end if;
10023
10024       --  Continue with processing of short circuit
10025
10026       Check_Unset_Reference (L);
10027       Check_Unset_Reference (R);
10028
10029       Set_Etype (N, B_Typ);
10030       Eval_Short_Circuit (N);
10031    end Resolve_Short_Circuit;
10032
10033    -------------------
10034    -- Resolve_Slice --
10035    -------------------
10036
10037    procedure Resolve_Slice (N : Node_Id; Typ : Entity_Id) is
10038       Drange     : constant Node_Id := Discrete_Range (N);
10039       Name       : constant Node_Id := Prefix (N);
10040       Array_Type : Entity_Id        := Empty;
10041       Dexpr      : Node_Id          := Empty;
10042       Index_Type : Entity_Id;
10043
10044    begin
10045       if Is_Overloaded (Name) then
10046
10047          --  Use the context type to select the prefix that yields the correct
10048          --  array type.
10049
10050          declare
10051             I      : Interp_Index;
10052             I1     : Interp_Index := 0;
10053             It     : Interp;
10054             P      : constant Node_Id := Prefix (N);
10055             Found  : Boolean := False;
10056
10057          begin
10058             Get_First_Interp (P, I,  It);
10059             while Present (It.Typ) loop
10060                if (Is_Array_Type (It.Typ)
10061                     and then Covers (Typ,  It.Typ))
10062                  or else (Is_Access_Type (It.Typ)
10063                            and then Is_Array_Type (Designated_Type (It.Typ))
10064                            and then Covers (Typ, Designated_Type (It.Typ)))
10065                then
10066                   if Found then
10067                      It := Disambiguate (P, I1, I, Any_Type);
10068
10069                      if It = No_Interp then
10070                         Error_Msg_N ("ambiguous prefix for slicing",  N);
10071                         Set_Etype (N, Typ);
10072                         return;
10073                      else
10074                         Found := True;
10075                         Array_Type := It.Typ;
10076                         I1 := I;
10077                      end if;
10078                   else
10079                      Found := True;
10080                      Array_Type := It.Typ;
10081                      I1 := I;
10082                   end if;
10083                end if;
10084
10085                Get_Next_Interp (I, It);
10086             end loop;
10087          end;
10088
10089       else
10090          Array_Type := Etype (Name);
10091       end if;
10092
10093       Resolve (Name, Array_Type);
10094
10095       if Is_Access_Type (Array_Type) then
10096          Apply_Access_Check (N);
10097          Array_Type := Designated_Type (Array_Type);
10098
10099          --  If the prefix is an access to an unconstrained array, we must use
10100          --  the actual subtype of the object to perform the index checks. The
10101          --  object denoted by the prefix is implicit in the node, so we build
10102          --  an explicit representation for it in order to compute the actual
10103          --  subtype.
10104
10105          if not Is_Constrained (Array_Type) then
10106             Remove_Side_Effects (Prefix (N));
10107
10108             declare
10109                Obj : constant Node_Id :=
10110                        Make_Explicit_Dereference (Sloc (N),
10111                          Prefix => New_Copy_Tree (Prefix (N)));
10112             begin
10113                Set_Etype (Obj, Array_Type);
10114                Set_Parent (Obj, Parent (N));
10115                Array_Type := Get_Actual_Subtype (Obj);
10116             end;
10117          end if;
10118
10119       elsif Is_Entity_Name (Name)
10120         or else Nkind (Name) = N_Explicit_Dereference
10121         or else (Nkind (Name) = N_Function_Call
10122                   and then not Is_Constrained (Etype (Name)))
10123       then
10124          Array_Type := Get_Actual_Subtype (Name);
10125
10126       --  If the name is a selected component that depends on discriminants,
10127       --  build an actual subtype for it. This can happen only when the name
10128       --  itself is overloaded; otherwise the actual subtype is created when
10129       --  the selected component is analyzed.
10130
10131       elsif Nkind (Name) = N_Selected_Component
10132         and then Full_Analysis
10133         and then Depends_On_Discriminant (First_Index (Array_Type))
10134       then
10135          declare
10136             Act_Decl : constant Node_Id :=
10137                          Build_Actual_Subtype_Of_Component (Array_Type, Name);
10138          begin
10139             Insert_Action (N, Act_Decl);
10140             Array_Type := Defining_Identifier (Act_Decl);
10141          end;
10142
10143       --  Maybe this should just be "else", instead of checking for the
10144       --  specific case of slice??? This is needed for the case where the
10145       --  prefix is an Image attribute, which gets expanded to a slice, and so
10146       --  has a constrained subtype which we want to use for the slice range
10147       --  check applied below (the range check won't get done if the
10148       --  unconstrained subtype of the 'Image is used).
10149
10150       elsif Nkind (Name) = N_Slice then
10151          Array_Type := Etype (Name);
10152       end if;
10153
10154       --  Obtain the type of the array index
10155
10156       if Ekind (Array_Type) = E_String_Literal_Subtype then
10157          Index_Type := Etype (String_Literal_Low_Bound (Array_Type));
10158       else
10159          Index_Type := Etype (First_Index (Array_Type));
10160       end if;
10161
10162       --  If name was overloaded, set slice type correctly now
10163
10164       Set_Etype (N, Array_Type);
10165
10166       --  Handle the generation of a range check that compares the array index
10167       --  against the discrete_range. The check is not applied to internally
10168       --  built nodes associated with the expansion of dispatch tables. Check
10169       --  that Ada.Tags has already been loaded to avoid extra dependencies on
10170       --  the unit.
10171
10172       if Tagged_Type_Expansion
10173         and then RTU_Loaded (Ada_Tags)
10174         and then Nkind (Prefix (N)) = N_Selected_Component
10175         and then Present (Entity (Selector_Name (Prefix (N))))
10176         and then Entity (Selector_Name (Prefix (N))) =
10177                    RTE_Record_Component (RE_Prims_Ptr)
10178       then
10179          null;
10180
10181       --  The discrete_range is specified by a subtype indication. Create a
10182       --  shallow copy and inherit the type, parent and source location from
10183       --  the discrete_range. This ensures that the range check is inserted
10184       --  relative to the slice and that the runtime exception points to the
10185       --  proper construct.
10186
10187       elsif Is_Entity_Name (Drange) then
10188          Dexpr := New_Copy (Scalar_Range (Entity (Drange)));
10189
10190          Set_Etype  (Dexpr, Etype  (Drange));
10191          Set_Parent (Dexpr, Parent (Drange));
10192          Set_Sloc   (Dexpr, Sloc   (Drange));
10193
10194       --  The discrete_range is a regular range. Resolve the bounds and remove
10195       --  their side effects.
10196
10197       else
10198          Resolve (Drange, Base_Type (Index_Type));
10199
10200          if Nkind (Drange) = N_Range then
10201             Force_Evaluation (Low_Bound  (Drange));
10202             Force_Evaluation (High_Bound (Drange));
10203
10204             Dexpr := Drange;
10205          end if;
10206       end if;
10207
10208       if Present (Dexpr) then
10209          Apply_Range_Check (Dexpr, Index_Type);
10210       end if;
10211
10212       Set_Slice_Subtype (N);
10213
10214       --  Check bad use of type with predicates
10215
10216       declare
10217          Subt : Entity_Id;
10218
10219       begin
10220          if Nkind (Drange) = N_Subtype_Indication
10221            and then Has_Predicates (Entity (Subtype_Mark (Drange)))
10222          then
10223             Subt := Entity (Subtype_Mark (Drange));
10224          else
10225             Subt := Etype (Drange);
10226          end if;
10227
10228          if Has_Predicates (Subt) then
10229             Bad_Predicated_Subtype_Use
10230               ("subtype& has predicate, not allowed in slice", Drange, Subt);
10231          end if;
10232       end;
10233
10234       --  Otherwise here is where we check suspicious indexes
10235
10236       if Nkind (Drange) = N_Range then
10237          Warn_On_Suspicious_Index (Name, Low_Bound  (Drange));
10238          Warn_On_Suspicious_Index (Name, High_Bound (Drange));
10239       end if;
10240
10241       Analyze_Dimension (N);
10242       Eval_Slice (N);
10243    end Resolve_Slice;
10244
10245    ----------------------------
10246    -- Resolve_String_Literal --
10247    ----------------------------
10248
10249    procedure Resolve_String_Literal (N : Node_Id; Typ : Entity_Id) is
10250       C_Typ      : constant Entity_Id  := Component_Type (Typ);
10251       R_Typ      : constant Entity_Id  := Root_Type (C_Typ);
10252       Loc        : constant Source_Ptr := Sloc (N);
10253       Str        : constant String_Id  := Strval (N);
10254       Strlen     : constant Nat        := String_Length (Str);
10255       Subtype_Id : Entity_Id;
10256       Need_Check : Boolean;
10257
10258    begin
10259       --  For a string appearing in a concatenation, defer creation of the
10260       --  string_literal_subtype until the end of the resolution of the
10261       --  concatenation, because the literal may be constant-folded away. This
10262       --  is a useful optimization for long concatenation expressions.
10263
10264       --  If the string is an aggregate built for a single character (which
10265       --  happens in a non-static context) or a is null string to which special
10266       --  checks may apply, we build the subtype. Wide strings must also get a
10267       --  string subtype if they come from a one character aggregate. Strings
10268       --  generated by attributes might be static, but it is often hard to
10269       --  determine whether the enclosing context is static, so we generate
10270       --  subtypes for them as well, thus losing some rarer optimizations ???
10271       --  Same for strings that come from a static conversion.
10272
10273       Need_Check :=
10274         (Strlen = 0 and then Typ /= Standard_String)
10275           or else Nkind (Parent (N)) /= N_Op_Concat
10276           or else (N /= Left_Opnd (Parent (N))
10277                     and then N /= Right_Opnd (Parent (N)))
10278           or else ((Typ = Standard_Wide_String
10279                       or else Typ = Standard_Wide_Wide_String)
10280                     and then Nkind (Original_Node (N)) /= N_String_Literal);
10281
10282       --  If the resolving type is itself a string literal subtype, we can just
10283       --  reuse it, since there is no point in creating another.
10284
10285       if Ekind (Typ) = E_String_Literal_Subtype then
10286          Subtype_Id := Typ;
10287
10288       elsif Nkind (Parent (N)) = N_Op_Concat
10289         and then not Need_Check
10290         and then not Nkind_In (Original_Node (N), N_Character_Literal,
10291                                                   N_Attribute_Reference,
10292                                                   N_Qualified_Expression,
10293                                                   N_Type_Conversion)
10294       then
10295          Subtype_Id := Typ;
10296
10297       --  Do not generate a string literal subtype for the default expression
10298       --  of a formal parameter in GNATprove mode. This is because the string
10299       --  subtype is associated with the freezing actions of the subprogram,
10300       --  however freezing is disabled in GNATprove mode and as a result the
10301       --  subtype is unavailable.
10302
10303       elsif GNATprove_Mode
10304         and then Nkind (Parent (N)) = N_Parameter_Specification
10305       then
10306          Subtype_Id := Typ;
10307
10308       --  Otherwise we must create a string literal subtype. Note that the
10309       --  whole idea of string literal subtypes is simply to avoid the need
10310       --  for building a full fledged array subtype for each literal.
10311
10312       else
10313          Set_String_Literal_Subtype (N, Typ);
10314          Subtype_Id := Etype (N);
10315       end if;
10316
10317       if Nkind (Parent (N)) /= N_Op_Concat
10318         or else Need_Check
10319       then
10320          Set_Etype (N, Subtype_Id);
10321          Eval_String_Literal (N);
10322       end if;
10323
10324       if Is_Limited_Composite (Typ)
10325         or else Is_Private_Composite (Typ)
10326       then
10327          Error_Msg_N ("string literal not available for private array", N);
10328          Set_Etype (N, Any_Type);
10329          return;
10330       end if;
10331
10332       --  The validity of a null string has been checked in the call to
10333       --  Eval_String_Literal.
10334
10335       if Strlen = 0 then
10336          return;
10337
10338       --  Always accept string literal with component type Any_Character, which
10339       --  occurs in error situations and in comparisons of literals, both of
10340       --  which should accept all literals.
10341
10342       elsif R_Typ = Any_Character then
10343          return;
10344
10345       --  If the type is bit-packed, then we always transform the string
10346       --  literal into a full fledged aggregate.
10347
10348       elsif Is_Bit_Packed_Array (Typ) then
10349          null;
10350
10351       --  Deal with cases of Wide_Wide_String, Wide_String, and String
10352
10353       else
10354          --  For Standard.Wide_Wide_String, or any other type whose component
10355          --  type is Standard.Wide_Wide_Character, we know that all the
10356          --  characters in the string must be acceptable, since the parser
10357          --  accepted the characters as valid character literals.
10358
10359          if R_Typ = Standard_Wide_Wide_Character then
10360             null;
10361
10362          --  For the case of Standard.String, or any other type whose component
10363          --  type is Standard.Character, we must make sure that there are no
10364          --  wide characters in the string, i.e. that it is entirely composed
10365          --  of characters in range of type Character.
10366
10367          --  If the string literal is the result of a static concatenation, the
10368          --  test has already been performed on the components, and need not be
10369          --  repeated.
10370
10371          elsif R_Typ = Standard_Character
10372            and then Nkind (Original_Node (N)) /= N_Op_Concat
10373          then
10374             for J in 1 .. Strlen loop
10375                if not In_Character_Range (Get_String_Char (Str, J)) then
10376
10377                   --  If we are out of range, post error. This is one of the
10378                   --  very few places that we place the flag in the middle of
10379                   --  a token, right under the offending wide character. Not
10380                   --  quite clear if this is right wrt wide character encoding
10381                   --  sequences, but it's only an error message.
10382
10383                   Error_Msg
10384                     ("literal out of range of type Standard.Character",
10385                      Source_Ptr (Int (Loc) + J));
10386                   return;
10387                end if;
10388             end loop;
10389
10390          --  For the case of Standard.Wide_String, or any other type whose
10391          --  component type is Standard.Wide_Character, we must make sure that
10392          --  there are no wide characters in the string, i.e. that it is
10393          --  entirely composed of characters in range of type Wide_Character.
10394
10395          --  If the string literal is the result of a static concatenation,
10396          --  the test has already been performed on the components, and need
10397          --  not be repeated.
10398
10399          elsif R_Typ = Standard_Wide_Character
10400            and then Nkind (Original_Node (N)) /= N_Op_Concat
10401          then
10402             for J in 1 .. Strlen loop
10403                if not In_Wide_Character_Range (Get_String_Char (Str, J)) then
10404
10405                   --  If we are out of range, post error. This is one of the
10406                   --  very few places that we place the flag in the middle of
10407                   --  a token, right under the offending wide character.
10408
10409                   --  This is not quite right, because characters in general
10410                   --  will take more than one character position ???
10411
10412                   Error_Msg
10413                     ("literal out of range of type Standard.Wide_Character",
10414                      Source_Ptr (Int (Loc) + J));
10415                   return;
10416                end if;
10417             end loop;
10418
10419          --  If the root type is not a standard character, then we will convert
10420          --  the string into an aggregate and will let the aggregate code do
10421          --  the checking. Standard Wide_Wide_Character is also OK here.
10422
10423          else
10424             null;
10425          end if;
10426
10427          --  See if the component type of the array corresponding to the string
10428          --  has compile time known bounds. If yes we can directly check
10429          --  whether the evaluation of the string will raise constraint error.
10430          --  Otherwise we need to transform the string literal into the
10431          --  corresponding character aggregate and let the aggregate code do
10432          --  the checking.
10433
10434          if Is_Standard_Character_Type (R_Typ) then
10435
10436             --  Check for the case of full range, where we are definitely OK
10437
10438             if Component_Type (Typ) = Base_Type (Component_Type (Typ)) then
10439                return;
10440             end if;
10441
10442             --  Here the range is not the complete base type range, so check
10443
10444             declare
10445                Comp_Typ_Lo : constant Node_Id :=
10446                                Type_Low_Bound (Component_Type (Typ));
10447                Comp_Typ_Hi : constant Node_Id :=
10448                                Type_High_Bound (Component_Type (Typ));
10449
10450                Char_Val : Uint;
10451
10452             begin
10453                if Compile_Time_Known_Value (Comp_Typ_Lo)
10454                  and then Compile_Time_Known_Value (Comp_Typ_Hi)
10455                then
10456                   for J in 1 .. Strlen loop
10457                      Char_Val := UI_From_Int (Int (Get_String_Char (Str, J)));
10458
10459                      if Char_Val < Expr_Value (Comp_Typ_Lo)
10460                        or else Char_Val > Expr_Value (Comp_Typ_Hi)
10461                      then
10462                         Apply_Compile_Time_Constraint_Error
10463                           (N, "character out of range??",
10464                            CE_Range_Check_Failed,
10465                            Loc => Source_Ptr (Int (Loc) + J));
10466                      end if;
10467                   end loop;
10468
10469                   return;
10470                end if;
10471             end;
10472          end if;
10473       end if;
10474
10475       --  If we got here we meed to transform the string literal into the
10476       --  equivalent qualified positional array aggregate. This is rather
10477       --  heavy artillery for this situation, but it is hard work to avoid.
10478
10479       declare
10480          Lits : constant List_Id    := New_List;
10481          P    : Source_Ptr := Loc + 1;
10482          C    : Char_Code;
10483
10484       begin
10485          --  Build the character literals, we give them source locations that
10486          --  correspond to the string positions, which is a bit tricky given
10487          --  the possible presence of wide character escape sequences.
10488
10489          for J in 1 .. Strlen loop
10490             C := Get_String_Char (Str, J);
10491             Set_Character_Literal_Name (C);
10492
10493             Append_To (Lits,
10494               Make_Character_Literal (P,
10495                 Chars              => Name_Find,
10496                 Char_Literal_Value => UI_From_CC (C)));
10497
10498             if In_Character_Range (C) then
10499                P := P + 1;
10500
10501             --  Should we have a call to Skip_Wide here ???
10502
10503             --  ???     else
10504             --             Skip_Wide (P);
10505
10506             end if;
10507          end loop;
10508
10509          Rewrite (N,
10510            Make_Qualified_Expression (Loc,
10511              Subtype_Mark => New_Occurrence_Of (Typ, Loc),
10512              Expression   =>
10513                Make_Aggregate (Loc, Expressions => Lits)));
10514
10515          Analyze_And_Resolve (N, Typ);
10516       end;
10517    end Resolve_String_Literal;
10518
10519    -----------------------------
10520    -- Resolve_Type_Conversion --
10521    -----------------------------
10522
10523    procedure Resolve_Type_Conversion (N : Node_Id; Typ : Entity_Id) is
10524       Conv_OK     : constant Boolean   := Conversion_OK (N);
10525       Operand     : constant Node_Id   := Expression (N);
10526       Operand_Typ : constant Entity_Id := Etype (Operand);
10527       Target_Typ  : constant Entity_Id := Etype (N);
10528       Rop         : Node_Id;
10529       Orig_N      : Node_Id;
10530       Orig_T      : Node_Id;
10531
10532       Test_Redundant : Boolean := Warn_On_Redundant_Constructs;
10533       --  Set to False to suppress cases where we want to suppress the test
10534       --  for redundancy to avoid possible false positives on this warning.
10535
10536    begin
10537       if not Conv_OK
10538         and then not Valid_Conversion (N, Target_Typ, Operand)
10539       then
10540          return;
10541       end if;
10542
10543       --  If the Operand Etype is Universal_Fixed, then the conversion is
10544       --  never redundant. We need this check because by the time we have
10545       --  finished the rather complex transformation, the conversion looks
10546       --  redundant when it is not.
10547
10548       if Operand_Typ = Universal_Fixed then
10549          Test_Redundant := False;
10550
10551       --  If the operand is marked as Any_Fixed, then special processing is
10552       --  required. This is also a case where we suppress the test for a
10553       --  redundant conversion, since most certainly it is not redundant.
10554
10555       elsif Operand_Typ = Any_Fixed then
10556          Test_Redundant := False;
10557
10558          --  Mixed-mode operation involving a literal. Context must be a fixed
10559          --  type which is applied to the literal subsequently.
10560
10561          if Is_Fixed_Point_Type (Typ) then
10562             Set_Etype (Operand, Universal_Real);
10563
10564          elsif Is_Numeric_Type (Typ)
10565            and then Nkind_In (Operand, N_Op_Multiply, N_Op_Divide)
10566            and then (Etype (Right_Opnd (Operand)) = Universal_Real
10567                        or else
10568                      Etype (Left_Opnd  (Operand)) = Universal_Real)
10569          then
10570             --  Return if expression is ambiguous
10571
10572             if Unique_Fixed_Point_Type (N) = Any_Type then
10573                return;
10574
10575             --  If nothing else, the available fixed type is Duration
10576
10577             else
10578                Set_Etype (Operand, Standard_Duration);
10579             end if;
10580
10581             --  Resolve the real operand with largest available precision
10582
10583             if Etype (Right_Opnd (Operand)) = Universal_Real then
10584                Rop := New_Copy_Tree (Right_Opnd (Operand));
10585             else
10586                Rop := New_Copy_Tree (Left_Opnd (Operand));
10587             end if;
10588
10589             Resolve (Rop, Universal_Real);
10590
10591             --  If the operand is a literal (it could be a non-static and
10592             --  illegal exponentiation) check whether the use of Duration
10593             --  is potentially inaccurate.
10594
10595             if Nkind (Rop) = N_Real_Literal
10596               and then Realval (Rop) /= Ureal_0
10597               and then abs (Realval (Rop)) < Delta_Value (Standard_Duration)
10598             then
10599                Error_Msg_N
10600                  ("??universal real operand can only "
10601                   & "be interpreted as Duration!", Rop);
10602                Error_Msg_N
10603                  ("\??precision will be lost in the conversion!", Rop);
10604             end if;
10605
10606          elsif Is_Numeric_Type (Typ)
10607            and then Nkind (Operand) in N_Op
10608            and then Unique_Fixed_Point_Type (N) /= Any_Type
10609          then
10610             Set_Etype (Operand, Standard_Duration);
10611
10612          else
10613             Error_Msg_N ("invalid context for mixed mode operation", N);
10614             Set_Etype (Operand, Any_Type);
10615             return;
10616          end if;
10617       end if;
10618
10619       Resolve (Operand);
10620
10621       --  In SPARK, a type conversion between array types should be restricted
10622       --  to types which have matching static bounds.
10623
10624       --  Protect call to Matching_Static_Array_Bounds to avoid costly
10625       --  operation if not needed.
10626
10627       if Restriction_Check_Required (SPARK_05)
10628         and then Is_Array_Type (Target_Typ)
10629         and then Is_Array_Type (Operand_Typ)
10630         and then Operand_Typ /= Any_Composite  --  or else Operand in error
10631         and then not Matching_Static_Array_Bounds (Target_Typ, Operand_Typ)
10632       then
10633          Check_SPARK_05_Restriction
10634            ("array types should have matching static bounds", N);
10635       end if;
10636
10637       --  In formal mode, the operand of an ancestor type conversion must be an
10638       --  object (not an expression).
10639
10640       if Is_Tagged_Type (Target_Typ)
10641         and then not Is_Class_Wide_Type (Target_Typ)
10642         and then Is_Tagged_Type (Operand_Typ)
10643         and then not Is_Class_Wide_Type (Operand_Typ)
10644         and then Is_Ancestor (Target_Typ, Operand_Typ)
10645         and then not Is_SPARK_05_Object_Reference (Operand)
10646       then
10647          Check_SPARK_05_Restriction ("object required", Operand);
10648       end if;
10649
10650       Analyze_Dimension (N);
10651
10652       --  Note: we do the Eval_Type_Conversion call before applying the
10653       --  required checks for a subtype conversion. This is important, since
10654       --  both are prepared under certain circumstances to change the type
10655       --  conversion to a constraint error node, but in the case of
10656       --  Eval_Type_Conversion this may reflect an illegality in the static
10657       --  case, and we would miss the illegality (getting only a warning
10658       --  message), if we applied the type conversion checks first.
10659
10660       Eval_Type_Conversion (N);
10661
10662       --  Even when evaluation is not possible, we may be able to simplify the
10663       --  conversion or its expression. This needs to be done before applying
10664       --  checks, since otherwise the checks may use the original expression
10665       --  and defeat the simplifications. This is specifically the case for
10666       --  elimination of the floating-point Truncation attribute in
10667       --  float-to-int conversions.
10668
10669       Simplify_Type_Conversion (N);
10670
10671       --  If after evaluation we still have a type conversion, then we may need
10672       --  to apply checks required for a subtype conversion.
10673
10674       --  Skip these type conversion checks if universal fixed operands
10675       --  operands involved, since range checks are handled separately for
10676       --  these cases (in the appropriate Expand routines in unit Exp_Fixd).
10677
10678       if Nkind (N) = N_Type_Conversion
10679         and then not Is_Generic_Type (Root_Type (Target_Typ))
10680         and then Target_Typ  /= Universal_Fixed
10681         and then Operand_Typ /= Universal_Fixed
10682       then
10683          Apply_Type_Conversion_Checks (N);
10684       end if;
10685
10686       --  Issue warning for conversion of simple object to its own type. We
10687       --  have to test the original nodes, since they may have been rewritten
10688       --  by various optimizations.
10689
10690       Orig_N := Original_Node (N);
10691
10692       --  Here we test for a redundant conversion if the warning mode is
10693       --  active (and was not locally reset), and we have a type conversion
10694       --  from source not appearing in a generic instance.
10695
10696       if Test_Redundant
10697         and then Nkind (Orig_N) = N_Type_Conversion
10698         and then Comes_From_Source (Orig_N)
10699         and then not In_Instance
10700       then
10701          Orig_N := Original_Node (Expression (Orig_N));
10702          Orig_T := Target_Typ;
10703
10704          --  If the node is part of a larger expression, the Target_Type
10705          --  may not be the original type of the node if the context is a
10706          --  condition. Recover original type to see if conversion is needed.
10707
10708          if Is_Boolean_Type (Orig_T)
10709           and then Nkind (Parent (N)) in N_Op
10710          then
10711             Orig_T := Etype (Parent (N));
10712          end if;
10713
10714          --  If we have an entity name, then give the warning if the entity
10715          --  is the right type, or if it is a loop parameter covered by the
10716          --  original type (that's needed because loop parameters have an
10717          --  odd subtype coming from the bounds).
10718
10719          if (Is_Entity_Name (Orig_N)
10720               and then
10721                 (Etype (Entity (Orig_N)) = Orig_T
10722                   or else
10723                     (Ekind (Entity (Orig_N)) = E_Loop_Parameter
10724                       and then Covers (Orig_T, Etype (Entity (Orig_N))))))
10725
10726            --  If not an entity, then type of expression must match
10727
10728            or else Etype (Orig_N) = Orig_T
10729          then
10730             --  One more check, do not give warning if the analyzed conversion
10731             --  has an expression with non-static bounds, and the bounds of the
10732             --  target are static. This avoids junk warnings in cases where the
10733             --  conversion is necessary to establish staticness, for example in
10734             --  a case statement.
10735
10736             if not Is_OK_Static_Subtype (Operand_Typ)
10737               and then Is_OK_Static_Subtype (Target_Typ)
10738             then
10739                null;
10740
10741             --  Finally, if this type conversion occurs in a context requiring
10742             --  a prefix, and the expression is a qualified expression then the
10743             --  type conversion is not redundant, since a qualified expression
10744             --  is not a prefix, whereas a type conversion is. For example, "X
10745             --  := T'(Funx(...)).Y;" is illegal because a selected component
10746             --  requires a prefix, but a type conversion makes it legal: "X :=
10747             --  T(T'(Funx(...))).Y;"
10748
10749             --  In Ada 2012, a qualified expression is a name, so this idiom is
10750             --  no longer needed, but we still suppress the warning because it
10751             --  seems unfriendly for warnings to pop up when you switch to the
10752             --  newer language version.
10753
10754             elsif Nkind (Orig_N) = N_Qualified_Expression
10755               and then Nkind_In (Parent (N), N_Attribute_Reference,
10756                                              N_Indexed_Component,
10757                                              N_Selected_Component,
10758                                              N_Slice,
10759                                              N_Explicit_Dereference)
10760             then
10761                null;
10762
10763             --  Never warn on conversion to Long_Long_Integer'Base since
10764             --  that is most likely an artifact of the extended overflow
10765             --  checking and comes from complex expanded code.
10766
10767             elsif Orig_T = Base_Type (Standard_Long_Long_Integer) then
10768                null;
10769
10770             --  Here we give the redundant conversion warning. If it is an
10771             --  entity, give the name of the entity in the message. If not,
10772             --  just mention the expression.
10773
10774             --  Shoudn't we test Warn_On_Redundant_Constructs here ???
10775
10776             else
10777                if Is_Entity_Name (Orig_N) then
10778                   Error_Msg_Node_2 := Orig_T;
10779                   Error_Msg_NE -- CODEFIX
10780                     ("??redundant conversion, & is of type &!",
10781                      N, Entity (Orig_N));
10782                else
10783                   Error_Msg_NE
10784                     ("??redundant conversion, expression is of type&!",
10785                      N, Orig_T);
10786                end if;
10787             end if;
10788          end if;
10789       end if;
10790
10791       --  Ada 2005 (AI-251): Handle class-wide interface type conversions.
10792       --  No need to perform any interface conversion if the type of the
10793       --  expression coincides with the target type.
10794
10795       if Ada_Version >= Ada_2005
10796         and then Expander_Active
10797         and then Operand_Typ /= Target_Typ
10798       then
10799          declare
10800             Opnd   : Entity_Id := Operand_Typ;
10801             Target : Entity_Id := Target_Typ;
10802
10803          begin
10804             --  If the type of the operand is a limited view, use the non-
10805             --  limited view when available.
10806
10807             if From_Limited_With (Opnd)
10808               and then Ekind (Opnd) in Incomplete_Kind
10809               and then Present (Non_Limited_View (Opnd))
10810             then
10811                Opnd := Non_Limited_View (Opnd);
10812                Set_Etype (Expression (N), Opnd);
10813             end if;
10814
10815             if Is_Access_Type (Opnd) then
10816                Opnd := Designated_Type (Opnd);
10817             end if;
10818
10819             if Is_Access_Type (Target_Typ) then
10820                Target := Designated_Type (Target);
10821             end if;
10822
10823             if Opnd = Target then
10824                null;
10825
10826             --  Conversion from interface type
10827
10828             elsif Is_Interface (Opnd) then
10829
10830                --  Ada 2005 (AI-217): Handle entities from limited views
10831
10832                if From_Limited_With (Opnd) then
10833                   Error_Msg_Qual_Level := 99;
10834                   Error_Msg_NE -- CODEFIX
10835                     ("missing WITH clause on package &", N,
10836                     Cunit_Entity (Get_Source_Unit (Base_Type (Opnd))));
10837                   Error_Msg_N
10838                     ("type conversions require visibility of the full view",
10839                      N);
10840
10841                elsif From_Limited_With (Target)
10842                  and then not
10843                    (Is_Access_Type (Target_Typ)
10844                       and then Present (Non_Limited_View (Etype (Target))))
10845                then
10846                   Error_Msg_Qual_Level := 99;
10847                   Error_Msg_NE -- CODEFIX
10848                     ("missing WITH clause on package &", N,
10849                     Cunit_Entity (Get_Source_Unit (Base_Type (Target))));
10850                   Error_Msg_N
10851                     ("type conversions require visibility of the full view",
10852                      N);
10853
10854                else
10855                   Expand_Interface_Conversion (N);
10856                end if;
10857
10858             --  Conversion to interface type
10859
10860             elsif Is_Interface (Target) then
10861
10862                --  Handle subtypes
10863
10864                if Ekind_In (Opnd, E_Protected_Subtype, E_Task_Subtype) then
10865                   Opnd := Etype (Opnd);
10866                end if;
10867
10868                if Is_Class_Wide_Type (Opnd)
10869                  or else Interface_Present_In_Ancestor
10870                            (Typ   => Opnd,
10871                             Iface => Target)
10872                then
10873                   Expand_Interface_Conversion (N);
10874                else
10875                   Error_Msg_Name_1 := Chars (Etype (Target));
10876                   Error_Msg_Name_2 := Chars (Opnd);
10877                   Error_Msg_N
10878                     ("wrong interface conversion (% is not a progenitor "
10879                      & "of %)", N);
10880                end if;
10881             end if;
10882          end;
10883       end if;
10884
10885       --  Ada 2012: if target type has predicates, the result requires a
10886       --  predicate check. If the context is a call to another predicate
10887       --  check we must prevent infinite recursion.
10888
10889       if Has_Predicates (Target_Typ) then
10890          if Nkind (Parent (N)) = N_Function_Call
10891            and then Present (Name (Parent (N)))
10892            and then (Is_Predicate_Function (Entity (Name (Parent (N))))
10893                        or else
10894                      Is_Predicate_Function_M (Entity (Name (Parent (N)))))
10895          then
10896             null;
10897
10898          else
10899             Apply_Predicate_Check (N, Target_Typ);
10900          end if;
10901       end if;
10902
10903       --  If at this stage we have a real to integer conversion, make sure
10904       --  that the Do_Range_Check flag is set, because such conversions in
10905       --  general need a range check. We only need this if expansion is off
10906       --  or we are in GNATProve mode.
10907
10908       if Nkind (N) = N_Type_Conversion
10909         and then (GNATprove_Mode or not Expander_Active)
10910         and then Is_Integer_Type (Target_Typ)
10911         and then Is_Real_Type (Operand_Typ)
10912       then
10913          Set_Do_Range_Check (Operand);
10914       end if;
10915    end Resolve_Type_Conversion;
10916
10917    ----------------------
10918    -- Resolve_Unary_Op --
10919    ----------------------
10920
10921    procedure Resolve_Unary_Op (N : Node_Id; Typ : Entity_Id) is
10922       B_Typ : constant Entity_Id := Base_Type (Typ);
10923       R     : constant Node_Id   := Right_Opnd (N);
10924       OK    : Boolean;
10925       Lo    : Uint;
10926       Hi    : Uint;
10927
10928    begin
10929       if Is_Modular_Integer_Type (Typ) and then Nkind (N) /= N_Op_Not then
10930          Error_Msg_Name_1 := Chars (Typ);
10931          Check_SPARK_05_Restriction
10932            ("unary operator not defined for modular type%", N);
10933       end if;
10934
10935       --  Deal with intrinsic unary operators
10936
10937       if Comes_From_Source (N)
10938         and then Ekind (Entity (N)) = E_Function
10939         and then Is_Imported (Entity (N))
10940         and then Is_Intrinsic_Subprogram (Entity (N))
10941       then
10942          Resolve_Intrinsic_Unary_Operator (N, Typ);
10943          return;
10944       end if;
10945
10946       --  Deal with universal cases
10947
10948       if Etype (R) = Universal_Integer
10949            or else
10950          Etype (R) = Universal_Real
10951       then
10952          Check_For_Visible_Operator (N, B_Typ);
10953       end if;
10954
10955       Set_Etype (N, B_Typ);
10956       Resolve (R, B_Typ);
10957
10958       --  Generate warning for expressions like abs (x mod 2)
10959
10960       if Warn_On_Redundant_Constructs
10961         and then Nkind (N) = N_Op_Abs
10962       then
10963          Determine_Range (Right_Opnd (N), OK, Lo, Hi);
10964
10965          if OK and then Hi >= Lo and then Lo >= 0 then
10966             Error_Msg_N -- CODEFIX
10967              ("?r?abs applied to known non-negative value has no effect", N);
10968          end if;
10969       end if;
10970
10971       --  Deal with reference generation
10972
10973       Check_Unset_Reference (R);
10974       Generate_Operator_Reference (N, B_Typ);
10975       Analyze_Dimension (N);
10976       Eval_Unary_Op (N);
10977
10978       --  Set overflow checking bit. Much cleverer code needed here eventually
10979       --  and perhaps the Resolve routines should be separated for the various
10980       --  arithmetic operations, since they will need different processing ???
10981
10982       if Nkind (N) in N_Op then
10983          if not Overflow_Checks_Suppressed (Etype (N)) then
10984             Enable_Overflow_Check (N);
10985          end if;
10986       end if;
10987
10988       --  Generate warning for expressions like -5 mod 3 for integers. No need
10989       --  to worry in the floating-point case, since parens do not affect the
10990       --  result so there is no point in giving in a warning.
10991
10992       declare
10993          Norig : constant Node_Id := Original_Node (N);
10994          Rorig : Node_Id;
10995          Val   : Uint;
10996          HB    : Uint;
10997          LB    : Uint;
10998          Lval  : Uint;
10999          Opnd  : Node_Id;
11000
11001       begin
11002          if Warn_On_Questionable_Missing_Parens
11003            and then Comes_From_Source (Norig)
11004            and then Is_Integer_Type (Typ)
11005            and then Nkind (Norig) = N_Op_Minus
11006          then
11007             Rorig := Original_Node (Right_Opnd (Norig));
11008
11009             --  We are looking for cases where the right operand is not
11010             --  parenthesized, and is a binary operator, multiply, divide, or
11011             --  mod. These are the cases where the grouping can affect results.
11012
11013             if Paren_Count (Rorig) = 0
11014               and then Nkind_In (Rorig, N_Op_Mod, N_Op_Multiply, N_Op_Divide)
11015             then
11016                --  For mod, we always give the warning, since the value is
11017                --  affected by the parenthesization (e.g. (-5) mod 315 /=
11018                --  -(5 mod 315)). But for the other cases, the only concern is
11019                --  overflow, e.g. for the case of 8 big signed (-(2 * 64)
11020                --  overflows, but (-2) * 64 does not). So we try to give the
11021                --  message only when overflow is possible.
11022
11023                if Nkind (Rorig) /= N_Op_Mod
11024                  and then Compile_Time_Known_Value (R)
11025                then
11026                   Val := Expr_Value (R);
11027
11028                   if Compile_Time_Known_Value (Type_High_Bound (Typ)) then
11029                      HB := Expr_Value (Type_High_Bound (Typ));
11030                   else
11031                      HB := Expr_Value (Type_High_Bound (Base_Type (Typ)));
11032                   end if;
11033
11034                   if Compile_Time_Known_Value (Type_Low_Bound (Typ)) then
11035                      LB := Expr_Value (Type_Low_Bound (Typ));
11036                   else
11037                      LB := Expr_Value (Type_Low_Bound (Base_Type (Typ)));
11038                   end if;
11039
11040                   --  Note that the test below is deliberately excluding the
11041                   --  largest negative number, since that is a potentially
11042                   --  troublesome case (e.g. -2 * x, where the result is the
11043                   --  largest negative integer has an overflow with 2 * x).
11044
11045                   if Val > LB and then Val <= HB then
11046                      return;
11047                   end if;
11048                end if;
11049
11050                --  For the multiplication case, the only case we have to worry
11051                --  about is when (-a)*b is exactly the largest negative number
11052                --  so that -(a*b) can cause overflow. This can only happen if
11053                --  a is a power of 2, and more generally if any operand is a
11054                --  constant that is not a power of 2, then the parentheses
11055                --  cannot affect whether overflow occurs. We only bother to
11056                --  test the left most operand
11057
11058                --  Loop looking at left operands for one that has known value
11059
11060                Opnd := Rorig;
11061                Opnd_Loop : while Nkind (Opnd) = N_Op_Multiply loop
11062                   if Compile_Time_Known_Value (Left_Opnd (Opnd)) then
11063                      Lval := UI_Abs (Expr_Value (Left_Opnd (Opnd)));
11064
11065                      --  Operand value of 0 or 1 skips warning
11066
11067                      if Lval <= 1 then
11068                         return;
11069
11070                      --  Otherwise check power of 2, if power of 2, warn, if
11071                      --  anything else, skip warning.
11072
11073                      else
11074                         while Lval /= 2 loop
11075                            if Lval mod 2 = 1 then
11076                               return;
11077                            else
11078                               Lval := Lval / 2;
11079                            end if;
11080                         end loop;
11081
11082                         exit Opnd_Loop;
11083                      end if;
11084                   end if;
11085
11086                   --  Keep looking at left operands
11087
11088                   Opnd := Left_Opnd (Opnd);
11089                end loop Opnd_Loop;
11090
11091                --  For rem or "/" we can only have a problematic situation
11092                --  if the divisor has a value of minus one or one. Otherwise
11093                --  overflow is impossible (divisor > 1) or we have a case of
11094                --  division by zero in any case.
11095
11096                if Nkind_In (Rorig, N_Op_Divide, N_Op_Rem)
11097                  and then Compile_Time_Known_Value (Right_Opnd (Rorig))
11098                  and then UI_Abs (Expr_Value (Right_Opnd (Rorig))) /= 1
11099                then
11100                   return;
11101                end if;
11102
11103                --  If we fall through warning should be issued
11104
11105                --  Shouldn't we test Warn_On_Questionable_Missing_Parens ???
11106
11107                Error_Msg_N
11108                  ("??unary minus expression should be parenthesized here!", N);
11109             end if;
11110          end if;
11111       end;
11112    end Resolve_Unary_Op;
11113
11114    ----------------------------------
11115    -- Resolve_Unchecked_Expression --
11116    ----------------------------------
11117
11118    procedure Resolve_Unchecked_Expression
11119      (N   : Node_Id;
11120       Typ : Entity_Id)
11121    is
11122    begin
11123       Resolve (Expression (N), Typ, Suppress => All_Checks);
11124       Set_Etype (N, Typ);
11125    end Resolve_Unchecked_Expression;
11126
11127    ---------------------------------------
11128    -- Resolve_Unchecked_Type_Conversion --
11129    ---------------------------------------
11130
11131    procedure Resolve_Unchecked_Type_Conversion
11132      (N   : Node_Id;
11133       Typ : Entity_Id)
11134    is
11135       pragma Warnings (Off, Typ);
11136
11137       Operand   : constant Node_Id   := Expression (N);
11138       Opnd_Type : constant Entity_Id := Etype (Operand);
11139
11140    begin
11141       --  Resolve operand using its own type
11142
11143       Resolve (Operand, Opnd_Type);
11144
11145       --  In an inlined context, the unchecked conversion may be applied
11146       --  to a literal, in which case its type is the type of the context.
11147       --  (In other contexts conversions cannot apply to literals).
11148
11149       if In_Inlined_Body
11150         and then (Opnd_Type = Any_Character or else
11151                   Opnd_Type = Any_Integer   or else
11152                   Opnd_Type = Any_Real)
11153       then
11154          Set_Etype (Operand, Typ);
11155       end if;
11156
11157       Analyze_Dimension (N);
11158       Eval_Unchecked_Conversion (N);
11159    end Resolve_Unchecked_Type_Conversion;
11160
11161    ------------------------------
11162    -- Rewrite_Operator_As_Call --
11163    ------------------------------
11164
11165    procedure Rewrite_Operator_As_Call (N : Node_Id; Nam : Entity_Id) is
11166       Loc     : constant Source_Ptr := Sloc (N);
11167       Actuals : constant List_Id    := New_List;
11168       New_N   : Node_Id;
11169
11170    begin
11171       if Nkind (N) in  N_Binary_Op then
11172          Append (Left_Opnd (N), Actuals);
11173       end if;
11174
11175       Append (Right_Opnd (N), Actuals);
11176
11177       New_N :=
11178         Make_Function_Call (Sloc => Loc,
11179           Name => New_Occurrence_Of (Nam, Loc),
11180           Parameter_Associations => Actuals);
11181
11182       Preserve_Comes_From_Source (New_N, N);
11183       Preserve_Comes_From_Source (Name (New_N), N);
11184       Rewrite (N, New_N);
11185       Set_Etype (N, Etype (Nam));
11186    end Rewrite_Operator_As_Call;
11187
11188    ------------------------------
11189    -- Rewrite_Renamed_Operator --
11190    ------------------------------
11191
11192    procedure Rewrite_Renamed_Operator
11193      (N   : Node_Id;
11194       Op  : Entity_Id;
11195       Typ : Entity_Id)
11196    is
11197       Nam       : constant Name_Id := Chars (Op);
11198       Is_Binary : constant Boolean := Nkind (N) in N_Binary_Op;
11199       Op_Node   : Node_Id;
11200
11201    begin
11202       --  Do not perform this transformation within a pre/postcondition,
11203       --  because the expression will be re-analyzed, and the transformation
11204       --  might affect the visibility of the operator, e.g. in an instance.
11205
11206       if In_Assertion_Expr > 0 then
11207          return;
11208       end if;
11209
11210       --  Rewrite the operator node using the real operator, not its renaming.
11211       --  Exclude user-defined intrinsic operations of the same name, which are
11212       --  treated separately and rewritten as calls.
11213
11214       if Ekind (Op) /= E_Function or else Chars (N) /= Nam then
11215          Op_Node := New_Node (Operator_Kind (Nam, Is_Binary), Sloc (N));
11216          Set_Chars      (Op_Node, Nam);
11217          Set_Etype      (Op_Node, Etype (N));
11218          Set_Entity     (Op_Node, Op);
11219          Set_Right_Opnd (Op_Node, Right_Opnd (N));
11220
11221          --  Indicate that both the original entity and its renaming are
11222          --  referenced at this point.
11223
11224          Generate_Reference (Entity (N), N);
11225          Generate_Reference (Op, N);
11226
11227          if Is_Binary then
11228             Set_Left_Opnd  (Op_Node, Left_Opnd  (N));
11229          end if;
11230
11231          Rewrite (N, Op_Node);
11232
11233          --  If the context type is private, add the appropriate conversions so
11234          --  that the operator is applied to the full view. This is done in the
11235          --  routines that resolve intrinsic operators.
11236
11237          if Is_Intrinsic_Subprogram (Op)
11238            and then Is_Private_Type (Typ)
11239          then
11240             case Nkind (N) is
11241                when N_Op_Add   | N_Op_Subtract | N_Op_Multiply | N_Op_Divide |
11242                     N_Op_Expon | N_Op_Mod      | N_Op_Rem      =>
11243                   Resolve_Intrinsic_Operator (N, Typ);
11244
11245                when N_Op_Plus  | N_Op_Minus    | N_Op_Abs      =>
11246                   Resolve_Intrinsic_Unary_Operator (N, Typ);
11247
11248                when others =>
11249                   Resolve (N, Typ);
11250             end case;
11251          end if;
11252
11253       elsif Ekind (Op) = E_Function and then Is_Intrinsic_Subprogram (Op) then
11254
11255          --  Operator renames a user-defined operator of the same name. Use the
11256          --  original operator in the node, which is the one Gigi knows about.
11257
11258          Set_Entity (N, Op);
11259          Set_Is_Overloaded (N, False);
11260       end if;
11261    end Rewrite_Renamed_Operator;
11262
11263    -----------------------
11264    -- Set_Slice_Subtype --
11265    -----------------------
11266
11267    --  Build an implicit subtype declaration to represent the type delivered by
11268    --  the slice. This is an abbreviated version of an array subtype. We define
11269    --  an index subtype for the slice, using either the subtype name or the
11270    --  discrete range of the slice. To be consistent with index usage elsewhere
11271    --  we create a list header to hold the single index. This list is not
11272    --  otherwise attached to the syntax tree.
11273
11274    procedure Set_Slice_Subtype (N : Node_Id) is
11275       Loc           : constant Source_Ptr := Sloc (N);
11276       Index_List    : constant List_Id    := New_List;
11277       Index         : Node_Id;
11278       Index_Subtype : Entity_Id;
11279       Index_Type    : Entity_Id;
11280       Slice_Subtype : Entity_Id;
11281       Drange        : constant Node_Id := Discrete_Range (N);
11282
11283    begin
11284       Index_Type := Base_Type (Etype (Drange));
11285
11286       if Is_Entity_Name (Drange) then
11287          Index_Subtype := Entity (Drange);
11288
11289       else
11290          --  We force the evaluation of a range. This is definitely needed in
11291          --  the renamed case, and seems safer to do unconditionally. Note in
11292          --  any case that since we will create and insert an Itype referring
11293          --  to this range, we must make sure any side effect removal actions
11294          --  are inserted before the Itype definition.
11295
11296          if Nkind (Drange) = N_Range then
11297             Force_Evaluation (Low_Bound (Drange));
11298             Force_Evaluation (High_Bound (Drange));
11299
11300          --  If the discrete range is given by a subtype indication, the
11301          --  type of the slice is the base of the subtype mark.
11302
11303          elsif Nkind (Drange) = N_Subtype_Indication then
11304             declare
11305                R : constant Node_Id := Range_Expression (Constraint (Drange));
11306             begin
11307                Index_Type := Base_Type (Entity (Subtype_Mark (Drange)));
11308                Force_Evaluation (Low_Bound  (R));
11309                Force_Evaluation (High_Bound (R));
11310             end;
11311          end if;
11312
11313          Index_Subtype := Create_Itype (Subtype_Kind (Ekind (Index_Type)), N);
11314
11315          --  Take a new copy of Drange (where bounds have been rewritten to
11316          --  reference side-effect-free names). Using a separate tree ensures
11317          --  that further expansion (e.g. while rewriting a slice assignment
11318          --  into a FOR loop) does not attempt to remove side effects on the
11319          --  bounds again (which would cause the bounds in the index subtype
11320          --  definition to refer to temporaries before they are defined) (the
11321          --  reason is that some names are considered side effect free here
11322          --  for the subtype, but not in the context of a loop iteration
11323          --  scheme).
11324
11325          Set_Scalar_Range (Index_Subtype, New_Copy_Tree (Drange));
11326          Set_Parent       (Scalar_Range (Index_Subtype), Index_Subtype);
11327          Set_Etype        (Index_Subtype, Index_Type);
11328          Set_Size_Info    (Index_Subtype, Index_Type);
11329          Set_RM_Size      (Index_Subtype, RM_Size (Index_Type));
11330       end if;
11331
11332       Slice_Subtype := Create_Itype (E_Array_Subtype, N);
11333
11334       Index := New_Occurrence_Of (Index_Subtype, Loc);
11335       Set_Etype (Index, Index_Subtype);
11336       Append (Index, Index_List);
11337
11338       Set_First_Index    (Slice_Subtype, Index);
11339       Set_Etype          (Slice_Subtype, Base_Type (Etype (N)));
11340       Set_Is_Constrained (Slice_Subtype, True);
11341
11342       Check_Compile_Time_Size (Slice_Subtype);
11343
11344       --  The Etype of the existing Slice node is reset to this slice subtype.
11345       --  Its bounds are obtained from its first index.
11346
11347       Set_Etype (N, Slice_Subtype);
11348
11349       --  For packed slice subtypes, freeze immediately (except in the case of
11350       --  being in a "spec expression" where we never freeze when we first see
11351       --  the expression).
11352
11353       if Is_Packed (Slice_Subtype) and not In_Spec_Expression then
11354          Freeze_Itype (Slice_Subtype, N);
11355
11356       --  For all other cases insert an itype reference in the slice's actions
11357       --  so that the itype is frozen at the proper place in the tree (i.e. at
11358       --  the point where actions for the slice are analyzed). Note that this
11359       --  is different from freezing the itype immediately, which might be
11360       --  premature (e.g. if the slice is within a transient scope). This needs
11361       --  to be done only if expansion is enabled.
11362
11363       elsif Expander_Active then
11364          Ensure_Defined (Typ => Slice_Subtype, N => N);
11365       end if;
11366    end Set_Slice_Subtype;
11367
11368    --------------------------------
11369    -- Set_String_Literal_Subtype --
11370    --------------------------------
11371
11372    procedure Set_String_Literal_Subtype (N : Node_Id; Typ : Entity_Id) is
11373       Loc        : constant Source_Ptr := Sloc (N);
11374       Low_Bound  : constant Node_Id :=
11375                      Type_Low_Bound (Etype (First_Index (Typ)));
11376       Subtype_Id : Entity_Id;
11377
11378    begin
11379       if Nkind (N) /= N_String_Literal then
11380          return;
11381       end if;
11382
11383       Subtype_Id := Create_Itype (E_String_Literal_Subtype, N);
11384       Set_String_Literal_Length (Subtype_Id, UI_From_Int
11385                                                (String_Length (Strval (N))));
11386       Set_Etype          (Subtype_Id, Base_Type (Typ));
11387       Set_Is_Constrained (Subtype_Id);
11388       Set_Etype          (N, Subtype_Id);
11389
11390       --  The low bound is set from the low bound of the corresponding index
11391       --  type. Note that we do not store the high bound in the string literal
11392       --  subtype, but it can be deduced if necessary from the length and the
11393       --  low bound.
11394
11395       if Is_OK_Static_Expression (Low_Bound) then
11396          Set_String_Literal_Low_Bound (Subtype_Id, Low_Bound);
11397
11398       --  If the lower bound is not static we create a range for the string
11399       --  literal, using the index type and the known length of the literal.
11400       --  The index type is not necessarily Positive, so the upper bound is
11401       --  computed as T'Val (T'Pos (Low_Bound) + L - 1).
11402
11403       else
11404          declare
11405             Index_List : constant List_Id   := New_List;
11406             Index_Type : constant Entity_Id := Etype (First_Index (Typ));
11407             High_Bound : constant Node_Id   :=
11408                            Make_Attribute_Reference (Loc,
11409                              Attribute_Name => Name_Val,
11410                              Prefix         =>
11411                                New_Occurrence_Of (Index_Type, Loc),
11412                              Expressions    => New_List (
11413                                Make_Op_Add (Loc,
11414                                  Left_Opnd  =>
11415                                    Make_Attribute_Reference (Loc,
11416                                      Attribute_Name => Name_Pos,
11417                                      Prefix         =>
11418                                        New_Occurrence_Of (Index_Type, Loc),
11419                                      Expressions    =>
11420                                        New_List (New_Copy_Tree (Low_Bound))),
11421                                  Right_Opnd =>
11422                                    Make_Integer_Literal (Loc,
11423                                      String_Length (Strval (N)) - 1))));
11424
11425             Array_Subtype : Entity_Id;
11426             Drange        : Node_Id;
11427             Index         : Node_Id;
11428             Index_Subtype : Entity_Id;
11429
11430          begin
11431             if Is_Integer_Type (Index_Type) then
11432                Set_String_Literal_Low_Bound
11433                  (Subtype_Id, Make_Integer_Literal (Loc, 1));
11434
11435             else
11436                --  If the index type is an enumeration type, build bounds
11437                --  expression with attributes.
11438
11439                Set_String_Literal_Low_Bound
11440                  (Subtype_Id,
11441                   Make_Attribute_Reference (Loc,
11442                     Attribute_Name => Name_First,
11443                     Prefix         =>
11444                       New_Occurrence_Of (Base_Type (Index_Type), Loc)));
11445                Set_Etype (String_Literal_Low_Bound (Subtype_Id), Index_Type);
11446             end if;
11447
11448             Analyze_And_Resolve (String_Literal_Low_Bound (Subtype_Id));
11449
11450             --  Build bona fide subtype for the string, and wrap it in an
11451             --  unchecked conversion, because the backend expects the
11452             --  String_Literal_Subtype to have a static lower bound.
11453
11454             Index_Subtype :=
11455               Create_Itype (Subtype_Kind (Ekind (Index_Type)), N);
11456             Drange := Make_Range (Loc, New_Copy_Tree (Low_Bound), High_Bound);
11457             Set_Scalar_Range (Index_Subtype, Drange);
11458             Set_Parent (Drange, N);
11459             Analyze_And_Resolve (Drange, Index_Type);
11460
11461             --  In the context, the Index_Type may already have a constraint,
11462             --  so use common base type on string subtype. The base type may
11463             --  be used when generating attributes of the string, for example
11464             --  in the context of a slice assignment.
11465
11466             Set_Etype     (Index_Subtype, Base_Type (Index_Type));
11467             Set_Size_Info (Index_Subtype, Index_Type);
11468             Set_RM_Size   (Index_Subtype, RM_Size (Index_Type));
11469
11470             Array_Subtype := Create_Itype (E_Array_Subtype, N);
11471
11472             Index := New_Occurrence_Of (Index_Subtype, Loc);
11473             Set_Etype (Index, Index_Subtype);
11474             Append (Index, Index_List);
11475
11476             Set_First_Index    (Array_Subtype, Index);
11477             Set_Etype          (Array_Subtype, Base_Type (Typ));
11478             Set_Is_Constrained (Array_Subtype, True);
11479
11480             Rewrite (N,
11481               Make_Unchecked_Type_Conversion (Loc,
11482                 Subtype_Mark => New_Occurrence_Of (Array_Subtype, Loc),
11483                 Expression   => Relocate_Node (N)));
11484             Set_Etype (N, Array_Subtype);
11485          end;
11486       end if;
11487    end Set_String_Literal_Subtype;
11488
11489    ------------------------------
11490    -- Simplify_Type_Conversion --
11491    ------------------------------
11492
11493    procedure Simplify_Type_Conversion (N : Node_Id) is
11494    begin
11495       if Nkind (N) = N_Type_Conversion then
11496          declare
11497             Operand    : constant Node_Id   := Expression (N);
11498             Target_Typ : constant Entity_Id := Etype (N);
11499             Opnd_Typ   : constant Entity_Id := Etype (Operand);
11500
11501          begin
11502             --  Special processing if the conversion is the expression of a
11503             --  Rounding or Truncation attribute reference. In this case we
11504             --  replace:
11505
11506             --     ityp (ftyp'Rounding (x)) or ityp (ftyp'Truncation (x))
11507
11508             --  by
11509
11510             --     ityp (x)
11511
11512             --  with the Float_Truncate flag set to False or True respectively,
11513             --  which is more efficient.
11514
11515             if Is_Floating_Point_Type (Opnd_Typ)
11516               and then
11517                 (Is_Integer_Type (Target_Typ)
11518                   or else (Is_Fixed_Point_Type (Target_Typ)
11519                             and then Conversion_OK (N)))
11520               and then Nkind (Operand) = N_Attribute_Reference
11521               and then Nam_In (Attribute_Name (Operand), Name_Rounding,
11522                                                          Name_Truncation)
11523             then
11524                declare
11525                   Truncate : constant Boolean :=
11526                                Attribute_Name (Operand) = Name_Truncation;
11527                begin
11528                   Rewrite (Operand,
11529                     Relocate_Node (First (Expressions (Operand))));
11530                   Set_Float_Truncate (N, Truncate);
11531                end;
11532             end if;
11533          end;
11534       end if;
11535    end Simplify_Type_Conversion;
11536
11537    -----------------------------
11538    -- Unique_Fixed_Point_Type --
11539    -----------------------------
11540
11541    function Unique_Fixed_Point_Type (N : Node_Id) return Entity_Id is
11542       T1   : Entity_Id := Empty;
11543       T2   : Entity_Id;
11544       Item : Node_Id;
11545       Scop : Entity_Id;
11546
11547       procedure Fixed_Point_Error;
11548       --  Give error messages for true ambiguity. Messages are posted on node
11549       --  N, and entities T1, T2 are the possible interpretations.
11550
11551       -----------------------
11552       -- Fixed_Point_Error --
11553       -----------------------
11554
11555       procedure Fixed_Point_Error is
11556       begin
11557          Error_Msg_N ("ambiguous universal_fixed_expression", N);
11558          Error_Msg_NE ("\\possible interpretation as}", N, T1);
11559          Error_Msg_NE ("\\possible interpretation as}", N, T2);
11560       end Fixed_Point_Error;
11561
11562    --  Start of processing for Unique_Fixed_Point_Type
11563
11564    begin
11565       --  The operations on Duration are visible, so Duration is always a
11566       --  possible interpretation.
11567
11568       T1 := Standard_Duration;
11569
11570       --  Look for fixed-point types in enclosing scopes
11571
11572       Scop := Current_Scope;
11573       while Scop /= Standard_Standard loop
11574          T2 := First_Entity (Scop);
11575          while Present (T2) loop
11576             if Is_Fixed_Point_Type (T2)
11577               and then Current_Entity (T2) = T2
11578               and then Scope (Base_Type (T2)) = Scop
11579             then
11580                if Present (T1) then
11581                   Fixed_Point_Error;
11582                   return Any_Type;
11583                else
11584                   T1 := T2;
11585                end if;
11586             end if;
11587
11588             Next_Entity (T2);
11589          end loop;
11590
11591          Scop := Scope (Scop);
11592       end loop;
11593
11594       --  Look for visible fixed type declarations in the context
11595
11596       Item := First (Context_Items (Cunit (Current_Sem_Unit)));
11597       while Present (Item) loop
11598          if Nkind (Item) = N_With_Clause then
11599             Scop := Entity (Name (Item));
11600             T2 := First_Entity (Scop);
11601             while Present (T2) loop
11602                if Is_Fixed_Point_Type (T2)
11603                  and then Scope (Base_Type (T2)) = Scop
11604                  and then (Is_Potentially_Use_Visible (T2) or else In_Use (T2))
11605                then
11606                   if Present (T1) then
11607                      Fixed_Point_Error;
11608                      return Any_Type;
11609                   else
11610                      T1 := T2;
11611                   end if;
11612                end if;
11613
11614                Next_Entity (T2);
11615             end loop;
11616          end if;
11617
11618          Next (Item);
11619       end loop;
11620
11621       if Nkind (N) = N_Real_Literal then
11622          Error_Msg_NE
11623            ("??real literal interpreted as }!", N, T1);
11624       else
11625          Error_Msg_NE
11626            ("??universal_fixed expression interpreted as }!", N, T1);
11627       end if;
11628
11629       return T1;
11630    end Unique_Fixed_Point_Type;
11631
11632    ----------------------
11633    -- Valid_Conversion --
11634    ----------------------
11635
11636    function Valid_Conversion
11637      (N           : Node_Id;
11638       Target      : Entity_Id;
11639       Operand     : Node_Id;
11640       Report_Errs : Boolean := True) return Boolean
11641    is
11642       Target_Type  : constant Entity_Id := Base_Type (Target);
11643       Opnd_Type    : Entity_Id          := Etype (Operand);
11644       Inc_Ancestor : Entity_Id;
11645
11646       function Conversion_Check
11647         (Valid : Boolean;
11648          Msg   : String) return Boolean;
11649       --  Little routine to post Msg if Valid is False, returns Valid value
11650
11651       procedure Conversion_Error_N (Msg : String; N : Node_Or_Entity_Id);
11652       --  If Report_Errs, then calls Errout.Error_Msg_N with its arguments
11653
11654       procedure Conversion_Error_NE
11655         (Msg : String;
11656          N   : Node_Or_Entity_Id;
11657          E   : Node_Or_Entity_Id);
11658       --  If Report_Errs, then calls Errout.Error_Msg_NE with its arguments
11659
11660       function Valid_Tagged_Conversion
11661         (Target_Type : Entity_Id;
11662          Opnd_Type   : Entity_Id) return Boolean;
11663       --  Specifically test for validity of tagged conversions
11664
11665       function Valid_Array_Conversion return Boolean;
11666       --  Check index and component conformance, and accessibility levels if
11667       --  the component types are anonymous access types (Ada 2005).
11668
11669       ----------------------
11670       -- Conversion_Check --
11671       ----------------------
11672
11673       function Conversion_Check
11674         (Valid : Boolean;
11675          Msg   : String) return Boolean
11676       is
11677       begin
11678          if not Valid
11679
11680             --  A generic unit has already been analyzed and we have verified
11681             --  that a particular conversion is OK in that context. Since the
11682             --  instance is reanalyzed without relying on the relationships
11683             --  established during the analysis of the generic, it is possible
11684             --  to end up with inconsistent views of private types. Do not emit
11685             --  the error message in such cases. The rest of the machinery in
11686             --  Valid_Conversion still ensures the proper compatibility of
11687             --  target and operand types.
11688
11689            and then not In_Instance
11690          then
11691             Conversion_Error_N (Msg, Operand);
11692          end if;
11693
11694          return Valid;
11695       end Conversion_Check;
11696
11697       ------------------------
11698       -- Conversion_Error_N --
11699       ------------------------
11700
11701       procedure Conversion_Error_N (Msg : String; N : Node_Or_Entity_Id) is
11702       begin
11703          if Report_Errs then
11704             Error_Msg_N (Msg, N);
11705          end if;
11706       end Conversion_Error_N;
11707
11708       -------------------------
11709       -- Conversion_Error_NE --
11710       -------------------------
11711
11712       procedure Conversion_Error_NE
11713         (Msg : String;
11714          N   : Node_Or_Entity_Id;
11715          E   : Node_Or_Entity_Id)
11716       is
11717       begin
11718          if Report_Errs then
11719             Error_Msg_NE (Msg, N, E);
11720          end if;
11721       end Conversion_Error_NE;
11722
11723       ----------------------------
11724       -- Valid_Array_Conversion --
11725       ----------------------------
11726
11727       function Valid_Array_Conversion return Boolean
11728       is
11729          Opnd_Comp_Type : constant Entity_Id := Component_Type (Opnd_Type);
11730          Opnd_Comp_Base : constant Entity_Id := Base_Type (Opnd_Comp_Type);
11731
11732          Opnd_Index      : Node_Id;
11733          Opnd_Index_Type : Entity_Id;
11734
11735          Target_Comp_Type : constant Entity_Id :=
11736                               Component_Type (Target_Type);
11737          Target_Comp_Base : constant Entity_Id :=
11738                               Base_Type (Target_Comp_Type);
11739
11740          Target_Index      : Node_Id;
11741          Target_Index_Type : Entity_Id;
11742
11743       begin
11744          --  Error if wrong number of dimensions
11745
11746          if
11747            Number_Dimensions (Target_Type) /= Number_Dimensions (Opnd_Type)
11748          then
11749             Conversion_Error_N
11750               ("incompatible number of dimensions for conversion", Operand);
11751             return False;
11752
11753          --  Number of dimensions matches
11754
11755          else
11756             --  Loop through indexes of the two arrays
11757
11758             Target_Index := First_Index (Target_Type);
11759             Opnd_Index   := First_Index (Opnd_Type);
11760             while Present (Target_Index) and then Present (Opnd_Index) loop
11761                Target_Index_Type := Etype (Target_Index);
11762                Opnd_Index_Type   := Etype (Opnd_Index);
11763
11764                --  Error if index types are incompatible
11765
11766                if not (Is_Integer_Type (Target_Index_Type)
11767                        and then Is_Integer_Type (Opnd_Index_Type))
11768                  and then (Root_Type (Target_Index_Type)
11769                            /= Root_Type (Opnd_Index_Type))
11770                then
11771                   Conversion_Error_N
11772                     ("incompatible index types for array conversion",
11773                      Operand);
11774                   return False;
11775                end if;
11776
11777                Next_Index (Target_Index);
11778                Next_Index (Opnd_Index);
11779             end loop;
11780
11781             --  If component types have same base type, all set
11782
11783             if Target_Comp_Base  = Opnd_Comp_Base then
11784                null;
11785
11786                --  Here if base types of components are not the same. The only
11787                --  time this is allowed is if we have anonymous access types.
11788
11789                --  The conversion of arrays of anonymous access types can lead
11790                --  to dangling pointers. AI-392 formalizes the accessibility
11791                --  checks that must be applied to such conversions to prevent
11792                --  out-of-scope references.
11793
11794             elsif Ekind_In
11795                     (Target_Comp_Base, E_Anonymous_Access_Type,
11796                                        E_Anonymous_Access_Subprogram_Type)
11797               and then Ekind (Opnd_Comp_Base) = Ekind (Target_Comp_Base)
11798               and then
11799                 Subtypes_Statically_Match (Target_Comp_Type, Opnd_Comp_Type)
11800             then
11801                if Type_Access_Level (Target_Type) <
11802                     Deepest_Type_Access_Level (Opnd_Type)
11803                then
11804                   if In_Instance_Body then
11805                      Error_Msg_Warn := SPARK_Mode /= On;
11806                      Conversion_Error_N
11807                        ("source array type has deeper accessibility "
11808                         & "level than target<<", Operand);
11809                      Conversion_Error_N ("\Program_Error [<<", Operand);
11810                      Rewrite (N,
11811                        Make_Raise_Program_Error (Sloc (N),
11812                          Reason => PE_Accessibility_Check_Failed));
11813                      Set_Etype (N, Target_Type);
11814                      return False;
11815
11816                   --  Conversion not allowed because of accessibility levels
11817
11818                   else
11819                      Conversion_Error_N
11820                        ("source array type has deeper accessibility "
11821                         & "level than target", Operand);
11822                      return False;
11823                   end if;
11824
11825                else
11826                   null;
11827                end if;
11828
11829             --  All other cases where component base types do not match
11830
11831             else
11832                Conversion_Error_N
11833                  ("incompatible component types for array conversion",
11834                   Operand);
11835                return False;
11836             end if;
11837
11838             --  Check that component subtypes statically match. For numeric
11839             --  types this means that both must be either constrained or
11840             --  unconstrained. For enumeration types the bounds must match.
11841             --  All of this is checked in Subtypes_Statically_Match.
11842
11843             if not Subtypes_Statically_Match
11844                      (Target_Comp_Type, Opnd_Comp_Type)
11845             then
11846                Conversion_Error_N
11847                  ("component subtypes must statically match", Operand);
11848                return False;
11849             end if;
11850          end if;
11851
11852          return True;
11853       end Valid_Array_Conversion;
11854
11855       -----------------------------
11856       -- Valid_Tagged_Conversion --
11857       -----------------------------
11858
11859       function Valid_Tagged_Conversion
11860         (Target_Type : Entity_Id;
11861          Opnd_Type   : Entity_Id) return Boolean
11862       is
11863       begin
11864          --  Upward conversions are allowed (RM 4.6(22))
11865
11866          if Covers (Target_Type, Opnd_Type)
11867            or else Is_Ancestor (Target_Type, Opnd_Type)
11868          then
11869             return True;
11870
11871          --  Downward conversion are allowed if the operand is class-wide
11872          --  (RM 4.6(23)).
11873
11874          elsif Is_Class_Wide_Type (Opnd_Type)
11875            and then Covers (Opnd_Type, Target_Type)
11876          then
11877             return True;
11878
11879          elsif Covers (Opnd_Type, Target_Type)
11880            or else Is_Ancestor (Opnd_Type, Target_Type)
11881          then
11882             return
11883               Conversion_Check (False,
11884                 "downward conversion of tagged objects not allowed");
11885
11886          --  Ada 2005 (AI-251): The conversion to/from interface types is
11887          --  always valid
11888
11889          elsif Is_Interface (Target_Type) or else Is_Interface (Opnd_Type) then
11890             return True;
11891
11892          --  If the operand is a class-wide type obtained through a limited_
11893          --  with clause, and the context includes the non-limited view, use
11894          --  it to determine whether the conversion is legal.
11895
11896          elsif Is_Class_Wide_Type (Opnd_Type)
11897            and then From_Limited_With (Opnd_Type)
11898            and then Present (Non_Limited_View (Etype (Opnd_Type)))
11899            and then Is_Interface (Non_Limited_View (Etype (Opnd_Type)))
11900          then
11901             return True;
11902
11903          elsif Is_Access_Type (Opnd_Type)
11904            and then Is_Interface (Directly_Designated_Type (Opnd_Type))
11905          then
11906             return True;
11907
11908          else
11909             Conversion_Error_NE
11910               ("invalid tagged conversion, not compatible with}",
11911                N, First_Subtype (Opnd_Type));
11912             return False;
11913          end if;
11914       end Valid_Tagged_Conversion;
11915
11916    --  Start of processing for Valid_Conversion
11917
11918    begin
11919       Check_Parameterless_Call (Operand);
11920
11921       if Is_Overloaded (Operand) then
11922          declare
11923             I   : Interp_Index;
11924             I1  : Interp_Index;
11925             It  : Interp;
11926             It1 : Interp;
11927             N1  : Entity_Id;
11928             T1  : Entity_Id;
11929
11930          begin
11931             --  Remove procedure calls, which syntactically cannot appear in
11932             --  this context, but which cannot be removed by type checking,
11933             --  because the context does not impose a type.
11934
11935             --  The node may be labelled overloaded, but still contain only one
11936             --  interpretation because others were discarded earlier. If this
11937             --  is the case, retain the single interpretation if legal.
11938
11939             Get_First_Interp (Operand, I, It);
11940             Opnd_Type := It.Typ;
11941             Get_Next_Interp (I, It);
11942
11943             if Present (It.Typ)
11944               and then Opnd_Type /= Standard_Void_Type
11945             then
11946                --  More than one candidate interpretation is available
11947
11948                Get_First_Interp (Operand, I, It);
11949                while Present (It.Typ) loop
11950                   if It.Typ = Standard_Void_Type then
11951                      Remove_Interp (I);
11952                   end if;
11953
11954                   --  When compiling for a system where Address is of a visible
11955                   --  integer type, spurious ambiguities can be produced when
11956                   --  arithmetic operations have a literal operand and return
11957                   --  System.Address or a descendant of it. These ambiguities
11958                   --  are usually resolved by the context, but for conversions
11959                   --  there is no context type and the removal of the spurious
11960                   --  operations must be done explicitly here.
11961
11962                   if not Address_Is_Private
11963                     and then Is_Descendent_Of_Address (It.Typ)
11964                   then
11965                      Remove_Interp (I);
11966                   end if;
11967
11968                   Get_Next_Interp (I, It);
11969                end loop;
11970             end if;
11971
11972             Get_First_Interp (Operand, I, It);
11973             I1  := I;
11974             It1 := It;
11975
11976             if No (It.Typ) then
11977                Conversion_Error_N ("illegal operand in conversion", Operand);
11978                return False;
11979             end if;
11980
11981             Get_Next_Interp (I, It);
11982
11983             if Present (It.Typ) then
11984                N1  := It1.Nam;
11985                T1  := It1.Typ;
11986                It1 :=  Disambiguate (Operand, I1, I, Any_Type);
11987
11988                if It1 = No_Interp then
11989                   Conversion_Error_N
11990                     ("ambiguous operand in conversion", Operand);
11991
11992                   --  If the interpretation involves a standard operator, use
11993                   --  the location of the type, which may be user-defined.
11994
11995                   if Sloc (It.Nam) = Standard_Location then
11996                      Error_Msg_Sloc := Sloc (It.Typ);
11997                   else
11998                      Error_Msg_Sloc := Sloc (It.Nam);
11999                   end if;
12000
12001                   Conversion_Error_N -- CODEFIX
12002                     ("\\possible interpretation#!", Operand);
12003
12004                   if Sloc (N1) = Standard_Location then
12005                      Error_Msg_Sloc := Sloc (T1);
12006                   else
12007                      Error_Msg_Sloc := Sloc (N1);
12008                   end if;
12009
12010                   Conversion_Error_N -- CODEFIX
12011                     ("\\possible interpretation#!", Operand);
12012
12013                   return False;
12014                end if;
12015             end if;
12016
12017             Set_Etype (Operand, It1.Typ);
12018             Opnd_Type := It1.Typ;
12019          end;
12020       end if;
12021
12022       --  Deal with conversion of integer type to address if the pragma
12023       --  Allow_Integer_Address is in effect. We convert the conversion to
12024       --  an unchecked conversion in this case and we are all done.
12025
12026       if Address_Integer_Convert_OK (Opnd_Type, Target_Type) then
12027          Rewrite (N, Unchecked_Convert_To (Target_Type, Expression (N)));
12028          Analyze_And_Resolve (N, Target_Type);
12029          return True;
12030       end if;
12031
12032       --  If we are within a child unit, check whether the type of the
12033       --  expression has an ancestor in a parent unit, in which case it
12034       --  belongs to its derivation class even if the ancestor is private.
12035       --  See RM 7.3.1 (5.2/3).
12036
12037       Inc_Ancestor := Get_Incomplete_View_Of_Ancestor (Opnd_Type);
12038
12039       --  Numeric types
12040
12041       if Is_Numeric_Type (Target_Type) then
12042
12043          --  A universal fixed expression can be converted to any numeric type
12044
12045          if Opnd_Type = Universal_Fixed then
12046             return True;
12047
12048          --  Also no need to check when in an instance or inlined body, because
12049          --  the legality has been established when the template was analyzed.
12050          --  Furthermore, numeric conversions may occur where only a private
12051          --  view of the operand type is visible at the instantiation point.
12052          --  This results in a spurious error if we check that the operand type
12053          --  is a numeric type.
12054
12055          --  Note: in a previous version of this unit, the following tests were
12056          --  applied only for generated code (Comes_From_Source set to False),
12057          --  but in fact the test is required for source code as well, since
12058          --  this situation can arise in source code.
12059
12060          elsif In_Instance or else In_Inlined_Body then
12061             return True;
12062
12063          --  Otherwise we need the conversion check
12064
12065          else
12066             return Conversion_Check
12067                      (Is_Numeric_Type (Opnd_Type)
12068                        or else
12069                          (Present (Inc_Ancestor)
12070                            and then Is_Numeric_Type (Inc_Ancestor)),
12071                       "illegal operand for numeric conversion");
12072          end if;
12073
12074       --  Array types
12075
12076       elsif Is_Array_Type (Target_Type) then
12077          if not Is_Array_Type (Opnd_Type)
12078            or else Opnd_Type = Any_Composite
12079            or else Opnd_Type = Any_String
12080          then
12081             Conversion_Error_N
12082               ("illegal operand for array conversion", Operand);
12083             return False;
12084
12085          else
12086             return Valid_Array_Conversion;
12087          end if;
12088
12089       --  Ada 2005 (AI-251): Internally generated conversions of access to
12090       --  interface types added to force the displacement of the pointer to
12091       --  reference the corresponding dispatch table.
12092
12093       elsif not Comes_From_Source (N)
12094          and then Is_Access_Type (Target_Type)
12095          and then Is_Interface (Designated_Type (Target_Type))
12096       then
12097          return True;
12098
12099       --  Ada 2005 (AI-251): Anonymous access types where target references an
12100       --  interface type.
12101
12102       elsif Ekind_In (Target_Type, E_General_Access_Type,
12103                                    E_Anonymous_Access_Type)
12104         and then Is_Interface (Directly_Designated_Type (Target_Type))
12105       then
12106          --  Check the static accessibility rule of 4.6(17). Note that the
12107          --  check is not enforced when within an instance body, since the
12108          --  RM requires such cases to be caught at run time.
12109
12110          --  If the operand is a rewriting of an allocator no check is needed
12111          --  because there are no accessibility issues.
12112
12113          if Nkind (Original_Node (N)) = N_Allocator then
12114             null;
12115
12116          elsif Ekind (Target_Type) /= E_Anonymous_Access_Type then
12117             if Type_Access_Level (Opnd_Type) >
12118                Deepest_Type_Access_Level (Target_Type)
12119             then
12120                --  In an instance, this is a run-time check, but one we know
12121                --  will fail, so generate an appropriate warning. The raise
12122                --  will be generated by Expand_N_Type_Conversion.
12123
12124                if In_Instance_Body then
12125                   Error_Msg_Warn := SPARK_Mode /= On;
12126                   Conversion_Error_N
12127                     ("cannot convert local pointer to non-local access type<<",
12128                      Operand);
12129                   Conversion_Error_N ("\Program_Error [<<", Operand);
12130
12131                else
12132                   Conversion_Error_N
12133                     ("cannot convert local pointer to non-local access type",
12134                      Operand);
12135                   return False;
12136                end if;
12137
12138             --  Special accessibility checks are needed in the case of access
12139             --  discriminants declared for a limited type.
12140
12141             elsif Ekind (Opnd_Type) = E_Anonymous_Access_Type
12142               and then not Is_Local_Anonymous_Access (Opnd_Type)
12143             then
12144                --  When the operand is a selected access discriminant the check
12145                --  needs to be made against the level of the object denoted by
12146                --  the prefix of the selected name (Object_Access_Level handles
12147                --  checking the prefix of the operand for this case).
12148
12149                if Nkind (Operand) = N_Selected_Component
12150                  and then Object_Access_Level (Operand) >
12151                    Deepest_Type_Access_Level (Target_Type)
12152                then
12153                   --  In an instance, this is a run-time check, but one we know
12154                   --  will fail, so generate an appropriate warning. The raise
12155                   --  will be generated by Expand_N_Type_Conversion.
12156
12157                   if In_Instance_Body then
12158                      Error_Msg_Warn := SPARK_Mode /= On;
12159                      Conversion_Error_N
12160                        ("cannot convert access discriminant to non-local "
12161                         & "access type<<", Operand);
12162                      Conversion_Error_N ("\Program_Error [<<", Operand);
12163
12164                   --  Real error if not in instance body
12165
12166                   else
12167                      Conversion_Error_N
12168                        ("cannot convert access discriminant to non-local "
12169                         & "access type", Operand);
12170                      return False;
12171                   end if;
12172                end if;
12173
12174                --  The case of a reference to an access discriminant from
12175                --  within a limited type declaration (which will appear as
12176                --  a discriminal) is always illegal because the level of the
12177                --  discriminant is considered to be deeper than any (nameable)
12178                --  access type.
12179
12180                if Is_Entity_Name (Operand)
12181                  and then not Is_Local_Anonymous_Access (Opnd_Type)
12182                  and then
12183                    Ekind_In (Entity (Operand), E_In_Parameter, E_Constant)
12184                  and then Present (Discriminal_Link (Entity (Operand)))
12185                then
12186                   Conversion_Error_N
12187                     ("discriminant has deeper accessibility level than target",
12188                      Operand);
12189                   return False;
12190                end if;
12191             end if;
12192          end if;
12193
12194          return True;
12195
12196       --  General and anonymous access types
12197
12198       elsif Ekind_In (Target_Type, E_General_Access_Type,
12199                                    E_Anonymous_Access_Type)
12200           and then
12201             Conversion_Check
12202               (Is_Access_Type (Opnd_Type)
12203                 and then not
12204                   Ekind_In (Opnd_Type, E_Access_Subprogram_Type,
12205                                        E_Access_Protected_Subprogram_Type),
12206                "must be an access-to-object type")
12207       then
12208          if Is_Access_Constant (Opnd_Type)
12209            and then not Is_Access_Constant (Target_Type)
12210          then
12211             Conversion_Error_N
12212               ("access-to-constant operand type not allowed", Operand);
12213             return False;
12214          end if;
12215
12216          --  Check the static accessibility rule of 4.6(17). Note that the
12217          --  check is not enforced when within an instance body, since the RM
12218          --  requires such cases to be caught at run time.
12219
12220          if Ekind (Target_Type) /= E_Anonymous_Access_Type
12221            or else Is_Local_Anonymous_Access (Target_Type)
12222            or else Nkind (Associated_Node_For_Itype (Target_Type)) =
12223                      N_Object_Declaration
12224          then
12225             --  Ada 2012 (AI05-0149): Perform legality checking on implicit
12226             --  conversions from an anonymous access type to a named general
12227             --  access type. Such conversions are not allowed in the case of
12228             --  access parameters and stand-alone objects of an anonymous
12229             --  access type. The implicit conversion case is recognized by
12230             --  testing that Comes_From_Source is False and that it's been
12231             --  rewritten. The Comes_From_Source test isn't sufficient because
12232             --  nodes in inlined calls to predefined library routines can have
12233             --  Comes_From_Source set to False. (Is there a better way to test
12234             --  for implicit conversions???)
12235
12236             if Ada_Version >= Ada_2012
12237               and then not Comes_From_Source (N)
12238               and then N /= Original_Node (N)
12239               and then Ekind (Target_Type) = E_General_Access_Type
12240               and then Ekind (Opnd_Type) = E_Anonymous_Access_Type
12241             then
12242                if Is_Itype (Opnd_Type) then
12243
12244                   --  Implicit conversions aren't allowed for objects of an
12245                   --  anonymous access type, since such objects have nonstatic
12246                   --  levels in Ada 2012.
12247
12248                   if Nkind (Associated_Node_For_Itype (Opnd_Type)) =
12249                        N_Object_Declaration
12250                   then
12251                      Conversion_Error_N
12252                        ("implicit conversion of stand-alone anonymous "
12253                         & "access object not allowed", Operand);
12254                      return False;
12255
12256                   --  Implicit conversions aren't allowed for anonymous access
12257                   --  parameters. The "not Is_Local_Anonymous_Access_Type" test
12258                   --  is done to exclude anonymous access results.
12259
12260                   elsif not Is_Local_Anonymous_Access (Opnd_Type)
12261                     and then Nkind_In (Associated_Node_For_Itype (Opnd_Type),
12262                                        N_Function_Specification,
12263                                        N_Procedure_Specification)
12264                   then
12265                      Conversion_Error_N
12266                        ("implicit conversion of anonymous access formal "
12267                         & "not allowed", Operand);
12268                      return False;
12269
12270                   --  This is a case where there's an enclosing object whose
12271                   --  to which the "statically deeper than" relationship does
12272                   --  not apply (such as an access discriminant selected from
12273                   --  a dereference of an access parameter).
12274
12275                   elsif Object_Access_Level (Operand)
12276                           = Scope_Depth (Standard_Standard)
12277                   then
12278                      Conversion_Error_N
12279                        ("implicit conversion of anonymous access value "
12280                         & "not allowed", Operand);
12281                      return False;
12282
12283                   --  In other cases, the level of the operand's type must be
12284                   --  statically less deep than that of the target type, else
12285                   --  implicit conversion is disallowed (by RM12-8.6(27.1/3)).
12286
12287                   elsif Type_Access_Level (Opnd_Type) >
12288                         Deepest_Type_Access_Level (Target_Type)
12289                   then
12290                      Conversion_Error_N
12291                        ("implicit conversion of anonymous access value "
12292                         & "violates accessibility", Operand);
12293                      return False;
12294                   end if;
12295                end if;
12296
12297             elsif Type_Access_Level (Opnd_Type) >
12298                     Deepest_Type_Access_Level (Target_Type)
12299             then
12300                --  In an instance, this is a run-time check, but one we know
12301                --  will fail, so generate an appropriate warning. The raise
12302                --  will be generated by Expand_N_Type_Conversion.
12303
12304                if In_Instance_Body then
12305                   Error_Msg_Warn := SPARK_Mode /= On;
12306                   Conversion_Error_N
12307                     ("cannot convert local pointer to non-local access type<<",
12308                      Operand);
12309                   Conversion_Error_N ("\Program_Error [<<", Operand);
12310
12311                --  If not in an instance body, this is a real error
12312
12313                else
12314                   --  Avoid generation of spurious error message
12315
12316                   if not Error_Posted (N) then
12317                      Conversion_Error_N
12318                       ("cannot convert local pointer to non-local access type",
12319                        Operand);
12320                   end if;
12321
12322                   return False;
12323                end if;
12324
12325             --  Special accessibility checks are needed in the case of access
12326             --  discriminants declared for a limited type.
12327
12328             elsif Ekind (Opnd_Type) = E_Anonymous_Access_Type
12329               and then not Is_Local_Anonymous_Access (Opnd_Type)
12330             then
12331                --  When the operand is a selected access discriminant the check
12332                --  needs to be made against the level of the object denoted by
12333                --  the prefix of the selected name (Object_Access_Level handles
12334                --  checking the prefix of the operand for this case).
12335
12336                if Nkind (Operand) = N_Selected_Component
12337                  and then Object_Access_Level (Operand) >
12338                           Deepest_Type_Access_Level (Target_Type)
12339                then
12340                   --  In an instance, this is a run-time check, but one we know
12341                   --  will fail, so generate an appropriate warning. The raise
12342                   --  will be generated by Expand_N_Type_Conversion.
12343
12344                   if In_Instance_Body then
12345                      Error_Msg_Warn := SPARK_Mode /= On;
12346                      Conversion_Error_N
12347                        ("cannot convert access discriminant to non-local "
12348                         & "access type<<", Operand);
12349                      Conversion_Error_N ("\Program_Error [<<", Operand);
12350
12351                   --  If not in an instance body, this is a real error
12352
12353                   else
12354                      Conversion_Error_N
12355                        ("cannot convert access discriminant to non-local "
12356                         & "access type", Operand);
12357                      return False;
12358                   end if;
12359                end if;
12360
12361                --  The case of a reference to an access discriminant from
12362                --  within a limited type declaration (which will appear as
12363                --  a discriminal) is always illegal because the level of the
12364                --  discriminant is considered to be deeper than any (nameable)
12365                --  access type.
12366
12367                if Is_Entity_Name (Operand)
12368                  and then
12369                    Ekind_In (Entity (Operand), E_In_Parameter, E_Constant)
12370                  and then Present (Discriminal_Link (Entity (Operand)))
12371                then
12372                   Conversion_Error_N
12373                     ("discriminant has deeper accessibility level than target",
12374                      Operand);
12375                   return False;
12376                end if;
12377             end if;
12378          end if;
12379
12380          --  In the presence of limited_with clauses we have to use non-limited
12381          --  views, if available.
12382
12383          Check_Limited : declare
12384             function Full_Designated_Type (T : Entity_Id) return Entity_Id;
12385             --  Helper function to handle limited views
12386
12387             --------------------------
12388             -- Full_Designated_Type --
12389             --------------------------
12390
12391             function Full_Designated_Type (T : Entity_Id) return Entity_Id is
12392                Desig : constant Entity_Id := Designated_Type (T);
12393
12394             begin
12395                --  Handle the limited view of a type
12396
12397                if Is_Incomplete_Type (Desig)
12398                  and then From_Limited_With (Desig)
12399                  and then Present (Non_Limited_View (Desig))
12400                then
12401                   return Available_View (Desig);
12402                else
12403                   return Desig;
12404                end if;
12405             end Full_Designated_Type;
12406
12407             --  Local Declarations
12408
12409             Target : constant Entity_Id := Full_Designated_Type (Target_Type);
12410             Opnd   : constant Entity_Id := Full_Designated_Type (Opnd_Type);
12411
12412             Same_Base : constant Boolean :=
12413                           Base_Type (Target) = Base_Type (Opnd);
12414
12415          --  Start of processing for Check_Limited
12416
12417          begin
12418             if Is_Tagged_Type (Target) then
12419                return Valid_Tagged_Conversion (Target, Opnd);
12420
12421             else
12422                if not Same_Base then
12423                   Conversion_Error_NE
12424                     ("target designated type not compatible with }",
12425                      N, Base_Type (Opnd));
12426                   return False;
12427
12428                --  Ada 2005 AI-384: legality rule is symmetric in both
12429                --  designated types. The conversion is legal (with possible
12430                --  constraint check) if either designated type is
12431                --  unconstrained.
12432
12433                elsif Subtypes_Statically_Match (Target, Opnd)
12434                  or else
12435                    (Has_Discriminants (Target)
12436                      and then
12437                       (not Is_Constrained (Opnd)
12438                         or else not Is_Constrained (Target)))
12439                then
12440                   --  Special case, if Value_Size has been used to make the
12441                   --  sizes different, the conversion is not allowed even
12442                   --  though the subtypes statically match.
12443
12444                   if Known_Static_RM_Size (Target)
12445                     and then Known_Static_RM_Size (Opnd)
12446                     and then RM_Size (Target) /= RM_Size (Opnd)
12447                   then
12448                      Conversion_Error_NE
12449                        ("target designated subtype not compatible with }",
12450                         N, Opnd);
12451                      Conversion_Error_NE
12452                        ("\because sizes of the two designated subtypes differ",
12453                         N, Opnd);
12454                      return False;
12455
12456                   --  Normal case where conversion is allowed
12457
12458                   else
12459                      return True;
12460                   end if;
12461
12462                else
12463                   Error_Msg_NE
12464                     ("target designated subtype not compatible with }",
12465                      N, Opnd);
12466                   return False;
12467                end if;
12468             end if;
12469          end Check_Limited;
12470
12471       --  Access to subprogram types. If the operand is an access parameter,
12472       --  the type has a deeper accessibility that any master, and cannot be
12473       --  assigned. We must make an exception if the conversion is part of an
12474       --  assignment and the target is the return object of an extended return
12475       --  statement, because in that case the accessibility check takes place
12476       --  after the return.
12477
12478       elsif Is_Access_Subprogram_Type (Target_Type)
12479
12480         --  Note: this test of Opnd_Type is there to prevent entering this
12481         --  branch in the case of a remote access to subprogram type, which
12482         --  is internally represented as an E_Record_Type.
12483
12484         and then Is_Access_Type (Opnd_Type)
12485       then
12486          if Ekind (Base_Type (Opnd_Type)) = E_Anonymous_Access_Subprogram_Type
12487            and then Is_Entity_Name (Operand)
12488            and then Ekind (Entity (Operand)) = E_In_Parameter
12489            and then
12490              (Nkind (Parent (N)) /= N_Assignment_Statement
12491                or else not Is_Entity_Name (Name (Parent (N)))
12492                or else not Is_Return_Object (Entity (Name (Parent (N)))))
12493          then
12494             Conversion_Error_N
12495               ("illegal attempt to store anonymous access to subprogram",
12496                Operand);
12497             Conversion_Error_N
12498               ("\value has deeper accessibility than any master "
12499                & "(RM 3.10.2 (13))",
12500                Operand);
12501
12502             Error_Msg_NE
12503              ("\use named access type for& instead of access parameter",
12504                Operand, Entity (Operand));
12505          end if;
12506
12507          --  Check that the designated types are subtype conformant
12508
12509          Check_Subtype_Conformant (New_Id  => Designated_Type (Target_Type),
12510                                    Old_Id  => Designated_Type (Opnd_Type),
12511                                    Err_Loc => N);
12512
12513          --  Check the static accessibility rule of 4.6(20)
12514
12515          if Type_Access_Level (Opnd_Type) >
12516             Deepest_Type_Access_Level (Target_Type)
12517          then
12518             Conversion_Error_N
12519               ("operand type has deeper accessibility level than target",
12520                Operand);
12521
12522          --  Check that if the operand type is declared in a generic body,
12523          --  then the target type must be declared within that same body
12524          --  (enforces last sentence of 4.6(20)).
12525
12526          elsif Present (Enclosing_Generic_Body (Opnd_Type)) then
12527             declare
12528                O_Gen : constant Node_Id :=
12529                          Enclosing_Generic_Body (Opnd_Type);
12530
12531                T_Gen : Node_Id;
12532
12533             begin
12534                T_Gen := Enclosing_Generic_Body (Target_Type);
12535                while Present (T_Gen) and then T_Gen /= O_Gen loop
12536                   T_Gen := Enclosing_Generic_Body (T_Gen);
12537                end loop;
12538
12539                if T_Gen /= O_Gen then
12540                   Conversion_Error_N
12541                     ("target type must be declared in same generic body "
12542                      & "as operand type", N);
12543                end if;
12544             end;
12545          end if;
12546
12547          return True;
12548
12549       --  Remote access to subprogram types
12550
12551       elsif Is_Remote_Access_To_Subprogram_Type (Target_Type)
12552         and then Is_Remote_Access_To_Subprogram_Type (Opnd_Type)
12553       then
12554          --  It is valid to convert from one RAS type to another provided
12555          --  that their specification statically match.
12556
12557          --  Note: at this point, remote access to subprogram types have been
12558          --  expanded to their E_Record_Type representation, and we need to
12559          --  go back to the original access type definition using the
12560          --  Corresponding_Remote_Type attribute in order to check that the
12561          --  designated profiles match.
12562
12563          pragma Assert (Ekind (Target_Type) = E_Record_Type);
12564          pragma Assert (Ekind (Opnd_Type) = E_Record_Type);
12565
12566          Check_Subtype_Conformant
12567            (New_Id  =>
12568               Designated_Type (Corresponding_Remote_Type (Target_Type)),
12569             Old_Id  =>
12570               Designated_Type (Corresponding_Remote_Type (Opnd_Type)),
12571             Err_Loc =>
12572               N);
12573          return True;
12574
12575       --  If it was legal in the generic, it's legal in the instance
12576
12577       elsif In_Instance_Body then
12578          return True;
12579
12580       --  If both are tagged types, check legality of view conversions
12581
12582       elsif Is_Tagged_Type (Target_Type)
12583               and then
12584             Is_Tagged_Type (Opnd_Type)
12585       then
12586          return Valid_Tagged_Conversion (Target_Type, Opnd_Type);
12587
12588       --  Types derived from the same root type are convertible
12589
12590       elsif Root_Type (Target_Type) = Root_Type (Opnd_Type) then
12591          return True;
12592
12593       --  In an instance or an inlined body, there may be inconsistent views of
12594       --  the same type, or of types derived from a common root.
12595
12596       elsif (In_Instance or In_Inlined_Body)
12597         and then
12598           Root_Type (Underlying_Type (Target_Type)) =
12599           Root_Type (Underlying_Type (Opnd_Type))
12600       then
12601          return True;
12602
12603       --  Special check for common access type error case
12604
12605       elsif Ekind (Target_Type) = E_Access_Type
12606          and then Is_Access_Type (Opnd_Type)
12607       then
12608          Conversion_Error_N ("target type must be general access type!", N);
12609          Conversion_Error_NE -- CODEFIX
12610             ("add ALL to }!", N, Target_Type);
12611          return False;
12612
12613       --  Here we have a real conversion error
12614
12615       else
12616          Conversion_Error_NE
12617            ("invalid conversion, not compatible with }", N, Opnd_Type);
12618          return False;
12619       end if;
12620    end Valid_Conversion;
12621
12622 end Sem_Res;