[Ada] Plug small loophole with pathological packed array type
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. 2018-12-11 Eric Botcazou <ebotcazou@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. From-SVN: r267006
This commit is contained in:
parent
6186a6ef3c
commit
78326189ea
@ -1,3 +1,8 @@
|
||||
2018-12-11 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* exp_aggr.adb (Packed_Array_Aggregate_Handled): Bail out for
|
||||
any non-scalar type as component type of the array.
|
||||
|
||||
2018-12-11 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* einfo.ads (Is_Bit_Packed_Array): Fix values of component size.
|
||||
|
@ -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;
|
||||
|
||||
|
@ -1,3 +1,8 @@
|
||||
2018-12-11 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* gnat.dg/packed_array.adb, gnat.dg/packed_array.ads,
|
||||
gnat.dg/packed_array_pkg.ads: New testcase.
|
||||
|
||||
2018-12-11 Hristian Kirtchev <kirtchev@adacore.com>
|
||||
|
||||
* gnat.dg/ghost3.adb, gnat.dg/ghost3.ads: New testcase.
|
||||
|
5
gcc/testsuite/gnat.dg/packed_array.adb
Normal file
5
gcc/testsuite/gnat.dg/packed_array.adb
Normal file
@ -0,0 +1,5 @@
|
||||
package body Packed_Array is
|
||||
|
||||
procedure Dummy is null;
|
||||
|
||||
end;
|
9
gcc/testsuite/gnat.dg/packed_array.ads
Normal file
9
gcc/testsuite/gnat.dg/packed_array.ads
Normal file
@ -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;
|
20
gcc/testsuite/gnat.dg/packed_array_pkg.ads
Normal file
20
gcc/testsuite/gnat.dg/packed_array_pkg.ads
Normal file
@ -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;
|
Loading…
Reference in New Issue
Block a user