aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRobert Dewar <dewar@adacore.com>2011-11-04 10:58:44 +0000
committerArnaud Charlet <charlet@gcc.gnu.org>2011-11-04 11:58:44 +0100
commitfb5d63c68a9b1fdc2a126fc4cc6cab86cf90f743 (patch)
tree4fb7d2b99ab6a632f2c8d21830170c4d8019ef8f /gcc
parentc2d1a4747cf6d6b98813ca855888dd246fce3013 (diff)
downloadgcc-fb5d63c68a9b1fdc2a126fc4cc6cab86cf90f743.zip
gcc-fb5d63c68a9b1fdc2a126fc4cc6cab86cf90f743.tar.gz
gcc-fb5d63c68a9b1fdc2a126fc4cc6cab86cf90f743.tar.bz2
exp_ch2.adb (Expand_Entity_Reference): Extend handling of atomic sync to type case.
2011-11-04 Robert Dewar <dewar@adacore.com> * exp_ch2.adb (Expand_Entity_Reference): Extend handling of atomic sync to type case. * sem_prag.adb (Process_Suppress_Unsuppress): Atomic Sync can apply to types. From-SVN: r180938
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog7
-rw-r--r--gcc/ada/exp_ch2.adb23
-rw-r--r--gcc/ada/sem_prag.adb2
3 files changed, 28 insertions, 4 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 7520378..0d298e5 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,12 @@
2011-11-04 Robert Dewar <dewar@adacore.com>
+ * exp_ch2.adb (Expand_Entity_Reference): Extend handling of
+ atomic sync to type case.
+ * sem_prag.adb (Process_Suppress_Unsuppress): Atomic Sync can
+ apply to types.
+
+2011-11-04 Robert Dewar <dewar@adacore.com>
+
* sem_warn.adb (Warn_On_Useless_Assignment): More accurate test
for call vs assign.
* gcc-interface/Make-lang.in: Update dependencies.
diff --git a/gcc/ada/exp_ch2.adb b/gcc/ada/exp_ch2.adb
index a71ce69..24f47a7 100644
--- a/gcc/ada/exp_ch2.adb
+++ b/gcc/ada/exp_ch2.adb
@@ -401,7 +401,9 @@ package body Exp_Ch2 is
-- Set Atomic_Sync_Required if necessary for atomic variable
- if Is_Atomic (E) then
+ if Nkind_In (N, N_Identifier, N_Expanded_Name)
+ and then (Is_Atomic (E) or else Is_Atomic (Etype (E)))
+ then
declare
Set : Boolean;
MLoc : Node_Id;
@@ -417,10 +419,25 @@ package body Exp_Ch2 is
elsif Debug_Flag_Dot_D then
Set := False;
- -- Otherwise setting comes from Atomic_Synchronization state
+ -- If variable is atomic, but type is not, setting depends on
+ -- disable/enable state for the variable.
- else
+ elsif Is_Atomic (E) and then not Is_Atomic (Etype (E)) then
Set := not Atomic_Synchronization_Disabled (E);
+
+ -- If variable is not atomic, but its type is atomic, setting
+ -- depends on disable/enable state for the type.
+
+ elsif not Is_Atomic (E) and then Is_Atomic (Etype (E)) then
+ Set := not Atomic_Synchronization_Disabled (Etype (E));
+
+ -- Else both variable and type are atomic (see outer if), and we
+ -- disable if either variable or its type have sync disabled.
+
+ else
+ Set := (not Atomic_Synchronization_Disabled (E))
+ and then
+ (not Atomic_Synchronization_Disabled (Etype (E)));
end if;
-- Set flag if required
diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb
index 70270ab..e1bf31b 100644
--- a/gcc/ada/sem_prag.adb
+++ b/gcc/ada/sem_prag.adb
@@ -5465,7 +5465,7 @@ package body Sem_Prag is
and then not Is_Atomic (E)
then
Error_Msg_N
- ("pragma & requires atomic variable",
+ ("pragma & requires atomic type or variable",
Pragma_Identifier (Original_Node (N)));
end if;