summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2019-12-13 09:05:18 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2019-12-13 09:05:18 +0000
commita35c1b077e32e4b552dd1d0f2385a3885fcabf4b (patch)
tree8a550a5392f4e8c6fb2f7fcfec0752ae8a26f473
parent309ff6fb2332471dbe0e5ee692ea88b0a7dc1c94 (diff)
downloadgcc-a35c1b077e32e4b552dd1d0f2385a3885fcabf4b.tar.gz
[Ada] Clear confusion about subcomponents of atomic object
2019-12-13 Eric Botcazou <ebotcazou@adacore.com> 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
-rw-r--r--gcc/ada/ChangeLog9
-rw-r--r--gcc/ada/sem_util.adb52
-rw-r--r--gcc/ada/sem_util.ads2
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 <ebotcazou@adacore.com>
+
+ * 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 <charlet@adacore.com>
* 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