diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 695e3854fc88..3bd55bffb8b1 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2011-10-26 Eric Botcazou + + * gcc-interface/decl.c (gnat_to_gnu_field): Always check components + declared as atomic. Move around conditionally executed code. + 2011-10-24 Robert Dewar * sem.adb (Initialize): Fix bug that blew up if called a second diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index 71a4639fa30e..d6bfe9c23587 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -6853,10 +6853,8 @@ gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed, } } - /* If we are packing the record and the field is BLKmode, round the - size up to a byte boundary. */ - if (packed && TYPE_MODE (gnu_field_type) == BLKmode && gnu_size) - gnu_size = round_up (gnu_size, BITS_PER_UNIT); + if (Is_Atomic (gnat_field)) + check_ok_for_atomic (gnu_field_type, gnat_field, false); if (Present (Component_Clause (gnat_field))) { @@ -6946,9 +6944,6 @@ gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed, gnu_pos = NULL_TREE; } } - - if (Is_Atomic (gnat_field)) - check_ok_for_atomic (gnu_field_type, gnat_field, false); } /* If the record has rep clauses and this is the tag field, make a rep @@ -6961,7 +6956,14 @@ gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed, } else - gnu_pos = NULL_TREE; + { + gnu_pos = NULL_TREE; + + /* If we are packing the record and the field is BLKmode, round the + size up to a byte boundary. */ + if (packed && TYPE_MODE (gnu_field_type) == BLKmode && gnu_size) + gnu_size = round_up (gnu_size, BITS_PER_UNIT); + } /* We need to make the size the maximum for the type if it is self-referential and an unconstrained type. In that case, we can't diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e702ae907c2e..89819e6d9193 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-10-26 Eric Botcazou + + * gnat.dg/specs/atomic1.ads: New test. + 2011-10-26 Ed Smith-Rowland <3dw4rd@verizon.net> Implement C++11 user-defined literals. diff --git a/gcc/testsuite/gnat.dg/specs/atomic1.ads b/gcc/testsuite/gnat.dg/specs/atomic1.ads new file mode 100644 index 000000000000..500cad787f33 --- /dev/null +++ b/gcc/testsuite/gnat.dg/specs/atomic1.ads @@ -0,0 +1,16 @@ +-- { dg-do compile } + +package Atomic1 is + + type Arr is array (Integer range <>) of Boolean; + type UA is access all Arr; + + U : UA; + pragma Atomic (U); -- { dg-error "atomic access" } + + type R is record + U : UA; + pragma Atomic (U); -- { dg-error "atomic access" } + end record; + +end Atomic1;