https://gcc.gnu.org/g:710789117374d335184590950280ad0c5bb70fbe
commit r15-6637-g710789117374d335184590950280ad0c5bb70fbe Author: Steve Baird <ba...@adacore.com> Date: Tue Dec 17 13:27:04 2024 -0800 ada: Improved checking of uses of package renamings In some cases, the RM 8.5.1(3.1) legality rule about uses of renamings of limited views of packages was implemented incorrectly, resulting in rejecting legal uses. gcc/ada/ChangeLog: * gen_il-fields.ads: add new Renames_Limited_View field. * gen_il-gen-gen_entities.adb: add Renames_Limited_View flag for packages. * einfo.ads: add comment documenting Renames_Limited_View flag. * sem_ch8.adb (Analyze_Package_Renaming): Set new Renames_Limited_View flag. Test new Renames_Limited_View flag instead of calling Has_Limited_With. If Has_Limited_With is True, that just means that somebody, sometime during this compilation needed to reference the limited view of the package; so that function returns True too often to be used here. (Find_Expanded_Name): Test new Renames_Limited_View flag instead of calling Has_Limited_With. Diff: --- gcc/ada/einfo.ads | 9 +++++++++ gcc/ada/gen_il-fields.ads | 1 + gcc/ada/gen_il-gen-gen_entities.adb | 1 + gcc/ada/sem_ch8.adb | 7 ++++--- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/gcc/ada/einfo.ads b/gcc/ada/einfo.ads index 1946e68b3c76..a7c0584d8da4 100644 --- a/gcc/ada/einfo.ads +++ b/gcc/ada/einfo.ads @@ -4247,6 +4247,15 @@ package Einfo is -- within an accept statement. For all remaining cases (discriminants, -- loop parameters) the field is Empty. +-- Renames_Limited_View +-- Defined in package entities. True for a package renaming if either +-- a) the renamed package is not itself a renaming, and the renaming +-- denotes a limited view of the renamed package (as seen at the +-- point of the renaming declaration, as opposed to later on when +-- the renaming is referenced); or +-- b) the renamed package is itself a renaming and the +-- Renames_Limited_View flag is True for the renamed package. + -- Requires_Overriding -- Defined in all subprograms and entries. Set for subprograms that -- require overriding as defined by RM-2005-3.9.3(6/2). Note that this diff --git a/gcc/ada/gen_il-fields.ads b/gcc/ada/gen_il-fields.ads index c778f00856d4..fe2da80c5488 100644 --- a/gcc/ada/gen_il-fields.ads +++ b/gcc/ada/gen_il-fields.ads @@ -879,6 +879,7 @@ package Gen_IL.Fields is Relative_Deadline_Variable, Renamed_In_Spec, Renamed_Or_Alias, -- Shared among Alias, Renamed_Entity, Renamed_Object + Renames_Limited_View, Requires_Overriding, Return_Applies_To, Return_Present, diff --git a/gcc/ada/gen_il-gen-gen_entities.adb b/gcc/ada/gen_il-gen-gen_entities.adb index 8cf66b2611df..3df1f8e72844 100644 --- a/gcc/ada/gen_il-gen-gen_entities.adb +++ b/gcc/ada/gen_il-gen-gen_entities.adb @@ -1281,6 +1281,7 @@ begin -- Gen_IL.Gen.Gen_Entities Sm (Related_Instance, Node_Id), Sm (Renamed_In_Spec, Flag), Sm (Renamed_Or_Alias, Node_Id), + Sm (Renames_Limited_View, Flag), Sm (Scope_Depth_Value, Unat), Sm (SPARK_Aux_Pragma, Node_Id), Sm (SPARK_Aux_Pragma_Inherited, Flag), diff --git a/gcc/ada/sem_ch8.adb b/gcc/ada/sem_ch8.adb index 533b62aef321..c6b8f6c5d7c8 100644 --- a/gcc/ada/sem_ch8.adb +++ b/gcc/ada/sem_ch8.adb @@ -1665,8 +1665,7 @@ package body Sem_Ch8 is Set_Etype (New_P, Standard_Void_Type); elsif Present (Renamed_Entity (Old_P)) - and then (From_Limited_With (Renamed_Entity (Old_P)) - or else Has_Limited_View (Renamed_Entity (Old_P))) + and then Renames_Limited_View (Old_P) and then not Unit_Is_Visible (Cunit (Get_Source_Unit (Renamed_Entity (Old_P)))) then @@ -1691,8 +1690,10 @@ package body Sem_Ch8 is if Present (Renamed_Entity (Old_P)) then Set_Renamed_Entity (New_P, Renamed_Entity (Old_P)); + Set_Renames_Limited_View (New_P, Renames_Limited_View (Old_P)); else Set_Renamed_Entity (New_P, Old_P); + Set_Renames_Limited_View (New_P, From_Limited_With (Old_P)); end if; -- The package renaming declaration may become Ghost if it renames a @@ -7077,7 +7078,7 @@ package body Sem_Ch8 is ("renaming of limited view of package & not usable in this" & " context (RM 8.5.3(3.1/2))", Prefix (N), P_Name); - elsif Has_Limited_View (P_Name) + elsif Renames_Limited_View (Entity (Prefix (N))) and then not Unit_Is_Visible (Cunit (Get_Source_Unit (P_Name))) and then not Is_Visible_Through_Renamings (P_Name) then