ada: Reject nonconfirming Size attribute value for aliased object
authorMarc Poulhiès <poulhies@adacore.com>
Mon, 7 Nov 2022 13:34:54 +0000 (14:34 +0100)
committerMarc Poulhiès <poulhies@adacore.com>
Mon, 21 Nov 2022 10:10:31 +0000 (11:10 +0100)
Only confirming Size must be supported for aliased object of elementary
type (see RM 13.1 in the "Implementation Advice").

   -- size is 1-byte
   type Y is range 0 .. 20;
   type Ay is access all Y;

   -- Var size is 8-bytes
   Var : aliased Y := 5 with Size => 64;

   --  JP.all is a 1-byte reference to an 8-bytes objects.
   JP : Ay := Var'Access;

The above JP.all references the first byte of the 8-byte Var object,
which is, for example, not correct on little-endian systems.

This change rejects nonconfirming Size attribute on such objects
instead of miscompiling it.

gcc/ada/

* sem_ch13.adb (Check_One_Attr): produce error when Size attribute
used on aliased object of elementary types with nonconfirming
value.

gcc/ada/sem_ch13.adb

index 5507353..bf84a10 100644 (file)
@@ -7310,6 +7310,21 @@ package body Sem_Ch13 is
                      Set_Esize (U_Ent, Size);
                   end if;
 
+                  --  As of RM 13.1, only confirming size
+                  --  (i.e. (Size = Esize (Etyp))) for aliased object of
+                  --  elementary type must be supported.
+                  --  GNAT rejects nonconfirming size for such object.
+
+                  if Is_Aliased (U_Ent)
+                    and then Is_Elementary_Type (Etyp)
+                    and then Known_Esize (U_Ent)
+                    and then Size /= Esize (Etyp)
+                  then
+                     Error_Msg_N
+                       ("nonconfirming Size for aliased object is not "
+                        & "supported", N);
+                  end if;
+
                   Set_Has_Size_Clause (U_Ent);
                end;
             end if;