File : exp_ch3.ads


   1 ------------------------------------------------------------------------------
   2 --                                                                          --
   3 --                         GNAT COMPILER COMPONENTS                         --
   4 --                                                                          --
   5 --                              E X P _ C H 3                               --
   6 --                                                                          --
   7 --                                 S p e c                                  --
   8 --                                                                          --
   9 --          Copyright (C) 1992-2015, Free Software Foundation, Inc.         --
  10 --                                                                          --
  11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  12 -- terms of the  GNU General Public License as published  by the Free Soft- --
  13 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
  14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  16 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  17 -- for  more details.  You should have  received  a copy of the GNU General --
  18 -- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
  19 -- http://www.gnu.org/licenses for a complete copy of the license.          --
  20 --                                                                          --
  21 -- GNAT was originally developed  by the GNAT team at  New York University. --
  22 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
  23 --                                                                          --
  24 ------------------------------------------------------------------------------
  25 
  26 --  Expand routines for chapter 3 constructs
  27 
  28 with Types;  use Types;
  29 with Elists; use Elists;
  30 with Uintp;  use Uintp;
  31 
  32 package Exp_Ch3 is
  33 
  34    procedure Expand_N_Object_Declaration         (N : Node_Id);
  35    procedure Expand_N_Subtype_Indication         (N : Node_Id);
  36    procedure Expand_N_Variant_Part               (N : Node_Id);
  37    procedure Expand_N_Full_Type_Declaration      (N : Node_Id);
  38 
  39    procedure Expand_Previous_Access_Type (Def_Id : Entity_Id);
  40    --  For a full type declaration that contains tasks, or that is a task,
  41    --  check whether there exists an access type whose designated type is an
  42    --  incomplete declarations for the current composite type. If so, build the
  43    --  master for that access type, now that it is known to denote an object
  44    --  with tasks.
  45 
  46    procedure Expand_Record_Extension (T : Entity_Id; Def : Node_Id);
  47    --  Add a field _parent in the extension part of the record
  48 
  49    procedure Build_Discr_Checking_Funcs (N : Node_Id);
  50    --  Builds function which checks whether the component name is consistent
  51    --  with the current discriminants. N is the full type declaration node,
  52    --  and the discriminant checking functions are inserted after this node.
  53 
  54    function Build_Initialization_Call
  55      (Loc               : Source_Ptr;
  56       Id_Ref            : Node_Id;
  57       Typ               : Entity_Id;
  58       In_Init_Proc      : Boolean := False;
  59       Enclos_Type       : Entity_Id := Empty;
  60       Discr_Map         : Elist_Id := New_Elmt_List;
  61       With_Default_Init : Boolean := False;
  62       Constructor_Ref   : Node_Id := Empty) return List_Id;
  63    --  Builds a call to the initialization procedure for the base type of Typ,
  64    --  passing it the object denoted by Id_Ref, plus additional parameters as
  65    --  appropriate for the type (the _Master, for task types, for example).
  66    --  Loc is the source location for the constructed tree. In_Init_Proc has
  67    --  to be set to True when the call is itself in an init proc in order to
  68    --  enable the use of discriminals. Enclos_Type is the enclosing type when
  69    --  initializing a component in an outer init proc, and it is used for
  70    --  various expansion cases including the case where Typ is a task type
  71    --  which is an array component, the indexes of the enclosing type are
  72    --  used to build the string that identifies each task at runtime.
  73    --
  74    --  Discr_Map is used to replace discriminants by their discriminals in
  75    --  expressions used to constrain record components. In the presence of
  76    --  entry families bounded by discriminants, protected type discriminants
  77    --  can appear within expressions in array bounds (not as stand-alone
  78    --  identifiers) and a general replacement is necessary.
  79    --
  80    --  Ada 2005 (AI-287): With_Default_Init is used to indicate that the
  81    --  initialization call corresponds to a default initialized component
  82    --  of an aggregate.
  83    --
  84    --  Constructor_Ref is a call to a constructor subprogram. It is currently
  85    --  used only to support C++ constructors.
  86 
  87    function Freeze_Type (N : Node_Id) return Boolean;
  88    --  This function executes the freezing actions associated with the given
  89    --  freeze type node N and returns True if the node is to be deleted. We
  90    --  delete the node if it is present just for front end purpose and we don't
  91    --  want Gigi to see the node. This function can't delete the node itself
  92    --  since it would confuse any remaining processing of the freeze node.
  93 
  94    procedure Init_Secondary_Tags
  95      (Typ            : Entity_Id;
  96       Target         : Node_Id;
  97       Stmts_List     : List_Id;
  98       Fixed_Comps    : Boolean := True;
  99       Variable_Comps : Boolean := True);
 100    --  Ada 2005 (AI-251): Initialize the tags of the secondary dispatch tables
 101    --  of Typ. The generated code referencing tag fields of Target is appended
 102    --  to Stmts_List. If Fixed_Comps is True then the tag components located at
 103    --  fixed positions of Target are initialized; if Variable_Comps is True
 104    --  then tags components located at variable positions of Target are
 105    --  initialized.
 106 
 107    function Make_Tag_Assignment (N : Node_Id) return Node_Id;
 108    --  An object declaration that has an initialization for a tagged object
 109    --  requires a separate reassignment of the tag of the given type, because
 110    --  the expression may include an unchecked conversion. This tag assignment
 111    --  is inserted after the declaration, but if the object has an address
 112    --  clause the assignment is handled as part of the freezing of the object,
 113    --  see Check_Address_Clause.
 114 
 115    function Needs_Simple_Initialization
 116      (T           : Entity_Id;
 117       Consider_IS : Boolean := True) return Boolean;
 118    --  Certain types need initialization even though there is no specific
 119    --  initialization routine:
 120    --    Access types (which need initializing to null)
 121    --    All scalar types if Normalize_Scalars mode set
 122    --    Descendants of standard string types if Normalize_Scalars mode set
 123    --    Scalar types having a Default_Value attribute
 124    --  Regarding Initialize_Scalars mode, this is ignored if Consider_IS is
 125    --  set to False, but if Consider_IS is set to True, then the cases above
 126    --  mentioning Normalize_Scalars also apply for Initialize_Scalars mode.
 127 
 128    function Get_Simple_Init_Val
 129      (T    : Entity_Id;
 130       N    : Node_Id;
 131       Size : Uint := No_Uint) return Node_Id;
 132    --  For a type which Needs_Simple_Initialization (see above), prepares the
 133    --  tree for an expression representing the required initial value. N is a
 134    --  node whose source location used in constructing this tree which is
 135    --  returned as the result of the call. The Size parameter indicates the
 136    --  target size of the object if it is known (indicated by a value that is
 137    --  not No_Uint and is greater than zero). If Size is not given (Size set to
 138    --  No_Uint, or non-positive), then the Esize of T is used as an estimate of
 139    --  the Size. The object size is needed to prepare a known invalid value for
 140    --  use by Normalize_Scalars. A call to this routine where T is a scalar
 141    --  type is only valid if we are in Normalize_Scalars or Initialize_Scalars
 142    --  mode, or if N is the node for a 'Invalid_Value attribute node.
 143 
 144 end Exp_Ch3;