]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Ada: Natural/Positive not ignored in subprogram renaming
authorEric Botcazou <ebotcazou@adacore.com>
Sat, 12 Apr 2025 09:35:44 +0000 (11:35 +0200)
committerEric Botcazou <ebotcazou@adacore.com>
Sat, 12 Apr 2025 09:37:53 +0000 (11:37 +0200)
The language says that the profile of a subprogram renaming-as-declaration
must be mode conformant with that of the renamed subprogram, and that the
parameter subtypes are taken from the renamed subprogram.

GNAT implements the rule, except when Natural and Positive are involved,
which may lead to the wrong conclusion that it does not.

gcc/ada/
PR ada/119643
* sem_ch8.adb (Inherit_Renamed_Profile): Add guard against the
peculiarities of Natural and Positive.

gcc/testsuite/
* gnat.dg/renaming17.adb: New test.

gcc/ada/sem_ch8.adb
gcc/testsuite/gnat.dg/renaming17.adb [new file with mode: 0644]

index d4ab44fee923c2ffe3116df3092a078b19b816fa..0a9ef419db786b0fb2ed545e2ec3f7164d1228e9 100644 (file)
@@ -9314,11 +9314,12 @@ package body Sem_Ch8 is
 
             --  If the new type is a renaming of the old one, as is the case
             --  for actuals in instances, retain its name, to simplify later
-            --  disambiguation.
+            --  disambiguation. Beware of Natural and Positive, see Cstand.
 
             if Nkind (Parent (New_T)) = N_Subtype_Declaration
               and then Is_Entity_Name (Subtype_Indication (Parent (New_T)))
               and then Entity (Subtype_Indication (Parent (New_T))) = Old_T
+              and then Scope (New_T) /= Standard_Standard
             then
                null;
             else
diff --git a/gcc/testsuite/gnat.dg/renaming17.adb b/gcc/testsuite/gnat.dg/renaming17.adb
new file mode 100644 (file)
index 0000000..d826433
--- /dev/null
@@ -0,0 +1,17 @@
+-- { dg-do run }
+
+procedure Renaming17 is
+
+  function Incr (V : Integer; I : Integer := 1) return Integer is
+    (V + I);
+
+  function Incr_Ren (V : Integer; I : Positive := 1) return Positive
+    renames Incr;
+
+  I : Integer;
+
+begin
+  I := Incr_Ren (-3);
+  I := Incr_Ren (-3, 2);
+  I := Incr_Ren (-3, 0);
+end;