2005-03-08 Javier Miranda <miranda@adacore.com>
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 15 Mar 2005 15:54:14 +0000 (15:54 +0000)
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 15 Mar 2005 15:54:14 +0000 (15:54 +0000)
    Robert Dewar  <dewar@adacore.com>
    Thomas Quinot  <quinot@adacore.com>
    Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>

* atree.ads, atree.adb: Add support for Elist24 field

* atree.h: Fix wrong definition of Field27
Add support for Elist16 field
Add support for Elist24 field

* einfo.ads, einfo.adb (Abstract_Interfaces,
Set_Abstract_Interfaces): New subprograms.
(Abstract_Interface_Alias, Set_Abstract_Interface_Alias): New
subprograms.
(Access_Disp_Table, Set_Access_Disp_Table): Modified to handle a list of
entities rather than a single node.
(Is_Interface, Set_Is_Interface): New subprogram
(First_Tag_Component): New syntesized attribute
(Next_Tag_Component): New synthesized attribute
(Write_Entity_Flags): Upgraded to write Is_Interface
(Write_Field24_Name): Upgraded to write Abstract_Interfaces
(Write_Field25_Name): Upgraded to write Abstract_Interface_Alias
(Task_Body_Procedure): New subprogram to read this attribute.
(Set_Task_Body_Procedure): New subprogram to set this attribute.
(Has_Controlled_Component): Now applies to all entities.
This is only a documentation change, since it always worked to apply
this to other than composite types (yielding false), but now this is
official.
Update documentation on Must_Be_Byte_Aligned for new spec

* tbuild.adb, exp_dist.adb, exp_disp.adb, exp_ch3.ads, exp_ch3.adb,
exp_attr.adb, exp_aggr.adb, exp_ch4.adb, exp_ch5.adb: Upgrade all the
uses of the Access_Disp_Table attribute to reference the first dispatch
table associated with a tagged type. As
part of the implementation of abstract interface types,
Access_Disp_Table has been redefined to contain a list of dispatch
tables (rather than a single dispatch table).
Similarly, upgrade all the references to Tag_Component by the
new attribute First_Tag_Component.
(Find_Inherited_TSS): Moved to exp_tss.
Clean up test in Expand_N_Object_Declaration for cases
where we need to do a separate assignment of the initial value.
(Expand_N_Object_Declaration): If the expression in the
declaration of a tagged type is an aggregate, no need to generate an
additional tag assignment.
(Freeze_Type): Now a function that returns True if the N_Freeze_Entity
is to be deleted.
Bit packed array ops are only called if operands are known to be
aligned.
(Component_Equality): When returning an N_Raise_Program_Error statement,
ensure that its Etype is set to Empty to avoid confusing GIGI (which
expects that only expressions have a bona fide type).
(Make_Tag_Ctrl_Assignment): Use Build_Actual_Subtype to correctly
determine the amount of data to be copied.

* par.adb (P_Interface_Type_Definition): New subprogram that parses the
new syntax rule of Ada 2005 interfaces (for AI-251 and AI-345):
    INTERFACE_TYPE_DEFINITION ::=
      [limited | task | protected | synchronized] interface
        [AND interface_list]

* par-ch3.adb (P_Type_Declaration): Modified to give support to
interfaces.
(P_Derived_Type_Def_Or_Private_Ext_Decl): Modified to give support to
interfaces.
(P_Interface_Type_Definition): New subprogram that parses the new
syntax rule of Ada 2005 interfaces
(P_Identifier_Declarations): fix two occurrences of 'RENAMES' in error
messages by the correct RENAMES (quotes removed).

* sem_prag.adb: Upgrade all the references to Tag_Component by the new
attribute First_Tag_Component.

* sinfo.ads, sinfo.adb: Remove OK_For_Stream flag, not used, not needed
(Interface_List, Set_Interface_List): New subprograms.
(Interface_Present, Set_Interface_Present): New subprograms.
(Limited_Present, Set_Limited_Present): Available also in derived
type definition nodes.
(Protected_Present, Set_Protected_Present): Available also in
record type definition and
derived type definition nodes.
(Synchronized_Present, Set_Synchronized_Present): New subprograms.
(Task_Present, Set_Task_Present): New subprogram.
(Task_Body_Procedure): Removed.
(Set_Task_Body_Procedure): Removed.
These subprogram have been removed because the attribute
Task_Body_Procedure has been moved to the corresponding task type
or task subtype entity to leave a field free to store the list
of interfaces implemented by a task (for AI-345)
Add Expression field to N_Raise_Statement node for Ada 2005 AI-361
(Null_Exclusion_Present): Change to Flag11, to avoid conflict with
expression flag Do_Range_Check
(Exception_Junk): Change to Flag7 to accomodate above change
(Box_Present, Default_Name, Specification, Set_Box_Present,
Set_Default_Name, Set_Specification): Expand the expression
"X in N_Formal_Subprogram_Declaration" into the corresponding
two comparisons. Required to use the csinfo tool.

* exp_ch11.adb (Expand_N_Raise_Statement): Deal with case where
"with string" given.

        * sem_ch11.adb (Analyze_Raise_Statement): Handle case where string
        expression given.

* par-ch11.adb (P_Raise_Statement): Recognize with string expression
in 2005 mode

* exp_ch9.adb (Build_Task_Proc_Specification): Modified to use entity
attribute Task_Body_Procedure rather than the old semantic field that
was available in the task_type_declaration node.

* par-ch12.adb (P_Formal_Type_Definition): Modified to handle formal
interface type definitions.
(P_Formal_Derived_Type_Definition): Modified to handle the list of
interfaces.

* par-ch9.adb (P_Task): Modified to handle the list of interfaces in a
task type declaration.
(P_Protected): Modified to handle the list of interfaces in a
protected type declaration.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@96489 138bc75d-0d04-0410-961f-82ee72b054a4

25 files changed:
gcc/ada/atree.adb
gcc/ada/atree.ads
gcc/ada/atree.h
gcc/ada/einfo.adb
gcc/ada/einfo.ads
gcc/ada/exp_aggr.adb
gcc/ada/exp_attr.adb
gcc/ada/exp_ch11.adb
gcc/ada/exp_ch3.adb
gcc/ada/exp_ch3.ads
gcc/ada/exp_ch4.adb
gcc/ada/exp_ch5.adb
gcc/ada/exp_ch9.adb
gcc/ada/exp_disp.adb
gcc/ada/exp_dist.adb
gcc/ada/par-ch11.adb
gcc/ada/par-ch12.adb
gcc/ada/par-ch3.adb
gcc/ada/par-ch9.adb
gcc/ada/par.adb
gcc/ada/sem_ch11.adb
gcc/ada/sem_prag.adb
gcc/ada/sinfo.adb
gcc/ada/sinfo.ads
gcc/ada/tbuild.adb

index 8122d85..f226634 100644 (file)
@@ -2919,9 +2919,15 @@ package body Atree is
       end Elist15;
 
       function Elist16 (N : Node_Id) return Elist_Id is
+         Value : constant Union_Id := Nodes.Table (N + 2).Field9;
+
       begin
          pragma Assert (Nkind (N) in N_Entity);
-         return Elist_Id (Nodes.Table (N + 2).Field9);
+         if Value = 0 then
+            return No_Elist;
+         else
+            return Elist_Id (Nodes.Table (N + 2).Field9);
+         end if;
       end Elist16;
 
       function Elist18 (N : Node_Id) return Elist_Id is
@@ -2942,6 +2948,12 @@ package body Atree is
          return Elist_Id (Nodes.Table (N + 3).Field10);
       end Elist23;
 
+      function Elist24 (N : Node_Id) return Elist_Id is
+      begin
+         pragma Assert (Nkind (N) in N_Entity);
+         return Elist_Id (Nodes.Table (N + 4).Field6);
+      end Elist24;
+
       function Name1 (N : Node_Id) return Name_Id is
       begin
          pragma Assert (N in Nodes.First .. Nodes.Last);
@@ -4845,6 +4857,12 @@ package body Atree is
          Nodes.Table (N + 3).Field10 := Union_Id (Val);
       end Set_Elist23;
 
+      procedure Set_Elist24 (N : Node_Id; Val : Elist_Id) is
+      begin
+         pragma Assert (Nkind (N) in N_Entity);
+         Nodes.Table (N + 4).Field6 := Union_Id (Val);
+      end Set_Elist24;
+
       procedure Set_Name1 (N : Node_Id; Val : Name_Id) is
       begin
          pragma Assert (N in Nodes.First .. Nodes.Last);
index 8b08b52..3093104 100644 (file)
@@ -75,62 +75,73 @@ package Atree is
    --  a node contains a number of fields, much as though the nodes were
    --  defined as a record type. The fields in a node are as follows:
 
-   --   Nkind            Indicates the kind of the node. This field is present
-   --                    in all nodes. The type is Node_Kind, which is declared
-   --                    in the package Sinfo.
+   --   Nkind         Indicates the kind of the node. This field is present
+   --                 in all nodes. The type is Node_Kind, which is declared
+   --                 in the package Sinfo.
 
-   --   Sloc             Location (Source_Ptr) of the corresponding token
-   --                    in the Source buffer. The individual node definitions
-   --                    show which token is referenced by this pointer.
+   --   Sloc          Location (Source_Ptr) of the corresponding token
+   --                 in the Source buffer. The individual node definitions
+   --                 show which token is referenced by this pointer.
 
-   --   In_List          A flag used to indicate if the node is a member
+   --   In_List       A flag used to indicate if the node is a member
    --                    of a node list.
 
-   --   Rewrite_Sub      A flag set if the node has been rewritten using
-   --                    the Rewrite procedure. The original value of the
-   --                    node is retrievable with Original_Node.
+   --   Rewrite_Sub   A flag set if the node has been rewritten using
+   --                 the Rewrite procedure. The original value of the
+   --                 node is retrievable with Original_Node.
 
-   --   Rewrite_Ins      A flag set if a node is marked as a rewrite inserted
-   --                    node as a result of a call to Mark_Rewrite_Insertion.
+   --   Rewrite_Ins   A flag set if a node is marked as a rewrite inserted
+   --                 node as a result of a call to Mark_Rewrite_Insertion.
 
-   --   Paren_Count      A 2-bit count used on expression nodes to indicate
-   --                    the level of parentheses. Up to 3 levels can be
-   --                    accomodated. Anything more than 3 levels is treated
-   --                    as 3 levels (conformance tests that complain about
-   --                    this are hereby deemed pathological!) Set to zero
-   --                    for non-subexpression nodes.
+   --   Paren_Count   A 2-bit count used on expression nodes to indicate
+   --                 the level of parentheses. Up to 3 levels can be
+   --                 accomodated. Anything more than 3 levels is treated
+   --                 as 3 levels (conformance tests that complain about
+   --                 this are hereby deemed pathological!) Set to zero
+   --                 for non-subexpression nodes.
 
    --   Comes_From_Source
-   --                    This flag is present in all nodes. It is set if the
-   --                    node is built by the scanner or parser, and clear if
-   --                    the node is built by the analyzer or expander. It
-   --                    indicates that the node corresponds to a construct
-   --                    that appears in the original source program.
-
-   --   Analyzed         This flag is present in all nodes. It is set when
-   --                    a node is analyzed, and is used to avoid analyzing
-   --                    the same node twice. Analysis includes expansion if
-   --                    expansion is active, so in this case if the flag is
-   --                    set it means the node has been analyzed and expanded.
-
-   --   Error_Posted     This flag is present in all nodes. It is set when
-   --                    an error message is posted which is associated with
-   --                    the flagged node. This is used to avoid posting more
-   --                    than one message on the same node.
+   --                 This flag is present in all nodes. It is set if the
+   --                 node is built by the scanner or parser, and clear if
+   --                 the node is built by the analyzer or expander. It
+   --                 indicates that the node corresponds to a construct
+   --                 that appears in the original source program.
+
+   --   Analyzed      This flag is present in all nodes. It is set when
+   --                 a node is analyzed, and is used to avoid analyzing
+   --                 the same node twice. Analysis includes expansion if
+   --                 expansion is active, so in this case if the flag is
+   --                 set it means the node has been analyzed and expanded.
+
+   --   Error_Posted  This flag is present in all nodes. It is set when
+   --                 an error message is posted which is associated with
+   --                 the flagged node. This is used to avoid posting more
+   --                 than one message on the same node.
 
    --   Field1
    --   Field2
    --   Field3
    --   Field4
-   --   Field5           Five fields holding Union_Id values
-
-   --   ElistN           Synonym for FieldN typed as Elist_Id
-   --   ListN            Synonym for FieldN typed as List_Id
-   --   NameN            Synonym for FieldN typed as Name_Id
-   --   NodeN            Synonym for FieldN typed as Node_Id
-   --   StrN             Synonym for FieldN typed as String_Id
-   --   UintN            Synonym for FieldN typed as Uint (Empty = Uint_0)
-   --   UrealN           Synonym for FieldN typed as Ureal
+   --   Field5        Five fields holding Union_Id values
+
+   --   ElistN        Synonym for FieldN typed as Elist_Id (Empty = No_Elist)
+   --   ListN         Synonym for FieldN typed as List_Id
+   --   NameN         Synonym for FieldN typed as Name_Id
+   --   NodeN         Synonym for FieldN typed as Node_Id
+   --   StrN          Synonym for FieldN typed as String_Id
+   --   UintN         Synonym for FieldN typed as Uint (Empty = Uint_0)
+   --   UrealN        Synonym for FieldN typed as Ureal
+
+   --   Note: in the case of ElistN and UintN fields, it is common that we
+   --   end up with a value of Union_Id'(0) as the default value. This value
+   --   is meaningless as a Uint or Elist_Id value. We have two choices here.
+   --   We could require that all Uint and Elist fields be initialized to an
+   --   appropriate value, but that's error prone, since it would be easy to
+   --   miss an initialization. So instead we have the retrieval functions
+   --   generate an appropriate default value (Uint_0 or No_Elist). Probably
+   --   it would be cleaner to generate No_Uint in the Uint case but we got
+   --   stuck with representing an "unset" size value as zero early on, and
+   --   it will take a bit of fiddling to change that ???
 
    --   Note: the actual usage of FieldN (i.e. whether it contains a Elist_Id,
    --   List_Id, Name_Id, Node_Id, String_Id, Uint or Ureal), depends on the
@@ -146,46 +157,46 @@ package Atree is
    --   it is useful to be able to do untyped traversals, and an internal
    --   package in Atree allows for direct untyped accesses in such cases.
 
-   --   Flag4            Fifteen Boolean flags (use depends on Nkind and
-   --   Flag5            Ekind, as described for FieldN). Again the access
-   --   Flag6            is usually via subprograms in Sinfo and Einfo which
-   --   Flag7            provide high-level synonyms for these flags, and
-   --   Flag8            contain debugging code that checks that the values
-   --   Flag9            in Nkind and Ekind are appropriate for the access.
+   --   Flag4         Fifteen Boolean flags (use depends on Nkind and
+   --   Flag5         Ekind, as described for FieldN). Again the access
+   --   Flag6         is usually via subprograms in Sinfo and Einfo which
+   --   Flag7         provide high-level synonyms for these flags, and
+   --   Flag8         contain debugging code that checks that the values
+   --   Flag9         in Nkind and Ekind are appropriate for the access.
    --   Flag10
-   --   Flag11           Note that Flag1-3 are missing from this list. The
-   --   Flag12           first three flag positions are reserved for the
-   --   Flag13           standard flags (Comes_From_Source, Error_Posted,
-   --   Flag14           and Analyzed)
+   --   Flag11        Note that Flag1-3 are missing from this list. The
+   --   Flag12        first three flag positions are reserved for the
+   --   Flag13        standard flags (Comes_From_Source, Error_Posted,
+   --   Flag14        and Analyzed)
    --   Flag15
    --   Flag16
    --   Flag17
    --   Flag18
 
-   --   Link             For a node, points to the Parent. For a list, points
-   --                    to the list header. Note that in the latter case, a
-   --                    client cannot modify the link field. This field is
-   --                    private to the Atree package (but is also modified
-   --                    by the Nlists package).
+   --   Link          For a node, points to the Parent. For a list, points
+   --                 to the list header. Note that in the latter case, a
+   --                 client cannot modify the link field. This field is
+   --                 private to the Atree package (but is also modified
+   --                 by the Nlists package).
 
    --  The following additional fields are present in extended nodes used
    --  for entities (Nkind in N_Entity).
 
-   --   Ekind            Entity type. This field indicates the type of the
-   --                    entity, it is of type Entity_Kind which is defined
-   --                    in package Einfo.
+   --   Ekind         Entity type. This field indicates the type of the
+   --                 entity, it is of type Entity_Kind which is defined
+   --                 in package Einfo.
 
-   --   Flag19           197 additional flags
+   --   Flag19        197 additional flags
    --   ...
    --   Flag215
 
-   --   Convention       Entity convention (Convention_Id value)
+   --   Convention    Entity convention (Convention_Id value)
 
-   --   Field6           Additional Union_Id value stored in tree
+   --   Field6        Additional Union_Id value stored in tree
 
-   --   Node6            Synonym for Field6 typed as Node_Id
-   --   Elist6           Synonym for Field6 typed as Elist_Id
-   --   Uint6            Synonym for Field6 typed as Uint (Empty = Uint_0)
+   --   Node6         Synonym for Field6 typed as Node_Id
+   --   Elist6        Synonym for Field6 typed as Elist_Id (Empty = No_Elist)
+   --   Uint6         Synonym for Field6 typed as Uint (Empty = Uint_0)
 
    --   Similar definitions for Field7 to Field27 (and Node7-Node27,
    --   Elist7-Elist27, Uint7-Uint27, Ureal7-Ureal27). Note that not all
@@ -981,6 +992,9 @@ package Atree is
       function Elist23 (N : Node_Id) return Elist_Id;
       pragma Inline (Elist23);
 
+      function Elist24 (N : Node_Id) return Elist_Id;
+      pragma Inline (Elist24);
+
       function Name1 (N : Node_Id) return Name_Id;
       pragma Inline (Name1);
 
@@ -1903,6 +1917,9 @@ package Atree is
       procedure Set_Elist23 (N : Node_Id; Val : Elist_Id);
       pragma Inline (Set_Elist23);
 
+      procedure Set_Elist24 (N : Node_Id; Val : Elist_Id);
+      pragma Inline (Set_Elist24);
+
       procedure Set_Name1 (N : Node_Id; Val : Name_Id);
       pragma Inline (Set_Name1);
 
@@ -2602,7 +2619,6 @@ package Atree is
       procedure Set_Flag215 (N : Node_Id; Val : Boolean);
       pragma Inline (Set_Flag215);
 
-
       --  The following versions of Set_Noden also set the parent
       --  pointer of the referenced node if it is non_Empty
 
index 0d06969..c878a12 100644 (file)
@@ -381,7 +381,7 @@ extern Node_Id Current_Error_Node;
 #define Field24(N)    (Nodes_Ptr[(N) - First_Node_Id + 4].V.EX.field6)
 #define Field25(N)    (Nodes_Ptr[(N) - First_Node_Id + 4].V.EX.field7)
 #define Field26(N)    (Nodes_Ptr[(N) - First_Node_Id + 4].V.EX.field8)
-#define Field27(N)    (Nodes_Ptr[(N) - First_Node_Id + 3].V.EX.field9)
+#define Field27(N)    (Nodes_Ptr[(N) - First_Node_Id + 4].V.EX.field9)
 
 #define Node1(N)      Field1  (N)
 #define Node2(N)      Field2  (N)
@@ -425,9 +425,11 @@ extern Node_Id Current_Error_Node;
 #define Elist8(N)     Field8  (N)
 #define Elist13(N)    Field13 (N)
 #define Elist15(N)    Field15 (N)
+#define Elist16(N)    Field16 (N)
 #define Elist18(N)    Field18 (N)
 #define Elist21(N)    Field21 (N)
 #define Elist23(N)    Field23 (N)
+#define Elist24(N)    Field24 (N)
 
 #define Name1(N)      Field1  (N)
 #define Name2(N)      Field2  (N)
index 8606bf0..900b69a 100644 (file)
@@ -129,7 +129,7 @@ package body Einfo is
    --    String_Literal_Low_Bound        Node15
    --    Shared_Var_Read_Proc            Node15
 
-   --    Access_Disp_Table               Node16
+   --    Access_Disp_Table               Elist16
    --    Cloned_Subtype                  Node16
    --    DTC_Entity                      Node16
    --    Entry_Formal                    Node16
@@ -210,9 +210,13 @@ package body Einfo is
    --    Protected_Operation             Node23
 
    --    Obsolescent_Warning             Node24
+   --    Task_Body_Procedure             Node24
+   --    Abstract_Interfaces             Node24
+
+   --    Abstract_Interface_Alias        Node25
 
-   --    (unused)                        Node25
    --    (unused)                        Node26
+
    --    (unused)                        Node27
 
    ---------------------------------------------
@@ -428,8 +432,8 @@ package body Einfo is
    --    Must_Be_On_Byte_Boundary       Flag183
    --    Has_Stream_Size_Clause         Flag184
    --    Is_Ada_2005                    Flag185
+   --    Is_Interface                   Flag186
 
-   --    (unused)                       Flag186
    --    (unused)                       Flag187
    --    (unused)                       Flag188
    --    (unused)                       Flag189
@@ -494,15 +498,31 @@ package body Einfo is
    -- Attribute Access Functions --
    --------------------------------
 
+   function Abstract_Interfaces (Id : E) return L is
+   begin
+      pragma Assert (Ekind (Id) = E_Record_Type
+                       or else Ekind (Id) = E_Record_Subtype
+                       or else Ekind (Id) = E_Record_Type_With_Private
+                       or else Ekind (Id) = E_Record_Subtype_With_Private);
+      return Elist24 (Id);
+   end Abstract_Interfaces;
+
+   function Abstract_Interface_Alias (Id : E) return E is
+   begin
+      pragma Assert
+        (Ekind (Id) = E_Procedure or Ekind (Id) = E_Function);
+      return Node25 (Id);
+   end Abstract_Interface_Alias;
+
    function Accept_Address (Id : E) return L is
    begin
       return Elist21 (Id);
    end Accept_Address;
 
-   function Access_Disp_Table (Id : E) return E is
+   function Access_Disp_Table (Id : E) return L is
    begin
       pragma Assert (Is_Tagged_Type (Id));
-      return Node16 (Implementation_Base_Type (Id));
+      return Elist16 (Implementation_Base_Type (Id));
    end Access_Disp_Table;
 
    function Actual_Subtype (Id : E) return E is
@@ -1551,6 +1571,16 @@ package body Einfo is
       return Flag11 (Id);
    end Is_Inlined;
 
+   function Is_Interface (Id : E) return B is
+   begin
+      pragma Assert (Ekind (Id) = E_Record_Type
+                       or else Ekind (Id) = E_Record_Subtype
+                       or else Ekind (Id) = E_Record_Type_With_Private
+                       or else Ekind (Id) = E_Record_Subtype_With_Private
+                       or else Ekind (Id) = E_Class_Wide_Type);
+      return Flag186 (Id);
+   end Is_Interface;
+
    function Is_Instantiated (Id : E) return B is
    begin
       return Flag126 (Id);
@@ -2207,6 +2237,13 @@ package body Einfo is
       return Flag165 (Id);
    end Suppress_Style_Checks;
 
+   function Task_Body_Procedure (Id : E) return N is
+   begin
+      pragma Assert (Ekind (Id) = E_Task_Type
+                      or else Ekind (Id) = E_Task_Subtype);
+      return Node24 (Id);
+   end Task_Body_Procedure;
+
    function Treat_As_Volatile (Id : E) return B is
    begin
       return Flag41 (Id);
@@ -2434,15 +2471,31 @@ package body Einfo is
    -- Attribute Set Procedures --
    ------------------------------
 
+   procedure Set_Abstract_Interfaces (Id : E; V : L) is
+   begin
+      pragma Assert (Ekind (Id) = E_Record_Type
+                       or else Ekind (Id) = E_Record_Subtype
+                       or else Ekind (Id) = E_Record_Type_With_Private
+                       or else Ekind (Id) = E_Record_Subtype_With_Private);
+      Set_Elist24 (Id, V);
+   end Set_Abstract_Interfaces;
+
+   procedure Set_Abstract_Interface_Alias (Id : E; V : E) is
+   begin
+      pragma Assert
+        (Ekind (Id) = E_Procedure or Ekind (Id) = E_Function);
+      Set_Node25 (Id, V);
+   end Set_Abstract_Interface_Alias;
+
    procedure Set_Accept_Address (Id : E; V : L) is
    begin
       Set_Elist21 (Id, V);
    end Set_Accept_Address;
 
-   procedure Set_Access_Disp_Table (Id : E; V : E) is
+   procedure Set_Access_Disp_Table (Id : E; V : L) is
    begin
       pragma Assert (Is_Tagged_Type (Id) and then Id = Base_Type (Id));
-      Set_Node16 (Id, V);
+      Set_Elist16 (Id, V);
    end Set_Access_Disp_Table;
 
    procedure Set_Associated_Final_Chain (Id : E; V : E) is
@@ -3527,6 +3580,15 @@ package body Einfo is
       Set_Flag11 (Id, V);
    end Set_Is_Inlined;
 
+   procedure Set_Is_Interface (Id : E; V : B := True) is
+   begin
+      pragma Assert (Ekind (Id) = E_Record_Type
+                       or else Ekind (Id) = E_Record_Subtype
+                       or else Ekind (Id) = E_Record_Type_With_Private
+                       or else Ekind (Id) = E_Record_Subtype_With_Private);
+      Set_Flag186 (Id, V);
+   end Set_Is_Interface;
+
    procedure Set_Is_Instantiated (Id : E; V : B := True) is
    begin
       Set_Flag126 (Id, V);
@@ -4194,6 +4256,13 @@ package body Einfo is
       Set_Flag165 (Id, V);
    end Set_Suppress_Style_Checks;
 
+   procedure Set_Task_Body_Procedure (Id : E; V : N) is
+   begin
+      pragma Assert (Ekind (Id) = E_Task_Type
+                      or else Ekind (Id) = E_Task_Subtype);
+      Set_Node24 (Id, V);
+   end Set_Task_Body_Procedure;
+
    procedure Set_Treat_As_Volatile (Id : E; V : B := True) is
    begin
       Set_Flag41 (Id, V);
@@ -6039,11 +6108,11 @@ package body Einfo is
       return Kind;
    end Subtype_Kind;
 
-   -------------------
-   -- Tag_Component --
-   -------------------
+   -------------------------
+   -- First_Tag_Component --
+   -------------------------
 
-   function Tag_Component (Id : E) return E is
+   function First_Tag_Component (Id : E) return E is
       Comp : Entity_Id;
       Typ  : Entity_Id := Id;
 
@@ -6070,7 +6139,34 @@ package body Einfo is
       --  No tag component found
 
       return Empty;
-   end Tag_Component;
+   end First_Tag_Component;
+
+   ------------------------
+   -- Next_Tag_Component --
+   ------------------------
+
+   function Next_Tag_Component (Id : E) return E is
+      Comp : Entity_Id;
+      Typ  : constant Entity_Id := Scope (Id);
+
+   begin
+      pragma Assert (Ekind (Id) = E_Component
+                       and then Is_Tagged_Type (Typ));
+
+      Comp := Next_Entity (Id);
+      while Present (Comp) loop
+         if Is_Tag (Comp) then
+            pragma Assert (Chars (Comp) /= Name_uTag);
+            return Comp;
+         end if;
+
+         Comp := Next_Entity (Comp);
+      end loop;
+
+      --  No tag component found
+
+      return Empty;
+   end Next_Tag_Component;
 
    ---------------------
    -- Type_High_Bound --
@@ -6311,6 +6407,7 @@ package body Einfo is
       W ("Is_Imported",                   Flag24  (Id));
       W ("Is_Inlined",                    Flag11  (Id));
       W ("Is_Instantiated",               Flag126 (Id));
+      W ("Is_Interface",                  Flag186 (Id));
       W ("Is_Internal",                   Flag17  (Id));
       W ("Is_Interrupt_Handler",          Flag89  (Id));
       W ("Is_Intrinsic_Subprogram",       Flag64  (Id));
@@ -6939,7 +7036,7 @@ package body Einfo is
               E_Procedure                                =>
             Write_Str ("Alias");
 
-         when E_Record_Type                =>
+         when E_Record_Type                              =>
             Write_Str ("Corresponding_Concurrent_Type");
 
          when E_Entry_Index_Parameter                    =>
@@ -7255,9 +7352,18 @@ package body Einfo is
    procedure Write_Field24_Name (Id : Entity_Id) is
    begin
       case Ekind (Id) is
+         when E_Record_Type                              |
+              E_Record_Subtype                           |
+              E_Record_Type_With_Private                 |
+              E_Record_Subtype_With_Private              =>
+            Write_Str ("Abstract_Interfaces");
+
          when Subprogram_Kind                            =>
             Write_Str ("Obsolescent_Warning");
 
+         when Task_Kind                                  =>
+            Write_Str ("Task_Body_Procedure");
+
          when others                                     =>
             Write_Str ("Field24??");
       end case;
@@ -7270,6 +7376,10 @@ package body Einfo is
    procedure Write_Field25_Name (Id : Entity_Id) is
    begin
       case Ekind (Id) is
+         when E_Procedure                                |
+              E_Function                                 =>
+            Write_Str ("Abstract_Interface_Alias");
+
          when others                                     =>
             Write_Str ("Field25??");
       end case;
index 573539f..8218d9c 100644 (file)
@@ -286,6 +286,17 @@ package Einfo is
 --  and if assertions are enabled, an attempt to set the attribute on a
 --  subtype will raise an assert error.
 
+--    Abstract_Interfaces (Elist24)
+--       Present in record types and subtypes. List of abstract interfaces
+--       implemented by a tagged type that are not already implemented by the
+--       ancestors (Ada 2005: AI-251).
+
+--    Abstract_Interface_Alias (Node25)
+--       Present in subprograms that cover a primitive operation of an abstract
+--       interface type. Points to its associated interface subprogram. It is
+--       used to register the subprogram in secondary dispatch table of the
+--       interface (Ada 2005: AI-251).
+
 --    Accept_Address (Elist21)
 --       Present in entries. If an accept has a statement sequence, then an
 --       address variable is created, which is used to hold the address of the
@@ -313,9 +324,9 @@ package Einfo is
 --       rather irregular, and the semantic checks that depend on the nominal
 --       subtype being unconstrained use flag Is_Constr_Subt_For_U_Nominal(qv).
 
---    Access_Disp_Table (Node16) [implementation base type only]
+--    Access_Disp_Table (Elist16) [implementation base type only]
 --       Present in record type entities. For a tagged type, points to the
---       dispatch table associated with the tagged type. For a non-tagged
+--       dispatch tables associated with the tagged type. For a non-tagged
 --       record, contains Empty.
 
 --    Address_Clause (synthesized)
@@ -1279,10 +1290,10 @@ package Einfo is
 --       function of a tagged type which can dispatch on result
 
 --    Has_Controlled_Component (Flag43) [base type only]
---       Present in composite type entities. Indicates that the type has a
---       component that either is a controlled type, or itself contains a
---       controlled component (i.e. either Has_Controlled_Component or
---       Is_Controlled is set for at least one component).
+--       Present in all entities. Set only for composite type entities which
+--       contain a component that either is a controlled type, or itself
+--       contains controlled component (i.e. either Has_Controlled_Component
+--       or Is_Controlled is set for at least one component).
 
 --    Has_Convention_Pragma (Flag119)
 --       Present in an entity for which a Convention, Import, or Export
@@ -1959,6 +1970,15 @@ package Einfo is
 --    Is_Integer_Type (synthesized)
 --       Applies to all entities, true for integer types and subtypes
 
+--    Is_Interface (Flag186)
+--       Present in record types and subtypes to indicate that the current
+--       entity corresponds with an abstract interface. Because abstract
+--       interfaces are conceptually a special kind of abstract tagged types
+--       we represent them by means of tagged record types and subtypes
+--       marked with this attribute. This allows us to reuse most of the
+--       compiler support for abstract tagged types to implement interfaces
+--       (Ada 2005: AI-251).
+
 --    Is_Internal (Flag17)
 --       Present in all entities. Set to indicate an entity created during
 --       semantic processing (e.g. an implicit type). Need more documentation
@@ -2472,7 +2492,8 @@ package Einfo is
 --       accurately a storage unit boundary). The front end checks that
 --       component clauses respect this rule, and the back end ensures
 --       that record packing does not violate this rule. Currently the
---       flag is set only for packed arrays longer than 64 bits.
+--       flag is set only for packed arrays longer than 64 bits where
+--       the component size is not a power of 2.
 
 --    Needs_Debug_Info (Flag147)
 --       Present in all entities. Set if the entity requires debugging
@@ -3070,9 +3091,19 @@ package Einfo is
 --       Present in all entities. Suppresses any style checks specifically
 --       associated with the given entity if set.
 
---    Tag_Component (synthesized)
---       Applies to tagged record types, returns the entity for the _Tag
---       field in this record, which must be present.
+--    Task_Body_Procedure (Node24)
+--       Present in task types and subtypes. Points to the entity for
+--       the task body procedure (as further described in Exp_Ch9, task
+--       bodies are expanded into procedures). A convenient function to
+--       retrieve this field is Sem_Util.Get_Task_Body_Procedure.
+
+--    First_Tag_Component (synthesized)
+--       Applies to tagged record types, returns the entity for the first
+--       _Tag field in this record.
+
+--    Next_Tag_Component (synthesized)
+--       Applies to components of tagged record types. Given a _Tag field
+--       of a record, returns the next _Tag field in this record.
 
 --    Treat_As_Volatile (Flag41)
 --       Present in all type entities, and also in constants, components and
@@ -3921,6 +3952,7 @@ package Einfo is
    --    Can_Never_Be_Null             (Flag38)
    --    Checks_May_Be_Suppressed      (Flag31)
    --    Debug_Info_Off                (Flag166)
+   --    Has_Controlled_Component      (Flag43)   (base type only)
    --    Has_Convention_Pragma         (Flag119)
    --    Has_Delayed_Freeze            (Flag18)
    --    Has_Fully_Qualified_Name      (Flag173)
@@ -4108,7 +4140,6 @@ package Einfo is
    --    Packed_Array_Type             (Node23)
    --    Component_Alignment           (special)  (base type only)
    --    Has_Component_Size_Clause     (Flag68)   (base type only)
-   --    Has_Controlled_Component      (Flag43)   (base type only)
    --    Has_Pragma_Pack               (Flag121)  (base type only)
    --    Is_Aliased                    (Flag15)
    --    Is_Constrained                (Flag12)
@@ -4137,7 +4168,6 @@ package Einfo is
    --    First_Entity                  (Node17)
    --    Equivalent_Type               (Node18)   (always Empty in type case)
    --    Last_Entity                   (Node20)
-   --    Has_Controlled_Component      (Flag43)   (base type only)
    --    First_Component               (synth)
    --    (plus type attributes)
 
@@ -4165,6 +4195,7 @@ package Einfo is
    --    Treat_As_Volatile             (Flag41)
    --    Is_Protected_Private          (synth)
    --    Next_Component                (synth)
+   --    Next_Tag_Component            (synth)
 
    --  E_Constant
    --  E_Loop_Parameter
@@ -4320,6 +4351,7 @@ package Einfo is
    --    Inner_Instances               (Elist23)  (for a generic function)
    --    Privals_Chain                 (Elist23)  (for a protected function)
    --    Obsolescent_Warning           (Node24)
+   --    Abstract_Interface_Alias      (Node25)
    --    Body_Needed_For_SAL           (Flag40)
    --    Elaboration_Entity_Required   (Flag174)
    --    Function_Returns_With_DSP     (Flag169)
@@ -4567,6 +4599,7 @@ package Einfo is
    --    Inner_Instances               (Elist23)  (for a generic procedure)
    --    Privals_Chain                 (Elist23)  (for a protected procedure)
    --    Obsolescent_Warning           (Node24)
+   --    Abstract_Interface_Alias      (Node25)
    --    Body_Needed_For_SAL           (Flag40)
    --    Elaboration_Entity_Required   (Flag174)
    --    Function_Returns_With_DSP     (Flag169)  (always False for procedure)
@@ -4623,7 +4656,6 @@ package Einfo is
    --    Scope_Depth_Value             (Uint22)
    --    Scope_Depth                   (synth)
    --    Stored_Constraint             (Elist23)
-   --    Has_Controlled_Component      (Flag43)   (base type only)
    --    Has_Interrupt_Handler         (synth)
    --    Sec_Stack_Needed_For_Return   (Flag167) ???
    --    Uses_Sec_Stack                (Flag95) ???
@@ -4633,7 +4665,7 @@ package Einfo is
    --  E_Record_Type
    --  E_Record_Subtype
    --    Primitive_Operations          (Elist15)
-   --    Access_Disp_Table             (Node16)   (base type only)
+   --    Access_Disp_Table             (Elist16)  (base type only)
    --    Cloned_Subtype                (Node16)   (subtype case only)
    --    First_Entity                  (Node17)
    --    Corresponding_Concurrent_Type (Node18)
@@ -4642,26 +4674,27 @@ package Einfo is
    --    Discriminant_Constraint       (Elist21)
    --    Corresponding_Remote_Type     (Node22)
    --    Stored_Constraint             (Elist23)
+   --    Abstract_Interfaces           (Elist24)
    --    Component_Alignment           (special)  (base type only)
    --    C_Pass_By_Copy                (Flag125)  (base type only)
-   --    Has_Controlled_Component      (Flag43)   (base type only)
    --    Has_External_Tag_Rep_Clause   (Flag110)
    --    Has_Record_Rep_Clause         (Flag65)   (base type only)
    --    Is_Class_Wide_Equivalent_Type (Flag35)
    --    Is_Concurrent_Record_Type     (Flag20)
    --    Is_Constrained                (Flag12)
    --    Is_Controlled                 (Flag42)   (base type only)
+   --    Is_Interface                  (Flag186)
    --    Reverse_Bit_Order             (Flag164)  (base type only)
    --    First_Component               (synth)
    --    First_Discriminant            (synth)
    --    First_Stored_Discriminant     (synth)
-   --    Tag_Component                 (synth)
+   --    First_Tag_Component           (synth)
    --    (plus type attributes)
 
    --  E_Record_Type_With_Private
    --  E_Record_Subtype_With_Private
    --    Primitive_Operations          (Elist15)
-   --    Access_Disp_Table             (Node16)   (base type only)
+   --    Access_Disp_Table             (Elist16)  (base type only)
    --    First_Entity                  (Node17)
    --    Private_Dependents            (Elist18)
    --    Underlying_Full_View          (Node19)
@@ -4669,19 +4702,20 @@ package Einfo is
    --    Discriminant_Constraint       (Elist21)
    --    Private_View                  (Node22)
    --    Stored_Constraint             (Elist23)
+   --    Abstract_Interfaces           (Elist24)
    --    Has_Completion                (Flag26)
    --    Has_Completion_In_Body        (Flag71)
-   --    Has_Controlled_Component      (Flag43)   (base type only)
    --    Has_Record_Rep_Clause         (Flag65)   (base type only)
    --    Has_External_Tag_Rep_Clause   (Flag110)
    --    Is_Concurrent_Record_Type     (Flag20)
    --    Is_Constrained                (Flag12)
    --    Is_Controlled                 (Flag42)   (base type only)
+   --    Is_Interface                  (Flag186)
    --    Reverse_Bit_Order             (Flag164)  (base type only)
    --    First_Component               (synth)
    --    First_Discriminant            (synth)
    --    First_Stored_Discriminant     (synth)
-   --    Tag_Component                 (synth)
+   --    First_Tag_Component           (synth)
    --    (plus type attributes)
 
    --  E_Signed_Integer_Type
@@ -4737,6 +4771,7 @@ package Einfo is
    --    Scope_Depth_Value             (Uint22)
    --    Scope_Depth                   (synth)
    --    Stored_Constraint             (Elist23)
+   --    Task_Body_Procedure           (Node24)
    --    Delay_Cleanups                (Flag114)
    --    Has_Master_Entity             (Flag21)
    --    Has_Storage_Size_Clause       (Flag23)   (base type only)
@@ -5006,11 +5041,13 @@ package Einfo is
    --  section contains the functions used to obtain attribute values which
    --  correspond to values in fields or flags in the entity itself.
 
+   function Abstract_Interfaces                (Id : E) return L;
    function Accept_Address                     (Id : E) return L;
-   function Access_Disp_Table                  (Id : E) return E;
+   function Access_Disp_Table                  (Id : E) return L;
    function Actual_Subtype                     (Id : E) return E;
    function Address_Taken                      (Id : E) return B;
    function Alias                              (Id : E) return E;
+   function Abstract_Interface_Alias           (Id : E) return E;
    function Alignment                          (Id : E) return U;
    function Associated_Final_Chain             (Id : E) return E;
    function Associated_Formal_Package          (Id : E) return E;
@@ -5189,6 +5226,7 @@ package Einfo is
    function Is_Immediately_Visible             (Id : E) return B;
    function Is_Imported                        (Id : E) return B;
    function Is_Inlined                         (Id : E) return B;
+   function Is_Interface                       (Id : E) return B;
    function Is_Instantiated                    (Id : E) return B;
    function Is_Internal                        (Id : E) return B;
    function Is_Interrupt_Handler               (Id : E) return B;
@@ -5302,6 +5340,7 @@ package Einfo is
    function Suppress_Elaboration_Warnings      (Id : E) return B;
    function Suppress_Init_Proc                 (Id : E) return B;
    function Suppress_Style_Checks              (Id : E) return B;
+   function Task_Body_Procedure                (Id : E) return N;
    function Treat_As_Volatile                  (Id : E) return B;
    function Underlying_Full_View               (Id : E) return E;
    function Unset_Reference                    (Id : E) return N;
@@ -5416,7 +5455,8 @@ package Einfo is
    function Scope_Depth_Set                    (Id : E) return B;
    function Size_Clause                        (Id : E) return N;
    function Stream_Size_Clause                 (Id : E) return N;
-   function Tag_Component                      (Id : E) return E;
+   function First_Tag_Component                (Id : E) return E;
+   function Next_Tag_Component                 (Id : E) return E;
    function Type_High_Bound                    (Id : E) return N;
    function Type_Low_Bound                     (Id : E) return N;
    function Underlying_Type                    (Id : E) return E;
@@ -5481,11 +5521,13 @@ package Einfo is
    -- Attribute Set Procedures --
    ------------------------------
 
+   procedure Set_Abstract_Interfaces           (Id : E; V : L);
    procedure Set_Accept_Address                (Id : E; V : L);
-   procedure Set_Access_Disp_Table             (Id : E; V : E);
+   procedure Set_Access_Disp_Table             (Id : E; V : L);
    procedure Set_Actual_Subtype                (Id : E; V : E);
    procedure Set_Address_Taken                 (Id : E; V : B := True);
    procedure Set_Alias                         (Id : E; V : E);
+   procedure Set_Abstract_Interface_Alias      (Id : E; V : E);
    procedure Set_Alignment                     (Id : E; V : U);
    procedure Set_Associated_Final_Chain        (Id : E; V : E);
    procedure Set_Associated_Formal_Package     (Id : E; V : E);
@@ -5667,6 +5709,7 @@ package Einfo is
    procedure Set_Is_Immediately_Visible        (Id : E; V : B := True);
    procedure Set_Is_Imported                   (Id : E; V : B := True);
    procedure Set_Is_Inlined                    (Id : E; V : B := True);
+   procedure Set_Is_Interface                  (Id : E; V : B := True);
    procedure Set_Is_Instantiated               (Id : E; V : B := True);
    procedure Set_Is_Internal                   (Id : E; V : B := True);
    procedure Set_Is_Interrupt_Handler          (Id : E; V : B := True);
@@ -5781,6 +5824,7 @@ package Einfo is
    procedure Set_Suppress_Elaboration_Warnings (Id : E; V : B := True);
    procedure Set_Suppress_Init_Proc            (Id : E; V : B := True);
    procedure Set_Suppress_Style_Checks         (Id : E; V : B := True);
+   procedure Set_Task_Body_Procedure           (Id : E; V : N);
    procedure Set_Treat_As_Volatile             (Id : E; V : B := True);
    procedure Set_Underlying_Full_View          (Id : E; V : E);
    procedure Set_Unset_Reference               (Id : E; V : N);
@@ -6012,10 +6056,12 @@ package Einfo is
    --  subprograms meeting the requirements documented in the section on
    --  XEINFO may be referenced in this section.
 
+   pragma Inline (Abstract_Interfaces);
    pragma Inline (Accept_Address);
    pragma Inline (Access_Disp_Table);
    pragma Inline (Actual_Subtype);
    pragma Inline (Address_Taken);
+   pragma Inline (Abstract_Interface_Alias);
    pragma Inline (Alias);
    pragma Inline (Alignment);
    pragma Inline (Associated_Final_Chain);
@@ -6216,6 +6262,7 @@ package Einfo is
    pragma Inline (Is_Imported);
    pragma Inline (Is_Incomplete_Or_Private_Type);
    pragma Inline (Is_Inlined);
+   pragma Inline (Is_Interface);
    pragma Inline (Is_Instantiated);
    pragma Inline (Is_Integer_Type);
    pragma Inline (Is_Internal);
@@ -6348,6 +6395,7 @@ package Einfo is
    pragma Inline (Suppress_Elaboration_Warnings);
    pragma Inline (Suppress_Init_Proc);
    pragma Inline (Suppress_Style_Checks);
+   pragma Inline (Task_Body_Procedure);
    pragma Inline (Treat_As_Volatile);
    pragma Inline (Underlying_Full_View);
    pragma Inline (Unset_Reference);
@@ -6362,10 +6410,12 @@ package Einfo is
    pragma Inline (Init_Esize);
    pragma Inline (Init_RM_Size);
 
+   pragma Inline (Set_Abstract_Interfaces);
    pragma Inline (Set_Accept_Address);
    pragma Inline (Set_Access_Disp_Table);
    pragma Inline (Set_Actual_Subtype);
    pragma Inline (Set_Address_Taken);
+   pragma Inline (Set_Abstract_Interface_Alias);
    pragma Inline (Set_Alias);
    pragma Inline (Set_Alignment);
    pragma Inline (Set_Associated_Final_Chain);
@@ -6543,6 +6593,7 @@ package Einfo is
    pragma Inline (Set_Is_Immediately_Visible);
    pragma Inline (Set_Is_Imported);
    pragma Inline (Set_Is_Inlined);
+   pragma Inline (Set_Is_Interface);
    pragma Inline (Set_Is_Instantiated);
    pragma Inline (Set_Is_Internal);
    pragma Inline (Set_Is_Interrupt_Handler);
@@ -6657,6 +6708,7 @@ package Einfo is
    pragma Inline (Set_Suppress_Elaboration_Warnings);
    pragma Inline (Set_Suppress_Init_Proc);
    pragma Inline (Set_Suppress_Style_Checks);
+   pragma Inline (Set_Task_Body_Procedure);
    pragma Inline (Set_Treat_As_Volatile);
    pragma Inline (Set_Underlying_Full_View);
    pragma Inline (Set_Unset_Reference);
index ad2dcbe..fd68f99 100644 (file)
@@ -910,12 +910,14 @@ package body Exp_Aggr is
                      Make_Selected_Component (Loc,
                        Prefix =>  New_Copy_Tree (Indexed_Comp),
                        Selector_Name =>
-                         New_Reference_To (Tag_Component (Comp_Type), Loc)),
+                         New_Reference_To
+                           (First_Tag_Component (Comp_Type), Loc)),
 
                    Expression =>
                      Unchecked_Convert_To (RTE (RE_Tag),
-                       New_Reference_To (
-                         Access_Disp_Table (Comp_Type), Loc)));
+                       New_Reference_To
+                         (Node (First_Elmt (Access_Disp_Table (Comp_Type))),
+                          Loc)));
 
                Append_To (L, A);
             end if;
@@ -1711,8 +1713,9 @@ package body Exp_Aggr is
               Make_Procedure_Call_Statement (Loc,
                 Name =>
                   New_Reference_To
-                         (Find_Prim_Op (RTE (RE_Limited_Record_Controller),
-                    Name_Initialize), Loc),
+                    (Find_Prim_Op
+                       (RTE (RE_Limited_Record_Controller), Name_Initialize),
+                     Loc),
                 Parameter_Associations => New_List (New_Copy_Tree (Ref))));
 
          else
@@ -1727,8 +1730,10 @@ package body Exp_Aggr is
             Append_To (L,
               Make_Procedure_Call_Statement (Loc,
                 Name =>
-                  New_Reference_To (Find_Prim_Op (RTE (RE_Record_Controller),
-                    Name_Initialize), Loc),
+                  New_Reference_To
+                    (Find_Prim_Op
+                       (RTE (RE_Record_Controller), Name_Initialize),
+                     Loc),
                 Parameter_Associations => New_List (New_Copy_Tree (Ref))));
 
          end if;
@@ -1869,13 +1874,16 @@ package body Exp_Aggr is
                       Name =>
                         Make_Selected_Component (Loc,
                           Prefix => New_Copy_Tree (Target),
-                          Selector_Name => New_Reference_To (
-                            Tag_Component (Base_Type (Typ)), Loc)),
+                          Selector_Name =>
+                            New_Reference_To
+                              (First_Tag_Component (Base_Type (Typ)), Loc)),
 
                       Expression =>
                         Unchecked_Convert_To (RTE (RE_Tag),
-                          New_Reference_To (
-                            Access_Disp_Table (Base_Type (Typ)), Loc)));
+                          New_Reference_To
+                            (Node (First_Elmt
+                               (Access_Disp_Table (Base_Type (Typ)))),
+                             Loc)));
 
                   Set_Assignment_OK (Name (Instr));
                   Append_To (L, Instr);
@@ -2090,12 +2098,14 @@ package body Exp_Aggr is
                         Make_Selected_Component (Loc,
                           Prefix =>  New_Copy_Tree (Comp_Expr),
                           Selector_Name =>
-                            New_Reference_To (Tag_Component (Comp_Type), Loc)),
+                            New_Reference_To
+                              (First_Tag_Component (Comp_Type), Loc)),
 
                       Expression =>
                         Unchecked_Convert_To (RTE (RE_Tag),
-                          New_Reference_To (
-                            Access_Disp_Table (Comp_Type), Loc)));
+                          New_Reference_To
+                            (Node (First_Elmt (Access_Disp_Table (Comp_Type))),
+                             Loc)));
 
                   Append_To (L, Instr);
                end if;
@@ -2172,11 +2182,14 @@ package body Exp_Aggr is
                Make_Selected_Component (Loc,
                   Prefix => New_Copy_Tree (Target),
                  Selector_Name =>
-                   New_Reference_To (Tag_Component (Base_Type (Typ)), Loc)),
+                   New_Reference_To
+                     (First_Tag_Component (Base_Type (Typ)), Loc)),
 
              Expression =>
                Unchecked_Convert_To (RTE (RE_Tag),
-                 New_Reference_To (Access_Disp_Table (Base_Type (Typ)), Loc)));
+                 New_Reference_To
+                   (Node (First_Elmt (Access_Disp_Table (Base_Type (Typ)))),
+                    Loc)));
 
          Append_To (L, Instr);
       end if;
@@ -2186,9 +2199,10 @@ package body Exp_Aggr is
 
       if Present (Obj)
         and then Finalize_Storage_Only (Typ)
-        and then (Is_Library_Level_Entity (Obj)
-        or else Entity (Constant_Value (RTE (RE_Garbage_Collected)))
-                  = Standard_True)
+        and then
+          (Is_Library_Level_Entity (Obj)
+             or else Entity (Constant_Value (RTE (RE_Garbage_Collected))) =
+                                                              Standard_True)
       then
          Attach := Make_Integer_Literal (Loc, 0);
 
@@ -2232,8 +2246,9 @@ package body Exp_Aggr is
             Set_Assignment_OK (Ref);
             Append_To (L,
               Make_Procedure_Call_Statement (Loc,
-                Name => New_Reference_To (
-                  Find_Prim_Op (Init_Typ, Name_Initialize), Loc),
+                Name =>
+                  New_Reference_To
+                    (Find_Prim_Op (Init_Typ, Name_Initialize), Loc),
                 Parameter_Associations => New_List (New_Copy_Tree (Ref))));
          end if;
 
@@ -4282,7 +4297,9 @@ package body Exp_Aggr is
               Parent_Expr => A);
          else
             Expand_Record_Aggregate (N,
-              Orig_Tag    => New_Occurrence_Of (Access_Disp_Table (Typ), Loc),
+              Orig_Tag    =>
+                New_Occurrence_Of
+                  (Node (First_Elmt (Access_Disp_Table (Typ))), Loc),
               Parent_Expr => A);
          end if;
       end if;
@@ -4649,7 +4666,9 @@ package body Exp_Aggr is
             elsif Java_VM then
                Tag_Value := Empty;
             else
-               Tag_Value := New_Occurrence_Of (Access_Disp_Table (Typ), Loc);
+               Tag_Value :=
+                 New_Occurrence_Of
+                   (Node (First_Elmt (Access_Disp_Table (Typ))), Loc);
             end if;
 
             --  For a derived type, an aggregate for the parent is formed with
@@ -4712,7 +4731,8 @@ package body Exp_Aggr is
             elsif not Java_VM then
                declare
                   Tag_Name  : constant Node_Id :=
-                                New_Occurrence_Of (Tag_Component (Typ), Loc);
+                                New_Occurrence_Of
+                                  (First_Tag_Component (Typ), Loc);
                   Typ_Tag   : constant Entity_Id := RTE (RE_Tag);
                   Conv_Node : constant Node_Id :=
                                 Unchecked_Convert_To (Typ_Tag, Tag_Value);
index 7c965cd..e832c5a 100644 (file)
@@ -122,13 +122,6 @@ package body Exp_Attr is
    --  A reference to a type within its own scope is resolved to a reference
    --  to the current instance of the type in its initialization procedure.
 
-   function Find_Inherited_TSS
-     (Typ : Entity_Id;
-      Nam : TSS_Name_Type) return Entity_Id;
-   --  Returns the TSS of name Nam of Typ, or of its closest ancestor defining
-   --  such a TSS. Empty is returned is neither Typ nor any of its ancestors
-   --  have such a TSS.
-
    function Find_Stream_Subprogram
      (Typ : Entity_Id;
       Nam : TSS_Name_Type) return Entity_Id;
@@ -3510,7 +3503,8 @@ package body Exp_Attr is
             if not Java_VM then
                Rewrite (N,
                  Unchecked_Convert_To (RTE (RE_Tag),
-                   New_Reference_To (Access_Disp_Table (Ttyp), Loc)));
+                   New_Reference_To
+                     (Node (First_Elmt (Access_Disp_Table (Ttyp))), Loc)));
                Analyze_And_Resolve (N, RTE (RE_Tag));
             end if;
 
@@ -3519,7 +3513,7 @@ package body Exp_Attr is
               Make_Selected_Component (Loc,
                 Prefix => Relocate_Node (Pref),
                 Selector_Name =>
-                  New_Reference_To (Tag_Component (Ttyp), Loc)));
+                  New_Reference_To (First_Tag_Component (Ttyp), Loc)));
             Analyze_And_Resolve (N, RTE (RE_Tag));
          end if;
       end Tag;
@@ -4423,41 +4417,6 @@ package body Exp_Attr is
           Reason => CE_Overflow_Check_Failed));
    end Expand_Pred_Succ;
 
-   ------------------------
-   -- Find_Inherited_TSS --
-   ------------------------
-
-   function Find_Inherited_TSS
-     (Typ : Entity_Id;
-      Nam : TSS_Name_Type) return Entity_Id
-   is
-      Btyp : Entity_Id := Typ;
-      Proc : Entity_Id;
-
-   begin
-      loop
-         Btyp := Base_Type (Btyp);
-         Proc :=  TSS (Btyp, Nam);
-
-         exit when Present (Proc)
-           or else not Is_Derived_Type (Btyp);
-
-         --  If Typ is a derived type, it may inherit attributes from
-         --  some ancestor.
-
-         Btyp := Etype (Btyp);
-      end loop;
-
-      if No (Proc) then
-
-         --  If nothing else, use the TSS of the root type
-
-         Proc := TSS (Base_Type (Underlying_Type (Typ)), Nam);
-      end if;
-
-      return Proc;
-   end Find_Inherited_TSS;
-
    ----------------------------
    -- Find_Stream_Subprogram --
    ----------------------------
index 3508486..06d8e7c 100644 (file)
@@ -1067,6 +1067,29 @@ package body Exp_Ch11 is
       Str   : String_Id;
 
    begin
+      --  If a string expression is present, then the raise statement is
+      --  converted to a call:
+
+      --     Raise_Exception (exception-name'Identity, string);
+
+      --  and there is nothing else to do
+
+      if Present (Expression (N)) then
+         Rewrite (N,
+           Make_Procedure_Call_Statement (Loc,
+             Name => New_Occurrence_Of (RTE (RE_Raise_Exception), Loc),
+             Parameter_Associations => New_List (
+               Make_Attribute_Reference (Loc,
+                 Prefix => Name (N),
+                 Attribute_Name => Name_Identity),
+               Expression (N))));
+         Analyze (N);
+         return;
+      end if;
+
+      --  Remaining processing is for the case where no string expression
+      --  is present.
+
       --  There is no expansion needed for statement "raise <exception>;" when
       --  compiling for the JVM since the JVM has a built-in exception
       --  mechanism. However we need the keep the expansion for "raise;"
index 1d027d0..b3517bf 100644 (file)
@@ -1512,11 +1512,12 @@ package body Exp_Ch3 is
                   Make_Selected_Component (Loc,
                     Prefix =>  New_Copy_Tree (Lhs),
                     Selector_Name =>
-                      New_Reference_To (Tag_Component (Typ), Loc)),
+                      New_Reference_To (First_Tag_Component (Typ), Loc)),
 
                 Expression =>
                   Unchecked_Convert_To (RTE (RE_Tag),
-                    New_Reference_To (Access_Disp_Table (Typ), Loc))));
+                    New_Reference_To
+                      (Node (First_Elmt (Access_Disp_Table (Typ))), Loc))));
          end if;
 
          --  Adjust the component if controlled except if it is an
@@ -1825,10 +1826,11 @@ package body Exp_Ch3 is
                   Make_Selected_Component (Loc,
                     Prefix => Make_Identifier (Loc, Name_uInit),
                     Selector_Name =>
-                      New_Reference_To (Tag_Component (Rec_Type), Loc)),
+                      New_Reference_To (First_Tag_Component (Rec_Type), Loc)),
 
                 Expression =>
-                  New_Reference_To (Access_Disp_Table (Rec_Type), Loc));
+                  New_Reference_To
+                    (Node (First_Elmt (Access_Disp_Table (Rec_Type))), Loc));
 
             --  The tag must be inserted before the assignments to other
             --  components,  because the initial value of the component may
@@ -3497,18 +3499,20 @@ package body Exp_Ch3 is
                end;
             end if;
 
-            --  For tagged types, when an init value is given, the tag has
-            --  to be re-initialized separately in order to avoid the
-            --  propagation of a wrong tag coming from a view conversion
-            --  unless the type is class wide (in this case the tag comes
-            --  from the init value). Suppress the tag assignment when
-            --  Java_VM because JVM tags are represented implicitly
-            --  in objects. Ditto for types that are CPP_CLASS.
+            --  For tagged types, when an init value is given, the tag has to
+            --  be re-initialized separately in order to avoid the propagation
+            --  of a wrong tag coming from a view conversion unless the type
+            --  is class wide (in this case the tag comes from the init
+            --  value). Suppress the tag assignment when Java_VM because JVM
+            --  tags are represented implicitly in objects. Ditto for types
+            --  that are CPP_CLASS, and for initializations that are
+            --  aggregates, because they have to have the right tag.
 
             if Is_Tagged_Type (Typ)
               and then not Is_Class_Wide_Type (Typ)
               and then not Is_CPP_Class (Typ)
               and then not Java_VM
+              and then Nkind (Expr) /= N_Aggregate
             then
                --  The re-assignment of the tag has to be done even if
                --  the object is a constant
@@ -3517,7 +3521,7 @@ package body Exp_Ch3 is
                  Make_Selected_Component (Loc,
                     Prefix => New_Reference_To (Def_Id, Loc),
                     Selector_Name =>
-                      New_Reference_To (Tag_Component (Typ), Loc));
+                      New_Reference_To (First_Tag_Component (Typ), Loc));
 
                Set_Assignment_OK (New_Ref);
 
@@ -3527,7 +3531,10 @@ package body Exp_Ch3 is
                    Expression =>
                      Unchecked_Convert_To (RTE (RE_Tag),
                        New_Reference_To
-                         (Access_Disp_Table (Base_Type (Typ)), Loc))));
+                         (Node
+                           (First_Elmt
+                             (Access_Disp_Table (Base_Type (Typ)))),
+                          Loc))));
 
             --  For discrete types, set the Is_Known_Valid flag if the
             --  initializing value is known to be valid.
@@ -3553,8 +3560,8 @@ package body Exp_Ch3 is
                end if;
 
                --  For access types set the Is_Known_Non_Null flag if the
-               --  initializing value is known to be non-null. We can also
-               --  set Can_Never_Be_Null if this is a constant.
+               --  initializing value is known to be non-null. We can also set
+               --  Can_Never_Be_Null if this is a constant.
 
                if Known_Non_Null (Expr) then
                   Set_Is_Known_Non_Null (Def_Id);
@@ -3575,21 +3582,33 @@ package body Exp_Ch3 is
             end if;
          end if;
 
-         if Is_Possibly_Unaligned_Slice (Expr) then
+         --  Cases where the back end cannot handle the initialization
+         --  directly. In such cases, we expand an assignment that will
+         --  be appropriately handled by Expand_N_Assignment_Statement.
 
-            --  Make a separate assignment that will be expanded into a
-            --  loop, to bypass back-end problems with misaligned arrays.
+         --  The exclusion of the unconstrained case is wrong, but for
+         --  now it is too much trouble ???
 
+         if (Is_Possibly_Unaligned_Slice (Expr)
+               or else (Is_Possibly_Unaligned_Object (Expr)
+                          and then not Represented_As_Scalar (Etype (Expr))))
+
+            --  The exclusion of the unconstrained case is wrong, but for
+            --  now it is too much trouble ???
+
+           and then not (Is_Array_Type (Etype (Expr))
+                           and then not Is_Constrained (Etype (Expr)))
+         then
             declare
                Stat : constant Node_Id :=
                        Make_Assignment_Statement (Loc,
-                         Name => New_Reference_To (Def_Id, Loc),
+                         Name       => New_Reference_To (Def_Id, Loc),
                          Expression => Relocate_Node (Expr));
-
             begin
                Set_Expression (N, Empty);
                Set_No_Initialization (N);
                Set_Assignment_OK (Name (Stat));
+               Set_No_Ctrl_Actions (Stat);
                Insert_After (N, Stat);
                Analyze (Stat);
             end;
@@ -3612,10 +3631,10 @@ package body Exp_Ch3 is
    -- Expand_N_Subtype_Indication --
    ---------------------------------
 
-   --  Add a check on the range of the subtype. The static case is
-   --  partially duplicated by Process_Range_Expr_In_Decl in Sem_Ch3,
-   --  but we still need to check here for the static case in order to
-   --  avoid generating extraneous expanded code.
+   --  Add a check on the range of the subtype. The static case is partially
+   --  duplicated by Process_Range_Expr_In_Decl in Sem_Ch3, but we still need
+   --  to check here for the static case in order to avoid generating
+   --  extraneous expanded code.
 
    procedure Expand_N_Subtype_Indication (N : Node_Id) is
       Ran : constant Node_Id   := Range_Expression (Constraint (N));
@@ -3634,18 +3653,17 @@ package body Exp_Ch3 is
    -- Expand_N_Variant_Part --
    ---------------------------
 
-   --  If the last variant does not contain the Others choice, replace
-   --  it with an N_Others_Choice node since Gigi always wants an Others.
-   --  Note that we do not bother to call Analyze on the modified variant
-   --  part, since it's only effect would be to compute the contents of
-   --  the Others_Discrete_Choices node laboriously, and of course we
-   --  already know the list of choices that corresponds to the others
-   --  choice (it's the list we are replacing!)
+   --  If the last variant does not contain the Others choice, replace it with
+   --  an N_Others_Choice node since Gigi always wants an Others. Note that we
+   --  do not bother to call Analyze on the modified variant part, since it's
+   --  only effect would be to compute the contents of the
+   --  Others_Discrete_Choices node laboriously, and of course we already know
+   --  the list of choices that corresponds to the others choice (it's the
+   --  list we are replacing!)
 
    procedure Expand_N_Variant_Part (N : Node_Id) is
       Last_Var    : constant Node_Id := Last_Non_Pragma (Variants (N));
       Others_Node : Node_Id;
-
    begin
       if Nkind (First (Discrete_Choices (Last_Var))) /= N_Others_Choice then
          Others_Node := Make_Others_Choice (Sloc (Last_Var));
@@ -3737,9 +3755,9 @@ package body Exp_Ch3 is
          Set_Null_Present (Comp_List, False);
 
       else
-         --  The controller cannot be placed before the _Parent field
-         --  since gigi lays out field in order and _parent must be
-         --  first to preserve the polymorphism of tagged types.
+         --  The controller cannot be placed before the _Parent field since
+         --  gigi lays out field in order and _parent must be first to
+         --  preserve the polymorphism of tagged types.
 
          First_Comp := First (Component_Items (Comp_List));
 
@@ -3757,9 +3775,9 @@ package body Exp_Ch3 is
       Set_Ekind (Ent, E_Component);
       Init_Component_Location (Ent);
 
-      --  Move the _controller entity ahead in the list of internal
-      --  entities of the enclosing record so that it is selected
-      --  instead of a potentially inherited one.
+      --  Move the _controller entity ahead in the list of internal entities
+      --  of the enclosing record so that it is selected instead of a
+      --  potentially inherited one.
 
       declare
          E    : constant Entity_Id := Last_Entity (T);
@@ -3818,7 +3836,7 @@ package body Exp_Ch3 is
 
       Comp_Decl :=
         Make_Component_Declaration (Sloc_N,
-          Defining_Identifier => Tag_Component (T),
+          Defining_Identifier => First_Tag_Component (T),
           Component_Definition =>
             Make_Component_Definition (Sloc_N,
               Aliased_Present => False,
@@ -3835,8 +3853,8 @@ package body Exp_Ch3 is
       end if;
 
       --  We don't Analyze the whole expansion because the tag component has
-      --  already been analyzed previously. Here we just insure that the
-      --  tree is coherent with the semantic decoration
+      --  already been analyzed previously. Here we just insure that the tree
+      --  is coherent with the semantic decoration
 
       Find_Type (Subtype_Indication (Component_Definition (Comp_Decl)));
 
@@ -3856,10 +3874,10 @@ package body Exp_Ch3 is
    begin
       if not Is_Bit_Packed_Array (Typ) then
 
-         --  If the component contains tasks, so does the array type.
-         --  This may not be indicated in the array type because the
-         --  component may have been a private type at the point of
-         --  definition. Same if component type is controlled.
+         --  If the component contains tasks, so does the array type. This may
+         --  not be indicated in the array type because the component may have
+         --  been a private type at the point of definition. Same if component
+         --  type is controlled.
 
          Set_Has_Task (Base, Has_Task (Component_Type (Typ)));
          Set_Has_Controlled_Component (Base,
@@ -3868,9 +3886,9 @@ package body Exp_Ch3 is
 
          if No (Init_Proc (Base)) then
 
-            --  If this is an anonymous array created for a declaration
-            --  with an initial value, its init_proc will never be called.
-            --  The initial value itself may have been expanded into assign-
+            --  If this is an anonymous array created for a declaration with
+            --  an initial value, its init_proc will never be called. The
+            --  initial value itself may have been expanded into assign-
             --  ments, in which case the object declaration is carries the
             --  No_Initialization flag.
 
@@ -3911,9 +3929,9 @@ package body Exp_Ch3 is
             end if;
          end if;
 
-      --  For packed case, there is a default initialization, except
-      --  if the component type is itself a packed structure with an
-      --  initialization procedure.
+      --  For packed case, there is a default initialization, except if the
+      --  component type is itself a packed structure with an initialization
+      --  procedure.
 
       elsif Present (Init_Proc (Component_Type (Base)))
         and then No (Base_Init_Proc (Base))
@@ -3943,8 +3961,8 @@ package body Exp_Ch3 is
       pragma Warnings (Off, Func);
 
    begin
-      --  Various optimization are possible if the given representation
-      --  is contiguous.
+      --  Various optimization are possible if the given representation is
+      --  contiguous.
 
       Is_Contiguous := True;
       Ent := First_Literal (Typ);
@@ -3987,9 +4005,9 @@ package body Exp_Ch3 is
       --    typA : array (Natural range 0 .. num - 1) of ctype :=
       --             (v, v, v, v, v, ....)
 
-      --  where ctype is the corresponding integer type. If the
-      --  representation is contiguous, we only keep the first literal,
-      --  which provides the offset for Pos_To_Rep computations.
+      --  where ctype is the corresponding integer type. If the representation
+      --  is contiguous, we only keep the first literal, which provides the
+      --  offset for Pos_To_Rep computations.
 
       Arr :=
         Make_Defining_Identifier (Loc,
@@ -4044,22 +4062,22 @@ package body Exp_Ch3 is
       --  representation) raises Constraint_Error or returns a unique value
       --  of minus one. The latter case is used, e.g. in 'Valid code.
 
-      --  Note: the reason we use Enum_Rep values in the case here is to
-      --  avoid the code generator making inappropriate assumptions about
-      --  the range of the values in the case where the value is invalid.
-      --  ityp is a signed or unsigned integer type of appropriate width.
+      --  Note: the reason we use Enum_Rep values in the case here is to avoid
+      --  the code generator making inappropriate assumptions about the range
+      --  of the values in the case where the value is invalid. ityp is a
+      --  signed or unsigned integer type of appropriate width.
 
       --  Note: if exceptions are not supported, then we suppress the raise
       --  and return -1 unconditionally (this is an erroneous program in any
-      --  case and there is no obligation to raise Constraint_Error here!)
-      --  We also do this if pragma Restrictions (No_Exceptions) is active.
+      --  case and there is no obligation to raise Constraint_Error here!) We
+      --  also do this if pragma Restrictions (No_Exceptions) is active.
 
       --  Representations are signed
 
       if Enumeration_Rep (First_Literal (Typ)) < 0 then
 
          --  The underlying type is signed. Reset the Is_Unsigned_Type
-         --  explicitly, because it might have been inherited from a
+         --  explicitly, because it might have been inherited from
          --  parent type.
 
          Set_Is_Unsigned_Type (Typ, False);
@@ -4080,8 +4098,8 @@ package body Exp_Ch3 is
          end if;
       end if;
 
-      --  The body of the function is a case statement. First collect
-      --  case alternatives, or optimize the contiguous case.
+      --  The body of the function is a case statement. First collect case
+      --  alternatives, or optimize the contiguous case.
 
       Lst := New_List;
 
@@ -4303,10 +4321,10 @@ package body Exp_Ch3 is
       end loop;
 
       --  Creation of the Dispatch Table. Note that a Dispatch Table is
-      --  created for regular tagged types as well as for Ada types
-      --  deriving from a C++ Class, but not for tagged types directly
-      --  corresponding to the C++ classes. In the later case we assume
-      --  that the Vtable is created in the C++ side and we just use it.
+      --  created for regular tagged types as well as for Ada types deriving
+      --  from a C++ Class, but not for tagged types directly corresponding to
+      --  the C++ classes. In the later case we assume that the Vtable is
+      --  created in the C++ side and we just use it.
 
       if Is_Tagged_Type (Def_Id) then
          if Is_CPP_Class (Def_Id) then
@@ -4314,18 +4332,17 @@ package body Exp_Ch3 is
             Set_Default_Constructor (Def_Id);
 
          else
-            --  Usually inherited primitives are not delayed but the first
-            --  Ada extension of a CPP_Class is an exception since the
-            --  address of the inherited subprogram has to be inserted in
-            --  the new Ada Dispatch Table and this is a freezing action
-            --  (usually the inherited primitive address is inserted in the
-            --  DT by Inherit_DT)
-
-            --  Similarly, if this is an inherited operation whose parent
-            --  is not frozen yet, it is not in the DT of the parent, and
-            --  we generate an explicit freeze node for the inherited
-            --  operation, so that it is properly inserted in the DT of the
-            --  current type.
+            --  Usually inherited primitives are not delayed but the first Ada
+            --  extension of a CPP_Class is an exception since the address of
+            --  the inherited subprogram has to be inserted in the new Ada
+            --  Dispatch Table and this is a freezing action (usually the
+            --  inherited primitive address is inserted in the DT by
+            --  Inherit_DT)
+
+            --  Similarly, if this is an inherited operation whose parent is
+            --  not frozen yet, it is not in the DT of the parent, and we
+            --  generate an explicit freeze node for the inherited operation,
+            --  so that it is properly inserted in the DT of the current type.
 
             declare
                Elmt : Elmt_Id := First_Elmt (Primitive_Operations (Def_Id));
@@ -4355,11 +4372,10 @@ package body Exp_Ch3 is
                Expand_Tagged_Root (Def_Id);
             end if;
 
-            --  Unfreeze momentarily the type to add the predefined
-            --  primitives operations. The reason we unfreeze is so
-            --  that these predefined operations will indeed end up
-            --  as primitive operations (which must be before the
-            --  freeze point).
+            --  Unfreeze momentarily the type to add the predefined primitives
+            --  operations. The reason we unfreeze is so that these predefined
+            --  operations will indeed end up as primitive operations (which
+            --  must be before the freeze point).
 
             Set_Is_Frozen (Def_Id, False);
             Make_Predefined_Primitive_Specs
@@ -4369,22 +4385,22 @@ package body Exp_Ch3 is
             Set_All_DT_Position (Def_Id);
 
             --  Add the controlled component before the freezing actions
-            --  it is referenced in those actions.
+            --  referenced in those actions.
 
             if Has_New_Controlled_Component (Def_Id) then
                Expand_Record_Controller (Def_Id);
             end if;
 
-            --  Suppress creation of a dispatch table when Java_VM because
-            --  the dispatching mechanism is handled internally by the JVM.
+            --  Suppress creation of a dispatch table when Java_VM because the
+            --  dispatching mechanism is handled internally by the JVM.
 
             if not Java_VM then
                Append_Freeze_Actions (Def_Id, Make_DT (Def_Id));
             end if;
 
-            --  Make sure that the primitives Initialize, Adjust and
-            --  Finalize are Frozen before other TSS subprograms. We
-            --  don't want them Frozen inside.
+            --  Make sure that the primitives Initialize, Adjust and Finalize
+            --  are Frozen before other TSS subprograms. We don't want them
+            --  Frozen inside.
 
             if Is_Controlled (Def_Id) then
                if not Is_Limited_Type (Def_Id) then
@@ -4408,8 +4424,8 @@ package body Exp_Ch3 is
               (Def_Id, Predefined_Primitive_Freeze (Def_Id));
          end if;
 
-      --  In the non-tagged case, an equality function is provided only
-      --  for variant records (that are not unchecked unions).
+      --  In the non-tagged case, an equality function is provided only for
+      --  variant records (that are not unchecked unions).
 
       elsif Has_Discriminants (Def_Id)
         and then not Is_Limited_Type (Def_Id)
@@ -4428,10 +4444,10 @@ package body Exp_Ch3 is
       end if;
 
       --  Before building the record initialization procedure, if we are
-      --  dealing with a concurrent record value type, then we must go
-      --  through the discriminants, exchanging discriminals between the
-      --  concurrent type and the concurrent record value type. See the
-      --  section "Handling of Discriminants" in the Einfo spec for details.
+      --  dealing with a concurrent record value type, then we must go through
+      --  the discriminants, exchanging discriminals between the concurrent
+      --  type and the concurrent record value type. See the section "Handling
+      --  of Discriminants" in the Einfo spec for details.
 
       if Is_Concurrent_Record_Type (Def_Id)
         and then Has_Discriminants (Def_Id)
@@ -4472,10 +4488,9 @@ package body Exp_Ch3 is
       Adjust_Discriminants (Def_Id);
       Build_Record_Init_Proc (Type_Decl, Def_Id);
 
-      --  For tagged type, build bodies of primitive operations. Note
-      --  that we do this after building the record initialization
-      --  experiment, since the primitive operations may need the
-      --  initialization routine
+      --  For tagged type, build bodies of primitive operations. Note that we
+      --  do this after building the record initialization experiment, since
+      --  the primitive operations may need the initialization routine
 
       if Is_Tagged_Type (Def_Id) then
          Predef_List := Predefined_Primitive_Bodies (Def_Id, Renamed_Eq);
@@ -4525,15 +4540,16 @@ package body Exp_Ch3 is
    -- Freeze_Type --
    -----------------
 
-   --  Full type declarations are expanded at the point at which the type
-   --  is frozen. The formal N is the Freeze_Node for the type. Any statements
-   --  or declarations generated by the freezing (e.g. the procedure generated
+   --  Full type declarations are expanded at the point at which the type is
+   --  frozen. The formal N is the Freeze_Node for the type. Any statements or
+   --  declarations generated by the freezing (e.g. the procedure generated
    --  for initialization) are chained in the Acions field list of the freeze
    --  node using Append_Freeze_Actions.
 
-   procedure Freeze_Type (N : Node_Id) is
+   function Freeze_Type (N : Node_Id) return Boolean is
       Def_Id    : constant Entity_Id := Entity (N);
       RACW_Seen : Boolean := False;
+      Result    : Boolean := False;
 
    begin
       --  Process associated access types needing special processing
@@ -4566,13 +4582,13 @@ package body Exp_Ch3 is
          if Ekind (Def_Id) = E_Record_Type then
             Freeze_Record_Type (N);
 
-         --  The subtype may have been declared before the type was frozen.
-         --  If the type has controlled components it is necessary to create
-         --  the entity for the controller explicitly because it did not
-         --  exist at the point of the subtype declaration. Only the entity is
-         --  needed, the back-end will obtain the layout from the type.
-         --  This is only necessary if this is constrained subtype whose
-         --  component list is not shared with the base type.
+         --  The subtype may have been declared before the type was frozen. If
+         --  the type has controlled components it is necessary to create the
+         --  entity for the controller explicitly because it did not exist at
+         --  the point of the subtype declaration. Only the entity is needed,
+         --  the back-end will obtain the layout from the type. This is only
+         --  necessary if this is constrained subtype whose component list is
+         --  not shared with the base type.
 
          elsif Ekind (Def_Id) = E_Record_Subtype
            and then Has_Discriminants (Def_Id)
@@ -4596,8 +4612,20 @@ package body Exp_Ch3 is
                end if;
             end;
 
-         --  Similar process if the controller of the subtype is not
-         --  present but the parent has it. This can happen with constrained
+            if Is_Itype (Def_Id)
+              and then Is_Record_Type (Underlying_Type (Scope (Def_Id)))
+            then
+               --  The freeze node is only used to introduce the controller,
+               --  the back-end has no use for it for a discriminated
+               --   component.
+
+               Set_Freeze_Node (Def_Id, Empty);
+               Set_Has_Delayed_Freeze (Def_Id, False);
+               Result := True;
+            end if;
+
+         --  Similar process if the controller of the subtype is not present
+         --  but the parent has it. This can happen with constrained
          --  record components where the subtype is an itype.
 
          elsif Ekind (Def_Id) = E_Record_Subtype
@@ -4620,7 +4648,7 @@ package body Exp_Ch3 is
 
                Set_Freeze_Node (Def_Id, Empty);
                Set_Has_Delayed_Freeze (Def_Id, False);
-               Remove (N);
+               Result := True;
             end;
          end if;
 
@@ -4689,9 +4717,9 @@ package body Exp_Ch3 is
                   DT_Align : Node_Id;
 
                begin
-                  --  For unconstrained composite types we give a size of
-                  --  zero so that the pool knows that it needs a special
-                  --  algorithm for variable size object allocation.
+                  --  For unconstrained composite types we give a size of zero
+                  --  so that the pool knows that it needs a special algorithm
+                  --  for variable size object allocation.
 
                   if Is_Composite_Type (Desig_Type)
                     and then not Is_Constrained (Desig_Type)
@@ -4718,11 +4746,10 @@ package body Exp_Ch3 is
                     Make_Defining_Identifier (Loc,
                       Chars => New_External_Name (Chars (Def_Id), 'P'));
 
-                  --  We put the code associated with the pools in the
-                  --  entity that has the later freeze node, usually the
-                  --  acces type but it can also be the designated_type;
-                  --  because the pool code requires both those types to be
-                  --  frozen
+                  --  We put the code associated with the pools in the entity
+                  --  that has the later freeze node, usually the acces type
+                  --  but it can also be the designated_type; because the pool
+                  --  code requires both those types to be frozen
 
                   if Is_Frozen (Desig_Type)
                     and then (not Present (Freeze_Node (Desig_Type))
@@ -4784,16 +4811,16 @@ package body Exp_Ch3 is
                null;
             end if;
 
-            --  For access-to-controlled types (including class-wide types
-            --  and Taft-amendment types which potentially have controlled
-            --  components), expand the list controller object that will
-            --  store the dynamically allocated objects. Do not do this
+            --  For access-to-controlled types (including class-wide types and
+            --  Taft-amendment types which potentially have controlled
+            --  components), expand the list controller object that will store
+            --  the dynamically allocated objects. Do not do this
             --  transformation for expander-generated access types, but do it
             --  for types that are the full view of types derived from other
             --  private types. Also suppress the list controller in the case
             --  of a designated type with convention Java, since this is used
-            --  when binding to Java API specs, where there's no equivalent
-            --  of a finalization list and we don't want to pull in the
+            --  when binding to Java API specs, where there's no equivalent of
+            --  a finalization list and we don't want to pull in the
             --  finalization support if not needed.
 
             if not Comes_From_Source (Def_Id)
@@ -4864,20 +4891,21 @@ package body Exp_Ch3 is
         and then Freeze_Node (Full_View (Def_Id)) = N
       then
          Set_Entity (N, Full_View (Def_Id));
-         Freeze_Type (N);
+         Result := Freeze_Type (N);
          Set_Entity (N, Def_Id);
 
-      --  All other types require no expander action. There are such
-      --  cases (e.g. task types and protected types). In such cases,
-      --  the freeze nodes are there for use by Gigi.
+      --  All other types require no expander action. There are such cases
+      --  (e.g. task types and protected types). In such cases, the freeze
+      --  nodes are there for use by Gigi.
 
       end if;
 
       Freeze_Stream_Operations (N, Def_Id);
+      return Result;
 
    exception
       when RE_Not_Available =>
-         return;
+         return False;
    end Freeze_Type;
 
    -------------------------
@@ -4902,10 +4930,10 @@ package body Exp_Ch3 is
       --  These are the values computed by the procedure Check_Subtype_Bounds
 
       procedure Check_Subtype_Bounds;
-      --  This procedure examines the subtype T, and its ancestor subtypes
-      --  and derived types to determine the best known information about
-      --  the bounds of the subtype. After the call Lo_Bound is set either
-      --  to No_Uint if no information can be determined, or to a value which
+      --  This procedure examines the subtype T, and its ancestor subtypes and
+      --  derived types to determine the best known information about the
+      --  bounds of the subtype. After the call Lo_Bound is set either to
+      --  No_Uint if no information can be determined, or to a value which
       --  represents a known low bound, i.e. a valid value of the subtype can
       --  not be less than this value. Hi_Bound is similarly set to a known
       --  high bound (valid value cannot be greater than this).
@@ -4969,16 +4997,16 @@ package body Exp_Ch3 is
    begin
       --  For a private type, we should always have an underlying type
       --  (because this was already checked in Needs_Simple_Initialization).
-      --  What we do is to get the value for the underlying type and then
-      --  do an Unchecked_Convert to the private type.
+      --  What we do is to get the value for the underlying type and then do
+      --  an Unchecked_Convert to the private type.
 
       if Is_Private_Type (T) then
          Val := Get_Simple_Init_Val (Underlying_Type (T), Loc, Size);
 
-         --  A special case, if the underlying value is null, then qualify
-         --  it with the underlying type, so that the null is properly typed
-         --  Similarly, if it is an aggregate it must be qualified, because
-         --  an unchecked conversion does not provide a context for it.
+         --  A special case, if the underlying value is null, then qualify it
+         --  with the underlying type, so that the null is properly typed
+         --  Similarly, if it is an aggregate it must be qualified, because an
+         --  unchecked conversion does not provide a context for it.
 
          if Nkind (Val) = N_Null
            or else Nkind (Val) = N_Aggregate
@@ -5007,9 +5035,9 @@ package body Exp_Ch3 is
       elsif Is_Scalar_Type (T) then
          pragma Assert (Init_Or_Norm_Scalars);
 
-         --  Compute size of object. If it is given by the caller, we can
-         --  use it directly, otherwise we use Esize (T) as an estimate. As
-         --  far as we know this covers all cases correctly.
+         --  Compute size of object. If it is given by the caller, we can use
+         --  it directly, otherwise we use Esize (T) as an estimate. As far as
+         --  we know this covers all cases correctly.
 
          if Size = No_Uint or else Size <= Uint_0 then
             Size_To_Use := UI_Max (Uint_1, Esize (T));
@@ -5074,9 +5102,9 @@ package body Exp_Ch3 is
 
                begin
                   --  Normally we like to use the most negative number. The
-                  --  one exception is when this number is in the known subtype
-                  --  range and the largest positive number is not in the known
-                  --  subtype range.
+                  --  one exception is when this number is in the known
+                  --  subtype range and the largest positive number is not in
+                  --  the known subtype range.
 
                   --  For this exceptional case, use largest positive value
 
@@ -5491,29 +5519,29 @@ package body Exp_Ch3 is
    begin
       Renamed_Eq := Empty;
 
-      --  Spec of _Alignment
+      --  Spec of _Size
 
       Append_To (Res, Predef_Spec_Or_Body (Loc,
         Tag_Typ => Tag_Typ,
-        Name    => Name_uAlignment,
+        Name    => Name_uSize,
         Profile => New_List (
           Make_Parameter_Specification (Loc,
             Defining_Identifier => Make_Defining_Identifier (Loc, Name_X),
             Parameter_Type      => New_Reference_To (Tag_Typ, Loc))),
 
-        Ret_Type => Standard_Integer));
+        Ret_Type => Standard_Long_Long_Integer));
 
-      --  Spec of _Size
+      --  Spec of _Alignment
 
       Append_To (Res, Predef_Spec_Or_Body (Loc,
         Tag_Typ => Tag_Typ,
-        Name    => Name_uSize,
+        Name    => Name_uAlignment,
         Profile => New_List (
           Make_Parameter_Specification (Loc,
             Defining_Identifier => Make_Defining_Identifier (Loc, Name_X),
             Parameter_Type      => New_Reference_To (Tag_Typ, Loc))),
 
-        Ret_Type => Standard_Long_Long_Integer));
+        Ret_Type => Standard_Integer));
 
       --  Specs for dispatching stream attributes. We skip these for limited
       --  types, since there is no question of dispatching in the limited case.
index 59f8ef7..fcb7c93 100644 (file)
@@ -82,9 +82,13 @@ package Exp_Ch3 is
    --  initialization call corresponds to a default initialized component
    --  of an aggregate.
 
-   procedure Freeze_Type (N : Node_Id);
-   --  This procedure executes the freezing actions associated with the given
-   --  freeze type node N.
+   function Freeze_Type (N : Node_Id) return Boolean;
+   --  This function executes the freezing actions associated with the given
+   --  freeze type node N and returns True if the node is to be deleted.
+   --  We delete the node if it is present just for front end purpose and
+   --  we don't want Gigi to see the node.  This function can't delete the
+   --  node itself since it would confuse any remaining processing of the
+   --  freeze node.
 
    function Needs_Simple_Initialization (T : Entity_Id) return Boolean;
    --  Certain types need initialization even though there is no specific
index fd03a08..525bf67 100644 (file)
@@ -458,11 +458,13 @@ package body Exp_Ch4 is
                   Make_Selected_Component (Loc,
                     Prefix => New_Reference_To (Temp, Loc),
                     Selector_Name =>
-                      New_Reference_To (Tag_Component (T), Loc)),
+                      New_Reference_To (First_Tag_Component (T), Loc)),
 
                 Expression =>
                   Unchecked_Convert_To (RTE (RE_Tag),
-                    New_Reference_To (Access_Disp_Table (T), Loc)));
+                    New_Reference_To
+                      (Elists.Node (First_Elmt (Access_Disp_Table (T))),
+                       Loc)));
 
             --  The previous assignment has to be done in any case
 
@@ -487,12 +489,13 @@ package body Exp_Ch4 is
                      Make_Selected_Component (Loc,
                        Prefix => Ref,
                        Selector_Name =>
-                         New_Reference_To (Tag_Component (Utyp), Loc)),
+                         New_Reference_To (First_Tag_Component (Utyp), Loc)),
 
                    Expression =>
                      Unchecked_Convert_To (RTE (RE_Tag),
                        New_Reference_To (
-                         Access_Disp_Table (Utyp), Loc)));
+                         Elists.Node (First_Elmt (Access_Disp_Table (Utyp))),
+                         Loc)));
 
                Set_Assignment_OK (Name (Tag_Assign));
                Insert_Action (N, Tag_Assign);
@@ -1063,10 +1066,16 @@ package body Exp_Ch4 is
          Test := Expand_Composite_Equality
                    (Nod, Component_Type (Typ), L, R, Decls);
 
-         --  If some (sub)component is an unchecked_union, the whole
-         --  operation will raise program error.
+         --  If some (sub)component is an unchecked_union, the whole operation
+         --  will raise program error.
 
          if Nkind (Test) = N_Raise_Program_Error then
+
+            --  This node is going to be inserted at a location where a
+            --  statement is expected: clear its Etype so analysis will
+            --  set it to the expected Standard_Void_Type.
+
+            Set_Etype (Test, Empty);
             return Test;
 
          else
@@ -1160,6 +1169,7 @@ package body Exp_Ch4 is
            Handle_One_Dimension (N + 1, Next_Index (Index)));
 
          if Need_Separate_Indexes then
+
             --  Generate guard for loop, followed by increments of indices
 
             Append_To (Stm_List,
@@ -1188,8 +1198,8 @@ package body Exp_Ch4 is
                     Expressions    => New_List (New_Reference_To (Bn, Loc)))));
          end if;
 
-         --  If separate indexes, we need a declare block for An and Bn,
-         --  and a loop without an iteration scheme.
+         --  If separate indexes, we need a declare block for An and Bn, and a
+         --  loop without an iteration scheme.
 
          if Need_Separate_Indexes then
             Loop_Stm :=
@@ -1419,61 +1429,69 @@ package body Exp_Ch4 is
       Typ : constant Entity_Id  := Etype (N);
 
    begin
-      if Is_Bit_Packed_Array (Typ) then
+      --  Special case of bit packed array where both operands are known
+      --  to be properly aligned. In this case we use an efficient run time
+      --  routine to carry out the operation (see System.Bit_Ops).
+
+      if Is_Bit_Packed_Array (Typ)
+        and then not Is_Possibly_Unaligned_Object (Left_Opnd (N))
+        and then not Is_Possibly_Unaligned_Object (Right_Opnd (N))
+      then
          Expand_Packed_Boolean_Operator (N);
+         return;
+      end if;
 
-      else
-         --  For the normal non-packed case, the general expansion is
-         --  to build a function for carrying out the comparison (using
-         --  Make_Boolean_Array_Op) and then inserting it into the tree.
-         --  The original operator node is then rewritten as a call to
-         --  this function.
+      --  For the normal non-packed case, the general expansion is to build
+      --  function for carrying out the comparison (use Make_Boolean_Array_Op)
+      --  and then inserting it into the tree. The original operator node is
+      --  then rewritten as a call to this function. We also use this in the
+      --  packed case if either operand is a possibly unaligned object.
 
-         declare
-            Loc       : constant Source_Ptr := Sloc (N);
-            L         : constant Node_Id    := Relocate_Node (Left_Opnd  (N));
-            R         : constant Node_Id    := Relocate_Node (Right_Opnd (N));
-            Func_Body : Node_Id;
-            Func_Name : Entity_Id;
+      declare
+         Loc       : constant Source_Ptr := Sloc (N);
+         L         : constant Node_Id    := Relocate_Node (Left_Opnd  (N));
+         R         : constant Node_Id    := Relocate_Node (Right_Opnd (N));
+         Func_Body : Node_Id;
+         Func_Name : Entity_Id;
 
-         begin
-            Convert_To_Actual_Subtype (L);
-            Convert_To_Actual_Subtype (R);
-            Ensure_Defined (Etype (L), N);
-            Ensure_Defined (Etype (R), N);
-            Apply_Length_Check (R, Etype (L));
-
-            if Nkind (Parent (N)) = N_Assignment_Statement
-               and then Safe_In_Place_Array_Op (Name (Parent (N)), L, R)
-            then
-               Build_Boolean_Array_Proc_Call (Parent (N), L, R);
+      begin
+         Convert_To_Actual_Subtype (L);
+         Convert_To_Actual_Subtype (R);
+         Ensure_Defined (Etype (L), N);
+         Ensure_Defined (Etype (R), N);
+         Apply_Length_Check (R, Etype (L));
+
+         if Nkind (Parent (N)) = N_Assignment_Statement
+           and then Safe_In_Place_Array_Op (Name (Parent (N)), L, R)
+         then
+            Build_Boolean_Array_Proc_Call (Parent (N), L, R);
 
-            elsif Nkind (Parent (N)) = N_Op_Not
-               and then Nkind (N) = N_Op_And
-               and then
-                 Safe_In_Place_Array_Op (Name (Parent (Parent (N))), L, R)
-            then
-               return;
-            else
+         elsif Nkind (Parent (N)) = N_Op_Not
+           and then Nkind (N) = N_Op_And
+           and then
+         Safe_In_Place_Array_Op (Name (Parent (Parent (N))), L, R)
+         then
+            return;
+         else
 
-               Func_Body := Make_Boolean_Array_Op (Etype (L), N);
-               Func_Name := Defining_Unit_Name (Specification (Func_Body));
-               Insert_Action (N, Func_Body);
+            Func_Body := Make_Boolean_Array_Op (Etype (L), N);
+            Func_Name := Defining_Unit_Name (Specification (Func_Body));
+            Insert_Action (N, Func_Body);
 
-               --  Now rewrite the expression with a call
+            --  Now rewrite the expression with a call
 
-               Rewrite (N,
-                 Make_Function_Call (Loc,
-                   Name => New_Reference_To (Func_Name, Loc),
-                   Parameter_Associations =>
-                     New_List
-                       (L, Make_Type_Conversion
-                          (Loc, New_Reference_To (Etype (L), Loc), R))));
+            Rewrite (N,
+              Make_Function_Call (Loc,
+                Name                   => New_Reference_To (Func_Name, Loc),
+                Parameter_Associations =>
+                  New_List (
+                    L,
+                    Make_Type_Conversion
+                      (Loc, New_Reference_To (Etype (L), Loc), R))));
 
-               Analyze_And_Resolve (N, Typ);
-            end if;
-         end;
-      end if;
+            Analyze_And_Resolve (N, Typ);
+         end if;
+      end;
    end Expand_Boolean_Operator;
 
    -------------------------------
@@ -4254,20 +4272,25 @@ package body Exp_Ch4 is
                Force_Validity_Checks := Save_Force_Validity_Checks;
             end;
 
-         --  Packed case
+         --  Packed case where both operands are known aligned
 
-         elsif Is_Bit_Packed_Array (Typl) then
+         elsif Is_Bit_Packed_Array (Typl)
+           and then not Is_Possibly_Unaligned_Object (Lhs)
+           and then not Is_Possibly_Unaligned_Object (Rhs)
+         then
             Expand_Packed_Eq (N);
 
          --  Where the component type is elementary we can use a block bit
          --  comparison (if supported on the target) exception in the case
          --  of floating-point (negative zero issues require element by
          --  element comparison), and atomic types (where we must be sure
-         --  to load elements independently).
+         --  to load elements independently) and possibly unaligned arrays.
 
          elsif Is_Elementary_Type (Component_Type (Typl))
            and then not Is_Floating_Point_Type (Component_Type (Typl))
            and then not Is_Atomic (Component_Type (Typl))
+           and then not Is_Possibly_Unaligned_Object (Lhs)
+           and then not Is_Possibly_Unaligned_Object (Rhs)
            and then Support_Composite_Compare_On_Target
          then
             null;
@@ -5278,9 +5301,13 @@ package body Exp_Ch4 is
          return;
       end if;
 
-      --  Case of array operand. If bit packed, handle it in Exp_Pakd
+      --  Case of array operand. If bit packed with a component size of 1,
+      --  handle it in Exp_Pakd if the operand is known to be aligned.
 
-      if Is_Bit_Packed_Array (Typ) and then Component_Size (Typ) = 1 then
+      if Is_Bit_Packed_Array (Typ)
+        and then Component_Size (Typ) = 1
+        and then not Is_Possibly_Unaligned_Object (Right_Opnd (N))
+      then
          Expand_Packed_Not (N);
          return;
       end if;
@@ -7984,7 +8011,8 @@ package body Exp_Ch4 is
       Obj_Tag :=
         Make_Selected_Component (Loc,
           Prefix        => Relocate_Node (Left),
-          Selector_Name => New_Reference_To (Tag_Component (Left_Type), Loc));
+          Selector_Name =>
+            New_Reference_To (First_Tag_Component (Left_Type), Loc));
 
       if Is_Class_Wide_Type (Right_Type) then
          return
@@ -7992,14 +8020,17 @@ package body Exp_Ch4 is
              Action => CW_Membership,
              Args   => New_List (
                Obj_Tag,
-               New_Reference_To (
-                 Access_Disp_Table (Root_Type (Right_Type)), Loc)));
+               New_Reference_To
+                 (Node (First_Elmt
+                          (Access_Disp_Table (Root_Type (Right_Type)))),
+                  Loc)));
       else
          return
            Make_Op_Eq (Loc,
            Left_Opnd  => Obj_Tag,
            Right_Opnd =>
-             New_Reference_To (Access_Disp_Table (Right_Type), Loc));
+             New_Reference_To
+               (Node (First_Elmt (Access_Disp_Table (Right_Type))), Loc));
       end if;
 
    end Tagged_Membership;
index 819b576..d78da78 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2004, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2005, 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- --
@@ -27,6 +27,7 @@
 with Atree;    use Atree;
 with Checks;   use Checks;
 with Einfo;    use Einfo;
+with Elists;   use Elists;
 with Exp_Aggr; use Exp_Aggr;
 with Exp_Ch7;  use Exp_Ch7;
 with Exp_Ch11; use Exp_Ch11;
@@ -454,13 +455,13 @@ package body Exp_Ch5 is
             end if;
          end Check_Unconstrained_Bit_Packed_Array;
 
-      --  Gigi can always handle the assignment if the right side is a string
-      --  literal (note that overlap is definitely impossible in this case).
-      --  If the type is packed, a string literal is always converted into a
-      --  aggregate, except in the case of a null slice, for which no aggregate
-      --  can be written. In that case, rewrite the assignment as a null
-      --  statement, a length check has already been emitted to verify that
-      --  the range of the left-hand side is empty.
+      --  The back end can always handle the assignment if the right side is a
+      --  string literal (note that overlap is definitely impossible in this
+      --  case). If the type is packed, a string literal is always converted
+      --  into aggregate, except in the case of a null slice, for which no
+      --  aggregate can be written. In that case, rewrite the assignment as a
+      --  null statement, a length check has already been emitted to verify
+      --  that the range of the left-hand side is empty.
 
       --  Note that this code is not executed if we had an assignment of
       --  a string literal to a non-bit aligned component of a record, a
@@ -479,7 +480,7 @@ package body Exp_Ch5 is
       --  If either operand is bit packed, then we need a loop, since we
       --  can't be sure that the slice is byte aligned. Similarly, if either
       --  operand is a possibly unaligned slice, then we need a loop (since
-      --  gigi cannot handle unaligned slices).
+      --  the back end cannot handle unaligned slices).
 
       elsif Is_Bit_Packed_Array (L_Type)
         or else Is_Bit_Packed_Array (R_Type)
@@ -490,7 +491,7 @@ package body Exp_Ch5 is
 
       --  If we are not bit-packed, and we have only one slice, then no
       --  overlap is possible except in the parameter case, so we can let
-      --  gigi handle things.
+      --  the back end handle things.
 
       elsif not (L_Slice and R_Slice) then
          if Forwards_OK (N) then
@@ -641,7 +642,6 @@ package body Exp_Ch5 is
          if not Loop_Required then
             if Forwards_OK (N) then
                return;
-
             else
                null;
                --  Here is where a memmove would be appropriate ???
@@ -843,7 +843,7 @@ package body Exp_Ch5 is
             then
 
                --  Call TSS procedure for array assignment, passing the
-               --  the explicit bounds of right- and left-hand side.
+               --  the explicit bounds of right and left hand sides.
 
                declare
                   Proc    : constant Node_Id :=
@@ -999,13 +999,20 @@ package body Exp_Ch5 is
            Make_Assignment_Statement (Loc,
              Name =>
                Make_Indexed_Component (Loc,
-                 Prefix => Duplicate_Subexpr (Larray, Name_Req => True),
+                 Prefix      => Duplicate_Subexpr (Larray, Name_Req => True),
                  Expressions => ExprL),
              Expression =>
                Make_Indexed_Component (Loc,
-                 Prefix => Duplicate_Subexpr (Rarray, Name_Req => True),
+                 Prefix      => Duplicate_Subexpr (Rarray, Name_Req => True),
                  Expressions => ExprR));
 
+         --  We set assignment OK, since there are some cases, e.g. in object
+         --  declarations, where we are actually assigning into a constant.
+         --  If there really is an illegality, it was caught long before now,
+         --  and was flagged when the original assignment was analyzed.
+
+         Set_Assignment_OK (Name (Assign));
+
          --  Propagate the No_Ctrl_Actions flag to individual assignments
 
          Set_No_Ctrl_Actions (Assign, No_Ctrl_Actions (N));
@@ -1356,9 +1363,8 @@ package body Exp_Ch5 is
    -- Expand_N_Assignment_Statement --
    -----------------------------------
 
-   --  For array types, deal with slice assignments and setting the flags
-   --  to indicate if it can be statically determined which direction the
-   --  move should go in. Also deal with generating range/length checks.
+   --  This procedure implements various cases where an assignment statement
+   --  cannot just be passed on to the back end in untransformed state.
 
    procedure Expand_N_Assignment_Statement (N : Node_Id) is
       Loc  : constant Source_Ptr := Sloc (N);
@@ -1469,7 +1475,8 @@ package body Exp_Ch5 is
 
             declare
                Uses_Transient_Scope : constant Boolean :=
-                  Scope_Is_Transient and then N = Node_To_Be_Wrapped;
+                                        Scope_Is_Transient
+                                          and then N = Node_To_Be_Wrapped;
 
             begin
                if Uses_Transient_Scope then
@@ -1647,8 +1654,6 @@ package body Exp_Ch5 is
          Expand_Bit_Packed_Element_Set (N);
          return;
 
-      --  Case of tagged type assignment
-
       elsif Is_Tagged_Type (Typ)
         or else (Controlled_Type (Typ) and then not Is_Array_Type (Typ))
       then
@@ -1673,19 +1678,23 @@ package body Exp_Ch5 is
 
             if Is_Class_Wide_Type (Typ)
 
-            --  If the type is tagged, we may as well use the predefined
-            --  primitive assignment. This avoids inlining a lot of code
-            --  and in the class-wide case, the assignment is replaced by
-            --  a dispatch call to _assign. Note that this cannot be done
-            --  when discriminant checks are locally suppressed (as in
-            --  extension aggregate expansions) because otherwise the
-            --  discriminant check will be performed within the _assign
-            --  call.
-
-            or else (Is_Tagged_Type (Typ)
-              and then Chars (Current_Scope) /= Name_uAssign
-              and then Expand_Ctrl_Actions
-              and then not Discriminant_Checks_Suppressed (Empty))
+               --  If the type is tagged, we may as well use the predefined
+               --  primitive assignment. This avoids inlining a lot of code
+               --  and in the class-wide case, the assignment is replaced by
+               --  dispatch call to _assign. Note that this cannot be done
+               --  when discriminant checks are locally suppressed (as in
+               --  extension aggregate expansions) because otherwise the
+               --  discriminant check will be performed within the _assign
+               --  call. It is also suppressed for assignmments created by the
+               --  expander that correspond to initializations, where we do
+               --  want to copy the tag (No_Ctrl_Actions flag set True).
+               --  by the expander and we do not need to mess with tags ever
+               --  (Expand_Ctrl_Actions flag is set True in this case).
+
+               or else (Is_Tagged_Type (Typ)
+                          and then Chars (Current_Scope) /= Name_uAssign
+                          and then Expand_Ctrl_Actions
+                          and then not Discriminant_Checks_Suppressed (Empty))
             then
                --  Fetch the primitive op _assign and proper type to call
                --  it. Because of possible conflits between private and
@@ -1787,8 +1796,8 @@ package body Exp_Ch5 is
             then
                declare
                   Blk : constant Entity_Id :=
-                    New_Internal_Entity (
-                      E_Block, Current_Scope, Sloc (N), 'B');
+                          New_Internal_Entity
+                            (E_Block, Current_Scope, Sloc (N), 'B');
 
                begin
                   Set_Scope (Blk, Current_Scope);
@@ -2784,11 +2793,13 @@ package body Exp_Ch5 is
                       Make_Selected_Component (Loc,
                         Prefix => Duplicate_Subexpr (Exp),
                         Selector_Name =>
-                          New_Reference_To (Tag_Component (Utyp), Loc)),
+                          New_Reference_To (First_Tag_Component (Utyp), Loc)),
                     Right_Opnd =>
                       Unchecked_Convert_To (RTE (RE_Tag),
                         New_Reference_To
-                          (Access_Disp_Table (Base_Type (Utyp)), Loc))),
+                          (Node (First_Elmt
+                                  (Access_Disp_Table (Base_Type (Utyp)))),
+                           Loc))),
                 Reason => CE_Tag_Check_Failed));
 
          --  If the result type is a specific nonlimited tagged type,
@@ -3155,7 +3166,8 @@ package body Exp_Ch5 is
              Expression =>
                Make_Selected_Component (Loc,
                  Prefix        => Duplicate_Subexpr_No_Checks (L),
-                 Selector_Name => New_Reference_To (Tag_Component (T), Loc))));
+                 Selector_Name => New_Reference_To (First_Tag_Component (T),
+                                                    Loc))));
 
       --  Otherwise Tag_Tmp not used
 
@@ -3194,7 +3206,8 @@ package body Exp_Ch5 is
             --  Index of first byte to be copied after outermost record
             --  controller data.
 
-            Expr, Source_Size      : Node_Id;
+            Expr, Source_Size     : Node_Id;
+            Source_Actual_Subtype : Entity_Id;
             --  Used for computation of the size of the data to be copied
 
             Range_Type  : Entity_Id;
@@ -3269,26 +3282,27 @@ package body Exp_Ch5 is
                Expr := Expression (Expr);
             end if;
 
+            Source_Actual_Subtype := Etype (Expr);
+
+            if Has_Discriminants (Source_Actual_Subtype)
+              and then not Is_Constrained (Source_Actual_Subtype)
+            then
+               Append_To (Res,
+                 Build_Actual_Subtype (Source_Actual_Subtype, Expr));
+               Source_Actual_Subtype := Defining_Identifier (Last (Res));
+            end if;
+
             Source_Size :=
               Make_Op_Add (Loc,
                 Left_Opnd =>
                   Make_Attribute_Reference (Loc,
                     Prefix =>
-                      Expr,
+                      New_Occurrence_Of (Source_Actual_Subtype, Loc),
                     Attribute_Name =>
                       Name_Size),
                 Right_Opnd =>
                   Make_Integer_Literal (Loc,
                   System_Storage_Unit - 1));
-
-            --  If Expr is a type conversion, standard Ada does not allow
-            --  'Size to be taken on it, but Gigi can handle this case,
-            --  and thus we can determine the amount of data to be copied.
-            --  The appropriate circuitry is enabled only for conversions
-            --  that do not Come_From_Source.
-
-            Set_Comes_From_Source (Prefix (Left_Opnd (Source_Size)), False);
-
             Source_Size :=
               Make_Op_Divide (Loc,
                 Left_Opnd => Source_Size,
@@ -3484,7 +3498,8 @@ package body Exp_Ch5 is
              Name =>
                Make_Selected_Component (Loc,
                  Prefix        => Duplicate_Subexpr_No_Checks (L),
-                 Selector_Name => New_Reference_To (Tag_Component (T), Loc)),
+                 Selector_Name => New_Reference_To (First_Tag_Component (T),
+                                                    Loc)),
              Expression => New_Reference_To (Tag_Tmp, Loc)));
       end if;
 
index dbd692d..05c886a 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2004, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2005, 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- --
@@ -162,7 +162,7 @@ package body Exp_Ch9 is
       Pid       : Node_Id;
       N_Op_Spec : Node_Id) return Node_Id;
    --  This function is used to construct the protected version of a protected
-   --  subprogram. Its statement sequence first defers abortion, then locks
+   --  subprogram. Its statement sequence first defers abort, then locks
    --  the associated protected object, and then enters a block that contains
    --  a call to the unprotected version of the subprogram (for details, see
    --  Build_Unprotected_Subprogram_Body). This block statement requires
@@ -2531,10 +2531,9 @@ package body Exp_Ch9 is
    -----------------------------------
 
    function Build_Task_Proc_Specification (T : Entity_Id) return Node_Id is
-      Loc  : constant Source_Ptr := Sloc (T);
-      Nam  : constant Name_Id    := Chars (T);
-      Tdec : constant Node_Id    := Declaration_Node (T);
-      Ent  : Entity_Id;
+      Loc : constant Source_Ptr := Sloc (T);
+      Nam : constant Name_Id    := Chars (T);
+      Ent : Entity_Id;
 
    begin
       Ent :=
@@ -2545,8 +2544,8 @@ package body Exp_Ch9 is
       --  Associate the procedure with the task, if this is the declaration
       --  (and not the body) of the procedure.
 
-      if No (Task_Body_Procedure (Tdec)) then
-         Set_Task_Body_Procedure (Tdec, Ent);
+      if No (Task_Body_Procedure (T)) then
+         Set_Task_Body_Procedure (T, Ent);
       end if;
 
       return
@@ -4255,7 +4254,7 @@ package body Exp_Ch9 is
                New_Reference_To (Cancel_Param, Loc)),
              Then_Statements => Tstats));
 
-         --  Protected the call against abortion
+         --  Protected the call against abort
 
          Prepend_To (Stmts,
            Make_Procedure_Call_Statement (Loc,
index 9cc9fb0..03001dc 100644 (file)
@@ -288,7 +288,7 @@ package body Exp_Disp is
             --     typ!(Displaced_This (Address!(Param)))
 
             if Param = Ctrl_Arg
-              and then DTC_Entity (Subp) /= Tag_Component (Typ)
+              and then DTC_Entity (Subp) /= First_Tag_Component (Typ)
             then
                Append_To (New_Params,
 
@@ -390,14 +390,16 @@ package body Exp_Disp is
                          Make_Selected_Component (Loc,
                            Prefix => New_Value (Ctrl_Arg),
                            Selector_Name =>
-                             New_Reference_To (Tag_Component (Typ), Loc)),
+                             New_Reference_To
+                               (First_Tag_Component (Typ), Loc)),
 
                        Right_Opnd =>
                          Make_Selected_Component (Loc,
                            Prefix =>
                              Unchecked_Convert_To (Typ, New_Value (Param)),
                            Selector_Name =>
-                             New_Reference_To (Tag_Component (Typ), Loc))),
+                             New_Reference_To
+                               (First_Tag_Component (Typ), Loc))),
 
                    Then_Statements =>
                      New_List (New_Constraint_Error (Loc))));
@@ -545,7 +547,8 @@ package body Exp_Disp is
                          Make_Selected_Component (Loc,
                            Prefix => New_Value (Param),
                            Selector_Name =>
-                             New_Reference_To (Tag_Component (Typ), Loc)),
+                             New_Reference_To
+                               (First_Tag_Component (Typ), Loc)),
 
                        Right_Opnd =>
                          Make_Selected_Component (Loc,
@@ -553,7 +556,8 @@ package body Exp_Disp is
                              Unchecked_Convert_To (Typ,
                                New_Value (Next_Actual (Param))),
                            Selector_Name =>
-                             New_Reference_To (Tag_Component (Typ), Loc))),
+                             New_Reference_To
+                               (First_Tag_Component (Typ), Loc))),
 
                 Right_Opnd => New_Call);
          end if;
@@ -579,7 +583,8 @@ package body Exp_Disp is
       return Node_Id
    is
       Typ    : constant Entity_Id := Scope (DTC_Entity (Prim));
-      DT_Ptr : constant Entity_Id := Access_Disp_Table (Typ);
+      DT_Ptr : constant Entity_Id := Node (First_Elmt
+                                           (Access_Disp_Table (Typ)));
 
    begin
       return
@@ -619,8 +624,9 @@ package body Exp_Disp is
    function Make_DT (Typ : Entity_Id) return List_Id is
       Loc : constant Source_Ptr := Sloc (Typ);
 
-      Result    : constant List_Id := New_List;
-      Elab_Code : constant List_Id := New_List;
+      ADT_List  : constant Elist_Id := New_Elmt_List;
+      Result    : constant List_Id  := New_List;
+      Elab_Code : constant List_Id  := New_List;
 
       Tname       : constant Name_Id := Chars (Typ);
       Name_DT     : constant Name_Id := New_External_Name (Tname, 'T');
@@ -684,7 +690,7 @@ package body Exp_Disp is
                 Make_DT_Access_Action (Typ, DT_Entry_Size, No_List),
               Right_Opnd =>
                 Make_Integer_Literal (Loc,
-                  DT_Entry_Count (Tag_Component (Typ)))));
+                  DT_Entry_Count (First_Tag_Component (Typ)))));
 
       Append_To (Result,
         Make_Object_Declaration (Loc,
@@ -748,7 +754,8 @@ package body Exp_Disp is
 
       --  Set Access_Disp_Table field to be the dispatch table pointer
 
-      Set_Access_Disp_Table (Typ, DT_Ptr);
+      Append_Elmt (DT_Ptr, ADT_List);
+      Set_Access_Disp_Table (Typ, ADT_List);
 
       --  Count ancestors to compute the inheritance depth. For private
       --  extensions, always go to the full view in order to compute the real
@@ -840,12 +847,15 @@ package body Exp_Disp is
              Make_Integer_Literal (Loc, 0));
 
       else
-         Old_Tag := New_Reference_To (Access_Disp_Table (Etype (Typ)), Loc);
+         Old_Tag :=
+           New_Reference_To
+             (Node (First_Elmt (Access_Disp_Table (Etype (Typ)))), Loc);
          Old_TSD :=
            Make_DT_Access_Action (Typ,
              Action => Get_TSD,
              Args   => New_List (
-               New_Reference_To (Access_Disp_Table (Etype (Typ)), Loc)));
+               New_Reference_To
+                 (Node (First_Elmt (Access_Disp_Table (Etype (Typ)))), Loc)));
       end if;
 
       --  Generate: Inherit_DT (parent'tag, DT_Ptr, nb_prim of parent);
@@ -857,7 +867,7 @@ package body Exp_Disp is
             Node1 => Old_Tag,
             Node2 => New_Reference_To (DT_Ptr, Loc),
             Node3 => Make_Integer_Literal (Loc,
-                       DT_Entry_Count (Tag_Component (Etype (Typ)))))));
+                       DT_Entry_Count (First_Tag_Component (Etype (Typ)))))));
 
       --  Generate: Inherit_TSD (Get_TSD (parent), DT_Ptr);
 
@@ -1107,7 +1117,7 @@ package body Exp_Disp is
       Parent_Typ : constant Entity_Id := Etype (Typ);
       Root_Typ   : constant Entity_Id := Root_Type (Typ);
       First_Prim : constant Elmt_Id := First_Elmt (Primitive_Operations (Typ));
-      The_Tag    : constant Entity_Id := Tag_Component (Typ);
+      The_Tag    : constant Entity_Id := First_Tag_Component (Typ);
       Adjusted   : Boolean := False;
       Finalized  : Boolean := False;
       Parent_EC  : Int;
@@ -1120,9 +1130,10 @@ package body Exp_Disp is
       --  Get Entry_Count of the parent
 
       if Parent_Typ /= Typ
-        and then DT_Entry_Count (Tag_Component (Parent_Typ)) /= No_Uint
+        and then DT_Entry_Count (First_Tag_Component (Parent_Typ)) /= No_Uint
       then
-         Parent_EC := UI_To_Int (DT_Entry_Count (Tag_Component (Parent_Typ)));
+         Parent_EC := UI_To_Int (DT_Entry_Count
+                                   (First_Tag_Component (Parent_Typ)));
       else
          Parent_EC := 0;
       end if;
@@ -1327,7 +1338,7 @@ package body Exp_Disp is
 
          pragma Assert (
            DT_Entry_Count (The_Tag) >=
-           DT_Entry_Count (Tag_Component (Parent_Typ)));
+           DT_Entry_Count (First_Tag_Component (Parent_Typ)));
       end if;
    end Set_All_DT_Position;
 
index 4c756b1..e1c69b7 100644 (file)
@@ -266,7 +266,7 @@ package body Exp_Dist is
    procedure Set_Renaming_TSS
      (Typ     : Entity_Id;
       Nam     : Entity_Id;
-      TSS_Nam : Name_Id);
+      TSS_Nam : TSS_Name_Type);
    --  Create a renaming declaration of subprogram Nam,
    --  and register it as a TSS for Typ with name TSS_Nam.
 
@@ -1866,7 +1866,7 @@ package body Exp_Dist is
               Prefix =>
                 New_Occurrence_Of (Pointer, Loc),
               Selector_Name =>
-                New_Occurrence_Of (Tag_Component
+                New_Occurrence_Of (First_Tag_Component
                   (Designated_Type (Etype (Pointer))), Loc)),
           Expression =>
             Make_Attribute_Reference (Loc,
@@ -5467,7 +5467,7 @@ package body Exp_Dist is
          Insert_After (Declaration_Node (RACW_Type), Func_Decl);
          Append_To (Declarations, Func_Body);
 
-         Set_Renaming_TSS (RACW_Type, Fnam, Name_uFrom_Any);
+         Set_Renaming_TSS (RACW_Type, Fnam, TSS_From_Any);
       end Add_RACW_From_Any;
 
       -----------------------------
@@ -5781,7 +5781,7 @@ package body Exp_Dist is
          Insert_After (Declaration_Node (RACW_Type), Func_Decl);
          Append_To (Declarations, Func_Body);
 
-         Set_Renaming_TSS (RACW_Type, Fnam, Name_uTo_Any);
+         Set_Renaming_TSS (RACW_Type, Fnam, TSS_To_Any);
       end Add_RACW_To_Any;
 
       -----------------------
@@ -5855,7 +5855,7 @@ package body Exp_Dist is
          Insert_After (Declaration_Node (RACW_Type), Func_Decl);
          Append_To (Declarations, Func_Body);
 
-         Set_Renaming_TSS (RACW_Type, Fnam, Name_uTypeCode);
+         Set_Renaming_TSS (RACW_Type, Fnam, TSS_TypeCode);
       end Add_RACW_TypeCode;
 
       ------------------------------
@@ -6369,7 +6369,7 @@ package body Exp_Dist is
          Insert_After (Declaration_Node (RAS_Type), Func_Decl);
          Append_To (Declarations, Func_Body);
 
-         Set_Renaming_TSS (RAS_Type, Fnam, Name_uFrom_Any);
+         Set_Renaming_TSS (RAS_Type, Fnam, TSS_From_Any);
       end Add_RAS_From_Any;
 
       --------------------
@@ -6461,7 +6461,7 @@ package body Exp_Dist is
          Insert_After (Declaration_Node (RAS_Type), Func_Decl);
          Append_To (Declarations, Func_Body);
 
-         Set_Renaming_TSS (RAS_Type, Fnam, Name_uTo_Any);
+         Set_Renaming_TSS (RAS_Type, Fnam, TSS_To_Any);
       end Add_RAS_To_Any;
 
       ----------------------
@@ -6550,7 +6550,7 @@ package body Exp_Dist is
          Insert_After (Declaration_Node (RAS_Type), Func_Decl);
          Append_To (Declarations, Func_Body);
 
-         Set_Renaming_TSS (RAS_Type, Fnam, Name_uTypeCode);
+         Set_Renaming_TSS (RAS_Type, Fnam, TSS_TypeCode);
       end Add_RAS_TypeCode;
 
       -----------------------------------------
@@ -8099,13 +8099,6 @@ package body Exp_Dist is
          -- Local Subprograms --
          -----------------------
 
-         function Find_Inherited_TSS
-           (Typ : Entity_Id;
-            Nam : Name_Id) return Entity_Id;
-         --  A TSS reference for a representation aspect of a derived tagged
-         --  type must take into account inheritance of that aspect from
-         --  ancestor types. (copied from exp_attr.adb, should be shared???)
-
          function Find_Numeric_Representation
            (Typ : Entity_Id) return Entity_Id;
          --  Given a numeric type Typ, return the smallest integer or floarting
@@ -8236,7 +8229,7 @@ package body Exp_Dist is
             --  First simple case where the From_Any function is present
             --  in the type's TSS.
 
-            Fnam := Find_Inherited_TSS (U_Type, Name_uFrom_Any);
+            Fnam := Find_Inherited_TSS (U_Type, TSS_From_Any);
 
             if Sloc (U_Type) <= Standard_Location then
                U_Type := Base_Type (U_Type);
@@ -8374,7 +8367,6 @@ package body Exp_Dist is
             pragma Assert
               (not (Is_Remote_Access_To_Class_Wide_Type (Typ)));
 
-
             if Is_Derived_Type (Typ)
               and then not Is_Tagged_Type (Typ)
             then
@@ -9017,7 +9009,7 @@ package body Exp_Dist is
             --  First simple case where the To_Any function is present
             --  in the type's TSS.
 
-            Fnam := Find_Inherited_TSS (U_Type, Name_uTo_Any);
+            Fnam := Find_Inherited_TSS (U_Type, TSS_To_Any);
 
             --  Check first for Boolean and Character. These are enumeration
             --  types, but we treat them specially, since they may require
@@ -9686,7 +9678,7 @@ package body Exp_Dist is
                --  First simple case where the TypeCode is present
                --  in the type's TSS.
 
-               Fnam := Find_Inherited_TSS (U_Type, Name_uTypeCode);
+               Fnam := Find_Inherited_TSS (U_Type, TSS_TypeCode);
 
                if Present (Fnam) then
 
@@ -10346,52 +10338,6 @@ package body Exp_Dist is
                     Statements => Stms));
          end Build_TypeCode_Function;
 
-         ------------------------
-         -- Find_Inherited_TSS --
-         ------------------------
-
-         function Find_Inherited_TSS
-           (Typ : Entity_Id;
-            Nam : Name_Id) return Entity_Id
-         is
-            P_Type : Entity_Id := Typ;
-            Proc   : Entity_Id;
-
-         begin
-            Proc :=  TSS (Base_Type (Typ), Nam);
-
-            --  Check first if there is a TSS given for the type itself
-
-            if Present (Proc) then
-               return Proc;
-            end if;
-
-            --  If Typ is a derived type, it may inherit attributes from some
-            --  ancestor which is not the ultimate underlying one. If Typ is a
-            --  derived tagged type, The corresponding primitive operation has
-            --  been created explicitly.
-
-            if Is_Derived_Type (P_Type) then
-               if Is_Tagged_Type (P_Type) then
-                  return Find_Prim_Op (P_Type, Nam);
-               else
-                  while Is_Derived_Type (P_Type) loop
-                     Proc :=  TSS (Base_Type (Etype (Typ)), Nam);
-
-                     if Present (Proc) then
-                        return Proc;
-                     else
-                        P_Type := Base_Type (Etype (P_Type));
-                     end if;
-                  end loop;
-               end if;
-            end if;
-
-            --  If nothing else, use the TSS of the root type
-
-            return TSS (Base_Type (Underlying_Type (Typ)), Nam);
-         end Find_Inherited_TSS;
-
          ---------------------------------
          -- Find_Numeric_Representation --
          ---------------------------------
@@ -10634,7 +10580,6 @@ package body Exp_Dist is
                  Counter => Counter,
                  Datum   => New_Occurrence_Of (Inner_Any, Loc));
 
-
                Append_To (Stmts,
                  Make_Block_Statement (Loc,
                    Declarations =>
@@ -10769,7 +10714,7 @@ package body Exp_Dist is
    procedure Set_Renaming_TSS
      (Typ     : Entity_Id;
       Nam     : Entity_Id;
-      TSS_Nam : Name_Id)
+      TSS_Nam : TSS_Name_Type)
    is
       Loc  : constant Source_Ptr := Sloc (Nam);
       Spec : constant Node_Id := Parent (Nam);
@@ -10779,7 +10724,7 @@ package body Exp_Dist is
                      Specification =>
                        Copy_Specification (Loc,
                          Spec     => Spec,
-                         New_Name => TSS_Nam),
+                         New_Name => Make_TSS_Name (Typ, TSS_Nam)),
                        Name => New_Occurrence_Of (Nam, Loc));
 
       Snam : constant Entity_Id :=
index 5968b72..928d52d 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2004 Free Software Foundation, Inc.          --
+--          Copyright (C) 1992-2005 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- --
@@ -190,6 +190,16 @@ package body Ch11 is
          Set_Name (Raise_Node, P_Name);
       end if;
 
+      if Token = Tok_With then
+         if Ada_Version < Ada_05 then
+            Error_Msg_SC ("string expression in raise is Ada 2005 extension");
+            Error_Msg_SC ("\unit must be compiled with -gnat05 switch");
+         end if;
+
+         Scan; -- past WITH
+         Set_Expression (Raise_Node, P_Expression);
+      end if;
+
       TF_Semicolon;
       return Raise_Node;
    end P_Raise_Statement;
index 7dcc6ba..56ec4a1 100644 (file)
@@ -487,13 +487,17 @@ package body Ch12 is
    --  | FORMAL_DECIMAL_FIXED_POINT_DEFINITION
    --  | FORMAL_ARRAY_TYPE_DEFINITION
    --  | FORMAL_ACCESS_TYPE_DEFINITION
+   --  | FORMAL_INTERFACE_TYPE_DEFINITION
 
    --  FORMAL_ARRAY_TYPE_DEFINITION ::= ARRAY_TYPE_DEFINITION
 
    --  FORMAL_ACCESS_TYPE_DEFINITION ::= ACCESS_TYPE_DEFINITION
 
+   --  FORMAL_INTERFACE_TYPE_DEFINITION ::= INTERFACE_TYPE_DEFINITION
+
    function P_Formal_Type_Definition return Node_Id is
-      Scan_State : Saved_Scan_State;
+      Scan_State   : Saved_Scan_State;
+      Typedef_Node : Node_Id;
 
    begin
       if Token_Name = Name_Abstract then
@@ -524,38 +528,89 @@ package body Ch12 is
                return P_Formal_Private_Type_Definition;
             end if;
 
-         when Tok_Private | Tok_Limited | Tok_Tagged =>
-            return P_Formal_Private_Type_Definition;
+         when Tok_Access =>
+            return P_Access_Type_Definition;
 
-         when Tok_New =>
-            return P_Formal_Derived_Type_Definition;
+         when Tok_Array =>
+            return P_Array_Type_Definition;
+
+         when Tok_Delta =>
+            return P_Formal_Fixed_Point_Definition;
+
+         when Tok_Digits =>
+            return P_Formal_Floating_Point_Definition;
+
+         when Tok_Interface => --  Ada 2005 (AI-251)
+            return P_Interface_Type_Definition (Is_Synchronized => False);
 
          when Tok_Left_Paren =>
             return P_Formal_Discrete_Type_Definition;
 
-         when Tok_Range =>
-            return P_Formal_Signed_Integer_Type_Definition;
+         when Tok_Limited =>
+            Save_Scan_State (Scan_State);
+            Scan; --  past LIMITED
+
+            if Token = Tok_Interface then
+               Typedef_Node := P_Interface_Type_Definition
+                                (Is_Synchronized => False);
+               Set_Limited_Present (Typedef_Node);
+               return Typedef_Node;
+
+            else
+               Restore_Scan_State (Scan_State);
+               return P_Formal_Private_Type_Definition;
+            end if;
 
          when Tok_Mod =>
             return P_Formal_Modular_Type_Definition;
 
-         when Tok_Digits =>
-            return P_Formal_Floating_Point_Definition;
-
-         when Tok_Delta =>
-            return P_Formal_Fixed_Point_Definition;
+         when Tok_New =>
+            return P_Formal_Derived_Type_Definition;
 
-         when Tok_Array =>
-            return P_Array_Type_Definition;
+         when Tok_Private |
+              Tok_Tagged  =>
+            return P_Formal_Private_Type_Definition;
 
-         when Tok_Access =>
-            return P_Access_Type_Definition;
+         when Tok_Range =>
+            return P_Formal_Signed_Integer_Type_Definition;
 
          when Tok_Record =>
             Error_Msg_SC ("record not allowed in generic type definition!");
             Discard_Junk_Node (P_Record_Definition);
             return Error;
 
+         --  Ada 2005 (AI-345)
+
+         when Tok_Protected    |
+              Tok_Synchronized |
+              Tok_Task         =>
+
+            Scan; -- past TASK, PROTECTED or SYNCHRONIZED
+
+            declare
+               Saved_Token  : constant Token_Type := Token;
+
+            begin
+               Typedef_Node := P_Interface_Type_Definition
+                                (Is_Synchronized => True);
+
+               case Saved_Token is
+                  when Tok_Task =>
+                     Set_Task_Present         (Typedef_Node);
+
+                  when Tok_Protected =>
+                     Set_Protected_Present    (Typedef_Node);
+
+                  when Tok_Synchronized =>
+                     Set_Synchronized_Present (Typedef_Node);
+
+                  when others =>
+                     null;
+               end case;
+
+               return Typedef_Node;
+            end;
+
          when others =>
             Error_Msg_BC ("expecting generic type definition here");
             Resync_Past_Semicolon;
@@ -617,7 +672,7 @@ package body Ch12 is
    --------------------------------------------
 
    --  FORMAL_DERIVED_TYPE_DEFINITION ::=
-   --    [abstract] new SUBTYPE_MARK [with private]
+   --    [abstract] new SUBTYPE_MARK [[AND interface_list] with private]
 
    --  The caller has checked the initial token(s) is/are NEW or ASTRACT NEW
 
@@ -638,6 +693,26 @@ package body Ch12 is
       Set_Subtype_Mark (Def_Node, P_Subtype_Mark);
       No_Constraint;
 
+      --  Ada 2005 (AI-251): Deal with interfaces
+
+      if Token = Tok_And then
+         Scan; -- past AND
+
+         if Ada_Version < Ada_05 then
+            Error_Msg_SP
+              ("abstract interface is an Ada 2005 extension");
+            Error_Msg_SP ("\unit must be compiled with -gnat05 switch");
+         end if;
+
+         Set_Interface_List (Def_Node, New_List);
+
+         loop
+            Append (P_Qualified_Simple_Name, Interface_List (Def_Node));
+            exit when Token /= Tok_And;
+            Scan; -- past AND
+         end loop;
+      end if;
+
       if Token = Tok_With then
          Scan; -- past WITH
          Set_Private_Present (Def_Node, True);
index 5da4a3e..d28f1a9 100644 (file)
@@ -241,12 +241,16 @@ package body Ch3 is
    --    ENUMERATION_TYPE_DEFINITION  | INTEGER_TYPE_DEFINITION
    --  | REAL_TYPE_DEFINITION         | ARRAY_TYPE_DEFINITION
    --  | RECORD_TYPE_DEFINITION       | ACCESS_TYPE_DEFINITION
-   --  | DERIVED_TYPE_DEFINITION
+   --  | DERIVED_TYPE_DEFINITION      | INTERFACE_TYPE_DEFINITION
 
    --  INTEGER_TYPE_DEFINITION ::=
    --    SIGNED_INTEGER_TYPE_DEFINITION
    --    MODULAR_TYPE_DEFINITION
 
+   --  INTERFACE_TYPE_DEFINITION ::=
+   --    [limited | task | protected | synchronized ] interface
+   --      [AND interface_list]
+
    --  Error recovery: can raise Error_Resync
 
    --  Note: The processing for full type declaration, incomplete type
@@ -256,18 +260,19 @@ package body Ch3 is
    --  function handles only declarations starting with TYPE).
 
    function P_Type_Declaration return Node_Id is
-      Type_Loc         : Source_Ptr;
-      Type_Start_Col   : Column_Number;
-      Ident_Node       : Node_Id;
+      Abstract_Present : Boolean;
+      Abstract_Loc     : Source_Ptr;
       Decl_Node        : Node_Id;
       Discr_List       : List_Id;
-      Unknown_Dis      : Boolean;
       Discr_Sloc       : Source_Ptr;
-      Abstract_Present : Boolean;
-      Abstract_Loc     : Source_Ptr;
       End_Labl         : Node_Id;
+      Type_Loc         : Source_Ptr;
+      Type_Start_Col   : Column_Number;
+      Ident_Node       : Node_Id;
+      Is_Derived_Iface : Boolean := False;
+      Unknown_Dis      : Boolean;
 
-      Typedef_Node : Node_Id;
+      Typedef_Node     : Node_Id;
       --  Normally holds type definition, except in the case of a private
       --  extension declaration, in which case it holds the declaration itself
 
@@ -551,12 +556,6 @@ package body Ch3 is
                TF_Semicolon;
                exit;
 
-            when Tok_Private =>
-               Decl_Node := New_Node (N_Private_Type_Declaration, Type_Loc);
-               Scan; -- past PRIVATE
-               TF_Semicolon;
-               exit;
-
             when Tok_Limited =>
                Scan; -- past LIMITED
 
@@ -585,6 +584,18 @@ package body Ch3 is
                   Typedef_Node := P_Record_Definition;
                   Set_Limited_Present (Typedef_Node, True);
 
+               --  Ada 2005 (AI-251): LIMITED INTERFACE
+
+               elsif Token = Tok_Interface then
+                  Typedef_Node := P_Interface_Type_Definition
+                                    (Is_Synchronized => False);
+                  Abstract_Present := True;
+                  Set_Limited_Present (Typedef_Node);
+
+                  if Nkind (Typedef_Node) = N_Derived_Type_Definition then
+                     Is_Derived_Iface := True;
+                  end if;
+
                --  LIMITED PRIVATE is the only remaining possibility here
 
                else
@@ -634,6 +645,55 @@ package body Ch3 is
 
                exit;
 
+            --  Ada 2005 (AI-251): INTERFACE
+
+            when Tok_Interface =>
+               Typedef_Node := P_Interface_Type_Definition
+                                (Is_Synchronized => False);
+               Abstract_Present := True;
+               TF_Semicolon;
+               exit;
+
+            when Tok_Private =>
+               Decl_Node := New_Node (N_Private_Type_Declaration, Type_Loc);
+               Scan; -- past PRIVATE
+               TF_Semicolon;
+               exit;
+
+            --  Ada 2005 (AI-345)
+
+            when Tok_Protected    |
+                 Tok_Synchronized |
+                 Tok_Task         =>
+
+               declare
+                  Saved_Token : constant Token_Type := Token;
+
+               begin
+                  Scan; -- past TASK, PROTECTED or SYNCHRONIZED
+
+                  Typedef_Node := P_Interface_Type_Definition
+                                   (Is_Synchronized => True);
+
+                  case Saved_Token is
+                     when Tok_Task =>
+                        Set_Task_Present         (Typedef_Node);
+
+                     when Tok_Protected =>
+                        Set_Protected_Present    (Typedef_Node);
+
+                     when Tok_Synchronized =>
+                        Set_Synchronized_Present (Typedef_Node);
+
+                     when others =>
+                        pragma Assert (False);
+                        null;
+                  end case;
+               end;
+
+               TF_Semicolon;
+               exit;
+
             --  Anything else is an error
 
             when others =>
@@ -693,6 +753,7 @@ package body Ch3 is
          if Nkind (Typedef_Node) = N_Record_Definition
            or else (Nkind (Typedef_Node) = N_Derived_Type_Definition
                       and then Present (Record_Extension_Part (Typedef_Node)))
+           or else Is_Derived_Iface
          then
             Set_Abstract_Present (Typedef_Node, Abstract_Present);
 
@@ -1407,7 +1468,7 @@ package body Ch3 is
                Acc_Node := P_Access_Definition (Not_Null_Present);
 
                if Token /= Tok_Renames then
-                  Error_Msg_SC ("'RENAMES' expected");
+                  Error_Msg_SC ("RENAMES expected");
                   raise Error_Resync;
                end if;
 
@@ -1463,7 +1524,7 @@ package body Ch3 is
             Acc_Node := P_Access_Definition (Null_Exclusion_Present => False);
 
             if Token /= Tok_Renames then
-               Error_Msg_SC ("'RENAMES' expected");
+               Error_Msg_SC ("RENAMES expected");
                raise Error_Resync;
             end if;
 
@@ -1583,11 +1644,12 @@ package body Ch3 is
 
    --  DERIVED_TYPE_DEFINITION ::=
    --    [abstract] new [NULL_EXCLUSION] parent_SUBTYPE_INDICATION
-   --    [RECORD_EXTENSION_PART]
+   --    [[AND interface_list] RECORD_EXTENSION_PART]
 
    --  PRIVATE_EXTENSION_DECLARATION ::=
    --     type DEFINING_IDENTIFIER [DISCRIMINANT_PART] is
-   --       [abstract] new ancestor_SUBTYPE_INDICATION with PRIVATE;
+   --       [abstract] new ancestor_SUBTYPE_INDICATION
+   --       [AND interface_list] with PRIVATE;
 
    --  RECORD_EXTENSION_PART ::= with RECORD_DEFINITION
 
@@ -1605,6 +1667,7 @@ package body Ch3 is
       Typedef_Node     : Node_Id;
       Typedecl_Node    : Node_Id;
       Not_Null_Present : Boolean := False;
+
    begin
       Typedef_Node := New_Node (N_Derived_Type_Definition, Token_Ptr);
       T_New;
@@ -1619,6 +1682,31 @@ package body Ch3 is
       Set_Subtype_Indication (Typedef_Node,
          P_Subtype_Indication (Not_Null_Present));
 
+      --  Ada 2005 (AI-251): Deal with interfaces
+
+      if Token = Tok_And then
+         Scan; -- past AND
+
+         if Ada_Version < Ada_05 then
+            Error_Msg_SP
+              ("abstract interface is an Ada 2005 extension");
+            Error_Msg_SP ("\unit must be compiled with -gnat05 switch");
+         end if;
+
+         Set_Interface_List (Typedef_Node, New_List);
+
+         loop
+            Append (P_Qualified_Simple_Name, Interface_List (Typedef_Node));
+            exit when Token /= Tok_And;
+            Scan; -- past AND
+         end loop;
+
+         if Token /= Tok_With then
+            Error_Msg_SC ("WITH expected");
+            raise Error_Resync;
+         end if;
+      end if;
+
       --  Deal with record extension, note that we assume that a WITH is
       --  missing in the case of "type X is new Y record ..." or in the
       --  case of "type X is new Y null record".
@@ -3279,6 +3367,94 @@ package body Ch3 is
 
    --  Parsed by P_Derived_Type_Def_Or_Private_Ext_Decl (3.4)
 
+   --------------------------------------
+   -- 3.9.4  Interface Type Definition --
+   --------------------------------------
+
+   --  INTERFACE_TYPE_DEFINITION ::=
+   --    [limited | task | protected | synchronized] interface
+   --      [AND interface_list]
+
+   --  Error recovery: cannot raise Error_Resync
+
+   function P_Interface_Type_Definition
+      (Is_Synchronized : Boolean) return Node_Id
+   is
+      Typedef_Node : Node_Id;
+
+   begin
+      if Ada_Version < Ada_05 then
+         Error_Msg_SP ("abstract interface is an Ada 2005 extension");
+         Error_Msg_SP ("\unit must be compiled with -gnat05 switch");
+      end if;
+
+      Scan; -- past INTERFACE
+
+      --  Ada 2005 (AI-345): In case of synchronized interfaces and
+      --  interfaces with a null list of interfaces we build a
+      --  record_definition node.
+
+      if Is_Synchronized
+        or else Token = Tok_Semicolon
+      then
+         Typedef_Node := New_Node (N_Record_Definition, Token_Ptr);
+
+         Set_Abstract_Present  (Typedef_Node);
+         Set_Tagged_Present    (Typedef_Node);
+         Set_Null_Present      (Typedef_Node);
+         Set_Interface_Present (Typedef_Node);
+
+         if Is_Synchronized
+           and then Token = Tok_And
+         then
+            Scan; -- past AND
+            Set_Interface_List (Typedef_Node, New_List);
+
+            loop
+               Append (P_Qualified_Simple_Name,
+                       Interface_List (Typedef_Node));
+               exit when Token /= Tok_And;
+               Scan; -- past AND
+            end loop;
+         end if;
+
+      --  Ada 2005 (AI-251): In case of not-synchronized interfaces that have
+      --  a list of interfaces we build a derived_type_definition node. This
+      --  simplifies the semantic analysis (and hence further mainteinance)
+
+      else
+         if Token /= Tok_And then
+            Error_Msg_AP ("AND expected");
+         else
+            Scan; -- past AND
+         end if;
+
+         Typedef_Node := New_Node (N_Derived_Type_Definition, Token_Ptr);
+
+         Set_Abstract_Present   (Typedef_Node);
+         Set_Interface_Present  (Typedef_Node);
+         Set_Subtype_Indication (Typedef_Node, P_Qualified_Simple_Name);
+
+         Set_Record_Extension_Part (Typedef_Node,
+           New_Node (N_Record_Definition, Token_Ptr));
+         Set_Null_Present (Record_Extension_Part (Typedef_Node));
+
+         if Token = Tok_And then
+            Set_Interface_List (Typedef_Node, New_List);
+            Scan; -- past AND
+
+            loop
+               Append (P_Qualified_Simple_Name,
+                       Interface_List (Typedef_Node));
+               exit when Token /= Tok_And;
+               Scan; -- past AND
+            end loop;
+         end if;
+      end if;
+
+      return Typedef_Node;
+   end P_Interface_Type_Definition;
+
    ----------------------------------
    -- 3.10  Access Type Definition --
    ----------------------------------
index 4c6da46..eba22ac 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2004 Free Software Foundation, Inc.          --
+--          Copyright (C) 1992-2005 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- --
@@ -53,7 +53,7 @@ package body Ch9 is
 
    --  TASK_TYPE_DECLARATION ::=
    --    task type DEFINING_IDENTIFIER [KNOWN_DISCRIMINANT_PART]
-   --      [is TASK_DEFINITION];
+   --      [is [new INTERFACE_LIST with] TASK_DEFINITION];
 
    --  SINGLE_TASK_DECLARATION ::=
    --    task DEFINING_IDENTIFIER [is TASK_DEFINITION];
@@ -161,6 +161,32 @@ package body Ch9 is
             end if;
          else
             TF_Is; -- must have IS if no semicolon
+
+            --  Ada 2005 (AI-345)
+
+            if Token = Tok_New then
+               Scan; --  past NEW
+
+               if Ada_Version < Ada_05 then
+                  Error_Msg_SP ("task interface is an Ada 2005 extension");
+                  Error_Msg_SP ("\unit must be compiled with -gnat05 switch");
+               end if;
+
+               Set_Interface_List (Task_Node, New_List);
+
+               loop
+                  Append (P_Qualified_Simple_Name, Interface_List (Task_Node));
+                  exit when Token /= Tok_And;
+                  Scan; --  past AND
+               end loop;
+
+               if Token /= Tok_With then
+                  Error_Msg_SC ("WITH expected");
+               end if;
+
+               Scan; -- past WITH
+            end if;
+
             Set_Task_Definition (Task_Node, P_Task_Definition);
          end if;
 
@@ -308,7 +334,7 @@ package body Ch9 is
 
    --  PROTECTED_TYPE_DECLARATION ::=
    --    protected type DEFINING_IDENTIFIER [KNOWN_DISCRIMINANT_PART]
-   --      is PROTECTED_DEFINITION;
+   --      is [new INTERFACE_LIST with] PROTECTED_DEFINITION;
 
    --  SINGLE_PROTECTED_DECLARATION ::=
    --    protected DEFINING_IDENTIFIER is PROTECTED_DEFINITION;
@@ -402,6 +428,34 @@ package body Ch9 is
          end if;
 
          T_Is;
+
+         --  Ada 2005 (AI-345)
+
+         if Token = Tok_New then
+            Scan; --  past NEW
+
+            if Ada_Version < Ada_05 then
+               Error_Msg_SP ("task interface is an Ada 2005 extension");
+               Error_Msg_SP ("\unit must be compiled with -gnat05 switch");
+            end if;
+
+            Set_Interface_List (Protected_Node, New_List);
+
+            loop
+               Append (P_Qualified_Simple_Name,
+                 Interface_List (Protected_Node));
+
+               exit when Token /= Tok_And;
+               Scan; --  past AND
+            end loop;
+
+            if Token /= Tok_With then
+               Error_Msg_SC ("WITH expected");
+            end if;
+
+            Scan; -- past WITH
+         end if;
+
          Set_Protected_Definition (Protected_Node, P_Protected_Definition);
          return Protected_Node;
       end if;
index 6c8ec70..8b4e690 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2004 Free Software Foundation, Inc.          --
+--          Copyright (C) 1992-2005 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- --
@@ -601,6 +601,17 @@ function Par (Configuration_Pragmas : Boolean) return List_Id is
       --  treatment of errors in case a reserved word is scanned. See the
       --  declaration of this type for details.
 
+      function P_Interface_Type_Definition
+        (Is_Synchronized : Boolean) return Node_Id;
+      --  Ada 2005 (AI-251): Parse the interface type definition part. The
+      --  parameter Is_Synchronized is True in case of task interfaces,
+      --  protected interfaces, and synchronized interfaces; it is used to
+      --  generate a record_definition node. In the rest of cases (limited
+      --  interfaces and interfaces) we generate a record_definition node if
+      --  the list of interfaces is empty; otherwise we generate a
+      --  derived_type_definition node (the first interface in this list is the
+      --  ancestor interface).
+
       function P_Null_Exclusion return Boolean;
       --  Ada 2005 (AI-231): Parse the null-excluding part. True indicates
       --  that the null-excluding part was present.
index bd3faa4..79dab06 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2004 Free Software Foundation, Inc.          --
+--          Copyright (C) 1992-2005 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- --
@@ -363,7 +363,7 @@ package body Sem_Ch11 is
 
    procedure Analyze_Raise_Statement (N : Node_Id) is
       Exception_Id   : constant Node_Id := Name (N);
-      Exception_Name : Entity_Id := Empty;
+      Exception_Name : Entity_Id        := Empty;
       P              : Node_Id;
       Nkind_P        : Node_Kind;
 
@@ -445,6 +445,10 @@ package body Sem_Ch11 is
             Error_Msg_N
               ("exception name expected in raise statement", Exception_Id);
          end if;
+
+         if Present (Expression (N)) then
+            Analyze_And_Resolve (Expression (N), Standard_String);
+         end if;
       end if;
    end Analyze_Raise_Statement;
 
index 408024b..b301929 100644 (file)
@@ -5179,7 +5179,7 @@ package body Sem_Prag is
 
                if Expander_Active and then Typ = Root_Type (Typ) then
 
-                  Tag_C := Tag_Component (Typ);
+                  Tag_C := First_Tag_Component (Typ);
                   C := First_Entity (Typ);
 
                   if C = Tag_C then
@@ -5313,7 +5313,7 @@ package body Sem_Prag is
             --    . DT_Position will be set at the freezing point
 
             if Arg_Count = 1 then
-               Set_DTC_Entity (Subp, Tag_Component (Typ));
+               Set_DTC_Entity (Subp, First_Tag_Component (Typ));
                return;
             end if;
 
@@ -5431,9 +5431,9 @@ package body Sem_Prag is
             --  If it is the first pragma Vtable, This becomes the default tag
 
             elsif (not Is_Tag (DTC))
-              and then DT_Entry_Count (Tag_Component (Typ)) = No_Uint
+              and then DT_Entry_Count (First_Tag_Component (Typ)) = No_Uint
             then
-               Set_Is_Tag (Tag_Component (Typ), False);
+               Set_Is_Tag (First_Tag_Component (Typ), False);
                Set_Is_Tag (DTC, True);
                Set_DT_Entry_Count (DTC, No_Uint);
             end if;
index 33f3301..c6117ee 100644 (file)
@@ -314,8 +314,9 @@ package body Sinfo is
    begin
       pragma Assert (False
         or else NT (N).Nkind = N_Component_Association
-        or else NT (N).Nkind = N_Formal_Package_Declaration
-        or else NT (N).Nkind in N_Formal_Subprogram_Declaration);
+        or else NT (N).Nkind = N_Formal_Abstract_Subprogram_Declaration
+        or else NT (N).Nkind = N_Formal_Concrete_Subprogram_Declaration
+        or else NT (N).Nkind = N_Formal_Package_Declaration);
       return Flag15 (N);
    end Box_Present;
 
@@ -628,7 +629,8 @@ package body Sinfo is
       (N : Node_Id) return Node_Id is
    begin
       pragma Assert (False
-        or else NT (N).Nkind in N_Formal_Subprogram_Declaration);
+        or else NT (N).Nkind = N_Formal_Abstract_Subprogram_Declaration
+        or else NT (N).Nkind = N_Formal_Concrete_Subprogram_Declaration);
       return Node2 (N);
    end Default_Name;
 
@@ -1056,7 +1058,7 @@ package body Sinfo is
         or else NT (N).Nkind = N_Label
         or else NT (N).Nkind = N_Object_Declaration
         or else NT (N).Nkind = N_Subtype_Declaration);
-      return Flag11 (N);
+      return Flag7 (N);
    end Exception_Junk;
 
    function Expansion_Delayed
@@ -1110,6 +1112,7 @@ package body Sinfo is
         or else NT (N).Nkind = N_Parameter_Specification
         or else NT (N).Nkind = N_Pragma_Argument_Association
         or else NT (N).Nkind = N_Qualified_Expression
+        or else NT (N).Nkind = N_Raise_Statement
         or else NT (N).Nkind = N_Return_Statement
         or else NT (N).Nkind = N_Type_Conversion
         or else NT (N).Nkind = N_Unchecked_Expression
@@ -1403,6 +1406,28 @@ package body Sinfo is
       return Flag16 (N);
    end Implicit_With;
 
+   function Interface_List
+      (N : Node_Id) return List_Id is
+   begin
+      pragma Assert (False
+        or else NT (N).Nkind = N_Derived_Type_Definition
+        or else NT (N).Nkind = N_Formal_Derived_Type_Definition
+        or else NT (N).Nkind = N_Private_Extension_Declaration
+        or else NT (N).Nkind = N_Protected_Type_Declaration
+        or else NT (N).Nkind = N_Record_Definition
+        or else NT (N).Nkind = N_Task_Type_Declaration);
+      return List2 (N);
+   end Interface_List;
+
+   function Interface_Present
+      (N : Node_Id) return Boolean is
+   begin
+      pragma Assert (False
+        or else NT (N).Nkind = N_Derived_Type_Definition
+        or else NT (N).Nkind = N_Record_Definition);
+      return Flag16 (N);
+   end Interface_Present;
+
    function In_Present
       (N : Node_Id) return Boolean is
    begin
@@ -1639,6 +1664,7 @@ package body Sinfo is
       (N : Node_Id) return Boolean is
    begin
       pragma Assert (False
+        or else NT (N).Nkind = N_Derived_Type_Definition
         or else NT (N).Nkind = N_Formal_Private_Type_Definition
         or else NT (N).Nkind = N_Private_Type_Declaration
         or else NT (N).Nkind = N_Record_Definition
@@ -1865,7 +1891,7 @@ package body Sinfo is
         or else NT (N).Nkind = N_Object_Declaration
         or else NT (N).Nkind = N_Parameter_Specification
         or else NT (N).Nkind = N_Subtype_Declaration);
-      return Flag9 (N);
+      return Flag11 (N);
    end Null_Exclusion_Present;
 
    function Null_Record_Present
@@ -1885,14 +1911,6 @@ package body Sinfo is
       return Node4 (N);
    end Object_Definition;
 
-   function OK_For_Stream
-      (N : Node_Id) return Boolean is
-   begin
-      pragma Assert (False
-        or else NT (N).Nkind = N_Attribute_Reference);
-      return Flag4 (N);
-   end OK_For_Stream;
-
    function Original_Discriminant
       (N : Node_Id) return Node_Id is
    begin
@@ -2121,8 +2139,10 @@ package body Sinfo is
    begin
       pragma Assert (False
         or else NT (N).Nkind = N_Access_Function_Definition
-        or else NT (N).Nkind = N_Access_Procedure_Definition);
-      return Flag15 (N);
+        or else NT (N).Nkind = N_Access_Procedure_Definition
+        or else NT (N).Nkind = N_Derived_Type_Definition
+        or else NT (N).Nkind = N_Record_Definition);
+      return Flag6 (N);
    end Protected_Present;
 
    function Raises_Constraint_Error
@@ -2296,14 +2316,15 @@ package body Sinfo is
    begin
       pragma Assert (False
         or else NT (N).Nkind = N_Abstract_Subprogram_Declaration
+        or else NT (N).Nkind = N_Formal_Abstract_Subprogram_Declaration
+        or else NT (N).Nkind = N_Formal_Concrete_Subprogram_Declaration
         or else NT (N).Nkind = N_Generic_Package_Declaration
         or else NT (N).Nkind = N_Generic_Subprogram_Declaration
         or else NT (N).Nkind = N_Package_Declaration
         or else NT (N).Nkind = N_Subprogram_Body
         or else NT (N).Nkind = N_Subprogram_Body_Stub
         or else NT (N).Nkind = N_Subprogram_Declaration
-        or else NT (N).Nkind = N_Subprogram_Renaming_Declaration
-        or else NT (N).Nkind in N_Formal_Subprogram_Declaration);
+        or else NT (N).Nkind = N_Subprogram_Renaming_Declaration);
       return Node1 (N);
    end Specification;
 
@@ -2388,6 +2409,15 @@ package body Sinfo is
       return List2 (N);
    end Subtype_Marks;
 
+   function Synchronized_Present
+     (N : Node_Id) return Boolean is
+   begin
+      pragma Assert (False
+        or else NT (N).Nkind = N_Derived_Type_Definition
+        or else NT (N).Nkind = N_Record_Definition);
+      return Flag7 (N);
+   end Synchronized_Present;
+
    function Tagged_Present
       (N : Node_Id) return Boolean is
    begin
@@ -2407,14 +2437,6 @@ package body Sinfo is
       return Node2 (N);
    end Target_Type;
 
-   function Task_Body_Procedure
-      (N : Node_Id) return Entity_Id is
-   begin
-      pragma Assert (False
-        or else NT (N).Nkind = N_Task_Type_Declaration);
-      return Node2 (N);
-   end Task_Body_Procedure;
-
    function Task_Definition
       (N : Node_Id) return Node_Id is
    begin
@@ -2424,6 +2446,15 @@ package body Sinfo is
       return Node3 (N);
    end Task_Definition;
 
+   function Task_Present
+     (N : Node_Id) return Boolean is
+   begin
+      pragma Assert (False
+        or else NT (N).Nkind = N_Derived_Type_Definition
+        or else NT (N).Nkind = N_Record_Definition);
+      return Flag5 (N);
+   end Task_Present;
+
    function Then_Actions
       (N : Node_Id) return List_Id is
    begin
@@ -2816,8 +2847,9 @@ package body Sinfo is
    begin
       pragma Assert (False
         or else NT (N).Nkind = N_Component_Association
-        or else NT (N).Nkind = N_Formal_Package_Declaration
-        or else NT (N).Nkind in N_Formal_Subprogram_Declaration);
+        or else NT (N).Nkind = N_Formal_Abstract_Subprogram_Declaration
+        or else NT (N).Nkind = N_Formal_Concrete_Subprogram_Declaration
+        or else NT (N).Nkind = N_Formal_Package_Declaration);
       Set_Flag15 (N, Val);
    end Set_Box_Present;
 
@@ -3130,7 +3162,8 @@ package body Sinfo is
       (N : Node_Id; Val : Node_Id) is
    begin
       pragma Assert (False
-        or else NT (N).Nkind in N_Formal_Subprogram_Declaration);
+        or else NT (N).Nkind = N_Formal_Abstract_Subprogram_Declaration
+        or else NT (N).Nkind = N_Formal_Concrete_Subprogram_Declaration);
       Set_Node2_With_Parent (N, Val);
    end Set_Default_Name;
 
@@ -3549,7 +3582,7 @@ package body Sinfo is
         or else NT (N).Nkind = N_Label
         or else NT (N).Nkind = N_Object_Declaration
         or else NT (N).Nkind = N_Subtype_Declaration);
-      Set_Flag11 (N, Val);
+      Set_Flag7 (N, Val);
    end Set_Exception_Junk;
 
    procedure Set_Expansion_Delayed
@@ -3603,6 +3636,7 @@ package body Sinfo is
         or else NT (N).Nkind = N_Parameter_Specification
         or else NT (N).Nkind = N_Pragma_Argument_Association
         or else NT (N).Nkind = N_Qualified_Expression
+        or else NT (N).Nkind = N_Raise_Statement
         or else NT (N).Nkind = N_Return_Statement
         or else NT (N).Nkind = N_Type_Conversion
         or else NT (N).Nkind = N_Unchecked_Expression
@@ -3896,6 +3930,28 @@ package body Sinfo is
       Set_Flag16 (N, Val);
    end Set_Implicit_With;
 
+   procedure Set_Interface_List
+      (N : Node_Id; Val : List_Id) is
+   begin
+      pragma Assert (False
+        or else NT (N).Nkind = N_Derived_Type_Definition
+        or else NT (N).Nkind = N_Formal_Derived_Type_Definition
+        or else NT (N).Nkind = N_Private_Extension_Declaration
+        or else NT (N).Nkind = N_Protected_Type_Declaration
+        or else NT (N).Nkind = N_Record_Definition
+        or else NT (N).Nkind = N_Task_Type_Declaration);
+      Set_List2_With_Parent (N, Val);
+   end Set_Interface_List;
+
+   procedure Set_Interface_Present
+      (N : Node_Id; Val : Boolean := True) is
+   begin
+      pragma Assert (False
+        or else NT (N).Nkind = N_Derived_Type_Definition
+        or else NT (N).Nkind = N_Record_Definition);
+      Set_Flag16 (N, Val);
+   end Set_Interface_Present;
+
    procedure Set_In_Present
       (N : Node_Id; Val : Boolean := True) is
    begin
@@ -4132,6 +4188,7 @@ package body Sinfo is
       (N : Node_Id; Val : Boolean := True) is
    begin
       pragma Assert (False
+        or else NT (N).Nkind = N_Derived_Type_Definition
         or else NT (N).Nkind = N_Formal_Private_Type_Definition
         or else NT (N).Nkind = N_Private_Type_Declaration
         or else NT (N).Nkind = N_Record_Definition
@@ -4358,7 +4415,7 @@ package body Sinfo is
         or else NT (N).Nkind = N_Object_Declaration
         or else NT (N).Nkind = N_Parameter_Specification
         or else NT (N).Nkind = N_Subtype_Declaration);
-      Set_Flag9 (N, Val);
+      Set_Flag11 (N, Val);
    end Set_Null_Exclusion_Present;
 
    procedure Set_Null_Record_Present
@@ -4378,14 +4435,6 @@ package body Sinfo is
       Set_Node4_With_Parent (N, Val);
    end Set_Object_Definition;
 
-   procedure Set_OK_For_Stream
-      (N : Node_Id; Val : Boolean := True) is
-   begin
-      pragma Assert (False
-        or else NT (N).Nkind = N_Attribute_Reference);
-      Set_Flag4 (N, Val);
-   end Set_OK_For_Stream;
-
    procedure Set_Original_Discriminant
       (N : Node_Id; Val : Node_Id) is
    begin
@@ -4614,8 +4663,10 @@ package body Sinfo is
    begin
       pragma Assert (False
         or else NT (N).Nkind = N_Access_Function_Definition
-        or else NT (N).Nkind = N_Access_Procedure_Definition);
-      Set_Flag15 (N, Val);
+        or else NT (N).Nkind = N_Access_Procedure_Definition
+        or else NT (N).Nkind = N_Derived_Type_Definition
+        or else NT (N).Nkind = N_Record_Definition);
+      Set_Flag6 (N, Val);
    end Set_Protected_Present;
 
    procedure Set_Raises_Constraint_Error
@@ -4789,14 +4840,15 @@ package body Sinfo is
    begin
       pragma Assert (False
         or else NT (N).Nkind = N_Abstract_Subprogram_Declaration
+        or else NT (N).Nkind = N_Formal_Abstract_Subprogram_Declaration
+        or else NT (N).Nkind = N_Formal_Concrete_Subprogram_Declaration
         or else NT (N).Nkind = N_Generic_Package_Declaration
         or else NT (N).Nkind = N_Generic_Subprogram_Declaration
         or else NT (N).Nkind = N_Package_Declaration
         or else NT (N).Nkind = N_Subprogram_Body
         or else NT (N).Nkind = N_Subprogram_Body_Stub
         or else NT (N).Nkind = N_Subprogram_Declaration
-        or else NT (N).Nkind = N_Subprogram_Renaming_Declaration
-        or else NT (N).Nkind in N_Formal_Subprogram_Declaration);
+        or else NT (N).Nkind = N_Subprogram_Renaming_Declaration);
       Set_Node1_With_Parent (N, Val);
    end Set_Specification;
 
@@ -4881,6 +4933,15 @@ package body Sinfo is
       Set_List2_With_Parent (N, Val);
    end Set_Subtype_Marks;
 
+   procedure Set_Synchronized_Present
+     (N : Node_Id; Val : Boolean := True) is
+   begin
+      pragma Assert (False
+        or else NT (N).Nkind = N_Derived_Type_Definition
+        or else NT (N).Nkind = N_Record_Definition);
+      Set_Flag7 (N, Val);
+   end Set_Synchronized_Present;
+
    procedure Set_Tagged_Present
       (N : Node_Id; Val : Boolean := True) is
    begin
@@ -4900,14 +4961,6 @@ package body Sinfo is
       Set_Node2 (N, Val); -- semantic field, no parent set
    end Set_Target_Type;
 
-   procedure Set_Task_Body_Procedure
-      (N : Node_Id; Val : Entity_Id) is
-   begin
-      pragma Assert (False
-        or else NT (N).Nkind = N_Task_Type_Declaration);
-      Set_Node2 (N, Val); -- semantic field, no parent set
-   end Set_Task_Body_Procedure;
-
    procedure Set_Task_Definition
       (N : Node_Id; Val : Node_Id) is
    begin
@@ -4917,6 +4970,15 @@ package body Sinfo is
       Set_Node3_With_Parent (N, Val);
    end Set_Task_Definition;
 
+   procedure Set_Task_Present
+     (N : Node_Id; Val : Boolean := True) is
+   begin
+      pragma Assert (False
+        or else NT (N).Nkind = N_Derived_Type_Definition
+        or else NT (N).Nkind = N_Record_Definition);
+      Set_Flag5 (N, Val);
+   end Set_Task_Present;
+
    procedure Set_Then_Actions
       (N : Node_Id; Val : List_Id) is
    begin
index bfbbdf8..c7df4db 100644 (file)
@@ -897,7 +897,7 @@ package Sinfo is
    --    Note: if the Is_Overloaded flag is set, then Etype points to
    --    an essentially arbitrary choice from the possible set of types.
 
-   --  Exception_Junk (Flag11-Sem)
+   --  Exception_Junk (Flag7-Sem)
    --    This flag is set in a various nodes appearing in a statement
    --    sequence to indicate that the corresponding node is an artifact
    --    of the generated code for exception handling, and should be
@@ -1317,16 +1317,6 @@ package Sinfo is
    --    is used for properly setting out of range values for use by pragmas
    --    Initialize_Scalars and Normalize_Scalars.
 
-   --  OK_For_Stream (Flag4-Sem)
-   --    Present in N_Attribute_Definition clauses for stream attributes. If
-   --    set, indicates that the attribute is permitted even though the type
-   --    involved is a limited type. In the case of a protected type, the
-   --    result is to stream all components (including discriminants) in
-   --    lexical order. For other limited types, the effect is simply to
-   --    use the corresponding stream routine for the full type. This flag
-   --    is used for internally generated code, where the streaming of these
-   --    types is required, even though not normally allowed by the language.
-
    --  Original_Discriminant (Node2-Sem)
    --    Present in identifiers. Used in references to discriminants that
    --    appear in generic units. Because the names of the discriminants
@@ -1430,7 +1420,7 @@ package Sinfo is
    --    be rounded to the nearest integer (breaking ties away from zero),
    --    rather than truncated towards zero as usual. These rounded integer
    --    operations are the result of expansion of rounded fixed-point
-   --    divide, conersion and multiplication operations.
+   --    divide, conversion and multiplication operations.
 
    --  Scope (Node3-Sem)
    --    Present in defining identifiers, defining character literals and
@@ -1477,12 +1467,6 @@ package Sinfo is
    --    target type entity for the unchecked conversion instantiation
    --    which gigi must do size validation for.
 
-   --  Task_Body_Procedure (Node2-Sem)
-   --    Present in task type declaration nodes. Points to the entity for
-   --    the task body procedure (as further described in Exp_Ch9, task
-   --    bodies are expanded into procedures). A convenient function to
-   --    retrieve this field is Sem_Util.Get_Task_Body_Procedure.
-
    --  Then_Actions (List3-Sem)
    --    This field is present in conditional expression nodes. During code
    --    expansion we use the Insert_Actions procedure (in Exp_Util) to insert
@@ -1888,7 +1872,7 @@ package Sinfo is
       --    ENUMERATION_TYPE_DEFINITION  | INTEGER_TYPE_DEFINITION
       --  | REAL_TYPE_DEFINITION         | ARRAY_TYPE_DEFINITION
       --  | RECORD_TYPE_DEFINITION       | ACCESS_TYPE_DEFINITION
-      --  | DERIVED_TYPE_DEFINITION
+      --  | DERIVED_TYPE_DEFINITION      | INTERFACE_TYPE_DEFINITION
 
       --------------------------------
       -- 3.2.2  Subtype Declaration --
@@ -1903,10 +1887,10 @@ package Sinfo is
       --  N_Subtype_Declaration
       --  Sloc points to SUBTYPE
       --  Defining_Identifier (Node1)
-      --  Null_Exclusion_Present (Flag9) (set to False if not present)
+      --  Null_Exclusion_Present (Flag11)
       --  Subtype_Indication (Node5)
       --  Generic_Parent_Type (Node4-Sem) (set for an actual derived type).
-      --  Exception_Junk (Flag11-Sem)
+      --  Exception_Junk (Flag7-Sem)
 
       -------------------------------
       -- 3.2.2  Subtype Indication --
@@ -2015,7 +1999,7 @@ package Sinfo is
       --  Defining_Identifier (Node1)
       --  Aliased_Present (Flag4) set if ALIASED appears
       --  Constant_Present (Flag17) set if CONSTANT appears
-      --  Null_Exclusion_Present (Flag9) (set to False if not present)
+      --  Null_Exclusion_Present (Flag11)
       --  Object_Definition (Node4) subtype indication/array type definition
       --  Expression (Node3) (set to Empty if not present)
       --  Handler_List_Entry (Node2-Sem)
@@ -2024,7 +2008,7 @@ package Sinfo is
       --  Prev_Ids (Flag6) (set to False if no previous identifiers in list)
       --  No_Initialization (Flag13-Sem)
       --  Assignment_OK (Flag15-Sem)
-      --  Exception_Junk (Flag11-Sem)
+      --  Exception_Junk (Flag7-Sem)
       --  Delay_Finalize_Attach (Flag14-Sem)
       --  Is_Subprogram_Descriptor (Flag16-Sem)
 
@@ -2063,7 +2047,7 @@ package Sinfo is
 
       --  DERIVED_TYPE_DEFINITION ::=
       --    [abstract] new [NULL_EXCLUSION] parent_SUBTYPE_INDICATION
-      --    [RECORD_EXTENSION_PART]
+      --    [[and INTERFACE_LIST] RECORD_EXTENSION_PART]
 
       --  Note: ABSTRACT, record extension part not permitted in Ada 83 mode
 
@@ -2072,9 +2056,20 @@ package Sinfo is
       --  N_Derived_Type_Definition
       --  Sloc points to NEW
       --  Abstract_Present (Flag4)
-      --  Null_Exclusion_Present (Flag9) (set to False if not present)
+      --  Null_Exclusion_Present (Flag11) (set to False if not present)
       --  Subtype_Indication (Node5)
       --  Record_Extension_Part (Node3) (set to Empty if not present)
+      --  Limited_Present (Flag17) set in interfaces
+      --  Task_Present (Flag5) set in task interfaces
+      --  Protected_Present (Flag6) set in protected interfaces
+      --  Synchronized_Present (Flag7) set in interfaces
+      --  Interface_List (List2) (set to No_List if none)
+      --  Interface_Present (Flag16) set in abstract interfaces
+
+      --  Note: The attributes Limited_Present, Task_Present, Protected_Present
+      --        Synchronized_Present, Interface_List and Interface_Present are
+      --        used for abstract interfaces (see comment in the definition
+      --        of INTERFACE_TYPE_DEFINITION)
 
       ---------------------------
       -- 3.5  Range Constraint --
@@ -2364,7 +2359,7 @@ package Sinfo is
       --  N_Component_Definition
       --  Sloc points to ALIASED, ACCESS or to first token of subtype mark
       --  Aliased_Present (Flag4)
-      --  Null_Exclusion_Present (Flag9) (set to False if not present)
+      --  Null_Exclusion_Present (Flag11)
       --  Subtype_Indication (Node5) (set to Empty if not present)
       --  Access_Definition (Node3) (set to Empty if not present)
 
@@ -2437,9 +2432,8 @@ package Sinfo is
       --  N_Discriminant_Specification
       --  Sloc points to first identifier
       --  Defining_Identifier (Node1)
-      --  Null_Exclusion_Present (Flag9) (set to False if not present)
-      --  Discriminant_Type (Node5) subtype mark or
-      --    access parameter definition
+      --  Null_Exclusion_Present (Flag11)
+      --  Discriminant_Type (Node5) subtype mark or access parameter definition
       --  Expression (Node3) (set to Empty if no default expression)
       --  More_Ids (Flag5) (set to False if no more identifiers in list)
       --  Prev_Ids (Flag6) (set to False if no previous identifiers in list)
@@ -2525,6 +2519,16 @@ package Sinfo is
       --  Limited_Present (Flag17)
       --  Component_List (Node1) empty in null record case
       --  Null_Present (Flag13) set in null record case
+      --  Task_Present (Flag5) set in task interfaces
+      --  Protected_Present (Flag6) set in protected interfaces
+      --  Synchronized_Present (Flag7) set in interfaces
+      --  Interface_Present (Flag16) set in abstract interfaces
+      --  Interface_List (List2) (set to No_List if none)
+
+      --  Note: The attributes Task_Present, Protected_Present, Synchronized
+      --        _Present, Interface_List and Interface_Present are
+      --        used for abstract interfaces (see comment in the definition
+      --        of INTERFACE_TYPE_DEFINITION)
 
       -------------------------
       -- 3.8  Component List --
@@ -2651,6 +2655,19 @@ package Sinfo is
 
       --  Note: record extension parts are not permitted in Ada 83 mode
 
+      --------------------------------------
+      -- 3.9.4  Interface Type Definition --
+      --------------------------------------
+
+      --  INTERFACE_TYPE_DEFINITION ::=
+      --    [limited | task | protected | synchronized]
+      --    interface [interface_list]
+
+      --  Note: Interfaces are implemented with N_Record_Definition and
+      --        N_Derived_Type_Definition nodes because most of the support
+      --        for the analysis of abstract types has been reused to
+      --        analyze abstract interfaces.
+
       ----------------------------------
       -- 3.10  Access Type Definition --
       ----------------------------------
@@ -2676,7 +2693,7 @@ package Sinfo is
       --  N_Access_To_Object_Definition
       --  Sloc points to ACCESS
       --  All_Present (Flag15)
-      --  Null_Exclusion_Present (Flag9) (set to False if not present)
+      --  Null_Exclusion_Present (Flag11)
       --  Subtype_Indication (Node5)
       --  Constant_Present (Flag17)
 
@@ -2705,15 +2722,15 @@ package Sinfo is
 
       --  N_Access_Function_Definition
       --  Sloc points to ACCESS
-      --  Null_Exclusion_Present (Flag9) (set to False if not present)
-      --  Protected_Present (Flag15)
+      --  Null_Exclusion_Present (Flag11)
+      --  Protected_Present (Flag6)
       --  Parameter_Specifications (List3) (set to No_List if no formal part)
       --  Subtype_Mark (Node4) result subtype
 
       --  N_Access_Procedure_Definition
       --  Sloc points to ACCESS
-      --  Null_Exclusion_Present (Flag9) (set to False if not present)
-      --  Protected_Present (Flag15)
+      --  Null_Exclusion_Present (Flag11)
+      --  Protected_Present (Flag6)
       --  Parameter_Specifications (List3) (set to No_List if no formal part)
 
       -----------------------------
@@ -2728,7 +2745,7 @@ package Sinfo is
 
       --  N_Access_Definition
       --  Sloc points to ACCESS
-      --  Null_Exclusion_Present (Flag9) (set to False if not present)
+      --  Null_Exclusion_Present (Flag11)
       --  All_Present (Flag15)
       --  Constant_Present (Flag17)
       --  Subtype_Mark (Node4)
@@ -2933,11 +2950,11 @@ package Sinfo is
       --  i.e. digits, access, delta, range, the Attribute_Name field contains
       --  the corresponding name, even though no identifier is involved.
 
-      --  The flag OK_For_Stream is used in generated code to indicate that
-      --  a stream attribute is permissible for a limited type, and results
-      --  in the use of the stream attribute for the underlying full type,
-      --  or in the case of a protected type, the components (including any
-      --  disriminants) are merely streamed in order.
+      --  Note: the generated code may contain stream attributes applied to
+      --  limited types for which no stream routines exist officially. In such
+      --  case, the result is to use the stream attribute for the underlying
+      --  full type, or in the case of a protected type, the components
+      --  (including any disriminants) are merely streamed in order.
 
       --  See Exp_Attr for a complete description of which attributes are
       --  passed onto Gigi, and which are handled entirely by the front end.
@@ -2964,7 +2981,6 @@ package Sinfo is
       --  Associated_Node (Node4-Sem)
       --  Do_Overflow_Check (Flag17-Sem)
       --  Redundant_Use (Flag13-Sem)
-      --  OK_For_Stream (Flag4-Sem)
       --  Must_Be_Byte_Aligned (Flag14)
       --  plus fields for expression
 
@@ -3529,7 +3545,7 @@ package Sinfo is
       --  N_Allocator
       --  Sloc points to NEW
       --  Expression (Node3) subtype indication or qualified expression
-      --  Null_Exclusion_Present (Flag9) (set to False if not present)
+      --  Null_Exclusion_Present (Flag11)
       --  Storage_Pool (Node1-Sem)
       --  Procedure_To_Call (Node4-Sem)
       --  No_Initialization (Flag13-Sem)
@@ -3606,7 +3622,7 @@ package Sinfo is
       --  N_Label
       --  Sloc points to <<
       --  Identifier (Node1) direct name of statement identifier
-      --  Exception_Junk (Flag11-Sem)
+      --  Exception_Junk (Flag7-Sem)
 
       -------------------------------
       -- 5.1  Statement Identifier --
@@ -3846,7 +3862,7 @@ package Sinfo is
       --  N_Goto_Statement
       --  Sloc points to GOTO
       --  Name (Node2)
-      --  Exception_Junk (Flag11-Sem)
+      --  Exception_Junk (Flag7-Sem)
 
       ---------------------------------
       -- 6.1  Subprogram Declaration --
@@ -4044,7 +4060,7 @@ package Sinfo is
       --  Defining_Identifier (Node1)
       --  In_Present (Flag15)
       --  Out_Present (Flag17)
-      --  Null_Exclusion_Present (Flag9) (set to False if not present)
+      --  Null_Exclusion_Present (Flag11)
       --  Parameter_Type (Node2) subtype mark or access definition
       --  Expression (Node3) (set to Empty if no default expression present)
       --  Do_Accessibility_Check (Flag13-Sem)
@@ -4283,7 +4299,8 @@ package Sinfo is
 
       --  PRIVATE_EXTENSION_DECLARATION ::=
       --    type DEFINING_IDENTIFIER [DISCRIMINANT_PART] is
-      --      [abstract] new ancestor_SUBTYPE_INDICATION with private;
+      --      [abstract] new ancestor_SUBTYPE_INDICATION
+      --      [and INTERFACE_LIST] with private;
 
       --  Note: private extension declarations are not allowed in Ada 83 mode
 
@@ -4295,6 +4312,7 @@ package Sinfo is
       --  Unknown_Discriminants_Present (Flag13) set if (<>) discriminant
       --  Abstract_Present (Flag4)
       --  Subtype_Indication (Node5)
+      --  Interface_List (List2) (set to No_List if none)
 
       ---------------------
       -- 8.4  Use Clause --
@@ -4436,14 +4454,14 @@ package Sinfo is
 
       --  TASK_TYPE_DECLARATION ::=
       --    task type DEFINING_IDENTIFIER [KNOWN_DISCRIMINANT_PART]
-      --      [is TASK_DEFINITITION];
+      --      [is [new INTERFACE_LIST with] TASK_DEFINITITION];
 
       --  N_Task_Type_Declaration
       --  Sloc points to TASK
       --  Defining_Identifier (Node1)
-      --  Task_Body_Procedure (Node2-Sem)
       --  Discriminant_Specifications (List4) (set to No_List if no
       --   discriminant part)
+      --  Interface_List (List2) (set to No_List if none)
       --  Task_Definition (Node3) (set to Empty if not present)
       --  Corresponding_Body (Node5-Sem)
 
@@ -4517,7 +4535,7 @@ package Sinfo is
 
       --  PROTECTED_TYPE_DECLARATION ::=
       --    protected type DEFINING_IDENTIFIER [KNOWN_DISCRIMINANT_PART]
-      --      is PROTECTED_DEFINITION;
+      --      is [new INTERFACE_LIST with] PROTECTED_DEFINITION;
 
       --  Note: protected type declarations are not permitted in Ada 83 mode
 
@@ -4526,6 +4544,7 @@ package Sinfo is
       --  Defining_Identifier (Node1)
       --  Discriminant_Specifications (List4) (set to No_List if no
       --   discriminant part)
+      --  Interface_List (List2) (set to No_List if none)
       --  Protected_Definition (Node3)
       --  Corresponding_Body (Node5-Sem)
 
@@ -5393,9 +5412,14 @@ package Sinfo is
 
       --  RAISE_STATEMENT ::= raise [exception_NAME];
 
+      --  In Ada 2005, we have
+
+      --  RAISE_STATEMENT ::= raise; | raise exception_NAME [with EXPRESSION];
+
       --  N_Raise_Statement
       --  Sloc points to RAISE
       --  Name (Node2) (set to Empty if no exception name present)
+      --  Expression (Node3) (set to Empty if no expression present)
 
       -------------------------------
       -- 12.1  Generic Declaration --
@@ -5591,6 +5615,7 @@ package Sinfo is
       --  | FORMAL_DECIMAL_FIXED_POINT_DEFINITION
       --  | FORMAL_ARRAY_TYPE_DEFINITION
       --  | FORMAL_ACCESS_TYPE_DEFINITION
+      --  | FORMAL_INTERFACE_TYPE_DEFINITION
 
       ---------------------------------------------
       -- 12.5.1  Formal Private Type Definition --
@@ -5612,8 +5637,7 @@ package Sinfo is
       --------------------------------------------
 
       --  FORMAL_DERIVED_TYPE_DEFINITION ::=
-      --    [abstract] new SUBTYPE_MARK [with private]
-
+      --    [abstract] new SUBTYPE_MARK [[and INTERFACE_LIST] with private]
       --  Note: this construct is not allowed in Ada 83 mode
 
       --  N_Formal_Derived_Type_Definition
@@ -5621,6 +5645,7 @@ package Sinfo is
       --  Subtype_Mark (Node4)
       --  Private_Present (Flag15)
       --  Abstract_Present (Flag4)
+      --  Interface_List (List2) (set to No_List if none)
 
       ---------------------------------------------
       -- 12.5.2  Formal Discrete Type Definition --
@@ -5690,6 +5715,12 @@ package Sinfo is
 
       --  FORMAL_ACCESS_TYPE_DEFINITION ::= ACCESS_TYPE_DEFINITION
 
+      ----------------------------------------------
+      -- 12.5.5  Formal Interface Type Definition --
+      ----------------------------------------------
+
+      --  FORMAL_INTERFACE_TYPE_DEFINITION ::= INTERFACE_TYPE_DEFINITION
+
       -----------------------------------------
       -- 12.6  Formal Subprogram Declaration --
       -----------------------------------------
@@ -6503,6 +6534,7 @@ package Sinfo is
       N_Unused_At_Start,
 
       --  N_Representation_Clause
+
       N_At_Clause,
       N_Component_Clause,
       N_Enumeration_Representation_Clause,
@@ -6510,35 +6542,43 @@ package Sinfo is
       N_Record_Representation_Clause,
 
       --  N_Representation_Clause, N_Has_Chars
+
       N_Attribute_Definition_Clause,
 
       --  N_Has_Chars
+
       N_Empty,
       N_Pragma,
       N_Pragma_Argument_Association,
 
       --  N_Has_Etype
+
       N_Error,
 
       --  N_Entity, N_Has_Etype, N_Has_Chars
+
       N_Defining_Character_Literal,
       N_Defining_Identifier,
       N_Defining_Operator_Symbol,
 
       --  N_Subexpr, N_Has_Etype, N_Has_Chars, N_Has_Entity
+
       N_Expanded_Name,
 
       --  N_Direct_Name, N_Subexpr, N_Has_Etype,
       --  N_Has_Chars, N_Has_Entity
+
       N_Identifier,
       N_Operator_Symbol,
 
       --  N_Direct_Name, N_Subexpr, N_Has_Etype,
       --  N_Has_Chars, N_Has_Entity
+
       N_Character_Literal,
 
       --  N_Binary_Op, N_Op, N_Subexpr,
       --  N_Has_Etype, N_Has_Chars, N_Has_Entity
+
       N_Op_Add,
       N_Op_Concat,
       N_Op_Expon,
@@ -6554,11 +6594,12 @@ package Sinfo is
 
       --  N_Binary_Op, N_Op, N_Subexpr, N_Has_Etype
       --  N_Has_Entity, N_Has_Chars, N_Op_Boolean
+
       N_Op_And,
 
       --  N_Binary_Op, N_Op, N_Subexpr, N_Has_Etype
-      --  N_Has_Entity, N_Has_Chars, N_Op_Boolean,
-      --  N_Op_Compare
+      --  N_Has_Entity, N_Has_Chars, N_Op_Boolean, N_Op_Compare
+
       N_Op_Eq,
       N_Op_Ge,
       N_Op_Gt,
@@ -6568,11 +6609,13 @@ package Sinfo is
 
       --  N_Binary_Op, N_Op, N_Subexpr, N_Has_Etype
       --  N_Has_Entity, N_Has_Chars, N_Op_Boolean
+
       N_Op_Or,
       N_Op_Xor,
 
       --  N_Binary_Op, N_Op, N_Subexpr, N_Has_Etype,
       --  N_Op_Shift, N_Has_Chars, N_Has_Entity
+
       N_Op_Rotate_Left,
       N_Op_Rotate_Right,
       N_Op_Shift_Left,
@@ -6581,15 +6624,18 @@ package Sinfo is
 
       --  N_Unary_Op, N_Op, N_Subexpr, N_Has_Etype,
       --  N_Has_Chars, N_Has_Entity
+
       N_Op_Abs,
       N_Op_Minus,
       N_Op_Not,
       N_Op_Plus,
 
       --  N_Subexpr, N_Has_Etype, N_Has_Entity
+
       N_Attribute_Reference,
 
       --  N_Subexpr, N_Has_Etype
+
       N_And_Then,
       N_Conditional_Expression,
       N_Explicit_Dereference,
@@ -6626,9 +6672,11 @@ package Sinfo is
       N_Unchecked_Type_Conversion,
 
       --  N_Has_Etype
+
       N_Subtype_Indication,
 
       --  N_Declaration
+
       N_Component_Declaration,
       N_Entry_Declaration,
       N_Formal_Object_Declaration,
@@ -6643,40 +6691,44 @@ package Sinfo is
       N_Subtype_Declaration,
 
       --  N_Subprogram_Specification, N_Declaration
+
       N_Function_Specification,
       N_Procedure_Specification,
 
-      --  (nothing special)
-      N_Entry_Index_Specification,
-      N_Freeze_Entity,
-
       --  N_Access_To_Subprogram_Definition
+
       N_Access_Function_Definition,
       N_Access_Procedure_Definition,
 
-      --  N_Later_Decl_Item,
+      --  N_Later_Decl_Item
+
       N_Task_Type_Declaration,
 
       --  N_Body_Stub, N_Later_Decl_Item
+
       N_Package_Body_Stub,
       N_Protected_Body_Stub,
       N_Subprogram_Body_Stub,
       N_Task_Body_Stub,
 
       --  N_Generic_Instantiation, N_Later_Decl_Item
+
       N_Function_Instantiation,
       N_Package_Instantiation,
       N_Procedure_Instantiation,
 
       --  N_Unit_Body, N_Later_Decl_Item, N_Proper_Body
+
       N_Package_Body,
       N_Subprogram_Body,
 
       --  N_Later_Decl_Item, N_Proper_Body
+
       N_Protected_Body,
       N_Task_Body,
 
       --  N_Later_Decl_Item
+
       N_Implicit_Label_Declaration,
       N_Package_Declaration,
       N_Single_Task_Declaration,
@@ -6684,25 +6736,30 @@ package Sinfo is
       N_Use_Package_Clause,
 
       --  N_Generic_Declaration, N_Later_Decl_Item
+
       N_Generic_Package_Declaration,
       N_Generic_Subprogram_Declaration,
 
       --  N_Array_Type_Definition
+
       N_Constrained_Array_Definition,
       N_Unconstrained_Array_Definition,
 
       --  N_Renaming_Declaration
+
       N_Exception_Renaming_Declaration,
       N_Object_Renaming_Declaration,
       N_Package_Renaming_Declaration,
       N_Subprogram_Renaming_Declaration,
 
       --  N_Generic_Renaming_Declarations, N_Renaming_Declaration
+
       N_Generic_Function_Renaming_Declaration,
       N_Generic_Package_Renaming_Declaration,
       N_Generic_Procedure_Renaming_Declaration,
 
       --  N_Statement_Other_Than_Procedure_Call
+
       N_Abort_Statement,
       N_Accept_Statement,
       N_Assignment_Statement,
@@ -6725,10 +6782,12 @@ package Sinfo is
       N_Timed_Entry_Call,
 
       --  N_Statement_Other_Than_Procedure_Call, N_Has_Condition
+
       N_Exit_Statement,
       N_If_Statement,
 
       --  N_Has_Condition
+
       N_Accept_Alternative,
       N_Delay_Alternative,
       N_Elsif_Part,
@@ -6736,7 +6795,13 @@ package Sinfo is
       N_Iteration_Scheme,
       N_Terminate_Alternative,
 
+      --  N_Formal_Subprogram_Declaration
+
+      N_Formal_Abstract_Subprogram_Declaration,
+      N_Formal_Concrete_Subprogram_Declaration,
+
       --  Other nodes (not part of any subtype class)
+
       N_Abortable_Part,
       N_Abstract_Subprogram_Declaration,
       N_Access_Definition,
@@ -6758,11 +6823,10 @@ package Sinfo is
       N_Enumeration_Type_Definition,
       N_Entry_Body,
       N_Entry_Call_Alternative,
+      N_Entry_Index_Specification,
       N_Exception_Declaration,
       N_Exception_Handler,
       N_Floating_Point_Definition,
-      N_Formal_Abstract_Subprogram_Declaration,
-      N_Formal_Concrete_Subprogram_Declaration,
       N_Formal_Decimal_Fixed_Point_Definition,
       N_Formal_Derived_Type_Definition,
       N_Formal_Discrete_Type_Definition,
@@ -6772,6 +6836,7 @@ package Sinfo is
       N_Formal_Package_Declaration,
       N_Formal_Private_Type_Definition,
       N_Formal_Signed_Integer_Type_Definition,
+      N_Freeze_Entity,
       N_Generic_Association,
       N_Handled_Sequence_Of_Statements,
       N_Index_Or_Discriminant_Constraint,
@@ -7276,7 +7341,7 @@ package Sinfo is
      (N : Node_Id) return List_Id;    -- List5
 
    function Exception_Junk
-     (N : Node_Id) return Boolean;    -- Flag11
+     (N : Node_Id) return Boolean;    -- Flag7
 
    function Explicit_Actual_Parameter
      (N : Node_Id) return Node_Id;    -- Node3
@@ -7383,6 +7448,12 @@ package Sinfo is
    function Identifier
      (N : Node_Id) return Node_Id;    -- Node1
 
+   function Interface_List
+     (N : Node_Id) return List_Id;    -- List2
+
+   function Interface_Present
+     (N : Node_Id) return Boolean;    -- Flag16
+
    function Implicit_With
      (N : Node_Id) return Boolean;    -- Flag16
 
@@ -7531,7 +7602,7 @@ package Sinfo is
      (N : Node_Id) return Boolean;    -- Flag13
 
    function Null_Exclusion_Present
-     (N : Node_Id) return Boolean;    -- Flag9
+     (N : Node_Id) return Boolean;    -- Flag11
 
    function Null_Record_Present
      (N : Node_Id) return Boolean;    -- Flag17
@@ -7539,9 +7610,6 @@ package Sinfo is
    function Object_Definition
      (N : Node_Id) return Node_Id;    -- Node4
 
-   function OK_For_Stream
-     (N : Node_Id) return Boolean;    -- Flag4
-
    function Original_Discriminant
      (N : Node_Id) return Node_Id;    -- Node2
 
@@ -7609,7 +7677,7 @@ package Sinfo is
      (N : Node_Id) return Node_Id;    -- Node3
 
    function Protected_Present
-     (N : Node_Id) return Boolean;    -- Flag15
+     (N : Node_Id) return Boolean;    -- Flag6
 
    function Raises_Constraint_Error
      (N : Node_Id) return Boolean;    -- Flag7
@@ -7689,18 +7757,21 @@ package Sinfo is
    function Subtype_Marks
      (N : Node_Id) return List_Id;    -- List2
 
+   function Synchronized_Present
+     (N : Node_Id) return Boolean;    -- Flag7
+
    function Tagged_Present
      (N : Node_Id) return Boolean;    -- Flag15
 
    function Target_Type
      (N : Node_Id) return Entity_Id;  -- Node2
 
-   function Task_Body_Procedure
-     (N : Node_Id) return Entity_Id;  -- Node2
-
    function Task_Definition
      (N : Node_Id) return Node_Id;    -- Node3
 
+   function Task_Present
+     (N : Node_Id) return Boolean;    -- Flag5
+
    function Then_Actions
      (N : Node_Id) return List_Id;    -- List2
 
@@ -8071,7 +8142,7 @@ package Sinfo is
      (N : Node_Id; Val : List_Id);            -- List5
 
    procedure Set_Exception_Junk
-     (N : Node_Id; Val : Boolean := True);    -- Flag11
+     (N : Node_Id; Val : Boolean := True);    -- Flag7
 
    procedure Set_Expansion_Delayed
      (N : Node_Id; Val : Boolean := True);    -- Flag11
@@ -8178,6 +8249,12 @@ package Sinfo is
    procedure Set_Identifier
      (N : Node_Id; Val : Node_Id);            -- Node1
 
+   procedure Set_Interface_List
+     (N : Node_Id; Val : List_Id);            -- List2
+
+   procedure Set_Interface_Present
+     (N : Node_Id; Val : Boolean := True);    -- Flag16
+
    procedure Set_Implicit_With
      (N : Node_Id; Val : Boolean := True);    -- Flag16
 
@@ -8326,7 +8403,7 @@ package Sinfo is
      (N : Node_Id; Val : Boolean := True);    -- Flag13
 
    procedure Set_Null_Exclusion_Present
-     (N : Node_Id; Val : Boolean := True);    -- Flag9
+     (N : Node_Id; Val : Boolean := True);    -- Flag11
 
    procedure Set_Null_Record_Present
      (N : Node_Id; Val : Boolean := True);    -- Flag17
@@ -8334,9 +8411,6 @@ package Sinfo is
    procedure Set_Object_Definition
      (N : Node_Id; Val : Node_Id);            -- Node4
 
-   procedure Set_OK_For_Stream
-     (N : Node_Id; Val : Boolean := True);    -- Flag4
-
    procedure Set_Original_Discriminant
      (N : Node_Id; Val : Node_Id);            -- Node2
 
@@ -8404,7 +8478,7 @@ package Sinfo is
      (N : Node_Id; Val : Node_Id);            -- Node3
 
    procedure Set_Protected_Present
-     (N : Node_Id; Val : Boolean := True);    -- Flag15
+     (N : Node_Id; Val : Boolean := True);    -- Flag6
 
    procedure Set_Raises_Constraint_Error
      (N : Node_Id; Val : Boolean := True);    -- Flag7
@@ -8484,18 +8558,21 @@ package Sinfo is
    procedure Set_Subtype_Marks
      (N : Node_Id; Val : List_Id);            -- List2
 
+   procedure Set_Synchronized_Present
+     (N : Node_Id; Val : Boolean := True);    -- Flag7
+
    procedure Set_Tagged_Present
      (N : Node_Id; Val : Boolean := True);    -- Flag15
 
    procedure Set_Target_Type
      (N : Node_Id; Val : Entity_Id);          -- Node2
 
-   procedure Set_Task_Body_Procedure
-     (N : Node_Id; Val : Entity_Id);          -- Node2
-
    procedure Set_Task_Definition
      (N : Node_Id; Val : Node_Id);            -- Node3
 
+   procedure Set_Task_Present
+     (N : Node_Id; Val : Boolean := True);    -- Flag5
+
    procedure Set_Then_Actions
      (N : Node_Id; Val : List_Id);            -- List2
 
@@ -8713,6 +8790,8 @@ package Sinfo is
    pragma Inline (High_Bound);
    pragma Inline (Identifier);
    pragma Inline (Implicit_With);
+   pragma Inline (Interface_List);
+   pragma Inline (Interface_Present);
    pragma Inline (Includes_Infinities);
    pragma Inline (In_Present);
    pragma Inline (Instance_Spec);
@@ -8764,7 +8843,6 @@ package Sinfo is
    pragma Inline (Null_Exclusion_Present);
    pragma Inline (Null_Record_Present);
    pragma Inline (Object_Definition);
-   pragma Inline (OK_For_Stream);
    pragma Inline (Original_Discriminant);
    pragma Inline (Original_Entity);
    pragma Inline (Others_Discrete_Choices);
@@ -8814,10 +8892,11 @@ package Sinfo is
    pragma Inline (Subtype_Indication);
    pragma Inline (Subtype_Mark);
    pragma Inline (Subtype_Marks);
+   pragma Inline (Synchronized_Present);
    pragma Inline (Tagged_Present);
    pragma Inline (Target_Type);
-   pragma Inline (Task_Body_Procedure);
    pragma Inline (Task_Definition);
+   pragma Inline (Task_Present);
    pragma Inline (Then_Actions);
    pragma Inline (Then_Statements);
    pragma Inline (Triggering_Alternative);
@@ -8976,6 +9055,8 @@ package Sinfo is
    pragma Inline (Set_Identifier);
    pragma Inline (Set_Implicit_With);
    pragma Inline (Set_Includes_Infinities);
+   pragma Inline (Set_Interface_List);
+   pragma Inline (Set_Interface_Present);
    pragma Inline (Set_In_Present);
    pragma Inline (Set_Instance_Spec);
    pragma Inline (Set_Intval);
@@ -9025,7 +9106,6 @@ package Sinfo is
    pragma Inline (Set_Null_Exclusion_Present);
    pragma Inline (Set_Null_Record_Present);
    pragma Inline (Set_Object_Definition);
-   pragma Inline (Set_OK_For_Stream);
    pragma Inline (Set_Original_Discriminant);
    pragma Inline (Set_Original_Entity);
    pragma Inline (Set_Others_Discrete_Choices);
@@ -9075,10 +9155,11 @@ package Sinfo is
    pragma Inline (Set_Subtype_Indication);
    pragma Inline (Set_Subtype_Mark);
    pragma Inline (Set_Subtype_Marks);
+   pragma Inline (Set_Synchronized_Present);
    pragma Inline (Set_Tagged_Present);
    pragma Inline (Set_Target_Type);
-   pragma Inline (Set_Task_Body_Procedure);
    pragma Inline (Set_Task_Definition);
+   pragma Inline (Set_Task_Present);
    pragma Inline (Set_Then_Actions);
    pragma Inline (Set_Then_Statements);
    pragma Inline (Set_Triggering_Alternative);
index 046826f..6dedcab 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2004, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2005 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- --
@@ -26,6 +26,7 @@
 
 with Atree;    use Atree;
 with Einfo;    use Einfo;
+with Elists;   use Elists;
 with Lib;      use Lib;
 with Namet;    use Namet;
 with Nlists;   use Nlists;
@@ -169,11 +170,12 @@ package body Tbuild is
 
       return
         Unchecked_Convert_To (
-          New_Occurrence_Of (Etype (Access_Disp_Table (Full_Type)), Loc),
+          New_Occurrence_Of
+            (Etype (Node (First_Elmt (Access_Disp_Table (Full_Type)))), Loc),
           Make_Selected_Component (Loc,
             Prefix => New_Copy (Rec),
             Selector_Name =>
-              New_Reference_To (Tag_Component (Full_Type), Loc)));
+              New_Reference_To (First_Tag_Component (Full_Type), Loc)));
    end Make_DT_Access;
 
    -----------------------
@@ -183,9 +185,9 @@ package body Tbuild is
    function Make_DT_Component
      (Loc : Source_Ptr;
       Typ : Entity_Id;
-      I   : Positive) return Node_Id
+      N   : Positive) return Node_Id
    is
-      X : Node_Id;
+      X         : Node_Id;
       Full_Type : Entity_Id := Typ;
 
    begin
@@ -193,10 +195,12 @@ package body Tbuild is
          Full_Type := Underlying_Type (Typ);
       end if;
 
-      X := First_Component (
-             Designated_Type (Etype (Access_Disp_Table (Full_Type))));
+      X :=
+        First_Component
+          (Designated_Type
+             (Etype (Node (First_Elmt (Access_Disp_Table (Full_Type))))));
 
-      for J in 2 .. I loop
+      for J in 2 .. N loop
          X := Next_Component (X);
       end loop;
 
@@ -216,6 +220,7 @@ package body Tbuild is
    is
    begin
       Check_Restriction (No_Implicit_Conditionals, Node);
+
       return Make_If_Statement (Sloc (Node),
         Condition,
         Then_Statements,
@@ -234,7 +239,6 @@ package body Tbuild is
    is
       N : constant Node_Id :=
             Make_Implicit_Label_Declaration (Loc, Defining_Identifier);
-
    begin
       Set_Label_Construct (N, Label_Construct);
       return N;