aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2018-12-11 11:11:37 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2018-12-11 11:11:37 +0000
commit78326189ea22b44e238daeb79cde3aa9171b8d15 (patch)
tree6713d9d5083a4a32e5cd5b92ac41ba9f35f4019c /gcc
parent6186a6ef3c5d54134e68a0f54ad736e405876269 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/ada/exp_aggr.adb4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gnat.dg/packed_array.adb5
-rw-r--r--gcc/testsuite/gnat.dg/packed_array.ads9
-rw-r--r--gcc/testsuite/gnat.dg/packed_array_pkg.ads20
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;