From: squirek <squi...@adacore.com>

This patch fixes an issue in the compiler whereby using anonymous access
types as abstract overridden subprogram formals for a derived abtract type
may lead to compile-time errors.

gcc/ada/ChangeLog:

        * accessibility.adb (Type_Access_Level): Add handling for
        subprogram aliases.

Tested on x86_64-pc-linux-gnu, committed on master.

---
 gcc/ada/accessibility.adb | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/gcc/ada/accessibility.adb b/gcc/ada/accessibility.adb
index 298103377a7..a4129819109 100644
--- a/gcc/ada/accessibility.adb
+++ b/gcc/ada/accessibility.adb
@@ -2331,7 +2331,20 @@ package body Accessibility is
          return Scope_Depth (Standard_Standard);
       end if;
 
-      return Scope_Depth (Enclosing_Dynamic_Scope (Btyp));
+      --  It is possible that the current scope is an aliased subprogram -
+      --  this can happen when an abstract primitive from a root type is not
+      --  not visible.
+
+      if Is_Subprogram (Enclosing_Dynamic_Scope (Btyp))
+        and then Present (Alias (Enclosing_Dynamic_Scope (Btyp)))
+      then
+         return Scope_Depth (Ultimate_Alias (Enclosing_Dynamic_Scope (Btyp)));
+
+      --  Otherwise, simply use the enclosing dynamic scope
+
+      else
+         return Scope_Depth (Enclosing_Dynamic_Scope (Btyp));
+      end if;
    end Type_Access_Level;
 
 end Accessibility;
-- 
2.43.0

Reply via email to