aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGary Dismukes <dismukes@adacore.com>2022-11-18 17:43:36 -0500
committerMarc Poulhiès <poulhies@adacore.com>2022-12-01 14:53:53 +0100
commit8e56d311d380cbdc37a910fa96c06c6eb91973d7 (patch)
tree0e1e5fd8d2b389439cf3ab005a6a41014dc91a56
parenteeba836bf3dc26ea858020bc19e2c1a1606b75dd (diff)
downloadgcc-8e56d311d380cbdc37a910fa96c06c6eb91973d7.zip
gcc-8e56d311d380cbdc37a910fa96c06c6eb91973d7.tar.gz
gcc-8e56d311d380cbdc37a910fa96c06c6eb91973d7.tar.bz2
ada: Use the address type of a Storage_Model_Type for 'Address
When an Address attribute applies to an object that is a dereference of an access value whose type has aspect Designated_Storage_Model, the attribute will now be treated as having the address type associated with the Storage_Model_Type of the access type's associated Storage_Model object instead of being of type System.Address. gcc/ada/ * sem_attr.adb (Analyze_Attribute, Attribute_Address): In the case where the attribute's prefix is a dereference of a value of an access type that has aspect Designated_Storage_Model (or a renaming of such a dereference), set the attribute's type to the corresponding Storage_Model_Type's associated address type rather than System.Address.
-rw-r--r--gcc/ada/sem_attr.adb29
1 files changed, 28 insertions, 1 deletions
diff --git a/gcc/ada/sem_attr.adb b/gcc/ada/sem_attr.adb
index 4c76b93..cca6f6f 100644
--- a/gcc/ada/sem_attr.adb
+++ b/gcc/ada/sem_attr.adb
@@ -3430,7 +3430,34 @@ package body Sem_Attr is
Check_E0;
Address_Checks;
Check_Not_Incomplete_Type;
- Set_Etype (N, RTE (RE_Address));
+
+ -- If the prefix is a dereference of a value whose associated access
+ -- type has been specified with aspect Designated_Storage_Model, then
+ -- use the associated Storage_Model_Type's address type as the type
+ -- of the attribute. Otherwise we use System.Address as usual. This
+ -- isn't normally legit for a predefined attribute, but this is for
+ -- our own extension to addressing and currently requires extensions
+ -- to be enabled (such as with -gnatX0).
+
+ declare
+ Prefix_Obj : constant Node_Id := Get_Referenced_Object (P);
+ Addr_Type : Entity_Id := RTE (RE_Address);
+ begin
+ if Nkind (Prefix_Obj) = N_Explicit_Dereference then
+ declare
+ P_Type : constant Entity_Id := Etype (Prefix (Prefix_Obj));
+
+ use Storage_Model_Support;
+ begin
+ if Has_Designated_Storage_Model_Aspect (P_Type) then
+ Addr_Type := Storage_Model_Address_Type
+ (Storage_Model_Object (P_Type));
+ end if;
+ end;
+ end if;
+
+ Set_Etype (N, Addr_Type);
+ end;
------------------
-- Address_Size --