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.

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


2025-04-12  Eric Botcazou  <ebotca...@adacore.com>

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


2025-04-12  Eric Botcazou  <ebotca...@adacore.com>

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

-- 
Eric Botcazou
diff --git a/gcc/ada/sem_ch8.adb b/gcc/ada/sem_ch8.adb
index d4ab44fee92..0a9ef419db7 100644
--- a/gcc/ada/sem_ch8.adb
+++ b/gcc/ada/sem_ch8.adb
@@ -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
-- { 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;

Reply via email to