The problem occurs for a generic package with a formal package parameter that 
contains a nested generic package used in the instantiation of another generic 
package with two formal package parameters.

It turns out that the mapping between formals and actuals for the latter two 
formal package parameters done by Map_Formal_Package_Entities is blocked by 
the presence of the first formal package parameter, more precisely by the 
special name built for the formal in the parent of a child unit.  The fix is 
just to set the Is_Internal flag on this special name.

Tested on x86-64/Linux, applied on the mainline.


2025-10-28  Eric Botcazou  <[email protected]>

        PR ada/59234
        * sem_ch12.adb (Analyze_Formal_Package_Declaration): Mark the
        special name built for the formal in the parent of a child unit
        as internal.


2025-10-28  Eric Botcazou  <[email protected]>

        * gnat.dg/specs/generic_inst5.ads: New test.
        * gnat.dg/specs/generic_inst5_pkg1.ads: New helper.
        * gnat.dg/specs/generic_inst5_pkg2.ads: Likewise.

-- 
Eric Botcazou
-- { dg-do compile }

with Ada.Containers.Ordered_Sets;
with Generic_Inst5_Pkg1;
with Generic_Inst5_Pkg2;

package Generic_Inst5 is

   package Charsets is new Ada.Containers.Ordered_sets (Character);
   package P1 is new Generic_Inst5_Pkg1 (Charsets);
   package P1_N is new P1.Nested;
   package P2 is new Generic_Inst5_Pkg2 (P1, P1_N);

end Generic_Inst5;
with Ada.Containers.Ordered_Sets;

generic
   with package Sets is new Ada.Containers.Ordered_Sets (<>);
package Generic_Inst5_Pkg1 is
   generic
   package Nested is
   end Nested;
end Generic_Inst5_Pkg1;
with Generic_Inst5_Pkg1;

generic
   with package P1 is new Generic_Inst5_Pkg1 (<>);
   with package P1_N is new P1.Nested;
package Generic_Inst5_Pkg2 is
end Generic_Inst5_Pkg2;
diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb
index 24d276ba48a..9acf1932678 100644
--- a/gcc/ada/sem_ch12.adb
+++ b/gcc/ada/sem_ch12.adb
@@ -3868,6 +3883,7 @@ package body Sem_Ch12 is
          Renaming_In_Par :=
            Make_Defining_Identifier (Loc, Chars (Gen_Unit));
          Mutate_Ekind (Renaming_In_Par, E_Package);
+         Set_Is_Internal (Renaming_In_Par);
          Set_Is_Not_Self_Hidden (Renaming_In_Par);
          Set_Etype (Renaming_In_Par, Standard_Void_Type);
          Set_Scope (Renaming_In_Par, Parent_Instance);

Reply via email to