home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gnat-2.06-src.tgz / tar.out / fsf / gnat / ada / sem_util.ads < prev    next >
Text File  |  1996-09-28  |  17KB  |  324 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                             S E M _ U T I L                              --
  6. --                                                                          --
  7. --                                 S p e c                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.103 $                            --
  10. --                                                                          --
  11. --        Copyright (c) 1992,1993,1994,1995 NYU, All Rights Reserved        --
  12. --                                                                          --
  13. -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  14. -- terms of the  GNU General Public License as published  by the Free Soft- --
  15. -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
  16. -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  17. -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  18. -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  19. -- for  more details.  You should have  received  a copy of the GNU General --
  20. -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
  21. -- to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. --
  22. --                                                                          --
  23. ------------------------------------------------------------------------------
  24.  
  25. --  Package containing utility procedures used throughout the semantics
  26.  
  27. with Einfo;  use Einfo;
  28. with Types;  use Types;
  29. with Uintp;  use Uintp;
  30. with Urealp; use Urealp;
  31.  
  32. package Sem_Util is
  33.  
  34.    function Build_Actual_Subtype
  35.      (T    : Entity_Id;
  36.       N    : Node_Or_Entity_Id)
  37.       return Node_Id;
  38.    --  Build an anonymous subtype for an entity or expression, using the
  39.    --  bounds of the entity or the discriminants of the enclosing record.
  40.    --  T is the type for which the actual subtype is required, and N is either
  41.    --  a defining identifier, or any subexpression.
  42.  
  43.    function Build_Actual_Subtype_Of_Component
  44.      (T    : Entity_Id;
  45.       N    : Node_Id)
  46.       return Node_Id;
  47.    --  Determine whether a selected component has a type that depends on
  48.    --  discriminants, and build actual subtype for it if so.
  49.  
  50.    procedure Check_Fully_Declared (T : Entity_Id; N : Node_Id);
  51.    --  Verify that the full declaration of type T has been seen. If not,
  52.    --  place error message on node N. Used in  object declarations, type
  53.    --  conversions, qualified expressions.
  54.  
  55.    procedure Compile_Time_Constraint_Error (N : Node_Id; Msg : String);
  56.    --  N is a subexpression which will raise a constraint error if evaluated
  57.    --  at runtime. Msg is a message that explains the reason for raising the
  58.    --  exception. The last character of Msg is ? if the message is always a
  59.    --  warning, even in Ada 95, and is not a ? if the message represents a
  60.    --  real illegality (because of violation of static expression rules) in
  61.    --  Ada 95 (but not in Ada 83). This routine posts appropriate messages,
  62.    --  and replaces the expression with an N_Raise_Constraint_Error node.
  63.    --  This node is marked as being static if the original node is static,
  64.    --  but Raises_Constraint_Error is set, preventing further evaluation.
  65.    --  The error message may contain a } insertion character, referencing
  66.    --  the type of the node N.
  67.  
  68.    function Current_Entity (N : Node_Id) return Entity_Id;
  69.    --  Find the currently visible definition for a given identifier, that is to
  70.    --  say the first entry in the visibility chain for the Chars of N.
  71.  
  72.    function Current_Entity_In_Scope (N : Node_Id) return Entity_Id;
  73.    --  Find whether there is a previous definition for identifier N in the
  74.    --  current scope. Because declarations for a scope are not necessarily
  75.    --  contiguous (e.g. for packages) the first entry on the visibility chain
  76.    --  for N is not necessarily in the current scope.
  77.  
  78.    function Current_Scope return Entity_Id;
  79.    --  Get entity representing current scope
  80.  
  81.    function Defining_Unit_Simple_Name (N : Node_Id) return Entity_Id;
  82.    --  N is the declaration of a program unit (compilation or otherwise).
  83.    --  If the unit is a child unit, return the final defining identifier;
  84.    --  Otherwise, the program unit name itself.
  85.  
  86.    function Designate_Same_Unit
  87.      (Name1 : Node_Id;
  88.       Name2 : Node_Id)
  89.       return  Boolean;
  90.    --  Return true if Name1 and Name2 designate the same unit name;
  91.    --  each of these names is supposed to be a selected component name,
  92.    --  an expanded name, a defining program unit name or an identifier
  93.  
  94.    function Enclosing_Dynamic_Scope (E : Entity_Id) return Entity_Id;
  95.    --  Returns Standard_Standard for entities declared at a library level or
  96.    --  the entity of the first enclosing scope (block, subprogram, task_type,
  97.    --  or entry) for local entities.
  98.  
  99.    procedure Enter_Name (Def_Id : Node_Id);
  100.    --  Insert new name in symbol table of current scope with check for
  101.    --  duplications (error message is issued if a conflict is found)
  102.  
  103.    function First_Actual (Node : Node_Id) return Node_Id;
  104.    --  Node is an N_Function_Call or N_Procedure_Call_Statement node. The
  105.    --  result returned is the first actual parameter in declaration order
  106.    --  (not the order of parameters as they appeared in the source, which
  107.    --  can be quite different as a result of the use of named parameters).
  108.    --  Empty is returned for a call with no parameters. The procedure for
  109.    --  iterating through the actuals in declaration order is to use this
  110.    --  function to find the first actual, and then use Next_Actual to obtain
  111.    --  the next actual in declaration order. Note that the values returned
  112.    --  may be either expressions or N_Parameter_Association nodes.
  113.  
  114.    function Get_Actual_Subtype (N : Node_Id) return Entity_Id;
  115.    --  Given a node for an expression, obtain the actual subtype of the
  116.    --  expression. This is the Etype, except in the case of unconstrained
  117.    --  array types, where the nominal subtype is the unconstrained type,
  118.    --  and the actual subtype is the subtype constrained with the actual
  119.    --  bounds. Get_Actual_Subtype returns an appropriate subtype in this
  120.    --  case, constructing it on the fly (and inserting it in the tree
  121.    --  using Insert_Actions (N, ..) if necessary).
  122.  
  123.    procedure Get_Index_Bounds (I : Node_Id; L, H : out Node_Id);
  124.    --  This procedure assigns to L and H respectively the values of the
  125.    --  low and high bounds of node I, which must be a range, subtype
  126.    --  indication, or the name of a scalar subtype.
  127.  
  128.    function Get_Declaration_Node (Unit_Id : Entity_Id) return Node_Id;
  129.    --  Unit_Id is the simple name of a unit, this function returns the
  130.    --  corresponding xxx_Declaration node for the entity, or the subprogram
  131.    --  body node for it. The unit may be a child unit with any number of
  132.    --  ancestors.
  133.  
  134.    function Get_Name_Entity_Id (Id : Name_Id) return Entity_Id;
  135.    --  An entity value is associated with each name in the name table. The
  136.    --  Get_Name_Entity_Id function fetches the Entity_Id of this entity,
  137.    --  which is the innermost visible entity with the given name. See the
  138.    --  body of Sem_Ch8 for further details on handling of entity visibility.
  139.  
  140.    function Get_Referenced_Object (N : Node_Id) return Node_Id;
  141.    --  Given a node, return the renamed object if the node represents
  142.    --  a renamed object, otherwise return the node unchanged. The node
  143.    --  may represent an arbitrary expression.
  144.  
  145.    function Has_Private_Component (Type_Id : Entity_Id) return Boolean;
  146.    --  Check if a type has a (sub)component of a private type that has not
  147.    --  yet received a full declaration.
  148.  
  149.    function Has_Tagged_Component (Typ : Entity_Id) return Boolean;
  150.    --  Typ must be a composite type (array or record). This function is used
  151.    --  to check if '=' has to be expanded into a bunch component comparaisons.
  152.  
  153.    function In_Subrange_Of (T1 : Entity_Id; T2 : Entity_Id) return Boolean;
  154.    --  Checks whether the range of values for type T1 is always in the range
  155.    --  given for type T2.
  156.  
  157.    function Is_Entity_Name (N : Node_Id) return Boolean;
  158.    --  Test if the node N is the name of an entity (i.e. is an identifier,
  159.    --  expanded name, or an attribute reference that returns an entity).
  160.  
  161.    function Is_False (U : Uint) return Boolean;
  162.    --  The argument is a Uint value which is the Boolean'Pos value of a
  163.    --  Boolean operand (i.e. is either 0 for False, or 1 for True). This
  164.    --  function simply tests if it is False (i.e. zero)
  165.  
  166.    function Is_Library_Level_Entity (E : Entity_Id) return Boolean;
  167.    --  A library-level declaration is one that is accessible from Standard,
  168.    --  i.e. a library unit or an entity declared in a library package.
  169.  
  170.    function Is_Object_Reference (N : Node_Id) return Boolean;
  171.    --  Determines if the tree referenced by N represents an object. Both
  172.    --  variable and constant objects return True (compare Is_Variable).
  173.  
  174.    function Is_Selector_Name (N : Node_Id) return Boolean;
  175.    --  Given an N_Identifier node N, determines if it is a Selector_Name.
  176.    --  As described in Sinfo, Selector_Names are special because they
  177.    --  represent use of the N_Identifier node for a true identifer, when
  178.    --  normally such nodes represent a direct name.
  179.  
  180.    function Is_True (U : Uint) return Boolean;
  181.    --  The argument is a Uint value which is the Boolean'Pos value of a
  182.    --  Boolean operand (i.e. is either 0 for False, or 1 for True). This
  183.    --  function simply tests if it is True (i.e. non-zero)
  184.  
  185.    function Is_Variable (N : Node_Id) return Boolean;
  186.    --  Determines if the tree referenced by N represents a variable, i.e.
  187.    --  can appear on the left side of an assignment. There is one situation,
  188.    --  namely formal parameters, in which non-tagged type conversions are
  189.    --  also considered variables, but Is_Variable returns False for such
  190.    --  cases, since it has no knowledge of the context. Note that this is
  191.    --  the point at which Assignment_OK is checked, and True is returned
  192.    --  for any tree thus marked.
  193.  
  194.    function New_External_Entity
  195.      (Kind         : Entity_Kind;
  196.       Scope_Id     : Entity_Id;
  197.       Sloc_Value   : Source_Ptr;
  198.       Related_Id   : Entity_Id;
  199.       Suffix       : Character;
  200.       Suffix_Index : Nat := 0;
  201.       Prefix       : Character := ' ')
  202.       return         Entity_Id;
  203.    --  This function creates an N_Defining_Identifier node for an internal
  204.    --  created entity, such as an implicit type or subtype, or a record
  205.    --  initialization procedure. The entity name is constructed with a call
  206.    --  to New_External_Name (Related_Id, Suffix, Suffix_Index, Prefix), so
  207.    --  that the generated name may be referenced as a public entry, and the
  208.    --  Is_Public flag is set if needed (using Set_Public_Status).
  209.  
  210.    function New_Internal_Entity
  211.      (Kind       : Entity_Kind;
  212.       Scope_Id   : Entity_Id;
  213.       Sloc_Value : Source_Ptr;
  214.       Id_Char    : Character)
  215.       return       Entity_Id;
  216.    --  This function is similar to New_External_Entity, except that the
  217.    --  name is constructed by New_Internal_Name (Id_Char). This is used
  218.    --  when the resulting entity does not have to be referenced as a
  219.    --  public entity (and in this case Is_Public is not set).
  220.  
  221.    function Next_Actual (Actual_Id : Node_Id) return Node_Id;
  222.    --  Find next actual parameter in declaration order. As described for
  223.    --  First_Actual, this is the next actual in the declaration order, not
  224.    --  the call order, so this does not correspond to simply taking the
  225.    --  next entry of the Parameter_Associations list. The argument is either
  226.    --  an expression or an N_Parameter_Association node, as returned by a
  227.    --  previous call to First_Actual or Next_Actual.
  228.  
  229.    procedure Normalize_Actuals
  230.      (N       : Node_Id;
  231.       S       : Entity_Id;
  232.       Report  : Boolean;
  233.       Success : out Boolean);
  234.    --  Reorders lists of actuals according to names of formals, value returned
  235.    --  in Success indicates sucess of reordering. For more details, see body.
  236.    --  Errors are reported only if Report is set to True.
  237.  
  238.    function Object_Access_Level (Obj : Node_Id) return Uint;
  239.    --  Return the accessibility level of the view of the object Obj.
  240.  
  241.    function Private_Ancestor (Type_Id : Entity_Id) return Entity_Id;
  242.    --  Returns the private ancestor (if any) of the given Type_Id.
  243.    --  A type has a private ancestor if it is a subtype of, or has any
  244.    --  components that are a subtype of a private type whose full view
  245.    --  has not yet been processed.
  246.  
  247.    function Real_Convert (S : String) return Node_Id;
  248.    --  S is a possibly signed syntactically valid real literal. The result
  249.    --  returned is an N_Real_Literal node representing the literal value.
  250.  
  251.    function Same_Name (N1, N2 : Node_Id) return Boolean;
  252.    --  Determine if two (possibly expanded) names are the same name
  253.  
  254.    procedure Set_Current_Entity (E : Entity_Id);
  255.    --  Establish the entity E as the currently visible definition of its
  256.    --  associated name (i.e. the Node_Id associated with its name)
  257.  
  258.    procedure Set_Entity_With_Style_Check (N : Node_Id; Val : Entity_Id);
  259.    --  This procedure has the same calling sequence as Set_Entity, but
  260.    --  if Style_Check is set, then it calls a style checking routine which
  261.    --  can check identifier spelling style.
  262.  
  263.    procedure Set_Name_Entity_Id (Id : Name_Id; Val : Entity_Id);
  264.    --  Sets the Entity_Id value associated with the given name, which is the
  265.    --  Id of the innermost visible entity with the given name. See the body
  266.    --  of package Sem_Ch8 for further details on the handling of visibility.
  267.  
  268.    procedure Set_Next_Actual (Ass1_Id : Node_Id; Ass2_Id : Node_Id);
  269.    --  The arguments may be parameter associations, whose descendants
  270.    --  are the optional formal name and the actual parameter. Positional
  271.    --  parameters are already members of a list, and do not need to be
  272.    --  chained separately. See also First_Actual and Next_Actual.
  273.  
  274.    procedure Set_Public_Status (Id : Entity_Id);
  275.    --  If an entity (visible or otherwise) is defined in a library
  276.    --  package, or a package that is itself public, then this subprogram
  277.    --  labels the entity public as well.
  278.  
  279.    function Static_Integer (N : Node_Id) return Uint;
  280.    --  This function analyzes the given expression node and then resolves it
  281.    --  as any integer type. If the result is static, then the value of the
  282.    --  universal expression is returned, otherwise an error message is output
  283.    --  and a value of No_Uint is returned.
  284.  
  285.    function Statically_Different (E1, E2 : Node_Id) return Boolean;
  286.    --  Return True if it can be statically determined that the Expressions
  287.    --  E1 and E2 refer to different objects
  288.  
  289.    function Subprogram_Access_Level (Subp : Entity_Id) return Uint;
  290.    --  Return the accessibility level of the view denoted by Subp.
  291.  
  292.    procedure Trace_Scope (N : Node_Id; E : Entity_Id; Msg : String);
  293.    --  Print debugging information on entry to each unit being analyzed.
  294.  
  295.    procedure Transfer_Entities (From : Entity_Id; To : Entity_Id);
  296.    --  Move a list of entities from one scope to another, and recompute
  297.    --  Is_Public based upon the new scope.
  298.  
  299.    function Type_Access_Level (Typ : Entity_Id) return Uint;
  300.    --  Return the accessibility level of Typ.
  301.  
  302.    procedure Unimplemented (N : Node_Id; Feature : String);
  303.    --  An indication that here and there we are not finished yet. Prints out
  304.    --  a message on the given node indicating that the feature described by
  305.    --  the given string is not implemented yet.
  306.  
  307.    procedure Wrong_Type (Expr : Node_Id; Expected_Type : Entity_Id);
  308.    --  Output error message for incorrectly typed expression. Expr is the
  309.    --  node for the incorrectly typed construct (Etype (Expr) is the type
  310.    --  found), and Expected_Type is the entity for the expected type. Note
  311.    --  that Expr does not have to be a subexpression, anything with an
  312.    --  Etype field may be used.
  313.  
  314. private
  315.    pragma Inline (Current_Entity);
  316.    pragma Inline (Get_Name_Entity_Id);
  317.    pragma Inline (Is_Entity_Name);
  318.    pragma Inline (Is_False);
  319.    pragma Inline (Is_True);
  320.    pragma Inline (Set_Current_Entity);
  321.    pragma Inline (Set_Name_Entity_Id);
  322.  
  323. end Sem_Util;
  324.