This patch improves on the error message for an attempt to apply 'Access
to a formal subprogram. It also applies the check to a renaming of a formal
subprogram.

Compiling p.adb must yield:

p.adb:15:18: not subtype conformant with declaration at line 2
p.adb:15:18: formal subprograms are not subtype conformant (RM 6.3.1 (17/3))
p.adb:16:18: not subtype conformant with declaration at line 2
p.adb:16:18: formal subprograms are not subtype conformant (RM 6.3.1 (17/3))

----
package body P is
  procedure Non_Generic (P : access procedure (I : Integer)) is
  begin
    P.all (5);
  end Non_Generic;

  procedure G is
    procedure Local (I : Integer) is
    begin
      Action (I);
    end;
    procedure Local_Action (I : Integer) renames Action;
  begin
    Non_Generic (Local'access);
    Non_Generic (Local_Action'access);
    Non_Generic (Action'access);
    -- p.adb:15:18: not subtype conformant with declaration at line 2
    -- p.adb:15:18: formal subprograms not allowed
  end G;
end P;
----
package P is
  generic
    with procedure Action (I : Integer);
  procedure G;
end P;

Tested on x86_64-pc-linux-gnu, committed on trunk

2018-05-22  Ed Schonberg  <schonb...@adacore.com>

gcc/ada/

        * sem_ch6.adb (Check_Conformance): Add RM reference for rule that a
        formal subprogram is never subtype conformqnt, and thus cannot be the
        prefix of 'Access.  Reject as well the attribute when applied to a
        renaming of a formal subprogram.
--- gcc/ada/sem_ch6.adb
+++ gcc/ada/sem_ch6.adb
@@ -5348,9 +5348,13 @@ package body Sem_Ch6 is
 
          elsif Is_Formal_Subprogram (Old_Id)
            or else Is_Formal_Subprogram (New_Id)
+           or else (Is_Subprogram (New_Id)
+             and then Present (Alias (New_Id))
+             and then Is_Formal_Subprogram (Alias (New_Id)))
          then
-            Conformance_Error ("\formal subprograms not allowed!");
-            return;
+            Conformance_Error
+               ("\formal subprograms are not subtype conformant "
+                 & "(RM 6.3.1 (17/3))");
          end if;
       end if;
 

Reply via email to