+2016-02-17 Eric Botcazou <ebotcazou@adacore.com>
+
+ * exp_ch4.adb (Expand_N_Indexed_Component): Active synchronization if
+ the prefix denotes an entity which Has_Atomic_Components.
+ * gcc-interface/trans.c (node_is_atomic): Return true if the prefix
+ denotes an entity which Has_Atomic_Components.
+
2016-02-17 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/utils2.c (gnat_protect_expr): Make a SAVE_EXPR only
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2015, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2016, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
and then not Atomic_Synchronization_Disabled (Atp))
or else (Is_Atomic (Typ)
and then not Atomic_Synchronization_Disabled (Typ))
+ or else (Is_Entity_Name (P)
+ and then Has_Atomic_Components (Entity (P))
+ and then not Atomic_Synchronization_Disabled (Entity (P)))
then
Activate_Atomic_Synchronization (N);
end if;
case N_Indexed_Component:
if (Has_Atomic_Components (Etype (Prefix (gnat_node))))
return true;
+ if (Is_Entity_Name (Prefix (gnat_node))
+ && Has_Atomic_Components (Entity (Prefix (gnat_node))))
+ return true;
/* ... fall through ... */
+2016-02-17 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/atomic8.adb: New test.
+
2016-02-17 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/discr46.ad[sb]: New test.
--- /dev/null
+-- { dg-do run }
+
+procedure Atomic8 is
+
+ V : array (1 .. 2) of Natural := (0,0) with Atomic_Components;
+
+ task type TT1;
+ task body TT1 is
+ begin
+ while V (1) + V (2) < 1_000_000 loop
+ V (1) := V (1) + 1;
+ end loop;
+ end TT1;
+
+ task type TT2;
+ task body TT2 is
+ begin
+ while V (1) + V (2) < 1_000_000 loop
+ V (2) := V (2) + 1;
+ end loop;
+ end TT2;
+
+begin
+ declare
+ T1 : TT1;
+ T2 : TT2;
+ begin
+ null;
+ end;
+ if V (1) + V (2) not in 1_000_000 | 1_000_001 then
+ raise Program_Error;
+ end if;
+end;