aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarc Poulhiès <poulhies@adacore.com>2022-11-07 14:34:54 +0100
committerMarc Poulhiès <poulhies@adacore.com>2022-11-21 11:10:31 +0100
commit493e760dda4dac45eefac4185a7b04a1b8fc6c18 (patch)
treea3425805f144661ec631250980e69844009767a6 /gcc
parent6d0d71ea1c685df245f3c11a5daf52843823cd58 (diff)
downloadgcc-493e760dda4dac45eefac4185a7b04a1b8fc6c18.zip
gcc-493e760dda4dac45eefac4185a7b04a1b8fc6c18.tar.gz
gcc-493e760dda4dac45eefac4185a7b04a1b8fc6c18.tar.bz2
ada: Reject nonconfirming Size attribute value for aliased object
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/sem_ch13.adb15
1 files changed, 15 insertions, 0 deletions
diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb
index 5507353..bf84a10 100644
--- a/gcc/ada/sem_ch13.adb
+++ b/gcc/ada/sem_ch13.adb
@@ -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;