From: Robert Dewar Date: Fri, 4 Nov 2011 10:58:44 +0000 (+0000) Subject: exp_ch2.adb (Expand_Entity_Reference): Extend handling of atomic sync to type case. X-Git-Tag: releases/gcc-4.7.0~2508 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fb5d63c68a9b1fdc2a126fc4cc6cab86cf90f743;p=thirdparty%2Fgcc.git exp_ch2.adb (Expand_Entity_Reference): Extend handling of atomic sync to type case. 2011-11-04 Robert Dewar * 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 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 752037820fcf..0d298e5bf3eb 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,10 @@ +2011-11-04 Robert Dewar + + * 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 * sem_warn.adb (Warn_On_Useless_Assignment): More accurate test diff --git a/gcc/ada/exp_ch2.adb b/gcc/ada/exp_ch2.adb index a71ce69602e2..24f47a7775bf 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 70270aba2681..e1bf31be23a8 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;