diff options
author | Bob Duff <duff@adacore.com> | 2021-09-10 11:18:47 -0400 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2021-10-25 15:07:19 +0000 |
commit | 19e7eae5b917d782d20d59f3cbe3c344a06aafb7 (patch) | |
tree | 9ce172ecdff263011b199d8930143ca5fb481a51 /gcc/ada/einfo-utils.adb | |
parent | bb20000c9f7fbe58e6630196dbfdf0a2ac440c34 (diff) | |
download | gcc-19e7eae5b917d782d20d59f3cbe3c344a06aafb7.zip gcc-19e7eae5b917d782d20d59f3cbe3c344a06aafb7.tar.gz gcc-19e7eae5b917d782d20d59f3cbe3c344a06aafb7.tar.bz2 |
[Ada] Renamed_Or_Alias cleanup
gcc/ada/
* einfo-utils.ads, einfo-utils.adb (Alias, Set_Alias,
Renamed_Entity, Set_Renamed_Entity, Renamed_Object,
Set_Renamed_Object): Add assertions that reflect how these are
supposed to be used and what they are supposed to return.
(Renamed_Entity_Or_Object): New getter.
(Set_Renamed_Object_Of_Possibly_Void): Setter that allows N to
be E_Void.
* checks.adb (Ensure_Valid): Use Renamed_Entity_Or_Object
because this is called for both cases.
* exp_dbug.adb (Debug_Renaming_Declaration): Use
Renamed_Entity_Or_Object because this is called for both cases.
Add assertions.
* exp_util.adb (Possible_Bit_Aligned_Component): Likewise.
* freeze.adb (Freeze_All_Ent): Likewise.
* sem_ch5.adb (Within_Function): Likewise.
* exp_attr.adb (Calculate_Header_Size): Call Renamed_Entity
instead of Renamed_Object.
* exp_ch11.adb (Expand_N_Raise_Statement): Likewise.
* repinfo.adb (Find_Declaration): Likewise.
* sem_ch10.adb (Same_Unit, Process_Spec_Clauses,
Analyze_With_Clause, Install_Parents): Likewise.
* sem_ch12.adb (Build_Local_Package, Needs_Body_Instantiated,
Build_Subprogram_Renaming, Check_Formal_Package_Instance,
Check_Generic_Actuals, In_Enclosing_Instance,
Denotes_Formal_Package, Process_Nested_Formal,
Check_Initialized_Types, Map_Formal_Package_Entities,
Restore_Nested_Formal): Likewise.
* sem_ch6.adb (Report_Conflict): Likewise.
* sem_ch8.adb (Analyze_Exception_Renaming,
Analyze_Generic_Renaming, Analyze_Package_Renaming,
Is_Primitive_Operator_In_Use, Declared_In_Actual,
Note_Redundant_Use): Likewise.
* sem_warn.adb (Find_Package_Renaming): Likewise.
* sem_elab.adb (Ultimate_Variable): Call Renamed_Object instead
of Renamed_Entity.
* exp_ch6.adb (Get_Function_Id): Call
Set_Renamed_Object_Of_Possibly_Void, because the defining
identifer is still E_Void at this point.
* sem_util.adb (Function_Call_Or_Allocator_Level): Likewise.
Remove redundant (unreachable) code.
(Is_Object_Renaming, Is_Valid_Renaming): Call Renamed_Object
instead of Renamed_Entity.
(Get_Fullest_View): Call Renamed_Entity instead of
Renamed_Object.
(Copy_Node_With_Replacement): Call
Set_Renamed_Object_Of_Possibly_Void because the defining entity
is sometimes E_Void.
* exp_ch5.adb (Expand_N_Assignment_Statement): Protect a call to
Renamed_Object with Is_Object to avoid assertion failure.
* einfo.ads: Minor comment fixes.
* inline.adb: Minor comment fixes.
* tbuild.ads: Minor comment fixes.
Diffstat (limited to 'gcc/ada/einfo-utils.adb')
-rw-r--r-- | gcc/ada/einfo-utils.adb | 75 |
1 files changed, 69 insertions, 6 deletions
diff --git a/gcc/ada/einfo-utils.adb b/gcc/ada/einfo-utils.adb index 0c89c82..eb90d18 100644 --- a/gcc/ada/einfo-utils.adb +++ b/gcc/ada/einfo-utils.adb @@ -43,24 +43,87 @@ package body Einfo.Utils is -- Determine whether abstract state State_Id has particular option denoted -- by the name Option_Nam. - ----------------------------------- - -- Renamings of Renamed_Or_Alias -- - ----------------------------------- + ------------------------------------------- + -- Aliases/Renamings of Renamed_Or_Alias -- + ------------------------------------------- function Alias (N : Entity_Id) return Node_Id is begin - pragma Assert - (Is_Overloadable (N) or else Ekind (N) = E_Subprogram_Type); - return Renamed_Or_Alias (N); + return Val : constant Node_Id := Renamed_Or_Alias (N) do + pragma Assert + (Is_Overloadable (N) or else Ekind (N) = E_Subprogram_Type); + pragma Assert (Val in N_Entity_Id | N_Empty_Id); + end return; end Alias; procedure Set_Alias (N : Entity_Id; Val : Node_Id) is begin pragma Assert (Is_Overloadable (N) or else Ekind (N) = E_Subprogram_Type); + pragma Assert (Val in N_Entity_Id | N_Empty_Id); + Set_Renamed_Or_Alias (N, Val); end Set_Alias; + function Renamed_Entity (N : Entity_Id) return Node_Id is + begin + return Val : constant Node_Id := Renamed_Or_Alias (N) do + pragma Assert (not Is_Object (N) or else Etype (N) = Any_Type); + pragma Assert (Val in N_Entity_Id | N_Empty_Id); + end return; + end Renamed_Entity; + + procedure Set_Renamed_Entity (N : Entity_Id; Val : Node_Id) is + begin + pragma Assert (not Is_Object (N)); + pragma Assert (Val in N_Entity_Id); + + Set_Renamed_Or_Alias (N, Val); + end Set_Renamed_Entity; + + function Renamed_Object (N : Entity_Id) return Node_Id is + begin + return Val : constant Node_Id := Renamed_Or_Alias (N) do + -- Formal_Kind uses the entity, not a name of it. This happens + -- in front-end inlining, which also sets to Empty. Also in + -- Exp_Ch9, where formals are renamed for the benefit of gdb. + + if Ekind (N) not in Formal_Kind then + pragma Assert (Is_Object (N)); + pragma Assert (Val in N_Subexpr_Id | N_Empty_Id); + null; + end if; + end return; + end Renamed_Object; + + procedure Set_Renamed_Object (N : Entity_Id; Val : Node_Id) is + begin + if Ekind (N) not in Formal_Kind then + pragma Assert (Is_Object (N)); + pragma Assert (Val in N_Subexpr_Id | N_Empty_Id); + null; + end if; + + Set_Renamed_Or_Alias (N, Val); + end Set_Renamed_Object; + + function Renamed_Entity_Or_Object (N : Entity_Id) return Node_Id is + begin + if Is_Object (N) then + return Renamed_Object (N); + else + return Renamed_Entity (N); + end if; + end Renamed_Entity_Or_Object; + + procedure Set_Renamed_Object_Of_Possibly_Void + (N : Entity_Id; Val : Node_Id) + is + begin + pragma Assert (Val in N_Subexpr_Id); + Set_Renamed_Or_Alias (N, Val); + end Set_Renamed_Object_Of_Possibly_Void; + ---------------- -- Has_Option -- ---------------- |