decl.c (gnat_to_gnu_component_type): Apply the check for atomic access once the compo...
authorEric Botcazou <ebotcazou@adacore.com>
Wed, 10 Jan 2018 23:36:02 +0000 (23:36 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 10 Jan 2018 23:36:02 +0000 (23:36 +0000)
* gcc-interface/decl.c (gnat_to_gnu_component_type): Apply the check
for atomic access once the component size is taken into account and
also do it if the component type is Atomic or Volatile_Full_Access.

From-SVN: r256465

gcc/ada/ChangeLog
gcc/ada/gcc-interface/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/atomic10.adb [new file with mode: 0644]

index 508b9263958bb6cee53882fdd45b91d96350e679..e1334f815880beac469cce9ade1c669a242d8293 100644 (file)
@@ -1,3 +1,9 @@
+2018-01-10  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/decl.c (gnat_to_gnu_component_type): Apply the check
+       for atomic access once the component size is taken into account and
+       also do it if the component type is Atomic or Volatile_Full_Access.
+
 2018-01-04  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnatvsn.ads: Bump copyright year.
index ab5fb0e1a5581e9dea7940970380bbc17b6c0a72..e8c48c7157a1eaa00382c763e738b2ca12442ce9 100644 (file)
@@ -5022,9 +5022,6 @@ gnat_to_gnu_component_type (Entity_Id gnat_array, bool definition,
       && tree_fits_uhwi_p (TYPE_SIZE (gnu_type)))
     gnu_type = make_packable_type (gnu_type, false, max_align);
 
-  if (Has_Atomic_Components (gnat_array))
-    check_ok_for_atomic_type (gnu_type, gnat_array, true);
-
   /* Get and validate any specified Component_Size.  */
   gnu_comp_size
     = validate_size (Component_Size (gnat_array), gnu_type, gnat_array,
@@ -5071,6 +5068,9 @@ gnat_to_gnu_component_type (Entity_Id gnat_array, bool definition,
                          gnat_array);
     }
 
+  if (Has_Atomic_Components (gnat_array) || Is_Atomic_Or_VFA (gnat_type))
+    check_ok_for_atomic_type (gnu_type, gnat_array, true);
+
   /* If the component type is a padded type made for a non-bit-packed array
      of scalars with reverse storage order, we need to propagate the reverse
      storage order to the padding type since it is the innermost enclosing
index 4ac9461afd22cdbc6f9f7485f7c738b897028680..016f6774cee51e0ade89b96320953ea4d61a62fd 100644 (file)
@@ -1,3 +1,7 @@
+2018-01-10  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/atomic10.adb: New test.
+
 2018-01-10  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/82367
diff --git a/gcc/testsuite/gnat.dg/atomic10.adb b/gcc/testsuite/gnat.dg/atomic10.adb
new file mode 100644 (file)
index 0000000..5f99ca6
--- /dev/null
@@ -0,0 +1,25 @@
+-- { dg-do compile }
+-- { dg-options "-gnatws" }
+
+with System.Multiprocessors;
+
+procedure Atomic10 is
+
+  type Atomic_Unsigned is mod 2 ** 32;
+  pragma Atomic (Atomic_Unsigned);
+
+  Max : Positive := Positive (System.Multiprocessors.Number_Of_CPUs);
+
+  Comp_Size : constant := 64 * 8;
+
+  subtype Index_Type is Positive range 1 .. Max;
+
+  type Array_Type is array (Index_Type) of aliased Atomic_Unsigned; -- { dg-error "cannot be guaranteed" }
+  for Array_Type'Component_Size use Comp_Size;
+
+  Slots : Array_Type;
+begin
+  for Index in Index_Type loop
+     Slots (Index) := 0;
+   end loop;
+end;