diff options
-rw-r--r-- | gcc/ada/einfo.adb | 1681 | ||||
-rw-r--r-- | gcc/ada/einfo.ads | 3326 | ||||
-rw-r--r-- | gcc/ada/exp_ch5.adb | 1154 | ||||
-rw-r--r-- | gcc/ada/exp_ch6.adb | 918 | ||||
-rw-r--r-- | gcc/ada/exp_ch6.ads | 80 | ||||
-rw-r--r-- | gcc/ada/exp_ch8.adb | 17 | ||||
-rw-r--r-- | gcc/ada/rtsfind.adb | 330 | ||||
-rw-r--r-- | gcc/ada/s-finimp.adb | 130 | ||||
-rw-r--r-- | gcc/ada/s-finimp.ads | 94 | ||||
-rw-r--r-- | gcc/ada/s-taskin.ads | 23 | ||||
-rw-r--r-- | gcc/ada/s-tassta.adb | 79 | ||||
-rw-r--r-- | gcc/ada/s-tassta.ads | 20 | ||||
-rw-r--r-- | gcc/ada/sem_ch6.adb | 372 | ||||
-rw-r--r-- | gcc/ada/sem_ch6.ads | 23 |
14 files changed, 4576 insertions, 3671 deletions
diff --git a/gcc/ada/einfo.adb b/gcc/ada/einfo.adb index 51c97daaaeb..8707301143a 100644 --- a/gcc/ada/einfo.adb +++ b/gcc/ada/einfo.adb @@ -238,240 +238,240 @@ package body Einfo is -- are used for the flags Analyzed, Comes_From_Source, and Error_Posted, -- which are common to all nodes, including entity nodes. - -- Is_Frozen Flag4 - -- Has_Discriminants Flag5 - -- Is_Dispatching_Operation Flag6 - -- Is_Immediately_Visible Flag7 - -- In_Use Flag8 - -- Is_Potentially_Use_Visible Flag9 - -- Is_Public Flag10 - - -- Is_Inlined Flag11 - -- Is_Constrained Flag12 - -- Is_Generic_Type Flag13 - -- Depends_On_Private Flag14 - -- Is_Aliased Flag15 - -- Is_Volatile Flag16 - -- Is_Internal Flag17 - -- Has_Delayed_Freeze Flag18 - -- Is_Abstract Flag19 - -- Is_Concurrent_Record_Type Flag20 - - -- Has_Master_Entity Flag21 - -- Needs_No_Actuals Flag22 - -- Has_Storage_Size_Clause Flag23 - -- Is_Imported Flag24 - -- Is_Limited_Record Flag25 - -- Has_Completion Flag26 - -- Has_Pragma_Controlled Flag27 - -- Is_Statically_Allocated Flag28 - -- Has_Size_Clause Flag29 - -- Has_Task Flag30 - - -- Checks_May_Be_Suppressed Flag31 - -- Kill_Elaboration_Checks Flag32 - -- Kill_Range_Checks Flag33 - -- Kill_Tag_Checks Flag34 - -- Is_Class_Wide_Equivalent_Type Flag35 - -- Referenced_As_LHS Flag36 - -- Is_Known_Non_Null Flag37 - -- Can_Never_Be_Null Flag38 - -- Is_Overriding_Operation Flag39 - -- Body_Needed_For_SAL Flag40 - - -- Treat_As_Volatile Flag41 - -- Is_Controlled Flag42 - -- Has_Controlled_Component Flag43 - -- Is_Pure Flag44 - -- In_Private_Part Flag45 - -- Has_Alignment_Clause Flag46 - -- Has_Exit Flag47 - -- In_Package_Body Flag48 - -- Reachable Flag49 - -- Delay_Subprogram_Descriptors Flag50 - - -- Is_Packed Flag51 - -- Is_Entry_Formal Flag52 - -- Is_Private_Descendant Flag53 - -- Return_Present Flag54 - -- Is_Tagged_Type Flag55 - -- Has_Homonym Flag56 - -- Is_Hidden Flag57 - -- Non_Binary_Modulus Flag58 - -- Is_Preelaborated Flag59 - -- Is_Shared_Passive Flag60 - - -- Is_Remote_Types Flag61 - -- Is_Remote_Call_Interface Flag62 - -- Is_Character_Type Flag63 - -- Is_Intrinsic_Subprogram Flag64 - -- Has_Record_Rep_Clause Flag65 - -- Has_Enumeration_Rep_Clause Flag66 - -- Has_Small_Clause Flag67 - -- Has_Component_Size_Clause Flag68 - -- Is_Access_Constant Flag69 - -- Is_First_Subtype Flag70 - - -- Has_Completion_In_Body Flag71 - -- Has_Unknown_Discriminants Flag72 - -- Is_Child_Unit Flag73 - -- Is_CPP_Class Flag74 - -- Has_Non_Standard_Rep Flag75 - -- Is_Constructor Flag76 - -- Is_Thread_Body Flag77 - -- Is_Tag Flag78 - -- Has_All_Calls_Remote Flag79 - -- Is_Constr_Subt_For_U_Nominal Flag80 - - -- Is_Asynchronous Flag81 - -- Has_Gigi_Rep_Item Flag82 - -- Has_Machine_Radix_Clause Flag83 - -- Machine_Radix_10 Flag84 - -- Is_Atomic Flag85 - -- Has_Atomic_Components Flag86 - -- Has_Volatile_Components Flag87 - -- Discard_Names Flag88 - -- Is_Interrupt_Handler Flag89 - -- Returns_By_Ref Flag90 - - -- Is_Itype Flag91 - -- Size_Known_At_Compile_Time Flag92 - -- Has_Subprogram_Descriptor Flag93 - -- Is_Generic_Actual_Type Flag94 - -- Uses_Sec_Stack Flag95 - -- Warnings_Off Flag96 - -- Is_Controlling_Formal Flag97 - -- Has_Controlling_Result Flag98 - -- Is_Exported Flag99 - -- Has_Specified_Layout Flag100 - - -- Has_Nested_Block_With_Handler Flag101 - -- Is_Called Flag102 - -- Is_Completely_Hidden Flag103 - -- Address_Taken Flag104 - -- Suppress_Init_Proc Flag105 - -- Is_Limited_Composite Flag106 - -- Is_Private_Composite Flag107 - -- Default_Expressions_Processed Flag108 - -- Is_Non_Static_Subtype Flag109 - -- Has_External_Tag_Rep_Clause Flag110 - - -- Is_Formal_Subprogram Flag111 - -- Is_Renaming_Of_Object Flag112 - -- No_Return Flag113 - -- Delay_Cleanups Flag114 - -- Never_Set_In_Source Flag115 - -- Is_Visible_Child_Unit Flag116 - -- Is_Unchecked_Union Flag117 - -- Is_For_Access_Subtype Flag118 - -- Has_Convention_Pragma Flag119 - -- Has_Primitive_Operations Flag120 - - -- Has_Pragma_Pack Flag121 - -- Is_Bit_Packed_Array Flag122 - -- Has_Unchecked_Union Flag123 - -- Is_Eliminated Flag124 - -- C_Pass_By_Copy Flag125 - -- Is_Instantiated Flag126 - -- Is_Valued_Procedure Flag127 - -- (used for Component_Alignment) Flag128 - -- (used for Component_Alignment) Flag129 - -- Is_Generic_Instance Flag130 - - -- No_Pool_Assigned Flag131 - -- Is_AST_Entry Flag132 - -- Is_VMS_Exception Flag133 - -- Is_Optional_Parameter Flag134 - -- Has_Aliased_Components Flag135 - -- No_Strict_Aliasing Flag136 - -- Is_Machine_Code_Subprogram Flag137 - -- Is_Packed_Array_Type Flag138 - -- Has_Biased_Representation Flag139 - -- Has_Complex_Representation Flag140 - - -- Is_Constr_Subt_For_UN_Aliased Flag141 - -- Has_Missing_Return Flag142 - -- Has_Recursive_Call Flag143 - -- Is_Unsigned_Type Flag144 - -- Strict_Alignment Flag145 - -- (unused) Flag146 - -- Needs_Debug_Info Flag147 - -- Suppress_Elaboration_Warnings Flag148 - -- Is_Compilation_Unit Flag149 - -- Has_Pragma_Elaborate_Body Flag150 - - -- Vax_Float Flag151 - -- Entry_Accepted Flag152 - -- Is_Obsolescent Flag153 - -- Has_Per_Object_Constraint Flag154 - -- Has_Private_Declaration Flag155 - -- Referenced Flag156 - -- Has_Pragma_Inline Flag157 - -- Finalize_Storage_Only Flag158 - -- From_With_Type Flag159 - -- Is_Package_Body_Entity Flag160 - - -- Has_Qualified_Name Flag161 - -- Nonzero_Is_True Flag162 - -- Is_True_Constant Flag163 - -- Reverse_Bit_Order Flag164 - -- Suppress_Style_Checks Flag165 - -- Debug_Info_Off Flag166 - -- Sec_Stack_Needed_For_Return Flag167 - -- Materialize_Entity Flag168 - -- Function_Returns_With_DSP Flag169 - -- Is_Known_Valid Flag170 - - -- Is_Hidden_Open_Scope Flag171 - -- Has_Object_Size_Clause Flag172 - -- Has_Fully_Qualified_Name Flag173 - -- Elaboration_Entity_Required Flag174 - -- Has_Forward_Instantiation Flag175 - -- Is_Discrim_SO_Function Flag176 - -- Size_Depends_On_Discriminant Flag177 - -- Is_Null_Init_Proc Flag178 - -- Has_Pragma_Pure_Function Flag179 - -- Has_Pragma_Unreferenced Flag180 - - -- Has_Contiguous_Rep Flag181 - -- Has_Xref_Entry Flag182 - -- Must_Be_On_Byte_Boundary Flag183 - -- Has_Stream_Size_Clause Flag184 - -- Is_Ada_2005_Only Flag185 - -- Is_Interface Flag186 - -- Has_Constrained_Partial_View Flag187 - -- Has_Persistent_BSS Flag188 - -- Is_Pure_Unit_Access_Type Flag189 - -- Has_Specified_Stream_Input Flag190 - - -- Has_Specified_Stream_Output Flag191 - -- Has_Specified_Stream_Read Flag192 - -- Has_Specified_Stream_Write Flag193 - -- Is_Local_Anonymous_Access Flag194 - -- Is_Primitive_Wrapper Flag195 - -- Was_Hidden Flag196 - -- Is_Limited_Interface Flag197 - -- Is_Protected_Interface Flag198 - -- Is_Synchronized_Interface Flag199 - -- Is_Task_Interface Flag200 - - -- Has_Anon_Block_Suffix Flag201 - -- Itype_Printed Flag202 - -- Has_Pragma_Pure Flag203 - -- Is_Known_Null Flag204 - -- Low_Bound_Known Flag205 - -- Is_Visible_Formal Flag206 - -- Known_To_Have_Preelab_Init Flag207 - -- Must_Have_Preelab_Init Flag208 - -- Is_Return_Object Flag209 - -- Elaborate_Body_Desirable Flag210 - - -- Has_Static_Discriminants Flag211 - - -- (unused) Flag212 - -- (unused) Flag213 - -- (unused) Flag214 - -- (unused) Flag215 + -- Is_Frozen Flag4 + -- Has_Discriminants Flag5 + -- Is_Dispatching_Operation Flag6 + -- Is_Immediately_Visible Flag7 + -- In_Use Flag8 + -- Is_Potentially_Use_Visible Flag9 + -- Is_Public Flag10 + + -- Is_Inlined Flag11 + -- Is_Constrained Flag12 + -- Is_Generic_Type Flag13 + -- Depends_On_Private Flag14 + -- Is_Aliased Flag15 + -- Is_Volatile Flag16 + -- Is_Internal Flag17 + -- Has_Delayed_Freeze Flag18 + -- Is_Abstract_Subprogram Flag19 + -- Is_Concurrent_Record_Type Flag20 + + -- Has_Master_Entity Flag21 + -- Needs_No_Actuals Flag22 + -- Has_Storage_Size_Clause Flag23 + -- Is_Imported Flag24 + -- Is_Limited_Record Flag25 + -- Has_Completion Flag26 + -- Has_Pragma_Controlled Flag27 + -- Is_Statically_Allocated Flag28 + -- Has_Size_Clause Flag29 + -- Has_Task Flag30 + + -- Checks_May_Be_Suppressed Flag31 + -- Kill_Elaboration_Checks Flag32 + -- Kill_Range_Checks Flag33 + -- Kill_Tag_Checks Flag34 + -- Is_Class_Wide_Equivalent_Type Flag35 + -- Referenced_As_LHS Flag36 + -- Is_Known_Non_Null Flag37 + -- Can_Never_Be_Null Flag38 + -- Is_Overriding_Operation Flag39 + -- Body_Needed_For_SAL Flag40 + + -- Treat_As_Volatile Flag41 + -- Is_Controlled Flag42 + -- Has_Controlled_Component Flag43 + -- Is_Pure Flag44 + -- In_Private_Part Flag45 + -- Has_Alignment_Clause Flag46 + -- Has_Exit Flag47 + -- In_Package_Body Flag48 + -- Reachable Flag49 + -- Delay_Subprogram_Descriptors Flag50 + + -- Is_Packed Flag51 + -- Is_Entry_Formal Flag52 + -- Is_Private_Descendant Flag53 + -- Return_Present Flag54 + -- Is_Tagged_Type Flag55 + -- Has_Homonym Flag56 + -- Is_Hidden Flag57 + -- Non_Binary_Modulus Flag58 + -- Is_Preelaborated Flag59 + -- Is_Shared_Passive Flag60 + + -- Is_Remote_Types Flag61 + -- Is_Remote_Call_Interface Flag62 + -- Is_Character_Type Flag63 + -- Is_Intrinsic_Subprogram Flag64 + -- Has_Record_Rep_Clause Flag65 + -- Has_Enumeration_Rep_Clause Flag66 + -- Has_Small_Clause Flag67 + -- Has_Component_Size_Clause Flag68 + -- Is_Access_Constant Flag69 + -- Is_First_Subtype Flag70 + + -- Has_Completion_In_Body Flag71 + -- Has_Unknown_Discriminants Flag72 + -- Is_Child_Unit Flag73 + -- Is_CPP_Class Flag74 + -- Has_Non_Standard_Rep Flag75 + -- Is_Constructor Flag76 + -- Is_Thread_Body Flag77 + -- Is_Tag Flag78 + -- Has_All_Calls_Remote Flag79 + -- Is_Constr_Subt_For_U_Nominal Flag80 + + -- Is_Asynchronous Flag81 + -- Has_Gigi_Rep_Item Flag82 + -- Has_Machine_Radix_Clause Flag83 + -- Machine_Radix_10 Flag84 + -- Is_Atomic Flag85 + -- Has_Atomic_Components Flag86 + -- Has_Volatile_Components Flag87 + -- Discard_Names Flag88 + -- Is_Interrupt_Handler Flag89 + -- Returns_By_Ref Flag90 + + -- Is_Itype Flag91 + -- Size_Known_At_Compile_Time Flag92 + -- Has_Subprogram_Descriptor Flag93 + -- Is_Generic_Actual_Type Flag94 + -- Uses_Sec_Stack Flag95 + -- Warnings_Off Flag96 + -- Is_Controlling_Formal Flag97 + -- Has_Controlling_Result Flag98 + -- Is_Exported Flag99 + -- Has_Specified_Layout Flag100 + + -- Has_Nested_Block_With_Handler Flag101 + -- Is_Called Flag102 + -- Is_Completely_Hidden Flag103 + -- Address_Taken Flag104 + -- Suppress_Init_Proc Flag105 + -- Is_Limited_Composite Flag106 + -- Is_Private_Composite Flag107 + -- Default_Expressions_Processed Flag108 + -- Is_Non_Static_Subtype Flag109 + -- Has_External_Tag_Rep_Clause Flag110 + + -- Is_Formal_Subprogram Flag111 + -- Is_Renaming_Of_Object Flag112 + -- No_Return Flag113 + -- Delay_Cleanups Flag114 + -- Never_Set_In_Source Flag115 + -- Is_Visible_Child_Unit Flag116 + -- Is_Unchecked_Union Flag117 + -- Is_For_Access_Subtype Flag118 + -- Has_Convention_Pragma Flag119 + -- Has_Primitive_Operations Flag120 + + -- Has_Pragma_Pack Flag121 + -- Is_Bit_Packed_Array Flag122 + -- Has_Unchecked_Union Flag123 + -- Is_Eliminated Flag124 + -- C_Pass_By_Copy Flag125 + -- Is_Instantiated Flag126 + -- Is_Valued_Procedure Flag127 + -- (used for Component_Alignment) Flag128 + -- (used for Component_Alignment) Flag129 + -- Is_Generic_Instance Flag130 + + -- No_Pool_Assigned Flag131 + -- Is_AST_Entry Flag132 + -- Is_VMS_Exception Flag133 + -- Is_Optional_Parameter Flag134 + -- Has_Aliased_Components Flag135 + -- No_Strict_Aliasing Flag136 + -- Is_Machine_Code_Subprogram Flag137 + -- Is_Packed_Array_Type Flag138 + -- Has_Biased_Representation Flag139 + -- Has_Complex_Representation Flag140 + + -- Is_Constr_Subt_For_UN_Aliased Flag141 + -- Has_Missing_Return Flag142 + -- Has_Recursive_Call Flag143 + -- Is_Unsigned_Type Flag144 + -- Strict_Alignment Flag145 + -- Is_Abstract_Type Flag146 + -- Needs_Debug_Info Flag147 + -- Suppress_Elaboration_Warnings Flag148 + -- Is_Compilation_Unit Flag149 + -- Has_Pragma_Elaborate_Body Flag150 + + -- Vax_Float Flag151 + -- Entry_Accepted Flag152 + -- Is_Obsolescent Flag153 + -- Has_Per_Object_Constraint Flag154 + -- Has_Private_Declaration Flag155 + -- Referenced Flag156 + -- Has_Pragma_Inline Flag157 + -- Finalize_Storage_Only Flag158 + -- From_With_Type Flag159 + -- Is_Package_Body_Entity Flag160 + + -- Has_Qualified_Name Flag161 + -- Nonzero_Is_True Flag162 + -- Is_True_Constant Flag163 + -- Reverse_Bit_Order Flag164 + -- Suppress_Style_Checks Flag165 + -- Debug_Info_Off Flag166 + -- Sec_Stack_Needed_For_Return Flag167 + -- Materialize_Entity Flag168 + -- Function_Returns_With_DSP Flag169 + -- Is_Known_Valid Flag170 + + -- Is_Hidden_Open_Scope Flag171 + -- Has_Object_Size_Clause Flag172 + -- Has_Fully_Qualified_Name Flag173 + -- Elaboration_Entity_Required Flag174 + -- Has_Forward_Instantiation Flag175 + -- Is_Discrim_SO_Function Flag176 + -- Size_Depends_On_Discriminant Flag177 + -- Is_Null_Init_Proc Flag178 + -- Has_Pragma_Pure_Function Flag179 + -- Has_Pragma_Unreferenced Flag180 + + -- Has_Contiguous_Rep Flag181 + -- Has_Xref_Entry Flag182 + -- Must_Be_On_Byte_Boundary Flag183 + -- Has_Stream_Size_Clause Flag184 + -- Is_Ada_2005_Only Flag185 + -- Is_Interface Flag186 + -- Has_Constrained_Partial_View Flag187 + -- Has_Persistent_BSS Flag188 + -- Is_Pure_Unit_Access_Type Flag189 + -- Has_Specified_Stream_Input Flag190 + + -- Has_Specified_Stream_Output Flag191 + -- Has_Specified_Stream_Read Flag192 + -- Has_Specified_Stream_Write Flag193 + -- Is_Local_Anonymous_Access Flag194 + -- Is_Primitive_Wrapper Flag195 + -- Was_Hidden Flag196 + -- Is_Limited_Interface Flag197 + -- Is_Protected_Interface Flag198 + -- Is_Synchronized_Interface Flag199 + -- Is_Task_Interface Flag200 + + -- Has_Anon_Block_Suffix Flag201 + -- Itype_Printed Flag202 + -- Has_Pragma_Pure Flag203 + -- Is_Known_Null Flag204 + -- Low_Bound_Known Flag205 + -- Is_Visible_Formal Flag206 + -- Known_To_Have_Preelab_Init Flag207 + -- Must_Have_Preelab_Init Flag208 + -- Is_Return_Object Flag209 + -- Elaborate_Body_Desirable Flag210 + + -- Has_Static_Discriminants Flag211 + -- Has_Pragma_Unreferenced_Objects Flag212 + -- Requires_Overriding Flag213 + -- Has_RACW Flag214 + + -- (unused) Flag215 ----------------------- -- Local subprograms -- @@ -509,12 +509,7 @@ package body Einfo is 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 - or else Ekind (Id) = E_Class_Wide_Type); + pragma Assert (Is_Record_Type (Id)); return Elist25 (Id); end Abstract_Interfaces; @@ -956,9 +951,10 @@ package body Einfo is function Equivalent_Type (Id : E) return E is begin pragma Assert - (Ekind (Id) = E_Class_Wide_Subtype or else - Ekind (Id) = E_Access_Protected_Subprogram_Type or else - Ekind (Id) = E_Access_Subprogram_Type or else + (Ekind (Id) = E_Class_Wide_Subtype or else + Ekind (Id) = E_Access_Protected_Subprogram_Type or else + Ekind (Id) = E_Anonymous_Access_Protected_Subprogram_Type or else + Ekind (Id) = E_Access_Subprogram_Type or else Ekind (Id) = E_Exception_Type); return Node18 (Id); end Equivalent_Type; @@ -1019,11 +1015,13 @@ package body Einfo is function First_Index (Id : E) return N is begin + pragma Assert (Is_Array_Type (Id) or else Is_String_Type (Id)); return Node17 (Id); end First_Index; function First_Literal (Id : E) return E is begin + pragma Assert (Is_Enumeration_Type (Id)); return Node17 (Id); end First_Literal; @@ -1295,6 +1293,12 @@ package body Einfo is return Flag180 (Id); end Has_Pragma_Unreferenced; + function Has_Pragma_Unreferenced_Objects (Id : E) return B is + begin + pragma Assert (Is_Type (Id)); + return Flag212 (Id); + end Has_Pragma_Unreferenced_Objects; + function Has_Primitive_Operations (Id : E) return B is begin pragma Assert (Is_Type (Id)); @@ -1311,6 +1315,12 @@ package body Einfo is return Flag161 (Id); end Has_Qualified_Name; + function Has_RACW (Id : E) return B is + begin + pragma Assert (Ekind (Id) = E_Package); + return Flag214 (Id); + end Has_RACW; + function Has_Record_Rep_Clause (Id : E) return B is begin pragma Assert (Is_Record_Type (Id)); @@ -1449,10 +1459,17 @@ package body Einfo is return Node21 (Id); end Interface_Name; - function Is_Abstract (Id : E) return B is + function Is_Abstract_Subprogram (Id : E) return B is begin + pragma Assert (Is_Overloadable (Id)); return Flag19 (Id); - end Is_Abstract; + end Is_Abstract_Subprogram; + + function Is_Abstract_Type (Id : E) return B is + begin + pragma Assert (Is_Type (Id)); + return Flag146 (Id); + end Is_Abstract_Type; function Is_Local_Anonymous_Access (Id : E) return B is begin @@ -2003,6 +2020,7 @@ package body Einfo is function Master_Id (Id : E) return E is begin + pragma Assert (Is_Access_Type (Id)); return Node17 (Id); end Master_Id; @@ -2084,8 +2102,7 @@ package body Einfo is function Non_Limited_View (Id : E) return E is begin - pragma Assert (False - or else Ekind (Id) in Incomplete_Kind); + pragma Assert (Ekind (Id) in Incomplete_Kind); return Node17 (Id); end Non_Limited_View; @@ -2280,6 +2297,12 @@ package body Einfo is return Uint9 (Id); end Renaming_Map; + function Requires_Overriding (Id : E) return B is + begin + pragma Assert (Is_Overloadable (Id)); + return Flag213 (Id); + end Requires_Overriding; + function Return_Present (Id : E) return B is begin return Flag54 (Id); @@ -2476,6 +2499,11 @@ package body Einfo is return Ekind (Id) in Access_Kind; end Is_Access_Type; + function Is_Access_Protected_Subprogram_Type (Id : E) return B is + begin + return Ekind (Id) in Access_Protected_Kind; + end Is_Access_Protected_Subprogram_Type; + function Is_Array_Type (Id : E) return B is begin return Ekind (Id) in Array_Kind; @@ -2676,12 +2704,7 @@ package body Einfo is 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 - or else Ekind (Id) = E_Class_Wide_Type); + pragma Assert (Is_Record_Type (Id)); Set_Elist25 (Id, V); end Set_Abstract_Interfaces; @@ -3130,10 +3153,11 @@ package body Einfo is procedure Set_Equivalent_Type (Id : E; V : E) is begin pragma Assert - (Ekind (Id) = E_Class_Wide_Type or else - Ekind (Id) = E_Class_Wide_Subtype or else - Ekind (Id) = E_Access_Protected_Subprogram_Type or else - Ekind (Id) = E_Access_Subprogram_Type or else + (Ekind (Id) = E_Class_Wide_Type or else + Ekind (Id) = E_Class_Wide_Subtype or else + Ekind (Id) = E_Access_Protected_Subprogram_Type or else + Ekind (Id) = E_Anonymous_Access_Protected_Subprogram_Type or else + Ekind (Id) = E_Access_Subprogram_Type or else Ekind (Id) = E_Exception_Type); Set_Node18 (Id, V); end Set_Equivalent_Type; @@ -3194,11 +3218,13 @@ package body Einfo is procedure Set_First_Index (Id : E; V : N) is begin + pragma Assert (Is_Array_Type (Id) or else Is_String_Type (Id)); Set_Node17 (Id, V); end Set_First_Index; procedure Set_First_Literal (Id : E; V : E) is begin + pragma Assert (Is_Enumeration_Type (Id)); Set_Node17 (Id, V); end Set_First_Literal; @@ -3479,6 +3505,12 @@ package body Einfo is Set_Flag180 (Id, V); end Set_Has_Pragma_Unreferenced; + procedure Set_Has_Pragma_Unreferenced_Objects (Id : E; V : B := True) is + begin + pragma Assert (Is_Type (Id)); + Set_Flag212 (Id, V); + end Set_Has_Pragma_Unreferenced_Objects; + procedure Set_Has_Primitive_Operations (Id : E; V : B := True) is begin pragma Assert (Id = Base_Type (Id)); @@ -3495,6 +3527,12 @@ package body Einfo is Set_Flag161 (Id, V); end Set_Has_Qualified_Name; + procedure Set_Has_RACW (Id : E; V : B := True) is + begin + pragma Assert (Ekind (Id) = E_Package); + Set_Flag214 (Id, V); + end Set_Has_RACW; + procedure Set_Has_Record_Rep_Clause (Id : E; V : B := True) is begin pragma Assert (Id = Base_Type (Id)); @@ -3637,10 +3675,17 @@ package body Einfo is Set_Node21 (Id, V); end Set_Interface_Name; - procedure Set_Is_Abstract (Id : E; V : B := True) is + procedure Set_Is_Abstract_Subprogram (Id : E; V : B := True) is begin + pragma Assert (Is_Overloadable (Id)); Set_Flag19 (Id, V); - end Set_Is_Abstract; + end Set_Is_Abstract_Subprogram; + + procedure Set_Is_Abstract_Type (Id : E; V : B := True) is + begin + pragma Assert (Is_Type (Id)); + Set_Flag146 (Id, V); + end Set_Is_Abstract_Type; procedure Set_Is_Local_Anonymous_Access (Id : E; V : B := True) is begin @@ -4219,6 +4264,7 @@ package body Einfo is procedure Set_Master_Id (Id : E; V : E) is begin + pragma Assert (Is_Access_Type (Id)); Set_Node17 (Id, V); end Set_Master_Id; @@ -4304,8 +4350,7 @@ package body Einfo is procedure Set_Non_Limited_View (Id : E; V : E) is begin - pragma Assert (False - or else Ekind (Id) in Incomplete_Kind); + pragma Assert (Ekind (Id) in Incomplete_Kind); Set_Node17 (Id, V); end Set_Non_Limited_View; @@ -4502,6 +4547,12 @@ package body Einfo is Set_Uint9 (Id, V); end Set_Renaming_Map; + procedure Set_Requires_Overriding (Id : E; V : B := True) is + begin + pragma Assert (Is_Overloadable (Id)); + Set_Flag213 (Id, V); + end Set_Requires_Overriding; + procedure Set_Return_Present (Id : E; V : B := True) is begin Set_Flag54 (Id, V); @@ -5252,7 +5303,7 @@ package body Einfo is end Entry_Index_Type; --------------------- - -- 1 -- + -- First_Component -- --------------------- function First_Component (Id : E) return E is @@ -5271,6 +5322,28 @@ package body Einfo is return Comp_Id; end First_Component; + ------------------------------------- + -- First_Component_Or_Discriminant -- + ------------------------------------- + + function First_Component_Or_Discriminant (Id : E) return E is + Comp_Id : E; + + begin + pragma Assert + (Is_Record_Type (Id) or else Is_Incomplete_Or_Private_Type (Id)); + + Comp_Id := First_Entity (Id); + while Present (Comp_Id) loop + exit when Ekind (Comp_Id) = E_Component + or else + Ekind (Comp_Id) = E_Discriminant; + Comp_Id := Next_Entity (Comp_Id); + end loop; + + return Comp_Id; + end First_Component_Or_Discriminant; + ------------------------ -- First_Discriminant -- ------------------------ @@ -6132,6 +6205,25 @@ package body Einfo is return Comp_Id; end Next_Component; + ------------------------------------ + -- Next_Component_Or_Discriminant -- + ------------------------------------ + + function Next_Component_Or_Discriminant (Id : E) return E is + Comp_Id : E; + + begin + Comp_Id := Next_Entity (Id); + while Present (Comp_Id) loop + exit when Ekind (Comp_Id) = E_Component + or else + Ekind (Comp_Id) = E_Discriminant; + Comp_Id := Next_Entity (Comp_Id); + end loop; + + return Comp_Id; + end Next_Component_Or_Discriminant; + ----------------------- -- Next_Discriminant -- ----------------------- @@ -6182,10 +6274,10 @@ package body Einfo is P : E; begin - -- Follow the chain of declared entities as long as the kind of - -- the entity corresponds to a formal parameter. Skip internal - -- entities that may have been created for implicit subtypes, - -- in the process of analyzing default expressions. + -- Follow the chain of declared entities as long as the kind of the + -- entity corresponds to a formal parameter. Skip internal entities + -- that may have been created for implicit subtypes, in the process + -- of analyzing default expressions. P := Id; @@ -6765,210 +6857,214 @@ package body Einfo is Write_Eol; end if; - W ("Address_Taken", Flag104 (Id)); - W ("Body_Needed_For_SAL", Flag40 (Id)); - W ("C_Pass_By_Copy", Flag125 (Id)); - W ("Can_Never_Be_Null", Flag38 (Id)); - W ("Checks_May_Be_Suppressed", Flag31 (Id)); - W ("Debug_Info_Off", Flag166 (Id)); - W ("Default_Expressions_Processed", Flag108 (Id)); - W ("Delay_Cleanups", Flag114 (Id)); - W ("Delay_Subprogram_Descriptors", Flag50 (Id)); - W ("Depends_On_Private", Flag14 (Id)); - W ("Discard_Names", Flag88 (Id)); - W ("Elaboration_Entity_Required", Flag174 (Id)); - W ("Elaborate_Body_Desirable", Flag210 (Id)); - W ("Entry_Accepted", Flag152 (Id)); - W ("Finalize_Storage_Only", Flag158 (Id)); - W ("From_With_Type", Flag159 (Id)); - W ("Function_Returns_With_DSP", Flag169 (Id)); - W ("Has_Aliased_Components", Flag135 (Id)); - W ("Has_Alignment_Clause", Flag46 (Id)); - W ("Has_All_Calls_Remote", Flag79 (Id)); - W ("Has_Anon_Block_Suffix", Flag201 (Id)); - W ("Has_Atomic_Components", Flag86 (Id)); - W ("Has_Biased_Representation", Flag139 (Id)); - W ("Has_Completion", Flag26 (Id)); - W ("Has_Completion_In_Body", Flag71 (Id)); - W ("Has_Complex_Representation", Flag140 (Id)); - W ("Has_Component_Size_Clause", Flag68 (Id)); - W ("Has_Contiguous_Rep", Flag181 (Id)); - W ("Has_Controlled_Component", Flag43 (Id)); - W ("Has_Controlling_Result", Flag98 (Id)); - W ("Has_Convention_Pragma", Flag119 (Id)); - W ("Has_Delayed_Freeze", Flag18 (Id)); - W ("Has_Discriminants", Flag5 (Id)); - W ("Has_Enumeration_Rep_Clause", Flag66 (Id)); - W ("Has_Exit", Flag47 (Id)); - W ("Has_External_Tag_Rep_Clause", Flag110 (Id)); - W ("Has_Forward_Instantiation", Flag175 (Id)); - W ("Has_Fully_Qualified_Name", Flag173 (Id)); - W ("Has_Gigi_Rep_Item", Flag82 (Id)); - W ("Has_Homonym", Flag56 (Id)); - W ("Has_Machine_Radix_Clause", Flag83 (Id)); - W ("Has_Master_Entity", Flag21 (Id)); - W ("Has_Missing_Return", Flag142 (Id)); - W ("Has_Nested_Block_With_Handler", Flag101 (Id)); - W ("Has_Non_Standard_Rep", Flag75 (Id)); - W ("Has_Object_Size_Clause", Flag172 (Id)); - W ("Has_Per_Object_Constraint", Flag154 (Id)); - W ("Has_Persistent_BSS", Flag188 (Id)); - W ("Has_Pragma_Controlled", Flag27 (Id)); - W ("Has_Pragma_Elaborate_Body", Flag150 (Id)); - W ("Has_Pragma_Inline", Flag157 (Id)); - W ("Has_Pragma_Pack", Flag121 (Id)); - W ("Has_Pragma_Pure", Flag203 (Id)); - W ("Has_Pragma_Pure_Function", Flag179 (Id)); - W ("Has_Pragma_Unreferenced", Flag180 (Id)); - W ("Has_Primitive_Operations", Flag120 (Id)); - W ("Has_Private_Declaration", Flag155 (Id)); - W ("Has_Qualified_Name", Flag161 (Id)); - W ("Has_Record_Rep_Clause", Flag65 (Id)); - W ("Has_Recursive_Call", Flag143 (Id)); - W ("Has_Size_Clause", Flag29 (Id)); - W ("Has_Small_Clause", Flag67 (Id)); - W ("Has_Specified_Layout", Flag100 (Id)); - W ("Has_Specified_Stream_Input", Flag190 (Id)); - W ("Has_Specified_Stream_Output", Flag191 (Id)); - W ("Has_Specified_Stream_Read", Flag192 (Id)); - W ("Has_Specified_Stream_Write", Flag193 (Id)); - W ("Has_Static_Discriminants", Flag211 (Id)); - W ("Has_Storage_Size_Clause", Flag23 (Id)); - W ("Has_Stream_Size_Clause", Flag184 (Id)); - W ("Has_Subprogram_Descriptor", Flag93 (Id)); - W ("Has_Task", Flag30 (Id)); - W ("Has_Unchecked_Union", Flag123 (Id)); - W ("Has_Unknown_Discriminants", Flag72 (Id)); - W ("Has_Volatile_Components", Flag87 (Id)); - W ("Has_Xref_Entry", Flag182 (Id)); - W ("In_Package_Body", Flag48 (Id)); - W ("In_Private_Part", Flag45 (Id)); - W ("In_Use", Flag8 (Id)); - W ("Is_AST_Entry", Flag132 (Id)); - W ("Is_Abstract", Flag19 (Id)); - W ("Is_Local_Anonymous_Access", Flag194 (Id)); - W ("Is_Access_Constant", Flag69 (Id)); - W ("Is_Ada_2005_Only", Flag185 (Id)); - W ("Is_Aliased", Flag15 (Id)); - W ("Is_Asynchronous", Flag81 (Id)); - W ("Is_Atomic", Flag85 (Id)); - W ("Is_Bit_Packed_Array", Flag122 (Id)); - W ("Is_CPP_Class", Flag74 (Id)); - W ("Is_Called", Flag102 (Id)); - W ("Is_Character_Type", Flag63 (Id)); - W ("Is_Child_Unit", Flag73 (Id)); - W ("Is_Class_Wide_Equivalent_Type", Flag35 (Id)); - W ("Is_Compilation_Unit", Flag149 (Id)); - W ("Is_Completely_Hidden", Flag103 (Id)); - W ("Is_Concurrent_Record_Type", Flag20 (Id)); - W ("Is_Constr_Subt_For_UN_Aliased", Flag141 (Id)); - W ("Is_Constr_Subt_For_U_Nominal", Flag80 (Id)); - W ("Is_Constrained", Flag12 (Id)); - W ("Is_Constructor", Flag76 (Id)); - W ("Is_Controlled", Flag42 (Id)); - W ("Is_Controlling_Formal", Flag97 (Id)); - W ("Is_Discrim_SO_Function", Flag176 (Id)); - W ("Is_Dispatching_Operation", Flag6 (Id)); - W ("Is_Eliminated", Flag124 (Id)); - W ("Is_Entry_Formal", Flag52 (Id)); - W ("Is_Exported", Flag99 (Id)); - W ("Is_First_Subtype", Flag70 (Id)); - W ("Is_For_Access_Subtype", Flag118 (Id)); - W ("Is_Formal_Subprogram", Flag111 (Id)); - W ("Is_Frozen", Flag4 (Id)); - W ("Is_Generic_Actual_Type", Flag94 (Id)); - W ("Is_Generic_Instance", Flag130 (Id)); - W ("Is_Generic_Type", Flag13 (Id)); - W ("Is_Hidden", Flag57 (Id)); - W ("Is_Hidden_Open_Scope", Flag171 (Id)); - W ("Is_Immediately_Visible", Flag7 (Id)); - 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)); - W ("Is_Itype", Flag91 (Id)); - W ("Is_Known_Non_Null", Flag37 (Id)); - W ("Is_Known_Null", Flag204 (Id)); - W ("Is_Known_Valid", Flag170 (Id)); - W ("Is_Limited_Composite", Flag106 (Id)); - W ("Is_Limited_Interface", Flag197 (Id)); - W ("Is_Limited_Record", Flag25 (Id)); - W ("Is_Machine_Code_Subprogram", Flag137 (Id)); - W ("Is_Non_Static_Subtype", Flag109 (Id)); - W ("Is_Null_Init_Proc", Flag178 (Id)); - W ("Is_Obsolescent", Flag153 (Id)); - W ("Is_Optional_Parameter", Flag134 (Id)); - W ("Is_Overriding_Operation", Flag39 (Id)); - W ("Is_Package_Body_Entity", Flag160 (Id)); - W ("Is_Packed", Flag51 (Id)); - W ("Is_Packed_Array_Type", Flag138 (Id)); - W ("Is_Potentially_Use_Visible", Flag9 (Id)); - W ("Is_Preelaborated", Flag59 (Id)); - W ("Is_Primitive_Wrapper", Flag195 (Id)); - W ("Is_Private_Composite", Flag107 (Id)); - W ("Is_Private_Descendant", Flag53 (Id)); - W ("Is_Protected_Interface", Flag198 (Id)); - W ("Is_Public", Flag10 (Id)); - W ("Is_Pure", Flag44 (Id)); - W ("Is_Pure_Unit_Access_Type", Flag189 (Id)); - W ("Is_Remote_Call_Interface", Flag62 (Id)); - W ("Is_Remote_Types", Flag61 (Id)); - W ("Is_Renaming_Of_Object", Flag112 (Id)); - W ("Is_Return_Object", Flag209 (Id)); - W ("Is_Shared_Passive", Flag60 (Id)); - W ("Is_Synchronized_Interface", Flag199 (Id)); - W ("Is_Statically_Allocated", Flag28 (Id)); - W ("Is_Tag", Flag78 (Id)); - W ("Is_Tagged_Type", Flag55 (Id)); - W ("Is_Task_Interface", Flag200 (Id)); - W ("Is_Thread_Body", Flag77 (Id)); - W ("Is_True_Constant", Flag163 (Id)); - W ("Is_Unchecked_Union", Flag117 (Id)); - W ("Is_Unsigned_Type", Flag144 (Id)); - W ("Is_VMS_Exception", Flag133 (Id)); - W ("Is_Valued_Procedure", Flag127 (Id)); - W ("Is_Visible_Child_Unit", Flag116 (Id)); - W ("Is_Visible_Formal", Flag206 (Id)); - W ("Is_Volatile", Flag16 (Id)); - W ("Itype_Printed", Flag202 (Id)); - W ("Kill_Elaboration_Checks", Flag32 (Id)); - W ("Kill_Range_Checks", Flag33 (Id)); - W ("Kill_Tag_Checks", Flag34 (Id)); - W ("Known_To_Have_Preelab_Init", Flag207 (Id)); - W ("Low_Bound_Known", Flag205 (Id)); - W ("Machine_Radix_10", Flag84 (Id)); - W ("Materialize_Entity", Flag168 (Id)); - W ("Must_Be_On_Byte_Boundary", Flag183 (Id)); - W ("Must_Have_Preelab_Init", Flag208 (Id)); - W ("Needs_Debug_Info", Flag147 (Id)); - W ("Needs_No_Actuals", Flag22 (Id)); - W ("Never_Set_In_Source", Flag115 (Id)); - W ("No_Pool_Assigned", Flag131 (Id)); - W ("No_Return", Flag113 (Id)); - W ("No_Strict_Aliasing", Flag136 (Id)); - W ("Non_Binary_Modulus", Flag58 (Id)); - W ("Nonzero_Is_True", Flag162 (Id)); - W ("Reachable", Flag49 (Id)); - W ("Referenced", Flag156 (Id)); - W ("Referenced_As_LHS", Flag36 (Id)); - W ("Return_Present", Flag54 (Id)); - W ("Returns_By_Ref", Flag90 (Id)); - W ("Reverse_Bit_Order", Flag164 (Id)); - W ("Sec_Stack_Needed_For_Return", Flag167 (Id)); - W ("Size_Depends_On_Discriminant", Flag177 (Id)); - W ("Size_Known_At_Compile_Time", Flag92 (Id)); - W ("Strict_Alignment", Flag145 (Id)); - W ("Suppress_Elaboration_Warnings", Flag148 (Id)); - W ("Suppress_Init_Proc", Flag105 (Id)); - W ("Suppress_Style_Checks", Flag165 (Id)); - W ("Treat_As_Volatile", Flag41 (Id)); - W ("Uses_Sec_Stack", Flag95 (Id)); - W ("Vax_Float", Flag151 (Id)); - W ("Warnings_Off", Flag96 (Id)); - W ("Was_Hidden", Flag196 (Id)); + W ("Address_Taken", Flag104 (Id)); + W ("Body_Needed_For_SAL", Flag40 (Id)); + W ("C_Pass_By_Copy", Flag125 (Id)); + W ("Can_Never_Be_Null", Flag38 (Id)); + W ("Checks_May_Be_Suppressed", Flag31 (Id)); + W ("Debug_Info_Off", Flag166 (Id)); + W ("Default_Expressions_Processed", Flag108 (Id)); + W ("Delay_Cleanups", Flag114 (Id)); + W ("Delay_Subprogram_Descriptors", Flag50 (Id)); + W ("Depends_On_Private", Flag14 (Id)); + W ("Discard_Names", Flag88 (Id)); + W ("Elaboration_Entity_Required", Flag174 (Id)); + W ("Elaborate_Body_Desirable", Flag210 (Id)); + W ("Entry_Accepted", Flag152 (Id)); + W ("Finalize_Storage_Only", Flag158 (Id)); + W ("From_With_Type", Flag159 (Id)); + W ("Function_Returns_With_DSP", Flag169 (Id)); + W ("Has_Aliased_Components", Flag135 (Id)); + W ("Has_Alignment_Clause", Flag46 (Id)); + W ("Has_All_Calls_Remote", Flag79 (Id)); + W ("Has_Anon_Block_Suffix", Flag201 (Id)); + W ("Has_Atomic_Components", Flag86 (Id)); + W ("Has_Biased_Representation", Flag139 (Id)); + W ("Has_Completion", Flag26 (Id)); + W ("Has_Completion_In_Body", Flag71 (Id)); + W ("Has_Complex_Representation", Flag140 (Id)); + W ("Has_Component_Size_Clause", Flag68 (Id)); + W ("Has_Contiguous_Rep", Flag181 (Id)); + W ("Has_Controlled_Component", Flag43 (Id)); + W ("Has_Controlling_Result", Flag98 (Id)); + W ("Has_Convention_Pragma", Flag119 (Id)); + W ("Has_Delayed_Freeze", Flag18 (Id)); + W ("Has_Discriminants", Flag5 (Id)); + W ("Has_Enumeration_Rep_Clause", Flag66 (Id)); + W ("Has_Exit", Flag47 (Id)); + W ("Has_External_Tag_Rep_Clause", Flag110 (Id)); + W ("Has_Forward_Instantiation", Flag175 (Id)); + W ("Has_Fully_Qualified_Name", Flag173 (Id)); + W ("Has_Gigi_Rep_Item", Flag82 (Id)); + W ("Has_Homonym", Flag56 (Id)); + W ("Has_Machine_Radix_Clause", Flag83 (Id)); + W ("Has_Master_Entity", Flag21 (Id)); + W ("Has_Missing_Return", Flag142 (Id)); + W ("Has_Nested_Block_With_Handler", Flag101 (Id)); + W ("Has_Non_Standard_Rep", Flag75 (Id)); + W ("Has_Object_Size_Clause", Flag172 (Id)); + W ("Has_Per_Object_Constraint", Flag154 (Id)); + W ("Has_Persistent_BSS", Flag188 (Id)); + W ("Has_Pragma_Controlled", Flag27 (Id)); + W ("Has_Pragma_Elaborate_Body", Flag150 (Id)); + W ("Has_Pragma_Inline", Flag157 (Id)); + W ("Has_Pragma_Pack", Flag121 (Id)); + W ("Has_Pragma_Pure", Flag203 (Id)); + W ("Has_Pragma_Pure_Function", Flag179 (Id)); + W ("Has_Pragma_Unreferenced", Flag180 (Id)); + W ("Has_Pragma_Unreferenced_Objects", Flag212 (Id)); + W ("Has_Primitive_Operations", Flag120 (Id)); + W ("Has_Private_Declaration", Flag155 (Id)); + W ("Has_Qualified_Name", Flag161 (Id)); + W ("Has_RACW", Flag214 (Id)); + W ("Has_Record_Rep_Clause", Flag65 (Id)); + W ("Has_Recursive_Call", Flag143 (Id)); + W ("Has_Size_Clause", Flag29 (Id)); + W ("Has_Small_Clause", Flag67 (Id)); + W ("Has_Specified_Layout", Flag100 (Id)); + W ("Has_Specified_Stream_Input", Flag190 (Id)); + W ("Has_Specified_Stream_Output", Flag191 (Id)); + W ("Has_Specified_Stream_Read", Flag192 (Id)); + W ("Has_Specified_Stream_Write", Flag193 (Id)); + W ("Has_Static_Discriminants", Flag211 (Id)); + W ("Has_Storage_Size_Clause", Flag23 (Id)); + W ("Has_Stream_Size_Clause", Flag184 (Id)); + W ("Has_Subprogram_Descriptor", Flag93 (Id)); + W ("Has_Task", Flag30 (Id)); + W ("Has_Unchecked_Union", Flag123 (Id)); + W ("Has_Unknown_Discriminants", Flag72 (Id)); + W ("Has_Volatile_Components", Flag87 (Id)); + W ("Has_Xref_Entry", Flag182 (Id)); + W ("In_Package_Body", Flag48 (Id)); + W ("In_Private_Part", Flag45 (Id)); + W ("In_Use", Flag8 (Id)); + W ("Is_AST_Entry", Flag132 (Id)); + W ("Is_Abstract_Subprogram", Flag19 (Id)); + W ("Is_Abstract_Type", Flag146 (Id)); + W ("Is_Local_Anonymous_Access", Flag194 (Id)); + W ("Is_Access_Constant", Flag69 (Id)); + W ("Is_Ada_2005_Only", Flag185 (Id)); + W ("Is_Aliased", Flag15 (Id)); + W ("Is_Asynchronous", Flag81 (Id)); + W ("Is_Atomic", Flag85 (Id)); + W ("Is_Bit_Packed_Array", Flag122 (Id)); + W ("Is_CPP_Class", Flag74 (Id)); + W ("Is_Called", Flag102 (Id)); + W ("Is_Character_Type", Flag63 (Id)); + W ("Is_Child_Unit", Flag73 (Id)); + W ("Is_Class_Wide_Equivalent_Type", Flag35 (Id)); + W ("Is_Compilation_Unit", Flag149 (Id)); + W ("Is_Completely_Hidden", Flag103 (Id)); + W ("Is_Concurrent_Record_Type", Flag20 (Id)); + W ("Is_Constr_Subt_For_UN_Aliased", Flag141 (Id)); + W ("Is_Constr_Subt_For_U_Nominal", Flag80 (Id)); + W ("Is_Constrained", Flag12 (Id)); + W ("Is_Constructor", Flag76 (Id)); + W ("Is_Controlled", Flag42 (Id)); + W ("Is_Controlling_Formal", Flag97 (Id)); + W ("Is_Discrim_SO_Function", Flag176 (Id)); + W ("Is_Dispatching_Operation", Flag6 (Id)); + W ("Is_Eliminated", Flag124 (Id)); + W ("Is_Entry_Formal", Flag52 (Id)); + W ("Is_Exported", Flag99 (Id)); + W ("Is_First_Subtype", Flag70 (Id)); + W ("Is_For_Access_Subtype", Flag118 (Id)); + W ("Is_Formal_Subprogram", Flag111 (Id)); + W ("Is_Frozen", Flag4 (Id)); + W ("Is_Generic_Actual_Type", Flag94 (Id)); + W ("Is_Generic_Instance", Flag130 (Id)); + W ("Is_Generic_Type", Flag13 (Id)); + W ("Is_Hidden", Flag57 (Id)); + W ("Is_Hidden_Open_Scope", Flag171 (Id)); + W ("Is_Immediately_Visible", Flag7 (Id)); + 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)); + W ("Is_Itype", Flag91 (Id)); + W ("Is_Known_Non_Null", Flag37 (Id)); + W ("Is_Known_Null", Flag204 (Id)); + W ("Is_Known_Valid", Flag170 (Id)); + W ("Is_Limited_Composite", Flag106 (Id)); + W ("Is_Limited_Interface", Flag197 (Id)); + W ("Is_Limited_Record", Flag25 (Id)); + W ("Is_Machine_Code_Subprogram", Flag137 (Id)); + W ("Is_Non_Static_Subtype", Flag109 (Id)); + W ("Is_Null_Init_Proc", Flag178 (Id)); + W ("Is_Obsolescent", Flag153 (Id)); + W ("Is_Optional_Parameter", Flag134 (Id)); + W ("Is_Overriding_Operation", Flag39 (Id)); + W ("Is_Package_Body_Entity", Flag160 (Id)); + W ("Is_Packed", Flag51 (Id)); + W ("Is_Packed_Array_Type", Flag138 (Id)); + W ("Is_Potentially_Use_Visible", Flag9 (Id)); + W ("Is_Preelaborated", Flag59 (Id)); + W ("Is_Primitive_Wrapper", Flag195 (Id)); + W ("Is_Private_Composite", Flag107 (Id)); + W ("Is_Private_Descendant", Flag53 (Id)); + W ("Is_Protected_Interface", Flag198 (Id)); + W ("Is_Public", Flag10 (Id)); + W ("Is_Pure", Flag44 (Id)); + W ("Is_Pure_Unit_Access_Type", Flag189 (Id)); + W ("Is_Remote_Call_Interface", Flag62 (Id)); + W ("Is_Remote_Types", Flag61 (Id)); + W ("Is_Renaming_Of_Object", Flag112 (Id)); + W ("Is_Return_Object", Flag209 (Id)); + W ("Is_Shared_Passive", Flag60 (Id)); + W ("Is_Synchronized_Interface", Flag199 (Id)); + W ("Is_Statically_Allocated", Flag28 (Id)); + W ("Is_Tag", Flag78 (Id)); + W ("Is_Tagged_Type", Flag55 (Id)); + W ("Is_Task_Interface", Flag200 (Id)); + W ("Is_Thread_Body", Flag77 (Id)); + W ("Is_True_Constant", Flag163 (Id)); + W ("Is_Unchecked_Union", Flag117 (Id)); + W ("Is_Unsigned_Type", Flag144 (Id)); + W ("Is_VMS_Exception", Flag133 (Id)); + W ("Is_Valued_Procedure", Flag127 (Id)); + W ("Is_Visible_Child_Unit", Flag116 (Id)); + W ("Is_Visible_Formal", Flag206 (Id)); + W ("Is_Volatile", Flag16 (Id)); + W ("Itype_Printed", Flag202 (Id)); + W ("Kill_Elaboration_Checks", Flag32 (Id)); + W ("Kill_Range_Checks", Flag33 (Id)); + W ("Kill_Tag_Checks", Flag34 (Id)); + W ("Known_To_Have_Preelab_Init", Flag207 (Id)); + W ("Low_Bound_Known", Flag205 (Id)); + W ("Machine_Radix_10", Flag84 (Id)); + W ("Materialize_Entity", Flag168 (Id)); + W ("Must_Be_On_Byte_Boundary", Flag183 (Id)); + W ("Must_Have_Preelab_Init", Flag208 (Id)); + W ("Needs_Debug_Info", Flag147 (Id)); + W ("Needs_No_Actuals", Flag22 (Id)); + W ("Never_Set_In_Source", Flag115 (Id)); + W ("No_Pool_Assigned", Flag131 (Id)); + W ("No_Return", Flag113 (Id)); + W ("No_Strict_Aliasing", Flag136 (Id)); + W ("Non_Binary_Modulus", Flag58 (Id)); + W ("Nonzero_Is_True", Flag162 (Id)); + W ("Reachable", Flag49 (Id)); + W ("Referenced", Flag156 (Id)); + W ("Referenced_As_LHS", Flag36 (Id)); + W ("Requires_Overriding", Flag213 (Id)); + W ("Return_Present", Flag54 (Id)); + W ("Returns_By_Ref", Flag90 (Id)); + W ("Reverse_Bit_Order", Flag164 (Id)); + W ("Sec_Stack_Needed_For_Return", Flag167 (Id)); + W ("Size_Depends_On_Discriminant", Flag177 (Id)); + W ("Size_Known_At_Compile_Time", Flag92 (Id)); + W ("Strict_Alignment", Flag145 (Id)); + W ("Suppress_Elaboration_Warnings", Flag148 (Id)); + W ("Suppress_Init_Proc", Flag105 (Id)); + W ("Suppress_Style_Checks", Flag165 (Id)); + W ("Treat_As_Volatile", Flag41 (Id)); + W ("Uses_Sec_Stack", Flag95 (Id)); + W ("Vax_Float", Flag151 (Id)); + W ("Warnings_Off", Flag96 (Id)); + W ("Was_Hidden", Flag196 (Id)); end Write_Entity_Flags; ----------------------- @@ -7126,28 +7222,28 @@ package body Einfo is procedure Write_Field8_Name (Id : Entity_Id) is begin case Ekind (Id) is - when E_Component | - E_Discriminant => + when E_Component | + E_Discriminant => Write_Str ("Normalized_First_Bit"); - when Formal_Kind | - E_Function | - E_Subprogram_Body => + when Formal_Kind | + E_Function | + E_Subprogram_Body => Write_Str ("Mechanism"); - when Type_Kind => + when Type_Kind => Write_Str ("Associated_Node_For_Itype"); - when E_Package => + when E_Package => Write_Str ("Dependent_Instances"); - when E_Return_Statement => + when E_Return_Statement => Write_Str ("Return_Applies_To"); - when E_Variable => + when E_Variable => Write_Str ("Hiding_Loop_Variable"); - when others => + when others => Write_Str ("Field8??"); end case; end Write_Field8_Name; @@ -7159,21 +7255,21 @@ package body Einfo is procedure Write_Field9_Name (Id : Entity_Id) is begin case Ekind (Id) is - when Type_Kind => + when Type_Kind => Write_Str ("Class_Wide_Type"); - when E_Function | - E_Generic_Function | - E_Generic_Package | - E_Generic_Procedure | - E_Package | - E_Procedure => + when E_Function | + E_Generic_Function | + E_Generic_Package | + E_Generic_Procedure | + E_Package | + E_Procedure => Write_Str ("Renaming_Map"); - when Object_Kind => + when Object_Kind => Write_Str ("Current_Value"); - when others => + when others => Write_Str ("Field9??"); end case; end Write_Field9_Name; @@ -7185,24 +7281,24 @@ package body Einfo is procedure Write_Field10_Name (Id : Entity_Id) is begin case Ekind (Id) is - when Type_Kind => + when Type_Kind => Write_Str ("Referenced_Object"); - when E_In_Parameter | - E_Constant => + when E_In_Parameter | + E_Constant => Write_Str ("Discriminal_Link"); - when E_Function | - E_Package | - E_Package_Body | - E_Procedure => + when E_Function | + E_Package | + E_Package_Body | + E_Procedure => Write_Str ("Handler_Records"); - when E_Component | - E_Discriminant => + when E_Component | + E_Discriminant => Write_Str ("Normalized_Position_Max"); - when others => + when others => Write_Str ("Field10??"); end case; end Write_Field10_Name; @@ -7214,35 +7310,35 @@ package body Einfo is procedure Write_Field11_Name (Id : Entity_Id) is begin case Ekind (Id) is - when Formal_Kind => + when Formal_Kind => Write_Str ("Entry_Component"); - when E_Component | - E_Discriminant => + when E_Component | + E_Discriminant => Write_Str ("Component_Bit_Offset"); - when E_Constant => + when E_Constant => Write_Str ("Full_View"); - when E_Enumeration_Literal => + when E_Enumeration_Literal => Write_Str ("Enumeration_Pos"); - when E_Block => + when E_Block => Write_Str ("Block_Node"); - when E_Function | - E_Procedure | - E_Entry | - E_Entry_Family => + when E_Function | + E_Procedure | + E_Entry | + E_Entry_Family => Write_Str ("Protected_Body_Subprogram"); - when E_Generic_Package => + when E_Generic_Package => Write_Str ("Generic_Homonym"); - when Type_Kind => + when Type_Kind => Write_Str ("Full_View"); - when others => + when others => Write_Str ("Field11??"); end case; end Write_Field11_Name; @@ -7254,31 +7350,31 @@ package body Einfo is procedure Write_Field12_Name (Id : Entity_Id) is begin case Ekind (Id) is - when Entry_Kind => + when Entry_Kind => Write_Str ("Barrier_Function"); - when E_Enumeration_Literal => + when E_Enumeration_Literal => Write_Str ("Enumeration_Rep"); - when Type_Kind | - E_Component | - E_Constant | - E_Discriminant | - E_In_Parameter | - E_In_Out_Parameter | - E_Out_Parameter | - E_Loop_Parameter | - E_Variable => + when Type_Kind | + E_Component | + E_Constant | + E_Discriminant | + E_In_Parameter | + E_In_Out_Parameter | + E_Out_Parameter | + E_Loop_Parameter | + E_Variable => Write_Str ("Esize"); - when E_Function | - E_Procedure => + when E_Function | + E_Procedure => Write_Str ("Next_Inlined_Subprogram"); - when E_Package => + when E_Package => Write_Str ("Associated_Formal_Package"); - when others => + when others => Write_Str ("Field12??"); end case; end Write_Field12_Name; @@ -7290,17 +7386,17 @@ package body Einfo is procedure Write_Field13_Name (Id : Entity_Id) is begin case Ekind (Id) is - when Type_Kind => + when Type_Kind => Write_Str ("RM_Size"); - when E_Component | - E_Discriminant => + when E_Component | + E_Discriminant => Write_Str ("Component_Clause"); - when E_Enumeration_Literal => + when E_Enumeration_Literal => Write_Str ("Debug_Renaming_Link"); - when E_Function => + when E_Function => if not Comes_From_Source (Id) and then Chars (Id) = Name_Op_Ne @@ -7314,16 +7410,16 @@ package body Einfo is Write_Str ("Field13??"); end if; - when Formal_Kind | - E_Variable => + when Formal_Kind | + E_Variable => Write_Str ("Extra_Accessibility"); - when E_Procedure | - E_Package | - Generic_Unit_Kind => + when E_Procedure | + E_Package | + Generic_Unit_Kind => Write_Str ("Elaboration_Entity"); - when others => + when others => Write_Str ("Field13??"); end case; end Write_Field13_Name; @@ -7335,26 +7431,26 @@ package body Einfo is procedure Write_Field14_Name (Id : Entity_Id) is begin case Ekind (Id) is - when Type_Kind | - Formal_Kind | - E_Constant | - E_Variable | - E_Loop_Parameter => + when Type_Kind | + Formal_Kind | + E_Constant | + E_Variable | + E_Loop_Parameter => Write_Str ("Alignment"); - when E_Component | - E_Discriminant => + when E_Component | + E_Discriminant => Write_Str ("Normalized_Position"); - when E_Function | - E_Procedure => + when E_Function | + E_Procedure => Write_Str ("First_Optional_Parameter"); - when E_Package | - E_Generic_Package => + when E_Package | + E_Generic_Package => Write_Str ("Shadow_Entities"); - when others => + when others => Write_Str ("Field14??"); end case; end Write_Field14_Name; @@ -7366,52 +7462,52 @@ package body Einfo is procedure Write_Field15_Name (Id : Entity_Id) is begin case Ekind (Id) is - when Access_Kind | - Task_Kind => + when Access_Kind | + Task_Kind => Write_Str ("Storage_Size_Variable"); - when Class_Wide_Kind | - E_Record_Type | - E_Record_Subtype | - Private_Kind => + when Class_Wide_Kind | + E_Record_Type | + E_Record_Subtype | + Private_Kind => Write_Str ("Primitive_Operations"); - when E_Component => + when E_Component => Write_Str ("DT_Entry_Count"); - when Decimal_Fixed_Point_Kind => + when Decimal_Fixed_Point_Kind => Write_Str ("Scale_Value"); - when E_Discriminant => + when E_Discriminant => Write_Str ("Discriminant_Number"); - when Formal_Kind => + when Formal_Kind => Write_Str ("Extra_Formal"); - when E_Function | - E_Procedure => + when E_Function | + E_Procedure => Write_Str ("DT_Position"); - when Entry_Kind => + when Entry_Kind => Write_Str ("Entry_Parameters_Type"); - when Enumeration_Kind => + when Enumeration_Kind => Write_Str ("Lit_Indexes"); - when E_Package | - E_Package_Body => + when E_Package | + E_Package_Body => Write_Str ("Related_Instance"); - when E_Protected_Type => + when E_Protected_Type => Write_Str ("Entry_Bodies_Array"); - when E_String_Literal_Subtype => + when E_String_Literal_Subtype => Write_Str ("String_Literal_Low_Bound"); - when E_Variable => + when E_Variable => Write_Str ("Shared_Var_Read_Proc"); - when others => + when others => Write_Str ("Field15??"); end case; end Write_Field15_Name; @@ -7423,37 +7519,37 @@ package body Einfo is procedure Write_Field16_Name (Id : Entity_Id) is begin case Ekind (Id) is - when E_Component => + when E_Component => Write_Str ("Entry_Formal"); - when E_Function | - E_Procedure => + when E_Function | + E_Procedure => Write_Str ("DTC_Entity"); - when E_Package | - E_Generic_Package | - Concurrent_Kind => + when E_Package | + E_Generic_Package | + Concurrent_Kind => Write_Str ("First_Private_Entity"); - when E_Record_Type | - E_Record_Type_With_Private => + when E_Record_Type | + E_Record_Type_With_Private => Write_Str ("Access_Disp_Table"); - when E_String_Literal_Subtype => + when E_String_Literal_Subtype => Write_Str ("String_Literal_Length"); - when Enumeration_Kind => + when Enumeration_Kind => Write_Str ("Lit_Strings"); - when E_Variable | - E_Out_Parameter => + when E_Variable | + E_Out_Parameter => Write_Str ("Unset_Reference"); - when E_Record_Subtype | - E_Class_Wide_Subtype => + when E_Record_Subtype | + E_Class_Wide_Subtype => Write_Str ("Cloned_Subtype"); - when others => + when others => Write_Str ("Field16??"); end case; end Write_Field16_Name; @@ -7465,67 +7561,67 @@ package body Einfo is procedure Write_Field17_Name (Id : Entity_Id) is begin case Ekind (Id) is - when Digits_Kind => + when Digits_Kind => Write_Str ("Digits_Value"); - when E_Component => + when E_Component => Write_Str ("Prival"); - when E_Discriminant => + when E_Discriminant => Write_Str ("Discriminal"); - when E_Block | - Class_Wide_Kind | - Concurrent_Kind | - Private_Kind | - E_Entry | - E_Entry_Family | - E_Function | - E_Generic_Function | - E_Generic_Package | - E_Generic_Procedure | - E_Loop | - E_Operator | - E_Package | - E_Package_Body | - E_Procedure | - E_Record_Type | - E_Record_Subtype | - E_Return_Statement | - E_Subprogram_Body | - E_Subprogram_Type => + when E_Block | + Class_Wide_Kind | + Concurrent_Kind | + Private_Kind | + E_Entry | + E_Entry_Family | + E_Function | + E_Generic_Function | + E_Generic_Package | + E_Generic_Procedure | + E_Loop | + E_Operator | + E_Package | + E_Package_Body | + E_Procedure | + E_Record_Type | + E_Record_Subtype | + E_Return_Statement | + E_Subprogram_Body | + E_Subprogram_Type => Write_Str ("First_Entity"); - when Array_Kind => + when Array_Kind => Write_Str ("First_Index"); - when E_Protected_Body => + when E_Protected_Body => Write_Str ("Object_Ref"); - when Enumeration_Kind => + when Enumeration_Kind => Write_Str ("First_Literal"); - when Access_Kind => + when Access_Kind => Write_Str ("Master_Id"); - when Modular_Integer_Kind => + when Modular_Integer_Kind => Write_Str ("Modulus"); - when Formal_Kind | - E_Constant | - E_Generic_In_Out_Parameter | - E_Variable => + when Formal_Kind | + E_Constant | + E_Generic_In_Out_Parameter | + E_Variable => Write_Str ("Actual_Subtype"); - when E_Incomplete_Type => + when E_Incomplete_Type => Write_Str ("Non_Limited_View"); - when E_Incomplete_Subtype => + when E_Incomplete_Subtype => if From_With_Type (Id) then Write_Str ("Non_Limited_View"); end if; - when others => + when others => Write_Str ("Field17??"); end case; end Write_Field17_Name; @@ -7537,50 +7633,51 @@ package body Einfo is procedure Write_Field18_Name (Id : Entity_Id) is begin case Ekind (Id) is - when E_Enumeration_Literal | - E_Function | - E_Operator | - E_Procedure => + when E_Enumeration_Literal | + E_Function | + E_Operator | + E_Procedure => Write_Str ("Alias"); - when E_Record_Type => + when E_Record_Type => Write_Str ("Corresponding_Concurrent_Type"); - when E_Entry_Index_Parameter => + when E_Entry_Index_Parameter => Write_Str ("Entry_Index_Constant"); - when E_Class_Wide_Subtype | - E_Access_Protected_Subprogram_Type | - E_Access_Subprogram_Type | - E_Exception_Type => + when E_Class_Wide_Subtype | + E_Access_Protected_Subprogram_Type | + E_Anonymous_Access_Protected_Subprogram_Type | + E_Access_Subprogram_Type | + E_Exception_Type => Write_Str ("Equivalent_Type"); - when Fixed_Point_Kind => + when Fixed_Point_Kind => Write_Str ("Delta_Value"); - when E_Constant | - E_Variable => + when E_Constant | + E_Variable => Write_Str ("Renamed_Object"); - when E_Exception | - E_Package | - E_Generic_Function | - E_Generic_Procedure | - E_Generic_Package => + when E_Exception | + E_Package | + E_Generic_Function | + E_Generic_Procedure | + E_Generic_Package => Write_Str ("Renamed_Entity"); - when Incomplete_Or_Private_Kind => + when Incomplete_Or_Private_Kind => Write_Str ("Private_Dependents"); - when Concurrent_Kind => + when Concurrent_Kind => Write_Str ("Corresponding_Record_Type"); - when E_Label | - E_Loop | - E_Block => + when E_Label | + E_Loop | + E_Block => Write_Str ("Enclosing_Scope"); - when others => + when others => Write_Str ("Field18??"); end case; end Write_Field18_Name; @@ -7592,38 +7689,39 @@ package body Einfo is procedure Write_Field19_Name (Id : Entity_Id) is begin case Ekind (Id) is - when E_Array_Type | - E_Array_Subtype => + when E_Array_Type | + E_Array_Subtype => Write_Str ("Related_Array_Object"); - when E_Block | - Concurrent_Kind | - E_Function | - E_Procedure | - Entry_Kind => + when E_Block | + Concurrent_Kind | + E_Function | + E_Procedure | + E_Return_Statement | + Entry_Kind => Write_Str ("Finalization_Chain_Entity"); - when E_Constant | E_Variable => + when E_Constant | E_Variable => Write_Str ("Size_Check_Code"); - when E_Discriminant => + when E_Discriminant => Write_Str ("Corresponding_Discriminant"); - when E_Package | - E_Generic_Package => + when E_Package | + E_Generic_Package => Write_Str ("Body_Entity"); - when E_Package_Body | - Formal_Kind => + when E_Package_Body | + Formal_Kind => Write_Str ("Spec_Entity"); - when Private_Kind => + when Private_Kind => Write_Str ("Underlying_Full_View"); - when E_Record_Type => + when E_Record_Type => Write_Str ("Parent_Subtype"); - when others => + when others => Write_Str ("Field19??"); end case; end Write_Field19_Name; @@ -7635,55 +7733,55 @@ package body Einfo is procedure Write_Field20_Name (Id : Entity_Id) is begin case Ekind (Id) is - when Array_Kind => + when Array_Kind => Write_Str ("Component_Type"); - when E_In_Parameter | - E_Generic_In_Parameter => + when E_In_Parameter | + E_Generic_In_Parameter => Write_Str ("Default_Value"); - when Access_Kind => + when Access_Kind => Write_Str ("Directly_Designated_Type"); - when E_Component => + when E_Component => Write_Str ("Discriminant_Checking_Func"); - when E_Discriminant => + when E_Discriminant => Write_Str ("Discriminant_Default_Value"); - when E_Block | - Class_Wide_Kind | - Concurrent_Kind | - Private_Kind | - E_Entry | - E_Entry_Family | - E_Function | - E_Generic_Function | - E_Generic_Package | - E_Generic_Procedure | - E_Loop | - E_Operator | - E_Package | - E_Package_Body | - E_Procedure | - E_Record_Type | - E_Record_Subtype | - E_Return_Statement | - E_Subprogram_Body | - E_Subprogram_Type => + when E_Block | + Class_Wide_Kind | + Concurrent_Kind | + Private_Kind | + E_Entry | + E_Entry_Family | + E_Function | + E_Generic_Function | + E_Generic_Package | + E_Generic_Procedure | + E_Loop | + E_Operator | + E_Package | + E_Package_Body | + E_Procedure | + E_Record_Type | + E_Record_Subtype | + E_Return_Statement | + E_Subprogram_Body | + E_Subprogram_Type => Write_Str ("Last_Entity"); - when Scalar_Kind => + when Scalar_Kind => Write_Str ("Scalar_Range"); - when E_Exception => + when E_Exception => Write_Str ("Register_Exception_Call"); - when E_Variable => + when E_Variable => Write_Str ("Last_Assignment"); - when others => + when others => Write_Str ("Field20??"); end case; end Write_Field20_Name; @@ -7695,40 +7793,40 @@ package body Einfo is procedure Write_Field21_Name (Id : Entity_Id) is begin case Ekind (Id) is - when E_Constant | - E_Exception | - E_Function | - E_Generic_Function | - E_Procedure | - E_Generic_Procedure | - E_Variable => + when E_Constant | + E_Exception | + E_Function | + E_Generic_Function | + E_Procedure | + E_Generic_Procedure | + E_Variable => Write_Str ("Interface_Name"); - when Concurrent_Kind | - Incomplete_Or_Private_Kind | - Class_Wide_Kind | - E_Record_Type | - E_Record_Subtype => + when Concurrent_Kind | + Incomplete_Or_Private_Kind | + Class_Wide_Kind | + E_Record_Type | + E_Record_Subtype => Write_Str ("Discriminant_Constraint"); - when Entry_Kind => + when Entry_Kind => Write_Str ("Accept_Address"); - when Fixed_Point_Kind => + when Fixed_Point_Kind => Write_Str ("Small_Value"); - when E_In_Parameter => + when E_In_Parameter => Write_Str ("Default_Expr_Function"); - when Array_Kind | - Modular_Integer_Kind => + when Array_Kind | + Modular_Integer_Kind => Write_Str ("Original_Array_Type"); - when E_Access_Subprogram_Type | - E_Access_Protected_Subprogram_Type => + when E_Access_Subprogram_Type | + E_Access_Protected_Subprogram_Type => Write_Str ("Original_Access_Type"); - when others => + when others => Write_Str ("Field21??"); end case; end Write_Field21_Name; @@ -7740,57 +7838,57 @@ package body Einfo is procedure Write_Field22_Name (Id : Entity_Id) is begin case Ekind (Id) is - when Access_Kind => + when Access_Kind => Write_Str ("Associated_Storage_Pool"); - when Array_Kind => + when Array_Kind => Write_Str ("Component_Size"); - when E_Component | - E_Discriminant => + when E_Component | + E_Discriminant => Write_Str ("Original_Record_Component"); - when E_Enumeration_Literal => + when E_Enumeration_Literal => Write_Str ("Enumeration_Rep_Expr"); - when E_Exception => + when E_Exception => Write_Str ("Exception_Code"); - when Formal_Kind => + when Formal_Kind => Write_Str ("Protected_Formal"); - when E_Record_Type => + when E_Record_Type => Write_Str ("Corresponding_Remote_Type"); - when E_Block | - E_Entry | - E_Entry_Family | - E_Function | - E_Loop | - E_Package | - E_Package_Body | - E_Generic_Package | - E_Generic_Function | - E_Generic_Procedure | - E_Procedure | - E_Protected_Type | - E_Return_Statement | - E_Subprogram_Body | - E_Task_Type => + when E_Block | + E_Entry | + E_Entry_Family | + E_Function | + E_Loop | + E_Package | + E_Package_Body | + E_Generic_Package | + E_Generic_Function | + E_Generic_Procedure | + E_Procedure | + E_Protected_Type | + E_Return_Statement | + E_Subprogram_Body | + E_Task_Type => Write_Str ("Scope_Depth_Value"); - when E_Record_Type_With_Private | - E_Record_Subtype_With_Private | - E_Private_Type | - E_Private_Subtype | - E_Limited_Private_Type | - E_Limited_Private_Subtype => + when E_Record_Type_With_Private | + E_Record_Subtype_With_Private | + E_Private_Type | + E_Private_Subtype | + E_Limited_Private_Type | + E_Limited_Private_Subtype => Write_Str ("Private_View"); - when E_Variable => + when E_Variable => Write_Str ("Shared_Var_Assign_Proc"); - when others => + when others => Write_Str ("Field22??"); end case; end Write_Field22_Name; @@ -7802,45 +7900,45 @@ package body Einfo is procedure Write_Field23_Name (Id : Entity_Id) is begin case Ekind (Id) is - when Access_Kind => + when Access_Kind => Write_Str ("Associated_Final_Chain"); - when Array_Kind => + when Array_Kind => Write_Str ("Packed_Array_Type"); - when E_Block => + when E_Block => Write_Str ("Entry_Cancel_Parameter"); - when E_Component => + when E_Component => Write_Str ("Protected_Operation"); - when E_Discriminant => + when E_Discriminant => Write_Str ("CR_Discriminant"); - when E_Enumeration_Type => + when E_Enumeration_Type => Write_Str ("Enum_Pos_To_Rep"); - when Formal_Kind | - E_Variable => + when Formal_Kind | + E_Variable => Write_Str ("Extra_Constrained"); - when E_Generic_Function | - E_Generic_Package | - E_Generic_Procedure => + when E_Generic_Function | + E_Generic_Package | + E_Generic_Procedure => Write_Str ("Inner_Instances"); - when Concurrent_Kind | - Incomplete_Or_Private_Kind | - Class_Wide_Kind | - E_Record_Type | - E_Record_Subtype => + when Concurrent_Kind | + Incomplete_Or_Private_Kind | + Class_Wide_Kind | + E_Record_Type | + E_Record_Subtype => Write_Str ("Stored_Constraint"); - when E_Function | - E_Procedure => + when E_Function | + E_Procedure => Write_Str ("Generic_Renamings"); - when E_Package => + when E_Package => if Is_Generic_Instance (Id) then Write_Str ("Generic_Renamings"); else @@ -7849,10 +7947,10 @@ package body Einfo is -- What about Privals_Chain for protected operations ??? - when Entry_Kind => + when Entry_Kind => Write_Str ("Privals_Chain"); - when others => + when others => Write_Str ("Field23??"); end case; end Write_Field23_Name; @@ -7874,26 +7972,26 @@ package body Einfo is procedure Write_Field25_Name (Id : Entity_Id) is begin case Ekind (Id) is - when E_Component => + when E_Component => Write_Str ("DT_Offset_To_Top_Func"); - when E_Procedure | - E_Function => + when E_Procedure | + E_Function => Write_Str ("Abstract_Interface_Alias"); - when E_Package => + when E_Package => Write_Str ("Current_Use_Clause"); - when E_Record_Type | - E_Record_Subtype | - E_Record_Type_With_Private | - E_Record_Subtype_With_Private => + when E_Record_Type | + E_Record_Subtype | + E_Record_Type_With_Private | + E_Record_Subtype_With_Private => Write_Str ("Abstract_Interfaces"); - when Task_Kind => + when Task_Kind => Write_Str ("Task_Body_Procedure"); - when others => + when others => Write_Str ("Field25??"); end case; end Write_Field25_Name; @@ -7905,15 +8003,15 @@ package body Einfo is procedure Write_Field26_Name (Id : Entity_Id) is begin case Ekind (Id) is - when E_Generic_Package | - E_Package => + when E_Generic_Package | + E_Package => Write_Str ("Package_Instantiation"); - when E_Procedure | - E_Function => + when E_Procedure | + E_Function => Write_Str ("Overridden_Operation"); - when others => + when others => Write_Str ("Field26??"); end case; end Write_Field26_Name; @@ -7925,10 +8023,10 @@ package body Einfo is procedure Write_Field27_Name (Id : Entity_Id) is begin case Ekind (Id) is - when E_Procedure => + when E_Procedure => Write_Str ("Wrapped_Entity"); - when others => + when others => Write_Str ("Field27??"); end case; end Write_Field27_Name; @@ -7940,10 +8038,10 @@ package body Einfo is procedure Write_Field28_Name (Id : Entity_Id) is begin case Ekind (Id) is - when E_Procedure | E_Function | E_Entry => + when E_Procedure | E_Function | E_Entry => Write_Str ("Extra_Formals"); - when others => + when others => Write_Str ("Field28??"); end case; end Write_Field28_Name; @@ -7952,42 +8050,47 @@ package body Einfo is -- Iterator Procedures -- ------------------------- - procedure Proc_Next_Component (N : in out Node_Id) is + procedure Proc_Next_Component (N : in out Node_Id) is begin N := Next_Component (N); end Proc_Next_Component; - procedure Proc_Next_Discriminant (N : in out Node_Id) is + procedure Proc_Next_Component_Or_Discriminant (N : in out Node_Id) is + begin + N := Next_Component (N); + end Proc_Next_Component_Or_Discriminant; + + procedure Proc_Next_Discriminant (N : in out Node_Id) is begin N := Next_Discriminant (N); end Proc_Next_Discriminant; - procedure Proc_Next_Formal (N : in out Node_Id) is + procedure Proc_Next_Formal (N : in out Node_Id) is begin N := Next_Formal (N); end Proc_Next_Formal; - procedure Proc_Next_Formal_With_Extras (N : in out Node_Id) is + procedure Proc_Next_Formal_With_Extras (N : in out Node_Id) is begin N := Next_Formal_With_Extras (N); end Proc_Next_Formal_With_Extras; - procedure Proc_Next_Index (N : in out Node_Id) is + procedure Proc_Next_Index (N : in out Node_Id) is begin N := Next_Index (N); end Proc_Next_Index; - procedure Proc_Next_Inlined_Subprogram (N : in out Node_Id) is + procedure Proc_Next_Inlined_Subprogram (N : in out Node_Id) is begin N := Next_Inlined_Subprogram (N); end Proc_Next_Inlined_Subprogram; - procedure Proc_Next_Literal (N : in out Node_Id) is + procedure Proc_Next_Literal (N : in out Node_Id) is begin N := Next_Literal (N); end Proc_Next_Literal; - procedure Proc_Next_Stored_Discriminant (N : in out Node_Id) is + procedure Proc_Next_Stored_Discriminant (N : in out Node_Id) is begin N := Next_Stored_Discriminant (N); end Proc_Next_Stored_Discriminant; diff --git a/gcc/ada/einfo.ads b/gcc/ada/einfo.ads index 46f03a92d59..f606d4f5ecf 100644 --- a/gcc/ada/einfo.ads +++ b/gcc/ada/einfo.ads @@ -1045,13 +1045,13 @@ package Einfo is -- entity designed by this field instead of being computed. -- Finalization_Chain_Entity (Node19) --- Present in scopes which can have finalizable entities (blocks, --- functions, procedures, tasks, entries). When this field is empty it --- means that there are no finalization actions to perform on exit of the --- scope. When this field contains 'Error', it means that no --- finalization actions should happen at this level and the --- finalization chain of a parent scope shall be used (??? this is --- an improper use of 'Error' and should be changed). otherwise it +-- Present in scopes that can have finalizable entities (blocks, +-- functions, procedures, tasks, entries, return statements). When this +-- field is empty it means that there are no finalization actions to +-- perform on exit of the scope. When this field contains 'Error', it +-- means that no finalization actions should happen at this level and +-- the finalization chain of a parent scope shall be used (??? this is +-- an improper use of 'Error' and should be changed). Otherwise it -- contains an entity of type Finalizable_Ptr that is the head of the -- list of objects to finalize on exit. See "Finalization Management" -- section in exp_ch7.adb for more details. @@ -1066,16 +1066,20 @@ package Einfo is -- derivation. -- First_Component (synthesized) --- Applies to record types. Returns the first component by following --- the chain of declared entities for the record until a component --- is found (one with an Ekind of E_Component). The discriminants are --- skipped. If the record is null, then Empty is returned. +-- Applies to record types. Returns the first component by following the +-- chain of declared entities for the record until a component is found +-- (one with an Ekind of E_Component). The discriminants are skipped. If +-- the record is null, then Empty is returned. + +-- First_Component_Or_Discriminant (synthesized) +-- Similar to First_Component, but discriminants are not skipped, so will +-- find the first discriminant if discriminants are present. -- First_Discriminant (synthesized) --- Applies to types with discriminants. The discriminants are the --- first entities declared in the type, so normally this is equivalent --- to First_Entity. The exception arises for tagged types, where the --- tag itself is prepended to the front of the entity chain, so the +-- Applies to types with discriminants. The discriminants are the first +-- entities declared in the type, so normally this is equivalent to +-- First_Entity. The exception arises for tagged types, where the tag +-- itself is prepended to the front of the entity chain, so the -- First_Discriminant function steps past the tag if it is present. -- First_Entity (Node17) @@ -1233,6 +1237,8 @@ package Einfo is -- True if Targparm.Functions_Return_By_DSP_On_Target is True and -- the function returns a value of a type whose size is not known -- at compile time. +-- +-- Note: this flag is obsolete, it is always False ??? -- Generic_Homonym (Node11) -- Present in generic packages. The generic homonym is the entity of @@ -1524,7 +1530,15 @@ package Einfo is -- Present in all entities. Set if a valid pragma Unreferenced applies -- to the pragma, indicating that no warning should be given if the -- entity has no references, but a warning should be given if it is --- in fact referenced. +-- in fact referenced. For private types, this flag is set in both the +-- private entity and full entity if the pragma applies to either. + +-- Has_Pragma_Unreferenced_Objects (Flag212) +-- Present in type and subtype entities. Set if a valid pragma +-- Unreferenced_Objects applies to the type, indicating that no warning +-- should be given for objects of such a type for being unreferenced +-- (but unlike the case with pragma Unreferenced, it is ok to reference +-- such an object and no warning is generated. -- Known_To_Have_Preelab_Init (Flag207) -- Present in all type and subtype entities. If set, then the type is @@ -1561,6 +1575,10 @@ package Einfo is -- the flag Has_Fully_Qualified_Name, which is set if the name does -- indeed include the fully qualified name. +-- Has_RACW (Flag214) +-- Present in package spec entities. Set if the spec contains the +-- declaration of a remote access-to-classwide type. + -- Has_Record_Rep_Clause (Flag65) [implementation base type only] -- Present in record types. Set if a record representation clause has -- been given for this record type. Used to prevent more than one such @@ -1635,9 +1653,9 @@ package Einfo is -- Has_Task (Flag30) [base type only] -- Present in all type entities. Set on task types themselves, and also -- (recursively) on any composite type which has a component for which --- Has_Task is set. The meaning is that an allocator of such an object --- must create the required tasks. Note that the flag is not set on --- access types, even if they designate an object that Has_Task. +-- Has_Task is set. The meaning is that an allocator or declaration of +-- such an object must create the required tasks. Note: the flag is not +-- set on access types, even if they designate an object that Has_Task. -- Has_Unchecked_Union (Flag123) [base type only] -- Present in all type entities. Set on unchecked unions themselves @@ -1749,9 +1767,13 @@ package Einfo is -- part. The flag on a type is also used to determine the visibility of -- the primitive operators of the type. --- Is_Abstract (Flag19) --- Present in all types, and also for functions and procedures. Set --- for abstract types and abstract subprograms. +-- Is_Abstract_Subprogram (Flag19) +-- Present in all subprograms and entries. Set for abstract subprograms. +-- Always False for enumeration literals and entries. See also +-- Requires_Overriding. + +-- Is_Abstract_Type (Flag146) +-- Present in all types. Set for abstract types. -- Is_Local_Anonymous_Access (Flag194) -- Present in access types. Set for an anonymous access type to indicate @@ -1765,6 +1787,10 @@ package Einfo is -- Present in access types and subtypes. Indicates that the keyword -- constant was present in the access type definition. +-- Is_Access_Protected_Subprogram_Type (synthesized) +-- Applies to all types, true for named and anonymous access to +-- protected subprograms. + -- Is_Access_Type (synthesized) -- Applies to all entities, true for access types and subtypes @@ -1907,8 +1933,8 @@ package Einfo is -- of dispatching operations. -- Is_CPP_Class (Flag74) --- Present in all type entities, set only for tagged and untagged --- record types to which the pragma CPP_Class has been applied. +-- Present in all type entities, set only for tagged types to which a +-- valid pragma Import (CPP, ...) or pragma CPP_Class has been applied. -- Is_Decimal_Fixed_Point_Type (synthesized) -- Applies to all type entities, true for decimal fixed point @@ -2648,7 +2674,10 @@ package Einfo is -- Master_Id (Node17) -- Present in access types and subtypes. Empty unless Has_Task is -- set for the designated type, in which case it points to the entity --- for the Master_Id for the access type master. +-- for the Master_Id for the access type master. Also set for access-to- +-- limited-class-wide types whose root may be extended with task +-- components, and for access-to-limited-interfaces because they can be +-- used to reference tasks implementing such interface. -- Materialize_Entity (Flag168) -- Present in all entities. Set only for constant or renamed entities @@ -2744,11 +2773,17 @@ package Einfo is -- the renaming possibility. -- Next_Component (synthesized) --- Applies to record components. Returns the next component by --- following the chain of declared entities until one is found which --- corresponds to a component (Ekind is E_Component). Any internal types --- generated from the subtype indications of the record components are --- skipped. Returns Empty if no more components. +-- Applies to record components. Returns the next component by following +-- the chain of declared entities until one is found which corresponds to +-- a component (Ekind is E_Component). Any internal types generated from +-- the subtype indications of the record components are skipped. Returns +-- Empty if no more components. + +-- Next_Component_Or_Discriminant (synthesized) +-- Similar to Next_Component, but includes components and discriminants +-- so the input can have either E_Component or E_Discriminant, and the +-- same is true for the result. Returns Empty if no more components or +-- discriminants in the record. -- Next_Discriminant (synthesized) -- Applies to discriminants returned by First/Next_Discriminant. @@ -3103,6 +3138,12 @@ package Einfo is -- details. The maps for package instances are also used when the -- instance is the actual corresponding to a formal package. +-- Requires_Overriding (Flag213) +-- Present in all subprograms and entries. Set for subprograms that +-- require overriding as defined by RM-2005-3.9.3(6/2). Note that this +-- is True only for implicitly declare subprograms; it is not set on the +-- parent type's subprogram. See also Is_Abstract_Subprogram. + -- Return_Present (Flag54) -- Present in function and generic function entities. Set if the -- function contains a return statement (used for error checking). @@ -3124,10 +3165,11 @@ package Einfo is -- Reverse_Bit_Order (Flag164) [base type only] -- Present in all record type entities. Set if a valid pragma an --- attribute represention clause for Bit_Order has reversed the order --- of bits from the default value. When this flag is set, a component --- clause must specify a set of bits entirely contained in a single --- storage unit. +-- attribute represention clause for Bit_Order has reversed the order of +-- bits from the default value. When this flag is set, a component clause +-- must specify a set of bits entirely contained in a single storage unit +-- (Ada 95) or a single machine scalar (see Ada 2005 AI-133), or must +-- occupy in integral number of storage units. -- RM_Size (Uint13) -- Present in all type and subtype entities. Contains the value of @@ -3406,7 +3448,7 @@ package Einfo is -- Access Kinds -- ------------------ - -- The following three entity kinds are introduced by the corresponding + -- The following five entity kinds are introduced by the corresponding -- type definitions: -- E_Access_Type, @@ -3615,16 +3657,16 @@ package Einfo is -- An access to subprogram type, created by an access to subprogram -- declaration. + E_Anonymous_Access_Subprogram_Type, + -- An anonymous access to subprogram type, created by an access to + -- subprogram declaration. + E_Access_Protected_Subprogram_Type, -- An access to a protected subprogram, created by the corresponding -- declaration. Values of such a type denote both a protected object -- and a protected operation within, and have different compile-time -- and run-time properties than other access to subprograms. - E_Anonymous_Access_Subprogram_Type, - -- An anonymous access to subprogram type, created by an access to - -- subprogram declaration. - E_Anonymous_Access_Protected_Subprogram_Type, -- An anonymous access to protected subprogram type, created by an -- access to subprogram declaration. @@ -3862,11 +3904,15 @@ package Einfo is -- E_Allocator_Type -- E_General_Access_Type -- E_Access_Subprogram_Type - -- E_Access_Protected_Subprogram_Type -- E_Anonymous_Access_Subprogram_Type + -- E_Access_Protected_Subprogram_Type -- E_Anonymous_Access_Protected_Subprogram_Type E_Anonymous_Access_Type; + subtype Access_Protected_Kind is Entity_Kind range + E_Access_Protected_Subprogram_Type .. + E_Anonymous_Access_Protected_Subprogram_Type; + subtype Array_Kind is Entity_Kind range E_Array_Type .. -- E_Array_Subtype @@ -4183,863 +4229,878 @@ package Einfo is -- The following attributes apply to all entities - -- Ekind (Ekind) - - -- Chars (Name1) - -- Next_Entity (Node2) - -- Scope (Node3) - -- Homonym (Node4) - -- Etype (Node5) - -- First_Rep_Item (Node6) - -- Freeze_Node (Node7) - -- Obsolescent_Warning (Node24) - - -- Address_Taken (Flag104) - -- Can_Never_Be_Null (Flag38) - -- Checks_May_Be_Suppressed (Flag31) - -- Debug_Info_Off (Flag166) - -- Has_Anon_Block_Suffix (Flag201) - -- Has_Controlled_Component (Flag43) (base type only) - -- Has_Convention_Pragma (Flag119) - -- Has_Delayed_Freeze (Flag18) - -- Has_Fully_Qualified_Name (Flag173) - -- Has_Gigi_Rep_Item (Flag82) - -- Has_Homonym (Flag56) - -- Has_Persistent_BSS (Flag188) - -- Has_Pragma_Elaborate_Body (Flag150) - -- Has_Pragma_Inline (Flag157) - -- Has_Pragma_Pure (Flag203) - -- Has_Pragma_Pure_Function (Flag179) - -- Has_Pragma_Unreferenced (Flag180) - -- Has_Private_Declaration (Flag155) - -- Has_Qualified_Name (Flag161) - -- Has_Unknown_Discriminants (Flag72) - -- Has_Xref_Entry (Flag182) - -- Is_Ada_2005_Only (Flag185) - -- Is_Bit_Packed_Array (Flag122) (base type only) - -- Is_Child_Unit (Flag73) - -- Is_Compilation_Unit (Flag149) - -- Is_Completely_Hidden (Flag103) - -- Is_Discrim_SO_Function (Flag176) - -- Is_Dispatching_Operation (Flag6) - -- Is_Exported (Flag99) - -- Is_First_Subtype (Flag70) - -- Is_Formal_Subprogram (Flag111) - -- Is_Generic_Instance (Flag130) - -- Is_Hidden (Flag57) - -- Is_Hidden_Open_Scope (Flag171) - -- Is_Immediately_Visible (Flag7) - -- Is_Imported (Flag24) - -- Is_Inlined (Flag11) - -- Is_Internal (Flag17) - -- Is_Itype (Flag91) - -- Is_Known_Non_Null (Flag37) - -- Is_Known_Null (Flag204) - -- Is_Known_Valid (Flag170) - -- Is_Limited_Composite (Flag106) - -- Is_Limited_Record (Flag25) - -- Is_Obsolescent (Flag153) - -- Is_Package_Body_Entity (Flag160) - -- Is_Packed_Array_Type (Flag138) - -- Is_Potentially_Use_Visible (Flag9) - -- Is_Preelaborated (Flag59) - -- Is_Primitive_Wrapper (Flag195) - -- Is_Public (Flag10) - -- Is_Pure (Flag44) - -- Is_Remote_Call_Interface (Flag62) - -- Is_Remote_Types (Flag61) - -- Is_Shared_Passive (Flag60) - -- Is_Statically_Allocated (Flag28) - -- Is_Unchecked_Union (Flag117) - -- Is_Visible_Formal (Flag206) - -- Is_VMS_Exception (Flag133) - -- Kill_Elaboration_Checks (Flag32) - -- Kill_Range_Checks (Flag33) - -- Kill_Tag_Checks (Flag34) - -- Low_Bound_Known (Flag205) - -- Materialize_Entity (Flag168) - -- Needs_Debug_Info (Flag147) - -- No_Return (Flag113) - -- Referenced (Flag156) - -- Referenced_As_LHS (Flag36) - -- Suppress_Elaboration_Warnings (Flag148) - -- Suppress_Style_Checks (Flag165) - -- Was_Hidden (Flag196) - - -- Declaration_Node (synth) - -- Enclosing_Dynamic_Scope (synth) - -- Has_Foreign_Convention (synth) - -- Is_Derived_Type (synth) - -- Is_Dynamic_Scope (synth) - -- Is_Limited_Type (synth) - -- Underlying_Type (synth) - -- all classification attributes (synth) + -- Ekind (Ekind) + + -- Chars (Name1) + -- Next_Entity (Node2) + -- Scope (Node3) + -- Homonym (Node4) + -- Etype (Node5) + -- First_Rep_Item (Node6) + -- Freeze_Node (Node7) + -- Obsolescent_Warning (Node24) + + -- Address_Taken (Flag104) + -- Can_Never_Be_Null (Flag38) + -- Checks_May_Be_Suppressed (Flag31) + -- Debug_Info_Off (Flag166) + -- Has_Anon_Block_Suffix (Flag201) + -- Has_Controlled_Component (Flag43) (base type only) + -- Has_Convention_Pragma (Flag119) + -- Has_Delayed_Freeze (Flag18) + -- Has_Fully_Qualified_Name (Flag173) + -- Has_Gigi_Rep_Item (Flag82) + -- Has_Homonym (Flag56) + -- Has_Persistent_BSS (Flag188) + -- Has_Pragma_Elaborate_Body (Flag150) + -- Has_Pragma_Inline (Flag157) + -- Has_Pragma_Pure (Flag203) + -- Has_Pragma_Pure_Function (Flag179) + -- Has_Pragma_Unreferenced (Flag180) + -- Has_Private_Declaration (Flag155) + -- Has_Qualified_Name (Flag161) + -- Has_Unknown_Discriminants (Flag72) + -- Has_Xref_Entry (Flag182) + -- Is_Ada_2005_Only (Flag185) + -- Is_Bit_Packed_Array (Flag122) (base type only) + -- Is_Child_Unit (Flag73) + -- Is_Compilation_Unit (Flag149) + -- Is_Completely_Hidden (Flag103) + -- Is_Discrim_SO_Function (Flag176) + -- Is_Dispatching_Operation (Flag6) + -- Is_Exported (Flag99) + -- Is_First_Subtype (Flag70) + -- Is_Formal_Subprogram (Flag111) + -- Is_Generic_Instance (Flag130) + -- Is_Hidden (Flag57) + -- Is_Hidden_Open_Scope (Flag171) + -- Is_Immediately_Visible (Flag7) + -- Is_Imported (Flag24) + -- Is_Inlined (Flag11) + -- Is_Internal (Flag17) + -- Is_Itype (Flag91) + -- Is_Known_Non_Null (Flag37) + -- Is_Known_Null (Flag204) + -- Is_Known_Valid (Flag170) + -- Is_Limited_Composite (Flag106) + -- Is_Limited_Record (Flag25) + -- Is_Obsolescent (Flag153) + -- Is_Package_Body_Entity (Flag160) + -- Is_Packed_Array_Type (Flag138) + -- Is_Potentially_Use_Visible (Flag9) + -- Is_Preelaborated (Flag59) + -- Is_Primitive_Wrapper (Flag195) + -- Is_Public (Flag10) + -- Is_Pure (Flag44) + -- Is_Remote_Call_Interface (Flag62) + -- Is_Remote_Types (Flag61) + -- Is_Shared_Passive (Flag60) + -- Is_Statically_Allocated (Flag28) + -- Is_Unchecked_Union (Flag117) + -- Is_Visible_Formal (Flag206) + -- Is_VMS_Exception (Flag133) + -- Kill_Elaboration_Checks (Flag32) + -- Kill_Range_Checks (Flag33) + -- Kill_Tag_Checks (Flag34) + -- Low_Bound_Known (Flag205) + -- Materialize_Entity (Flag168) + -- Needs_Debug_Info (Flag147) + -- No_Return (Flag113) + -- Referenced (Flag156) + -- Referenced_As_LHS (Flag36) + -- Suppress_Elaboration_Warnings (Flag148) + -- Suppress_Style_Checks (Flag165) + -- Was_Hidden (Flag196) + + -- Declaration_Node (synth) + -- Enclosing_Dynamic_Scope (synth) + -- Has_Foreign_Convention (synth) + -- Is_Derived_Type (synth) + -- Is_Dynamic_Scope (synth) + -- Is_Limited_Type (synth) + -- Underlying_Type (synth) + -- all classification attributes (synth) -- The following list of access functions applies to all entities for -- types and subtypes. References to this list appear subsequently as -- as "(plus type attributes)" for each appropriate Entity_Kind. - -- Associated_Node_For_Itype (Node8) - -- Class_Wide_Type (Node9) - -- Referenced_Object (Node10) - -- Full_View (Node11) - -- Esize (Uint12) - -- RM_Size (Uint13) - -- Alignment (Uint14) - - -- Depends_On_Private (Flag14) - -- Discard_Names (Flag88) - -- Finalize_Storage_Only (Flag158) (base type only) - -- From_With_Type (Flag159) - -- Has_Aliased_Components (Flag135) (base type only) - -- Has_Alignment_Clause (Flag46) - -- Has_Atomic_Components (Flag86) (base type only) - -- Has_Completion_In_Body (Flag71) - -- Has_Complex_Representation (Flag140) (base type only) - -- Has_Constrained_Partial_View (Flag187) - -- Has_Discriminants (Flag5) - -- Has_Non_Standard_Rep (Flag75) (base type only) - -- Has_Object_Size_Clause (Flag172) - -- Has_Primitive_Operations (Flag120) (base type only) - -- Has_Size_Clause (Flag29) - -- Has_Specified_Layout (Flag100) (base type only) - -- Has_Specified_Stream_Input (Flag190) - -- Has_Specified_Stream_Output (Flag191) - -- Has_Specified_Stream_Read (Flag192) - -- Has_Specified_Stream_Write (Flag193) - -- Has_Task (Flag30) (base type only) - -- Has_Unchecked_Union (Flag123) (base type only) - -- Has_Volatile_Components (Flag87) (base type only) - -- In_Use (Flag8) - -- Is_Abstract (Flag19) - -- Is_Asynchronous (Flag81) - -- Is_Atomic (Flag85) - -- Is_Constr_Subt_For_U_Nominal (Flag80) - -- Is_Constr_Subt_For_UN_Aliased (Flag141) - -- Is_Controlled (Flag42) (base type only) - -- Is_Eliminated (Flag124) - -- Is_Frozen (Flag4) - -- Is_Generic_Actual_Type (Flag94) - -- Is_Generic_Type (Flag13) - -- Is_Limited_Interface (Flag197) - -- Is_Protected_Interface (Flag198) - -- Is_Synchronized_Interface (Flag199) - -- Is_Task_Interface (Flag200) - -- Is_Non_Static_Subtype (Flag109) - -- Is_Packed (Flag51) (base type only) - -- Is_Private_Composite (Flag107) - -- Is_Renaming_Of_Object (Flag112) - -- Is_Tagged_Type (Flag55) - -- Is_Unsigned_Type (Flag144) - -- Is_Volatile (Flag16) - -- Itype_Printed (Flag202) (itypes only) - -- Known_To_Have_Preelab_Init (Flag207) - -- Must_Be_On_Byte_Boundary (Flag183) - -- Must_Have_Preelab_Init (Flag208) - -- Size_Depends_On_Discriminant (Flag177) - -- Size_Known_At_Compile_Time (Flag92) - -- Strict_Alignment (Flag145) (base type only) - -- Suppress_Init_Proc (Flag105) (base type only) - -- Treat_As_Volatile (Flag41) - - -- Alignment_Clause (synth) - -- Ancestor_Subtype (synth) - -- Base_Type (synth) - -- First_Subtype (synth) - -- Has_Private_Ancestor (synth) - -- Implementation_Base_Type (synth) - -- Is_By_Copy_Type (synth) - -- Is_By_Reference_Type (synth) - -- Is_Inherently_Limited_Type (synth) - -- Root_Type (synth) - -- Size_Clause (synth) + -- Associated_Node_For_Itype (Node8) + -- Class_Wide_Type (Node9) + -- Referenced_Object (Node10) + -- Full_View (Node11) + -- Esize (Uint12) + -- RM_Size (Uint13) + -- Alignment (Uint14) + + -- Depends_On_Private (Flag14) + -- Discard_Names (Flag88) + -- Finalize_Storage_Only (Flag158) (base type only) + -- From_With_Type (Flag159) + -- Has_Aliased_Components (Flag135) (base type only) + -- Has_Alignment_Clause (Flag46) + -- Has_Atomic_Components (Flag86) (base type only) + -- Has_Completion_In_Body (Flag71) + -- Has_Complex_Representation (Flag140) (base type only) + -- Has_Constrained_Partial_View (Flag187) + -- Has_Discriminants (Flag5) + -- Has_Non_Standard_Rep (Flag75) (base type only) + -- Has_Object_Size_Clause (Flag172) + -- Has_Pragma_Unreferenced_Objects (Flag212) + -- Has_Primitive_Operations (Flag120) (base type only) + -- Has_Size_Clause (Flag29) + -- Has_Specified_Layout (Flag100) (base type only) + -- Has_Specified_Stream_Input (Flag190) + -- Has_Specified_Stream_Output (Flag191) + -- Has_Specified_Stream_Read (Flag192) + -- Has_Specified_Stream_Write (Flag193) + -- Has_Task (Flag30) (base type only) + -- Has_Unchecked_Union (Flag123) (base type only) + -- Has_Volatile_Components (Flag87) (base type only) + -- In_Use (Flag8) + -- Is_Abstract_Type (Flag146) + -- Is_Asynchronous (Flag81) + -- Is_Atomic (Flag85) + -- Is_Constr_Subt_For_U_Nominal (Flag80) + -- Is_Constr_Subt_For_UN_Aliased (Flag141) + -- Is_Controlled (Flag42) (base type only) + -- Is_Eliminated (Flag124) + -- Is_Frozen (Flag4) + -- Is_Generic_Actual_Type (Flag94) + -- Is_Generic_Type (Flag13) + -- Is_Limited_Interface (Flag197) + -- Is_Protected_Interface (Flag198) + -- Is_Synchronized_Interface (Flag199) + -- Is_Task_Interface (Flag200) + -- Is_Non_Static_Subtype (Flag109) + -- Is_Packed (Flag51) (base type only) + -- Is_Private_Composite (Flag107) + -- Is_Renaming_Of_Object (Flag112) + -- Is_Tagged_Type (Flag55) + -- Is_Unsigned_Type (Flag144) + -- Is_Volatile (Flag16) + -- Itype_Printed (Flag202) (itypes only) + -- Known_To_Have_Preelab_Init (Flag207) + -- Must_Be_On_Byte_Boundary (Flag183) + -- Must_Have_Preelab_Init (Flag208) + -- Size_Depends_On_Discriminant (Flag177) + -- Size_Known_At_Compile_Time (Flag92) + -- Strict_Alignment (Flag145) (base type only) + -- Suppress_Init_Proc (Flag105) (base type only) + -- Treat_As_Volatile (Flag41) + + -- Alignment_Clause (synth) + -- Ancestor_Subtype (synth) + -- Base_Type (synth) + -- First_Subtype (synth) + -- Has_Private_Ancestor (synth) + -- Implementation_Base_Type (synth) + -- Is_Access_Protected_Subprogram_Type (synth) + -- Is_By_Copy_Type (synth) + -- Is_By_Reference_Type (synth) + -- Is_Inherently_Limited_Type (synth) + -- Root_Type (synth) + -- Size_Clause (synth) ------------------------------------------ -- Applicable attributes by entity kind -- ------------------------------------------ -- E_Access_Protected_Subprogram_Type - -- Equivalent_Type (Node18) - -- Directly_Designated_Type (Node20) - -- Original_Access_Type (Node21) - -- Needs_No_Actuals (Flag22) - -- (plus type attributes) + -- Equivalent_Type (Node18) + -- Directly_Designated_Type (Node20) + -- Original_Access_Type (Node21) + -- Needs_No_Actuals (Flag22) + -- (plus type attributes) -- E_Access_Subprogram_Type - -- Equivalent_Type (Node18) (remote types only) - -- Directly_Designated_Type (Node20) - -- Original_Access_Type (Node21) - -- Needs_No_Actuals (Flag22) - -- (plus type attributes) + -- Equivalent_Type (Node18) (remote types only) + -- Directly_Designated_Type (Node20) + -- Original_Access_Type (Node21) + -- Needs_No_Actuals (Flag22) + -- (plus type attributes) -- E_Access_Type -- E_Access_Subtype - -- Storage_Size_Variable (Node15) (base type only) - -- Master_Id (Node17) - -- Directly_Designated_Type (Node20) - -- Associated_Storage_Pool (Node22) (base type only) - -- Associated_Final_Chain (Node23) - -- Has_Pragma_Controlled (Flag27) (base type only) - -- Has_Storage_Size_Clause (Flag23) (base type only) - -- Is_Local_Anonymous_Access (Flag194) - -- Is_Access_Constant (Flag69) - -- Is_Pure_Unit_Access_Type (Flag189) - -- No_Pool_Assigned (Flag131) (base type only) - -- No_Strict_Aliasing (Flag136) (base type only) + -- Storage_Size_Variable (Node15) (base type only) + -- Master_Id (Node17) + -- Directly_Designated_Type (Node20) + -- Associated_Storage_Pool (Node22) (base type only) + -- Associated_Final_Chain (Node23) + -- Has_Pragma_Controlled (Flag27) (base type only) + -- Has_Storage_Size_Clause (Flag23) (base type only) + -- Is_Local_Anonymous_Access (Flag194) + -- Is_Access_Constant (Flag69) + -- Is_Pure_Unit_Access_Type (Flag189) + -- No_Pool_Assigned (Flag131) (base type only) + -- No_Strict_Aliasing (Flag136) (base type only) -- (plus type attributes) -- E_Access_Attribute_Type - -- Directly_Designated_Type (Node20) + -- Directly_Designated_Type (Node20) -- (plus type attributes) -- E_Allocator_Type - -- Directly_Designated_Type (Node20) + -- Directly_Designated_Type (Node20) -- (plus type attributes) -- E_Anonymous_Access_Subprogram_Type -- E_Anonymous_Access_Protected_Subprogram_Type -- E_Anonymous_Access_Type - -- Storage_Size_Variable (Node15) ??? is this needed ??? - -- Directly_Designated_Type (Node20) + -- Storage_Size_Variable (Node15) ??? is this needed ??? + -- Directly_Designated_Type (Node20) -- (plus type attributes) -- E_Array_Type -- E_Array_Subtype - -- First_Index (Node17) - -- Related_Array_Object (Node19) - -- Component_Type (Node20) (base type only) - -- Original_Array_Type (Node21) - -- Component_Size (Uint22) (base type only) - -- Packed_Array_Type (Node23) - -- Component_Alignment (special) (base type only) - -- Has_Component_Size_Clause (Flag68) (base type only) - -- Has_Pragma_Pack (Flag121) (base type only) - -- Is_Aliased (Flag15) - -- Is_Constrained (Flag12) - -- Next_Index (synth) - -- Number_Dimensions (synth) - -- (plus type attributes) + -- First_Index (Node17) + -- Related_Array_Object (Node19) + -- Component_Type (Node20) (base type only) + -- Original_Array_Type (Node21) + -- Component_Size (Uint22) (base type only) + -- Packed_Array_Type (Node23) + -- Component_Alignment (special) (base type only) + -- Has_Component_Size_Clause (Flag68) (base type only) + -- Has_Pragma_Pack (Flag121) (base type only) + -- Is_Aliased (Flag15) + -- Is_Constrained (Flag12) + -- Next_Index (synth) + -- Number_Dimensions (synth) + -- (plus type attributes) -- E_Block - -- Block_Node (Node11) - -- First_Entity (Node17) - -- Last_Entity (Node20) - -- Delay_Cleanups (Flag114) - -- Discard_Names (Flag88) - -- Finalization_Chain_Entity (Node19) - -- Scope_Depth_Value (Uint22) - -- Entry_Cancel_Parameter (Node23) - -- Has_Master_Entity (Flag21) - -- Has_Nested_Block_With_Handler (Flag101) - -- Sec_Stack_Needed_For_Return (Flag167) - -- Uses_Sec_Stack (Flag95) - -- Scope_Depth (synth) + -- Block_Node (Node11) + -- First_Entity (Node17) + -- Last_Entity (Node20) + -- Finalization_Chain_Entity (Node19) + -- Scope_Depth_Value (Uint22) + -- Entry_Cancel_Parameter (Node23) + -- Delay_Cleanups (Flag114) + -- Discard_Names (Flag88) + -- Has_Master_Entity (Flag21) + -- Has_Nested_Block_With_Handler (Flag101) + -- Sec_Stack_Needed_For_Return (Flag167) + -- Uses_Sec_Stack (Flag95) + -- Scope_Depth (synth) -- E_Class_Wide_Type -- E_Class_Wide_Subtype - -- Cloned_Subtype (Node16) (subtype case only) - -- First_Entity (Node17) - -- Equivalent_Type (Node18) (always Empty in type case) - -- Last_Entity (Node20) - -- First_Component (synth) - -- (plus type attributes) + -- Cloned_Subtype (Node16) (subtype case only) + -- First_Entity (Node17) + -- Equivalent_Type (Node18) (always Empty for type) + -- Last_Entity (Node20) + -- First_Component (synth) + -- First_Component_Or_Discriminant (synth) + -- First_Discriminant (synth) + -- (plus type attributes) -- E_Component - -- Normalized_First_Bit (Uint8) - -- Current_Value (Node9) (always Empty) - -- Normalized_Position_Max (Uint10) - -- Component_Bit_Offset (Uint11) - -- Esize (Uint12) - -- Component_Clause (Node13) - -- Normalized_Position (Uint14) - -- DT_Entry_Count (Uint15) - -- Entry_Formal (Node16) - -- Prival (Node17) - -- Renamed_Object (Node18) (always Empty) - -- Discriminant_Checking_Func (Node20) - -- Interface_Name (Node21) (JGNAT usage only) - -- Original_Record_Component (Node22) - -- Protected_Operation (Node23) - -- DT_Offset_To_Top_Func (Node25) - -- Has_Biased_Representation (Flag139) - -- Has_Per_Object_Constraint (Flag154) - -- Is_Atomic (Flag85) - -- Is_Tag (Flag78) - -- Is_Volatile (Flag16) - -- Treat_As_Volatile (Flag41) - -- Is_Return_Object (Flag209) - -- Is_Protected_Private (synth) - -- Next_Component (synth) - -- Next_Tag_Component (synth) + -- Normalized_First_Bit (Uint8) + -- Current_Value (Node9) (always Empty) + -- Normalized_Position_Max (Uint10) + -- Component_Bit_Offset (Uint11) + -- Esize (Uint12) + -- Component_Clause (Node13) + -- Normalized_Position (Uint14) + -- DT_Entry_Count (Uint15) + -- Entry_Formal (Node16) + -- Prival (Node17) + -- Renamed_Object (Node18) (always Empty) + -- Discriminant_Checking_Func (Node20) + -- Interface_Name (Node21) (JGNAT usage only) + -- Original_Record_Component (Node22) + -- Protected_Operation (Node23) + -- DT_Offset_To_Top_Func (Node25) + -- Has_Biased_Representation (Flag139) + -- Has_Per_Object_Constraint (Flag154) + -- Is_Atomic (Flag85) + -- Is_Tag (Flag78) + -- Is_Volatile (Flag16) + -- Treat_As_Volatile (Flag41) + -- Is_Return_Object (Flag209) + -- Is_Protected_Private (synth) + -- Next_Component (synth) + -- Next_Component_Or_Discriminant (synth) + -- Next_Tag_Component (synth) -- E_Constant -- E_Loop_Parameter - -- Current_Value (Node9) (always Empty) - -- Discriminal_Link (Node10) (discriminals only) - -- Full_View (Node11) - -- Esize (Uint12) - -- Alignment (Uint14) - -- Actual_Subtype (Node17) - -- Renamed_Object (Node18) - -- Size_Check_Code (Node19) (constants only) - -- In_Private_Part (Flag45) - -- Interface_Name (Node21) - -- Has_Alignment_Clause (Flag46) - -- Has_Atomic_Components (Flag86) - -- Has_Biased_Representation (Flag139) - -- Has_Completion (Flag26) (constants only) - -- Has_Size_Clause (Flag29) - -- Has_Volatile_Components (Flag87) - -- Is_Atomic (Flag85) - -- Is_Eliminated (Flag124) - -- Is_True_Constant (Flag163) - -- Is_Volatile (Flag16) - -- Never_Set_In_Source (Flag115) - -- Treat_As_Volatile (Flag41) - -- Is_Return_Object (Flag209) - -- Address_Clause (synth) - -- Alignment_Clause (synth) - -- Constant_Value (synth) - -- Size_Clause (synth) + -- Current_Value (Node9) (always Empty) + -- Discriminal_Link (Node10) (discriminals only) + -- Full_View (Node11) + -- Esize (Uint12) + -- Alignment (Uint14) + -- Actual_Subtype (Node17) + -- Renamed_Object (Node18) + -- Size_Check_Code (Node19) (constants only) + -- In_Private_Part (Flag45) + -- Interface_Name (Node21) + -- Has_Alignment_Clause (Flag46) + -- Has_Atomic_Components (Flag86) + -- Has_Biased_Representation (Flag139) + -- Has_Completion (Flag26) (constants only) + -- Has_Size_Clause (Flag29) + -- Has_Volatile_Components (Flag87) + -- Is_Atomic (Flag85) + -- Is_Eliminated (Flag124) + -- Is_True_Constant (Flag163) + -- Is_Volatile (Flag16) + -- Never_Set_In_Source (Flag115) + -- Treat_As_Volatile (Flag41) + -- Is_Return_Object (Flag209) + -- Address_Clause (synth) + -- Alignment_Clause (synth) + -- Constant_Value (synth) + -- Size_Clause (synth) -- E_Decimal_Fixed_Point_Type -- E_Decimal_Fixed_Subtype - -- Scale_Value (Uint15) - -- Digits_Value (Uint17) - -- Scalar_Range (Node20) - -- Delta_Value (Ureal18) - -- Small_Value (Ureal21) - -- Has_Machine_Radix_Clause (Flag83) - -- Machine_Radix_10 (Flag84) - -- Type_Low_Bound (synth) - -- Type_High_Bound (synth) - -- (plus type attributes) + -- Scale_Value (Uint15) + -- Digits_Value (Uint17) + -- Scalar_Range (Node20) + -- Delta_Value (Ureal18) + -- Small_Value (Ureal21) + -- Has_Machine_Radix_Clause (Flag83) + -- Machine_Radix_10 (Flag84) + -- Type_Low_Bound (synth) + -- Type_High_Bound (synth) + -- (plus type attributes) -- E_Discriminant - -- Normalized_First_Bit (Uint8) - -- Current_Value (Node9) (always Empty) - -- Normalized_Position_Max (Uint10) - -- Component_Bit_Offset (Uint11) - -- Esize (Uint12) - -- Component_Clause (Node13) - -- Normalized_Position (Uint14) - -- Discriminant_Number (Uint15) - -- Discriminal (Node17) - -- Renamed_Object (Node18) (always Empty) - -- Corresponding_Discriminant (Node19) - -- Discriminant_Default_Value (Node20) - -- Interface_Name (Node21) (JGNAT usage only) - -- Original_Record_Component (Node22) - -- CR_Discriminant (Node23) - -- Is_Return_Object (Flag209) - -- Next_Discriminant (synth) - -- Next_Stored_Discriminant (synth) + -- Normalized_First_Bit (Uint8) + -- Current_Value (Node9) (always Empty) + -- Normalized_Position_Max (Uint10) + -- Component_Bit_Offset (Uint11) + -- Esize (Uint12) + -- Component_Clause (Node13) + -- Normalized_Position (Uint14) + -- Discriminant_Number (Uint15) + -- Discriminal (Node17) + -- Renamed_Object (Node18) (always Empty) + -- Corresponding_Discriminant (Node19) + -- Discriminant_Default_Value (Node20) + -- Interface_Name (Node21) (JGNAT usage only) + -- Original_Record_Component (Node22) + -- CR_Discriminant (Node23) + -- Is_Return_Object (Flag209) + -- Next_Component_Or_Discriminant (synth) + -- Next_Discriminant (synth) + -- Next_Stored_Discriminant (synth) -- E_Entry -- E_Entry_Family - -- Protected_Body_Subprogram (Node11) - -- Barrier_Function (Node12) - -- Entry_Parameters_Type (Node15) - -- First_Entity (Node17) - -- Alias (Node18) (Entry only. Always empty) - -- Finalization_Chain_Entity (Node19) - -- Last_Entity (Node20) - -- Accept_Address (Elist21) - -- Scope_Depth_Value (Uint22) - -- Privals_Chain (Elist23) (for a protected entry) - -- Default_Expressions_Processed (Flag108) - -- Entry_Accepted (Flag152) - -- Is_AST_Entry (Flag132) (for entry only) - -- Needs_No_Actuals (Flag22) - -- Sec_Stack_Needed_For_Return (Flag167) - -- Uses_Sec_Stack (Flag95) - -- Address_Clause (synth) - -- First_Formal (synth) - -- First_Formal_With_Extras (synth) - -- Entry_Index_Type (synth) - -- Number_Formals (synth) - -- Scope_Depth (synth) + -- Protected_Body_Subprogram (Node11) + -- Barrier_Function (Node12) + -- Entry_Parameters_Type (Node15) + -- First_Entity (Node17) + -- Alias (Node18) (for entry only. Empty) + -- Finalization_Chain_Entity (Node19) + -- Last_Entity (Node20) + -- Accept_Address (Elist21) + -- Scope_Depth_Value (Uint22) + -- Privals_Chain (Elist23) (for a protected entry) + -- Default_Expressions_Processed (Flag108) + -- Entry_Accepted (Flag152) + -- Is_AST_Entry (Flag132) (for entry only) + -- Needs_No_Actuals (Flag22) + -- Sec_Stack_Needed_For_Return (Flag167) + -- Uses_Sec_Stack (Flag95) + -- Address_Clause (synth) + -- First_Formal (synth) + -- First_Formal_With_Extras (synth) + -- Entry_Index_Type (synth) + -- Number_Formals (synth) + -- Scope_Depth (synth) -- E_Entry_Index_Parameter - -- Entry_Index_Constant (Node18) + -- Entry_Index_Constant (Node18) -- E_Enumeration_Literal - -- Enumeration_Pos (Uint11) - -- Enumeration_Rep (Uint12) - -- Debug_Renaming_Link (Node13) - -- Alias (Node18) - -- Enumeration_Rep_Expr (Node22) - -- Next_Literal (synth) + -- Enumeration_Pos (Uint11) + -- Enumeration_Rep (Uint12) + -- Debug_Renaming_Link (Node13) + -- Alias (Node18) + -- Enumeration_Rep_Expr (Node22) + -- Next_Literal (synth) -- E_Enumeration_Type -- E_Enumeration_Subtype - -- Lit_Indexes (Node15) (root type only) - -- Lit_Strings (Node16) (root type only) - -- First_Literal (Node17) - -- Scalar_Range (Node20) - -- Enum_Pos_To_Rep (Node23) (type only, not subtype) - -- Has_Biased_Representation (Flag139) - -- Has_Contiguous_Rep (Flag181) - -- Has_Enumeration_Rep_Clause (Flag66) - -- Nonzero_Is_True (Flag162) (base type only) - -- Type_Low_Bound (synth) - -- Type_High_Bound (synth) - -- (plus type attributes) + -- Lit_Indexes (Node15) (root type only) + -- Lit_Strings (Node16) (root type only) + -- First_Literal (Node17) + -- Scalar_Range (Node20) + -- Enum_Pos_To_Rep (Node23) (type only) + -- Has_Biased_Representation (Flag139) + -- Has_Contiguous_Rep (Flag181) + -- Has_Enumeration_Rep_Clause (Flag66) + -- Nonzero_Is_True (Flag162) (base type only) + -- Type_Low_Bound (synth) + -- Type_High_Bound (synth) + -- (plus type attributes) -- E_Exception - -- Alignment (Uint14) - -- Renamed_Entity (Node18) - -- Register_Exception_Call (Node20) - -- Interface_Name (Node21) - -- Exception_Code (Uint22) - -- Discard_Names (Flag88) - -- Is_VMS_Exception (Flag133) + -- Alignment (Uint14) + -- Renamed_Entity (Node18) + -- Register_Exception_Call (Node20) + -- Interface_Name (Node21) + -- Exception_Code (Uint22) + -- Discard_Names (Flag88) + -- Is_VMS_Exception (Flag133) -- E_Exception_Type - -- Equivalent_Type (Node18) - -- (plus type attributes) + -- Equivalent_Type (Node18) + -- (plus type attributes) -- E_Floating_Point_Type -- E_Floating_Point_Subtype - -- Digits_Value (Uint17) - -- Scalar_Range (Node20) - -- Type_Low_Bound (synth) - -- Type_High_Bound (synth) - -- (plus type attributes) + -- Digits_Value (Uint17) + -- Scalar_Range (Node20) + -- Type_Low_Bound (synth) + -- Type_High_Bound (synth) + -- (plus type attributes) -- E_Function -- E_Generic_Function - -- Mechanism (Uint8) (returns Mechanism_Type) - -- Renaming_Map (Uint9) - -- Handler_Records (List10) (non-generic case only) - -- Protected_Body_Subprogram (Node11) - -- Next_Inlined_Subprogram (Node12) - -- Corresponding_Equality (Node13) (implicit /= only) - -- Elaboration_Entity (Node13) (all other cases) - -- First_Optional_Parameter (Node14) (non-generic case only) - -- DT_Position (Uint15) - -- DTC_Entity (Node16) - -- First_Entity (Node17) - -- Alias (Node18) (non-generic case only) - -- Renamed_Entity (Node18) (generic case only) - -- Finalization_Chain_Entity (Node19) - -- Last_Entity (Node20) - -- Interface_Name (Node21) - -- Scope_Depth_Value (Uint22) - -- Generic_Renamings (Elist23) (for an instance) - -- Inner_Instances (Elist23) (for a generic function) - -- Privals_Chain (Elist23) (for a protected function) - -- Abstract_Interface_Alias (Node25) - -- Overridden_Operation (Node26) - -- Extra_Formals (Node28) - -- Body_Needed_For_SAL (Flag40) - -- Elaboration_Entity_Required (Flag174) - -- Function_Returns_With_DSP (Flag169) - -- Default_Expressions_Processed (Flag108) - -- Delay_Cleanups (Flag114) - -- Delay_Subprogram_Descriptors (Flag50) - -- Discard_Names (Flag88) - -- Has_Completion (Flag26) - -- Has_Controlling_Result (Flag98) - -- Has_Master_Entity (Flag21) - -- Has_Missing_Return (Flag142) - -- Has_Nested_Block_With_Handler (Flag101) - -- Has_Recursive_Call (Flag143) - -- Has_Subprogram_Descriptor (Flag93) - -- Is_Abstract (Flag19) - -- Is_Called (Flag102) (non-generic case only) - -- Is_Constructor (Flag76) - -- Is_Discrim_SO_Function (Flag176) - -- Is_Eliminated (Flag124) - -- Is_Instantiated (Flag126) (generic case only) - -- Is_Intrinsic_Subprogram (Flag64) - -- Is_Machine_Code_Subprogram (Flag137) (non-generic case only) - -- Is_Overriding_Operation (Flag39) (non-generic case only) - -- Is_Private_Descendant (Flag53) - -- Is_Pure (Flag44) - -- Is_Thread_Body (Flag77) (non-generic case only) - -- Is_Visible_Child_Unit (Flag116) - -- Needs_No_Actuals (Flag22) - -- Return_Present (Flag54) - -- Returns_By_Ref (Flag90) - -- Sec_Stack_Needed_For_Return (Flag167) - -- Uses_Sec_Stack (Flag95) - -- Address_Clause (synth) - -- First_Formal (synth) - -- First_Formal_With_Extras (synth) - -- Number_Formals (synth) - -- Scope_Depth (synth) + -- Mechanism (Uint8) (Mechanism_Type) + -- Renaming_Map (Uint9) + -- Handler_Records (List10) (non-generic case only) + -- Protected_Body_Subprogram (Node11) + -- Next_Inlined_Subprogram (Node12) + -- Corresponding_Equality (Node13) (implicit /= only) + -- Elaboration_Entity (Node13) (all other cases) + -- First_Optional_Parameter (Node14) (non-generic case only) + -- DT_Position (Uint15) + -- DTC_Entity (Node16) + -- First_Entity (Node17) + -- Alias (Node18) (non-generic case only) + -- Renamed_Entity (Node18) (generic case only) + -- Finalization_Chain_Entity (Node19) + -- Last_Entity (Node20) + -- Interface_Name (Node21) + -- Scope_Depth_Value (Uint22) + -- Generic_Renamings (Elist23) (for an instance) + -- Inner_Instances (Elist23) (generic function only) + -- Privals_Chain (Elist23) (protected func only) + -- Abstract_Interface_Alias (Node25) + -- Overridden_Operation (Node26) + -- Extra_Formals (Node28) + -- Body_Needed_For_SAL (Flag40) + -- Elaboration_Entity_Required (Flag174) + -- Function_Returns_With_DSP (Flag169) + -- Default_Expressions_Processed (Flag108) + -- Delay_Cleanups (Flag114) + -- Delay_Subprogram_Descriptors (Flag50) + -- Discard_Names (Flag88) + -- Has_Completion (Flag26) + -- Has_Controlling_Result (Flag98) + -- Has_Master_Entity (Flag21) + -- Has_Missing_Return (Flag142) + -- Has_Nested_Block_With_Handler (Flag101) + -- Has_Recursive_Call (Flag143) + -- Has_Subprogram_Descriptor (Flag93) + -- Is_Abstract_Subprogram (Flag19) (non-generic case only) + -- Is_Called (Flag102) (non-generic case only) + -- Is_Constructor (Flag76) + -- Is_Discrim_SO_Function (Flag176) + -- Is_Eliminated (Flag124) + -- Is_Instantiated (Flag126) (generic case only) + -- Is_Intrinsic_Subprogram (Flag64) + -- Is_Machine_Code_Subprogram (Flag137) (non-generic case only) + -- Is_Overriding_Operation (Flag39) (non-generic case only) + -- Is_Private_Descendant (Flag53) + -- Is_Pure (Flag44) + -- Is_Thread_Body (Flag77) (non-generic case only) + -- Is_Visible_Child_Unit (Flag116) + -- Needs_No_Actuals (Flag22) + -- Requires_Overriding (Flag213) (non-generic case only) + -- Return_Present (Flag54) + -- Returns_By_Ref (Flag90) + -- Sec_Stack_Needed_For_Return (Flag167) + -- Uses_Sec_Stack (Flag95) + -- Address_Clause (synth) + -- First_Formal (synth) + -- First_Formal_With_Extras (synth) + -- Number_Formals (synth) + -- Scope_Depth (synth) -- E_General_Access_Type - -- Storage_Size_Variable (Node15) (base type only) - -- Master_Id (Node17) - -- Directly_Designated_Type (Node20) - -- Associated_Storage_Pool (Node22) (base type only) - -- Associated_Final_Chain (Node23) + -- Storage_Size_Variable (Node15) (base type only) + -- Master_Id (Node17) + -- Directly_Designated_Type (Node20) + -- Associated_Storage_Pool (Node22) (base type only) + -- Associated_Final_Chain (Node23) -- (plus type attributes) -- E_Generic_In_Parameter -- E_Generic_In_Out_Parameter - -- Current_Value (Node9) (always Empty) - -- Entry_Component (Node11) - -- Actual_Subtype (Node17) - -- Renamed_Object (Node18) (always Empty) - -- Default_Value (Node20) - -- Protected_Formal (Node22) - -- Is_Controlling_Formal (Flag97) - -- Is_Entry_Formal (Flag52) - -- Is_Return_Object (Flag209) - -- Parameter_Mode (synth) + -- Current_Value (Node9) (always Empty) + -- Entry_Component (Node11) + -- Actual_Subtype (Node17) + -- Renamed_Object (Node18) (always Empty) + -- Default_Value (Node20) + -- Protected_Formal (Node22) + -- Is_Controlling_Formal (Flag97) + -- Is_Entry_Formal (Flag52) + -- Is_Return_Object (Flag209) + -- Parameter_Mode (synth) -- E_Incomplete_Type -- E_Incomplete_Subtype - -- Non_Limited_View (Node17) - -- Private_Dependents (Elist18) - -- Discriminant_Constraint (Elist21) - -- Stored_Constraint (Elist23) - -- First_Discriminant (synth) - -- First_Stored_Discriminant (synth) + -- Non_Limited_View (Node17) + -- Private_Dependents (Elist18) + -- Discriminant_Constraint (Elist21) + -- Stored_Constraint (Elist23) + -- First_Discriminant (synth) + -- First_Stored_Discriminant (synth) -- (plus type attributes) -- E_In_Parameter -- E_In_Out_Parameter -- E_Out_Parameter - -- Mechanism (Uint8) (returns Mechanism_Type) - -- Current_Value (Node9) - -- Discriminal_Link (Node10) (discriminals only) - -- Entry_Component (Node11) - -- Esize (Uint12) - -- Extra_Accessibility (Node13) - -- Alignment (Uint14) - -- Extra_Formal (Node15) - -- Unset_Reference (Node16) - -- Actual_Subtype (Node17) - -- Renamed_Object (Node18) - -- Spec_Entity (Node19) - -- Default_Value (Node20) - -- Default_Expr_Function (Node21) - -- Protected_Formal (Node22) - -- Extra_Constrained (Node23) - -- Is_Controlling_Formal (Flag97) - -- Is_Entry_Formal (Flag52) - -- Is_Optional_Parameter (Flag134) - -- Low_Bound_Known (Flag205) - -- Never_Set_In_Source (Flag115) - -- Is_Return_Object (Flag209) - -- Parameter_Mode (synth) + -- Mechanism (Uint8) (Mechanism_Type) + -- Current_Value (Node9) + -- Discriminal_Link (Node10) (discriminals only) + -- Entry_Component (Node11) + -- Esize (Uint12) + -- Extra_Accessibility (Node13) + -- Alignment (Uint14) + -- Extra_Formal (Node15) + -- Unset_Reference (Node16) + -- Actual_Subtype (Node17) + -- Renamed_Object (Node18) + -- Spec_Entity (Node19) + -- Default_Value (Node20) + -- Default_Expr_Function (Node21) + -- Protected_Formal (Node22) + -- Extra_Constrained (Node23) + -- Is_Controlling_Formal (Flag97) + -- Is_Entry_Formal (Flag52) + -- Is_Optional_Parameter (Flag134) + -- Low_Bound_Known (Flag205) + -- Never_Set_In_Source (Flag115) + -- Is_Return_Object (Flag209) + -- Parameter_Mode (synth) -- E_Label - -- Enclosing_Scope (Node18) - -- Reachable (Flag49) + -- Enclosing_Scope (Node18) + -- Reachable (Flag49) -- E_Limited_Private_Type -- E_Limited_Private_Subtype - -- First_Entity (Node17) - -- Private_Dependents (Elist18) - -- Underlying_Full_View (Node19) - -- Last_Entity (Node20) - -- Discriminant_Constraint (Elist21) - -- Private_View (Node22) - -- Stored_Constraint (Elist23) - -- Has_Completion (Flag26) - -- First_Discriminant (synth) - -- First_Stored_Discriminant (synth) + -- First_Entity (Node17) + -- Private_Dependents (Elist18) + -- Underlying_Full_View (Node19) + -- Last_Entity (Node20) + -- Discriminant_Constraint (Elist21) + -- Private_View (Node22) + -- Stored_Constraint (Elist23) + -- Has_Completion (Flag26) + -- First_Discriminant (synth) + -- First_Stored_Discriminant (synth) -- (plus type attributes) -- E_Loop - -- Has_Exit (Flag47) - -- Has_Master_Entity (Flag21) - -- Has_Nested_Block_With_Handler (Flag101) + -- Has_Exit (Flag47) + -- Has_Master_Entity (Flag21) + -- Has_Nested_Block_With_Handler (Flag101) -- E_Modular_Integer_Type -- E_Modular_Integer_Subtype - -- Modulus (Uint17) (base type only) - -- Original_Array_Type (Node21) - -- Scalar_Range (Node20) - -- Non_Binary_Modulus (Flag58) (base type only) - -- Has_Biased_Representation (Flag139) - -- Type_Low_Bound (synth) - -- Type_High_Bound (synth) + -- Modulus (Uint17) (base type only) + -- Original_Array_Type (Node21) + -- Scalar_Range (Node20) + -- Non_Binary_Modulus (Flag58) (base type only) + -- Has_Biased_Representation (Flag139) + -- Type_Low_Bound (synth) + -- Type_High_Bound (synth) -- (plus type attributes) -- E_Named_Integer - -- Constant_Value (synth) + -- Constant_Value (synth) -- E_Named_Real - -- Constant_Value (synth) + -- Constant_Value (synth) -- E_Operator - -- First_Entity (Node17) - -- Alias (Node18) - -- Last_Entity (Node20) - -- Is_Machine_Code_Subprogram (Flag137) - -- Is_Pure (Flag44) - -- Is_Intrinsic_Subprogram (Flag64) - -- Is_Overriding_Operation (Flag39) - -- Default_Expressions_Processed (Flag108) + -- First_Entity (Node17) + -- Alias (Node18) + -- Last_Entity (Node20) + -- Is_Machine_Code_Subprogram (Flag137) + -- Is_Pure (Flag44) + -- Is_Intrinsic_Subprogram (Flag64) + -- Is_Overriding_Operation (Flag39) + -- Default_Expressions_Processed (Flag108) -- E_Ordinary_Fixed_Point_Type -- E_Ordinary_Fixed_Point_Subtype - -- Delta_Value (Ureal18) - -- Scalar_Range (Node20) - -- Small_Value (Ureal21) - -- Has_Small_Clause (Flag67) - -- Type_Low_Bound (synth) - -- Type_High_Bound (synth) - -- (plus type attributes) + -- Delta_Value (Ureal18) + -- Scalar_Range (Node20) + -- Small_Value (Ureal21) + -- Has_Small_Clause (Flag67) + -- Type_Low_Bound (synth) + -- Type_High_Bound (synth) + -- (plus type attributes) -- E_Package -- E_Generic_Package - -- Dependent_Instances (Elist8) (for an instance) - -- Renaming_Map (Uint9) - -- Handler_Records (List10) (non-generic case only) - -- Generic_Homonym (Node11) (generic case only) - -- Associated_Formal_Package (Node12) - -- Elaboration_Entity (Node13) - -- Shadow_Entities (List14) - -- Related_Instance (Node15) (non-generic case only) - -- First_Private_Entity (Node16) - -- First_Entity (Node17) - -- Renamed_Entity (Node18) - -- Body_Entity (Node19) - -- Last_Entity (Node20) - -- Interface_Name (Node21) - -- Scope_Depth_Value (Uint22) - -- Generic_Renamings (Elist23) (for an instance) - -- Inner_Instances (Elist23) (generic case only) - -- Limited_View (Node23) (non-generic, not instance) - -- Current_Use_Clause (Node25) - -- Package_Instantiation (Node26) - -- Delay_Subprogram_Descriptors (Flag50) - -- Body_Needed_For_SAL (Flag40) - -- Discard_Names (Flag88) - -- Elaboration_Entity_Required (Flag174) - -- Elaborate_Body_Desirable (Flag210) (non-generic case only) - -- From_With_Type (Flag159) - -- Has_All_Calls_Remote (Flag79) - -- Has_Completion (Flag26) - -- Has_Forward_Instantiation (Flag175) - -- Has_Master_Entity (Flag21) - -- Has_Subprogram_Descriptor (Flag93) - -- In_Package_Body (Flag48) - -- In_Private_Part (Flag45) - -- In_Use (Flag8) - -- Is_Instantiated (Flag126) - -- Is_Private_Descendant (Flag53) - -- Is_Visible_Child_Unit (Flag116) - -- Is_Wrapper_Package (synth) (non-generic case only) - -- Scope_Depth (synth) + -- Dependent_Instances (Elist8) (for an instance) + -- Renaming_Map (Uint9) + -- Handler_Records (List10) (non-generic case only) + -- Generic_Homonym (Node11) (generic case only) + -- Associated_Formal_Package (Node12) + -- Elaboration_Entity (Node13) + -- Shadow_Entities (List14) + -- Related_Instance (Node15) (non-generic case only) + -- First_Private_Entity (Node16) + -- First_Entity (Node17) + -- Renamed_Entity (Node18) + -- Body_Entity (Node19) + -- Last_Entity (Node20) + -- Interface_Name (Node21) + -- Scope_Depth_Value (Uint22) + -- Generic_Renamings (Elist23) (for an instance) + -- Inner_Instances (Elist23) (generic case only) + -- Limited_View (Node23) (non-generic/instance) + -- Current_Use_Clause (Node25) + -- Package_Instantiation (Node26) + -- Delay_Subprogram_Descriptors (Flag50) + -- Body_Needed_For_SAL (Flag40) + -- Discard_Names (Flag88) + -- Elaboration_Entity_Required (Flag174) + -- Elaborate_Body_Desirable (Flag210) (non-generic case only) + -- From_With_Type (Flag159) + -- Has_All_Calls_Remote (Flag79) + -- Has_Completion (Flag26) + -- Has_Forward_Instantiation (Flag175) + -- Has_Master_Entity (Flag21) + -- Has_RACW (Flag214) (non-generic case only) + -- Has_Subprogram_Descriptor (Flag93) + -- In_Package_Body (Flag48) + -- In_Private_Part (Flag45) + -- In_Use (Flag8) + -- Is_Instantiated (Flag126) + -- Is_Private_Descendant (Flag53) + -- Is_Visible_Child_Unit (Flag116) + -- Is_Wrapper_Package (synth) (non-generic case only) + -- Scope_Depth (synth) -- E_Package_Body - -- Handler_Records (List10) (non-generic case only) - -- Related_Instance (Node15) (non-generic case only) - -- First_Entity (Node17) - -- Spec_Entity (Node19) - -- Last_Entity (Node20) - -- Scope_Depth_Value (Uint22) - -- Scope_Depth (synth) - -- Delay_Subprogram_Descriptors (Flag50) - -- Has_Subprogram_Descriptor (Flag93) + -- Handler_Records (List10) (non-generic case only) + -- Related_Instance (Node15) (non-generic case only) + -- First_Entity (Node17) + -- Spec_Entity (Node19) + -- Last_Entity (Node20) + -- Scope_Depth_Value (Uint22) + -- Scope_Depth (synth) + -- Delay_Subprogram_Descriptors (Flag50) + -- Has_Subprogram_Descriptor (Flag93) -- E_Private_Type -- E_Private_Subtype - -- Primitive_Operations (Elist15) - -- First_Entity (Node17) - -- Private_Dependents (Elist18) - -- Underlying_Full_View (Node19) - -- Last_Entity (Node20) - -- Discriminant_Constraint (Elist21) - -- Private_View (Node22) - -- Stored_Constraint (Elist23) - -- Has_Completion (Flag26) - -- Is_Controlled (Flag42) (base type only) - -- Is_For_Access_Subtype (Flag118) (subtype only) - -- First_Discriminant (synth) - -- First_Stored_Discriminant (synth) + -- Primitive_Operations (Elist15) + -- First_Entity (Node17) + -- Private_Dependents (Elist18) + -- Underlying_Full_View (Node19) + -- Last_Entity (Node20) + -- Discriminant_Constraint (Elist21) + -- Private_View (Node22) + -- Stored_Constraint (Elist23) + -- Has_Completion (Flag26) + -- Is_Controlled (Flag42) (base type only) + -- Is_For_Access_Subtype (Flag118) (subtype only) + -- First_Discriminant (synth) + -- First_Stored_Discriminant (synth) -- (plus type attributes) -- E_Procedure -- E_Generic_Procedure - -- Renaming_Map (Uint9) - -- Handler_Records (List10) (non-generic case only) - -- Protected_Body_Subprogram (Node11) - -- Next_Inlined_Subprogram (Node12) - -- Elaboration_Entity (Node13) - -- First_Optional_Parameter (Node14) (non-generic case only) - -- DT_Position (Uint15) - -- DTC_Entity (Node16) - -- First_Entity (Node17) - -- Alias (Node18) (non-generic case only) - -- Renamed_Entity (Node18) (generic case only) - -- Finalization_Chain_Entity (Node19) - -- Last_Entity (Node20) - -- Interface_Name (Node21) - -- Scope_Depth_Value (Uint22) - -- Scope_Depth (synth) - -- Generic_Renamings (Elist23) (for an instance) - -- Inner_Instances (Elist23) (for a generic procedure) - -- Privals_Chain (Elist23) (for a protected procedure) - -- Abstract_Interface_Alias (Node25) - -- Overridden_Operation (Node26) - -- Wrapped_Entity (Node27) (non-generic case only) - -- Extra_Formals (Node28) - -- Body_Needed_For_SAL (Flag40) - -- Elaboration_Entity_Required (Flag174) - -- Function_Returns_With_DSP (Flag169) (always False for procedure) - -- Default_Expressions_Processed (Flag108) - -- Delay_Cleanups (Flag114) - -- Delay_Subprogram_Descriptors (Flag50) - -- Discard_Names (Flag88) - -- Has_Completion (Flag26) - -- Has_Master_Entity (Flag21) - -- Has_Nested_Block_With_Handler (Flag101) - -- Has_Subprogram_Descriptor (Flag93) - -- Is_Visible_Child_Unit (Flag116) - -- Is_Abstract (Flag19) - -- Is_Asynchronous (Flag81) - -- Is_Called (Flag102) (non-generic subprogram) - -- Is_Constructor (Flag76) - -- Is_Eliminated (Flag124) - -- Is_Instantiated (Flag126) (generic case only) - -- Is_Interrupt_Handler (Flag89) - -- Is_Intrinsic_Subprogram (Flag64) - -- Is_Machine_Code_Subprogram (Flag137) (non-generic case only) - -- Is_Null_Init_Proc (Flag178) - -- Is_Overriding_Operation (Flag39) (non-generic case only) - -- Is_Primitive_Wrapper (Flag195) (non-generic case only) - -- Is_Private_Descendant (Flag53) - -- Is_Pure (Flag44) - -- Is_Thread_Body (Flag77) (non-generic case only) - -- Is_Valued_Procedure (Flag127) - -- Is_Visible_Child_Unit (Flag116) - -- Needs_No_Actuals (Flag22) - -- No_Return (Flag113) - -- Sec_Stack_Needed_For_Return (Flag167) - -- Address_Clause (synth) - -- First_Formal (synth) - -- First_Formal_With_Extras (synth) - -- Number_Formals (synth) + -- Renaming_Map (Uint9) + -- Handler_Records (List10) (non-generic case only) + -- Protected_Body_Subprogram (Node11) + -- Next_Inlined_Subprogram (Node12) + -- Elaboration_Entity (Node13) + -- First_Optional_Parameter (Node14) (non-generic case only) + -- DT_Position (Uint15) + -- DTC_Entity (Node16) + -- First_Entity (Node17) + -- Alias (Node18) (non-generic case only) + -- Renamed_Entity (Node18) (generic case only) + -- Finalization_Chain_Entity (Node19) + -- Last_Entity (Node20) + -- Interface_Name (Node21) + -- Scope_Depth_Value (Uint22) + -- Generic_Renamings (Elist23) (for instance) + -- Inner_Instances (Elist23) (for generic proc) + -- Privals_Chain (Elist23) (for protected proc) + -- Abstract_Interface_Alias (Node25) + -- Overridden_Operation (Node26) + -- Wrapped_Entity (Node27) (non-generic case only) + -- Extra_Formals (Node28) + -- Body_Needed_For_SAL (Flag40) + -- Delay_Cleanups (Flag114) + -- Discard_Names (Flag88) + -- Elaboration_Entity_Required (Flag174) + -- Function_Returns_With_DSP (Flag169) (false for procedure) + -- Default_Expressions_Processed (Flag108) + -- Delay_Cleanups (Flag114) + -- Delay_Subprogram_Descriptors (Flag50) + -- Discard_Names (Flag88) + -- Has_Completion (Flag26) + -- Has_Master_Entity (Flag21) + -- Has_Nested_Block_With_Handler (Flag101) + -- Has_Subprogram_Descriptor (Flag93) + -- Is_Visible_Child_Unit (Flag116) + -- Is_Abstract_Subprogram (Flag19) (non-generic case only) + -- Is_Asynchronous (Flag81) + -- Is_Called (Flag102) (non-generic subprog) + -- Is_Constructor (Flag76) + -- Is_Eliminated (Flag124) + -- Is_Instantiated (Flag126) (generic case only) + -- Is_Interrupt_Handler (Flag89) + -- Is_Intrinsic_Subprogram (Flag64) + -- Is_Machine_Code_Subprogram (Flag137) (non-generic case only) + -- Is_Null_Init_Proc (Flag178) + -- Is_Overriding_Operation (Flag39) (non-generic case only) + -- Is_Primitive_Wrapper (Flag195) (non-generic case only) + -- Is_Private_Descendant (Flag53) + -- Is_Pure (Flag44) + -- Is_Thread_Body (Flag77) (non-generic case only) + -- Is_Valued_Procedure (Flag127) + -- Is_Visible_Child_Unit (Flag116) + -- Needs_No_Actuals (Flag22) + -- No_Return (Flag113) + -- Requires_Overriding (Flag213) (non-generic case only) + -- Sec_Stack_Needed_For_Return (Flag167) + -- Address_Clause (synth) + -- First_Formal (synth) + -- First_Formal_With_Extras (synth) + -- Number_Formals (synth) + -- Delay_Cleanups (Flag114) + -- Discard_Names (Flag88) -- E_Protected_Body - -- Object_Ref (Node17) + -- Object_Ref (Node17) -- (any others??? First/Last Entity, Scope_Depth???) -- E_Protected_Object -- E_Protected_Type -- E_Protected_Subtype - -- Entry_Bodies_Array (Node15) - -- First_Private_Entity (Node16) - -- First_Entity (Node17) - -- Corresponding_Record_Type (Node18) - -- Finalization_Chain_Entity (Node19) - -- Last_Entity (Node20) - -- Discriminant_Constraint (Elist21) - -- Scope_Depth_Value (Uint22) - -- Scope_Depth (synth) - -- Stored_Constraint (Elist23) - -- Has_Interrupt_Handler (synth) - -- Sec_Stack_Needed_For_Return (Flag167) ??? - -- Uses_Sec_Stack (Flag95) ??? - -- Has_Entries (synth) - -- Number_Entries (synth) + -- Entry_Bodies_Array (Node15) + -- First_Private_Entity (Node16) + -- First_Entity (Node17) + -- Corresponding_Record_Type (Node18) + -- Finalization_Chain_Entity (Node19) + -- Last_Entity (Node20) + -- Discriminant_Constraint (Elist21) + -- Scope_Depth_Value (Uint22) + -- Scope_Depth (synth) + -- Stored_Constraint (Elist23) + -- Has_Interrupt_Handler (synth) + -- Sec_Stack_Needed_For_Return (Flag167) ??? + -- Uses_Sec_Stack (Flag95) ??? + -- Has_Entries (synth) + -- Number_Entries (synth) -- E_Record_Type -- E_Record_Subtype - -- Primitive_Operations (Elist15) - -- Access_Disp_Table (Elist16) (base type only) - -- Cloned_Subtype (Node16) (subtype case only) - -- First_Entity (Node17) - -- Corresponding_Concurrent_Type (Node18) - -- Parent_Subtype (Node19) - -- Last_Entity (Node20) - -- Discriminant_Constraint (Elist21) - -- Corresponding_Remote_Type (Node22) - -- Stored_Constraint (Elist23) - -- Abstract_Interfaces (Elist25) - -- Component_Alignment (special) (base type only) - -- C_Pass_By_Copy (Flag125) (base type only) - -- Has_External_Tag_Rep_Clause (Flag110) - -- Has_Record_Rep_Clause (Flag65) (base type only) - -- Has_Static_Discriminants (Flag211) (subtype 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) - -- First_Tag_Component (synth) + -- Primitive_Operations (Elist15) + -- Access_Disp_Table (Elist16) (base type only) + -- Cloned_Subtype (Node16) (subtype case only) + -- First_Entity (Node17) + -- Corresponding_Concurrent_Type (Node18) + -- Parent_Subtype (Node19) + -- Last_Entity (Node20) + -- Discriminant_Constraint (Elist21) + -- Corresponding_Remote_Type (Node22) + -- Stored_Constraint (Elist23) + -- Abstract_Interfaces (Elist25) + -- Component_Alignment (special) (base type only) + -- C_Pass_By_Copy (Flag125) (base type only) + -- Has_External_Tag_Rep_Clause (Flag110) + -- Has_Record_Rep_Clause (Flag65) (base type only) + -- Has_Static_Discriminants (Flag211) (subtype 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_Component_Or_Discriminant (synth) + -- First_Discriminant (synth) + -- First_Stored_Discriminant (synth) + -- First_Tag_Component (synth) -- (plus type attributes) -- E_Record_Type_With_Private -- E_Record_Subtype_With_Private - -- Primitive_Operations (Elist15) - -- Access_Disp_Table (Elist16) (base type only) - -- First_Entity (Node17) - -- Private_Dependents (Elist18) - -- Underlying_Full_View (Node19) - -- Last_Entity (Node20) - -- Discriminant_Constraint (Elist21) - -- Private_View (Node22) - -- Stored_Constraint (Elist23) - -- Abstract_Interfaces (Elist25) - -- Has_Completion (Flag26) - -- 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) - -- First_Tag_Component (synth) + -- Primitive_Operations (Elist15) + -- Access_Disp_Table (Elist16) (base type only) + -- First_Entity (Node17) + -- Private_Dependents (Elist18) + -- Underlying_Full_View (Node19) + -- Last_Entity (Node20) + -- Discriminant_Constraint (Elist21) + -- Private_View (Node22) + -- Stored_Constraint (Elist23) + -- Abstract_Interfaces (Elist25) + -- Has_Completion (Flag26) + -- 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_Component_Or_Discriminant (synth) + -- First_Discriminant (synth) + -- First_Stored_Discriminant (synth) + -- First_Tag_Component (synth) -- (plus type attributes) -- E_Return_Statement - -- Return_Applies_To (Node8) + -- Return_Applies_To (Node8) + -- Finalization_Chain_Entity (Node19) -- E_Signed_Integer_Type -- E_Signed_Integer_Subtype - -- Scalar_Range (Node20) - -- Has_Biased_Representation (Flag139) - -- Type_Low_Bound (synth) - -- Type_High_Bound (synth) + -- Scalar_Range (Node20) + -- Has_Biased_Representation (Flag139) + -- Type_Low_Bound (synth) + -- Type_High_Bound (synth) -- (plus type attributes) -- E_String_Type -- E_String_Subtype - -- First_Index (Node17) - -- Component_Type (Node20) (base type only) - -- Is_Constrained (Flag12) - -- Next_Index (synth) - -- Number_Dimensions (synth) + -- First_Index (Node17) + -- Component_Type (Node20) (base type only) + -- Is_Constrained (Flag12) + -- Next_Index (synth) + -- Number_Dimensions (synth) -- (plus type attributes) -- E_String_Literal_Subtype - -- String_Literal_Low_Bound (Node15) - -- String_Literal_Length (Uint16) - -- First_Index (Node17) (always Empty) - -- Packed_Array_Type (Node23) + -- String_Literal_Low_Bound (Node15) + -- String_Literal_Length (Uint16) + -- First_Index (Node17) (always Empty) + -- Packed_Array_Type (Node23) -- (plus type attributes) -- E_Subprogram_Body - -- Mechanism (Uint8) - -- First_Entity (Node17) - -- Last_Entity (Node20) - -- Scope_Depth_Value (Uint22) - -- Scope_Depth (synth) + -- Mechanism (Uint8) + -- First_Entity (Node17) + -- Last_Entity (Node20) + -- Scope_Depth_Value (Uint22) + -- Scope_Depth (synth) -- E_Subprogram_Type - -- Directly_Designated_Type (Node20) - -- First_Formal (synth) - -- First_Formal_With_Extras (synth) - -- Number_Formals (synth) - -- Function_Returns_With_DSP (Flag169) + -- Directly_Designated_Type (Node20) + -- First_Formal (synth) + -- First_Formal_With_Extras (synth) + -- Number_Formals (synth) + -- Function_Returns_With_DSP (Flag169) -- (plus type attributes) -- E_Task_Body @@ -5047,59 +5108,59 @@ package Einfo is -- E_Task_Type -- E_Task_Subtype - -- Storage_Size_Variable (Node15) (base type only) - -- First_Private_Entity (Node16) - -- First_Entity (Node17) - -- Corresponding_Record_Type (Node18) - -- Finalization_Chain_Entity (Node19) - -- Last_Entity (Node20) - -- Discriminant_Constraint (Elist21) - -- Scope_Depth_Value (Uint22) - -- Scope_Depth (synth) - -- Stored_Constraint (Elist23) - -- Task_Body_Procedure (Node25) - -- Delay_Cleanups (Flag114) - -- Has_Master_Entity (Flag21) - -- Has_Storage_Size_Clause (Flag23) (base type only) - -- Uses_Sec_Stack (Flag95) ??? - -- Sec_Stack_Needed_For_Return (Flag167) ??? - -- Has_Entries (synth) - -- Number_Entries (synth) + -- Storage_Size_Variable (Node15) (base type only) + -- First_Private_Entity (Node16) + -- First_Entity (Node17) + -- Corresponding_Record_Type (Node18) + -- Finalization_Chain_Entity (Node19) + -- Last_Entity (Node20) + -- Discriminant_Constraint (Elist21) + -- Scope_Depth_Value (Uint22) + -- Scope_Depth (synth) + -- Stored_Constraint (Elist23) + -- Task_Body_Procedure (Node25) + -- Delay_Cleanups (Flag114) + -- Has_Master_Entity (Flag21) + -- Has_Storage_Size_Clause (Flag23) (base type only) + -- Uses_Sec_Stack (Flag95) ??? + -- Sec_Stack_Needed_For_Return (Flag167) ??? + -- Has_Entries (synth) + -- Number_Entries (synth) -- (plus type attributes) -- E_Variable - -- Hiding_Loop_Variable (Node8) - -- Current_Value (Node9) - -- Esize (Uint12) - -- Extra_Accessibility (Node13) - -- Alignment (Uint14) - -- Shared_Var_Read_Proc (Node15) - -- Unset_Reference (Node16) - -- Actual_Subtype (Node17) - -- Renamed_Object (Node18) - -- Size_Check_Code (Node19) - -- Last_Assignment (Node20) - -- Interface_Name (Node21) - -- Shared_Var_Assign_Proc (Node22) - -- Extra_Constrained (Node23) - -- Has_Alignment_Clause (Flag46) - -- Has_Atomic_Components (Flag86) - -- Has_Biased_Representation (Flag139) - -- Has_Size_Clause (Flag29) - -- Has_Volatile_Components (Flag87) - -- In_Private_Part (Flag45) - -- Is_Atomic (Flag85) - -- Is_Eliminated (Flag124) - -- Is_Shared_Passive (Flag60) - -- Is_True_Constant (Flag163) - -- Is_Volatile (Flag16) - -- Never_Set_In_Source (Flag115) - -- Treat_As_Volatile (Flag41) - -- Is_Return_Object (Flag209) - -- Address_Clause (synth) - -- Alignment_Clause (synth) - -- Constant_Value (synth) - -- Size_Clause (synth) + -- Hiding_Loop_Variable (Node8) + -- Current_Value (Node9) + -- Esize (Uint12) + -- Extra_Accessibility (Node13) + -- Alignment (Uint14) + -- Shared_Var_Read_Proc (Node15) + -- Unset_Reference (Node16) + -- Actual_Subtype (Node17) + -- Renamed_Object (Node18) + -- Size_Check_Code (Node19) + -- Last_Assignment (Node20) + -- Interface_Name (Node21) + -- Shared_Var_Assign_Proc (Node22) + -- Extra_Constrained (Node23) + -- Has_Alignment_Clause (Flag46) + -- Has_Atomic_Components (Flag86) + -- Has_Biased_Representation (Flag139) + -- Has_Size_Clause (Flag29) + -- Has_Volatile_Components (Flag87) + -- In_Private_Part (Flag45) + -- Is_Atomic (Flag85) + -- Is_Eliminated (Flag124) + -- Is_Shared_Passive (Flag60) + -- Is_True_Constant (Flag163) + -- Is_Volatile (Flag16) + -- Never_Set_In_Source (Flag115) + -- Treat_As_Volatile (Flag41) + -- Is_Return_Object (Flag209) + -- Address_Clause (synth) + -- Alignment_Clause (synth) + -- Constant_Value (synth) + -- Size_Clause (synth) -- E_Void -- Since E_Void is the initial Ekind value of an entity when it is first @@ -5330,343 +5391,347 @@ 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 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; - function Associated_Node_For_Itype (Id : E) return N; - function Associated_Storage_Pool (Id : E) return E; - function Barrier_Function (Id : E) return N; - function Block_Node (Id : E) return N; - function Body_Entity (Id : E) return E; - function Body_Needed_For_SAL (Id : E) return B; - function CR_Discriminant (Id : E) return E; - function C_Pass_By_Copy (Id : E) return B; - function Can_Never_Be_Null (Id : E) return B; - function Checks_May_Be_Suppressed (Id : E) return B; - function Class_Wide_Type (Id : E) return E; - function Cloned_Subtype (Id : E) return E; - function Component_Alignment (Id : E) return C; - function Component_Clause (Id : E) return N; - function Component_Bit_Offset (Id : E) return U; - function Component_Size (Id : E) return U; - function Component_Type (Id : E) return E; - function Corresponding_Concurrent_Type (Id : E) return E; - function Corresponding_Discriminant (Id : E) return E; - function Corresponding_Equality (Id : E) return E; - function Corresponding_Record_Type (Id : E) return E; - function Corresponding_Remote_Type (Id : E) return E; - function Current_Use_Clause (Id : E) return E; - function Current_Value (Id : E) return N; - function Debug_Info_Off (Id : E) return B; - function Debug_Renaming_Link (Id : E) return E; - function DTC_Entity (Id : E) return E; - function DT_Entry_Count (Id : E) return U; - function DT_Offset_To_Top_Func (Id : E) return E; - function DT_Position (Id : E) return U; - function Default_Expr_Function (Id : E) return E; - function Default_Expressions_Processed (Id : E) return B; - function Default_Value (Id : E) return N; - function Delay_Cleanups (Id : E) return B; - function Delay_Subprogram_Descriptors (Id : E) return B; - function Delta_Value (Id : E) return R; - function Dependent_Instances (Id : E) return L; - function Depends_On_Private (Id : E) return B; - function Digits_Value (Id : E) return U; - function Directly_Designated_Type (Id : E) return E; - function Discard_Names (Id : E) return B; - function Discriminal (Id : E) return E; - function Discriminal_Link (Id : E) return E; - function Discriminant_Checking_Func (Id : E) return E; - function Discriminant_Constraint (Id : E) return L; - function Discriminant_Default_Value (Id : E) return N; - function Discriminant_Number (Id : E) return U; - function Elaborate_Body_Desirable (Id : E) return B; - function Elaboration_Entity (Id : E) return E; - function Elaboration_Entity_Required (Id : E) return B; - function Enclosing_Scope (Id : E) return E; - function Entry_Accepted (Id : E) return B; - function Entry_Bodies_Array (Id : E) return E; - function Entry_Cancel_Parameter (Id : E) return E; - function Entry_Component (Id : E) return E; - function Entry_Formal (Id : E) return E; - function Entry_Index_Constant (Id : E) return E; - function Entry_Index_Type (Id : E) return E; - function Entry_Parameters_Type (Id : E) return E; - function Enum_Pos_To_Rep (Id : E) return E; - function Enumeration_Pos (Id : E) return U; - function Enumeration_Rep (Id : E) return U; - function Enumeration_Rep_Expr (Id : E) return N; - function Equivalent_Type (Id : E) return E; - function Esize (Id : E) return U; - function Exception_Code (Id : E) return U; - function Extra_Accessibility (Id : E) return E; - function Extra_Constrained (Id : E) return E; - function Extra_Formal (Id : E) return E; - function Extra_Formals (Id : E) return E; - function Finalization_Chain_Entity (Id : E) return E; - function Finalize_Storage_Only (Id : E) return B; - function First_Entity (Id : E) return E; - function First_Index (Id : E) return N; - function First_Literal (Id : E) return E; - function First_Optional_Parameter (Id : E) return E; - function First_Private_Entity (Id : E) return E; - function First_Rep_Item (Id : E) return N; - function Freeze_Node (Id : E) return N; - function From_With_Type (Id : E) return B; - function Full_View (Id : E) return E; - function Function_Returns_With_DSP (Id : E) return B; - function Generic_Homonym (Id : E) return E; - function Generic_Renamings (Id : E) return L; - function Handler_Records (Id : E) return S; - function Has_Aliased_Components (Id : E) return B; - function Has_Alignment_Clause (Id : E) return B; - function Has_All_Calls_Remote (Id : E) return B; - function Has_Anon_Block_Suffix (Id : E) return B; - function Has_Atomic_Components (Id : E) return B; - function Has_Biased_Representation (Id : E) return B; - function Has_Completion (Id : E) return B; - function Has_Completion_In_Body (Id : E) return B; - function Has_Complex_Representation (Id : E) return B; - function Has_Component_Size_Clause (Id : E) return B; - function Has_Constrained_Partial_View (Id : E) return B; - function Has_Contiguous_Rep (Id : E) return B; - function Has_Controlled_Component (Id : E) return B; - function Has_Controlling_Result (Id : E) return B; - function Has_Convention_Pragma (Id : E) return B; - function Has_Delayed_Freeze (Id : E) return B; - function Has_Discriminants (Id : E) return B; - function Has_Enumeration_Rep_Clause (Id : E) return B; - function Has_Exit (Id : E) return B; - function Has_External_Tag_Rep_Clause (Id : E) return B; - function Has_Fully_Qualified_Name (Id : E) return B; - function Has_Gigi_Rep_Item (Id : E) return B; - function Has_Homonym (Id : E) return B; - function Has_Interrupt_Handler (Id : E) return B; - function Has_Machine_Radix_Clause (Id : E) return B; - function Has_Master_Entity (Id : E) return B; - function Has_Missing_Return (Id : E) return B; - function Has_Nested_Block_With_Handler (Id : E) return B; - function Has_Forward_Instantiation (Id : E) return B; - function Has_Non_Standard_Rep (Id : E) return B; - function Has_Object_Size_Clause (Id : E) return B; - function Has_Per_Object_Constraint (Id : E) return B; - function Has_Persistent_BSS (Id : E) return B; - function Has_Pragma_Controlled (Id : E) return B; - function Has_Pragma_Elaborate_Body (Id : E) return B; - function Has_Pragma_Inline (Id : E) return B; - function Has_Pragma_Pack (Id : E) return B; - function Has_Pragma_Pure (Id : E) return B; - function Has_Pragma_Pure_Function (Id : E) return B; - function Has_Pragma_Unreferenced (Id : E) return B; - function Has_Primitive_Operations (Id : E) return B; - function Has_Qualified_Name (Id : E) return B; - function Has_Record_Rep_Clause (Id : E) return B; - function Has_Recursive_Call (Id : E) return B; - function Has_Size_Clause (Id : E) return B; - function Has_Small_Clause (Id : E) return B; - function Has_Specified_Layout (Id : E) return B; - function Has_Specified_Stream_Input (Id : E) return B; - function Has_Specified_Stream_Output (Id : E) return B; - function Has_Specified_Stream_Read (Id : E) return B; - function Has_Specified_Stream_Write (Id : E) return B; - function Has_Static_Discriminants (Id : E) return B; - function Has_Storage_Size_Clause (Id : E) return B; - function Has_Stream_Size_Clause (Id : E) return B; - function Has_Subprogram_Descriptor (Id : E) return B; - function Has_Task (Id : E) return B; - function Has_Unchecked_Union (Id : E) return B; - function Has_Unknown_Discriminants (Id : E) return B; - function Has_Volatile_Components (Id : E) return B; - function Has_Xref_Entry (Id : E) return B; - function Hiding_Loop_Variable (Id : E) return E; - function Homonym (Id : E) return E; - function In_Package_Body (Id : E) return B; - function In_Private_Part (Id : E) return B; - function In_Use (Id : E) return B; - function Inner_Instances (Id : E) return L; - function Interface_Name (Id : E) return N; - function Is_AST_Entry (Id : E) return B; - function Is_Abstract (Id : E) return B; - function Is_Local_Anonymous_Access (Id : E) return B; - function Is_Access_Constant (Id : E) return B; - function Is_Ada_2005_Only (Id : E) return B; - function Is_Aliased (Id : E) return B; - function Is_Asynchronous (Id : E) return B; - function Is_Atomic (Id : E) return B; - function Is_Bit_Packed_Array (Id : E) return B; - function Is_CPP_Class (Id : E) return B; - function Is_Called (Id : E) return B; - function Is_Character_Type (Id : E) return B; - function Is_Child_Unit (Id : E) return B; - function Is_Class_Wide_Equivalent_Type (Id : E) return B; - function Is_Compilation_Unit (Id : E) return B; - function Is_Completely_Hidden (Id : E) return B; - function Is_Constr_Subt_For_UN_Aliased (Id : E) return B; - function Is_Constr_Subt_For_U_Nominal (Id : E) return B; - function Is_Constrained (Id : E) return B; - function Is_Constructor (Id : E) return B; - function Is_Controlled (Id : E) return B; - function Is_Controlling_Formal (Id : E) return B; - function Is_Discrim_SO_Function (Id : E) return B; - function Is_Dispatching_Operation (Id : E) return B; - function Is_Eliminated (Id : E) return B; - function Is_Entry_Formal (Id : E) return B; - function Is_Exported (Id : E) return B; - function Is_First_Subtype (Id : E) return B; - function Is_For_Access_Subtype (Id : E) return B; - function Is_Frozen (Id : E) return B; - function Is_Generic_Instance (Id : E) return B; - function Is_Hidden (Id : E) return B; - function Is_Hidden_Open_Scope (Id : E) return B; - 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; - function Is_Intrinsic_Subprogram (Id : E) return B; - function Is_Itype (Id : E) return B; - function Is_Known_Non_Null (Id : E) return B; - function Is_Known_Null (Id : E) return B; - function Is_Known_Valid (Id : E) return B; - function Is_Limited_Composite (Id : E) return B; - function Is_Limited_Interface (Id : E) return B; - function Is_Machine_Code_Subprogram (Id : E) return B; - function Is_Non_Static_Subtype (Id : E) return B; - function Is_Null_Init_Proc (Id : E) return B; - function Is_Obsolescent (Id : E) return B; - function Is_Optional_Parameter (Id : E) return B; - function Is_Package_Body_Entity (Id : E) return B; - function Is_Packed (Id : E) return B; - function Is_Packed_Array_Type (Id : E) return B; - function Is_Potentially_Use_Visible (Id : E) return B; - function Is_Preelaborated (Id : E) return B; - function Is_Primitive_Wrapper (Id : E) return B; - function Is_Private_Composite (Id : E) return B; - function Is_Private_Descendant (Id : E) return B; - function Is_Protected_Interface (Id : E) return B; - function Is_Public (Id : E) return B; - function Is_Pure (Id : E) return B; - function Is_Pure_Unit_Access_Type (Id : E) return B; - function Is_Remote_Call_Interface (Id : E) return B; - function Is_Remote_Types (Id : E) return B; - function Is_Renaming_Of_Object (Id : E) return B; - function Is_Return_Object (Id : E) return B; - function Is_Shared_Passive (Id : E) return B; - function Is_Statically_Allocated (Id : E) return B; - function Is_Synchronized_Interface (Id : E) return B; - function Is_Tag (Id : E) return B; - function Is_Tagged_Type (Id : E) return B; - function Is_Task_Interface (Id : E) return B; - function Is_Thread_Body (Id : E) return B; - function Is_True_Constant (Id : E) return B; - function Is_Unchecked_Union (Id : E) return B; - function Is_Unsigned_Type (Id : E) return B; - function Is_VMS_Exception (Id : E) return B; - function Is_Valued_Procedure (Id : E) return B; - function Is_Visible_Child_Unit (Id : E) return B; - function Is_Visible_Formal (Id : E) return B; - function Is_Volatile (Id : E) return B; - function Itype_Printed (Id : E) return B; - function Kill_Elaboration_Checks (Id : E) return B; - function Kill_Range_Checks (Id : E) return B; - function Kill_Tag_Checks (Id : E) return B; - function Known_To_Have_Preelab_Init (Id : E) return B; - function Last_Assignment (Id : E) return N; - function Last_Entity (Id : E) return E; - function Limited_View (Id : E) return E; - function Lit_Indexes (Id : E) return E; - function Lit_Strings (Id : E) return E; - function Low_Bound_Known (Id : E) return B; - function Machine_Radix_10 (Id : E) return B; - function Master_Id (Id : E) return E; - function Materialize_Entity (Id : E) return B; - function Mechanism (Id : E) return M; - function Modulus (Id : E) return U; - function Must_Be_On_Byte_Boundary (Id : E) return B; - function Must_Have_Preelab_Init (Id : E) return B; - function Needs_Debug_Info (Id : E) return B; - function Needs_No_Actuals (Id : E) return B; - function Never_Set_In_Source (Id : E) return B; - function Next_Inlined_Subprogram (Id : E) return E; - function No_Pool_Assigned (Id : E) return B; - function No_Return (Id : E) return B; - function No_Strict_Aliasing (Id : E) return B; - function Non_Binary_Modulus (Id : E) return B; - function Non_Limited_View (Id : E) return E; - function Nonzero_Is_True (Id : E) return B; - function Normalized_First_Bit (Id : E) return U; - function Normalized_Position (Id : E) return U; - function Normalized_Position_Max (Id : E) return U; - function Object_Ref (Id : E) return E; - function Obsolescent_Warning (Id : E) return N; - function Original_Access_Type (Id : E) return E; - function Original_Array_Type (Id : E) return E; - function Original_Record_Component (Id : E) return E; - function Overridden_Operation (Id : E) return E; - function Package_Instantiation (Id : E) return N; - function Packed_Array_Type (Id : E) return E; - function Parent_Subtype (Id : E) return E; - function Primitive_Operations (Id : E) return L; - function Prival (Id : E) return E; - function Privals_Chain (Id : E) return L; - function Private_Dependents (Id : E) return L; - function Private_View (Id : E) return N; - function Protected_Body_Subprogram (Id : E) return E; - function Protected_Formal (Id : E) return E; - function Protected_Operation (Id : E) return E; - function RM_Size (Id : E) return U; - function Reachable (Id : E) return B; - function Referenced (Id : E) return B; - function Referenced_As_LHS (Id : E) return B; - function Referenced_Object (Id : E) return N; - function Register_Exception_Call (Id : E) return N; - function Related_Array_Object (Id : E) return E; - function Related_Instance (Id : E) return E; - function Renamed_Entity (Id : E) return N; - function Renamed_Object (Id : E) return N; - function Renaming_Map (Id : E) return U; - function Return_Present (Id : E) return B; - function Return_Applies_To (Id : E) return N; - function Returns_By_Ref (Id : E) return B; - function Reverse_Bit_Order (Id : E) return B; - function Scalar_Range (Id : E) return N; - function Scale_Value (Id : E) return U; - function Scope_Depth_Value (Id : E) return U; - function Sec_Stack_Needed_For_Return (Id : E) return B; - function Shadow_Entities (Id : E) return S; - function Shared_Var_Assign_Proc (Id : E) return E; - function Shared_Var_Read_Proc (Id : E) return E; - function Size_Check_Code (Id : E) return N; - function Size_Known_At_Compile_Time (Id : E) return B; - function Size_Depends_On_Discriminant (Id : E) return B; - function Small_Value (Id : E) return R; - function Spec_Entity (Id : E) return E; - function Storage_Size_Variable (Id : E) return E; - function Stored_Constraint (Id : E) return L; - function Strict_Alignment (Id : E) return B; - function String_Literal_Length (Id : E) return U; - function String_Literal_Low_Bound (Id : E) return N; - 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; - function Uses_Sec_Stack (Id : E) return B; - function Vax_Float (Id : E) return B; - function Warnings_Off (Id : E) return B; - function Was_Hidden (Id : E) return B; - function Wrapped_Entity (Id : E) return E; + function Abstract_Interfaces (Id : E) return L; + function Accept_Address (Id : E) return L; + 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; + function Associated_Node_For_Itype (Id : E) return N; + function Associated_Storage_Pool (Id : E) return E; + function Barrier_Function (Id : E) return N; + function Block_Node (Id : E) return N; + function Body_Entity (Id : E) return E; + function Body_Needed_For_SAL (Id : E) return B; + function CR_Discriminant (Id : E) return E; + function C_Pass_By_Copy (Id : E) return B; + function Can_Never_Be_Null (Id : E) return B; + function Checks_May_Be_Suppressed (Id : E) return B; + function Class_Wide_Type (Id : E) return E; + function Cloned_Subtype (Id : E) return E; + function Component_Alignment (Id : E) return C; + function Component_Clause (Id : E) return N; + function Component_Bit_Offset (Id : E) return U; + function Component_Size (Id : E) return U; + function Component_Type (Id : E) return E; + function Corresponding_Concurrent_Type (Id : E) return E; + function Corresponding_Discriminant (Id : E) return E; + function Corresponding_Equality (Id : E) return E; + function Corresponding_Record_Type (Id : E) return E; + function Corresponding_Remote_Type (Id : E) return E; + function Current_Use_Clause (Id : E) return E; + function Current_Value (Id : E) return N; + function Debug_Info_Off (Id : E) return B; + function Debug_Renaming_Link (Id : E) return E; + function DTC_Entity (Id : E) return E; + function DT_Entry_Count (Id : E) return U; + function DT_Offset_To_Top_Func (Id : E) return E; + function DT_Position (Id : E) return U; + function Default_Expr_Function (Id : E) return E; + function Default_Expressions_Processed (Id : E) return B; + function Default_Value (Id : E) return N; + function Delay_Cleanups (Id : E) return B; + function Delay_Subprogram_Descriptors (Id : E) return B; + function Delta_Value (Id : E) return R; + function Dependent_Instances (Id : E) return L; + function Depends_On_Private (Id : E) return B; + function Digits_Value (Id : E) return U; + function Directly_Designated_Type (Id : E) return E; + function Discard_Names (Id : E) return B; + function Discriminal (Id : E) return E; + function Discriminal_Link (Id : E) return E; + function Discriminant_Checking_Func (Id : E) return E; + function Discriminant_Constraint (Id : E) return L; + function Discriminant_Default_Value (Id : E) return N; + function Discriminant_Number (Id : E) return U; + function Elaborate_Body_Desirable (Id : E) return B; + function Elaboration_Entity (Id : E) return E; + function Elaboration_Entity_Required (Id : E) return B; + function Enclosing_Scope (Id : E) return E; + function Entry_Accepted (Id : E) return B; + function Entry_Bodies_Array (Id : E) return E; + function Entry_Cancel_Parameter (Id : E) return E; + function Entry_Component (Id : E) return E; + function Entry_Formal (Id : E) return E; + function Entry_Index_Constant (Id : E) return E; + function Entry_Index_Type (Id : E) return E; + function Entry_Parameters_Type (Id : E) return E; + function Enum_Pos_To_Rep (Id : E) return E; + function Enumeration_Pos (Id : E) return U; + function Enumeration_Rep (Id : E) return U; + function Enumeration_Rep_Expr (Id : E) return N; + function Equivalent_Type (Id : E) return E; + function Esize (Id : E) return U; + function Exception_Code (Id : E) return U; + function Extra_Accessibility (Id : E) return E; + function Extra_Constrained (Id : E) return E; + function Extra_Formal (Id : E) return E; + function Extra_Formals (Id : E) return E; + function Finalization_Chain_Entity (Id : E) return E; + function Finalize_Storage_Only (Id : E) return B; + function First_Entity (Id : E) return E; + function First_Index (Id : E) return N; + function First_Literal (Id : E) return E; + function First_Optional_Parameter (Id : E) return E; + function First_Private_Entity (Id : E) return E; + function First_Rep_Item (Id : E) return N; + function Freeze_Node (Id : E) return N; + function From_With_Type (Id : E) return B; + function Full_View (Id : E) return E; + function Function_Returns_With_DSP (Id : E) return B; + function Generic_Homonym (Id : E) return E; + function Generic_Renamings (Id : E) return L; + function Handler_Records (Id : E) return S; + function Has_Aliased_Components (Id : E) return B; + function Has_Alignment_Clause (Id : E) return B; + function Has_All_Calls_Remote (Id : E) return B; + function Has_Anon_Block_Suffix (Id : E) return B; + function Has_Atomic_Components (Id : E) return B; + function Has_Biased_Representation (Id : E) return B; + function Has_Completion (Id : E) return B; + function Has_Completion_In_Body (Id : E) return B; + function Has_Complex_Representation (Id : E) return B; + function Has_Component_Size_Clause (Id : E) return B; + function Has_Constrained_Partial_View (Id : E) return B; + function Has_Contiguous_Rep (Id : E) return B; + function Has_Controlled_Component (Id : E) return B; + function Has_Controlling_Result (Id : E) return B; + function Has_Convention_Pragma (Id : E) return B; + function Has_Delayed_Freeze (Id : E) return B; + function Has_Discriminants (Id : E) return B; + function Has_Enumeration_Rep_Clause (Id : E) return B; + function Has_Exit (Id : E) return B; + function Has_External_Tag_Rep_Clause (Id : E) return B; + function Has_Fully_Qualified_Name (Id : E) return B; + function Has_Gigi_Rep_Item (Id : E) return B; + function Has_Homonym (Id : E) return B; + function Has_Interrupt_Handler (Id : E) return B; + function Has_Machine_Radix_Clause (Id : E) return B; + function Has_Master_Entity (Id : E) return B; + function Has_Missing_Return (Id : E) return B; + function Has_Nested_Block_With_Handler (Id : E) return B; + function Has_Forward_Instantiation (Id : E) return B; + function Has_Non_Standard_Rep (Id : E) return B; + function Has_Object_Size_Clause (Id : E) return B; + function Has_Per_Object_Constraint (Id : E) return B; + function Has_Persistent_BSS (Id : E) return B; + function Has_Pragma_Controlled (Id : E) return B; + function Has_Pragma_Elaborate_Body (Id : E) return B; + function Has_Pragma_Inline (Id : E) return B; + function Has_Pragma_Pack (Id : E) return B; + function Has_Pragma_Pure (Id : E) return B; + function Has_Pragma_Pure_Function (Id : E) return B; + function Has_Pragma_Unreferenced (Id : E) return B; + function Has_Pragma_Unreferenced_Objects (Id : E) return B; + function Has_Primitive_Operations (Id : E) return B; + function Has_Qualified_Name (Id : E) return B; + function Has_RACW (Id : E) return B; + function Has_Record_Rep_Clause (Id : E) return B; + function Has_Recursive_Call (Id : E) return B; + function Has_Size_Clause (Id : E) return B; + function Has_Small_Clause (Id : E) return B; + function Has_Specified_Layout (Id : E) return B; + function Has_Specified_Stream_Input (Id : E) return B; + function Has_Specified_Stream_Output (Id : E) return B; + function Has_Specified_Stream_Read (Id : E) return B; + function Has_Specified_Stream_Write (Id : E) return B; + function Has_Static_Discriminants (Id : E) return B; + function Has_Storage_Size_Clause (Id : E) return B; + function Has_Stream_Size_Clause (Id : E) return B; + function Has_Subprogram_Descriptor (Id : E) return B; + function Has_Task (Id : E) return B; + function Has_Unchecked_Union (Id : E) return B; + function Has_Unknown_Discriminants (Id : E) return B; + function Has_Volatile_Components (Id : E) return B; + function Has_Xref_Entry (Id : E) return B; + function Hiding_Loop_Variable (Id : E) return E; + function Homonym (Id : E) return E; + function In_Package_Body (Id : E) return B; + function In_Private_Part (Id : E) return B; + function In_Use (Id : E) return B; + function Inner_Instances (Id : E) return L; + function Interface_Name (Id : E) return N; + function Is_AST_Entry (Id : E) return B; + function Is_Abstract_Subprogram (Id : E) return B; + function Is_Abstract_Type (Id : E) return B; + function Is_Local_Anonymous_Access (Id : E) return B; + function Is_Access_Constant (Id : E) return B; + function Is_Ada_2005_Only (Id : E) return B; + function Is_Aliased (Id : E) return B; + function Is_Asynchronous (Id : E) return B; + function Is_Atomic (Id : E) return B; + function Is_Bit_Packed_Array (Id : E) return B; + function Is_CPP_Class (Id : E) return B; + function Is_Called (Id : E) return B; + function Is_Character_Type (Id : E) return B; + function Is_Child_Unit (Id : E) return B; + function Is_Class_Wide_Equivalent_Type (Id : E) return B; + function Is_Compilation_Unit (Id : E) return B; + function Is_Completely_Hidden (Id : E) return B; + function Is_Constr_Subt_For_UN_Aliased (Id : E) return B; + function Is_Constr_Subt_For_U_Nominal (Id : E) return B; + function Is_Constrained (Id : E) return B; + function Is_Constructor (Id : E) return B; + function Is_Controlled (Id : E) return B; + function Is_Controlling_Formal (Id : E) return B; + function Is_Discrim_SO_Function (Id : E) return B; + function Is_Dispatching_Operation (Id : E) return B; + function Is_Eliminated (Id : E) return B; + function Is_Entry_Formal (Id : E) return B; + function Is_Exported (Id : E) return B; + function Is_First_Subtype (Id : E) return B; + function Is_For_Access_Subtype (Id : E) return B; + function Is_Frozen (Id : E) return B; + function Is_Generic_Instance (Id : E) return B; + function Is_Hidden (Id : E) return B; + function Is_Hidden_Open_Scope (Id : E) return B; + 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; + function Is_Intrinsic_Subprogram (Id : E) return B; + function Is_Itype (Id : E) return B; + function Is_Known_Non_Null (Id : E) return B; + function Is_Known_Null (Id : E) return B; + function Is_Known_Valid (Id : E) return B; + function Is_Limited_Composite (Id : E) return B; + function Is_Limited_Interface (Id : E) return B; + function Is_Machine_Code_Subprogram (Id : E) return B; + function Is_Non_Static_Subtype (Id : E) return B; + function Is_Null_Init_Proc (Id : E) return B; + function Is_Obsolescent (Id : E) return B; + function Is_Optional_Parameter (Id : E) return B; + function Is_Package_Body_Entity (Id : E) return B; + function Is_Packed (Id : E) return B; + function Is_Packed_Array_Type (Id : E) return B; + function Is_Potentially_Use_Visible (Id : E) return B; + function Is_Preelaborated (Id : E) return B; + function Is_Primitive_Wrapper (Id : E) return B; + function Is_Private_Composite (Id : E) return B; + function Is_Private_Descendant (Id : E) return B; + function Is_Protected_Interface (Id : E) return B; + function Is_Public (Id : E) return B; + function Is_Pure (Id : E) return B; + function Is_Pure_Unit_Access_Type (Id : E) return B; + function Is_Remote_Call_Interface (Id : E) return B; + function Is_Remote_Types (Id : E) return B; + function Is_Renaming_Of_Object (Id : E) return B; + function Is_Return_Object (Id : E) return B; + function Is_Shared_Passive (Id : E) return B; + function Is_Statically_Allocated (Id : E) return B; + function Is_Synchronized_Interface (Id : E) return B; + function Is_Tag (Id : E) return B; + function Is_Tagged_Type (Id : E) return B; + function Is_Task_Interface (Id : E) return B; + function Is_Thread_Body (Id : E) return B; + function Is_True_Constant (Id : E) return B; + function Is_Unchecked_Union (Id : E) return B; + function Is_Unsigned_Type (Id : E) return B; + function Is_VMS_Exception (Id : E) return B; + function Is_Valued_Procedure (Id : E) return B; + function Is_Visible_Child_Unit (Id : E) return B; + function Is_Visible_Formal (Id : E) return B; + function Is_Volatile (Id : E) return B; + function Itype_Printed (Id : E) return B; + function Kill_Elaboration_Checks (Id : E) return B; + function Kill_Range_Checks (Id : E) return B; + function Kill_Tag_Checks (Id : E) return B; + function Known_To_Have_Preelab_Init (Id : E) return B; + function Last_Assignment (Id : E) return N; + function Last_Entity (Id : E) return E; + function Limited_View (Id : E) return E; + function Lit_Indexes (Id : E) return E; + function Lit_Strings (Id : E) return E; + function Low_Bound_Known (Id : E) return B; + function Machine_Radix_10 (Id : E) return B; + function Master_Id (Id : E) return E; + function Materialize_Entity (Id : E) return B; + function Mechanism (Id : E) return M; + function Modulus (Id : E) return U; + function Must_Be_On_Byte_Boundary (Id : E) return B; + function Must_Have_Preelab_Init (Id : E) return B; + function Needs_Debug_Info (Id : E) return B; + function Needs_No_Actuals (Id : E) return B; + function Never_Set_In_Source (Id : E) return B; + function Next_Inlined_Subprogram (Id : E) return E; + function No_Pool_Assigned (Id : E) return B; + function No_Return (Id : E) return B; + function No_Strict_Aliasing (Id : E) return B; + function Non_Binary_Modulus (Id : E) return B; + function Non_Limited_View (Id : E) return E; + function Nonzero_Is_True (Id : E) return B; + function Normalized_First_Bit (Id : E) return U; + function Normalized_Position (Id : E) return U; + function Normalized_Position_Max (Id : E) return U; + function Object_Ref (Id : E) return E; + function Obsolescent_Warning (Id : E) return N; + function Original_Access_Type (Id : E) return E; + function Original_Array_Type (Id : E) return E; + function Original_Record_Component (Id : E) return E; + function Overridden_Operation (Id : E) return E; + function Package_Instantiation (Id : E) return N; + function Packed_Array_Type (Id : E) return E; + function Parent_Subtype (Id : E) return E; + function Primitive_Operations (Id : E) return L; + function Prival (Id : E) return E; + function Privals_Chain (Id : E) return L; + function Private_Dependents (Id : E) return L; + function Private_View (Id : E) return N; + function Protected_Body_Subprogram (Id : E) return E; + function Protected_Formal (Id : E) return E; + function Protected_Operation (Id : E) return E; + function RM_Size (Id : E) return U; + function Reachable (Id : E) return B; + function Referenced (Id : E) return B; + function Referenced_As_LHS (Id : E) return B; + function Referenced_Object (Id : E) return N; + function Register_Exception_Call (Id : E) return N; + function Related_Array_Object (Id : E) return E; + function Related_Instance (Id : E) return E; + function Renamed_Entity (Id : E) return N; + function Renamed_Object (Id : E) return N; + function Renaming_Map (Id : E) return U; + function Requires_Overriding (Id : E) return B; + function Return_Present (Id : E) return B; + function Return_Applies_To (Id : E) return N; + function Returns_By_Ref (Id : E) return B; + function Reverse_Bit_Order (Id : E) return B; + function Scalar_Range (Id : E) return N; + function Scale_Value (Id : E) return U; + function Scope_Depth_Value (Id : E) return U; + function Sec_Stack_Needed_For_Return (Id : E) return B; + function Shadow_Entities (Id : E) return S; + function Shared_Var_Assign_Proc (Id : E) return E; + function Shared_Var_Read_Proc (Id : E) return E; + function Size_Check_Code (Id : E) return N; + function Size_Known_At_Compile_Time (Id : E) return B; + function Size_Depends_On_Discriminant (Id : E) return B; + function Small_Value (Id : E) return R; + function Spec_Entity (Id : E) return E; + function Storage_Size_Variable (Id : E) return E; + function Stored_Constraint (Id : E) return L; + function Strict_Alignment (Id : E) return B; + function String_Literal_Length (Id : E) return U; + function String_Literal_Low_Bound (Id : E) return N; + 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; + function Uses_Sec_Stack (Id : E) return B; + function Vax_Float (Id : E) return B; + function Warnings_Off (Id : E) return B; + function Was_Hidden (Id : E) return B; + function Wrapped_Entity (Id : E) return E; ------------------------------- -- Classification Attributes -- @@ -5678,49 +5743,50 @@ package Einfo is -- In some cases, the test is of an entity attribute (e.g. in the case of -- Is_Generic_Type where the Ekind does not provide the needed information) - function Is_Access_Type (Id : E) return B; - function Is_Array_Type (Id : E) return B; - function Is_Class_Wide_Type (Id : E) return B; - function Is_Composite_Type (Id : E) return B; - function Is_Concurrent_Body (Id : E) return B; - function Is_Concurrent_Record_Type (Id : E) return B; - function Is_Concurrent_Type (Id : E) return B; - function Is_Decimal_Fixed_Point_Type (Id : E) return B; - function Is_Digits_Type (Id : E) return B; - function Is_Discrete_Or_Fixed_Point_Type (Id : E) return B; - function Is_Discrete_Type (Id : E) return B; - function Is_Elementary_Type (Id : E) return B; - function Is_Entry (Id : E) return B; - function Is_Enumeration_Type (Id : E) return B; - function Is_Fixed_Point_Type (Id : E) return B; - function Is_Floating_Point_Type (Id : E) return B; - function Is_Formal (Id : E) return B; - function Is_Formal_Object (Id : E) return B; - function Is_Formal_Subprogram (Id : E) return B; - function Is_Generic_Actual_Type (Id : E) return B; - function Is_Generic_Unit (Id : E) return B; - function Is_Generic_Type (Id : E) return B; - function Is_Generic_Subprogram (Id : E) return B; - function Is_Incomplete_Or_Private_Type (Id : E) return B; - function Is_Incomplete_Type (Id : E) return B; - function Is_Integer_Type (Id : E) return B; - function Is_Limited_Record (Id : E) return B; - function Is_Modular_Integer_Type (Id : E) return B; - function Is_Named_Number (Id : E) return B; - function Is_Numeric_Type (Id : E) return B; - function Is_Object (Id : E) return B; - function Is_Ordinary_Fixed_Point_Type (Id : E) return B; - function Is_Overloadable (Id : E) return B; - function Is_Overriding_Operation (Id : E) return B; - function Is_Private_Type (Id : E) return B; - function Is_Protected_Type (Id : E) return B; - function Is_Real_Type (Id : E) return B; - function Is_Record_Type (Id : E) return B; - function Is_Scalar_Type (Id : E) return B; - function Is_Signed_Integer_Type (Id : E) return B; - function Is_Subprogram (Id : E) return B; - function Is_Task_Type (Id : E) return B; - function Is_Type (Id : E) return B; + function Is_Access_Type (Id : E) return B; + function Is_Access_Protected_Subprogram_Type (Id : E) return B; + function Is_Array_Type (Id : E) return B; + function Is_Class_Wide_Type (Id : E) return B; + function Is_Composite_Type (Id : E) return B; + function Is_Concurrent_Body (Id : E) return B; + function Is_Concurrent_Record_Type (Id : E) return B; + function Is_Concurrent_Type (Id : E) return B; + function Is_Decimal_Fixed_Point_Type (Id : E) return B; + function Is_Digits_Type (Id : E) return B; + function Is_Discrete_Or_Fixed_Point_Type (Id : E) return B; + function Is_Discrete_Type (Id : E) return B; + function Is_Elementary_Type (Id : E) return B; + function Is_Entry (Id : E) return B; + function Is_Enumeration_Type (Id : E) return B; + function Is_Fixed_Point_Type (Id : E) return B; + function Is_Floating_Point_Type (Id : E) return B; + function Is_Formal (Id : E) return B; + function Is_Formal_Object (Id : E) return B; + function Is_Formal_Subprogram (Id : E) return B; + function Is_Generic_Actual_Type (Id : E) return B; + function Is_Generic_Unit (Id : E) return B; + function Is_Generic_Type (Id : E) return B; + function Is_Generic_Subprogram (Id : E) return B; + function Is_Incomplete_Or_Private_Type (Id : E) return B; + function Is_Incomplete_Type (Id : E) return B; + function Is_Integer_Type (Id : E) return B; + function Is_Limited_Record (Id : E) return B; + function Is_Modular_Integer_Type (Id : E) return B; + function Is_Named_Number (Id : E) return B; + function Is_Numeric_Type (Id : E) return B; + function Is_Object (Id : E) return B; + function Is_Ordinary_Fixed_Point_Type (Id : E) return B; + function Is_Overloadable (Id : E) return B; + function Is_Overriding_Operation (Id : E) return B; + function Is_Private_Type (Id : E) return B; + function Is_Protected_Type (Id : E) return B; + function Is_Real_Type (Id : E) return B; + function Is_Record_Type (Id : E) return B; + function Is_Scalar_Type (Id : E) return B; + function Is_Signed_Integer_Type (Id : E) return B; + function Is_Subprogram (Id : E) return B; + function Is_Task_Type (Id : E) return B; + function Is_Type (Id : E) return B; ------------------------------------- -- Synthesized Attribute Functions -- @@ -5729,74 +5795,76 @@ package Einfo is -- The functions in this section synthesize attributes from the tree, -- so they do not correspond to defined fields in the entity itself. - function Address_Clause (Id : E) return N; - function Alignment_Clause (Id : E) return N; - function Ancestor_Subtype (Id : E) return E; - function Base_Type (Id : E) return E; - function Constant_Value (Id : E) return N; - function Declaration_Node (Id : E) return N; - function Designated_Type (Id : E) return E; - function Enclosing_Dynamic_Scope (Id : E) return E; - function First_Component (Id : E) return E; - function First_Discriminant (Id : E) return E; - function First_Formal (Id : E) return E; - function First_Formal_With_Extras (Id : E) return E; - function First_Stored_Discriminant (Id : E) return E; - function First_Subtype (Id : E) return E; - function Has_Attach_Handler (Id : E) return B; - function Has_Entries (Id : E) return B; - function Has_Foreign_Convention (Id : E) return B; - function Has_Private_Ancestor (Id : E) return B; - function Has_Private_Declaration (Id : E) return B; - function Implementation_Base_Type (Id : E) return E; - function Is_Always_Inlined (Id : E) return B; - function Is_Boolean_Type (Id : E) return B; - function Is_By_Copy_Type (Id : E) return B; - function Is_By_Reference_Type (Id : E) return B; - function Is_Derived_Type (Id : E) return B; - function Is_Dynamic_Scope (Id : E) return B; - function Is_Indefinite_Subtype (Id : E) return B; - function Is_Limited_Type (Id : E) return B; - function Is_Package_Or_Generic_Package (Id : E) return B; - function Is_Protected_Private (Id : E) return B; - function Is_Protected_Record_Type (Id : E) return B; - function Is_Inherently_Limited_Type (Id : E) return B; - function Is_String_Type (Id : E) return B; - function Is_Task_Record_Type (Id : E) return B; - function Is_Wrapper_Package (Id : E) return B; - function Next_Component (Id : E) return E; - function Next_Discriminant (Id : E) return E; - function Next_Formal (Id : E) return E; - function Next_Formal_With_Extras (Id : E) return E; - function Next_Literal (Id : E) return E; - function Next_Stored_Discriminant (Id : E) return E; - function Number_Dimensions (Id : E) return Pos; - function Number_Discriminants (Id : E) return Pos; - function Number_Entries (Id : E) return Nat; - function Number_Formals (Id : E) return Pos; - function Parameter_Mode (Id : E) return Formal_Kind; - function Root_Type (Id : E) return E; - function Scope_Depth_Set (Id : E) return B; - function Size_Clause (Id : E) return N; - function Stream_Size_Clause (Id : E) return N; - 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; + function Address_Clause (Id : E) return N; + function Alignment_Clause (Id : E) return N; + function Ancestor_Subtype (Id : E) return E; + function Base_Type (Id : E) return E; + function Constant_Value (Id : E) return N; + function Declaration_Node (Id : E) return N; + function Designated_Type (Id : E) return E; + function Enclosing_Dynamic_Scope (Id : E) return E; + function First_Component (Id : E) return E; + function First_Component_Or_Discriminant (Id : E) return E; + function First_Discriminant (Id : E) return E; + function First_Formal (Id : E) return E; + function First_Formal_With_Extras (Id : E) return E; + function First_Stored_Discriminant (Id : E) return E; + function First_Subtype (Id : E) return E; + function Has_Attach_Handler (Id : E) return B; + function Has_Entries (Id : E) return B; + function Has_Foreign_Convention (Id : E) return B; + function Has_Private_Ancestor (Id : E) return B; + function Has_Private_Declaration (Id : E) return B; + function Implementation_Base_Type (Id : E) return E; + function Is_Always_Inlined (Id : E) return B; + function Is_Boolean_Type (Id : E) return B; + function Is_By_Copy_Type (Id : E) return B; + function Is_By_Reference_Type (Id : E) return B; + function Is_Derived_Type (Id : E) return B; + function Is_Dynamic_Scope (Id : E) return B; + function Is_Indefinite_Subtype (Id : E) return B; + function Is_Limited_Type (Id : E) return B; + function Is_Package_Or_Generic_Package (Id : E) return B; + function Is_Protected_Private (Id : E) return B; + function Is_Protected_Record_Type (Id : E) return B; + function Is_Inherently_Limited_Type (Id : E) return B; + function Is_String_Type (Id : E) return B; + function Is_Task_Record_Type (Id : E) return B; + function Is_Wrapper_Package (Id : E) return B; + function Next_Component (Id : E) return E; + function Next_Component_Or_Discriminant (Id : E) return E; + function Next_Discriminant (Id : E) return E; + function Next_Formal (Id : E) return E; + function Next_Formal_With_Extras (Id : E) return E; + function Next_Literal (Id : E) return E; + function Next_Stored_Discriminant (Id : E) return E; + function Number_Dimensions (Id : E) return Pos; + function Number_Discriminants (Id : E) return Pos; + function Number_Entries (Id : E) return Nat; + function Number_Formals (Id : E) return Pos; + function Parameter_Mode (Id : E) return Formal_Kind; + function Root_Type (Id : E) return E; + function Scope_Depth_Set (Id : E) return B; + function Size_Clause (Id : E) return N; + function Stream_Size_Clause (Id : E) return N; + 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; ---------------------------------------------- -- Type Representation Attribute Predicates -- ---------------------------------------------- - -- These predicates test the setting of the indicated attribute. If - -- the value has been set, then Known is True, and Unknown is False. - -- If no value is set, then Known is False and Unknown is True. The - -- Known_Static predicate is true only if the value is set (Known) - -- and is set to a compile time known value. Note that in the case - -- of Alignment and Normalized_First_Bit, dynamic values are not - -- possible, so we do not need a separate Known_Static calls in - -- these cases. The not set (unknown values are as follows: + -- These predicates test the setting of the indicated attribute. If the + -- value has been set, then Known is True, and Unknown is False. If no + -- value is set, then Known is False and Unknown is True. The Known_Static + -- predicate is true only if the value is set (Known) and is set to a + -- compile time known value. Note that in the case of Alignment and + -- Normalized_First_Bit, dynamic values are not possible, so we do not + -- need a separate Known_Static calls in these cases. The not set (unknown + -- values are as follows: -- Alignment Uint_0 or No_Uint -- Component_Size Uint_0 or No_Uint @@ -5845,348 +5913,352 @@ 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 : 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); - procedure Set_Associated_Node_For_Itype (Id : E; V : N); - procedure Set_Associated_Storage_Pool (Id : E; V : E); - procedure Set_Barrier_Function (Id : E; V : N); - procedure Set_Block_Node (Id : E; V : N); - procedure Set_Body_Entity (Id : E; V : E); - procedure Set_Body_Needed_For_SAL (Id : E; V : B := True); - procedure Set_CR_Discriminant (Id : E; V : E); - procedure Set_C_Pass_By_Copy (Id : E; V : B := True); - procedure Set_Can_Never_Be_Null (Id : E; V : B := True); - procedure Set_Checks_May_Be_Suppressed (Id : E; V : B := True); - procedure Set_Class_Wide_Type (Id : E; V : E); - procedure Set_Cloned_Subtype (Id : E; V : E); - procedure Set_Component_Alignment (Id : E; V : C); - procedure Set_Component_Bit_Offset (Id : E; V : U); - procedure Set_Component_Clause (Id : E; V : N); - procedure Set_Component_Size (Id : E; V : U); - procedure Set_Component_Type (Id : E; V : E); - procedure Set_Corresponding_Concurrent_Type (Id : E; V : E); - procedure Set_Corresponding_Discriminant (Id : E; V : E); - procedure Set_Corresponding_Equality (Id : E; V : E); - procedure Set_Corresponding_Record_Type (Id : E; V : E); - procedure Set_Corresponding_Remote_Type (Id : E; V : E); - procedure Set_Current_Use_Clause (Id : E; V : E); - procedure Set_Current_Value (Id : E; V : N); - procedure Set_Debug_Info_Off (Id : E; V : B := True); - procedure Set_Debug_Renaming_Link (Id : E; V : E); - procedure Set_DTC_Entity (Id : E; V : E); - procedure Set_DT_Entry_Count (Id : E; V : U); - procedure Set_DT_Offset_To_Top_Func (Id : E; V : E); - procedure Set_DT_Position (Id : E; V : U); - procedure Set_Default_Expr_Function (Id : E; V : E); - procedure Set_Default_Expressions_Processed (Id : E; V : B := True); - procedure Set_Default_Value (Id : E; V : N); - procedure Set_Delay_Cleanups (Id : E; V : B := True); - procedure Set_Delay_Subprogram_Descriptors (Id : E; V : B := True); - procedure Set_Delta_Value (Id : E; V : R); - procedure Set_Dependent_Instances (Id : E; V : L); - procedure Set_Depends_On_Private (Id : E; V : B := True); - procedure Set_Digits_Value (Id : E; V : U); - procedure Set_Directly_Designated_Type (Id : E; V : E); - procedure Set_Discard_Names (Id : E; V : B := True); - procedure Set_Discriminal (Id : E; V : E); - procedure Set_Discriminal_Link (Id : E; V : E); - procedure Set_Discriminant_Checking_Func (Id : E; V : E); - procedure Set_Discriminant_Constraint (Id : E; V : L); - procedure Set_Discriminant_Default_Value (Id : E; V : N); - procedure Set_Discriminant_Number (Id : E; V : U); - procedure Set_Elaborate_Body_Desirable (Id : E; V : B := True); - procedure Set_Elaboration_Entity (Id : E; V : E); - procedure Set_Elaboration_Entity_Required (Id : E; V : B := True); - procedure Set_Enclosing_Scope (Id : E; V : E); - procedure Set_Entry_Accepted (Id : E; V : B := True); - procedure Set_Entry_Bodies_Array (Id : E; V : E); - procedure Set_Entry_Cancel_Parameter (Id : E; V : E); - procedure Set_Entry_Component (Id : E; V : E); - procedure Set_Entry_Formal (Id : E; V : E); - procedure Set_Entry_Index_Constant (Id : E; V : E); - procedure Set_Entry_Parameters_Type (Id : E; V : E); - procedure Set_Enum_Pos_To_Rep (Id : E; V : E); - procedure Set_Enumeration_Pos (Id : E; V : U); - procedure Set_Enumeration_Rep (Id : E; V : U); - procedure Set_Enumeration_Rep_Expr (Id : E; V : N); - procedure Set_Equivalent_Type (Id : E; V : E); - procedure Set_Esize (Id : E; V : U); - procedure Set_Exception_Code (Id : E; V : U); - procedure Set_Extra_Accessibility (Id : E; V : E); - procedure Set_Extra_Constrained (Id : E; V : E); - procedure Set_Extra_Formal (Id : E; V : E); - procedure Set_Extra_Formals (Id : E; V : E); - procedure Set_Finalization_Chain_Entity (Id : E; V : E); - procedure Set_Finalize_Storage_Only (Id : E; V : B := True); - procedure Set_First_Entity (Id : E; V : E); - procedure Set_First_Index (Id : E; V : N); - procedure Set_First_Literal (Id : E; V : E); - procedure Set_First_Optional_Parameter (Id : E; V : E); - procedure Set_First_Private_Entity (Id : E; V : E); - procedure Set_First_Rep_Item (Id : E; V : N); - procedure Set_Freeze_Node (Id : E; V : N); - procedure Set_From_With_Type (Id : E; V : B := True); - procedure Set_Full_View (Id : E; V : E); - procedure Set_Function_Returns_With_DSP (Id : E; V : B := True); - procedure Set_Generic_Homonym (Id : E; V : E); - procedure Set_Generic_Renamings (Id : E; V : L); - procedure Set_Handler_Records (Id : E; V : S); - procedure Set_Has_Aliased_Components (Id : E; V : B := True); - procedure Set_Has_Alignment_Clause (Id : E; V : B := True); - procedure Set_Has_All_Calls_Remote (Id : E; V : B := True); - procedure Set_Has_Anon_Block_Suffix (Id : E; V : B := True); - procedure Set_Has_Atomic_Components (Id : E; V : B := True); - procedure Set_Has_Biased_Representation (Id : E; V : B := True); - procedure Set_Has_Completion (Id : E; V : B := True); - procedure Set_Has_Completion_In_Body (Id : E; V : B := True); - procedure Set_Has_Complex_Representation (Id : E; V : B := True); - procedure Set_Has_Component_Size_Clause (Id : E; V : B := True); - procedure Set_Has_Constrained_Partial_View (Id : E; V : B := True); - procedure Set_Has_Contiguous_Rep (Id : E; V : B := True); - procedure Set_Has_Controlled_Component (Id : E; V : B := True); - procedure Set_Has_Controlling_Result (Id : E; V : B := True); - procedure Set_Has_Convention_Pragma (Id : E; V : B := True); - procedure Set_Has_Delayed_Freeze (Id : E; V : B := True); - procedure Set_Has_Discriminants (Id : E; V : B := True); - procedure Set_Has_Enumeration_Rep_Clause (Id : E; V : B := True); - procedure Set_Has_Exit (Id : E; V : B := True); - procedure Set_Has_External_Tag_Rep_Clause (Id : E; V : B := True); - procedure Set_Has_Fully_Qualified_Name (Id : E; V : B := True); - procedure Set_Has_Gigi_Rep_Item (Id : E; V : B := True); - procedure Set_Has_Homonym (Id : E; V : B := True); - procedure Set_Has_Machine_Radix_Clause (Id : E; V : B := True); - procedure Set_Has_Master_Entity (Id : E; V : B := True); - procedure Set_Has_Missing_Return (Id : E; V : B := True); - procedure Set_Has_Nested_Block_With_Handler (Id : E; V : B := True); - procedure Set_Has_Forward_Instantiation (Id : E; V : B := True); - procedure Set_Has_Non_Standard_Rep (Id : E; V : B := True); - procedure Set_Has_Object_Size_Clause (Id : E; V : B := True); - procedure Set_Has_Per_Object_Constraint (Id : E; V : B := True); - procedure Set_Has_Persistent_BSS (Id : E; V : B := True); - procedure Set_Has_Pragma_Controlled (Id : E; V : B := True); - procedure Set_Has_Pragma_Elaborate_Body (Id : E; V : B := True); - procedure Set_Has_Pragma_Inline (Id : E; V : B := True); - procedure Set_Has_Pragma_Pack (Id : E; V : B := True); - procedure Set_Has_Pragma_Pure (Id : E; V : B := True); - procedure Set_Has_Pragma_Pure_Function (Id : E; V : B := True); - procedure Set_Has_Pragma_Unreferenced (Id : E; V : B := True); - procedure Set_Has_Primitive_Operations (Id : E; V : B := True); - procedure Set_Has_Private_Declaration (Id : E; V : B := True); - procedure Set_Has_Qualified_Name (Id : E; V : B := True); - procedure Set_Has_Record_Rep_Clause (Id : E; V : B := True); - procedure Set_Has_Recursive_Call (Id : E; V : B := True); - procedure Set_Has_Size_Clause (Id : E; V : B := True); - procedure Set_Has_Small_Clause (Id : E; V : B := True); - procedure Set_Has_Specified_Layout (Id : E; V : B := True); - procedure Set_Has_Specified_Stream_Input (Id : E; V : B := True); - procedure Set_Has_Specified_Stream_Output (Id : E; V : B := True); - procedure Set_Has_Specified_Stream_Read (Id : E; V : B := True); - procedure Set_Has_Specified_Stream_Write (Id : E; V : B := True); - procedure Set_Has_Static_Discriminants (Id : E; V : B := True); - procedure Set_Has_Storage_Size_Clause (Id : E; V : B := True); - procedure Set_Has_Stream_Size_Clause (Id : E; V : B := True); - procedure Set_Has_Subprogram_Descriptor (Id : E; V : B := True); - procedure Set_Has_Task (Id : E; V : B := True); - procedure Set_Has_Unchecked_Union (Id : E; V : B := True); - procedure Set_Has_Unknown_Discriminants (Id : E; V : B := True); - procedure Set_Has_Volatile_Components (Id : E; V : B := True); - procedure Set_Has_Xref_Entry (Id : E; V : B := True); - procedure Set_Hiding_Loop_Variable (Id : E; V : E); - procedure Set_Homonym (Id : E; V : E); - procedure Set_In_Package_Body (Id : E; V : B := True); - procedure Set_In_Private_Part (Id : E; V : B := True); - procedure Set_In_Use (Id : E; V : B := True); - procedure Set_Inner_Instances (Id : E; V : L); - procedure Set_Interface_Name (Id : E; V : N); - procedure Set_Is_AST_Entry (Id : E; V : B := True); - procedure Set_Is_Abstract (Id : E; V : B := True); - procedure Set_Is_Local_Anonymous_Access (Id : E; V : B := True); - procedure Set_Is_Access_Constant (Id : E; V : B := True); - procedure Set_Is_Ada_2005_Only (Id : E; V : B := True); - procedure Set_Is_Aliased (Id : E; V : B := True); - procedure Set_Is_Asynchronous (Id : E; V : B := True); - procedure Set_Is_Atomic (Id : E; V : B := True); - procedure Set_Is_Bit_Packed_Array (Id : E; V : B := True); - procedure Set_Is_CPP_Class (Id : E; V : B := True); - procedure Set_Is_Called (Id : E; V : B := True); - procedure Set_Is_Character_Type (Id : E; V : B := True); - procedure Set_Is_Child_Unit (Id : E; V : B := True); - procedure Set_Is_Class_Wide_Equivalent_Type (Id : E; V : B := True); - procedure Set_Is_Compilation_Unit (Id : E; V : B := True); - procedure Set_Is_Completely_Hidden (Id : E; V : B := True); - procedure Set_Is_Concurrent_Record_Type (Id : E; V : B := True); - procedure Set_Is_Constr_Subt_For_UN_Aliased (Id : E; V : B := True); - procedure Set_Is_Constr_Subt_For_U_Nominal (Id : E; V : B := True); - procedure Set_Is_Constrained (Id : E; V : B := True); - procedure Set_Is_Constructor (Id : E; V : B := True); - procedure Set_Is_Controlled (Id : E; V : B := True); - procedure Set_Is_Controlling_Formal (Id : E; V : B := True); - procedure Set_Is_Discrim_SO_Function (Id : E; V : B := True); - procedure Set_Is_Dispatching_Operation (Id : E; V : B := True); - procedure Set_Is_Eliminated (Id : E; V : B := True); - procedure Set_Is_Entry_Formal (Id : E; V : B := True); - procedure Set_Is_Exported (Id : E; V : B := True); - procedure Set_Is_First_Subtype (Id : E; V : B := True); - procedure Set_Is_For_Access_Subtype (Id : E; V : B := True); - procedure Set_Is_Formal_Subprogram (Id : E; V : B := True); - procedure Set_Is_Frozen (Id : E; V : B := True); - procedure Set_Is_Generic_Actual_Type (Id : E; V : B := True); - procedure Set_Is_Generic_Instance (Id : E; V : B := True); - procedure Set_Is_Generic_Type (Id : E; V : B := True); - procedure Set_Is_Hidden (Id : E; V : B := True); - procedure Set_Is_Hidden_Open_Scope (Id : E; V : B := True); - 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); - procedure Set_Is_Intrinsic_Subprogram (Id : E; V : B := True); - procedure Set_Is_Itype (Id : E; V : B := True); - procedure Set_Is_Known_Non_Null (Id : E; V : B := True); - procedure Set_Is_Known_Null (Id : E; V : B := True); - procedure Set_Is_Known_Valid (Id : E; V : B := True); - procedure Set_Is_Limited_Composite (Id : E; V : B := True); - procedure Set_Is_Limited_Interface (Id : E; V : B := True); - procedure Set_Is_Limited_Record (Id : E; V : B := True); - procedure Set_Is_Machine_Code_Subprogram (Id : E; V : B := True); - procedure Set_Is_Non_Static_Subtype (Id : E; V : B := True); - procedure Set_Is_Null_Init_Proc (Id : E; V : B := True); - procedure Set_Is_Obsolescent (Id : E; V : B := True); - procedure Set_Is_Optional_Parameter (Id : E; V : B := True); - procedure Set_Is_Overriding_Operation (Id : E; V : B := True); - procedure Set_Is_Package_Body_Entity (Id : E; V : B := True); - procedure Set_Is_Packed (Id : E; V : B := True); - procedure Set_Is_Packed_Array_Type (Id : E; V : B := True); - procedure Set_Is_Potentially_Use_Visible (Id : E; V : B := True); - procedure Set_Is_Preelaborated (Id : E; V : B := True); - procedure Set_Is_Primitive_Wrapper (Id : E; V : B := True); - procedure Set_Is_Private_Composite (Id : E; V : B := True); - procedure Set_Is_Private_Descendant (Id : E; V : B := True); - procedure Set_Is_Protected_Interface (Id : E; V : B := True); - procedure Set_Is_Public (Id : E; V : B := True); - procedure Set_Is_Pure (Id : E; V : B := True); - procedure Set_Is_Pure_Unit_Access_Type (Id : E; V : B := True); - procedure Set_Is_Remote_Call_Interface (Id : E; V : B := True); - procedure Set_Is_Remote_Types (Id : E; V : B := True); - procedure Set_Is_Renaming_Of_Object (Id : E; V : B := True); - procedure Set_Is_Return_Object (Id : E; V : B := True); - procedure Set_Is_Shared_Passive (Id : E; V : B := True); - procedure Set_Is_Statically_Allocated (Id : E; V : B := True); - procedure Set_Is_Synchronized_Interface (Id : E; V : B := True); - procedure Set_Is_Tag (Id : E; V : B := True); - procedure Set_Is_Tagged_Type (Id : E; V : B := True); - procedure Set_Is_Task_Interface (Id : E; V : B := True); - procedure Set_Is_Thread_Body (Id : E; V : B := True); - procedure Set_Is_True_Constant (Id : E; V : B := True); - procedure Set_Is_Unchecked_Union (Id : E; V : B := True); - procedure Set_Is_Unsigned_Type (Id : E; V : B := True); - procedure Set_Is_VMS_Exception (Id : E; V : B := True); - procedure Set_Is_Valued_Procedure (Id : E; V : B := True); - procedure Set_Is_Visible_Child_Unit (Id : E; V : B := True); - procedure Set_Is_Visible_Formal (Id : E; V : B := True); - procedure Set_Is_Volatile (Id : E; V : B := True); - procedure Set_Itype_Printed (Id : E; V : B := True); - procedure Set_Kill_Elaboration_Checks (Id : E; V : B := True); - procedure Set_Kill_Range_Checks (Id : E; V : B := True); - procedure Set_Kill_Tag_Checks (Id : E; V : B := True); - procedure Set_Known_To_Have_Preelab_Init (Id : E; V : B := True); - procedure Set_Last_Assignment (Id : E; V : N); - procedure Set_Last_Entity (Id : E; V : E); - procedure Set_Limited_View (Id : E; V : E); - procedure Set_Lit_Indexes (Id : E; V : E); - procedure Set_Lit_Strings (Id : E; V : E); - procedure Set_Low_Bound_Known (Id : E; V : B := True); - procedure Set_Machine_Radix_10 (Id : E; V : B := True); - procedure Set_Master_Id (Id : E; V : E); - procedure Set_Materialize_Entity (Id : E; V : B := True); - procedure Set_Mechanism (Id : E; V : M); - procedure Set_Modulus (Id : E; V : U); - procedure Set_Must_Be_On_Byte_Boundary (Id : E; V : B := True); - procedure Set_Must_Have_Preelab_Init (Id : E; V : B := True); - procedure Set_Needs_Debug_Info (Id : E; V : B := True); - procedure Set_Needs_No_Actuals (Id : E; V : B := True); - procedure Set_Never_Set_In_Source (Id : E; V : B := True); - procedure Set_Next_Inlined_Subprogram (Id : E; V : E); - procedure Set_No_Pool_Assigned (Id : E; V : B := True); - procedure Set_No_Return (Id : E; V : B := True); - procedure Set_No_Strict_Aliasing (Id : E; V : B := True); - procedure Set_Non_Binary_Modulus (Id : E; V : B := True); - procedure Set_Non_Limited_View (Id : E; V : E); - procedure Set_Nonzero_Is_True (Id : E; V : B := True); - procedure Set_Normalized_First_Bit (Id : E; V : U); - procedure Set_Normalized_Position (Id : E; V : U); - procedure Set_Normalized_Position_Max (Id : E; V : U); - procedure Set_Object_Ref (Id : E; V : E); - procedure Set_Obsolescent_Warning (Id : E; V : N); - procedure Set_Original_Access_Type (Id : E; V : E); - procedure Set_Original_Array_Type (Id : E; V : E); - procedure Set_Original_Record_Component (Id : E; V : E); - procedure Set_Overridden_Operation (Id : E; V : E); - procedure Set_Package_Instantiation (Id : E; V : N); - procedure Set_Packed_Array_Type (Id : E; V : E); - procedure Set_Parent_Subtype (Id : E; V : E); - procedure Set_Primitive_Operations (Id : E; V : L); - procedure Set_Prival (Id : E; V : E); - procedure Set_Privals_Chain (Id : E; V : L); - procedure Set_Private_Dependents (Id : E; V : L); - procedure Set_Private_View (Id : E; V : N); - procedure Set_Protected_Body_Subprogram (Id : E; V : E); - procedure Set_Protected_Formal (Id : E; V : E); - procedure Set_Protected_Operation (Id : E; V : N); - procedure Set_RM_Size (Id : E; V : U); - procedure Set_Reachable (Id : E; V : B := True); - procedure Set_Referenced (Id : E; V : B := True); - procedure Set_Referenced_As_LHS (Id : E; V : B := True); - procedure Set_Referenced_Object (Id : E; V : N); - procedure Set_Register_Exception_Call (Id : E; V : N); - procedure Set_Related_Array_Object (Id : E; V : E); - procedure Set_Related_Instance (Id : E; V : E); - procedure Set_Renamed_Entity (Id : E; V : N); - procedure Set_Renamed_Object (Id : E; V : N); - procedure Set_Renaming_Map (Id : E; V : U); - procedure Set_Return_Present (Id : E; V : B := True); - procedure Set_Return_Applies_To (Id : E; V : N); - procedure Set_Returns_By_Ref (Id : E; V : B := True); - procedure Set_Reverse_Bit_Order (Id : E; V : B := True); - procedure Set_Scalar_Range (Id : E; V : N); - procedure Set_Scale_Value (Id : E; V : U); - procedure Set_Scope_Depth_Value (Id : E; V : U); - procedure Set_Sec_Stack_Needed_For_Return (Id : E; V : B := True); - procedure Set_Shadow_Entities (Id : E; V : S); - procedure Set_Shared_Var_Assign_Proc (Id : E; V : E); - procedure Set_Shared_Var_Read_Proc (Id : E; V : E); - procedure Set_Size_Check_Code (Id : E; V : N); - procedure Set_Size_Depends_On_Discriminant (Id : E; V : B := True); - procedure Set_Size_Known_At_Compile_Time (Id : E; V : B := True); - procedure Set_Small_Value (Id : E; V : R); - procedure Set_Spec_Entity (Id : E; V : E); - procedure Set_Storage_Size_Variable (Id : E; V : E); - procedure Set_Stored_Constraint (Id : E; V : L); - procedure Set_Strict_Alignment (Id : E; V : B := True); - procedure Set_String_Literal_Length (Id : E; V : U); - procedure Set_String_Literal_Low_Bound (Id : E; V : N); - 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); - procedure Set_Uses_Sec_Stack (Id : E; V : B := True); - procedure Set_Vax_Float (Id : E; V : B := True); - procedure Set_Warnings_Off (Id : E; V : B := True); - procedure Set_Was_Hidden (Id : E; V : B := True); - procedure Set_Wrapped_Entity (Id : E; V : E); + procedure Set_Abstract_Interfaces (Id : E; V : L); + procedure Set_Accept_Address (Id : E; V : L); + 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); + procedure Set_Associated_Node_For_Itype (Id : E; V : N); + procedure Set_Associated_Storage_Pool (Id : E; V : E); + procedure Set_Barrier_Function (Id : E; V : N); + procedure Set_Block_Node (Id : E; V : N); + procedure Set_Body_Entity (Id : E; V : E); + procedure Set_Body_Needed_For_SAL (Id : E; V : B := True); + procedure Set_CR_Discriminant (Id : E; V : E); + procedure Set_C_Pass_By_Copy (Id : E; V : B := True); + procedure Set_Can_Never_Be_Null (Id : E; V : B := True); + procedure Set_Checks_May_Be_Suppressed (Id : E; V : B := True); + procedure Set_Class_Wide_Type (Id : E; V : E); + procedure Set_Cloned_Subtype (Id : E; V : E); + procedure Set_Component_Alignment (Id : E; V : C); + procedure Set_Component_Bit_Offset (Id : E; V : U); + procedure Set_Component_Clause (Id : E; V : N); + procedure Set_Component_Size (Id : E; V : U); + procedure Set_Component_Type (Id : E; V : E); + procedure Set_Corresponding_Concurrent_Type (Id : E; V : E); + procedure Set_Corresponding_Discriminant (Id : E; V : E); + procedure Set_Corresponding_Equality (Id : E; V : E); + procedure Set_Corresponding_Record_Type (Id : E; V : E); + procedure Set_Corresponding_Remote_Type (Id : E; V : E); + procedure Set_Current_Use_Clause (Id : E; V : E); + procedure Set_Current_Value (Id : E; V : N); + procedure Set_Debug_Info_Off (Id : E; V : B := True); + procedure Set_Debug_Renaming_Link (Id : E; V : E); + procedure Set_DTC_Entity (Id : E; V : E); + procedure Set_DT_Entry_Count (Id : E; V : U); + procedure Set_DT_Offset_To_Top_Func (Id : E; V : E); + procedure Set_DT_Position (Id : E; V : U); + procedure Set_Default_Expr_Function (Id : E; V : E); + procedure Set_Default_Expressions_Processed (Id : E; V : B := True); + procedure Set_Default_Value (Id : E; V : N); + procedure Set_Delay_Cleanups (Id : E; V : B := True); + procedure Set_Delay_Subprogram_Descriptors (Id : E; V : B := True); + procedure Set_Delta_Value (Id : E; V : R); + procedure Set_Dependent_Instances (Id : E; V : L); + procedure Set_Depends_On_Private (Id : E; V : B := True); + procedure Set_Digits_Value (Id : E; V : U); + procedure Set_Directly_Designated_Type (Id : E; V : E); + procedure Set_Discard_Names (Id : E; V : B := True); + procedure Set_Discriminal (Id : E; V : E); + procedure Set_Discriminal_Link (Id : E; V : E); + procedure Set_Discriminant_Checking_Func (Id : E; V : E); + procedure Set_Discriminant_Constraint (Id : E; V : L); + procedure Set_Discriminant_Default_Value (Id : E; V : N); + procedure Set_Discriminant_Number (Id : E; V : U); + procedure Set_Elaborate_Body_Desirable (Id : E; V : B := True); + procedure Set_Elaboration_Entity (Id : E; V : E); + procedure Set_Elaboration_Entity_Required (Id : E; V : B := True); + procedure Set_Enclosing_Scope (Id : E; V : E); + procedure Set_Entry_Accepted (Id : E; V : B := True); + procedure Set_Entry_Bodies_Array (Id : E; V : E); + procedure Set_Entry_Cancel_Parameter (Id : E; V : E); + procedure Set_Entry_Component (Id : E; V : E); + procedure Set_Entry_Formal (Id : E; V : E); + procedure Set_Entry_Index_Constant (Id : E; V : E); + procedure Set_Entry_Parameters_Type (Id : E; V : E); + procedure Set_Enum_Pos_To_Rep (Id : E; V : E); + procedure Set_Enumeration_Pos (Id : E; V : U); + procedure Set_Enumeration_Rep (Id : E; V : U); + procedure Set_Enumeration_Rep_Expr (Id : E; V : N); + procedure Set_Equivalent_Type (Id : E; V : E); + procedure Set_Esize (Id : E; V : U); + procedure Set_Exception_Code (Id : E; V : U); + procedure Set_Extra_Accessibility (Id : E; V : E); + procedure Set_Extra_Constrained (Id : E; V : E); + procedure Set_Extra_Formal (Id : E; V : E); + procedure Set_Extra_Formals (Id : E; V : E); + procedure Set_Finalization_Chain_Entity (Id : E; V : E); + procedure Set_Finalize_Storage_Only (Id : E; V : B := True); + procedure Set_First_Entity (Id : E; V : E); + procedure Set_First_Index (Id : E; V : N); + procedure Set_First_Literal (Id : E; V : E); + procedure Set_First_Optional_Parameter (Id : E; V : E); + procedure Set_First_Private_Entity (Id : E; V : E); + procedure Set_First_Rep_Item (Id : E; V : N); + procedure Set_Freeze_Node (Id : E; V : N); + procedure Set_From_With_Type (Id : E; V : B := True); + procedure Set_Full_View (Id : E; V : E); + procedure Set_Function_Returns_With_DSP (Id : E; V : B := True); + procedure Set_Generic_Homonym (Id : E; V : E); + procedure Set_Generic_Renamings (Id : E; V : L); + procedure Set_Handler_Records (Id : E; V : S); + procedure Set_Has_Aliased_Components (Id : E; V : B := True); + procedure Set_Has_Alignment_Clause (Id : E; V : B := True); + procedure Set_Has_All_Calls_Remote (Id : E; V : B := True); + procedure Set_Has_Anon_Block_Suffix (Id : E; V : B := True); + procedure Set_Has_Atomic_Components (Id : E; V : B := True); + procedure Set_Has_Biased_Representation (Id : E; V : B := True); + procedure Set_Has_Completion (Id : E; V : B := True); + procedure Set_Has_Completion_In_Body (Id : E; V : B := True); + procedure Set_Has_Complex_Representation (Id : E; V : B := True); + procedure Set_Has_Component_Size_Clause (Id : E; V : B := True); + procedure Set_Has_Constrained_Partial_View (Id : E; V : B := True); + procedure Set_Has_Contiguous_Rep (Id : E; V : B := True); + procedure Set_Has_Controlled_Component (Id : E; V : B := True); + procedure Set_Has_Controlling_Result (Id : E; V : B := True); + procedure Set_Has_Convention_Pragma (Id : E; V : B := True); + procedure Set_Has_Delayed_Freeze (Id : E; V : B := True); + procedure Set_Has_Discriminants (Id : E; V : B := True); + procedure Set_Has_Enumeration_Rep_Clause (Id : E; V : B := True); + procedure Set_Has_Exit (Id : E; V : B := True); + procedure Set_Has_External_Tag_Rep_Clause (Id : E; V : B := True); + procedure Set_Has_Fully_Qualified_Name (Id : E; V : B := True); + procedure Set_Has_Gigi_Rep_Item (Id : E; V : B := True); + procedure Set_Has_Homonym (Id : E; V : B := True); + procedure Set_Has_Machine_Radix_Clause (Id : E; V : B := True); + procedure Set_Has_Master_Entity (Id : E; V : B := True); + procedure Set_Has_Missing_Return (Id : E; V : B := True); + procedure Set_Has_Nested_Block_With_Handler (Id : E; V : B := True); + procedure Set_Has_Forward_Instantiation (Id : E; V : B := True); + procedure Set_Has_Non_Standard_Rep (Id : E; V : B := True); + procedure Set_Has_Object_Size_Clause (Id : E; V : B := True); + procedure Set_Has_Per_Object_Constraint (Id : E; V : B := True); + procedure Set_Has_Persistent_BSS (Id : E; V : B := True); + procedure Set_Has_Pragma_Controlled (Id : E; V : B := True); + procedure Set_Has_Pragma_Elaborate_Body (Id : E; V : B := True); + procedure Set_Has_Pragma_Inline (Id : E; V : B := True); + procedure Set_Has_Pragma_Pack (Id : E; V : B := True); + procedure Set_Has_Pragma_Pure (Id : E; V : B := True); + procedure Set_Has_Pragma_Pure_Function (Id : E; V : B := True); + procedure Set_Has_Pragma_Unreferenced (Id : E; V : B := True); + procedure Set_Has_Pragma_Unreferenced_Objects (Id : E; V : B := True); + procedure Set_Has_Primitive_Operations (Id : E; V : B := True); + procedure Set_Has_Private_Declaration (Id : E; V : B := True); + procedure Set_Has_Qualified_Name (Id : E; V : B := True); + procedure Set_Has_RACW (Id : E; V : B := True); + procedure Set_Has_Record_Rep_Clause (Id : E; V : B := True); + procedure Set_Has_Recursive_Call (Id : E; V : B := True); + procedure Set_Has_Size_Clause (Id : E; V : B := True); + procedure Set_Has_Small_Clause (Id : E; V : B := True); + procedure Set_Has_Specified_Layout (Id : E; V : B := True); + procedure Set_Has_Specified_Stream_Input (Id : E; V : B := True); + procedure Set_Has_Specified_Stream_Output (Id : E; V : B := True); + procedure Set_Has_Specified_Stream_Read (Id : E; V : B := True); + procedure Set_Has_Specified_Stream_Write (Id : E; V : B := True); + procedure Set_Has_Static_Discriminants (Id : E; V : B := True); + procedure Set_Has_Storage_Size_Clause (Id : E; V : B := True); + procedure Set_Has_Stream_Size_Clause (Id : E; V : B := True); + procedure Set_Has_Subprogram_Descriptor (Id : E; V : B := True); + procedure Set_Has_Task (Id : E; V : B := True); + procedure Set_Has_Unchecked_Union (Id : E; V : B := True); + procedure Set_Has_Unknown_Discriminants (Id : E; V : B := True); + procedure Set_Has_Volatile_Components (Id : E; V : B := True); + procedure Set_Has_Xref_Entry (Id : E; V : B := True); + procedure Set_Hiding_Loop_Variable (Id : E; V : E); + procedure Set_Homonym (Id : E; V : E); + procedure Set_In_Package_Body (Id : E; V : B := True); + procedure Set_In_Private_Part (Id : E; V : B := True); + procedure Set_In_Use (Id : E; V : B := True); + procedure Set_Inner_Instances (Id : E; V : L); + procedure Set_Interface_Name (Id : E; V : N); + procedure Set_Is_AST_Entry (Id : E; V : B := True); + procedure Set_Is_Abstract_Subprogram (Id : E; V : B := True); + procedure Set_Is_Abstract_Type (Id : E; V : B := True); + procedure Set_Is_Local_Anonymous_Access (Id : E; V : B := True); + procedure Set_Is_Access_Constant (Id : E; V : B := True); + procedure Set_Is_Ada_2005_Only (Id : E; V : B := True); + procedure Set_Is_Aliased (Id : E; V : B := True); + procedure Set_Is_Asynchronous (Id : E; V : B := True); + procedure Set_Is_Atomic (Id : E; V : B := True); + procedure Set_Is_Bit_Packed_Array (Id : E; V : B := True); + procedure Set_Is_CPP_Class (Id : E; V : B := True); + procedure Set_Is_Called (Id : E; V : B := True); + procedure Set_Is_Character_Type (Id : E; V : B := True); + procedure Set_Is_Child_Unit (Id : E; V : B := True); + procedure Set_Is_Class_Wide_Equivalent_Type (Id : E; V : B := True); + procedure Set_Is_Compilation_Unit (Id : E; V : B := True); + procedure Set_Is_Completely_Hidden (Id : E; V : B := True); + procedure Set_Is_Concurrent_Record_Type (Id : E; V : B := True); + procedure Set_Is_Constr_Subt_For_UN_Aliased (Id : E; V : B := True); + procedure Set_Is_Constr_Subt_For_U_Nominal (Id : E; V : B := True); + procedure Set_Is_Constrained (Id : E; V : B := True); + procedure Set_Is_Constructor (Id : E; V : B := True); + procedure Set_Is_Controlled (Id : E; V : B := True); + procedure Set_Is_Controlling_Formal (Id : E; V : B := True); + procedure Set_Is_Discrim_SO_Function (Id : E; V : B := True); + procedure Set_Is_Dispatching_Operation (Id : E; V : B := True); + procedure Set_Is_Eliminated (Id : E; V : B := True); + procedure Set_Is_Entry_Formal (Id : E; V : B := True); + procedure Set_Is_Exported (Id : E; V : B := True); + procedure Set_Is_First_Subtype (Id : E; V : B := True); + procedure Set_Is_For_Access_Subtype (Id : E; V : B := True); + procedure Set_Is_Formal_Subprogram (Id : E; V : B := True); + procedure Set_Is_Frozen (Id : E; V : B := True); + procedure Set_Is_Generic_Actual_Type (Id : E; V : B := True); + procedure Set_Is_Generic_Instance (Id : E; V : B := True); + procedure Set_Is_Generic_Type (Id : E; V : B := True); + procedure Set_Is_Hidden (Id : E; V : B := True); + procedure Set_Is_Hidden_Open_Scope (Id : E; V : B := True); + 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); + procedure Set_Is_Intrinsic_Subprogram (Id : E; V : B := True); + procedure Set_Is_Itype (Id : E; V : B := True); + procedure Set_Is_Known_Non_Null (Id : E; V : B := True); + procedure Set_Is_Known_Null (Id : E; V : B := True); + procedure Set_Is_Known_Valid (Id : E; V : B := True); + procedure Set_Is_Limited_Composite (Id : E; V : B := True); + procedure Set_Is_Limited_Interface (Id : E; V : B := True); + procedure Set_Is_Limited_Record (Id : E; V : B := True); + procedure Set_Is_Machine_Code_Subprogram (Id : E; V : B := True); + procedure Set_Is_Non_Static_Subtype (Id : E; V : B := True); + procedure Set_Is_Null_Init_Proc (Id : E; V : B := True); + procedure Set_Is_Obsolescent (Id : E; V : B := True); + procedure Set_Is_Optional_Parameter (Id : E; V : B := True); + procedure Set_Is_Overriding_Operation (Id : E; V : B := True); + procedure Set_Is_Package_Body_Entity (Id : E; V : B := True); + procedure Set_Is_Packed (Id : E; V : B := True); + procedure Set_Is_Packed_Array_Type (Id : E; V : B := True); + procedure Set_Is_Potentially_Use_Visible (Id : E; V : B := True); + procedure Set_Is_Preelaborated (Id : E; V : B := True); + procedure Set_Is_Primitive_Wrapper (Id : E; V : B := True); + procedure Set_Is_Private_Composite (Id : E; V : B := True); + procedure Set_Is_Private_Descendant (Id : E; V : B := True); + procedure Set_Is_Protected_Interface (Id : E; V : B := True); + procedure Set_Is_Public (Id : E; V : B := True); + procedure Set_Is_Pure (Id : E; V : B := True); + procedure Set_Is_Pure_Unit_Access_Type (Id : E; V : B := True); + procedure Set_Is_Remote_Call_Interface (Id : E; V : B := True); + procedure Set_Is_Remote_Types (Id : E; V : B := True); + procedure Set_Is_Renaming_Of_Object (Id : E; V : B := True); + procedure Set_Is_Return_Object (Id : E; V : B := True); + procedure Set_Is_Shared_Passive (Id : E; V : B := True); + procedure Set_Is_Statically_Allocated (Id : E; V : B := True); + procedure Set_Is_Synchronized_Interface (Id : E; V : B := True); + procedure Set_Is_Tag (Id : E; V : B := True); + procedure Set_Is_Tagged_Type (Id : E; V : B := True); + procedure Set_Is_Task_Interface (Id : E; V : B := True); + procedure Set_Is_Thread_Body (Id : E; V : B := True); + procedure Set_Is_True_Constant (Id : E; V : B := True); + procedure Set_Is_Unchecked_Union (Id : E; V : B := True); + procedure Set_Is_Unsigned_Type (Id : E; V : B := True); + procedure Set_Is_VMS_Exception (Id : E; V : B := True); + procedure Set_Is_Valued_Procedure (Id : E; V : B := True); + procedure Set_Is_Visible_Child_Unit (Id : E; V : B := True); + procedure Set_Is_Visible_Formal (Id : E; V : B := True); + procedure Set_Is_Volatile (Id : E; V : B := True); + procedure Set_Itype_Printed (Id : E; V : B := True); + procedure Set_Kill_Elaboration_Checks (Id : E; V : B := True); + procedure Set_Kill_Range_Checks (Id : E; V : B := True); + procedure Set_Kill_Tag_Checks (Id : E; V : B := True); + procedure Set_Known_To_Have_Preelab_Init (Id : E; V : B := True); + procedure Set_Last_Assignment (Id : E; V : N); + procedure Set_Last_Entity (Id : E; V : E); + procedure Set_Limited_View (Id : E; V : E); + procedure Set_Lit_Indexes (Id : E; V : E); + procedure Set_Lit_Strings (Id : E; V : E); + procedure Set_Low_Bound_Known (Id : E; V : B := True); + procedure Set_Machine_Radix_10 (Id : E; V : B := True); + procedure Set_Master_Id (Id : E; V : E); + procedure Set_Materialize_Entity (Id : E; V : B := True); + procedure Set_Mechanism (Id : E; V : M); + procedure Set_Modulus (Id : E; V : U); + procedure Set_Must_Be_On_Byte_Boundary (Id : E; V : B := True); + procedure Set_Must_Have_Preelab_Init (Id : E; V : B := True); + procedure Set_Needs_Debug_Info (Id : E; V : B := True); + procedure Set_Needs_No_Actuals (Id : E; V : B := True); + procedure Set_Never_Set_In_Source (Id : E; V : B := True); + procedure Set_Next_Inlined_Subprogram (Id : E; V : E); + procedure Set_No_Pool_Assigned (Id : E; V : B := True); + procedure Set_No_Return (Id : E; V : B := True); + procedure Set_No_Strict_Aliasing (Id : E; V : B := True); + procedure Set_Non_Binary_Modulus (Id : E; V : B := True); + procedure Set_Non_Limited_View (Id : E; V : E); + procedure Set_Nonzero_Is_True (Id : E; V : B := True); + procedure Set_Normalized_First_Bit (Id : E; V : U); + procedure Set_Normalized_Position (Id : E; V : U); + procedure Set_Normalized_Position_Max (Id : E; V : U); + procedure Set_Object_Ref (Id : E; V : E); + procedure Set_Obsolescent_Warning (Id : E; V : N); + procedure Set_Original_Access_Type (Id : E; V : E); + procedure Set_Original_Array_Type (Id : E; V : E); + procedure Set_Original_Record_Component (Id : E; V : E); + procedure Set_Overridden_Operation (Id : E; V : E); + procedure Set_Package_Instantiation (Id : E; V : N); + procedure Set_Packed_Array_Type (Id : E; V : E); + procedure Set_Parent_Subtype (Id : E; V : E); + procedure Set_Primitive_Operations (Id : E; V : L); + procedure Set_Prival (Id : E; V : E); + procedure Set_Privals_Chain (Id : E; V : L); + procedure Set_Private_Dependents (Id : E; V : L); + procedure Set_Private_View (Id : E; V : N); + procedure Set_Protected_Body_Subprogram (Id : E; V : E); + procedure Set_Protected_Formal (Id : E; V : E); + procedure Set_Protected_Operation (Id : E; V : N); + procedure Set_RM_Size (Id : E; V : U); + procedure Set_Reachable (Id : E; V : B := True); + procedure Set_Referenced (Id : E; V : B := True); + procedure Set_Referenced_As_LHS (Id : E; V : B := True); + procedure Set_Referenced_Object (Id : E; V : N); + procedure Set_Register_Exception_Call (Id : E; V : N); + procedure Set_Related_Array_Object (Id : E; V : E); + procedure Set_Related_Instance (Id : E; V : E); + procedure Set_Renamed_Entity (Id : E; V : N); + procedure Set_Renamed_Object (Id : E; V : N); + procedure Set_Renaming_Map (Id : E; V : U); + procedure Set_Requires_Overriding (Id : E; V : B := True); + procedure Set_Return_Present (Id : E; V : B := True); + procedure Set_Return_Applies_To (Id : E; V : N); + procedure Set_Returns_By_Ref (Id : E; V : B := True); + procedure Set_Reverse_Bit_Order (Id : E; V : B := True); + procedure Set_Scalar_Range (Id : E; V : N); + procedure Set_Scale_Value (Id : E; V : U); + procedure Set_Scope_Depth_Value (Id : E; V : U); + procedure Set_Sec_Stack_Needed_For_Return (Id : E; V : B := True); + procedure Set_Shadow_Entities (Id : E; V : S); + procedure Set_Shared_Var_Assign_Proc (Id : E; V : E); + procedure Set_Shared_Var_Read_Proc (Id : E; V : E); + procedure Set_Size_Check_Code (Id : E; V : N); + procedure Set_Size_Depends_On_Discriminant (Id : E; V : B := True); + procedure Set_Size_Known_At_Compile_Time (Id : E; V : B := True); + procedure Set_Small_Value (Id : E; V : R); + procedure Set_Spec_Entity (Id : E; V : E); + procedure Set_Storage_Size_Variable (Id : E; V : E); + procedure Set_Stored_Constraint (Id : E; V : L); + procedure Set_Strict_Alignment (Id : E; V : B := True); + procedure Set_String_Literal_Length (Id : E; V : U); + procedure Set_String_Literal_Low_Bound (Id : E; V : N); + 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); + procedure Set_Uses_Sec_Stack (Id : E; V : B := True); + procedure Set_Vax_Float (Id : E; V : B := True); + procedure Set_Warnings_Off (Id : E; V : B := True); + procedure Set_Was_Hidden (Id : E; V : B := True); + procedure Set_Wrapped_Entity (Id : E; V : E); ----------------------------------- -- Field Initialization Routines -- @@ -6253,16 +6325,18 @@ package Einfo is -- We define the set of Proc_Next_xxx routines simply for the purposes -- of inlining them without necessarily inlining the function. - procedure Proc_Next_Component (N : in out Node_Id); - procedure Proc_Next_Discriminant (N : in out Node_Id); - procedure Proc_Next_Formal (N : in out Node_Id); - procedure Proc_Next_Formal_With_Extras (N : in out Node_Id); - procedure Proc_Next_Index (N : in out Node_Id); - procedure Proc_Next_Inlined_Subprogram (N : in out Node_Id); - procedure Proc_Next_Literal (N : in out Node_Id); - procedure Proc_Next_Stored_Discriminant (N : in out Node_Id); + procedure Proc_Next_Component (N : in out Node_Id); + procedure Proc_Next_Component_Or_Discriminant (N : in out Node_Id); + procedure Proc_Next_Discriminant (N : in out Node_Id); + procedure Proc_Next_Formal (N : in out Node_Id); + procedure Proc_Next_Formal_With_Extras (N : in out Node_Id); + procedure Proc_Next_Index (N : in out Node_Id); + procedure Proc_Next_Inlined_Subprogram (N : in out Node_Id); + procedure Proc_Next_Literal (N : in out Node_Id); + procedure Proc_Next_Stored_Discriminant (N : in out Node_Id); pragma Inline (Proc_Next_Component); + pragma Inline (Proc_Next_Component_Or_Discriminant); pragma Inline (Proc_Next_Discriminant); pragma Inline (Proc_Next_Formal); pragma Inline (Proc_Next_Formal_With_Extras); @@ -6271,28 +6345,31 @@ package Einfo is pragma Inline (Proc_Next_Literal); pragma Inline (Proc_Next_Stored_Discriminant); - procedure Next_Component (N : in out Node_Id) + procedure Next_Component (N : in out Node_Id) renames Proc_Next_Component; - procedure Next_Discriminant (N : in out Node_Id) + procedure Next_Component_Or_Discriminant (N : in out Node_Id) + renames Proc_Next_Component; + + procedure Next_Discriminant (N : in out Node_Id) renames Proc_Next_Discriminant; - procedure Next_Formal (N : in out Node_Id) + procedure Next_Formal (N : in out Node_Id) renames Proc_Next_Formal; - procedure Next_Formal_With_Extras (N : in out Node_Id) + procedure Next_Formal_With_Extras (N : in out Node_Id) renames Proc_Next_Formal_With_Extras; - procedure Next_Index (N : in out Node_Id) + procedure Next_Index (N : in out Node_Id) renames Proc_Next_Index; - procedure Next_Inlined_Subprogram (N : in out Node_Id) + procedure Next_Inlined_Subprogram (N : in out Node_Id) renames Proc_Next_Inlined_Subprogram; - procedure Next_Literal (N : in out Node_Id) + procedure Next_Literal (N : in out Node_Id) renames Proc_Next_Literal; - procedure Next_Stored_Discriminant (N : in out Node_Id) + procedure Next_Stored_Discriminant (N : in out Node_Id) renames Proc_Next_Stored_Discriminant; ---------------------------------------------- @@ -6300,26 +6377,25 @@ package Einfo is ---------------------------------------------- -- The First_Rep_Item field of every entity points to a linked list - -- (linked through Next_Rep_Item) of representation pragmas and - -- attribute definition clauses that apply to the item. Note that - -- in the case of types, it is assumed that any such rep items for - -- a base type also apply to all subtypes. This is implemented by - -- having the chain for subtypes link onto the chain for the base - -- type, so that any new entries for the subtype are added at the - -- start of the chain. + -- (linked through Next_Rep_Item) of representation pragmas and attribute + -- definition clauses that apply to the item. Note that in the case of + -- types, it is assumed that any such rep items for a base type also apply + -- to all subtypes. This is implemented by having the chain for subtypes + -- link onto the chain for the base type, so that any new entries for the + -- subtype are added at the start of the chain. function Get_Attribute_Definition_Clause (E : Entity_Id; Id : Attribute_Id) return Node_Id; - -- Searches the Rep_Item chain for a given entity E, for an instance - -- of an attribute definition clause with the given attribute Id. If - -- found, the value returned is the N_Attribute_Definition_Clause node, - -- otherwise Empty is returned. + -- Searches the Rep_Item chain for a given entity E, for an instance of an + -- attribute definition clause with the given attribute Id. If found, the + -- value returned is the N_Attribute_Definition_Clause node, otherwise + -- Empty is returned. function Get_Rep_Pragma (E : Entity_Id; Nam : Name_Id) return Node_Id; -- Searches the Rep_Item chain for the given entity E, for an instance - -- of a representation pragma with the given name Nam. If found then - -- the value returned is the N_Pragma node, otherwise Empty is returned. + -- a representation pragma with the given name Nam. If found then the + -- value returned is the N_Pragma node, otherwise Empty is returned. function Has_Rep_Pragma (E : Entity_Id; Nam : Name_Id) return Boolean; -- Searches the Rep_Item chain for the given entity E, for an instance @@ -6329,10 +6405,9 @@ package Einfo is function Has_Attribute_Definition_Clause (E : Entity_Id; Id : Attribute_Id) return Boolean; - -- Searches the Rep_Item chain for a given entity E, for an instance - -- of an attribute definition clause with the given attribute Id. If - -- found, True is returned, otherwise False indicates that no matching - -- entry was found. + -- Searches the Rep_Item chain for a given entity E, for an instance of an + -- attribute definition clause with the given attribute Id. If found, True + -- is returned, otherwise False indicates that no matching entry was found. procedure Record_Rep_Item (E : Entity_Id; N : Node_Id); -- N is the node for either a representation pragma or an attribute @@ -6545,9 +6620,11 @@ package Einfo is pragma Inline (Has_Pragma_Pure); pragma Inline (Has_Pragma_Pure_Function); pragma Inline (Has_Pragma_Unreferenced); + pragma Inline (Has_Pragma_Unreferenced_Objects); pragma Inline (Has_Primitive_Operations); pragma Inline (Has_Private_Declaration); pragma Inline (Has_Qualified_Name); + pragma Inline (Has_RACW); pragma Inline (Has_Record_Rep_Clause); pragma Inline (Has_Recursive_Call); pragma Inline (Has_Size_Clause); @@ -6574,11 +6651,13 @@ package Einfo is pragma Inline (Inner_Instances); pragma Inline (Interface_Name); pragma Inline (Is_AST_Entry); - pragma Inline (Is_Abstract); + pragma Inline (Is_Abstract_Subprogram); + pragma Inline (Is_Abstract_Type); pragma Inline (Is_Local_Anonymous_Access); pragma Inline (Is_Access_Constant); pragma Inline (Is_Ada_2005_Only); pragma Inline (Is_Access_Type); + pragma Inline (Is_Access_Protected_Subprogram_Type); pragma Inline (Is_Aliased); pragma Inline (Is_Array_Type); pragma Inline (Is_Asynchronous); @@ -6760,6 +6839,7 @@ package Einfo is pragma Inline (Renamed_Entity); pragma Inline (Renamed_Object); pragma Inline (Renaming_Map); + pragma Inline (Requires_Overriding); pragma Inline (Return_Present); pragma Inline (Return_Applies_To); pragma Inline (Returns_By_Ref); @@ -6931,10 +7011,12 @@ package Einfo is pragma Inline (Set_Has_Pragma_Pure); pragma Inline (Set_Has_Pragma_Pure_Function); pragma Inline (Set_Has_Pragma_Unreferenced); + pragma Inline (Set_Has_Pragma_Unreferenced_Objects); pragma Inline (Set_Known_To_Have_Preelab_Init); pragma Inline (Set_Has_Primitive_Operations); pragma Inline (Set_Has_Private_Declaration); pragma Inline (Set_Has_Qualified_Name); + pragma Inline (Set_Has_RACW); pragma Inline (Set_Has_Record_Rep_Clause); pragma Inline (Set_Has_Recursive_Call); pragma Inline (Set_Has_Size_Clause); @@ -6960,7 +7042,8 @@ package Einfo is pragma Inline (Set_Inner_Instances); pragma Inline (Set_Interface_Name); pragma Inline (Set_Is_AST_Entry); - pragma Inline (Set_Is_Abstract); + pragma Inline (Set_Is_Abstract_Subprogram); + pragma Inline (Set_Is_Abstract_Type); pragma Inline (Set_Is_Local_Anonymous_Access); pragma Inline (Set_Is_Access_Constant); pragma Inline (Set_Is_Ada_2005_Only); @@ -7106,6 +7189,7 @@ package Einfo is pragma Inline (Set_Renamed_Entity); pragma Inline (Set_Renamed_Object); pragma Inline (Set_Renaming_Map); + pragma Inline (Set_Requires_Overriding); pragma Inline (Set_Return_Present); pragma Inline (Set_Return_Applies_To); pragma Inline (Set_Returns_By_Ref); diff --git a/gcc/ada/exp_ch5.adb b/gcc/ada/exp_ch5.adb index 7410db22552..d3db4afceb3 100644 --- a/gcc/ada/exp_ch5.adb +++ b/gcc/ada/exp_ch5.adb @@ -29,6 +29,7 @@ with Checks; use Checks; with Debug; use Debug; with Einfo; use Einfo; with Elists; use Elists; +with Exp_Atag; use Exp_Atag; with Exp_Aggr; use Exp_Aggr; with Exp_Ch6; use Exp_Ch6; with Exp_Ch7; use Exp_Ch7; @@ -127,10 +128,6 @@ package body Exp_Ch5 is -- pointers which are not 'part of the value' and must not be changed -- upon assignment. N is the original Assignment node. - procedure No_Secondary_Stack_Case (N : Node_Id); - -- Obsolete code to deal with functions for which - -- Function_Returns_With_DSP is True. - function Possible_Bit_Aligned_Component (N : Node_Id) return Boolean; -- This function is used in processing the assignment of a record or -- indexed component. The argument N is either the left hand or right @@ -1401,7 +1398,7 @@ package body Exp_Ch5 is begin -- Ada 2005 (AI-327): Handle assignment to priority of protected object - -- Rewrite an assignment to X'Priority into a run-time call. + -- Rewrite an assignment to X'Priority into a run-time call -- For example: X'Priority := New_Prio_Expr; -- ...is expanded into Set_Ceiling (X._Object, New_Prio_Expr); @@ -1759,7 +1756,7 @@ package body Exp_Ch5 is -- Build-in-place function call case. Note that we're not yet doing -- build-in-place for user-written assignment statements; the - -- assignment here came from can aggregate. + -- assignment here came from an aggregate. elsif Ada_Version >= Ada_05 and then Is_Build_In_Place_Function_Call (Rhs) @@ -1830,7 +1827,7 @@ package body Exp_Ch5 is -- In case of assignment to a class-wide tagged type, before -- the assignment we generate run-time check to ensure that - -- the tag of the Target is covered by the tag of the source + -- the tags of source and target match. if Is_Class_Wide_Type (Typ) and then Is_Tagged_Type (Typ) @@ -1839,21 +1836,19 @@ package body Exp_Ch5 is Append_To (L, Make_Raise_Constraint_Error (Loc, Condition => - Make_Op_Not (Loc, - Make_Function_Call (Loc, - Name => New_Reference_To - (RTE (RE_CW_Membership), Loc), - Parameter_Associations => New_List ( + Make_Op_Ne (Loc, + Left_Opnd => Make_Selected_Component (Loc, - Prefix => - Duplicate_Subexpr (Lhs), + Prefix => Duplicate_Subexpr (Lhs), Selector_Name => - Make_Identifier (Loc, Name_uTag)), + Make_Identifier (Loc, + Chars => Name_uTag)), + Right_Opnd => Make_Selected_Component (Loc, - Prefix => - Duplicate_Subexpr (Rhs), + Prefix => Duplicate_Subexpr (Rhs), Selector_Name => - Make_Identifier (Loc, Name_uTag))))), + Make_Identifier (Loc, + Chars => Name_uTag))), Reason => CE_Tag_Check_Failed)); end if; @@ -1861,7 +1856,8 @@ package body Exp_Ch5 is Make_Procedure_Call_Statement (Loc, Name => New_Reference_To (Op, Loc), Parameter_Associations => New_List ( - Unchecked_Convert_To (F_Typ, Duplicate_Subexpr (Lhs)), + Unchecked_Convert_To (F_Typ, + Duplicate_Subexpr (Lhs)), Unchecked_Convert_To (F_Typ, Duplicate_Subexpr (Rhs))))); end; @@ -1872,8 +1868,8 @@ package body Exp_Ch5 is -- We can't afford to have destructive Finalization Actions -- in the Self assignment case, so if the target and the -- source are not obviously different, code is generated to - -- avoid the self assignment case - -- + -- avoid the self assignment case: + -- if lhs'address /= rhs'address then -- <code for controlled and/or tagged assignment> -- end if; @@ -1901,7 +1897,7 @@ package body Exp_Ch5 is -- We need to set up an exception handler for implementing -- 7.6.1 (18). The remaining adjustments are tackled by the -- implementation of adjust for record_controllers (see - -- s-finimp.adb) + -- s-finimp.adb). -- This is skipped if we have no finalization @@ -1914,7 +1910,7 @@ package body Exp_Ch5 is Make_Handled_Sequence_Of_Statements (Loc, Statements => L, Exception_Handlers => New_List ( - Make_Exception_Handler (Loc, + Make_Implicit_Exception_Handler (Loc, Exception_Choices => New_List (Make_Others_Choice (Loc)), Statements => New_List ( @@ -1931,7 +1927,7 @@ package body Exp_Ch5 is Make_Handled_Sequence_Of_Statements (Loc, Statements => L))); -- If no restrictions on aborts, protect the whole assignement - -- for controlled objects as per 9.8(11) + -- for controlled objects as per 9.8(11). if Controlled_Type (Typ) and then Expand_Ctrl_Actions @@ -2366,61 +2362,6 @@ package body Exp_Ch5 is -- initial values might need to be set). procedure Expand_N_Extended_Return_Statement (N : Node_Id) is - - function Is_Build_In_Place_Function (Fun : Entity_Id) return Boolean; - -- F must be of type E_Function or E_Generic_Function. Return True if it - -- uses build-in-place for the result object. In Ada 95, this must be - -- False for inherently limited result type. In Ada 2005, this must be - -- True for inherently limited result type. For other types, we have a - -- choice -- build-in-place is usually more efficient for large things, - -- and less efficient for small things. However, we had better not use - -- build-in-place if the Convention is other than Ada, because that - -- would disturb mixed-language programs. - -- - -- Note that for the non-inherently-limited cases, we must make the same - -- decision for Ada 95 and 2005, so that mixed-dialect programs work. - -- - -- ???This function will be needed when compiling the call sites; - -- we will have to move it to a more global place. - - -------------------------------- - -- Is_Build_In_Place_Function -- - -------------------------------- - - function Is_Build_In_Place_Function (Fun : Entity_Id) return Boolean is - R_Type : constant Entity_Id := Underlying_Type (Etype (Fun)); - - begin - -- First, the cases that matter for correctness - - if Is_Inherently_Limited_Type (R_Type) then - return Ada_Version >= Ada_05 and then not Debug_Flag_Dot_L; - - -- Note: If you have Convention (C) on an inherently limited - -- type, you're on your own. That is, the C code will have to be - -- carefully written to know about the Ada conventions. - - elsif - Has_Foreign_Convention (R_Type) - or else - Has_Foreign_Convention (Fun) - then - return False; - - -- Second, the efficiency-related decisions. It would be obnoxiously - -- inefficient to use build-in-place for elementary types. For - -- composites, we could return False if the subtype is known to be - -- small (<= one or two words?) but we don't bother with that yet. - - else - return Is_Composite_Type (R_Type); - end if; - end Is_Build_In_Place_Function; - - ------------------------ - -- Local Declarations -- - ------------------------ - Loc : constant Source_Ptr := Sloc (N); Return_Object_Entity : constant Entity_Id := @@ -2433,10 +2374,83 @@ package body Exp_Ch5 is Is_Build_In_Place_Function (Parent_Function); Return_Stm : Node_Id; + Statements : List_Id; Handled_Stm_Seq : Node_Id; Result : Node_Id; Exp : Node_Id; + function Move_Activation_Chain return Node_Id; + -- Construct a call to System.Tasking.Stages.Move_Activation_Chain + -- with parameters: + -- From current activation chain + -- To activation chain passed in by the caller + -- New_Master master passed in by the caller + + function Move_Final_List return Node_Id; + -- Construct call to System.Finalization_Implementation.Move_Final_List + -- with parameters: + -- From finalization list of the return statement + -- To finalization list passed in by the caller + + --------------------- + -- Move_Activation_Chain -- + --------------------- + + function Move_Activation_Chain return Node_Id is + Activation_Chain_Formal : constant Entity_Id := + Build_In_Place_Formal (Parent_Function, BIP_Activation_Chain); + To : constant Node_Id := + New_Reference_To (Activation_Chain_Formal, Loc); + Master_Formal : constant Entity_Id := + Build_In_Place_Formal (Parent_Function, BIP_Master); + New_Master : constant Node_Id := + New_Reference_To (Master_Formal, Loc); + + Chain_Entity : Entity_Id; + From : Node_Id; + begin + Chain_Entity := First_Entity (Return_Statement_Entity (N)); + while Chars (Chain_Entity) /= Name_uChain loop + Chain_Entity := Next_Entity (Chain_Entity); + end loop; + + From := + Make_Attribute_Reference (Loc, + Prefix => New_Reference_To (Chain_Entity, Loc), + Attribute_Name => Name_Unrestricted_Access); + -- ??? I'm not sure why "Make_Identifier (Loc, Name_uChain)" doesn't + -- work, instead of "New_Reference_To (Chain_Entity, Loc)" above. + + return + Make_Procedure_Call_Statement (Loc, + Name => New_Reference_To (RTE (RE_Move_Activation_Chain), Loc), + Parameter_Associations => New_List (From, To, New_Master)); + end Move_Activation_Chain; + + --------------------- + -- Move_Final_List -- + --------------------- + + function Move_Final_List return Node_Id is + Flist : constant Entity_Id := + Finalization_Chain_Entity (Return_Statement_Entity (N)); + + From : constant Node_Id := New_Reference_To (Flist, Loc); + + Caller_Final_List : constant Entity_Id := + Build_In_Place_Formal + (Parent_Function, BIP_Final_List); + + To : constant Node_Id := + New_Reference_To (Caller_Final_List, Loc); + + begin + return + Make_Procedure_Call_Statement (Loc, + Name => New_Reference_To (RTE (RE_Move_Final_List), Loc), + Parameter_Associations => New_List (From, To)); + end Move_Final_List; + -- Start of processing for Expand_N_Extended_Return_Statement begin @@ -2448,27 +2462,63 @@ package body Exp_Ch5 is Handled_Stm_Seq := Handled_Statement_Sequence (N); + -- Build a simple_return_statement that returns the return object when + -- there is a statement sequence, or no expression, or the result will + -- be built in place. Note however that we currently do this for all + -- composite cases, even though nonlimited composite results are not yet + -- built in place (though we plan to do so eventually). + if Present (Handled_Stm_Seq) - or else Is_Build_In_Place + or else Is_Composite_Type (Etype (Parent_Function)) or else No (Exp) then - -- Build simple_return_statement that returns the return object + Statements := New_List; + + if Present (Handled_Stm_Seq) then + Append_To (Statements, Handled_Stm_Seq); + end if; + + -- If control gets past the above Statements, we have successfully + -- completed the return statement. If the result type has controlled + -- parts, we call Move_Final_List to transfer responsibility for + -- finalization of the return object to the caller. An alternative + -- would be to declare a Success flag in the function, initialize it + -- to False, and set it to True here. Then move the Move_Final_List + -- call into the cleanup code, and check Success. If Success then + -- Move_Final_List else do finalization. Then we can remove the + -- abort-deferral and the nulling-out of the From parameter from + -- Move_Final_List. Note that the current method is not quite + -- correct in the rather obscure case of a select-then-abort + -- statement whose abortable part contains the return statement. + + if Is_Controlled (Etype (Parent_Function)) + or else Has_Controlled_Component (Etype (Parent_Function)) + then + Append_To (Statements, Move_Final_List); + end if; + + -- Similarly to the above Move_Final_List, if the result type + -- contains tasks, we call Move_Activation_Chain. Later, the cleanup + -- code will call Complete_Master, which will terminate any + -- unactivated tasks belonging to the return statement master. But + -- Move_Activation_Chain updates their master to be that of the + -- caller, so they will not be terminated unless the return + -- statement completes unsuccessfully due to exception, abort, goto, + -- or exit. + + if Has_Task (Etype (Parent_Function)) then + Append_To (Statements, Move_Activation_Chain); + end if; + + -- Build a simple_return_statement that returns the return object Return_Stm := Make_Return_Statement (Loc, Expression => New_Occurrence_Of (Return_Object_Entity, Loc)); + Append_To (Statements, Return_Stm); - if Present (Handled_Stm_Seq) then - Handled_Stm_Seq := - Make_Handled_Sequence_Of_Statements (Loc, - Statements => New_List (Handled_Stm_Seq, Return_Stm)); - else - Handled_Stm_Seq := - Make_Handled_Sequence_Of_Statements (Loc, - Statements => New_List (Return_Stm)); - end if; - - pragma Assert (Present (Handled_Stm_Seq)); + Handled_Stm_Seq := + Make_Handled_Sequence_Of_Statements (Loc, Statements); end if; -- Case where we build a block @@ -2479,7 +2529,29 @@ package body Exp_Ch5 is Declarations => Return_Object_Declarations (N), Handled_Statement_Sequence => Handled_Stm_Seq); - if Is_Build_In_Place then + -- We set the entity of the new block statement to be that of the + -- return statement. This is necessary so that various fields, such + -- as Finalization_Chain_Entity carry over from the return statement + -- to the block. Note that this block is unusual, in that its entity + -- is an E_Return_Statement rather than an E_Block. + + Set_Identifier + (Result, New_Occurrence_Of (Return_Statement_Entity (N), Loc)); + + -- If the object decl was already rewritten as a renaming, then + -- we don't want to do the object allocation and transformation of + -- of the return object declaration to a renaming. This case occurs + -- when the return object is initialized by a call to another + -- build-in-place function, and that function is responsible for the + -- allocation of the return object. + + if Is_Build_In_Place + and then + Nkind (Return_Object_Decl) = N_Object_Renaming_Declaration + then + Set_By_Ref (Return_Stm); -- Return build-in-place results by ref + + elsif Is_Build_In_Place then -- Locate the implicit access parameter associated with the -- the caller-supplied return object and convert the return @@ -2503,84 +2575,282 @@ package body Exp_Ch5 is -- ... declare - Return_Obj_Id : constant Entity_Id := - Defining_Identifier (Return_Object_Decl); - Return_Obj_Typ : constant Entity_Id := Etype (Return_Obj_Id); - Return_Obj_Expr : constant Node_Id := - Expression (Return_Object_Decl); - Obj_Acc_Formal : Entity_Id := Extra_Formals (Parent_Function); - Obj_Acc_Deref : Node_Id; - Init_Assignment : Node_Id; + Return_Obj_Id : constant Entity_Id := + Defining_Identifier (Return_Object_Decl); + Return_Obj_Typ : constant Entity_Id := Etype (Return_Obj_Id); + Return_Obj_Expr : constant Node_Id := + Expression (Return_Object_Decl); + Result_Subt : constant Entity_Id := + Etype (Parent_Function); + Constr_Result : constant Boolean := + Is_Constrained (Result_Subt); + Obj_Alloc_Formal : Entity_Id; + Object_Access : Entity_Id; + Obj_Acc_Deref : Node_Id; + Init_Assignment : Node_Id := Empty; begin -- Build-in-place results must be returned by reference Set_By_Ref (Return_Stm); - -- Locate the implicit access parameter passed by the caller. - -- It might be better to search for that with a symbol table - -- lookup, but for now we traverse the extra actuals to find - -- the access parameter (currently there can only be one). + -- Retrieve the implicit access parameter passed by the caller - while Present (Obj_Acc_Formal) loop - exit when - Ekind (Etype (Obj_Acc_Formal)) = E_Anonymous_Access_Type; - Next_Formal_With_Extras (Obj_Acc_Formal); - end loop; + Object_Access := + Build_In_Place_Formal (Parent_Function, BIP_Object_Access); - -- ??? pragma Assert (Present (Obj_Acc_Formal)); + -- If the return object's declaration includes an expression + -- and the declaration isn't marked as No_Initialization, then + -- we need to generate an assignment to the object and insert + -- it after the declaration before rewriting it as a renaming + -- (otherwise we'll lose the initialization). - -- For now we only rewrite the object if we can locate the - -- implicit access parameter. Normally there should be one - -- if Build_In_Place is true, but at the moment it's only - -- created in the more restrictive case of constrained - -- inherently limited result subtypes. ??? + if Present (Return_Obj_Expr) + and then not No_Initialization (Return_Object_Decl) + then + Init_Assignment := + Make_Assignment_Statement (Loc, + Name => New_Reference_To (Return_Obj_Id, Loc), + Expression => Relocate_Node (Return_Obj_Expr)); + Set_Assignment_OK (Name (Init_Assignment)); + Set_No_Ctrl_Actions (Init_Assignment); - if Present (Obj_Acc_Formal) then + Set_Parent (Expression (Init_Assignment), Init_Assignment); - -- If the return object's declaration includes an expression - -- and the declaration isn't marked as No_Initialization, - -- then we need to generate an assignment to the object and - -- insert it after the declaration before rewriting it as - -- a renaming (otherwise we'll lose the initialization). + Set_Expression (Return_Object_Decl, Empty); - if Present (Return_Obj_Expr) - and then not No_Initialization (Return_Object_Decl) + if Is_Class_Wide_Type (Etype (Return_Obj_Id)) + and then not Is_Class_Wide_Type + (Etype (Expression (Init_Assignment))) then - Init_Assignment := - Make_Assignment_Statement (Loc, - Name => New_Reference_To (Return_Obj_Id, Loc), - Expression => Relocate_Node (Return_Obj_Expr)); - Set_Assignment_OK (Name (Init_Assignment)); - Set_No_Ctrl_Actions (Init_Assignment); - - -- ??? Should we be setting the parent of the expression - -- here? - -- Set_Parent - -- (Expression (Init_Assignment), Init_Assignment); - - Set_Expression (Return_Object_Decl, Empty); + Rewrite (Expression (Init_Assignment), + Make_Type_Conversion (Loc, + Subtype_Mark => + New_Occurrence_Of + (Etype (Return_Obj_Id), Loc), + Expression => + Relocate_Node (Expression (Init_Assignment)))); + end if; + if Constr_Result then Insert_After (Return_Object_Decl, Init_Assignment); end if; + end if; - -- Replace the return object declaration with a renaming - -- of a dereference of the implicit access formal. + -- When the function's subtype is unconstrained, a run-time + -- test is needed to determine the form of allocation to use + -- for the return object. The function has an implicit formal + -- parameter that indicates this. If the BIP_Alloc_Form formal + -- has the value one, then the caller has passed access to an + -- existing object for use as the return object. If the value + -- is two, then the return object must be allocated on the + -- secondary stack. Otherwise, the object must be allocated in + -- a storage pool. Currently the last case is only supported + -- for the global heap (user-defined storage pools TBD ???). We + -- generate an if statement to test the implicit allocation + -- formal and initialize a local access value appropriately, + -- creating allocators in the secondary stack and global heap + -- cases. + + if not Constr_Result then + Obj_Alloc_Formal := + Build_In_Place_Formal (Parent_Function, BIP_Alloc_Form); + + declare + Ref_Type : Entity_Id; + Ptr_Type_Decl : Node_Id; + Alloc_Obj_Id : Entity_Id; + Alloc_Obj_Decl : Node_Id; + Alloc_If_Stmt : Node_Id; + SS_Allocator : Node_Id; + Heap_Allocator : Node_Id; + + begin + -- Reuse the itype created for the function's implicit + -- access formal. This avoids the need to create a new + -- access type here, plus it allows assigning the access + -- formal directly without applying a conversion. + + -- Ref_Type := Etype (Object_Access); + + -- Create an access type designating the function's + -- result subtype. + + Ref_Type := + Make_Defining_Identifier (Loc, New_Internal_Name ('A')); + + Ptr_Type_Decl := + Make_Full_Type_Declaration (Loc, + Defining_Identifier => Ref_Type, + Type_Definition => + Make_Access_To_Object_Definition (Loc, + All_Present => True, + Subtype_Indication => + New_Reference_To (Return_Obj_Typ, Loc))); + + Insert_Before_And_Analyze + (Return_Object_Decl, Ptr_Type_Decl); + + -- Create an access object that will be initialized to an + -- access value denoting the return object, either coming + -- from an implicit access value passed in by the caller + -- or from the result of an allocator. + + Alloc_Obj_Id := + Make_Defining_Identifier (Loc, + Chars => New_Internal_Name ('R')); + Set_Etype (Alloc_Obj_Id, Ref_Type); + + Alloc_Obj_Decl := + Make_Object_Declaration (Loc, + Defining_Identifier => Alloc_Obj_Id, + Object_Definition => New_Reference_To + (Ref_Type, Loc)); + + Insert_Before_And_Analyze + (Return_Object_Decl, Alloc_Obj_Decl); + + -- Create allocators for both the secondary stack and + -- global heap. If there's an initialization expression, + -- then create these as initialized allocators. + + if Present (Return_Obj_Expr) + and then not No_Initialization (Return_Object_Decl) + then + Heap_Allocator := + Make_Allocator (Loc, + Expression => + Make_Qualified_Expression (Loc, + Subtype_Mark => + New_Reference_To (Return_Obj_Typ, Loc), + Expression => + New_Copy_Tree (Return_Obj_Expr))); + + SS_Allocator := New_Copy_Tree (Heap_Allocator); + + else + Heap_Allocator := + Make_Allocator (Loc, + New_Reference_To (Return_Obj_Typ, Loc)); - Obj_Acc_Deref := - Make_Explicit_Dereference (Loc, - Prefix => New_Reference_To (Obj_Acc_Formal, Loc)); + -- If the object requires default initialization then + -- that will happen later following the elaboration of + -- the object renaming. If we don't turn it off here + -- then the object will be default initialized twice. - Rewrite (Return_Object_Decl, - Make_Object_Renaming_Declaration (Loc, - Defining_Identifier => Return_Obj_Id, - Access_Definition => Empty, - Subtype_Mark => New_Occurrence_Of - (Return_Obj_Typ, Loc), - Name => Obj_Acc_Deref)); + Set_No_Initialization (Heap_Allocator); - Set_Renamed_Object (Return_Obj_Id, Obj_Acc_Deref); + SS_Allocator := New_Copy_Tree (Heap_Allocator); + end if; + + Set_Storage_Pool + (SS_Allocator, RTE (RE_SS_Pool)); + Set_Procedure_To_Call + (SS_Allocator, RTE (RE_SS_Allocate)); + + -- Create an if statement to test the BIP_Alloc_Form + -- formal and initialize the access object to either the + -- BIP_Object_Access formal (BIP_Alloc_Form = 0), the + -- result of allocaing the object in the secondary stack + -- (BIP_Alloc_Form = 1), or else an allocator to create + -- the return object in the heap (BIP_Alloc_Form = 2). + + -- ??? An unchecked type conversion must be made in the + -- case of assigning the access object formal to the + -- local access object, because a normal conversion would + -- be illegal in some cases (such as converting access- + -- to-unconstrained to access-to-constrained), but the + -- the unchecked conversion will presumably fail to work + -- right in just such cases. It's not clear at all how to + -- handle this. ??? + + Alloc_If_Stmt := + Make_If_Statement (Loc, + Condition => + Make_Op_Eq (Loc, + Left_Opnd => + New_Reference_To (Obj_Alloc_Formal, Loc), + Right_Opnd => + Make_Integer_Literal (Loc, + UI_From_Int (BIP_Allocation_Form'Pos + (Caller_Allocation)))), + Then_Statements => + New_List (Make_Assignment_Statement (Loc, + Name => + New_Reference_To + (Alloc_Obj_Id, Loc), + Expression => + Make_Unchecked_Type_Conversion (Loc, + Subtype_Mark => + New_Reference_To (Ref_Type, Loc), + Expression => + New_Reference_To + (Object_Access, Loc)))), + Elsif_Parts => + New_List (Make_Elsif_Part (Loc, + Condition => + Make_Op_Eq (Loc, + Left_Opnd => + New_Reference_To + (Obj_Alloc_Formal, Loc), + Right_Opnd => + Make_Integer_Literal (Loc, + UI_From_Int ( + BIP_Allocation_Form'Pos + (Secondary_Stack)))), + Then_Statements => + New_List + (Make_Assignment_Statement (Loc, + Name => + New_Reference_To + (Alloc_Obj_Id, Loc), + Expression => + SS_Allocator)))), + Else_Statements => + New_List (Make_Assignment_Statement (Loc, + Name => + New_Reference_To + (Alloc_Obj_Id, Loc), + Expression => + Heap_Allocator))); + + -- If a separate initialization assignment was created + -- earlier, append that following the assignment of the + -- implicit access formal to the access object, to ensure + -- that the return object is initialized in that case. + + if Present (Init_Assignment) then + Append_To + (Then_Statements (Alloc_If_Stmt), + Init_Assignment); + end if; + + Insert_After_And_Analyze (Alloc_Obj_Decl, Alloc_If_Stmt); + + -- Remember the local access object for use in the + -- dereference of the renaming created below. + + Object_Access := Alloc_Obj_Id; + end; end if; + + -- Replace the return object declaration with a renaming of a + -- dereference of the access value designating the return + -- object. + + Obj_Acc_Deref := + Make_Explicit_Dereference (Loc, + Prefix => New_Reference_To (Object_Access, Loc)); + + Rewrite (Return_Object_Decl, + Make_Object_Renaming_Declaration (Loc, + Defining_Identifier => Return_Obj_Id, + Access_Definition => Empty, + Subtype_Mark => New_Occurrence_Of + (Return_Obj_Typ, Loc), + Name => Obj_Acc_Deref)); + + Set_Renamed_Object (Return_Obj_Id, Obj_Acc_Deref); end; end if; @@ -2622,8 +2892,8 @@ package body Exp_Ch5 is -- Expand_N_If_Statement -- --------------------------- - -- First we deal with the case of C and Fortran convention boolean - -- values, with zero/non-zero semantics. + -- First we deal with the case of C and Fortran convention boolean values, + -- with zero/non-zero semantics. -- Second, we deal with the obvious rewriting for the cases where the -- condition of the IF is known at compile time to be True or False. @@ -2647,8 +2917,8 @@ package body Exp_Ch5 is -- end if; -- This rewriting is needed if at least one elsif part has a non-empty - -- Condition_Actions list. We also do the same processing if there is - -- a constant condition in an elsif part (in conjunction with the first + -- Condition_Actions list. We also do the same processing if there is a + -- constant condition in an elsif part (in conjunction with the first -- processing step mentioned above, for the recursive call made to deal -- with the created inner if, this deals with properly optimizing the -- cases of constant elsif conditions). @@ -2668,8 +2938,8 @@ package body Exp_Ch5 is while Compile_Time_Known_Value (Condition (N)) loop - -- If condition is True, we can simply rewrite the if statement - -- now by replacing it by the series of then statements. + -- If condition is True, we can simply rewrite the if statement now + -- by replacing it by the series of then statements. if Is_True (Expr_Value (Condition (N))) then @@ -2687,10 +2957,10 @@ package body Exp_Ch5 is -- the Then statements else - -- We do not delete the condition if constant condition - -- warnings are enabled, since otherwise we end up deleting - -- the desired warning. Of course the backend will get rid - -- of this True/False test anyway, so nothing is lost here. + -- We do not delete the condition if constant condition warnings + -- are enabled, since otherwise we end up deleting the desired + -- warning. Of course the backend will get rid of this True/False + -- test anyway, so nothing is lost here. if not Constant_Condition_Warnings then Kill_Dead_Code (Condition (N)); @@ -2698,8 +2968,8 @@ package body Exp_Ch5 is Kill_Dead_Code (Then_Statements (N), Warn_On_Deleted_Code); - -- If there are no elsif statements, then we simply replace - -- the entire if statement by the sequence of else statements. + -- If there are no elsif statements, then we simply replace the + -- entire if statement by the sequence of else statements. if No (Elsif_Parts (N)) then if No (Else_Statements (N)) @@ -2715,9 +2985,9 @@ package body Exp_Ch5 is return; - -- If there are elsif statements, the first of them becomes - -- the if/then section of the rebuilt if statement This is - -- the case where we loop to reprocess this copied condition. + -- If there are elsif statements, the first of them becomes the + -- if/then section of the rebuilt if statement This is the case + -- where we loop to reprocess this copied condition. else Hed := Remove_Head (Elsif_Parts (N)); @@ -2747,18 +3017,18 @@ package body Exp_Ch5 is while Present (E) loop Adjust_Condition (Condition (E)); - -- If there are condition actions, then we rewrite the if - -- statement as indicated above. We also do the same rewrite - -- if the condition is True or False. The further processing - -- of this constant condition is then done by the recursive - -- call to expand the newly created if statement + -- If there are condition actions, then rewrite the if statement + -- as indicated above. We also do the same rewrite for a True or + -- False condition. The further processing of this constant + -- condition is then done by the recursive call to expand the + -- newly created if statement if Present (Condition_Actions (E)) or else Compile_Time_Known_Value (Condition (E)) then - -- Note this is not an implicit if statement, since it is - -- part of an explicit if statement in the source (or of an - -- implicit if statement that has already been tested). + -- Note this is not an implicit if statement, since it is part + -- of an explicit if statement in the source (or of an implicit + -- if statement that has already been tested). New_If := Make_If_Statement (Sloc (E), @@ -2913,9 +3183,9 @@ package body Exp_Ch5 is -- range bounds here, since they were frozen with constant declarations -- and it is during that process that the validity checking is done. - -- Handle the case where we have a for loop with the range type being - -- an enumeration type with non-standard representation. In this case - -- we expand: + -- Handle the case where we have a for loop with the range type being an + -- enumeration type with non-standard representation. In this case we + -- expand: -- for x in [reverse] a .. b loop -- ... @@ -2952,8 +3222,8 @@ package body Exp_Ch5 is Make_Defining_Identifier (Loc, Chars => New_External_Name (Chars (Loop_Id), 'P')); - -- If the type has a contiguous representation, successive - -- values can be generated as offsets from the first literal. + -- If the type has a contiguous representation, successive values + -- can be generated as offsets from the first literal. if Has_Contiguous_Rep (Btype) then Expr := @@ -3033,8 +3303,8 @@ package body Exp_Ch5 is Analyze (N); end; - -- Second case, if we have a while loop with Condition_Actions set, - -- then we change it into a plain loop: + -- Second case, if we have a while loop with Condition_Actions set, then + -- we change it into a plain loop: -- while C loop -- ... @@ -3064,10 +3334,10 @@ package body Exp_Ch5 is Prepend (ES, Statements (N)); Insert_List_Before (ES, Condition_Actions (Isc)); - -- This is not an implicit loop, since it is generated in - -- response to the loop statement being processed. If this - -- is itself implicit, the restriction has already been - -- checked. If not, it is an explicit loop. + -- This is not an implicit loop, since it is generated in response + -- to the loop statement being processed. If this is itself + -- implicit, the restriction has already been checked. If not, + -- it is an explicit loop. Rewrite (N, Make_Loop_Statement (Sloc (N), @@ -3167,8 +3437,8 @@ package body Exp_Ch5 is pragma Assert (Is_Entry (Scope_Id)); - -- Look at the enclosing block to see whether the return is from - -- an accept statement or an entry body. + -- Look at the enclosing block to see whether the return is from an + -- accept statement or an entry body. for J in reverse 0 .. Cur_Idx loop Scope_Id := Scope_Stack.Table (J).Entity; @@ -3249,9 +3519,9 @@ package body Exp_Ch5 is -- Deal with returning variable length objects and controlled types - -- Nothing to do if we are returning by reference, or this is not a - -- type that requires special processing (indicated by the fact that - -- it requires a cleanup scope for the secondary stack case). + -- Nothing to do if we are returning by reference, or this is not type + -- that requires special processing (indicated by the fact that it + -- requires a cleanup scope for the secondary stack case). if Is_Inherently_Limited_Type (T) then null; @@ -3282,158 +3552,6 @@ package body Exp_Ch5 is end if; end; - -- Case of secondary stack not used - - elsif Function_Returns_With_DSP (Scope_Id) then - - -- The DSP method is no longer in use. We would like to ignore DSP - -- while implementing AI-318; hence the raise below. - - if True then - raise Program_Error; - end if; - - -- Here what we need to do is to always return by reference, since - -- we will return with the stack pointer depressed. We may need to - -- do a copy to a local temporary before doing this return. - - No_Secondary_Stack_Case : declare - Local_Copy_Required : Boolean := False; - -- Set to True if a local copy is required - - Copy_Ent : Entity_Id; - -- Used for the target entity if a copy is required - - Decl : Node_Id; - -- Declaration used to create copy if needed - - procedure Test_Copy_Required (Expr : Node_Id); - -- Determines if Expr represents a return value for which a - -- copy is required. More specifically, a copy is not required - -- if Expr represents an object or component of an object that - -- is either in the local subprogram frame, or is constant. - -- If a copy is required, then Local_Copy_Required is set True. - - ------------------------ - -- Test_Copy_Required -- - ------------------------ - - procedure Test_Copy_Required (Expr : Node_Id) is - Ent : Entity_Id; - - begin - -- If component, test prefix (object containing component) - - if Nkind (Expr) = N_Indexed_Component - or else - Nkind (Expr) = N_Selected_Component - then - Test_Copy_Required (Prefix (Expr)); - return; - - -- See if we have an entity name - - elsif Is_Entity_Name (Expr) then - Ent := Entity (Expr); - - -- Constant entity is always OK, no copy required - - if Ekind (Ent) = E_Constant then - return; - - -- No copy required for local variable - - elsif Ekind (Ent) = E_Variable - and then Scope (Ent) = Current_Subprogram - then - return; - end if; - end if; - - -- All other cases require a copy - - Local_Copy_Required := True; - end Test_Copy_Required; - - -- Start of processing for No_Secondary_Stack_Case - - begin - -- No copy needed if result is from a function call. - -- In this case the result is already being returned by - -- reference with the stack pointer depressed. - - -- To make up for a gcc 2.8.1 deficiency (???), we perform - -- the copy for array types if the constrained status of the - -- target type is different from that of the expression. - - if Requires_Transient_Scope (T) - and then - (not Is_Array_Type (T) - or else Is_Constrained (T) = Is_Constrained (Return_Type) - or else Controlled_Type (T)) - and then Nkind (Exp) = N_Function_Call - then - Set_By_Ref (N); - - -- We always need a local copy for a controlled type, since - -- we are required to finalize the local value before return. - -- The copy will automatically include the required finalize. - -- Moreover, gigi cannot make this copy, since we need special - -- processing to ensure proper behavior for finalization. - - -- Note: the reason we are returning with a depressed stack - -- pointer in the controlled case (even if the type involved - -- is constrained) is that we must make a local copy to deal - -- properly with the requirement that the local result be - -- finalized. - - elsif Controlled_Type (Utyp) then - Copy_Ent := - Make_Defining_Identifier (Loc, - Chars => New_Internal_Name ('R')); - - -- Build declaration to do the copy, and insert it, setting - -- Assignment_OK, because we may be copying a limited type. - -- In addition we set the special flag to inhibit finalize - -- attachment if this is a controlled type (since this attach - -- must be done by the caller, otherwise if we attach it here - -- we will finalize the returned result prematurely). - - Decl := - Make_Object_Declaration (Loc, - Defining_Identifier => Copy_Ent, - Object_Definition => New_Occurrence_Of (Return_Type, Loc), - Expression => Relocate_Node (Exp)); - - Set_Assignment_OK (Decl); - Set_Delay_Finalize_Attach (Decl); - Insert_Action (N, Decl); - - -- Now the actual return uses the copied value - - Rewrite (Exp, New_Occurrence_Of (Copy_Ent, Loc)); - Analyze_And_Resolve (Exp, Return_Type); - - -- Since we have made the copy, gigi does not have to, so - -- we set the By_Ref flag to prevent another copy being made. - - Set_By_Ref (N); - - -- Non-controlled cases - - else - Test_Copy_Required (Exp); - - -- If a local copy is required, then gigi will make the - -- copy, otherwise, we can return the result directly, - -- so set By_Ref to suppress the gigi copy. - - if not Local_Copy_Required then - Set_By_Ref (N); - end if; - end if; - end No_Secondary_Stack_Case; - -- Here if secondary stack is used else @@ -3457,12 +3575,12 @@ package body Exp_Ch5 is -- case either the result is already on the secondary stack, or is -- already being returned with the stack pointer depressed and no -- further processing is required except to set the By_Ref flag to - -- ensure that gigi does not attempt an extra unnecessary copy. - -- (actually not just unnecessary but harmfully wrong in the case - -- of a controlled type, where gigi does not know how to do a copy). - -- To make up for a gcc 2.8.1 deficiency (???), we perform - -- the copy for array types if the constrained status of the - -- target type is different from that of the expression. + -- ensure that gigi does not attempt an extra unnecessary copy + -- (actually not just unnecessary but harmfully wrong in the case of + -- a controlled type, where gigi does not know how to do a copy). To + -- make up for a gcc 2.8.1 deficiency (???), we perform the copy for + -- array types if the constrained status of the target type is + -- different from that of the expression. if Requires_Transient_Scope (T) and then @@ -3474,25 +3592,25 @@ package body Exp_Ch5 is then Set_By_Ref (N); - -- Remove side effects from the expression now so that - -- other part of the expander do not have to reanalyze - -- this node without this optimization + -- Remove side effects from the expression now so that other parts + -- of the expander do not have to reanalyze the node without this + -- optimization. Rewrite (Exp, Duplicate_Subexpr_No_Checks (Exp)); -- For controlled types, do the allocation on the secondary stack -- manually in order to call adjust at the right time: + -- type Anon1 is access Return_Type; -- for Anon1'Storage_pool use ss_pool; -- Anon2 : anon1 := new Return_Type'(expr); -- return Anon2.all; + -- We do the same for classwide types that are not potentially -- controlled (by the virtue of restriction No_Finalization) because -- gigi is not able to properly allocate class-wide types. - elsif Is_Class_Wide_Type (Utyp) - or else Controlled_Type (Utyp) - then + elsif CW_Or_Controlled_Type (Utyp) then declare Loc : constant Source_Ptr := Sloc (N); Temp : constant Entity_Id := @@ -3550,13 +3668,12 @@ package body Exp_Ch5 is end if; end if; - -- Implement the rules of 6.5(8-10), which require a tag check in - -- the case of a limited tagged return type, and tag reassignment - -- for nonlimited tagged results. These actions are needed when - -- the return type is a specific tagged type and the result - -- expression is a conversion or a formal parameter, because in - -- that case the tag of the expression might differ from the tag - -- of the specific result type. + -- Implement the rules of 6.5(8-10), which require a tag check in the + -- case of a limited tagged return type, and tag reassignment for + -- nonlimited tagged results. These actions are needed when the return + -- type is a specific tagged type and the result expression is a + -- conversion or a formal parameter, because in that case the tag of the + -- expression might differ from the tag of the specific result type. if Is_Tagged_Type (Utyp) and then not Is_Class_Wide_Type (Utyp) @@ -3565,8 +3682,8 @@ package body Exp_Ch5 is or else (Is_Entity_Name (Exp) and then Ekind (Entity (Exp)) in Formal_Kind)) then - -- When the return type is limited, perform a check that the - -- tag of the result is the same as the tag of the return type. + -- When the return type is limited, perform a check that the tag of + -- the result is the same as the tag of the return type. if Is_Limited_Type (Return_Type) then Insert_Action (Exp, @@ -3586,14 +3703,13 @@ package body Exp_Ch5 is Loc))), Reason => CE_Tag_Check_Failed)); - -- If the result type is a specific nonlimited tagged type, - -- then we have to ensure that the tag of the result is that - -- of the result type. This is handled by making a copy of the - -- expression in the case where it might have a different tag, - -- namely when the expression is a conversion or a formal - -- parameter. We create a new object of the result type and - -- initialize it from the expression, which will implicitly - -- force the tag to be set appropriately. + -- If the result type is a specific nonlimited tagged type, then we + -- have to ensure that the tag of the result is that of the result + -- type. This is handled by making a copy of the expression in the + -- case where it might have a different tag, namely when the + -- expression is a conversion or a formal parameter. We create a new + -- object of the result type and initialize it from the expression, + -- which will implicitly force the tag to be set appropriately. else Result_Id := @@ -3640,16 +3756,10 @@ package body Exp_Ch5 is Condition => Make_Op_Gt (Loc, Left_Opnd => - Make_Function_Call (Loc, - Name => - New_Reference_To - (RTE (RE_Get_Access_Level), Loc), - Parameter_Associations => - New_List (Make_Attribute_Reference (Loc, - Prefix => - Duplicate_Subexpr (Exp), - Attribute_Name => - Name_Tag))), + Build_Get_Access_Level (Loc, + Make_Attribute_Reference (Loc, + Prefix => Duplicate_Subexpr (Exp), + Attribute_Name => Name_Tag)), Right_Opnd => Make_Integer_Literal (Loc, Scope_Depth (Enclosing_Dynamic_Scope (Scope_Id)))), @@ -3683,8 +3793,8 @@ package body Exp_Ch5 is if Kind = E_Procedure or else Kind = E_Generic_Procedure then return; - -- If it is a nested return within an extended one, replace it - -- with a return of the previously declared return object. + -- If it is a nested return within an extended one, replace it with a + -- return of the previously declared return object. elsif Kind = E_Return_Statement then Rewrite (N, @@ -3699,8 +3809,8 @@ package body Exp_Ch5 is pragma Assert (Is_Entry (Scope_Id)); - -- Look at the enclosing block to see whether the return is from - -- an accept statement or an entry body. + -- Look at the enclosing block to see whether the return is from an + -- accept statement or an entry body. for J in reverse 0 .. Scope_Stack.Last loop Scope_Id := Scope_Stack.Table (J).Entity; @@ -3740,8 +3850,8 @@ package body Exp_Ch5 is Rewrite (N, Goto_Stat); Analyze (N); - -- If it is a return from an entry body, put a Complete_Entry_Body - -- call in front of the return. + -- If it is a return from an entry body, put a Complete_Entry_Body call + -- in front of the return. elsif Is_Protected_Type (Scope_Id) then Call := @@ -3818,25 +3928,20 @@ package body Exp_Ch5 is -- The type of the expression (not necessarily the same as R_Type) begin - -- The DSP method is no longer in use - - pragma Assert (not Function_Returns_With_DSP (Scope_Id)); - -- We rewrite "return <expression>;" to be: -- return _anon_ : <return_subtype> := <expression> -- The expansion produced by Expand_N_Extended_Return_Statement will - -- contain simple return statements (for example, a block containing a + -- contain simple return statements (for example, a block containing -- simple return of the return object), which brings us back here with -- Comes_From_Extended_Return_Statement set. To avoid infinite -- recursion, we do not transform into an extended return if -- Comes_From_Extended_Return_Statement is True. -- The reason for this design is that for Ada 2005 limited returns, we - -- need to reify the return object, so we can build it "in place", - -- and we need a block statement to hang finalization and tasking stuff - -- off of. + -- need to reify the return object, so we can build it "in place", and + -- we need a block statement to hang finalization and tasking stuff. -- ??? In order to avoid disruption, we avoid translating to extended -- return except in the cases where we really need to (Ada 2005 @@ -3878,11 +3983,11 @@ package body Exp_Ch5 is -- of an extended return statement (either written by the user, or -- generated by the above code). - -- Always normalize C/Fortran boolean result. This is not always - -- necessary, but it seems a good idea to minimize the passing - -- around of non-normalized values, and in any case this handles - -- the processing of barrier functions for protected types, which - -- turn the condition into a return statement. + -- Always normalize C/Fortran boolean result. This is not always needed, + -- but it seems a good idea to minimize the passing around of non- + -- normalized values, and in any case this handles the processing of + -- barrier functions for protected types, which turn the condition into + -- a return statement. if Is_Boolean_Type (Exptyp) and then Nonzero_Is_True (Exptyp) @@ -3943,18 +4048,6 @@ package body Exp_Ch5 is end if; end; - -- Case of secondary stack not used - - elsif Function_Returns_With_DSP (Scope_Id) then - - -- The DSP method is no longer in use. We would like to ignore DSP - -- while implementing AI-318; hence the following assertion. Keep the - -- old code around in case DSP is revived someday. - - pragma Assert (False); - - No_Secondary_Stack_Case (N); - -- Here if secondary stack is used else @@ -3989,15 +4082,14 @@ package body Exp_Ch5 is and then (not Is_Array_Type (Exptyp) or else Is_Constrained (Exptyp) = Is_Constrained (R_Type) - or else Is_Class_Wide_Type (Utyp) - or else Controlled_Type (Exptyp)) + or else CW_Or_Controlled_Type (Utyp)) and then Nkind (Exp) = N_Function_Call then Set_By_Ref (N); - -- Remove side effects from the expression now so that - -- other part of the expander do not have to reanalyze - -- this node without this optimization + -- Remove side effects from the expression now so that other parts + -- of the expander do not have to reanalyze this node without this + -- optimization Rewrite (Exp, Duplicate_Subexpr_No_Checks (Exp)); @@ -4013,9 +4105,7 @@ package body Exp_Ch5 is -- controlled (by the virtue of restriction No_Finalization) because -- gigi is not able to properly allocate class-wide types. - elsif Is_Class_Wide_Type (Utyp) - or else Controlled_Type (Utyp) - then + elsif CW_Or_Controlled_Type (Utyp) then declare Loc : constant Source_Ptr := Sloc (N); Temp : constant Entity_Id := @@ -4073,13 +4163,12 @@ package body Exp_Ch5 is end if; end if; - -- Implement the rules of 6.5(8-10), which require a tag check in - -- the case of a limited tagged return type, and tag reassignment - -- for nonlimited tagged results. These actions are needed when - -- the return type is a specific tagged type and the result - -- expression is a conversion or a formal parameter, because in - -- that case the tag of the expression might differ from the tag - -- of the specific result type. + -- Implement the rules of 6.5(8-10), which require a tag check in the + -- case of a limited tagged return type, and tag reassignment for + -- nonlimited tagged results. These actions are needed when the return + -- type is a specific tagged type and the result expression is a + -- conversion or a formal parameter, because in that case the tag of the + -- expression might differ from the tag of the specific result type. if Is_Tagged_Type (Utyp) and then not Is_Class_Wide_Type (Utyp) @@ -4109,14 +4198,13 @@ package body Exp_Ch5 is Loc))), Reason => CE_Tag_Check_Failed)); - -- If the result type is a specific nonlimited tagged type, - -- then we have to ensure that the tag of the result is that - -- of the result type. This is handled by making a copy of the - -- expression in the case where it might have a different tag, - -- namely when the expression is a conversion or a formal - -- parameter. We create a new object of the result type and - -- initialize it from the expression, which will implicitly - -- force the tag to be set appropriately. + -- If the result type is a specific nonlimited tagged type, then we + -- have to ensure that the tag of the result is that of the result + -- type. This is handled by making a copy of the expression in the + -- case where it might have a different tag, namely when the + -- expression is a conversion or a formal parameter. We create a new + -- object of the result type and initialize it from the expression, + -- which will implicitly force the tag to be set appropriately. else declare @@ -4168,16 +4256,10 @@ package body Exp_Ch5 is Condition => Make_Op_Gt (Loc, Left_Opnd => - Make_Function_Call (Loc, - Name => - New_Reference_To - (RTE (RE_Get_Access_Level), Loc), - Parameter_Associations => - New_List (Make_Attribute_Reference (Loc, - Prefix => - Duplicate_Subexpr (Exp), - Attribute_Name => - Name_Tag))), + Build_Get_Access_Level (Loc, + Make_Attribute_Reference (Loc, + Prefix => Duplicate_Subexpr (Exp), + Attribute_Name => Name_Tag)), Right_Opnd => Make_Integer_Literal (Loc, Scope_Depth (Enclosing_Dynamic_Scope (Scope_Id)))), @@ -4200,8 +4282,8 @@ package body Exp_Ch5 is Save_Tag : constant Boolean := Is_Tagged_Type (T) and then not No_Ctrl_Actions (N) and then not Java_VM; - -- Tags are not saved and restored when Java_VM because JVM tags - -- are represented implicitly in objects. + -- Tags are not saved and restored when Java_VM because JVM tags are + -- represented implicitly in objects. Res : List_Id; Tag_Tmp : Entity_Id; @@ -4271,8 +4353,8 @@ package body Exp_Ch5 is -- specific to each object of the type, not to the value being assigned. -- Thus they need to be left intact during the assignment. We achieve -- this by constructing a Storage_Array subtype, and by overlaying - -- objects of this type on the source and target of the assignment. - -- The assignment is then rewritten to assignments of slices of these + -- objects of this type on the source and target of the assignment. The + -- assignment is then rewritten to assignments of slices of these -- arrays, copying the user data, and leaving the pointers untouched. if Ctrl_Act then @@ -4306,10 +4388,9 @@ package body Exp_Ch5 is (Rec : Entity_Id; Lo : Node_Id; Hi : Node_Id) return Node_Id; - -- Build and return a slice of an array of type S overlaid - -- on object Rec, with bounds specified by Lo and Hi. If either - -- bound is empty, a default of S'First (respectively S'Last) - -- is used. + -- Build and return a slice of an array of type S overlaid on + -- object Rec, with bounds specified by Lo and Hi. If either bound + -- is empty, a default of S'First (respectively S'Last) is used. ----------------- -- Build_Slice -- @@ -4328,12 +4409,12 @@ package body Exp_Ch5 is Make_Attribute_Reference (Loc, Prefix => Rec, Attribute_Name => Name_Address)); - -- Access value designating an opaque storage array of - -- type S overlaid on record Rec. + -- Access value designating an opaque storage array of type S + -- overlaid on record Rec. begin - -- Compute slice bounds using S'First (1) and S'Last - -- as default values when not specified by the caller. + -- Compute slice bounds using S'First (1) and S'Last as default + -- values when not specified by the caller. if No (Lo) then Lo_Bound := Make_Integer_Literal (Loc, 1); @@ -4613,161 +4694,6 @@ package body Exp_Ch5 is return Empty_List; end Make_Tag_Ctrl_Assignment; - ----------------------------- - -- No_Secondary_Stack_Case -- - ----------------------------- - - procedure No_Secondary_Stack_Case (N : Node_Id) is - pragma Assert (False); -- DSP method no longer in use - - Loc : constant Source_Ptr := Sloc (N); - Exp : constant Node_Id := Expression (N); - T : constant Entity_Id := Etype (Exp); - Scope_Id : constant Entity_Id := - Return_Applies_To (Return_Statement_Entity (N)); - Return_Type : constant Entity_Id := Etype (Scope_Id); - Utyp : constant Entity_Id := Underlying_Type (Return_Type); - - -- Here what we need to do is to always return by reference, since - -- we will return with the stack pointer depressed. We may need to - -- do a copy to a local temporary before doing this return. - - Local_Copy_Required : Boolean := False; - -- Set to True if a local copy is required - - Copy_Ent : Entity_Id; - -- Used for the target entity if a copy is required - - Decl : Node_Id; - -- Declaration used to create copy if needed - - procedure Test_Copy_Required (Expr : Node_Id); - -- Determines if Expr represents a return value for which a - -- copy is required. More specifically, a copy is not required - -- if Expr represents an object or component of an object that - -- is either in the local subprogram frame, or is constant. - -- If a copy is required, then Local_Copy_Required is set True. - - ------------------------ - -- Test_Copy_Required -- - ------------------------ - - procedure Test_Copy_Required (Expr : Node_Id) is - Ent : Entity_Id; - - begin - -- If component, test prefix (object containing component) - - if Nkind (Expr) = N_Indexed_Component - or else - Nkind (Expr) = N_Selected_Component - then - Test_Copy_Required (Prefix (Expr)); - return; - - -- See if we have an entity name - - elsif Is_Entity_Name (Expr) then - Ent := Entity (Expr); - - -- Constant entity is always OK, no copy required - - if Ekind (Ent) = E_Constant then - return; - - -- No copy required for local variable - - elsif Ekind (Ent) = E_Variable - and then Scope (Ent) = Current_Subprogram - then - return; - end if; - end if; - - -- All other cases require a copy - - Local_Copy_Required := True; - end Test_Copy_Required; - - -- Start of processing for No_Secondary_Stack_Case - - begin - -- No copy needed if result is from a function call. - -- In this case the result is already being returned by - -- reference with the stack pointer depressed. - - -- To make up for a gcc 2.8.1 deficiency (???), we perform - -- the copy for array types if the constrained status of the - -- target type is different from that of the expression. - - if Requires_Transient_Scope (T) - and then - (not Is_Array_Type (T) - or else Is_Constrained (T) = Is_Constrained (Return_Type) - or else Controlled_Type (T)) - and then Nkind (Exp) = N_Function_Call - then - Set_By_Ref (N); - - -- We always need a local copy for a controlled type, since - -- we are required to finalize the local value before return. - -- The copy will automatically include the required finalize. - -- Moreover, gigi cannot make this copy, since we need special - -- processing to ensure proper behavior for finalization. - - -- Note: the reason we are returning with a depressed stack - -- pointer in the controlled case (even if the type involved - -- is constrained) is that we must make a local copy to deal - -- properly with the requirement that the local result be - -- finalized. - - elsif Controlled_Type (Utyp) then - Copy_Ent := - Make_Defining_Identifier (Loc, - Chars => New_Internal_Name ('R')); - - -- Build declaration to do the copy, and insert it, setting - -- Assignment_OK, because we may be copying a limited type. - -- In addition we set the special flag to inhibit finalize - -- attachment if this is a controlled type (since this attach - -- must be done by the caller, otherwise if we attach it here - -- we will finalize the returned result prematurely). - - Decl := - Make_Object_Declaration (Loc, - Defining_Identifier => Copy_Ent, - Object_Definition => New_Occurrence_Of (Return_Type, Loc), - Expression => Relocate_Node (Exp)); - - Set_Assignment_OK (Decl); - Set_Delay_Finalize_Attach (Decl); - Insert_Action (N, Decl); - - -- Now the actual return uses the copied value - - Rewrite (Exp, New_Occurrence_Of (Copy_Ent, Loc)); - Analyze_And_Resolve (Exp, Return_Type); - - -- Since we have made the copy, gigi does not have to, so - -- we set the By_Ref flag to prevent another copy being made. - - Set_By_Ref (N); - - -- Non-controlled cases - - else - Test_Copy_Required (Exp); - - -- If a local copy is required, then gigi will make the - -- copy, otherwise, we can return the result directly, - -- so set By_Ref to suppress the gigi copy. - - if not Local_Copy_Required then - Set_By_Ref (N); - end if; - end if; - end No_Secondary_Stack_Case; - ------------------------------------ -- Possible_Bit_Aligned_Component -- ------------------------------------ @@ -4821,9 +4747,9 @@ package body Exp_Ch5 is end if; end; - -- If we have neither a record nor array component, it means that - -- we have fallen off the top testing prefixes recursively, and - -- we now have a stand alone object, where we don't have a problem + -- If we have neither a record nor array component, it means that we + -- have fallen off the top testing prefixes recursively, and we now + -- have a stand alone object, where we don't have a problem. when others => return False; diff --git a/gcc/ada/exp_ch6.adb b/gcc/ada/exp_ch6.adb index 90684120fcc..e1d245b7108 100644 --- a/gcc/ada/exp_ch6.adb +++ b/gcc/ada/exp_ch6.adb @@ -30,6 +30,7 @@ with Debug; use Debug; with Einfo; use Einfo; with Errout; use Errout; with Elists; use Elists; +with Exp_Atag; use Exp_Atag; with Exp_Ch2; use Exp_Ch2; with Exp_Ch3; use Exp_Ch3; with Exp_Ch7; use Exp_Ch7; @@ -62,7 +63,6 @@ with Sem_Disp; use Sem_Disp; with Sem_Dist; use Sem_Dist; with Sem_Mech; use Sem_Mech; with Sem_Res; use Sem_Res; -with Sem_Type; use Sem_Type; with Sem_Util; use Sem_Util; with Sinfo; use Sinfo; with Snames; use Snames; @@ -81,11 +81,53 @@ package body Exp_Ch6 is procedure Add_Access_Actual_To_Build_In_Place_Call (Function_Call : Node_Id; Function_Id : Entity_Id; - Return_Object : Node_Id); + Return_Object : Node_Id; + Is_Access : Boolean := False); -- Ada 2005 (AI-318-02): Apply the Unrestricted_Access attribute to the -- object name given by Return_Object and add the attribute to the end of -- the actual parameter list associated with the build-in-place function - -- call denoted by Function_Call. + -- call denoted by Function_Call. However, if Is_Access is True, then + -- Return_Object is already an access expression, in which case it's passed + -- along directly to the build-in-place function. Finally, if Return_Object + -- is empty, then pass a null literal as the actual. + + procedure Add_Alloc_Form_Actual_To_Build_In_Place_Call + (Function_Call : Node_Id; + Function_Id : Entity_Id; + Alloc_Form : BIP_Allocation_Form := Unspecified; + Alloc_Form_Exp : Node_Id := Empty); + -- Ada 2005 (AI-318-02): Add an actual indicating the form of allocation, + -- if any, to be done by a build-in-place function. If Alloc_Form_Exp is + -- present, then use it, otherwise pass a literal corresponding to the + -- Alloc_Form parameter (which must not be Unspecified in that case). + + procedure Add_Extra_Actual_To_Call + (Subprogram_Call : Node_Id; + Extra_Formal : Entity_Id; + Extra_Actual : Node_Id); + -- Adds Extra_Actual as a named parameter association for the formal + -- Extra_Formal in Subprogram_Call. + + procedure Add_Final_List_Actual_To_Build_In_Place_Call + (Function_Call : Node_Id; + Function_Id : Entity_Id); + -- Ada 2005 (AI-318-02): For a build-in-place call, if the result type has + -- controlled parts, add an actual parameter that is a pointer to caller's + -- finalization list. + + procedure Add_Task_Actuals_To_Build_In_Place_Call + (Function_Call : Node_Id; + Function_Id : Entity_Id; + Master_Actual : Node_Id); + -- Ada 2005 (AI-318-02): For a build-in-place call, if the result type + -- contains tasks, add two actual parameters: the master, and a pointer to + -- the caller's activation chain. Master_Actual is the actual parameter + -- expression to pass for the master. In most cases, this is the current + -- master (_master). The two exceptions are: If the function call is the + -- initialization expression for an allocator, we pass the master of the + -- access type. If the function call is the initialization expression for + -- a return object, we pass along the master passed in by the caller. The + -- activation chain to pass is always the local one. procedure Check_Overriding_Operation (Subp : Entity_Id); -- Subp is a dispatching operation. Check whether it may override an @@ -172,66 +214,296 @@ package body Exp_Ch6 is procedure Add_Access_Actual_To_Build_In_Place_Call (Function_Call : Node_Id; Function_Id : Entity_Id; - Return_Object : Node_Id) + Return_Object : Node_Id; + Is_Access : Boolean := False) is Loc : constant Source_Ptr := Sloc (Function_Call); Obj_Address : Node_Id; - Obj_Acc_Formal : Node_Id; - Param_Assoc : Node_Id; + Obj_Acc_Formal : Entity_Id; begin - -- Locate the implicit access parameter in the called function. Maybe - -- we should be testing for the name of the access parameter (or perhaps - -- better, each implicit formal for build-in-place could have an - -- identifying flag, or a Uint attribute to identify it). ??? + -- Locate the implicit access parameter in the called function - Obj_Acc_Formal := Extra_Formals (Function_Id); + Obj_Acc_Formal := Build_In_Place_Formal (Function_Id, BIP_Object_Access); - while Present (Obj_Acc_Formal) loop - exit when Ekind (Etype (Obj_Acc_Formal)) = E_Anonymous_Access_Type; - Next_Formal_With_Extras (Obj_Acc_Formal); - end loop; + -- If no return object is provided, then pass null + + if not Present (Return_Object) then + Obj_Address := Make_Null (Loc); - pragma Assert (Present (Obj_Acc_Formal)); + -- If Return_Object is already an expression of an access type, then use + -- it directly, since it must be an access value denoting the return + -- object, and couldn't possibly be the return object itself. + + elsif Is_Access then + Obj_Address := Return_Object; -- Apply Unrestricted_Access to caller's return object - Obj_Address := - Make_Attribute_Reference (Loc, - Prefix => Return_Object, - Attribute_Name => Name_Unrestricted_Access); + else + Obj_Address := + Make_Attribute_Reference (Loc, + Prefix => Return_Object, + Attribute_Name => Name_Unrestricted_Access); + end if; Analyze_And_Resolve (Obj_Address, Etype (Obj_Acc_Formal)); -- Build the parameter association for the new actual and add it to the -- end of the function's actuals. + Add_Extra_Actual_To_Call (Function_Call, Obj_Acc_Formal, Obj_Address); + end Add_Access_Actual_To_Build_In_Place_Call; + + -------------------------------------------------- + -- Add_Alloc_Form_Actual_To_Build_In_Place_Call -- + -------------------------------------------------- + + procedure Add_Alloc_Form_Actual_To_Build_In_Place_Call + (Function_Call : Node_Id; + Function_Id : Entity_Id; + Alloc_Form : BIP_Allocation_Form := Unspecified; + Alloc_Form_Exp : Node_Id := Empty) + is + Loc : constant Source_Ptr := Sloc (Function_Call); + Alloc_Form_Actual : Node_Id; + Alloc_Form_Formal : Node_Id; + + begin + -- Locate the implicit allocation form parameter in the called function. + -- Maybe it would be better for each implicit formal of a build-in-place + -- function to have a flag or a Uint attribute to identify it. ??? + + Alloc_Form_Formal := Build_In_Place_Formal (Function_Id, BIP_Alloc_Form); + + if Present (Alloc_Form_Exp) then + pragma Assert (Alloc_Form = Unspecified); + + Alloc_Form_Actual := Alloc_Form_Exp; + + else + pragma Assert (Alloc_Form /= Unspecified); + + Alloc_Form_Actual := + Make_Integer_Literal (Loc, + Intval => UI_From_Int (BIP_Allocation_Form'Pos (Alloc_Form))); + end if; + + Analyze_And_Resolve (Alloc_Form_Actual, Etype (Alloc_Form_Formal)); + + -- Build the parameter association for the new actual and add it to the + -- end of the function's actuals. + + Add_Extra_Actual_To_Call + (Function_Call, Alloc_Form_Formal, Alloc_Form_Actual); + end Add_Alloc_Form_Actual_To_Build_In_Place_Call; + + ------------------------------ + -- Add_Extra_Actual_To_Call -- + ------------------------------ + + procedure Add_Extra_Actual_To_Call + (Subprogram_Call : Node_Id; + Extra_Formal : Entity_Id; + Extra_Actual : Node_Id) + is + Loc : constant Source_Ptr := Sloc (Subprogram_Call); + Param_Assoc : Node_Id; + + begin Param_Assoc := Make_Parameter_Association (Loc, - Selector_Name => New_Occurrence_Of (Obj_Acc_Formal, Loc), - Explicit_Actual_Parameter => Obj_Address); + Selector_Name => New_Occurrence_Of (Extra_Formal, Loc), + Explicit_Actual_Parameter => Extra_Actual); - Set_Parent (Param_Assoc, Function_Call); - Set_Parent (Obj_Address, Param_Assoc); + Set_Parent (Param_Assoc, Subprogram_Call); + Set_Parent (Extra_Actual, Param_Assoc); - if Present (Parameter_Associations (Function_Call)) then - if Nkind (Last (Parameter_Associations (Function_Call))) = + if Present (Parameter_Associations (Subprogram_Call)) then + if Nkind (Last (Parameter_Associations (Subprogram_Call))) = N_Parameter_Association then - Set_Next_Named_Actual - (Last (Parameter_Associations (Function_Call)), - Obj_Address); + + -- Find last named actual, and append + + declare + L : Node_Id; + begin + L := First_Actual (Subprogram_Call); + while Present (L) loop + if No (Next_Actual (L)) then + Set_Next_Named_Actual (Parent (L), Extra_Actual); + exit; + end if; + Next_Actual (L); + end loop; + end; + else - Set_First_Named_Actual (Function_Call, Obj_Address); + Set_First_Named_Actual (Subprogram_Call, Extra_Actual); end if; - Append (Param_Assoc, To => Parameter_Associations (Function_Call)); + Append (Param_Assoc, To => Parameter_Associations (Subprogram_Call)); else - Set_Parameter_Associations (Function_Call, New_List (Param_Assoc)); - Set_First_Named_Actual (Function_Call, Obj_Address); + Set_Parameter_Associations (Subprogram_Call, New_List (Param_Assoc)); + Set_First_Named_Actual (Subprogram_Call, Extra_Actual); end if; - end Add_Access_Actual_To_Build_In_Place_Call; + end Add_Extra_Actual_To_Call; + + -------------------------------------------------- + -- Add_Final_List_Actual_To_Build_In_Place_Call -- + -------------------------------------------------- + + procedure Add_Final_List_Actual_To_Build_In_Place_Call + (Function_Call : Node_Id; + Function_Id : Entity_Id) + is + Loc : constant Source_Ptr := Sloc (Function_Call); + Final_List : Node_Id; + Final_List_Actual : Node_Id; + Final_List_Formal : Node_Id; + + begin + -- No such extra parameter is needed if there are no controlled parts + + if not (Is_Controlled (Etype (Function_Id)) + or else Has_Controlled_Component (Etype (Function_Id))) then + return; + end if; + + -- Locate implicit finalization list parameter in the called function + + Final_List_Formal := Build_In_Place_Formal (Function_Id, BIP_Final_List); + + -- Create the actual which is a pointer to the current finalization list + + Final_List := Find_Final_List (Current_Scope); + Final_List_Actual := + Make_Attribute_Reference (Loc, + Prefix => Final_List, + Attribute_Name => Name_Unrestricted_Access); + + Analyze_And_Resolve (Final_List_Actual, Etype (Final_List_Formal)); + + -- Build the parameter association for the new actual and add it to the + -- end of the function's actuals. + + Add_Extra_Actual_To_Call + (Function_Call, Final_List_Formal, Final_List_Actual); + end Add_Final_List_Actual_To_Build_In_Place_Call; + + --------------------------------------------- + -- Add_Task_Actuals_To_Build_In_Place_Call -- + --------------------------------------------- + + procedure Add_Task_Actuals_To_Build_In_Place_Call + (Function_Call : Node_Id; + Function_Id : Entity_Id; + Master_Actual : Node_Id) + -- Note: Master_Actual can be Empty, but only if there are no tasks + is + Loc : constant Source_Ptr := Sloc (Function_Call); + + begin + -- No such extra parameters are needed if there are no tasks + + if not Has_Task (Etype (Function_Id)) then + return; + end if; + + -- The master + + declare + Master_Formal : Node_Id; + begin + -- Locate implicit master parameter in the called function + + Master_Formal := Build_In_Place_Formal (Function_Id, BIP_Master); + + Analyze_And_Resolve (Master_Actual, Etype (Master_Formal)); + + -- Build the parameter association for the new actual and add it to + -- the end of the function's actuals. + + Add_Extra_Actual_To_Call + (Function_Call, Master_Formal, Master_Actual); + end; + + -- The activation chain + + declare + Activation_Chain_Actual : Node_Id; + Activation_Chain_Formal : Node_Id; + begin + -- Locate implicit activation chain parameter in the called function + + Activation_Chain_Formal := Build_In_Place_Formal + (Function_Id, BIP_Activation_Chain); + + -- Create the actual which is a pointer to the current activation + -- chain + + Activation_Chain_Actual := + Make_Attribute_Reference (Loc, + Prefix => Make_Identifier (Loc, Name_uChain), + Attribute_Name => Name_Unrestricted_Access); + + Analyze_And_Resolve + (Activation_Chain_Actual, Etype (Activation_Chain_Formal)); + + -- Build the parameter association for the new actual and add it to + -- the end of the function's actuals. + + Add_Extra_Actual_To_Call + (Function_Call, Activation_Chain_Formal, Activation_Chain_Actual); + end; + end Add_Task_Actuals_To_Build_In_Place_Call; + + ----------------------- + -- BIP_Formal_Suffix -- + ----------------------- + + function BIP_Formal_Suffix (Kind : BIP_Formal_Kind) return String is + begin + case Kind is + when BIP_Alloc_Form => + return "BIPalloc"; + when BIP_Final_List => + return "BIPfinallist"; + when BIP_Master => + return "BIPmaster"; + when BIP_Activation_Chain => + return "BIPactivationchain"; + when BIP_Object_Access => + return "BIPaccess"; + end case; + end BIP_Formal_Suffix; + + --------------------------- + -- Build_In_Place_Formal -- + --------------------------- + + function Build_In_Place_Formal + (Func : Entity_Id; + Kind : BIP_Formal_Kind) return Entity_Id + is + Extra_Formal : Entity_Id := Extra_Formals (Func); + + begin + -- Maybe it would be better for each implicit formal of a build-in-place + -- function to have a flag or a Uint attribute to identify it. ??? + + loop + exit when + Chars (Extra_Formal) = + New_External_Name (Chars (Func), BIP_Formal_Suffix (Kind)); + Next_Formal_With_Extras (Extra_Formal); + end loop; + + pragma Assert (Present (Extra_Formal)); + return Extra_Formal; + end Build_In_Place_Formal; -------------------------------- -- Check_Overriding_Operation -- @@ -1088,10 +1360,10 @@ package body Exp_Ch6 is -- Ada 2005 (AI-318-02): If the actual parameter is a call to a -- build-in-place function, then a temporary return object needs -- to be created and access to it must be passed to the function. - -- Currently we limit such functions to those with constrained - -- inherently limited result subtypes, but eventually we plan to - -- expand the allowed forms of funtions that are treated as - -- build-in-place. + -- Currently we limit such functions to those with inherently + -- limited result subtypes, but eventually we plan to expand the + -- functions that are treated as build-in-place to include other + -- composite result types. if Ada_Version >= Ada_05 and then Is_Build_In_Place_Function_Call (Actual) @@ -2001,8 +2273,11 @@ package body Exp_Ch6 is Make_Implicit_If_Statement (N, Condition => Make_Op_Not (Loc, - Get_Remotely_Callable - (Duplicate_Subexpr_Move_Checks (Actual))), + Build_Get_Remotely_Callable (Loc, + Make_Selected_Component (Loc, + Prefix => Duplicate_Subexpr_Move_Checks (Actual), + Selector_Name => + Make_Identifier (Loc, Name_uTag)))), Then_Statements => New_List ( Make_Raise_Program_Error (Loc, Reason => PE_Illegal_RACW_E_4_18)))); @@ -2161,7 +2436,7 @@ package body Exp_Ch6 is Set_Entity (Name (N), Parent_Subp); - if Is_Abstract (Parent_Subp) + if Is_Abstract_Subprogram (Parent_Subp) and then not In_Instance then Error_Msg_NE @@ -2270,8 +2545,8 @@ package body Exp_Ch6 is -- Handle case of access to protected subprogram type - if Ekind (Base_Type (Etype (Prefix (Name (N))))) = - E_Access_Protected_Subprogram_Type + if Is_Access_Protected_Subprogram_Type + (Base_Type (Etype (Prefix (Name (N))))) then -- If this is a call through an access to protected operation, -- the prefix has the form (object'address, operation'access). @@ -2717,6 +2992,10 @@ package body Exp_Ch6 is -- If the type returned by the function is unconstrained and the -- call can be inlined, special processing is required. + function Is_Null_Procedure return Boolean; + -- Predicate to recognize stubbed procedures and null procedures, for + -- which there is no need for the full inlining mechanism. + procedure Make_Exit_Label; -- Build declaration for exit label to be used in Return statements @@ -2743,6 +3022,50 @@ package body Exp_Ch6 is function Formal_Is_Used_Once (Formal : Entity_Id) return Boolean; -- Determine whether a formal parameter is used only once in Orig_Bod + ----------------------- + -- Is_Null_Procedure -- + ----------------------- + + function Is_Null_Procedure return Boolean is + Decl : constant Node_Id := Unit_Declaration_Node (Subp); + + begin + if Ekind (Subp) /= E_Procedure then + return False; + + elsif Nkind (Orig_Bod) /= N_Subprogram_Body then + return False; + + -- Check if this is an ada 2005 null procedure + + elsif Nkind (Decl) = N_Subprogram_Declaration + and then Null_Present (Specification (Decl)) + then + return True; + + -- Check if the body contains only a null statement, followed by the + -- return statement added during expansion. + + else + declare + Stat : constant Node_Id := + First + (Statements (Handled_Statement_Sequence (Orig_Bod))); + + Stat2 : constant Node_Id := Next (Stat); + + begin + return + Nkind (Stat) = N_Null_Statement + and then + (No (Stat2) + or else + (Nkind (Stat2) = N_Return_Statement + and then No (Next (Stat2)))); + end; + end if; + end Is_Null_Procedure; + --------------------- -- Make_Exit_Label -- --------------------- @@ -3076,6 +3399,10 @@ package body Exp_Ch6 is (RTE (RE_Address), Relocate_Node (First_Actual (N)))); return; + + elsif Is_Null_Procedure then + Rewrite (N, Make_Null_Statement (Loc)); + return; end if; -- Check for an illegal attempt to inline a recursive procedure. If the @@ -3786,7 +4113,7 @@ package body Exp_Ch6 is Chars => Name_uE); Excep_Handlers := New_List ( - Make_Exception_Handler (Loc, + Make_Implicit_Exception_Handler (Loc, Choice_Parameter => Ent_EO, Exception_Choices => New_List ( Make_Others_Choice (Loc)), @@ -4003,9 +4330,7 @@ package body Exp_Ch6 is elsif Is_Inherently_Limited_Type (Typ) then Set_Returns_By_Ref (Spec_Id); - elsif Present (Utyp) - and then (Is_Class_Wide_Type (Utyp) or else Controlled_Type (Utyp)) - then + elsif Present (Utyp) and then CW_Or_Controlled_Type (Utyp) then Set_Returns_By_Ref (Spec_Id); end if; end; @@ -4403,16 +4728,20 @@ package body Exp_Ch6 is function Is_Build_In_Place_Function (E : Entity_Id) return Boolean is begin -- For now we test whether E denotes a function or access-to-function - -- type whose result subtype is constrained and inherently limited. - -- Later this test will be revised to include unconstrained limited - -- types and composite nonlimited types in general. Functions with - -- a foreign convention or whose result type has a foreign convention + -- type whose result subtype is inherently limited. Later this test may + -- be revised to allow composite nonlimited types. Functions with a + -- foreign convention or whose result type has a foreign convention -- never qualify. if Ekind (E) = E_Function + or else Ekind (E) = E_Generic_Function or else (Ekind (E) = E_Subprogram_Type and then Etype (E) /= Standard_Void_Type) then + -- Note: If you have Convention (C) on an inherently limited type, + -- you're on your own. That is, the C code will have to be carefully + -- written to know about the Ada conventions. + if Has_Foreign_Convention (E) or else Has_Foreign_Convention (Etype (E)) then @@ -4420,7 +4749,8 @@ package body Exp_Ch6 is else return Is_Inherently_Limited_Type (Etype (E)) - and then Is_Constrained (Etype (E)); + and then Ada_Version >= Ada_05 + and then not Debug_Flag_Dot_L; end if; else @@ -4456,6 +4786,22 @@ package body Exp_Ch6 is end if; end Is_Build_In_Place_Function_Call; + --------------------------------------- + -- Is_Build_In_Place_Function_Return -- + --------------------------------------- + + function Is_Build_In_Place_Function_Return (N : Node_Id) return Boolean is + begin + if Nkind (N) = N_Return_Statement + or else Nkind (N) = N_Extended_Return_Statement + then + return Is_Build_In_Place_Function + (Return_Applies_To (Return_Statement_Entity (N))); + else + return False; + end if; + end Is_Build_In_Place_Function_Return; + ----------------------- -- Freeze_Subprogram -- ----------------------- @@ -4474,8 +4820,6 @@ package body Exp_Ch6 is procedure Register_Predefined_DT_Entry (Prim : Entity_Id) is Iface_DT_Ptr : Elmt_Id; - Iface_Typ : Entity_Id; - Iface_Elmt : Elmt_Id; Tagged_Typ : Entity_Id; Thunk_Id : Entity_Id; @@ -4483,8 +4827,9 @@ package body Exp_Ch6 is Tagged_Typ := Find_Dispatching_Type (Prim); if No (Access_Disp_Table (Tagged_Typ)) - or else No (Abstract_Interfaces (Tagged_Typ)) + or else not Has_Abstract_Interfaces (Tagged_Typ) or else not RTE_Available (RE_Interface_Tag) + or else Restriction_Active (No_Dispatching_Calls) then return; end if; @@ -4497,36 +4842,29 @@ package body Exp_Ch6 is Iface_DT_Ptr := Next_Elmt (First_Elmt (Access_Disp_Table (Tagged_Typ))); - Iface_Elmt := First_Elmt (Abstract_Interfaces (Tagged_Typ)); - while Present (Iface_DT_Ptr) and then Present (Iface_Elmt) loop - Iface_Typ := Node (Iface_Elmt); - - if not Is_Ancestor (Iface_Typ, Tagged_Typ) then - Thunk_Id := - Make_Defining_Identifier (Loc, - Chars => New_Internal_Name ('T')); - - Insert_Actions (N, New_List ( - Expand_Interface_Thunk - (N => Prim, - Thunk_Alias => Prim, - Thunk_Id => Thunk_Id), - - Make_DT_Access_Action (Iface_Typ, - Action => Set_Predefined_Prim_Op_Address, - Args => New_List ( - Unchecked_Convert_To (RTE (RE_Tag), - New_Reference_To (Node (Iface_DT_Ptr), Loc)), - - Make_Integer_Literal (Loc, DT_Position (Prim)), - - Make_Attribute_Reference (Loc, - Prefix => New_Reference_To (Thunk_Id, Loc), - Attribute_Name => Name_Address))))); - end if; + + while Present (Iface_DT_Ptr) loop + Thunk_Id := + Make_Defining_Identifier (Loc, + Chars => New_Internal_Name ('T')); + + Insert_Actions (N, New_List ( + Expand_Interface_Thunk + (N => Prim, + Thunk_Alias => Prim, + Thunk_Id => Thunk_Id), + + Build_Set_Predefined_Prim_Op_Address (Loc, + Tag_Node => + New_Reference_To (Node (Iface_DT_Ptr), Loc), + Position_Node => + Make_Integer_Literal (Loc, DT_Position (Prim)), + Address_Node => + Make_Attribute_Reference (Loc, + Prefix => New_Reference_To (Thunk_Id, Loc), + Attribute_Name => Name_Address)))); Next_Elmt (Iface_DT_Ptr); - Next_Elmt (Iface_Elmt); end loop; end Register_Predefined_DT_Entry; @@ -4537,8 +4875,7 @@ package body Exp_Ch6 is -- whose constructor is in the CPP side (and therefore we don't need -- to generate code to register them in the dispatch table). - if not Debug_Flag_QQ - and then Is_Imported (E) + if Is_Imported (E) and then Convention (E) = Convention_CPP then return; @@ -4551,7 +4888,7 @@ package body Exp_Ch6 is -- the dispatching mechanism is handled internally by the JVM. if Is_Dispatching_Operation (E) - and then not Is_Abstract (E) + and then not Is_Abstract_Subprogram (E) and then Present (DTC_Entity (E)) and then not Java_VM and then not Is_CPP_Class (Scope (DTC_Entity (E))) @@ -4560,43 +4897,48 @@ package body Exp_Ch6 is -- Ada 95 case: Register the subprogram in the primary dispatch table - if Ada_Version < Ada_05 then + -- Do not register the subprogram in the dispatch table if we are + -- compiling under No_Dispatching_Calls restriction. - -- Do not register the subprogram in the dispatch table if we - -- are compiling with the No_Dispatching_Calls restriction. + if not Restriction_Active (No_Dispatching_Calls) then - if not Restriction_Active (No_Dispatching_Calls) then + if Ada_Version < Ada_05 then Insert_After (N, Fill_DT_Entry (Sloc (N), Prim => E)); - end if; - -- Ada 2005 case: Register the subprogram in the secondary dispatch - -- tables associated with abstract interfaces. + -- Ada 2005 case: Register the subprogram in all the dispatch + -- tables associated with the type - else - declare - Typ : constant Entity_Id := Scope (DTC_Entity (E)); + else + declare + Typ : constant Entity_Id := Scope (DTC_Entity (E)); - begin - -- There is no dispatch table associated with abstract - -- interface types. Each type implementing interfaces will - -- fill the associated secondary DT entries. + begin + if not Is_Interface (Typ) + and then Is_Predefined_Dispatching_Operation (E) + then + Register_Predefined_DT_Entry (E); + Insert_After (N, Fill_DT_Entry (Sloc (N), Prim => E)); - if not Is_Interface (Typ) - or else Present (Alias (E)) - then - -- Ada 2005 (AI-251): Check if this entry corresponds with - -- a subprogram that covers an abstract interface type. + -- There is no dispatch table associated with abstract + -- interface types. Each type implementing interfaces will + -- fill the associated secondary DT entries. - if Present (Abstract_Interface_Alias (E)) then - Register_Interface_DT_Entry (N, E); + elsif not Is_Interface (Typ) + or else Present (Alias (E)) + then + -- Ada 2005 (AI-251): Check if this entry corresponds + -- with a subprogram that covers an abstract interface + -- type. - -- Common case: Primitive subprogram + if Present (Abstract_Interface_Alias (E)) then + Register_Interface_DT_Entry (N, E); - else - -- Generate thunks for all the predefined operations + -- Common case: Primitive subprogram + + else + -- Generate thunks for all the predefined operations - if not Restriction_Active (No_Dispatching_Calls) then if Is_Predefined_Dispatching_Operation (E) then Register_Predefined_DT_Entry (E); end if; @@ -4605,8 +4947,8 @@ package body Exp_Ch6 is Fill_DT_Entry (Sloc (N), Prim => E)); end if; end if; - end if; - end; + end; + end if; end if; end if; @@ -4622,9 +4964,7 @@ package body Exp_Ch6 is if Is_Inherently_Limited_Type (Typ) then Set_Returns_By_Ref (E); - elsif Present (Utyp) - and then (Is_Class_Wide_Type (Utyp) or else Controlled_Type (Utyp)) - then + elsif Present (Utyp) and then CW_Or_Controlled_Type (Utyp) then Set_Returns_By_Ref (E); end if; end; @@ -4665,43 +5005,79 @@ package body Exp_Ch6 is Result_Subt := Etype (Function_Id); - -- Replace the initialized allocator of form "new T'(Func (...))" with - -- an uninitialized allocator of form "new T", where T is the result - -- subtype of the called function. The call to the function is handled - -- separately further below. + -- When the result subtype is constrained, the return object must be + -- allocated on the caller side, and access to it is passed to the + -- function. - New_Allocator := - Make_Allocator (Loc, New_Reference_To (Result_Subt, Loc)); - Set_No_Initialization (New_Allocator); + if Is_Constrained (Result_Subt) then - Rewrite (Allocator, New_Allocator); + -- Replace the initialized allocator of form "new T'(Func (...))" + -- with an uninitialized allocator of form "new T", where T is the + -- result subtype of the called function. The call to the function + -- is handled separately further below. - -- Create a new access object and initialize it to the result of the new - -- uninitialized allocator. + New_Allocator := + Make_Allocator (Loc, New_Reference_To (Result_Subt, Loc)); - Return_Obj_Access := - Make_Defining_Identifier (Loc, New_Internal_Name ('R')); - Set_Etype (Return_Obj_Access, Acc_Type); + Set_Storage_Pool (New_Allocator, Storage_Pool (Allocator)); + Set_Procedure_To_Call (New_Allocator, Procedure_To_Call (Allocator)); + Set_No_Initialization (New_Allocator); - Insert_Action (Allocator, - Make_Object_Declaration (Loc, - Defining_Identifier => Return_Obj_Access, - Object_Definition => New_Reference_To (Acc_Type, Loc), - Expression => Relocate_Node (Allocator))); + Rewrite (Allocator, New_Allocator); - -- Add an implicit actual to the function call that provides access to - -- the allocated object. An unchecked conversion to the (specific) - -- result subtype of the function is inserted to handle the case where - -- the access type of the allocator has a class-wide designated type. + -- Create a new access object and initialize it to the result of the + -- new uninitialized allocator. - Add_Access_Actual_To_Build_In_Place_Call - (Func_Call, - Function_Id, - Make_Unchecked_Type_Conversion (Loc, - Subtype_Mark => New_Reference_To (Result_Subt, Loc), - Expression => - Make_Explicit_Dereference (Loc, - Prefix => New_Reference_To (Return_Obj_Access, Loc)))); + Return_Obj_Access := + Make_Defining_Identifier (Loc, New_Internal_Name ('R')); + Set_Etype (Return_Obj_Access, Acc_Type); + + Insert_Action (Allocator, + Make_Object_Declaration (Loc, + Defining_Identifier => Return_Obj_Access, + Object_Definition => New_Reference_To (Acc_Type, Loc), + Expression => Relocate_Node (Allocator))); + + -- Add an implicit actual to the function call that provides access + -- to the allocated object. An unchecked conversion to the (specific) + -- result subtype of the function is inserted to handle cases where + -- the access type of the allocator has a class-wide designated type. + + Add_Final_List_Actual_To_Build_In_Place_Call (Func_Call, Function_Id); + Add_Task_Actuals_To_Build_In_Place_Call + (Func_Call, Function_Id, Master_Actual => Master_Id (Acc_Type)); + Add_Access_Actual_To_Build_In_Place_Call + (Func_Call, + Function_Id, + Make_Unchecked_Type_Conversion (Loc, + Subtype_Mark => New_Reference_To (Result_Subt, Loc), + Expression => + Make_Explicit_Dereference (Loc, + Prefix => New_Reference_To (Return_Obj_Access, Loc)))); + + -- When the result subtype is unconstrained, the function itself must + -- perform the allocation of the return object, so we pass parameters + -- indicating that. We don't yet handle the case where the allocation + -- must be done in a user-defined storage pool, which will require + -- passing another actual or two to provide allocation/deallocation + -- operations. ??? + + else + -- Pass an allocation parameter indicating that the function should + -- allocate its result on the heap. + + Add_Alloc_Form_Actual_To_Build_In_Place_Call + (Func_Call, Function_Id, Alloc_Form => Global_Heap); + + -- The caller does not provide the return object in this case, so we + -- have to pass null for the object access actual. + + Add_Final_List_Actual_To_Build_In_Place_Call (Func_Call, Function_Id); + Add_Task_Actuals_To_Build_In_Place_Call + (Func_Call, Function_Id, Master_Actual => Master_Id (Acc_Type)); + Add_Access_Actual_To_Build_In_Place_Call + (Func_Call, Function_Id, Return_Object => Empty); + end if; -- Finally, replace the allocator node with a reference to the result -- of the function call itself (which will effectively be an access @@ -4744,28 +5120,60 @@ package body Exp_Ch6 is Result_Subt := Etype (Function_Id); - -- Create a temporary object to hold the function result + -- When the result subtype is constrained, an object of the subtype is + -- declared and an access value designating it is passed as an actual. - Return_Obj_Id := - Make_Defining_Identifier (Loc, - Chars => New_Internal_Name ('R')); - Set_Etype (Return_Obj_Id, Result_Subt); + if Is_Constrained (Result_Subt) then - Return_Obj_Decl := - Make_Object_Declaration (Loc, - Defining_Identifier => Return_Obj_Id, - Aliased_Present => True, - Object_Definition => New_Reference_To (Result_Subt, Loc)); + -- Create a temporary object to hold the function result + + Return_Obj_Id := + Make_Defining_Identifier (Loc, + Chars => New_Internal_Name ('R')); + Set_Etype (Return_Obj_Id, Result_Subt); - Set_No_Initialization (Return_Obj_Decl); + Return_Obj_Decl := + Make_Object_Declaration (Loc, + Defining_Identifier => Return_Obj_Id, + Aliased_Present => True, + Object_Definition => New_Reference_To (Result_Subt, Loc)); - Insert_Action (Func_Call, Return_Obj_Decl); + Set_No_Initialization (Return_Obj_Decl); - -- Add an implicit actual to the function call that provides access to - -- the caller's return object. + Insert_Action (Func_Call, Return_Obj_Decl); - Add_Access_Actual_To_Build_In_Place_Call - (Func_Call, Function_Id, New_Reference_To (Return_Obj_Id, Loc)); + -- Add an implicit actual to the function call that provides access + -- to the caller's return object. + + Add_Final_List_Actual_To_Build_In_Place_Call (Func_Call, Function_Id); + Add_Task_Actuals_To_Build_In_Place_Call + (Func_Call, Function_Id, Make_Identifier (Loc, Name_uMaster)); + Add_Access_Actual_To_Build_In_Place_Call + (Func_Call, Function_Id, New_Reference_To (Return_Obj_Id, Loc)); + + -- When the result subtype is unconstrained, the function must allocate + -- the return object in the secondary stack, so appropriate implicit + -- parameters are added to the call to indicate that. A transient + -- scope is established to ensure eventual cleanup of the result. + + else + -- Pass an allocation parameter indicating that the function should + -- allocate its result on the secondary stack. + + Add_Alloc_Form_Actual_To_Build_In_Place_Call + (Func_Call, Function_Id, Alloc_Form => Secondary_Stack); + + -- Pass a null value to the function since no return object is + -- available on the caller side. + + Add_Final_List_Actual_To_Build_In_Place_Call (Func_Call, Function_Id); + Add_Task_Actuals_To_Build_In_Place_Call + (Func_Call, Function_Id, Make_Identifier (Loc, Name_uMaster)); + Add_Access_Actual_To_Build_In_Place_Call + (Func_Call, Function_Id, Empty); + + Establish_Transient_Scope (Func_Call, Sec_Stack => True); + end if; end Make_Build_In_Place_Call_In_Anonymous_Context; --------------------------------------------------- @@ -4805,9 +5213,20 @@ package body Exp_Ch6 is Result_Subt := Etype (Function_Id); + -- When the result subtype is unconstrained, an additional actual must + -- be passed to indicate that the caller is providing the return object. + + if not Is_Constrained (Result_Subt) then + Add_Alloc_Form_Actual_To_Build_In_Place_Call + (Func_Call, Function_Id, Alloc_Form => Caller_Allocation); + end if; + -- Add an implicit actual to the function call that provides access to -- the caller's return object. + Add_Final_List_Actual_To_Build_In_Place_Call (Func_Call, Function_Id); + Add_Task_Actuals_To_Build_In_Place_Call + (Func_Call, Function_Id, Make_Identifier (Loc, Name_uMaster)); Add_Access_Actual_To_Build_In_Place_Call (Func_Call, Function_Id, @@ -4860,14 +5279,20 @@ package body Exp_Ch6 is (Object_Decl : Node_Id; Function_Call : Node_Id) is - Loc : Source_Ptr; - Func_Call : Node_Id := Function_Call; - Function_Id : Entity_Id; - Result_Subt : Entity_Id; - Ref_Type : Entity_Id; - Ptr_Typ_Decl : Node_Id; - Def_Id : Entity_Id; - New_Expr : Node_Id; + Loc : Source_Ptr; + Obj_Def_Id : constant Entity_Id := + Defining_Identifier (Object_Decl); + Func_Call : Node_Id := Function_Call; + Function_Id : Entity_Id; + Result_Subt : Entity_Id; + Caller_Object : Node_Id; + Call_Deref : Node_Id; + Ref_Type : Entity_Id; + Ptr_Typ_Decl : Node_Id; + Def_Id : Entity_Id; + New_Expr : Node_Id; + Enclosing_Func : Entity_Id; + Pass_Caller_Acc : Boolean := False; begin if Nkind (Func_Call) = N_Qualified_Expression then @@ -4888,18 +5313,96 @@ package body Exp_Ch6 is Result_Subt := Etype (Function_Id); - -- Add an implicit actual to the function call that provides access to - -- the declared object. An unchecked conversion to the (specific) result - -- type of the function is inserted to handle the case where the object - -- is declared with a class-wide type. + -- In the constrained case, add an implicit actual to the function call + -- that provides access to the declared object. An unchecked conversion + -- to the (specific) result type of the function is inserted to handle + -- the case where the object is declared with a class-wide type. + + if Is_Constrained (Result_Subt) then + Caller_Object := + Make_Unchecked_Type_Conversion (Loc, + Subtype_Mark => New_Reference_To (Result_Subt, Loc), + Expression => New_Reference_To (Obj_Def_Id, Loc)); + -- If the function's result subtype is unconstrained and the object is + -- a return object of an enclosing build-in-place function, then the + -- implicit build-in-place parameters of the enclosing function must be + -- passed along to the called function. + + elsif Nkind (Parent (Object_Decl)) = N_Extended_Return_Statement then + Pass_Caller_Acc := True; + + Enclosing_Func := Enclosing_Subprogram (Obj_Def_Id); + + -- If the enclosing function has a constrained result type, then + -- caller allocation will be used. + + if Is_Constrained (Etype (Enclosing_Func)) then + Add_Alloc_Form_Actual_To_Build_In_Place_Call + (Func_Call, Function_Id, Alloc_Form => Caller_Allocation); + + -- Otherwise, when the enclosing function has an unconstrained result + -- type, the BIP_Alloc_Form formal of the enclosing function must be + -- passed long to the callee. + + else + Add_Alloc_Form_Actual_To_Build_In_Place_Call + (Func_Call, + Function_Id, + Alloc_Form_Exp => + New_Reference_To + (Build_In_Place_Formal (Enclosing_Func, BIP_Alloc_Form), + Loc)); + end if; + + -- Retrieve the BIPacc formal from the enclosing function and convert + -- it to the access type of the callee's BIP_Object_Access formal. + + Caller_Object := + Make_Unchecked_Type_Conversion (Loc, + Subtype_Mark => + New_Reference_To + (Etype + (Build_In_Place_Formal (Function_Id, BIP_Object_Access)), + Loc), + Expression => + New_Reference_To + (Build_In_Place_Formal (Enclosing_Func, BIP_Object_Access), + Loc)); + + -- In other unconstrained cases, pass an indication to do the allocation + -- on the secondary stack and set Caller_Object to Empty so that a null + -- value will be passed for the caller's object address. A transient + -- scope is established to ensure eventual cleanup of the result. + + else + Add_Alloc_Form_Actual_To_Build_In_Place_Call + (Func_Call, + Function_Id, + Alloc_Form => Secondary_Stack); + Caller_Object := Empty; + + Establish_Transient_Scope (Object_Decl, Sec_Stack => True); + end if; + + Add_Final_List_Actual_To_Build_In_Place_Call (Func_Call, Function_Id); + if Nkind (Parent (Object_Decl)) = N_Extended_Return_Statement + and then Has_Task (Result_Subt) + then + Enclosing_Func := Enclosing_Subprogram (Obj_Def_Id); + Add_Task_Actuals_To_Build_In_Place_Call + (Func_Call, Function_Id, + Master_Actual => + New_Reference_To + (Build_In_Place_Formal (Enclosing_Func, BIP_Master), Loc)); + -- Here we're passing along the master that was passed in to this + -- function. + else + Add_Task_Actuals_To_Build_In_Place_Call + (Func_Call, Function_Id, Make_Identifier (Loc, Name_uMaster)); + end if; Add_Access_Actual_To_Build_In_Place_Call - (Func_Call, - Function_Id, - Make_Unchecked_Type_Conversion (Loc, - Subtype_Mark => New_Reference_To (Result_Subt, Loc), - Expression => New_Reference_To - (Defining_Identifier (Object_Decl), Loc))); + (Func_Call, Function_Id, Caller_Object, Is_Access => Pass_Caller_Acc); -- Create an access type designating the function's result subtype @@ -4915,7 +5418,18 @@ package body Exp_Ch6 is Subtype_Indication => New_Reference_To (Result_Subt, Loc))); - Insert_After_And_Analyze (Object_Decl, Ptr_Typ_Decl); + -- The access type and its accompanying object must be inserted after + -- the object declaration in the constrained case, so that the function + -- call can be passed access to the object. In the unconstrained case, + -- the access type and object must be inserted before the object, since + -- the object declaration is rewritten to be a renaming of a dereference + -- of the access object. + + if Is_Constrained (Result_Subt) then + Insert_After_And_Analyze (Object_Decl, Ptr_Typ_Decl); + else + Insert_Before_And_Analyze (Object_Decl, Ptr_Typ_Decl); + end if; -- Finally, create an access object initialized to a reference to the -- function call. @@ -4935,8 +5449,44 @@ package body Exp_Ch6 is Object_Definition => New_Reference_To (Ref_Type, Loc), Expression => New_Expr)); - Set_Expression (Object_Decl, Empty); - Set_No_Initialization (Object_Decl); + if Is_Constrained (Result_Subt) then + Set_Expression (Object_Decl, Empty); + Set_No_Initialization (Object_Decl); + + -- In case of an unconstrained result subtype, rewrite the object + -- declaration as an object renaming where the renamed object is a + -- dereference of <function_Call>'reference: + -- + -- Obj : Subt renames <function_call>'Ref.all; + + else + Call_Deref := + Make_Explicit_Dereference (Loc, + Prefix => New_Reference_To (Def_Id, Loc)); + + Rewrite (Object_Decl, + Make_Object_Renaming_Declaration (Loc, + Defining_Identifier => Make_Defining_Identifier (Loc, + New_Internal_Name ('D')), + Access_Definition => Empty, + Subtype_Mark => New_Occurrence_Of (Result_Subt, Loc), + Name => Call_Deref)); + + Set_Renamed_Object (Defining_Identifier (Object_Decl), Call_Deref); + + Analyze (Object_Decl); + + -- Replace the internal identifier of the renaming declaration's + -- entity with identifier of the original object entity. We also have + -- to exchange the entities containing their defining identifiers to + -- ensure the correct replacement of the object declaration by the + -- object renaming declaration to avoid homograph conflicts (since + -- the object declaration's defining identifier was already entered + -- in current scope). + + Set_Chars (Defining_Identifier (Object_Decl), Chars (Obj_Def_Id)); + Exchange_Entities (Defining_Identifier (Object_Decl), Obj_Def_Id); + end if; -- If the object entity has a class-wide Etype, then we need to change -- it to the result subtype of the function call, because otherwise the @@ -4980,7 +5530,7 @@ package body Exp_Ch6 is pragma Assert (Is_Interface (Iface_Typ)); - if not Is_Ancestor (Iface_Typ, Tagged_Typ) then + if not Is_Parent (Iface_Typ, Tagged_Typ) then Thunk_Id := Make_Defining_Identifier (Loc, Chars => New_Internal_Name ('T')); diff --git a/gcc/ada/exp_ch6.ads b/gcc/ada/exp_ch6.ads index 219ce70abdb..436654c4c1b 100644 --- a/gcc/ada/exp_ch6.ads +++ b/gcc/ada/exp_ch6.ads @@ -40,21 +40,83 @@ package Exp_Ch6 is -- This procedure contains common processing for Expand_N_Function_Call, -- Expand_N_Procedure_Statement, and Expand_N_Entry_Call. + procedure Freeze_Subprogram (N : Node_Id); + -- generate the appropriate expansions related to Subprogram freeze + -- nodes (e. g. the filling of the corresponding Dispatch Table for + -- Primitive Operations) + + -- The following type defines the various forms of allocation used for the + -- results of build-in-place function calls. + + type BIP_Allocation_Form is + (Unspecified, + Caller_Allocation, + Secondary_Stack, + Global_Heap, + User_Storage_Pool); + + type BIP_Formal_Kind is + -- Ada 2005 (AI-318-02): This type defines the kinds of implicit extra + -- formals created for build-in-place functions. The order of the above + -- enumeration literals matches the order in which the formals are + -- declared. See Sem_Ch6.Create_Extra_Formals. + (BIP_Alloc_Form, + -- Present if result subtype is unconstrained. Indicates whether the + -- return object is allocated by the caller or callee, and if the + -- callee, whether to use the secondary stack or the heap. See + -- Create_Extra_Formals. + BIP_Final_List, + -- Present if result type has controlled parts. Pointer to caller's + -- finalization list. + BIP_Master, + -- Present if result type contains tasks. Master associated with + -- calling context. + BIP_Activation_Chain, + -- Present if result type contains tasks. Caller's activation chain. + BIP_Object_Access); + -- Present for all build-in-place functions. Address at which to place + -- the return object, or null if BIP_Alloc_Form indicates + -- allocated by callee. + -- ??? We also need to be able to pass in some way to access a + -- user-defined storage pool at some point. And perhaps a constrained + -- flag. + + function BIP_Formal_Suffix (Kind : BIP_Formal_Kind) return String; + -- Ada 2005 (AI-318-02): Returns a string to be used as the suffix of names + -- for build-in-place formal parameters of the given kind. + + function Build_In_Place_Formal + (Func : Entity_Id; + Kind : BIP_Formal_Kind) return Entity_Id; + -- Ada 2005 (AI-318-02): Locates and returns the entity for the implicit + -- build-in-place formal parameter of the given kind associated with the + -- function Func, and returns its Entity_Id. It is a bug if not found; the + -- caller should ensure this is called only when the extra formal exists. + function Is_Build_In_Place_Function (E : Entity_Id) return Boolean; - -- Ada 2005 (AI-318-02): Returns True if E denotes a function or an - -- access-to-function type whose result must be built in place; otherwise - -- returns False. Currently this is restricted to the subset of functions - -- whose result subtype is a constrained inherently limited type. + -- Ada 2005 (AI-318-02): Returns True if E denotes a function, generic + -- function, or access-to-function type whose result must be built in + -- place; otherwise returns False. For Ada 2005, this is currently + -- restricted to the set of functions whose result subtype is an inherently + -- limited type. In Ada 95, this must be False for inherently limited + -- result types (but currently returns False for all Ada 95 functions). + -- Eventually we plan to support build-in-place for nonlimited types. + -- Build-in-place is usually more efficient for large things, and less + -- efficient for small things. However, we never use build-in-place if the + -- convention is other than Ada, because that would disturb mixed-language + -- programs. Note that for the non-inherently-limited cases, we must make + -- the same decision for Ada 95 and 2005, so that mixed-dialect programs + -- will work. function Is_Build_In_Place_Function_Call (N : Node_Id) return Boolean; -- Ada 2005 (AI-318-02): Returns True if N denotes a call to a function -- that requires handling as a build-in-place call or is a qualified -- expression applied to such a call; otherwise returns False. - procedure Freeze_Subprogram (N : Node_Id); - -- generate the appropriate expansions related to Subprogram freeze - -- nodes (e. g. the filling of the corresponding Dispatch Table for - -- Primitive Operations) + function Is_Build_In_Place_Function_Return (N : Node_Id) return Boolean; + -- Ada 2005 (AI-318-02): Returns True if N is an N_Return_Statement or + -- N_Extended_Return_Statement and it applies to a build-in-place function + -- or generic function. procedure Make_Build_In_Place_Call_In_Allocator (Allocator : Node_Id; @@ -84,7 +146,7 @@ package Exp_Ch6 is Function_Call : Node_Id); -- Ada 2005 (AI-318-02): Handle a call to a build-in-place function that -- occurs as the right-hand side of an assignment statement by passing - -- access to the left-hand sid as an additional parameter of the function + -- access to the left-hand side as an additional parameter of the function -- call. Assign must denote a N_Assignment_Statement. Function_Call must -- denote either an N_Function_Call node for which Is_Build_In_Place_Call -- is True, or an N_Qualified_Expression node applied to such a function diff --git a/gcc/ada/exp_ch8.adb b/gcc/ada/exp_ch8.adb index 846b10d41a0..03408a77c07 100644 --- a/gcc/ada/exp_ch8.adb +++ b/gcc/ada/exp_ch8.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 1992-2004 Free Software Foundation, Inc. -- +-- Copyright (C) 1992-2006, 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,10 +26,12 @@ with Atree; use Atree; with Einfo; use Einfo; +with Exp_Ch6; use Exp_Ch6; with Exp_Dbug; use Exp_Dbug; with Exp_Util; use Exp_Util; with Freeze; use Freeze; with Nlists; use Nlists; +with Opt; use Opt; with Sem; use Sem; with Sem_Ch8; use Sem_Ch8; with Sinfo; use Sinfo; @@ -268,6 +270,19 @@ package body Exp_Ch8 is end if; end if; + -- Ada 2005 (AI-318-02): If the renamed object is a call to a build-in- + -- place function, then a temporary return object needs to be created + -- and access to it must be passed to the function. Currently we limit + -- such functions to those with inherently limited result subtypes, but + -- eventually we plan to expand the functions that are treated as + -- build-in-place to include other composite result types. + + if Ada_Version >= Ada_05 + and then Is_Build_In_Place_Function_Call (Nam) + then + Make_Build_In_Place_Call_In_Anonymous_Context (Nam); + end if; + -- Create renaming entry for debug information Decl := Debug_Renaming_Declaration (N); diff --git a/gcc/ada/rtsfind.adb b/gcc/ada/rtsfind.adb index 2ab53d4ecf7..9f8993b2961 100644 --- a/gcc/ada/rtsfind.adb +++ b/gcc/ada/rtsfind.adb @@ -54,8 +54,10 @@ with Uname; use Uname; package body Rtsfind is RTE_Available_Call : Boolean := False; - -- Set True during call to RTE from RTE_Available. Tells RTE to set - -- RTE_Is_Available to False rather than generating an error message. + -- Set True during call to RTE from RTE_Available (or from call to + -- RTE_Record_Component from RTE_Record_Component_Available). Tells + -- the called subprogram to set RTE_Is_Available to False rather than + -- generating an error message. RTE_Is_Available : Boolean; -- Set True by RTE_Available on entry. When RTE_Available_Call is set @@ -97,6 +99,11 @@ package body Rtsfind is -- first time, its ID is stored in this array, so that subsequent calls -- for the same entity can be satisfied immediately. + -- NOTE: In order to avoid conflicts between record components and subprgs + -- that have the same name (ie. subprogram External_Tag and component + -- External_Tag of package Ada.Tags) this table is not used with + -- Record_Components. + RE_Table : array (RE_Id) of Entity_Id; -------------------------- @@ -123,11 +130,20 @@ package body Rtsfind is -- Local Subprograms -- ----------------------- + function Check_CRT (E : RE_Id; Eid : Entity_Id) return Entity_Id; + -- Check entity Eid to ensure that configurable run-time restrictions + -- are met. May generate an error message and raise RE_Not_Available + -- if the entity E does not exist (i.e. Eid is Empty) + procedure Entity_Not_Defined (Id : RE_Id); -- Outputs error messages for an entity that is not defined in the -- run-time library (the form of the error message is tailored for -- no run time/configurable run time mode as required). + function Get_Unit_Name (U_Id : RTU_Id) return Unit_Name_Type; + -- Retrieves the Unit Name given a unit id represented by its + -- enumeration value in RTU_Id. + procedure Load_Fail (S : String; U_Id : RTU_Id; Id : RE_Id); -- Internal procedure called if we can't sucessfully locate or -- process a run-time unit. The parameters give information about @@ -144,10 +160,6 @@ package body Rtsfind is -- a normal situation in configurable run-time mode (and the message in -- this case is suppressed unless we are operating in All_Errors_Mode). - function Get_Unit_Name (U_Id : RTU_Id) return Unit_Name_Type; - -- Retrieves the Unit Name given a unit id represented by its - -- enumeration value in RTU_Id. - procedure Load_RTU (U_Id : RTU_Id; Id : RE_Id := RE_Null; @@ -165,6 +177,10 @@ package body Rtsfind is -- Id is used only for error message detail, and if it is RE_Null, then -- the attempt to output the entity name is ignored. + function Make_Unit_Name (E : RE_Id; N : Node_Id) return Node_Id; + -- If the unit is a child unit, build fully qualified name for use in + -- With_Clause. + procedure Output_Entity_Name (Id : RE_Id; Msg : String); -- Output continuation error message giving qualified name of entity -- corresponding to Id, appending the string given by Msg. This call @@ -181,6 +197,37 @@ package body Rtsfind is -- used if you are sure that the message comes directly or indirectly from -- a call to the RTE function. + --------------- + -- Check_CRT -- + --------------- + + function Check_CRT (E : RE_Id; Eid : Entity_Id) return Entity_Id is + U_Id : constant RTU_Id := RE_Unit_Table (E); + + begin + if No (Eid) then + Entity_Not_Defined (E); + raise RE_Not_Available; + + -- Entity is available + + else + -- If in No_Run_Time mode and entity is not in one of the + -- specially permitted units, raise the exception. + + if No_Run_Time_Mode + and then not OK_No_Run_Time_Unit (U_Id) + then + Entity_Not_Defined (E); + raise RE_Not_Available; + end if; + + -- Otherwise entity is accessible + + return Eid; + end if; + end Check_CRT; + ------------------------ -- Entity_Not_Defined -- ------------------------ @@ -658,6 +705,36 @@ package body Rtsfind is end if; end Load_RTU; + -------------------- + -- Make_Unit_Name -- + -------------------- + + function Make_Unit_Name (E : RE_Id; N : Node_Id) return Node_Id is + U_Id : constant RTU_Id := RE_Unit_Table (E); + U : RT_Unit_Table_Record renames RT_Unit_Table (U_Id); + Nam : Node_Id; + Scop : Entity_Id; + + begin + Nam := New_Reference_To (U.Entity, Standard_Location); + Scop := Scope (U.Entity); + + if Nkind (N) = N_Defining_Program_Unit_Name then + while Scop /= Standard_Standard loop + Nam := + Make_Expanded_Name (Standard_Location, + Chars => Chars (U.Entity), + Prefix => New_Reference_To (Scop, Standard_Location), + Selector_Name => Nam); + Set_Entity (Nam, U.Entity); + + Scop := Scope (Scop); + end loop; + end if; + + return Nam; + end Make_Unit_Name; + ----------------------- -- Output_Entity_Name -- ------------------------ @@ -763,11 +840,6 @@ package body Rtsfind is Save_Front_End_Inlining : Boolean; - function Check_CRT (Eid : Entity_Id) return Entity_Id; - -- Check entity Eid to ensure that configurable run-time restrictions - -- are met. May generate an error message and raise RE_Not_Available - -- if the entity E does not exist (i.e. Eid is Empty) - procedure Check_RPC; -- Reject programs that make use of distribution features not supported -- on the current target. On such targets (VMS, Vxworks, others?) we @@ -778,39 +850,6 @@ package body Rtsfind is -- This function is used when entity E is in this compilation's main -- unit. It gets the value from the already compiled declaration. - function Make_Unit_Name (N : Node_Id) return Node_Id; - -- If the unit is a child unit, build fully qualified name for use - -- in With_Clause. - - --------------- - -- Check_CRT -- - --------------- - - function Check_CRT (Eid : Entity_Id) return Entity_Id is - begin - if No (Eid) then - Entity_Not_Defined (E); - raise RE_Not_Available; - - -- Entity is available - - else - -- If in No_Run_Time mode and entity is not in one of the - -- specially permitted units, raise the exception. - - if No_Run_Time_Mode - and then not OK_No_Run_Time_Unit (U_Id) - then - Entity_Not_Defined (E); - raise RE_Not_Available; - end if; - - -- Otherwise entity is accessible - - return Eid; - end if; - end Check_CRT; - --------------- -- Check_RPC -- --------------- @@ -847,9 +886,9 @@ package body Rtsfind is end if; end Check_RPC; - ------------------------ - -- Find_System_Entity -- - ------------------------ + ----------------------- + -- Find_Local_Entity -- + ----------------------- function Find_Local_Entity (E : RE_Id) return Entity_Id is RE_Str : String renames RE_Id'Image (E); @@ -871,34 +910,6 @@ package body Rtsfind is return Ent; end Find_Local_Entity; - -------------------- - -- Make_Unit_Name -- - -------------------- - - function Make_Unit_Name (N : Node_Id) return Node_Id is - Nam : Node_Id; - Scop : Entity_Id; - - begin - Nam := New_Reference_To (U.Entity, Standard_Location); - Scop := Scope (U.Entity); - - if Nkind (N) = N_Defining_Program_Unit_Name then - while Scop /= Standard_Standard loop - Nam := - Make_Expanded_Name (Standard_Location, - Chars => Chars (U.Entity), - Prefix => New_Reference_To (Scop, Standard_Location), - Selector_Name => Nam); - Set_Entity (Nam, U.Entity); - - Scop := Scope (Scop); - end loop; - end if; - - return Nam; - end Make_Unit_Name; - -- Start of processing for RTE begin @@ -917,7 +928,7 @@ package body Rtsfind is and then Analyzed (Main_Unit_Entity) and then not Is_Child_Unit (Main_Unit_Entity) then - return Check_CRT (Find_Local_Entity (E)); + return Check_CRT (E, Find_Local_Entity (E)); end if; Save_Front_End_Inlining := Front_End_Inlining; @@ -947,16 +958,16 @@ package body Rtsfind is -- First we search the package entity chain - Pkg_Ent := First_Entity (U.Entity); - while Present (Pkg_Ent) loop - if Ename = Chars (Pkg_Ent) then - RE_Table (E) := Pkg_Ent; - Check_RPC; - goto Found; - end if; + Pkg_Ent := First_Entity (U.Entity); + while Present (Pkg_Ent) loop + if Ename = Chars (Pkg_Ent) then + RE_Table (E) := Pkg_Ent; + Check_RPC; + goto Found; + end if; - Next_Entity (Pkg_Ent); - end loop; + Next_Entity (Pkg_Ent); + end loop; -- If we did not find the entity in the package entity chain, -- then check if the package entity itself matches. Note that @@ -979,7 +990,7 @@ package body Rtsfind is -- a WITH if the current unit is part of the extended main code -- unit, and if we have not already added the with. The WITH is -- added to the appropriate unit (the current one). We do not need - -- to generate a WITH for an ???? + -- to generate a WITH for a call issued from RTE_Available. <<Found>> if (not U.Withed) @@ -999,7 +1010,7 @@ package body Rtsfind is Make_With_Clause (Standard_Location, Name => Make_Unit_Name - (Defining_Unit_Name (Specification (Lib_Unit)))); + (E, Defining_Unit_Name (Specification (Lib_Unit)))); Set_Library_Unit (Withn, Cunit (U.Unum)); Set_Corresponding_Spec (Withn, U.Entity); Set_First_Name (Withn, True); @@ -1012,7 +1023,7 @@ package body Rtsfind is end if; Front_End_Inlining := Save_Front_End_Inlining; - return Check_CRT (RE_Table (E)); + return Check_CRT (E, RE_Table (E)); end RTE; ------------------- @@ -1047,6 +1058,140 @@ package body Rtsfind is return False; end RTE_Available; + -------------------------- + -- RTE_Record_Component -- + -------------------------- + + function RTE_Record_Component (E : RE_Id) return Entity_Id is + U_Id : constant RTU_Id := RE_Unit_Table (E); + U : RT_Unit_Table_Record renames RT_Unit_Table (U_Id); + E1 : Entity_Id; + Ename : Name_Id; + Lib_Unit : Node_Id; + Pkg_Ent : Entity_Id; + + -- The following flag is used to disable front-end inlining when + -- RTE_Record_Component is invoked. This prevents the analysis of other + -- runtime bodies when a particular spec is loaded through Rtsfind. This + -- is both efficient, and it prevents spurious visibility conflicts + -- between use-visible user entities, and entities in run-time packages. + + -- In configurable run-time mode, subprograms marked Inlined_Always must + -- be inlined, so in the case we retain the Front_End_Inlining mode. + + Save_Front_End_Inlining : Boolean; + + begin + -- Note: Contrary to subprogram RTE, there is no need to do any special + -- management with package system.ads because it has no record type + -- declarations. + + Save_Front_End_Inlining := Front_End_Inlining; + Front_End_Inlining := Configurable_Run_Time_Mode; + + -- Load unit if unit not previously loaded + + if not Present (U.Entity) then + Load_RTU (U_Id, Id => E); + end if; + + Lib_Unit := Unit (Cunit (U.Unum)); + + pragma Assert (Nkind (Lib_Unit) = N_Package_Declaration); + Ename := RE_Chars (E); + + -- Search the entity in the components of record type declarations + -- found in the package entity chain. + + Pkg_Ent := First_Entity (U.Entity); + Search : while Present (Pkg_Ent) loop + if Is_Record_Type (Pkg_Ent) then + E1 := First_Entity (Pkg_Ent); + while Present (E1) loop + if Ename = Chars (E1) then + exit Search; + end if; + + Next_Entity (E1); + end loop; + end if; + + Next_Entity (Pkg_Ent); + end loop Search; + + -- If we didn't find the entity we want, something is wrong. The + -- appropriate action will be taken by Check_CRT when we exit. + + -- Cenerate a with-clause if the current unit is part of the extended + -- main code unit, and if we have not already added the with. The clause + -- is added to the appropriate unit (the current one). We do not need to + -- generate it for a call issued from RTE_Component_Available. + + if (not U.Withed) + and then + In_Extended_Main_Code_Unit (Cunit_Entity (Current_Sem_Unit)) + and then not RTE_Available_Call + then + U.Withed := True; + + declare + Withn : Node_Id; + Lib_Unit : Node_Id; + + begin + Lib_Unit := Unit (Cunit (U.Unum)); + Withn := + Make_With_Clause (Standard_Location, + Name => + Make_Unit_Name + (E, Defining_Unit_Name (Specification (Lib_Unit)))); + Set_Library_Unit (Withn, Cunit (U.Unum)); + Set_Corresponding_Spec (Withn, U.Entity); + Set_First_Name (Withn, True); + Set_Implicit_With (Withn, True); + + Mark_Rewrite_Insertion (Withn); + Append (Withn, Context_Items (Cunit (Current_Sem_Unit))); + Check_Restriction_No_Dependence (Name (Withn), Current_Error_Node); + end; + end if; + + Front_End_Inlining := Save_Front_End_Inlining; + return Check_CRT (E, E1); + end RTE_Record_Component; + + ------------------------------------ + -- RTE_Record_Component_Available -- + ------------------------------------ + + function RTE_Record_Component_Available (E : RE_Id) return Boolean is + Dummy : Entity_Id; + pragma Warnings (Off, Dummy); + + Result : Boolean; + + Save_RTE_Available_Call : constant Boolean := RTE_Available_Call; + Save_RTE_Is_Available : constant Boolean := RTE_Is_Available; + -- These are saved recursively because the call to load a unit + -- caused by an upper level call may perform a recursive call + -- to this routine during analysis of the corresponding unit. + + begin + RTE_Available_Call := True; + RTE_Is_Available := True; + Dummy := RTE_Record_Component (E); + Result := RTE_Is_Available; + RTE_Available_Call := Save_RTE_Available_Call; + RTE_Is_Available := Save_RTE_Is_Available; + return Result; + + exception + when RE_Not_Available => + RTE_Available_Call := Save_RTE_Available_Call; + RTE_Is_Available := Save_RTE_Is_Available; + return False; + end RTE_Record_Component_Available; + ------------------- -- RTE_Error_Msg -- ------------------- @@ -1069,6 +1214,15 @@ package body Rtsfind is end RTE_Error_Msg; ---------------- + -- RTU_Entity -- + ---------------- + + function RTU_Entity (U : RTU_Id) return Entity_Id is + begin + return RT_Unit_Table (U).Entity; + end RTU_Entity; + + ---------------- -- RTU_Loaded -- ---------------- diff --git a/gcc/ada/s-finimp.adb b/gcc/ada/s-finimp.adb index 518c9984900..4047436e89b 100644 --- a/gcc/ada/s-finimp.adb +++ b/gcc/ada/s-finimp.adb @@ -168,7 +168,7 @@ package body System.Finalization_Implementation is Nb_Link : Short_Short_Integer) is begin - -- Simple case: attachement to a one way list + -- Simple case: attachment to a one way list if Nb_Link = 1 then Obj.Next := L; @@ -176,7 +176,7 @@ package body System.Finalization_Implementation is -- Dynamically allocated objects: they are attached to a doubly linked -- list, so that an element can be finalized at any moment by means of - -- an unchecked deallocation. Attachement is protected against + -- an unchecked deallocation. Attachment is protected against -- multi-threaded access. elsif Nb_Link = 2 then @@ -203,7 +203,7 @@ package body System.Finalization_Implementation is raise; end Locked_Processing; - -- Attachement of arrays to the final list (used only for objects + -- Attachment of arrays to the final list (used only for objects -- returned by function). Obj, in this case is the last element, -- but all other elements are already threaded after it. We just -- attach the rest of the final list at the end of the array list. @@ -231,32 +231,6 @@ package body System.Finalization_Implementation is end Attach_To_Final_List; --------------------- - -- Deep_Tag_Adjust -- - --------------------- - - procedure Deep_Tag_Adjust - (L : in out SFR.Finalizable_Ptr; - A : System.Address; - B : Short_Short_Integer) - is - V : constant SFR.Finalizable_Ptr := To_Finalizable_Ptr (A); - Controller : constant RC_Ptr := Get_Deep_Controller (A); - - begin - if Controller /= null then - Adjust (Controller.all); - Attach_To_Final_List (L, Controller.all, B); - end if; - - -- Is controlled - - if V.all in Finalizable then - Adjust (V.all); - Attach_To_Final_List (L, Finalizable (V.all), 1); - end if; - end Deep_Tag_Adjust; - - --------------------- -- Deep_Tag_Attach -- ---------------------- @@ -280,74 +254,6 @@ package body System.Finalization_Implementation is end if; end Deep_Tag_Attach; - ----------------------- - -- Deep_Tag_Finalize -- - ----------------------- - - procedure Deep_Tag_Finalize - (L : in out SFR.Finalizable_Ptr; - A : System.Address; - B : Boolean) - is - pragma Warnings (Off, L); - - V : constant SFR.Finalizable_Ptr := To_Finalizable_Ptr (A); - Controller : constant RC_Ptr := Get_Deep_Controller (A); - - begin - if Controller /= null then - if B then - Finalize_One (Controller.all); - else - Finalize (Controller.all); - end if; - end if; - - -- Is controlled - - if V.all in Finalizable then - if B then - Finalize_One (V.all); - else - Finalize (V.all); - end if; - end if; - end Deep_Tag_Finalize; - - ------------------------- - -- Deep_Tag_Initialize -- - ------------------------- - - procedure Deep_Tag_Initialize - (L : in out SFR.Finalizable_Ptr; - A : System.Address; - B : Short_Short_Integer) - is - V : constant SFR.Finalizable_Ptr := To_Finalizable_Ptr (A); - Controller : constant RC_Ptr := Get_Deep_Controller (A); - - begin - -- This procedure should not be called if the object has no - -- controlled components - - if Controller = null then - raise Program_Error; - - -- Has controlled components - - else - Initialize (Controller.all); - Attach_To_Final_List (L, Controller.all, B); - end if; - - -- Is controlled - - if V.all in Finalizable then - Initialize (V.all); - Attach_To_Final_List (Controller.F, Finalizable (Controller.all), 1); - end if; - end Deep_Tag_Initialize; - ----------------------------- -- Detach_From_Final_List -- ----------------------------- @@ -441,7 +347,7 @@ package body System.Finalization_Implementation is -- programs using controlled types heavily. if System.Restrictions.Abort_Allowed then - X := To_Ptr (System.Soft_Links.Get_Current_Excep.all).Id; + X := To_Ptr (SSL.Get_Current_Excep.all).Id; end if; while P /= null loop @@ -554,6 +460,34 @@ package body System.Finalization_Implementation is Object.My_Address := Object'Address; end Initialize; + --------------------- + -- Move_Final_List -- + --------------------- + + procedure Move_Final_List + (From : in out SFR.Finalizable_Ptr; + To : Finalizable_Ptr_Ptr) + is + begin + -- This is currently called at the end of the return statement, and the + -- caller does NOT defer aborts. We need to defer aborts to prevent + -- mangling the finalization lists. + + SSL.Abort_Defer.all; + + -- Put the return statement's finalization list onto the caller's one, + -- thus transferring responsibility for finalization of the return + -- object to the caller. + + Attach_To_Final_List (To.all, From.all, Nb_Link => 3); + + -- Empty the return statement's finalization list, so that when the + -- cleanup code executes, there will be nothing to finalize. + From := null; + + SSL.Abort_Undefer.all; + end Move_Final_List; + ------------------------- -- Raise_From_Finalize -- ------------------------- diff --git a/gcc/ada/s-finimp.ads b/gcc/ada/s-finimp.ads index 8366e956c99..f5bb1d27d32 100644 --- a/gcc/ada/s-finimp.ads +++ b/gcc/ada/s-finimp.ads @@ -6,7 +6,7 @@ -- -- -- S p e c -- -- -- --- Copyright (C) 1992-2006 Free Software Foundation, Inc. -- +-- Copyright (C) 1992-2006, 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- -- @@ -51,15 +51,15 @@ package System.Finalization_Implementation is Collection_Finalization_Started : constant SFR.Finalizable_Ptr := To_Finalizable_Ptr (SSE.To_Address (1)); - -- This is used to implement the rule in RM-4.8(10.2/2) that requires an + -- This is used to implement the rule in RM 4.8(10.2/2) that requires an -- allocator to raise Program_Error if the collection finalization has -- already started. See also Ada.Finalization.List_Controller. Finalize on -- List_Controller first sets the list to Collection_Finalization_Started, -- to indicate that finalization has started. An allocator will call -- Attach_To_Final_List, which checks for the special value and raises - -- Program_Error if appropriate. The value of - -- Collection_Finalization_Started must be different from 'Access of any - -- finalizable object, and different from null. See AI-280. + -- Program_Error if appropriate. The Collection_Finalization_Started value + -- must be different from 'Access of any finalizable object, and different + -- from null. See AI-280. Global_Final_List : SFR.Finalizable_Ptr; -- This list stores the controlled objects defined in library-level @@ -72,60 +72,52 @@ package System.Finalization_Implementation is (L : in out SFR.Finalizable_Ptr; Obj : in out SFR.Finalizable; Nb_Link : Short_Short_Integer); - -- Attach finalizable object Obj to the linked list L. Nb_Link controls - -- the number of link of the linked_list, and can be either 0 for no - -- attachement, 1 for simple linked lists or 2 for doubly linked lists - -- or even 3 for a simple attachement of a whole array of elements. - -- Attachement to a simply linked list is not protected against - -- concurrent access and should only be used in contexts where it - -- doesn't matter, such as for objects allocated on the stack. In the - -- case of an attachment on a doubly linked list, L must not be null - -- and Obj will be inserted AFTER the first element and the attachment - -- is protected against concurrent call. Typically used to attach to - -- a dynamically allocated object to a List_Controller (whose first - -- element is always a dummy element) + -- Attach finalizable object Obj to the linked list L. Nb_Link controls the + -- number of link of the linked_list, and is one of: 0 for no attachment, 1 + -- for simple linked lists or 2 for doubly linked lists or even 3 for a + -- simple attachment of a whole array of elements. Attachment to a simply + -- linked list is not protected against concurrent access and should only + -- be used in contexts where it doesn't matter, such as for objects + -- allocated on the stack. In the case of an attachment on a doubly linked + -- list, L must not be null and Obj will be inserted AFTER the first + -- element and the attachment is protected against concurrent call. + -- Typically used to attach to a dynamically allocated object to a + -- List_Controller (whose first element is always a dummy element) + + type Finalizable_Ptr_Ptr is access all SFR.Finalizable_Ptr; + -- A pointer to a finalization list. This is used as the type of the extra + -- implicit formal which are passed to build-in-place functions that return + -- controlled types (see Sem_Ch6). That extra formal is then passed on to + -- Move_Final_List (below). + + procedure Move_Final_List + (From : in out SFR.Finalizable_Ptr; + To : Finalizable_Ptr_Ptr); + -- Move all objects on From list to To list. This is used to implement + -- build-in-place function returns. The return object is initially placed + -- on a finalization list local to the return statement, in case the + -- return statement is left prematurely (due to raising an exception, + -- being aborted, or a goto or exit statement). Once the return statement + -- has completed successfully, Move_Final_List is called to move the + -- return object to the caller's finalization list. procedure Finalize_List (L : SFR.Finalizable_Ptr); -- Call Finalize on each element of the list L; procedure Finalize_One (Obj : in out SFR.Finalizable); - -- Call Finalize on Obj and remove its final list. + -- Call Finalize on Obj and remove its final list --------------------- -- Deep Procedures -- --------------------- - procedure Deep_Tag_Initialize - (L : in out SFR.Finalizable_Ptr; - A : System.Address; - B : Short_Short_Integer); - -- Generic initialize for tagged objects with controlled components. - -- A is the address of the object, L the finalization list when it needs - -- to be attached and B the attachement level (see Attach_To_Final_List). - - procedure Deep_Tag_Adjust - (L : in out SFR.Finalizable_Ptr; - A : System.Address; - B : Short_Short_Integer); - -- Generic adjust for tagged objects with controlled components. - -- A is the address of the object, L the finalization list when it needs - -- to be attached and B the attachement level (see Attach_To_Final_List). - - procedure Deep_Tag_Finalize - (L : in out SFR.Finalizable_Ptr; - A : System.Address; - B : Boolean); - -- Generic finalize for tagged objects with controlled components. - -- A is the address of the object, L the finalization list when it needs - -- to be attached and B the attachement level (see Attach_To_Final_List). - procedure Deep_Tag_Attach (L : in out SFR.Finalizable_Ptr; A : System.Address; B : Short_Short_Integer); - -- Generic attachement for tagged objects with controlled components. + -- Generic attachment for tagged objects with controlled components. -- A is the address of the object, L the finalization list when it needs - -- to be attached and B the attachement level (see Attach_To_Final_List). + -- to be attached and B the attachment level (see Attach_To_Final_List). ----------------------------- -- Record Controller Types -- @@ -141,11 +133,11 @@ package System.Finalization_Implementation is end record; procedure Initialize (Object : in out Limited_Record_Controller); - -- Does nothing. + -- Does nothing currently. procedure Finalize (Object : in out Limited_Record_Controller); - -- Finalize the controlled components of the enclosing record by - -- following the list starting at Object.F. + -- Finalize the controlled components of the enclosing record by following + -- the list starting at Object.F. type Record_Controller is new Limited_Record_Controller with record @@ -156,13 +148,13 @@ package System.Finalization_Implementation is -- Initialize the field My_Address to the Object'Address procedure Adjust (Object : in out Record_Controller); - -- Adjust the components and their finalization pointers by subtracting - -- by the offset of the target and the source addresses of the assignment. + -- Adjust the components and their finalization pointers by subtracting by + -- the offset of the target and the source addresses of the assignment. -- Inherit Finalize from Limited_Record_Controller procedure Detach_From_Final_List (Obj : in out SFR.Finalizable); - -- Remove the specified object from its Final list, which must be a - -- doubly linked list. + -- Remove the specified object from its Final list, which must be a doubly + -- linked list. end System.Finalization_Implementation; diff --git a/gcc/ada/s-taskin.ads b/gcc/ada/s-taskin.ads index a9b1812b7dc..ae6908dac49 100644 --- a/gcc/ada/s-taskin.ads +++ b/gcc/ada/s-taskin.ads @@ -364,10 +364,12 @@ package System.Tasking is ------------------------------------ type Activation_Chain is limited private; - -- Comment required ??? + -- Linked list of to-be-activated tasks, linked through + -- Activation_Link. The order of tasks on the list is irrelevant, because + -- the priority rules will ensure that they actually start activating in + -- priority order. type Activation_Chain_Access is access all Activation_Chain; - -- Comment required ??? type Task_Procedure_Access is access procedure (Arg : System.Address); @@ -651,11 +653,14 @@ package System.Tasking is -- Normally, a task starts out with internal master nesting level one -- larger than external master nesting level. It is incremented to one by -- Enter_Master, which is called in the task body only if the compiler - -- thinks the task may have dependent tasks. It is set to for the + -- thinks the task may have dependent tasks. It is set to 1 for the -- environment task, the level 2 is reserved for server tasks of the -- run-time system (the so called "independent tasks"), and the level 3 is - -- for the library level tasks. + -- for the library level tasks. Foreign threads which are detected by + -- the run-time have a level of 0, allowing these tasks to be easily + -- distinguished if needed. + Foreign_Task_Level : constant Master_Level := 0; Environment_Task_Level : constant Master_Level := 1; Independent_Task_Level : constant Master_Level := 2; Library_Task_Level : constant Master_Level := 3; @@ -1062,14 +1067,14 @@ package System.Tasking is private Null_Task : constant Task_Id := null; - type Activation_Chain is record + type Activation_Chain is limited record T_ID : Task_Id; end record; - pragma Volatile (Activation_Chain); - -- Activation_chain is an in-out parameter of initialization procedures - -- and it must be passed by reference because the init proc may terminate + -- Activation_Chain is an in-out parameter of initialization procedures and + -- it must be passed by reference because the init proc may terminate -- abnormally after creating task components, and these must be properly - -- registered for removal (Expunge_Unactivated_Tasks). + -- registered for removal (Expunge_Unactivated_Tasks). The "limited" forces + -- Activation_Chain to be a by-reference type; see RM-6.2(4). end System.Tasking; diff --git a/gcc/ada/s-tassta.adb b/gcc/ada/s-tassta.adb index e0a6c946348..d6fe66c1f4e 100644 --- a/gcc/ada/s-tassta.adb +++ b/gcc/ada/s-tassta.adb @@ -149,6 +149,9 @@ package body System.Tasking.Stages is -- trigger an automatic stack alignment suitable for GCC's assumptions if -- need be. + -- "Vulnerable_..." in the procedure names below means they must be called + -- with abort deferred. + procedure Vulnerable_Complete_Task (Self_ID : Task_Id); -- Complete the calling task. This procedure must be called with -- abort deferred. It should only be called by Complete_Task and @@ -520,9 +523,11 @@ package body System.Tasking.Stages is begin -- If Master is greater than the current master, it means that Master -- has already awaited its dependent tasks. This raises Program_Error, - -- by 4.8(10.3/2). See AI-280. + -- by 4.8(10.3/2). See AI-280. Ignore this check for foreign threads. - if Master > Self_ID.Master_Within then + if Self_ID.Master_of_Task /= Foreign_Task_Level + and then Master > Self_ID.Master_Within + then raise Program_Error with "create task after awaiting termination"; end if; @@ -877,6 +882,53 @@ package body System.Tasking.Stages is end if; end Free_Task; + --------------------------- + -- Move_Activation_Chain -- + --------------------------- + + procedure Move_Activation_Chain + (From, To : Activation_Chain_Access; + New_Master : Master_ID) + is + Self_ID : constant Task_Id := STPO.Self; + C : Task_Id; + + begin + pragma Debug + (Debug.Trace (Self_ID, "Move_Activation_Chain", 'C')); + + -- Nothing to do if From is empty, and we can check that without + -- deferring aborts. + + C := From.all.T_ID; + + if C = null then + return; + end if; + + Initialization.Defer_Abort (Self_ID); + + -- Loop through the From chain, changing their Master_of_Task + -- fields, and to find the end of the chain. + + loop + C.Master_of_Task := New_Master; + exit when C.Common.Activation_Link = null; + C := C.Common.Activation_Link; + end loop; + + -- Hook From in at the start of To + + C.Common.Activation_Link := To.all.T_ID; + To.all.T_ID := From.all.T_ID; + + -- Set From to empty + + From.all.T_ID := null; + + Initialization.Undefer_Abort (Self_ID); + end Move_Activation_Chain; + ------------------ -- Task_Wrapper -- ------------------ @@ -1407,7 +1459,7 @@ package body System.Tasking.Stages is C := All_Tasks_List; while C /= null loop - if C.Common.Activator = Self_ID then + if C.Common.Activator = Self_ID and then C.Master_of_Task = CM then return False; end if; @@ -1449,13 +1501,24 @@ package body System.Tasking.Stages is -- zero for new tasks, and the task should not exit the -- sleep-loops that use this count until the count reaches zero. + -- While we're counting, if we run across any unactivated tasks that + -- belong to this master, we summarily terminate them as required by + -- RM-9.2(6). + Lock_RTS; Write_Lock (Self_ID); C := All_Tasks_List; while C /= null loop - if C.Common.Activator = Self_ID then + + -- Terminate unactivated (never-to-be activated) tasks + + if C.Common.Activator = Self_ID and then C.Master_of_Task = CM then pragma Assert (C.Common.State = Unactivated); + -- Usually, C.Common.Activator = Self_ID implies C.Master_of_Task + -- = CM. The only case where C is pending activation by this + -- task, but the master of C is not CM is in Ada 2005, when C is + -- part of a return object of a build-in-place function. Write_Lock (C); C.Common.Activator := null; @@ -1465,6 +1528,8 @@ package body System.Tasking.Stages is Unlock (C); end if; + -- Count it if dependent on this master + if C.Common.Parent = Self_ID and then C.Master_of_Task = CM then Write_Lock (C); @@ -1733,9 +1798,9 @@ package body System.Tasking.Stages is -- Complete the calling task - -- This procedure must be called with abort deferred. (That's why the - -- name has "Vulnerable" in it.) It should only be called by Complete_Task - -- and Finalize_Global_Tasks (for the environment task). + -- This procedure must be called with abort deferred. It should only be + -- called by Complete_Task and Finalize_Global_Tasks (for the environment + -- task). -- The effect is similar to that of Complete_Master. Differences include -- the closing of entries here, and computation of the number of active diff --git a/gcc/ada/s-tassta.ads b/gcc/ada/s-tassta.ads index 6fc8c8ccc9e..03abca42d8b 100644 --- a/gcc/ada/s-tassta.ads +++ b/gcc/ada/s-tassta.ads @@ -6,7 +6,7 @@ -- -- -- S p e c -- -- -- --- Copyright (C) 1992-2005, Free Software Foundation, Inc. -- +-- Copyright (C) 1992-2006, Free Software Foundation, Inc. -- -- -- -- GNARL 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- -- @@ -143,6 +143,8 @@ package System.Tasking.Stages is -- it is not needed if priority-based scheduling is supported, since all -- the activated tasks synchronize on the activators lock before they -- start activating and so they should start activating in priority order. + -- ??? Actually, the body of this package DOES reverse the chain, so I + -- don't understand the above comment. procedure Complete_Activation; -- Compiler interface only. Do not call from within the RTS. @@ -255,6 +257,22 @@ package System.Tasking.Stages is -- if T has terminated. Do nothing in the other case. It is called from -- Unchecked_Deallocation, for objects that are or contain tasks. + procedure Move_Activation_Chain + (From, To : Activation_Chain_Access; + New_Master : Master_ID); + -- Compiler interface only. Do not call from within the RTS. + -- Move all tasks on From list to To list, and change their Master_of_Task + -- to be New_Master. This is used to implement build-in-place function + -- returns. Tasks that are part of the return object are initially placed + -- on an activation chain local to the return statement, and their master + -- is the return statement, in case the return statement is left + -- prematurely (due to raising an exception, being aborted, or a goto or + -- exit statement). Once the return statement has completed successfully, + -- Move_Activation_Chain is called to move them to the caller's activation + -- chain, and change their master to the one passed in by the caller. If + -- that doesn't happen, they will never be activated, and will become + -- terminated on leaving the return statement. + function Terminated (T : Task_Id) return Boolean; -- This is called by the compiler to implement the 'Terminated attribute. -- Though is not required to be so by the ARM, we choose to synchronize diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb index 4d8fdb2aa4c..8fc23c2b3e1 100644 --- a/gcc/ada/sem_ch6.adb +++ b/gcc/ada/sem_ch6.adb @@ -124,11 +124,6 @@ package body Sem_Ch6 is -- If proper warnings are enabled and the subprogram contains a construct -- that cannot be inlined, the offending construct is flagged accordingly. - type Conformance_Type is - (Type_Conformant, Mode_Conformant, Subtype_Conformant, Fully_Conformant); - -- Conformance type used for following call, meaning matches the - -- RM definitions of the corresponding terms. - procedure Check_Conformance (New_Id : Entity_Id; Old_Id : Entity_Id; @@ -177,15 +172,6 @@ package body Sem_Ch6 is -- True otherwise. Proc is the entity for the procedure case and is used -- in posting the warning message. - function Conforming_Types - (T1 : Entity_Id; - T2 : Entity_Id; - Ctype : Conformance_Type; - Get_Inst : Boolean := False) return Boolean; - -- Check that two formal parameter types conform, checking both for - -- equality of base types, and where required statically matching - -- subtypes, depending on the setting of Ctype. - procedure Enter_Overloaded_Entity (S : Entity_Id); -- This procedure makes S, a new overloaded entity, into the first visible -- entity with that name. @@ -367,7 +353,7 @@ package body Sem_Ch6 is begin Generate_Definition (Designator); - Set_Is_Abstract (Designator); + Set_Is_Abstract_Subprogram (Designator); New_Overloaded_Entity (Designator); Check_Delayed_Subprogram (Designator); @@ -638,41 +624,6 @@ package body Sem_Ch6 is end; end if; - -- ???Check for not-yet-implemented cases of AI-318. Currently we - -- warn, because that's convenient for our own use. We might want to - -- change these warnings to errors at some point. This will go away - -- once AI-318 is fully implemented. - -- - -- In the first version, we plan not to implement limited function - -- returns when the result type contains tasks or protected objects, - -- and when the result subtype is unconstrained. - - if Ada_Version >= Ada_05 - and then not Debug_Flag_Dot_L - and then Is_Inherently_Limited_Type (R_Type) - then - if Has_Task (R_Type) then - Error_Msg_N ("(Ada 2005) return of task objects" & - " is not yet implemented", N); - end if; - - if Is_Controlled (R_Type) - or else Has_Controlled_Component (R_Type) - then - Error_Msg_N - ("(Ada 2005) return of limited controlled objects" & - " is not yet implemented", N); - end if; - - if - Is_Composite_Type (R_Type) and then not Is_Constrained (R_Type) - then - Error_Msg_N - ("(Ada 2005) return of unconstrained limited composite objects" & - " is not yet implemented", N); - end if; - end if; - if Present (Expr) and then Present (Etype (Expr)) -- Could be False in case of errors. then @@ -1373,7 +1324,9 @@ package body Sem_Ch6 is -- subprogram declaration for it, in order to attach the body to inline. procedure Copy_Parameter_List (Plist : List_Id); - -- Comment required ??? + -- Utility to create a parameter profile for a new subprogram spec, + -- when the subprogram has a body that acts as spec. This is done for + -- some cases of inlining, and for private protected ops. procedure Verify_Overriding_Indicator; -- If there was a previous spec, the entity has been entered in the @@ -1767,7 +1720,7 @@ package body Sem_Ch6 is Set_Is_Compilation_Unit (Body_Id, Is_Compilation_Unit (Spec_Id)); Set_Is_Child_Unit (Body_Id, Is_Child_Unit (Spec_Id)); - if Is_Abstract (Spec_Id) then + if Is_Abstract_Subprogram (Spec_Id) then Error_Msg_N ("an abstract subprogram cannot have a body", N); return; else @@ -1843,36 +1796,6 @@ package body Sem_Ch6 is (Etype (First_Entity (Spec_Id)))); end if; - -- Ada 2005: A formal that is an access parameter may have a - -- designated type imported through a limited_with clause, while - -- the body has a regular with clause. Update the types of the - -- formals accordingly, so that the non-limited view of each type - -- is available in the body. We have already verified that the - -- declarations are type-conformant. - - if Ada_Version >= Ada_05 then - declare - F_Spec : Entity_Id; - F_Body : Entity_Id; - - begin - F_Spec := First_Formal (Spec_Id); - F_Body := First_Formal (Body_Id); - - while Present (F_Spec) loop - if Ekind (Etype (F_Spec)) = E_Anonymous_Access_Type - and then - From_With_Type (Designated_Type (Etype (F_Spec))) - then - Set_Etype (F_Spec, Etype (F_Body)); - end if; - - Next_Formal (F_Spec); - Next_Formal (F_Body); - end loop; - end; - end if; - -- Now make the formals visible, and place subprogram -- on scope stack. @@ -2296,7 +2219,7 @@ package body Sem_Ch6 is end if; if Is_Interface (Etyp) - and then not Is_Abstract (Designator) + and then not Is_Abstract_Subprogram (Designator) and then not (Ekind (Designator) = E_Procedure and then Null_Present (Specification (N))) then @@ -2441,7 +2364,7 @@ package body Sem_Ch6 is -- interface types the following error message will be reported later -- (see Analyze_Subprogram_Declaration). - if Is_Abstract (Etype (Designator)) + if Is_Abstract_Type (Etype (Designator)) and then not Is_Interface (Etype (Designator)) and then Nkind (Parent (N)) /= N_Abstract_Subprogram_Declaration @@ -2449,7 +2372,8 @@ package body Sem_Ch6 is /= N_Formal_Abstract_Subprogram_Declaration and then (Nkind (Parent (N)) /= N_Subprogram_Renaming_Declaration or else not Is_Entity_Name (Name (Parent (N))) - or else not Is_Abstract (Entity (Name (Parent (N))))) + or else not Is_Abstract_Subprogram + (Entity (Name (Parent (N))))) then Error_Msg_N ("function that returns abstract type must be abstract", N); @@ -2464,7 +2388,7 @@ package body Sem_Ch6 is -------------------------- procedure Build_Body_To_Inline (N : Node_Id; Subp : Entity_Id) is - Decl : constant Node_Id := Unit_Declaration_Node (Subp); + Decl : constant Node_Id := Unit_Declaration_Node (Subp); Original_Body : Node_Id; Body_To_Analyze : Node_Id; Max_Size : constant := 10; @@ -2479,24 +2403,24 @@ package body Sem_Ch6 is -- elementary statements, as a measure of acceptable size. function Has_Pending_Instantiation return Boolean; - -- If some enclosing body contains instantiations that appear before - -- the corresponding generic body, the enclosing body has a freeze node - -- so that it can be elaborated after the generic itself. This might + -- If some enclosing body contains instantiations that appear before the + -- corresponding generic body, the enclosing body has a freeze node so + -- that it can be elaborated after the generic itself. This might -- conflict with subsequent inlinings, so that it is unsafe to try to -- inline in such a case. function Has_Single_Return return Boolean; - -- In general we cannot inline functions that return unconstrained - -- type. However, we can handle such functions if all return statements - -- return a local variable that is the only declaration in the body - -- of the function. In that case the call can be replaced by that - -- local variable as is done for other inlined calls. + -- In general we cannot inline functions that return unconstrained type. + -- However, we can handle such functions if all return statements return + -- a local variable that is the only declaration in the body of the + -- function. In that case the call can be replaced by that local + -- variable as is done for other inlined calls. procedure Remove_Pragmas; - -- A pragma Unreferenced that mentions a formal parameter has no - -- meaning when the body is inlined and the formals are rewritten. - -- Remove it from body to inline. The analysis of the non-inlined body - -- will handle the pragma properly. + -- A pragma Unreferenced that mentions a formal parameter has no meaning + -- when the body is inlined and the formals are rewritten. Remove it + -- from body to inline. The analysis of the non-inlined body will handle + -- the pragma properly. function Uses_Secondary_Stack (Bod : Node_Id) return Boolean; -- If the body of the subprogram includes a call that returns an @@ -3462,7 +3386,7 @@ package body Sem_Ch6 is -- are left by an erroneous overriding. if not Is_Predefined_Dispatching_Operation (Prim_Op) - and then not Is_Abstract (Prim_Op) + and then not Is_Abstract_Subprogram (Prim_Op) and then Chars (Prim_Op) = Chars (Op) and then Type_Conformant (Prim_Op, Op) and then Convention (Prim_Op) /= Convention (Op) @@ -3503,7 +3427,7 @@ package body Sem_Ch6 is -- of abstract primitives left from an erroneous overriding. if not Is_Predefined_Dispatching_Operation (Prim_Op) - and then not Is_Abstract (Prim_Op) + and then not Is_Abstract_Subprogram (Prim_Op) then Check_Convention (Op => Prim_Op, @@ -3550,7 +3474,9 @@ package body Sem_Ch6 is begin -- Never need to freeze abstract subprogram - if Is_Abstract (Designator) then + if Ekind (Designator) /= E_Subprogram_Type + and then Is_Abstract_Subprogram (Designator) + then null; else -- Need delayed freeze if return type itself needs a delayed @@ -3585,7 +3511,7 @@ package body Sem_Ch6 is if Is_Inherently_Limited_Type (Typ) then Set_Returns_By_Ref (Designator); - elsif Present (Utyp) and then Controlled_Type (Utyp) then + elsif Present (Utyp) and then CW_Or_Controlled_Type (Utyp) then Set_Returns_By_Ref (Designator); end if; end; @@ -3801,6 +3727,7 @@ package body Sem_Ch6 is if Nkind (Decl) = N_Subprogram_Body or else Nkind (Decl) = N_Subprogram_Body_Stub or else Nkind (Decl) = N_Subprogram_Declaration + or else Nkind (Decl) = N_Abstract_Subprogram_Declaration or else Nkind (Decl) = N_Subprogram_Renaming_Declaration then Spec := Specification (Decl); @@ -3819,15 +3746,41 @@ package body Sem_Ch6 is if Ekind (Subp) = E_Entry then Error_Msg_NE ("entry & overrides inherited operation #", Spec, Subp); + else Error_Msg_NE ("subprogram & overrides inherited operation #", Spec, Subp); end if; end if; + + -- If Subp is an operator, it may override a predefined operation. + -- In that case overridden_subp is empty because of our implicit + -- representation for predefined operators. We have to check whether + -- the signature of Subp matches that of a predefined operator. + -- Note that first argument provides the name of the operator, and + -- the second argument the signature that may match that of a standard + -- operation. + + elsif Nkind (Subp) = N_Defining_Operator_Symbol + and then Must_Not_Override (Spec) + then + if Operator_Matches_Spec (Subp, Subp) then + Error_Msg_NE + ("subprogram & overrides predefined operation ", + Spec, Subp); + end if; + else if Must_Override (Spec) then if Ekind (Subp) = E_Entry then Error_Msg_NE ("entry & is not overriding", Spec, Subp); + + elsif Nkind (Subp) = N_Defining_Operator_Symbol then + if not Operator_Matches_Spec (Subp, Subp) then + Error_Msg_NE + ("subprogram & is not overriding", Spec, Subp); + end if; + else Error_Msg_NE ("subprogram & is not overriding", Spec, Subp); end if; @@ -3936,7 +3889,6 @@ package body Sem_Ch6 is declare Arg : constant Node_Id := Original_Node (First_Actual (Last_Stm)); - begin if Nkind (Arg) = N_Attribute_Reference and then Attribute_Name (Arg) = Name_Identity @@ -4379,28 +4331,11 @@ package body Sem_Ch6 is -- treated recursively because they carry a signature. Are_Anonymous_Access_To_Subprogram_Types := - - -- Case 1: Anonymous access to subprogram types - - (Ekind (Type_1) = E_Anonymous_Access_Subprogram_Type - and then Ekind (Type_2) = E_Anonymous_Access_Subprogram_Type) - - -- Case 2: Anonymous access to PROTECTED subprogram types. In this - -- case the anonymous type_declaration has been replaced by an - -- occurrence of an internal access to subprogram type declaration - -- available through the Original_Access_Type attribute - - or else - (Ekind (Type_1) = E_Access_Protected_Subprogram_Type - and then Ekind (Type_2) = E_Access_Protected_Subprogram_Type - and then not Comes_From_Source (Type_1) - and then not Comes_From_Source (Type_2) - and then Present (Original_Access_Type (Type_1)) - and then Present (Original_Access_Type (Type_2)) - and then Ekind (Original_Access_Type (Type_1)) = - E_Anonymous_Access_Protected_Subprogram_Type - and then Ekind (Original_Access_Type (Type_2)) = - E_Anonymous_Access_Protected_Subprogram_Type); + Ekind (Type_1) = Ekind (Type_2) + and then + (Ekind (Type_1) = E_Anonymous_Access_Subprogram_Type + or else + Ekind (Type_1) = E_Anonymous_Access_Protected_Subprogram_Type); -- Test anonymous access type case. For this case, static subtype -- matching is required for mode conformance (RM 6.3.1(15)) @@ -4544,16 +4479,9 @@ package body Sem_Ch6 is EF : constant Entity_Id := Make_Defining_Identifier (Sloc (Assoc_Entity), Chars => New_External_Name (Chars (Assoc_Entity), - Suffix => Suffix)); + Suffix => Suffix)); begin - -- We never generate extra formals if expansion is not active - -- because we don't need them unless we are generating code. - - if not Expander_Active then - return Empty; - end if; - -- A little optimization. Never generate an extra formal for the -- _init operand of an initialization procedure, since it could -- never be used. @@ -4586,6 +4514,13 @@ package body Sem_Ch6 is -- Start of processing for Create_Extra_Formals begin + -- We never generate extra formals if expansion is not active + -- because we don't need them unless we are generating code. + + if not Expander_Active then + return; + end if; + -- If this is a derived subprogram then the subtypes of the parent -- subprogram's formal parameters will be used to to determine the need -- for extra formals. @@ -4601,7 +4536,7 @@ package body Sem_Ch6 is Next_Formal (Formal); end loop; - -- If Extra_formals where already created, don't do it again. This + -- If Extra_formals were already created, don't do it again. This -- situation may arise for subprogram types created as part of -- dispatching calls (see Expand_Dispatching_Call) @@ -4642,10 +4577,8 @@ package body Sem_Ch6 is end if; if Has_Discriminants (Formal_Type) - and then - ((not Is_Constrained (Formal_Type) - and then not Is_Indefinite_Subtype (Formal_Type)) - or else Present (Extra_Formal (Formal))) + and then not Is_Constrained (Formal_Type) + and then not Is_Indefinite_Subtype (Formal_Type) then Set_Extra_Constrained (Formal, @@ -4657,7 +4590,7 @@ package body Sem_Ch6 is -- Create extra formal for supporting accessibility checking -- This is suppressed if we specifically suppress accessibility - -- checks at the pacage level for either the subprogram, or the + -- checks at the package level for either the subprogram, or the -- package in which it resides. However, we do not suppress it -- simply if the scope has accessibility checks suppressed, since -- this could cause trouble when clients are compiled with a @@ -4687,63 +4620,110 @@ package body Sem_Ch6 is end if; end if; - if Present (P_Formal) then - Next_Formal (P_Formal); - end if; - -- This label is required when skipping extra formal generation for -- Unchecked_Union parameters. <<Skip_Extra_Formal_Generation>> + if Present (P_Formal) then + Next_Formal (P_Formal); + end if; + Next_Formal (Formal); end loop; -- Ada 2005 (AI-318-02): In the case of build-in-place functions, add - -- an extra formal that will be passed the address of the return object - -- within the caller. This is added as the last extra formal, but - -- eventually will be accompanied by other implicit formals related to - -- build-in-place functions (such as allocate/deallocate subprograms, - -- finalization list, constrained flag, task master, task activation - -- list, etc.). - - if Expander_Active - and then Ada_Version >= Ada_05 - and then Is_Build_In_Place_Function (E) - then + -- appropriate extra formals. See type Exp_Ch6.BIP_Formal_Kind. + + if Ada_Version >= Ada_05 and then Is_Build_In_Place_Function (E) then declare - Formal_Type : constant Entity_Id := - Create_Itype - (E_Anonymous_Access_Type, - E, Scope_Id => Scope (E)); - Result_Subt : constant Entity_Id := Etype (E); - Result_Addr_Formal : Entity_Id; + Result_Subt : constant Entity_Id := Etype (E); + + Discard : Entity_Id; + pragma Warnings (Off, Discard); begin - Set_Directly_Designated_Type (Formal_Type, Result_Subt); - Set_Etype (Formal_Type, Formal_Type); - Init_Size_Align (Formal_Type); - Set_Depends_On_Private - (Formal_Type, Has_Private_Component (Formal_Type)); - Set_Is_Public (Formal_Type, Is_Public (Scope (Formal_Type))); - Set_Is_Access_Constant (Formal_Type, False); - Set_Can_Never_Be_Null (Formal_Type); + -- In the case of functions with unconstrained result subtypes, + -- add a 3-state formal indicating whether the return object is + -- allocated by the caller (0), or should be allocated by the + -- callee on the secondary stack (1) or in the global heap (2). + -- For the moment we just use Natural for the type of this formal. + -- Note that this formal isn't needed in the case where the + -- result subtype is constrained. + + if not Is_Constrained (Result_Subt) then + Discard := + Add_Extra_Formal + (E, Standard_Natural, + E, BIP_Formal_Suffix (BIP_Alloc_Form)); + end if; - -- Ada 2005 (AI-50217): Propagate the attribute that indicates - -- the designated type comes from the limited view (for back-end - -- purposes). + -- In the case of functions whose result type has controlled + -- parts, we have an extra formal of type + -- System.Finalization_Implementation.Finalizable_Ptr_Ptr. That + -- is, we are passing a pointer to a finalization list (which is + -- itself a pointer). This extra formal is then passed along to + -- Move_Final_List in case of successful completion of a return + -- statement. We cannot pass an 'in out' parameter, because we + -- need to update the finalization list during an abort-deferred + -- region, rather than using copy-back after the function + -- returns. This is true even if we are able to get away with + -- having 'in out' parameters, which are normally illegal for + -- functions. + + if Is_Controlled (Result_Subt) + or else Has_Controlled_Component (Result_Subt) + then + Discard := + Add_Extra_Formal + (E, RTE (RE_Finalizable_Ptr_Ptr), + E, BIP_Formal_Suffix (BIP_Final_List)); + end if; + + -- If the result type contains tasks, we have two extra formals: + -- the master of the tasks to be created, and the caller's + -- activation chain. + + if Has_Task (Result_Subt) then + Discard := + Add_Extra_Formal + (E, RTE (RE_Master_Id), + E, BIP_Formal_Suffix (BIP_Master)); + Discard := + Add_Extra_Formal + (E, RTE (RE_Activation_Chain_Access), + E, BIP_Formal_Suffix (BIP_Activation_Chain)); + end if; - Set_From_With_Type (Formal_Type, From_With_Type (Result_Subt)); + -- All build-in-place functions get an extra formal that will be + -- passed the address of the return object within the caller. - Layout_Type (Formal_Type); + declare + Formal_Type : constant Entity_Id := + Create_Itype + (E_Anonymous_Access_Type, E, + Scope_Id => Scope (E)); + begin + Set_Directly_Designated_Type (Formal_Type, Result_Subt); + Set_Etype (Formal_Type, Formal_Type); + Init_Size_Align (Formal_Type); + Set_Depends_On_Private + (Formal_Type, Has_Private_Component (Formal_Type)); + Set_Is_Public (Formal_Type, Is_Public (Scope (Formal_Type))); + Set_Is_Access_Constant (Formal_Type, False); - Result_Addr_Formal := Add_Extra_Formal (E, Formal_Type, E, "RA"); + -- Ada 2005 (AI-50217): Propagate the attribute that indicates + -- the designated type comes from the limited view (for + -- back-end purposes). - -- For some reason the following is not effective and the - -- dereference of the formal within the function still gets - -- a check. ??? + Set_From_With_Type (Formal_Type, From_With_Type (Result_Subt)); - Set_Can_Never_Be_Null (Result_Addr_Formal); + Layout_Type (Formal_Type); + + Discard := + Add_Extra_Formal + (E, Formal_Type, E, BIP_Formal_Suffix (BIP_Object_Access)); + end; end; end if; end Create_Extra_Formals; @@ -4813,8 +4793,10 @@ package body Sem_Ch6 is -- Warn unless genuine overloading - if (not Is_Overloadable (E)) - or else Subtype_Conformant (E, S) + if (not Is_Overloadable (E) or else Subtype_Conformant (E, S)) + and then (Is_Immediately_Visible (E) + or else + Is_Potentially_Use_Visible (S)) then Error_Msg_Sloc := Sloc (E); Error_Msg_N ("declaration of & hides one#?", S); @@ -5698,7 +5680,7 @@ package body Sem_Ch6 is Remove (Decl); Set_Has_Completion (Op_Name); Set_Corresponding_Equality (Op_Name, S); - Set_Is_Abstract (Op_Name, Is_Abstract (S)); + Set_Is_Abstract_Subprogram (Op_Name, Is_Abstract_Subprogram (S)); end; end Make_Inequality_Operator; @@ -5827,7 +5809,7 @@ package body Sem_Ch6 is -- declarations because they don't have interface lists. if Nkind (Parent (Typ)) /= N_Full_Type_Declaration then - Collect_Synchronized_Interfaces (Typ, Ifaces_List); + Collect_Abstract_Interfaces (Typ, Ifaces_List); if not Is_Empty_Elmt_List (Ifaces_List) then Overridden_Subp := @@ -5900,22 +5882,14 @@ package body Sem_Ch6 is and then Visible_Part_Type (T) and then not In_Instance then - if Is_Abstract (T) - and then Is_Abstract (S) - and then (not Is_Overriding or else not Is_Abstract (E)) + if Is_Abstract_Type (T) + and then Is_Abstract_Subprogram (S) + and then (not Is_Overriding + or else not Is_Abstract_Subprogram (E)) then - if not Is_Interface (T) then - Error_Msg_N ("abstract subprograms must be visible " + Error_Msg_N ("abstract subprograms must be visible " & "('R'M 3.9.3(10))!", S); - -- Ada 2005 (AI-251) - - else - Error_Msg_N ("primitive subprograms of interface types " - & "declared in a visible part, must be declared in " - & "the visible part ('R'M 3.9.4)!", S); - end if; - elsif Ekind (S) = E_Function and then Is_Tagged_Type (T) and then T = Base_Type (Etype (S)) @@ -6609,6 +6583,12 @@ package body Sem_Ch6 is Formal_Type := Access_Definition (Related_Nod, Parameter_Type (Param_Spec)); + -- No need to continue if we already notified errors + + if not Present (Formal_Type) then + return; + end if; + -- Ada 2005 (AI-254) declare @@ -6619,7 +6599,7 @@ package body Sem_Ch6 is if Present (AD) and then Protected_Present (AD) then Formal_Type := Replace_Anonymous_Access_To_Protected_Subprogram - (Param_Spec, Formal_Type); + (Param_Spec); end if; end; end if; diff --git a/gcc/ada/sem_ch6.ads b/gcc/ada/sem_ch6.ads index 52b657080bc..f465c80debf 100644 --- a/gcc/ada/sem_ch6.ads +++ b/gcc/ada/sem_ch6.ads @@ -27,6 +27,12 @@ with Types; use Types; package Sem_Ch6 is + type Conformance_Type is + (Type_Conformant, Mode_Conformant, Subtype_Conformant, Fully_Conformant); + -- Conformance type used in conformance checks between specs and bodies, + -- and for overriding. The literals match the RM definitions of the + -- corresponding terms. + procedure Analyze_Abstract_Subprogram_Declaration (N : Node_Id); procedure Analyze_Extended_Return_Statement (N : Node_Id); procedure Analyze_Function_Call (N : Node_Id); @@ -39,7 +45,8 @@ package Sem_Ch6 is function Analyze_Subprogram_Specification (N : Node_Id) return Entity_Id; -- Analyze subprogram specification in both subprogram declarations - -- and body declarations. Returns the defining entity for the spec. + -- and body declarations. Returns the defining entity for the + -- specification N. procedure Cannot_Inline (Msg : String; N : Node_Id; Subp : Entity_Id); -- This procedure is called if the node N, an instance of a call to @@ -55,9 +62,9 @@ package Sem_Ch6 is -- their respective counterparts. procedure Check_Delayed_Subprogram (Designator : Entity_Id); - -- Designator can be a E_Subrpgram_Type, E_Procedure or E_Function. If a + -- Designator can be a E_Subprogram_Type, E_Procedure or E_Function. If a -- type in its profile depends on a private type without a full - -- declaration, indicate that the subprogram is delayed. + -- declaration, indicate that the subprogram or type is delayed. procedure Check_Discriminant_Conformance (N : Node_Id; @@ -112,6 +119,16 @@ package Sem_Ch6 is -- the flag being placed on the Err_Loc node if it is specified, and -- on the appropriate component of the New_Id construct if not. + function Conforming_Types + (T1 : Entity_Id; + T2 : Entity_Id; + Ctype : Conformance_Type; + Get_Inst : Boolean := False) return Boolean; + -- Check that the types of two formal parameters are conforming. In most + -- cases this is just a name comparison, but within an instance it involves + -- generic actual types, and in the presence of anonymous access types + -- it must examine the designated types. + procedure Create_Extra_Formals (E : Entity_Id); -- For each parameter of a subprogram or entry that requires an additional -- formal (such as for access parameters and indefinite discriminated |