https://gcc.gnu.org/g:564af5667f3e0277bffca6715c2863658af7cce5
commit r16-6440-g564af5667f3e0277bffca6715c2863658af7cce5 Author: Eric Botcazou <[email protected]> Date: Tue Dec 30 11:44:54 2025 +0100 Ada: Reject formal parameter as name of subprogram renaming This implements a minimal form of the old RM 8.5.4(6) rule, which forbids the use of (the name of) a formal parameter of the specification in the name of a renaming subprogram declaration; it turns out that implementing the full rule breaks existing code that works fine otherwise. gcc/ada/ PR ada/15605 * sem_ch8.adb (Analyze_Subprogram_Renaming): Give an error if the name is also that of a formal parameter of the specification. gcc/testsuite/ * gnat.dg/specs/profile1.ads: New test. Diff: --- gcc/ada/sem_ch8.adb | 27 ++++++++++++++++++++++++--- gcc/testsuite/gnat.dg/specs/profile1.ads | 12 ++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/gcc/ada/sem_ch8.adb b/gcc/ada/sem_ch8.adb index 11f2b19b0b0e..8f534af7e1b4 100644 --- a/gcc/ada/sem_ch8.adb +++ b/gcc/ada/sem_ch8.adb @@ -3678,13 +3678,34 @@ package body Sem_Ch8 is then -- Do not mention the renaming if it comes from an instance - if not Is_Actual then - Error_Msg_N ("expect valid subprogram name in renaming", N); - else + if Is_Actual then Error_Msg_NE ("no visible subprogram for formal&", N, Nam); + else + Error_Msg_N ("expect valid subprogram name in renaming", N); end if; return; + + -- RM 8.5.4(6): A name that denotes a formal parameter of the subprogram + -- specification is not allowed within Nam. But this was not enforced by + -- GNAT historically, so we restrict it to direct names. + + elsif Nkind (Nam) = N_Identifier and then not Is_Actual then + declare + F : Node_Id; + + begin + F := First_Formal (New_S); + while Present (F) loop + if Chars (F) = Chars (Nam) then + Error_Msg_NE + ("formal parameter& cannot be used in renaming", N, F); + return; + end if; + + Next_Formal (F); + end loop; + end; end if; -- Find the renamed entity that matches the given specification. Disable diff --git a/gcc/testsuite/gnat.dg/specs/profile1.ads b/gcc/testsuite/gnat.dg/specs/profile1.ads new file mode 100644 index 000000000000..1caa5f04bcb5 --- /dev/null +++ b/gcc/testsuite/gnat.dg/specs/profile1.ads @@ -0,0 +1,12 @@ +-- PR ada/15605 +-- { dg-do compile } + +package Profile1 is + + subtype Int is Integer; + function F (Int : Integer) return Int; -- { dg-error "formal parameter" } + + procedure Foo (X : Integer); + procedure P (Foo : Integer) renames Foo; -- { dg-error "formal parameter" } + +end Profile1;
