summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/pack9.adb18
-rw-r--r--gcc/testsuite/gnat.dg/pack9.ads18
-rw-r--r--gcc/tree-sra.c1
5 files changed, 46 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d7e50ad6a1a..d373b1bf314 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2008-05-27 Eric Botcazou <ebotcazou@adacore.com>
+
+ * tree-sra.c (sra_type_can_be_decomposed_p) <RECORD_TYPE>: Make sure
+ that the bitfield is of integral type before testing its precision.
+
2008-05-27 Trevor Smigiel <trevor_smigiel@playstation.sony.com>
Sa Liu <saliu@de.ibm.com>
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a34e1a19b56..d1eb120f035 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2008-05-27 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/pack9.ad[sb]: New test.
+
2008-05-27 Arnaud Charlet <charlet@adacore.com>
* gnat.dg/sync1.ad[sb]: New test.
diff --git a/gcc/testsuite/gnat.dg/pack9.adb b/gcc/testsuite/gnat.dg/pack9.adb
new file mode 100644
index 00000000000..894ecd6bb06
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/pack9.adb
@@ -0,0 +1,18 @@
+-- { dg-do compile }
+-- { dg-options "-O2 -gnatp -cargs --param sra-max-structure-size=24 --param sra-max-structure-count=6 -fdump-tree-final_cleanup" }
+
+package body Pack9 is
+
+ procedure Copy (X, Y : R2_Ptr) is
+ T : R2 := Y.all;
+ begin
+ if T.I2 /= Y.I2 then
+ raise Program_Error;
+ end if;
+ X.all := T;
+ end;
+
+end Pack9;
+
+-- { dg-final { scan-tree-dump-not "__gnat_rcheck" "final_cleanup" } }
+-- { dg-final { cleanup-tree-dump "final_cleanup" } }
diff --git a/gcc/testsuite/gnat.dg/pack9.ads b/gcc/testsuite/gnat.dg/pack9.ads
new file mode 100644
index 00000000000..00202a97fa9
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/pack9.ads
@@ -0,0 +1,18 @@
+package Pack9 is
+
+ type R1 is record
+ I : Integer;
+ C : Character;
+ end record;
+
+ type R2 is record
+ I1, I2 : Integer;
+ A : R1;
+ end record;
+ pragma Pack(R2);
+
+ type R2_Ptr is access all R2;
+
+ procedure Copy (X, Y : R2_Ptr);
+
+end Pack9;
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 9e15f928bf3..244219ffe79 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -268,6 +268,7 @@ sra_type_can_be_decomposed_p (tree type)
{
/* Reject incorrectly represented bit fields. */
if (DECL_BIT_FIELD (t)
+ && INTEGRAL_TYPE_P (TREE_TYPE (t))
&& (tree_low_cst (DECL_SIZE (t), 1)
!= TYPE_PRECISION (TREE_TYPE (t))))
goto fail;