1------------------------------------------------------------------------------
2--                                                                          --
3--                         GNAT COMPILER COMPONENTS                         --
4--                                                                          --
5--                              E X P _ C H 6                               --
6--                                                                          --
7--                                 B o d y                                  --
8--                                                                          --
9--          Copyright (C) 1992-2021, 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
26with Atree;          use Atree;
27with Aspects;        use Aspects;
28with Checks;         use Checks;
29with Contracts;      use Contracts;
30with Debug;          use Debug;
31with Einfo;          use Einfo;
32with Einfo.Entities; use Einfo.Entities;
33with Einfo.Utils;    use Einfo.Utils;
34with Errout;         use Errout;
35with Elists;         use Elists;
36with Expander;       use Expander;
37with Exp_Aggr;       use Exp_Aggr;
38with Exp_Atag;       use Exp_Atag;
39with Exp_Ch3;        use Exp_Ch3;
40with Exp_Ch7;        use Exp_Ch7;
41with Exp_Ch9;        use Exp_Ch9;
42with Exp_Dbug;       use Exp_Dbug;
43with Exp_Disp;       use Exp_Disp;
44with Exp_Dist;       use Exp_Dist;
45with Exp_Intr;       use Exp_Intr;
46with Exp_Pakd;       use Exp_Pakd;
47with Exp_Tss;        use Exp_Tss;
48with Exp_Util;       use Exp_Util;
49with Freeze;         use Freeze;
50with Inline;         use Inline;
51with Itypes;         use Itypes;
52with Lib;            use Lib;
53with Namet;          use Namet;
54with Nlists;         use Nlists;
55with Nmake;          use Nmake;
56with Opt;            use Opt;
57with Restrict;       use Restrict;
58with Rident;         use Rident;
59with Rtsfind;        use Rtsfind;
60with Sem;            use Sem;
61with Sem_Aux;        use Sem_Aux;
62with Sem_Ch6;        use Sem_Ch6;
63with Sem_Ch8;        use Sem_Ch8;
64with Sem_Ch13;       use Sem_Ch13;
65with Sem_Dim;        use Sem_Dim;
66with Sem_Disp;       use Sem_Disp;
67with Sem_Dist;       use Sem_Dist;
68with Sem_Eval;       use Sem_Eval;
69with Sem_Mech;       use Sem_Mech;
70with Sem_Res;        use Sem_Res;
71with Sem_SCIL;       use Sem_SCIL;
72with Sem_Util;       use Sem_Util;
73with Sinfo;          use Sinfo;
74with Sinfo.Nodes;    use Sinfo.Nodes;
75with Sinfo.Utils;    use Sinfo.Utils;
76with Sinput;         use Sinput;
77with Snames;         use Snames;
78with Stand;          use Stand;
79with Stringt;        use Stringt;
80with Tbuild;         use Tbuild;
81with Uintp;          use Uintp;
82with Validsw;        use Validsw;
83
84package body Exp_Ch6 is
85
86   --  Suffix for BIP formals
87
88   BIP_Alloc_Suffix               : constant String := "BIPalloc";
89   BIP_Storage_Pool_Suffix        : constant String := "BIPstoragepool";
90   BIP_Finalization_Master_Suffix : constant String := "BIPfinalizationmaster";
91   BIP_Task_Master_Suffix         : constant String := "BIPtaskmaster";
92   BIP_Activation_Chain_Suffix    : constant String := "BIPactivationchain";
93   BIP_Object_Access_Suffix       : constant String := "BIPaccess";
94
95   -----------------------
96   -- Local Subprograms --
97   -----------------------
98
99   procedure Add_Access_Actual_To_Build_In_Place_Call
100     (Function_Call : Node_Id;
101      Function_Id   : Entity_Id;
102      Return_Object : Node_Id;
103      Is_Access     : Boolean := False);
104   --  Ada 2005 (AI-318-02): Apply the Unrestricted_Access attribute to the
105   --  object name given by Return_Object and add the attribute to the end of
106   --  the actual parameter list associated with the build-in-place function
107   --  call denoted by Function_Call. However, if Is_Access is True, then
108   --  Return_Object is already an access expression, in which case it's passed
109   --  along directly to the build-in-place function. Finally, if Return_Object
110   --  is empty, then pass a null literal as the actual.
111
112   procedure Add_Unconstrained_Actuals_To_Build_In_Place_Call
113     (Function_Call  : Node_Id;
114      Function_Id    : Entity_Id;
115      Alloc_Form     : BIP_Allocation_Form := Unspecified;
116      Alloc_Form_Exp : Node_Id             := Empty;
117      Pool_Actual    : Node_Id             := Make_Null (No_Location));
118   --  Ada 2005 (AI-318-02): Add the actuals needed for a build-in-place
119   --  function call that returns a caller-unknown-size result (BIP_Alloc_Form
120   --  and BIP_Storage_Pool). If Alloc_Form_Exp is present, then use it,
121   --  otherwise pass a literal corresponding to the Alloc_Form parameter
122   --  (which must not be Unspecified in that case). Pool_Actual is the
123   --  parameter to pass to BIP_Storage_Pool.
124
125   procedure Add_Finalization_Master_Actual_To_Build_In_Place_Call
126     (Func_Call  : Node_Id;
127      Func_Id    : Entity_Id;
128      Ptr_Typ    : Entity_Id := Empty;
129      Master_Exp : Node_Id   := Empty);
130   --  Ada 2005 (AI-318-02): If the result type of a build-in-place call needs
131   --  finalization actions, add an actual parameter which is a pointer to the
132   --  finalization master of the caller. If Master_Exp is not Empty, then that
133   --  will be passed as the actual. Otherwise, if Ptr_Typ is left Empty, this
134   --  will result in an automatic "null" value for the actual.
135
136   procedure Add_Task_Actuals_To_Build_In_Place_Call
137     (Function_Call : Node_Id;
138      Function_Id   : Entity_Id;
139      Master_Actual : Node_Id;
140      Chain         : Node_Id := Empty);
141   --  Ada 2005 (AI-318-02): For a build-in-place call, if the result type
142   --  contains tasks, add two actual parameters: the master, and a pointer to
143   --  the caller's activation chain. Master_Actual is the actual parameter
144   --  expression to pass for the master. In most cases, this is the current
145   --  master (_master). The two exceptions are: If the function call is the
146   --  initialization expression for an allocator, we pass the master of the
147   --  access type. If the function call is the initialization expression for a
148   --  return object, we pass along the master passed in by the caller. In most
149   --  contexts, the activation chain to pass is the local one, which is
150   --  indicated by No (Chain). However, in an allocator, the caller passes in
151   --  the activation Chain. Note: Master_Actual can be Empty, but only if
152   --  there are no tasks.
153
154   procedure Apply_CW_Accessibility_Check (Exp : Node_Id; Func : Entity_Id);
155   --  Ada 2005 (AI95-344): If the result type is class-wide, insert a check
156   --  that the level of the return expression's underlying type is not deeper
157   --  than the level of the master enclosing the function. Always generate the
158   --  check when the type of the return expression is class-wide, when it's a
159   --  type conversion, or when it's a formal parameter. Otherwise suppress the
160   --  check in the case where the return expression has a specific type whose
161   --  level is known not to be statically deeper than the result type of the
162   --  function.
163
164   function Caller_Known_Size
165     (Func_Call   : Node_Id;
166      Result_Subt : Entity_Id) return Boolean;
167   --  True if result subtype is definite, or has a size that does not require
168   --  secondary stack usage (i.e. no variant part or components whose type
169   --  depends on discriminants). In particular, untagged types with only
170   --  access discriminants do not require secondary stack use. Note we must
171   --  always use the secondary stack for dispatching-on-result calls.
172
173   function Check_BIP_Actuals
174     (Subp_Call : Node_Id;
175      Subp_Id   : Entity_Id) return Boolean;
176   --  Given a subprogram call to the given subprogram return True if the
177   --  names of BIP extra actual and formal parameters match.
178
179   function Check_Number_Of_Actuals
180     (Subp_Call : Node_Id;
181      Subp_Id   : Entity_Id) return Boolean;
182   --  Given a subprogram call to the given subprogram return True if the
183   --  number of actual parameters (including extra actuals) is correct.
184
185   procedure Check_Overriding_Operation (Subp : Entity_Id);
186   --  Subp is a dispatching operation. Check whether it may override an
187   --  inherited private operation, in which case its DT entry is that of
188   --  the hidden operation, not the one it may have received earlier.
189   --  This must be done before emitting the code to set the corresponding
190   --  DT to the address of the subprogram. The actual placement of Subp in
191   --  the proper place in the list of primitive operations is done in
192   --  Declare_Inherited_Private_Subprograms, which also has to deal with
193   --  implicit operations. This duplication is unavoidable for now???
194
195   procedure Detect_Infinite_Recursion (N : Node_Id; Spec : Entity_Id);
196   --  This procedure is called only if the subprogram body N, whose spec
197   --  has the given entity Spec, contains a parameterless recursive call.
198   --  It attempts to generate runtime code to detect if this a case of
199   --  infinite recursion.
200   --
201   --  The body is scanned to determine dependencies. If the only external
202   --  dependencies are on a small set of scalar variables, then the values
203   --  of these variables are captured on entry to the subprogram, and if
204   --  the values are not changed for the call, we know immediately that
205   --  we have an infinite recursion.
206
207   procedure Expand_Actuals
208     (N         : Node_Id;
209      Subp      : Entity_Id;
210      Post_Call : out List_Id);
211   --  Return a list of actions to take place after the call in Post_Call. The
212   --  call will later be rewritten as an Expression_With_Actions, with the
213   --  Post_Call actions inserted, and the call inside.
214   --
215   --  For each actual of an in-out or out parameter which is a numeric (view)
216   --  conversion of the form T (A), where A denotes a variable, we insert the
217   --  declaration:
218   --
219   --    Temp : T[ := T (A)];
220   --
221   --  prior to the call. Then we replace the actual with a reference to Temp,
222   --  and append the assignment:
223   --
224   --    A := TypeA (Temp);
225   --
226   --  after the call. Here TypeA is the actual type of variable A. For out
227   --  parameters, the initial declaration has no expression. If A is not an
228   --  entity name, we generate instead:
229   --
230   --    Var  : TypeA renames A;
231   --    Temp : T := Var;       --  omitting expression for out parameter.
232   --    ...
233   --    Var := TypeA (Temp);
234   --
235   --  For other in-out parameters, we emit the required constraint checks
236   --  before and/or after the call.
237   --
238   --  For all parameter modes, actuals that denote components and slices of
239   --  packed arrays are expanded into suitable temporaries.
240   --
241   --  For nonscalar objects that are possibly unaligned, add call by copy code
242   --  (copy in for IN and IN OUT, copy out for OUT and IN OUT).
243   --
244   --  For OUT and IN OUT parameters, add predicate checks after the call
245   --  based on the predicates of the actual type.
246
247   procedure Expand_Call_Helper (N : Node_Id; Post_Call : out List_Id);
248   --  Does the main work of Expand_Call. Post_Call is as for Expand_Actuals.
249
250   procedure Expand_Ctrl_Function_Call (N : Node_Id);
251   --  N is a function call which returns a controlled object. Transform the
252   --  call into a temporary which retrieves the returned object from the
253   --  secondary stack using 'reference.
254
255   procedure Expand_Non_Function_Return (N : Node_Id);
256   --  Expand a simple return statement found in a procedure body, entry body,
257   --  accept statement, or an extended return statement. Note that all non-
258   --  function returns are simple return statements.
259
260   function Expand_Protected_Object_Reference
261     (N    : Node_Id;
262      Scop : Entity_Id) return Node_Id;
263
264   procedure Expand_Protected_Subprogram_Call
265     (N    : Node_Id;
266      Subp : Entity_Id;
267      Scop : Entity_Id);
268   --  A call to a protected subprogram within the protected object may appear
269   --  as a regular call. The list of actuals must be expanded to contain a
270   --  reference to the object itself, and the call becomes a call to the
271   --  corresponding protected subprogram.
272
273   procedure Expand_Simple_Function_Return (N : Node_Id);
274   --  Expand simple return from function. In the case where we are returning
275   --  from a function body this is called by Expand_N_Simple_Return_Statement.
276
277   function Has_BIP_Extra_Formal
278     (E    : Entity_Id;
279      Kind : BIP_Formal_Kind) return Boolean;
280   --  Given a frozen subprogram, subprogram type, entry or entry family,
281   --  return True if E has the BIP extra formal associated with Kind. It must
282   --  be invoked with a frozen entity or a subprogram type of a dispatching
283   --  call since we can only rely on the availability of the extra formals
284   --  on these entities.
285
286   procedure Insert_Post_Call_Actions (N : Node_Id; Post_Call : List_Id);
287   --  Insert the Post_Call list previously produced by routine Expand_Actuals
288   --  or Expand_Call_Helper into the tree.
289
290   procedure Replace_Renaming_Declaration_Id
291      (New_Decl  : Node_Id;
292       Orig_Decl : Node_Id);
293   --  Replace the internal identifier of the new renaming declaration New_Decl
294   --  with the identifier of its original declaration Orig_Decl exchanging the
295   --  entities containing their defining identifiers to ensure the correct
296   --  replacement of the object declaration by the object renaming declaration
297   --  to avoid homograph conflicts (since the object declaration's defining
298   --  identifier was already entered in the current scope). The Next_Entity
299   --  links of the two entities are also swapped since the entities are part
300   --  of the return scope's entity list and the list structure would otherwise
301   --  be corrupted. The homonym chain is preserved as well.
302
303   procedure Rewrite_Function_Call_For_C (N : Node_Id);
304   --  When generating C code, replace a call to a function that returns an
305   --  array into the generated procedure with an additional out parameter.
306
307   procedure Set_Enclosing_Sec_Stack_Return (N : Node_Id);
308   --  N is a return statement for a function that returns its result on the
309   --  secondary stack. This sets the Sec_Stack_Needed_For_Return flag on the
310   --  function and all blocks and loops that the return statement is jumping
311   --  out of. This ensures that the secondary stack is not released; otherwise
312   --  the function result would be reclaimed before returning to the caller.
313
314   procedure Warn_BIP (Func_Call : Node_Id);
315   --  Give a warning on a build-in-place function call if the -gnatd_B switch
316   --  was given.
317
318   ----------------------------------------------
319   -- Add_Access_Actual_To_Build_In_Place_Call --
320   ----------------------------------------------
321
322   procedure Add_Access_Actual_To_Build_In_Place_Call
323     (Function_Call : Node_Id;
324      Function_Id   : Entity_Id;
325      Return_Object : Node_Id;
326      Is_Access     : Boolean := False)
327   is
328      Loc            : constant Source_Ptr := Sloc (Function_Call);
329      Obj_Address    : Node_Id;
330      Obj_Acc_Formal : Entity_Id;
331
332   begin
333      --  Locate the implicit access parameter in the called function
334
335      Obj_Acc_Formal := Build_In_Place_Formal (Function_Id, BIP_Object_Access);
336
337      --  If no return object is provided, then pass null
338
339      if not Present (Return_Object) then
340         Obj_Address := Make_Null (Loc);
341         Set_Parent (Obj_Address, Function_Call);
342
343      --  If Return_Object is already an expression of an access type, then use
344      --  it directly, since it must be an access value denoting the return
345      --  object, and couldn't possibly be the return object itself.
346
347      elsif Is_Access then
348         Obj_Address := Return_Object;
349         Set_Parent (Obj_Address, Function_Call);
350
351      --  Apply Unrestricted_Access to caller's return object
352
353      else
354         Obj_Address :=
355            Make_Attribute_Reference (Loc,
356              Prefix         => Return_Object,
357              Attribute_Name => Name_Unrestricted_Access);
358
359         Set_Parent (Return_Object, Obj_Address);
360         Set_Parent (Obj_Address, Function_Call);
361      end if;
362
363      Analyze_And_Resolve (Obj_Address, Etype (Obj_Acc_Formal));
364
365      --  Build the parameter association for the new actual and add it to the
366      --  end of the function's actuals.
367
368      Add_Extra_Actual_To_Call (Function_Call, Obj_Acc_Formal, Obj_Address);
369   end Add_Access_Actual_To_Build_In_Place_Call;
370
371   ------------------------------------------------------
372   -- Add_Unconstrained_Actuals_To_Build_In_Place_Call --
373   ------------------------------------------------------
374
375   procedure Add_Unconstrained_Actuals_To_Build_In_Place_Call
376     (Function_Call  : Node_Id;
377      Function_Id    : Entity_Id;
378      Alloc_Form     : BIP_Allocation_Form := Unspecified;
379      Alloc_Form_Exp : Node_Id             := Empty;
380      Pool_Actual    : Node_Id             := Make_Null (No_Location))
381   is
382      Loc : constant Source_Ptr := Sloc (Function_Call);
383
384      Alloc_Form_Actual : Node_Id;
385      Alloc_Form_Formal : Node_Id;
386      Pool_Formal       : Node_Id;
387
388   begin
389      --  Nothing to do when the size of the object is known, and the caller is
390      --  in charge of allocating it, and the callee doesn't unconditionally
391      --  require an allocation form (such as due to having a tagged result).
392
393      if not Needs_BIP_Alloc_Form (Function_Id) then
394         return;
395      end if;
396
397      --  Locate the implicit allocation form parameter in the called function.
398      --  Maybe it would be better for each implicit formal of a build-in-place
399      --  function to have a flag or a Uint attribute to identify it. ???
400
401      Alloc_Form_Formal := Build_In_Place_Formal (Function_Id, BIP_Alloc_Form);
402
403      if Present (Alloc_Form_Exp) then
404         pragma Assert (Alloc_Form = Unspecified);
405
406         Alloc_Form_Actual := Alloc_Form_Exp;
407
408      else
409         pragma Assert (Alloc_Form /= Unspecified);
410
411         Alloc_Form_Actual :=
412           Make_Integer_Literal (Loc,
413             Intval => UI_From_Int (BIP_Allocation_Form'Pos (Alloc_Form)));
414      end if;
415
416      Analyze_And_Resolve (Alloc_Form_Actual, Etype (Alloc_Form_Formal));
417
418      --  Build the parameter association for the new actual and add it to the
419      --  end of the function's actuals.
420
421      Add_Extra_Actual_To_Call
422        (Function_Call, Alloc_Form_Formal, Alloc_Form_Actual);
423
424      --  Pass the Storage_Pool parameter. This parameter is omitted on ZFP as
425      --  those targets do not support pools.
426
427      if RTE_Available (RE_Root_Storage_Pool_Ptr) then
428         Pool_Formal := Build_In_Place_Formal (Function_Id, BIP_Storage_Pool);
429         Analyze_And_Resolve (Pool_Actual, Etype (Pool_Formal));
430         Add_Extra_Actual_To_Call
431           (Function_Call, Pool_Formal, Pool_Actual);
432      end if;
433   end Add_Unconstrained_Actuals_To_Build_In_Place_Call;
434
435   -----------------------------------------------------------
436   -- Add_Finalization_Master_Actual_To_Build_In_Place_Call --
437   -----------------------------------------------------------
438
439   procedure Add_Finalization_Master_Actual_To_Build_In_Place_Call
440     (Func_Call  : Node_Id;
441      Func_Id    : Entity_Id;
442      Ptr_Typ    : Entity_Id := Empty;
443      Master_Exp : Node_Id   := Empty)
444   is
445   begin
446      if not Needs_BIP_Finalization_Master (Func_Id) then
447         return;
448      end if;
449
450      declare
451         Formal : constant Entity_Id :=
452                    Build_In_Place_Formal (Func_Id, BIP_Finalization_Master);
453         Loc    : constant Source_Ptr := Sloc (Func_Call);
454
455         Actual    : Node_Id;
456         Desig_Typ : Entity_Id;
457
458      begin
459         --  If there is a finalization master actual, such as the implicit
460         --  finalization master of an enclosing build-in-place function,
461         --  then this must be added as an extra actual of the call.
462
463         if Present (Master_Exp) then
464            Actual := Master_Exp;
465
466         --  Case where the context does not require an actual master
467
468         elsif No (Ptr_Typ) then
469            Actual := Make_Null (Loc);
470
471         else
472            Desig_Typ := Directly_Designated_Type (Ptr_Typ);
473
474            --  Check for a library-level access type whose designated type has
475            --  suppressed finalization or the access type is subject to pragma
476            --  No_Heap_Finalization. Such an access type lacks a master. Pass
477            --  a null actual to callee in order to signal a missing master.
478
479            if Is_Library_Level_Entity (Ptr_Typ)
480              and then (Finalize_Storage_Only (Desig_Typ)
481                         or else No_Heap_Finalization (Ptr_Typ))
482            then
483               Actual := Make_Null (Loc);
484
485            --  Types in need of finalization actions
486
487            elsif Needs_Finalization (Desig_Typ) then
488
489               --  The general mechanism of creating finalization masters for
490               --  anonymous access types is disabled by default, otherwise
491               --  finalization masters will pop all over the place. Such types
492               --  use context-specific masters.
493
494               if Ekind (Ptr_Typ) = E_Anonymous_Access_Type
495                 and then No (Finalization_Master (Ptr_Typ))
496               then
497                  Build_Anonymous_Master (Ptr_Typ);
498               end if;
499
500               --  Access-to-controlled types should always have a master
501
502               pragma Assert (Present (Finalization_Master (Ptr_Typ)));
503
504               Actual :=
505                 Make_Attribute_Reference (Loc,
506                   Prefix =>
507                     New_Occurrence_Of (Finalization_Master (Ptr_Typ), Loc),
508                   Attribute_Name => Name_Unrestricted_Access);
509
510            --  Tagged types
511
512            else
513               Actual := Make_Null (Loc);
514            end if;
515         end if;
516
517         Analyze_And_Resolve (Actual, Etype (Formal));
518
519         --  Build the parameter association for the new actual and add it to
520         --  the end of the function's actuals.
521
522         Add_Extra_Actual_To_Call (Func_Call, Formal, Actual);
523      end;
524   end Add_Finalization_Master_Actual_To_Build_In_Place_Call;
525
526   ------------------------------
527   -- Add_Extra_Actual_To_Call --
528   ------------------------------
529
530   procedure Add_Extra_Actual_To_Call
531     (Subprogram_Call : Node_Id;
532      Extra_Formal    : Entity_Id;
533      Extra_Actual    : Node_Id)
534   is
535      Loc         : constant Source_Ptr := Sloc (Subprogram_Call);
536      Param_Assoc : Node_Id;
537
538   begin
539      Param_Assoc :=
540        Make_Parameter_Association (Loc,
541          Selector_Name             => New_Occurrence_Of (Extra_Formal, Loc),
542          Explicit_Actual_Parameter => Extra_Actual);
543
544      Set_Parent (Param_Assoc, Subprogram_Call);
545      Set_Parent (Extra_Actual, Param_Assoc);
546
547      if Present (Parameter_Associations (Subprogram_Call)) then
548         if Nkind (Last (Parameter_Associations (Subprogram_Call))) =
549              N_Parameter_Association
550         then
551
552            --  Find last named actual, and append
553
554            declare
555               L : Node_Id;
556            begin
557               L := First_Actual (Subprogram_Call);
558               while Present (L) loop
559                  if No (Next_Actual (L)) then
560                     Set_Next_Named_Actual (Parent (L), Extra_Actual);
561                     exit;
562                  end if;
563                  Next_Actual (L);
564               end loop;
565            end;
566
567         else
568            Set_First_Named_Actual (Subprogram_Call, Extra_Actual);
569         end if;
570
571         Append (Param_Assoc, To => Parameter_Associations (Subprogram_Call));
572
573      else
574         Set_Parameter_Associations (Subprogram_Call, New_List (Param_Assoc));
575         Set_First_Named_Actual (Subprogram_Call, Extra_Actual);
576      end if;
577   end Add_Extra_Actual_To_Call;
578
579   ---------------------------------------------
580   -- Add_Task_Actuals_To_Build_In_Place_Call --
581   ---------------------------------------------
582
583   procedure Add_Task_Actuals_To_Build_In_Place_Call
584     (Function_Call : Node_Id;
585      Function_Id   : Entity_Id;
586      Master_Actual : Node_Id;
587      Chain         : Node_Id := Empty)
588   is
589      Loc           : constant Source_Ptr := Sloc (Function_Call);
590      Actual        : Node_Id;
591      Chain_Actual  : Node_Id;
592      Chain_Formal  : Node_Id;
593      Master_Formal : Node_Id;
594
595   begin
596      --  No such extra parameters are needed if there are no tasks
597
598      if not Needs_BIP_Task_Actuals (Function_Id) then
599         return;
600      end if;
601
602      Actual := Master_Actual;
603
604      --  Use a dummy _master actual in case of No_Task_Hierarchy
605
606      if Restriction_Active (No_Task_Hierarchy) then
607         Actual := Make_Integer_Literal (Loc, Library_Task_Level);
608
609      --  In the case where we use the master associated with an access type,
610      --  the actual is an entity and requires an explicit reference.
611
612      elsif Nkind (Actual) = N_Defining_Identifier then
613         Actual := New_Occurrence_Of (Actual, Loc);
614      end if;
615
616      --  Locate the implicit master parameter in the called function
617
618      Master_Formal := Build_In_Place_Formal (Function_Id, BIP_Task_Master);
619      Analyze_And_Resolve (Actual, Etype (Master_Formal));
620
621      --  Build the parameter association for the new actual and add it to the
622      --  end of the function's actuals.
623
624      Add_Extra_Actual_To_Call (Function_Call, Master_Formal, Actual);
625
626      --  Locate the implicit activation chain parameter in the called function
627
628      Chain_Formal :=
629        Build_In_Place_Formal (Function_Id, BIP_Activation_Chain);
630
631      --  Create the actual which is a pointer to the current activation chain
632
633      if No (Chain) then
634         Chain_Actual :=
635           Make_Attribute_Reference (Loc,
636             Prefix         => Make_Identifier (Loc, Name_uChain),
637             Attribute_Name => Name_Unrestricted_Access);
638
639      --  Allocator case; make a reference to the Chain passed in by the caller
640
641      else
642         Chain_Actual :=
643           Make_Attribute_Reference (Loc,
644             Prefix         => New_Occurrence_Of (Chain, Loc),
645             Attribute_Name => Name_Unrestricted_Access);
646      end if;
647
648      Analyze_And_Resolve (Chain_Actual, Etype (Chain_Formal));
649
650      --  Build the parameter association for the new actual and add it to the
651      --  end of the function's actuals.
652
653      Add_Extra_Actual_To_Call (Function_Call, Chain_Formal, Chain_Actual);
654   end Add_Task_Actuals_To_Build_In_Place_Call;
655
656   ----------------------------------
657   -- Apply_CW_Accessibility_Check --
658   ----------------------------------
659
660   procedure Apply_CW_Accessibility_Check (Exp : Node_Id; Func : Entity_Id) is
661      Loc : constant Source_Ptr := Sloc (Exp);
662
663   begin
664      if Ada_Version >= Ada_2005
665        and then Tagged_Type_Expansion
666        and then not Scope_Suppress.Suppress (Accessibility_Check)
667        and then
668          (Is_Class_Wide_Type (Etype (Exp))
669            or else Nkind (Exp) in
670                      N_Type_Conversion | N_Unchecked_Type_Conversion
671            or else (Is_Entity_Name (Exp)
672                      and then Is_Formal (Entity (Exp)))
673            or else Scope_Depth (Enclosing_Dynamic_Scope (Etype (Exp))) >
674                      Scope_Depth (Enclosing_Dynamic_Scope (Func)))
675      then
676         declare
677            Tag_Node : Node_Id;
678
679         begin
680            --  Ada 2005 (AI-251): In class-wide interface objects we displace
681            --  "this" to reference the base of the object. This is required to
682            --  get access to the TSD of the object.
683
684            if Is_Class_Wide_Type (Etype (Exp))
685              and then Is_Interface (Etype (Exp))
686            then
687               --  If the expression is an explicit dereference then we can
688               --  directly displace the pointer to reference the base of
689               --  the object.
690
691               if Nkind (Exp) = N_Explicit_Dereference then
692                  Tag_Node :=
693                    Make_Explicit_Dereference (Loc,
694                      Prefix =>
695                        Unchecked_Convert_To (RTE (RE_Tag_Ptr),
696                          Make_Function_Call (Loc,
697                            Name                   =>
698                              New_Occurrence_Of (RTE (RE_Base_Address), Loc),
699                            Parameter_Associations => New_List (
700                              Unchecked_Convert_To (RTE (RE_Address),
701                                Duplicate_Subexpr (Prefix (Exp)))))));
702
703               --  Similar case to the previous one but the expression is a
704               --  renaming of an explicit dereference.
705
706               elsif Nkind (Exp) = N_Identifier
707                 and then Present (Renamed_Object (Entity (Exp)))
708                 and then Nkind (Renamed_Object (Entity (Exp)))
709                            = N_Explicit_Dereference
710               then
711                  Tag_Node :=
712                    Make_Explicit_Dereference (Loc,
713                      Prefix =>
714                        Unchecked_Convert_To (RTE (RE_Tag_Ptr),
715                          Make_Function_Call (Loc,
716                            Name                   =>
717                              New_Occurrence_Of (RTE (RE_Base_Address), Loc),
718                            Parameter_Associations => New_List (
719                              Unchecked_Convert_To (RTE (RE_Address),
720                                Duplicate_Subexpr
721                                  (Prefix
722                                    (Renamed_Object (Entity (Exp)))))))));
723
724               --  Common case: obtain the address of the actual object and
725               --  displace the pointer to reference the base of the object.
726
727               else
728                  Tag_Node :=
729                    Make_Explicit_Dereference (Loc,
730                      Prefix =>
731                        Unchecked_Convert_To (RTE (RE_Tag_Ptr),
732                          Make_Function_Call (Loc,
733                            Name               =>
734                              New_Occurrence_Of (RTE (RE_Base_Address), Loc),
735                            Parameter_Associations => New_List (
736                              Make_Attribute_Reference (Loc,
737                                Prefix         => Duplicate_Subexpr (Exp),
738                                Attribute_Name => Name_Address)))));
739               end if;
740            else
741               Tag_Node :=
742                 Make_Attribute_Reference (Loc,
743                   Prefix         => Duplicate_Subexpr (Exp),
744                   Attribute_Name => Name_Tag);
745            end if;
746
747            --  CodePeer does not do anything useful with
748            --  Ada.Tags.Type_Specific_Data components.
749
750            if not CodePeer_Mode then
751               Insert_Action (Exp,
752                 Make_Raise_Program_Error (Loc,
753                   Condition =>
754                     Make_Op_Gt (Loc,
755                       Left_Opnd  => Build_Get_Access_Level (Loc, Tag_Node),
756                       Right_Opnd =>
757                         Make_Integer_Literal (Loc,
758                           Scope_Depth (Enclosing_Dynamic_Scope (Func)))),
759                   Reason    => PE_Accessibility_Check_Failed));
760            end if;
761         end;
762      end if;
763   end Apply_CW_Accessibility_Check;
764
765   -----------------------
766   -- BIP_Formal_Suffix --
767   -----------------------
768
769   function BIP_Formal_Suffix (Kind : BIP_Formal_Kind) return String is
770   begin
771      case Kind is
772         when BIP_Alloc_Form =>
773            return BIP_Alloc_Suffix;
774
775         when BIP_Storage_Pool =>
776            return BIP_Storage_Pool_Suffix;
777
778         when BIP_Finalization_Master =>
779            return BIP_Finalization_Master_Suffix;
780
781         when BIP_Task_Master =>
782            return BIP_Task_Master_Suffix;
783
784         when BIP_Activation_Chain =>
785            return BIP_Activation_Chain_Suffix;
786
787         when BIP_Object_Access =>
788            return BIP_Object_Access_Suffix;
789      end case;
790   end BIP_Formal_Suffix;
791
792   ---------------------
793   -- BIP_Suffix_Kind --
794   ---------------------
795
796   function BIP_Suffix_Kind (E : Entity_Id) return BIP_Formal_Kind is
797      Nam : constant String := Get_Name_String (Chars (E));
798
799      function Has_Suffix (Suffix : String) return Boolean;
800      --  Return True if Nam has suffix Suffix
801
802      function Has_Suffix (Suffix : String) return Boolean is
803         Len : constant Natural := Suffix'Length;
804      begin
805         return Nam'Length > Len
806           and then Nam (Nam'Last - Len + 1 .. Nam'Last) = Suffix;
807      end Has_Suffix;
808
809   --  Start of processing for BIP_Suffix_Kind
810
811   begin
812      if Has_Suffix (BIP_Alloc_Suffix) then
813         return BIP_Alloc_Form;
814
815      elsif Has_Suffix (BIP_Storage_Pool_Suffix) then
816         return BIP_Storage_Pool;
817
818      elsif Has_Suffix (BIP_Finalization_Master_Suffix) then
819         return BIP_Finalization_Master;
820
821      elsif Has_Suffix (BIP_Task_Master_Suffix) then
822         return BIP_Task_Master;
823
824      elsif Has_Suffix (BIP_Activation_Chain_Suffix) then
825         return BIP_Activation_Chain;
826
827      elsif Has_Suffix (BIP_Object_Access_Suffix) then
828         return BIP_Object_Access;
829
830      else
831         raise Program_Error;
832      end if;
833   end BIP_Suffix_Kind;
834
835   ---------------------------
836   -- Build_In_Place_Formal --
837   ---------------------------
838
839   function Build_In_Place_Formal
840     (Func : Entity_Id;
841      Kind : BIP_Formal_Kind) return Entity_Id
842   is
843      Extra_Formal  : Entity_Id := Extra_Formals (Func);
844      Formal_Suffix : constant String := BIP_Formal_Suffix (Kind);
845
846   begin
847      --  Maybe it would be better for each implicit formal of a build-in-place
848      --  function to have a flag or a Uint attribute to identify it. ???
849
850      --  The return type in the function declaration may have been a limited
851      --  view, and the extra formals for the function were not generated at
852      --  that point. At the point of call the full view must be available and
853      --  the extra formals can be created.
854
855      if No (Extra_Formal) then
856         Create_Extra_Formals (Func);
857         Extra_Formal := Extra_Formals (Func);
858      end if;
859
860      --  We search for a formal with a matching suffix. We can't search
861      --  for the full name, because of the code at the end of Sem_Ch6.-
862      --  Create_Extra_Formals, which copies the Extra_Formals over to
863      --  the Alias of an instance, which will cause the formals to have
864      --  "incorrect" names.
865
866      loop
867         pragma Assert (Present (Extra_Formal));
868         declare
869            Name : constant String := Get_Name_String (Chars (Extra_Formal));
870         begin
871            exit when Name'Length >= Formal_Suffix'Length
872              and then Formal_Suffix =
873                Name (Name'Last - Formal_Suffix'Length + 1 .. Name'Last);
874         end;
875
876         Next_Formal_With_Extras (Extra_Formal);
877      end loop;
878
879      return Extra_Formal;
880   end Build_In_Place_Formal;
881
882   -------------------------------
883   -- Build_Procedure_Body_Form --
884   -------------------------------
885
886   function Build_Procedure_Body_Form
887     (Func_Id   : Entity_Id;
888      Func_Body : Node_Id) return Node_Id
889   is
890      Loc : constant Source_Ptr := Sloc (Func_Body);
891
892      Proc_Decl : constant Node_Id := Prev (Unit_Declaration_Node (Func_Id));
893      --  It is assumed that the node before the declaration of the
894      --  corresponding subprogram spec is the declaration of the procedure
895      --  form.
896
897      Proc_Id : constant Entity_Id := Defining_Entity (Proc_Decl);
898
899      procedure Replace_Returns (Param_Id : Entity_Id; Stmts : List_Id);
900      --  Replace each return statement found in the list Stmts with an
901      --  assignment of the return expression to parameter Param_Id.
902
903      ---------------------
904      -- Replace_Returns --
905      ---------------------
906
907      procedure Replace_Returns (Param_Id : Entity_Id; Stmts : List_Id) is
908         Stmt : Node_Id;
909
910      begin
911         Stmt := First (Stmts);
912         while Present (Stmt) loop
913            if Nkind (Stmt) = N_Block_Statement then
914               Replace_Returns (Param_Id,
915                 Statements (Handled_Statement_Sequence (Stmt)));
916
917            elsif Nkind (Stmt) = N_Case_Statement then
918               declare
919                  Alt : Node_Id;
920               begin
921                  Alt := First (Alternatives (Stmt));
922                  while Present (Alt) loop
923                     Replace_Returns (Param_Id, Statements (Alt));
924                     Next (Alt);
925                  end loop;
926               end;
927
928            elsif Nkind (Stmt) = N_Extended_Return_Statement then
929               declare
930                  Ret_Obj : constant Entity_Id :=
931                              Defining_Entity
932                                (First (Return_Object_Declarations (Stmt)));
933                  Assign  : constant Node_Id :=
934                              Make_Assignment_Statement (Sloc (Stmt),
935                                Name       =>
936                                  New_Occurrence_Of (Param_Id, Loc),
937                                Expression =>
938                                  New_Occurrence_Of (Ret_Obj, Sloc (Stmt)));
939                  Stmts   : List_Id;
940
941               begin
942                  --  The extended return may just contain the declaration
943
944                  if Present (Handled_Statement_Sequence (Stmt)) then
945                     Stmts := Statements (Handled_Statement_Sequence (Stmt));
946                  else
947                     Stmts := New_List;
948                  end if;
949
950                  Set_Assignment_OK (Name (Assign));
951
952                  Rewrite (Stmt,
953                    Make_Block_Statement (Sloc (Stmt),
954                      Declarations               =>
955                        Return_Object_Declarations (Stmt),
956                      Handled_Statement_Sequence =>
957                        Make_Handled_Sequence_Of_Statements (Loc,
958                          Statements => Stmts)));
959
960                  Replace_Returns (Param_Id, Stmts);
961
962                  Append_To (Stmts, Assign);
963                  Append_To (Stmts, Make_Simple_Return_Statement (Loc));
964               end;
965
966            elsif Nkind (Stmt) = N_If_Statement then
967               Replace_Returns (Param_Id, Then_Statements (Stmt));
968               Replace_Returns (Param_Id, Else_Statements (Stmt));
969
970               declare
971                  Part : Node_Id;
972               begin
973                  Part := First (Elsif_Parts (Stmt));
974                  while Present (Part) loop
975                     Replace_Returns (Param_Id, Then_Statements (Part));
976                     Next (Part);
977                  end loop;
978               end;
979
980            elsif Nkind (Stmt) = N_Loop_Statement then
981               Replace_Returns (Param_Id, Statements (Stmt));
982
983            elsif Nkind (Stmt) = N_Simple_Return_Statement then
984
985               --  Generate:
986               --    Param := Expr;
987               --    return;
988
989               Rewrite (Stmt,
990                 Make_Assignment_Statement (Sloc (Stmt),
991                   Name       => New_Occurrence_Of (Param_Id, Loc),
992                   Expression => Relocate_Node (Expression (Stmt))));
993
994               Insert_After (Stmt, Make_Simple_Return_Statement (Loc));
995
996               --  Skip the added return
997
998               Next (Stmt);
999            end if;
1000
1001            Next (Stmt);
1002         end loop;
1003      end Replace_Returns;
1004
1005      --  Local variables
1006
1007      Stmts    : List_Id;
1008      New_Body : Node_Id;
1009
1010   --  Start of processing for Build_Procedure_Body_Form
1011
1012   begin
1013      --  This routine replaces the original function body:
1014
1015      --    function F (...) return Array_Typ is
1016      --    begin
1017      --       ...
1018      --       return Something;
1019      --    end F;
1020
1021      --    with the following:
1022
1023      --    procedure P (..., Result : out Array_Typ) is
1024      --    begin
1025      --       ...
1026      --       Result := Something;
1027      --    end P;
1028
1029      Stmts :=
1030        Statements (Handled_Statement_Sequence (Func_Body));
1031      Replace_Returns (Last_Entity (Proc_Id), Stmts);
1032
1033      New_Body :=
1034        Make_Subprogram_Body (Loc,
1035          Specification              =>
1036            Copy_Subprogram_Spec (Specification (Proc_Decl)),
1037          Declarations               => Declarations (Func_Body),
1038          Handled_Statement_Sequence =>
1039            Make_Handled_Sequence_Of_Statements (Loc,
1040              Statements => Stmts));
1041
1042      --  If the function is a generic instance, so is the new procedure.
1043      --  Set flag accordingly so that the proper renaming declarations are
1044      --  generated.
1045
1046      Set_Is_Generic_Instance (Proc_Id, Is_Generic_Instance (Func_Id));
1047      return New_Body;
1048   end Build_Procedure_Body_Form;
1049
1050   -----------------------
1051   -- Caller_Known_Size --
1052   -----------------------
1053
1054   function Caller_Known_Size
1055     (Func_Call   : Node_Id;
1056      Result_Subt : Entity_Id) return Boolean
1057   is
1058   begin
1059      return
1060          (Is_Definite_Subtype (Underlying_Type (Result_Subt))
1061            and then No (Controlling_Argument (Func_Call)))
1062        or else not Requires_Transient_Scope (Underlying_Type (Result_Subt));
1063   end Caller_Known_Size;
1064
1065   -----------------------
1066   -- Check_BIP_Actuals --
1067   -----------------------
1068
1069   function Check_BIP_Actuals
1070     (Subp_Call : Node_Id;
1071      Subp_Id   : Entity_Id) return Boolean
1072   is
1073      Formal : Entity_Id;
1074      Actual : Node_Id;
1075
1076   begin
1077      pragma Assert (Nkind (Subp_Call) in N_Entry_Call_Statement
1078                                        | N_Function_Call
1079                                        | N_Procedure_Call_Statement);
1080
1081      Formal := First_Formal_With_Extras (Subp_Id);
1082      Actual := First_Actual (Subp_Call);
1083
1084      while Present (Formal) and then Present (Actual) loop
1085         if Is_Build_In_Place_Entity (Formal)
1086           and then Nkind (Actual) = N_Identifier
1087           and then Is_Build_In_Place_Entity (Entity (Actual))
1088           and then BIP_Suffix_Kind (Formal)
1089                      /= BIP_Suffix_Kind (Entity (Actual))
1090         then
1091            return False;
1092         end if;
1093
1094         Next_Formal_With_Extras (Formal);
1095         Next_Actual (Actual);
1096      end loop;
1097
1098      return No (Formal) and then No (Actual);
1099   end Check_BIP_Actuals;
1100
1101   -----------------------------
1102   -- Check_Number_Of_Actuals --
1103   -----------------------------
1104
1105   function Check_Number_Of_Actuals
1106     (Subp_Call : Node_Id;
1107      Subp_Id   : Entity_Id) return Boolean
1108   is
1109      Formal : Entity_Id;
1110      Actual : Node_Id;
1111
1112   begin
1113      pragma Assert (Nkind (Subp_Call) in N_Entry_Call_Statement
1114                                        | N_Function_Call
1115                                        | N_Procedure_Call_Statement);
1116
1117      Formal := First_Formal_With_Extras (Subp_Id);
1118      Actual := First_Actual (Subp_Call);
1119
1120      while Present (Formal) and then Present (Actual) loop
1121         Next_Formal_With_Extras (Formal);
1122         Next_Actual (Actual);
1123      end loop;
1124
1125      return No (Formal) and then No (Actual);
1126   end Check_Number_Of_Actuals;
1127
1128   --------------------------------
1129   -- Check_Overriding_Operation --
1130   --------------------------------
1131
1132   procedure Check_Overriding_Operation (Subp : Entity_Id) is
1133      Typ     : constant Entity_Id := Find_Dispatching_Type (Subp);
1134      Op_List : constant Elist_Id  := Primitive_Operations (Typ);
1135      Op_Elmt : Elmt_Id;
1136      Prim_Op : Entity_Id;
1137      Par_Op  : Entity_Id;
1138
1139   begin
1140      if Is_Derived_Type (Typ)
1141        and then not Is_Private_Type (Typ)
1142        and then In_Open_Scopes (Scope (Etype (Typ)))
1143        and then Is_Base_Type (Typ)
1144      then
1145         --  Subp overrides an inherited private operation if there is an
1146         --  inherited operation with a different name than Subp (see
1147         --  Derive_Subprogram) whose Alias is a hidden subprogram with the
1148         --  same name as Subp.
1149
1150         Op_Elmt := First_Elmt (Op_List);
1151         while Present (Op_Elmt) loop
1152            Prim_Op := Node (Op_Elmt);
1153            Par_Op  := Alias (Prim_Op);
1154
1155            if Present (Par_Op)
1156              and then not Comes_From_Source (Prim_Op)
1157              and then Chars (Prim_Op) /= Chars (Par_Op)
1158              and then Chars (Par_Op) = Chars (Subp)
1159              and then Is_Hidden (Par_Op)
1160              and then Type_Conformant (Prim_Op, Subp)
1161            then
1162               Set_DT_Position_Value (Subp, DT_Position (Prim_Op));
1163            end if;
1164
1165            Next_Elmt (Op_Elmt);
1166         end loop;
1167      end if;
1168   end Check_Overriding_Operation;
1169
1170   -------------------------------
1171   -- Detect_Infinite_Recursion --
1172   -------------------------------
1173
1174   procedure Detect_Infinite_Recursion (N : Node_Id; Spec : Entity_Id) is
1175      Loc : constant Source_Ptr := Sloc (N);
1176
1177      Var_List : constant Elist_Id := New_Elmt_List;
1178      --  List of globals referenced by body of procedure
1179
1180      Call_List : constant Elist_Id := New_Elmt_List;
1181      --  List of recursive calls in body of procedure
1182
1183      Shad_List : constant Elist_Id := New_Elmt_List;
1184      --  List of entity id's for entities created to capture the value of
1185      --  referenced globals on entry to the procedure.
1186
1187      Scop : constant Uint := Scope_Depth (Spec);
1188      --  This is used to record the scope depth of the current procedure, so
1189      --  that we can identify global references.
1190
1191      Max_Vars : constant := 4;
1192      --  Do not test more than four global variables
1193
1194      Count_Vars : Natural := 0;
1195      --  Count variables found so far
1196
1197      Var  : Entity_Id;
1198      Elm  : Elmt_Id;
1199      Ent  : Entity_Id;
1200      Call : Elmt_Id;
1201      Decl : Node_Id;
1202      Test : Node_Id;
1203      Elm1 : Elmt_Id;
1204      Elm2 : Elmt_Id;
1205      Last : Node_Id;
1206
1207      function Process (Nod : Node_Id) return Traverse_Result;
1208      --  Function to traverse the subprogram body (using Traverse_Func)
1209
1210      -------------
1211      -- Process --
1212      -------------
1213
1214      function Process (Nod : Node_Id) return Traverse_Result is
1215      begin
1216         --  Procedure call
1217
1218         if Nkind (Nod) = N_Procedure_Call_Statement then
1219
1220            --  Case of one of the detected recursive calls
1221
1222            if Is_Entity_Name (Name (Nod))
1223              and then Has_Recursive_Call (Entity (Name (Nod)))
1224              and then Entity (Name (Nod)) = Spec
1225            then
1226               Append_Elmt (Nod, Call_List);
1227               return Skip;
1228
1229            --  Any other procedure call may have side effects
1230
1231            else
1232               return Abandon;
1233            end if;
1234
1235         --  A call to a pure function can always be ignored
1236
1237         elsif Nkind (Nod) = N_Function_Call
1238           and then Is_Entity_Name (Name (Nod))
1239           and then Is_Pure (Entity (Name (Nod)))
1240         then
1241            return Skip;
1242
1243         --  Case of an identifier reference
1244
1245         elsif Nkind (Nod) = N_Identifier then
1246            Ent := Entity (Nod);
1247
1248            --  If no entity, then ignore the reference
1249
1250            --  Not clear why this can happen. To investigate, remove this
1251            --  test and look at the crash that occurs here in 3401-004 ???
1252
1253            if No (Ent) then
1254               return Skip;
1255
1256            --  Ignore entities with no Scope, again not clear how this
1257            --  can happen, to investigate, look at 4108-008 ???
1258
1259            elsif No (Scope (Ent)) then
1260               return Skip;
1261
1262            --  Ignore the reference if not to a more global object
1263
1264            elsif Scope_Depth (Scope (Ent)) >= Scop then
1265               return Skip;
1266
1267            --  References to types, exceptions and constants are always OK
1268
1269            elsif Is_Type (Ent)
1270              or else Ekind (Ent) = E_Exception
1271              or else Ekind (Ent) = E_Constant
1272            then
1273               return Skip;
1274
1275            --  If other than a non-volatile scalar variable, we have some
1276            --  kind of global reference (e.g. to a function) that we cannot
1277            --  deal with so we forget the attempt.
1278
1279            elsif Ekind (Ent) /= E_Variable
1280              or else not Is_Scalar_Type (Etype (Ent))
1281              or else Treat_As_Volatile (Ent)
1282            then
1283               return Abandon;
1284
1285            --  Otherwise we have a reference to a global scalar
1286
1287            else
1288               --  Loop through global entities already detected
1289
1290               Elm := First_Elmt (Var_List);
1291               loop
1292                  --  If not detected before, record this new global reference
1293
1294                  if No (Elm) then
1295                     Count_Vars := Count_Vars + 1;
1296
1297                     if Count_Vars <= Max_Vars then
1298                        Append_Elmt (Entity (Nod), Var_List);
1299                     else
1300                        return Abandon;
1301                     end if;
1302
1303                     exit;
1304
1305                  --  If recorded before, ignore
1306
1307                  elsif Node (Elm) = Entity (Nod) then
1308                     return Skip;
1309
1310                  --  Otherwise keep looking
1311
1312                  else
1313                     Next_Elmt (Elm);
1314                  end if;
1315               end loop;
1316
1317               return Skip;
1318            end if;
1319
1320         --  For all other node kinds, recursively visit syntactic children
1321
1322         else
1323            return OK;
1324         end if;
1325      end Process;
1326
1327      function Traverse_Body is new Traverse_Func (Process);
1328
1329   --  Start of processing for Detect_Infinite_Recursion
1330
1331   begin
1332      --  Do not attempt detection in No_Implicit_Conditional mode, since we
1333      --  won't be able to generate the code to handle the recursion in any
1334      --  case.
1335
1336      if Restriction_Active (No_Implicit_Conditionals) then
1337         return;
1338      end if;
1339
1340      --  Otherwise do traversal and quit if we get abandon signal
1341
1342      if Traverse_Body (N) = Abandon then
1343         return;
1344
1345      --  We must have a call, since Has_Recursive_Call was set. If not just
1346      --  ignore (this is only an error check, so if we have a funny situation,
1347      --  due to bugs or errors, we do not want to bomb).
1348
1349      elsif Is_Empty_Elmt_List (Call_List) then
1350         return;
1351      end if;
1352
1353      --  Here is the case where we detect recursion at compile time
1354
1355      --  Push our current scope for analyzing the declarations and code that
1356      --  we will insert for the checking.
1357
1358      Push_Scope (Spec);
1359
1360      --  This loop builds temporary variables for each of the referenced
1361      --  globals, so that at the end of the loop the list Shad_List contains
1362      --  these temporaries in one-to-one correspondence with the elements in
1363      --  Var_List.
1364
1365      Last := Empty;
1366      Elm := First_Elmt (Var_List);
1367      while Present (Elm) loop
1368         Var := Node (Elm);
1369         Ent := Make_Temporary (Loc, 'S');
1370         Append_Elmt (Ent, Shad_List);
1371
1372         --  Insert a declaration for this temporary at the start of the
1373         --  declarations for the procedure. The temporaries are declared as
1374         --  constant objects initialized to the current values of the
1375         --  corresponding temporaries.
1376
1377         Decl :=
1378           Make_Object_Declaration (Loc,
1379             Defining_Identifier => Ent,
1380             Object_Definition   => New_Occurrence_Of (Etype (Var), Loc),
1381             Constant_Present    => True,
1382             Expression          => New_Occurrence_Of (Var, Loc));
1383
1384         if No (Last) then
1385            Prepend (Decl, Declarations (N));
1386         else
1387            Insert_After (Last, Decl);
1388         end if;
1389
1390         Last := Decl;
1391         Analyze (Decl);
1392         Next_Elmt (Elm);
1393      end loop;
1394
1395      --  Loop through calls
1396
1397      Call := First_Elmt (Call_List);
1398      while Present (Call) loop
1399
1400         --  Build a predicate expression of the form
1401
1402         --    True
1403         --      and then global1 = temp1
1404         --      and then global2 = temp2
1405         --      ...
1406
1407         --  This predicate determines if any of the global values
1408         --  referenced by the procedure have changed since the
1409         --  current call, if not an infinite recursion is assured.
1410
1411         Test := New_Occurrence_Of (Standard_True, Loc);
1412
1413         Elm1 := First_Elmt (Var_List);
1414         Elm2 := First_Elmt (Shad_List);
1415         while Present (Elm1) loop
1416            Test :=
1417              Make_And_Then (Loc,
1418                Left_Opnd  => Test,
1419                Right_Opnd =>
1420                  Make_Op_Eq (Loc,
1421                    Left_Opnd  => New_Occurrence_Of (Node (Elm1), Loc),
1422                    Right_Opnd => New_Occurrence_Of (Node (Elm2), Loc)));
1423
1424            Next_Elmt (Elm1);
1425            Next_Elmt (Elm2);
1426         end loop;
1427
1428         --  Now we replace the call with the sequence
1429
1430         --    if no-changes (see above) then
1431         --       raise Storage_Error;
1432         --    else
1433         --       original-call
1434         --    end if;
1435
1436         Rewrite (Node (Call),
1437           Make_If_Statement (Loc,
1438             Condition       => Test,
1439             Then_Statements => New_List (
1440               Make_Raise_Storage_Error (Loc,
1441                 Reason => SE_Infinite_Recursion)),
1442
1443             Else_Statements => New_List (
1444               Relocate_Node (Node (Call)))));
1445
1446         Analyze (Node (Call));
1447
1448         Next_Elmt (Call);
1449      end loop;
1450
1451      --  Remove temporary scope stack entry used for analysis
1452
1453      Pop_Scope;
1454   end Detect_Infinite_Recursion;
1455
1456   --------------------
1457   -- Expand_Actuals --
1458   --------------------
1459
1460   procedure Expand_Actuals
1461     (N         : Node_Id;
1462      Subp      : Entity_Id;
1463      Post_Call : out List_Id)
1464   is
1465      Loc      : constant Source_Ptr := Sloc (N);
1466      Actual   : Node_Id;
1467      Formal   : Entity_Id;
1468      N_Node   : Node_Id;
1469      E_Actual : Entity_Id;
1470      E_Formal : Entity_Id;
1471
1472      procedure Add_Call_By_Copy_Code;
1473      --  For cases where the parameter must be passed by copy, this routine
1474      --  generates a temporary variable into which the actual is copied and
1475      --  then passes this as the parameter. For an OUT or IN OUT parameter,
1476      --  an assignment is also generated to copy the result back. The call
1477      --  also takes care of any constraint checks required for the type
1478      --  conversion case (on both the way in and the way out).
1479
1480      procedure Add_Simple_Call_By_Copy_Code (Force : Boolean);
1481      --  This is similar to the above, but is used in cases where we know
1482      --  that all that is needed is to simply create a temporary and copy
1483      --  the value in and out of the temporary. If Force is True, then the
1484      --  procedure may disregard legality considerations.
1485
1486      --  ??? We need to do the copy for a bit-packed array because this is
1487      --  where the rewriting into a mask-and-shift sequence is done. But of
1488      --  course this may break the program if it expects bits to be really
1489      --  passed by reference. That's what we have done historically though.
1490
1491      procedure Add_Validation_Call_By_Copy_Code (Act : Node_Id);
1492      --  Perform copy-back for actual parameter Act which denotes a validation
1493      --  variable.
1494
1495      procedure Check_Fortran_Logical;
1496      --  A value of type Logical that is passed through a formal parameter
1497      --  must be normalized because .TRUE. usually does not have the same
1498      --  representation as True. We assume that .FALSE. = False = 0.
1499      --  What about functions that return a logical type ???
1500
1501      function Is_Legal_Copy return Boolean;
1502      --  Check that an actual can be copied before generating the temporary
1503      --  to be used in the call. If the formal is of a by_reference type or
1504      --  is aliased, then the program is illegal (this can only happen in
1505      --  the presence of representation clauses that force a misalignment)
1506      --  If the formal is a by_reference parameter imposed by a DEC pragma,
1507      --  emit a warning that this might lead to unaligned arguments.
1508
1509      function Make_Var (Actual : Node_Id) return Entity_Id;
1510      --  Returns an entity that refers to the given actual parameter, Actual
1511      --  (not including any type conversion). If Actual is an entity name,
1512      --  then this entity is returned unchanged, otherwise a renaming is
1513      --  created to provide an entity for the actual.
1514
1515      procedure Reset_Packed_Prefix;
1516      --  The expansion of a packed array component reference is delayed in
1517      --  the context of a call. Now we need to complete the expansion, so we
1518      --  unmark the analyzed bits in all prefixes.
1519
1520      function Requires_Atomic_Or_Volatile_Copy return Boolean;
1521      --  Returns whether a copy is required as per RM C.6(19) and gives a
1522      --  warning in this case.
1523
1524      ---------------------------
1525      -- Add_Call_By_Copy_Code --
1526      ---------------------------
1527
1528      procedure Add_Call_By_Copy_Code is
1529         Crep  : Boolean;
1530         Expr  : Node_Id;
1531         F_Typ : Entity_Id := Etype (Formal);
1532         Indic : Node_Id;
1533         Init  : Node_Id;
1534         Temp  : Entity_Id;
1535         V_Typ : Entity_Id;
1536         Var   : Entity_Id;
1537
1538      begin
1539         if not Is_Legal_Copy then
1540            return;
1541         end if;
1542
1543         Temp := Make_Temporary (Loc, 'T', Actual);
1544
1545         --  Handle formals whose type comes from the limited view
1546
1547         if From_Limited_With (F_Typ)
1548           and then Has_Non_Limited_View (F_Typ)
1549         then
1550            F_Typ := Non_Limited_View (F_Typ);
1551         end if;
1552
1553         --  Use formal type for temp, unless formal type is an unconstrained
1554         --  array, in which case we don't have to worry about bounds checks,
1555         --  and we use the actual type, since that has appropriate bounds.
1556
1557         if Is_Array_Type (F_Typ) and then not Is_Constrained (F_Typ) then
1558            Indic := New_Occurrence_Of (Etype (Actual), Loc);
1559         else
1560            Indic := New_Occurrence_Of (F_Typ, Loc);
1561         end if;
1562
1563         --  The new code will be properly analyzed below and the setting of
1564         --  the Do_Range_Check flag recomputed so remove the obsolete one.
1565
1566         Set_Do_Range_Check (Actual, False);
1567
1568         if Nkind (Actual) = N_Type_Conversion then
1569            Set_Do_Range_Check (Expression (Actual), False);
1570
1571            V_Typ := Etype (Expression (Actual));
1572
1573            --  If the formal is an (in-)out parameter, capture the name
1574            --  of the variable in order to build the post-call assignment.
1575
1576            Var := Make_Var (Expression (Actual));
1577
1578            Crep := not Has_Compatible_Representation
1579                          (Target_Type  => F_Typ,
1580                           Operand_Type => Etype (Expression (Actual)));
1581
1582         else
1583            V_Typ := Etype (Actual);
1584            Var   := Make_Var (Actual);
1585            Crep  := False;
1586         end if;
1587
1588         --  Setup initialization for case of in out parameter, or an out
1589         --  parameter where the formal is an unconstrained array (in the
1590         --  latter case, we have to pass in an object with bounds).
1591
1592         --  If this is an out parameter, the initial copy is wasteful, so as
1593         --  an optimization for the one-dimensional case we extract the
1594         --  bounds of the actual and build an uninitialized temporary of the
1595         --  right size.
1596
1597         --  If the formal is an out parameter with discriminants, the
1598         --  discriminants must be captured even if the rest of the object
1599         --  is in principle uninitialized, because the discriminants may
1600         --  be read by the called subprogram.
1601
1602         if Ekind (Formal) = E_In_Out_Parameter
1603           or else (Is_Array_Type (F_Typ) and then not Is_Constrained (F_Typ))
1604           or else Has_Discriminants (F_Typ)
1605         then
1606            if Nkind (Actual) = N_Type_Conversion then
1607               if Conversion_OK (Actual) then
1608                  Init := OK_Convert_To (F_Typ, New_Occurrence_Of (Var, Loc));
1609               else
1610                  Init := Convert_To (F_Typ, New_Occurrence_Of (Var, Loc));
1611               end if;
1612
1613            elsif Ekind (Formal) = E_Out_Parameter
1614              and then Is_Array_Type (F_Typ)
1615              and then Number_Dimensions (F_Typ) = 1
1616              and then not Has_Non_Null_Base_Init_Proc (F_Typ)
1617            then
1618               --  Actual is a one-dimensional array or slice, and the type
1619               --  requires no initialization. Create a temporary of the
1620               --  right size, but do not copy actual into it (optimization).
1621
1622               Init := Empty;
1623               Indic :=
1624                 Make_Subtype_Indication (Loc,
1625                   Subtype_Mark => New_Occurrence_Of (F_Typ, Loc),
1626                   Constraint   =>
1627                     Make_Index_Or_Discriminant_Constraint (Loc,
1628                       Constraints => New_List (
1629                         Make_Range (Loc,
1630                           Low_Bound  =>
1631                             Make_Attribute_Reference (Loc,
1632                               Prefix         => New_Occurrence_Of (Var, Loc),
1633                               Attribute_Name => Name_First),
1634                           High_Bound =>
1635                             Make_Attribute_Reference (Loc,
1636                               Prefix         => New_Occurrence_Of (Var, Loc),
1637                               Attribute_Name => Name_Last)))));
1638
1639            else
1640               Init := New_Occurrence_Of (Var, Loc);
1641            end if;
1642
1643         --  An initialization is created for packed conversions as
1644         --  actuals for out parameters to enable Make_Object_Declaration
1645         --  to determine the proper subtype for N_Node. Note that this
1646         --  is wasteful because the extra copying on the call side is
1647         --  not required for such out parameters. ???
1648
1649         elsif Ekind (Formal) = E_Out_Parameter
1650           and then Nkind (Actual) = N_Type_Conversion
1651           and then (Is_Bit_Packed_Array (F_Typ)
1652                       or else
1653                     Is_Bit_Packed_Array (Etype (Expression (Actual))))
1654         then
1655            if Conversion_OK (Actual) then
1656               Init := OK_Convert_To (F_Typ, New_Occurrence_Of (Var, Loc));
1657            else
1658               Init := Convert_To (F_Typ, New_Occurrence_Of (Var, Loc));
1659            end if;
1660
1661         elsif Ekind (Formal) = E_In_Parameter then
1662
1663            --  Handle the case in which the actual is a type conversion
1664
1665            if Nkind (Actual) = N_Type_Conversion then
1666               if Conversion_OK (Actual) then
1667                  Init := OK_Convert_To (F_Typ, New_Occurrence_Of (Var, Loc));
1668               else
1669                  Init := Convert_To (F_Typ, New_Occurrence_Of (Var, Loc));
1670               end if;
1671            else
1672               Init := New_Occurrence_Of (Var, Loc);
1673            end if;
1674
1675         --  Access types are passed in without checks, but if a copy-back is
1676         --  required for a null-excluding check on an in-out or out parameter,
1677         --  then the initial value is that of the actual.
1678
1679         elsif Is_Access_Type (E_Formal)
1680           and then Can_Never_Be_Null (Etype (Actual))
1681           and then not Can_Never_Be_Null (E_Formal)
1682         then
1683            Init := New_Occurrence_Of (Var, Loc);
1684
1685         --  View conversions when the formal type has the Default_Value aspect
1686         --  require passing in the value of the conversion's operand. The type
1687         --  of that operand also has Default_Value, as required by AI12-0074
1688         --  (RM 6.4.1(5.3/4)). The subtype denoted by the subtype_indication
1689         --  is changed to the base type of the formal subtype, to ensure that
1690         --  the actual's value can be assigned without a constraint check
1691         --  (note that no check is done on passing to an out parameter). Also
1692         --  note that the two types necessarily share the same ancestor type,
1693         --  as required by 6.4.1(5.2/4), so underlying base types will match.
1694
1695         elsif Ekind (Formal) = E_Out_Parameter
1696           and then Is_Scalar_Type (Etype (F_Typ))
1697           and then Nkind (Actual) = N_Type_Conversion
1698           and then Present (Default_Aspect_Value (Etype (F_Typ)))
1699         then
1700            Indic := New_Occurrence_Of (Base_Type (F_Typ), Loc);
1701            Init  := Convert_To
1702                       (Base_Type (F_Typ), New_Occurrence_Of (Var, Loc));
1703
1704         else
1705            Init := Empty;
1706         end if;
1707
1708         N_Node :=
1709           Make_Object_Declaration (Loc,
1710             Defining_Identifier => Temp,
1711             Object_Definition   => Indic,
1712             Expression          => Init);
1713         Set_Assignment_OK (N_Node);
1714         Insert_Action (N, N_Node);
1715
1716         --  Now, normally the deal here is that we use the defining
1717         --  identifier created by that object declaration. There is
1718         --  one exception to this. In the change of representation case
1719         --  the above declaration will end up looking like:
1720
1721         --    temp : type := identifier;
1722
1723         --  And in this case we might as well use the identifier directly
1724         --  and eliminate the temporary. Note that the analysis of the
1725         --  declaration was not a waste of time in that case, since it is
1726         --  what generated the necessary change of representation code. If
1727         --  the change of representation introduced additional code, as in
1728         --  a fixed-integer conversion, the expression is not an identifier
1729         --  and must be kept.
1730
1731         if Crep
1732           and then Present (Expression (N_Node))
1733           and then Is_Entity_Name (Expression (N_Node))
1734         then
1735            Temp := Entity (Expression (N_Node));
1736            Rewrite (N_Node, Make_Null_Statement (Loc));
1737         end if;
1738
1739         --  For IN parameter, all we do is to replace the actual
1740
1741         if Ekind (Formal) = E_In_Parameter then
1742            Rewrite (Actual, New_Occurrence_Of (Temp, Loc));
1743            Analyze (Actual);
1744
1745         --  Processing for OUT or IN OUT parameter
1746
1747         else
1748            --  Kill current value indications for the temporary variable we
1749            --  created, since we just passed it as an OUT parameter.
1750
1751            Kill_Current_Values (Temp);
1752            Set_Is_Known_Valid (Temp, False);
1753            Set_Is_True_Constant (Temp, False);
1754
1755            --  If type conversion, use reverse conversion on exit
1756
1757            if Nkind (Actual) = N_Type_Conversion then
1758               if Conversion_OK (Actual) then
1759                  Expr := OK_Convert_To (V_Typ, New_Occurrence_Of (Temp, Loc));
1760               else
1761                  Expr := Convert_To (V_Typ, New_Occurrence_Of (Temp, Loc));
1762               end if;
1763            else
1764               Expr := New_Occurrence_Of (Temp, Loc);
1765            end if;
1766
1767            Rewrite (Actual, New_Occurrence_Of (Temp, Loc));
1768            Analyze (Actual);
1769
1770            --  If the actual is a conversion of a packed reference, it may
1771            --  already have been expanded by Remove_Side_Effects, and the
1772            --  resulting variable is a temporary which does not designate
1773            --  the proper out-parameter, which may not be addressable. In
1774            --  that case, generate an assignment to the original expression
1775            --  (before expansion of the packed reference) so that the proper
1776            --  expansion of assignment to a packed component can take place.
1777
1778            declare
1779               Obj : Node_Id;
1780               Lhs : Node_Id;
1781
1782            begin
1783               if Is_Renaming_Of_Object (Var)
1784                 and then Nkind (Renamed_Object (Var)) = N_Selected_Component
1785                 and then Nkind (Original_Node (Prefix (Renamed_Object (Var))))
1786                   = N_Indexed_Component
1787                 and then
1788                   Has_Non_Standard_Rep (Etype (Prefix (Renamed_Object (Var))))
1789               then
1790                  Obj := Renamed_Object (Var);
1791                  Lhs :=
1792                    Make_Selected_Component (Loc,
1793                      Prefix        =>
1794                        New_Copy_Tree (Original_Node (Prefix (Obj))),
1795                      Selector_Name => New_Copy (Selector_Name (Obj)));
1796                  Reset_Analyzed_Flags (Lhs);
1797
1798               else
1799                  Lhs := New_Occurrence_Of (Var, Loc);
1800               end if;
1801
1802               Set_Assignment_OK (Lhs);
1803
1804               if Is_Access_Type (E_Formal)
1805                 and then Is_Entity_Name (Lhs)
1806                 and then
1807                   Present (Effective_Extra_Accessibility (Entity (Lhs)))
1808                 and then not No_Dynamic_Accessibility_Checks_Enabled (Lhs)
1809               then
1810                  --  Copyback target is an Ada 2012 stand-alone object of an
1811                  --  anonymous access type.
1812
1813                  pragma Assert (Ada_Version >= Ada_2012);
1814
1815                  Apply_Accessibility_Check (Lhs, E_Formal, N);
1816
1817                  Append_To (Post_Call,
1818                    Make_Assignment_Statement (Loc,
1819                      Name       => Lhs,
1820                      Expression => Expr));
1821
1822                  --  We would like to somehow suppress generation of the
1823                  --  extra_accessibility assignment generated by the expansion
1824                  --  of the above assignment statement. It's not a correctness
1825                  --  issue because the following assignment renders it dead,
1826                  --  but generating back-to-back assignments to the same
1827                  --  target is undesirable. ???
1828
1829                  Append_To (Post_Call,
1830                    Make_Assignment_Statement (Loc,
1831                      Name       => New_Occurrence_Of (
1832                        Effective_Extra_Accessibility (Entity (Lhs)), Loc),
1833                      Expression => Make_Integer_Literal (Loc,
1834                        Type_Access_Level (E_Formal))));
1835
1836               else
1837                  if Is_Access_Type (E_Formal)
1838                    and then Can_Never_Be_Null (Etype (Actual))
1839                    and then not Can_Never_Be_Null (E_Formal)
1840                  then
1841                     Append_To (Post_Call,
1842                       Make_Raise_Constraint_Error (Loc,
1843                         Condition =>
1844                           Make_Op_Eq (Loc,
1845                             Left_Opnd  => New_Occurrence_Of (Temp, Loc),
1846                             Right_Opnd => Make_Null (Loc)),
1847                         Reason => CE_Access_Check_Failed));
1848                  end if;
1849
1850                  Append_To (Post_Call,
1851                    Make_Assignment_Statement (Loc,
1852                      Name       => Lhs,
1853                      Expression => Expr));
1854               end if;
1855            end;
1856         end if;
1857      end Add_Call_By_Copy_Code;
1858
1859      ----------------------------------
1860      -- Add_Simple_Call_By_Copy_Code --
1861      ----------------------------------
1862
1863      procedure Add_Simple_Call_By_Copy_Code (Force : Boolean) is
1864         Decl   : Node_Id;
1865         F_Typ  : Entity_Id := Etype (Formal);
1866         Incod  : Node_Id;
1867         Indic  : Node_Id;
1868         Lhs    : Node_Id;
1869         Outcod : Node_Id;
1870         Rhs    : Node_Id;
1871         Temp   : Entity_Id;
1872
1873      begin
1874         --  Unless forced not to, check the legality of the copy operation
1875
1876         if not Force and then not Is_Legal_Copy then
1877            return;
1878         end if;
1879
1880         --  Handle formals whose type comes from the limited view
1881
1882         if From_Limited_With (F_Typ)
1883           and then Has_Non_Limited_View (F_Typ)
1884         then
1885            F_Typ := Non_Limited_View (F_Typ);
1886         end if;
1887
1888         --  Use formal type for temp, unless formal type is an unconstrained
1889         --  array, in which case we don't have to worry about bounds checks,
1890         --  and we use the actual type, since that has appropriate bounds.
1891
1892         if Is_Array_Type (F_Typ) and then not Is_Constrained (F_Typ) then
1893            Indic := New_Occurrence_Of (Etype (Actual), Loc);
1894         else
1895            Indic := New_Occurrence_Of (F_Typ, Loc);
1896         end if;
1897
1898         --  Prepare to generate code
1899
1900         Reset_Packed_Prefix;
1901
1902         Temp := Make_Temporary (Loc, 'T', Actual);
1903         Incod  := Relocate_Node (Actual);
1904         Outcod := New_Copy_Tree (Incod);
1905
1906         --  Generate declaration of temporary variable, initializing it
1907         --  with the input parameter unless we have an OUT formal or
1908         --  this is an initialization call.
1909
1910         --  If the formal is an out parameter with discriminants, the
1911         --  discriminants must be captured even if the rest of the object
1912         --  is in principle uninitialized, because the discriminants may
1913         --  be read by the called subprogram.
1914
1915         if Ekind (Formal) = E_Out_Parameter then
1916            Incod := Empty;
1917
1918            if Has_Discriminants (F_Typ) then
1919               Indic := New_Occurrence_Of (Etype (Actual), Loc);
1920            end if;
1921
1922         elsif Inside_Init_Proc then
1923
1924            --  Could use a comment here to match comment below ???
1925
1926            if Nkind (Actual) /= N_Selected_Component
1927              or else
1928                not Has_Discriminant_Dependent_Constraint
1929                  (Entity (Selector_Name (Actual)))
1930            then
1931               Incod := Empty;
1932
1933            --  Otherwise, keep the component in order to generate the proper
1934            --  actual subtype, that depends on enclosing discriminants.
1935
1936            else
1937               null;
1938            end if;
1939         end if;
1940
1941         Decl :=
1942           Make_Object_Declaration (Loc,
1943             Defining_Identifier => Temp,
1944             Object_Definition   => Indic,
1945             Expression          => Incod);
1946
1947         if Inside_Init_Proc
1948           and then No (Incod)
1949         then
1950            --  If the call is to initialize a component of a composite type,
1951            --  and the component does not depend on discriminants, use the
1952            --  actual type of the component. This is required in case the
1953            --  component is constrained, because in general the formal of the
1954            --  initialization procedure will be unconstrained. Note that if
1955            --  the component being initialized is constrained by an enclosing
1956            --  discriminant, the presence of the initialization in the
1957            --  declaration will generate an expression for the actual subtype.
1958
1959            Set_No_Initialization (Decl);
1960            Set_Object_Definition (Decl,
1961              New_Occurrence_Of (Etype (Actual), Loc));
1962         end if;
1963
1964         Insert_Action (N, Decl);
1965
1966         --  The actual is simply a reference to the temporary
1967
1968         Rewrite (Actual, New_Occurrence_Of (Temp, Loc));
1969
1970         --  Generate copy out if OUT or IN OUT parameter
1971
1972         if Ekind (Formal) /= E_In_Parameter then
1973            Lhs := Outcod;
1974            Rhs := New_Occurrence_Of (Temp, Loc);
1975            Set_Is_True_Constant (Temp, False);
1976
1977            --  Deal with conversion
1978
1979            if Nkind (Lhs) = N_Type_Conversion then
1980               Lhs := Expression (Lhs);
1981               Rhs := Convert_To (Etype (Actual), Rhs);
1982            end if;
1983
1984            Append_To (Post_Call,
1985              Make_Assignment_Statement (Loc,
1986                Name       => Lhs,
1987                Expression => Rhs));
1988            Set_Assignment_OK (Name (Last (Post_Call)));
1989         end if;
1990      end Add_Simple_Call_By_Copy_Code;
1991
1992      --------------------------------------
1993      -- Add_Validation_Call_By_Copy_Code --
1994      --------------------------------------
1995
1996      procedure Add_Validation_Call_By_Copy_Code (Act : Node_Id) is
1997         Expr    : Node_Id;
1998         Obj     : Node_Id;
1999         Obj_Typ : Entity_Id;
2000         Var     : constant Node_Id := Unqual_Conv (Act);
2001         Var_Id  : Entity_Id;
2002
2003      begin
2004         --  Generate range check if required
2005
2006         if Do_Range_Check (Actual) then
2007            Generate_Range_Check (Actual, E_Formal, CE_Range_Check_Failed);
2008         end if;
2009
2010         --  If there is a type conversion in the actual, it will be reinstated
2011         --  below, the new instance will be properly analyzed and the setting
2012         --  of the Do_Range_Check flag recomputed so remove the obsolete one.
2013
2014         if Nkind (Actual) = N_Type_Conversion then
2015            Set_Do_Range_Check (Expression (Actual), False);
2016         end if;
2017
2018         --  Copy the value of the validation variable back into the object
2019         --  being validated.
2020
2021         if Is_Entity_Name (Var) then
2022            Var_Id  := Entity (Var);
2023            Obj     := Validated_Object (Var_Id);
2024            Obj_Typ := Etype (Obj);
2025
2026            Expr := New_Occurrence_Of (Var_Id, Loc);
2027
2028            --  A type conversion is needed when the validation variable and
2029            --  the validated object carry different types. This case occurs
2030            --  when the actual is qualified in some fashion.
2031
2032            --    Common:
2033            --      subtype Int is Integer range ...;
2034            --      procedure Call (Val : in out Integer);
2035
2036            --    Original:
2037            --      Object : Int;
2038            --      Call (Integer (Object));
2039
2040            --    Expanded:
2041            --      Object : Int;
2042            --      Var : Integer := Object;  --  conversion to base type
2043            --      if not Var'Valid then     --  validity check
2044            --      Call (Var);               --  modify Var
2045            --      Object := Int (Var);      --  conversion to subtype
2046
2047            if Etype (Var_Id) /= Obj_Typ then
2048               Expr :=
2049                 Make_Type_Conversion (Loc,
2050                   Subtype_Mark => New_Occurrence_Of (Obj_Typ, Loc),
2051                   Expression   => Expr);
2052            end if;
2053
2054            --  Generate:
2055            --    Object := Var;
2056            --      <or>
2057            --    Object := Object_Type (Var);
2058
2059            Append_To (Post_Call,
2060              Make_Assignment_Statement (Loc,
2061                Name       => Obj,
2062                Expression => Expr));
2063
2064         --  If the flow reaches this point, then this routine was invoked with
2065         --  an actual which does not denote a validation variable.
2066
2067         else
2068            pragma Assert (False);
2069            null;
2070         end if;
2071      end Add_Validation_Call_By_Copy_Code;
2072
2073      ---------------------------
2074      -- Check_Fortran_Logical --
2075      ---------------------------
2076
2077      procedure Check_Fortran_Logical is
2078         Logical : constant Entity_Id := Etype (Formal);
2079         Var     : Entity_Id;
2080
2081      --  Note: this is very incomplete, e.g. it does not handle arrays
2082      --  of logical values. This is really not the right approach at all???)
2083
2084      begin
2085         if Convention (Subp) = Convention_Fortran
2086           and then Root_Type (Etype (Formal)) = Standard_Boolean
2087           and then Ekind (Formal) /= E_In_Parameter
2088         then
2089            Var := Make_Var (Actual);
2090            Append_To (Post_Call,
2091              Make_Assignment_Statement (Loc,
2092                Name => New_Occurrence_Of (Var, Loc),
2093                Expression =>
2094                  Unchecked_Convert_To (
2095                    Logical,
2096                    Make_Op_Ne (Loc,
2097                      Left_Opnd  => New_Occurrence_Of (Var, Loc),
2098                      Right_Opnd =>
2099                        Unchecked_Convert_To (
2100                          Logical,
2101                          New_Occurrence_Of (Standard_False, Loc))))));
2102         end if;
2103      end Check_Fortran_Logical;
2104
2105      -------------------
2106      -- Is_Legal_Copy --
2107      -------------------
2108
2109      function Is_Legal_Copy return Boolean is
2110      begin
2111         --  An attempt to copy a value of such a type can only occur if
2112         --  representation clauses give the actual a misaligned address.
2113
2114         if Is_By_Reference_Type (Etype (Formal))
2115           or else Is_Aliased (Formal)
2116           or else (Mechanism (Formal) = By_Reference
2117                     and then not Has_Foreign_Convention (Subp))
2118         then
2119
2120            --  The actual may in fact be properly aligned but there is not
2121            --  enough front-end information to determine this. In that case
2122            --  gigi will emit an error or a warning if a copy is not legal,
2123            --  or generate the proper code.
2124
2125            return False;
2126
2127         --  For users of Starlet, we assume that the specification of by-
2128         --  reference mechanism is mandatory. This may lead to unaligned
2129         --  objects but at least for DEC legacy code it is known to work.
2130         --  The warning will alert users of this code that a problem may
2131         --  be lurking.
2132
2133         elsif Mechanism (Formal) = By_Reference
2134           and then Ekind (Scope (Formal)) = E_Procedure
2135           and then Is_Valued_Procedure (Scope (Formal))
2136         then
2137            Error_Msg_N
2138              ("by_reference actual may be misaligned??", Actual);
2139            return False;
2140
2141         else
2142            return True;
2143         end if;
2144      end Is_Legal_Copy;
2145
2146      --------------
2147      -- Make_Var --
2148      --------------
2149
2150      function Make_Var (Actual : Node_Id) return Entity_Id is
2151         Var : Entity_Id;
2152
2153      begin
2154         if Is_Entity_Name (Actual) then
2155            return Entity (Actual);
2156
2157         else
2158            Var := Make_Temporary (Loc, 'T', Actual);
2159
2160            N_Node :=
2161              Make_Object_Renaming_Declaration (Loc,
2162                Defining_Identifier => Var,
2163                Subtype_Mark        =>
2164                  New_Occurrence_Of (Etype (Actual), Loc),
2165                Name                => Relocate_Node (Actual));
2166
2167            Insert_Action (N, N_Node);
2168            return Var;
2169         end if;
2170      end Make_Var;
2171
2172      -------------------------
2173      -- Reset_Packed_Prefix --
2174      -------------------------
2175
2176      procedure Reset_Packed_Prefix is
2177         Pfx : Node_Id := Actual;
2178      begin
2179         loop
2180            Set_Analyzed (Pfx, False);
2181            exit when
2182              Nkind (Pfx) not in N_Selected_Component | N_Indexed_Component;
2183            Pfx := Prefix (Pfx);
2184         end loop;
2185      end Reset_Packed_Prefix;
2186
2187      ----------------------------------------
2188      --  Requires_Atomic_Or_Volatile_Copy  --
2189      ----------------------------------------
2190
2191      function Requires_Atomic_Or_Volatile_Copy return Boolean is
2192      begin
2193         --  If the formal is already passed by copy, no need to do anything
2194
2195         if Is_By_Copy_Type (E_Formal) then
2196            return False;
2197         end if;
2198
2199         --  There is no requirement inside initialization procedures and this
2200         --  would generate copies for atomic or volatile composite components.
2201
2202         if Inside_Init_Proc then
2203            return False;
2204         end if;
2205
2206         --  Check for atomicity mismatch
2207
2208         if Is_Atomic_Object (Actual) and then not Is_Atomic (E_Formal)
2209         then
2210            if Comes_From_Source (N) then
2211               Error_Msg_N
2212                 ("??atomic actual passed by copy (RM C.6(19))", Actual);
2213            end if;
2214            return True;
2215         end if;
2216
2217         --  Check for volatility mismatch
2218
2219         if Is_Volatile_Object_Ref (Actual) and then not Is_Volatile (E_Formal)
2220         then
2221            if Comes_From_Source (N) then
2222               Error_Msg_N
2223                 ("??volatile actual passed by copy (RM C.6(19))", Actual);
2224            end if;
2225            return True;
2226         end if;
2227
2228         return False;
2229      end Requires_Atomic_Or_Volatile_Copy;
2230
2231   --  Start of processing for Expand_Actuals
2232
2233   begin
2234      Post_Call := New_List;
2235
2236      Formal := First_Formal (Subp);
2237      Actual := First_Actual (N);
2238      while Present (Formal) loop
2239         E_Formal := Etype (Formal);
2240         E_Actual := Etype (Actual);
2241
2242         --  Handle formals whose type comes from the limited view
2243
2244         if From_Limited_With (E_Formal)
2245           and then Has_Non_Limited_View (E_Formal)
2246         then
2247            E_Formal := Non_Limited_View (E_Formal);
2248         end if;
2249
2250         if Is_Scalar_Type (E_Formal)
2251           or else Nkind (Actual) = N_Slice
2252         then
2253            Check_Fortran_Logical;
2254
2255         --  RM 6.4.1 (11)
2256
2257         elsif Ekind (Formal) /= E_Out_Parameter then
2258
2259            --  The unusual case of the current instance of a protected type
2260            --  requires special handling. This can only occur in the context
2261            --  of a call within the body of a protected operation.
2262
2263            if Is_Entity_Name (Actual)
2264              and then Ekind (Entity (Actual)) = E_Protected_Type
2265              and then In_Open_Scopes (Entity (Actual))
2266            then
2267               if Scope (Subp) /= Entity (Actual) then
2268                  Error_Msg_N
2269                    ("operation outside protected type may not "
2270                     & "call back its protected operations??", Actual);
2271               end if;
2272
2273               Rewrite (Actual,
2274                 Expand_Protected_Object_Reference (N, Entity (Actual)));
2275            end if;
2276
2277            --  Ada 2005 (AI-318-02): If the actual parameter is a call to a
2278            --  build-in-place function, then a temporary return object needs
2279            --  to be created and access to it must be passed to the function
2280            --  (and ensure that we have an activation chain defined for tasks
2281            --  and a Master variable).
2282
2283            --  Currently we limit such functions to those with inherently
2284            --  limited result subtypes, but eventually we plan to expand the
2285            --  functions that are treated as build-in-place to include other
2286            --  composite result types.
2287
2288            --  But do not do it here for intrinsic subprograms since this will
2289            --  be done properly after the subprogram is expanded.
2290
2291            if Is_Intrinsic_Subprogram (Subp) then
2292               null;
2293
2294            elsif Is_Build_In_Place_Function_Call (Actual) then
2295               if Might_Have_Tasks (Etype (Actual)) then
2296                  Build_Activation_Chain_Entity (N);
2297                  Build_Master_Entity (Etype (Actual));
2298               end if;
2299
2300               Make_Build_In_Place_Call_In_Anonymous_Context (Actual);
2301
2302            --  Ada 2005 (AI-318-02): Specialization of the previous case for
2303            --  actuals containing build-in-place function calls whose returned
2304            --  object covers interface types.
2305
2306            elsif Present (Unqual_BIP_Iface_Function_Call (Actual)) then
2307               Build_Activation_Chain_Entity (N);
2308               Build_Master_Entity (Etype (Actual));
2309               Make_Build_In_Place_Iface_Call_In_Anonymous_Context (Actual);
2310            end if;
2311
2312            Apply_Constraint_Check (Actual, E_Formal);
2313
2314         --  Out parameter case. No constraint checks on access type
2315         --  RM 6.4.1 (13), but on return a null-excluding check may be
2316         --  required (see below).
2317
2318         elsif Is_Access_Type (E_Formal) then
2319            null;
2320
2321         --  RM 6.4.1 (14)
2322
2323         elsif Has_Discriminants (Base_Type (E_Formal))
2324           or else Has_Non_Null_Base_Init_Proc (E_Formal)
2325         then
2326            Apply_Constraint_Check (Actual, E_Formal);
2327
2328         --  RM 6.4.1 (15)
2329
2330         else
2331            Apply_Constraint_Check (Actual, Base_Type (E_Formal));
2332         end if;
2333
2334         --  Processing for IN-OUT and OUT parameters
2335
2336         if Ekind (Formal) /= E_In_Parameter then
2337
2338            --  For type conversions of arrays, apply length/range checks
2339
2340            if Is_Array_Type (E_Formal)
2341              and then Nkind (Actual) = N_Type_Conversion
2342            then
2343               if Is_Constrained (E_Formal) then
2344                  Apply_Length_Check (Expression (Actual), E_Formal);
2345               else
2346                  Apply_Range_Check (Expression (Actual), E_Formal);
2347               end if;
2348            end if;
2349
2350            --  The actual denotes a variable which captures the value of an
2351            --  object for validation purposes. Add a copy-back to reflect any
2352            --  potential changes in value back into the original object.
2353
2354            --    Var : ... := Object;
2355            --    if not Var'Valid then  --  validity check
2356            --    Call (Var);            --  modify var
2357            --    Object := Var;         --  update Object
2358
2359            --  This case is given higher priority because the subsequent check
2360            --  for type conversion may add an extra copy of the variable and
2361            --  prevent proper value propagation back in the original object.
2362
2363            if Is_Validation_Variable_Reference (Actual) then
2364               Add_Validation_Call_By_Copy_Code (Actual);
2365
2366            --  If argument is a type conversion for a type that is passed by
2367            --  copy, then we must pass the parameter by copy.
2368
2369            elsif Nkind (Actual) = N_Type_Conversion
2370              and then
2371                (Is_Elementary_Type (E_Formal)
2372                  or else Is_Bit_Packed_Array (Etype (Formal))
2373                  or else Is_Bit_Packed_Array (Etype (Expression (Actual)))
2374
2375                  --  Also pass by copy if change of representation
2376
2377                  or else not Has_Compatible_Representation
2378                                (Target_Type  => Etype (Formal),
2379                                 Operand_Type => Etype (Expression (Actual))))
2380            then
2381               Add_Call_By_Copy_Code;
2382
2383            --  References to components of bit-packed arrays are expanded
2384            --  at this point, rather than at the point of analysis of the
2385            --  actuals, to handle the expansion of the assignment to
2386            --  [in] out parameters.
2387
2388            elsif Is_Ref_To_Bit_Packed_Array (Actual) then
2389               Add_Simple_Call_By_Copy_Code (Force => True);
2390
2391            --  If a nonscalar actual is possibly bit-aligned, we need a copy
2392            --  because the back-end cannot cope with such objects. In other
2393            --  cases where alignment forces a copy, the back-end generates
2394            --  it properly. It should not be generated unconditionally in the
2395            --  front-end because it does not know precisely the alignment
2396            --  requirements of the target, and makes too conservative an
2397            --  estimate, leading to superfluous copies or spurious errors
2398            --  on by-reference parameters.
2399
2400            elsif Nkind (Actual) = N_Selected_Component
2401              and then
2402                Component_May_Be_Bit_Aligned (Entity (Selector_Name (Actual)))
2403              and then not Represented_As_Scalar (Etype (Formal))
2404            then
2405               Add_Simple_Call_By_Copy_Code (Force => False);
2406
2407            --  References to slices of bit-packed arrays are expanded
2408
2409            elsif Is_Ref_To_Bit_Packed_Slice (Actual) then
2410               Add_Call_By_Copy_Code;
2411
2412            --  References to possibly unaligned slices of arrays are expanded
2413
2414            elsif Is_Possibly_Unaligned_Slice (Actual) then
2415               Add_Call_By_Copy_Code;
2416
2417            --  Deal with access types where the actual subtype and the
2418            --  formal subtype are not the same, requiring a check.
2419
2420            --  It is necessary to exclude tagged types because of "downward
2421            --  conversion" errors, but null-excluding checks on return may be
2422            --  required.
2423
2424            elsif Is_Access_Type (E_Formal)
2425              and then not Is_Tagged_Type (Designated_Type (E_Formal))
2426              and then (not Same_Type (E_Formal, E_Actual)
2427                or else (Can_Never_Be_Null (E_Actual)
2428                          and then not Can_Never_Be_Null (E_Formal)))
2429            then
2430               Add_Call_By_Copy_Code;
2431
2432            --  We may need to force a copy because of atomicity or volatility
2433            --  considerations.
2434
2435            elsif Requires_Atomic_Or_Volatile_Copy then
2436               Add_Call_By_Copy_Code;
2437
2438            --  Add call-by-copy code for the case of scalar out parameters
2439            --  when it is not known at compile time that the subtype of the
2440            --  formal is a subrange of the subtype of the actual (or vice
2441            --  versa for in out parameters), in order to get range checks
2442            --  on such actuals. (Maybe this case should be handled earlier
2443            --  in the if statement???)
2444
2445            elsif Is_Scalar_Type (E_Formal)
2446              and then
2447                (not In_Subrange_Of (E_Formal, E_Actual)
2448                  or else
2449                    (Ekind (Formal) = E_In_Out_Parameter
2450                      and then not In_Subrange_Of (E_Actual, E_Formal)))
2451            then
2452               Add_Call_By_Copy_Code;
2453            end if;
2454
2455            --  RM 3.2.4 (23/3): A predicate is checked on in-out and out
2456            --  by-reference parameters on exit from the call. If the actual
2457            --  is a derived type and the operation is inherited, the body
2458            --  of the operation will not contain a call to the predicate
2459            --  function, so it must be done explicitly after the call. Ditto
2460            --  if the actual is an entity of a predicated subtype.
2461
2462            --  The rule refers to by-reference types, but a check is needed
2463            --  for by-copy types as well. That check is subsumed by the rule
2464            --  for subtype conversion on assignment, but we can generate the
2465            --  required check now.
2466
2467            --  Note also that Subp may be either a subprogram entity for
2468            --  direct calls, or a type entity for indirect calls, which must
2469            --  be handled separately because the name does not denote an
2470            --  overloadable entity.
2471
2472            By_Ref_Predicate_Check : declare
2473               Aund : constant Entity_Id := Underlying_Type (E_Actual);
2474               Atyp : Entity_Id;
2475
2476            begin
2477               if No (Aund) then
2478                  Atyp := E_Actual;
2479               else
2480                  Atyp := Aund;
2481               end if;
2482
2483               if Predicate_Enabled (Atyp)
2484
2485                 --  Skip predicate checks for special cases
2486
2487                 and then Predicate_Tests_On_Arguments (Subp)
2488               then
2489                  Append_To (Post_Call,
2490                    Make_Predicate_Check (Atyp, Actual));
2491               end if;
2492            end By_Ref_Predicate_Check;
2493
2494         --  Processing for IN parameters
2495
2496         else
2497            --  Generate range check if required
2498
2499            if Do_Range_Check (Actual) then
2500               Generate_Range_Check (Actual, E_Formal, CE_Range_Check_Failed);
2501            end if;
2502
2503            --  For IN parameters in the bit-packed array case, we expand an
2504            --  indexed component (the circuit in Exp_Ch4 deliberately left
2505            --  indexed components appearing as actuals untouched, so that
2506            --  the special processing above for the OUT and IN OUT cases
2507            --  could be performed. We could make the test in Exp_Ch4 more
2508            --  complex and have it detect the parameter mode, but it is
2509            --  easier simply to handle all cases here.)
2510
2511            if Nkind (Actual) = N_Indexed_Component
2512              and then Is_Bit_Packed_Array (Etype (Prefix (Actual)))
2513            then
2514               Reset_Packed_Prefix;
2515               Expand_Packed_Element_Reference (Actual);
2516
2517            --  If we have a reference to a bit-packed array, we copy it, since
2518            --  the actual must be byte aligned.
2519
2520            --  Is this really necessary in all cases???
2521
2522            elsif Is_Ref_To_Bit_Packed_Array (Actual) then
2523               Add_Simple_Call_By_Copy_Code (Force => True);
2524
2525            --  If we have a C++ constructor call, we need to create the object
2526
2527            elsif Is_CPP_Constructor_Call (Actual) then
2528               Add_Simple_Call_By_Copy_Code (Force => True);
2529
2530            --  If a nonscalar actual is possibly unaligned, we need a copy
2531
2532            elsif Is_Possibly_Unaligned_Object (Actual)
2533              and then not Represented_As_Scalar (Etype (Formal))
2534            then
2535               Add_Simple_Call_By_Copy_Code (Force => False);
2536
2537            --  Similarly, we have to expand slices of packed arrays here
2538            --  because the result must be byte aligned.
2539
2540            elsif Is_Ref_To_Bit_Packed_Slice (Actual) then
2541               Add_Call_By_Copy_Code;
2542
2543            --  Only processing remaining is to pass by copy if this is a
2544            --  reference to a possibly unaligned slice, since the caller
2545            --  expects an appropriately aligned argument.
2546
2547            elsif Is_Possibly_Unaligned_Slice (Actual) then
2548               Add_Call_By_Copy_Code;
2549
2550            --  We may need to force a copy because of atomicity or volatility
2551            --  considerations.
2552
2553            elsif Requires_Atomic_Or_Volatile_Copy then
2554               Add_Call_By_Copy_Code;
2555
2556            --  An unusual case: a current instance of an enclosing task can be
2557            --  an actual, and must be replaced by a reference to self.
2558
2559            elsif Is_Entity_Name (Actual)
2560              and then Is_Task_Type (Entity (Actual))
2561            then
2562               if In_Open_Scopes (Entity (Actual)) then
2563                  Rewrite (Actual,
2564                    (Make_Function_Call (Loc,
2565                       Name => New_Occurrence_Of (RTE (RE_Self), Loc))));
2566                  Analyze (Actual);
2567
2568               --  A task type cannot otherwise appear as an actual
2569
2570               else
2571                  raise Program_Error;
2572               end if;
2573            end if;
2574         end if;
2575
2576         --  Type-invariant checks for in-out and out parameters, as well as
2577         --  for in parameters of procedures (AI05-0289 and AI12-0044).
2578
2579         if Ekind (Formal) /= E_In_Parameter
2580           or else Ekind (Subp) = E_Procedure
2581         then
2582            Caller_Side_Invariant_Checks : declare
2583
2584               function Is_Public_Subp return Boolean;
2585               --  Check whether the subprogram being called is a visible
2586               --  operation of the type of the actual. Used to determine
2587               --  whether an invariant check must be generated on the
2588               --  caller side.
2589
2590               ---------------------
2591               --  Is_Public_Subp --
2592               ---------------------
2593
2594               function Is_Public_Subp return Boolean is
2595                  Pack      : constant Entity_Id := Scope (Subp);
2596                  Subp_Decl : Node_Id;
2597
2598               begin
2599                  if not Is_Subprogram (Subp) then
2600                     return False;
2601
2602                  --  The operation may be inherited, or a primitive of the
2603                  --  root type.
2604
2605                  elsif
2606                    Nkind (Parent (Subp)) in N_Private_Extension_Declaration
2607                                           | N_Full_Type_Declaration
2608                  then
2609                     Subp_Decl := Parent (Subp);
2610
2611                  else
2612                     Subp_Decl := Unit_Declaration_Node (Subp);
2613                  end if;
2614
2615                  return Ekind (Pack) = E_Package
2616                    and then
2617                      List_Containing (Subp_Decl) =
2618                        Visible_Declarations
2619                          (Specification (Unit_Declaration_Node (Pack)));
2620               end Is_Public_Subp;
2621
2622            --  Start of processing for Caller_Side_Invariant_Checks
2623
2624            begin
2625               --  We generate caller-side invariant checks in two cases:
2626
2627               --  a) when calling an inherited operation, where there is an
2628               --  implicit view conversion of the actual to the parent type.
2629
2630               --  b) When the conversion is explicit
2631
2632               --  We treat these cases separately because the required
2633               --  conversion for a) is added later when expanding the call.
2634
2635               if Has_Invariants (Etype (Actual))
2636                  and then
2637                    Nkind (Parent (Etype (Actual)))
2638                      = N_Private_Extension_Declaration
2639               then
2640                  if Comes_From_Source (N) and then Is_Public_Subp then
2641                     Append_To (Post_Call, Make_Invariant_Call (Actual));
2642                  end if;
2643
2644               elsif Nkind (Actual) = N_Type_Conversion
2645                 and then Has_Invariants (Etype (Expression (Actual)))
2646               then
2647                  if Comes_From_Source (N) and then Is_Public_Subp then
2648                     Append_To
2649                       (Post_Call, Make_Invariant_Call (Expression (Actual)));
2650                  end if;
2651               end if;
2652            end Caller_Side_Invariant_Checks;
2653         end if;
2654
2655         Next_Formal (Formal);
2656         Next_Actual (Actual);
2657      end loop;
2658   end Expand_Actuals;
2659
2660   -----------------
2661   -- Expand_Call --
2662   -----------------
2663
2664   procedure Expand_Call (N : Node_Id) is
2665      Post_Call : List_Id;
2666
2667      --  If this is an indirect call through an Access_To_Subprogram
2668      --  with contract specifications, it is rewritten as a call to
2669      --  the corresponding Access_Subprogram_Wrapper with the same
2670      --  actuals, whose body contains a naked indirect call (which
2671      --  itself must not be rewritten, to prevent infinite recursion).
2672
2673      Must_Rewrite_Indirect_Call : constant Boolean :=
2674        Ada_Version >= Ada_2022
2675          and then Nkind (Name (N)) = N_Explicit_Dereference
2676          and then Ekind (Etype (Name (N))) = E_Subprogram_Type
2677          and then Present
2678            (Access_Subprogram_Wrapper (Etype (Name (N))));
2679
2680   begin
2681      pragma Assert (Nkind (N) in N_Entry_Call_Statement
2682                                | N_Function_Call
2683                                | N_Procedure_Call_Statement);
2684
2685      --  Check that this is not the call in the body of the wrapper
2686
2687      if Must_Rewrite_Indirect_Call
2688        and then (not Is_Overloadable (Current_Scope)
2689             or else not Is_Access_Subprogram_Wrapper (Current_Scope))
2690      then
2691         declare
2692            Loc      : constant Source_Ptr := Sloc (N);
2693            Wrapper  : constant Entity_Id :=
2694              Access_Subprogram_Wrapper (Etype (Name (N)));
2695            Ptr      : constant Node_Id   := Prefix (Name (N));
2696            Ptr_Type : constant Entity_Id := Etype (Ptr);
2697            Typ      : constant Entity_Id := Etype (N);
2698
2699            New_N    : Node_Id;
2700            Parms    : List_Id := Parameter_Associations (N);
2701            Ptr_Act  : Node_Id;
2702
2703         begin
2704            --  The last actual in the call is the pointer itself.
2705            --  If the aspect is inherited, convert the pointer to the
2706            --  parent type that specifies the contract.
2707            --  If the original access_to_subprogram has defaults for
2708            --  in_parameters, the call may include named associations, so
2709            --  we create one for the pointer as well.
2710
2711            if Is_Derived_Type (Ptr_Type)
2712              and then Ptr_Type /= Etype (Last_Formal (Wrapper))
2713            then
2714               Ptr_Act :=
2715                Make_Type_Conversion (Loc,
2716                  New_Occurrence_Of
2717                    (Etype (Last_Formal (Wrapper)), Loc), Ptr);
2718
2719            else
2720               Ptr_Act := Ptr;
2721            end if;
2722
2723            --  Handle parameterless subprogram.
2724
2725            if No (Parms) then
2726               Parms := New_List;
2727            end if;
2728
2729            Append
2730             (Make_Parameter_Association (Loc,
2731                Selector_Name => Make_Identifier (Loc,
2732                   Chars (Last_Formal (Wrapper))),
2733                 Explicit_Actual_Parameter => Ptr_Act),
2734              Parms);
2735
2736            if Nkind (N) = N_Procedure_Call_Statement then
2737               New_N := Make_Procedure_Call_Statement (Loc,
2738                  Name => New_Occurrence_Of (Wrapper, Loc),
2739                  Parameter_Associations => Parms);
2740            else
2741               New_N := Make_Function_Call (Loc,
2742                  Name => New_Occurrence_Of (Wrapper, Loc),
2743                  Parameter_Associations => Parms);
2744            end if;
2745
2746            Rewrite (N, New_N);
2747            Analyze_And_Resolve (N, Typ);
2748         end;
2749
2750      else
2751         Expand_Call_Helper (N, Post_Call);
2752         Insert_Post_Call_Actions (N, Post_Call);
2753      end if;
2754   end Expand_Call;
2755
2756   ------------------------
2757   -- Expand_Call_Helper --
2758   ------------------------
2759
2760   --  This procedure handles expansion of function calls and procedure call
2761   --  statements (i.e. it serves as the body for Expand_N_Function_Call and
2762   --  Expand_N_Procedure_Call_Statement). Processing for calls includes:
2763
2764   --    Replace call to Raise_Exception by Raise_Exception_Always if possible
2765   --    Provide values of actuals for all formals in Extra_Formals list
2766   --    Replace "call" to enumeration literal function by literal itself
2767   --    Rewrite call to predefined operator as operator
2768   --    Replace actuals to in-out parameters that are numeric conversions,
2769   --     with explicit assignment to temporaries before and after the call.
2770
2771   --   Note that the list of actuals has been filled with default expressions
2772   --   during semantic analysis of the call. Only the extra actuals required
2773   --   for the 'Constrained attribute and for accessibility checks are added
2774   --   at this point.
2775
2776   procedure Expand_Call_Helper (N : Node_Id; Post_Call : out List_Id) is
2777      Loc           : constant Source_Ptr := Sloc (N);
2778      Call_Node     : Node_Id := N;
2779      Extra_Actuals : List_Id := No_List;
2780      Prev          : Node_Id := Empty;
2781
2782      procedure Add_Actual_Parameter (Insert_Param : Node_Id);
2783      --  Adds one entry to the end of the actual parameter list. Used for
2784      --  default parameters and for extra actuals (for Extra_Formals). The
2785      --  argument is an N_Parameter_Association node.
2786
2787      procedure Add_Cond_Expression_Extra_Actual (Formal : Entity_Id);
2788      --  Adds extra accessibility actuals in the case of a conditional
2789      --  expression corresponding to Formal.
2790
2791      --  Note: Conditional expressions used as actuals for anonymous access
2792      --  formals complicate the process of propagating extra accessibility
2793      --  actuals and must be handled in a recursive fashion since they can
2794      --  be embedded within each other.
2795
2796      procedure Add_Extra_Actual (Expr : Node_Id; EF : Entity_Id);
2797      --  Adds an extra actual to the list of extra actuals. Expr is the
2798      --  expression for the value of the actual, EF is the entity for the
2799      --  extra formal.
2800
2801      procedure Add_View_Conversion_Invariants
2802        (Formal : Entity_Id;
2803         Actual : Node_Id);
2804      --  Adds invariant checks for every intermediate type between the range
2805      --  of a view converted argument to its ancestor (from parent to child).
2806
2807      function Can_Fold_Predicate_Call (P : Entity_Id) return Boolean;
2808      --  Try to constant-fold a predicate check, which often enough is a
2809      --  simple arithmetic expression that can be computed statically if
2810      --  its argument is static. This cleans up the output of CCG, even
2811      --  though useless predicate checks will be generally removed by
2812      --  back-end optimizations.
2813
2814      procedure Check_Subprogram_Variant;
2815      --  Emit a call to the internally generated procedure with checks for
2816      --  aspect Subprogrgram_Variant, if present and enabled.
2817
2818      function Inherited_From_Formal (S : Entity_Id) return Entity_Id;
2819      --  Within an instance, a type derived from an untagged formal derived
2820      --  type inherits from the original parent, not from the actual. The
2821      --  current derivation mechanism has the derived type inherit from the
2822      --  actual, which is only correct outside of the instance. If the
2823      --  subprogram is inherited, we test for this particular case through a
2824      --  convoluted tree traversal before setting the proper subprogram to be
2825      --  called.
2826
2827      function In_Unfrozen_Instance (E : Entity_Id) return Boolean;
2828      --  Return true if E comes from an instance that is not yet frozen
2829
2830      function Is_Class_Wide_Interface_Type (E : Entity_Id) return Boolean;
2831      --  Return True when E is a class-wide interface type or an access to
2832      --  a class-wide interface type.
2833
2834      function Is_Direct_Deep_Call (Subp : Entity_Id) return Boolean;
2835      --  Determine if Subp denotes a non-dispatching call to a Deep routine
2836
2837      function New_Value (From : Node_Id) return Node_Id;
2838      --  From is the original Expression. New_Value is equivalent to a call
2839      --  to Duplicate_Subexpr with an explicit dereference when From is an
2840      --  access parameter.
2841
2842      --------------------------
2843      -- Add_Actual_Parameter --
2844      --------------------------
2845
2846      procedure Add_Actual_Parameter (Insert_Param : Node_Id) is
2847         Actual_Expr : constant Node_Id :=
2848                         Explicit_Actual_Parameter (Insert_Param);
2849
2850      begin
2851         --  Case of insertion is first named actual
2852
2853         if No (Prev) or else
2854            Nkind (Parent (Prev)) /= N_Parameter_Association
2855         then
2856            Set_Next_Named_Actual
2857              (Insert_Param, First_Named_Actual (Call_Node));
2858            Set_First_Named_Actual (Call_Node, Actual_Expr);
2859
2860            if No (Prev) then
2861               if No (Parameter_Associations (Call_Node)) then
2862                  Set_Parameter_Associations (Call_Node, New_List);
2863               end if;
2864
2865               Append (Insert_Param, Parameter_Associations (Call_Node));
2866
2867            else
2868               Insert_After (Prev, Insert_Param);
2869            end if;
2870
2871         --  Case of insertion is not first named actual
2872
2873         else
2874            Set_Next_Named_Actual
2875              (Insert_Param, Next_Named_Actual (Parent (Prev)));
2876            Set_Next_Named_Actual (Parent (Prev), Actual_Expr);
2877            Append (Insert_Param, Parameter_Associations (Call_Node));
2878         end if;
2879
2880         Prev := Actual_Expr;
2881      end Add_Actual_Parameter;
2882
2883      --------------------------------------
2884      -- Add_Cond_Expression_Extra_Actual --
2885      --------------------------------------
2886
2887      procedure Add_Cond_Expression_Extra_Actual
2888        (Formal : Entity_Id)
2889      is
2890         Decl : Node_Id;
2891         Lvl  : Entity_Id;
2892
2893         procedure Insert_Level_Assign (Branch : Node_Id);
2894         --  Recursively add assignment of the level temporary on each branch
2895         --  while moving through nested conditional expressions.
2896
2897         -------------------------
2898         -- Insert_Level_Assign --
2899         -------------------------
2900
2901         procedure Insert_Level_Assign (Branch : Node_Id) is
2902
2903            procedure Expand_Branch (Res_Assn : Node_Id);
2904            --  Perform expansion or iterate further within nested
2905            --  conditionals given the object declaration or assignment to
2906            --  result object created during expansion which represents a
2907            --  branch of the conditional expression.
2908
2909            -------------------
2910            -- Expand_Branch --
2911            -------------------
2912
2913            procedure Expand_Branch (Res_Assn : Node_Id) is
2914            begin
2915               pragma Assert (Nkind (Res_Assn) in
2916                               N_Assignment_Statement |
2917                               N_Object_Declaration);
2918
2919               --  There are more nested conditional expressions so we must go
2920               --  deeper.
2921
2922               if Nkind (Expression (Res_Assn)) = N_Expression_With_Actions
2923                 and then
2924                   Nkind (Original_Node (Expression (Res_Assn)))
2925                     in N_Case_Expression | N_If_Expression
2926               then
2927                  Insert_Level_Assign
2928                    (Expression (Res_Assn));
2929
2930               --  Add the level assignment
2931
2932               else
2933                  Insert_Before_And_Analyze (Res_Assn,
2934                    Make_Assignment_Statement (Loc,
2935                      Name       => New_Occurrence_Of (Lvl, Loc),
2936                      Expression =>
2937                        Accessibility_Level
2938                          (Expr            => Expression (Res_Assn),
2939                           Level           => Dynamic_Level,
2940                           Allow_Alt_Model => False)));
2941               end if;
2942            end Expand_Branch;
2943
2944            Cond : Node_Id;
2945            Alt  : Node_Id;
2946
2947         --  Start of processing for Insert_Level_Assign
2948
2949         begin
2950            --  Examine further nested condtionals
2951
2952            pragma Assert (Nkind (Branch) =
2953                            N_Expression_With_Actions);
2954
2955            --  Find the relevant statement in the actions
2956
2957            Cond := First (Actions (Branch));
2958            while Present (Cond) loop
2959               exit when Nkind (Cond) in N_Case_Statement | N_If_Statement;
2960               Next (Cond);
2961            end loop;
2962
2963            --  The conditional expression may have been optimized away, so
2964            --  examine the actions in the branch.
2965
2966            if No (Cond) then
2967               Expand_Branch (Last (Actions (Branch)));
2968
2969            --  Iterate through if expression branches
2970
2971            elsif Nkind (Cond) = N_If_Statement then
2972               Expand_Branch (Last (Then_Statements (Cond)));
2973               Expand_Branch (Last (Else_Statements (Cond)));
2974
2975            --  Iterate through case alternatives
2976
2977            elsif Nkind (Cond) = N_Case_Statement then
2978
2979               Alt := First (Alternatives (Cond));
2980               while Present (Alt) loop
2981                  Expand_Branch (Last (Statements (Alt)));
2982                  Next (Alt);
2983               end loop;
2984            end if;
2985         end Insert_Level_Assign;
2986
2987      --  Start of processing for cond expression case
2988
2989      begin
2990         --  Create declaration of a temporary to store the accessibility
2991         --  level of each branch of the conditional expression.
2992
2993         Lvl  := Make_Temporary (Loc, 'L');
2994         Decl := Make_Object_Declaration (Loc,
2995                   Defining_Identifier => Lvl,
2996                   Object_Definition   =>
2997                     New_Occurrence_Of (Standard_Natural, Loc));
2998
2999         --  Install the declaration and perform necessary expansion if we
3000         --  are dealing with a procedure call.
3001
3002         if Nkind (Call_Node) = N_Procedure_Call_Statement then
3003            --  Generate:
3004            --    Lvl : Natural;
3005            --    Call (
3006            --     {do
3007            --        If_Exp_Res : Typ;
3008            --        if Cond then
3009            --           Lvl        := 0; --  Access level
3010            --           If_Exp_Res := Exp;
3011            --        ...
3012            --      in If_Exp_Res end;},
3013            --      Lvl,
3014            --      ...
3015            --    )
3016
3017            Insert_Before_And_Analyze (Call_Node, Decl);
3018
3019         --  Ditto for a function call. Note that we do not wrap the function
3020         --  call into an expression with action to avoid bad interactions with
3021         --  Exp_Ch4.Process_Transient_In_Expression.
3022
3023         else
3024            --  Generate:
3025            --    Lvl : Natural;  --  placed above the function call
3026            --    ...
3027            --    Func_Call (
3028            --     {do
3029            --        If_Exp_Res : Typ
3030            --        if Cond then
3031            --           Lvl := 0; --  Access level
3032            --           If_Exp_Res := Exp;
3033            --      in If_Exp_Res end;},
3034            --      Lvl,
3035            --      ...
3036            --    )
3037
3038            Insert_Action (Call_Node, Decl);
3039            Analyze (Call_Node);
3040         end if;
3041
3042         --  Decorate the conditional expression with assignments to our level
3043         --  temporary.
3044
3045         Insert_Level_Assign (Prev);
3046
3047         --  Make our level temporary the passed actual
3048
3049         Add_Extra_Actual
3050           (Expr => New_Occurrence_Of (Lvl, Loc),
3051            EF   => Extra_Accessibility (Formal));
3052      end Add_Cond_Expression_Extra_Actual;
3053
3054      ----------------------
3055      -- Add_Extra_Actual --
3056      ----------------------
3057
3058      procedure Add_Extra_Actual (Expr : Node_Id; EF : Entity_Id) is
3059         Loc : constant Source_Ptr := Sloc (Expr);
3060
3061      begin
3062         if Extra_Actuals = No_List then
3063            Extra_Actuals := New_List;
3064            Set_Parent (Extra_Actuals, Call_Node);
3065         end if;
3066
3067         Append_To (Extra_Actuals,
3068           Make_Parameter_Association (Loc,
3069             Selector_Name             => New_Occurrence_Of (EF, Loc),
3070             Explicit_Actual_Parameter => Expr));
3071
3072         Analyze_And_Resolve (Expr, Etype (EF));
3073
3074         if Nkind (Call_Node) = N_Function_Call then
3075            Set_Is_Accessibility_Actual (Parent (Expr));
3076         end if;
3077      end Add_Extra_Actual;
3078
3079      ------------------------------------
3080      -- Add_View_Conversion_Invariants --
3081      ------------------------------------
3082
3083      procedure Add_View_Conversion_Invariants
3084        (Formal : Entity_Id;
3085         Actual : Node_Id)
3086      is
3087         Arg        : Entity_Id;
3088         Curr_Typ   : Entity_Id;
3089         Inv_Checks : List_Id;
3090         Par_Typ    : Entity_Id;
3091
3092      begin
3093         Inv_Checks := No_List;
3094
3095         --  Extract the argument from a potentially nested set of view
3096         --  conversions.
3097
3098         Arg := Actual;
3099         while Nkind (Arg) = N_Type_Conversion loop
3100            Arg := Expression (Arg);
3101         end loop;
3102
3103         --  Move up the derivation chain starting with the type of the formal
3104         --  parameter down to the type of the actual object.
3105
3106         Curr_Typ := Empty;
3107         Par_Typ  := Etype (Arg);
3108         while Par_Typ /= Etype (Formal) and Par_Typ /= Curr_Typ loop
3109            Curr_Typ := Par_Typ;
3110
3111            if Has_Invariants (Curr_Typ)
3112              and then Present (Invariant_Procedure (Curr_Typ))
3113            then
3114               --  Verify the invariant of the current type. Generate:
3115
3116               --    <Curr_Typ>Invariant (Curr_Typ (Arg));
3117
3118               Prepend_New_To (Inv_Checks,
3119                 Make_Procedure_Call_Statement (Loc,
3120                   Name                   =>
3121                     New_Occurrence_Of
3122                       (Invariant_Procedure (Curr_Typ), Loc),
3123                   Parameter_Associations => New_List (
3124                     Make_Type_Conversion (Loc,
3125                       Subtype_Mark => New_Occurrence_Of (Curr_Typ, Loc),
3126                       Expression   => New_Copy_Tree (Arg)))));
3127            end if;
3128
3129            Par_Typ := Base_Type (Etype (Curr_Typ));
3130         end loop;
3131
3132         --  If the node is a function call the generated tests have been
3133         --  already handled in Insert_Post_Call_Actions.
3134
3135         if not Is_Empty_List (Inv_Checks)
3136           and then Nkind (Call_Node) = N_Procedure_Call_Statement
3137         then
3138            Insert_Actions_After (Call_Node, Inv_Checks);
3139         end if;
3140      end Add_View_Conversion_Invariants;
3141
3142      -----------------------------
3143      -- Can_Fold_Predicate_Call --
3144      -----------------------------
3145
3146      function Can_Fold_Predicate_Call (P : Entity_Id) return Boolean is
3147         Actual : Node_Id;
3148
3149         function Augments_Other_Dynamic_Predicate (DP_Aspect_Spec : Node_Id)
3150           return Boolean;
3151         --  Given a Dynamic_Predicate aspect aspecification for a
3152         --  discrete type, returns True iff another DP specification
3153         --  applies (indirectly, via a subtype type or a derived type)
3154         --  to the same entity that this aspect spec applies to.
3155
3156         function May_Fold (N : Node_Id) return Traverse_Result;
3157         --  The predicate expression is foldable if it only contains operators
3158         --  and literals. During this check, we also replace occurrences of
3159         --  the formal of the constructed predicate function with the static
3160         --  value of the actual. This is done on a copy of the analyzed
3161         --  expression for the predicate.
3162
3163         --------------------------------------
3164         -- Augments_Other_Dynamic_Predicate --
3165         --------------------------------------
3166
3167         function Augments_Other_Dynamic_Predicate (DP_Aspect_Spec : Node_Id)
3168           return Boolean
3169         is
3170            Aspect_Bearer : Entity_Id := Entity (DP_Aspect_Spec);
3171         begin
3172            loop
3173               Aspect_Bearer := Nearest_Ancestor (Aspect_Bearer);
3174
3175               if not Present (Aspect_Bearer) then
3176                  return False;
3177               end if;
3178
3179               declare
3180                  Aspect_Spec : constant Node_Id :=
3181                    Find_Aspect (Aspect_Bearer, Aspect_Dynamic_Predicate);
3182               begin
3183                  if Present (Aspect_Spec)
3184                    and then Aspect_Spec /= DP_Aspect_Spec
3185                  then
3186                     --  Found another Dynamic_Predicate aspect spec
3187                     return True;
3188                  end if;
3189               end;
3190            end loop;
3191         end Augments_Other_Dynamic_Predicate;
3192
3193         --------------
3194         -- May_Fold --
3195         --------------
3196
3197         function May_Fold (N : Node_Id) return Traverse_Result is
3198         begin
3199            case Nkind (N) is
3200               when N_Op =>
3201                  return OK;
3202
3203               when N_Expanded_Name
3204                  | N_Identifier
3205               =>
3206                  if Ekind (Entity (N)) = E_In_Parameter
3207                    and then Entity (N) = First_Entity (P)
3208                  then
3209                     Rewrite (N, New_Copy (Actual));
3210                     Set_Is_Static_Expression (N);
3211                     return OK;
3212
3213                  elsif Ekind (Entity (N)) = E_Enumeration_Literal then
3214                     return OK;
3215
3216                  else
3217                     return Abandon;
3218                  end if;
3219
3220               when N_Case_Expression
3221                  | N_If_Expression
3222               =>
3223                  return OK;
3224
3225               when N_Integer_Literal =>
3226                  return OK;
3227
3228               when others =>
3229                  return Abandon;
3230            end case;
3231         end May_Fold;
3232
3233         function Try_Fold is new Traverse_Func (May_Fold);
3234
3235         --  Other Local variables
3236
3237         Subt   : constant Entity_Id := Etype (First_Entity (P));
3238         Aspect : Node_Id;
3239         Pred   : Node_Id;
3240
3241      --  Start of processing for Can_Fold_Predicate_Call
3242
3243      begin
3244         --  Folding is only interesting if the actual is static and its type
3245         --  has a Dynamic_Predicate aspect. For CodePeer we preserve the
3246         --  function call.
3247
3248         Actual := First (Parameter_Associations (Call_Node));
3249         Aspect := Find_Aspect (Subt, Aspect_Dynamic_Predicate);
3250
3251         --  If actual is a declared constant, retrieve its value
3252
3253         if Is_Entity_Name (Actual)
3254           and then Ekind (Entity (Actual)) = E_Constant
3255         then
3256            Actual := Constant_Value (Entity (Actual));
3257         end if;
3258
3259         if No (Actual)
3260           or else Nkind (Actual) /= N_Integer_Literal
3261           or else not Has_Dynamic_Predicate_Aspect (Subt)
3262           or else No (Aspect)
3263
3264           --  Do not fold if multiple applicable predicate aspects
3265           or else Present (Find_Aspect (Subt, Aspect_Static_Predicate))
3266           or else Present (Find_Aspect (Subt, Aspect_Predicate))
3267           or else Augments_Other_Dynamic_Predicate (Aspect)
3268           or else CodePeer_Mode
3269         then
3270            return False;
3271         end if;
3272
3273         --  Retrieve the analyzed expression for the predicate
3274
3275         Pred := New_Copy_Tree (Expression (Aspect));
3276
3277         if Try_Fold (Pred) = OK then
3278            Rewrite (Call_Node, Pred);
3279            Analyze_And_Resolve (Call_Node, Standard_Boolean);
3280            return True;
3281
3282         --  Otherwise continue the expansion of the function call
3283
3284         else
3285            return False;
3286         end if;
3287      end Can_Fold_Predicate_Call;
3288
3289      ------------------------------
3290      -- Check_Subprogram_Variant --
3291      ------------------------------
3292
3293      procedure Check_Subprogram_Variant is
3294         Variant_Prag : constant Node_Id :=
3295           Get_Pragma (Current_Scope, Pragma_Subprogram_Variant);
3296
3297         Variant_Proc : Entity_Id;
3298
3299      begin
3300         if Present (Variant_Prag) and then Is_Checked (Variant_Prag) then
3301
3302            --  Analysis of the pragma rewrites its argument with a reference
3303            --  to the internally generated procedure.
3304
3305            Variant_Proc :=
3306              Entity
3307                (Expression
3308                   (First
3309                      (Pragma_Argument_Associations (Variant_Prag))));
3310
3311            Insert_Action (Call_Node,
3312              Make_Procedure_Call_Statement (Loc,
3313                 Name                   =>
3314                   New_Occurrence_Of (Variant_Proc, Loc),
3315                 Parameter_Associations =>
3316                   New_Copy_List (Parameter_Associations (Call_Node))));
3317         end if;
3318      end Check_Subprogram_Variant;
3319
3320      ---------------------------
3321      -- Inherited_From_Formal --
3322      ---------------------------
3323
3324      function Inherited_From_Formal (S : Entity_Id) return Entity_Id is
3325         Par      : Entity_Id;
3326         Gen_Par  : Entity_Id;
3327         Gen_Prim : Elist_Id;
3328         Elmt     : Elmt_Id;
3329         Indic    : Node_Id;
3330
3331      begin
3332         --  If the operation is inherited, it is attached to the corresponding
3333         --  type derivation. If the parent in the derivation is a generic
3334         --  actual, it is a subtype of the actual, and we have to recover the
3335         --  original derived type declaration to find the proper parent.
3336
3337         if Nkind (Parent (S)) /= N_Full_Type_Declaration
3338           or else not Is_Derived_Type (Defining_Identifier (Parent (S)))
3339           or else Nkind (Type_Definition (Original_Node (Parent (S)))) /=
3340                                                   N_Derived_Type_Definition
3341           or else not In_Instance
3342         then
3343            return Empty;
3344
3345         else
3346            Indic :=
3347              Subtype_Indication
3348                (Type_Definition (Original_Node (Parent (S))));
3349
3350            if Nkind (Indic) = N_Subtype_Indication then
3351               Par := Entity (Subtype_Mark (Indic));
3352            else
3353               Par := Entity (Indic);
3354            end if;
3355         end if;
3356
3357         if not Is_Generic_Actual_Type (Par)
3358           or else Is_Tagged_Type (Par)
3359           or else Nkind (Parent (Par)) /= N_Subtype_Declaration
3360           or else not In_Open_Scopes (Scope (Par))
3361         then
3362            return Empty;
3363         else
3364            Gen_Par := Generic_Parent_Type (Parent (Par));
3365         end if;
3366
3367         --  If the actual has no generic parent type, the formal is not
3368         --  a formal derived type, so nothing to inherit.
3369
3370         if No (Gen_Par) then
3371            return Empty;
3372         end if;
3373
3374         --  If the generic parent type is still the generic type, this is a
3375         --  private formal, not a derived formal, and there are no operations
3376         --  inherited from the formal.
3377
3378         if Nkind (Parent (Gen_Par)) = N_Formal_Type_Declaration then
3379            return Empty;
3380         end if;
3381
3382         Gen_Prim := Collect_Primitive_Operations (Gen_Par);
3383
3384         Elmt := First_Elmt (Gen_Prim);
3385         while Present (Elmt) loop
3386            if Chars (Node (Elmt)) = Chars (S) then
3387               declare
3388                  F1 : Entity_Id;
3389                  F2 : Entity_Id;
3390
3391               begin
3392                  F1 := First_Formal (S);
3393                  F2 := First_Formal (Node (Elmt));
3394                  while Present (F1)
3395                    and then Present (F2)
3396                  loop
3397                     if Etype (F1) = Etype (F2)
3398                       or else Etype (F2) = Gen_Par
3399                     then
3400                        Next_Formal (F1);
3401                        Next_Formal (F2);
3402                     else
3403                        Next_Elmt (Elmt);
3404                        exit;   --  not the right subprogram
3405                     end if;
3406
3407                     return Node (Elmt);
3408                  end loop;
3409               end;
3410
3411            else
3412               Next_Elmt (Elmt);
3413            end if;
3414         end loop;
3415
3416         raise Program_Error;
3417      end Inherited_From_Formal;
3418
3419      --------------------------
3420      -- In_Unfrozen_Instance --
3421      --------------------------
3422
3423      function In_Unfrozen_Instance (E : Entity_Id) return Boolean is
3424         S : Entity_Id;
3425
3426      begin
3427         S := E;
3428         while Present (S) and then S /= Standard_Standard loop
3429            if Is_Generic_Instance (S)
3430              and then Present (Freeze_Node (S))
3431              and then not Analyzed (Freeze_Node (S))
3432            then
3433               return True;
3434            end if;
3435
3436            S := Scope (S);
3437         end loop;
3438
3439         return False;
3440      end In_Unfrozen_Instance;
3441
3442      ----------------------------------
3443      -- Is_Class_Wide_Interface_Type --
3444      ----------------------------------
3445
3446      function Is_Class_Wide_Interface_Type (E : Entity_Id) return Boolean is
3447         DDT : Entity_Id;
3448         Typ : Entity_Id := E;
3449
3450      begin
3451         if Has_Non_Limited_View (Typ) then
3452            Typ := Non_Limited_View (Typ);
3453         end if;
3454
3455         if Ekind (Typ) = E_Anonymous_Access_Type then
3456            DDT := Directly_Designated_Type (Typ);
3457
3458            if Has_Non_Limited_View (DDT) then
3459               DDT := Non_Limited_View (DDT);
3460            end if;
3461
3462            return Is_Class_Wide_Type (DDT) and then Is_Interface (DDT);
3463         else
3464            return Is_Class_Wide_Type (Typ) and then Is_Interface (Typ);
3465         end if;
3466      end Is_Class_Wide_Interface_Type;
3467
3468      -------------------------
3469      -- Is_Direct_Deep_Call --
3470      -------------------------
3471
3472      function Is_Direct_Deep_Call (Subp : Entity_Id) return Boolean is
3473      begin
3474         if Is_TSS (Subp, TSS_Deep_Adjust)
3475           or else Is_TSS (Subp, TSS_Deep_Finalize)
3476           or else Is_TSS (Subp, TSS_Deep_Initialize)
3477         then
3478            declare
3479               Actual : Node_Id;
3480               Formal : Entity_Id;
3481
3482            begin
3483               Actual := First (Parameter_Associations (Call_Node));
3484               Formal := First_Formal (Subp);
3485               while Present (Actual)
3486                 and then Present (Formal)
3487               loop
3488                  if Nkind (Actual) = N_Identifier
3489                    and then Is_Controlling_Actual (Actual)
3490                    and then Etype (Actual) = Etype (Formal)
3491                  then
3492                     return True;
3493                  end if;
3494
3495                  Next (Actual);
3496                  Next_Formal (Formal);
3497               end loop;
3498            end;
3499         end if;
3500
3501         return False;
3502      end Is_Direct_Deep_Call;
3503
3504      ---------------
3505      -- New_Value --
3506      ---------------
3507
3508      function New_Value (From : Node_Id) return Node_Id is
3509         Res : constant Node_Id := Duplicate_Subexpr (From);
3510      begin
3511         if Is_Access_Type (Etype (From)) then
3512            return Make_Explicit_Dereference (Sloc (From), Prefix => Res);
3513         else
3514            return Res;
3515         end if;
3516      end New_Value;
3517
3518      --  Local variables
3519
3520      Remote        : constant Boolean := Is_Remote_Call (Call_Node);
3521      Actual        : Node_Id;
3522      Formal        : Entity_Id;
3523      Orig_Subp     : Entity_Id := Empty;
3524      Param_Count   : Positive;
3525      Parent_Formal : Entity_Id;
3526      Parent_Subp   : Entity_Id;
3527      Scop          : Entity_Id;
3528      Subp          : Entity_Id;
3529
3530      CW_Interface_Formals_Present : Boolean := False;
3531
3532   --  Start of processing for Expand_Call_Helper
3533
3534   begin
3535      Post_Call := New_List;
3536
3537      --  Expand the function or procedure call if the first actual has a
3538      --  declared dimension aspect, and the subprogram is declared in one
3539      --  of the dimension I/O packages.
3540
3541      if Ada_Version >= Ada_2012
3542        and then Nkind (Call_Node) in N_Subprogram_Call
3543        and then Present (Parameter_Associations (Call_Node))
3544      then
3545         Expand_Put_Call_With_Symbol (Call_Node);
3546      end if;
3547
3548      --  Ignore if previous error
3549
3550      if Nkind (Call_Node) in N_Has_Etype
3551        and then Etype (Call_Node) = Any_Type
3552      then
3553         return;
3554      end if;
3555
3556      --  Call using access to subprogram with explicit dereference
3557
3558      if Nkind (Name (Call_Node)) = N_Explicit_Dereference then
3559         Subp        := Etype (Name (Call_Node));
3560         Parent_Subp := Empty;
3561
3562      --  Case of call to simple entry, where the Name is a selected component
3563      --  whose prefix is the task, and whose selector name is the entry name
3564
3565      elsif Nkind (Name (Call_Node)) = N_Selected_Component then
3566         Subp        := Entity (Selector_Name (Name (Call_Node)));
3567         Parent_Subp := Empty;
3568
3569      --  Case of call to member of entry family, where Name is an indexed
3570      --  component, with the prefix being a selected component giving the
3571      --  task and entry family name, and the index being the entry index.
3572
3573      elsif Nkind (Name (Call_Node)) = N_Indexed_Component then
3574         Subp        := Entity (Selector_Name (Prefix (Name (Call_Node))));
3575         Parent_Subp := Empty;
3576
3577      --  Normal case
3578
3579      else
3580         Subp        := Entity (Name (Call_Node));
3581         Parent_Subp := Alias (Subp);
3582
3583         --  Replace call to Raise_Exception by call to Raise_Exception_Always
3584         --  if we can tell that the first parameter cannot possibly be null.
3585         --  This improves efficiency by avoiding a run-time test.
3586
3587         --  We do not do this if Raise_Exception_Always does not exist, which
3588         --  can happen in configurable run time profiles which provide only a
3589         --  Raise_Exception.
3590
3591         if Is_RTE (Subp, RE_Raise_Exception)
3592           and then RTE_Available (RE_Raise_Exception_Always)
3593         then
3594            declare
3595               FA : constant Node_Id :=
3596                      Original_Node (First_Actual (Call_Node));
3597
3598            begin
3599               --  The case we catch is where the first argument is obtained
3600               --  using the Identity attribute (which must always be
3601               --  non-null).
3602
3603               if Nkind (FA) = N_Attribute_Reference
3604                 and then Attribute_Name (FA) = Name_Identity
3605               then
3606                  Subp := RTE (RE_Raise_Exception_Always);
3607                  Set_Name (Call_Node, New_Occurrence_Of (Subp, Loc));
3608               end if;
3609            end;
3610         end if;
3611
3612         if Ekind (Subp) = E_Entry then
3613            Parent_Subp := Empty;
3614         end if;
3615      end if;
3616
3617      --  Ada 2005 (AI-345): We have a procedure call as a triggering
3618      --  alternative in an asynchronous select or as an entry call in
3619      --  a conditional or timed select. Check whether the procedure call
3620      --  is a renaming of an entry and rewrite it as an entry call.
3621
3622      if Ada_Version >= Ada_2005
3623        and then Nkind (Call_Node) = N_Procedure_Call_Statement
3624        and then
3625           ((Nkind (Parent (Call_Node)) = N_Triggering_Alternative
3626              and then Triggering_Statement (Parent (Call_Node)) = Call_Node)
3627          or else
3628            (Nkind (Parent (Call_Node)) = N_Entry_Call_Alternative
3629              and then Entry_Call_Statement (Parent (Call_Node)) = Call_Node))
3630      then
3631         declare
3632            Ren_Decl : Node_Id;
3633            Ren_Root : Entity_Id := Subp;
3634
3635         begin
3636            --  This may be a chain of renamings, find the root
3637
3638            if Present (Alias (Ren_Root)) then
3639               Ren_Root := Alias (Ren_Root);
3640            end if;
3641
3642            if Present (Parent (Ren_Root))
3643              and then Present (Original_Node (Parent (Parent (Ren_Root))))
3644            then
3645               Ren_Decl := Original_Node (Parent (Parent (Ren_Root)));
3646
3647               if Nkind (Ren_Decl) = N_Subprogram_Renaming_Declaration then
3648                  Rewrite (Call_Node,
3649                    Make_Entry_Call_Statement (Loc,
3650                      Name =>
3651                        New_Copy_Tree (Name (Ren_Decl)),
3652                      Parameter_Associations =>
3653                        New_Copy_List_Tree
3654                          (Parameter_Associations (Call_Node))));
3655
3656                  return;
3657               end if;
3658            end if;
3659         end;
3660      end if;
3661
3662      --  If this is a call to a predicate function, try to constant fold it
3663
3664      if Nkind (Call_Node) = N_Function_Call
3665        and then Is_Entity_Name (Name (Call_Node))
3666        and then Is_Predicate_Function (Subp)
3667        and then Can_Fold_Predicate_Call (Subp)
3668      then
3669         return;
3670      end if;
3671
3672      if Transform_Function_Array
3673        and then Nkind (Call_Node) = N_Function_Call
3674        and then Is_Entity_Name (Name (Call_Node))
3675      then
3676         declare
3677            Func_Id : constant Entity_Id :=
3678                        Ultimate_Alias (Entity (Name (Call_Node)));
3679         begin
3680            --  When generating C code, transform a function call that returns
3681            --  a constrained array type into procedure form.
3682
3683            if Rewritten_For_C (Func_Id) then
3684
3685               --  For internally generated calls ensure that they reference
3686               --  the entity of the spec of the called function (needed since
3687               --  the expander may generate calls using the entity of their
3688               --  body).
3689
3690               if not Comes_From_Source (Call_Node)
3691                 and then Nkind (Unit_Declaration_Node (Func_Id)) =
3692                            N_Subprogram_Body
3693               then
3694                  Set_Entity (Name (Call_Node),
3695                    Corresponding_Function
3696                      (Corresponding_Procedure (Func_Id)));
3697               end if;
3698
3699               Rewrite_Function_Call_For_C (Call_Node);
3700               return;
3701
3702            --  Also introduce a temporary for functions that return a record
3703            --  called within another procedure or function call, since records
3704            --  are passed by pointer in the generated C code, and we cannot
3705            --  take a pointer from a subprogram call.
3706
3707            elsif Modify_Tree_For_C
3708              and then Nkind (Parent (Call_Node)) in N_Subprogram_Call
3709              and then Is_Record_Type (Etype (Func_Id))
3710            then
3711               declare
3712                  Temp_Id : constant Entity_Id := Make_Temporary (Loc, 'T');
3713                  Decl    : Node_Id;
3714
3715               begin
3716                  --  Generate:
3717                  --    Temp : ... := Func_Call (...);
3718
3719                  Decl :=
3720                    Make_Object_Declaration (Loc,
3721                      Defining_Identifier => Temp_Id,
3722                      Object_Definition   =>
3723                        New_Occurrence_Of (Etype (Func_Id), Loc),
3724                      Expression          =>
3725                        Make_Function_Call (Loc,
3726                          Name                   =>
3727                            New_Occurrence_Of (Func_Id, Loc),
3728                          Parameter_Associations =>
3729                            Parameter_Associations (Call_Node)));
3730
3731                  Insert_Action (Parent (Call_Node), Decl);
3732                  Rewrite (Call_Node, New_Occurrence_Of (Temp_Id, Loc));
3733                  return;
3734               end;
3735            end if;
3736         end;
3737      end if;
3738
3739      --  First step, compute extra actuals, corresponding to any Extra_Formals
3740      --  present. Note that we do not access Extra_Formals directly, instead
3741      --  we simply note the presence of the extra formals as we process the
3742      --  regular formals collecting corresponding actuals in Extra_Actuals.
3743
3744      --  We also generate any required range checks for actuals for in formals
3745      --  as we go through the loop, since this is a convenient place to do it.
3746      --  (Though it seems that this would be better done in Expand_Actuals???)
3747
3748      --  Special case: Thunks must not compute the extra actuals; they must
3749      --  just propagate to the target primitive their extra actuals.
3750
3751      if Is_Thunk (Current_Scope)
3752        and then Thunk_Entity (Current_Scope) = Subp
3753        and then Present (Extra_Formals (Subp))
3754      then
3755         pragma Assert (Present (Extra_Formals (Current_Scope)));
3756
3757         declare
3758            Target_Formal : Entity_Id;
3759            Thunk_Formal  : Entity_Id;
3760
3761         begin
3762            Target_Formal := Extra_Formals (Subp);
3763            Thunk_Formal  := Extra_Formals (Current_Scope);
3764            while Present (Target_Formal) loop
3765               Add_Extra_Actual
3766                 (Expr => New_Occurrence_Of (Thunk_Formal, Loc),
3767                  EF   => Thunk_Formal);
3768
3769               Target_Formal := Extra_Formal (Target_Formal);
3770               Thunk_Formal  := Extra_Formal (Thunk_Formal);
3771            end loop;
3772
3773            while Is_Non_Empty_List (Extra_Actuals) loop
3774               Add_Actual_Parameter (Remove_Head (Extra_Actuals));
3775            end loop;
3776
3777            Expand_Actuals (Call_Node, Subp, Post_Call);
3778            pragma Assert (Is_Empty_List (Post_Call));
3779            pragma Assert (Check_Number_Of_Actuals (Call_Node, Subp));
3780            pragma Assert (Check_BIP_Actuals (Call_Node, Subp));
3781            return;
3782         end;
3783      end if;
3784
3785      Formal := First_Formal (Subp);
3786      Actual := First_Actual (Call_Node);
3787      Param_Count := 1;
3788      while Present (Formal) loop
3789         --  Prepare to examine current entry
3790
3791         Prev := Actual;
3792
3793         --  Ada 2005 (AI-251): Check if any formal is a class-wide interface
3794         --  to expand it in a further round.
3795
3796         CW_Interface_Formals_Present :=
3797           CW_Interface_Formals_Present
3798             or else Is_Class_Wide_Interface_Type (Etype (Formal));
3799
3800         --  Create possible extra actual for constrained case. Usually, the
3801         --  extra actual is of the form actual'constrained, but since this
3802         --  attribute is only available for unconstrained records, TRUE is
3803         --  expanded if the type of the formal happens to be constrained (for
3804         --  instance when this procedure is inherited from an unconstrained
3805         --  record to a constrained one) or if the actual has no discriminant
3806         --  (its type is constrained). An exception to this is the case of a
3807         --  private type without discriminants. In this case we pass FALSE
3808         --  because the object has underlying discriminants with defaults.
3809
3810         if Present (Extra_Constrained (Formal)) then
3811            if Is_Private_Type (Etype (Prev))
3812              and then not Has_Discriminants (Base_Type (Etype (Prev)))
3813            then
3814               Add_Extra_Actual
3815                 (Expr => New_Occurrence_Of (Standard_False, Loc),
3816                  EF   => Extra_Constrained (Formal));
3817
3818            elsif Is_Constrained (Etype (Formal))
3819              or else not Has_Discriminants (Etype (Prev))
3820            then
3821               Add_Extra_Actual
3822                 (Expr => New_Occurrence_Of (Standard_True, Loc),
3823                  EF   => Extra_Constrained (Formal));
3824
3825            --  Do not produce extra actuals for Unchecked_Union parameters.
3826            --  Jump directly to the end of the loop.
3827
3828            elsif Is_Unchecked_Union (Base_Type (Etype (Actual))) then
3829               goto Skip_Extra_Actual_Generation;
3830
3831            else
3832               --  If the actual is a type conversion, then the constrained
3833               --  test applies to the actual, not the target type.
3834
3835               declare
3836                  Act_Prev : Node_Id;
3837
3838               begin
3839                  --  Test for unchecked conversions as well, which can occur
3840                  --  as out parameter actuals on calls to stream procedures.
3841
3842                  Act_Prev := Prev;
3843                  while Nkind (Act_Prev) in N_Type_Conversion
3844                                          | N_Unchecked_Type_Conversion
3845                  loop
3846                     Act_Prev := Expression (Act_Prev);
3847                  end loop;
3848
3849                  --  If the expression is a conversion of a dereference, this
3850                  --  is internally generated code that manipulates addresses,
3851                  --  e.g. when building interface tables. No check should
3852                  --  occur in this case, and the discriminated object is not
3853                  --  directly at hand.
3854
3855                  if not Comes_From_Source (Actual)
3856                    and then Nkind (Actual) = N_Unchecked_Type_Conversion
3857                    and then Nkind (Act_Prev) = N_Explicit_Dereference
3858                  then
3859                     Add_Extra_Actual
3860                       (Expr => New_Occurrence_Of (Standard_False, Loc),
3861                        EF   => Extra_Constrained (Formal));
3862
3863                  else
3864                     Add_Extra_Actual
3865                       (Expr =>
3866                          Make_Attribute_Reference (Sloc (Prev),
3867                            Prefix         =>
3868                              Duplicate_Subexpr_No_Checks
3869                                (Act_Prev, Name_Req => True),
3870                            Attribute_Name => Name_Constrained),
3871                        EF   => Extra_Constrained (Formal));
3872                  end if;
3873               end;
3874            end if;
3875         end if;
3876
3877         --  Create possible extra actual for accessibility level
3878
3879         if Present (Extra_Accessibility (Formal)) then
3880            --  Ada 2005 (AI-251): Thunks must propagate the extra actuals of
3881            --  accessibility levels.
3882
3883            if Is_Thunk (Current_Scope) then
3884               declare
3885                  Parm_Ent : Entity_Id;
3886
3887               begin
3888                  if Is_Controlling_Actual (Actual) then
3889
3890                     --  Find the corresponding actual of the thunk
3891
3892                     Parm_Ent := First_Entity (Current_Scope);
3893                     for J in 2 .. Param_Count loop
3894                        Next_Entity (Parm_Ent);
3895                     end loop;
3896
3897                  --  Handle unchecked conversion of access types generated
3898                  --  in thunks (cf. Expand_Interface_Thunk).
3899
3900                  elsif Is_Access_Type (Etype (Actual))
3901                    and then Nkind (Actual) = N_Unchecked_Type_Conversion
3902                  then
3903                     Parm_Ent := Entity (Expression (Actual));
3904
3905                  else pragma Assert (Is_Entity_Name (Actual));
3906                     Parm_Ent := Entity (Actual);
3907                  end if;
3908
3909                  Add_Extra_Actual
3910                    (Expr => Accessibility_Level
3911                               (Expr            => Parm_Ent,
3912                                Level           => Dynamic_Level,
3913                                Allow_Alt_Model => False),
3914                     EF   => Extra_Accessibility (Formal));
3915               end;
3916
3917            --  Conditional expressions
3918
3919            elsif Nkind (Prev) = N_Expression_With_Actions
3920              and then Nkind (Original_Node (Prev)) in
3921                         N_If_Expression | N_Case_Expression
3922            then
3923               Add_Cond_Expression_Extra_Actual (Formal);
3924
3925            --  Internal constant generated to remove side effects (normally
3926            --  from the expansion of dispatching calls).
3927
3928            --  First verify the actual is internal
3929
3930            elsif not Comes_From_Source (Prev)
3931              and then Original_Node (Prev) = Prev
3932
3933              --  Next check that the actual is a constant
3934
3935              and then Nkind (Prev) = N_Identifier
3936              and then Ekind (Entity (Prev)) = E_Constant
3937              and then Nkind (Parent (Entity (Prev))) = N_Object_Declaration
3938            then
3939               --  Generate the accessibility level based on the expression in
3940               --  the constant's declaration.
3941
3942               Add_Extra_Actual
3943                 (Expr => Accessibility_Level
3944                            (Expr            => Expression
3945                                                  (Parent (Entity (Prev))),
3946                             Level           => Dynamic_Level,
3947                             Allow_Alt_Model => False),
3948                  EF   => Extra_Accessibility (Formal));
3949
3950            --  Normal case
3951
3952            else
3953               Add_Extra_Actual
3954                 (Expr => Accessibility_Level
3955                            (Expr            => Prev,
3956                             Level           => Dynamic_Level,
3957                             Allow_Alt_Model => False),
3958                  EF   => Extra_Accessibility (Formal));
3959            end if;
3960         end if;
3961
3962         --  Perform the check of 4.6(49) that prevents a null value from being
3963         --  passed as an actual to an access parameter. Note that the check
3964         --  is elided in the common cases of passing an access attribute or
3965         --  access parameter as an actual. Also, we currently don't enforce
3966         --  this check for expander-generated actuals and when -gnatdj is set.
3967
3968         if Ada_Version >= Ada_2005 then
3969
3970            --  Ada 2005 (AI-231): Check null-excluding access types. Note that
3971            --  the intent of 6.4.1(13) is that null-exclusion checks should
3972            --  not be done for 'out' parameters, even though it refers only
3973            --  to constraint checks, and a null_exclusion is not a constraint.
3974            --  Note that AI05-0196-1 corrects this mistake in the RM.
3975
3976            if Is_Access_Type (Etype (Formal))
3977              and then Can_Never_Be_Null (Etype (Formal))
3978              and then Ekind (Formal) /= E_Out_Parameter
3979              and then Nkind (Prev) /= N_Raise_Constraint_Error
3980              and then (Known_Null (Prev)
3981                         or else not Can_Never_Be_Null (Etype (Prev)))
3982            then
3983               Install_Null_Excluding_Check (Prev);
3984            end if;
3985
3986         --  Ada_Version < Ada_2005
3987
3988         else
3989            if Ekind (Etype (Formal)) /= E_Anonymous_Access_Type
3990              or else Access_Checks_Suppressed (Subp)
3991            then
3992               null;
3993
3994            elsif Debug_Flag_J then
3995               null;
3996
3997            elsif not Comes_From_Source (Prev) then
3998               null;
3999
4000            elsif Is_Entity_Name (Prev)
4001              and then Ekind (Etype (Prev)) = E_Anonymous_Access_Type
4002            then
4003               null;
4004
4005            elsif Nkind (Prev) in N_Allocator | N_Attribute_Reference then
4006               null;
4007
4008            else
4009               Install_Null_Excluding_Check (Prev);
4010            end if;
4011         end if;
4012
4013         --  Perform appropriate validity checks on parameters that
4014         --  are entities.
4015
4016         if Validity_Checks_On then
4017            if  (Ekind (Formal) = E_In_Parameter
4018                  and then Validity_Check_In_Params)
4019              or else
4020                (Ekind (Formal) = E_In_Out_Parameter
4021                  and then Validity_Check_In_Out_Params)
4022            then
4023               --  If the actual is an indexed component of a packed type (or
4024               --  is an indexed or selected component whose prefix recursively
4025               --  meets this condition), it has not been expanded yet. It will
4026               --  be copied in the validity code that follows, and has to be
4027               --  expanded appropriately, so reanalyze it.
4028
4029               --  What we do is just to unset analyzed bits on prefixes till
4030               --  we reach something that does not have a prefix.
4031
4032               declare
4033                  Nod : Node_Id;
4034
4035               begin
4036                  Nod := Actual;
4037                  while Nkind (Nod) in
4038                    N_Indexed_Component | N_Selected_Component
4039                  loop
4040                     Set_Analyzed (Nod, False);
4041                     Nod := Prefix (Nod);
4042                  end loop;
4043               end;
4044
4045               Ensure_Valid (Actual);
4046            end if;
4047         end if;
4048
4049         --  For IN OUT and OUT parameters, ensure that subscripts are valid
4050         --  since this is a left side reference. We only do this for calls
4051         --  from the source program since we assume that compiler generated
4052         --  calls explicitly generate any required checks. We also need it
4053         --  only if we are doing standard validity checks, since clearly it is
4054         --  not needed if validity checks are off, and in subscript validity
4055         --  checking mode, all indexed components are checked with a call
4056         --  directly from Expand_N_Indexed_Component.
4057
4058         if Comes_From_Source (Call_Node)
4059           and then Ekind (Formal) /= E_In_Parameter
4060           and then Validity_Checks_On
4061           and then Validity_Check_Default
4062           and then not Validity_Check_Subscripts
4063         then
4064            Check_Valid_Lvalue_Subscripts (Actual);
4065         end if;
4066
4067         --  Mark any scalar OUT parameter that is a simple variable as no
4068         --  longer known to be valid (unless the type is always valid). This
4069         --  reflects the fact that if an OUT parameter is never set in a
4070         --  procedure, then it can become invalid on the procedure return.
4071
4072         if Ekind (Formal) = E_Out_Parameter
4073           and then Is_Entity_Name (Actual)
4074           and then Ekind (Entity (Actual)) = E_Variable
4075           and then not Is_Known_Valid (Etype (Actual))
4076         then
4077            Set_Is_Known_Valid (Entity (Actual), False);
4078         end if;
4079
4080         --  For an OUT or IN OUT parameter, if the actual is an entity, then
4081         --  clear current values, since they can be clobbered. We are probably
4082         --  doing this in more places than we need to, but better safe than
4083         --  sorry when it comes to retaining bad current values.
4084
4085         if Ekind (Formal) /= E_In_Parameter
4086           and then Is_Entity_Name (Actual)
4087           and then Present (Entity (Actual))
4088         then
4089            declare
4090               Ent : constant Entity_Id := Entity (Actual);
4091               Sav : Node_Id;
4092
4093            begin
4094               --  For an OUT or IN OUT parameter that is an assignable entity,
4095               --  we do not want to clobber the Last_Assignment field, since
4096               --  if it is set, it was precisely because it is indeed an OUT
4097               --  or IN OUT parameter. We do reset the Is_Known_Valid flag
4098               --  since the subprogram could have returned in invalid value.
4099
4100               if Is_Assignable (Ent) then
4101                  Sav := Last_Assignment (Ent);
4102                  Kill_Current_Values (Ent);
4103                  Set_Last_Assignment (Ent, Sav);
4104                  Set_Is_Known_Valid (Ent, False);
4105                  Set_Is_True_Constant (Ent, False);
4106
4107               --  For all other cases, just kill the current values
4108
4109               else
4110                  Kill_Current_Values (Ent);
4111               end if;
4112            end;
4113         end if;
4114
4115         --  If the formal is class-wide and the actual is an aggregate, force
4116         --  evaluation so that the back end who does not know about class-wide
4117         --  type, does not generate a temporary of the wrong size.
4118
4119         if not Is_Class_Wide_Type (Etype (Formal)) then
4120            null;
4121
4122         elsif Nkind (Actual) = N_Aggregate
4123           or else (Nkind (Actual) = N_Qualified_Expression
4124                     and then Nkind (Expression (Actual)) = N_Aggregate)
4125         then
4126            Force_Evaluation (Actual);
4127         end if;
4128
4129         --  In a remote call, if the formal is of a class-wide type, check
4130         --  that the actual meets the requirements described in E.4(18).
4131
4132         if Remote and then Is_Class_Wide_Type (Etype (Formal)) then
4133            Insert_Action (Actual,
4134              Make_Transportable_Check (Loc,
4135                Duplicate_Subexpr_Move_Checks (Actual)));
4136         end if;
4137
4138         --  Perform invariant checks for all intermediate types in a view
4139         --  conversion after successful return from a call that passes the
4140         --  view conversion as an IN OUT or OUT parameter (RM 7.3.2 (12/3,
4141         --  13/3, 14/3)). Consider only source conversion in order to avoid
4142         --  generating spurious checks on complex expansion such as object
4143         --  initialization through an extension aggregate.
4144
4145         if Comes_From_Source (Call_Node)
4146           and then Ekind (Formal) /= E_In_Parameter
4147           and then Nkind (Actual) = N_Type_Conversion
4148         then
4149            Add_View_Conversion_Invariants (Formal, Actual);
4150         end if;
4151
4152         --  Generating C the initialization of an allocator is performed by
4153         --  means of individual statements, and hence it must be done before
4154         --  the call.
4155
4156         if Modify_Tree_For_C
4157           and then Nkind (Actual) = N_Allocator
4158           and then Nkind (Expression (Actual)) = N_Qualified_Expression
4159         then
4160            Remove_Side_Effects (Actual);
4161         end if;
4162
4163         --  This label is required when skipping extra actual generation for
4164         --  Unchecked_Union parameters.
4165
4166         <<Skip_Extra_Actual_Generation>>
4167
4168         Param_Count := Param_Count + 1;
4169         Next_Actual (Actual);
4170         Next_Formal (Formal);
4171      end loop;
4172
4173      --  If we are calling an Ada 2012 function which needs to have the
4174      --  "accessibility level determined by the point of call" (AI05-0234)
4175      --  passed in to it, then pass it in.
4176
4177      if Ekind (Subp) in E_Function | E_Operator | E_Subprogram_Type
4178        and then
4179          Present (Extra_Accessibility_Of_Result (Ultimate_Alias (Subp)))
4180      then
4181         declare
4182            Extra_Form : Node_Id := Empty;
4183            Level      : Node_Id := Empty;
4184
4185         begin
4186            --  Detect cases where the function call has been internally
4187            --  generated by examining the original node and return library
4188            --  level - taking care to avoid ignoring function calls expanded
4189            --  in prefix notation.
4190
4191            if Nkind (Original_Node (Call_Node)) not in N_Function_Call
4192                                                      | N_Selected_Component
4193                                                      | N_Indexed_Component
4194            then
4195               Level := Make_Integer_Literal
4196                          (Loc, Scope_Depth (Standard_Standard));
4197
4198            --  Otherwise get the level normally based on the call node
4199
4200            else
4201               Level := Accessibility_Level
4202                          (Expr            => Call_Node,
4203                           Level           => Dynamic_Level,
4204                           Allow_Alt_Model => False);
4205            end if;
4206
4207            --  It may be possible that we are re-expanding an already
4208            --  expanded call when are are dealing with dispatching ???
4209
4210            if not Present (Parameter_Associations (Call_Node))
4211              or else Nkind (Last (Parameter_Associations (Call_Node)))
4212                        /= N_Parameter_Association
4213              or else not Is_Accessibility_Actual
4214                              (Last (Parameter_Associations (Call_Node)))
4215            then
4216               Extra_Form := Extra_Accessibility_Of_Result
4217                               (Ultimate_Alias (Subp));
4218
4219               Add_Extra_Actual
4220                 (Expr => Level,
4221                  EF   => Extra_Form);
4222            end if;
4223         end;
4224      end if;
4225
4226      --  If we are expanding the RHS of an assignment we need to check if tag
4227      --  propagation is needed. You might expect this processing to be in
4228      --  Analyze_Assignment but has to be done earlier (bottom-up) because the
4229      --  assignment might be transformed to a declaration for an unconstrained
4230      --  value if the expression is classwide.
4231
4232      if Nkind (Call_Node) = N_Function_Call
4233        and then Is_Tag_Indeterminate (Call_Node)
4234        and then Is_Entity_Name (Name (Call_Node))
4235      then
4236         declare
4237            Ass : Node_Id := Empty;
4238
4239         begin
4240            if Nkind (Parent (Call_Node)) = N_Assignment_Statement then
4241               Ass := Parent (Call_Node);
4242
4243            elsif Nkind (Parent (Call_Node)) = N_Qualified_Expression
4244              and then Nkind (Parent (Parent (Call_Node))) =
4245                                                  N_Assignment_Statement
4246            then
4247               Ass := Parent (Parent (Call_Node));
4248
4249            elsif Nkind (Parent (Call_Node)) = N_Explicit_Dereference
4250              and then Nkind (Parent (Parent (Call_Node))) =
4251                                                  N_Assignment_Statement
4252            then
4253               Ass := Parent (Parent (Call_Node));
4254            end if;
4255
4256            if Present (Ass)
4257              and then Is_Class_Wide_Type (Etype (Name (Ass)))
4258            then
4259               --  Move the error messages below to sem???
4260
4261               if Is_Access_Type (Etype (Call_Node)) then
4262                  if Designated_Type (Etype (Call_Node)) /=
4263                    Root_Type (Etype (Name (Ass)))
4264                  then
4265                     Error_Msg_NE
4266                       ("tag-indeterminate expression must have designated "
4267                        & "type& (RM 5.2 (6))",
4268                         Call_Node, Root_Type (Etype (Name (Ass))));
4269                  else
4270                     Propagate_Tag (Name (Ass), Call_Node);
4271                  end if;
4272
4273               elsif Etype (Call_Node) /= Root_Type (Etype (Name (Ass))) then
4274                  Error_Msg_NE
4275                    ("tag-indeterminate expression must have type & "
4276                     & "(RM 5.2 (6))",
4277                     Call_Node, Root_Type (Etype (Name (Ass))));
4278
4279               else
4280                  Propagate_Tag (Name (Ass), Call_Node);
4281               end if;
4282
4283               --  The call will be rewritten as a dispatching call, and
4284               --  expanded as such.
4285
4286               return;
4287            end if;
4288         end;
4289      end if;
4290
4291      --  Ada 2005 (AI-251): If some formal is a class-wide interface, expand
4292      --  it to point to the correct secondary virtual table.
4293
4294      if Nkind (Call_Node) in N_Subprogram_Call
4295        and then CW_Interface_Formals_Present
4296      then
4297         Expand_Interface_Actuals (Call_Node);
4298      end if;
4299
4300      --  Install class-wide preconditions runtime check when this is a
4301      --  dispatching primitive that has or inherits class-wide preconditions;
4302      --  otherwise no runtime check is installed.
4303
4304      if Nkind (Call_Node) in N_Subprogram_Call
4305        and then Is_Dispatching_Operation (Subp)
4306      then
4307         Install_Class_Preconditions_Check (Call_Node);
4308      end if;
4309
4310      --  Deals with Dispatch_Call if we still have a call, before expanding
4311      --  extra actuals since this will be done on the re-analysis of the
4312      --  dispatching call. Note that we do not try to shorten the actual list
4313      --  for a dispatching call, it would not make sense to do so. Expansion
4314      --  of dispatching calls is suppressed for VM targets, because the VM
4315      --  back-ends directly handle the generation of dispatching calls and
4316      --  would have to undo any expansion to an indirect call.
4317
4318      if Nkind (Call_Node) in N_Subprogram_Call
4319        and then Present (Controlling_Argument (Call_Node))
4320      then
4321         if Tagged_Type_Expansion then
4322            Expand_Dispatching_Call (Call_Node);
4323
4324            --  Expand_Dispatching_Call takes care of all the needed processing
4325
4326            return;
4327         end if;
4328
4329         --  VM targets
4330
4331         declare
4332            Call_Typ   : constant Entity_Id := Etype (Call_Node);
4333            Typ        : constant Entity_Id := Find_Dispatching_Type (Subp);
4334            Eq_Prim_Op : Entity_Id := Empty;
4335            New_Call   : Node_Id;
4336            Param      : Node_Id;
4337            Prev_Call  : Node_Id;
4338
4339         begin
4340            Apply_Tag_Checks (Call_Node);
4341
4342            if not Is_Limited_Type (Typ) then
4343               Eq_Prim_Op := Find_Prim_Op (Typ, Name_Op_Eq);
4344            end if;
4345
4346            --  If this is a dispatching "=", we must first compare the
4347            --  tags so we generate: x.tag = y.tag and then x = y
4348
4349            if Subp = Eq_Prim_Op then
4350
4351               --  Mark the node as analyzed to avoid reanalyzing this
4352               --  dispatching call (which would cause a never-ending loop)
4353
4354               Prev_Call := Relocate_Node (Call_Node);
4355               Set_Analyzed (Prev_Call);
4356
4357               Param := First_Actual (Call_Node);
4358               New_Call :=
4359                 Make_And_Then (Loc,
4360                   Left_Opnd =>
4361                        Make_Op_Eq (Loc,
4362                          Left_Opnd =>
4363                            Make_Selected_Component (Loc,
4364                              Prefix        => New_Value (Param),
4365                              Selector_Name =>
4366                                New_Occurrence_Of
4367                                  (First_Tag_Component (Typ), Loc)),
4368
4369                          Right_Opnd =>
4370                            Make_Selected_Component (Loc,
4371                              Prefix        =>
4372                                Unchecked_Convert_To (Typ,
4373                                  New_Value (Next_Actual (Param))),
4374                              Selector_Name =>
4375                                New_Occurrence_Of
4376                                  (First_Tag_Component (Typ), Loc))),
4377                   Right_Opnd => Prev_Call);
4378
4379               Rewrite (Call_Node, New_Call);
4380               Analyze_And_Resolve
4381                 (Call_Node, Call_Typ, Suppress => All_Checks);
4382            end if;
4383
4384            --  Expansion of a dispatching call results in an indirect call,
4385            --  which in turn causes current values to be killed (see
4386            --  Resolve_Call), so on VM targets we do the call here to
4387            --  ensure consistent warnings between VM and non-VM targets.
4388
4389            Kill_Current_Values;
4390
4391            --  If this is a dispatching "=" then we must update the reference
4392            --  to the call node because we generated:
4393            --     x.tag = y.tag and then x = y
4394
4395            if Subp = Eq_Prim_Op then
4396               Call_Node := Right_Opnd (Call_Node);
4397            end if;
4398         end;
4399      end if;
4400
4401      --  Similarly, expand calls to RCI subprograms on which pragma
4402      --  All_Calls_Remote applies. The rewriting will be reanalyzed
4403      --  later. Do this only when the call comes from source since we
4404      --  do not want such a rewriting to occur in expanded code.
4405
4406      if Is_All_Remote_Call (Call_Node) then
4407         Expand_All_Calls_Remote_Subprogram_Call (Call_Node);
4408
4409      --  Similarly, do not add extra actuals for an entry call whose entity
4410      --  is a protected procedure, or for an internal protected subprogram
4411      --  call, because it will be rewritten as a protected subprogram call
4412      --  and reanalyzed (see Expand_Protected_Subprogram_Call).
4413
4414      elsif Is_Protected_Type (Scope (Subp))
4415         and then Ekind (Subp) in E_Procedure | E_Function
4416      then
4417         null;
4418
4419      --  During that loop we gathered the extra actuals (the ones that
4420      --  correspond to Extra_Formals), so now they can be appended.
4421
4422      else
4423         while Is_Non_Empty_List (Extra_Actuals) loop
4424            Add_Actual_Parameter (Remove_Head (Extra_Actuals));
4425         end loop;
4426      end if;
4427
4428      --  At this point we have all the actuals, so this is the point at which
4429      --  the various expansion activities for actuals is carried out.
4430
4431      Expand_Actuals (Call_Node, Subp, Post_Call);
4432
4433      --  If it is a recursive call then call the internal procedure that
4434      --  verifies Subprogram_Variant contract (if present and enabled).
4435      --  Detecting calls to subprogram aliases is necessary for recursive
4436      --  calls in instances of generic subprograms, where the renaming of
4437      --  the current subprogram is called.
4438
4439      if Is_Subprogram (Subp)
4440        and then not Is_Ignored_Ghost_Entity (Subp)
4441        and then Same_Or_Aliased_Subprograms (Subp, Current_Scope)
4442      then
4443         Check_Subprogram_Variant;
4444      end if;
4445
4446      --  Verify that the actuals do not share storage. This check must be done
4447      --  on the caller side rather that inside the subprogram to avoid issues
4448      --  of parameter passing.
4449
4450      if Check_Aliasing_Of_Parameters then
4451         Apply_Parameter_Aliasing_Checks (Call_Node, Subp);
4452      end if;
4453
4454      --  If the subprogram is a renaming, or if it is inherited, replace it in
4455      --  the call with the name of the actual subprogram being called. If this
4456      --  is a dispatching call, the run-time decides what to call. The Alias
4457      --  attribute does not apply to entries.
4458
4459      if Nkind (Call_Node) /= N_Entry_Call_Statement
4460        and then No (Controlling_Argument (Call_Node))
4461        and then Present (Parent_Subp)
4462        and then not Is_Direct_Deep_Call (Subp)
4463      then
4464         if Present (Inherited_From_Formal (Subp)) then
4465            Parent_Subp := Inherited_From_Formal (Subp);
4466         else
4467            Parent_Subp := Ultimate_Alias (Parent_Subp);
4468         end if;
4469
4470         --  The below setting of Entity is suspect, see F109-018 discussion???
4471
4472         Set_Entity (Name (Call_Node), Parent_Subp);
4473
4474         --  Move this check to sem???
4475
4476         if Is_Abstract_Subprogram (Parent_Subp)
4477           and then not In_Instance
4478         then
4479            Error_Msg_NE
4480              ("cannot call abstract subprogram &!",
4481               Name (Call_Node), Parent_Subp);
4482         end if;
4483
4484         --  Inspect all formals of derived subprogram Subp. Compare parameter
4485         --  types with the parent subprogram and check whether an actual may
4486         --  need a type conversion to the corresponding formal of the parent
4487         --  subprogram.
4488
4489         --  Not clear whether intrinsic subprograms need such conversions. ???
4490
4491         if not Is_Intrinsic_Subprogram (Parent_Subp)
4492           or else Is_Generic_Instance (Parent_Subp)
4493         then
4494            declare
4495               procedure Convert (Act : Node_Id; Typ : Entity_Id);
4496               --  Rewrite node Act as a type conversion of Act to Typ. Analyze
4497               --  and resolve the newly generated construct.
4498
4499               -------------
4500               -- Convert --
4501               -------------
4502
4503               procedure Convert (Act : Node_Id; Typ : Entity_Id) is
4504               begin
4505                  Rewrite (Act, OK_Convert_To (Typ, Act));
4506                  Analyze_And_Resolve (Act, Typ);
4507               end Convert;
4508
4509               --  Local variables
4510
4511               Actual_Typ : Entity_Id;
4512               Formal_Typ : Entity_Id;
4513               Parent_Typ : Entity_Id;
4514
4515            begin
4516               Actual := First_Actual (Call_Node);
4517               Formal := First_Formal (Subp);
4518               Parent_Formal := First_Formal (Parent_Subp);
4519               while Present (Formal) loop
4520                  Actual_Typ := Etype (Actual);
4521                  Formal_Typ := Etype (Formal);
4522                  Parent_Typ := Etype (Parent_Formal);
4523
4524                  --  For an IN parameter of a scalar type, the derived formal
4525                  --  type and parent formal type differ, and the parent formal
4526                  --  type and actual type do not match statically.
4527
4528                  if Is_Scalar_Type (Formal_Typ)
4529                    and then Ekind (Formal) = E_In_Parameter
4530                    and then Formal_Typ /= Parent_Typ
4531                    and then
4532                      not Subtypes_Statically_Match (Parent_Typ, Actual_Typ)
4533                    and then not Raises_Constraint_Error (Actual)
4534                  then
4535                     Convert (Actual, Parent_Typ);
4536
4537                  --  For access types, the parent formal type and actual type
4538                  --  differ.
4539
4540                  elsif Is_Access_Type (Formal_Typ)
4541                    and then Base_Type (Parent_Typ) /= Base_Type (Actual_Typ)
4542                  then
4543                     if Ekind (Formal) /= E_In_Parameter then
4544                        Convert (Actual, Parent_Typ);
4545
4546                     elsif Ekind (Parent_Typ) = E_Anonymous_Access_Type
4547                       and then Designated_Type (Parent_Typ) /=
4548                                Designated_Type (Actual_Typ)
4549                       and then not Is_Controlling_Formal (Formal)
4550                     then
4551                        --  This unchecked conversion is not necessary unless
4552                        --  inlining is enabled, because in that case the type
4553                        --  mismatch may become visible in the body about to be
4554                        --  inlined.
4555
4556                        Rewrite (Actual,
4557                          Unchecked_Convert_To (Parent_Typ, Actual));
4558                        Analyze_And_Resolve (Actual, Parent_Typ);
4559                     end if;
4560
4561                  --  If there is a change of representation, then generate a
4562                  --  warning, and do the change of representation.
4563
4564                  elsif not Has_Compatible_Representation
4565                              (Target_Type  => Formal_Typ,
4566                               Operand_Type => Parent_Typ)
4567                  then
4568                     Error_Msg_N
4569                       ("??change of representation required", Actual);
4570                     Convert (Actual, Parent_Typ);
4571
4572                  --  For array and record types, the parent formal type and
4573                  --  derived formal type have different sizes or pragma Pack
4574                  --  status.
4575
4576                  elsif ((Is_Array_Type (Formal_Typ)
4577                           and then Is_Array_Type (Parent_Typ))
4578                       or else
4579                         (Is_Record_Type (Formal_Typ)
4580                           and then Is_Record_Type (Parent_Typ)))
4581                    and then Known_Esize (Formal_Typ)
4582                    and then Known_Esize (Parent_Typ)
4583                    and then
4584                      (Esize (Formal_Typ) /= Esize (Parent_Typ)
4585                        or else Has_Pragma_Pack (Formal_Typ) /=
4586                                Has_Pragma_Pack (Parent_Typ))
4587                  then
4588                     Convert (Actual, Parent_Typ);
4589                  end if;
4590
4591                  Next_Actual (Actual);
4592                  Next_Formal (Formal);
4593                  Next_Formal (Parent_Formal);
4594               end loop;
4595            end;
4596         end if;
4597
4598         Orig_Subp := Subp;
4599         Subp := Parent_Subp;
4600      end if;
4601
4602      --  Deal with case where call is an explicit dereference
4603
4604      if Nkind (Name (Call_Node)) = N_Explicit_Dereference then
4605
4606         --  Handle case of access to protected subprogram type
4607
4608         if Is_Access_Protected_Subprogram_Type
4609              (Base_Type (Etype (Prefix (Name (Call_Node)))))
4610         then
4611            --  If this is a call through an access to protected operation, the
4612            --  prefix has the form (object'address, operation'access). Rewrite
4613            --  as a for other protected calls: the object is the 1st parameter
4614            --  of the list of actuals.
4615
4616            declare
4617               Call : Node_Id;
4618               Parm : List_Id;
4619               Nam  : Node_Id;
4620               Obj  : Node_Id;
4621               Ptr  : constant Node_Id := Prefix (Name (Call_Node));
4622
4623               T : constant Entity_Id :=
4624                     Equivalent_Type (Base_Type (Etype (Ptr)));
4625
4626               D_T : constant Entity_Id :=
4627                       Designated_Type (Base_Type (Etype (Ptr)));
4628
4629            begin
4630               Obj :=
4631                 Make_Selected_Component (Loc,
4632                   Prefix        => Unchecked_Convert_To (T, Ptr),
4633                   Selector_Name =>
4634                     New_Occurrence_Of (First_Entity (T), Loc));
4635
4636               Nam :=
4637                 Make_Selected_Component (Loc,
4638                   Prefix        => Unchecked_Convert_To (T, Ptr),
4639                   Selector_Name =>
4640                     New_Occurrence_Of (Next_Entity (First_Entity (T)), Loc));
4641
4642               Nam :=
4643                 Make_Explicit_Dereference (Loc,
4644                   Prefix => Nam);
4645
4646               if Present (Parameter_Associations (Call_Node)) then
4647                  Parm := Parameter_Associations (Call_Node);
4648               else
4649                  Parm := New_List;
4650               end if;
4651
4652               Prepend (Obj, Parm);
4653
4654               if Etype (D_T) = Standard_Void_Type then
4655                  Call :=
4656                    Make_Procedure_Call_Statement (Loc,
4657                      Name                   => Nam,
4658                      Parameter_Associations => Parm);
4659               else
4660                  Call :=
4661                    Make_Function_Call (Loc,
4662                      Name                   => Nam,
4663                      Parameter_Associations => Parm);
4664               end if;
4665
4666               Set_First_Named_Actual (Call, First_Named_Actual (Call_Node));
4667               Set_Etype (Call, Etype (D_T));
4668
4669               --  We do not re-analyze the call to avoid infinite recursion.
4670               --  We analyze separately the prefix and the object, and set
4671               --  the checks on the prefix that would otherwise be emitted
4672               --  when resolving a call.
4673
4674               Rewrite (Call_Node, Call);
4675               Analyze (Nam);
4676               Apply_Access_Check (Nam);
4677               Analyze (Obj);
4678               return;
4679            end;
4680         end if;
4681      end if;
4682
4683      --  If this is a call to an intrinsic subprogram, then perform the
4684      --  appropriate expansion to the corresponding tree node and we
4685      --  are all done (since after that the call is gone).
4686
4687      --  In the case where the intrinsic is to be processed by the back end,
4688      --  the call to Expand_Intrinsic_Call will do nothing, which is fine,
4689      --  since the idea in this case is to pass the call unchanged. If the
4690      --  intrinsic is an inherited unchecked conversion, and the derived type
4691      --  is the target type of the conversion, we must retain it as the return
4692      --  type of the expression. Otherwise the expansion below, which uses the
4693      --  parent operation, will yield the wrong type.
4694
4695      if Is_Intrinsic_Subprogram (Subp) then
4696         Expand_Intrinsic_Call (Call_Node, Subp);
4697
4698         if Nkind (Call_Node) = N_Unchecked_Type_Conversion
4699           and then Parent_Subp /= Orig_Subp
4700           and then Etype (Parent_Subp) /= Etype (Orig_Subp)
4701         then
4702            Set_Etype (Call_Node, Etype (Orig_Subp));
4703         end if;
4704
4705         return;
4706      end if;
4707
4708      if Ekind (Subp) in E_Function | E_Procedure then
4709
4710         --  We perform a simple optimization on calls for To_Address by
4711         --  replacing them with an unchecked conversion. Not only is this
4712         --  efficient, but it also avoids order of elaboration problems when
4713         --  address clauses are inlined (address expression elaborated at the
4714         --  wrong point).
4715
4716         --  We perform this optimization regardless of whether we are in the
4717         --  main unit or in a unit in the context of the main unit, to ensure
4718         --  that the generated tree is the same in both cases, for CodePeer
4719         --  use.
4720
4721         if Is_RTE (Subp, RE_To_Address) then
4722            Rewrite (Call_Node,
4723              Unchecked_Convert_To
4724                (RTE (RE_Address), Relocate_Node (First_Actual (Call_Node))));
4725            return;
4726
4727         --  A call to a null procedure is replaced by a null statement, but we
4728         --  are not allowed to ignore possible side effects of the call, so we
4729         --  make sure that actuals are evaluated.
4730         --  We also suppress this optimization for GNATcoverage.
4731
4732         elsif Is_Null_Procedure (Subp)
4733           and then not Opt.Suppress_Control_Flow_Optimizations
4734         then
4735            Actual := First_Actual (Call_Node);
4736            while Present (Actual) loop
4737               Remove_Side_Effects (Actual);
4738               Next_Actual (Actual);
4739            end loop;
4740
4741            Rewrite (Call_Node, Make_Null_Statement (Loc));
4742            return;
4743         end if;
4744
4745         --  Handle inlining. No action needed if the subprogram is not inlined
4746
4747         if not Is_Inlined (Subp) then
4748            null;
4749
4750         --  Front-end inlining of expression functions (performed also when
4751         --  back-end inlining is enabled).
4752
4753         elsif Is_Inlinable_Expression_Function (Subp) then
4754            Rewrite
4755              (Call_Node, New_Copy (Expression_Of_Expression_Function (Subp)));
4756            Analyze (Call_Node);
4757            return;
4758
4759         --  Handle front-end inlining
4760
4761         elsif not Back_End_Inlining then
4762            Inlined_Subprogram : declare
4763               Bod         : Node_Id;
4764               Must_Inline : Boolean := False;
4765               Spec        : constant Node_Id := Unit_Declaration_Node (Subp);
4766
4767            begin
4768               --  Verify that the body to inline has already been seen, and
4769               --  that if the body is in the current unit the inlining does
4770               --  not occur earlier. This avoids order-of-elaboration problems
4771               --  in the back end.
4772
4773               --  This should be documented in sinfo/einfo ???
4774
4775               if No (Spec)
4776                 or else Nkind (Spec) /= N_Subprogram_Declaration
4777                 or else No (Body_To_Inline (Spec))
4778               then
4779                  Must_Inline := False;
4780
4781               --  If this an inherited function that returns a private type,
4782               --  do not inline if the full view is an unconstrained array,
4783               --  because such calls cannot be inlined.
4784
4785               elsif Present (Orig_Subp)
4786                 and then Is_Array_Type (Etype (Orig_Subp))
4787                 and then not Is_Constrained (Etype (Orig_Subp))
4788               then
4789                  Must_Inline := False;
4790
4791               elsif In_Unfrozen_Instance (Scope (Subp)) then
4792                  Must_Inline := False;
4793
4794               else
4795                  Bod := Body_To_Inline (Spec);
4796
4797                  if (In_Extended_Main_Code_Unit (Call_Node)
4798                        or else In_Extended_Main_Code_Unit (Parent (Call_Node))
4799                        or else Has_Pragma_Inline_Always (Subp))
4800                    and then (not In_Same_Extended_Unit (Sloc (Bod), Loc)
4801                               or else
4802                                 Earlier_In_Extended_Unit (Sloc (Bod), Loc))
4803                  then
4804                     Must_Inline := True;
4805
4806                  --  If we are compiling a package body that is not the main
4807                  --  unit, it must be for inlining/instantiation purposes,
4808                  --  in which case we inline the call to insure that the same
4809                  --  temporaries are generated when compiling the body by
4810                  --  itself. Otherwise link errors can occur.
4811
4812                  --  If the function being called is itself in the main unit,
4813                  --  we cannot inline, because there is a risk of double
4814                  --  elaboration and/or circularity: the inlining can make
4815                  --  visible a private entity in the body of the main unit,
4816                  --  that gigi will see before its sees its proper definition.
4817
4818                  elsif not In_Extended_Main_Code_Unit (Call_Node)
4819                    and then In_Package_Body
4820                  then
4821                     Must_Inline := not In_Extended_Main_Source_Unit (Subp);
4822
4823                  --  Inline calls to _postconditions when generating C code
4824
4825                  elsif Modify_Tree_For_C
4826                    and then In_Same_Extended_Unit (Sloc (Bod), Loc)
4827                    and then Chars (Name (Call_Node)) = Name_uPostconditions
4828                  then
4829                     Must_Inline := True;
4830                  end if;
4831               end if;
4832
4833               if Must_Inline then
4834                  Expand_Inlined_Call (Call_Node, Subp, Orig_Subp);
4835
4836               else
4837                  --  Let the back end handle it
4838
4839                  Add_Inlined_Body (Subp, Call_Node);
4840
4841                  if Front_End_Inlining
4842                    and then Nkind (Spec) = N_Subprogram_Declaration
4843                    and then In_Extended_Main_Code_Unit (Call_Node)
4844                    and then No (Body_To_Inline (Spec))
4845                    and then not Has_Completion (Subp)
4846                    and then In_Same_Extended_Unit (Sloc (Spec), Loc)
4847                  then
4848                     Cannot_Inline
4849                       ("cannot inline& (body not seen yet)?",
4850                        Call_Node, Subp);
4851                  end if;
4852               end if;
4853            end Inlined_Subprogram;
4854
4855         --  Front-end expansion of simple functions returning unconstrained
4856         --  types (see Check_And_Split_Unconstrained_Function). Note that the
4857         --  case of a simple renaming (Body_To_Inline in N_Entity below, see
4858         --  also Build_Renamed_Body) cannot be expanded here because this may
4859         --  give rise to order-of-elaboration issues for the types of the
4860         --  parameters of the subprogram, if any.
4861
4862         elsif Present (Unit_Declaration_Node (Subp))
4863           and then Nkind (Unit_Declaration_Node (Subp)) =
4864                                                       N_Subprogram_Declaration
4865           and then Present (Body_To_Inline (Unit_Declaration_Node (Subp)))
4866           and then
4867             Nkind (Body_To_Inline (Unit_Declaration_Node (Subp))) not in
4868                                                                       N_Entity
4869         then
4870            Expand_Inlined_Call (Call_Node, Subp, Orig_Subp);
4871
4872         --  Back-end inlining either if optimization is enabled or the call is
4873         --  required to be inlined.
4874
4875         elsif Optimization_Level > 0
4876           or else Has_Pragma_Inline_Always (Subp)
4877         then
4878            Add_Inlined_Body (Subp, Call_Node);
4879         end if;
4880      end if;
4881
4882      --  Check for protected subprogram. This is either an intra-object call,
4883      --  or a protected function call. Protected procedure calls are rewritten
4884      --  as entry calls and handled accordingly.
4885
4886      --  In Ada 2005, this may be an indirect call to an access parameter that
4887      --  is an access_to_subprogram. In that case the anonymous type has a
4888      --  scope that is a protected operation, but the call is a regular one.
4889      --  In either case do not expand call if subprogram is eliminated.
4890
4891      Scop := Scope (Subp);
4892
4893      if Nkind (Call_Node) /= N_Entry_Call_Statement
4894        and then Is_Protected_Type (Scop)
4895        and then Ekind (Subp) /= E_Subprogram_Type
4896        and then not Is_Eliminated (Subp)
4897      then
4898         --  If the call is an internal one, it is rewritten as a call to the
4899         --  corresponding unprotected subprogram.
4900
4901         Expand_Protected_Subprogram_Call (Call_Node, Subp, Scop);
4902      end if;
4903
4904      --  Functions returning controlled objects need special attention. If
4905      --  the return type is limited, then the context is initialization and
4906      --  different processing applies. If the call is to a protected function,
4907      --  the expansion above will call Expand_Call recursively. Otherwise the
4908      --  function call is transformed into a temporary which obtains the
4909      --  result from the secondary stack.
4910
4911      if Needs_Finalization (Etype (Subp)) then
4912         if not Is_Build_In_Place_Function_Call (Call_Node)
4913           and then
4914             (No (First_Formal (Subp))
4915               or else
4916                 not Is_Concurrent_Record_Type (Etype (First_Formal (Subp))))
4917         then
4918            Expand_Ctrl_Function_Call (Call_Node);
4919
4920         --  Build-in-place function calls which appear in anonymous contexts
4921         --  need a transient scope to ensure the proper finalization of the
4922         --  intermediate result after its use.
4923
4924         elsif Is_Build_In_Place_Function_Call (Call_Node)
4925           and then Nkind (Parent (Unqual_Conv (Call_Node))) in
4926                      N_Attribute_Reference
4927                    | N_Function_Call
4928                    | N_Indexed_Component
4929                    | N_Object_Renaming_Declaration
4930                    | N_Procedure_Call_Statement
4931                    | N_Selected_Component
4932                    | N_Slice
4933           and then
4934             (Ekind (Current_Scope) /= E_Loop
4935               or else Nkind (Parent (Call_Node)) /= N_Function_Call
4936               or else not Is_Build_In_Place_Function_Call
4937                             (Parent (Call_Node)))
4938         then
4939            Establish_Transient_Scope (Call_Node, Manage_Sec_Stack => True);
4940         end if;
4941      end if;
4942   end Expand_Call_Helper;
4943
4944   -------------------------------
4945   -- Expand_Ctrl_Function_Call --
4946   -------------------------------
4947
4948   procedure Expand_Ctrl_Function_Call (N : Node_Id) is
4949      function Is_Element_Reference (N : Node_Id) return Boolean;
4950      --  Determine whether node N denotes a reference to an Ada 2012 container
4951      --  element.
4952
4953      --------------------------
4954      -- Is_Element_Reference --
4955      --------------------------
4956
4957      function Is_Element_Reference (N : Node_Id) return Boolean is
4958         Ref : constant Node_Id := Original_Node (N);
4959
4960      begin
4961         --  Analysis marks an element reference by setting the generalized
4962         --  indexing attribute of an indexed component before the component
4963         --  is rewritten into a function call.
4964
4965         return
4966           Nkind (Ref) = N_Indexed_Component
4967             and then Present (Generalized_Indexing (Ref));
4968      end Is_Element_Reference;
4969
4970   --  Start of processing for Expand_Ctrl_Function_Call
4971
4972   begin
4973      --  Optimization, if the returned value (which is on the sec-stack) is
4974      --  returned again, no need to copy/readjust/finalize, we can just pass
4975      --  the value thru (see Expand_N_Simple_Return_Statement), and thus no
4976      --  attachment is needed.
4977
4978      if Nkind (Parent (N)) = N_Simple_Return_Statement then
4979         return;
4980      end if;
4981
4982      --  Resolution is now finished, make sure we don't start analysis again
4983      --  because of the duplication.
4984
4985      Set_Analyzed (N);
4986
4987      --  A function which returns a controlled object uses the secondary
4988      --  stack. Rewrite the call into a temporary which obtains the result of
4989      --  the function using 'reference.
4990
4991      Remove_Side_Effects (N);
4992
4993      --  The side effect removal of the function call produced a temporary.
4994      --  When the context is a case expression, if expression, or expression
4995      --  with actions, the lifetime of the temporary must be extended to match
4996      --  that of the context. Otherwise the function result will be finalized
4997      --  too early and affect the result of the expression. To prevent this
4998      --  unwanted effect, the temporary should not be considered for clean up
4999      --  actions by the general finalization machinery.
5000
5001      --  Exception to this rule are references to Ada 2012 container elements.
5002      --  Such references must be finalized at the end of each iteration of the
5003      --  related quantified expression, otherwise the container will remain
5004      --  busy.
5005
5006      if Nkind (N) = N_Explicit_Dereference
5007        and then Within_Case_Or_If_Expression (N)
5008        and then not Is_Element_Reference (N)
5009      then
5010         Set_Is_Ignored_Transient (Entity (Prefix (N)));
5011      end if;
5012   end Expand_Ctrl_Function_Call;
5013
5014   ----------------------------------------
5015   -- Expand_N_Extended_Return_Statement --
5016   ----------------------------------------
5017
5018   --  If there is a Handled_Statement_Sequence, we rewrite this:
5019
5020   --     return Result : T := <expression> do
5021   --        <handled_seq_of_stms>
5022   --     end return;
5023
5024   --  to be:
5025
5026   --     declare
5027   --        Result : T := <expression>;
5028   --     begin
5029   --        <handled_seq_of_stms>
5030   --        return Result;
5031   --     end;
5032
5033   --  Otherwise (no Handled_Statement_Sequence), we rewrite this:
5034
5035   --     return Result : T := <expression>;
5036
5037   --  to be:
5038
5039   --     return <expression>;
5040
5041   --  unless it's build-in-place or there's no <expression>, in which case
5042   --  we generate:
5043
5044   --     declare
5045   --        Result : T := <expression>;
5046   --     begin
5047   --        return Result;
5048   --     end;
5049
5050   --  Note that this case could have been written by the user as an extended
5051   --  return statement, or could have been transformed to this from a simple
5052   --  return statement.
5053
5054   --  That is, we need to have a reified return object if there are statements
5055   --  (which might refer to it) or if we're doing build-in-place (so we can
5056   --  set its address to the final resting place or if there is no expression
5057   --  (in which case default initial values might need to be set)).
5058
5059   procedure Expand_N_Extended_Return_Statement (N : Node_Id) is
5060      Loc : constant Source_Ptr := Sloc (N);
5061
5062      function Build_Heap_Or_Pool_Allocator
5063        (Temp_Id    : Entity_Id;
5064         Temp_Typ   : Entity_Id;
5065         Func_Id    : Entity_Id;
5066         Ret_Typ    : Entity_Id;
5067         Alloc_Expr : Node_Id) return Node_Id;
5068      --  Create the statements necessary to allocate a return object on the
5069      --  heap or user-defined storage pool. The object may need finalization
5070      --  actions depending on the return type.
5071      --
5072      --    * Controlled case
5073      --
5074      --       if BIPfinalizationmaster = null then
5075      --          Temp_Id := <Alloc_Expr>;
5076      --       else
5077      --          declare
5078      --             type Ptr_Typ is access Ret_Typ;
5079      --             for Ptr_Typ'Storage_Pool use
5080      --                   Base_Pool (BIPfinalizationmaster.all).all;
5081      --             Local : Ptr_Typ;
5082      --
5083      --          begin
5084      --             procedure Allocate (...) is
5085      --             begin
5086      --                System.Storage_Pools.Subpools.Allocate_Any (...);
5087      --             end Allocate;
5088      --
5089      --             Local := <Alloc_Expr>;
5090      --             Temp_Id := Temp_Typ (Local);
5091      --          end;
5092      --       end if;
5093      --
5094      --    * Non-controlled case
5095      --
5096      --       Temp_Id := <Alloc_Expr>;
5097      --
5098      --  Temp_Id is the temporary which is used to reference the internally
5099      --  created object in all allocation forms. Temp_Typ is the type of the
5100      --  temporary. Func_Id is the enclosing function. Ret_Typ is the return
5101      --  type of Func_Id. Alloc_Expr is the actual allocator.
5102
5103      function Move_Activation_Chain (Func_Id : Entity_Id) return Node_Id;
5104      --  Construct a call to System.Tasking.Stages.Move_Activation_Chain
5105      --  with parameters:
5106      --    From         current activation chain
5107      --    To           activation chain passed in by the caller
5108      --    New_Master   master passed in by the caller
5109      --
5110      --  Func_Id is the entity of the function where the extended return
5111      --  statement appears.
5112
5113      ----------------------------------
5114      -- Build_Heap_Or_Pool_Allocator --
5115      ----------------------------------
5116
5117      function Build_Heap_Or_Pool_Allocator
5118        (Temp_Id    : Entity_Id;
5119         Temp_Typ   : Entity_Id;
5120         Func_Id    : Entity_Id;
5121         Ret_Typ    : Entity_Id;
5122         Alloc_Expr : Node_Id) return Node_Id
5123      is
5124      begin
5125         pragma Assert (Is_Build_In_Place_Function (Func_Id));
5126
5127         --  Processing for objects that require finalization actions
5128
5129         if Needs_Finalization (Ret_Typ) then
5130            declare
5131               Decls      : constant List_Id := New_List;
5132               Fin_Mas_Id : constant Entity_Id :=
5133                              Build_In_Place_Formal
5134                                (Func_Id, BIP_Finalization_Master);
5135               Orig_Expr  : constant Node_Id :=
5136                              New_Copy_Tree
5137                                (Source           => Alloc_Expr,
5138                                 Scopes_In_EWA_OK => True);
5139               Stmts      : constant List_Id := New_List;
5140               Desig_Typ  : Entity_Id;
5141               Local_Id   : Entity_Id;
5142               Pool_Id    : Entity_Id;
5143               Ptr_Typ    : Entity_Id;
5144
5145            begin
5146               --  Generate:
5147               --    Pool_Id renames Base_Pool (BIPfinalizationmaster.all).all;
5148
5149               Pool_Id := Make_Temporary (Loc, 'P');
5150
5151               Append_To (Decls,
5152                 Make_Object_Renaming_Declaration (Loc,
5153                   Defining_Identifier => Pool_Id,
5154                   Subtype_Mark        =>
5155                     New_Occurrence_Of (RTE (RE_Root_Storage_Pool), Loc),
5156                   Name                =>
5157                     Make_Explicit_Dereference (Loc,
5158                       Prefix =>
5159                         Make_Function_Call (Loc,
5160                           Name                   =>
5161                             New_Occurrence_Of (RTE (RE_Base_Pool), Loc),
5162                           Parameter_Associations => New_List (
5163                             Make_Explicit_Dereference (Loc,
5164                               Prefix =>
5165                                 New_Occurrence_Of (Fin_Mas_Id, Loc)))))));
5166
5167               --  Create an access type which uses the storage pool of the
5168               --  caller's master. This additional type is necessary because
5169               --  the finalization master cannot be associated with the type
5170               --  of the temporary. Otherwise the secondary stack allocation
5171               --  will fail.
5172
5173               Desig_Typ := Ret_Typ;
5174
5175               --  Ensure that the build-in-place machinery uses a fat pointer
5176               --  when allocating an unconstrained array on the heap. In this
5177               --  case the result object type is a constrained array type even
5178               --  though the function type is unconstrained.
5179
5180               if Ekind (Desig_Typ) = E_Array_Subtype then
5181                  Desig_Typ := Base_Type (Desig_Typ);
5182               end if;
5183
5184               --  Generate:
5185               --    type Ptr_Typ is access Desig_Typ;
5186
5187               Ptr_Typ := Make_Temporary (Loc, 'P');
5188
5189               Append_To (Decls,
5190                 Make_Full_Type_Declaration (Loc,
5191                   Defining_Identifier => Ptr_Typ,
5192                   Type_Definition     =>
5193                     Make_Access_To_Object_Definition (Loc,
5194                       Subtype_Indication =>
5195                         New_Occurrence_Of (Desig_Typ, Loc))));
5196
5197               --  Perform minor decoration in order to set the master and the
5198               --  storage pool attributes.
5199
5200               Mutate_Ekind                (Ptr_Typ, E_Access_Type);
5201               Set_Finalization_Master     (Ptr_Typ, Fin_Mas_Id);
5202               Set_Associated_Storage_Pool (Ptr_Typ, Pool_Id);
5203
5204               --  Create the temporary, generate:
5205               --    Local_Id : Ptr_Typ;
5206
5207               Local_Id := Make_Temporary (Loc, 'T');
5208
5209               Append_To (Decls,
5210                 Make_Object_Declaration (Loc,
5211                   Defining_Identifier => Local_Id,
5212                   Object_Definition   =>
5213                     New_Occurrence_Of (Ptr_Typ, Loc)));
5214
5215               --  Allocate the object, generate:
5216               --    Local_Id := <Alloc_Expr>;
5217
5218               Append_To (Stmts,
5219                 Make_Assignment_Statement (Loc,
5220                   Name       => New_Occurrence_Of (Local_Id, Loc),
5221                   Expression => Alloc_Expr));
5222
5223               --  Generate:
5224               --    Temp_Id := Temp_Typ (Local_Id);
5225
5226               Append_To (Stmts,
5227                 Make_Assignment_Statement (Loc,
5228                   Name       => New_Occurrence_Of (Temp_Id, Loc),
5229                   Expression =>
5230                     Unchecked_Convert_To (Temp_Typ,
5231                       New_Occurrence_Of (Local_Id, Loc))));
5232
5233               --  Wrap the allocation in a block. This is further conditioned
5234               --  by checking the caller finalization master at runtime. A
5235               --  null value indicates a non-existent master, most likely due
5236               --  to a Finalize_Storage_Only allocation.
5237
5238               --  Generate:
5239               --    if BIPfinalizationmaster = null then
5240               --       Temp_Id := <Orig_Expr>;
5241               --    else
5242               --       declare
5243               --          <Decls>
5244               --       begin
5245               --          <Stmts>
5246               --       end;
5247               --    end if;
5248
5249               return
5250                 Make_If_Statement (Loc,
5251                   Condition       =>
5252                     Make_Op_Eq (Loc,
5253                       Left_Opnd  => New_Occurrence_Of (Fin_Mas_Id, Loc),
5254                       Right_Opnd => Make_Null (Loc)),
5255
5256                   Then_Statements => New_List (
5257                     Make_Assignment_Statement (Loc,
5258                       Name       => New_Occurrence_Of (Temp_Id, Loc),
5259                       Expression => Orig_Expr)),
5260
5261                   Else_Statements => New_List (
5262                     Make_Block_Statement (Loc,
5263                       Declarations               => Decls,
5264                       Handled_Statement_Sequence =>
5265                         Make_Handled_Sequence_Of_Statements (Loc,
5266                           Statements => Stmts))));
5267            end;
5268
5269         --  For all other cases, generate:
5270         --    Temp_Id := <Alloc_Expr>;
5271
5272         else
5273            return
5274              Make_Assignment_Statement (Loc,
5275                Name       => New_Occurrence_Of (Temp_Id, Loc),
5276                Expression => Alloc_Expr);
5277         end if;
5278      end Build_Heap_Or_Pool_Allocator;
5279
5280      ---------------------------
5281      -- Move_Activation_Chain --
5282      ---------------------------
5283
5284      function Move_Activation_Chain (Func_Id : Entity_Id) return Node_Id is
5285      begin
5286         return
5287           Make_Procedure_Call_Statement (Loc,
5288             Name                   =>
5289               New_Occurrence_Of (RTE (RE_Move_Activation_Chain), Loc),
5290
5291             Parameter_Associations => New_List (
5292
5293               --  Source chain
5294
5295               Make_Attribute_Reference (Loc,
5296                 Prefix         => Make_Identifier (Loc, Name_uChain),
5297                 Attribute_Name => Name_Unrestricted_Access),
5298
5299               --  Destination chain
5300
5301               New_Occurrence_Of
5302                 (Build_In_Place_Formal (Func_Id, BIP_Activation_Chain), Loc),
5303
5304               --  New master
5305
5306               New_Occurrence_Of
5307                 (Build_In_Place_Formal (Func_Id, BIP_Task_Master), Loc)));
5308      end Move_Activation_Chain;
5309
5310      --  Local variables
5311
5312      Func_Id      : constant Entity_Id :=
5313                       Return_Applies_To (Return_Statement_Entity (N));
5314      Is_BIP_Func  : constant Boolean   :=
5315                       Is_Build_In_Place_Function (Func_Id);
5316      Ret_Obj_Id   : constant Entity_Id :=
5317                       First_Entity (Return_Statement_Entity (N));
5318      Ret_Obj_Decl : constant Node_Id   := Parent (Ret_Obj_Id);
5319      Ret_Typ      : constant Entity_Id := Etype (Func_Id);
5320
5321      Exp         : Node_Id;
5322      HSS         : Node_Id;
5323      Result      : Node_Id;
5324      Stmts       : List_Id;
5325
5326      Return_Stmt : Node_Id := Empty;
5327      --  Force initialization to facilitate static analysis
5328
5329   --  Start of processing for Expand_N_Extended_Return_Statement
5330
5331   begin
5332      --  Given that functionality of interface thunks is simple (just displace
5333      --  the pointer to the object) they are always handled by means of
5334      --  simple return statements.
5335
5336      pragma Assert (not Is_Thunk (Current_Subprogram));
5337
5338      if Nkind (Ret_Obj_Decl) = N_Object_Declaration then
5339         Exp := Expression (Ret_Obj_Decl);
5340
5341         --  Assert that if F says "return R : T := G(...) do..."
5342         --  then F and G are both b-i-p, or neither b-i-p.
5343
5344         if Nkind (Exp) = N_Function_Call then
5345            pragma Assert (Ekind (Current_Subprogram) = E_Function);
5346            pragma Assert
5347              (Is_Build_In_Place_Function (Current_Subprogram) =
5348               Is_Build_In_Place_Function_Call (Exp));
5349            null;
5350         end if;
5351
5352         --  Ada 2005 (AI95-344): If the result type is class-wide, then insert
5353         --  a check that the level of the return expression's underlying type
5354         --  is not deeper than the level of the master enclosing the function.
5355
5356         --  AI12-043: The check is made immediately after the return object
5357         --  is created.
5358
5359         if Present (Exp) and then Is_Class_Wide_Type (Ret_Typ) then
5360            Apply_CW_Accessibility_Check (Exp, Func_Id);
5361         end if;
5362      else
5363         Exp := Empty;
5364      end if;
5365
5366      HSS := Handled_Statement_Sequence (N);
5367
5368      --  If the returned object needs finalization actions, the function must
5369      --  perform the appropriate cleanup should it fail to return. The state
5370      --  of the function itself is tracked through a flag which is coupled
5371      --  with the scope finalizer. There is one flag per each return object
5372      --  in case of multiple returns.
5373
5374      if Is_BIP_Func and then Needs_Finalization (Etype (Ret_Obj_Id)) then
5375         declare
5376            Flag_Decl : Node_Id;
5377            Flag_Id   : Entity_Id;
5378            Func_Bod  : Node_Id;
5379
5380         begin
5381            --  Recover the function body
5382
5383            Func_Bod := Unit_Declaration_Node (Func_Id);
5384
5385            if Nkind (Func_Bod) = N_Subprogram_Declaration then
5386               Func_Bod := Parent (Parent (Corresponding_Body (Func_Bod)));
5387            end if;
5388
5389            if Nkind (Func_Bod) = N_Function_Specification then
5390               Func_Bod := Parent (Func_Bod); -- one more level for child units
5391            end if;
5392
5393            pragma Assert (Nkind (Func_Bod) = N_Subprogram_Body);
5394
5395            --  Create a flag to track the function state
5396
5397            Flag_Id := Make_Temporary (Loc, 'F');
5398            Set_Status_Flag_Or_Transient_Decl (Ret_Obj_Id, Flag_Id);
5399
5400            --  Insert the flag at the beginning of the function declarations,
5401            --  generate:
5402            --    Fnn : Boolean := False;
5403
5404            Flag_Decl :=
5405              Make_Object_Declaration (Loc,
5406                Defining_Identifier => Flag_Id,
5407                  Object_Definition =>
5408                    New_Occurrence_Of (Standard_Boolean, Loc),
5409                  Expression        =>
5410                    New_Occurrence_Of (Standard_False, Loc));
5411
5412            Prepend_To (Declarations (Func_Bod), Flag_Decl);
5413            Analyze (Flag_Decl);
5414         end;
5415      end if;
5416
5417      --  Build a simple_return_statement that returns the return object when
5418      --  there is a statement sequence, or no expression, or the analysis of
5419      --  the return object declaration generated extra actions, or the result
5420      --  will be built in place. Note however that we currently do this for
5421      --  all composite cases, even though they are not built in place.
5422
5423      if Present (HSS)
5424        or else No (Exp)
5425        or else List_Length (Return_Object_Declarations (N)) > 1
5426        or else Is_Composite_Type (Ret_Typ)
5427      then
5428         if No (HSS) then
5429            Stmts := New_List;
5430
5431         --  If the extended return has a handled statement sequence, then wrap
5432         --  it in a block and use the block as the first statement.
5433
5434         else
5435            Stmts := New_List (
5436              Make_Block_Statement (Loc,
5437                Declarations               => New_List,
5438                Handled_Statement_Sequence => HSS));
5439         end if;
5440
5441         --  If the result type contains tasks, we call Move_Activation_Chain.
5442         --  Later, the cleanup code will call Complete_Master, which will
5443         --  terminate any unactivated tasks belonging to the return statement
5444         --  master. But Move_Activation_Chain updates their master to be that
5445         --  of the caller, so they will not be terminated unless the return
5446         --  statement completes unsuccessfully due to exception, abort, goto,
5447         --  or exit. As a formality, we test whether the function requires the
5448         --  result to be built in place, though that's necessarily true for
5449         --  the case of result types with task parts.
5450
5451         if Is_BIP_Func and then Has_Task (Ret_Typ) then
5452
5453            --  The return expression is an aggregate for a complex type which
5454            --  contains tasks. This particular case is left unexpanded since
5455            --  the regular expansion would insert all temporaries and
5456            --  initialization code in the wrong block.
5457
5458            if Nkind (Exp) = N_Aggregate then
5459               Expand_N_Aggregate (Exp);
5460            end if;
5461
5462            --  Do not move the activation chain if the return object does not
5463            --  contain tasks.
5464
5465            if Has_Task (Etype (Ret_Obj_Id)) then
5466               Append_To (Stmts, Move_Activation_Chain (Func_Id));
5467            end if;
5468         end if;
5469
5470         --  Update the state of the function right before the object is
5471         --  returned.
5472
5473         if Is_BIP_Func and then Needs_Finalization (Etype (Ret_Obj_Id)) then
5474            declare
5475               Flag_Id : constant Entity_Id :=
5476                           Status_Flag_Or_Transient_Decl (Ret_Obj_Id);
5477
5478            begin
5479               --  Generate:
5480               --    Fnn := True;
5481
5482               Append_To (Stmts,
5483                 Make_Assignment_Statement (Loc,
5484                   Name       => New_Occurrence_Of (Flag_Id, Loc),
5485                   Expression => New_Occurrence_Of (Standard_True, Loc)));
5486            end;
5487         end if;
5488
5489         --  Build a simple_return_statement that returns the return object
5490
5491         Return_Stmt :=
5492           Make_Simple_Return_Statement (Loc,
5493             Expression => New_Occurrence_Of (Ret_Obj_Id, Loc));
5494         Append_To (Stmts, Return_Stmt);
5495
5496         HSS := Make_Handled_Sequence_Of_Statements (Loc, Stmts);
5497      end if;
5498
5499      --  Case where we build a return statement block
5500
5501      if Present (HSS) then
5502         Result :=
5503           Make_Block_Statement (Loc,
5504             Declarations               => Return_Object_Declarations (N),
5505             Handled_Statement_Sequence => HSS);
5506
5507         --  We set the entity of the new block statement to be that of the
5508         --  return statement. This is necessary so that various fields, such
5509         --  as Finalization_Chain_Entity carry over from the return statement
5510         --  to the block. Note that this block is unusual, in that its entity
5511         --  is an E_Return_Statement rather than an E_Block.
5512
5513         Set_Identifier
5514           (Result, New_Occurrence_Of (Return_Statement_Entity (N), Loc));
5515
5516         --  If the object decl was already rewritten as a renaming, then we
5517         --  don't want to do the object allocation and transformation of
5518         --  the return object declaration to a renaming. This case occurs
5519         --  when the return object is initialized by a call to another
5520         --  build-in-place function, and that function is responsible for
5521         --  the allocation of the return object.
5522
5523         if Is_BIP_Func
5524           and then Nkind (Ret_Obj_Decl) = N_Object_Renaming_Declaration
5525         then
5526            pragma Assert
5527              (Nkind (Original_Node (Ret_Obj_Decl)) = N_Object_Declaration
5528                and then
5529
5530                  --  It is a regular BIP object declaration
5531
5532                  (Is_Build_In_Place_Function_Call
5533                     (Expression (Original_Node (Ret_Obj_Decl)))
5534
5535                  --  It is a BIP object declaration that displaces the pointer
5536                  --  to the object to reference a converted interface type.
5537
5538                  or else
5539                    Present (Unqual_BIP_Iface_Function_Call
5540                              (Expression (Original_Node (Ret_Obj_Decl))))));
5541
5542            --  Return the build-in-place result by reference
5543
5544            Set_By_Ref (Return_Stmt);
5545
5546         elsif Is_BIP_Func then
5547
5548            --  Locate the implicit access parameter associated with the
5549            --  caller-supplied return object and convert the return
5550            --  statement's return object declaration to a renaming of a
5551            --  dereference of the access parameter. If the return object's
5552            --  declaration includes an expression that has not already been
5553            --  expanded as separate assignments, then add an assignment
5554            --  statement to ensure the return object gets initialized.
5555
5556            --    declare
5557            --       Result : T [:= <expression>];
5558            --    begin
5559            --       ...
5560
5561            --  is converted to
5562
5563            --    declare
5564            --       Result : T renames FuncRA.all;
5565            --       [Result := <expression;]
5566            --    begin
5567            --       ...
5568
5569            declare
5570               Ret_Obj_Expr : constant Node_Id   := Expression (Ret_Obj_Decl);
5571               Ret_Obj_Typ  : constant Entity_Id := Etype (Ret_Obj_Id);
5572
5573               Init_Assignment  : Node_Id := Empty;
5574               Obj_Acc_Formal   : Entity_Id;
5575               Obj_Acc_Deref    : Node_Id;
5576               Obj_Alloc_Formal : Entity_Id;
5577
5578            begin
5579               --  Build-in-place results must be returned by reference
5580
5581               Set_By_Ref (Return_Stmt);
5582
5583               --  Retrieve the implicit access parameter passed by the caller
5584
5585               Obj_Acc_Formal :=
5586                 Build_In_Place_Formal (Func_Id, BIP_Object_Access);
5587
5588               --  If the return object's declaration includes an expression
5589               --  and the declaration isn't marked as No_Initialization, then
5590               --  we need to generate an assignment to the object and insert
5591               --  it after the declaration before rewriting it as a renaming
5592               --  (otherwise we'll lose the initialization). The case where
5593               --  the result type is an interface (or class-wide interface)
5594               --  is also excluded because the context of the function call
5595               --  must be unconstrained, so the initialization will always
5596               --  be done as part of an allocator evaluation (storage pool
5597               --  or secondary stack), never to a constrained target object
5598               --  passed in by the caller. Besides the assignment being
5599               --  unneeded in this case, it avoids problems with trying to
5600               --  generate a dispatching assignment when the return expression
5601               --  is a nonlimited descendant of a limited interface (the
5602               --  interface has no assignment operation).
5603
5604               if Present (Ret_Obj_Expr)
5605                 and then not No_Initialization (Ret_Obj_Decl)
5606                 and then not Is_Interface (Ret_Obj_Typ)
5607               then
5608                  Init_Assignment :=
5609                    Make_Assignment_Statement (Loc,
5610                      Name       => New_Occurrence_Of (Ret_Obj_Id, Loc),
5611                      Expression =>
5612                        New_Copy_Tree
5613                          (Source           => Ret_Obj_Expr,
5614                           Scopes_In_EWA_OK => True));
5615
5616                  Set_Etype (Name (Init_Assignment), Etype (Ret_Obj_Id));
5617                  Set_Assignment_OK (Name (Init_Assignment));
5618                  Set_No_Ctrl_Actions (Init_Assignment);
5619
5620                  Set_Parent (Name (Init_Assignment), Init_Assignment);
5621                  Set_Parent (Expression (Init_Assignment), Init_Assignment);
5622
5623                  Set_Expression (Ret_Obj_Decl, Empty);
5624
5625                  if Is_Class_Wide_Type (Etype (Ret_Obj_Id))
5626                    and then not Is_Class_Wide_Type
5627                                   (Etype (Expression (Init_Assignment)))
5628                  then
5629                     Rewrite (Expression (Init_Assignment),
5630                       Make_Type_Conversion (Loc,
5631                         Subtype_Mark =>
5632                           New_Occurrence_Of (Etype (Ret_Obj_Id), Loc),
5633                         Expression   =>
5634                           Relocate_Node (Expression (Init_Assignment))));
5635                  end if;
5636
5637                  --  In the case of functions where the calling context can
5638                  --  determine the form of allocation needed, initialization
5639                  --  is done with each part of the if statement that handles
5640                  --  the different forms of allocation (this is true for
5641                  --  unconstrained, tagged, and controlled result subtypes).
5642
5643                  if not Needs_BIP_Alloc_Form (Func_Id) then
5644                     Insert_After (Ret_Obj_Decl, Init_Assignment);
5645                  end if;
5646               end if;
5647
5648               --  When the function's subtype is unconstrained, a run-time
5649               --  test may be needed to decide the form of allocation to use
5650               --  for the return object. The function has an implicit formal
5651               --  parameter indicating this. If the BIP_Alloc_Form formal has
5652               --  the value one, then the caller has passed access to an
5653               --  existing object for use as the return object. If the value
5654               --  is two, then the return object must be allocated on the
5655               --  secondary stack. Otherwise, the object must be allocated in
5656               --  a storage pool. We generate an if statement to test the
5657               --  implicit allocation formal and initialize a local access
5658               --  value appropriately, creating allocators in the secondary
5659               --  stack and global heap cases. The special formal also exists
5660               --  and must be tested when the function has a tagged result,
5661               --  even when the result subtype is constrained, because in
5662               --  general such functions can be called in dispatching contexts
5663               --  and must be handled similarly to functions with a class-wide
5664               --  result.
5665
5666               if Needs_BIP_Alloc_Form (Func_Id) then
5667                  Obj_Alloc_Formal :=
5668                    Build_In_Place_Formal (Func_Id, BIP_Alloc_Form);
5669
5670                  declare
5671                     Pool_Id        : constant Entity_Id :=
5672                                        Make_Temporary (Loc, 'P');
5673                     Alloc_Obj_Id   : Entity_Id;
5674                     Alloc_Obj_Decl : Node_Id;
5675                     Alloc_If_Stmt  : Node_Id;
5676                     Guard_Except   : Node_Id;
5677                     Heap_Allocator : Node_Id;
5678                     Pool_Decl      : Node_Id;
5679                     Pool_Allocator : Node_Id;
5680                     Ptr_Type_Decl  : Node_Id;
5681                     Ref_Type       : Entity_Id;
5682                     SS_Allocator   : Node_Id;
5683
5684                  begin
5685                     --  Create an access type designating the function's
5686                     --  result subtype.
5687
5688                     Ref_Type := Make_Temporary (Loc, 'A');
5689
5690                     Ptr_Type_Decl :=
5691                       Make_Full_Type_Declaration (Loc,
5692                         Defining_Identifier => Ref_Type,
5693                         Type_Definition     =>
5694                           Make_Access_To_Object_Definition (Loc,
5695                             All_Present        => True,
5696                             Subtype_Indication =>
5697                               New_Occurrence_Of (Ret_Obj_Typ, Loc)));
5698
5699                     Insert_Before (Ret_Obj_Decl, Ptr_Type_Decl);
5700
5701                     --  Create an access object that will be initialized to an
5702                     --  access value denoting the return object, either coming
5703                     --  from an implicit access value passed in by the caller
5704                     --  or from the result of an allocator.
5705
5706                     Alloc_Obj_Id := Make_Temporary (Loc, 'R');
5707                     Set_Etype (Alloc_Obj_Id, Ref_Type);
5708
5709                     Alloc_Obj_Decl :=
5710                       Make_Object_Declaration (Loc,
5711                         Defining_Identifier => Alloc_Obj_Id,
5712                         Object_Definition   =>
5713                           New_Occurrence_Of (Ref_Type, Loc));
5714
5715                     Insert_Before (Ret_Obj_Decl, Alloc_Obj_Decl);
5716
5717                     --  Create allocators for both the secondary stack and
5718                     --  global heap. If there's an initialization expression,
5719                     --  then create these as initialized allocators.
5720
5721                     if Present (Ret_Obj_Expr)
5722                       and then not No_Initialization (Ret_Obj_Decl)
5723                     then
5724                        --  Always use the type of the expression for the
5725                        --  qualified expression, rather than the result type.
5726                        --  In general we cannot always use the result type
5727                        --  for the allocator, because the expression might be
5728                        --  of a specific type, such as in the case of an
5729                        --  aggregate or even a nonlimited object when the
5730                        --  result type is a limited class-wide interface type.
5731
5732                        Heap_Allocator :=
5733                          Make_Allocator (Loc,
5734                            Expression =>
5735                              Make_Qualified_Expression (Loc,
5736                                Subtype_Mark =>
5737                                  New_Occurrence_Of
5738                                    (Etype (Ret_Obj_Expr), Loc),
5739                                Expression   =>
5740                                  New_Copy_Tree
5741                                    (Source           => Ret_Obj_Expr,
5742                                     Scopes_In_EWA_OK => True)));
5743
5744                     else
5745                        --  If the function returns a class-wide type we cannot
5746                        --  use the return type for the allocator. Instead we
5747                        --  use the type of the expression, which must be an
5748                        --  aggregate of a definite type.
5749
5750                        if Is_Class_Wide_Type (Ret_Obj_Typ) then
5751                           Heap_Allocator :=
5752                             Make_Allocator (Loc,
5753                               Expression =>
5754                                 New_Occurrence_Of
5755                                   (Etype (Ret_Obj_Expr), Loc));
5756                        else
5757                           Heap_Allocator :=
5758                             Make_Allocator (Loc,
5759                               Expression =>
5760                                 New_Occurrence_Of (Ret_Obj_Typ, Loc));
5761                        end if;
5762
5763                        --  If the object requires default initialization then
5764                        --  that will happen later following the elaboration of
5765                        --  the object renaming. If we don't turn it off here
5766                        --  then the object will be default initialized twice.
5767
5768                        Set_No_Initialization (Heap_Allocator);
5769                     end if;
5770
5771                     --  Set the flag indicating that the allocator came from
5772                     --  a build-in-place return statement, so we can avoid
5773                     --  adjusting the allocated object. Note that this flag
5774                     --  will be inherited by the copies made below.
5775
5776                     Set_Alloc_For_BIP_Return (Heap_Allocator);
5777
5778                     --  The Pool_Allocator is just like the Heap_Allocator,
5779                     --  except we set Storage_Pool and Procedure_To_Call so
5780                     --  it will use the user-defined storage pool.
5781
5782                     Pool_Allocator :=
5783                       New_Copy_Tree
5784                         (Source           => Heap_Allocator,
5785                          Scopes_In_EWA_OK => True);
5786
5787                     pragma Assert (Alloc_For_BIP_Return (Pool_Allocator));
5788
5789                     --  Do not generate the renaming of the build-in-place
5790                     --  pool parameter on ZFP because the parameter is not
5791                     --  created in the first place.
5792
5793                     if RTE_Available (RE_Root_Storage_Pool_Ptr) then
5794                        Pool_Decl :=
5795                          Make_Object_Renaming_Declaration (Loc,
5796                            Defining_Identifier => Pool_Id,
5797                            Subtype_Mark        =>
5798                              New_Occurrence_Of
5799                                (RTE (RE_Root_Storage_Pool), Loc),
5800                            Name                =>
5801                              Make_Explicit_Dereference (Loc,
5802                                New_Occurrence_Of
5803                                  (Build_In_Place_Formal
5804                                     (Func_Id, BIP_Storage_Pool), Loc)));
5805                        Set_Storage_Pool (Pool_Allocator, Pool_Id);
5806                        Set_Procedure_To_Call
5807                          (Pool_Allocator, RTE (RE_Allocate_Any));
5808                     else
5809                        Pool_Decl := Make_Null_Statement (Loc);
5810                     end if;
5811
5812                     --  If the No_Allocators restriction is active, then only
5813                     --  an allocator for secondary stack allocation is needed.
5814                     --  It's OK for such allocators to have Comes_From_Source
5815                     --  set to False, because gigi knows not to flag them as
5816                     --  being a violation of No_Implicit_Heap_Allocations.
5817
5818                     if Restriction_Active (No_Allocators) then
5819                        SS_Allocator   := Heap_Allocator;
5820                        Heap_Allocator := Make_Null (Loc);
5821                        Pool_Allocator := Make_Null (Loc);
5822
5823                     --  Otherwise the heap and pool allocators may be needed,
5824                     --  so we make another allocator for secondary stack
5825                     --  allocation.
5826
5827                     else
5828                        SS_Allocator :=
5829                          New_Copy_Tree
5830                            (Source           => Heap_Allocator,
5831                             Scopes_In_EWA_OK => True);
5832
5833                        pragma Assert (Alloc_For_BIP_Return (SS_Allocator));
5834
5835                        --  The heap and pool allocators are marked as
5836                        --  Comes_From_Source since they correspond to an
5837                        --  explicit user-written allocator (that is, it will
5838                        --  only be executed on behalf of callers that call the
5839                        --  function as initialization for such an allocator).
5840                        --  Prevents errors when No_Implicit_Heap_Allocations
5841                        --  is in force.
5842
5843                        Set_Comes_From_Source (Heap_Allocator, True);
5844                        Set_Comes_From_Source (Pool_Allocator, True);
5845                     end if;
5846
5847                     --  The allocator is returned on the secondary stack
5848
5849                     Check_Restriction (No_Secondary_Stack, N);
5850                     Set_Storage_Pool (SS_Allocator, RTE (RE_SS_Pool));
5851                     Set_Procedure_To_Call
5852                       (SS_Allocator, RTE (RE_SS_Allocate));
5853
5854                     --  The allocator is returned on the secondary stack,
5855                     --  so indicate that the function return, as well as
5856                     --  all blocks that encloses the allocator, must not
5857                     --  release it. The flags must be set now because
5858                     --  the decision to use the secondary stack is done
5859                     --  very late in the course of expanding the return
5860                     --  statement, past the point where these flags are
5861                     --  normally set.
5862
5863                     Set_Uses_Sec_Stack (Func_Id);
5864                     Set_Uses_Sec_Stack (Return_Statement_Entity (N));
5865                     Set_Sec_Stack_Needed_For_Return
5866                       (Return_Statement_Entity (N));
5867                     Set_Enclosing_Sec_Stack_Return (N);
5868
5869                     --  Guard against poor expansion on the caller side by
5870                     --  using a raise statement to catch out-of-range values
5871                     --  of formal parameter BIP_Alloc_Form.
5872
5873                     if Exceptions_OK then
5874                        Guard_Except :=
5875                          Make_Raise_Program_Error (Loc,
5876                            Reason => PE_Build_In_Place_Mismatch);
5877                     else
5878                        Guard_Except := Make_Null_Statement (Loc);
5879                     end if;
5880
5881                     --  Create an if statement to test the BIP_Alloc_Form
5882                     --  formal and initialize the access object to either the
5883                     --  BIP_Object_Access formal (BIP_Alloc_Form =
5884                     --  Caller_Allocation), the result of allocating the
5885                     --  object in the secondary stack (BIP_Alloc_Form =
5886                     --  Secondary_Stack), or else an allocator to create the
5887                     --  return object in the heap or user-defined pool
5888                     --  (BIP_Alloc_Form = Global_Heap or User_Storage_Pool).
5889
5890                     --  ??? An unchecked type conversion must be made in the
5891                     --  case of assigning the access object formal to the
5892                     --  local access object, because a normal conversion would
5893                     --  be illegal in some cases (such as converting access-
5894                     --  to-unconstrained to access-to-constrained), but the
5895                     --  the unchecked conversion will presumably fail to work
5896                     --  right in just such cases. It's not clear at all how to
5897                     --  handle this. ???
5898
5899                     Alloc_If_Stmt :=
5900                       Make_If_Statement (Loc,
5901                         Condition =>
5902                           Make_Op_Eq (Loc,
5903                             Left_Opnd  =>
5904                               New_Occurrence_Of (Obj_Alloc_Formal, Loc),
5905                             Right_Opnd =>
5906                               Make_Integer_Literal (Loc,
5907                                 UI_From_Int (BIP_Allocation_Form'Pos
5908                                                (Caller_Allocation)))),
5909
5910                         Then_Statements => New_List (
5911                           Make_Assignment_Statement (Loc,
5912                             Name       =>
5913                               New_Occurrence_Of (Alloc_Obj_Id, Loc),
5914                             Expression =>
5915                               Unchecked_Convert_To
5916                                 (Ref_Type,
5917                                  New_Occurrence_Of (Obj_Acc_Formal, Loc)))),
5918
5919                         Elsif_Parts => New_List (
5920                           Make_Elsif_Part (Loc,
5921                             Condition =>
5922                               Make_Op_Eq (Loc,
5923                                 Left_Opnd  =>
5924                                   New_Occurrence_Of (Obj_Alloc_Formal, Loc),
5925                                 Right_Opnd =>
5926                                   Make_Integer_Literal (Loc,
5927                                     UI_From_Int (BIP_Allocation_Form'Pos
5928                                                    (Secondary_Stack)))),
5929
5930                             Then_Statements => New_List (
5931                               Make_Assignment_Statement (Loc,
5932                                 Name       =>
5933                                   New_Occurrence_Of (Alloc_Obj_Id, Loc),
5934                                 Expression => SS_Allocator))),
5935
5936                           Make_Elsif_Part (Loc,
5937                             Condition =>
5938                               Make_Op_Eq (Loc,
5939                                 Left_Opnd  =>
5940                                   New_Occurrence_Of (Obj_Alloc_Formal, Loc),
5941                                 Right_Opnd =>
5942                                   Make_Integer_Literal (Loc,
5943                                     UI_From_Int (BIP_Allocation_Form'Pos
5944                                                    (Global_Heap)))),
5945
5946                             Then_Statements => New_List (
5947                               Build_Heap_Or_Pool_Allocator
5948                                 (Temp_Id    => Alloc_Obj_Id,
5949                                  Temp_Typ   => Ref_Type,
5950                                  Func_Id    => Func_Id,
5951                                  Ret_Typ    => Ret_Obj_Typ,
5952                                  Alloc_Expr => Heap_Allocator))),
5953
5954                           --  ???If all is well, we can put the following
5955                           --  'elsif' in the 'else', but this is a useful
5956                           --  self-check in case caller and callee don't agree
5957                           --  on whether BIPAlloc and so on should be passed.
5958
5959                           Make_Elsif_Part (Loc,
5960                             Condition =>
5961                               Make_Op_Eq (Loc,
5962                                 Left_Opnd  =>
5963                                   New_Occurrence_Of (Obj_Alloc_Formal, Loc),
5964                                 Right_Opnd =>
5965                                   Make_Integer_Literal (Loc,
5966                                     UI_From_Int (BIP_Allocation_Form'Pos
5967                                                    (User_Storage_Pool)))),
5968
5969                             Then_Statements => New_List (
5970                               Pool_Decl,
5971                               Build_Heap_Or_Pool_Allocator
5972                                 (Temp_Id    => Alloc_Obj_Id,
5973                                  Temp_Typ   => Ref_Type,
5974                                  Func_Id    => Func_Id,
5975                                  Ret_Typ    => Ret_Obj_Typ,
5976                                  Alloc_Expr => Pool_Allocator)))),
5977
5978                         --  Raise Program_Error if it's none of the above;
5979                         --  this is a compiler bug.
5980
5981                         Else_Statements => New_List (Guard_Except));
5982
5983                     --  If a separate initialization assignment was created
5984                     --  earlier, append that following the assignment of the
5985                     --  implicit access formal to the access object, to ensure
5986                     --  that the return object is initialized in that case. In
5987                     --  this situation, the target of the assignment must be
5988                     --  rewritten to denote a dereference of the access to the
5989                     --  return object passed in by the caller.
5990
5991                     if Present (Init_Assignment) then
5992                        Rewrite (Name (Init_Assignment),
5993                          Make_Explicit_Dereference (Loc,
5994                            Prefix => New_Occurrence_Of (Alloc_Obj_Id, Loc)));
5995                        pragma Assert
5996                          (Assignment_OK
5997                             (Original_Node (Name (Init_Assignment))));
5998                        Set_Assignment_OK (Name (Init_Assignment));
5999
6000                        Set_Etype (Name (Init_Assignment), Etype (Ret_Obj_Id));
6001
6002                        Append_To
6003                          (Then_Statements (Alloc_If_Stmt), Init_Assignment);
6004                     end if;
6005
6006                     Insert_Before (Ret_Obj_Decl, Alloc_If_Stmt);
6007
6008                     --  Remember the local access object for use in the
6009                     --  dereference of the renaming created below.
6010
6011                     Obj_Acc_Formal := Alloc_Obj_Id;
6012                  end;
6013
6014               --  When the function's subtype is unconstrained and a run-time
6015               --  test is not needed, we nevertheless need to build the return
6016               --  using the function's result subtype.
6017
6018               elsif not Is_Constrained (Underlying_Type (Etype (Func_Id)))
6019               then
6020                  declare
6021                     Alloc_Obj_Id   : Entity_Id;
6022                     Alloc_Obj_Decl : Node_Id;
6023                     Ptr_Type_Decl  : Node_Id;
6024                     Ref_Type       : Entity_Id;
6025
6026                  begin
6027                     --  Create an access type designating the function's
6028                     --  result subtype.
6029
6030                     Ref_Type := Make_Temporary (Loc, 'A');
6031
6032                     Ptr_Type_Decl :=
6033                       Make_Full_Type_Declaration (Loc,
6034                         Defining_Identifier => Ref_Type,
6035                         Type_Definition     =>
6036                           Make_Access_To_Object_Definition (Loc,
6037                             All_Present        => True,
6038                             Subtype_Indication =>
6039                               New_Occurrence_Of (Ret_Obj_Typ, Loc)));
6040
6041                     Insert_Before (Ret_Obj_Decl, Ptr_Type_Decl);
6042
6043                     --  Create an access object initialized to the conversion
6044                     --  of the implicit access value passed in by the caller.
6045
6046                     Alloc_Obj_Id := Make_Temporary (Loc, 'R');
6047                     Set_Etype (Alloc_Obj_Id, Ref_Type);
6048
6049                     --  See the ??? comment a few lines above about the use of
6050                     --  an unchecked conversion here.
6051
6052                     Alloc_Obj_Decl :=
6053                       Make_Object_Declaration (Loc,
6054                         Defining_Identifier => Alloc_Obj_Id,
6055                         Object_Definition   =>
6056                           New_Occurrence_Of (Ref_Type, Loc),
6057                         Expression =>
6058                           Unchecked_Convert_To
6059                             (Ref_Type,
6060                              New_Occurrence_Of (Obj_Acc_Formal, Loc)));
6061
6062                     Insert_Before (Ret_Obj_Decl, Alloc_Obj_Decl);
6063
6064                     --  Remember the local access object for use in the
6065                     --  dereference of the renaming created below.
6066
6067                     Obj_Acc_Formal := Alloc_Obj_Id;
6068                  end;
6069               end if;
6070
6071               --  Replace the return object declaration with a renaming of a
6072               --  dereference of the access value designating the return
6073               --  object.
6074
6075               Obj_Acc_Deref :=
6076                 Make_Explicit_Dereference (Loc,
6077                   Prefix => New_Occurrence_Of (Obj_Acc_Formal, Loc));
6078
6079               Rewrite (Ret_Obj_Decl,
6080                 Make_Object_Renaming_Declaration (Loc,
6081                   Defining_Identifier => Ret_Obj_Id,
6082                   Access_Definition   => Empty,
6083                   Subtype_Mark        => New_Occurrence_Of (Ret_Obj_Typ, Loc),
6084                   Name                => Obj_Acc_Deref));
6085
6086               Set_Renamed_Object (Ret_Obj_Id, Obj_Acc_Deref);
6087            end;
6088         end if;
6089
6090      --  Case where we do not need to build a block. But we're about to drop
6091      --  Return_Object_Declarations on the floor, so assert that it contains
6092      --  only the return object declaration.
6093
6094      else pragma Assert (List_Length (Return_Object_Declarations (N)) = 1);
6095
6096         --  Build simple_return_statement that returns the expression directly
6097
6098         Return_Stmt := Make_Simple_Return_Statement (Loc, Expression => Exp);
6099         Result := Return_Stmt;
6100      end if;
6101
6102      --  Set the flag to prevent infinite recursion
6103
6104      Set_Comes_From_Extended_Return_Statement (Return_Stmt);
6105      Set_Return_Statement (Ret_Obj_Id, Return_Stmt);
6106
6107      Rewrite (N, Result);
6108
6109      --  AI12-043: The checks of 6.5(8.1/3) and 6.5(21/3) are made immediately
6110      --  before an object is returned. A predicate that applies to the return
6111      --  subtype is checked immediately before an object is returned.
6112
6113      --  Suppress access checks to avoid generating extra checks for b-i-p.
6114
6115      Analyze (N, Suppress => Access_Check);
6116   end Expand_N_Extended_Return_Statement;
6117
6118   ----------------------------
6119   -- Expand_N_Function_Call --
6120   ----------------------------
6121
6122   procedure Expand_N_Function_Call (N : Node_Id) is
6123   begin
6124      Expand_Call (N);
6125   end Expand_N_Function_Call;
6126
6127   ---------------------------------------
6128   -- Expand_N_Procedure_Call_Statement --
6129   ---------------------------------------
6130
6131   procedure Expand_N_Procedure_Call_Statement (N : Node_Id) is
6132   begin
6133      Expand_Call (N);
6134   end Expand_N_Procedure_Call_Statement;
6135
6136   ------------------------------------
6137   -- Expand_N_Return_When_Statement --
6138   ------------------------------------
6139
6140   procedure Expand_N_Return_When_Statement (N : Node_Id) is
6141      Loc : constant Source_Ptr := Sloc (N);
6142   begin
6143      Rewrite (N,
6144        Make_If_Statement (Loc,
6145          Condition       => Condition (N),
6146          Then_Statements => New_List (
6147            Make_Simple_Return_Statement (Loc,
6148              Expression => Expression (N)))));
6149
6150      Analyze (N);
6151   end Expand_N_Return_When_Statement;
6152
6153   --------------------------------------
6154   -- Expand_N_Simple_Return_Statement --
6155   --------------------------------------
6156
6157   procedure Expand_N_Simple_Return_Statement (N : Node_Id) is
6158   begin
6159      --  Defend against previous errors (i.e. the return statement calls a
6160      --  function that is not available in configurable runtime).
6161
6162      if Present (Expression (N))
6163        and then Nkind (Expression (N)) = N_Empty
6164      then
6165         Check_Error_Detected;
6166         return;
6167      end if;
6168
6169      --  Distinguish the function and non-function cases:
6170
6171      case Ekind (Return_Applies_To (Return_Statement_Entity (N))) is
6172         when E_Function
6173            | E_Generic_Function
6174         =>
6175            Expand_Simple_Function_Return (N);
6176
6177         when E_Entry
6178            | E_Entry_Family
6179            | E_Generic_Procedure
6180            | E_Procedure
6181            | E_Return_Statement
6182         =>
6183            Expand_Non_Function_Return (N);
6184
6185         when others =>
6186            raise Program_Error;
6187      end case;
6188
6189   exception
6190      when RE_Not_Available =>
6191         return;
6192   end Expand_N_Simple_Return_Statement;
6193
6194   ------------------------------
6195   -- Expand_N_Subprogram_Body --
6196   ------------------------------
6197
6198   --  Add dummy push/pop label nodes at start and end to clear any local
6199   --  exception indications if local-exception-to-goto optimization is active.
6200
6201   --  Add return statement if last statement in body is not a return statement
6202   --  (this makes things easier on Gigi which does not want to have to handle
6203   --  a missing return).
6204
6205   --  Add call to Activate_Tasks if body is a task activator
6206
6207   --  Deal with possible detection of infinite recursion
6208
6209   --  Eliminate body completely if convention stubbed
6210
6211   --  Encode entity names within body, since we will not need to reference
6212   --  these entities any longer in the front end.
6213
6214   --  Initialize scalar out parameters if Initialize/Normalize_Scalars
6215
6216   --  Reset Pure indication if any parameter has root type System.Address
6217   --  or has any parameters of limited types, where limited means that the
6218   --  run-time view is limited (i.e. the full type is limited).
6219
6220   --  Wrap thread body
6221
6222   procedure Expand_N_Subprogram_Body (N : Node_Id) is
6223      Body_Id  : constant Entity_Id  := Defining_Entity (N);
6224      HSS      : constant Node_Id    := Handled_Statement_Sequence (N);
6225      Loc      : constant Source_Ptr := Sloc (N);
6226
6227      procedure Add_Return (Spec_Id : Entity_Id; Stmts : List_Id);
6228      --  Append a return statement to the statement sequence Stmts if the last
6229      --  statement is not already a return or a goto statement. Note that the
6230      --  latter test is not critical, it does not matter if we add a few extra
6231      --  returns, since they get eliminated anyway later on. Spec_Id denotes
6232      --  the corresponding spec of the subprogram body.
6233
6234      ----------------
6235      -- Add_Return --
6236      ----------------
6237
6238      procedure Add_Return (Spec_Id : Entity_Id; Stmts : List_Id) is
6239         Last_Stmt : Node_Id;
6240         Loc       : Source_Ptr;
6241         Stmt      : Node_Id;
6242
6243      begin
6244         --  Get last statement, ignoring any Pop_xxx_Label nodes, which are
6245         --  not relevant in this context since they are not executable.
6246
6247         Last_Stmt := Last (Stmts);
6248         while Nkind (Last_Stmt) in N_Pop_xxx_Label loop
6249            Prev (Last_Stmt);
6250         end loop;
6251
6252         --  Now insert return unless last statement is a transfer
6253
6254         if not Is_Transfer (Last_Stmt) then
6255
6256            --  The source location for the return is the end label of the
6257            --  procedure if present. Otherwise use the sloc of the last
6258            --  statement in the list. If the list comes from a generated
6259            --  exception handler and we are not debugging generated code,
6260            --  all the statements within the handler are made invisible
6261            --  to the debugger.
6262
6263            if Nkind (Parent (Stmts)) = N_Exception_Handler
6264              and then not Comes_From_Source (Parent (Stmts))
6265            then
6266               Loc := Sloc (Last_Stmt);
6267            elsif Present (End_Label (HSS)) then
6268               Loc := Sloc (End_Label (HSS));
6269            else
6270               Loc := Sloc (Last_Stmt);
6271            end if;
6272
6273            --  Append return statement, and set analyzed manually. We can't
6274            --  call Analyze on this return since the scope is wrong.
6275
6276            --  Note: it almost works to push the scope and then do the Analyze
6277            --  call, but something goes wrong in some weird cases and it is
6278            --  not worth worrying about ???
6279
6280            Stmt := Make_Simple_Return_Statement (Loc);
6281
6282            --  The return statement is handled properly, and the call to the
6283            --  postcondition, inserted below, does not require information
6284            --  from the body either. However, that call is analyzed in the
6285            --  enclosing scope, and an elaboration check might improperly be
6286            --  added to it. A guard in Sem_Elab is needed to prevent that
6287            --  spurious check, see Check_Elab_Call.
6288
6289            Append_To (Stmts, Stmt);
6290            Set_Analyzed (Stmt);
6291
6292            --  Call the _Postconditions procedure if the related subprogram
6293            --  has contract assertions that need to be verified on exit.
6294
6295            --  Also, mark the successful return to signal that postconditions
6296            --  need to be evaluated when finalization occurs by setting
6297            --  Return_Success_For_Postcond to be True.
6298
6299            if Ekind (Spec_Id) = E_Procedure
6300              and then Present (Postconditions_Proc (Spec_Id))
6301            then
6302               --  Generate:
6303               --
6304               --    Return_Success_For_Postcond := True;
6305               --    if Postcond_Enabled then
6306               --       _postconditions;
6307               --    end if;
6308
6309               Insert_Action (Stmt,
6310                 Make_Assignment_Statement (Loc,
6311                   Name       =>
6312                     New_Occurrence_Of
6313                       (Get_Return_Success_For_Postcond (Spec_Id), Loc),
6314                   Expression => New_Occurrence_Of (Standard_True, Loc)));
6315
6316               --  Wrap the call to _postconditions within a test of the
6317               --  Postcond_Enabled flag to delay postcondition evaluation
6318               --  until after finalization when required.
6319
6320               Insert_Action (Stmt,
6321                 Make_If_Statement (Loc,
6322                   Condition       =>
6323                     New_Occurrence_Of (Get_Postcond_Enabled (Spec_Id), Loc),
6324                   Then_Statements => New_List (
6325                     Make_Procedure_Call_Statement (Loc,
6326                       Name =>
6327                         New_Occurrence_Of
6328                           (Postconditions_Proc (Spec_Id), Loc)))));
6329            end if;
6330
6331            --  Ada 2022 (AI12-0279): append the call to 'Yield unless this is
6332            --  a generic subprogram (since in such case it will be added to
6333            --  the instantiations).
6334
6335            if Has_Yield_Aspect (Spec_Id)
6336              and then Ekind (Spec_Id) /= E_Generic_Procedure
6337              and then RTE_Available (RE_Yield)
6338            then
6339               Insert_Action (Stmt,
6340                 Make_Procedure_Call_Statement (Loc,
6341                   New_Occurrence_Of (RTE (RE_Yield), Loc)));
6342            end if;
6343         end if;
6344      end Add_Return;
6345
6346      --  Local variables
6347
6348      Except_H : Node_Id;
6349      L        : List_Id;
6350      Spec_Id  : Entity_Id;
6351
6352   --  Start of processing for Expand_N_Subprogram_Body
6353
6354   begin
6355      if Present (Corresponding_Spec (N)) then
6356         Spec_Id := Corresponding_Spec (N);
6357      else
6358         Spec_Id := Body_Id;
6359      end if;
6360
6361      --  If this is a Pure function which has any parameters whose root type
6362      --  is System.Address, reset the Pure indication.
6363      --  This check is also performed when the subprogram is frozen, but we
6364      --  repeat it on the body so that the indication is consistent, and so
6365      --  it applies as well to bodies without separate specifications.
6366
6367      if Is_Pure (Spec_Id)
6368        and then Is_Subprogram (Spec_Id)
6369        and then not Has_Pragma_Pure_Function (Spec_Id)
6370      then
6371         Check_Function_With_Address_Parameter (Spec_Id);
6372
6373         if Spec_Id /= Body_Id then
6374            Set_Is_Pure (Body_Id, Is_Pure (Spec_Id));
6375         end if;
6376      end if;
6377
6378      --  Set L to either the list of declarations if present, or to the list
6379      --  of statements if no declarations are present. This is used to insert
6380      --  new stuff at the start.
6381
6382      if Is_Non_Empty_List (Declarations (N)) then
6383         L := Declarations (N);
6384      else
6385         L := Statements (HSS);
6386      end if;
6387
6388      --  If local-exception-to-goto optimization active, insert dummy push
6389      --  statements at start, and dummy pop statements at end, but inhibit
6390      --  this if we have No_Exception_Handlers, since they are useless and
6391      --  interfere with analysis, e.g. by CodePeer. We also don't need these
6392      --  if we're unnesting subprograms because the only purpose of these
6393      --  nodes is to ensure we don't set a label in one subprogram and branch
6394      --  to it in another.
6395
6396      if (Debug_Flag_Dot_G
6397           or else Restriction_Active (No_Exception_Propagation))
6398        and then not Restriction_Active (No_Exception_Handlers)
6399        and then not CodePeer_Mode
6400        and then not Unnest_Subprogram_Mode
6401        and then Is_Non_Empty_List (L)
6402      then
6403         declare
6404            FS  : constant Node_Id    := First (L);
6405            FL  : constant Source_Ptr := Sloc (FS);
6406            LS  : Node_Id;
6407            LL  : Source_Ptr;
6408
6409         begin
6410            --  LS points to either last statement, if statements are present
6411            --  or to the last declaration if there are no statements present.
6412            --  It is the node after which the pop's are generated.
6413
6414            if Is_Non_Empty_List (Statements (HSS)) then
6415               LS := Last (Statements (HSS));
6416            else
6417               LS := Last (L);
6418            end if;
6419
6420            LL := Sloc (LS);
6421
6422            Insert_List_Before_And_Analyze (FS, New_List (
6423              Make_Push_Constraint_Error_Label (FL),
6424              Make_Push_Program_Error_Label    (FL),
6425              Make_Push_Storage_Error_Label    (FL)));
6426
6427            Insert_List_After_And_Analyze (LS, New_List (
6428              Make_Pop_Constraint_Error_Label  (LL),
6429              Make_Pop_Program_Error_Label     (LL),
6430              Make_Pop_Storage_Error_Label     (LL)));
6431         end;
6432      end if;
6433
6434      --  Initialize any scalar OUT args if Initialize/Normalize_Scalars
6435
6436      if Init_Or_Norm_Scalars and then Is_Subprogram (Spec_Id) then
6437         declare
6438            F : Entity_Id;
6439            A : Node_Id;
6440
6441         begin
6442            --  Loop through formals
6443
6444            F := First_Formal (Spec_Id);
6445            while Present (F) loop
6446               if Is_Scalar_Type (Etype (F))
6447                 and then Ekind (F) = E_Out_Parameter
6448               then
6449                  Check_Restriction (No_Default_Initialization, F);
6450
6451                  --  Insert the initialization. We turn off validity checks
6452                  --  for this assignment, since we do not want any check on
6453                  --  the initial value itself (which may well be invalid).
6454                  --  Predicate checks are disabled as well (RM 6.4.1 (13/3))
6455
6456                  A :=
6457                    Make_Assignment_Statement (Loc,
6458                      Name       => New_Occurrence_Of (F, Loc),
6459                      Expression => Get_Simple_Init_Val (Etype (F), N));
6460                  Set_Suppress_Assignment_Checks (A);
6461
6462                  Insert_Before_And_Analyze (First (L),
6463                    A, Suppress => Validity_Check);
6464               end if;
6465
6466               Next_Formal (F);
6467            end loop;
6468         end;
6469      end if;
6470
6471      --  Clear out statement list for stubbed procedure
6472
6473      if Present (Corresponding_Spec (N)) then
6474         Set_Elaboration_Flag (N, Spec_Id);
6475
6476         if Convention (Spec_Id) = Convention_Stubbed
6477           or else Is_Eliminated (Spec_Id)
6478         then
6479            Set_Declarations (N, Empty_List);
6480            Set_Handled_Statement_Sequence (N,
6481              Make_Handled_Sequence_Of_Statements (Loc,
6482                Statements => New_List (Make_Null_Statement (Loc))));
6483
6484            return;
6485         end if;
6486      end if;
6487
6488      --  Create a set of discriminals for the next protected subprogram body
6489
6490      if Is_List_Member (N)
6491        and then Present (Parent (List_Containing (N)))
6492        and then Nkind (Parent (List_Containing (N))) = N_Protected_Body
6493        and then Present (Next_Protected_Operation (N))
6494      then
6495         Set_Discriminals (Parent (Base_Type (Scope (Spec_Id))));
6496      end if;
6497
6498      --  Returns_By_Ref flag is normally set when the subprogram is frozen but
6499      --  subprograms with no specs are not frozen.
6500
6501      Compute_Returns_By_Ref (Spec_Id);
6502
6503      --  For a procedure, we add a return for all possible syntactic ends of
6504      --  the subprogram.
6505
6506      if Ekind (Spec_Id) in E_Procedure | E_Generic_Procedure then
6507         Add_Return (Spec_Id, Statements (HSS));
6508
6509         if Present (Exception_Handlers (HSS)) then
6510            Except_H := First_Non_Pragma (Exception_Handlers (HSS));
6511            while Present (Except_H) loop
6512               Add_Return (Spec_Id, Statements (Except_H));
6513               Next_Non_Pragma (Except_H);
6514            end loop;
6515         end if;
6516
6517      --  For a function, we must deal with the case where there is at least
6518      --  one missing return. What we do is to wrap the entire body of the
6519      --  function in a block:
6520
6521      --    begin
6522      --      ...
6523      --    end;
6524
6525      --  becomes
6526
6527      --    begin
6528      --       begin
6529      --          ...
6530      --       end;
6531
6532      --       raise Program_Error;
6533      --    end;
6534
6535      --  This approach is necessary because the raise must be signalled to the
6536      --  caller, not handled by any local handler (RM 6.4(11)).
6537
6538      --  Note: we do not need to analyze the constructed sequence here, since
6539      --  it has no handler, and an attempt to analyze the handled statement
6540      --  sequence twice is risky in various ways (e.g. the issue of expanding
6541      --  cleanup actions twice).
6542
6543      elsif Has_Missing_Return (Spec_Id) then
6544         declare
6545            Hloc : constant Source_Ptr := Sloc (HSS);
6546            Blok : constant Node_Id    :=
6547                     Make_Block_Statement (Hloc,
6548                       Handled_Statement_Sequence => HSS);
6549            Rais : constant Node_Id    :=
6550                     Make_Raise_Program_Error (Hloc,
6551                       Reason => PE_Missing_Return);
6552
6553         begin
6554            Set_Handled_Statement_Sequence (N,
6555              Make_Handled_Sequence_Of_Statements (Hloc,
6556                Statements => New_List (Blok, Rais)));
6557
6558            Push_Scope (Spec_Id);
6559            Analyze (Blok);
6560            Analyze (Rais);
6561            Pop_Scope;
6562         end;
6563      end if;
6564
6565      --  If subprogram contains a parameterless recursive call, then we may
6566      --  have an infinite recursion, so see if we can generate code to check
6567      --  for this possibility if storage checks are not suppressed.
6568
6569      if Ekind (Spec_Id) = E_Procedure
6570        and then Has_Recursive_Call (Spec_Id)
6571        and then not Storage_Checks_Suppressed (Spec_Id)
6572      then
6573         Detect_Infinite_Recursion (N, Spec_Id);
6574      end if;
6575
6576      --  Set to encode entity names in package body before gigi is called
6577
6578      Qualify_Entity_Names (N);
6579
6580      --  If the body belongs to a nonabstract library-level source primitive
6581      --  of a tagged type, install an elaboration check which ensures that a
6582      --  dispatching call targeting the primitive will not execute the body
6583      --  without it being previously elaborated.
6584
6585      Install_Primitive_Elaboration_Check (N);
6586   end Expand_N_Subprogram_Body;
6587
6588   -----------------------------------
6589   -- Expand_N_Subprogram_Body_Stub --
6590   -----------------------------------
6591
6592   procedure Expand_N_Subprogram_Body_Stub (N : Node_Id) is
6593      Bod : Node_Id;
6594
6595   begin
6596      if Present (Corresponding_Body (N)) then
6597         Bod := Unit_Declaration_Node (Corresponding_Body (N));
6598
6599         --  The body may have been expanded already when it is analyzed
6600         --  through the subunit node. Do no expand again: it interferes
6601         --  with the construction of unnesting tables when generating C.
6602
6603         if not Analyzed (Bod) then
6604            Expand_N_Subprogram_Body (Bod);
6605         end if;
6606
6607         --  Add full qualification to entities that may be created late
6608         --  during unnesting.
6609
6610         Qualify_Entity_Names (N);
6611      end if;
6612   end Expand_N_Subprogram_Body_Stub;
6613
6614   -------------------------------------
6615   -- Expand_N_Subprogram_Declaration --
6616   -------------------------------------
6617
6618   --  If the declaration appears within a protected body, it is a private
6619   --  operation of the protected type. We must create the corresponding
6620   --  protected subprogram an associated formals. For a normal protected
6621   --  operation, this is done when expanding the protected type declaration.
6622
6623   --  If the declaration is for a null procedure, emit null body
6624
6625   procedure Expand_N_Subprogram_Declaration (N : Node_Id) is
6626      Loc  : constant Source_Ptr := Sloc (N);
6627      Subp : constant Entity_Id  := Defining_Entity (N);
6628
6629      --  Local variables
6630
6631      Scop      : constant Entity_Id  := Scope (Subp);
6632      Prot_Bod  : Node_Id;
6633      Prot_Decl : Node_Id;
6634      Prot_Id   : Entity_Id;
6635      Typ       : Entity_Id;
6636
6637   begin
6638      --  Deal with case of protected subprogram. Do not generate protected
6639      --  operation if operation is flagged as eliminated.
6640
6641      if Is_List_Member (N)
6642        and then Present (Parent (List_Containing (N)))
6643        and then Nkind (Parent (List_Containing (N))) = N_Protected_Body
6644        and then Is_Protected_Type (Scop)
6645      then
6646         if No (Protected_Body_Subprogram (Subp))
6647           and then not Is_Eliminated (Subp)
6648         then
6649            Prot_Decl :=
6650              Make_Subprogram_Declaration (Loc,
6651                Specification =>
6652                  Build_Protected_Sub_Specification
6653                    (N, Scop, Unprotected_Mode));
6654
6655            --  The protected subprogram is declared outside of the protected
6656            --  body. Given that the body has frozen all entities so far, we
6657            --  analyze the subprogram and perform freezing actions explicitly.
6658            --  including the generation of an explicit freeze node, to ensure
6659            --  that gigi has the proper order of elaboration.
6660            --  If the body is a subunit, the insertion point is before the
6661            --  stub in the parent.
6662
6663            Prot_Bod := Parent (List_Containing (N));
6664
6665            if Nkind (Parent (Prot_Bod)) = N_Subunit then
6666               Prot_Bod := Corresponding_Stub (Parent (Prot_Bod));
6667            end if;
6668
6669            Insert_Before (Prot_Bod, Prot_Decl);
6670            Prot_Id := Defining_Unit_Name (Specification (Prot_Decl));
6671            Set_Has_Delayed_Freeze (Prot_Id);
6672
6673            Push_Scope (Scope (Scop));
6674            Analyze (Prot_Decl);
6675            Freeze_Before (N, Prot_Id);
6676            Set_Protected_Body_Subprogram (Subp, Prot_Id);
6677            Pop_Scope;
6678         end if;
6679
6680      --  Ada 2005 (AI-348): Generate body for a null procedure. In most
6681      --  cases this is superfluous because calls to it will be automatically
6682      --  inlined, but we definitely need the body if preconditions for the
6683      --  procedure are present, or if performing coverage analysis.
6684
6685      elsif Nkind (Specification (N)) = N_Procedure_Specification
6686        and then Null_Present (Specification (N))
6687      then
6688         declare
6689            Bod : constant Node_Id := Body_To_Inline (N);
6690
6691         begin
6692            Set_Has_Completion (Subp, False);
6693            Append_Freeze_Action (Subp, Bod);
6694
6695            --  The body now contains raise statements, so calls to it will
6696            --  not be inlined.
6697
6698            Set_Is_Inlined (Subp, False);
6699         end;
6700      end if;
6701
6702      --  When generating C code, transform a function that returns a
6703      --  constrained array type into a procedure with an out parameter
6704      --  that carries the return value.
6705
6706      --  We skip this transformation for unchecked conversions, since they
6707      --  are not needed by the C generator (and this also produces cleaner
6708      --  output).
6709
6710      Typ := Get_Fullest_View (Etype (Subp));
6711
6712      if Transform_Function_Array
6713        and then Nkind (Specification (N)) = N_Function_Specification
6714        and then Is_Array_Type (Typ)
6715        and then Is_Constrained (Typ)
6716        and then not Is_Unchecked_Conversion_Instance (Subp)
6717      then
6718         Build_Procedure_Form (N);
6719      end if;
6720   end Expand_N_Subprogram_Declaration;
6721
6722   --------------------------------
6723   -- Expand_Non_Function_Return --
6724   --------------------------------
6725
6726   procedure Expand_Non_Function_Return (N : Node_Id) is
6727      pragma Assert (No (Expression (N)));
6728
6729      Loc       : constant Source_Ptr := Sloc (N);
6730      Scope_Id  : Entity_Id := Return_Applies_To (Return_Statement_Entity (N));
6731      Kind      : constant Entity_Kind := Ekind (Scope_Id);
6732      Call      : Node_Id;
6733      Acc_Stat  : Node_Id;
6734      Goto_Stat : Node_Id;
6735      Lab_Node  : Node_Id;
6736
6737   begin
6738      --  Call the _Postconditions procedure if the related subprogram has
6739      --  contract assertions that need to be verified on exit.
6740
6741      --  Also, mark the successful return to signal that postconditions need
6742      --  to be evaluated when finalization occurs.
6743
6744      if Ekind (Scope_Id) in E_Entry | E_Entry_Family | E_Procedure
6745        and then Present (Postconditions_Proc (Scope_Id))
6746      then
6747         --  Generate:
6748         --
6749         --    Return_Success_For_Postcond := True;
6750         --    if Postcond_Enabled then
6751         --       _postconditions;
6752         --    end if;
6753
6754         Insert_Action (N,
6755           Make_Assignment_Statement (Loc,
6756             Name       =>
6757               New_Occurrence_Of
6758                (Get_Return_Success_For_Postcond (Scope_Id), Loc),
6759             Expression => New_Occurrence_Of (Standard_True, Loc)));
6760
6761         --  Wrap the call to _postconditions within a test of the
6762         --  Postcond_Enabled flag to delay postcondition evaluation until
6763         --  after finalization when required.
6764
6765         Insert_Action (N,
6766           Make_If_Statement (Loc,
6767             Condition       =>
6768               New_Occurrence_Of (Get_Postcond_Enabled (Scope_Id), Loc),
6769             Then_Statements => New_List (
6770               Make_Procedure_Call_Statement (Loc,
6771                 Name =>
6772                   New_Occurrence_Of
6773                     (Postconditions_Proc (Scope_Id), Loc)))));
6774      end if;
6775
6776      --  Ada 2022 (AI12-0279)
6777
6778      if Has_Yield_Aspect (Scope_Id)
6779        and then RTE_Available (RE_Yield)
6780      then
6781         Insert_Action (N,
6782           Make_Procedure_Call_Statement (Loc,
6783             New_Occurrence_Of (RTE (RE_Yield), Loc)));
6784      end if;
6785
6786      --  If it is a return from a procedure do no extra steps
6787
6788      if Kind = E_Procedure or else Kind = E_Generic_Procedure then
6789         return;
6790
6791      --  If it is a nested return within an extended one, replace it with a
6792      --  return of the previously declared return object.
6793
6794      elsif Kind = E_Return_Statement then
6795         Rewrite (N,
6796           Make_Simple_Return_Statement (Loc,
6797             Expression =>
6798               New_Occurrence_Of (First_Entity (Scope_Id), Loc)));
6799         Set_Comes_From_Extended_Return_Statement (N);
6800         Set_Return_Statement_Entity (N, Scope_Id);
6801         Expand_Simple_Function_Return (N);
6802         return;
6803      end if;
6804
6805      pragma Assert (Is_Entry (Scope_Id));
6806
6807      --  Look at the enclosing block to see whether the return is from an
6808      --  accept statement or an entry body.
6809
6810      for J in reverse 0 .. Scope_Stack.Last loop
6811         Scope_Id := Scope_Stack.Table (J).Entity;
6812         exit when Is_Concurrent_Type (Scope_Id);
6813      end loop;
6814
6815      --  If it is a return from accept statement it is expanded as call to
6816      --  RTS Complete_Rendezvous and a goto to the end of the accept body.
6817
6818      --  (cf : Expand_N_Accept_Statement, Expand_N_Selective_Accept,
6819      --  Expand_N_Accept_Alternative in exp_ch9.adb)
6820
6821      if Is_Task_Type (Scope_Id) then
6822
6823         Call :=
6824           Make_Procedure_Call_Statement (Loc,
6825             Name => New_Occurrence_Of (RTE (RE_Complete_Rendezvous), Loc));
6826         Insert_Before (N, Call);
6827         --  why not insert actions here???
6828         Analyze (Call);
6829
6830         Acc_Stat := Parent (N);
6831         while Nkind (Acc_Stat) /= N_Accept_Statement loop
6832            Acc_Stat := Parent (Acc_Stat);
6833         end loop;
6834
6835         Lab_Node := Last (Statements
6836           (Handled_Statement_Sequence (Acc_Stat)));
6837
6838         Goto_Stat := Make_Goto_Statement (Loc,
6839           Name => New_Occurrence_Of
6840             (Entity (Identifier (Lab_Node)), Loc));
6841
6842         Set_Analyzed (Goto_Stat);
6843
6844         Rewrite (N, Goto_Stat);
6845         Analyze (N);
6846
6847      --  If it is a return from an entry body, put a Complete_Entry_Body call
6848      --  in front of the return.
6849
6850      elsif Is_Protected_Type (Scope_Id) then
6851         Call :=
6852           Make_Procedure_Call_Statement (Loc,
6853             Name =>
6854               New_Occurrence_Of (RTE (RE_Complete_Entry_Body), Loc),
6855             Parameter_Associations => New_List (
6856               Make_Attribute_Reference (Loc,
6857                 Prefix         =>
6858                   New_Occurrence_Of
6859                     (Find_Protection_Object (Current_Scope), Loc),
6860                 Attribute_Name => Name_Unchecked_Access)));
6861
6862         Insert_Before (N, Call);
6863         Analyze (Call);
6864      end if;
6865   end Expand_Non_Function_Return;
6866
6867   ---------------------------------------
6868   -- Expand_Protected_Object_Reference --
6869   ---------------------------------------
6870
6871   function Expand_Protected_Object_Reference
6872     (N    : Node_Id;
6873      Scop : Entity_Id) return Node_Id
6874   is
6875      Loc   : constant Source_Ptr := Sloc (N);
6876      Corr  : Entity_Id;
6877      Rec   : Node_Id;
6878      Param : Entity_Id;
6879      Proc  : Entity_Id;
6880
6881   begin
6882      Rec := Make_Identifier (Loc, Name_uObject);
6883      Set_Etype (Rec, Corresponding_Record_Type (Scop));
6884
6885      --  Find enclosing protected operation, and retrieve its first parameter,
6886      --  which denotes the enclosing protected object. If the enclosing
6887      --  operation is an entry, we are immediately within the protected body,
6888      --  and we can retrieve the object from the service entries procedure. A
6889      --  barrier function has the same signature as an entry. A barrier
6890      --  function is compiled within the protected object, but unlike
6891      --  protected operations its never needs locks, so that its protected
6892      --  body subprogram points to itself.
6893
6894      Proc := Current_Scope;
6895      while Present (Proc)
6896        and then Scope (Proc) /= Scop
6897      loop
6898         Proc := Scope (Proc);
6899      end loop;
6900
6901      Corr := Protected_Body_Subprogram (Proc);
6902
6903      if No (Corr) then
6904
6905         --  Previous error left expansion incomplete.
6906         --  Nothing to do on this call.
6907
6908         return Empty;
6909      end if;
6910
6911      Param :=
6912        Defining_Identifier
6913          (First (Parameter_Specifications (Parent (Corr))));
6914
6915      if Is_Subprogram (Proc) and then Proc /= Corr then
6916
6917         --  Protected function or procedure
6918
6919         Set_Entity (Rec, Param);
6920
6921         --  Rec is a reference to an entity which will not be in scope when
6922         --  the call is reanalyzed, and needs no further analysis.
6923
6924         Set_Analyzed (Rec);
6925
6926      else
6927         --  Entry or barrier function for entry body. The first parameter of
6928         --  the entry body procedure is pointer to the object. We create a
6929         --  local variable of the proper type, duplicating what is done to
6930         --  define _object later on.
6931
6932         declare
6933            Decls   : List_Id;
6934            Obj_Ptr : constant Entity_Id := Make_Temporary (Loc, 'T');
6935
6936         begin
6937            Decls := New_List (
6938              Make_Full_Type_Declaration (Loc,
6939                Defining_Identifier => Obj_Ptr,
6940                  Type_Definition   =>
6941                     Make_Access_To_Object_Definition (Loc,
6942                       Subtype_Indication =>
6943                         New_Occurrence_Of
6944                           (Corresponding_Record_Type (Scop), Loc))));
6945
6946            Insert_Actions (N, Decls);
6947            Freeze_Before (N, Obj_Ptr);
6948
6949            Rec :=
6950              Make_Explicit_Dereference (Loc,
6951                Prefix =>
6952                  Unchecked_Convert_To (Obj_Ptr,
6953                    New_Occurrence_Of (Param, Loc)));
6954
6955            --  Analyze new actual. Other actuals in calls are already analyzed
6956            --  and the list of actuals is not reanalyzed after rewriting.
6957
6958            Set_Parent (Rec, N);
6959            Analyze (Rec);
6960         end;
6961      end if;
6962
6963      return Rec;
6964   end Expand_Protected_Object_Reference;
6965
6966   --------------------------------------
6967   -- Expand_Protected_Subprogram_Call --
6968   --------------------------------------
6969
6970   procedure Expand_Protected_Subprogram_Call
6971     (N    : Node_Id;
6972      Subp : Entity_Id;
6973      Scop : Entity_Id)
6974   is
6975      Rec : Node_Id;
6976
6977      procedure Expand_Internal_Init_Call;
6978      --  A call to an operation of the type may occur in the initialization
6979      --  of a private component. In that case the prefix of the call is an
6980      --  entity name and the call is treated as internal even though it
6981      --  appears in code outside of the protected type.
6982
6983      procedure Freeze_Called_Function;
6984      --  If it is a function call it can appear in elaboration code and
6985      --  the called entity must be frozen before the call. This must be
6986      --  done before the call is expanded, as the expansion may rewrite it
6987      --  to something other than a call (e.g. a temporary initialized in a
6988      --  transient block).
6989
6990      -------------------------------
6991      -- Expand_Internal_Init_Call --
6992      -------------------------------
6993
6994      procedure Expand_Internal_Init_Call is
6995      begin
6996         --  If the context is a protected object (rather than a protected
6997         --  type) the call itself is bound to raise program_error because
6998         --  the protected body will not have been elaborated yet. This is
6999         --  diagnosed subsequently in Sem_Elab.
7000
7001         Freeze_Called_Function;
7002
7003         --  The target of the internal call is the first formal of the
7004         --  enclosing initialization procedure.
7005
7006         Rec := New_Occurrence_Of (First_Formal (Current_Scope), Sloc (N));
7007         Build_Protected_Subprogram_Call (N,
7008           Name     => Name (N),
7009           Rec      => Rec,
7010           External => False);
7011         Analyze (N);
7012         Resolve (N, Etype (Subp));
7013      end Expand_Internal_Init_Call;
7014
7015      ----------------------------
7016      -- Freeze_Called_Function --
7017      ----------------------------
7018
7019      procedure Freeze_Called_Function is
7020      begin
7021         if Ekind (Subp) = E_Function then
7022            Freeze_Expression (Name (N));
7023         end if;
7024      end Freeze_Called_Function;
7025
7026   --  Start of processing for Expand_Protected_Subprogram_Call
7027
7028   begin
7029      --  If the protected object is not an enclosing scope, this is an inter-
7030      --  object function call. Inter-object procedure calls are expanded by
7031      --  Exp_Ch9.Build_Simple_Entry_Call. The call is intra-object only if the
7032      --  subprogram being called is in the protected body being compiled, and
7033      --  if the protected object in the call is statically the enclosing type.
7034      --  The object may be a component of some other data structure, in which
7035      --  case this must be handled as an inter-object call.
7036
7037      if not In_Open_Scopes (Scop)
7038        or else Is_Entry_Wrapper (Current_Scope)
7039        or else not Is_Entity_Name (Name (N))
7040      then
7041         if Nkind (Name (N)) = N_Selected_Component then
7042            Rec := Prefix (Name (N));
7043
7044         elsif Nkind (Name (N)) = N_Indexed_Component then
7045            Rec := Prefix (Prefix (Name (N)));
7046
7047         --  If this is a call within an entry wrapper, it appears within a
7048         --  precondition that calls another primitive of the synchronized
7049         --  type. The target object of the call is the first actual on the
7050         --  wrapper. Note that this is an external call, because the wrapper
7051         --  is called outside of the synchronized object. This means that
7052         --  an entry call to an entry with preconditions involves two
7053         --  synchronized operations.
7054
7055         elsif Ekind (Current_Scope) = E_Procedure
7056           and then Is_Entry_Wrapper (Current_Scope)
7057         then
7058            Rec := New_Occurrence_Of (First_Entity (Current_Scope), Sloc (N));
7059
7060         --  A default parameter of a protected operation may be a call to
7061         --  a protected function of the type. This appears as an internal
7062         --  call in the profile of the operation, but if the context is an
7063         --  external call we must convert the call into an external one,
7064         --  using the protected object that is the target, so that:
7065
7066         --     Prot.P (F)
7067         --  is transformed into
7068         --     Prot.P (Prot.F)
7069
7070         elsif Nkind (Parent (N)) = N_Procedure_Call_Statement
7071           and then Nkind (Name (Parent (N))) = N_Selected_Component
7072           and then Is_Protected_Type (Etype (Prefix (Name (Parent (N)))))
7073           and then Is_Entity_Name (Name (N))
7074           and then Scope (Entity (Name (N))) =
7075                      Etype (Prefix (Name (Parent (N))))
7076         then
7077            Rewrite (Name (N),
7078              Make_Selected_Component (Sloc (N),
7079                Prefix        => New_Copy_Tree (Prefix (Name (Parent (N)))),
7080                Selector_Name => Relocate_Node (Name (N))));
7081
7082            Analyze_And_Resolve (N);
7083            return;
7084
7085         else
7086            --  If the context is the initialization procedure for a protected
7087            --  type, the call is legal because the called entity must be a
7088            --  function of that enclosing type, and this is treated as an
7089            --  internal call.
7090
7091            pragma Assert
7092              (Is_Entity_Name (Name (N)) and then Inside_Init_Proc);
7093
7094            Expand_Internal_Init_Call;
7095            return;
7096         end if;
7097
7098         Freeze_Called_Function;
7099         Build_Protected_Subprogram_Call (N,
7100           Name     => New_Occurrence_Of (Subp, Sloc (N)),
7101           Rec      => Convert_Concurrent (Rec, Etype (Rec)),
7102           External => True);
7103
7104      else
7105         Rec := Expand_Protected_Object_Reference (N, Scop);
7106
7107         if No (Rec) then
7108            return;
7109         end if;
7110
7111         Freeze_Called_Function;
7112         Build_Protected_Subprogram_Call (N,
7113           Name     => Name (N),
7114           Rec      => Rec,
7115           External => False);
7116      end if;
7117
7118      --  Analyze and resolve the new call. The actuals have already been
7119      --  resolved, but expansion of a function call will add extra actuals
7120      --  if needed. Analysis of a procedure call already includes resolution.
7121
7122      Analyze (N);
7123
7124      if Ekind (Subp) = E_Function then
7125         Resolve (N, Etype (Subp));
7126      end if;
7127   end Expand_Protected_Subprogram_Call;
7128
7129   -----------------------------------
7130   -- Expand_Simple_Function_Return --
7131   -----------------------------------
7132
7133   --  The "simple" comes from the syntax rule simple_return_statement. The
7134   --  semantics are not at all simple.
7135
7136   procedure Expand_Simple_Function_Return (N : Node_Id) is
7137      Loc : constant Source_Ptr := Sloc (N);
7138
7139      Scope_Id : constant Entity_Id :=
7140                   Return_Applies_To (Return_Statement_Entity (N));
7141      --  The function we are returning from
7142
7143      R_Type : constant Entity_Id := Etype (Scope_Id);
7144      --  The result type of the function
7145
7146      Utyp : constant Entity_Id := Underlying_Type (R_Type);
7147
7148      Exp : Node_Id := Expression (N);
7149      pragma Assert (Present (Exp));
7150
7151      Exp_Is_Function_Call : constant Boolean :=
7152        Nkind (Exp) = N_Function_Call
7153          or else (Nkind (Exp) = N_Explicit_Dereference
7154                   and then Is_Entity_Name (Prefix (Exp))
7155                   and then Ekind (Entity (Prefix (Exp))) = E_Constant
7156                   and then Is_Related_To_Func_Return (Entity (Prefix (Exp))));
7157
7158      Exp_Typ : constant Entity_Id := Etype (Exp);
7159      --  The type of the expression (not necessarily the same as R_Type)
7160
7161      Subtype_Ind : Node_Id;
7162      --  If the result type of the function is class-wide and the expression
7163      --  has a specific type, then we use the expression's type as the type of
7164      --  the return object. In cases where the expression is an aggregate that
7165      --  is built in place, this avoids the need for an expensive conversion
7166      --  of the return object to the specific type on assignments to the
7167      --  individual components.
7168
7169   --  Start of processing for Expand_Simple_Function_Return
7170
7171   begin
7172      if Is_Class_Wide_Type (R_Type)
7173        and then not Is_Class_Wide_Type (Exp_Typ)
7174        and then Nkind (Exp) /= N_Type_Conversion
7175      then
7176         Subtype_Ind := New_Occurrence_Of (Exp_Typ, Loc);
7177      else
7178         Subtype_Ind := New_Occurrence_Of (R_Type, Loc);
7179
7180         --  If the result type is class-wide and the expression is a view
7181         --  conversion, the conversion plays no role in the expansion because
7182         --  it does not modify the tag of the object. Remove the conversion
7183         --  altogether to prevent tag overwriting.
7184
7185         if Is_Class_Wide_Type (R_Type)
7186           and then not Is_Class_Wide_Type (Exp_Typ)
7187           and then Nkind (Exp) = N_Type_Conversion
7188         then
7189            Exp := Expression (Exp);
7190         end if;
7191      end if;
7192
7193      --  Assert that if F says "return G(...);"
7194      --  then F and G are both b-i-p, or neither b-i-p.
7195
7196      if Nkind (Exp) = N_Function_Call then
7197         pragma Assert (Ekind (Scope_Id) = E_Function);
7198         pragma Assert
7199           (Is_Build_In_Place_Function (Scope_Id) =
7200            Is_Build_In_Place_Function_Call (Exp));
7201         null;
7202      end if;
7203
7204      --  For the case of a simple return that does not come from an
7205      --  extended return, in the case of build-in-place, we rewrite
7206      --  "return <expression>;" to be:
7207
7208      --    return _anon_ : <return_subtype> := <expression>
7209
7210      --  The expansion produced by Expand_N_Extended_Return_Statement will
7211      --  contain simple return statements (for example, a block containing
7212      --  simple return of the return object), which brings us back here with
7213      --  Comes_From_Extended_Return_Statement set. The reason for the barrier
7214      --  checking for a simple return that does not come from an extended
7215      --  return is to avoid this infinite recursion.
7216
7217      --  The reason for this design is that for Ada 2005 limited returns, we
7218      --  need to reify the return object, so we can build it "in place", and
7219      --  we need a block statement to hang finalization and tasking stuff.
7220
7221      --  ??? In order to avoid disruption, we avoid translating to extended
7222      --  return except in the cases where we really need to (Ada 2005 for
7223      --  inherently limited). We might prefer to do this translation in all
7224      --  cases (except perhaps for the case of Ada 95 inherently limited),
7225      --  in order to fully exercise the Expand_N_Extended_Return_Statement
7226      --  code. This would also allow us to do the build-in-place optimization
7227      --  for efficiency even in cases where it is semantically not required.
7228
7229      --  As before, we check the type of the return expression rather than the
7230      --  return type of the function, because the latter may be a limited
7231      --  class-wide interface type, which is not a limited type, even though
7232      --  the type of the expression may be.
7233
7234      pragma Assert
7235        (Comes_From_Extended_Return_Statement (N)
7236          or else not Is_Build_In_Place_Function_Call (Exp)
7237          or else Is_Build_In_Place_Function (Scope_Id));
7238
7239      if not Comes_From_Extended_Return_Statement (N)
7240        and then Is_Build_In_Place_Function (Scope_Id)
7241        and then not Debug_Flag_Dot_L
7242
7243         --  The functionality of interface thunks is simple and it is always
7244         --  handled by means of simple return statements. This leaves their
7245         --  expansion simple and clean.
7246
7247        and then not Is_Thunk (Scope_Id)
7248      then
7249         declare
7250            Return_Object_Entity : constant Entity_Id :=
7251                                     Make_Temporary (Loc, 'R', Exp);
7252
7253            Obj_Decl : constant Node_Id :=
7254                         Make_Object_Declaration (Loc,
7255                           Defining_Identifier => Return_Object_Entity,
7256                           Object_Definition   => Subtype_Ind,
7257                           Expression          => Exp);
7258
7259            Ext : constant Node_Id :=
7260                    Make_Extended_Return_Statement (Loc,
7261                      Return_Object_Declarations => New_List (Obj_Decl));
7262            --  Do not perform this high-level optimization if the result type
7263            --  is an interface because the "this" pointer must be displaced.
7264
7265         begin
7266            Rewrite (N, Ext);
7267            Analyze (N);
7268            return;
7269         end;
7270      end if;
7271
7272      --  Here we have a simple return statement that is part of the expansion
7273      --  of an extended return statement (either written by the user, or
7274      --  generated by the above code).
7275
7276      --  Always normalize C/Fortran boolean result. This is not always needed,
7277      --  but it seems a good idea to minimize the passing around of non-
7278      --  normalized values, and in any case this handles the processing of
7279      --  barrier functions for protected types, which turn the condition into
7280      --  a return statement.
7281
7282      if Is_Boolean_Type (Exp_Typ) and then Nonzero_Is_True (Exp_Typ) then
7283         Adjust_Condition (Exp);
7284         Adjust_Result_Type (Exp, Exp_Typ);
7285      end if;
7286
7287      --  Do validity check if enabled for returns
7288
7289      if Validity_Checks_On and then Validity_Check_Returns then
7290         Ensure_Valid (Exp);
7291      end if;
7292
7293      --  Check the result expression of a scalar function against the subtype
7294      --  of the function by inserting a conversion. This conversion must
7295      --  eventually be performed for other classes of types, but for now it's
7296      --  only done for scalars ???
7297
7298      if Is_Scalar_Type (Exp_Typ) and then Exp_Typ /= R_Type then
7299         Rewrite (Exp, Convert_To (R_Type, Exp));
7300
7301         --  The expression is resolved to ensure that the conversion gets
7302         --  expanded to generate a possible constraint check.
7303
7304         Analyze_And_Resolve (Exp, R_Type);
7305      end if;
7306
7307      --  Deal with returning variable length objects and controlled types
7308
7309      --  Nothing to do if we are returning by reference, or this is not a
7310      --  type that requires special processing (indicated by the fact that
7311      --  it requires a cleanup scope for the secondary stack case).
7312
7313      if Is_Build_In_Place_Function (Scope_Id)
7314        or else Is_Limited_Interface (Exp_Typ)
7315      then
7316         null;
7317
7318      --  No copy needed for thunks returning interface type objects since
7319      --  the object is returned by reference and the maximum functionality
7320      --  required is just to displace the pointer.
7321
7322      elsif Is_Thunk (Scope_Id) and then Is_Interface (Exp_Typ) then
7323         null;
7324
7325      --  If the call is within a thunk and the type is a limited view, the
7326      --  backend will eventually see the non-limited view of the type.
7327
7328      elsif Is_Thunk (Scope_Id) and then Is_Incomplete_Type (Exp_Typ) then
7329         return;
7330
7331      --  A return statement from an ignored Ghost function does not use the
7332      --  secondary stack (or any other one).
7333
7334      elsif not Requires_Transient_Scope (R_Type)
7335        or else Is_Ignored_Ghost_Entity (Scope_Id)
7336      then
7337
7338         --  Mutable records with variable-length components are not returned
7339         --  on the sec-stack, so we need to make sure that the back end will
7340         --  only copy back the size of the actual value, and not the maximum
7341         --  size. We create an actual subtype for this purpose. However we
7342         --  need not do it if the expression is a function call since this
7343         --  will be done in the called function and doing it here too would
7344         --  cause a temporary with maximum size to be created.
7345
7346         declare
7347            Ubt  : constant Entity_Id := Underlying_Type (Base_Type (Exp_Typ));
7348            Decl : Node_Id;
7349            Ent  : Entity_Id;
7350         begin
7351            if not Exp_Is_Function_Call
7352              and then Has_Discriminants (Ubt)
7353              and then not Is_Constrained (Ubt)
7354              and then not Has_Unchecked_Union (Ubt)
7355            then
7356               Decl := Build_Actual_Subtype (Ubt, Exp);
7357               Ent := Defining_Identifier (Decl);
7358               Insert_Action (Exp, Decl);
7359               Rewrite (Exp, Unchecked_Convert_To (Ent, Exp));
7360               Analyze_And_Resolve (Exp);
7361            end if;
7362         end;
7363
7364      --  Here if secondary stack is used
7365
7366      else
7367         --  Prevent the reclamation of the secondary stack by all enclosing
7368         --  blocks and loops as well as the related function; otherwise the
7369         --  result would be reclaimed too early.
7370
7371         Set_Enclosing_Sec_Stack_Return (N);
7372
7373         --  Optimize the case where the result is a function call that also
7374         --  returns on the secondary stack. In this case the result is already
7375         --  on the secondary stack and no further processing is required
7376         --  except to set the By_Ref flag to ensure that gigi does not attempt
7377         --  an extra unnecessary copy. (Actually not just unnecessary but
7378         --  wrong in the case of a controlled type, where gigi does not know
7379         --  how to do a copy.)
7380
7381         pragma Assert (Requires_Transient_Scope (R_Type));
7382         if Exp_Is_Function_Call and then Requires_Transient_Scope (Exp_Typ)
7383         then
7384            Set_By_Ref (N);
7385
7386            --  Remove side effects from the expression now so that other parts
7387            --  of the expander do not have to reanalyze this node without this
7388            --  optimization
7389
7390            Rewrite (Exp, Duplicate_Subexpr_No_Checks (Exp));
7391
7392            --  Ada 2005 (AI-251): If the type of the returned object is
7393            --  an interface then add an implicit type conversion to force
7394            --  displacement of the "this" pointer.
7395
7396            if Is_Interface (R_Type) then
7397               Rewrite (Exp, Convert_To (R_Type, Relocate_Node (Exp)));
7398            end if;
7399
7400            Analyze_And_Resolve (Exp, R_Type);
7401
7402         --  For controlled types, do the allocation on the secondary stack
7403         --  manually in order to call adjust at the right time:
7404
7405         --    type Anon1 is access R_Type;
7406         --    for Anon1'Storage_pool use ss_pool;
7407         --    Anon2 : anon1 := new R_Type'(expr);
7408         --    return Anon2.all;
7409
7410         --  We do the same for classwide types that are not potentially
7411         --  controlled (by the virtue of restriction No_Finalization) because
7412         --  gigi is not able to properly allocate class-wide types.
7413
7414         elsif CW_Or_Has_Controlled_Part (Utyp) then
7415            declare
7416               Loc        : constant Source_Ptr := Sloc (N);
7417               Acc_Typ    : constant Entity_Id := Make_Temporary (Loc, 'A');
7418               Alloc_Node : Node_Id;
7419               Temp       : Entity_Id;
7420
7421            begin
7422               Mutate_Ekind (Acc_Typ, E_Access_Type);
7423
7424               Set_Associated_Storage_Pool (Acc_Typ, RTE (RE_SS_Pool));
7425
7426               --  This is an allocator for the secondary stack, and it's fine
7427               --  to have Comes_From_Source set False on it, as gigi knows not
7428               --  to flag it as a violation of No_Implicit_Heap_Allocations.
7429
7430               Alloc_Node :=
7431                 Make_Allocator (Loc,
7432                   Expression =>
7433                     Make_Qualified_Expression (Loc,
7434                       Subtype_Mark => New_Occurrence_Of (Etype (Exp), Loc),
7435                       Expression   => Relocate_Node (Exp)));
7436
7437               --  We do not want discriminant checks on the declaration,
7438               --  given that it gets its value from the allocator.
7439
7440               Set_No_Initialization (Alloc_Node);
7441
7442               Temp := Make_Temporary (Loc, 'R', Alloc_Node);
7443
7444               Insert_List_Before_And_Analyze (N, New_List (
7445                 Make_Full_Type_Declaration (Loc,
7446                   Defining_Identifier => Acc_Typ,
7447                   Type_Definition     =>
7448                     Make_Access_To_Object_Definition (Loc,
7449                       Subtype_Indication => Subtype_Ind)),
7450
7451                 Make_Object_Declaration (Loc,
7452                   Defining_Identifier => Temp,
7453                   Object_Definition   => New_Occurrence_Of (Acc_Typ, Loc),
7454                   Expression          => Alloc_Node)));
7455
7456               Rewrite (Exp,
7457                 Make_Explicit_Dereference (Loc,
7458                 Prefix => New_Occurrence_Of (Temp, Loc)));
7459
7460               --  Ada 2005 (AI-251): If the type of the returned object is
7461               --  an interface then add an implicit type conversion to force
7462               --  displacement of the "this" pointer.
7463
7464               if Is_Interface (R_Type) then
7465                  Rewrite (Exp, Convert_To (R_Type, Relocate_Node (Exp)));
7466               end if;
7467
7468               Analyze_And_Resolve (Exp, R_Type);
7469            end;
7470
7471         --  Otherwise use the gigi mechanism to allocate result on the
7472         --  secondary stack.
7473
7474         else
7475            Check_Restriction (No_Secondary_Stack, N);
7476            Set_Storage_Pool (N, RTE (RE_SS_Pool));
7477            Set_Procedure_To_Call (N, RTE (RE_SS_Allocate));
7478         end if;
7479      end if;
7480
7481      --  Implement the rules of 6.5(8-10), which require a tag check in
7482      --  the case of a limited tagged return type, and tag reassignment for
7483      --  nonlimited tagged results. These actions are needed when the return
7484      --  type is a specific tagged type and the result expression is a
7485      --  conversion or a formal parameter, because in that case the tag of
7486      --  the expression might differ from the tag of the specific result type.
7487
7488      --  We must also verify an underlying type exists for the return type in
7489      --  case it is incomplete - in which case is not necessary to generate a
7490      --  check anyway since an incomplete limited tagged return type would
7491      --  qualify as a premature usage.
7492
7493      if Present (Utyp)
7494        and then Is_Tagged_Type (Utyp)
7495        and then not Is_Class_Wide_Type (Utyp)
7496        and then (Nkind (Exp) in
7497                      N_Type_Conversion | N_Unchecked_Type_Conversion
7498                    or else (Nkind (Exp) = N_Explicit_Dereference
7499                               and then Nkind (Prefix (Exp)) in
7500                                          N_Type_Conversion |
7501                                          N_Unchecked_Type_Conversion)
7502                    or else (Is_Entity_Name (Exp)
7503                               and then Is_Formal (Entity (Exp))))
7504      then
7505         --  When the return type is limited, perform a check that the tag of
7506         --  the result is the same as the tag of the return type.
7507
7508         if Is_Limited_Type (R_Type) then
7509            Insert_Action (Exp,
7510              Make_Raise_Constraint_Error (Loc,
7511                Condition =>
7512                  Make_Op_Ne (Loc,
7513                    Left_Opnd  =>
7514                      Make_Selected_Component (Loc,
7515                        Prefix        => Duplicate_Subexpr (Exp),
7516                        Selector_Name => Make_Identifier (Loc, Name_uTag)),
7517                    Right_Opnd =>
7518                      Make_Attribute_Reference (Loc,
7519                        Prefix         =>
7520                          New_Occurrence_Of (Base_Type (Utyp), Loc),
7521                        Attribute_Name => Name_Tag)),
7522                Reason    => CE_Tag_Check_Failed));
7523
7524         --  If the result type is a specific nonlimited tagged type, then we
7525         --  have to ensure that the tag of the result is that of the result
7526         --  type. This is handled by making a copy of the expression in
7527         --  the case where it might have a different tag, namely when the
7528         --  expression is a conversion or a formal parameter. We create a new
7529         --  object of the result type and initialize it from the expression,
7530         --  which will implicitly force the tag to be set appropriately.
7531
7532         else
7533            declare
7534               ExpR       : constant Node_Id   := Relocate_Node (Exp);
7535               Result_Id  : constant Entity_Id :=
7536                              Make_Temporary (Loc, 'R', ExpR);
7537               Result_Exp : constant Node_Id   :=
7538                              New_Occurrence_Of (Result_Id, Loc);
7539               Result_Obj : constant Node_Id   :=
7540                              Make_Object_Declaration (Loc,
7541                                Defining_Identifier => Result_Id,
7542                                Object_Definition   =>
7543                                  New_Occurrence_Of (R_Type, Loc),
7544                                Constant_Present    => True,
7545                                Expression          => ExpR);
7546
7547            begin
7548               Set_Assignment_OK (Result_Obj);
7549               Insert_Action (Exp, Result_Obj);
7550
7551               Rewrite (Exp, Result_Exp);
7552               Analyze_And_Resolve (Exp, R_Type);
7553            end;
7554         end if;
7555
7556      --  Ada 2005 (AI95-344): If the result type is class-wide, then insert
7557      --  a check that the level of the return expression's underlying type
7558      --  is not deeper than the level of the master enclosing the function.
7559
7560      --  AI12-043: The check is made immediately after the return object is
7561      --  created. This means that we do not apply it to the simple return
7562      --  generated by the expansion of an extended return statement.
7563
7564      --  No runtime check needed in interface thunks since it is performed
7565      --  by the target primitive associated with the thunk.
7566
7567      elsif Is_Class_Wide_Type (R_Type)
7568        and then not Comes_From_Extended_Return_Statement (N)
7569        and then not Is_Thunk (Scope_Id)
7570      then
7571         Apply_CW_Accessibility_Check (Exp, Scope_Id);
7572
7573      --  Ada 2012 (AI05-0073): If the result subtype of the function is
7574      --  defined by an access_definition designating a specific tagged
7575      --  type T, a check is made that the result value is null or the tag
7576      --  of the object designated by the result value identifies T.
7577
7578      --  The return expression is referenced twice in the code below, so it
7579      --  must be made free of side effects. Given that different compilers
7580      --  may evaluate these parameters in different order, both occurrences
7581      --  perform a copy.
7582
7583      elsif Ekind (R_Type) = E_Anonymous_Access_Type
7584        and then Is_Tagged_Type (Designated_Type (R_Type))
7585        and then not Is_Class_Wide_Type (Designated_Type (R_Type))
7586        and then Nkind (Original_Node (Exp)) /= N_Null
7587        and then not Tag_Checks_Suppressed (Designated_Type (R_Type))
7588      then
7589         --  Generate:
7590         --    [Constraint_Error
7591         --       when Exp /= null
7592         --         and then Exp.all not in Designated_Type]
7593
7594         Insert_Action (N,
7595           Make_Raise_Constraint_Error (Loc,
7596             Condition =>
7597               Make_And_Then (Loc,
7598                 Left_Opnd  =>
7599                   Make_Op_Ne (Loc,
7600                     Left_Opnd  => Duplicate_Subexpr (Exp),
7601                     Right_Opnd => Make_Null (Loc)),
7602
7603                 Right_Opnd =>
7604                   Make_Not_In (Loc,
7605                     Left_Opnd  =>
7606                       Make_Explicit_Dereference (Loc,
7607                         Prefix => Duplicate_Subexpr (Exp)),
7608                     Right_Opnd =>
7609                       New_Occurrence_Of (Designated_Type (R_Type), Loc))),
7610
7611             Reason    => CE_Tag_Check_Failed),
7612             Suppress  => All_Checks);
7613      end if;
7614
7615      --  If the result is of an unconstrained array subtype with fixed lower
7616      --  bound, then sliding to that bound may be needed.
7617
7618      if Is_Fixed_Lower_Bound_Array_Subtype (R_Type) then
7619         Expand_Sliding_Conversion (Exp, R_Type);
7620      end if;
7621
7622      --  If we are returning a nonscalar object that is possibly unaligned,
7623      --  then copy the value into a temporary first. This copy may need to
7624      --  expand to a loop of component operations.
7625
7626      if Is_Possibly_Unaligned_Slice (Exp)
7627        or else (Is_Possibly_Unaligned_Object (Exp)
7628                  and then not Represented_As_Scalar (Etype (Exp)))
7629      then
7630         declare
7631            ExpR : constant Node_Id   := Relocate_Node (Exp);
7632            Tnn  : constant Entity_Id := Make_Temporary (Loc, 'T', ExpR);
7633         begin
7634            Insert_Action (Exp,
7635              Make_Object_Declaration (Loc,
7636                Defining_Identifier => Tnn,
7637                Constant_Present    => True,
7638                Object_Definition   => New_Occurrence_Of (R_Type, Loc),
7639                Expression          => ExpR),
7640              Suppress => All_Checks);
7641            Rewrite (Exp, New_Occurrence_Of (Tnn, Loc));
7642         end;
7643      end if;
7644
7645      --  Call the _Postconditions procedure if the related function has
7646      --  contract assertions that need to be verified on exit.
7647
7648      if Ekind (Scope_Id) = E_Function
7649        and then Present (Postconditions_Proc (Scope_Id))
7650      then
7651         --  In the case of discriminated objects, we have created a
7652         --  constrained subtype above, and used the underlying type. This
7653         --  transformation is post-analysis and harmless, except that now the
7654         --  call to the post-condition will be analyzed and the type kinds
7655         --  have to match.
7656
7657         if Nkind (Exp) = N_Unchecked_Type_Conversion
7658           and then Is_Private_Type (R_Type) /= Is_Private_Type (Etype (Exp))
7659         then
7660            Rewrite (Exp, Expression (Relocate_Node (Exp)));
7661         end if;
7662
7663         --  We are going to reference the returned value twice in this case,
7664         --  once in the call to _Postconditions, and once in the actual return
7665         --  statement, but we can't have side effects happening twice.
7666
7667         Force_Evaluation (Exp, Mode => Strict);
7668
7669         --  Save the return value or a pointer to the return value since we
7670         --  may need to call postconditions after finalization when cleanup
7671         --  actions are present.
7672
7673         --  Generate:
7674         --
7675         --    Result_Object_For_Postcond := [Exp]'Unrestricted_Access;
7676
7677         Insert_Action (Exp,
7678           Make_Assignment_Statement (Loc,
7679             Name       =>
7680               New_Occurrence_Of
7681                (Get_Result_Object_For_Postcond (Scope_Id), Loc),
7682             Expression =>
7683               (if Is_Elementary_Type (Etype (R_Type)) then
7684                   New_Copy_Tree (Exp)
7685                else
7686                   Make_Attribute_Reference (Loc,
7687                     Attribute_Name => Name_Unrestricted_Access,
7688                     Prefix         => New_Copy_Tree (Exp)))));
7689
7690         --  Mark the successful return to signal that postconditions need to
7691         --  be evaluated when finalization occurs.
7692
7693         --  Generate:
7694         --
7695         --    Return_Success_For_Postcond := True;
7696         --    if Postcond_Enabled then
7697         --       _Postconditions ([exp]);
7698         --    end if;
7699
7700         Insert_Action (Exp,
7701           Make_Assignment_Statement (Loc,
7702             Name       =>
7703               New_Occurrence_Of
7704                (Get_Return_Success_For_Postcond (Scope_Id), Loc),
7705             Expression => New_Occurrence_Of (Standard_True, Loc)));
7706
7707         --  Wrap the call to _postconditions within a test of the
7708         --  Postcond_Enabled flag to delay postcondition evaluation until
7709         --  after finalization when required.
7710
7711         Insert_Action (Exp,
7712           Make_If_Statement (Loc,
7713             Condition       =>
7714               New_Occurrence_Of (Get_Postcond_Enabled (Scope_Id), Loc),
7715             Then_Statements => New_List (
7716               Make_Procedure_Call_Statement (Loc,
7717                 Name                   =>
7718                   New_Occurrence_Of
7719                     (Postconditions_Proc (Scope_Id), Loc),
7720                 Parameter_Associations => New_List (New_Copy_Tree (Exp))))));
7721      end if;
7722
7723      --  Ada 2005 (AI-251): If this return statement corresponds with an
7724      --  simple return statement associated with an extended return statement
7725      --  and the type of the returned object is an interface then generate an
7726      --  implicit conversion to force displacement of the "this" pointer.
7727
7728      if Ada_Version >= Ada_2005
7729        and then Comes_From_Extended_Return_Statement (N)
7730        and then Nkind (Expression (N)) = N_Identifier
7731        and then Is_Interface (Utyp)
7732        and then Utyp /= Underlying_Type (Exp_Typ)
7733      then
7734         Rewrite (Exp, Convert_To (Utyp, Relocate_Node (Exp)));
7735         Analyze_And_Resolve (Exp);
7736      end if;
7737
7738      --  Ada 2022 (AI12-0279)
7739
7740      if Has_Yield_Aspect (Scope_Id)
7741        and then RTE_Available (RE_Yield)
7742      then
7743         Insert_Action (N,
7744           Make_Procedure_Call_Statement (Loc,
7745             New_Occurrence_Of (RTE (RE_Yield), Loc)));
7746      end if;
7747   end Expand_Simple_Function_Return;
7748
7749   -----------------------
7750   -- Freeze_Subprogram --
7751   -----------------------
7752
7753   procedure Freeze_Subprogram (N : Node_Id) is
7754      Loc : constant Source_Ptr := Sloc (N);
7755
7756      procedure Register_Predefined_DT_Entry (Prim : Entity_Id);
7757      --  (Ada 2005): Register a predefined primitive in all the secondary
7758      --  dispatch tables of its primitive type.
7759
7760      ----------------------------------
7761      -- Register_Predefined_DT_Entry --
7762      ----------------------------------
7763
7764      procedure Register_Predefined_DT_Entry (Prim : Entity_Id) is
7765         Iface_DT_Ptr : Elmt_Id;
7766         Tagged_Typ   : Entity_Id;
7767         Thunk_Id     : Entity_Id;
7768         Thunk_Code   : Node_Id;
7769
7770      begin
7771         Tagged_Typ := Find_Dispatching_Type (Prim);
7772
7773         if No (Access_Disp_Table (Tagged_Typ))
7774           or else not Has_Interfaces (Tagged_Typ)
7775           or else not RTE_Available (RE_Interface_Tag)
7776           or else Restriction_Active (No_Dispatching_Calls)
7777         then
7778            return;
7779         end if;
7780
7781         --  Skip the first two access-to-dispatch-table pointers since they
7782         --  leads to the primary dispatch table (predefined DT and user
7783         --  defined DT). We are only concerned with the secondary dispatch
7784         --  table pointers. Note that the access-to- dispatch-table pointer
7785         --  corresponds to the first implemented interface retrieved below.
7786
7787         Iface_DT_Ptr :=
7788           Next_Elmt (Next_Elmt (First_Elmt (Access_Disp_Table (Tagged_Typ))));
7789
7790         while Present (Iface_DT_Ptr)
7791           and then Ekind (Node (Iface_DT_Ptr)) = E_Constant
7792         loop
7793            pragma Assert (Has_Thunks (Node (Iface_DT_Ptr)));
7794            Expand_Interface_Thunk (Prim, Thunk_Id, Thunk_Code,
7795              Iface => Related_Type (Node (Iface_DT_Ptr)));
7796
7797            if Present (Thunk_Code) then
7798               Insert_Actions_After (N, New_List (
7799                 Thunk_Code,
7800
7801                 Build_Set_Predefined_Prim_Op_Address (Loc,
7802                   Tag_Node     =>
7803                     New_Occurrence_Of (Node (Next_Elmt (Iface_DT_Ptr)), Loc),
7804                   Position     => DT_Position (Prim),
7805                   Address_Node =>
7806                     Unchecked_Convert_To (RTE (RE_Prim_Ptr),
7807                       Make_Attribute_Reference (Loc,
7808                         Prefix         => New_Occurrence_Of (Thunk_Id, Loc),
7809                         Attribute_Name => Name_Unrestricted_Access))),
7810
7811                 Build_Set_Predefined_Prim_Op_Address (Loc,
7812                   Tag_Node     =>
7813                     New_Occurrence_Of
7814                      (Node (Next_Elmt (Next_Elmt (Next_Elmt (Iface_DT_Ptr)))),
7815                       Loc),
7816                   Position     => DT_Position (Prim),
7817                   Address_Node =>
7818                     Unchecked_Convert_To (RTE (RE_Prim_Ptr),
7819                       Make_Attribute_Reference (Loc,
7820                         Prefix         => New_Occurrence_Of (Prim, Loc),
7821                         Attribute_Name => Name_Unrestricted_Access)))));
7822            end if;
7823
7824            --  Skip the tag of the predefined primitives dispatch table
7825
7826            Next_Elmt (Iface_DT_Ptr);
7827            pragma Assert (Has_Thunks (Node (Iface_DT_Ptr)));
7828
7829            --  Skip tag of the no-thunks dispatch table
7830
7831            Next_Elmt (Iface_DT_Ptr);
7832            pragma Assert (not Has_Thunks (Node (Iface_DT_Ptr)));
7833
7834            --  Skip tag of predefined primitives no-thunks dispatch table
7835
7836            Next_Elmt (Iface_DT_Ptr);
7837            pragma Assert (not Has_Thunks (Node (Iface_DT_Ptr)));
7838
7839            Next_Elmt (Iface_DT_Ptr);
7840         end loop;
7841      end Register_Predefined_DT_Entry;
7842
7843      --  Local variables
7844
7845      Subp : constant Entity_Id  := Entity (N);
7846
7847   --  Start of processing for Freeze_Subprogram
7848
7849   begin
7850      --  We suppress the initialization of the dispatch table entry when
7851      --  not Tagged_Type_Expansion because the dispatching mechanism is
7852      --  handled internally by the target.
7853
7854      if Is_Dispatching_Operation (Subp)
7855        and then not Is_Abstract_Subprogram (Subp)
7856        and then Present (DTC_Entity (Subp))
7857        and then Present (Scope (DTC_Entity (Subp)))
7858        and then Tagged_Type_Expansion
7859        and then not Restriction_Active (No_Dispatching_Calls)
7860        and then RTE_Available (RE_Tag)
7861      then
7862         declare
7863            Typ : constant Entity_Id := Scope (DTC_Entity (Subp));
7864
7865         begin
7866            --  Handle private overridden primitives
7867
7868            if not Is_CPP_Class (Typ) then
7869               Check_Overriding_Operation (Subp);
7870            end if;
7871
7872            --  We assume that imported CPP primitives correspond with objects
7873            --  whose constructor is in the CPP side; therefore we don't need
7874            --  to generate code to register them in the dispatch table.
7875
7876            if Is_CPP_Class (Typ) then
7877               null;
7878
7879            --  Handle CPP primitives found in derivations of CPP_Class types.
7880            --  These primitives must have been inherited from some parent, and
7881            --  there is no need to register them in the dispatch table because
7882            --  Build_Inherit_Prims takes care of initializing these slots.
7883
7884            elsif Is_Imported (Subp)
7885               and then Convention (Subp) in Convention_C_Family
7886            then
7887               null;
7888
7889            --  Generate code to register the primitive in non statically
7890            --  allocated dispatch tables
7891
7892            elsif not Building_Static_DT (Scope (DTC_Entity (Subp))) then
7893
7894               --  When a primitive is frozen, enter its name in its dispatch
7895               --  table slot.
7896
7897               if not Is_Interface (Typ)
7898                 or else Present (Interface_Alias (Subp))
7899               then
7900                  if Is_Predefined_Dispatching_Operation (Subp) then
7901                     Register_Predefined_DT_Entry (Subp);
7902                  end if;
7903
7904                  Insert_Actions_After (N,
7905                    Register_Primitive (Loc, Prim => Subp));
7906               end if;
7907            end if;
7908         end;
7909      end if;
7910
7911      --  Mark functions that return by reference. Note that it cannot be part
7912      --  of the normal semantic analysis of the spec since the underlying
7913      --  returned type may not be known yet (for private types).
7914
7915      Compute_Returns_By_Ref (Subp);
7916   end Freeze_Subprogram;
7917
7918   --------------------------
7919   -- Has_BIP_Extra_Formal --
7920   --------------------------
7921
7922   function Has_BIP_Extra_Formal
7923     (E    : Entity_Id;
7924      Kind : BIP_Formal_Kind) return Boolean
7925   is
7926      Extra_Formal : Entity_Id := Extra_Formals (E);
7927
7928   begin
7929      --  We can only rely on the availability of the extra formals in frozen
7930      --  entities or in subprogram types of dispatching calls (since their
7931      --  extra formals are added when the target subprogram is frozen; see
7932      --  Expand_Dispatching_Call).
7933
7934      pragma Assert (Is_Frozen (E)
7935        or else (Ekind (E) = E_Subprogram_Type
7936                   and then Is_Dispatch_Table_Entity (E))
7937        or else (Is_Dispatching_Operation (E)
7938                   and then Is_Frozen (Find_Dispatching_Type (E))));
7939
7940      while Present (Extra_Formal) loop
7941         if Is_Build_In_Place_Entity (Extra_Formal)
7942           and then BIP_Suffix_Kind (Extra_Formal) = Kind
7943         then
7944            return True;
7945         end if;
7946
7947         Next_Formal_With_Extras (Extra_Formal);
7948      end loop;
7949
7950      return False;
7951   end Has_BIP_Extra_Formal;
7952
7953   ------------------------------
7954   -- Insert_Post_Call_Actions --
7955   ------------------------------
7956
7957   procedure Insert_Post_Call_Actions (N : Node_Id; Post_Call : List_Id) is
7958      Context : constant Node_Id := Parent (N);
7959
7960   begin
7961      if Is_Empty_List (Post_Call) then
7962         return;
7963      end if;
7964
7965      --  Cases where the call is not a member of a statement list. This also
7966      --  includes the cases where the call is an actual in another function
7967      --  call, or is an index, or is an operand of an if-expression, i.e. is
7968      --  in an expression context.
7969
7970      if not Is_List_Member (N)
7971        or else Nkind (Context) in N_Function_Call
7972                                 | N_If_Expression
7973                                 | N_Indexed_Component
7974      then
7975         --  In Ada 2012 the call may be a function call in an expression
7976         --  (since OUT and IN OUT parameters are now allowed for such calls).
7977         --  The write-back of (in)-out parameters is handled by the back-end,
7978         --  but the constraint checks generated when subtypes of formal and
7979         --  actual don't match must be inserted in the form of assignments.
7980         --  Also do this in the case of explicit dereferences, which can occur
7981         --  due to rewritings of function calls with controlled results.
7982
7983         if Nkind (N) = N_Function_Call
7984           or else Nkind (Original_Node (N)) = N_Function_Call
7985           or else Nkind (N) = N_Explicit_Dereference
7986         then
7987            pragma Assert (Ada_Version >= Ada_2012);
7988            --  Functions with '[in] out' parameters are only allowed in Ada
7989            --  2012.
7990
7991            --  We used to handle this by climbing up parents to a
7992            --  non-statement/declaration and then simply making a call to
7993            --  Insert_Actions_After (P, Post_Call), but that doesn't work
7994            --  for Ada 2012. If we are in the middle of an expression, e.g.
7995            --  the condition of an IF, this call would insert after the IF
7996            --  statement, which is much too late to be doing the write back.
7997            --  For example:
7998
7999            --     if Clobber (X) then
8000            --        Put_Line (X'Img);
8001            --     else
8002            --        goto Junk
8003            --     end if;
8004
8005            --  Now assume Clobber changes X, if we put the write back after
8006            --  the IF, the Put_Line gets the wrong value and the goto causes
8007            --  the write back to be skipped completely.
8008
8009            --  To deal with this, we replace the call by
8010            --
8011            --    do
8012            --       Tnnn : constant function-result-type := function-call;
8013            --       Post_Call actions
8014            --    in
8015            --       Tnnn;
8016            --    end;
8017            --
8018            --   However, that doesn't work if function-result-type requires
8019            --   finalization (because function-call's result never gets
8020            --   finalized). So in that case, we instead replace the call by
8021            --
8022            --    do
8023            --       type Ref is access all function-result-type;
8024            --       Ptr : constant Ref := function-call'Reference;
8025            --       Tnnn : constant function-result-type := Ptr.all;
8026            --       Finalize (Ptr.all);
8027            --       Post_Call actions
8028            --    in
8029            --       Tnnn;
8030            --    end;
8031            --
8032
8033            declare
8034               Loc   : constant Source_Ptr := Sloc (N);
8035               Tnnn  : constant Entity_Id := Make_Temporary (Loc, 'T');
8036               FRTyp : constant Entity_Id := Etype (N);
8037               Name  : constant Node_Id   := Relocate_Node (N);
8038
8039            begin
8040               if Needs_Finalization (FRTyp) then
8041                  declare
8042                     Ptr_Typ : constant Entity_Id := Make_Temporary (Loc, 'A');
8043
8044                     Ptr_Typ_Decl : constant Node_Id :=
8045                       Make_Full_Type_Declaration (Loc,
8046                         Defining_Identifier => Ptr_Typ,
8047                         Type_Definition     =>
8048                           Make_Access_To_Object_Definition (Loc,
8049                             All_Present        => True,
8050                             Subtype_Indication =>
8051                               New_Occurrence_Of (FRTyp, Loc)));
8052
8053                     Ptr_Obj : constant Entity_Id :=
8054                       Make_Temporary (Loc, 'P');
8055
8056                     Ptr_Obj_Decl : constant Node_Id :=
8057                       Make_Object_Declaration (Loc,
8058                         Defining_Identifier => Ptr_Obj,
8059                         Object_Definition   =>
8060                           New_Occurrence_Of (Ptr_Typ, Loc),
8061                         Constant_Present    => True,
8062                         Expression          =>
8063                           Make_Attribute_Reference (Loc,
8064                           Prefix         => Name,
8065                           Attribute_Name => Name_Unrestricted_Access));
8066
8067                     function Ptr_Dereference return Node_Id is
8068                       (Make_Explicit_Dereference (Loc,
8069                          Prefix => New_Occurrence_Of (Ptr_Obj, Loc)));
8070
8071                     Tnn_Decl : constant Node_Id :=
8072                       Make_Object_Declaration (Loc,
8073                         Defining_Identifier => Tnnn,
8074                         Object_Definition   => New_Occurrence_Of (FRTyp, Loc),
8075                         Constant_Present    => True,
8076                         Expression          => Ptr_Dereference);
8077
8078                     Finalize_Call : constant Node_Id :=
8079                       Make_Final_Call
8080                         (Obj_Ref => Ptr_Dereference, Typ => FRTyp);
8081                  begin
8082                     --  Prepend in reverse order
8083
8084                     Prepend_To (Post_Call, Finalize_Call);
8085                     Prepend_To (Post_Call, Tnn_Decl);
8086                     Prepend_To (Post_Call, Ptr_Obj_Decl);
8087                     Prepend_To (Post_Call, Ptr_Typ_Decl);
8088                  end;
8089               else
8090                  Prepend_To (Post_Call,
8091                    Make_Object_Declaration (Loc,
8092                      Defining_Identifier => Tnnn,
8093                      Object_Definition   => New_Occurrence_Of (FRTyp, Loc),
8094                      Constant_Present    => True,
8095                      Expression          => Name));
8096               end if;
8097
8098               Rewrite (N,
8099                 Make_Expression_With_Actions (Loc,
8100                   Actions    => Post_Call,
8101                   Expression => New_Occurrence_Of (Tnnn, Loc)));
8102
8103               --  We don't want to just blindly call Analyze_And_Resolve
8104               --  because that would cause unwanted recursion on the call.
8105               --  So for a moment set the call as analyzed to prevent that
8106               --  recursion, and get the rest analyzed properly, then reset
8107               --  the analyzed flag, so our caller can continue.
8108
8109               Set_Analyzed (Name, True);
8110               Analyze_And_Resolve (N, FRTyp);
8111               Set_Analyzed (Name, False);
8112            end;
8113
8114         --  If not the special Ada 2012 case of a function call, then we must
8115         --  have the triggering statement of a triggering alternative or an
8116         --  entry call alternative, and we can add the post call stuff to the
8117         --  corresponding statement list.
8118
8119         else
8120            pragma Assert (Nkind (Context) in N_Entry_Call_Alternative
8121                                            | N_Triggering_Alternative);
8122
8123            if Is_Non_Empty_List (Statements (Context)) then
8124               Insert_List_Before_And_Analyze
8125                 (First (Statements (Context)), Post_Call);
8126            else
8127               Set_Statements (Context, Post_Call);
8128            end if;
8129         end if;
8130
8131      --  A procedure call is always part of a declarative or statement list,
8132      --  however a function call may appear nested within a construct. Most
8133      --  cases of function call nesting are handled in the special case above.
8134      --  The only exception is when the function call acts as an actual in a
8135      --  procedure call. In this case the function call is in a list, but the
8136      --  post-call actions must be inserted after the procedure call.
8137      --  What if the function call is an aggregate component ???
8138
8139      elsif Nkind (Context) = N_Procedure_Call_Statement then
8140         Insert_Actions_After (Context, Post_Call);
8141
8142      --  Otherwise, normal case where N is in a statement sequence, just put
8143      --  the post-call stuff after the call statement.
8144
8145      else
8146         Insert_Actions_After (N, Post_Call);
8147      end if;
8148   end Insert_Post_Call_Actions;
8149
8150   ---------------------------------------
8151   -- Install_Class_Preconditions_Check --
8152   ---------------------------------------
8153
8154   procedure Install_Class_Preconditions_Check (Call_Node : Node_Id) is
8155      Loc : constant Source_Ptr := Sloc (Call_Node);
8156
8157      function Build_Dynamic_Check_Helper_Call return Node_Id;
8158      --  Build call to the helper runtime function of the nearest ancestor
8159      --  of the target subprogram that dynamically evaluates the merged
8160      --  or-else preconditions.
8161
8162      function Build_Error_Message (Subp_Id : Entity_Id) return Node_Id;
8163      --  Build message associated with the class-wide precondition of Subp_Id
8164      --  indicating the call that caused it.
8165
8166      function Build_Static_Check_Helper_Call return Node_Id;
8167      --  Build call to the helper runtime function of the nearest ancestor
8168      --  of the target subprogram that dynamically evaluates the merged
8169      --  or-else preconditions.
8170
8171      function Class_Preconditions_Subprogram
8172        (Spec_Id : Entity_Id;
8173         Dynamic : Boolean) return Node_Id;
8174      --  Return the nearest ancestor of Spec_Id defining a helper function
8175      --  that evaluates a combined or-else expression containing all the
8176      --  inherited class-wide preconditions; Dynamic enables searching for
8177      --  the helper that dynamically evaluates preconditions using dispatching
8178      --  calls; if False it searches for the helper that statically evaluates
8179      --  preconditions; return Empty when not available (which means that no
8180      --  preconditions check is required).
8181
8182      -------------------------------------
8183      -- Build_Dynamic_Check_Helper_Call --
8184      -------------------------------------
8185
8186      function Build_Dynamic_Check_Helper_Call return Node_Id is
8187         Spec_Id   : constant Entity_Id := Entity (Name (Call_Node));
8188         CW_Subp   : constant Entity_Id :=
8189                       Class_Preconditions_Subprogram (Spec_Id,
8190                         Dynamic => True);
8191         Helper_Id : constant Entity_Id :=
8192                       Dynamic_Call_Helper (CW_Subp);
8193         Actuals   : constant List_Id := New_List;
8194         A         : Node_Id   := First_Actual (Call_Node);
8195         F         : Entity_Id := First_Formal (Helper_Id);
8196
8197      begin
8198         while Present (A) loop
8199
8200            --  Ensure that the evaluation of the actuals will not produce
8201            --  side effects.
8202
8203            Remove_Side_Effects (A);
8204
8205            Append_To (Actuals, New_Copy_Tree (A));
8206            Next_Formal (F);
8207            Next_Actual (A);
8208         end loop;
8209
8210         return
8211           Make_Function_Call (Loc,
8212             Name => New_Occurrence_Of (Helper_Id, Loc),
8213             Parameter_Associations => Actuals);
8214      end Build_Dynamic_Check_Helper_Call;
8215
8216      -------------------------
8217      -- Build_Error_Message --
8218      -------------------------
8219
8220      function Build_Error_Message (Subp_Id : Entity_Id) return Node_Id is
8221
8222         procedure Append_Message
8223           (Id       : Entity_Id;
8224            Is_First : in out Boolean);
8225         --  Build the fragment of the message associated with subprogram Id;
8226         --  Is_First facilitates identifying continuation messages.
8227
8228         --------------------
8229         -- Append_Message --
8230         --------------------
8231
8232         procedure Append_Message
8233           (Id       : Entity_Id;
8234            Is_First : in out Boolean)
8235         is
8236            Prag   : constant Node_Id := Get_Class_Wide_Pragma (Id,
8237                                         Pragma_Precondition);
8238            Msg    : Node_Id;
8239            Str_Id : String_Id;
8240
8241         begin
8242            if No (Prag) or else Is_Ignored (Prag) then
8243               return;
8244            end if;
8245
8246            Msg    := Expression (Last (Pragma_Argument_Associations (Prag)));
8247            Str_Id := Strval (Msg);
8248
8249            if Is_First then
8250               Is_First := False;
8251
8252               Append (Global_Name_Buffer, Strval (Msg));
8253
8254               if Id /= Subp_Id
8255                 and then Name_Buffer (1 .. 19) = "failed precondition"
8256               then
8257                  Insert_Str_In_Name_Buffer ("inherited ", 8);
8258               end if;
8259
8260            else
8261               declare
8262                  Str      : constant String := To_String (Str_Id);
8263                  From_Idx : Integer;
8264
8265               begin
8266                  Append (Global_Name_Buffer, ASCII.LF);
8267                  Append (Global_Name_Buffer, "  or ");
8268
8269                  From_Idx := Name_Len;
8270                  Append (Global_Name_Buffer, Str_Id);
8271
8272                  if Str (1 .. 19) = "failed precondition" then
8273                     Insert_Str_In_Name_Buffer ("inherited ", From_Idx + 8);
8274                  end if;
8275               end;
8276            end if;
8277         end Append_Message;
8278
8279         --  Local variables
8280
8281         Str_Loc  : constant String := Build_Location_String (Loc);
8282         Subps    : constant Subprogram_List :=
8283                      Inherited_Subprograms (Subp_Id);
8284         Is_First : Boolean := True;
8285
8286      --  Start of processing for Build_Error_Message
8287
8288      begin
8289         Name_Len := 0;
8290         Append_Message (Subp_Id, Is_First);
8291
8292         for Index in Subps'Range loop
8293            Append_Message (Subps (Index), Is_First);
8294         end loop;
8295
8296         if Present (Controlling_Argument (Call_Node)) then
8297            Append (Global_Name_Buffer, " in dispatching call at ");
8298         else
8299            Append (Global_Name_Buffer, " in call at ");
8300         end if;
8301
8302         Append (Global_Name_Buffer, Str_Loc);
8303
8304         return Make_String_Literal (Loc, Name_Buffer (1 .. Name_Len));
8305      end Build_Error_Message;
8306
8307      ------------------------------------
8308      -- Build_Static_Check_Helper_Call --
8309      ------------------------------------
8310
8311      function Build_Static_Check_Helper_Call return Node_Id is
8312         Actuals   : constant List_Id := New_List;
8313         A         : Node_Id;
8314         Helper_Id : Entity_Id;
8315         F         : Entity_Id;
8316         CW_Subp   : Entity_Id;
8317         Spec_Id   : constant Entity_Id := Entity (Name (Call_Node));
8318
8319      begin
8320         --  The target is the wrapper built to support inheriting body but
8321         --  overriding pre/postconditions (AI12-0195).
8322
8323         if Is_Dispatch_Table_Wrapper (Spec_Id) then
8324            CW_Subp := Spec_Id;
8325
8326         --  Common case
8327
8328         else
8329            CW_Subp := Class_Preconditions_Subprogram (Spec_Id,
8330                         Dynamic => False);
8331         end if;
8332
8333         Helper_Id := Static_Call_Helper (CW_Subp);
8334
8335         F := First_Formal (Helper_Id);
8336         A := First_Actual (Call_Node);
8337         while Present (A) loop
8338
8339            --  Ensure that the evaluation of the actuals will not produce
8340            --  side effects.
8341
8342            Remove_Side_Effects (A);
8343
8344            if Is_Controlling_Actual (A)
8345              and then Etype (F) /= Etype (A)
8346            then
8347               Append_To (Actuals,
8348                 Make_Unchecked_Type_Conversion (Loc,
8349                   New_Occurrence_Of (Etype (F), Loc),
8350                   New_Copy_Tree (A)));
8351            else
8352               Append_To (Actuals, New_Copy_Tree (A));
8353            end if;
8354
8355            Next_Formal (F);
8356            Next_Actual (A);
8357         end loop;
8358
8359         return
8360           Make_Function_Call (Loc,
8361             Name => New_Occurrence_Of (Helper_Id, Loc),
8362             Parameter_Associations => Actuals);
8363      end Build_Static_Check_Helper_Call;
8364
8365      ------------------------------------
8366      -- Class_Preconditions_Subprogram --
8367      ------------------------------------
8368
8369      function Class_Preconditions_Subprogram
8370        (Spec_Id : Entity_Id;
8371         Dynamic : Boolean) return Node_Id
8372      is
8373         Subp_Id : constant Entity_Id := Ultimate_Alias (Spec_Id);
8374
8375      begin
8376         --  Prevent cascaded errors
8377
8378         if not Is_Dispatching_Operation (Subp_Id) then
8379            return Empty;
8380
8381         --  No need to search if this subprogram has the helper we are
8382         --  searching
8383
8384         elsif Dynamic then
8385            if Present (Dynamic_Call_Helper (Subp_Id)) then
8386               return Subp_Id;
8387            end if;
8388         else
8389            if Present (Static_Call_Helper (Subp_Id)) then
8390               return Subp_Id;
8391            end if;
8392         end if;
8393
8394         --  Process inherited subprograms looking for class-wide
8395         --  preconditions.
8396
8397         declare
8398            Subps   : constant Subprogram_List :=
8399                        Inherited_Subprograms (Subp_Id);
8400            Subp_Id : Entity_Id;
8401
8402         begin
8403            for Index in Subps'Range loop
8404               Subp_Id := Subps (Index);
8405
8406               if Present (Alias (Subp_Id)) then
8407                  Subp_Id := Ultimate_Alias (Subp_Id);
8408               end if;
8409
8410               --  Wrappers of class-wide pre/postconditions reference the
8411               --  parent primitive that has the inherited contract.
8412
8413               if Is_Wrapper (Subp_Id)
8414                 and then Present (LSP_Subprogram (Subp_Id))
8415               then
8416                  Subp_Id := LSP_Subprogram (Subp_Id);
8417               end if;
8418
8419               if Dynamic then
8420                  if Present (Dynamic_Call_Helper (Subp_Id)) then
8421                     return Subp_Id;
8422                  end if;
8423               else
8424                  if Present (Static_Call_Helper (Subp_Id)) then
8425                     return Subp_Id;
8426                  end if;
8427               end if;
8428            end loop;
8429         end;
8430
8431         return Empty;
8432      end Class_Preconditions_Subprogram;
8433
8434      --  Local variables
8435
8436      Dynamic_Check : constant Boolean :=
8437                        Present (Controlling_Argument (Call_Node));
8438      Class_Subp    : Entity_Id;
8439      Cond          : Node_Id;
8440      Subp          : Entity_Id;
8441
8442   --  Start of processing for Install_Class_Preconditions_Check
8443
8444   begin
8445      --  Do not expand the check if we are compiling under restriction
8446      --  No_Dispatching_Calls; the semantic analyzer has previously
8447      --  notified the violation of this restriction.
8448
8449      if Dynamic_Check
8450        and then Restriction_Active (No_Dispatching_Calls)
8451      then
8452         return;
8453
8454      --  Class-wide precondition check not needed in interface thunks since
8455      --  they are installed in the dispatching call that caused invoking the
8456      --  thunk.
8457
8458      elsif Is_Thunk (Current_Scope) then
8459         return;
8460      end if;
8461
8462      Subp := Entity (Name (Call_Node));
8463
8464      --  No check needed for this subprogram call if no class-wide
8465      --  preconditions apply (or if the unique available preconditions
8466      --  are ignored preconditions).
8467
8468      Class_Subp := Class_Preconditions_Subprogram (Subp, Dynamic_Check);
8469
8470      if No (Class_Subp)
8471        or else No (Class_Preconditions (Class_Subp))
8472      then
8473         return;
8474      end if;
8475
8476      --  Build and install the check
8477
8478      if Dynamic_Check then
8479         Cond := Build_Dynamic_Check_Helper_Call;
8480      else
8481         Cond := Build_Static_Check_Helper_Call;
8482      end if;
8483
8484      if Exception_Locations_Suppressed then
8485         Insert_Action (Call_Node,
8486           Make_If_Statement (Loc,
8487             Condition       => Make_Op_Not (Loc, Cond),
8488             Then_Statements => New_List (
8489               Make_Raise_Statement (Loc,
8490                 Name =>
8491                   New_Occurrence_Of
8492                     (RTE (RE_Assert_Failure), Loc)))));
8493
8494      --  Failed check with message indicating the failed precondition and the
8495      --  call that caused it.
8496
8497      else
8498         Insert_Action (Call_Node,
8499           Make_If_Statement (Loc,
8500             Condition       => Make_Op_Not (Loc, Cond),
8501             Then_Statements => New_List (
8502               Make_Procedure_Call_Statement (Loc,
8503                 Name                   =>
8504                   New_Occurrence_Of
8505                     (RTE (RE_Raise_Assert_Failure), Loc),
8506                 Parameter_Associations =>
8507                   New_List (Build_Error_Message (Subp))))));
8508      end if;
8509   end Install_Class_Preconditions_Check;
8510
8511   -----------------------------------
8512   -- Is_Build_In_Place_Result_Type --
8513   -----------------------------------
8514
8515   function Is_Build_In_Place_Result_Type (Typ : Entity_Id) return Boolean is
8516   begin
8517      if not Expander_Active then
8518         return False;
8519      end if;
8520
8521      --  In Ada 2005 all functions with an inherently limited return type
8522      --  must be handled using a build-in-place profile, including the case
8523      --  of a function with a limited interface result, where the function
8524      --  may return objects of nonlimited descendants.
8525
8526      if Is_Limited_View (Typ) then
8527         return Ada_Version >= Ada_2005 and then not Debug_Flag_Dot_L;
8528
8529      else
8530         if Debug_Flag_Dot_9 then
8531            return False;
8532         end if;
8533
8534         if Has_Interfaces (Typ) then
8535            return False;
8536         end if;
8537
8538         declare
8539            T : Entity_Id := Typ;
8540         begin
8541            --  For T'Class, return True if it's True for T. This is necessary
8542            --  because a class-wide function might say "return F (...)", where
8543            --  F returns the corresponding specific type. We need a loop in
8544            --  case T is a subtype of a class-wide type.
8545
8546            while Is_Class_Wide_Type (T) loop
8547               T := Etype (T);
8548            end loop;
8549
8550            --  If this is a generic formal type in an instance, return True if
8551            --  it's True for the generic actual type.
8552
8553            if Nkind (Parent (T)) = N_Subtype_Declaration
8554              and then Present (Generic_Parent_Type (Parent (T)))
8555            then
8556               T := Entity (Subtype_Indication (Parent (T)));
8557
8558               if Present (Full_View (T)) then
8559                  T := Full_View (T);
8560               end if;
8561            end if;
8562
8563            if Present (Underlying_Type (T)) then
8564               T := Underlying_Type (T);
8565            end if;
8566
8567            declare
8568               Result : Boolean;
8569               --  So we can stop here in the debugger
8570            begin
8571               --  ???For now, enable build-in-place for a very narrow set of
8572               --  controlled types. Change "if True" to "if False" to
8573               --  experiment with more controlled types. Eventually, we might
8574               --  like to enable build-in-place for all tagged types, all
8575               --  types that need finalization, and all caller-unknown-size
8576               --  types.
8577
8578               if True then
8579                  Result := Is_Controlled (T)
8580                    and then not Is_Generic_Actual_Type (T)
8581                    and then Present (Enclosing_Subprogram (T))
8582                    and then not Is_Compilation_Unit (Enclosing_Subprogram (T))
8583                    and then Ekind (Enclosing_Subprogram (T)) = E_Procedure;
8584               else
8585                  Result := Is_Controlled (T);
8586               end if;
8587
8588               return Result;
8589            end;
8590         end;
8591      end if;
8592   end Is_Build_In_Place_Result_Type;
8593
8594   ------------------------------
8595   -- Is_Build_In_Place_Entity --
8596   ------------------------------
8597
8598   function Is_Build_In_Place_Entity (E : Entity_Id) return Boolean is
8599      Nam : constant String := Get_Name_String (Chars (E));
8600
8601      function Has_Suffix (Suffix : String) return Boolean;
8602      --  Return True if Nam has suffix Suffix
8603
8604      function Has_Suffix (Suffix : String) return Boolean is
8605         Len : constant Natural := Suffix'Length;
8606      begin
8607         return Nam'Length > Len
8608           and then Nam (Nam'Last - Len + 1 .. Nam'Last) = Suffix;
8609      end Has_Suffix;
8610
8611   --  Start of processing for Is_Build_In_Place_Entity
8612
8613   begin
8614      return Has_Suffix (BIP_Alloc_Suffix)
8615        or else Has_Suffix (BIP_Storage_Pool_Suffix)
8616        or else Has_Suffix (BIP_Finalization_Master_Suffix)
8617        or else Has_Suffix (BIP_Task_Master_Suffix)
8618        or else Has_Suffix (BIP_Activation_Chain_Suffix)
8619        or else Has_Suffix (BIP_Object_Access_Suffix);
8620   end Is_Build_In_Place_Entity;
8621
8622   --------------------------------
8623   -- Is_Build_In_Place_Function --
8624   --------------------------------
8625
8626   function Is_Build_In_Place_Function (E : Entity_Id) return Boolean is
8627   begin
8628      --  This function is called from Expand_Subtype_From_Expr during
8629      --  semantic analysis, even when expansion is off. In those cases
8630      --  the build_in_place expansion will not take place.
8631
8632      if not Expander_Active then
8633         return False;
8634      end if;
8635
8636      if Ekind (E) in E_Function | E_Generic_Function
8637        or else (Ekind (E) = E_Subprogram_Type
8638                  and then Etype (E) /= Standard_Void_Type)
8639      then
8640         --  If the function is imported from a foreign language, we don't do
8641         --  build-in-place. Note that Import (Ada) functions can do
8642         --  build-in-place. Note that it is OK for a build-in-place function
8643         --  to return a type with a foreign convention; the build-in-place
8644         --  machinery will ensure there is no copying.
8645
8646         return Is_Build_In_Place_Result_Type (Etype (E))
8647           and then not (Has_Foreign_Convention (E) and then Is_Imported (E))
8648           and then not Debug_Flag_Dot_L;
8649      else
8650         return False;
8651      end if;
8652   end Is_Build_In_Place_Function;
8653
8654   -------------------------------------
8655   -- Is_Build_In_Place_Function_Call --
8656   -------------------------------------
8657
8658   function Is_Build_In_Place_Function_Call (N : Node_Id) return Boolean is
8659      Exp_Node    : constant Node_Id := Unqual_Conv (N);
8660      Function_Id : Entity_Id;
8661
8662   begin
8663      --  Return False if the expander is currently inactive, since awareness
8664      --  of build-in-place treatment is only relevant during expansion. Note
8665      --  that Is_Build_In_Place_Function, which is called as part of this
8666      --  function, is also conditioned this way, but we need to check here as
8667      --  well to avoid blowing up on processing protected calls when expansion
8668      --  is disabled (such as with -gnatc) since those would trip over the
8669      --  raise of Program_Error below.
8670
8671      --  In SPARK mode, build-in-place calls are not expanded, so that we
8672      --  may end up with a call that is neither resolved to an entity, nor
8673      --  an indirect call.
8674
8675      if not Expander_Active or else Nkind (Exp_Node) /= N_Function_Call then
8676         return False;
8677      end if;
8678
8679      if Is_Entity_Name (Name (Exp_Node)) then
8680         Function_Id := Entity (Name (Exp_Node));
8681
8682      --  In the case of an explicitly dereferenced call, use the subprogram
8683      --  type generated for the dereference.
8684
8685      elsif Nkind (Name (Exp_Node)) = N_Explicit_Dereference then
8686         Function_Id := Etype (Name (Exp_Node));
8687
8688      --  This may be a call to a protected function.
8689
8690      elsif Nkind (Name (Exp_Node)) = N_Selected_Component then
8691         --  The selector in question might not have been analyzed due to a
8692         --  previous error, so analyze it here to output the appropriate
8693         --  error message instead of crashing when attempting to fetch its
8694         --  entity.
8695
8696         if not Analyzed (Selector_Name (Name (Exp_Node))) then
8697            Analyze (Selector_Name (Name (Exp_Node)));
8698         end if;
8699
8700         Function_Id := Etype (Entity (Selector_Name (Name (Exp_Node))));
8701
8702      else
8703         raise Program_Error;
8704      end if;
8705
8706      declare
8707         Result : constant Boolean := Is_Build_In_Place_Function (Function_Id);
8708         --  So we can stop here in the debugger
8709      begin
8710         return Result;
8711      end;
8712   end Is_Build_In_Place_Function_Call;
8713
8714   -----------------------
8715   -- Is_Null_Procedure --
8716   -----------------------
8717
8718   function Is_Null_Procedure (Subp : Entity_Id) return Boolean is
8719      Decl : constant Node_Id := Unit_Declaration_Node (Subp);
8720
8721   begin
8722      if Ekind (Subp) /= E_Procedure then
8723         return False;
8724
8725      --  Check if this is a declared null procedure
8726
8727      elsif Nkind (Decl) = N_Subprogram_Declaration then
8728         if not Null_Present (Specification (Decl)) then
8729            return False;
8730
8731         elsif No (Body_To_Inline (Decl)) then
8732            return False;
8733
8734         --  Check if the body contains only a null statement, followed by
8735         --  the return statement added during expansion.
8736
8737         else
8738            declare
8739               Orig_Bod : constant Node_Id := Body_To_Inline (Decl);
8740
8741               Stat  : Node_Id;
8742               Stat2 : Node_Id;
8743
8744            begin
8745               if Nkind (Orig_Bod) /= N_Subprogram_Body then
8746                  return False;
8747               else
8748                  --  We must skip SCIL nodes because they are currently
8749                  --  implemented as special N_Null_Statement nodes.
8750
8751                  Stat :=
8752                     First_Non_SCIL_Node
8753                       (Statements (Handled_Statement_Sequence (Orig_Bod)));
8754                  Stat2 := Next_Non_SCIL_Node (Stat);
8755
8756                  return
8757                     Is_Empty_List (Declarations (Orig_Bod))
8758                       and then Nkind (Stat) = N_Null_Statement
8759                       and then
8760                        (No (Stat2)
8761                          or else
8762                            (Nkind (Stat2) = N_Simple_Return_Statement
8763                              and then No (Next (Stat2))));
8764               end if;
8765            end;
8766         end if;
8767
8768      else
8769         return False;
8770      end if;
8771   end Is_Null_Procedure;
8772
8773   -------------------------------------------
8774   -- Make_Build_In_Place_Call_In_Allocator --
8775   -------------------------------------------
8776
8777   procedure Make_Build_In_Place_Call_In_Allocator
8778     (Allocator     : Node_Id;
8779      Function_Call : Node_Id)
8780   is
8781      Acc_Type          : constant Entity_Id := Etype (Allocator);
8782      Loc               : constant Source_Ptr := Sloc (Function_Call);
8783      Func_Call         : Node_Id := Function_Call;
8784      Ref_Func_Call     : Node_Id;
8785      Function_Id       : Entity_Id;
8786      Result_Subt       : Entity_Id;
8787      New_Allocator     : Node_Id;
8788      Return_Obj_Access : Entity_Id; -- temp for function result
8789      Temp_Init         : Node_Id; -- initial value of Return_Obj_Access
8790      Alloc_Form        : BIP_Allocation_Form;
8791      Pool              : Node_Id; -- nonnull if Alloc_Form = User_Storage_Pool
8792      Return_Obj_Actual : Node_Id; -- the temp.all, in caller-allocates case
8793      Chain             : Entity_Id; -- activation chain, in case of tasks
8794
8795   begin
8796      --  Step past qualification or unchecked conversion (the latter can occur
8797      --  in cases of calls to 'Input).
8798
8799      if Nkind (Func_Call) in N_Qualified_Expression
8800                            | N_Type_Conversion
8801                            | N_Unchecked_Type_Conversion
8802      then
8803         Func_Call := Expression (Func_Call);
8804      end if;
8805
8806      --  Mark the call as processed as a build-in-place call
8807
8808      pragma Assert (not Is_Expanded_Build_In_Place_Call (Func_Call));
8809      Set_Is_Expanded_Build_In_Place_Call (Func_Call);
8810
8811      if Is_Entity_Name (Name (Func_Call)) then
8812         Function_Id := Entity (Name (Func_Call));
8813
8814      elsif Nkind (Name (Func_Call)) = N_Explicit_Dereference then
8815         Function_Id := Etype (Name (Func_Call));
8816
8817      else
8818         raise Program_Error;
8819      end if;
8820
8821      Warn_BIP (Func_Call);
8822
8823      Result_Subt := Available_View (Etype (Function_Id));
8824
8825      --  Create a temp for the function result. In the caller-allocates case,
8826      --  this will be initialized to the result of a new uninitialized
8827      --  allocator. Note: we do not use Allocator as the Related_Node of
8828      --  Return_Obj_Access in call to Make_Temporary below as this would
8829      --  create a sort of infinite "recursion".
8830
8831      Return_Obj_Access := Make_Temporary (Loc, 'R');
8832      Set_Etype (Return_Obj_Access, Acc_Type);
8833      Set_Can_Never_Be_Null (Acc_Type, False);
8834      --  It gets initialized to null, so we can't have that
8835
8836      --  When the result subtype is constrained, the return object is created
8837      --  on the caller side, and access to it is passed to the function. This
8838      --  optimization is disabled when the result subtype needs finalization
8839      --  actions because the caller side allocation may result in undesirable
8840      --  finalization. Consider the following example:
8841      --
8842      --    function Make_Lim_Ctrl return Lim_Ctrl is
8843      --    begin
8844      --       return Result : Lim_Ctrl := raise Program_Error do
8845      --          null;
8846      --       end return;
8847      --    end Make_Lim_Ctrl;
8848      --
8849      --    Obj : Lim_Ctrl_Ptr := new Lim_Ctrl'(Make_Lim_Ctrl);
8850      --
8851      --  Even though the size of limited controlled type Lim_Ctrl is known,
8852      --  allocating Obj at the caller side will chain Obj on Lim_Ctrl_Ptr's
8853      --  finalization master. The subsequent call to Make_Lim_Ctrl will fail
8854      --  during the initialization actions for Result, which implies that
8855      --  Result (and Obj by extension) should not be finalized. However Obj
8856      --  will be finalized when access type Lim_Ctrl_Ptr goes out of scope
8857      --  since it is already attached on the related finalization master.
8858
8859      --  Here and in related routines, we must examine the full view of the
8860      --  type, because the view at the point of call may differ from the
8861      --  one in the function body, and the expansion mechanism depends on
8862      --  the characteristics of the full view.
8863
8864      if Needs_BIP_Alloc_Form (Function_Id) then
8865         Temp_Init := Empty;
8866
8867         --  Case of a user-defined storage pool. Pass an allocation parameter
8868         --  indicating that the function should allocate its result in the
8869         --  pool, and pass the pool. Use 'Unrestricted_Access because the
8870         --  pool may not be aliased.
8871
8872         if Present (Associated_Storage_Pool (Acc_Type)) then
8873            Alloc_Form := User_Storage_Pool;
8874            Pool :=
8875              Make_Attribute_Reference (Loc,
8876                Prefix         =>
8877                  New_Occurrence_Of
8878                    (Associated_Storage_Pool (Acc_Type), Loc),
8879                Attribute_Name => Name_Unrestricted_Access);
8880
8881         --  No user-defined pool; pass an allocation parameter indicating that
8882         --  the function should allocate its result on the heap.
8883
8884         else
8885            Alloc_Form := Global_Heap;
8886            Pool := Make_Null (No_Location);
8887         end if;
8888
8889         --  The caller does not provide the return object in this case, so we
8890         --  have to pass null for the object access actual.
8891
8892         Return_Obj_Actual := Empty;
8893
8894      else
8895         --  Replace the initialized allocator of form "new T'(Func (...))"
8896         --  with an uninitialized allocator of form "new T", where T is the
8897         --  result subtype of the called function. The call to the function
8898         --  is handled separately further below.
8899
8900         New_Allocator :=
8901           Make_Allocator (Loc,
8902             Expression => New_Occurrence_Of (Result_Subt, Loc));
8903         Set_No_Initialization (New_Allocator);
8904
8905         --  Copy attributes to new allocator. Note that the new allocator
8906         --  logically comes from source if the original one did, so copy the
8907         --  relevant flag. This ensures proper treatment of the restriction
8908         --  No_Implicit_Heap_Allocations in this case.
8909
8910         Set_Storage_Pool      (New_Allocator, Storage_Pool      (Allocator));
8911         Set_Procedure_To_Call (New_Allocator, Procedure_To_Call (Allocator));
8912         Set_Comes_From_Source (New_Allocator, Comes_From_Source (Allocator));
8913
8914         Rewrite (Allocator, New_Allocator);
8915
8916         --  Initial value of the temp is the result of the uninitialized
8917         --  allocator. Unchecked_Convert is needed for T'Input where T is
8918         --  derived from a controlled type.
8919
8920         Temp_Init := Relocate_Node (Allocator);
8921
8922         if Nkind (Function_Call) in
8923              N_Type_Conversion | N_Unchecked_Type_Conversion
8924         then
8925            Temp_Init := Unchecked_Convert_To (Acc_Type, Temp_Init);
8926         end if;
8927
8928         --  Indicate that caller allocates, and pass in the return object
8929
8930         Alloc_Form := Caller_Allocation;
8931         Pool := Make_Null (No_Location);
8932         Return_Obj_Actual := Unchecked_Convert_To
8933           (Result_Subt,
8934            Make_Explicit_Dereference (Loc,
8935              Prefix => New_Occurrence_Of (Return_Obj_Access, Loc)));
8936
8937      --  When the result subtype is unconstrained, the function itself must
8938      --  perform the allocation of the return object, so we pass parameters
8939      --  indicating that.
8940
8941      end if;
8942
8943      --  Declare the temp object
8944
8945      Insert_Action (Allocator,
8946        Make_Object_Declaration (Loc,
8947          Defining_Identifier => Return_Obj_Access,
8948          Object_Definition   => New_Occurrence_Of (Acc_Type, Loc),
8949          Expression          => Temp_Init));
8950
8951      Ref_Func_Call := Make_Reference (Loc, Func_Call);
8952
8953      --  Ada 2005 (AI-251): If the type of the allocator is an interface
8954      --  then generate an implicit conversion to force displacement of the
8955      --  "this" pointer.
8956
8957      if Is_Interface (Designated_Type (Acc_Type)) then
8958         Rewrite
8959           (Ref_Func_Call,
8960            OK_Convert_To (Acc_Type, Ref_Func_Call));
8961
8962      --  If the types are incompatible, we need an unchecked conversion. Note
8963      --  that the full types will be compatible, but the types not visibly
8964      --  compatible.
8965
8966      elsif Nkind (Function_Call)
8967              in N_Type_Conversion | N_Unchecked_Type_Conversion
8968      then
8969         Ref_Func_Call := Unchecked_Convert_To (Acc_Type, Ref_Func_Call);
8970      end if;
8971
8972      declare
8973         Assign : constant Node_Id :=
8974                    Make_Assignment_Statement (Loc,
8975                      Name       => New_Occurrence_Of (Return_Obj_Access, Loc),
8976                      Expression => Ref_Func_Call);
8977         --  Assign the result of the function call into the temp. In the
8978         --  caller-allocates case, this is overwriting the temp with its
8979         --  initial value, which has no effect. In the callee-allocates case,
8980         --  this is setting the temp to point to the object allocated by the
8981         --  callee. Unchecked_Convert is needed for T'Input where T is derived
8982         --  from a controlled type.
8983
8984         Actions : List_Id;
8985         --  Actions to be inserted. If there are no tasks, this is just the
8986         --  assignment statement. If the allocated object has tasks, we need
8987         --  to wrap the assignment in a block that activates them. The
8988         --  activation chain of that block must be passed to the function,
8989         --  rather than some outer chain.
8990
8991      begin
8992         if Might_Have_Tasks (Result_Subt) then
8993            Actions := New_List;
8994            Build_Task_Allocate_Block_With_Init_Stmts
8995              (Actions, Allocator, Init_Stmts => New_List (Assign));
8996            Chain := Activation_Chain_Entity (Last (Actions));
8997         else
8998            Actions := New_List (Assign);
8999            Chain   := Empty;
9000         end if;
9001
9002         Insert_Actions (Allocator, Actions);
9003      end;
9004
9005      --  When the function has a controlling result, an allocation-form
9006      --  parameter must be passed indicating that the caller is allocating
9007      --  the result object. This is needed because such a function can be
9008      --  called as a dispatching operation and must be treated similarly
9009      --  to functions with unconstrained result subtypes.
9010
9011      Add_Unconstrained_Actuals_To_Build_In_Place_Call
9012        (Func_Call, Function_Id, Alloc_Form, Pool_Actual => Pool);
9013
9014      Add_Finalization_Master_Actual_To_Build_In_Place_Call
9015        (Func_Call, Function_Id, Acc_Type);
9016
9017      Add_Task_Actuals_To_Build_In_Place_Call
9018        (Func_Call, Function_Id, Master_Actual => Master_Id (Acc_Type),
9019         Chain => Chain);
9020
9021      --  Add an implicit actual to the function call that provides access
9022      --  to the allocated object. An unchecked conversion to the (specific)
9023      --  result subtype of the function is inserted to handle cases where
9024      --  the access type of the allocator has a class-wide designated type.
9025
9026      Add_Access_Actual_To_Build_In_Place_Call
9027        (Func_Call, Function_Id, Return_Obj_Actual);
9028
9029      --  Finally, replace the allocator node with a reference to the temp
9030
9031      Rewrite (Allocator, New_Occurrence_Of (Return_Obj_Access, Loc));
9032
9033      Analyze_And_Resolve (Allocator, Acc_Type);
9034      pragma Assert (Check_Number_Of_Actuals (Func_Call, Function_Id));
9035      pragma Assert (Check_BIP_Actuals (Func_Call, Function_Id));
9036   end Make_Build_In_Place_Call_In_Allocator;
9037
9038   ---------------------------------------------------
9039   -- Make_Build_In_Place_Call_In_Anonymous_Context --
9040   ---------------------------------------------------
9041
9042   procedure Make_Build_In_Place_Call_In_Anonymous_Context
9043     (Function_Call : Node_Id)
9044   is
9045      Loc             : constant Source_Ptr := Sloc (Function_Call);
9046      Func_Call       : constant Node_Id := Unqual_Conv (Function_Call);
9047      Function_Id     : Entity_Id;
9048      Result_Subt     : Entity_Id;
9049      Return_Obj_Id   : Entity_Id;
9050      Return_Obj_Decl : Entity_Id;
9051
9052   begin
9053      --  If the call has already been processed to add build-in-place actuals
9054      --  then return. One place this can occur is for calls to build-in-place
9055      --  functions that occur within a call to a protected operation, where
9056      --  due to rewriting and expansion of the protected call there can be
9057      --  more than one call to Expand_Actuals for the same set of actuals.
9058
9059      if Is_Expanded_Build_In_Place_Call (Func_Call) then
9060         return;
9061      end if;
9062
9063      --  Mark the call as processed as a build-in-place call
9064
9065      Set_Is_Expanded_Build_In_Place_Call (Func_Call);
9066
9067      if Is_Entity_Name (Name (Func_Call)) then
9068         Function_Id := Entity (Name (Func_Call));
9069
9070      elsif Nkind (Name (Func_Call)) = N_Explicit_Dereference then
9071         Function_Id := Etype (Name (Func_Call));
9072
9073      else
9074         raise Program_Error;
9075      end if;
9076
9077      Warn_BIP (Func_Call);
9078
9079      Result_Subt := Etype (Function_Id);
9080
9081      --  If the build-in-place function returns a controlled object, then the
9082      --  object needs to be finalized immediately after the context. Since
9083      --  this case produces a transient scope, the servicing finalizer needs
9084      --  to name the returned object. Create a temporary which is initialized
9085      --  with the function call:
9086      --
9087      --    Temp_Id : Func_Type := BIP_Func_Call;
9088      --
9089      --  The initialization expression of the temporary will be rewritten by
9090      --  the expander using the appropriate mechanism in Make_Build_In_Place_
9091      --  Call_In_Object_Declaration.
9092
9093      if Needs_Finalization (Result_Subt) then
9094         declare
9095            Temp_Id   : constant Entity_Id := Make_Temporary (Loc, 'R');
9096            Temp_Decl : Node_Id;
9097
9098         begin
9099            --  Reset the guard on the function call since the following does
9100            --  not perform actual call expansion.
9101
9102            Set_Is_Expanded_Build_In_Place_Call (Func_Call, False);
9103
9104            Temp_Decl :=
9105              Make_Object_Declaration (Loc,
9106                Defining_Identifier => Temp_Id,
9107                Object_Definition =>
9108                  New_Occurrence_Of (Result_Subt, Loc),
9109                Expression =>
9110                  New_Copy_Tree (Function_Call));
9111
9112            Insert_Action (Function_Call, Temp_Decl);
9113
9114            Rewrite (Function_Call, New_Occurrence_Of (Temp_Id, Loc));
9115            Analyze (Function_Call);
9116         end;
9117
9118      --  When the result subtype is definite, an object of the subtype is
9119      --  declared and an access value designating it is passed as an actual.
9120
9121      elsif Caller_Known_Size (Func_Call, Result_Subt) then
9122
9123         --  Create a temporary object to hold the function result
9124
9125         Return_Obj_Id := Make_Temporary (Loc, 'R');
9126         Set_Etype (Return_Obj_Id, Result_Subt);
9127
9128         Return_Obj_Decl :=
9129           Make_Object_Declaration (Loc,
9130             Defining_Identifier => Return_Obj_Id,
9131             Aliased_Present     => True,
9132             Object_Definition   => New_Occurrence_Of (Result_Subt, Loc));
9133
9134         Set_No_Initialization (Return_Obj_Decl);
9135
9136         Insert_Action (Func_Call, Return_Obj_Decl);
9137
9138         --  When the function has a controlling result, an allocation-form
9139         --  parameter must be passed indicating that the caller is allocating
9140         --  the result object. This is needed because such a function can be
9141         --  called as a dispatching operation and must be treated similarly
9142         --  to functions with unconstrained result subtypes.
9143
9144         Add_Unconstrained_Actuals_To_Build_In_Place_Call
9145           (Func_Call, Function_Id, Alloc_Form => Caller_Allocation);
9146
9147         Add_Finalization_Master_Actual_To_Build_In_Place_Call
9148           (Func_Call, Function_Id);
9149
9150         Add_Task_Actuals_To_Build_In_Place_Call
9151           (Func_Call, Function_Id, Make_Identifier (Loc, Name_uMaster));
9152
9153         --  Add an implicit actual to the function call that provides access
9154         --  to the caller's return object.
9155
9156         Add_Access_Actual_To_Build_In_Place_Call
9157           (Func_Call, Function_Id, New_Occurrence_Of (Return_Obj_Id, Loc));
9158
9159         pragma Assert (Check_Number_Of_Actuals (Func_Call, Function_Id));
9160         pragma Assert (Check_BIP_Actuals (Func_Call, Function_Id));
9161
9162      --  When the result subtype is unconstrained, the function must allocate
9163      --  the return object in the secondary stack, so appropriate implicit
9164      --  parameters are added to the call to indicate that. A transient
9165      --  scope is established to ensure eventual cleanup of the result.
9166
9167      else
9168         --  Pass an allocation parameter indicating that the function should
9169         --  allocate its result on the secondary stack.
9170
9171         Add_Unconstrained_Actuals_To_Build_In_Place_Call
9172           (Func_Call, Function_Id, Alloc_Form => Secondary_Stack);
9173
9174         Add_Finalization_Master_Actual_To_Build_In_Place_Call
9175           (Func_Call, Function_Id);
9176
9177         Add_Task_Actuals_To_Build_In_Place_Call
9178           (Func_Call, Function_Id, Make_Identifier (Loc, Name_uMaster));
9179
9180         --  Pass a null value to the function since no return object is
9181         --  available on the caller side.
9182
9183         Add_Access_Actual_To_Build_In_Place_Call
9184           (Func_Call, Function_Id, Empty);
9185
9186         pragma Assert (Check_Number_Of_Actuals (Func_Call, Function_Id));
9187         pragma Assert (Check_BIP_Actuals (Func_Call, Function_Id));
9188      end if;
9189   end Make_Build_In_Place_Call_In_Anonymous_Context;
9190
9191   --------------------------------------------
9192   -- Make_Build_In_Place_Call_In_Assignment --
9193   --------------------------------------------
9194
9195   procedure Make_Build_In_Place_Call_In_Assignment
9196     (Assign        : Node_Id;
9197      Function_Call : Node_Id)
9198   is
9199      Func_Call    : constant Node_Id    := Unqual_Conv (Function_Call);
9200      Lhs          : constant Node_Id    := Name (Assign);
9201      Loc          : constant Source_Ptr := Sloc (Function_Call);
9202      Func_Id      : Entity_Id;
9203      Obj_Decl     : Node_Id;
9204      Obj_Id       : Entity_Id;
9205      Ptr_Typ      : Entity_Id;
9206      Ptr_Typ_Decl : Node_Id;
9207      New_Expr     : Node_Id;
9208      Result_Subt  : Entity_Id;
9209
9210   begin
9211      --  Mark the call as processed as a build-in-place call
9212
9213      pragma Assert (not Is_Expanded_Build_In_Place_Call (Func_Call));
9214      Set_Is_Expanded_Build_In_Place_Call (Func_Call);
9215
9216      if Is_Entity_Name (Name (Func_Call)) then
9217         Func_Id := Entity (Name (Func_Call));
9218
9219      elsif Nkind (Name (Func_Call)) = N_Explicit_Dereference then
9220         Func_Id := Etype (Name (Func_Call));
9221
9222      else
9223         raise Program_Error;
9224      end if;
9225
9226      Warn_BIP (Func_Call);
9227
9228      Result_Subt := Etype (Func_Id);
9229
9230      --  When the result subtype is unconstrained, an additional actual must
9231      --  be passed to indicate that the caller is providing the return object.
9232      --  This parameter must also be passed when the called function has a
9233      --  controlling result, because dispatching calls to the function needs
9234      --  to be treated effectively the same as calls to class-wide functions.
9235
9236      Add_Unconstrained_Actuals_To_Build_In_Place_Call
9237        (Func_Call, Func_Id, Alloc_Form => Caller_Allocation);
9238
9239      Add_Finalization_Master_Actual_To_Build_In_Place_Call
9240        (Func_Call, Func_Id);
9241
9242      Add_Task_Actuals_To_Build_In_Place_Call
9243        (Func_Call, Func_Id, Make_Identifier (Loc, Name_uMaster));
9244
9245      --  Add an implicit actual to the function call that provides access to
9246      --  the caller's return object.
9247
9248      Add_Access_Actual_To_Build_In_Place_Call
9249        (Func_Call, Func_Id, Unchecked_Convert_To (Result_Subt, Lhs));
9250
9251      --  Create an access type designating the function's result subtype
9252
9253      Ptr_Typ := Make_Temporary (Loc, 'A');
9254
9255      Ptr_Typ_Decl :=
9256        Make_Full_Type_Declaration (Loc,
9257          Defining_Identifier => Ptr_Typ,
9258          Type_Definition     =>
9259            Make_Access_To_Object_Definition (Loc,
9260              All_Present        => True,
9261              Subtype_Indication =>
9262                New_Occurrence_Of (Result_Subt, Loc)));
9263      Insert_After_And_Analyze (Assign, Ptr_Typ_Decl);
9264
9265      --  Finally, create an access object initialized to a reference to the
9266      --  function call. We know this access value is non-null, so mark the
9267      --  entity accordingly to suppress junk access checks.
9268
9269      New_Expr := Make_Reference (Loc, Relocate_Node (Func_Call));
9270
9271      --  Add a conversion if it's the wrong type
9272
9273      New_Expr := Unchecked_Convert_To (Ptr_Typ, New_Expr);
9274
9275      Obj_Id := Make_Temporary (Loc, 'R', New_Expr);
9276      Set_Etype (Obj_Id, Ptr_Typ);
9277      Set_Is_Known_Non_Null (Obj_Id);
9278
9279      Obj_Decl :=
9280        Make_Object_Declaration (Loc,
9281          Defining_Identifier => Obj_Id,
9282          Object_Definition   => New_Occurrence_Of (Ptr_Typ, Loc),
9283          Expression          => New_Expr);
9284      Insert_After_And_Analyze (Ptr_Typ_Decl, Obj_Decl);
9285
9286      Rewrite (Assign, Make_Null_Statement (Loc));
9287      pragma Assert (Check_Number_Of_Actuals (Func_Call, Func_Id));
9288      pragma Assert (Check_BIP_Actuals (Func_Call, Func_Id));
9289   end Make_Build_In_Place_Call_In_Assignment;
9290
9291   ----------------------------------------------------
9292   -- Make_Build_In_Place_Call_In_Object_Declaration --
9293   ----------------------------------------------------
9294
9295   procedure Make_Build_In_Place_Call_In_Object_Declaration
9296     (Obj_Decl      : Node_Id;
9297      Function_Call : Node_Id)
9298   is
9299      function Get_Function_Id (Func_Call : Node_Id) return Entity_Id;
9300      --  Get the value of Function_Id, below
9301
9302      ---------------------
9303      -- Get_Function_Id --
9304      ---------------------
9305
9306      function Get_Function_Id (Func_Call : Node_Id) return Entity_Id is
9307      begin
9308         if Is_Entity_Name (Name (Func_Call)) then
9309            return Entity (Name (Func_Call));
9310
9311         elsif Nkind (Name (Func_Call)) = N_Explicit_Dereference then
9312            return Etype (Name (Func_Call));
9313
9314         else
9315            raise Program_Error;
9316         end if;
9317      end Get_Function_Id;
9318
9319      --  Local variables
9320
9321      Func_Call   : constant Node_Id    := Unqual_Conv (Function_Call);
9322      Function_Id : constant Entity_Id  := Get_Function_Id (Func_Call);
9323      Loc         : constant Source_Ptr := Sloc (Function_Call);
9324      Obj_Loc     : constant Source_Ptr := Sloc (Obj_Decl);
9325      Obj_Def_Id  : constant Entity_Id  := Defining_Identifier (Obj_Decl);
9326      Obj_Typ     : constant Entity_Id  := Etype (Obj_Def_Id);
9327      Encl_Func   : constant Entity_Id  := Enclosing_Subprogram (Obj_Def_Id);
9328      Result_Subt : constant Entity_Id  := Etype (Function_Id);
9329
9330      Call_Deref      : Node_Id;
9331      Caller_Object   : Node_Id;
9332      Def_Id          : Entity_Id;
9333      Designated_Type : Entity_Id;
9334      Fmaster_Actual  : Node_Id := Empty;
9335      Pool_Actual     : Node_Id;
9336      Ptr_Typ         : Entity_Id;
9337      Ptr_Typ_Decl    : Node_Id;
9338      Pass_Caller_Acc : Boolean := False;
9339      Res_Decl        : Node_Id;
9340
9341      Definite : constant Boolean :=
9342                   Caller_Known_Size (Func_Call, Result_Subt)
9343                     and then not Is_Class_Wide_Type (Obj_Typ);
9344      --  In the case of "X : T'Class := F(...);", where F returns a
9345      --  Caller_Known_Size (specific) tagged type, we treat it as
9346      --  indefinite, because the code for the Definite case below sets the
9347      --  initialization expression of the object to Empty, which would be
9348      --  illegal Ada, and would cause gigi to misallocate X.
9349
9350   --  Start of processing for Make_Build_In_Place_Call_In_Object_Declaration
9351
9352   begin
9353      --  If the call has already been processed to add build-in-place actuals
9354      --  then return.
9355
9356      if Is_Expanded_Build_In_Place_Call (Func_Call) then
9357         return;
9358      end if;
9359
9360      --  Mark the call as processed as a build-in-place call
9361
9362      Set_Is_Expanded_Build_In_Place_Call (Func_Call);
9363
9364      Warn_BIP (Func_Call);
9365
9366      --  Create an access type designating the function's result subtype.
9367      --  We use the type of the original call because it may be a call to an
9368      --  inherited operation, which the expansion has replaced with the parent
9369      --  operation that yields the parent type. Note that this access type
9370      --  must be declared before we establish a transient scope, so that it
9371      --  receives the proper accessibility level.
9372
9373      if Is_Class_Wide_Type (Obj_Typ)
9374        and then not Is_Interface (Obj_Typ)
9375        and then not Is_Class_Wide_Type (Etype (Function_Call))
9376      then
9377         Designated_Type := Obj_Typ;
9378      else
9379         Designated_Type := Etype (Function_Call);
9380      end if;
9381
9382      Ptr_Typ := Make_Temporary (Loc, 'A');
9383      Ptr_Typ_Decl :=
9384        Make_Full_Type_Declaration (Loc,
9385          Defining_Identifier => Ptr_Typ,
9386          Type_Definition     =>
9387            Make_Access_To_Object_Definition (Loc,
9388              All_Present        => True,
9389              Subtype_Indication =>
9390                New_Occurrence_Of (Designated_Type, Loc)));
9391
9392      --  The access type and its accompanying object must be inserted after
9393      --  the object declaration in the constrained case, so that the function
9394      --  call can be passed access to the object. In the indefinite case, or
9395      --  if the object declaration is for a return object, the access type and
9396      --  object must be inserted before the object, since the object
9397      --  declaration is rewritten to be a renaming of a dereference of the
9398      --  access object. Note: we need to freeze Ptr_Typ explicitly, because
9399      --  the result object is in a different (transient) scope, so won't cause
9400      --  freezing.
9401
9402      if Definite and then not Is_Return_Object (Obj_Def_Id) then
9403
9404         --  The presence of an address clause complicates the build-in-place
9405         --  expansion because the indicated address must be processed before
9406         --  the indirect call is generated (including the definition of a
9407         --  local pointer to the object). The address clause may come from
9408         --  an aspect specification or from an explicit attribute
9409         --  specification appearing after the object declaration. These two
9410         --  cases require different processing.
9411
9412         if Has_Aspect (Obj_Def_Id, Aspect_Address) then
9413
9414            --  Skip non-delayed pragmas that correspond to other aspects, if
9415            --  any, to find proper insertion point for freeze node of object.
9416
9417            declare
9418               D : Node_Id := Obj_Decl;
9419               N : Node_Id := Next (D);
9420
9421            begin
9422               while Present (N)
9423                 and then Nkind (N) in N_Attribute_Reference | N_Pragma
9424               loop
9425                  Analyze (N);
9426                  D := N;
9427                  Next (N);
9428               end loop;
9429
9430               Insert_After (D, Ptr_Typ_Decl);
9431
9432               --  Freeze object before pointer declaration, to ensure that
9433               --  generated attribute for address is inserted at the proper
9434               --  place.
9435
9436               Freeze_Before (Ptr_Typ_Decl, Obj_Def_Id);
9437            end;
9438
9439            Analyze (Ptr_Typ_Decl);
9440
9441         elsif Present (Following_Address_Clause (Obj_Decl)) then
9442
9443            --  Locate explicit address clause, which may also follow pragmas
9444            --  generated by other aspect specifications.
9445
9446            declare
9447               Addr : constant Node_Id := Following_Address_Clause (Obj_Decl);
9448               D    : Node_Id := Next (Obj_Decl);
9449
9450            begin
9451               while Present (D) loop
9452                  Analyze (D);
9453                  exit when D = Addr;
9454                  Next (D);
9455               end loop;
9456
9457               Insert_After_And_Analyze (Addr, Ptr_Typ_Decl);
9458            end;
9459
9460         else
9461            Insert_After_And_Analyze (Obj_Decl, Ptr_Typ_Decl);
9462         end if;
9463      else
9464         Insert_Action (Obj_Decl, Ptr_Typ_Decl);
9465      end if;
9466
9467      --  Force immediate freezing of Ptr_Typ because Res_Decl will be
9468      --  elaborated in an inner (transient) scope and thus won't cause
9469      --  freezing by itself. It's not an itype, but it needs to be frozen
9470      --  inside the current subprogram (see Freeze_Outside in freeze.adb).
9471
9472      Freeze_Itype (Ptr_Typ, Ptr_Typ_Decl);
9473
9474      --  If the object is a return object of an enclosing build-in-place
9475      --  function, then the implicit build-in-place parameters of the
9476      --  enclosing function are simply passed along to the called function.
9477      --  (Unfortunately, this won't cover the case of extension aggregates
9478      --  where the ancestor part is a build-in-place indefinite function
9479      --  call that should be passed along the caller's parameters.
9480      --  Currently those get mishandled by reassigning the result of the
9481      --  call to the aggregate return object, when the call result should
9482      --  really be directly built in place in the aggregate and not in a
9483      --  temporary. ???)
9484
9485      if Is_Return_Object (Obj_Def_Id) then
9486         Pass_Caller_Acc := True;
9487
9488         --  When the enclosing function has a BIP_Alloc_Form formal then we
9489         --  pass it along to the callee (such as when the enclosing function
9490         --  has an unconstrained or tagged result type).
9491
9492         if Needs_BIP_Alloc_Form (Encl_Func) then
9493            if RTE_Available (RE_Root_Storage_Pool_Ptr) then
9494               Pool_Actual :=
9495                 New_Occurrence_Of
9496                   (Build_In_Place_Formal
9497                     (Encl_Func, BIP_Storage_Pool), Loc);
9498
9499            --  The build-in-place pool formal is not built on e.g. ZFP
9500
9501            else
9502               Pool_Actual := Empty;
9503            end if;
9504
9505            Add_Unconstrained_Actuals_To_Build_In_Place_Call
9506              (Function_Call  => Func_Call,
9507               Function_Id    => Function_Id,
9508               Alloc_Form_Exp =>
9509                 New_Occurrence_Of
9510                   (Build_In_Place_Formal (Encl_Func, BIP_Alloc_Form), Loc),
9511               Pool_Actual    => Pool_Actual);
9512
9513         --  Otherwise, if enclosing function has a definite result subtype,
9514         --  then caller allocation will be used.
9515
9516         else
9517            Add_Unconstrained_Actuals_To_Build_In_Place_Call
9518              (Func_Call, Function_Id, Alloc_Form => Caller_Allocation);
9519         end if;
9520
9521         if Needs_BIP_Finalization_Master (Encl_Func) then
9522            Fmaster_Actual :=
9523              New_Occurrence_Of
9524                (Build_In_Place_Formal
9525                   (Encl_Func, BIP_Finalization_Master), Loc);
9526         end if;
9527
9528         --  Retrieve the BIPacc formal from the enclosing function and convert
9529         --  it to the access type of the callee's BIP_Object_Access formal.
9530
9531         Caller_Object :=
9532           Unchecked_Convert_To
9533             (Etype (Build_In_Place_Formal (Function_Id, BIP_Object_Access)),
9534              New_Occurrence_Of
9535                (Build_In_Place_Formal (Encl_Func, BIP_Object_Access), Loc));
9536
9537      --  In the definite case, add an implicit actual to the function call
9538      --  that provides access to the declared object. An unchecked conversion
9539      --  to the (specific) result type of the function is inserted to handle
9540      --  the case where the object is declared with a class-wide type.
9541
9542      elsif Definite then
9543         Caller_Object := Unchecked_Convert_To
9544           (Result_Subt, New_Occurrence_Of (Obj_Def_Id, Loc));
9545
9546         --  When the function has a controlling result, an allocation-form
9547         --  parameter must be passed indicating that the caller is allocating
9548         --  the result object. This is needed because such a function can be
9549         --  called as a dispatching operation and must be treated similarly to
9550         --  functions with indefinite result subtypes.
9551
9552         Add_Unconstrained_Actuals_To_Build_In_Place_Call
9553           (Func_Call, Function_Id, Alloc_Form => Caller_Allocation);
9554
9555      --  The allocation for indefinite library-level objects occurs on the
9556      --  heap as opposed to the secondary stack. This accommodates DLLs where
9557      --  the secondary stack is destroyed after each library unload. This is a
9558      --  hybrid mechanism where a stack-allocated object lives on the heap.
9559
9560      elsif Is_Library_Level_Entity (Obj_Def_Id)
9561        and then not Restriction_Active (No_Implicit_Heap_Allocations)
9562      then
9563         Add_Unconstrained_Actuals_To_Build_In_Place_Call
9564           (Func_Call, Function_Id, Alloc_Form => Global_Heap);
9565         Caller_Object := Empty;
9566
9567         --  Create a finalization master for the access result type to ensure
9568         --  that the heap allocation can properly chain the object and later
9569         --  finalize it when the library unit goes out of scope.
9570
9571         if Needs_Finalization (Etype (Func_Call)) then
9572            Build_Finalization_Master
9573              (Typ            => Ptr_Typ,
9574               For_Lib_Level  => True,
9575               Insertion_Node => Ptr_Typ_Decl);
9576
9577            Fmaster_Actual :=
9578              Make_Attribute_Reference (Loc,
9579                Prefix         =>
9580                  New_Occurrence_Of (Finalization_Master (Ptr_Typ), Loc),
9581                Attribute_Name => Name_Unrestricted_Access);
9582         end if;
9583
9584      --  In other indefinite cases, pass an indication to do the allocation
9585      --  on the secondary stack and set Caller_Object to Empty so that a null
9586      --  value will be passed for the caller's object address. A transient
9587      --  scope is established to ensure eventual cleanup of the result.
9588
9589      else
9590         Add_Unconstrained_Actuals_To_Build_In_Place_Call
9591           (Func_Call, Function_Id, Alloc_Form => Secondary_Stack);
9592         Caller_Object := Empty;
9593
9594         Establish_Transient_Scope (Obj_Decl, Manage_Sec_Stack => True);
9595      end if;
9596
9597      --  Pass along any finalization master actual, which is needed in the
9598      --  case where the called function initializes a return object of an
9599      --  enclosing build-in-place function.
9600
9601      Add_Finalization_Master_Actual_To_Build_In_Place_Call
9602        (Func_Call  => Func_Call,
9603         Func_Id    => Function_Id,
9604         Master_Exp => Fmaster_Actual);
9605
9606      if Nkind (Parent (Obj_Decl)) = N_Extended_Return_Statement
9607        and then Needs_BIP_Task_Actuals (Function_Id)
9608      then
9609         --  Here we're passing along the master that was passed in to this
9610         --  function.
9611
9612         Add_Task_Actuals_To_Build_In_Place_Call
9613           (Func_Call, Function_Id,
9614            Master_Actual =>
9615              New_Occurrence_Of
9616                (Build_In_Place_Formal (Encl_Func, BIP_Task_Master), Loc));
9617
9618      else
9619         Add_Task_Actuals_To_Build_In_Place_Call
9620           (Func_Call, Function_Id, Make_Identifier (Loc, Name_uMaster));
9621      end if;
9622
9623      Add_Access_Actual_To_Build_In_Place_Call
9624        (Func_Call,
9625         Function_Id,
9626         Caller_Object,
9627         Is_Access => Pass_Caller_Acc);
9628
9629      --  Finally, create an access object initialized to a reference to the
9630      --  function call. We know this access value cannot be null, so mark the
9631      --  entity accordingly to suppress the access check. We need to suppress
9632      --  warnings, because this can be part of the expansion of "for ... of"
9633      --  and similar constructs that generate finalization actions. Such
9634      --  finalization actions are safe, because they check a count that
9635      --  indicates which objects should be finalized, but the back end
9636      --  nonetheless warns about uninitialized objects.
9637
9638      Def_Id := Make_Temporary (Loc, 'R', Func_Call);
9639      Set_Warnings_Off (Def_Id);
9640      Set_Etype (Def_Id, Ptr_Typ);
9641      Set_Is_Known_Non_Null (Def_Id);
9642
9643      if Nkind (Function_Call) in N_Type_Conversion
9644                                | N_Unchecked_Type_Conversion
9645      then
9646         Res_Decl :=
9647           Make_Object_Declaration (Loc,
9648             Defining_Identifier => Def_Id,
9649             Constant_Present    => True,
9650             Object_Definition   => New_Occurrence_Of (Ptr_Typ, Loc),
9651             Expression          =>
9652               Unchecked_Convert_To
9653                 (Ptr_Typ, Make_Reference (Loc, Relocate_Node (Func_Call))));
9654      else
9655         Res_Decl :=
9656           Make_Object_Declaration (Loc,
9657             Defining_Identifier => Def_Id,
9658             Constant_Present    => True,
9659             Object_Definition   => New_Occurrence_Of (Ptr_Typ, Loc),
9660             Expression          =>
9661               Make_Reference (Loc, Relocate_Node (Func_Call)));
9662      end if;
9663
9664      Insert_After_And_Analyze (Ptr_Typ_Decl, Res_Decl);
9665
9666      --  If the result subtype of the called function is definite and is not
9667      --  itself the return expression of an enclosing BIP function, then mark
9668      --  the object as having no initialization.
9669
9670      if Definite and then not Is_Return_Object (Obj_Def_Id) then
9671
9672         --  The related object declaration is encased in a transient block
9673         --  because the build-in-place function call contains at least one
9674         --  nested function call that produces a controlled transient
9675         --  temporary:
9676
9677         --    Obj : ... := BIP_Func_Call (Ctrl_Func_Call);
9678
9679         --  Since the build-in-place expansion decouples the call from the
9680         --  object declaration, the finalization machinery lacks the context
9681         --  which prompted the generation of the transient block. To resolve
9682         --  this scenario, store the build-in-place call.
9683
9684         if Scope_Is_Transient then
9685            Set_BIP_Initialization_Call (Obj_Def_Id, Res_Decl);
9686         end if;
9687
9688         Set_Expression (Obj_Decl, Empty);
9689         Set_No_Initialization (Obj_Decl);
9690
9691      --  In case of an indefinite result subtype, or if the call is the
9692      --  return expression of an enclosing BIP function, rewrite the object
9693      --  declaration as an object renaming where the renamed object is a
9694      --  dereference of <function_Call>'reference:
9695      --
9696      --      Obj : Subt renames <function_call>'Ref.all;
9697
9698      else
9699         Call_Deref :=
9700           Make_Explicit_Dereference (Obj_Loc,
9701             Prefix => New_Occurrence_Of (Def_Id, Obj_Loc));
9702
9703         Rewrite (Obj_Decl,
9704           Make_Object_Renaming_Declaration (Obj_Loc,
9705             Defining_Identifier => Make_Temporary (Obj_Loc, 'D'),
9706             Subtype_Mark        =>
9707               New_Occurrence_Of (Designated_Type, Obj_Loc),
9708             Name                => Call_Deref));
9709
9710         --  At this point, Defining_Identifier (Obj_Decl) is no longer equal
9711         --  to Obj_Def_Id.
9712
9713         pragma Assert (Ekind (Defining_Identifier (Obj_Decl)) = E_Void);
9714         Set_Renamed_Object_Of_Possibly_Void
9715           (Defining_Identifier (Obj_Decl), Call_Deref);
9716
9717         --  If the original entity comes from source, then mark the new
9718         --  entity as needing debug information, even though it's defined
9719         --  by a generated renaming that does not come from source, so that
9720         --  the Materialize_Entity flag will be set on the entity when
9721         --  Debug_Renaming_Declaration is called during analysis.
9722
9723         if Comes_From_Source (Obj_Def_Id) then
9724            Set_Debug_Info_Needed (Defining_Identifier (Obj_Decl));
9725         end if;
9726
9727         Analyze (Obj_Decl);
9728         Replace_Renaming_Declaration_Id
9729           (Obj_Decl, Original_Node (Obj_Decl));
9730      end if;
9731
9732      pragma Assert (Check_Number_Of_Actuals (Func_Call, Function_Id));
9733      pragma Assert (Check_BIP_Actuals (Func_Call, Function_Id));
9734   end Make_Build_In_Place_Call_In_Object_Declaration;
9735
9736   -------------------------------------------------
9737   -- Make_Build_In_Place_Iface_Call_In_Allocator --
9738   -------------------------------------------------
9739
9740   procedure Make_Build_In_Place_Iface_Call_In_Allocator
9741     (Allocator     : Node_Id;
9742      Function_Call : Node_Id)
9743   is
9744      BIP_Func_Call : constant Node_Id :=
9745                        Unqual_BIP_Iface_Function_Call (Function_Call);
9746      Loc           : constant Source_Ptr := Sloc (Function_Call);
9747
9748      Anon_Type : Entity_Id;
9749      Tmp_Decl  : Node_Id;
9750      Tmp_Id    : Entity_Id;
9751
9752   begin
9753      --  No action if the call has already been processed
9754
9755      if Is_Expanded_Build_In_Place_Call (BIP_Func_Call) then
9756         return;
9757      end if;
9758
9759      Tmp_Id := Make_Temporary (Loc, 'D');
9760
9761      --  Insert a temporary before N initialized with the BIP function call
9762      --  without its enclosing type conversions and analyze it without its
9763      --  expansion. This temporary facilitates us reusing the BIP machinery,
9764      --  which takes care of adding the extra build-in-place actuals and
9765      --  transforms this object declaration into an object renaming
9766      --  declaration.
9767
9768      Anon_Type := Create_Itype (E_Anonymous_Access_Type, Function_Call);
9769      Set_Directly_Designated_Type (Anon_Type, Etype (BIP_Func_Call));
9770      Set_Etype (Anon_Type, Anon_Type);
9771      Build_Class_Wide_Master (Anon_Type);
9772
9773      Tmp_Decl :=
9774        Make_Object_Declaration (Loc,
9775          Defining_Identifier => Tmp_Id,
9776          Object_Definition   => New_Occurrence_Of (Anon_Type, Loc),
9777          Expression          =>
9778            Make_Allocator (Loc,
9779              Expression =>
9780                Make_Qualified_Expression (Loc,
9781                  Subtype_Mark =>
9782                    New_Occurrence_Of (Etype (BIP_Func_Call), Loc),
9783                  Expression   => New_Copy_Tree (BIP_Func_Call))));
9784
9785      --  Manually set the associated node for the anonymous access type to
9786      --  be its local declaration, to avoid confusing and complicating
9787      --  the accessibility machinery.
9788
9789      Set_Associated_Node_For_Itype (Anon_Type, Tmp_Decl);
9790
9791      Expander_Mode_Save_And_Set (False);
9792      Insert_Action (Allocator, Tmp_Decl);
9793      Expander_Mode_Restore;
9794
9795      Make_Build_In_Place_Call_In_Allocator
9796        (Allocator     => Expression (Tmp_Decl),
9797         Function_Call => Expression (Expression (Tmp_Decl)));
9798
9799      --  Add a conversion to displace the pointer to the allocated object
9800      --  to reference the corresponding dispatch table.
9801
9802      Rewrite (Allocator,
9803        Convert_To (Etype (Allocator),
9804          New_Occurrence_Of (Tmp_Id, Loc)));
9805   end Make_Build_In_Place_Iface_Call_In_Allocator;
9806
9807   ---------------------------------------------------------
9808   -- Make_Build_In_Place_Iface_Call_In_Anonymous_Context --
9809   ---------------------------------------------------------
9810
9811   procedure Make_Build_In_Place_Iface_Call_In_Anonymous_Context
9812     (Function_Call : Node_Id)
9813   is
9814      BIP_Func_Call : constant Node_Id :=
9815                        Unqual_BIP_Iface_Function_Call (Function_Call);
9816      Loc           : constant Source_Ptr := Sloc (Function_Call);
9817
9818      Tmp_Decl : Node_Id;
9819      Tmp_Id   : Entity_Id;
9820
9821   begin
9822      --  No action of the call has already been processed
9823
9824      if Is_Expanded_Build_In_Place_Call (BIP_Func_Call) then
9825         return;
9826      end if;
9827
9828      pragma Assert (Needs_Finalization (Etype (BIP_Func_Call)));
9829
9830      --  Insert a temporary before the call initialized with function call to
9831      --  reuse the BIP machinery which takes care of adding the extra build-in
9832      --  place actuals and transforms this object declaration into an object
9833      --  renaming declaration.
9834
9835      Tmp_Id := Make_Temporary (Loc, 'D');
9836
9837      Tmp_Decl :=
9838        Make_Object_Declaration (Loc,
9839          Defining_Identifier => Tmp_Id,
9840          Object_Definition   =>
9841            New_Occurrence_Of (Etype (Function_Call), Loc),
9842          Expression          => Relocate_Node (Function_Call));
9843
9844      Expander_Mode_Save_And_Set (False);
9845      Insert_Action (Function_Call, Tmp_Decl);
9846      Expander_Mode_Restore;
9847
9848      Make_Build_In_Place_Iface_Call_In_Object_Declaration
9849        (Obj_Decl      => Tmp_Decl,
9850         Function_Call => Expression (Tmp_Decl));
9851   end Make_Build_In_Place_Iface_Call_In_Anonymous_Context;
9852
9853   ----------------------------------------------------------
9854   -- Make_Build_In_Place_Iface_Call_In_Object_Declaration --
9855   ----------------------------------------------------------
9856
9857   procedure Make_Build_In_Place_Iface_Call_In_Object_Declaration
9858     (Obj_Decl      : Node_Id;
9859      Function_Call : Node_Id)
9860   is
9861      BIP_Func_Call : constant Node_Id :=
9862                        Unqual_BIP_Iface_Function_Call (Function_Call);
9863      Loc           : constant Source_Ptr := Sloc (Function_Call);
9864      Obj_Id        : constant Entity_Id := Defining_Entity (Obj_Decl);
9865
9866      Tmp_Decl : Node_Id;
9867      Tmp_Id   : Entity_Id;
9868
9869   begin
9870      --  No action of the call has already been processed
9871
9872      if Is_Expanded_Build_In_Place_Call (BIP_Func_Call) then
9873         return;
9874      end if;
9875
9876      Tmp_Id := Make_Temporary (Loc, 'D');
9877
9878      --  Insert a temporary before N initialized with the BIP function call
9879      --  without its enclosing type conversions and analyze it without its
9880      --  expansion. This temporary facilitates us reusing the BIP machinery,
9881      --  which takes care of adding the extra build-in-place actuals and
9882      --  transforms this object declaration into an object renaming
9883      --  declaration.
9884
9885      Tmp_Decl :=
9886        Make_Object_Declaration (Loc,
9887          Defining_Identifier => Tmp_Id,
9888          Object_Definition   =>
9889            New_Occurrence_Of (Etype (BIP_Func_Call), Loc),
9890          Expression          => New_Copy_Tree (BIP_Func_Call));
9891
9892      Expander_Mode_Save_And_Set (False);
9893      Insert_Action (Obj_Decl, Tmp_Decl);
9894      Expander_Mode_Restore;
9895
9896      Make_Build_In_Place_Call_In_Object_Declaration
9897        (Obj_Decl      => Tmp_Decl,
9898         Function_Call => Expression (Tmp_Decl));
9899
9900      pragma Assert (Nkind (Tmp_Decl) = N_Object_Renaming_Declaration);
9901
9902      --  Replace the original build-in-place function call by a reference to
9903      --  the resulting temporary object renaming declaration. In this way,
9904      --  all the interface conversions performed in the original Function_Call
9905      --  on the build-in-place object are preserved.
9906
9907      Rewrite (BIP_Func_Call, New_Occurrence_Of (Tmp_Id, Loc));
9908
9909      --  Replace the original object declaration by an internal object
9910      --  renaming declaration. This leaves the generated code more clean (the
9911      --  build-in-place function call in an object renaming declaration and
9912      --  displacements of the pointer to the build-in-place object in another
9913      --  renaming declaration) and allows us to invoke the routine that takes
9914      --  care of replacing the identifier of the renaming declaration (routine
9915      --  originally developed for the regular build-in-place management).
9916
9917      Rewrite (Obj_Decl,
9918        Make_Object_Renaming_Declaration (Loc,
9919          Defining_Identifier => Make_Temporary (Loc, 'D'),
9920          Subtype_Mark        => New_Occurrence_Of (Etype (Obj_Id), Loc),
9921          Name                => Function_Call));
9922      Analyze (Obj_Decl);
9923
9924      Replace_Renaming_Declaration_Id (Obj_Decl, Original_Node (Obj_Decl));
9925   end Make_Build_In_Place_Iface_Call_In_Object_Declaration;
9926
9927   --------------------------------------------
9928   -- Make_CPP_Constructor_Call_In_Allocator --
9929   --------------------------------------------
9930
9931   procedure Make_CPP_Constructor_Call_In_Allocator
9932     (Allocator     : Node_Id;
9933      Function_Call : Node_Id)
9934   is
9935      Loc         : constant Source_Ptr := Sloc (Function_Call);
9936      Acc_Type    : constant Entity_Id := Etype (Allocator);
9937      Function_Id : constant Entity_Id := Entity (Name (Function_Call));
9938      Result_Subt : constant Entity_Id := Available_View (Etype (Function_Id));
9939
9940      New_Allocator     : Node_Id;
9941      Return_Obj_Access : Entity_Id;
9942      Tmp_Obj           : Node_Id;
9943
9944   begin
9945      pragma Assert (Nkind (Allocator) = N_Allocator
9946                      and then Nkind (Function_Call) = N_Function_Call);
9947      pragma Assert (Convention (Function_Id) = Convention_CPP
9948                      and then Is_Constructor (Function_Id));
9949      pragma Assert (Is_Constrained (Underlying_Type (Result_Subt)));
9950
9951      --  Replace the initialized allocator of form "new T'(Func (...))" with
9952      --  an uninitialized allocator of form "new T", where T is the result
9953      --  subtype of the called function. The call to the function is handled
9954      --  separately further below.
9955
9956      New_Allocator :=
9957        Make_Allocator (Loc,
9958          Expression => New_Occurrence_Of (Result_Subt, Loc));
9959      Set_No_Initialization (New_Allocator);
9960
9961      --  Copy attributes to new allocator. Note that the new allocator
9962      --  logically comes from source if the original one did, so copy the
9963      --  relevant flag. This ensures proper treatment of the restriction
9964      --  No_Implicit_Heap_Allocations in this case.
9965
9966      Set_Storage_Pool      (New_Allocator, Storage_Pool      (Allocator));
9967      Set_Procedure_To_Call (New_Allocator, Procedure_To_Call (Allocator));
9968      Set_Comes_From_Source (New_Allocator, Comes_From_Source (Allocator));
9969
9970      Rewrite (Allocator, New_Allocator);
9971
9972      --  Create a new access object and initialize it to the result of the
9973      --  new uninitialized allocator. Note: we do not use Allocator as the
9974      --  Related_Node of Return_Obj_Access in call to Make_Temporary below
9975      --  as this would create a sort of infinite "recursion".
9976
9977      Return_Obj_Access := Make_Temporary (Loc, 'R');
9978      Set_Etype (Return_Obj_Access, Acc_Type);
9979
9980      --  Generate:
9981      --    Rnnn : constant ptr_T := new (T);
9982      --    Init (Rnn.all,...);
9983
9984      Tmp_Obj :=
9985        Make_Object_Declaration (Loc,
9986          Defining_Identifier => Return_Obj_Access,
9987          Constant_Present    => True,
9988          Object_Definition   => New_Occurrence_Of (Acc_Type, Loc),
9989          Expression          => Relocate_Node (Allocator));
9990      Insert_Action (Allocator, Tmp_Obj);
9991
9992      Insert_List_After_And_Analyze (Tmp_Obj,
9993        Build_Initialization_Call (Loc,
9994          Id_Ref =>
9995            Make_Explicit_Dereference (Loc,
9996              Prefix => New_Occurrence_Of (Return_Obj_Access, Loc)),
9997          Typ => Etype (Function_Id),
9998          Constructor_Ref => Function_Call));
9999
10000      --  Finally, replace the allocator node with a reference to the result of
10001      --  the function call itself (which will effectively be an access to the
10002      --  object created by the allocator).
10003
10004      Rewrite (Allocator, New_Occurrence_Of (Return_Obj_Access, Loc));
10005
10006      --  Ada 2005 (AI-251): If the type of the allocator is an interface then
10007      --  generate an implicit conversion to force displacement of the "this"
10008      --  pointer.
10009
10010      if Is_Interface (Designated_Type (Acc_Type)) then
10011         Rewrite (Allocator, Convert_To (Acc_Type, Relocate_Node (Allocator)));
10012      end if;
10013
10014      Analyze_And_Resolve (Allocator, Acc_Type);
10015   end Make_CPP_Constructor_Call_In_Allocator;
10016
10017   ----------------------
10018   -- Might_Have_Tasks --
10019   ----------------------
10020
10021   function Might_Have_Tasks (Typ : Entity_Id) return Boolean is
10022   begin
10023      return not Global_No_Tasking
10024        and then not No_Run_Time_Mode
10025        and then (Has_Task (Typ)
10026                    or else (Is_Class_Wide_Type (Typ)
10027                               and then Is_Limited_Record (Typ)
10028                               and then not Has_Aspect
10029                                 (Etype (Typ), Aspect_No_Task_Parts)));
10030   end Might_Have_Tasks;
10031
10032   ----------------------------
10033   -- Needs_BIP_Task_Actuals --
10034   ----------------------------
10035
10036   function Needs_BIP_Task_Actuals (Func_Id : Entity_Id) return Boolean is
10037      pragma Assert (Is_Build_In_Place_Function (Func_Id));
10038      Subp_Id  : Entity_Id;
10039      Func_Typ : Entity_Id;
10040
10041   begin
10042      if Global_No_Tasking or else No_Run_Time_Mode then
10043         return False;
10044      end if;
10045
10046      --  For thunks we must rely on their target entity; otherwise, given that
10047      --  the profile of thunks for functions returning a limited interface
10048      --  type returns a class-wide type, we would erroneously add these extra
10049      --  formals.
10050
10051      if Is_Thunk (Func_Id) then
10052         Subp_Id := Thunk_Entity (Func_Id);
10053
10054      --  Common case
10055
10056      else
10057         Subp_Id := Func_Id;
10058      end if;
10059
10060      Func_Typ := Underlying_Type (Etype (Subp_Id));
10061
10062      --  At first sight, for all the following cases, we could add assertions
10063      --  to ensure that if Func_Id is frozen then the computed result matches
10064      --  with the availability of the task master extra formal; unfortunately
10065      --  this is not feasible because we may be precisely freezing this entity
10066      --  (that is, Is_Frozen has been set by Freeze_Entity but it has not
10067      --  completed its work).
10068
10069      if Has_Task (Func_Typ) then
10070         return True;
10071
10072      elsif Ekind (Func_Id) = E_Function then
10073         return Might_Have_Tasks (Func_Typ);
10074
10075      --  Handle subprogram type internally generated for dispatching call. We
10076      --  cannot rely on the return type of the subprogram type of dispatching
10077      --  calls since it is always a class-wide type (cf. Expand_Dispatching_
10078      --  Call).
10079
10080      elsif Ekind (Func_Id) = E_Subprogram_Type then
10081         if Is_Dispatch_Table_Entity (Func_Id) then
10082            return Has_BIP_Extra_Formal (Func_Id, BIP_Task_Master);
10083         else
10084            return Might_Have_Tasks (Func_Typ);
10085         end if;
10086
10087      else
10088         raise Program_Error;
10089      end if;
10090   end Needs_BIP_Task_Actuals;
10091
10092   -----------------------------------
10093   -- Needs_BIP_Finalization_Master --
10094   -----------------------------------
10095
10096   function Needs_BIP_Finalization_Master
10097     (Func_Id : Entity_Id) return Boolean
10098   is
10099      pragma Assert (Is_Build_In_Place_Function (Func_Id));
10100      Func_Typ : constant Entity_Id := Underlying_Type (Etype (Func_Id));
10101   begin
10102      --  A formal giving the finalization master is needed for build-in-place
10103      --  functions whose result type needs finalization or is a tagged type.
10104      --  Tagged primitive build-in-place functions need such a formal because
10105      --  they can be called by a dispatching call, and extensions may require
10106      --  finalization even if the root type doesn't. This means they're also
10107      --  needed for tagged nonprimitive build-in-place functions with tagged
10108      --  results, since such functions can be called via access-to-function
10109      --  types, and those can be used to call primitives, so masters have to
10110      --  be passed to all such build-in-place functions, primitive or not.
10111
10112      return
10113        not Restriction_Active (No_Finalization)
10114          and then (Needs_Finalization (Func_Typ)
10115                     or else Is_Tagged_Type (Func_Typ));
10116   end Needs_BIP_Finalization_Master;
10117
10118   --------------------------
10119   -- Needs_BIP_Alloc_Form --
10120   --------------------------
10121
10122   function Needs_BIP_Alloc_Form (Func_Id : Entity_Id) return Boolean is
10123      pragma Assert (Is_Build_In_Place_Function (Func_Id));
10124      Func_Typ : constant Entity_Id := Underlying_Type (Etype (Func_Id));
10125   begin
10126      return Requires_Transient_Scope (Func_Typ);
10127   end Needs_BIP_Alloc_Form;
10128
10129   -------------------------------------
10130   -- Replace_Renaming_Declaration_Id --
10131   -------------------------------------
10132
10133   procedure Replace_Renaming_Declaration_Id
10134      (New_Decl  : Node_Id;
10135       Orig_Decl : Node_Id)
10136   is
10137      New_Id  : constant Entity_Id := Defining_Entity (New_Decl);
10138      Orig_Id : constant Entity_Id := Defining_Entity (Orig_Decl);
10139
10140   begin
10141      Set_Chars (New_Id, Chars (Orig_Id));
10142
10143      --  Swap next entity links in preparation for exchanging entities
10144
10145      declare
10146         Next_Id : constant Entity_Id := Next_Entity (New_Id);
10147      begin
10148         Link_Entities (New_Id, Next_Entity (Orig_Id));
10149         Link_Entities (Orig_Id, Next_Id);
10150      end;
10151
10152      Set_Homonym (New_Id, Homonym (Orig_Id));
10153      Exchange_Entities (New_Id, Orig_Id);
10154
10155      --  Preserve source indication of original declaration, so that xref
10156      --  information is properly generated for the right entity.
10157
10158      Preserve_Comes_From_Source (New_Decl, Orig_Decl);
10159      Preserve_Comes_From_Source (Orig_Id, Orig_Decl);
10160
10161      Set_Comes_From_Source (New_Id, False);
10162   end Replace_Renaming_Declaration_Id;
10163
10164   ---------------------------------
10165   -- Rewrite_Function_Call_For_C --
10166   ---------------------------------
10167
10168   procedure Rewrite_Function_Call_For_C (N : Node_Id) is
10169      Orig_Func   : constant Entity_Id  := Entity (Name (N));
10170      Func_Id     : constant Entity_Id  := Ultimate_Alias (Orig_Func);
10171      Par         : constant Node_Id    := Parent (N);
10172      Proc_Id     : constant Entity_Id  := Corresponding_Procedure (Func_Id);
10173      Loc         : constant Source_Ptr := Sloc (Par);
10174      Actuals     : List_Id;
10175      Last_Actual : Node_Id;
10176      Last_Formal : Entity_Id;
10177
10178   --  Start of processing for Rewrite_Function_Call_For_C
10179
10180   begin
10181      --  The actuals may be given by named associations, so the added actual
10182      --  that is the target of the return value of the call must be a named
10183      --  association as well, so we retrieve the name of the generated
10184      --  out_formal.
10185
10186      Last_Formal := First_Formal (Proc_Id);
10187      while Present (Next_Formal (Last_Formal)) loop
10188         Next_Formal (Last_Formal);
10189      end loop;
10190
10191      Actuals := Parameter_Associations (N);
10192
10193      --  The original function may lack parameters
10194
10195      if No (Actuals) then
10196         Actuals := New_List;
10197      end if;
10198
10199      --  If the function call is the expression of an assignment statement,
10200      --  transform the assignment into a procedure call. Generate:
10201
10202      --    LHS := Func_Call (...);
10203
10204      --    Proc_Call (..., LHS);
10205
10206      --  If function is inherited, a conversion may be necessary.
10207
10208      if Nkind (Par) = N_Assignment_Statement then
10209         Last_Actual := Name (Par);
10210
10211         if not Comes_From_Source (Orig_Func)
10212           and then Etype (Orig_Func) /= Etype (Func_Id)
10213         then
10214            Last_Actual :=
10215              Make_Type_Conversion (Loc,
10216                New_Occurrence_Of (Etype (Func_Id), Loc),
10217                Last_Actual);
10218         end if;
10219
10220         Append_To (Actuals,
10221           Make_Parameter_Association (Loc,
10222             Selector_Name             =>
10223               Make_Identifier (Loc, Chars (Last_Formal)),
10224             Explicit_Actual_Parameter => Last_Actual));
10225
10226         Rewrite (Par,
10227           Make_Procedure_Call_Statement (Loc,
10228             Name                   => New_Occurrence_Of (Proc_Id, Loc),
10229             Parameter_Associations => Actuals));
10230         Analyze (Par);
10231
10232      --  Otherwise the context is an expression. Generate a temporary and a
10233      --  procedure call to obtain the function result. Generate:
10234
10235      --    ... Func_Call (...) ...
10236
10237      --    Temp : ...;
10238      --    Proc_Call (..., Temp);
10239      --    ... Temp ...
10240
10241      else
10242         declare
10243            Temp_Id : constant Entity_Id := Make_Temporary (Loc, 'T');
10244            Call    : Node_Id;
10245            Decl    : Node_Id;
10246
10247         begin
10248            --  Generate:
10249            --    Temp : ...;
10250
10251            Decl :=
10252              Make_Object_Declaration (Loc,
10253                Defining_Identifier => Temp_Id,
10254                Object_Definition   =>
10255                  New_Occurrence_Of (Etype (Func_Id), Loc));
10256
10257            --  Generate:
10258            --    Proc_Call (..., Temp);
10259
10260            Append_To (Actuals,
10261              Make_Parameter_Association (Loc,
10262                Selector_Name             =>
10263                  Make_Identifier (Loc, Chars (Last_Formal)),
10264                Explicit_Actual_Parameter =>
10265                  New_Occurrence_Of (Temp_Id, Loc)));
10266
10267            Call :=
10268              Make_Procedure_Call_Statement (Loc,
10269                Name                   => New_Occurrence_Of (Proc_Id, Loc),
10270                Parameter_Associations => Actuals);
10271
10272            Insert_Actions (Par, New_List (Decl, Call));
10273            Rewrite (N, New_Occurrence_Of (Temp_Id, Loc));
10274         end;
10275      end if;
10276   end Rewrite_Function_Call_For_C;
10277
10278   ------------------------------------
10279   -- Set_Enclosing_Sec_Stack_Return --
10280   ------------------------------------
10281
10282   procedure Set_Enclosing_Sec_Stack_Return (N : Node_Id) is
10283      P : Node_Id := N;
10284
10285   begin
10286      --  Due to a possible mix of internally generated blocks, source blocks
10287      --  and loops, the scope stack may not be contiguous as all labels are
10288      --  inserted at the top level within the related function. Instead,
10289      --  perform a parent-based traversal and mark all appropriate constructs.
10290
10291      while Present (P) loop
10292
10293         --  Mark the label of a source or internally generated block or
10294         --  loop.
10295
10296         if Nkind (P) in N_Block_Statement | N_Loop_Statement then
10297            Set_Sec_Stack_Needed_For_Return (Entity (Identifier (P)));
10298
10299         --  Mark the enclosing function
10300
10301         elsif Nkind (P) = N_Subprogram_Body then
10302            if Present (Corresponding_Spec (P)) then
10303               Set_Sec_Stack_Needed_For_Return (Corresponding_Spec (P));
10304            else
10305               Set_Sec_Stack_Needed_For_Return (Defining_Entity (P));
10306            end if;
10307
10308            --  Do not go beyond the enclosing function
10309
10310            exit;
10311         end if;
10312
10313         P := Parent (P);
10314      end loop;
10315   end Set_Enclosing_Sec_Stack_Return;
10316
10317   ------------------------------------
10318   -- Unqual_BIP_Iface_Function_Call --
10319   ------------------------------------
10320
10321   function Unqual_BIP_Iface_Function_Call (Expr : Node_Id) return Node_Id is
10322      Has_Pointer_Displacement : Boolean := False;
10323      On_Object_Declaration    : Boolean := False;
10324      --  Remember if processing the renaming expressions on recursion we have
10325      --  traversed an object declaration, since we can traverse many object
10326      --  declaration renamings but just one regular object declaration.
10327
10328      function Unqual_BIP_Function_Call (Expr : Node_Id) return Node_Id;
10329      --  Search for a build-in-place function call skipping any qualification
10330      --  including qualified expressions, type conversions, references, calls
10331      --  to displace the pointer to the object, and renamings. Return Empty if
10332      --  no build-in-place function call is found.
10333
10334      ------------------------------
10335      -- Unqual_BIP_Function_Call --
10336      ------------------------------
10337
10338      function Unqual_BIP_Function_Call (Expr : Node_Id) return Node_Id is
10339      begin
10340         --  Recurse to handle case of multiple levels of qualification and/or
10341         --  conversion.
10342
10343         if Nkind (Expr) in N_Qualified_Expression
10344                          | N_Type_Conversion
10345                          | N_Unchecked_Type_Conversion
10346         then
10347            return Unqual_BIP_Function_Call (Expression (Expr));
10348
10349         --  Recurse to handle case of multiple levels of references and
10350         --  explicit dereferences.
10351
10352         elsif Nkind (Expr) in N_Attribute_Reference
10353                             | N_Explicit_Dereference
10354                             | N_Reference
10355         then
10356            return Unqual_BIP_Function_Call (Prefix (Expr));
10357
10358         --  Recurse on object renamings
10359
10360         elsif Nkind (Expr) = N_Identifier
10361           and then Present (Entity (Expr))
10362           and then Ekind (Entity (Expr)) in E_Constant | E_Variable
10363           and then Nkind (Parent (Entity (Expr))) =
10364                      N_Object_Renaming_Declaration
10365           and then Present (Renamed_Object (Entity (Expr)))
10366         then
10367            return Unqual_BIP_Function_Call (Renamed_Object (Entity (Expr)));
10368
10369         --  Recurse on the initializing expression of the first reference of
10370         --  an object declaration.
10371
10372         elsif not On_Object_Declaration
10373           and then Nkind (Expr) = N_Identifier
10374           and then Present (Entity (Expr))
10375           and then Ekind (Entity (Expr)) in E_Constant | E_Variable
10376           and then Nkind (Parent (Entity (Expr))) = N_Object_Declaration
10377           and then Present (Expression (Parent (Entity (Expr))))
10378         then
10379            On_Object_Declaration := True;
10380            return
10381              Unqual_BIP_Function_Call (Expression (Parent (Entity (Expr))));
10382
10383         --  Recurse to handle calls to displace the pointer to the object to
10384         --  reference a secondary dispatch table.
10385
10386         elsif Nkind (Expr) = N_Function_Call
10387           and then Nkind (Name (Expr)) in N_Has_Entity
10388           and then Present (Entity (Name (Expr)))
10389           and then Is_RTE (Entity (Name (Expr)), RE_Displace)
10390         then
10391            Has_Pointer_Displacement := True;
10392            return
10393              Unqual_BIP_Function_Call (First (Parameter_Associations (Expr)));
10394
10395         --  Normal case: check if the inner expression is a BIP function call
10396         --  and the pointer to the object is displaced.
10397
10398         elsif Has_Pointer_Displacement
10399           and then Is_Build_In_Place_Function_Call (Expr)
10400         then
10401            return Expr;
10402
10403         else
10404            return Empty;
10405         end if;
10406      end Unqual_BIP_Function_Call;
10407
10408   --  Start of processing for Unqual_BIP_Iface_Function_Call
10409
10410   begin
10411      if Nkind (Expr) = N_Identifier and then No (Entity (Expr)) then
10412
10413         --  Can happen for X'Elab_Spec in the binder-generated file
10414
10415         return Empty;
10416      end if;
10417
10418      return Unqual_BIP_Function_Call (Expr);
10419   end Unqual_BIP_Iface_Function_Call;
10420
10421   --------------
10422   -- Warn_BIP --
10423   --------------
10424
10425   procedure Warn_BIP (Func_Call : Node_Id) is
10426   begin
10427      if Debug_Flag_Underscore_BB then
10428         Error_Msg_N ("build-in-place function call??", Func_Call);
10429      end if;
10430   end Warn_BIP;
10431
10432end Exp_Ch6;
10433