diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2018-12-11 11:11:37 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2018-12-11 11:11:37 +0000 |
commit | 78326189ea22b44e238daeb79cde3aa9171b8d15 (patch) | |
tree | 6713d9d5083a4a32e5cd5b92ac41ba9f35f4019c /gcc | |
parent | 6186a6ef3c5d54134e68a0f54ad736e405876269 (diff) | |
download | gcc-78326189ea22b44e238daeb79cde3aa9171b8d15.zip gcc-78326189ea22b44e238daeb79cde3aa9171b8d15.tar.gz gcc-78326189ea22b44e238daeb79cde3aa9171b8d15.tar.bz2 |
[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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/ada/exp_aggr.adb | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/packed_array.adb | 5 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/packed_array.ads | 9 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/packed_array_pkg.ads | 20 |
6 files changed, 45 insertions, 3 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index d56897b4..c2305be 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,5 +1,10 @@ 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. (Is_Packed): Likewise. * gcc-interface/utils.c (convert): Do not extract the value of a diff --git a/gcc/ada/exp_aggr.adb b/gcc/ada/exp_aggr.adb index 1b644e1..37b9fa8 100644 --- a/gcc/ada/exp_aggr.adb +++ b/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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bdc7eb4..7a71ed1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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. diff --git a/gcc/testsuite/gnat.dg/packed_array.adb b/gcc/testsuite/gnat.dg/packed_array.adb new file mode 100644 index 0000000..5faba40 --- /dev/null +++ b/gcc/testsuite/gnat.dg/packed_array.adb @@ -0,0 +1,5 @@ +package body Packed_Array is + + procedure Dummy is null; + +end; diff --git a/gcc/testsuite/gnat.dg/packed_array.ads b/gcc/testsuite/gnat.dg/packed_array.ads new file mode 100644 index 0000000..957a321 --- /dev/null +++ b/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; diff --git a/gcc/testsuite/gnat.dg/packed_array_pkg.ads b/gcc/testsuite/gnat.dg/packed_array_pkg.ads new file mode 100644 index 0000000..d116f3c --- /dev/null +++ b/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; |