File : sem_eval.ads


   1 ------------------------------------------------------------------------------
   2 --                                                                          --
   3 --                         GNAT COMPILER COMPONENTS                         --
   4 --                                                                          --
   5 --                             S E M _ E V A L                              --
   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 --  This package contains various subprograms involved in compile time
  27 --  evaluation of expressions and checks for staticness of expressions and
  28 --  types. It also contains the circuitry for checking for violations of pure
  29 --  and preelaborated conditions (this naturally goes here, since these rules
  30 --  involve consideration of staticness).
  31 
  32 --  Note: the static evaluation for attributes is found in Sem_Attr even though
  33 --  logically it belongs here. We have done this so that it is easier to add
  34 --  new attributes to GNAT.
  35 
  36 with Types;  use Types;
  37 with Uintp;  use Uintp;
  38 with Urealp; use Urealp;
  39 
  40 package Sem_Eval is
  41 
  42    ------------------------------------
  43    -- Handling of Static Expressions --
  44    ------------------------------------
  45 
  46    --  This package contains a set of routines that process individual
  47    --  subexpression nodes with the objective of folding (precomputing) the
  48    --  value of static expressions that are known at compile time and properly
  49    --  computing the setting of two flags that appear in every subexpression
  50    --  node:
  51 
  52    --    Is_Static_Expression
  53 
  54    --      This flag is set on any expression that is static according to the
  55    --      rules in (RM 4.9(3-32)). This flag should be tested during testing
  56    --      of legality of parts of a larger static expression. For all other
  57    --      contexts that require static expressions, use the separate predicate
  58    --      Is_OK_Static_Expression, since an expression that meets the RM 4.9
  59    --      requirements, but raises a constraint error when evaluated in a non-
  60    --      static context does not meet the legality requirements.
  61 
  62    --    Raises_Constraint_Error
  63 
  64    --      This flag indicates that it is known at compile time that the
  65    --      evaluation of an expression raises constraint error. If the
  66    --      expression is static, and this flag is off, then it is also known at
  67    --      compile time that the expression does not raise constraint error
  68    --      (i.e. the flag is accurate for static expressions, and conservative
  69    --      for non-static expressions.
  70 
  71    --  If a static expression does not raise constraint error, then it will
  72    --  have the flag Raises_Constraint_Error flag False, and the expression
  73    --  must be computed at compile time, which means that it has the form of
  74    --  either a literal, or a constant that is itself (recursively) either a
  75    --  literal or a constant.
  76 
  77    --  The above rules must be followed exactly in order for legality checks to
  78    --  be accurate. For subexpressions that are not static according to the RM
  79    --  definition, they are sometimes folded anyway, but of course in this case
  80    --  Is_Static_Expression is not set.
  81 
  82    --  When we are analyzing and evaluating static expressions, we propagate
  83    --  both flags accurately. Usually if a subexpression raises a constraint
  84    --  error, then so will its parent expression, and Raise_Constraint_Error
  85    --  will be propagated to this parent. The exception is conditional cases
  86    --  like (True or else 1/0 = 0) which results in an expresion that has the
  87    --  Is_Static_Expression flag True, and Raises_Constraint_Error False. Even
  88    --  though 1/0 would raise an exception, the right operand is never actually
  89    --  executed, so the expression as a whole does not raise CE.
  90 
  91    --  For constructs in the language where static expressions are part of the
  92    --  required semantics, we need an expression that meets the 4.9 rules and
  93    --  does not raise CE. So nearly everywhere, callers should call function
  94    --  Is_OK_Static_Expression rather than Is_Static_Expression.
  95 
  96    --  Finally, the case of static predicates. These are applied only to entire
  97    --  expressions, not to subexpressions, so we do not have the case of having
  98    --  to propagate this information. We handle this case simply by resetting
  99    --  the Is_Static_Expression flag if a static predicate fails. Note that we
 100    --  can't use this simpler approach for the constraint error case because of
 101    --  the (True or else 1/0 = 0) example discussed above.
 102 
 103    -------------------------------
 104    -- Compile-Time Known Values --
 105    -------------------------------
 106 
 107    --  For most legality checking purposes the flag Is_Static_Expression
 108    --  defined in Sinfo should be used. This package also provides a routine
 109    --  called Is_OK_Static_Expression which in addition of checking that an
 110    --  expression is static in the RM 4.9 sense, it checks that the expression
 111    --  does not raise constraint error. In fact for certain legality checks not
 112    --  only do we need to ascertain that the expression is static, but we must
 113    --  also ensure that it does not raise constraint error.
 114 
 115    --  Neither of Is_Static_Expression and Is_OK_Static_Expression should be
 116    --  used for compile time evaluation purposes. In fact certain expression
 117    --  whose value may be known at compile time are not static in the RM 4.9
 118    --  sense. A typical example is:
 119 
 120    --     C : constant Integer := Record_Type'Size;
 121 
 122    --  The expression 'C' is not static in the technical RM sense, but for many
 123    --  simple record types, the size is in fact known at compile time. When we
 124    --  are trying to perform compile time constant folding (for instance for
 125    --  expressions like C + 1, Is_Static_Expression or Is_OK_Static_Expression
 126    --  are not the right functions to test if folding is possible. Instead, we
 127    --  use Compile_Time_Known_Value. All static expressions that do not raise
 128    --  constraint error (i.e. those for which Is_OK_Static_Expression is true)
 129    --  are known at compile time, but as shown by the above example, there may
 130    --  be cases of non-static expressions which are known at compile time.
 131 
 132    -----------------
 133    -- Subprograms --
 134    -----------------
 135 
 136    procedure Check_Expression_Against_Static_Predicate
 137      (Expr : Node_Id;
 138       Typ  : Entity_Id);
 139    --  Determine whether an arbitrary expression satisfies the static predicate
 140    --  of a type. The routine does nothing if Expr is not known at compile time
 141    --  or Typ lacks a static predicate, otherwise it may emit a warning if the
 142    --  expression is prohibited by the predicate. If the expression is a static
 143    --  expression and it fails a predicate that was not explicitly stated to be
 144    --  a dynamic predicate, then an additional warning is given, and the flag
 145    --  Is_Static_Expression is reset on Expr.
 146 
 147    procedure Check_Non_Static_Context (N : Node_Id);
 148    --  Deals with the special check required for a static expression that
 149    --  appears in a non-static context, i.e. is not part of a larger static
 150    --  expression (see RM 4.9(35)), i.e. the value of the expression must be
 151    --  within the base range of the base type of its expected type. A check is
 152    --  also made for expressions that are inside the base range, but outside
 153    --  the range of the expected subtype (this is a warning message rather than
 154    --  an illegality).
 155    --
 156    --  Note: most cases of non-static context checks are handled within
 157    --  Sem_Eval itself, including all cases of expressions at the outer level
 158    --  (i.e. those that are not a subexpression). Currently the only outside
 159    --  customer for this procedure is Sem_Attr (because Eval_Attribute is
 160    --  there). There is also one special case arising from ranges (see body of
 161    --  Resolve_Range).
 162    --
 163    --  Note: this procedure is also called by GNATprove on real literals
 164    --  that are not sub-expressions of static expressions, to convert them to
 165    --  machine numbers, as GNATprove cannot perform this conversion contrary
 166    --  to gigi.
 167 
 168    procedure Check_String_Literal_Length (N : Node_Id; Ttype : Entity_Id);
 169    --  N is either a string literal, or a constraint error node. In the latter
 170    --  case, the situation is already dealt with, and the call has no effect.
 171    --  In the former case, if the target type, Ttyp is constrained, then a
 172    --  check is made to see if the string literal is of appropriate length.
 173 
 174    type Compare_Result is (LT, LE, EQ, GT, GE, NE, Unknown);
 175    subtype Compare_GE is Compare_Result range EQ .. GE;
 176    subtype Compare_LE is Compare_Result range LT .. EQ;
 177    --  Result subtypes for Compile_Time_Compare subprograms
 178 
 179    function Compile_Time_Compare
 180      (L, R         : Node_Id;
 181       Assume_Valid : Boolean) return Compare_Result;
 182    pragma Inline (Compile_Time_Compare);
 183    --  Given two expression nodes, finds out whether it can be determined at
 184    --  compile time how the runtime values will compare. An Unknown result
 185    --  means that the result of a comparison cannot be determined at compile
 186    --  time, otherwise the returned result indicates the known result of the
 187    --  comparison, given as tightly as possible (i.e. EQ or LT is preferred
 188    --  returned value to LE). If Assume_Valid is true, the result reflects
 189    --  the result of assuming that entities involved in the comparison have
 190    --  valid representations. If Assume_Valid is false, then the base type of
 191    --  any involved entity is used so that no assumption of validity is made.
 192 
 193    function Compile_Time_Compare
 194      (L, R         : Node_Id;
 195       Diff         : access Uint;
 196       Assume_Valid : Boolean;
 197       Rec          : Boolean := False) return Compare_Result;
 198    --  This version of Compile_Time_Compare returns extra information if the
 199    --  result is GT or LT. In these cases, if the magnitude of the difference
 200    --  can be determined at compile time, this (positive) magnitude is returned
 201    --  in Diff.all. If the magnitude of the difference cannot be determined
 202    --  then Diff.all contains No_Uint on return. Rec is a parameter that is set
 203    --  True for a recursive call from within Compile_Time_Compare to avoid some
 204    --  infinite recursion cases. It should never be set by a client.
 205 
 206    function Compile_Time_Known_Bounds (T : Entity_Id) return Boolean;
 207    --  If T is an array whose index bounds are all known at compile time, then
 208    --  True is returned. If T is not an array type, or one or more of its index
 209    --  bounds is not known at compile time, then False is returned.
 210 
 211    function Compile_Time_Known_Value (Op : Node_Id) return Boolean;
 212    --  Returns true if Op is an expression not raising Constraint_Error whose
 213    --  value is known at compile time and for which a call to Expr_Value can
 214    --  be used to determine this value. This is always true if Op is a static
 215    --  expression, but can also be true for expressions which are technically
 216    --  non-static but which are in fact known at compile time. Some examples of
 217    --  such expressions are the static lower bound of a non-static range or the
 218    --  value of a constant object whose initial value is itself compile time
 219    --  known in the sense of this routine. Note that this routine is defended
 220    --  against unanalyzed expressions. Such expressions will not cause a
 221    --  blowup, they may cause pessimistic (i.e. False) results to be returned.
 222    --  In general we take a pessimistic view. False does not mean the value
 223    --  could not be known at compile time, but True means that absolutely
 224    --  definition it is known at compile time and it is safe to call
 225    --  Expr_Value[_XX] on the expression Op.
 226    --
 227    --  Note that we don't define precisely the set of expressions that return
 228    --  True. Callers should not make any assumptions regarding the value that
 229    --  is returned for non-static expressions. Functional behavior should never
 230    --  be affected by whether a given non-static expression returns True or
 231    --  False when this function is called. In other words this is purely for
 232    --  efficiency optimization purposes. The code generated can often be more
 233    --  efficient with compile time known values, e.g. range analysis for the
 234    --  purpose of removing checks is more effective if we know precise bounds.
 235 
 236    function Compile_Time_Known_Value_Or_Aggr (Op : Node_Id) return Boolean;
 237    --  Similar to Compile_Time_Known_Value, but also returns True if the value
 238    --  is a compile-time-known aggregate, i.e. an aggregate all of whose
 239    --  constituent expressions are either compile-time-known values (based on
 240    --  calling Compile_Time_Known_Value) or compile-time-known aggregates.
 241    --  Note that the aggregate could still involve run-time checks that might
 242    --  fail (such as for subtype checks in component associations), but the
 243    --  evaluation of the expressions themselves will not raise an exception.
 244 
 245    function CRT_Safe_Compile_Time_Known_Value (Op : Node_Id) return Boolean;
 246    --  In the case of configurable run-times, there may be an issue calling
 247    --  Compile_Time_Known_Value with non-static expressions where the legality
 248    --  of the program is not well-defined. Consider this example:
 249    --
 250    --    X := B ** C;
 251    --
 252    --  Now if C is compile time known, and has the value 4, then inline code
 253    --  can be generated at compile time, instead of calling a run-time routine.
 254    --  That's fine in the normal case, but when we have a configurable run-time
 255    --  the run-time routine may not be available. This means that the program
 256    --  will be rejected if C is not known at compile time. We don't want the
 257    --  legality of a program to depend on how clever the implementation of this
 258    --  function is. If the run-time in use lacks the exponentiation routine,
 259    --  then what we say is that exponentiation is permitted if the exponent is
 260    --  officially static and has a value in the range 0 .. 4.
 261    --
 262    --  In a case like this, we use CRT_Safe_Compile_Time_Known_Value to avoid
 263    --  this effect. This routine will return False for a non-static expression
 264    --  if we are in configurable run-time mode, even if the expression would
 265    --  normally be considered compile-time known.
 266 
 267    function Expr_Rep_Value (N : Node_Id) return Uint;
 268    --  This is identical to Expr_Value, except in the case of enumeration
 269    --  literals of types for which an enumeration representation clause has
 270    --  been given, in which case it returns the representation value rather
 271    --  than the pos value. This is the value that is needed for generating code
 272    --  sequences, while the Expr_Value value is appropriate for compile time
 273    --  constraint errors or getting the logical value. Note that this function
 274    --  does NOT concern itself with biased values, if the caller needs a
 275    --  properly biased value, the subtraction of the bias must be handled
 276    --  explicitly.
 277 
 278    function Expr_Value (N : Node_Id) return Uint;
 279    --  Returns the folded value of the expression N. This function is called in
 280    --  instances where it has already been determined that the expression is
 281    --  static or its value is compile time known (Compile_Time_Known_Value (N)
 282    --  returns True). This version is used for integer values, and enumeration
 283    --  or character literals. In the latter two cases, the value returned is
 284    --  the Pos value in the relevant enumeration type. It can also be used for
 285    --  fixed-point values, in which case it returns the corresponding integer
 286    --  value. It cannot be used for floating-point values.
 287 
 288    function Expr_Value_E (N : Node_Id) return Entity_Id;
 289    --  Returns the folded value of the expression. This function is called in
 290    --  instances where it has already been determined that the expression is
 291    --  static or its value known at compile time. This version is used for
 292    --  enumeration types and returns the corresponding enumeration literal.
 293 
 294    function Expr_Value_R (N : Node_Id) return Ureal;
 295    --  Returns the folded value of the expression. This function is called in
 296    --  instances where it has already been determined that the expression is
 297    --  static or its value known at compile time. This version is used for real
 298    --  values (including both the floating-point and fixed-point cases). In the
 299    --  case of a fixed-point type, the real value is returned (cf above version
 300    --  returning Uint).
 301 
 302    function Expr_Value_S (N : Node_Id) return Node_Id;
 303    --  Returns the folded value of the expression. This function is called
 304    --  in instances where it has already been determined that the expression
 305    --  is static or its value is known at compile time. This version is used
 306    --  for string types and returns the corresponding N_String_Literal node.
 307 
 308    procedure Eval_Actual                 (N : Node_Id);
 309    procedure Eval_Allocator              (N : Node_Id);
 310    procedure Eval_Arithmetic_Op          (N : Node_Id);
 311    procedure Eval_Call                   (N : Node_Id);
 312    procedure Eval_Case_Expression        (N : Node_Id);
 313    procedure Eval_Character_Literal      (N : Node_Id);
 314    procedure Eval_Concatenation          (N : Node_Id);
 315    procedure Eval_Entity_Name            (N : Node_Id);
 316    procedure Eval_If_Expression          (N : Node_Id);
 317    procedure Eval_Indexed_Component      (N : Node_Id);
 318    procedure Eval_Integer_Literal        (N : Node_Id);
 319    procedure Eval_Logical_Op             (N : Node_Id);
 320    procedure Eval_Membership_Op          (N : Node_Id);
 321    procedure Eval_Named_Integer          (N : Node_Id);
 322    procedure Eval_Named_Real             (N : Node_Id);
 323    procedure Eval_Op_Expon               (N : Node_Id);
 324    procedure Eval_Op_Not                 (N : Node_Id);
 325    procedure Eval_Real_Literal           (N : Node_Id);
 326    procedure Eval_Relational_Op          (N : Node_Id);
 327    procedure Eval_Shift                  (N : Node_Id);
 328    procedure Eval_Short_Circuit          (N : Node_Id);
 329    procedure Eval_Slice                  (N : Node_Id);
 330    procedure Eval_String_Literal         (N : Node_Id);
 331    procedure Eval_Qualified_Expression   (N : Node_Id);
 332    procedure Eval_Type_Conversion        (N : Node_Id);
 333    procedure Eval_Unary_Op               (N : Node_Id);
 334    procedure Eval_Unchecked_Conversion   (N : Node_Id);
 335 
 336    procedure Flag_Non_Static_Expr (Msg : String; Expr : Node_Id);
 337    --  This procedure is called after it has been determined that Expr is not
 338    --  static when it is required to be. Msg is the text of a message that
 339    --  explains the error. This procedure checks if an error is already posted
 340    --  on Expr, if so, it does nothing unless All_Errors_Mode is set in which
 341    --  case this flag is ignored. Otherwise the given message is posted using
 342    --  Error_Msg_F, and then Why_Not_Static is called on Expr to generate
 343    --  additional messages. The string given as Msg should end with ! to make
 344    --  it an unconditional message, to ensure that if it is posted, the entire
 345    --  set of messages is all posted.
 346 
 347    procedure Fold_Str (N : Node_Id; Val : String_Id; Static : Boolean);
 348    --  Rewrite N with a new N_String_Literal node as the result of the compile
 349    --  time evaluation of the node N. Val is the resulting string value from
 350    --  the folding operation. The Is_Static_Expression flag is set in the
 351    --  result node. The result is fully analyzed and resolved. Static indicates
 352    --  whether the result should be considered static or not (True = consider
 353    --  static). The point here is that normally all string literals are static,
 354    --  but if this was the result of some sequence of evaluation where values
 355    --  were known at compile time but not static, then the result is not
 356    --  static. The call has no effect if Raises_Constraint_Error (N) is True,
 357    --  since there is no point in folding if we have an error.
 358 
 359    procedure Fold_Uint (N : Node_Id; Val : Uint; Static : Boolean);
 360    --  Rewrite N with a (N_Integer_Literal, N_Identifier, N_Character_Literal)
 361    --  node as the result of the compile time evaluation of the node N. Val is
 362    --  the result in the integer case and is the position of the literal in the
 363    --  literals list for the enumeration case. Is_Static_Expression is set True
 364    --  in the result node. The result is fully analyzed/resolved. Static
 365    --  indicates whether the result should be considered static or not (True =
 366    --  consider static). The point here is that normally all integer literals
 367    --  are static, but if this was the result of some sequence of evaluation
 368    --  where values were known at compile time but not static, then the result
 369    --  is not static. The call has no effect if Raises_Constraint_Error (N) is
 370    --  True, since there is no point in folding if we have an error.
 371 
 372    procedure Fold_Ureal (N : Node_Id; Val : Ureal; Static : Boolean);
 373    --  Rewrite N with a new N_Real_Literal node as the result of the compile
 374    --  time evaluation of the node N. Val is the resulting real value from the
 375    --  folding operation. The Is_Static_Expression flag is set in the result
 376    --  node. The result is fully analyzed and result. Static indicates whether
 377    --  the result should be considered static or not (True = consider static).
 378    --  The point here is that normally all string literals are static, but if
 379    --  this was the result of some sequence of evaluation where values were
 380    --  known at compile time but not static, then the result is not static.
 381    --  The call has no effect if Raises_Constraint_Error (N) is True, since
 382    --  there is no point in folding if we have an error.
 383 
 384    function Is_In_Range
 385      (N            : Node_Id;
 386       Typ          : Entity_Id;
 387       Assume_Valid : Boolean := False;
 388       Fixed_Int    : Boolean := False;
 389       Int_Real     : Boolean := False) return Boolean;
 390    --  Returns True if it can be guaranteed at compile time that expression
 391    --  N is known to be in range of the subtype Typ. A result of False does
 392    --  not mean that the expression is out of range, merely that it cannot be
 393    --  determined at compile time that it is in range. If Typ is a floating
 394    --  point type or Int_Real is set, any integer value is treated as though it
 395    --  was a real value (i.e. the underlying real value is used). In this case
 396    --  we use the corresponding real value, both for the bounds of Typ, and for
 397    --  the value of the expression N. If Typ is a fixed type or a discrete type
 398    --  and Int_Real is False but flag Fixed_Int is True then any fixed-point
 399    --  value is treated as though it was discrete value (i.e. the underlying
 400    --  integer value is used). In this case we use the corresponding integer
 401    --  value, both for the bounds of Typ, and for the value of the expression
 402    --  N. If Typ is a discrete type and Fixed_Int as well as Int_Real are
 403    --  false, integer values are used throughout.
 404    --
 405    --  If Assume_Valid is set True, then N is always assumed to contain a valid
 406    --  value. If Assume_Valid is set False, then N may be invalid (unless there
 407    --  is some independent way of knowing that it is valid, i.e. either it is
 408    --  an entity with Is_Known_Valid set, or Assume_No_Invalid_Values is True.
 409 
 410    function Is_Null_Range (Lo : Node_Id; Hi : Node_Id) return Boolean;
 411    --  Returns True if it can guarantee that Lo .. Hi is a null range. If it
 412    --  cannot (because the value of Lo or Hi is not known at compile time) then
 413    --  it returns False.
 414 
 415    function Is_OK_Static_Expression (N : Node_Id) return Boolean;
 416    --  An OK static expression is one that is static in the RM definition sense
 417    --  and which does not raise constraint error. For most legality checking
 418    --  purposes you should use Is_Static_Expression. For those legality checks
 419    --  where the expression N should not raise constraint error use this
 420    --  routine. This routine is *not* to be used in contexts where the test is
 421    --  for compile time evaluation purposes. Use Compile_Time_Known_Value
 422    --  instead (see section on "Compile-Time Known Values" above).
 423 
 424    function Is_OK_Static_Range (N : Node_Id) return Boolean;
 425    --  Determines if range is static, as defined in RM 4.9(26), and also checks
 426    --  that neither bound of the range raises constraint error, thus ensuring
 427    --  that both bounds of the range are compile-time evaluable (i.e. do not
 428    --  raise constraint error). A result of true means that the bounds are
 429    --  compile time evaluable. A result of false means they are not (either
 430    --  because the range is not static, or because one or the other bound
 431    --  raises CE).
 432 
 433    function Is_OK_Static_Subtype (Typ : Entity_Id) return Boolean;
 434    --  Determines whether a subtype fits the definition of an Ada static
 435    --  subtype as given in (RM 4.9(26)) with the additional check that neither
 436    --  bound raises constraint error (meaning that Expr_Value[_R|S] can be used
 437    --  on these bounds).
 438    --
 439    --  This differs from Is_Static_Subtype in that it includes the constraint
 440    --  error checks, which are missing from Is_Static_Subtype.
 441 
 442    function Is_Out_Of_Range
 443      (N            : Node_Id;
 444       Typ          : Entity_Id;
 445       Assume_Valid : Boolean := False;
 446       Fixed_Int    : Boolean := False;
 447       Int_Real     : Boolean := False) return Boolean;
 448    --  Returns True if it can be guaranteed at compile time that expression is
 449    --  known to be out of range of the subtype Typ. True is returned if Typ is
 450    --  a scalar type, and the value of N can be determined to be outside the
 451    --  range of Typ. A result of False does not mean that the expression is in
 452    --  range, but rather merely that it cannot be determined at compile time
 453    --  that it is out of range. The parameters Assume_Valid, Fixed_Int, and
 454    --  Int_Real are as described for Is_In_Range above.
 455 
 456    function Is_Static_Subtype (Typ : Entity_Id) return Boolean;
 457    --  Determines whether a subtype fits the definition of an Ada static
 458    --  subtype as given in (RM 4.9(26)).
 459    --
 460    --  This differs from Is_OK_Static_Subtype (which is what must be used by
 461    --  clients) in that it does not care whether the bounds raise a constraint
 462    --  error exception or not. Used for checking whether expressions are static
 463    --  in the 4.9 sense (without worrying about exceptions).
 464 
 465    function Is_Statically_Unevaluated (Expr : Node_Id) return Boolean;
 466    --  This function returns True if the given expression Expr is statically
 467    --  unevaluated, as defined in (RM 4.9 (32.1-32.6)).
 468 
 469    function In_Subrange_Of
 470      (T1        : Entity_Id;
 471       T2        : Entity_Id;
 472       Fixed_Int : Boolean := False) return Boolean;
 473    --  Returns True if it can be guaranteed at compile time that the range of
 474    --  values for scalar type T1 are always in the range of scalar type T2. A
 475    --  result of False does not mean that T1 is not in T2's subrange, only that
 476    --  it cannot be determined at compile time. Flag Fixed_Int is used as in
 477    --  routine Is_In_Range above.
 478 
 479    function Not_Null_Range (Lo : Node_Id; Hi : Node_Id) return Boolean;
 480    --  Returns True if it can guarantee that Lo .. Hi is not a null range. If
 481    --  it cannot (because the value of Lo or Hi is not known at compile time)
 482    --  then it returns False.
 483 
 484    function Predicates_Match (T1, T2 : Entity_Id) return Boolean;
 485    --  In Ada 2012, subtypes statically match if their static predicates
 486    --  match as well. This function performs the required check that
 487    --  predicates match. Separated out from Subtypes_Statically_Match so
 488    --  that it can be used in specializing error messages.
 489 
 490    function Subtypes_Statically_Compatible
 491      (T1                      : Entity_Id;
 492       T2                      : Entity_Id;
 493       Formal_Derived_Matching : Boolean := False) return Boolean;
 494    --  Returns true if the subtypes are unconstrained or the constraint on
 495    --  on T1 is statically compatible with T2 (as defined by 4.9.1(4)).
 496    --  Otherwise returns false. Formal_Derived_Matching indicates whether
 497    --  the type T1 is a generic actual being checked against ancestor T2
 498    --  in a formal derived type association.
 499 
 500    function Subtypes_Statically_Match
 501      (T1                      : Entity_Id;
 502       T2                      : Entity_Id;
 503       Formal_Derived_Matching : Boolean := False) return Boolean;
 504    --  Determine whether two types T1, T2, which have the same base type,
 505    --  are statically matching subtypes (RM 4.9.1(1-2)). Also includes the
 506    --  extra GNAT rule that object sizes must match (this can be false for
 507    --  types that match in the RM sense because of use of 'Object_Size),
 508    --  except when testing a generic actual T1 against an ancestor T2 in a
 509    --  formal derived type association (indicated by Formal_Derived_Matching).
 510 
 511    procedure Why_Not_Static (Expr : Node_Id);
 512    --  This procedure may be called after generating an error message that
 513    --  complains that something is non-static. If it finds good reasons, it
 514    --  generates one or more error messages pointing the appropriate offending
 515    --  component of the expression. If no good reasons can be figured out, then
 516    --  no messages are generated. The expectation here is that the caller has
 517    --  already issued a message complaining that the expression is non-static.
 518    --  Note that this message should be placed using Error_Msg_F or
 519    --  Error_Msg_FE, so that it will sort before any messages placed by this
 520    --  call. Note that it is fine to call Why_Not_Static with something that
 521    --  is not an expression, and usually this has no effect, but in some cases
 522    --  (N_Parameter_Association or N_Range), it makes sense for the internal
 523    --  recursive calls.
 524    --
 525    --  Note that these messages are not continuation messages, instead they are
 526    --  separate unconditional messages, marked with '!'. The reason for this is
 527    --  that they can be posted at a different location from the main message as
 528    --  documented above ("appropriate offending component"), and continuation
 529    --  messages must always point to the same location as the parent message.
 530 
 531    procedure Initialize;
 532    --  Initializes the internal data structures. Must be called before each
 533    --  separate main program unit (e.g. in a GNSA/ASIS context).
 534 
 535 private
 536    --  The Eval routines are all marked inline, since they are called once
 537 
 538    pragma Inline (Eval_Actual);
 539    pragma Inline (Eval_Allocator);
 540    pragma Inline (Eval_Character_Literal);
 541    pragma Inline (Eval_If_Expression);
 542    pragma Inline (Eval_Indexed_Component);
 543    pragma Inline (Eval_Named_Integer);
 544    pragma Inline (Eval_Named_Real);
 545    pragma Inline (Eval_Real_Literal);
 546    pragma Inline (Eval_Shift);
 547    pragma Inline (Eval_Slice);
 548    pragma Inline (Eval_String_Literal);
 549    pragma Inline (Eval_Unchecked_Conversion);
 550 
 551    pragma Inline (Is_OK_Static_Expression);
 552 
 553 end Sem_Eval;