From a35c1b077e32e4b552dd1d0f2385a3885fcabf4b Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Fri, 13 Dec 2019 09:05:18 +0000 Subject: [PATCH] [Ada] Clear confusion about subcomponents of atomic object 2019-12-13 Eric Botcazou gcc/ada/ * sem_util.ads (Is_Atomic_Object): Mention relevant RM clauses. * sem_util.adb (Is_Atomic_Object): For an indexed component, only look at the Has_Atomic_Components aspect of the prefix and do not recurse on it; for a selected component, do not look at the prefix. (Is_Atomic_Or_VFA_Object): Minor tweak. From-SVN: r279363 --- gcc/ada/ChangeLog | 9 ++++++++ gcc/ada/sem_util.adb | 52 ++++++++++++++------------------------------ gcc/ada/sem_util.ads | 2 +- 3 files changed, 26 insertions(+), 37 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 9f49f8674ae..a1f971ab748 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,12 @@ +2019-12-13 Eric Botcazou + + * sem_util.ads (Is_Atomic_Object): Mention relevant RM clauses. + * sem_util.adb (Is_Atomic_Object): For an indexed component, + only look at the Has_Atomic_Components aspect of the prefix and + do not recurse on it; for a selected component, do not look at + the prefix. + (Is_Atomic_Or_VFA_Object): Minor tweak. + 2019-12-13 Arnaud Charlet * libgnat/a-calfor.ads, libgnat/a-calfor.adb (Split_Duration): diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index e29360f576f..30a227307fe 100644 --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -13724,54 +13724,33 @@ package body Sem_Util is ---------------------- function Is_Atomic_Object (N : Node_Id) return Boolean is - function Is_Atomic_Entity (Id : Entity_Id) return Boolean; - pragma Inline (Is_Atomic_Entity); - -- Determine whether arbitrary entity Id is either atomic or has atomic + function Prefix_Has_Atomic_Components (Pref : Node_Id) return Boolean; + -- Determine whether prefix Pref of an indexed component has atomic -- components. - function Is_Atomic_Prefix (Pref : Node_Id) return Boolean; - -- Determine whether prefix Pref of an indexed or selected component is - -- an atomic object. - - ---------------------- - -- Is_Atomic_Entity -- - ---------------------- - - function Is_Atomic_Entity (Id : Entity_Id) return Boolean is - begin - return Is_Atomic (Id) or else Has_Atomic_Components (Id); - end Is_Atomic_Entity; - - ---------------------- - -- Is_Atomic_Prefix -- - ---------------------- + --------------------------------- + -- Prefix_Has_Atomic_Components -- + --------------------------------- - function Is_Atomic_Prefix (Pref : Node_Id) return Boolean is + function Prefix_Has_Atomic_Components (Pref : Node_Id) return Boolean is Typ : constant Entity_Id := Etype (Pref); begin if Is_Access_Type (Typ) then return Has_Atomic_Components (Designated_Type (Typ)); - elsif Is_Atomic_Entity (Typ) then + elsif Has_Atomic_Components (Typ) then return True; elsif Is_Entity_Name (Pref) - and then Is_Atomic_Entity (Entity (Pref)) + and then Has_Atomic_Components (Entity (Pref)) then return True; - elsif Nkind (Pref) = N_Indexed_Component then - return Is_Atomic_Prefix (Prefix (Pref)); - - elsif Nkind (Pref) = N_Selected_Component then - return - Is_Atomic_Prefix (Prefix (Pref)) - or else Is_Atomic (Entity (Selector_Name (Pref))); + else + return False; end if; - - return False; - end Is_Atomic_Prefix; + end Prefix_Has_Atomic_Components; -- Start of processing for Is_Atomic_Object @@ -13780,12 +13759,13 @@ package body Sem_Util is return Is_Atomic_Object_Entity (Entity (N)); elsif Nkind (N) = N_Indexed_Component then - return Is_Atomic (Etype (N)) or else Is_Atomic_Prefix (Prefix (N)); + return + Is_Atomic (Etype (N)) + or else Prefix_Has_Atomic_Components (Prefix (N)); elsif Nkind (N) = N_Selected_Component then return Is_Atomic (Etype (N)) - or else Is_Atomic_Prefix (Prefix (N)) or else Is_Atomic (Entity (Selector_Name (N))); end if; @@ -13810,8 +13790,8 @@ package body Sem_Util is function Is_Atomic_Or_VFA_Object (N : Node_Id) return Boolean is begin return Is_Atomic_Object (N) - or else (Is_Object_Reference (N) - and then Is_Entity_Name (N) + or else (Is_Entity_Name (N) + and then Is_Object (Entity (N)) and then (Is_Volatile_Full_Access (Entity (N)) or else Is_Volatile_Full_Access (Etype (Entity (N))))); diff --git a/gcc/ada/sem_util.ads b/gcc/ada/sem_util.ads index ea963deb449..c354d7e9072 100644 --- a/gcc/ada/sem_util.ads +++ b/gcc/ada/sem_util.ads @@ -1531,7 +1531,7 @@ package Sem_Util is function Is_Atomic_Object (N : Node_Id) return Boolean; -- Determine whether arbitrary node N denotes a reference to an atomic - -- object as per Ada RM C.6(12). + -- object as per Ada RM C.6(7) and the crucial remark in C.6(8). -- WARNING: There is a matching C declaration of this subprogram in fe.h -- 2.30.2