[Ada] Use non-internal representation for access subprograms if UC to Address
authorRichard Kenner <kenner@adacore.com>
Wed, 8 Dec 2021 22:11:26 +0000 (17:11 -0500)
committerPierre-Marie de Rodat <derodat@adacore.com>
Fri, 7 Jan 2022 16:24:06 +0000 (16:24 +0000)
gcc/ada/

* libgnat/g-spipat.ads (Boolean_Func, Natural_Func,
VString_Func): Mark as Favor_Top_Level.
* sem_ch13.adb (Validate_Unchecked_Conversion): Avoid using
internal representation if Unchecked_Conversion between
an access to subprogram and System.Address within the same unit.

gcc/ada/libgnat/g-spipat.ads
gcc/ada/sem_ch13.adb

index 13d1e93..7b103c0 100644 (file)
@@ -654,19 +654,19 @@ package GNAT.Spitbol.Patterns is
    --  operations for constructing patterns that can be used in the pattern
    --  matching operations provided.
 
-   type Boolean_Func is access function return Boolean;
+   type Boolean_Func is access function return Boolean with Favor_Top_Level;
    --  General Boolean function type. When this type is used as a formal
    --  parameter type in this package, it indicates a deferred predicate
    --  pattern. The function will be called when the pattern element is
    --  matched and failure signalled if False is returned.
 
-   type Natural_Func is access function return Natural;
+   type Natural_Func is access function return Natural with Favor_Top_Level;
    --  General Natural function type. When this type is used as a formal
    --  parameter type in this package, it indicates a deferred pattern.
    --  The function will be called when the pattern element is matched
    --  to obtain the currently referenced Natural value.
 
-   type VString_Func is access function return VString;
+   type VString_Func is access function return VString with Favor_Top_Level;
    --  General VString function type. When this type is used as a formal
    --  parameter type in this package, it indicates a deferred pattern.
    --  The function will be called when the pattern element is matched
index 8173532..f462951 100644 (file)
@@ -17546,6 +17546,22 @@ package body Sem_Ch13 is
          Set_No_Strict_Aliasing (Implementation_Base_Type (Target));
       end if;
 
+      --  If the unchecked conversion is between Address and an access
+      --  subprogram type, show that we shouldn't use an internal
+      --  representation for the access subprogram type.
+
+      if Is_Access_Subprogram_Type (Target)
+        and then Is_Descendant_Of_Address (Source)
+        and then In_Same_Source_Unit (Target, N)
+      then
+         Set_Can_Use_Internal_Rep (Target, False);
+      elsif Is_Access_Subprogram_Type (Source)
+        and then Is_Descendant_Of_Address (Target)
+        and then In_Same_Source_Unit (Source, N)
+      then
+         Set_Can_Use_Internal_Rep (Source, False);
+      end if;
+
       --  Generate N_Validate_Unchecked_Conversion node for back end in case
       --  the back end needs to perform special validation checks.