+2019-07-03 Eric Botcazou <ebotcazou@adacore.com>
+
+ * layout.adb (Layout_Type): Do not set the component size of an
+ array with a scalar component if the component type is
+ overaligned.
+
2019-07-03 Ed Schonberg <schonberg@adacore.com>
* inline.adb (Make_Loop_Labels_Unique): New procedure to modify
Set_RM_Size (E, Esize (E));
end if;
- -- For array base types, set component size if object size of the
+ -- For array base types, set the component size if object size of the
-- component type is known and is a small power of 2 (8, 16, 32, 64),
- -- since this is what will always be used.
+ -- since this is what will always be used, except if a very large
+ -- alignment was specified and so Adjust_Esize_For_Alignment gave up
+ -- because, in this case, the object size is not a multiple of the
+ -- alignment and, therefore, cannot be the component size.
if Ekind (E) = E_Array_Type and then Unknown_Component_Size (E) then
declare
if Present (CT)
and then Is_Scalar_Type (CT)
and then Known_Static_Esize (CT)
+ and then not (Known_Alignment (CT)
+ and then Alignment_In_Bits (CT) >
+ Standard_Long_Long_Integer_Size)
then
declare
S : constant Uint := Esize (CT);
+2019-07-03 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/alignment14.adb: New testcase.
+
2019-07-03 Ed Schonberg <schonberg@adacore.com>
* gnat.dg/predicate4.adb, gnat.dg/predicate4_pkg.ads: New
--- /dev/null
+-- { dg-do compile }
+
+procedure Alignment14 is
+
+ type My_Int1 is new Integer;
+ for My_Int1'Alignment use 8;
+
+ type Arr1 is array (1 .. 2) of My_Int1;
+
+ type My_Int2 is new Integer;
+ for My_Int2'Alignment use 16;
+
+ type Arr2 is array (1 .. 2) of My_Int2;
+
+begin
+ null;
+end Alignment14;