[Ada] Refine implementation of AI05-0149 missing conversion checks
authorArnaud Charlet <charlet@adacore.com>
Fri, 21 Feb 2020 16:36:40 +0000 (11:36 -0500)
committerPierre-Marie de Rodat <derodat@adacore.com>
Tue, 9 Jun 2020 08:09:00 +0000 (04:09 -0400)
2020-06-09  Arnaud Charlet  <charlet@adacore.com>

gcc/ada/

* sem_type.adb (Covers): Fix implementation of AI05-0149.
* sem_res.adb: Fix typo.

gcc/ada/sem_res.adb
gcc/ada/sem_type.adb

index 0856c893562ab30fb67f5113390025697716d426..6e26ffb3c45d5b7a77160603f7a15af889c18bf2 100644 (file)
@@ -2852,7 +2852,7 @@ package body Sem_Res is
                return;
 
             --  Under relaxed RM semantics silently replace occurrences of null
-            --  by System.Address_Null.
+            --  by System.Null_Address.
 
             elsif Null_To_Null_Address_Convert_OK (N, Typ) then
                Replace_Null_By_Null_Address (N);
index 12f2038e6bad4eebcf6c117cd6cfecfa7c5b8650..af0687cf436e82a5fa8af234644abe644616f868 100644 (file)
@@ -1021,15 +1021,17 @@ package body Sem_Type is
 
       --  Ada 2012 (AI05-0149): Allow an anonymous access type in the context
       --  of a named general access type. An implicit conversion will be
-      --  applied. For the resolution, one designated type must cover the
-      --  other.
+      --  applied. For the resolution, the designated types must match if
+      --  untagged; further, if the designated type is tagged, the designated
+      --  type of the anonymous access type shall be covered by the designated
+      --  type of the named access type.
 
       elsif Ada_Version >= Ada_2012
         and then Ekind (BT1) = E_General_Access_Type
         and then Ekind (BT2) = E_Anonymous_Access_Type
-        and then (Covers (Designated_Type (T1), Designated_Type (T2))
-                    or else
-                  Covers (Designated_Type (T2), Designated_Type (T1)))
+        and then Covers (Designated_Type (T1), Designated_Type (T2))
+        and then (Is_Class_Wide_Type (Designated_Type (T1)) >=
+                  Is_Class_Wide_Type (Designated_Type (T2)))
       then
          return True;