* gcc-interface/decl.c (gnat_to_gnu_field): Emit a specialized
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 6 Jan 2013 12:28:58 +0000 (12:28 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 6 Jan 2013 12:28:58 +0000 (12:28 +0000)
diagnostic for component size mismatch wrt volatile requirements.
Add a gcc_unreachable() at the end of the checks for size.  Split
the check on volatile for positions into one check on atomic and
a subsequent one on volatile.

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

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

index 3f46799..a0d011b 100644 (file)
@@ -1,3 +1,11 @@
+2013-01-06  Olivier Hainque  <hainque@adacore.com>
+
+       * gcc-interface/decl.c (gnat_to_gnu_field): Emit a specialized
+       diagnostic for component size mismatch wrt volatile requirements.
+       Add a gcc_unreachable() at the end of the checks for size.  Split
+       the check on volatile for positions into one check on atomic and
+       a subsequent one on volatile.
+
 2013-01-06  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/decl.c (elaborate_entity) <E_Record_Type>: Delete.
index 9a38791..3284f84 100644 (file)
@@ -6489,10 +6489,11 @@ gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed,
        }
 
       /* If this field needs strict alignment, check that the record is
-        sufficiently aligned and that position and size are consistent
-        with the alignment.  But don't do it if we are just annotating
-        types and the field's type is tagged, since tagged types aren't
-        fully laid out in this mode.  */
+        sufficiently aligned and that position and size are consistent with
+        the alignment.  But don't do it if we are just annotating types and
+        the field's type is tagged, since tagged types aren't fully laid out
+        in this mode.  Also, note that atomic implies volatile so the inner
+        test sequences ordering is significant here.  */
       if (needs_strict_alignment
          && !(type_annotate_only && Is_Tagged_Type (gnat_field_type)))
        {
@@ -6508,6 +6509,12 @@ gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed,
                   Last_Bit (Component_Clause (gnat_field)), gnat_field,
                   TYPE_SIZE (gnu_field_type));
 
+             else if (is_volatile)
+               post_error_ne_tree
+                 ("volatile field& must be natural size of type{ (^)}",
+                  Last_Bit (Component_Clause (gnat_field)), gnat_field,
+                  TYPE_SIZE (gnu_field_type));
+
              else if (Is_Aliased (gnat_field))
                post_error_ne_tree
                  ("size of aliased field& must be ^ bits",
@@ -6520,6 +6527,9 @@ gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed,
                   Last_Bit (Component_Clause (gnat_field)), gnat_field,
                   TYPE_SIZE (gnu_field_type));
 
+              else
+               gcc_unreachable ();
+
              gnu_size = NULL_TREE;
            }
 
@@ -6527,7 +6537,13 @@ gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed,
                              (TRUNC_MOD_EXPR, gnu_pos,
                               bitsize_int (TYPE_ALIGN (gnu_field_type)))))
            {
-             if (is_volatile)
+             if (Is_Atomic (gnat_field) || Is_Atomic (gnat_field_type))
+               post_error_ne_num
+                 ("position of atomic field& must be multiple of ^ bits",
+                  First_Bit (Component_Clause (gnat_field)), gnat_field,
+                  TYPE_ALIGN (gnu_field_type));
+
+              else if (is_volatile)
                post_error_ne_num
                  ("position of volatile field& must be multiple of ^ bits",
                   First_Bit (Component_Clause (gnat_field)), gnat_field,
index 1c91f46..42cb296 100644 (file)
@@ -1,3 +1,7 @@
+2013-01-06  Olivier Hainque  <hainque@adacore.com>
+
+       * gnat.dg/specs/clause_on_volatile.ads: New test.
+
 2013-01-06  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/alignment10.adb: New test.
diff --git a/gcc/testsuite/gnat.dg/specs/clause_on_volatile.ads b/gcc/testsuite/gnat.dg/specs/clause_on_volatile.ads
new file mode 100644 (file)
index 0000000..4a046c1
--- /dev/null
@@ -0,0 +1,85 @@
+-- { dg-do compile }
+
+package Clause_On_Volatile is
+
+  type U8 is mod 2 ** 8;
+
+  type Word is record
+     A, B : U8;
+  end record;
+  For Word'Alignment use 4;
+
+  type Vword is new Word;
+  For Vword'Alignment use 4;
+  pragma Volatile (Vword);
+
+  type Aword is new Word;
+  For Aword'Alignment use 4;
+  pragma Atomic (Aword);
+
+  type R1 is record
+     W : Word;
+  end record;
+  for R1 use record
+     W at 0 range 0 .. 15; -- OK, packing regular
+  end record;
+
+  type A1 is record
+     AW : Aword;
+  end record;
+  For A1'Alignment use 4;
+  for A1 use record
+     AW at 0 range 0 .. 15; -- { dg-error "must be natural size" }
+  end record;
+
+  type A2 is record
+     B : U8;
+     AW : Aword;
+  end record;
+  For A2'Alignment use 4;
+  for A2 use record
+     B at 0 range 0 .. 7;
+     AW at 1 range 0 .. 31; -- { dg-error "must be multiple" }
+  end record;
+
+  type A3 is record
+     B : U8;
+     AW : Aword;
+  end record;
+  For A3'Alignment use 4;
+  for A3 use record
+     B at 0 range 0 .. 7;
+     AW at 1 range 0 .. 15; -- { dg-error "must be (multiple|natural size)" }
+  end record;
+
+  --
+
+  type V1 is record
+     VW : Vword;
+  end record;
+  For V1'Alignment use 4;
+  for V1 use record
+     VW at 0 range 0 .. 15; -- { dg-error "must be natural size" }
+  end record;
+
+  type V2 is record
+     B : U8;
+     VW : Vword;
+  end record;
+  For V2'Alignment use 4;
+  for V2 use record
+     B at 0 range 0 .. 7;
+     VW at 1 range 0 .. 31; -- { dg-error "must be multiple" }
+  end record;
+
+  type V3 is record
+     B : U8;
+     VW : Vword;
+  end record;
+  For V3'Alignment use 4;
+  for V3 use record
+     B at 0 range 0 .. 7;
+     VW at 1 range 0 .. 15; -- { dg-error "must be (multiple|natural size)" }
+  end record;
+
+end Clause_On_Volatile;