[Ada] Missing accessibility actuals on calls to interface conversion functions
authorGary Dismukes <dismukes@adacore.com>
Wed, 18 Dec 2019 07:14:59 +0000 (07:14 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 18 Dec 2019 07:14:59 +0000 (07:14 +0000)
2019-12-18  Gary Dismukes  <dismukes@adacore.com>

gcc/ada/

* sem_res.adb (Resolve_Type_Conversion): Add handling for access
types with designated operand and target types that are
referenced in places that have a limited view of an interface
type by retrieving the nonlimited view when it exists.  Add ???
comments related to missing limited_with_clause handling for
Target (in the non-access case).

From-SVN: r279513

gcc/ada/ChangeLog
gcc/ada/sem_res.adb

index fd3d0be0edd32ad617731a7d6904f52c675de4b1..acf3b3b51677b0d98600e285ceae2b092b03f5f8 100644 (file)
@@ -1,3 +1,12 @@
+2019-12-18  Gary Dismukes  <dismukes@adacore.com>
+
+       * sem_res.adb (Resolve_Type_Conversion): Add handling for access
+       types with designated operand and target types that are
+       referenced in places that have a limited view of an interface
+       type by retrieving the nonlimited view when it exists.  Add ???
+       comments related to missing limited_with_clause handling for
+       Target (in the non-access case).
+
 2019-12-18  Ed Schonberg  <schonberg@adacore.com>
 
        * par-ch12.adb (P_Formal_Derived_Type_Definition): In Ada_2020
index 32d9fadac07969aed2c4d3414e1ce6f976954974..21cbe0aa8a58556ad3da61e098ced07ff26ad5f4 100644 (file)
@@ -11827,12 +11827,35 @@ package body Sem_Res is
                Set_Etype (Expression (N), Opnd);
             end if;
 
+            --  It seems that Non_Limited_View should also be applied for
+            --  Target when it has a limited view, but that leads to missing
+            --  error checks on interface conversions further below. ???
+
             if Is_Access_Type (Opnd) then
                Opnd := Designated_Type (Opnd);
+
+               --  If the type of the operand is a limited view, use nonlimited
+               --  view when available. If it is a class-wide type, recover the
+               --  class-wide type of the nonlimited view.
+
+               if From_Limited_With (Opnd)
+                 and then Has_Non_Limited_View (Opnd)
+               then
+                  Opnd := Non_Limited_View (Opnd);
+               end if;
             end if;
 
             if Is_Access_Type (Target_Typ) then
                Target := Designated_Type (Target);
+
+               --  If the target type is a limited view, use nonlimited view
+               --  when available.
+
+               if From_Limited_With (Target)
+                 and then Has_Non_Limited_View (Target)
+               then
+                  Target := Non_Limited_View (Target);
+               end if;
             end if;
 
             if Opnd = Target then
@@ -11840,6 +11863,10 @@ package body Sem_Res is
 
             --  Conversion from interface type
 
+            --  It seems that it would be better for the error checks below
+            --  to be performed as part of Validate_Conversion (and maybe some
+            --  of the error checks above could be moved as well?). ???
+
             elsif Is_Interface (Opnd) then
 
                --  Ada 2005 (AI-217): Handle entities from limited views