From 07535167780d421df3071daff58bee0d290cffb0 Mon Sep 17 00:00:00 2001 From: ebotcazou Date: Sun, 6 Jan 2013 12:28:58 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@194946 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ada/ChangeLog | 8 ++ gcc/ada/gcc-interface/decl.c | 26 +++++-- gcc/testsuite/ChangeLog | 4 + gcc/testsuite/gnat.dg/specs/clause_on_volatile.ads | 85 ++++++++++++++++++++++ 4 files changed, 118 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/specs/clause_on_volatile.ads diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 3f46799..a0d011b 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,11 @@ +2013-01-06 Olivier Hainque + + * 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 * gcc-interface/decl.c (elaborate_entity) : Delete. diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index 9a38791..3284f84 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -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, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1c91f46..42cb296 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-01-06 Olivier Hainque + + * gnat.dg/specs/clause_on_volatile.ads: New test. + 2013-01-06 Eric Botcazou * 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 index 0000000..4a046c1 --- /dev/null +++ b/gcc/testsuite/gnat.dg/specs/clause_on_volatile.ads @@ -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; -- 2.7.4