2011-11-04 Robert Dewar <dewar@adacore.com>
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 4 Nov 2011 10:58:44 +0000 (10:58 +0000)
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 4 Nov 2011 10:58:44 +0000 (10:58 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180938 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/ChangeLog
gcc/ada/exp_ch2.adb
gcc/ada/sem_prag.adb

index 7520378..0d298e5 100644 (file)
@@ -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.
index a71ce69..24f47a7 100644 (file)
@@ -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
index 70270ab..e1bf31b 100644 (file)
@@ -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;