This fixes a crash in gigi on a pathological packed array type, whose
component type is a record type without representation clause or packing
but with a clause that bumps its size to a non-multiple value of the
storage unit. In this case, the front-end fails to detect that calls
to the packing manpulation routines of the run time are necessary.
The fix doesn't change anything for non-pathological cases, i.e. when
the component type has a representation clause or is packed.
Tested on x86_64-pc-linux-gnu, committed on trunk
2018-12-11 Eric Botcazou <ebotca...@adacore.com>
gcc/ada/
* exp_aggr.adb (Packed_Array_Aggregate_Handled): Bail out for
any non-scalar type as component type of the array.
gcc/testsuite/
* gnat.dg/packed_array.adb, gnat.dg/packed_array.ads,
gnat.dg/packed_array_pkg.ads: New testcase.
--- gcc/ada/exp_aggr.adb
+++ gcc/ada/exp_aggr.adb
@@ -7893,9 +7893,7 @@ package body Exp_Aggr is
return False;
end if;
- if not Is_Scalar_Type (Component_Type (Typ))
- and then Has_Non_Standard_Rep (Component_Type (Typ))
- then
+ if not Is_Scalar_Type (Ctyp) then
return False;
end if;
--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/packed_array.adb
@@ -0,0 +1,5 @@
+package body Packed_Array is
+
+ procedure Dummy is null;
+
+end;
--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/packed_array.ads
@@ -0,0 +1,9 @@
+with Packed_Array_Pkg; use Packed_Array_Pkg;
+
+package Packed_Array is
+
+ C : constant Small_Rec2 := (Lo => 1, Hi => Max, A => (1 => (2, 3)));
+
+ procedure Dummy;
+
+end;
--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/packed_array_pkg.ads
@@ -0,0 +1,20 @@
+package Packed_Array_Pkg is
+
+ type Rec1 is record
+ I : Integer;
+ S : Short_Integer;
+ end record;
+ for Rec1'Size use 49;
+
+ type Arr is array (Positive range <>) of Rec1;
+ for Arr'Component_Size use 49;
+
+ type Rec2 (Lo, Hi : Positive) is record
+ A : Arr (Lo .. Hi);
+ end record;
+
+ Max : Positive := 1;
+
+ subtype Small_Rec2 is Rec2 (1, Max);
+
+end;