]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Ada: Fix instantiation failure for package with formal package parameters
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 28 Oct 2025 09:13:35 +0000 (10:13 +0100)
committerEric Botcazou <ebotcazou@adacore.com>
Tue, 28 Oct 2025 09:16:01 +0000 (10:16 +0100)
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.

gcc/ada/
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.

gcc/testsuite/
* 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.

gcc/ada/sem_ch12.adb
gcc/testsuite/gnat.dg/specs/generic_inst5.ads [new file with mode: 0644]
gcc/testsuite/gnat.dg/specs/generic_inst5_pkg1.ads [new file with mode: 0644]
gcc/testsuite/gnat.dg/specs/generic_inst5_pkg2.ads [new file with mode: 0644]

index 9a155b9b48109e5d5dc3b099a1cbf0e14fd55211..9acf193267868eaef8536559dc3c6e5a3405c4b0 100644 (file)
@@ -3883,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);
diff --git a/gcc/testsuite/gnat.dg/specs/generic_inst5.ads b/gcc/testsuite/gnat.dg/specs/generic_inst5.ads
new file mode 100644 (file)
index 0000000..d3d0b2a
--- /dev/null
@@ -0,0 +1,14 @@
+-- { 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;
diff --git a/gcc/testsuite/gnat.dg/specs/generic_inst5_pkg1.ads b/gcc/testsuite/gnat.dg/specs/generic_inst5_pkg1.ads
new file mode 100644 (file)
index 0000000..da599b0
--- /dev/null
@@ -0,0 +1,9 @@
+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;
diff --git a/gcc/testsuite/gnat.dg/specs/generic_inst5_pkg2.ads b/gcc/testsuite/gnat.dg/specs/generic_inst5_pkg2.ads
new file mode 100644 (file)
index 0000000..2f5df87
--- /dev/null
@@ -0,0 +1,7 @@
+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;