This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Ada] Fix internal error on aggregate with small misaligned field


This is another regression present on the mainline.  The compiler aborts on an 
aggregate whose type is a record type with a misaligned scalar component and
with a representation clause for this component that gives it a size smaller 
than the default.  We're incorrectly laying out the type.

Tested on x86_64-suse-linux, applied on the mainline.


2013-03-06  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/decl.c (gnat_to_gnu_field): Remove the wrapper around
	a misaligned integral type if a size is specified for the field.


2013-03-06  Eric Botcazou  <ebotcazou@adacore.com>

	* gnat.dg/specs/aggr6.ads: New test.


-- 
Eric Botcazou
-- { dg-do compile }

package Aggr6 is

  type B15_T is mod 2 ** 15;
  for B15_T'Size use 15;
  for B15_T'Alignment use 1;

  type B17_T is mod 2 ** 17;
  for B17_T'Size use 17;
  for B17_T'Alignment use 1;

  type Rec_T is record
    A : B17_T;
    B : B15_T;
  end record;
  for Rec_T use record
    A at 0 range 0 .. 16;
    B at 0 range 17 .. 31;
  end record;
  for Rec_T'Size use 32;

  C : constant Rec_T := (A => 1, B => 0);

end Aggr6;
Index: gcc-interface/decl.c
===================================================================
--- gcc-interface/decl.c	(revision 196487)
+++ gcc-interface/decl.c	(working copy)
@@ -6619,6 +6619,13 @@ gnat_to_gnu_field (Entity_Id gnat_field,
 	       <= 0)
 	gnu_field_type = TREE_TYPE (TYPE_FIELDS (gnu_field_type));
 
+      /* Similarly if the field's type is a misaligned integral type, but
+	 there is no restriction on the size as there is no justification.  */
+      if (!needs_strict_alignment
+	  && TYPE_IS_PADDING_P (gnu_field_type)
+	  && INTEGRAL_TYPE_P (TREE_TYPE (TYPE_FIELDS (gnu_field_type))))
+	gnu_field_type = TREE_TYPE (TYPE_FIELDS (gnu_field_type));
+
       gnu_field_type
 	= make_type_from_size (gnu_field_type, gnu_size,
 			       Has_Biased_Representation (gnat_field));

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]