OSDN Git Service

* config/mips/mips.c (TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P): Undef.
[pf3gnuchains/gcc-fork.git] / gcc / ada / sem_ch3.ads
index 95354d6..6bfa528 100644 (file)
@@ -6,18 +6,17 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 1992-2005, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2009, Free Software Foundation, Inc.         --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
--- ware  Foundation;  either version 2,  or (at your option) any later ver- --
+-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
 -- for  more details.  You should have  received  a copy of the GNU General --
--- Public License  distributed with GNAT;  see file COPYING.  If not, write --
--- to  the  Free Software Foundation,  51  Franklin  Street,  Fifth  Floor, --
--- Boston, MA 02110-1301, USA.                                              --
+-- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
+-- http://www.gnu.org/licenses for a complete copy of the license.          --
 --                                                                          --
 -- GNAT was originally developed  by the GNAT team at  New York University. --
 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
 with Nlists; use Nlists;
 with Types;  use Types;
 
-package Sem_Ch3  is
-   procedure Analyze_Component_Declaration              (N : Node_Id);
-   procedure Analyze_Incomplete_Type_Decl               (N : Node_Id);
-   procedure Analyze_Itype_Reference                    (N : Node_Id);
-   procedure Analyze_Number_Declaration                 (N : Node_Id);
-   procedure Analyze_Object_Declaration                 (N : Node_Id);
-   procedure Analyze_Others_Choice                      (N : Node_Id);
-   procedure Analyze_Private_Extension_Declaration      (N : Node_Id);
-   procedure Analyze_Subtype_Declaration                (N : Node_Id);
-   procedure Analyze_Subtype_Indication                 (N : Node_Id);
-   procedure Analyze_Type_Declaration                   (N : Node_Id);
-   procedure Analyze_Variant_Part                       (N : Node_Id);
+package Sem_Ch3 is
+   procedure Analyze_Component_Declaration         (N : Node_Id);
+   procedure Analyze_Incomplete_Type_Decl          (N : Node_Id);
+   procedure Analyze_Itype_Reference               (N : Node_Id);
+   procedure Analyze_Number_Declaration            (N : Node_Id);
+   procedure Analyze_Object_Declaration            (N : Node_Id);
+   procedure Analyze_Others_Choice                 (N : Node_Id);
+   procedure Analyze_Private_Extension_Declaration (N : Node_Id);
+   procedure Analyze_Subtype_Indication            (N : Node_Id);
+   procedure Analyze_Type_Declaration              (N : Node_Id);
+   procedure Analyze_Variant_Part                  (N : Node_Id);
+
+   procedure Analyze_Subtype_Declaration
+     (N    : Node_Id;
+      Skip : Boolean := False);
+   --  Called to analyze a subtype declaration. The parameter Skip is used for
+   --  Ada 2005 (AI-412). We set to True in order to avoid reentering the
+   --  defining identifier of N when analyzing a rewritten incomplete subtype
+   --  declaration.
 
    function Access_Definition
      (Related_Nod : Node_Id;
       N           : Node_Id) return Entity_Id;
    --  An access definition defines a general access type for a formal
-   --  parameter.  The procedure is called when processing formals, when
+   --  parameter. The procedure is called when processing formals, when
    --  the current scope is the subprogram. The Implicit type is attached
    --  to the Related_Nod put into the enclosing scope, so that the only
    --  entities defined in the spec are the formals themselves.
@@ -58,6 +64,11 @@ package Sem_Ch3  is
    --  the signature of the implicit type works like the profile of a regular
    --  subprogram.
 
+   procedure Add_Internal_Interface_Entities (Tagged_Type : Entity_Id);
+   --  Add to the list of primitives of Tagged_Type the internal entities
+   --  associated with covered interface primitives. These entities link the
+   --  interface primitives with the tagged type primitives that cover them.
+
    procedure Analyze_Declarations (L : List_Id);
    --  Called to analyze a list of declarations (in what context ???). Also
    --  performs necessary freezing actions (more description needed ???)
@@ -65,14 +76,6 @@ package Sem_Ch3  is
    procedure Analyze_Interface_Declaration (T : Entity_Id; Def : Node_Id);
    --  Analyze an interface declaration or a formal interface declaration
 
-   procedure Analyze_Per_Use_Expression (N : Node_Id; T : Entity_Id);
-   --  Default and per object expressions do not freeze their components,
-   --  and must be analyzed and resolved accordingly. The analysis is
-   --  done by calling the Pre_Analyze_And_Resolve routine and setting
-   --  the global In_Default_Expression flag. See the documentation section
-   --  entitled "Handling of Default and Per-Object Expressions" in sem.ads
-   --  for details. N is the expression to be analyzed, T is the expected type.
-
    procedure Array_Type_Declaration (T : in out Entity_Id; Def : Node_Id);
    --  Process an array type declaration. If the array is constrained, we
    --  create an implicit parent array type, with the same index types and
@@ -81,33 +84,38 @@ package Sem_Ch3  is
    procedure Access_Type_Declaration (T : Entity_Id; Def : Node_Id);
    --  Process an access type declaration
 
+   procedure Build_Itype_Reference
+     (Ityp : Entity_Id;
+      Nod  : Node_Id);
+   --  Create a reference to an internal type, for use by Gigi. The back-end
+   --  elaborates itypes on demand, i.e. when their first use is seen. This
+   --  can lead to scope anomalies if the first use is within a scope that is
+   --  nested within the scope that contains  the point of definition of the
+   --  itype. The Itype_Reference node forces the elaboration of the itype
+   --  in the proper scope. The node is inserted after Nod, which is the
+   --  enclosing declaration that generated Ityp.
+   --
+   --  A related mechanism is used during expansion, for itypes created in
+   --  branches of conditionals. See Ensure_Defined in exp_util.
+   --  Could both mechanisms be merged ???
+
    procedure Check_Abstract_Overriding (T : Entity_Id);
-   --  Check that all abstract subprograms inherited from T's parent type
-   --  have been overridden as required, and that nonabstract subprograms
-   --  have not been incorrectly overridden with an abstract subprogram.
+   --  Check that all abstract subprograms inherited from T's parent type have
+   --  been overridden as required, and that nonabstract subprograms have not
+   --  been incorrectly overridden with an abstract subprogram.
 
    procedure Check_Aliased_Component_Types (T : Entity_Id);
    --  Given an array type or record type T, check that if the type is
-   --  nonlimited, then the nominal subtype of any components of T
-   --  that have discriminants must be constrained.
+   --  nonlimited, then the nominal subtype of any components of T that
+   --  have discriminants must be constrained.
 
    procedure Check_Completion (Body_Id : Node_Id := Empty);
-   --  At the end of a declarative part, verify that all entities that
-   --  require completion have received one. If Body_Id is absent, the
-   --  error indicating a missing completion is placed on the declaration
-   --  that needs completion. If Body_Id is present, it is the defining
-   --  identifier of a package body, and errors are posted on that node,
-   --  rather than on the declarations that require completion in the package
-   --  declaration.
-
-   procedure Collect_Interfaces
-     (N            : Node_Id;
-      Derived_Type : Entity_Id);
-   --  Ada 2005 (AI-251): Subsidiary procedure to Build_Derived_Record_Type
-   --  and Analyze_Formal_Interface_Type.
-   --  Collect the list of interfaces that are not already implemented by the
-   --  ancestors. This is the list of interfaces for which we must provide
-   --  additional tag components.
+   --  At the end of a declarative part, verify that all entities that require
+   --  completion have received one. If Body_Id is absent, the error indicating
+   --  a missing completion is placed on the declaration that needs completion.
+   --  If Body_Id is present, it is the defining identifier of a package body,
+   --  and errors are posted on that node, rather than on the declarations that
+   --  require completion in the package declaration.
 
    procedure Derive_Subprogram
      (New_Subp     : in out Entity_Id;
@@ -123,22 +131,26 @@ package Sem_Ch3  is
    --  subprogram of the parent type.
 
    procedure Derive_Subprograms
-     (Parent_Type           : Entity_Id;
-      Derived_Type          : Entity_Id;
-      Generic_Actual        : Entity_Id := Empty;
-      No_Predefined_Prims   : Boolean   := False);
+     (Parent_Type    : Entity_Id;
+      Derived_Type   : Entity_Id;
+      Generic_Actual : Entity_Id := Empty);
    --  To complete type derivation, collect/retrieve the primitive operations
    --  of the parent type, and replace the subsidiary subtypes with the derived
    --  type, to build the specs of the inherited ops. For generic actuals, the
    --  mapping of the primitive operations to those of the parent type is also
    --  done by rederiving the operations within the instance. For tagged types,
    --  the derived subprograms are aliased to those of the actual, not those of
-   --  the ancestor. The last two params are used in case of derivation from
-   --  abstract interface types: No_Predefined_Prims is used to avoid the
-   --  derivation of predefined primitives from an abstract interface.
+   --  the ancestor.
    --
-   --  Note: one might expect this to be private to the package body, but
-   --  there is one rather unusual usage in package Exp_Dist.
+   --  Note: one might expect this to be private to the package body, but there
+   --  is one rather unusual usage in package Exp_Dist.
+
+   function Find_Hidden_Interface
+     (Src  : Elist_Id;
+      Dest : Elist_Id) return Entity_Id;
+   --  Ada 2005: Determine whether the interfaces in list Src are all present
+   --  in the list Dest. Return the first differing interface, or Empty
+   --  otherwise.
 
    function Find_Type_Of_Subtype_Indic (S : Node_Id) return Entity_Id;
    --  Given a subtype indication S (which is really an N_Subtype_Indication
@@ -154,8 +166,13 @@ package Sem_Ch3  is
       Typ_For_Constraint : Entity_Id;
       Constraint         : Elist_Id) return Node_Id;
    --  ??? MORE DOCUMENTATION
-   --  Given a discriminant somewhere in the Typ_For_Constraint tree
-   --  and a Constraint, return the value of that discriminant.
+   --  Given a discriminant somewhere in the Typ_For_Constraint tree and a
+   --  Constraint, return the value of that discriminant.
+
+   function Is_Null_Extension (T : Entity_Id) return Boolean;
+   --  Returns True if the tagged type T has an N_Full_Type_Declaration that
+   --  is a null extension, meaning that it has an extension part without any
+   --  components and does not have a known discriminant part.
 
    function Is_Visible_Component (C : Entity_Id) return Boolean;
    --  Determines if a record component C is visible in the present context.
@@ -173,15 +190,45 @@ package Sem_Ch3  is
    --  family declaration or a loop iteration. The index is given by an
    --  index declaration (a 'box'), or by a discrete range. The later can
    --  be the name of a discrete type, or a subtype indication.
+   --
    --  Related_Nod is the node where the potential generated implicit types
    --  will be inserted. The 2 last parameters are used for creating the name.
 
    procedure Make_Class_Wide_Type (T : Entity_Id);
    --  A Class_Wide_Type is created for each tagged type definition. The
-   --  attributes of a class wide type are inherited from those of the type
-   --  T. If T is introduced by a private declaration, the corresponding
-   --  class wide type is created at the same time, and therefore there is
-   --  a private and a full declaration for the class wide type type as well.
+   --  attributes of a class-wide type are inherited from those of the type T.
+   --  If T is introduced by a private declaration, the corresponding class
+   --  wide type is created at the same time, and therefore there is a private
+   --  and a full declaration for the class-wide type as well.
+
+   function OK_For_Limited_Init_In_05
+     (Typ : Entity_Id;
+      Exp : Node_Id) return Boolean;
+   --  Presuming Exp is an expression of an inherently limited type Typ,
+   --  returns True if the expression is allowed in an initialization context
+   --  by the rules of Ada 2005. We use the rule in RM-7.5(2.1/2), "...it is an
+   --  aggregate, a function_call, or a parenthesized expression or qualified
+   --  expression whose operand is permitted...". Note that in Ada 95 mode,
+   --  we sometimes wish to give warnings based on whether the program _would_
+   --  be legal in Ada 2005. Note that Exp must already have been resolved,
+   --  so we can know whether it's a function call (as opposed to an indexed
+   --  component, for example). In the case where Typ is a limited interface's
+   --  class-wide type, then the expression is allowed to be of any kind if its
+   --  type is a nonlimited descendant of the interface.
+
+   function OK_For_Limited_Init
+     (Typ : Entity_Id;
+      Exp : Node_Id) return Boolean;
+   --  Always False in Ada 95 mode. Equivalent to OK_For_Limited_Init_In_05 in
+   --  Ada 2005 mode.
+
+   procedure Preanalyze_Spec_Expression (N : Node_Id; T : Entity_Id);
+   --  Default and per object expressions do not freeze their components, and
+   --  must be analyzed and resolved accordingly. The analysis is done by
+   --  calling the Preanalyze_And_Resolve routine and setting the global
+   --  In_Default_Expression flag. See the documentation section entitled
+   --  "Handling of Default and Per-Object Expressions" in sem.ads for full
+   --  details. N is the expression to be analyzed, T is the expected type.
 
    procedure Process_Full_View (N : Node_Id; Full_T, Priv_T : Entity_Id);
    --  Process some semantic actions when the full view of a private type is
@@ -189,7 +236,7 @@ package Sem_Ch3  is
    --  of the dependant private subtypes. The second action is to recopy the
    --  primitive operations of the private view (in the tagged case).
    --  N is the N_Full_Type_Declaration node.
-
+   --
    --    Full_T is the full view of the type whose full declaration is in N.
    --
    --    Priv_T is the private view of the type whose full declaration is in N.
@@ -200,16 +247,16 @@ package Sem_Ch3  is
       Check_List  : List_Id := Empty_List;
       R_Check_Off : Boolean := False);
    --  Process a range expression that appears in a declaration context. The
-   --  range is analyzed and resolved with the base type of the given type,
-   --  and an appropriate check for expressions in non-static contexts made
-   --  on the bounds. R is analyzed and resolved using T, so the caller should
-   --  if necessary link R into the tree before the call, and in particular in
-   --  the case of a subtype declaration, it is appropriate to set the parent
-   --  pointer of R so that the types get properly frozen. The Check_List
-   --  parameter is used when the subprogram is called from
-   --  Build_Record_Init_Proc and is used to return a set of constraint
-   --  checking statements generated by the Checks package. R_Check_Off is
-   --  set to True when the call to Range_Check is to be skipped.
+   --  range is analyzed and resolved with the base type of the given type, and
+   --  an appropriate check for expressions in non-static contexts made on the
+   --  bounds. R is analyzed and resolved using T, so the caller should if
+   --  necessary link R into the tree before the call, and in particular in the
+   --  case of a subtype declaration, it is appropriate to set the parent
+   --  pointer of R so that the types get properly frozen. Check_List is used
+   --  when the subprogram is called from Build_Record_Init_Proc and is used to
+   --  return a set of constraint checking statements generated by the Checks
+   --  package. R_Check_Off is set to True when the call to Range_Check is to
+   --  be skipped.
 
    function Process_Subtype
      (S           : Node_Id;
@@ -229,14 +276,12 @@ package Sem_Ch3  is
    --  Prev is entity on the partial view, on which references are posted.
 
    function Replace_Anonymous_Access_To_Protected_Subprogram
-     (N      : Node_Id;
-      Prev_E : Entity_Id) return Entity_Id;
+     (N : Node_Id) return Entity_Id;
    --  Ada 2005 (AI-254): Create and decorate an internal full type declaration
-   --  in the enclosing scope corresponding to an anonymous access to protected
-   --  subprogram. In addition, replace the anonymous access by an occurrence
-   --  of this internal type. Prev_Etype is used to link the new internal
-   --  entity with the anonymous entity. Return the entity of this type
-   --  declaration.
+   --  for an anonymous access to protected subprogram. For a record component
+   --  declaration, the type is created in the enclosing scope, for an array
+   --  type declaration or an object declaration it is simply placed ahead of
+   --  this declaration.
 
    procedure Set_Completion_Referenced (E : Entity_Id);
    --  If E is the completion of a private or incomplete  type declaration,