https://gcc.gnu.org/g:be42204d1fb45c408a12090dcdda6395450a5394
commit r16-4055-gbe42204d1fb45c408a12090dcdda6395450a5394 Author: Denis Mazzucato <mazzuc...@adacore.com> Date: Wed Aug 27 10:56:38 2025 +0200 ada: Fix missing warning when child packages hide homonym units Improve consistency of the warning message when child units are hiding other with'ed homonym package, regardless of the order of the context clauses. gcc/ada/ChangeLog: * sem_ch10.adb (Install_Siblings): Fix condition to emit warning. Diff: --- gcc/ada/sem_ch10.adb | 72 +++++++++++++++++++++++++++------------------------- 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/gcc/ada/sem_ch10.adb b/gcc/ada/sem_ch10.adb index ffd3eaa6bec1..cff0d71c17ce 100644 --- a/gcc/ada/sem_ch10.adb +++ b/gcc/ada/sem_ch10.adb @@ -176,7 +176,7 @@ package body Sem_Ch10 is -- use-package clauses to avoid circularities when installing context. procedure Install_Siblings (U_Name : Entity_Id; N : Node_Id); - -- In the compilation of a child unit, a child of any of the ancestor + -- In the compilation of a child unit, a child of any of the ancestor -- units is directly visible if it is visible, because the parent is in -- an enclosing scope. Iterate over context to find child units of U_Name -- or of some ancestor of it. @@ -4803,9 +4803,8 @@ package body Sem_Ch10 is ---------------------- procedure Install_Siblings (U_Name : Entity_Id; N : Node_Id) is - Item : Node_Id; - Id : Entity_Id; - Prev : Entity_Id; + Item : Node_Id; + Item_E : Entity_Id; begin -- Iterate over explicit with clauses, and check whether the scope of @@ -4836,42 +4835,46 @@ package body Sem_Ch10 is or else Private_Present (N) or else Nkind (Unit (N)) = N_Package_Body then - Id := Entity (Name (Item)); + Item_E := Entity (Name (Item)); - if Is_Child_Unit (Id) - and then Is_Ancestor_Package (Scope (Id), U_Name) + if Is_Child_Unit (Item_E) + and then Is_Ancestor_Package (Scope (Item_E), U_Name) then - Set_Is_Immediately_Visible (Id); + Set_Is_Immediately_Visible (Item_E); -- Check for the presence of another unit in the context that -- may be inadvertently hidden by the child. - Prev := Current_Entity (Id); + declare + Clause : Node_Id; + Clause_E : Entity_Id; - if Present (Prev) - and then Is_Immediately_Visible (Prev) - and then not Is_Child_Unit (Prev) - then - declare - Clause : Node_Id; + begin + Clause := First (Context_Items (N)); + while Present (Clause) loop + if Clause /= Item + and then Nkind (Clause) = N_With_Clause + and then not Limited_Present (Clause) + then + Clause_E := Entity (Name (Clause)); - begin - Clause := First (Context_Items (N)); - while Present (Clause) loop - if Nkind (Clause) = N_With_Clause - and then Entity (Name (Clause)) = Prev + if not Is_Ancestor_Package (Clause_E, U_Name) + and then Chars (Clause_E) = Chars (Item_E) + and then not Has_Prefix (Name (Clause)) + and then not In_Use (Clause_E) then Error_Msg_NE - ("child unit& hides compilation unit " & - "with the same name??", - Name (Item), Id); + ("child unit& hides compilation unit " + & "with the same name??", + Name (Item), + Item_E); exit; end if; + end if; - Next (Clause); - end loop; - end; - end if; + Next (Clause); + end loop; + end; -- The With_Clause may be on a grandchild or one of its further -- descendants, which makes a child immediately visible. Examine @@ -4879,12 +4882,12 @@ package body Sem_Ch10 is -- if current unit is A.C, and with_clause is on A.X.Y.Z, then X -- is immediately visible. - elsif Is_Child_Unit (Id) then + elsif Is_Child_Unit (Item_E) then declare Par : Entity_Id; begin - Par := Scope (Id); + Par := Scope (Item_E); while Is_Child_Unit (Par) loop if Is_Ancestor_Package (Scope (Par), U_Name) then Set_Is_Immediately_Visible (Par); @@ -4902,9 +4905,9 @@ package body Sem_Ch10 is -- is already a regular with_clause for it in the current unit. elsif Private_Present (Item) then - Id := Entity (Name (Item)); + Item_E := Entity (Name (Item)); - if Is_Child_Unit (Id) then + if Is_Child_Unit (Item_E) then declare Clause : Node_Id; @@ -4928,12 +4931,13 @@ package body Sem_Ch10 is and then Is_Entity_Name (Name (Clause)) and then not Private_Present (Clause) then - if Entity (Name (Clause)) = Id + if Entity (Name (Clause)) = Item_E or else (Nkind (Name (Clause)) = N_Expanded_Name and then Is_Entity_Name (Prefix (Name (Clause))) - and then Entity (Prefix (Name (Clause))) = Id) + and then Entity (Prefix (Name (Clause))) + = Item_E) then return True; end if; @@ -4946,7 +4950,7 @@ package body Sem_Ch10 is end In_Context; begin - Set_Is_Visible_Lib_Unit (Id, In_Context); + Set_Is_Visible_Lib_Unit (Item_E, In_Context); end; end if; end if;