[Ada] Ada2020: AI12-0027 Access values and unaliased component
authorJavier Miranda <miranda@adacore.com>
Tue, 16 Jun 2020 09:28:54 +0000 (05:28 -0400)
committerPierre-Marie de Rodat <derodat@adacore.com>
Mon, 27 Jul 2020 08:05:17 +0000 (04:05 -0400)
gcc/ada/

* sem_res.adb (Resolve_Actuals): Restore restrictive check on
view conversions which required matching value of
Has_Aliased_Components of formals and actuals. Required to avoid
the regression of ACATS b460005.

gcc/ada/sem_res.adb

index bf4774c44910a9f682d391333cc6d2ca919e5d9c..f1c01779b918b3e191c224ee4b77d0bf8b2e495c 100644 (file)
@@ -4118,9 +4118,25 @@ package body Sem_Res is
                   if Ekind (F) = E_In_Out_Parameter
                     and then Is_Array_Type (Etype (F))
                   then
+                     --  In a view conversion, the conversion must be legal in
+                     --  both directions, and thus both component types must be
+                     --  aliased, or neither (4.6 (8)).
+
+                     --  The extra rule in 4.6 (24.9.2) seems unduly
+                     --  restrictive: the privacy requirement should not apply
+                     --  to generic types, and should be checked in an
+                     --  instance. ARG query is in order ???
+
+                     if Has_Aliased_Components (Expr_Typ) /=
+                        Has_Aliased_Components (Etype (F))
+                     then
+                        Error_Msg_N
+                          ("both component types in a view conversion must be"
+                            & " aliased, or neither", A);
+
                      --  Comment here??? what set of cases???
 
-                     if not Same_Ancestor (Etype (F), Expr_Typ) then
+                     elsif not Same_Ancestor (Etype (F), Expr_Typ) then
                         --  Check view conv between unrelated by ref array
                         --  types.