File : sem_ch6.ads


   1 ------------------------------------------------------------------------------
   2 --                                                                          --
   3 --                         GNAT COMPILER COMPONENTS                         --
   4 --                                                                          --
   5 --                              S E M _ C H 6                               --
   6 --                                                                          --
   7 --                                 S p e c                                  --
   8 --                                                                          --
   9 --          Copyright (C) 1992-2016, Free Software Foundation, Inc.         --
  10 --                                                                          --
  11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  12 -- terms of the  GNU General Public License as published  by the Free Soft- --
  13 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
  14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  16 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  17 -- for  more details.  You should have  received  a copy of the GNU General --
  18 -- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
  19 -- http://www.gnu.org/licenses for a complete copy of the license.          --
  20 --                                                                          --
  21 -- GNAT was originally developed  by the GNAT team at  New York University. --
  22 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
  23 --                                                                          --
  24 ------------------------------------------------------------------------------
  25 
  26 with Types; use Types;
  27 package Sem_Ch6 is
  28 
  29    type Conformance_Type is
  30      (Type_Conformant, Mode_Conformant, Subtype_Conformant, Fully_Conformant);
  31    pragma Ordered (Conformance_Type);
  32    --  Conformance type used in conformance checks between specs and bodies,
  33    --  and for overriding. The literals match the RM definitions of the
  34    --  corresponding terms. This is an ordered type, since each conformance
  35    --  type is stronger than the ones preceding it.
  36 
  37    procedure Analyze_Abstract_Subprogram_Declaration (N : Node_Id);
  38    procedure Analyze_Expression_Function             (N : Node_Id);
  39    procedure Analyze_Extended_Return_Statement       (N : Node_Id);
  40    procedure Analyze_Function_Call                   (N : Node_Id);
  41    procedure Analyze_Operator_Symbol                 (N : Node_Id);
  42    procedure Analyze_Parameter_Association           (N : Node_Id);
  43    procedure Analyze_Procedure_Call                  (N : Node_Id);
  44    procedure Analyze_Simple_Return_Statement         (N : Node_Id);
  45    procedure Analyze_Subprogram_Declaration          (N : Node_Id);
  46    procedure Analyze_Subprogram_Body                 (N : Node_Id);
  47 
  48    function Analyze_Subprogram_Specification (N : Node_Id) return Entity_Id;
  49    --  Analyze subprogram specification in both subprogram declarations
  50    --  and body declarations. Returns the defining entity for the
  51    --  specification N.
  52 
  53    procedure Check_Conventions (Typ : Entity_Id);
  54    --  Ada 2005 (AI-430): Check that the conventions of all inherited and
  55    --  overridden dispatching operations of type Typ are consistent with their
  56    --  respective counterparts.
  57 
  58    procedure Check_Delayed_Subprogram (Designator : Entity_Id);
  59    --  Designator can be a E_Subprogram_Type, E_Procedure or E_Function. If a
  60    --  type in its profile depends on a private type without a full
  61    --  declaration, indicate that the subprogram or type is delayed.
  62 
  63    procedure Check_Discriminant_Conformance
  64      (N        : Node_Id;
  65       Prev     : Entity_Id;
  66       Prev_Loc : Node_Id);
  67    --  Check that the discriminants of a full type N fully conform to the
  68    --  discriminants of the corresponding partial view Prev. Prev_Loc indicates
  69    --  the source location of the partial view, which may be different than
  70    --  Prev in the case of private types.
  71 
  72    procedure Check_Fully_Conformant
  73      (New_Id  : Entity_Id;
  74       Old_Id  : Entity_Id;
  75       Err_Loc : Node_Id := Empty);
  76    --  Check that two callable entities (subprograms, entries, literals)
  77    --  are fully conformant, post error message if not (RM 6.3.1(17)) with
  78    --  the flag being placed on the Err_Loc node if it is specified, and
  79    --  on the appropriate component of the New_Id construct if not. Note:
  80    --  when checking spec/body conformance, New_Id must be the body entity
  81    --  and Old_Id is the spec entity (the code in the implementation relies
  82    --  on this ordering, and in any case, this makes sense, since if flags
  83    --  are to be placed on the construct, they clearly belong on the body.
  84 
  85    procedure Check_Mode_Conformant
  86      (New_Id   : Entity_Id;
  87       Old_Id   : Entity_Id;
  88       Err_Loc  : Node_Id := Empty;
  89       Get_Inst : Boolean := False);
  90    --  Check that two callable entities (subprograms, entries, literals)
  91    --  are mode conformant, post error message if not (RM 6.3.1(15)) with
  92    --  the flag being placed on the Err_Loc node if it is specified, and
  93    --  on the appropriate component of the New_Id construct if not. The
  94    --  argument Get_Inst is set to True when this is a check against a
  95    --  formal access-to-subprogram type, indicating that mapping of types
  96    --  is needed.
  97 
  98    procedure Check_Overriding_Indicator
  99      (Subp            : Entity_Id;
 100       Overridden_Subp : Entity_Id;
 101       Is_Primitive    : Boolean);
 102    --  Verify the consistency of an overriding_indicator given for subprogram
 103    --  declaration, body, renaming, or instantiation.  Overridden_Subp is set
 104    --  if the scope where we are introducing the subprogram contains a
 105    --  type-conformant subprogram that becomes hidden by the new subprogram.
 106    --  Is_Primitive indicates whether the subprogram is primitive.
 107 
 108    procedure Check_Subtype_Conformant
 109      (New_Id                   : Entity_Id;
 110       Old_Id                   : Entity_Id;
 111       Err_Loc                  : Node_Id := Empty;
 112       Skip_Controlling_Formals : Boolean := False;
 113       Get_Inst                 : Boolean := False);
 114    --  Check that two callable entities (subprograms, entries, literals)
 115    --  are subtype conformant, post error message if not (RM 6.3.1(16)),
 116    --  the flag being placed on the Err_Loc node if it is specified, and
 117    --  on the appropriate component of the New_Id construct if not.
 118    --  Skip_Controlling_Formals is True when checking the conformance of
 119    --  a subprogram that implements an interface operation. In that case,
 120    --  only the non-controlling formals can (and must) be examined. The
 121    --  argument Get_Inst is set to True when this is a check against a
 122    --  formal access-to-subprogram type, indicating that mapping of types
 123    --  is needed.
 124 
 125    procedure Check_Synchronized_Overriding
 126      (Def_Id          : Entity_Id;
 127       Overridden_Subp : out Entity_Id);
 128    --  First determine if Def_Id is an entry or a subprogram either defined in
 129    --  the scope of a task or protected type, or that is a primitive of such
 130    --  a type. Check whether Def_Id overrides a subprogram of an interface
 131    --  implemented by the synchronized type, returning the overridden entity
 132    --  or Empty.
 133 
 134    procedure Check_Type_Conformant
 135      (New_Id  : Entity_Id;
 136       Old_Id  : Entity_Id;
 137       Err_Loc : Node_Id := Empty);
 138    --  Check that two callable entities (subprograms, entries, literals)
 139    --  are type conformant, post error message if not (RM 6.3.1(14)) with
 140    --  the flag being placed on the Err_Loc node if it is specified, and
 141    --  on the appropriate component of the New_Id construct if not.
 142 
 143    function Conforming_Types
 144      (T1       : Entity_Id;
 145       T2       : Entity_Id;
 146       Ctype    : Conformance_Type;
 147       Get_Inst : Boolean := False) return Boolean;
 148    --  Check that the types of two formal parameters are conforming. In most
 149    --  cases this is just a name comparison, but within an instance it involves
 150    --  generic actual types, and in the presence of anonymous access types
 151    --  it must examine the designated types. The argument Get_Inst is set to
 152    --  True when this is a check against a formal access-to-subprogram type,
 153    --  indicating that mapping of types is needed.
 154 
 155    procedure Create_Extra_Formals (E : Entity_Id);
 156    --  For each parameter of a subprogram or entry that requires an additional
 157    --  formal (such as for access parameters and indefinite discriminated
 158    --  parameters), creates the appropriate formal and attach it to its
 159    --  associated parameter. Each extra formal will also be appended to
 160    --  the end of Subp's parameter list (with each subsequent extra formal
 161    --  being attached to the preceding extra formal).
 162 
 163    function Find_Corresponding_Spec
 164      (N          : Node_Id;
 165       Post_Error : Boolean := True) return Entity_Id;
 166    --  Use the subprogram specification in the body to retrieve the previous
 167    --  subprogram declaration, if any.
 168 
 169    function Fully_Conformant (New_Id, Old_Id : Entity_Id) return Boolean;
 170    --  Determine whether two callable entities (subprograms, entries,
 171    --  literals) are fully conformant (RM 6.3.1(17))
 172 
 173    function Fully_Conformant_Expressions
 174      (Given_E1 : Node_Id;
 175       Given_E2 : Node_Id) return Boolean;
 176    --  Determines if two (non-empty) expressions are fully conformant
 177    --  as defined by (RM 6.3.1(18-21))
 178 
 179    function Fully_Conformant_Discrete_Subtypes
 180       (Given_S1 : Node_Id;
 181        Given_S2 : Node_Id) return Boolean;
 182    --  Determines if two subtype definitions are fully conformant. Used
 183    --  for entry family conformance checks (RM 6.3.1 (24)).
 184 
 185    procedure Install_Entity (E : Entity_Id);
 186    --  Place a single entity on the visibility chain
 187 
 188    procedure Install_Formals (Id : Entity_Id);
 189    --  On entry to a subprogram body, make the formals visible. Note that
 190    --  simply placing the subprogram on the scope stack is not sufficient:
 191    --  the formals must become the current entities for their names. This
 192    --  procedure is also used to get visibility to the formals when analyzing
 193    --  preconditions and postconditions appearing in the spec.
 194 
 195    function Is_Interface_Conformant
 196      (Tagged_Type : Entity_Id;
 197       Iface_Prim  : Entity_Id;
 198       Prim        : Entity_Id) return Boolean;
 199    --  Returns true if both primitives have a matching name (including support
 200    --  for names of inherited private primitives --which have suffix 'P'), they
 201    --  are type conformant, and Prim is defined in the scope of Tagged_Type.
 202    --  Special management is done for functions returning interfaces.
 203 
 204    procedure List_Inherited_Pre_Post_Aspects (E : Entity_Id);
 205    --  E is the entity for a subprogram or generic subprogram spec. This call
 206    --  lists all inherited Pre/Post aspects if List_Inherited_Pre_Post is True.
 207 
 208    procedure May_Need_Actuals (Fun : Entity_Id);
 209    --  Flag functions that can be called without parameters, i.e. those that
 210    --  have no parameters, or those for which defaults exist for all parameters
 211    --  Used for subprogram declarations and for access subprogram declarations,
 212    --  where they apply to the anonymous designated type. On return the flag
 213    --  Set_Needs_No_Actuals is set appropriately in Fun.
 214 
 215    function Mode_Conformant (New_Id, Old_Id : Entity_Id) return Boolean;
 216    --  Determine whether two callable entities (subprograms, entries,
 217    --  literals) are mode conformant (RM 6.3.1(15))
 218 
 219    procedure New_Overloaded_Entity
 220      (S            : Entity_Id;
 221       Derived_Type : Entity_Id := Empty);
 222    --  Process new overloaded entity. Overloaded entities are created by
 223    --  enumeration type declarations, subprogram specifications, entry
 224    --  declarations, and (implicitly) by type derivations. If Derived_Type
 225    --  is non-empty then this is a subprogram derived for that type.
 226 
 227    procedure Process_Formals (T : List_Id; Related_Nod : Node_Id);
 228    --  Enter the formals in the scope of the subprogram or entry, and
 229    --  analyze default expressions if any. The implicit types created for
 230    --  access parameter are attached to the Related_Nod which comes from the
 231    --  context.
 232 
 233    procedure Reference_Body_Formals (Spec : Entity_Id; Bod : Entity_Id);
 234    --  If there is a separate spec for a subprogram or generic subprogram, the
 235    --  formals of the body are treated as references to the corresponding
 236    --  formals of the spec. This reference does not count as an actual use of
 237    --  the formal, in order to diagnose formals that are unused in the body.
 238    --  This procedure is also used in renaming_as_body declarations, where
 239    --  the formals of the specification must be treated as body formals that
 240    --  correspond to the previous subprogram declaration, and not as new
 241    --  entities with their defining entry in the cross-reference information.
 242 
 243    procedure Set_Actual_Subtypes (N : Node_Id; Subp : Entity_Id);
 244    --  If the formals of a subprogram are unconstrained, build a subtype
 245    --  declaration that uses the bounds or discriminants of the actual to
 246    --  construct an actual subtype for them. This is an optimization that
 247    --  is done only in some cases where the actual subtype cannot change
 248    --  during execution of the subprogram. By setting the actual subtype
 249    --  once, we avoid recomputing it unnecessarily.
 250 
 251    procedure Set_Formal_Mode (Formal_Id : Entity_Id);
 252    --  Set proper Ekind to reflect formal mode (in, out, in out)
 253 
 254    function Subtype_Conformant
 255      (New_Id                   : Entity_Id;
 256       Old_Id                   : Entity_Id;
 257       Skip_Controlling_Formals : Boolean := False) return Boolean;
 258    --  Determine whether two callable entities (subprograms, entries, literals)
 259    --  are subtype conformant (RM 6.3.1(16)). Skip_Controlling_Formals is True
 260    --  when checking the conformance of a subprogram that implements an
 261    --  interface operation. In that case, only the non-controlling formals
 262    --  can (and must) be examined.
 263 
 264    function Type_Conformant
 265      (New_Id                   : Entity_Id;
 266       Old_Id                   : Entity_Id;
 267       Skip_Controlling_Formals : Boolean := False) return Boolean;
 268    --  Determine whether two callable entities (subprograms, entries, literals)
 269    --  are type conformant (RM 6.3.1(14)). Skip_Controlling_Formals is True
 270    --  when checking the conformance of a subprogram that implements an
 271    --  interface operation. In that case, only the non-controlling formals
 272    --  can (and must) be examined.
 273 
 274    procedure Valid_Operator_Definition (Designator : Entity_Id);
 275    --  Verify that an operator definition has the proper number of formals
 276 
 277 end Sem_Ch6;